Esempio n. 1
0
    def deleteSchedule(self, data):
        stationID = data.get("stationID", None)
        if stationID is None:
            raise Exception("[ERR]: stationID required")
        queueID = data.get("queueID", None)
        if queueID is None:
            raise Exception("[ERR]: queueID required")
        date = data.get("workDate", None)
        if date is None:
            raise Exception("[ERR]: date required")
        weekday = data.get("weekday", None)
        if weekday is None:
            raise Exception("[ERR]: weekday required")
        isTemporary = data.get("isTemporary", 0)

        queueInfo = QueueInfoInterface().getInfo({"stationID": stationID, "id": queueID})
        queue = queueInfo["filter"]

        if isTemporary == 0:
            DB.DBLocal.delete("schedule", where="queue=$queue AND weekday=$weekday AND workDate>=$workDate",
                              vars={"queue": queue, "weekday": weekday, "workDate": date})
        else:
            DB.DBLocal.delete("schedule", where="queue=$queue AND workDate=$workDate",
                              vars={"queue": queue, "workDate": date})

        result = {}
        result["result"] = "success"
        return result
Esempio n. 2
0
    def collectScore(cls, scene, sourceData, localData):  #收集访客的优先信息
        stationID = localData["stationID"]
        queueID = localData["queueID"]
        workDays, date = QueueInfoInterface().getWorkDays(stationID, queueID)
        date = datetime.datetime.strptime(date, "%Y%m%d")
        level = LocalVisitor.collectLevel(scene, sourceData, localData)
        rankWay = scene["rankWay"]

        registDateTime = sourceData["registTime"]
        activeLocalTime = localData["activeLocalTime"]
        if rankWay == "snumber":
            num = sourceData["snumber"]
            # TODO: V1.21  Test. scene property add morningPrior
            sceneProperty = scene.get("property")
            if sceneProperty["morningPrior"]:
                #Todo: 判断时间大于12点
                #if registDateTime.hours >= 12:
                #    level = level + 1
                pass
            score = (level * levelMask) + (num) * 160
        elif rankWay == "registTime" or rankWay == "registTimeAndSmart":
            second = (registDateTime - date).total_seconds()
            score = (level * levelMask) + int(second) * 160
        else:
            if activeLocalTime < date:
                second = (registDateTime - date).total_seconds()
            else:
                second = (activeLocalTime - date).total_seconds()
            score = (level * levelMask) + int(second) * 160
        return score
Esempio n. 3
0
    def addSchedule(self, data):
        scheduleList = data.get("scheduleList")
        schedule_values = []
        queue_workers = []
        for schedule in scheduleList:
            # 获取某个队列需要插入数据库的所有数据,以及添加到该队列的医生
            stationID = schedule.get("stationID")
            queueID = schedule.get("queueID")
            schedule_value, workers = self.convertSchedule(schedule)
            schedule_values.extend(schedule_value)
            schedule_values = sorted(schedule_values, key=lambda value: (value["queue"], value["workDate"]))
            queue_workers.append({"stationID": stationID, "queueID": queueID, "workers": workers})

        try:
            start = time.time()
            DB.DBLocal.multiple_insert("schedule", values=schedule_values)
            print "TIME COST FOR INSERT SCHEDULES: {0} ms".format((time.time() - start) * 1000)
            for item in queue_workers:
                QueueInfoInterface().updateWorkerLimit(item)
        except:
            raise
        else:
            result = {}
            result["result"] = "success"
            return result
