def onSchedule(self, evt):
        self.scheduledInput = self.selectedScheduleInput
        self.startDateInput.SetValue(TimeUtil.getMonday(self.startDateInput.GetValue()))
        self.endDateInput.SetValue(TimeUtil.getSunday(self.endDateInput.GetValue()))
        self.scheduledStartDate = self.startDateInput.GetValue()
        if not self.checkInput():
            return

        self.resultList = list()
        for input in self.scheduledInput:
            scheduledWorkers = input[0]
            scheduledGroup = input[1]
            # 现在将工作和休息互换,算法不变
            s = Scheduler(workers=list(range(len(scheduledWorkers))),
                          dailyRequiredWorkerNum=len(scheduledWorkers) - int(scheduledGroup.workLoad),
                          maxRestDay=self.maxWorkDaysInput.GetValue(),
                          maxWorkDay=self.maxRestDaysInput.GetValue(),
                          isShuffle=True)
            targetDays = TimeUtil.getDayLength(self.startDateInput.GetValue(), self.endDateInput.GetValue())
            scheduleResult = s.schedule(int(targetDays))
            if scheduleResult.message.strip() != '':
                wx.MessageBox(scheduledGroup.groupName + ": " + scheduleResult.message)

            self.resultList.append([scheduleResult.restCalendar, scheduledWorkers, scheduledGroup])

        self.displayScheduleResult(self.resultList, self.scheduledStartDate)
        self.exportBtn.Enable(True)
        self.saveBtn.Enable(True)
        self.selectedScheduleInput = list()
    def displayScheduleResult(self, resultList, startDate):
        personalWorkDayDict = list()
        personalWorkDayLengthList = list()
        dailyAttendenceDict = dict()
        for result in resultList:
            calendar = result[0]
            workers = result[1]
            group = result[2]
            try:
                workdayDict = Scheduler.getWorkDayForEachWorker(calendar, workers)
                for (workIndex, workDayList) in workdayDict.items():
                    workDayList = list(map(int, workDayList))
                    workDayList.sort()
                    weeklyWorkDayList = list()
                    week = 1
                    startIndex = 0
                    for dateIndex in range(len(workDayList)):
                        if int(workDayList[dateIndex]) > week * 7:
                            weeklyWorkDayList.append(
                                list(
                                    map(lambda date: date % 7 if date % 7 != 0 else 7,
                                        workDayList[startIndex: dateIndex])))
                            startIndex = dateIndex
                            week += 1
                    if startIndex < len(workDayList):
                        weeklyWorkDayList.append(
                            list(map(lambda date: date % 7 if date % 7 != 0 else 7,
                                     workDayList[startIndex: len(workDayList)])))
                    personalWorkDayDict.append([workers[workIndex], group.groupName, weeklyWorkDayList])

                personalTotalWorkDay = Scheduler.calculateWorkDayPerWorker(calendar)
                for i in range(len(workers)):
                    personalWorkDayLengthList.append(
                        [workers[i], group.groupName, str(personalTotalWorkDay.get(i, 0)),
                         str(personalTotalWorkDay.get(i, 0) * int(group.workHour))])
                # # 添加平均数行
                # avgWorkDayNum = math.ceil(float(len(calendar.keys())) * int(
                #     group.workLoad) / len(
                #     workers))
                # avgWorkHour = avgWorkDayNum * int(group.workHour)
                # workDayData.append([u'平均出勤天数', str(avgWorkDayNum), str(avgWorkHour)])

                for keyValuePair in sorted(calendar.items(), key=lambda d: int(d[0])):
                    currentDate = TimeUtil.getFormatedDate(startDate, int(keyValuePair[0]) - 1)
                    currentDateArrange = dailyAttendenceDict.get(currentDate, list())

                    currentDateArrange.append(
                        [",   ".join(map(str, map(lambda index: workers[index], keyValuePair[1]))), group])
                    dailyAttendenceDict[currentDate] = currentDateArrange

            except Exception as e:
                wx.MessageBox(u'出错啦: ' + str(e))

        # 按日期排序
        dailyAttendenceList = sorted(dailyAttendenceDict.items(), key=lambda d: d[0])
        self.exportData = [personalWorkDayDict, dailyAttendenceList, personalWorkDayLengthList, startDate]
        self.updateGrid(personalWorkDayLengthList)
        self.updateGrid1(personalWorkDayDict, startDate)
        self.updateGrid2(dailyAttendenceList)
Example #3
0
    def onSearchDate(self, evt):
        if not self.checkInput():
            return

        count = 0
        s = Scheduler(self.data._data, self.workloadInput.GetValue(), self.maxRestDayInput.GetValue())
        while count < s.MAX_RETRY_TIME:
            count += 1
            data = s.doSchedule(self.dateInput.GetValue())
            if s.validateSchedule(data):
                result = list()
                for line in sorted(data.iteritems(), key=lambda d: d[0]):
                    result.append("    ".join(map(str, line[1])))
                self.updateGrid1(result)
                return
        wx.MessageBox("排班中遇到冲突,请重试一次")