Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/mode-min-unit' into mode-min-unit

DLC 5 mesi fa
parent
commit
ecfdafff4e

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

@@ -155,7 +155,7 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
 
     String selectPlanEndProductionWorkshopsById(@Param("productionorderid") String productionorderid);
 
-    void updateFinishDateAboutProcessEqu(@Param("needScheduleDate") String needScheduleDate);
+    void updateFinishDateAboutProcessEqu(@Param("needScheduleDate") String needScheduleDate,@Param("tenantId") String tenantId);
 
     void removeLockNextDayProcessEqu(@Param("needScheduleDate") String needScheduleDate);
 
@@ -165,4 +165,11 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
     List<ApsProcessOperationProcessEquDo> selectNeedRescheduleEqu2(@Param("chongpaiStartDate") DateTime chongpaiStartDate, @Param("chongpaiEndDate") DateTime chongpaiEndDate, @Param("tenantId") String tenantId, @Param("workshopin") Integer workshopin, @Param("workshopcross") Integer workshopcross);
 
     List<ApsProcessOperationProcessEquDo> selectNeedRescheduleEqu3(@Param("chongpaiStartDate") DateTime chongpaiStartDate, @Param("chongpaiEndDate") DateTime chongpaiEndDate, @Param("tenantId") String tenantId, @Param("workshopin") Integer workshopin, @Param("workshopcross") Integer workshopcross);
+
+    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);
 }

+ 7 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java

@@ -120,8 +120,14 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
 
     List<ProcessVo> selectMyProcessVo(@Param("equId") String equId, @Param("date1") Date date1, @Param("date2") Date date2);
 
-    @Select("select apope.PLANSTARTDATE from aps_process_operation apo LEFT JOIN aps_process_operation_process_equ apope ON apo.ID = apope.PROCESSID AND apope.DELETED = 0 WHERE apo.DELETED = 0 AND apo.BLANKID = #{blankid} AND apo.PROCESS != '铸轧' ORDER BY apope.PLANSTARTDATE limit 1")
+    @Select("select apope.PLANSTARTDATE from aps_process_operation apo LEFT JOIN aps_process_operation_process_equ apope ON apo.ID = apope.PROCESSID AND apope.DELETED = 0 WHERE apo.DELETED = 0 AND apo.BLANKID = #{blankid} AND apo.PROCESS != '铸轧' AND apope.PLANSTARTDATE is not null ORDER BY apope.PLANSTARTDATE limit 1")
     Date getEarltPlanStartDate(@Param("blankid") String blankid);
+
+    @Select("select count(1) from aps_process_operation_process_equ where DELETED = 0 AND PROCESSDEVICEID = #{processdeviceid} AND ID != #{apsProcessOperationProcessEquDoId} AND WAITREPORTID IS NOT NULL AND WAITREPORTID != ''")
+    int selectHaveOtherDeviceCount(@Param("processdeviceid") String processdeviceid,@Param("apsProcessOperationProcessEquDoId") String apsProcessOperationProcessEquDoId);
+
+    @Select("select * from aps_process_operation_process_equ where DELETED = 0 AND PROCESSDEVICEID = #{processdeviceid} AND ID != #{apsProcessOperationProcessEquDoId} AND WAITREPORTID IS NOT NULL AND WAITREPORTID != ''")
+    List<ApsProcessOperationProcessEquDo> selectHaveOtherDevice(@Param("processdeviceid") String processdeviceid,@Param("apsProcessOperationProcessEquDoId") String apsProcessOperationProcessEquDoId);
 }
 
 

+ 2 - 2
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsReportRecordsDao.java

@@ -62,8 +62,8 @@ public interface ApsReportRecordsDao extends BaseMapper<ApsReportRecordsDo> {
     @Select("select * from aps_process_operation_process_equ where DELETED = 0 AND ID != #{id} AND PROCESSDEVICEID = #{processdeviceid} AND PLANSTARTDATE = #{planstartdate} AND (WAITREPORTID is null or WAITREPORTID = '') AND CLOSESTATUS = '未完工'")
     List<ApsProcessOperationProcessEquDo> selectOtherMergeProcessEqu(@Param("id") String id, @Param("processdeviceid") String processdeviceid, @Param("planstartdate") Date planstartdate);
 
-    @Select("select * from aps_process_operation_process_equ where DELETED = 0 AND ID != #{id} AND PROCESSDEVICEID = #{processdeviceid} AND PLANSTARTDATE = #{planstartdate} AND WAITREPORTID is not null AND WAITREPORTID != ''")
-    List<ApsProcessOperationProcessEquDo> selectOtherMergeProcessStarting(@Param("id") String id, @Param("processdeviceid") String processdeviceid, @Param("planstartdate") Date planstartdate);
+//    @Select("select * from aps_process_operation_process_equ where DELETED = 0 AND ID != #{id} AND PROCESSDEVICEID = #{processdeviceid} AND PLANSTARTDATE = #{planstartdate} AND WAITREPORTID is not null AND WAITREPORTID != ''")
+    List<ApsProcessOperationProcessEquDo> selectOtherMergeProcessStarting(@Param("id") String id, @Param("processdeviceid") String processdeviceid);
 
     List<ProcessOutputAndInputNumber> selectInputAndOutputNumByProcessId(@Param("processIds")List<String> processIds);
 }

+ 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);
 }

+ 197 - 23
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;
@@ -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");

