Browse Source

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

fangpy 6 months ago
parent
commit
69d6ae5682
17 changed files with 481 additions and 128 deletions
  1. 3 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationDao.java
  2. 3 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java
  3. 2 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProcessOperationService.java
  4. 2 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsService.java
  5. 16 5
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  6. 207 67
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java
  7. 72 10
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationServiceImpl.java
  8. 43 21
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsServiceImpl.java
  9. 30 20
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ReportCheckServiceImpl.java
  10. 4 2
      cx-aps/cx-aps-common/src/main/resources/mybatis/ApsBlankOrderDao.xml
  11. 17 0
      cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml
  12. 5 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsScheduleConfigDo.java
  13. 29 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsTypeVo.java
  14. 17 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CancelOperationProcessEquVo.java
  15. 5 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/Equipment.java
  16. 25 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProcessVo.java
  17. 1 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionScheduleVo.java

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

@@ -114,4 +114,7 @@ public interface ApsProcessOperationDao extends BaseMapper<ApsProcessOperationDo
             "\tand e.RESOURCEID=#{resourceid} ${levelStr}")
     void updateZJProcessEqu(@Param("blanckid") String blanckid, @Param("resourceid") String resourceid, @Param("levelStr") String levelStr, @Param("rollerid") String rollerid, @Param("rollertype") String rollertype, @Param("level") String level);
 
+    @Select("SELECT * FROM aps_process_operation_process_equ WHERE DELETED = 0 AND BLANKID = #{blankid} and IFNULL(NEXTPROCESSESIDS,'')!=''")
+    List<ApsProcessOperationProcessEquDo> getNextOperationProcessEqus(@Param("blankid") String blankid);
+
 }

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

@@ -1,5 +1,6 @@
 package com.rongwei.bscommon.sys.dao;
 
+import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
 import com.rongwei.bsentity.domain.ApsProductDetailDo;
@@ -116,6 +117,8 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
     int selectOtherDeviceCount(@Param("processdeviceid") String processdeviceid,@Param("apsProcessOperationProcessEquDoId") String apsProcessOperationProcessEquDoId, @Param("planstartdate") Date planstartdate);
 
     String getNeedSelectEquTypes(@Param("operationJobDetailsId") List<String> operationJobDetailsId);
+
+    List<ProcessVo> selectMyProcessVo(@Param("equId") String equId, @Param("date1") Date date1, @Param("date2") Date date2);
 }
 
 

+ 2 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProcessOperationService.java

@@ -3,6 +3,7 @@ package com.rongwei.bscommon.sys.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ApsProcessOperationDo;
 import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
+import com.rongwei.bsentity.vo.CancelOperationProcessEquVo;
 import com.rongwei.bsentity.vo.CancelProcessOperationVo;
 import com.rongwei.bsentity.vo.ResetProcessOperationVo;
 import com.rongwei.rwcommon.base.R;
@@ -53,5 +54,5 @@ public interface ApsProcessOperationService extends IService<ApsProcessOperation
 
     R cancelProcessOperation(CancelProcessOperationVo cancelProcessOperationVo);
 
-    R cancelProcessOperationEqu(Integer curEquCancelRoll, ApsProcessOperationDo apsProcessOperationDo, ApsProcessOperationProcessEquDo processOperationProcessEquDo, String bhgCancel);
+    R cancelProcessOperationEqu(CancelOperationProcessEquVo cancelOperationProcessEquVo);
 }

+ 2 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsService.java

@@ -1,6 +1,7 @@
 package com.rongwei.bscommon.sys.service;
 
 import com.rongwei.bsentity.vo.ApsBlankOrderVo;
+import com.rongwei.bsentity.vo.ApsTypeVo;
 import com.rongwei.bsentity.vo.ProductionScheduleVo;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 
@@ -10,7 +11,7 @@ import java.util.Map;
 
 public interface ApsService {
 
-    void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders, String apsType,SysUserVo currentUser);
+    void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders, ApsTypeVo apsType, SysUserVo currentUser);
 
     ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders, Date apsPlanStartDate);
 

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

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.Gson;
 import com.rongwei.bscommon.sys.dao.*;
 import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.bscommon.sys.utils.ApsUtils;
@@ -31,7 +32,6 @@ import com.rongwei.rwcommon.vo.SearchColumnVo;
 import com.rongwei.rwcommon.vo.SearchOrderVo;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.safecommon.utils.SaveConstans;
-import org.apache.commons.collections.list.SynchronizedList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -44,7 +44,6 @@ import java.math.RoundingMode;
 import java.text.Collator;
 import java.time.ZoneId;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 import static com.rongwei.bscommon.sys.service.impl.ApsProductionOrderServiceImpl.ERROR_MSG;
@@ -3254,7 +3253,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     public void insertSchedule(Map<String, Object> params) {
         List<ApsBlankOrderVo> apsBlankOrders = apsBlankOrderDao.getByOrderBlanckId(params.get("PRODUCTIONORDERID").toString(), params.get("BLANKORDERID").toString());
         if (apsBlankOrders != null && apsBlankOrders.size() > 0) {
-            apsService.apsSchedule(apsBlankOrders, "cd", null);
+            apsService.apsSchedule(apsBlankOrders, new ApsTypeVo(), null);
         }
     }
 
@@ -3681,7 +3680,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                  */
                 if (secondroll > needBorrowOperationEqu.getCancelrollno()) {
                     needBorrowOperationEqu.setSecondroll(secondroll);
-                    R r = apsProcessOperationService.cancelProcessOperationEqu(1, needBorrowOperation, needBorrowOperationEqu, "1");
+                    CancelOperationProcessEquVo cancelOperationProcessEquVo = new CancelOperationProcessEquVo();
+                    cancelOperationProcessEquVo.setCurEquCancelRoll(1);
+                    cancelOperationProcessEquVo.setApsProcessOperationDo(needBorrowOperation);
+                    cancelOperationProcessEquVo.setProcessOperationProcessEquDo(needBorrowOperationEqu);
+                    cancelOperationProcessEquVo.setCancelreason("1");
+                    R r = apsProcessOperationService.cancelProcessOperationEqu(cancelOperationProcessEquVo);
                     if (!r.getCode().equals("200")) {
                         throw new CustomException(r.getMsg());
                     }
@@ -3974,8 +3978,15 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             this.baseMapper.removeLockNextDayProcessEqu(needScheduleDate);
             //解锁后天开工的所有作业明细
             this.baseMapper.removeLockNextTwoDayProcessEqu(needScheduleDate);
+            //获取排程类型
+            ApsScheduleConfigDo apsScheduleConfigDo = apsScheduleConfigService.getById("1");
+            String scheduletype = apsScheduleConfigDo.getScheduletype();
+            ApsTypeVo apsTypeVo = BeanUtil.toBean(scheduletype, ApsTypeVo.class);
+            apsTypeVo.setMixIf("mix");
+            apsTypeVo.setThMergeMode("notThMergeBf");
+            apsTypeVo.setConstraintMode("lz");
             //重新排程
-            apsService.apsSchedule(new ArrayList<>(), "mix", null);
+            apsService.apsSchedule(new ArrayList<>(), apsTypeVo, null);
         }
     }
 }

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

