|
@@ -3,10 +3,7 @@ package com.rongwei.bscommon.sys.service.impl;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
-import cn.hutool.core.date.DateField;
|
|
|
-import cn.hutool.core.date.DateTime;
|
|
|
-import cn.hutool.core.date.DateUtil;
|
|
|
-import cn.hutool.core.date.StopWatch;
|
|
|
+import cn.hutool.core.date.*;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
@@ -740,21 +737,21 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
@Override
|
|
|
public void blankOrderAps(List<ApsBlankOrderVo> apsBlankOrders) {
|
|
|
apsService.apsSchedule(apsBlankOrders, new ApsTypeVo(), null, null);
|
|
|
- //调度排程
|
|
|
- //判断是否是 18:00:00-24:00:00/00:00:00-5:00:00
|
|
|
- // 获取当前时间
|
|
|
- LocalTime now = LocalTime.now();
|
|
|
- // 定义时间段
|
|
|
- LocalTime startTime1 = LocalTime.of(18, 0); // 18:00:00
|
|
|
- LocalTime endTime1 = LocalTime.of(23, 59, 59); // 23:59:59 (24:00:00 - 1 second)
|
|
|
- LocalTime startTime2 = LocalTime.MIDNIGHT; // 00:00:00
|
|
|
- LocalTime endTime2 = LocalTime.of(5, 0); // 05:00:00
|
|
|
- // 检查当前时间是否在两个时间段之一内
|
|
|
- boolean isInFirstRange = (now.isAfter(startTime1) || now.equals(startTime1)) && (now.isBefore(endTime1) || now.equals(endTime1));
|
|
|
- boolean isInSecondRange = (now.isAfter(startTime2) || now.equals(startTime2)) && (now.isBefore(endTime2) || now.equals(endTime2));
|
|
|
- if (isInFirstRange || isInSecondRange) {
|
|
|
- apsScheduleRestart(null);
|
|
|
- }
|
|
|
+// //调度排程
|
|
|
+// //判断是否是 18:00:00-24:00:00/00:00:00-5:00:00
|
|
|
+// // 获取当前时间
|
|
|
+// LocalTime now = LocalTime.now();
|
|
|
+// // 定义时间段
|
|
|
+// LocalTime startTime1 = LocalTime.of(18, 0); // 18:00:00
|
|
|
+// LocalTime endTime1 = LocalTime.of(23, 59, 59); // 23:59:59 (24:00:00 - 1 second)
|
|
|
+// LocalTime startTime2 = LocalTime.MIDNIGHT; // 00:00:00
|
|
|
+// LocalTime endTime2 = LocalTime.of(5, 0); // 05:00:00
|
|
|
+// // 检查当前时间是否在两个时间段之一内
|
|
|
+// boolean isInFirstRange = (now.isAfter(startTime1) || now.equals(startTime1)) && (now.isBefore(endTime1) || now.equals(endTime1));
|
|
|
+// boolean isInSecondRange = (now.isAfter(startTime2) || now.equals(startTime2)) && (now.isBefore(endTime2) || now.equals(endTime2));
|
|
|
+// if (isInFirstRange || isInSecondRange) {
|
|
|
+// apsScheduleRestart(null);
|
|
|
+// }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -810,9 +807,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
} else {
|
|
|
apsProcessOperationProcessEqu.setPlanprocessrall(process.getOpeProducePcNum());
|
|
|
}
|
|
|
- apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict());
|
|
|
- apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
|
|
|
- apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
|
|
|
+ apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict() == null ? "n" : process.getHasConflict());
|
|
|
+ apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes() == null ? "" : process.getConflictDes());
|
|
|
+ apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes() == null ? "" : process.getSoftconflictdes());
|
|
|
apsProcessOperationProcessEqu.setDeleted("0");
|
|
|
apsProcessOperationProcessEqu.setUnfinishroll(apsProcessOperationProcessEqu.getPlanprocessrall());
|
|
|
apsProcessOperationProcessEqu.setLeavewaitworkroll(apsProcessOperationProcessEqu.getPlanprocessrall());
|
|
@@ -4173,7 +4170,14 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
}
|
|
|
|
|
|
//将实际完工时间大于明天的作业挪到实际完工时间
|
|
|
- this.baseMapper.updateFinishDateAboutProcessEqu(needScheduleDate);
|
|
|
+ this.baseMapper.updateFinishDateAboutProcessEqu(needScheduleDate, CXCommonUtils.getCurrentUserFactoryId(null));
|
|
|
+ //锁定所有 未锁定的 作业和作业明细
|
|
|
+ apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .set(ApsProcessOperationProcessEquDo::getLockmarkdetail, "y")
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n"));
|
|
|
+ apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
|
|
|
+ .set(ApsProcessOperationDo::getLockmark, "y")
|
|
|
+ .eq(ApsProcessOperationDo::getLockmark, "n"));
|
|
|
// //查询在重排时间前一天之后的所有作业明细信息,不包括:铸轧、成退、中退、小卷成退
|
|
|
// List<ApsProcessOperationProcessEquChongpaiVo> list = this.baseMapper.selectNeedRescheduleEqu(needScheduleDate, CXCommonUtils.getCurrentUserFactoryId(null));
|
|
|
//排程设置
|
|
@@ -4182,10 +4186,174 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
lenzhaChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo);
|
|
|
//退火重排
|
|
|
tuihuoChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo);
|
|
|
+ //锁定所有 未锁定的 作业和作业明细
|
|
|
+ apsProcessOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .set(ApsProcessOperationProcessEquDo::getLockmarkdetail, "y")
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getLockmarkdetail, "n"));
|
|
|
+ apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>()
|
|
|
+ .set(ApsProcessOperationDo::getLockmark, "y")
|
|
|
+ .eq(ApsProcessOperationDo::getLockmark, "n"));
|
|
|
+
|
|
|
+ //推算非退火、非铸轧的重叠数据,按序排列
|
|
|
+ sortLenZha(chongpaiEndDate);
|
|
|
+ //推算退火,按序排列
|
|
|
+ sortTuiHuo(chongpaiEndDate);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public void sortTuiHuo(DateTime chongpaiEndDate) {
|
|
|
+ //查询后续所有的明细(退火)
|
|
|
+ List<ApsProcessOperationProcessEquDo> list = this.baseMapper.selectAllNeedSortTuiHuo(chongpaiEndDate);
|
|
|
+ //根据设备分组聚合
|
|
|
+ Map<String, List<ApsProcessOperationProcessEquDo>> map = list.stream().collect(Collectors.groupingBy(ApsProcessOperationProcessEquDo::getProcessdeviceid));
|
|
|
+
|
|
|
+ //需要更新的数据集合
|
|
|
+ List<ApsProcessOperationProcessEquDo> needUpdateList = new LinkedList<>();
|
|
|
+
|
|
|
+ for (String key : map.keySet()) {
|
|
|
+ List<ApsProcessOperationProcessEquDo> equList = map.get(key);
|
|
|
+ //按照计划开工时间排序
|
|
|
+ equList.sort(Comparator.comparing(ApsProcessOperationProcessEquDo::getPlanstartdate));
|
|
|
+
|
|
|
+ //设置基准
|
|
|
+// LinkedList<ApsProcessOperationProcessEquDo> baseList = new LinkedList<>(equList);
|
|
|
+ //设置已排序基准
|
|
|
+ LinkedList<ApsProcessOperationProcessEquDo> baseList2 = new LinkedList<>();
|
|
|
+
|
|
|
+ //当前计划开始时间
|
|
|
+ Date basePlanstartdate = null;
|
|
|
+ Date newPlanStartDate = null;
|
|
|
+ boolean isChange = false;
|
|
|
+ for (int i = 0; i < equList.size(); i++) {
|
|
|
+ ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = equList.get(i);
|
|
|
+// //基准去除当前明细
|
|
|
+// baseList.remove(apsProcessOperationProcessEquDo);
|
|
|
+ //如果是第一个,直接结束循环
|
|
|
+ if (i == 0) {
|
|
|
+ baseList2.add(apsProcessOperationProcessEquDo);
|
|
|
+ basePlanstartdate = apsProcessOperationProcessEquDo.getPlanstartdate();
|
|
|
+ isChange = false;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //不是第一个,先判断是否有相同的开始时间,如果有,加入基准,结束循环
|
|
|
+ if (basePlanstartdate.equals(apsProcessOperationProcessEquDo.getPlanstartdate())) {
|
|
|
+ if (!isChange) {
|
|
|
+ baseList2.add(apsProcessOperationProcessEquDo);
|
|
|
+ basePlanstartdate = apsProcessOperationProcessEquDo.getPlanstartdate();
|
|
|
+ isChange = false;
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ ApsProcessOperationProcessEquDo needUpdateDo = new ApsProcessOperationProcessEquDo();
|
|
|
+ needUpdateDo.setId(apsProcessOperationProcessEquDo.getId());
|
|
|
+ //移动开始时间为上一个的结束时间
|
|
|
+ needUpdateDo.setPlanstartdate(newPlanStartDate);
|
|
|
+ //结束时间为当前的开始时间推算原来的加工时间(计划结束-计划开始)
|
|
|
+ int between = (int) DateUtil.between(apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getPlanstartdate(), DateUnit.SECOND);
|
|
|
+ DateTime newPlanEndDate = DateUtil.offsetSecond(needUpdateDo.getPlanstartdate(), between);
|
|
|
+ needUpdateDo.setPlanenddate(newPlanEndDate);
|
|
|
+ //待更新
|
|
|
+ needUpdateList.add(needUpdateDo);
|
|
|
+ //放入基准
|
|
|
+ baseList2.add(needUpdateDo);
|
|
|
+ basePlanstartdate = apsProcessOperationProcessEquDo.getPlanstartdate();
|
|
|
+ isChange = true;
|
|
|
+ newPlanStartDate = needUpdateDo.getPlanstartdate();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果没有相同的开始时间,判断是否在最晚的结束时间之后,如果在之前,更改计划开始时间为最晚的结束时间
|
|
|
+ //查询基准的最晚的时间
|
|
|
+ ApsProcessOperationProcessEquDo lastEqu = baseList2.stream().max(Comparator.comparing(ApsProcessOperationProcessEquDo::getPlanenddate)).orElse(null);
|
|
|
+ if (ObjectUtil.isEmpty(lastEqu)) {
|
|
|
+ baseList2.add(apsProcessOperationProcessEquDo);
|
|
|
+ basePlanstartdate = apsProcessOperationProcessEquDo.getPlanstartdate();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (apsProcessOperationProcessEquDo.getPlanstartdate().before(lastEqu.getPlanenddate())) {
|
|
|
+ ApsProcessOperationProcessEquDo needUpdateDo = new ApsProcessOperationProcessEquDo();
|
|
|
+ needUpdateDo.setId(apsProcessOperationProcessEquDo.getId());
|
|
|
+ //移动开始时间为上一个的结束时间
|
|
|
+ needUpdateDo.setPlanstartdate(lastEqu.getPlanenddate());
|
|
|
+ //结束时间为当前的开始时间推算原来的加工时间(计划结束-计划开始)
|
|
|
+ int between = (int) DateUtil.between(apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getPlanstartdate(), DateUnit.SECOND);
|
|
|
+ DateTime newPlanEndDate = DateUtil.offsetSecond(needUpdateDo.getPlanstartdate(), between);
|
|
|
+ needUpdateDo.setPlanenddate(newPlanEndDate);
|
|
|
+ //待更新
|
|
|
+ needUpdateList.add(needUpdateDo);
|
|
|
+ //放入基准
|
|
|
+ baseList2.add(needUpdateDo);
|
|
|
+ basePlanstartdate = apsProcessOperationProcessEquDo.getPlanstartdate();
|
|
|
+ isChange = true;
|
|
|
+ newPlanStartDate = needUpdateDo.getPlanstartdate();
|
|
|
+ } else {//没有冲突,直接放入基准
|
|
|
+ baseList2.add(apsProcessOperationProcessEquDo);
|
|
|
+ basePlanstartdate = apsProcessOperationProcessEquDo.getPlanstartdate();
|
|
|
+ isChange = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!needUpdateList.isEmpty()) {
|
|
|
+ apsProcessOperationProcessEquService.updateBatchById(needUpdateList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //去除后续的冲突
|
|
|
+ @Override
|
|
|
+ public void sortLenZha(DateTime chongpaiEndDate) {
|
|
|
+ //查询后续所有的明细(非退火、非铸轧)
|
|
|
+ List<ApsProcessOperationProcessEquDo> list = this.baseMapper.selectAllNeedSortLenZha(chongpaiEndDate);
|
|
|
+ //根据设备分组聚合
|
|
|
+ Map<String, List<ApsProcessOperationProcessEquDo>> map = list.stream().collect(Collectors.groupingBy(ApsProcessOperationProcessEquDo::getProcessdeviceid));
|
|
|
+
|
|
|
+ //需要更新的数据集合
|
|
|
+ List<ApsProcessOperationProcessEquDo> needUpdateList = new LinkedList<>();
|
|
|
+
|
|
|
+ for (String key : map.keySet()) {
|
|
|
+ List<ApsProcessOperationProcessEquDo> equList = map.get(key);
|
|
|
+ //按照计划开工时间排序
|
|
|
+ equList.sort(Comparator.comparing(ApsProcessOperationProcessEquDo::getPlanstartdate));
|
|
|
+
|
|
|
+ //设置基准
|
|
|
+// LinkedList<ApsProcessOperationProcessEquDo> baseList = new LinkedList<>(equList);
|
|
|
+ //设置已排序基准
|
|
|
+ LinkedList<ApsProcessOperationProcessEquDo> baseList2 = new LinkedList<>();
|
|
|
+
|
|
|
+ for (int i = 0; i < equList.size(); i++) {
|
|
|
+ ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = equList.get(i);
|
|
|
+// //基准去除当前明细
|
|
|
+// baseList.remove(apsProcessOperationProcessEquDo);
|
|
|
+ //如果是第一个,直接结束循环
|
|
|
+ if (i == 0) {
|
|
|
+ baseList2.add(apsProcessOperationProcessEquDo);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //不是第一个,判断是否和已排序基准冲突,如果冲突,更改计划开始时间为已排序的最后一个明细计划结束时间
|
|
|
+ //最后一个已排序的基准
|
|
|
+ ApsProcessOperationProcessEquDo lastEqu = baseList2.getLast();
|
|
|
+ if (apsProcessOperationProcessEquDo.getPlanstartdate().before(lastEqu.getPlanenddate())) {
|
|
|
+ ApsProcessOperationProcessEquDo needUpdateDo = new ApsProcessOperationProcessEquDo();
|
|
|
+ needUpdateDo.setId(apsProcessOperationProcessEquDo.getId());
|
|
|
+ //移动开始时间为上一个的结束时间
|
|
|
+ needUpdateDo.setPlanstartdate(lastEqu.getPlanenddate());
|
|
|
+ //结束时间为当前的开始时间推算原来的加工时间(计划结束-计划开始)
|
|
|
+ int between = (int) DateUtil.between(apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getPlanstartdate(), DateUnit.SECOND);
|
|
|
+ DateTime newPlanEndDate = DateUtil.offsetSecond(needUpdateDo.getPlanstartdate(), between);
|
|
|
+ needUpdateDo.setPlanenddate(newPlanEndDate);
|
|
|
+ //待更新
|
|
|
+ needUpdateList.add(needUpdateDo);
|
|
|
+ //放入基准
|
|
|
+ baseList2.add(needUpdateDo);
|
|
|
+ } else {//没有冲突,直接放入基准
|
|
|
+ baseList2.add(apsProcessOperationProcessEquDo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!needUpdateList.isEmpty()) {
|
|
|
+ apsProcessOperationProcessEquService.updateBatchById(needUpdateList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void tuihuoChongpai(DateTime chongpaiStartDate, DateTime chongpaiEndDate, ApsScheduleConfigDo apsScheduleConfigDo) {
|
|
|
//退火重排
|
|
|
//查询在重排时间段的所有作业明细信息,只包括:成退、中退、小卷成退
|
|
@@ -4272,6 +4440,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
.in(ApsProcessOperationDo::getId, needUnLockProcessIdList)
|
|
|
);
|
|
|
|
|
|
+// //将调度时间范围内还未解锁的退火作业全部往后推一天
|
|
|
+// this.baseMapper.setTuiHuoNextDay(CXCommonUtils.getCurrentUserFactoryId(null),chongpaiStartDate,chongpaiEndDate);
|
|
|
+
|
|
|
//重新排程
|
|
|
String scheduletype = apsScheduleConfigDo.getScheduletype();
|
|
|
ApsTypeVo apsTypeVo = BeanUtil.toBean(scheduletype, ApsTypeVo.class);
|
|
@@ -4432,6 +4603,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
.in(ApsProcessOperationDo::getId, needUnLockProcessIdList)
|
|
|
);
|
|
|
|
|
|
+// //将调度时间范围内还未解锁的冷轧作业全部往后推一天
|
|
|
+// this.baseMapper.setLenZhaNextDay(CXCommonUtils.getCurrentUserFactoryId(null),chongpaiStartDate,chongpaiEndDate);
|
|
|
+
|
|
|
String scheduletype = apsScheduleConfigDo.getScheduletype();
|
|
|
ApsTypeVo apsTypeVo = BeanUtil.toBean(scheduletype, ApsTypeVo.class);
|
|
|
apsTypeVo.setMixIf("default");
|