+ 30 - 8
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -371,6 +371,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 Date planstartdate = processEqus.getPlanstartdate();
                 Date planenddate = processEqus.getPlanenddate();
                 ApsProcessOperationDo apsProcessOperationDo = apsProcessOperationService.getById(processEqus.getProcessid());
+                //获取工序作业对应的所有加工设备
+                List<ApsProcessOperationEquDo> processOperationEquDos = apsProcessOperationEquService.list(new LambdaQueryWrapper<ApsProcessOperationEquDo>().eq(ApsProcessOperationEquDo::getMainid, apsProcessOperationDo.getId()));
+                //加工设备的资源ID
+                List<String> equIds = processOperationEquDos.stream().map(ApsProcessOperationEquDo::getResourceid).distinct().collect(Collectors.toList());
                 String processWay = apsProcessOperationDo.getProcessway();
                 // 单卷加工时长
                 BigDecimal onceprocessmin = apsProcessOperationDo.getOnceprocessmin();
@@ -385,6 +389,14 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                     processEqus.setProcessworkshop(changingWiresVo.getWorkshopName());
                     processEqus.setProcessdeviceid(changingWiresVo.getEquId());
                     processEqus.setProcessdevice(changingWiresVo.getEquName());
+                    if (equIds.contains(changingWiresVo.getEquId())){
+                        ApsProcessOperationEquDo apsProcessOperationEquDo = processOperationEquDos.stream().filter(item -> item.getResourceid().equals(changingWiresVo.getEquId())).findFirst().orElse(null);
+                        if (ObjectUtil.isNotEmpty(apsProcessOperationEquDo)) {
+                            processEqus.setRollerid(apsProcessOperationEquDo.getRollerid());
+                        }
+                    }else {
+                        processEqus.setRollerid("");
+                    }
                     // 计划开工时间=计划开工时间-开工时间间隔
                     processEqus.setPlanstartdate(new Date(planstartdate.getTime() - timeInterval));
                     // 计划完工时间=计划完工时间-开工时间间隔
@@ -439,6 +451,14 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                         newProcessEqu.setProcessworkshop(changingWiresVo.getWorkshopName());
                         newProcessEqu.setProcessdeviceid(changingWiresVo.getEquId());
                         newProcessEqu.setProcessdevice(changingWiresVo.getEquName());
+                        if (equIds.contains(changingWiresVo.getEquId())){
+                            ApsProcessOperationEquDo apsProcessOperationEquDo = processOperationEquDos.stream().filter(item -> item.getResourceid().equals(changingWiresVo.getEquId())).findFirst().orElse(null);
+                            if (ObjectUtil.isNotEmpty(apsProcessOperationEquDo)) {
+                                newProcessEqu.setRollerid(apsProcessOperationEquDo.getRollerid());
+                            }
+                        }else {
+                            processEqus.setRollerid("");
+                        }
                         newProcessEqu.setActualstartdate(null);
                         newProcessEqu.setActualfinishdate(null);
                         newProcessEqu.setCancelroll(0);
@@ -779,14 +799,16 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         if (!apsProcessOperationDo.getProcess().equals("铸轧")) {
             //查询该坯料计划非铸轧作业明细的最早计划开工时间
             Date earlyPlanStartDate = this.baseMapper.getEarltPlanStartDate(apsProcessOperationProcessEquDo.getBlankid());
-            if (DateUtil.between(apsProcessOperationProcessEquDo.getPlanenddate(), earlyPlanStartDate, DateUnit.DAY) > apsBlankOrderDo.getExpecteddays()) {
-                apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(),
-                        "作业明细计划完工时间:" + apsProcessOperationProcessEquDo.getPlanenddate() + ",该坯料计划非铸轧作业明细的最早计划开工时间:" + earlyPlanStartDate + ",坯料计划冷轧交货天数:" + apsBlankOrderDo.getExpecteddays(), NO_ABOUT_EXPECTED_DAYS, 1, null);
-                newSoftconflictdes = addNewConflictsDesc(newSoftconflictdes, NO_ABOUT_EXPECTED_DAYS);
-            } else {
-                apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(),
-                        "作业明细计划完工时间:" + apsProcessOperationProcessEquDo.getPlanenddate() + ",该坯料计划非铸轧作业明细的最早计划开工时间:" + earlyPlanStartDate + ",坯料计划冷轧交货天数:" + apsBlankOrderDo.getExpecteddays(), NO_ABOUT_EXPECTED_DAYS, 2, null);
-                newSoftconflictdes = removeConflictsDesc(newSoftconflictdes, NO_ABOUT_EXPECTED_DAYS);
+            if (ObjectUtil.isNotEmpty(earlyPlanStartDate)) {
+                if (DateUtil.between(apsProcessOperationProcessEquDo.getPlanenddate(), earlyPlanStartDate, DateUnit.DAY) > apsBlankOrderDo.getExpecteddays()) {
+                    apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(),
+                            "作业明细计划完工时间:" + apsProcessOperationProcessEquDo.getPlanenddate() + ",该坯料计划非铸轧作业明细的最早计划开工时间:" + earlyPlanStartDate + ",坯料计划冷轧交货天数:" + apsBlankOrderDo.getExpecteddays(), NO_ABOUT_EXPECTED_DAYS, 1, null);
+                    newSoftconflictdes = addNewConflictsDesc(newSoftconflictdes, NO_ABOUT_EXPECTED_DAYS);
+                } else {
+                    apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(),
+                            "作业明细计划完工时间:" + apsProcessOperationProcessEquDo.getPlanenddate() + ",该坯料计划非铸轧作业明细的最早计划开工时间:" + earlyPlanStartDate + ",坯料计划冷轧交货天数:" + apsBlankOrderDo.getExpecteddays(), NO_ABOUT_EXPECTED_DAYS, 2, null);
+                    newSoftconflictdes = removeConflictsDesc(newSoftconflictdes, NO_ABOUT_EXPECTED_DAYS);
+                }
             }
         }
 

