Explorar el Código

aps-调度之后锁定所有工序,推算排序后续冷轧和退火明细

sucheng hace 5 meses
padre
commit
84525c5e54

+ 4 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsBlankOrderDao.java

@@ -168,4 +168,8 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
 
     void setLenZhaNextDay(@Param("tenantId") String tenantId, @Param("chongpaiStartDate") DateTime chongpaiStartDate, @Param("chongpaiEndDate") DateTime chongpaiEndDate);
     void setTuiHuoNextDay(@Param("tenantId") String tenantId, @Param("chongpaiStartDate") DateTime chongpaiStartDate, @Param("chongpaiEndDate") DateTime chongpaiEndDate);
+
+    List<ApsProcessOperationProcessEquDo> selectAllNeedSortLenZha(@Param("chongpaiEndDate") DateTime chongpaiEndDate);
+
+    List<ApsProcessOperationProcessEquDo> selectAllNeedSortTuiHuo(@Param("chongpaiEndDate") DateTime chongpaiEndDate);
 }

+ 5 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsBlankOrderService.java

@@ -1,5 +1,6 @@
 package com.rongwei.bscommon.sys.service;
 
+import cn.hutool.core.date.DateTime;
 import com.rongwei.bsentity.domain.ApsBlankOrderDo;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ApsProductionTechnicalRequirementDo;
@@ -70,4 +71,8 @@ public interface ApsBlankOrderService extends IService<ApsBlankOrderDo> {
     R checkAddMaterial(AddMaterialReq req);
 
     void apsScheduleRestart(Integer hour);
+
+    void sortLenZha(DateTime chongpaiEndDate);
+
+    void sortTuiHuo(DateTime chongpaiEndDate);
 }

+ 165 - 4
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java

@@ -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;
@@ -4189,7 +4186,171 @@ 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);
         }
     }
 

+ 24 - 0
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsBlankOrderDao.xml

@@ -519,4 +519,28 @@
         ) &lt;= #{chongpaiEndDate}) -- 调度结束时间之前可以开工
         )
     </select>
+    <select id="selectAllNeedSortLenZha"
+            resultType="com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo">
+        SELECT
+            apope.*
+        FROM
+            aps_process_operation_process_equ apope
+                JOIN aps_process_operation apo ON apope.PROCESSID = apo.ID
+        WHERE
+            apope.PLANSTARTDATE > #{chongpaiEndDate}
+          AND apo.PROCESS NOT IN ('铸轧','中退','成退','小卷成退')
+          AND apope.PLANENDDATE is not null
+    </select>
+    <select id="selectAllNeedSortTuiHuo"
+            resultType="com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo">
+        SELECT
+            apope.*
+        FROM
+            aps_process_operation_process_equ apope
+                JOIN aps_process_operation apo ON apope.PROCESSID = apo.ID
+        WHERE
+            apope.PLANSTARTDATE > #{chongpaiEndDate}
+          AND apo.PROCESS IN ('中退','成退','小卷成退')
+          AND apope.PLANENDDATE is not null
+    </select>
 </mapper>

+ 13 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsBlankOrderController.java

@@ -1,6 +1,8 @@
 package com.rongwei.bsserver.controller;
 
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.rongwei.bscommon.sys.service.ApsBlankOrderService;
 import com.rongwei.bscommon.sys.service.ApsService;
 import com.rongwei.bsentity.domain.ApsBlankOrderDo;
@@ -10,8 +12,10 @@ import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.vo.CriteriaQuery;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 
+import java.sql.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -235,5 +239,14 @@ public class ApsBlankOrderController {
         log.info("领料校验 入参:{}", req);
         return apsBlankOrderService.checkAddMaterial(req);
     }
+
+    /**
+     * 将制定时间后的数据顺序重排
+     */
+    @GetMapping("/chongPaiByEndDate")
+    public R chongPaiByEndDate(@RequestParam("chongpaiEndDate") String chongpaiEndDate){
+        apsBlankOrderService.sortTuiHuo(DateUtil.parseDate(chongpaiEndDate));
+        return R.ok();
+    }
 }