Esempio n. 4
0
    def backupOld(self):
        queueList = self.queueInfo.getList({"stationID": self.stationID})
        LogOut.info("station %d backupOld" % self.stationID)

        #遍历分诊台的队列
        for queue in queueList:
            #得到策略的工作时间
            workDays, dateStr = QueueInfoInterface().getWorkDays(
                self.stationID, queue["id"])
            joinView = "(select id, queueID, status as localStatus,workStartTime,workEndTime from visitor_local_data where stationID = %d and queueID = %d) as joinView" \
                        %(self.stationID , queue["id"])
            joinSql = "select * from visitor_source_data  a inner join %s on a.id=joinView.id where registDate < %s" % (
                joinView, dateStr)
            print("backupView sql: " + joinSql)

            # find the visitors outof date
            backupList = self.DBLocal.query(joinSql)
            for item in backupList:
                print "find backup item name: " + item[
                    "name"] + " registDate: " + str(
                        item["registDate"]) + " workEndTime: " + str(
                            item["workEndTime"])
                BackupTableInterface(self.stationID).add(item)
                VisitorSourceInterface(self.stationID).delete(item)
                VisitorLocalInterface(self.stationID).delete(item)
        """
Esempio n. 5
0
    def visitorActiveSet(self, inputData):
        stationID = inputData["stationID"]
        queueID = inputData["queueID"]
        visitor = {}
        visitor["id"] = inputData["id"]
        visitor["stationID"] = stationID
        if inputData["active"]:
            activeTime = datetime.datetime.now()
            visitor["activeLocal"] = 1
            visitor["activeLocalTime"] = activeTime
            queueInfo = QueueInfoInterface().getInfo({
                "stationID": stationID,
                "id": queueID
            })
            sceneID = queueInfo["sceneID"]
            scene = SceneInterface().getSceneInfo({"sceneID": sceneID})
            if scene["delayTime"] == 0:
                visitor["status"] = "waiting"
            else:
                visitor["status"] = "unactivewaiting"
        else:
            visitor["activeLocal"] = 0
            visitor["status"] = "unactive"
        VisitorLocalInterface(stationID).edit(visitor)

        QueueDataController().sortVisitor(stationID, queueID, scene)

        return
Esempio n. 6
0
    def backupOld(self):
        stationList = StationInterface().getList()
        for station in stationList:
            stationID = station["id"]

            queueList = self.queueInfo.getList({"stationID": stationID})
            LogOut.info("station %d backupOld" % stationID)

            #遍历分诊台的队列
            for queue in queueList:
                #得到策略的工作时间
                workDays, dateStr = QueueInfoInterface().getWorkDays(
                    stationID, queue["id"])
                joinSql = "select * from visitor_view_data where queueID = %d and registDate < %s" % (
                    queue["id"], dateStr)
                print("backupView sql: " + joinSql)

                # find the visitors outof date
                backupList = self.db.query(joinSql)
                for item in backupList:
                    print "find backup item name: " + item[
                        "name"] + " registDate: " + str(
                            item["registDate"]) + " workEndTime: " + str(
                                item["workEndTime"])
                    item.pop("lid")
                    BackupTableInterface(stationID).add(item)
                    VisitorSourceInterface().delete(item)
                    VisitorLocalInterface(stationID).delete(item)
Esempio n. 7
0
    def getCallerPublish(self,inputData):
        retlistInfo = {}
        retWorker = {}
        retQueue =  {}
        ret = {}
        stationID = inputData["stationID"]
        callerID = inputData["callerID"]
        selCaller = CallerInterface().getInfo({"stationID":stationID ,"id" :callerID})
        workerOnlineID = selCaller["workerOnline"]
        if workerOnlineID:
            workerOnline = WorkerInterface().getInfo({"stationID":stationID, "id" :workerOnlineID})
            #显示呼叫记录表单中的项目,有效时间内
            validDataTime = "timestamp\'" + self.getValidDateTime() + "\'"
            callRecordList = DB.DBLocal.where("callingRecord",stationID = stationID, callerID = callerID)
            if len(callRecordList) > 0:
                record = callRecordList[0]
                # 从窗口的最后一次呼叫 得到队列信息
                queueID = record["queueID"]
                queueList = StationMainController().getQueueList({"stationID":stationID, "queueID" :queueID})
                queueInfo = QueueInfoInterface().getInfo({"stationID":stationID, "id" :queueID})
                doingList = queueList["doingList"]
                waitingList = queueList["waitingList"]
                retQueue["listNum"] = len(waitingList)
                retQueue["department"] = workerOnline["department"]
                retQueue["pos"] = selCaller["pos"]
                #获得Seeing数据 从记录中的ID中得到呼叫的患者信息 呼叫显示次数递减
                seeing = StationMainController().getVisitorInfo({"stationID":stationID,"id":record["currentVisitorID"]})
                retlistInfo["seeing"] = {}
                retlistInfo["seeing"]["name"] = seeing["name"]
                retlistInfo["seeing"]["id"] = seeing["snumber"]
                if record["showCnt"] > 0:
                    retlistInfo["seeing"]["show"] = 1
                    record["showCnt"] -= 1
                    callRecordInterface().edit(record)
                else:
                    retlistInfo["seeing"]["show"] = 0

                #获得waiting数据
                retlistInfo["waiting"] = []
                for item in waitingList:
                    waitItem = {}
                    waitItem["name"] = item["name"]
                    waitItem["id"] = item["snumber"]
                    retlistInfo["waiting"].append(waitItem)

            # 获得医生数据
            retWorker["name"] = workerOnline["name"]
            retWorker["id"] = workerOnline["id"]
            retWorker["department"] = workerOnline["department"]
            retWorker["title"] = workerOnline["title"]
            retWorker["headpic"] = workerOnline["headPic"]

            ret["workerInfo"] = retWorker
            ret["queueInfo"] = retQueue
            ret["listInfo"] = retlistInfo
        return ret
Esempio n. 8
0
 def fuzzySearchSchedule(self, data):
     related_queue = QueueInfoInterface().fuzzySearchQueue(data)
     suggestions = []
     for item in related_queue:
         stationID = item.get("stationID")
         queueID = item.get("id")
         startTime = data.get("startTime")
         endTime  =data.get("endTime")
         result = self.getQueueSchedule({"stationID": stationID, "queueID": queueID,
                                         "startTime": startTime, "endTime": endTime})
         suggestions.append(result)
     return suggestions
Esempio n. 9
0
    def getCallerListPublish(self,inputData):
        retlistInfo = {}
        ret = {}
        stationID = inputData["stationID"]
        callerID = inputData["callerID"]
        callerList = DB.DBLocal.select("caller", where="id=$id", vars={"id": callerID})
        if len(callerList) == 0:
            raise Exception("[ERR]: caller not exists.")
        validDateTime = datetime.datetime.strptime(self.getValidDateTime(), "%Y-%m-%d %H:%M:%S")
        callRecordList = DB.DBLocal.select("callingRecord",
                                         where="stationID=$stationID AND callerID=$callerID AND dateTime>$dateTime",
                                         vars={"stationID": stationID, "callerID": callerID, "dateTime": validDateTime})
        if len(callRecordList) > 0:
            record = callRecordList[0]
            # 从窗口的最后一次呼叫 得到队列信息
            queueID = record["queueID"]
            queueList = StationMainController().getQueueList({"stationID":stationID, "queueID" :queueID})
            queueInfo = QueueInfoInterface().getInfo({"stationID":stationID, "id" :queueID})
            doingList = queueList["doingList"]
            waitingList = queueList["waitingList"]
            retlistInfo["seeingList"] = []
            for item in doingList:
                seeingItem = {}
                seeingItem["name"] = item["name"]
                seeingItem["id"] = item["snumber"]
                retlistInfo["seeingList"].append(seeingItem)

            retlistInfo["watingList"] = []
            for item in waitingList:
                waitItem = {}
                if item["locked"]:
                    continue
                waitItem["name"] = item["name"]
                waitItem["id"] = item["snumber"]
                retlistInfo["watingList"].append(waitItem)
        callRecordList = DB.DBLocal.where("callingRecord", stationID=stationID, callerID=callerID)
        retlistInfo["calling"] = []
        if len(callRecordList) > 0:
            record = callRecordList[0]
            # 病人ID显示为snumber
            currentVisitor = self.stationController.getVisitorInfo(
                {"stationID": stationID, "id": record["currentVisitorID"]})
            calling = {}
            calling["name"] = record["currentVisitorName"]
            calling["id"] = currentVisitor["snumber"]
            calling["pos"] = callerList[0]["pos"]
            retlistInfo["calling"] = calling
        ret = retlistInfo
        return ret
Esempio n. 10
0
    def setVisitorStatus(self, inputData, action=None):
        stationID = inputData.get("stationID")
        queueID = inputData.pop("queueID")
        # 根据访客所处队列选择的策略信息,获取缓冲人数
        queueInfo = QueueInfoInterface().getInfo({
            "stationID": stationID,
            "id": queueID
        })
        sceneID = queueInfo["sceneID"]
        scene = SceneInterface().getSceneInfo({"sceneID": sceneID})
        if action == "pass" or action == "delay":
            waitNum = scene["passedWaitNum"]
        elif action == "review":
            waitNum = scene["reviewWaitNum"]
        else:
            # raise Exception("[ERR]: visitor status action not support.")
            waitNum = 0
        # 获取队列访客信息,如果等待队列中已经有过号或者复诊的访客,则调整缓冲人数
        fliter = "stationID=$stationID and queueID=$queueID and status=$status"
        visitorList = DB.DBLocal.select("visitor_local_data",
                                        where=fliter,
                                        vars={
                                            "stationID": stationID,
                                            "queueID": queueID,
                                            "status": "waiting"
                                        },
                                        order="finalScore, originScore")
        visitorNum = len(visitorList)

        if action == "pass" or action == "delay":
            InsertSeries = scene["InsertPassedSeries"]
            InsertInterval = scene["InsertPassedInterval"]
        elif action == "review":
            InsertSeries = scene["InsertReviewSeries"]
            InsertInterval = scene["InsertReviewInterval"]
        else:  #default val
            InsertSeries = 2
            InsertInterval = 3

        destPos, destScore = QueueDataController().getInsertPos(
            visitor=inputData,
            vList=visitorList,
            numNormal=InsertInterval,
            numHigher=InsertSeries,
            numWaitting=waitNum)
        inputData["finalScore"] = destScore

        return inputData
Esempio n. 11
0
    def getQueueSchedule(self, data):
        stationID = data.get("stationID", None)
        queueID = data.get("queueID", None)
        if queueID is None:
            raise Exception("[ERR]: queueID required")
        startTime = data.get("startTime", None)
        endTime = data.get("endTime", None)
        if not startTime or not endTime:
            raise Exception("[ERR]: startTime or endTime required")
        if endTime < startTime:
            raise Exception("[ERR]: endTime should larger than startTime")

        queueInfo = QueueInfoInterface().getInfo({"stationID": stationID, "id": queueID})
        queue = queueInfo["filter"]

        try:
            self.autoGenSchedule(startTime, endTime)
        except:
            raise

        scheduleList = DB.DBLocal.select("schedule", where="queue=$queue AND workDate BETWEEN $startTime AND $endTime",
                                         vars={"queue": queue, "startTime": startTime, "endTime": endTime})
        schedule = []
        isExpert = None
        for item in scheduleList:
            tmp = {}
            scheduleTempList = DB.DBLocal.select("schedule_temp", where={"queue": item["queue"],
                                                                      "workDate": item["workDate"].strftime("%Y-%m-%d"),
                                                                      "workTime": item["workTime"]})
            if len(scheduleTempList) > 0:
                schedule_temp = scheduleTempList[0]
                item = self._cmpOnDuty(item, schedule_temp)
            tmp["workDate"] = item["workDate"]
            tmp["workTime"] = item["workTime"]
            tmp["weekday"] = item["weekday"]
            tmp["onDuty"] = item["onDuty"]
            tmp["workerID"] = str2List(item["workerID"])
            isExpert = item["isExpert"]
            schedule.append(tmp)
        result = {}
        result["stationID"] = queueInfo["stationID"]
        result["queueID"] = queueID
        result["name"] = queueInfo["name"]
        result["filter"] = queue
        #TODO: 专家队列信息是否和队列信息放在一起
        result["isExpert"] = isExpert
        result["schedule"] = schedule
        return result
Esempio n. 12
0
    def getAvaliableQueue(self, data):
        stationID = data.get("stationID", None)
        if stationID is None:
            raise Exception("[ERR]: stationID required")

        queueList = DB.DBLocal.select("queueInfo",
                                      where={"stationID": stationID},
                                      what="id")
        queueIDList = []
        for item in queueList:
            queueIDList.append(item["id"])

        choseQueueList = DB.DBLocal.select("queue_machine",
                                           where={"stationID": stationID},
                                           what="queueLimit")
        choseQueueIDList = []
        for item in choseQueueList:
            queueLimit = str2List(item["queueLimit"])
            for queueID in queueLimit:
                if queueID not in choseQueueIDList:
                    choseQueueIDList.append(queueID)
        choseQueueIDList = map(int, choseQueueIDList)

        avaliableQueue = [
            item for item in queueIDList if item not in choseQueueIDList
        ]
        result = {"list": []}
        for item in avaliableQueue:
            try:
                queueInfo = QueueInfoInterface().getInfo({
                    "stationID": stationID,
                    "id": item
                })
            except:
                pass
            else:
                result["list"].append({
                    "queueID": queueInfo["id"],
                    "name": queueInfo["name"]
                })
        result["num"] = len(result["list"])
        return result
Esempio n. 13
0
 def getQueueListInfo(self, inputData):
     stationID = inputData.get("stationID")
     station = DB.DBLocal.select("stationSet",
                                 where="id=$id",
                                 vars={"id": stationID})
     if len(station) == 0:
         raise Exception("[ERR]: station not exists.")
     # sql = "SELECT q.id, q.name, q.workerOnline, s.activeLocal FROM queueInfo AS q " \
     #       "INNER JOIN scene AS s ON q.sceneID = s.id WHERE q.stationID=%s" % stationID
     # # list = DB.DBLocal.where('queueInfo', stationID=inputData["stationID"])
     # list = DB.DBLocal.query(sql)
     list = QueueInfoInterface().getList({"stationID": stationID})
     ret = {"num": len(list), "list": []}
     for item in list:
         queueInfo = {}
         queueInfo["id"] = item["id"]
         queueInfo["name"] = item["name"]
         queueInfo["workerOnline"] = item["workerOnline"]
         if item["activeLocal"] == 1:
             queueInfo["tab"] = ["unactive", "waiting", "finish"]
         else:
             queueInfo["tab"] = ["waiting", "finish"]
         ret["list"].append(queueInfo)
     return ret
Esempio n. 14
0
    def getPublishList(self, inputData):
        stationID = inputData.get("stationID", None)
        if stationID is None:
            raise Exception("[ERR]: stationID required.")
        callerID = inputData.get("callerID", None)
        action = inputData.get("action", None)
        if action is None:
            raise Exception("[ERR]: action required.")

        # if can get from Memcached
        key = "_getPublishList_stationID" + str(stationID) +"_callerID"+ str(callerID) + "_action" + action
        value = common.func.CachedGetValue(json.dumps(key))
        if value != False:
            return value

        # TODO: 试验删掉医生的情况
        # 如果获取叫号器信息时发生异常,在上层函数中处理
        caller = self.callerInterface.getInfo({"stationID": stationID, "id": callerID})
        workerID = caller["workerOnline"]
        try:
            workerOnline = self.workerInterface.getInfo({"stationID": stationID, "id": workerID})
            workerInfo = {
                "id": workerOnline["id"],
                "name": workerOnline["name"],
                "title": workerOnline["title"],
                "descText": workerOnline["descText"],
                "department": workerOnline["department"],
                "headpic": workerOnline["headPic"],
                "status": workerOnline["status"],
                "speciality": workerOnline["speciality"]
            }

            if action == 'getStationList' and workerInfo["status"] == "离开":
                return None
        except:
            workerInfo = {"id": "", "name": "", "title": "", "descText": "", "department": "", "headpic": ""}

        # 获取呼叫队列的信息
        queueInfo = {
            "department": workerInfo["department"],
            "pos": caller["pos"],
            "listNum": 0
        }

        # 获取正在就诊、正在排队的信息
        seeing = {"id": "", "name": "", "show": 0, "status": ""}
        waiting = []
        validDateTime = datetime.datetime.strptime(self.getValidDateTime(), "%Y-%m-%d %H:%M:%S")
        callerRecord = DB.DBLocal.select("callingRecord",
                                         where="stationID=$stationID AND callerID=$callerID AND dateTime>$dateTime",
                                         vars={"stationID": stationID, "callerID": callerID, "dateTime": validDateTime})

        try:
            record = callerRecord[0]
            queueID = record["queueID"]
            queue = QueueInfoInterface().getInfo({"stationID": stationID, "id": queueID})
            sceneID = queue["sceneID"]
            scene = SceneInterface().getSceneInfo({"sceneID": sceneID})
            queueList = self.stationController.getQueueList({"stationID": stationID, "queueID": queueID})
        except:
            if action == 'getStationList':
                result = {}
                return result
        else:
            # 获取呼叫队列中当前看诊的信息
            currentVisitor = self.stationController.getVisitorInfo({"stationID": stationID, "id": record["currentVisitorID"]})
            if currentVisitor["localStatus"] == 'doing':
                seeing["id"] = currentVisitor["snumber"]
                seeing["name"] = currentVisitor["name"]
                seeing["status"] = self.getVisitorStatus(**currentVisitor)
                seeing["outputText"] = scene["outputText"]
                seeing["show"] = 0
            seeing["dateTime"] = record["dateTime"]

            # 获取呼叫队列中当前排队的信息
            waitingList = queueList["waitingList"]
            queueInfo.update({"listNum": len(waitingList), "queueName": queue["name"]})
            for item in waitingList:
                if item["locked"]:
                    continue
                waitingVisitor = {}
                waitingVisitor["id"] = item["snumber"]
                waitingVisitor["name"] = item["name"]
                waitingVisitor["status"] = self.getVisitorStatus(**item)
                waiting.append(waitingVisitor)

        result = {}
        result["workerInfo"] = workerInfo
        result["queueInfo"] = queueInfo
        result["listInfo"] = {"seeing": seeing, "waiting": waiting}

        # 缓存 value
        common.func.CahedSetValue(json.dumps(key), result, 3)

        return result
Esempio n. 15
0
    def convertSchedule(self, schedules):
        """将JSON格式的排班数据转换为可以插入数据库的数据

        JSON格式的排班数据:某分诊台某队列一周、二周或四周的排班数据。
        经过转换后,默认可以得到这个队列四周的排班记录,可以直接插入数据库
        """

        stationID = schedules.get("stationID")
        queueID = schedules.get("queueID")
        isExpert = schedules.get("isExpert")
        schedule = schedules.get("schedule")
        queueInfo = QueueInfoInterface().getInfo({"stationID": stationID, "id": queueID})
        queue = queueInfo["filter"]
        max_date = DB.DBLocal.select("schedule", what="MAX(workDate) as max_date")[0]["max_date"]
        schedule_value = []
        schedule_temp_value = []
        workers = {"stationID": stationID, "queueID": queueID, "workers": []}
        for item in schedule:
            date = datetime.datetime.strptime(item.get("workDate"), "%Y-%m-%d")
            weekday = item.get("weekday")
            time_state = item.get("workTime")
            onDuty = item.get("onDuty")
            workerList = item.get("workerID")
            isTemporary = item.get("isTemporary")
            value = {
                "queue": queue,
                "isExpert": isExpert,
                "workDate": date,
                "weekday": weekday,
                "workTime": time_state,
                "onDuty": onDuty,
                "workerID": list2Str(workerList)
            }

            # 计算某一条排班数据要循环的次数
            if max_date is None:
                count = self.repeat_count
            else:
                interval = int(datetime.datetime.strftime(max_date, '%W')) - int(datetime.datetime.strftime(date, '%W'))
                if interval in range(self.repeat_count):
                    count = interval + 1
                else:
                    count = self.repeat_count

            # 获取排班信息以几周为最小编辑单位
            edit_period = self._getImportWeeks()

            # 根据循环次数生成多条数据
            for i in range(0, count, edit_period):
                value_copy = copy.deepcopy(value)
                start_date = date + datetime.timedelta(self.repeat_interval*i)
                value_copy.update({"workDate": start_date})
                schedule_info = DB.DBLocal.select("schedule", where="queue=$queue AND workDate=$workDate AND workTime=$workTime",
                                                  vars={"queue": queue, "workDate": start_date, "workTime": time_state})
                # 如果是临时更改数据,则保存到临时排班表中
                if isTemporary:
                    if i == 0:
                        schedule_temp_value.append(copy.deepcopy(value_copy))
                    if len(schedule_info) == 0:
                        value_copy.update({"onDuty": 0})
                    else:
                        continue
                else:
                    if len(schedule_info) > 0:
                        value_copy = self._cmpOnDuty(value_copy, schedule_info[0])
                schedule_value.append(value_copy)

            for worker in workerList:
                if worker not in workers["workers"]:
                    workers["workers"].append(worker)

        return schedule_value, schedule_temp_value, workers
Esempio n. 16
0
    def updateVisitor(self, inputData):
        stationID = inputData["stationID"]
        queueID = inputData["queueID"]

        queueInfo = QueueInfoInterface().getInfo({
            "stationID": stationID,
            "id": queueID
        })
        sceneID = queueInfo["sceneID"]
        scene = SceneInterface().getSceneInfo({"sceneID": sceneID})
        visitorLocalInterface = VisitorLocalInterface(stationID)

        filter = str(queueInfo["filter"])
        sourceList = DB.DBLocal.where("visitor_source_data", queue=filter)
        sourceList = list(sourceList)
        localList = DB.DBLocal.where("visitor_local_data",
                                     stationID=stationID,
                                     queueID=queueID)
        localDict = list2Dict(localList)
        # 遍历 sourceList
        for sourceItem in sourceList:
            if str(sourceItem["id"]) not in localDict:
                localData = {
                    "id": sourceItem["id"],
                    "name": sourceItem["name"],
                    "registDate": sourceItem["registDate"],
                    "stationID": stationID,
                    "queueID": queueID,
                    "activeLocal": 0,
                    "activeLocalTime": datetime.datetime(2000, 1, 1),
                    "prior": 0,
                    "vip": 0,
                    "locked": 0
                }
                status = "unactive" if scene["activeLocal"] else "waiting"
                originLevel = LocalVisitor.collectLevel(
                    scene, sourceItem, localData)
                originScore = LocalVisitor.collectScore(
                    scene, sourceItem, localData)
                finalScore = finalScoreDef
                localData.update({
                    "status": status,
                    "originLevel": originLevel,
                    "originScore": originScore,
                    "finalScore": finalScore
                })
                localDict[str(sourceItem["id"])] = localData
                visitorLocalInterface.add(localData)
            else:
                localData = localDict[str(sourceItem["id"])]
                # 更新访客的分数
                originScore = LocalVisitor.collectScore(
                    scene, sourceItem, localData)
                originLevel = LocalVisitor.collectLevel(
                    scene, sourceItem, localData)
                if localData["originScore"] != originScore or localData[
                        "originLevel"] != originLevel:
                    localData.update({
                        "originLevel": originLevel,
                        "originScore": originScore,
                        "finalScore": finalScoreDef
                    })
                    localDict[str(sourceItem["id"])] = localData
                    visitorLocalInterface.edit(localData)

                # 如果队列需要激活且访客处于等待激活的状态,根据激活时间更新访客的状态
                if scene["activeLocal"] and localData[
                        "status"] == "unactivewaiting":
                    now = datetime.datetime.now()
                    activeTime = localData["activeLocalTime"]
                    interval = (now - activeTime).total_seconds()
                    if interval >= scene["delayTime"] * 60:
                        localData.update({"status": "waiting"})
                    visitorLocalInterface.edit(localData)

        self.sortVisitor(stationID, queueID, scene)
Esempio n. 17
0
    def _addVisitor(self, inputData, action=None):
        stationID = inputData.get("stationID", None)
        queueID = inputData.get("queueID", None)
        name = inputData.get("name", None)
        snumber = inputData.get("snumber", None)
        VIP = inputData.get("VIP", 0)
        descText = inputData.get("descText", None)
        cardID = inputData.get("cardID", None)
        age = inputData.get("orderType", None)
        orderType = inputData.get("orderType", 0)
        personID = inputData.get("personID", None)
        phone = inputData.get("phone", None)
        if stationID is None:
            raise Exception("[ERR]: stationID required to add visitor")
        if queueID is None:
            raise Exception("[ERR]: queueID required to add visitor")
        if action is None:
            action = "nurser_add"

        # 自动生成患者ID
        now = datetime.datetime.now()
        current_date = now.strftime("%Y-%m-%d")
        current_time = now.strftime("%Y-%m-%d %H:%M:%S")
        timestamp = int(time.time() * 1000000)
        id = str(stationID) + str(queueID) + str(timestamp)

        # 如果cardID不存在,从id中获取;如果存在,查询数据获得病人的姓名
        if cardID is None:
            cardID = id[-16:]
        else:
            visitor_list = DB.DBLocal.select(
                "visitor_source_data",
                where="cardID=$cardID AND name NOT LIKE $name",
                vars={
                    "cardID": cardID,
                    "name": "%号"
                })
            visitor_bak_list = DB.DBLocal.select(
                "visitor_backup_data",
                where="cardID=$cardID AND name NOT LIKE $name",
                vars={
                    "cardID": cardID,
                    "name": "%号"
                })
            if visitor_list:
                name = visitor_list[0]["name"]
            else:
                if visitor_bak_list:
                    name = visitor_bak_list[0]["name"]

        # 如果snumber不存在,则根据分诊台下的患者数自动生成一个序号
        if not snumber:
            where = "stationID=$stationID"
            visitor_all = DB.DBLocal.select("visitor_local_data",
                                            where=where,
                                            vars={"stationID": stationID})
            visitor_all_count = len(visitor_all)
            snumber = visitor_all_count + 1
        # 如果name不存在,则根据snumber生成一个名字
        if name is None:
            name = "{0}号".format(snumber)

        # 根据队列中的等待、未激活、等待激活的人数,确定总的等待人数
        where = "stationID=$stationID AND queueID=$queueID AND status IN $status"
        visitor_wait = DB.DBLocal.select("visitor_local_data",
                                         where=where,
                                         vars={
                                             "stationID":
                                             stationID,
                                             "queueID":
                                             queueID,
                                             "status": ('waiting', 'unactive',
                                                        'unactivewaiting')
                                         })
        waitNum = len(visitor_wait)

        # 获取队列关键字
        queueInfo = QueueInfoInterface().getInfo({
            "stationID": stationID,
            "id": queueID
        })
        queue = queueInfo["filter"]

        workerID = queueInfo["workerOnline"]
        workerList = DB.DBLocal.select("workers",
                                       where="id=$id",
                                       vars={"id": workerID})
        workerName = None
        department = None
        if len(workerList) != 0:
            worker = workerList[0]
            workerName = worker["name"]
            department = worker["department"]

        # 修改患者来源
        status = None
        if action == "nurser_add":
            status = "护士新增"
        elif action == "self_pick_up":
            status = "自助取号"

        visitor = {
            "id": id,
            "name": name,
            "age": age,
            "queue": queue,
            "snumber": snumber,
            "orderDate": current_date,
            "orderTime": current_time,
            "registDate": current_date,
            "registTime": current_time,
            "VIP": VIP,
            "orderType": orderType,
            "workerID": workerID,
            "workerName": workerName,
            "descText": descText,
            "department": department,
            "cardID": cardID,
            "personID": personID,
            "phone": phone,
            "status": status
        }

        values = {}
        for key, value in visitor.items():
            if value is not None:
                values.update({key: value})
            if value is None:
                visitor.update({key: ""})
        try:
            DB.DBLocal.insert("visitor_source_data", **values)
        except Exception, e:
            print "Exception : %s " % str(e)
            raise Exception(
                "[ERR]: insert into visitor_source_data failed. %s " % str(e))
Esempio n. 18
0
    def getQueueListAll(self, inputData, useCache):
        stationID = inputData["stationID"]
        queueID = inputData["queueID"]

        #if can get from Memcached
        key = "_getQueueListAll_stationID" + str(stationID) + "_queueID" + str(
            queueID)
        value = common.func.CachedGetValue(json.dumps(key))
        if value != False:
            if useCache:
                return value

        ret = {
            "name": "",
            "workerOnline": "",
            "waitingList": [],
            "finishList": []
        }
        queue = QueueInfoInterface().getInfo({
            "stationID": stationID,
            "id": queueID
        })
        ret.update({
            "name": queue["name"],
            "workerOnline": queue["workerOnline"]
        })

        if queue["activeLocal"] == 1:
            unactiveList = DB.DBLocal.where("visitor_view_data",
                                            stationID=stationID,
                                            queueID=queueID,
                                            localStatus="unactive")  # 未激活的所有访客
            ret["unactiveList"] = []
            for item in unactiveList:
                ret["unactiveList"].append(item)

        doingList = DB.DBLocal.where("visitor_view_data",
                                     stationID=stationID,
                                     queueID=queueID,
                                     localStatus="doing")  # 进行中的所有访客
        ret["waitingList"] = list(doingList)

        waitList = DB.DBLocal.where("visitor_view_data",
                                    stationID=stationID,
                                    queueID=queueID,
                                    localStatus="waiting")  # 等待中的所有访客
        ret["waitingList"] = ret["waitingList"] + list(waitList)

        finishList = DB.DBLocal.where("visitor_view_data",
                                      stationID=stationID,
                                      queueID=queueID,
                                      localStatus="pass")  # 过号的所有访客
        for item in finishList:
            ret["finishList"].append(item)

        finishList = DB.DBLocal.where("visitor_view_data",
                                      stationID=stationID,
                                      queueID=queueID,
                                      localStatus="finish")  # 已完成的所有访客
        for item in finishList:
            ret["finishList"].append(item)

        #缓存 value
        common.func.CahedSetValue(json.dumps(key), ret, 2)

        return ret
Esempio n. 19
0
    def getInfo(self, data):
        """获取某个取号机的详细信息"""

        stationID = data.get("stationID", None)
        if stationID is None:
            raise Exception("[ERR]: stationID required for queue_machine")
        where = {"stationID": stationID}
        id = data.get("id", None)
        if id is None:
            where.update({"deviceIP": web.ctx.ip})
        else:
            where.update({"id": id})

        queue_machine_list = DB.DBLocal.select("queue_machine", where=where)
        queue_machine = queue_machine_list[0]
        for key, value in queue_machine.items():
            if value is None:
                queue_machine.update({key: ""})

        result = {}

        # 取号机选择的队列信息
        queueLimit = str2List(queue_machine["queueLimit"])
        queue_machine["queueLimit"] = []
        for queueID in queueLimit:
            try:
                queueInfo = QueueInfoInterface().getInfo({
                    "stationID": stationID,
                    "id": queueID
                })
            except:
                continue
            else:
                queue_machine["queueLimit"].append({
                    "queueID": queueInfo["id"],
                    "name": queueInfo["name"]
                })

        # 取号机支持的特性
        supportFeature = str2List(queue_machine.pop("supportFeature"))
        queue_machine["supportFeature"] = {}
        for key, value in self.support_feature.items():
            keyword = self.feature_keywords[key]
            if keyword in supportFeature:
                queue_machine["supportFeature"].update({key: 1})
            else:
                queue_machine["supportFeature"].update({key: value})

        # 取号机打印设置项
        printSettings = {}
        printSettings["title"] = queue_machine.pop("title")
        printSettings["subtitle"] = queue_machine.pop("subtitle")
        printSettings["footer1"] = queue_machine.pop("footer1")
        printSettings["footer2"] = queue_machine.pop("footer2")

        styleID = queue_machine.pop("styleID", 1)
        styleList = DB.DBLocal.select("style", where={"id": styleID})
        printSettings["styleInfo"] = {
            "id": "",
            "name": "",
            "styleURL": "",
            "previewURL": ""
        }
        for item in styleList:
            printSettings["styleInfo"] = item

        queue_machine["printSettings"] = printSettings

        queue_machine = self.queueMachineStatus(queue_machine)
        queue_machine.update({"queueNum": len(queue_machine["queueLimit"])})
        result.update(queue_machine)
        return result
Esempio n. 20
0
    def getExpertSchedule(self, data):
        """获取专家队列的上班情况"""

        stationID = data.get("stationID", None)
        where = None
        if stationID:
            where = {}
            where.update({"stationID": stationID})

        # 判断哪些队列属于专家队列
        queueID = data.get("queueID", None)
        if not queueID:
            queueID = []
            queueList = DB.DBLocal.select("queueInfo", what="id", where=where)
            for item in queueList:
                id = item["id"]
                try:
                    isExpert = self._isExpertQueue(id)
                except:
                    continue
                if isExpert:
                    queueID.append(id)
        if not isinstance(queueID, list):
            raise Exception("[ERR] queueID must be a list")

        isExpert = data.get("isExpert", 1)
        startTime = data.get("startTime", None)
        endTime = data.get("endTime", None)
        if not startTime or not endTime:
            current_date = datetime.datetime.today()
            startTime = (current_date - datetime.timedelta(current_date.weekday())).strftime("%Y-%m-%d")
            endTime = (current_date + datetime.timedelta(6 - current_date.weekday())).strftime("%Y-%m-%d")
        if endTime < startTime:
            raise Exception("[ERR]: endTime should larger than startTime")
        data.update({"isExpert": isExpert, "startTime": startTime, "endTime": endTime})

        result = {"list":[]}
        for item in queueID:
            data.update({"queueID": item})
            queueInfo = QueueInfoInterface().getInfo({"stationID":"", "id": item})
            queue_schedule = self.getQueueSchedule(data)
            schedule = queue_schedule.pop("schedule")

            workerID = None
            if queueInfo["workerLimit"]:
                workerID = str2List(queueInfo["workerLimit"])[0]
            tmp = []
            for s in schedule:
                if s["onDuty"] == 1:
                    s.pop("workerID")
                    tmp.append(s)

            queue_schedule.update({"schedule": tmp})
            if not queue_schedule["schedule"]:
                continue

            workerList = DB.DBLocal.select("workers", where={"id": workerID})
            workerInfo = {"name": "", "department": "", "title": "", "descText": "", "headPic": "", "speciality": ""}
            if len(workerList) !=0:
                worker = workerList[0]
                for key in workerInfo.keys():
                    if worker[key]:
                        workerInfo.update({key: worker[key]})
            queue_schedule.update({"workerInfo": workerInfo})
            if queue_schedule["workerInfo"]["name"]:
                result["list"].append(queue_schedule)

        return result
Esempio n. 21
0
    def importSchedule(self, config):
        """导入排班信息

        排班信息导入支持导入1周、2周、4周的数据,在导入时需要确认数据源排班信息的周数
        是否和选择导入的周数相匹配。

        在导入时,导入数据会完全覆盖数据库中对应的数据。
        """

        db_config = convertDBConfig(**config)
        if config["DBType"] == 'mssql':
            DBSource = DB.MSSQLController(config).MSSQLDB
        else:
            DBSource = web.database(**db_config)

        # 导入数据的周数,默认1周,可选1周、2周、4周数据
        import_weeks = config.pop("importWeeks", 1)

        # 数据源连接测试
        connect_test = self.testSourceConfig(config)
        if connect_test["result"] == "failed":
            raise Exception("[ERR]: import failed, please check the config")
        else:
            sql = connect_test["sql"]

        tmp = DBSource.select(sql, what="MAX(workDate) as MAX_DATE, MIN(workDate) as MIN_DATE")[0]
        max_date = tmp["MAX_DATE"]
        min_date = tmp["MIN_DATE"]
        if not max_date or not min_date:
            # raise Exception("[ERR]: import failed, please check whether the source has {0} week(s) data".format(import_weeks))
            raise Exception("importWeeks error")
        # MSSQL 查询出来是Unicode,需要进行转换
        if isinstance(max_date, str) or isinstance(max_date, unicode):
            max_date = datetime.datetime.strptime(max_date, "%Y-%m-%d")
        if isinstance(min_date, str) or isinstance(min_date, unicode):
            min_date = datetime.datetime.strptime(min_date, "%Y-%m-%d")
        # 判断是否是最新的数据
        current_date = datetime.datetime.today()
        isNewData = int(datetime.datetime.strftime(current_date, '%W')) - int(datetime.datetime.strftime(min_date, '%W'))
        if isNewData !=0:
            raise Exception("importWeeks error")
        # 判断导入数据的周数和配置的导入周数是否相同
        interval = int(datetime.datetime.strftime(max_date, '%W')) - int(datetime.datetime.strftime(min_date, '%W'))
        count = interval + 1
        if count != import_weeks:
            # raise Exception("[ERR]: import failed, please check whether the source has {0} week(s) data".format(import_weeks))
            raise Exception("importWeeks error")

        # 数据源排班数据
        scheduleList = DBSource.select(sql)

        # 插入到排班表中的排班数据列表,可使用multiple_insert方法实现多条插入
        insert_items = []

        # 每个队列关键字对应的分诊台ID、队列ID、可登陆医生等信息
        queue_workers = []

        # 根据循环的次数,生成相应的排班数据
        for item in scheduleList:
            if config["DBType"] == "oracle":
                item = self.convertItem(item)
            for i in range(0, self.repeat_count, import_weeks):
                # 生成排班信息
                workDate = item["workDate"]
                if isinstance(workDate, str) or isinstance(workDate, unicode):
                    workDate = datetime.datetime.strptime(workDate, "%Y-%m-%d")
                date = workDate + datetime.timedelta(self.repeat_interval*i)
                item_copy = copy.deepcopy(item)
                item_copy["workDate"] = date
                insert_items.append(dict(item_copy))
                # 导入数据时也要覆盖临时调班数据
                schedule_temp = DB.DBLocal.select("schedule_temp", where={"queue": item_copy["queue"], "workTime": item_copy["workTime"],
                                                                          "workDate": item_copy["workDate"].strftime("%Y-%m-%d")})
                if len(schedule_temp) != 0:
                    DB.DBLocal.delete("schedule_temp", where={"queue": item_copy["queue"], "workTime": item_copy["workTime"],
                                                              "workDate": item_copy["workDate"].strftime("%Y-%m-%d")})

            # 生成每个队列的医生数据
            workers = str2List(item["workerID"])
            queue = item["queue"]
            try:
                queueInfo = QueueInfoInterface().getInfoByFilter({"queue": queue})
                worker_paras = {"stationID": queueInfo["stationID"], "queueID": queueInfo["id"], "workers": workers}
            except:
                continue
            if not queue_workers:
                queue_workers.append(worker_paras)
            else:
                for item in queue_workers:
                    if item["stationID"] == queueInfo["stationID"] and item["queueID"] == queueInfo["id"]:
                        item["workers"] = list(set(item["workers"] + workers))
                        break
                else:
                    queue_workers.append(worker_paras)

        insert_items = sorted(insert_items, key=lambda value: (value["queue"], value["workDate"]))

        try:
            start = time.time()
            # 批量插入或者更新排班数据
            if insert_items:
                insert_sql = multiple_insert_sql("schedule", insert_items)
                DB.DBLocal.query(insert_sql)

            print "Worker: {0}".format(queue_workers)
            # 更新每个队列可登陆医生
            for item in queue_workers:
                QueueInfoInterface().updateWorkerLimit(item)
            # 如果导入成功,将import_weeks写入数据库配置中
            DB.DBLocal.update("import_config", where={"type": "schedule"}, importWeeks=import_weeks)
        except:
            raise
        else:
            print "IMPORT TIME COST: {0} ms".format((time.time() - start) * 1000)
            print "INSERT/UPDATE: {0}".format(len(insert_items))
            result = {}
            result["result"] = "success"
            result["successCount"] = len(insert_items)
            result["totalImport"] = len(insert_items)
            result["failedCount"] = result["totalImport"] - result["successCount"]
            return result