+ 33 - 11
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java

@@ -171,7 +171,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         /**
          * 需求变更:小卷开工类型取消开工时,应该在当前工序作业明细的加工中批次号应该减去“{批次号}”
          */
-        if (ObjectUtil.isNotEmpty(recordsDo.getBatchnumber())) {
+        if (ObjectUtil.isNotEmpty(recordsDo.getBatchnumber()) && ObjectUtil.isNotEmpty(apsProcessOperationProcessEquDo.getDoingbatchnumber())) {
             List<String> doingBatchNumbers = new LinkedList<>(Arrays.asList(apsProcessOperationProcessEquDo.getDoingbatchnumber().split(",")));
             if (ObjectUtil.isNotEmpty(doingBatchNumbers)) {
                 doingBatchNumbers.removeAll(batchNumberList);
@@ -338,7 +338,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         }
 
         //如果当前工序作业明细  不存在(其他合并工序作业明细,并且其他合并作业明细的 待报工记录ID 不为空) 则炉号-1
-        List<ApsProcessOperationProcessEquDo> equDoMergeStartingList = this.baseMapper.selectOtherMergeProcessStarting(equDo.getId(), equDo.getProcessdeviceid(), equDo.getPlanstartdate());
+        List<ApsProcessOperationProcessEquDo> equDoMergeStartingList = this.baseMapper.selectOtherMergeProcessStarting(equDo.getId(), equDo.getProcessdeviceid());
         if (equDoMergeStartingList.size() <= 0) {
             //炉号-1
             //加工设备ID
@@ -443,11 +443,31 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             //当前工序作业明细的ID
             String apsProcessOperationProcessEquDoId = apsProcessOperationProcessEquDo.getId();
             //查询当前工序作业的作业明细的 加工设备 对应的其他工序作业的作业明细 并且待报工记录ID不为空
-            //存在计划开工时间不同(非合并作业) 并且加工设备正在使用的作业明细数量
-            int count = apsProcessOperationProcessEquDao.selectOtherDeviceCount(processdeviceid, apsProcessOperationProcessEquDoId, apsProcessOperationProcessEquDo.getPlanstartdate());
-            if (count > 0) {
-                return R.error("该设备当前加工中的作业还未报工,不能开工新的作业");
+            //如果当前工序作业不是合并加工
+            if (!apsProcessOperationDo.getProcessway().equals("合并加工")) {
+                int count = apsProcessOperationProcessEquDao.selectHaveOtherDeviceCount(processdeviceid, apsProcessOperationProcessEquDoId);
+                if (count > 0) {
+                    log.error("设备已被其他作业明细占用");
+                    return R.error("该设备当前加工中的作业还未报工,不能开工新的作业");
+                }
+            } else {
+                List<ApsProcessOperationProcessEquDo> sameDeviceList = apsProcessOperationProcessEquDao.selectHaveOtherDevice(processdeviceid, apsProcessOperationProcessEquDoId);
+                if (!sameDeviceList.isEmpty()) {
+                    //判断被占用的是否都是合并加工的
+                    List<String> processIdList = sameDeviceList.stream().map(ApsProcessOperationProcessEquDo::getProcessid).collect(Collectors.toList());
+                    List<ApsProcessOperationDo> apsProcessOperationDos = new ArrayList<>(apsProcessOperationService.listByIds(processIdList));
+                    long count = apsProcessOperationDos.stream().filter(item -> !item.getProcessway().equals("合并加工")).count();
+                    if (count > 0) {
+                        log.error("存在其他已占用设备:{},不为合并加工工序的作业:{}", processdeviceid, processIdList);
+                        return R.error("该设备当前加工中的作业还未报工,不能开工新的作业");
+                    }
+                }
             }
+//            //存在计划开工时间不同(非合并作业) 并且加工设备正在使用的作业明细数量
+//            int count = apsProcessOperationProcessEquDao.selectOtherDeviceCount(processdeviceid, apsProcessOperationProcessEquDoId, apsProcessOperationProcessEquDo.getPlanstartdate());
+//            if (count > 0) {
+//                return R.error("该设备当前加工中的作业还未报工,不能开工新的作业");
+//            }
 //            List<ApsProcessOperationProcessEquDo> list = apsProcessOperationProcessEquDao.selectOtherDeviceList(processdeviceid, apsProcessOperationProcessEquDoId);
 ////        List<ApsProcessOperationProcessEquDo> list = apsProcessOperationProcessEquService.list(
 ////                new QueryWrapper<ApsProcessOperationProcessEquDo>().lambda()
@@ -693,7 +713,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             //获取设备/炉 的炉号(每月、每个设备/炉 更新)
             String heatNumber;//初始化炉号
             //如果存在其他合并工序,并且其他合并工序已开工,则不去生成新的 炉次号 使用其他合并工序的 开工记录的 炉次号
-            List<ApsProcessOperationProcessEquDo> apsProcessEquMergeStartingList = this.baseMapper.selectOtherMergeProcessStarting(apsProcessOperationProcessEquDo.getId(), apsProcessOperationProcessEquDo.getProcessdeviceid(), apsProcessOperationProcessEquDo.getPlanstartdate());
+            List<ApsProcessOperationProcessEquDo> apsProcessEquMergeStartingList = this.baseMapper.selectOtherMergeProcessStarting(apsProcessOperationProcessEquDo.getId(), apsProcessOperationProcessEquDo.getProcessdeviceid());
 
             if (apsProcessEquMergeStartingList.size() > 0) {
                 //合并工序作业明细
@@ -1120,7 +1140,11 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             } else {
                 if (newLeaveWaitJobRoll == 0) {
                     processEquWrapper.set(ApsProcessOperationProcessEquDo::getClosestatus, "已完工");
-                    processEquWrapper.set(ApsProcessOperationProcessEquDo::getActualfinishdate, new Date());
+                    Date now = new Date();
+                    processEquWrapper.set(ApsProcessOperationProcessEquDo::getActualfinishdate, now);
+                    processEquWrapper.set(ApsProcessOperationProcessEquDo::getPlanstartdate, DateUtil.offsetMinute(now, -1 * (int) DateUtil.between(apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getPlanstartdate(), DateUnit.MINUTE)));
+                    processEquWrapper.set(ApsProcessOperationProcessEquDo::getPlanenddate, now);
+
                 }
             }
             /**
@@ -1157,8 +1181,6 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             if (needReportRoll <= 0) {
                 needUpdateProcessOperation.setClosestatus("已完工");
                 needUpdateProcessOperation.setActualfinishdate(DateUtil.date());
-                needUpdateProcessOperation.setPlanstartdate(DateUtil.offsetMinute(needUpdateProcessOperation.getActualfinishdate(), (int) DateUtil.between(apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getPlanstartdate(), DateUnit.MINUTE)));
-                needUpdateProcessOperation.setPlanenddate(needUpdateProcessOperation.getActualfinishdate());
                 needUpdateProcessOperation.setWorkstatus("已完工");
                 needUpdateProcessOperation.setProcessstatus(SaveConstans.ProductionStatus.COMPLETED);
             }
@@ -1599,7 +1621,7 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             //获取设备/炉 的炉号(每月、每个设备/炉 更新)
             String heatNumber;//初始化炉号
             //如果存在其他合并工序,并且其他合并工序已开工,则不去生成新的 炉次号 使用其他合并工序的 开工记录的 炉次号
-            List<ApsProcessOperationProcessEquDo> apsProcessEquMergeStartingList = this.baseMapper.selectOtherMergeProcessStarting(apsProcessOperationProcessEquDo.getId(), apsProcessOperationProcessEquDo.getProcessdeviceid(), apsProcessOperationProcessEquDo.getPlanstartdate());
+            List<ApsProcessOperationProcessEquDo> apsProcessEquMergeStartingList = this.baseMapper.selectOtherMergeProcessStarting(apsProcessOperationProcessEquDo.getId(), apsProcessOperationProcessEquDo.getProcessdeviceid());
 
             if (apsProcessEquMergeStartingList.size() > 0) {
                 //合并工序作业明细

+ 42 - 19
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsServiceImpl.java

@@ -95,6 +95,9 @@ public class ApsServiceImpl implements ApsService {
     @Override
     public void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders,ApsTypeVo apsType,SysUserVo currentUser,List<String> needUnLockProcessIdList) {
         logger.info("**********排程请求开始**********");
+        if(apsType.getScheduleType() == null){
+            apsType.setScheduleType("default");
+        }
         // 当前等路人所属工厂
         if(currentUser == null){
             currentUser = CXCommonUtils.getCurrentUser();
@@ -299,7 +302,7 @@ public class ApsServiceImpl implements ApsService {
                 List<String> blankids = new ArrayList<>();
                 blankids.add(bo.getId());
                 for (ApsProcessOperationDo operationDo : operationDos1) {
-                    List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankids,null,productionScheduleVo,apsConfigs.get(0),null);
+                    List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankids,null,productionScheduleVo,apsConfigs.get(0),null,null);
                 }
                 productionScheduleVo.setEquipmentList(equipmentList1);
                 apsProductionSchedules.add(productionScheduleVo);
@@ -667,7 +670,7 @@ public class ApsServiceImpl implements ApsService {
                 List<String> blankids = new ArrayList<>();
                 blankids.add(bo.getId());
                 for (ApsProcessOperationDo operationDo : operationDos1) {
-                    List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankids,null,productionScheduleVo,apsConfigs.get(0),allEqs);
+                    List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankids,null,productionScheduleVo,apsConfigs.get(0),allEqs,apsType);
                 }
                 productionScheduleVo.setEquipmentList(equipmentList1);
                 apsProductionSchedules.add(productionScheduleVo);
@@ -931,11 +934,11 @@ public class ApsServiceImpl implements ApsService {
                 Map<String, ProductionProcesses> lockHbPp = new HashMap<>();
                 // 转换工序模型数据
                 for (ApsProcessOperationDo operationDo : operationDos) {
-                    if (null != needUnLockProcessIdList){
+                    /*if (null != needUnLockProcessIdList){
                         if (!needUnLockProcessIdList.contains(operationDo.getId())){
                             continue;
                         }
-                    }
+                    }*/
                     processIdss.add(operationDo.getId());
                     ProductionProcesses processes = new ProductionProcesses();
                     // 工序所属订单
@@ -973,7 +976,8 @@ public class ApsServiceImpl implements ApsService {
     }
 
     private List<String> equipmentListInit(ApsProcessOperationDo operationDo,List<Equipment> equipmentList,Map<String, AspCheckItemsDo> eqMaps
-            ,List<String> blankids,Set<String> opId,ProductionScheduleVo productionScheduleVo,ApsScheduleConfigDo apsScheduleConfig,Map<String,Equipment> allEqs){
+            ,List<String> blankids,Set<String> opId,ProductionScheduleVo productionScheduleVo
+            ,ApsScheduleConfigDo apsScheduleConfig,Map<String,Equipment> allEqs,ApsTypeVo apsType){
         // 当前工序排程开始时间
         Date apsPlanStartDate = productionScheduleVo.getApsPlanStartDate();
         if(productionScheduleVo.getProcesses() != null && productionScheduleVo.getProcesses().size()>0){
@@ -1039,22 +1043,41 @@ public class ApsServiceImpl implements ApsService {
                         equipment.setEquipmentParameter(ep);
                         // 查询设备锁定的已排程的时间段
                         List<ApsProcessOperationProcessEquDo> processEqus = null;
+                        DateTime nextStartDate = DateUtil.offsetDay(apsPlanStartDate, 1);
                         if(blankids != null && blankids.size()>0){
-                            processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
-                                    .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
-                                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
-//                                    .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
-                                    .ge(ApsProcessOperationProcessEquDo::getPlanenddate, apsPlanStartDate)
-                                    .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
-                            );
+                            if("dd".equals(apsType.getScheduleType())){
+                                processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                                .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                                .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+                                                .ge(ApsProcessOperationProcessEquDo::getPlanenddate, apsPlanStartDate)
+                                                .le(ApsProcessOperationProcessEquDo::getPlanstartdate, nextStartDate)
+                                                .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                                );
+                            }else{
+                                processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                                .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                                .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+                                                .ge(ApsProcessOperationProcessEquDo::getPlanenddate, apsPlanStartDate)
+                                                .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                                );
+                            }
                         }else if(opId != null && opId.size()>0){
-                            processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
-                                    .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
-                                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
-//                                    .notIn(ApsProcessOperationProcessEquDo::getProcessid, opId)
-                                    .ge(ApsProcessOperationProcessEquDo::getPlanenddate, apsPlanStartDate)
-                                    .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
-                            );
+                            if("dd".equals(apsType.getScheduleType())){
+                                processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                                .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                                .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+                                                .ge(ApsProcessOperationProcessEquDo::getPlanenddate, apsPlanStartDate)
+                                                .le(ApsProcessOperationProcessEquDo::getPlanstartdate, nextStartDate)
+                                                .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                                );
+                            }else{
+                                processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                                .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                                .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+                                                .ge(ApsProcessOperationProcessEquDo::getPlanenddate, apsPlanStartDate)
+                                                .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                                );
+                            }
                         }
                         // 过滤设备为空的明细
                         if(processEqus != null && processEqus.size()>0){

+ 44 - 40
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ReportCheckServiceImpl.java

@@ -342,11 +342,15 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         // 获取当前工序作业明细对应的下一个工序作也明细ID
         String nextProcessesIds = currentProcessOperationEqu.getNextprocessesids();
         log.debug("当前作业对应的下一个工序作业:{}以及下一个工序作业明细:{}", nextProcessId, nextProcessesIds);
-        if ((StringUtils.isNotBlank(nextProcessId) && StringUtils.isBlank(nextProcessesIds)) ||
-                StringUtils.isBlank(nextProcessId) && StringUtils.isNotBlank(nextProcessesIds)) {
-            log.error("当前作业的下一个 工序作业id或者工序作业明细id 为空");
-            throw new CustomException("工序作业数据异常");
+        //如果找不到下一道,直接结束,不流转
+        if (StringUtils.isBlank(nextProcessesIds) || StringUtils.isBlank(nextProcessId)) {
+            return;
         }
+//        if ((StringUtils.isNotBlank(nextProcessId) && StringUtils.isBlank(nextProcessesIds)) ||
+//                StringUtils.isBlank(nextProcessId) && StringUtils.isNotBlank(nextProcessesIds)) {
+//            log.error("当前作业的下一个 工序作业id或者工序作业明细id 为空");
+//            throw new CustomException("工序作业数据异常");
+//        }
         List<ApsProcessOperationProcessEquDo> nextProcessOperationProcessEquDos = new ArrayList<>();
         List<ApsProcessOperationDo> nextProcessList = new ArrayList<>();
         List<ApsProductionMergeOrderDo> apsProductionMergeOrderDoList = apsProductionMergeOrderService.list(new LambdaQueryWrapper<ApsProductionMergeOrderDo>().eq(BaseDo::getDeleted, NO_DELETED));
@@ -801,14 +805,14 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         workInProgressInventoryDos.stream()
                 .filter(inventory -> outputNumberList.contains(inventory.getBatchnumber()))
                 .collect(Collectors.toList()).forEach(data -> {
-            if (StringUtils.isNotBlank(workingProcessStatus)) {
-                data.setWorkinprocessstatus(workingProcessStatus);
-            }
-            if (StringUtils.isNotBlank(workingProcessType)) {
-                data.setWorkinprocesstype(workingProcessType);
-            }
+                    if (StringUtils.isNotBlank(workingProcessStatus)) {
+                        data.setWorkinprocessstatus(workingProcessStatus);
+                    }
+                    if (StringUtils.isNotBlank(workingProcessType)) {
+                        data.setWorkinprocesstype(workingProcessType);
+                    }
 
-        });
+                });
         return outputNumberList;
     }
 