@@ -1,5 +1,6 @@
 package com.rongwei.bscommon.sys.service.impl;
 
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -21,6 +22,7 @@ import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.safecommon.utils.SaveConstans;
+import com.rongwei.wfserver.wfcommon.sys.service.impl.ProcessServiceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -81,6 +83,8 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
     private HttpServletRequest httpServletRequest;
     @Autowired
     private ApsProcessOperationProcessEquService apsProcessOperationProcessEquService;
+    @Autowired
+    private ProcessServiceImpl processService;
 
     /**
      * 更新工序的待加工批次号信息
@@ -364,8 +368,8 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 String processWay = apsProcessOperationDo.getProcessway();
                 // 单卷加工时长
                 BigDecimal onceprocessmin = apsProcessOperationDo.getOnceprocessmin();
-                updateConflictVo.setOldPlanEnddate(planstartdate);
-                updateConflictVo.setOldPlanStartdate(planenddate);
+                updateConflictVo.setOldPlanEnddate(planenddate);
+                updateConflictVo.setOldPlanStartdate(planstartdate);
                 updateConflictVo.setCurrentProcessWay(processWay);
                 updateConflictVo.setOldEquId(processEqus.getProcessdeviceid());
                 // 待开工的直接修改
@@ -553,7 +557,8 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                     affectedIdList.addAll(checkProcessingTimeConflict(apsProcessOperationProcessEquDo,
                             data.getOldPlanStartdate(), data.getOldPlanEnddate(), data.getOldEquId(), data.getCurrentProcessWay(), returnAboutIds));
                     // 判断是否存在设备不可用
-                    inspectionEquipmentIsAvailable(apsProcessOperationProcessEquDo,
+                    ApsProcessOperationProcessEquDo newApsProcessEqu = this.getById(apsProcessOperationProcessEquDo.getId());
+                    inspectionEquipmentIsAvailable(newApsProcessEqu,
                             apsProcessOperationProcessEquDo.getProcessdeviceid(),
                             apsProcessOperationProcessEquDo.getPlanstartdate(),
                             apsProcessOperationProcessEquDo.getPlanenddate());
@@ -1409,6 +1414,46 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         this.updateBatchById(afterTheUpdateConflictId);
     }
 
+    //新增冲突
+    public void addConflict(List<ProcessVo> needAddConflictList, String conflictsDesc, String aboutId) {
+        if (needAddConflictList.isEmpty()) {
+            return;
+        }
+        List<ApsProcessOperationProcessEquDo> needUpdateList = new LinkedList<>();
+        for (ProcessVo needRemove : needAddConflictList) {
+            ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = new ApsProcessOperationProcessEquDo();
+            apsProcessOperationProcessEquDo.setId(needRemove.getProcessEquId());
+            String newConflictsDesc = addNewConflictsDesc(needRemove.getConflictdes(), conflictsDesc);
+            apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
+            apsProcessOperationProcessEquDo.setHasconflict(StringUtils.isBlank(apsProcessOperationProcessEquDo.getConflictdes()) && StringUtils.isBlank(needRemove.getSoftconflictdes()) ?
+                    LOCKMARK_N : LOCKMARK_Y);
+            apsProcessOperationProcessEquDo.setModifydate(new Date());
+            needUpdateList.add(apsProcessOperationProcessEquDo);
+            apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(), aboutId, EQ_TIME_CROSS, 1, null);
+        }
+        this.updateBatchById(needUpdateList);
+    }
+
+    //删除冲突
+    public void removeConflict(List<ProcessVo> needRemoveConflictList, String conflictsDesc, String aboutId) {
+        if (needRemoveConflictList.isEmpty()) {
+            return;
+        }
+        List<ApsProcessOperationProcessEquDo> needUpdateList = new LinkedList<>();
+        for (ProcessVo needRemove : needRemoveConflictList) {
+            ApsProcessOperationProcessEquDo apsProcessOperationProcessEquDo = new ApsProcessOperationProcessEquDo();
+            apsProcessOperationProcessEquDo.setId(needRemove.getProcessEquId());
+            String newConflictsDesc = removeConflictsDesc(needRemove.getConflictdes(), conflictsDesc);
+            apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
+            apsProcessOperationProcessEquDo.setHasconflict(StringUtils.isBlank(apsProcessOperationProcessEquDo.getConflictdes()) && StringUtils.isBlank(needRemove.getSoftconflictdes()) ?
+                    LOCKMARK_N : LOCKMARK_Y);
+            apsProcessOperationProcessEquDo.setModifydate(new Date());
+            needUpdateList.add(apsProcessOperationProcessEquDo);
+            apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(), aboutId, EQ_TIME_CROSS, 2, null);
+        }
+        this.updateBatchById(needUpdateList);
+    }
+
     /**
      * 删除旧冲突
      *
@@ -1486,84 +1531,179 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                                                     String oldEquId, String currentProcessWay, List<String> returnAboutIds) {
         // 受影响的工序作业Id
         List<String> affectedIdList = new ArrayList<>();
-        // 获取更新之前的存在冲突的工序作业
-        List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId = this.baseMapper.getTimeOverlapByEquId(oldEquId,
-                apsProcessOperationProcessEquDo.getId(), oldPlanstartdate, oldPlanenddate, currentProcessWay);
+        //获取更新之前 所在设备 可能存在冲突的所有工序作业:前5天和后5天
+        Date olddate1 = DateUtil.offsetDay(oldPlanstartdate, -5);
+        Date olddate2 = DateUtil.offsetDay(oldPlanenddate, 5);
+        List<ProcessVo> oldList = this.baseMapper.selectMyProcessVo(oldEquId, olddate1, olddate2);
+        List<ProcessVo> needRemoveTimeOverLapList = checkNeedRemove(oldList,
+                oldPlanstartdate,
+                oldPlanenddate,
+                apsProcessOperationProcessEquDo.getId());
+        //把自己的冲突也删掉
+        ProcessVo processVo = new ProcessVo();
+        processVo.setProcessEquId(apsProcessOperationProcessEquDo.getId());
+        processVo.setProcessWay(currentProcessWay);
+        processVo.setConflictdes(apsProcessOperationProcessEquDo.getConflictdes());
+        processVo.setSoftconflictdes(apsProcessOperationProcessEquDo.getSoftconflictdes());
+        needRemoveTimeOverLapList.add(processVo);
+        List<String> needRemoveTimeOverLapIdList = needRemoveTimeOverLapList.stream().map(ProcessVo::getProcessEquId).collect(Collectors.toList());
+
+        //获取更新之后 所在设备 可能存在冲突的所有工序作业:前5天和后5天
+        DateTime newdate1 = DateUtil.offsetDay(apsProcessOperationProcessEquDo.getPlanstartdate(), -5);
+        DateTime newdate2 = DateUtil.offsetDay(apsProcessOperationProcessEquDo.getPlanenddate(), 5);
+        List<ProcessVo> newList = this.baseMapper.selectMyProcessVo(apsProcessOperationProcessEquDo.getProcessdeviceid(), newdate1, newdate2);
+        List<ProcessVo> needAddTimeOverLapList = checkNeedAdd(newList,
+                apsProcessOperationProcessEquDo.getPlanstartdate(),
+                apsProcessOperationProcessEquDo.getPlanenddate(),
+                apsProcessOperationProcessEquDo.getId());
+        if (!needAddTimeOverLapList.isEmpty()){
+            //把自己的冲突增加
+            ProcessVo processVo2 = new ProcessVo();
+            processVo2.setProcessEquId(apsProcessOperationProcessEquDo.getId());
+            processVo2.setProcessWay(currentProcessWay);
+            processVo2.setConflictdes(apsProcessOperationProcessEquDo.getConflictdes());
+            processVo2.setSoftconflictdes(apsProcessOperationProcessEquDo.getSoftconflictdes());
+            needAddTimeOverLapList.add(processVo2);
+        }
+        List<String> needAddTimeOverLapIdList = needAddTimeOverLapList.stream().map(ProcessVo::getProcessEquId).collect(Collectors.toList());
+
+
+        //如果需要新增的id包含删除的,去除删除中的id
+        needRemoveTimeOverLapIdList.removeAll(needAddTimeOverLapIdList);
+        needRemoveTimeOverLapList.removeAll(needAddTimeOverLapList);
+
+        affectedIdList.addAll(needRemoveTimeOverLapIdList);
+        affectedIdList.addAll(needAddTimeOverLapIdList);
+
+
+//        // 获取更新之前的存在冲突的工序作业
+//        List<ApsProcessOperationProcessEquDo> beforeUpdatingConflictId = this.baseMapper.getTimeOverlapByEquId(oldEquId,
+//                apsProcessOperationProcessEquDo.getId(), oldPlanstartdate, oldPlanenddate, currentProcessWay);
         log.info("参数旧的的设备id:{}", oldEquId);
         log.info("参数工序作业明细主键:{}", apsProcessOperationProcessEquDo.getId());
         log.info("参数旧的计划开工日期:{}", oldPlanstartdate);
         log.info("参数旧的计划完工日期:{}", oldPlanenddate);
         log.info("参数当前工序作业加工方式:{}", currentProcessWay);
-        log.info("获取更新之前的存在冲突的工序作业结果:{}", beforeUpdatingConflictId);
-        List<ApsProcessOperationProcessEquDo> aboutProcessEquList = new ArrayList<>();
-        if (!returnAboutIds.isEmpty()) {
-            aboutProcessEquList = (List<ApsProcessOperationProcessEquDo>) apsProcessOperationProcessEquService.listByIds(returnAboutIds);
-        }
-        if (!beforeUpdatingConflictId.isEmpty()) {
-            affectedIdList.addAll(beforeUpdatingConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
-            updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId, EQ_TIME_CROSS, currentProcessWay,
-                    apsProcessOperationProcessEquDo.getPlanstartdate(),
-                    apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getId());
-            if (!aboutProcessEquList.isEmpty()) {
-                updateProcessEquAboutBeforeAddConflictsDesc(aboutProcessEquList, EQ_TIME_CROSS, currentProcessWay,
-                        apsProcessOperationProcessEquDo.getPlanstartdate(),
-                        apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getId());
-            }
-        }
+        removeConflict(needRemoveTimeOverLapList, EQ_TIME_CROSS, apsProcessOperationProcessEquDo.getId());
+//        log.info("获取更新之前的存在冲突的工序作业结果:{}", beforeUpdatingConflictId);
+//        List<ApsProcessOperationProcessEquDo> aboutProcessEquList = new ArrayList<>();
+//        if (!returnAboutIds.isEmpty()) {
+//            aboutProcessEquList = (List<ApsProcessOperationProcessEquDo>) apsProcessOperationProcessEquService.listByIds(returnAboutIds);
+//        }
+//        if (!beforeUpdatingConflictId.isEmpty()) {
+//            affectedIdList.addAll(beforeUpdatingConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
+//            updateProcessEquBeforeAddConflictsDesc(beforeUpdatingConflictId, EQ_TIME_CROSS, currentProcessWay,
+//                    apsProcessOperationProcessEquDo.getPlanstartdate(),
+//                    apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getId());
+//            if (!aboutProcessEquList.isEmpty()) {
+//                updateProcessEquAboutBeforeAddConflictsDesc(aboutProcessEquList, EQ_TIME_CROSS, currentProcessWay,
+//                        apsProcessOperationProcessEquDo.getPlanstartdate(),
+//                        apsProcessOperationProcessEquDo.getPlanenddate(), apsProcessOperationProcessEquDo.getId());
+//            }
+//        }
 
         // 找到更新时间之后存在冲突的工序作业
-        List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId = this.baseMapper.getConflictId(
-                apsProcessOperationProcessEquDo.getProcessdeviceid(), apsProcessOperationProcessEquDo.getId(),
-                apsProcessOperationProcessEquDo.getPlanstartdate(), apsProcessOperationProcessEquDo.getPlanenddate(),
-                currentProcessWay);
+//        List<ApsProcessOperationProcessEquDo> afterTheUpdateConflictId = this.baseMapper.getConflictId(
+//                apsProcessOperationProcessEquDo.getProcessdeviceid(), apsProcessOperationProcessEquDo.getId(),
+//                apsProcessOperationProcessEquDo.getPlanstartdate(), apsProcessOperationProcessEquDo.getPlanenddate(),
+//                currentProcessWay);
         log.info("参数新的的设备id:{}", apsProcessOperationProcessEquDo.getProcessdeviceid());
         log.info("参数工序作业明细主键:{}", apsProcessOperationProcessEquDo.getId());
         log.info("参数新的计划开工日期:{}", apsProcessOperationProcessEquDo.getPlanstartdate());
         log.info("参数新的计划完工日期:{}", apsProcessOperationProcessEquDo.getPlanenddate());
         log.info("参数当前工序作业加工方式:{}", currentProcessWay);
-        log.info("找到更新时间之后存在冲突的工序作业结果:{}", afterTheUpdateConflictId);
-        affectedIdList.addAll(afterTheUpdateConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
-        if (!afterTheUpdateConflictId.isEmpty()) {
-            apsProcessOperationProcessEquDo.setHasconflict(LOCKMARK_Y);
-            // 更新当前工序作业增加新的冲突
-            String newConflictsDesc = addNewConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), EQ_TIME_CROSS);
-            apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
-            apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(),
-                    afterTheUpdateConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.joining(",")), EQ_TIME_CROSS, 1, null);
-            updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId, EQ_TIME_CROSS, apsProcessOperationProcessEquDo.getId());
-        } else {
-            // 去掉工序作业的冲突
-            String newConflictsDesc = removeConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), EQ_TIME_CROSS);
-            apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(), "", EQ_TIME_CROSS, 2, null);
-            apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
-            apsProcessOperationProcessEquDo.setHasconflict(StringUtils.isBlank(apsProcessOperationProcessEquDo.getConflictdes()) &&
-                    StringUtils.isBlank(apsProcessOperationProcessEquDo.getSoftconflictdes()) ?
-                    LOCKMARK_N : LOCKMARK_Y);
-            this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                    .eq(ApsProcessOperationProcessEquDo::getId, apsProcessOperationProcessEquDo.getId())
-                    .set(ApsProcessOperationProcessEquDo::getConflictdes, newConflictsDesc)
-                    .set(ApsProcessOperationProcessEquDo::getHasconflict, apsProcessOperationProcessEquDo.getHasconflict())
-                    .set(BaseDo::getModifydate, new Date())
-            );
-            if (!aboutProcessEquList.isEmpty()) {
-                aboutProcessEquList.forEach(e -> {
-                    if (StringUtils.isNotBlank(e.getConflictdes()) && e.getConflictdes().contains(EQ_TIME_CROSS)) {
-                        String afterConflictdes = removeConflictsDesc(e.getConflictdes(), EQ_TIME_CROSS);
-                        apsConflictLogService.recordLog(e.getId(), "", EQ_TIME_CROSS, 2, null);
-                        e.setConflictdes(afterConflictdes);
-                        e.setHasconflict(StringUtils.isBlank(e.getConflictdes()) &&
-                                StringUtils.isBlank(e.getSoftconflictdes()) ?
-                                LOCKMARK_N : LOCKMARK_Y);
-                        this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-                                .eq(ApsProcessOperationProcessEquDo::getId, e.getId())
-                                .set(ApsProcessOperationProcessEquDo::getConflictdes, newConflictsDesc)
-                                .set(ApsProcessOperationProcessEquDo::getHasconflict, e.getHasconflict())
-                                .set(BaseDo::getModifydate, new Date()));
-                    }
-                });
+        addConflict(needAddTimeOverLapList, EQ_TIME_CROSS, apsProcessOperationProcessEquDo.getId());
+//        log.info("找到更新时间之后存在冲突的工序作业结果:{}", afterTheUpdateConflictId);
+//        affectedIdList.addAll(afterTheUpdateConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.toList()));
+//        if (!afterTheUpdateConflictId.isEmpty()) {
+//            apsProcessOperationProcessEquDo.setHasconflict(LOCKMARK_Y);
+//            // 更新当前工序作业增加新的冲突
+//            String newConflictsDesc = addNewConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), EQ_TIME_CROSS);
+//            apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
+//            apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(),
+//                    afterTheUpdateConflictId.stream().map(ApsProcessOperationProcessEquDo::getId).collect(Collectors.joining(",")), EQ_TIME_CROSS, 1, null);
+//            updateProcessEquAfterAddConflictsDesc(afterTheUpdateConflictId, EQ_TIME_CROSS, apsProcessOperationProcessEquDo.getId());
+//        } else {
+//            // 去掉工序作业的冲突
+//            String newConflictsDesc = removeConflictsDesc(apsProcessOperationProcessEquDo.getConflictdes(), EQ_TIME_CROSS);
+//            apsConflictLogService.recordLog(apsProcessOperationProcessEquDo.getId(), "", EQ_TIME_CROSS, 2, null);
+//            apsProcessOperationProcessEquDo.setConflictdes(newConflictsDesc);
+//            apsProcessOperationProcessEquDo.setHasconflict(StringUtils.isBlank(apsProcessOperationProcessEquDo.getConflictdes()) &&
+//                    StringUtils.isBlank(apsProcessOperationProcessEquDo.getSoftconflictdes()) ?
+//                    LOCKMARK_N : LOCKMARK_Y);
+//            this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+//                    .eq(ApsProcessOperationProcessEquDo::getId, apsProcessOperationProcessEquDo.getId())
+//                    .set(ApsProcessOperationProcessEquDo::getConflictdes, newConflictsDesc)
+//                    .set(ApsProcessOperationProcessEquDo::getHasconflict, apsProcessOperationProcessEquDo.getHasconflict())
+//                    .set(BaseDo::getModifydate, new Date())
+//            );
+//            if (!aboutProcessEquList.isEmpty()) {
+//                aboutProcessEquList.forEach(e -> {
+//                    if (StringUtils.isNotBlank(e.getConflictdes()) && e.getConflictdes().contains(EQ_TIME_CROSS)) {
+//                        String afterConflictdes = removeConflictsDesc(e.getConflictdes(), EQ_TIME_CROSS);
+//                        apsConflictLogService.recordLog(e.getId(), "", EQ_TIME_CROSS, 2, null);
+//                        e.setConflictdes(afterConflictdes);
+//                        e.setHasconflict(StringUtils.isBlank(e.getConflictdes()) &&
+//                                StringUtils.isBlank(e.getSoftconflictdes()) ?
+//                                LOCKMARK_N : LOCKMARK_Y);
+//                        this.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+//                                .eq(ApsProcessOperationProcessEquDo::getId, e.getId())
+//                                .set(ApsProcessOperationProcessEquDo::getConflictdes, newConflictsDesc)
+//                                .set(ApsProcessOperationProcessEquDo::getHasconflict, e.getHasconflict())
+//                                .set(BaseDo::getModifydate, new Date()));
+//                    }
+//                });
+//            }
+//        }
+        return affectedIdList;
+    }
+
+    private List<ProcessVo> checkNeedAdd(List<ProcessVo> newList,
+                                         Date newPlanstartdate, Date newPlanenddate,
+                                         String processEquId) {
+        //判断当前是否存在冲突
+        List<ProcessVo> haveTimeOverLapList = newList.stream().filter(item -> haveTimeOverLap(item, processEquId, newPlanstartdate, newPlanenddate,false)).collect(Collectors.toList());
+        return haveTimeOverLapList;
+    }
+
+    private List<ProcessVo> checkNeedRemove(List<ProcessVo> oldList,
+                                            Date oldPlanstartdate, Date oldPlanenddate,
+                                            String processEquId) {
+        List<ProcessVo> needRemoveTimeOverLapIdList = new LinkedList<>();
+        //移除前存在冲突的数据
+        List<ProcessVo> haveTimeOverLapList = oldList.stream().filter(item -> haveTimeOverLap(item, processEquId, oldPlanstartdate, oldPlanenddate,true)).collect(Collectors.toList());
+        if (!haveTimeOverLapList.isEmpty()) {
+            //判断是否还有时间冲突,如果没有时间冲突,去除时间冲突,还存在时间冲突,则不更改数据
+            for (ProcessVo processVo : haveTimeOverLapList) {
+                long count = oldList.stream().filter(item -> haveTimeOverLap(item, processVo.getProcessEquId(), processVo.getPlanStartTime(), processVo.getPlanEndTime(),true)).count();
+                if (count == 0) {
+                    needRemoveTimeOverLapIdList.add(processVo);
+                }
             }
         }
-        return affectedIdList;
+        return needRemoveTimeOverLapIdList;
+    }
+
+    private boolean haveTimeOverLap(ProcessVo item, String processEquId, Date oldPlanstartdate, Date oldPlanenddate,boolean isRemove) {
+        if (isRemove && item.getProcessEquId().equals(processEquId)) {
+            return false;
+        }
+        Date planstartdate = item.getPlanStartTime();
+        Date planenddate = item.getPlanEndTime();
+        //是合并工序
+        if (item.getProcessWay().equals(PROCESS_WAY_MERGE)) {
+            //判断计划开工时间是否相同
+            if (planstartdate.compareTo(oldPlanstartdate) == 0) {
+                return false;
+            }
+        }
+        //不是合并工序判断时间是否冲突
+        if ((planstartdate.after(oldPlanstartdate) && planstartdate.before(oldPlanenddate))
+                || (planenddate.after(oldPlanstartdate) && planenddate.before(oldPlanenddate))) {
+            return true;
+        } else {
+            return false;
+        }
     }
 
     public String strAppendListConvertStr(String oldValue, List<String> newValues) {

+ 72 - 10
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationServiceImpl.java

@@ -2206,7 +2206,12 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                             curEquCancelRoll = tempRoll;
                         }
                         //取消和更新作业明细
-                        cancelProcessOperationEqu(curEquCancelRoll, apsProcessOperationDo, processOperationProcessEquDo, cancelProcessOperationVo.getCancelreason());
+                        CancelOperationProcessEquVo cancelOperationProcessEquVo = new CancelOperationProcessEquVo();
+                        cancelOperationProcessEquVo.setCurEquCancelRoll(curEquCancelRoll);
+                        cancelOperationProcessEquVo.setApsProcessOperationDo(apsProcessOperationDo);
+                        cancelOperationProcessEquVo.setProcessOperationProcessEquDo(processOperationProcessEquDo);
+                        cancelOperationProcessEquVo.setCancelreason(cancelProcessOperationVo.getCancelreason());
+                        cancelProcessOperationEqu(cancelOperationProcessEquVo);
                     } else {
                         break;
                     }
@@ -2281,15 +2286,13 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
         }
     }
 
-    /*
-    分配和取消作业明细
-    curEquCancelRoll:作业明细本次取消卷数
-    apsProcessOperationDo:当前作业
-    processOperationProcessEquDo:作业明细
-    cancelreason:取消原因
-     */
+    //分配和取消作业明细
     @Transactional
