package com.lsu.controller.schedule;
import com.lsu.common.R;
import com.lsu.entity.*;
import com.lsu.service.*;
import com.lsu.utils.DateUtils;
import com.lsu.utils.RandomUtils;
import com.lsu.vo.ScheduleVo;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.*;
/**
* @author zt
* @create 2023-03-18 20:51
* 管理排班
*/
@RestController
public class ScheduleFormController {
@Resource
private ScheduleFormService scheduleFormService; //排班表查询
@Resource
private StoreRuleService storeRuleService; //门店规则事务
@Resource
private PassengerFlowService passengerFlowService; //客流量事务
@Resource
private StaffInfoService staffInfoService; //员工信息事务
@Resource
private StoreInfoService storeInfoService; //门店信息事务
@Resource
private ScheduleVoService scheduleVoService; //排班信息vo
@Resource
private MessageFormService messageFormService;
@Resource
private MesUserMapService mesUserMapService;
/**
* 对从startDate日期开始的一周进行排班 (startDate为某周周一的日期)
* @param storeId 门店id
* @return 排班结果
*/
@RequiresRoles(value = {"admin","shopowner"},logical = Logical.OR)
@PostMapping("/generateScheduleForm")
public R<String> generateScheduleForm(@RequestParam Integer storeId,@DateTimeFormat(pattern="yyyy-MM-dd")@RequestParam Date startDate){
// 记录程序开始时间
long startTime = System.currentTimeMillis();
if (!"星期一".equals(DateUtils.getToDay(startDate)))
return R.err("开始时间错误");
//1.获取门店信息
StoreInfo storeInfo = storeInfoService.getOneStore(storeId);
//2.获取门店开启的规则(类型和值)
List<StoreRule> storeUseRuleList = storeRuleService.getStoreUseRule(storeId);
//对规则做处理
Double a = 1.0,b1,b2,c,d,e1,e2,f,g; //记录规则值
for (int i=0;i<storeUseRuleList.size();i++){
StoreRule storeRule = storeUseRuleList.get(i);
String value = storeRule.getValue();
switch (storeRule.getType()){
case "a":a=Double.parseDouble(value);break; //每rt个预测客流量需要一个人,默认为1
case "b":b1= Double.parseDouble(value.substring(0,value.indexOf(",")));
b2=Double.parseDouble(value.substring(value.indexOf(",")+1));
break;//开店前x个小时必须有员工做开店准备,人数为面积/x
case "c":c=Double.parseDouble(value);break;//每天关店之后需要x小时做收尾工作
case "d":d=Double.parseDouble(value);break;//如果没有客流量的时候至少需要x个员工当值
case "e":e1=Double.parseDouble(value.substring(0,value.indexOf(",")));
e2=Double.parseDouble(value.substring(value.indexOf(",")+1));
break;//全勤奖励x元,迟到,早退,每分钟扣罚x元
case "f":f=Double.parseDouble(value);break;//休息时段的时间不能超过x分钟
case "g":g=Double.parseDouble(value);break;//在午餐或晚餐时间至少需要x个员工当值
}
}
//3.获取门店的可用员工
List<StaffInfo> staffInfoList = staffInfoService.getStaffListByStore(storeId);
//4.需排班的日期
List<Date> dateList = DateUtils.getWeekDay(startDate); //从startDate开始的一周时间
//5.获取门店的需排班日期的客流量表
List<List<PassengerFlow>> lists = passengerFlowService.getDayListPassengerFlowList(dateList, storeId);
//6.清除之前已排的班次信息
scheduleFormService.deleteWeekScheduleForm(dateList,storeId);
//7.创建记录员工周、日工作时间集合
List<Integer> staffDayWorkTime,staffWeekWorkTime = null;
//8.对需要排班的日期进行排班
//(1)遍历准备工作
Integer staffSum = staffInfoList.size(); //获取员工总人数
if (staffSum==0)
return R.err("门店无员工");
//(2)遍历所有需要排班的日期
for (int i=0;i<dateList.size();i++){
//(3)初始化数据
Date date = dateList.get(i); //本次排班的日期
staffDayWorkTime = new ArrayList<>(Collections.nCopies(staffSum, 0)); //1每日初始化员工日工作时长
if (staffWeekWorkTime == null) //2初始化员工周工作时长
staffWeekWorkTime = new ArrayList<>(Collections.nCopies(staffSum, 0));
List<PassengerFlow> passengerFlowList = lists.get(i); //3本次排班日期的预测客流量
List<Integer> passengerRtList = new ArrayList<>(); //4将预测客流量转换为所需的员工数量
for (int j=0;j<passengerFlowList.size();j++){
double v = Math.round(passengerFlowList.get(j).getCalculate() / a);
passengerRtList.add(j,(int) v);
}
for (int j=0;j<passengerRtList.size()-3;j++){ //最少每2小时一个班次
Integer rt = passengerRtList.get(j);
if (rt > 0){
for (int k=1;k<4;k++){
passengerRtList.set(j+k,passengerRtList.get(j+k)-rt);
}
}
}
int max = 0; //清空后三个时间段
for (int j=passengerRtList.size()-3;j<passengerRtList.size();j++){
if (passengerRtList.get(j) > max)
max = passengerRtList.get(j);
passengerRtList.set(j,0);
}
passengerRtList.set(passengerRtList.size()-4,max);
// int sum = 0; 所需人数粗计
// for (int j=0;j<passengerRtList.size();j++)
// sum+=passengerRtList.get(j);
// System.out.println(sum);
//排班
List<Integer> staffScheduleCount = new ArrayList<>(Collections.nCopies(staffSum, 0)); //员工是否能被选中
int maxCount = 3; //最多循环数
int maxWeekTime = 50; //最多周工作时长
int maxDayTime = 8; //最多日工作时长
for (int j=0;j<passengerRtList.size();j++){
for (int k=0;k<passengerRtList.get(j);k++){ //需要passengerRtList.get(j)个人
int random = RandomUtils.getRandom(staffWeekWorkTime,maxWeekTime); //根据轮盘法获取员工在集合中的位置
//循环直到对应员工符合要求 (最多循环四次)
int count = 1;
//scheduleCount为0才能被选中
while (!(staffDayWorkTime.get(random)<maxDayTime&&staffWeekWorkTime.get(random)<maxWeekTime) || 0 != staffScheduleCount.get(random)) {
if (count == maxCount)
break;
random = RandomUtils.getRandom(staffWeekWorkTime,maxWeekTime);
count++;
}
// System.out.print("," + random);
Integer staffId; //员工id(null空班次(count==5))
if (count == maxCount) //判断是否已找到合适的员工
staffId = null;
else{
staffScheduleCount.set(random,sta
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
毕设&课程作业_智能排班系统后端.zip (179个子文件)
ScheduleFormController.java 13KB
SeizeOrdersController.java 13KB
LeaveFormController.java 7KB
SignInFormVoServiceImpl.java 7KB
SignInFormController.java 7KB
EmailController.java 6KB
ShiroConfig.java 5KB
PassengerFlowServiceImpl.java 5KB
UserController.java 5KB
StaffInfoServiceImpl.java 5KB
StoreInfoController.java 5KB
TimedGrabService.java 4KB
StaffInfoController.java 4KB
DateUtils.java 4KB
StoreInfoServiceImpl.java 4KB
RedisUtils.java 4KB
MessageController.java 4KB
PassengerFlowController.java 3KB
ScheduleFormServiceImpl.java 3KB
RedisConfig.java 3KB
ExcelUtils.java 3KB
StaffPreferenceServiceImpl.java 3KB
UserServiceImpl.java 3KB
StoreRuleController.java 3KB
SeizeVoServiceImpl.java 3KB
StoreRuleServiceImpl.java 3KB
RuleMapServiceImpl.java 3KB
LeaveVoServiceImpl.java 3KB
LeaveFormServiceImpl.java 3KB
MyRealm.java 2KB
RuleMapController.java 2KB
StaffInfoVoServiceImpl.java 2KB
PositionMapController.java 2KB
ScheduleVoServiceImpl.java 2KB
ClientController.java 2KB
SeizeOrders.java 2KB
SkillMapController.java 2KB
SignInFormVo.java 2KB
TopPremiumsServiceImpl.java 2KB
LeaveVo.java 2KB
StaffInfo.java 2KB
SeizeOrdersServiceImpl.java 2KB
ScheduleConfig.java 2KB
SignInFormServiceImpl.java 2KB
SeizeVo.java 2KB
ScheduleForm.java 2KB
StaffInfoVo.java 2KB
RandomUtils.java 2KB
OpinionController.java 2KB
TopPremiumsController.java 2KB
LeaveForm.java 2KB
StaffInfoService.java 2KB
MesUserMapServiceImpl.java 2KB
ScheduleVo.java 2KB
PassengerFlowService.java 1KB
ClientInfo.java 1KB
CorsUtils.java 1KB
StaffPreferenceController.java 1KB
SignInForm.java 1KB
SeizeCache.java 1KB
SmartShiftApplicationTests.java 1KB
MyShiroSessionManager.java 1KB
RuleVo.java 1KB
PassengerFlow.java 1KB
SignInFormVoService.java 1KB
StoreInfo.java 1KB
GptMessageController.java 1KB
PositionMap.java 1KB
MessageVoServiceImpl.java 1KB
OpinionVo.java 1KB
MessageVo.java 1KB
MessageForm.java 1KB
MessageFormServiceImpl.java 1KB
UserService.java 1KB
Opinion.java 1KB
OpinionVoServiceImpl.java 1KB
StoreInfoService.java 1KB
RuleVoServiceImpl.java 1KB
MessagesServiceImpl.java 1020B
SeizeVoMapper.java 1007B
PermissionsException.java 984B
User.java 984B
StaffPreferenceService.java 975B
StoreRuleService.java 943B
MybatisPlusConfig.java 934B
ScheduleFormService.java 925B
CodeUtils.java 909B
SeizeVoService.java 803B
StoreRule.java 802B
MesUserMap.java 789B
ScheduleVoService.java 754B
RuleMap.java 724B
StaffPreference.java 713B
SkillMap.java 710B
PositionMapServiceImpl.java 708B
ShiroAuthcFilter.java 688B
R.java 681B
Messages.java 676B
TopPremiums.java 670B
LeaveVoService.java 669B
共 179 条
- 1
- 2
资源评论
学术菜鸟小晨
- 粉丝: 1w+
- 资源: 4931
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (matlab源码)基于Elman神经网络的电力负荷预测模型MATLAB实现
- 微信小程序源码 趣味互动机器人 - 机器人兔兔下载
- 2022年全国各区县年平均气温
- 05-16 周四 vscode 搭建远程调试环境
- (matlab源码)基于SOM神经网络的柴油机故障诊断MATLAB实现
- 1950-2022年全国各省份逐年平均降水数据
- (matlan源码)粒子群算法的寻优算法MATLAB实现
- MTB095N10KRN3-VB一款SOT23封装N-Channel场效应MOS管
- (MATLAB源码)灰色神经网络对订单需求预测分析与MATLAB实现 (2)
- (matlab源码)基于BP-Adaboost的强分类器设计与MATLAB实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功