@@ -1250,42 +1254,42 @@ public class ReportCheckServiceImpl implements ReportCheckService {
             workInProgressInventoryDos.stream()
                     .filter(inventory -> apsReportOutputDo.getOutputnumber().equals(inventory.getBatchnumber()))
                     .collect(Collectors.toList()).forEach(data -> {
-                if ("是".equals(ifblankprocess)) {
-                    data.setBlankname(apsReportOutputDo.getOutputdesc());
-                }
-                data.setWorkinprocess(apsReportOutputDo.getOutputdesc());
-                data.setInspectionlevel(apsReportOutputDo.getInsepctionlevel());
-                data.setIsqualified(apsReportOutputDo.getQualified());
-                String formatMajor = handleDefect(apsReportOutputDo.getMajor(), defectTypes);
-                String formatMinor = handleDefect(apsReportOutputDo.getMinor(), defectTypes);
-                if (StringUtils.isNotBlank(formatMajor) && StringUtils.isNotBlank(formatMinor)) {
-                    if (StringUtils.isNotBlank(apsReportOutputDo.getCheckremark())) {
-                        data.setRemark("主要缺陷:" + formatMajor + ";次要缺陷:" + formatMinor + ";检验备注:" + apsReportOutputDo.getCheckremark() + ";");
-                    } else {
-                        data.setRemark("主要缺陷:" + formatMajor + ";次要缺陷:" + formatMinor + ";");
-                    }
-                } else {
-                    if (StringUtils.isNotBlank(formatMajor)) {
-                        if (StringUtils.isNotBlank(apsReportOutputDo.getCheckremark())) {
-                            data.setRemark("主要缺陷:" + formatMajor + ";检验备注:" + apsReportOutputDo.getCheckremark() + ";");
-                        } else {
-                            data.setRemark("主要缺陷:" + formatMajor + ";");
+                        if ("是".equals(ifblankprocess)) {
+                            data.setBlankname(apsReportOutputDo.getOutputdesc());
                         }
-                    } else {
-                        if (StringUtils.isNotBlank(formatMinor)) {
+                        data.setWorkinprocess(apsReportOutputDo.getOutputdesc());
+                        data.setInspectionlevel(apsReportOutputDo.getInsepctionlevel());
+                        data.setIsqualified(apsReportOutputDo.getQualified());
+                        String formatMajor = handleDefect(apsReportOutputDo.getMajor(), defectTypes);
+                        String formatMinor = handleDefect(apsReportOutputDo.getMinor(), defectTypes);
+                        if (StringUtils.isNotBlank(formatMajor) && StringUtils.isNotBlank(formatMinor)) {
                             if (StringUtils.isNotBlank(apsReportOutputDo.getCheckremark())) {
-                                data.setRemark("次要缺陷:" + formatMinor + ";检验备注:" + apsReportOutputDo.getCheckremark() + ";");
+                                data.setRemark("主要缺陷:" + formatMajor + ";次要缺陷:" + formatMinor + ";检验备注:" + apsReportOutputDo.getCheckremark() + ";");
                             } else {
-                                data.setRemark("次要缺陷:" + formatMinor + ";");
+                                data.setRemark("主要缺陷:" + formatMajor + ";次要缺陷:" + formatMinor + ";");
                             }
                         } else {
-                            if (StringUtils.isNotBlank(apsReportOutputDo.getCheckremark())) {
-                                data.setRemark("检验备注:" + apsReportOutputDo.getCheckremark() + ";");
+                            if (StringUtils.isNotBlank(formatMajor)) {
+                                if (StringUtils.isNotBlank(apsReportOutputDo.getCheckremark())) {
+                                    data.setRemark("主要缺陷:" + formatMajor + ";检验备注:" + apsReportOutputDo.getCheckremark() + ";");
+                                } else {
+                                    data.setRemark("主要缺陷:" + formatMajor + ";");
+                                }
+                            } else {
+                                if (StringUtils.isNotBlank(formatMinor)) {
+                                    if (StringUtils.isNotBlank(apsReportOutputDo.getCheckremark())) {
+                                        data.setRemark("次要缺陷:" + formatMinor + ";检验备注:" + apsReportOutputDo.getCheckremark() + ";");
+                                    } else {
+                                        data.setRemark("次要缺陷:" + formatMinor + ";");
+                                    }
+                                } else {
+                                    if (StringUtils.isNotBlank(apsReportOutputDo.getCheckremark())) {
+                                        data.setRemark("检验备注:" + apsReportOutputDo.getCheckremark() + ";");
+                                    }
+                                }
                             }
                         }
-                    }
-                }
-            });
+                    });
         });
     }
 