-    public R cancelProcessOperationEqu(Integer curEquCancelRoll, ApsProcessOperationDo apsProcessOperationDo, ApsProcessOperationProcessEquDo processOperationProcessEquDo, String cancelreason) {
+    public R cancelProcessOperationEqu(CancelOperationProcessEquVo cancelOperationProcessEquVo) {
+        Integer curEquCancelRoll = cancelOperationProcessEquVo.getCurEquCancelRoll();
+        ApsProcessOperationDo apsProcessOperationDo = cancelOperationProcessEquVo.getApsProcessOperationDo();
+        ApsProcessOperationProcessEquDo processOperationProcessEquDo = cancelOperationProcessEquVo.getProcessOperationProcessEquDo();
+        String cancelreason = cancelOperationProcessEquVo.getCancelreason();
         if (cancelreason.equals("1")) {//借调或取消
             processOperationProcessEquDo.setCancelrollno(processOperationProcessEquDo.getCancelrollno() + curEquCancelRoll);
         } else if (cancelreason.equals("2")) {//输入取消
@@ -2298,12 +2301,23 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
             processOperationProcessEquDo.setInputunqualifiednum(processOperationProcessEquDo.getInputunqualifiednum() + curEquCancelRoll);
             processOperationProcessEquDo.setInputunqualifiedroll(processOperationProcessEquDo.getInputunqualifiedroll() + curEquCancelRoll);
         }
+        List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = cancelOperationProcessEquVo.getApsProcessOperationProcessEquDos();
+        if (apsProcessOperationProcessEquDos == null) {
+            apsProcessOperationProcessEquDos = apsProcessOperationDao.getNextOperationProcessEqus(apsProcessOperationDo.getBlankid());
+        }
+        List<String> noEquProcessEquIds = cancelOperationProcessEquVo.getNoEquProcessEquIds();
+        if (noEquProcessEquIds == null) {
+            noEquProcessEquIds = new ArrayList<>();
+        }
         processOperationProcessEquDo.setCancelroll(processOperationProcessEquDo.getCancelroll() + curEquCancelRoll);
         processOperationProcessEquDo.setLeavewaitworkroll(processOperationProcessEquDo.getPlanprocessrall() - processOperationProcessEquDo.getStartingroll() - processOperationProcessEquDo.getCancelroll());
         List<String> noUpdatePlanenddateList = Arrays.asList("小卷成退", "中退", "成退");
         if (processOperationProcessEquDo.getPlanprocessrall() == processOperationProcessEquDo.getCancelroll()) {
             processOperationProcessEquDo.setProcessdevice("");
             processOperationProcessEquDo.setProcessdeviceid("");
+            if (!noEquProcessEquIds.contains(processOperationProcessEquDo.getId())) {
+                noEquProcessEquIds.add(processOperationProcessEquDo.getId());
+            }
         } else if (!noUpdatePlanenddateList.contains(apsProcessOperationDo.getProcess()) && processOperationProcessEquDo.getPlanprocessrall() > processOperationProcessEquDo.getCancelroll()) {
             BigDecimal addMinute = apsProcessOperationDo.getOnceprocessmin().multiply(new BigDecimal(60)).multiply(new BigDecimal(processOperationProcessEquDo.getPlanprocessrall() - processOperationProcessEquDo.getCancelroll()));//秒向上取整
             Calendar calendar = Calendar.getInstance();
@@ -2371,7 +2385,31 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                 if (!cancelreason.equals("3")) {
                     cancelreason = "2";
                 }
-                cancelProcessOperationEqu((int) Math.floor((double) (curEquCancelRoll * processOperationEquDo.getPlanprocessrall()) / processOperationProcessEquDo.getPlanprocessrall()), apsProcessOperationDo, processOperationEquDo, cancelreason);
+                CancelOperationProcessEquVo tempCancelOperationProcessEquVo = new CancelOperationProcessEquVo();
+                tempCancelOperationProcessEquVo.setCurEquCancelRoll((int) Math.floor((double) (curEquCancelRoll * processOperationEquDo.getPlanprocessrall()) / processOperationProcessEquDo.getPlanprocessrall()));
+                tempCancelOperationProcessEquVo.setApsProcessOperationDo(apsProcessOperationDo);
+                tempCancelOperationProcessEquVo.setProcessOperationProcessEquDo(processOperationEquDo);
+                tempCancelOperationProcessEquVo.setCancelreason(cancelreason);
+                tempCancelOperationProcessEquVo.setApsProcessOperationProcessEquDos(apsProcessOperationProcessEquDos);
+                tempCancelOperationProcessEquVo.setNoEquProcessEquIds(noEquProcessEquIds);
+                cancelProcessOperationEqu(tempCancelOperationProcessEquVo);
+            }
+        }
+
+        //断开与后道的关系
+        if (noEquProcessEquIds.size() > 0 && StringUtils.isNotBlank(processOperationProcessEquDo.getNextprocessesids())) {
+            String newNextIds = "";
+            for (String nextid : processOperationProcessEquDo.getNextprocessesids().split(",")) {
+                if (noEquProcessEquIds.contains(nextid)) {
+                    continue;
+                } else {
+                    newNextIds += nextid + ",";
+                }
+            }
+            if (StringUtils.isBlank(newNextIds)) {
+                processOperationProcessEquDo.setNextprocessesids("");
+            } else {
+                processOperationProcessEquDo.setNextprocessesids(newNextIds.substring(0, newNextIds.length() - 1));
             }
         }
 
@@ -2386,6 +2424,30 @@ public class ApsProcessOperationServiceImpl extends ServiceImpl<ApsProcessOperat
                 apsBlankOrderDo.setIswaitgetmaterial(isWaitGetMaterial);
                 apsBlankOrderService.updateById(apsBlankOrderDo);
             }
