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)
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("排班中遇到冲突,请重试一次")