+ 95 - 17
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsBlankOrderDao.xml

@@ -194,16 +194,30 @@
         aps_process_operation_process_equ apope
         join aps_process_operation apo on apo.id = apope.PROCESSID
         set
+        -- 如果已经完工,先根据实际完工时间计算和设置计划开工时间,再设置计划完工时间=实际完工时间
         apope.PLANSTARTDATE=IF(apope.ACTUALFINISHDATE IS NOT NULL,DATE_SUB(apope.ACTUALFINISHDATE,INTERVAL TIMESTAMPdiff(SECOND, apope.PLANSTARTDATE, apope.PLANENDDATE) SECOND), apope.PLANSTARTDATE),
-        apope.PLANENDDATE=IF(apope.ACTUALFINISHDATE IS NOT NULL, apope.ACTUALFINISHDATE, apope.PLANENDDATE),
+        apope.PLANENDDATE=IF(apope.ACTUALFINISHDATE IS NOT NULL, apope.ACTUALFINISHDATE, apope.PLANENDDATE)
+        where
+        apo.DELETED='0' and apope.deleted='0'
+        AND (apope.ACTUALSTARTDATE IS NOT NULL) -- 已经开工或完工
+        and (apope.ACTUALSTARTDATE &lt; apope.PLANSTARTDATE OR apope.ACTUALFINISHDATE &lt; apope.PLANENDDATE) -- 提前开工或完工
+        and apope.PLANENDDATE > #{needScheduleDate} -- 计划完工时间大于调度开始时间,即占用了调度时间
+        and apo.PROCESS != '铸轧'
+        and apope.TENANTID = #{tenantId};
+        update
+        aps_process_operation_process_equ apope
+        join aps_process_operation apo on apo.id = apope.PROCESSID
+        set
+        -- 如果没有完工,先根据实际开工时间计算和设置计划完工时间,再设置计划开工时间=实际开工时间
         apope.PLANENDDATE=IF(apope.ACTUALFINISHDATE IS NOT NULL, apope.PLANENDDATE, DATE_ADD(apope.ACTUALSTARTDATE,INTERVAL TIMESTAMPdiff(SECOND, apope.PLANSTARTDATE, apope.PLANENDDATE) SECOND)),
         apope.PLANSTARTDATE=IF(apope.ACTUALFINISHDATE IS NOT NULL,apope.PLANSTARTDATE,apope.ACTUALSTARTDATE)
         where
         apo.DELETED='0' and apope.deleted='0'