+
+            if (StringUtils.isBlank(processOperationProcessEquDo.getProcessdeviceid())) {
+                //断开与前道的关系
+                List<ApsProcessOperationProcessEquDo> operationProcessEquDos = apsProcessOperationProcessEquDos.stream().filter(qu -> qu.getNextprocessesids().contains(processOperationProcessEquDo.getId())).collect(Collectors.toList());
+                for (ApsProcessOperationProcessEquDo processEquDo : operationProcessEquDos) {
+                    String nextprocessesids = processEquDo.getNextprocessesids();
+                    String newNextprocessesids = "";
+                    for (String nextprocessesid : nextprocessesids.split(",")) {
+                        if (nextprocessesid.equals(processOperationProcessEquDo.getId())) {
+                            continue;
+                        } else {
+                            newNextprocessesids += nextprocessesid + ",";
+                        }
+                    }
+                    ApsProcessOperationProcessEquDo operationProcessEquDo = new ApsProcessOperationProcessEquDo();
+                    operationProcessEquDo.setId(processEquDo.getId());
+                    if (StringUtils.isBlank(newNextprocessesids)) {
+                        operationProcessEquDo.setNextprocessesids("");
+                    } else {
+                        operationProcessEquDo.setNextprocessesids(newNextprocessesids.substring(0, newNextprocessesids.length() - 1));
+                    }
+                    apsProcessOperationProcessEquService.updateById(operationProcessEquDo);
+                }
+            }
             return R.ok();
         } else {
             return R.error();

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

@@ -90,7 +90,7 @@ public class ApsServiceImpl implements ApsService {
      * @param apsType cd:插单,lzcp:冷轧连续重排,mix:混合排程
      */
     @Override
-    public void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders,String apsType,SysUserVo currentUser) {
+    public void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders,ApsTypeVo apsType,SysUserVo currentUser) {
         logger.info("**********排程请求开始**********");
         // 当前等路人所属工厂
         if(currentUser == null){
@@ -144,7 +144,7 @@ public class ApsServiceImpl implements ApsService {
                     logger.info("解锁重排订单:"+repcIds);
                 }
                 // 冷轧连续性问题重排
-                if(StrUtil.isNotBlank(apsType) && "lzcp".equals(apsType)){
+                if(apsType != null && StrUtil.isNotBlank(apsType.getMixIf()) && "mix".equals(apsType.getMixIf())){
                     lzlxOrderSchedule(apsBlankOrders,currentUser,apsType);
                 }else{
                     apsOrderScheduleNew(apsBlankOrders,currentUser,apsType);
@@ -337,7 +337,7 @@ public class ApsServiceImpl implements ApsService {
         });
     }
 
-    private void apsOrderScheduleNew(List<ApsBlankOrderVo> apsBlankOrders,SysUserVo currentUser,String apsType){
+    private void apsOrderScheduleNew(List<ApsBlankOrderVo> apsBlankOrders,SysUserVo currentUser,ApsTypeVo apsType){
         // 插单重排的优先排程
         List<ApsBlankOrderVo> cdorders = apsBlankOrders.stream().filter(v -> "1".equals(v.getCdbs())).collect(Collectors.toList());
         // 先按合金,合金状态分组,再每组分别排程
@@ -490,7 +490,7 @@ public class ApsServiceImpl implements ApsService {
      * @param apsBlankOrders
      * @param currentUser
      */
-    private void lzlxOrderSchedule(List<ApsBlankOrderVo> apsBlankOrders,SysUserVo currentUser,String apsType){
+    private void lzlxOrderSchedule(List<ApsBlankOrderVo> apsBlankOrders,SysUserVo currentUser,ApsTypeVo apsType){
         // 坯料计划排序
         Collections.sort(apsBlankOrders,(v1,v2)->{
             // 合金
@@ -517,12 +517,12 @@ public class ApsServiceImpl implements ApsService {
             if(prowidth1.compareTo(prowidth2) == 0){
                 // 合金
                 if(alloy1.compareTo(alloy2) == 0){
-                    // 产品类型
-                    if(producttype1 == null || producttype2 == null || producttype1.compareTo(producttype2) == 0){
-                        // 厚度
-                        if(thickness1.compareTo(thickness2) == 0){
-                            // 合金状态
-                            if(alloystatus1 == null || alloystatus2 == null || alloystatus1.compareTo(alloystatus2) == 0){
+                    // 合金状态
+                    if(alloystatus1 == null || alloystatus2 == null || alloystatus1.compareTo(alloystatus2) == 0){
+                        // 产品类型
+                        if(producttype1 == null || producttype2 == null || producttype1.compareTo(producttype2) == 0){
+                            // 厚度
+                            if(thickness1.compareTo(thickness2) == 0){
                                 // 重量
                                 if(singlerollweight1.compareTo(singlerollweight2) == 0){
                                     // 按照订单排序
@@ -538,17 +538,17 @@ public class ApsServiceImpl implements ApsService {
                                     a = 1;
                                 }
                             }else{
-                                a = alloystatus1.compareTo(alloystatus2);
+                                if(thickness1.compareTo(thickness2) > 0){
+                                    a = -1;
+                                }else{
+                                    a = 1;
+                                }
                             }
                         }else{
-                            if(thickness1.compareTo(thickness2) > 0){
-                                a = -1;
-                            }else{
-                                a = 1;
-                            }
+                            a = producttype1.compareTo(producttype2);
                         }
                     }else{
-                        a = producttype1.compareTo(producttype2);
+                        a = alloystatus1.compareTo(alloystatus2);
                     }
                 }else{
                     a = alloy1.compareTo(alloy2);
@@ -579,10 +579,10 @@ public class ApsServiceImpl implements ApsService {
             }
         }
         Date finalApsPlanStartDate = apsPlanStartDate;
-        apsOrderScheduleApsNew(apsBlankOrders,currentUser,allEqs, finalApsPlanStartDate,"mix");
+        apsOrderScheduleApsNew(apsBlankOrders,currentUser,allEqs, finalApsPlanStartDate,apsType);
     }
 
-    private void apsOrderScheduleApsNew(List<ApsBlankOrderVo> apsBlankOrders,SysUserVo currentUser,Map<String,Equipment> allEqs,Date apsPlanStartDate,String apsType){
+    private void apsOrderScheduleApsNew(List<ApsBlankOrderVo> apsBlankOrders,SysUserVo currentUser,Map<String,Equipment> allEqs,Date apsPlanStartDate,ApsTypeVo apsType){
         // 设备数据每批次开始清空
         allEqs.clear();
         // 排程前解锁所有待排程订单
@@ -706,7 +706,7 @@ public class ApsServiceImpl implements ApsService {
             apsProductionSchedule.setProcesses(processes);
             apsProductionSchedule.setEquipmentList(equipmentList);
             // 是否混排
-            if(StrUtil.isNotBlank(apsType)){
+            if(apsType != null){
                 apsProductionSchedule.setScheduleType(apsType);
             }
 
@@ -969,7 +969,7 @@ public class ApsServiceImpl implements ApsService {
                     .eq(ApsProcessOperationProcessEquDo::getProcessid, operationDo.getId()).eq(ApsProcessOperationProcessEquDo::getLockmarkdetail,"y"));
             if(pros != null && pros.size()>0){
                 for (ApsProcessOperationProcessEquDo pro : pros) {
-                    if(!canchoosedeviceid.contains(pro.getProcessdeviceid())){
+                    if(StrUtil.isNotBlank(pro.getProcessdeviceid()) && !canchoosedeviceid.contains(pro.getProcessdeviceid())){
                         if(StrUtil.isBlank(canchoosedeviceid)){
                             canchoosedeviceid = pro.getProcessdeviceid();
                         }else{
@@ -1103,6 +1103,27 @@ public class ApsServiceImpl implements ApsService {
                                 }
                             }
 
+                            Date lxDate = null;
+                            String lxrollerid = null;
+                            BigDecimal lxprowidth = null;
+                            if("冷轧".equals(operationDo.getProcess()) || "箔轧".equals(operationDo.getProcess())){
+                                for (int i = 0; i < lastpros.size(); i++) {
+                                    ApsProcessOperationDo apo = lastopsMap.get(lastpros.get(i).getProcessid());
+                                    Date planstartdate = lastpros.get(i).getPlanstartdate();
+                                    if(lxDate == null){
+                                        lxDate = planstartdate;
+                                        lxrollerid = lastpros.get(i).getRollerid();
+                                        lxprowidth = apo.getProwidth();
+                                    }else{
+                                        if(StrUtil.isNotBlank(lxrollerid) && lxrollerid.equals(lastpros.get(i).getRollerid()) && apo.getProwidth().compareTo(lxprowidth)>=0){
+                                            lxDate = lastpros.get(i).getPlanstartdate();
+                                        }else{
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+
                             if(hasLast){
                                 ApsProcessOperationDo lastop = apsProcessOperationService.getById(lastpro.getProcessid());
                                 // 输出物料
@@ -1119,6 +1140,7 @@ public class ApsServiceImpl implements ApsService {
                                 equipment.setLastProcessCutfinishmin(lastop.getCutfinishmin() == null ? null : lastop.getCutfinishmin().intValue());
                                 equipment.setLastZjgid(lastpro.getRollerid());
                             }
+                            equipment.setLxzTime(lxDate);
                         }
                         // 设备占用时间段
                         List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.bsentity.domain.*;
+import com.rongwei.bsentity.vo.CancelOperationProcessEquVo;
 import com.rongwei.bsentity.vo.CancelProcessOperationVo;
 import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
 import com.rongwei.commonservice.service.RedisService;
@@ -36,7 +37,6 @@ import java.util.function.BiConsumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static com.rongwei.safecommon.utils.SaveConstans.JobStatus.JOBSTATUS_TO_BE_END;
 import static com.rongwei.safecommon.utils.SaveConstans.SMALL_CIRCLE_PROCESSING_PROCESS_NAME;
 import static com.rongwei.safecommon.utils.SaveConstans.WorkInProgressStatus.*;
 import static com.rongwei.safecommon.utils.SaveConstans.WorkInProgressType.PASS;
@@ -562,21 +562,21 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                  * 新增需求:临时计算订单类型,如果输出物料的产品明细ID对应产品明细的合并订单号不为空,则订单类型=该合并订单的订单类型;否则订单类型=订单的订单类型
                  */
                 String temporaryOrderType = "";
-                List<ApsProductDetailDo> queryProductDetailList= apsProductDetailDoList.stream().filter(info -> info.getId().equals(apsProcessOperationOutMaterDo.getOrderdetailid())).collect(Collectors.toList());
-                if (!queryProductDetailList.isEmpty()){
+                List<ApsProductDetailDo> queryProductDetailList = apsProductDetailDoList.stream().filter(info -> info.getId().equals(apsProcessOperationOutMaterDo.getOrderdetailid())).collect(Collectors.toList());
+                if (!queryProductDetailList.isEmpty()) {
                     ApsProductDetailDo queryProductDetailDo = queryProductDetailList.get(0);
-                    if (queryProductDetailDo!= null&&ObjectUtil.isNotEmpty(queryProductDetailDo.getMergeordernumber())){
-                        List<ApsProductionMergeOrderDo> queryProductionMergeOrderList = apsProductionMergeOrderDoList.stream().filter(data->(data.getOrderno().equals(queryProductDetailDo.getMergeordernumber()))).collect(Collectors.toList());
-                        if (!queryProductionMergeOrderList.isEmpty()){
+                    if (queryProductDetailDo != null && ObjectUtil.isNotEmpty(queryProductDetailDo.getMergeordernumber())) {
+                        List<ApsProductionMergeOrderDo> queryProductionMergeOrderList = apsProductionMergeOrderDoList.stream().filter(data -> (data.getOrderno().equals(queryProductDetailDo.getMergeordernumber()))).collect(Collectors.toList());
+                        if (!queryProductionMergeOrderList.isEmpty()) {
                             ApsProductionMergeOrderDo queryProductMergeOrderDo = queryProductionMergeOrderList.get(0);
                             temporaryOrderType = queryProductMergeOrderDo.getOrdertype();
-                        }else {
+                        } else {
                             temporaryOrderType = productionOrderDo.getOrdertype();
                         }
-                    }else {
+                    } else {
                         temporaryOrderType = productionOrderDo.getOrdertype();
                     }
-                }else {
+                } else {
                     temporaryOrderType = productionOrderDo.getOrdertype();
                 }
                 if (MATERIAL_PREPARATION_ORDER.equals(temporaryOrderType)) {
@@ -641,7 +641,12 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                 int cancelQty = toBeStartedQty >= value ? value : toBeStartedQty;
                 log.debug("工序作业:{}的本次取消卷数:{}", apsProcessOperationProcessEquDo.getId(), cancelQty);
                 //取消和更新作业明细
-                apsProcessOperationService.cancelProcessOperationEqu(cancelQty, apsProcessOperationDo, apsProcessOperationProcessEquDo, "3");
+                CancelOperationProcessEquVo cancelOperationProcessEquVo = new CancelOperationProcessEquVo();
+                cancelOperationProcessEquVo.setCurEquCancelRoll(cancelQty);
+                cancelOperationProcessEquVo.setApsProcessOperationDo(apsProcessOperationDo);
+                cancelOperationProcessEquVo.setProcessOperationProcessEquDo(apsProcessOperationProcessEquDo);
+                cancelOperationProcessEquVo.setCancelreason("3");
+                apsProcessOperationService.cancelProcessOperationEqu(cancelOperationProcessEquVo);
                 //取消和更新工序作业
                 cancelProcessOperationVo = new CancelProcessOperationVo();
                 cancelProcessOperationVo.setCraftrouteid(null);
@@ -797,14 +802,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;
     }
 
@@ -1057,7 +1062,12 @@ public class ReportCheckServiceImpl implements ReportCheckService {
                     int cancelQty = toBeStartedQty >= value ? value : toBeStartedQty;
                     log.debug("工序作业:{}的本次取消卷数:{}", apsProcessOperationProcessEquDo.getId(), cancelQty);
                     //取消和更新作业明细
-                    apsProcessOperationService.cancelProcessOperationEqu(cancelQty, apsProcessOperationDo, apsProcessOperationProcessEquDo, "3");
+                    CancelOperationProcessEquVo cancelOperationProcessEquVo = new CancelOperationProcessEquVo();
+                    cancelOperationProcessEquVo.setCurEquCancelRoll(cancelQty);
+                    cancelOperationProcessEquVo.setApsProcessOperationDo(apsProcessOperationDo);
+                    cancelOperationProcessEquVo.setProcessOperationProcessEquDo(apsProcessOperationProcessEquDo);
+                    cancelOperationProcessEquVo.setCancelreason("3");
+                    apsProcessOperationService.cancelProcessOperationEqu(cancelOperationProcessEquVo);
                     //取消和更新工序作业
                     cancelProcessOperationVo = new CancelProcessOperationVo();
                     cancelProcessOperationVo.setCraftrouteid(null);
@@ -1240,8 +1250,8 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         List<SysDictDo> defectTypes = apsReportOutputService.getQualityDefectsDictsByType();
         apsReportOutputDos.forEach(apsReportOutputDo -> {
             workInProgressInventoryDos.stream()
-            .filter(inventory -> apsReportOutputDo.getOutputnumber().equals(inventory.getBatchnumber()))
-            .collect(Collectors.toList()).forEach(data -> {
+                    .filter(inventory -> apsReportOutputDo.getOutputnumber().equals(inventory.getBatchnumber()))
+                    .collect(Collectors.toList()).forEach(data -> {
                 if ("是".equals(ifblankprocess)) {
                     data.setBlankname(apsReportOutputDo.getOutputdesc());
                 }

+ 4 - 2
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsBlankOrderDao.xml

@@ -194,8 +194,10 @@
         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.ACTUALSTARTDATE),
-        apope.PLANENDDATE=IF(apope.ACTUALFINISHDATE IS NOT NULL, apope.ACTUALFINISHDATE, DATE_ADD(apope.ACTUALSTARTDATE,INTERVAL TIMESTAMPdiff(SECOND, apope.PLANSTARTDATE, apope.PLANENDDATE) SECOND))
+        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.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)

+ 17 - 0
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml

@@ -560,4 +560,21 @@
             #{item}
         </foreach>
     </select>
+    <select id="selectMyProcessVo" resultType="com.rongwei.bsentity.vo.ProcessVo">
+        SELECT
+            apope.ID AS 'processEquId',
+            apope.PLANSTARTDATE AS 'planStartTime',
+            apope.PLANENDDATE AS 'planEndTime',
+            apo.PROCESSWAY AS 'processWay',
+            apope.CONFLICTDES AS 'conflictdes',
+            apope.SOFTCONFLICTDES AS 'softconflictdes'
+        FROM
+            aps_process_operation_process_equ apope
+                LEFT JOIN aps_process_operation apo ON apope.PROCESSID = apo.ID AND apo.DELETED = 0
+        WHERE
+            apope.DELETED = 0
+            AND apope.PROCESSDEVICEID = #{equId}
+            AND apope.PLANSTARTDATE > #{date1}
+            AND apope.PLANENDDATE &lt; #{date2}
+    </select>
 </mapper>

+ 5 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsScheduleConfigDo.java

@@ -172,6 +172,11 @@ public class ApsScheduleConfigDo extends BaseDo {
      */
     @TableField("MIDWEIGHTDIFFERENCE")
     private BigDecimal midweightdifference;
+    /**
+     * 调度排程模式
+     */
+    @TableField("SCHEDULETYPE")
+    private String scheduletype;
 
 
 }

+ 29 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsTypeVo.java

@@ -0,0 +1,29 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+@Data
+public class ApsTypeVo {
+
+    /**
+     * 是否混排:
+     * default:分批排程(默认排程)
+     * mix:混合排程
+     */
+    private String mixIf;
+
+    /**
+     * 是否退火提前合并:
+     * thMergeBf:退火提前合并
+     * notThMergeBf:退火不提前合并
+     */
+    private String thMergeMode;
+
+    /**
+     * 约束优先级:
+     * lz:冷轧优先
+     * th:退火优先
+     */
+    private String constraintMode;
+
+}

+ 17 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CancelOperationProcessEquVo.java

@@ -0,0 +1,17 @@
+package com.rongwei.bsentity.vo;
+
+import com.rongwei.bsentity.domain.ApsProcessOperationDo;
+import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CancelOperationProcessEquVo {
+    private Integer curEquCancelRoll;//作业明细本次取消卷数
+    private ApsProcessOperationDo apsProcessOperationDo;//当前作业
+    private ApsProcessOperationProcessEquDo processOperationProcessEquDo;//作业明细
+    private String cancelreason;//取消原因
+    private List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = null;//该坯料计划下所有的作业明细
+    private List<String> noEquProcessEquIds = null;//设备为空的明细ids
+}

+ 5 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/Equipment.java

@@ -107,6 +107,11 @@ public class Equipment{
      */
     private String lastZjgid;
 
+    /**
+     * 当前设备最早工序的连续冷轧的开始时间
+     */
+    private Date lxzTime;
+
     /**
      * 关联设备,铸轧机关联的熔炼炉
      */

+ 25 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProcessVo.java

@@ -0,0 +1,25 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author :sc
+ * @since :2025/1/23
+ */
+@Data
+public class ProcessVo {
+    //作业明细ID
+    private String processEquId;
+    //计划开工时间
+    private Date planStartTime;
+    //计划结束时间
+    private Date planEndTime;
+    //工序类型
+    private String processWay;
+    //冲突描述
+    private String conflictdes;
+    //非强制性冲突
+    private String softconflictdes;
+}

+ 1 - 1
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionScheduleVo.java

@@ -38,7 +38,7 @@ public class ProductionScheduleVo {
      * default:分批排程(默认排程)
      * mix:混合排程
      */
-    private String scheduleType;
+    private ApsTypeVo scheduleType;
 
     /**
      * 生产工序集合