|
@@ -3,10 +3,7 @@ package com.rongwei.bscommon.sys.service.impl;
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.collection.ListUtil;
|
|
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 cn.hutool.core.util.ObjectUtil;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
@@ -4189,7 +4186,171 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
lenzhaChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo);
|
|
lenzhaChongpai(chongpaiStartDate, chongpaiEndDate, apsScheduleConfigDo);
|
|
//退火重排
|
|
//退火重排
|
|
tuihuoChongpai(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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|