-        AND (apope.ACTUALSTARTDATE IS NOT NULL OR apope.ACTUALFINISHDATE IS NOT NULL)
-        and (apope.ACTUALSTARTDATE &lt; apope.PLANSTARTDATE OR apope.ACTUALFINISHDATE &lt; apope.PLANENDDATE)
-        and apope.PLANENDDATE > #{needScheduleDate}
+        AND (apope.ACTUALSTARTDATE IS NULL and apope.ACTUALFINISHDATE IS NOT NULL) -- 已经开工或完工
+        and (apope.ACTUALSTARTDATE &lt; apope.PLANSTARTDATE OR apope.ACTUALFINISHDATE &lt; apope.PLANENDDATE) -- 提前开工或完工
+        and apope.PLANENDDATE > #{needScheduleDate} -- 计划完工时间大于调度开始时间,即占用了调度时间
         and apo.PROCESS != '铸轧'
+        and apope.TENANTID = #{tenantId}
     </update>
     <update id="removeLockNextDayProcessEqu">
         with tomorroworder as(
@@ -232,6 +246,36 @@
         and apo.PROCESS != '铸轧' and apope.WORKSTATUS = '待开工'
         and apope.PLANSTARTDATE >= DATE_ADD(#{needScheduleDate},INTERVAL 1 DAY) and apope.PLANSTARTDATE &lt; DATE_ADD(#{needScheduleDate},INTERVAL 2 DAY)
     </update>
+    <update id="setLenZhaNextDay">
+        update
+            aps_process_operation apo
+                JOIN aps_process_operation_process_equ apope ON apo.ID = apope.PROCESSID AND apope.DELETED = 0
+        set
+            apope.PLANSTARTDATE=DATE_ADD(apope.PLANSTARTDATE, INTERVAL 1 DAY),
+            apope.PLANENDDATE=DATE_ADD(apope.PLANENDDATE, INTERVAL 1 DAY)
+        WHERE
+            apo.DELETED = '0'
+          and apope.TENANTID = #{tenantId}
+          and apo.PROCESS not in ('铸轧','中退','成退','小卷成退')
+          and apope.WORKSTATUS = '待开工'
+          and apope.PLANSTARTDATE between #{chongpaiStartDate} and #{chongpaiEndDate} -- 调度开始时间之后计划开工
+          and apope.LOCKMARKDETAIL = 'y'
+    </update>
+    <update id="setTuiHuoNextDay">
+        update
+            aps_process_operation apo
+                JOIN aps_process_operation_process_equ apope ON apo.ID = apope.PROCESSID AND apope.DELETED = 0
+        set
+            apope.PLANSTARTDATE=DATE_ADD(apope.PLANSTARTDATE, INTERVAL 1 DAY),
+            apope.PLANENDDATE=DATE_ADD(apope.PLANENDDATE, INTERVAL 1 DAY)
+        WHERE
+            apo.DELETED = '0'
+          and apope.TENANTID = #{tenantId}
+          and apo.PROCESS in ('中退','成退','小卷成退')
+          and apope.WORKSTATUS = '待开工'
+          and apope.PLANSTARTDATE between #{chongpaiStartDate} and #{chongpaiEndDate} -- 调度开始时间之后计划开工
+          and apope.LOCKMARKDETAIL = 'y'
+    </update>
     <select id="checkConflictByBlankId" resultType="java.lang.Integer">
         select count(*) from aps_process_operation_process_equ
             <where>
@@ -426,7 +470,7 @@
     <select id="selectNeedRescheduleEqu2"
             resultType="com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo">
         SELECT apope.*
-        FROM
+        from
             aps_process_operation_process_equ apope
                 join aps_process_operation apo on apo.ID = apope.PROCESSID
                 left join aps_process_operation_process_equ preapope on apope.PREVIOUSPROCESSESIDS = preapope.id AND preapope.DELETED = '0'
@@ -435,19 +479,24 @@
           and apope.TENANTID = #{tenantId}
           and apo.PROCESS in ('中退','成退','小卷成退')
           and apope.WORKSTATUS = '待开工'
-          and apope.PLANSTARTDATE >= #{chongpaiStartDate} -- 调度开始时间之后开工
-          AND (apope.PLANSTARTDATE &lt;= #{chongpaiEndDate} -- 调度结束时间之前开工
-            OR date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间
-            INTERVAL GREATEST(ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
-            if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
-            if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
-            ) &lt;= #{chongpaiEndDate} -- 调度结束时间之前可以开工
+          and apope.PLANSTARTDATE >= #{chongpaiStartDate} -- 调度开始时间之后计划开工
+          AND (
+            apope.PLANSTARTDATE &lt;= #{chongpaiEndDate} OR
+            (ifnull(apope.PREVIOUSPROCESSESIDS,'')='' -- 没有前道
+                and apope.PLANSTARTDATE &lt; DATE_ADD(#{chongpaiStartDate}, INTERVAL 3 DAY)) -- 调度开始时间+5天内计划开工
+                OR (ifnull(apope.PREVIOUSPROCESSESIDS,'')!='' -- 有前道
+                and preapope.PLANSTARTDATE &lt;= #{chongpaiStartDate} -- 前道计划开工时间在调度开始时间之前,表示该作业是需要调度的作业的第一道
+                and date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间 小于 调度结束时间
+                             INTERVAL GREATEST(ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
+                                               if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
+                                                  if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
+                    ) &lt;= #{chongpaiEndDate}) -- 调度结束时间之前可以开工
             )
     </select>
     <select id="selectNeedRescheduleEqu3"
             resultType="com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo">
         SELECT apope.*
-        FROM
+        from
         aps_process_operation_process_equ apope
         join aps_process_operation apo on apo.ID = apope.PROCESSID
         left join aps_process_operation_process_equ preapope on apope.PREVIOUSPROCESSESIDS = preapope.id AND preapope.DELETED = '0'
@@ -456,13 +505,42 @@
         and apope.TENANTID = #{tenantId}
         and apo.PROCESS not in ('铸轧','中退','成退','小卷成退')
         and apope.WORKSTATUS = '待开工'
-        and apope.PLANSTARTDATE >= #{chongpaiStartDate} -- 调度开始时间之后开工
-        AND (apope.PLANSTARTDATE &lt;= #{chongpaiEndDate} -- 调度结束时间之前开工
-        OR date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间
+        and apope.PLANSTARTDATE >= #{chongpaiStartDate} -- 调度开始时间之后计划开工
+        AND (
+            apope.PLANSTARTDATE &lt;= #{chongpaiEndDate} OR
+            (ifnull(apope.PREVIOUSPROCESSESIDS,'')='' -- 没有前道
+        and apope.PLANSTARTDATE &lt; DATE_ADD(#{chongpaiStartDate}, INTERVAL 3 DAY)) -- 调度开始时间+5天内计划开工
+        OR (ifnull(apope.PREVIOUSPROCESSESIDS,'')!='' -- 有前道
+        and preapope.PLANSTARTDATE &lt;= #{chongpaiStartDate} -- 前道计划开工时间在调度开始时间之前,表示该作业是需要调度的作业的第一道
+        and date_add(preapope.PLANENDDATE, -- 前道计划完工时间 + 流转时间 小于 调度结束时间
         INTERVAL GREATEST(ifnull(apo.MINFLOWWAITMIN,0), -- 最小流转等待时间
         if(apope.PROCESSWORKSHOPID!=preapope.PROCESSWORKSHOPID,#{workshopcross}, -- 车间流转时间
         if(apope.PROCESSDEVICEID!=preapope.PROCESSDEVICEID,#{workshopin},0))) MINUTE -- 机台流转时间
-        ) &lt;= #{chongpaiEndDate} -- 调度结束时间之前可以开工
+        ) &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>

+ 15 - 0
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsReportRecordsDao.xml

@@ -62,4 +62,19 @@
         GROUP BY
             arr.PROCESSOPERATIONID
     </select>
+    <select id="selectOtherMergeProcessStarting"
+            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 AND apo.DELETED = 0
+        WHERE
+            apope.DELETED = 0
+          AND apope.PROCESSDEVICEID = #{processdeviceid}
+          AND apope.ID != #{id}
+          AND apope.WAITREPORTID IS NOT NULL
+          AND apope.WAITREPORTID != ''
+          AND apo.PROCESSWAY = '合并加工'
+    </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();
+    }
 }