Browse Source

aps-开工报工待检验批次号优化,领料、报工检验分配待加工料卷批次号逻辑优化testin1605、1569、1786、1798

zhoudazhuang 8 tháng trước cách đây
mục cha
commit
4e387f19a1

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

@@ -3334,10 +3334,53 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         }
 
         //更新坯料计划的第一道工序作业的所有工序作业明细的待加工料卷批次号=领料批次号逗号拼接
-        apsProcessOperationProcessEquService.update(new UpdateWrapper<ApsProcessOperationProcessEquDo>().lambda()
-                .set(ApsProcessOperationProcessEquDo::getBachmaterialprocess, String.join(",", batchNumberList))
+//        apsProcessOperationProcessEquService.update(new UpdateWrapper<ApsProcessOperationProcessEquDo>().lambda()
+//                .set(ApsProcessOperationProcessEquDo::getBachmaterialprocess, String.join(",", batchNumberList))
+//                .eq(ApsProcessOperationProcessEquDo::getDeleted, "0")
+//                .eq(ApsProcessOperationProcessEquDo::getProcessid, req.getProcessId()));
+        /**
+         * 需求变更:根据作业明细的计划开工时间先后顺序以及剩余待开工卷数(=计划加工卷数-已开工卷数-已取消卷数)自动将领料批次号依次重新分配给这些作业明细,只用管剩余待开工卷数大于0的
+         * 注意:是重新分配待加工料卷批次号,需要清空原待加工料卷批次号,不是在原有待加工料卷批次号后面追加
+         */
+        List<ApsProcessOperationProcessEquDo> updateOperationProcessEquList = apsProcessOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                 .eq(ApsProcessOperationProcessEquDo::getDeleted, "0")
-                .eq(ApsProcessOperationProcessEquDo::getProcessid, req.getProcessId()));
+                .eq(ApsProcessOperationProcessEquDo::getProcessid, req.getProcessId())
+                .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate));
+        List<String> finalBatchNumberList = batchNumberList;
+        List<ApsProcessOperationProcessEquDo> needUpdateProcessEquList = new ArrayList<>();
+        List<ApsProcessOperationProcessEquDo> clearBachMaterialProcessEquList = new ArrayList<>();
+        //符合条件的需要先清除原待加工料卷批次号
+        updateOperationProcessEquList.forEach(equDo->{
+            //剩余待开工卷数 =计划加工卷数-已开工卷数-已取消卷数
+            int leaveWaitWorkRoll = equDo.getPlanprocessrall() - equDo.getStartingroll() - equDo.getCancelroll();
+            if (leaveWaitWorkRoll>0){
+                if (StringUtils.isNotBlank(equDo.getBachmaterialprocess())){
+                    equDo.setBachmaterialprocess("");
+                    clearBachMaterialProcessEquList.add(equDo);
+                }
+            }
+        });
+        if (ObjectUtil.isNotEmpty(clearBachMaterialProcessEquList)) {
+            apsProcessOperationProcessEquService.updateBatchById(clearBachMaterialProcessEquList);
+        }
+        updateOperationProcessEquList.forEach(equDo->{
+            //剩余待开工卷数 =计划加工卷数-已开工卷数-已取消卷数
+            int leaveWaitWorkRoll = equDo.getPlanprocessrall() - equDo.getStartingroll() - equDo.getCancelroll();
+            if (leaveWaitWorkRoll>0&& finalBatchNumberList.size()>0){
+                //有几个剩余待开工卷数就要分配几个batchNumberList中批次号的个数
+                List<String> distributionNumbers = finalBatchNumberList.stream().limit(leaveWaitWorkRoll).collect(Collectors.toList());
+                equDo.setBachmaterialprocess(String.join(",",distributionNumbers));
+                finalBatchNumberList.removeAll(distributionNumbers);
+                needUpdateProcessEquList.add(equDo);
+            }
+        });
+        if (ObjectUtil.isNotEmpty(needUpdateProcessEquList)) {
+            apsProcessOperationProcessEquService.updateBatchById(needUpdateProcessEquList);
+        }
+
+
+
+
 
         //在制品的在制品状态=待加工
         //在制品的备料计划ID=该坯料计划ID

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

@@ -272,14 +272,6 @@ public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao,
             apsReportOutputDo.setTenantid(tenantId);
         }
         this.saveBatch(resList);
-
-        //更新主表中的待检验批次号
-        List<String> batchNumberList = resList.stream().map(ApsReportOutputDo::getOutputnumber).collect(Collectors.toList());
-        String batchNumbers = String.join(",", batchNumberList);
-        ApsReportRecordsDo apsReportRecordsDo = new ApsReportRecordsDo();
-        apsReportRecordsDo.setId(req.getMainId());
-        apsReportRecordsDo.setNeedcheckbatchnumber(batchNumbers);
-        apsReportRecordsService.updateById(apsReportRecordsDo);
         return R.ok();
     }
 

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

@@ -161,8 +161,25 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getStartingroll, newStartingRoll);
         //待报工记录ID=(空)
         processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getWaitreportid, null);
-        //加工中批次号=(空)
-        processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getDoingbatchnumber, null);
+        /**
+         * 需求变更:小卷开工类型取消开工时,应该在当前工序作业明细的加工中批次号应该减去“{批次号}”
+         */
+        if (ObjectUtil.isNotEmpty(recordsDo.getBatchnumber())) {
+            List<String> doingBatchNumbers = new LinkedList<>(Arrays.asList(apsProcessOperationProcessEquDo.getDoingbatchnumber().split(",")));
+            if (ObjectUtil.isNotEmpty(doingBatchNumbers)){
+                doingBatchNumbers.removeAll(batchNumberList);
+                //加工中批次号=当前工序作业明细的加工中批次号应该减去“{批次号}”
+                if (doingBatchNumbers.size()>0){
+                    processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getDoingbatchnumber, String.join(",",doingBatchNumbers));
+                }else {
+                    //加工中批次号=(空)
+                    processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getDoingbatchnumber, null);
+                }
+            }
+        }else {
+            //加工中批次号=(空)
+            processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getDoingbatchnumber, null);
+        }
         /**
          * 如果已开工卷数=0,则更新该作业明细
          * 实际开工时间=(空),
@@ -172,6 +189,11 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getActualstartdate, null);
             processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getWorkstatus, "待开工");
         }
+        /**
+         * 新加需求:更新“剩余待开工卷数”=计划加工卷数-已开工卷数-已取消卷数
+         */
+        Integer newLeaveWaitWorkRoll = apsProcessOperationProcessEquDo.getPlanprocessrall()-newStartingRoll-apsProcessOperationProcessEquDo.getCancelroll();
+        processEquUpdateWrapper.set(ApsProcessOperationProcessEquDo::getLeavewaitworkroll, newLeaveWaitWorkRoll);
         //更新
         apsProcessOperationProcessEquService.update(processEquUpdateWrapper);
 
@@ -263,23 +285,30 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
 //                    apsProcessOperationDao.updateBatchNumberByProcessList(recordsDo.getBatchnumber(), processIdList);
 //                }
 //
+//            }
+//            /**
+//             * 如果该工序作业明细有前道工序作业明细,则将前道工序作业明细的所有后道工序作业明细的待加工料卷批次号加上“{批次号},”
+//             */
+//            if (ObjectUtil.isNotEmpty(equDo.getPreviousprocessesids()) && ObjectUtil.isNotEmpty(recordsDo.getBatchnumber())) {
+//                apsProcessOperationDao.updateBatchNumberByPrevious(recordsDo.getBatchnumber(), equDo.getPreviousprocessesids());
+//            }
+//            /**
+//             * 如果该工序作业明细没有前道工序作业明细,则该作业明细对应作业的所有作业明细的待加工料卷批次号加上“{批次号},”
+//             */
+//            if (ObjectUtil.isEmpty(equDo.getPreviousprocessesids()) && ObjectUtil.isNotEmpty(recordsDo.getBatchnumber())) {
+//                //更新坯料计划的第一道工序作业的所有工序作业明细的待加工料卷批次号=领料批次号逗号拼接
+//                apsProcessOperationProcessEquService.update(new UpdateWrapper<ApsProcessOperationProcessEquDo>().lambda()
+//                        .setSql("BACHMATERIALPROCESS = IF(BACHMATERIALPROCESS is null || BACHMATERIALPROCESS = '','" + String.join(",", batchNumberList) + "',CONCAT(BACHMATERIALPROCESS,'," + String.join(",", batchNumberList) + "'))")
+//                        .eq(ApsProcessOperationProcessEquDo::getDeleted, "0")
+//                        .eq(ApsProcessOperationProcessEquDo::getProcessid, recordsDo.getProcessoperationid()));
 //            }
             /**
-             * 如果该工序作业明细有前道工序作业明细,则将前道工序作业明细的所有后道工序作业明细的待加工料卷批次号加上“{批次号},”
-             */
-            if (ObjectUtil.isNotEmpty(equDo.getPreviousprocessesids()) && ObjectUtil.isNotEmpty(recordsDo.getBatchnumber())) {
-                apsProcessOperationDao.updateBatchNumberByPrevious(recordsDo.getBatchnumber(), equDo.getPreviousprocessesids());
-            }
-            /**
-             * 如果该工序作业明细没有前道工序作业明细,则该作业明细对应作业的所有作业明细的待加工料卷批次号加上“{批次号},”
+             * 需求变更:将当前作业明细的待加工料卷批次号加上“{批次号}”
              */
-            if (ObjectUtil.isEmpty(equDo.getPreviousprocessesids()) && ObjectUtil.isNotEmpty(recordsDo.getBatchnumber())) {
-                //更新坯料计划的第一道工序作业的所有工序作业明细的待加工料卷批次号=领料批次号逗号拼接
-                apsProcessOperationProcessEquService.update(new UpdateWrapper<ApsProcessOperationProcessEquDo>().lambda()
-                        .setSql("BACHMATERIALPROCESS = IF(BACHMATERIALPROCESS is null || BACHMATERIALPROCESS = '','" + String.join(",", batchNumberList) + "',CONCAT(BACHMATERIALPROCESS,'," + String.join(",", batchNumberList) + "'))")
-                        .eq(ApsProcessOperationProcessEquDo::getDeleted, "0")
-                        .eq(ApsProcessOperationProcessEquDo::getProcessid, recordsDo.getProcessoperationid()));
-            }
+            apsProcessOperationProcessEquService.update(new UpdateWrapper<ApsProcessOperationProcessEquDo>().lambda()
+                    .setSql("BACHMATERIALPROCESS = IF(BACHMATERIALPROCESS is null || BACHMATERIALPROCESS = '','" + String.join(",", batchNumberList) + "',CONCAT(BACHMATERIALPROCESS,'," + String.join(",", batchNumberList) + "'))")
+                    .eq(ApsProcessOperationProcessEquDo::getDeleted, "0")
+                    .eq(ApsProcessOperationProcessEquDo::getId, recordsDo.getProcessequid()));
         }
         set.eq(ApsProcessOperationProcessEquDo::getId, equDo.getId());
         apsProcessOperationProcessEquService.update(set);
@@ -492,14 +521,26 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                 //更新实际开工时间
                 needUpdateProcessOperationProcessEqu.setActualstartdate(DateUtil.date());
             }
+            /**
+             * 需求变更:加工中批次号应该是每次往里面增加
+             */
             //加工中批次号
             if (ObjectUtil.isNotEmpty(req.getInputBatchNumber())) {
-                needUpdateProcessOperationProcessEqu.setDoingbatchnumber(req.getInputBatchNumber());
+                if (StringUtils.isNotBlank(apsProcessOperationProcessEquDo.getDoingbatchnumber())){
+                    needUpdateProcessOperationProcessEqu.setDoingbatchnumber(apsProcessOperationProcessEquDo.getDoingbatchnumber()+","+req.getInputBatchNumber());
+                }else {
+                    needUpdateProcessOperationProcessEqu.setDoingbatchnumber(req.getInputBatchNumber());
+                }
             }
             //更新工序作业明细的完工状态和作业状态
             if (apsProcessOperationProcessEquDo.getWorkstatus().equals("待开工")) {
                 needUpdateProcessOperationProcessEqu.setWorkstatus("加工中");
             }
+            /**
+             * 新加需求:更新“剩余待开工卷数”=计划加工卷数-已开工卷数-已取消卷数
+             */
+            Integer newLeaveWaitWorkRoll = apsProcessOperationProcessEquDo.getPlanprocessrall()-newStartingRoll-apsProcessOperationProcessEquDo.getCancelroll();
+            needUpdateProcessOperationProcessEqu.setLeavewaitworkroll(newLeaveWaitWorkRoll);
             apsProcessOperationProcessEquService.updateById(needUpdateProcessOperationProcessEqu);
 
             //===============更新工序作业==================
@@ -563,29 +604,45 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                 /**
                  * 如果该工序作业明细没有前道工序作业明细,则该作业明细对应作业的所有作业明细的待加工料卷批次号去掉“{输入物料批次号},”
                  */
-                if (ObjectUtil.isEmpty(apsProcessOperationProcessEquDo.getPreviousprocessesids())) {
-                    needUpdateProcessEqus = apsProcessOperationProcessEquService.list(new QueryWrapper<ApsProcessOperationProcessEquDo>().lambda().eq(ApsProcessOperationProcessEquDo::getProcessid, apsProcessOperationProcessEquDo.getProcessid()));
-                }
-                List<ApsProcessOperationProcessEquDo> updateList = new LinkedList<>();
-                //遍历所有第一道工序的明细
-                for (ApsProcessOperationProcessEquDo updateProcessEqu : needUpdateProcessEqus) {
-                    String bachmaterialprocess = updateProcessEqu.getBachmaterialprocess();
-                    //如果存在被使用的批次号,则删除此批次号
-                    if (ObjectUtil.isNotEmpty(bachmaterialprocess)) {
-                        LinkedList<String> strings = new LinkedList<>(Arrays.asList(bachmaterialprocess.split(",")));
-                        if (strings.contains(req.getInputBatchNumber())) {
-                            strings.remove(req.getInputBatchNumber());
-                            ApsProcessOperationProcessEquDo equDo = new ApsProcessOperationProcessEquDo();
-                            equDo.setId(updateProcessEqu.getId());
-                            equDo.setBachmaterialprocess(String.join(",", strings));
-                            updateList.add(equDo);
-                        }
+//                if (ObjectUtil.isEmpty(apsProcessOperationProcessEquDo.getPreviousprocessesids())) {
+//                    needUpdateProcessEqus = apsProcessOperationProcessEquService.list(new QueryWrapper<ApsProcessOperationProcessEquDo>().lambda().eq(ApsProcessOperationProcessEquDo::getProcessid, apsProcessOperationProcessEquDo.getProcessid()));
+//                }
+//                List<ApsProcessOperationProcessEquDo> updateList = new LinkedList<>();
+//                //遍历所有第一道工序的明细
+//                for (ApsProcessOperationProcessEquDo updateProcessEqu : needUpdateProcessEqus) {
+//                    String bachmaterialprocess = updateProcessEqu.getBachmaterialprocess();
+//                    //如果存在被使用的批次号,则删除此批次号
+//                    if (ObjectUtil.isNotEmpty(bachmaterialprocess)) {
+//                        LinkedList<String> strings = new LinkedList<>(Arrays.asList(bachmaterialprocess.split(",")));
+//                        if (strings.contains(req.getInputBatchNumber())) {
+//                            strings.remove(req.getInputBatchNumber());
+//                            ApsProcessOperationProcessEquDo equDo = new ApsProcessOperationProcessEquDo();
+//                            equDo.setId(updateProcessEqu.getId());
+//                            equDo.setBachmaterialprocess(String.join(",", strings));
+//                            updateList.add(equDo);
+//                        }
+//                    }
+//                }
+//                //更新
+//                if (ObjectUtil.isNotEmpty(updateList)) {
+//                    apsProcessOperationProcessEquService.updateBatchById(updateList);
+//                }
+                /**
+                 * 需求变更:待加工料卷批次号已经分配到对应作业明细不用删除兄弟作业明细的待加工料卷批次号仅删除当前作业作业明细的待加工料卷批次号
+                 * 检查完待加工料卷批次号是否改变后,立即更新待加工料卷批次号
+                 */
+                String bachmaterialprocess = apsProcessOperationProcessEquDo.getBachmaterialprocess();
+                //如果存在被使用的批次号,则删除此批次号
+                if (ObjectUtil.isNotEmpty(bachmaterialprocess)) {
+                    LinkedList<String> strings = new LinkedList<>(Arrays.asList(bachmaterialprocess.split(",")));
+                    if (strings.contains(req.getInputBatchNumber())) {
+                        strings.remove(req.getInputBatchNumber());
+                        ApsProcessOperationProcessEquDo equDo = new ApsProcessOperationProcessEquDo();
+                        equDo.setId(apsProcessOperationProcessEquDo.getId());
+                        equDo.setBachmaterialprocess(String.join(",", strings));
+                        apsProcessOperationProcessEquService.updateById(equDo);
                     }
                 }
-                //更新
-                if (ObjectUtil.isNotEmpty(updateList)) {
-                    apsProcessOperationProcessEquService.updateBatchById(updateList);
-                }
             }
 
             //==========输出物料子表信息============
@@ -1002,6 +1059,25 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                 }
                 updateAfterBlankByBatchAndOutPutNumber(apsProcessOperationDo, nowReportRecordsDo, apsProcessOperationProcessEquDo, outPutNumber);
             }
+            /**
+             * 新加需求:更新“剩余待报工卷数”=未完工卷数-已取消卷数合计,未完工卷数=计划加工卷数-已报工卷数
+             * 如果剩余待报工卷数=0,则完工状态=已完工,实际完工时间=当前时间
+             * 如果剩余待报工卷数>0,则完工状态=未完工
+             */
+            Integer newLeaveWaitJobRoll = unfinishroll-apsProcessOperationProcessEquDo.getCancelroll();
+            processEquWrapper.set(ApsProcessOperationProcessEquDo::getLeavewaitjobroll, newLeaveWaitJobRoll);
+            if (newLeaveWaitJobRoll>0){
+                processEquWrapper.set(ApsProcessOperationProcessEquDo::getClosestatus, "未完工");
+            }else {
+                if (newLeaveWaitJobRoll==0){
+                    processEquWrapper.set(ApsProcessOperationProcessEquDo::getClosestatus, "已完工");
+                    processEquWrapper.set(ApsProcessOperationProcessEquDo::getActualfinishdate, new Date());
+                }
+            }
+            /**
+             * 修复报工后未完工卷数没更新的bug
+             */
+            processEquWrapper.set(ApsProcessOperationProcessEquDo::getUnfinishroll, unfinishroll);
             //更新
             apsProcessOperationProcessEquService.update(processEquWrapper);
 
@@ -1065,6 +1141,13 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                 apsReportRecordsDo.setReportworktime(DateUtil.date());
             }
 
+            /**
+             * 之前开工做的操作:更新主表中的待检验批次号,转移到报工代码这边
+             */
+            List<String> batchOutPutNumberList = apsReportOutputDoList.stream().map(ApsReportOutputDo::getOutputnumber).collect(Collectors.toList());
+            String outPutBatchNumbers = String.join(",", batchOutPutNumberList);
+            apsReportRecordsDo.setNeedcheckbatchnumber(outPutBatchNumbers);
+
             this.updateById(apsReportRecordsDo);
 
 //        //物理删除原来的报工记录输出物料
@@ -1442,6 +1525,13 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
                 vo.setInitValue(0L);
                 Map<String, Object> codeData = cxAdminFeginClient.getSerialNumberCode(vo).getData();
                 heatNumber = codeData.get("code").toString();
+                if (StringUtils.isNotBlank(heatNumber)){
+                    //判断如果heatNumber如果为000时再次调用序列号接口/修复跨月流水号问题
+                    if ("000".equals(heatNumber)){
+                        codeData = cxAdminFeginClient.getSerialNumberCode(vo).getData();
+                        heatNumber = codeData.get("code").toString();
+                    }
+                }
             }
 
             apsReportRecordsDo.setHeatnumber(heatNumber);
@@ -1658,29 +1748,44 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
              * 其工序作业的输入物料ID和报工记录的工序作业的输入物料ID相同的所有作业明细,将这些作业明细的待加工料卷批次号去掉“{输入批次号},”
              */
             //更新待加工料卷批次号
-            if (ObjectUtil.isNotEmpty(apsProcessOperationProcessEquDo.getPreviousprocessesids())) {
-                List<ApsProcessOperationProcessEquDo> needUpdateBatchNumber = apsProcessOperationProcessEquService.list(new QueryWrapper<ApsProcessOperationProcessEquDo>().lambda().eq(ApsProcessOperationProcessEquDo::getPreviousprocessesids, apsProcessOperationProcessEquDo.getPreviousprocessesids()));
-                if (ObjectUtil.isNotEmpty(needUpdateBatchNumber)) {
-                    List<ApsProcessOperationProcessEquDo> needUpdateList = new LinkedList<>();
-
-                    for (ApsProcessOperationProcessEquDo processOperationProcessEquDo : needUpdateBatchNumber) {
-                        List<String> oldList = new LinkedList<>();
-                        //原待加工批次号不为空
-                        if (ObjectUtil.isNotEmpty(processOperationProcessEquDo.getBachmaterialprocess())) {
-                            oldList = new LinkedList<>(Arrays.asList(processOperationProcessEquDo.getBachmaterialprocess().split(",")));
-                            oldList.removeAll(inputBatchNumberList);
-
-                            String newBatch = String.join(",", oldList);
-                            ApsProcessOperationProcessEquDo needUpdate = new ApsProcessOperationProcessEquDo();
-                            needUpdate.setId(processOperationProcessEquDo.getId());
-                            needUpdate.setBachmaterialprocess(newBatch);
-                            needUpdateList.add(needUpdate);
-                        }
-                    }
-                    if (ObjectUtil.isNotEmpty(needUpdateList)) {
-                        apsProcessOperationProcessEquService.updateBatchById(needUpdateList);
-                    }
-                }
+//            if (ObjectUtil.isNotEmpty(apsProcessOperationProcessEquDo.getPreviousprocessesids())) {
+//                List<ApsProcessOperationProcessEquDo> needUpdateBatchNumber = apsProcessOperationProcessEquService.list(new QueryWrapper<ApsProcessOperationProcessEquDo>().lambda().eq(ApsProcessOperationProcessEquDo::getPreviousprocessesids, apsProcessOperationProcessEquDo.getPreviousprocessesids()));
+//                if (ObjectUtil.isNotEmpty(needUpdateBatchNumber)) {
+//                    List<ApsProcessOperationProcessEquDo> needUpdateList = new LinkedList<>();
+//
+//                    for (ApsProcessOperationProcessEquDo processOperationProcessEquDo : needUpdateBatchNumber) {
+//                        List<String> oldList = new LinkedList<>();
+//                        //原待加工批次号不为空
+//                        if (ObjectUtil.isNotEmpty(processOperationProcessEquDo.getBachmaterialprocess())) {
+//                            oldList = new LinkedList<>(Arrays.asList(processOperationProcessEquDo.getBachmaterialprocess().split(",")));
+//                            oldList.removeAll(inputBatchNumberList);
+//
+//                            String newBatch = String.join(",", oldList);
+//                            ApsProcessOperationProcessEquDo needUpdate = new ApsProcessOperationProcessEquDo();
+//                            needUpdate.setId(processOperationProcessEquDo.getId());
+//                            needUpdate.setBachmaterialprocess(newBatch);
+//                            needUpdateList.add(needUpdate);
+//                        }
+//                    }
+//                    if (ObjectUtil.isNotEmpty(needUpdateList)) {
+//                        apsProcessOperationProcessEquService.updateBatchById(needUpdateList);
+//                    }
+//                }
+//            }
+            /**
+             * 需求变更:待加工料卷批次号已经分配到对应作业明细不用删除兄弟作业明细的待加工料卷批次号仅删除当前作业作业明细的待加工料卷批次号
+             * 检查完待加工料卷批次号是否改变后,立即更新待加工料卷批次号
+             */
+            List<String> oldList = new LinkedList<>();
+            //原待加工批次号不为空
+            if (ObjectUtil.isNotEmpty(apsProcessOperationProcessEquDo.getBachmaterialprocess())) {
+                oldList = new LinkedList<>(Arrays.asList(apsProcessOperationProcessEquDo.getBachmaterialprocess().split(",")));
+                oldList.removeAll(inputBatchNumberList);
+                String newBatch = String.join(",", oldList);
+                ApsProcessOperationProcessEquDo needUpdate = new ApsProcessOperationProcessEquDo();
+                needUpdate.setId(apsProcessOperationProcessEquDo.getId());
+                needUpdate.setBachmaterialprocess(newBatch);
+                apsProcessOperationProcessEquService.updateById(needUpdate);
             }
 
 
@@ -1709,6 +1814,11 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
             //更新该作业明细已开工卷数=已开工卷数+输入批次号数量,待报工记录ID=该报工记录ID
             needUpdateProcessEqu.setStartingroll(apsProcessOperationProcessEquDo.getStartingroll() + inputBatchNumberList.size());
             needUpdateProcessEqu.setWaitreportid(apsReportRecordsDo.getId());
+            /**
+             * 新加需求:更新“剩余待开工卷数”=计划加工卷数-已开工卷数-已取消卷数
+             */
+            Integer newLeaveWaitWorkRoll = apsProcessOperationProcessEquDo.getPlanprocessrall()-needUpdateProcessEqu.getStartingroll()-apsProcessOperationProcessEquDo.getCancelroll();
+            needUpdateProcessEqu.setLeavewaitworkroll(newLeaveWaitWorkRoll);
 
             apsProcessOperationProcessEquService.updateById(needUpdateProcessEqu);
             //========更新工序作业=============

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

@@ -1,5 +1,6 @@
 package com.rongwei.bscommon.sys.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.rongwei.bscommon.sys.service.ApsBlankOrderService;
@@ -28,7 +29,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-
+import javax.validation.constraints.NotNull;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.BiConsumer;
@@ -652,34 +653,64 @@ public class ReportCheckServiceImpl implements ReportCheckService {
             List<ApsProcessOperationDo> apsProcessOperationDos = nextProcessList.stream()
                     .filter(info -> entryentry.getKey().equals(info.getPlaninputid()))
                     .collect(Collectors.toList());
-            for (ApsProcessOperationDo apsProcessOperationDo : apsProcessOperationDos) {
-                updateOperationDo = new ApsProcessOperationDo();
-                // 更新ID
-                updateOperationDo.setId(apsProcessOperationDo.getId());
-                updateOperationDo.setBachmaterialprocess(strAppendListConvertStr(apsProcessOperationDo.getBachmaterialprocess(), entryentry.getValue()));
-                updateOperationDo.setModifydate(new Date());
-                updateProcessData.add(updateOperationDo);
-                log.debug("将批次号:{}流转给工序作业:{}", entryentry.getValue(), updateOperationDo.getId());
-                for (ApsProcessOperationProcessEquDo equ : nextProcessOperationProcessEquDos) {
-                    if (updateOperationDo.getId().equals(equ.getProcessid())) {
-                        apsProcessOperationProcessEquDo = new ApsProcessOperationProcessEquDo();
-                        apsProcessOperationProcessEquDo.setId(equ.getId());
-                        apsProcessOperationProcessEquDo.setBachmaterialprocess(strAppendListConvertStr(equ.getBachmaterialprocess(), entryentry.getValue()));
-                        apsProcessOperationProcessEquDo.setModifydate(new Date());
-                        log.debug("将批次号:{}流转给工序作业明细:{}", entryentry.getValue(), equ.getId());
-                        updateProcessEquData.add(apsProcessOperationProcessEquDo);
-                    }
+            /**
+              * 需求变更:查找该作业明细的该工序作业输出物料对应的所有后道作业明细,即该报工记录的作业明细的所有后道作业明细中,其工序作业的输入物料ID是报工记录的输出物料ID的所有作业明细,
+              * 根据计划开工时间的先后顺序,将流转组批次号依次分配给这些后道作业明细;注意:是追加批次号到待加工料卷批次号后面
+             */
+            List<String> processIds = apsProcessOperationDos.stream().map(ApsProcessOperationDo::getId).collect(Collectors.toList());
+            List<ApsProcessOperationProcessEquDo> updateProcessEquList = nextProcessOperationProcessEquDos.stream().filter(info -> processIds.contains(info.getProcessid()))
+                    .sorted(Comparator.comparing(ApsProcessOperationProcessEquDo::getPlanstartdate)).collect(Collectors.toList());
+            List<String> outPutNumbers = entryentry.getValue();
+            outPutNumbers.sort(Comparator.comparing(this::toSortBatchNumber));
+            for (ApsProcessOperationProcessEquDo equDo : updateProcessEquList) {
+                if (ObjectUtil.isNotEmpty(outPutNumbers)){
+                    apsProcessOperationProcessEquDo = new ApsProcessOperationProcessEquDo();
+                    apsProcessOperationProcessEquDo.setId(equDo.getId());
+                    apsProcessOperationProcessEquDo.setBachmaterialprocess(strAppendListConvertStr(equDo.getBachmaterialprocess(), Collections.singletonList(outPutNumbers.get(0))));
+                    apsProcessOperationProcessEquDo.setModifydate(new Date());
+                    log.debug("将批次号:{}流转给工序作业明细:{}", outPutNumbers.get(0), equDo.getId());
+                    updateProcessEquData.add(apsProcessOperationProcessEquDo);
+                    outPutNumbers.removeAll(Collections.singletonList(outPutNumbers.get(0)));
                 }
             }
+//            for (ApsProcessOperationDo apsProcessOperationDo : apsProcessOperationDos) {
+//                updateOperationDo = new ApsProcessOperationDo();
+//                // 更新ID
+//                updateOperationDo.setId(apsProcessOperationDo.getId());
+//                updateOperationDo.setBachmaterialprocess(strAppendListConvertStr(apsProcessOperationDo.getBachmaterialprocess(), entryentry.getValue()));
+//                updateOperationDo.setModifydate(new Date());
+//                updateProcessData.add(updateOperationDo);
+//                log.debug("将批次号:{}流转给工序作业:{}", entryentry.getValue(), updateOperationDo.getId());
+////                for (ApsProcessOperationProcessEquDo equ : nextProcessOperationProcessEquDos) {
+////                    if (updateOperationDo.getId().equals(equ.getProcessid())) {
+////                        apsProcessOperationProcessEquDo = new ApsProcessOperationProcessEquDo();
+////                        apsProcessOperationProcessEquDo.setId(equ.getId());
+////                        apsProcessOperationProcessEquDo.setBachmaterialprocess(strAppendListConvertStr(equ.getBachmaterialprocess(), entryentry.getValue()));
+////                        apsProcessOperationProcessEquDo.setModifydate(new Date());
+////                        log.debug("将批次号:{}流转给工序作业明细:{}", entryentry.getValue(), equ.getId());
+////                        updateProcessEquData.add(apsProcessOperationProcessEquDo);
+////                    }
+////                }
+//                /**
+//                 * 需求变更:查找该作业明细的该工序作业输出物料对应的所有后道作业明细,即该报工记录的作业明细的所有后道作业明细中,其工序作业的输入物料ID是报工记录的输出物料ID的所有作业明细,
+//                 * 根据计划开工时间的先后顺序,将流转组批次号依次分配给这些后道作业明细;注意:是追加批次号到待加工料卷批次号后面
+//                 */
+//                ApsProcessOperationDo finalUpdateOperationDo = updateOperationDo;
+//                nextProcessOperationProcessEquDos = nextProcessOperationProcessEquDos.stream().sorted(Comparator.comparing(ApsProcessOperationProcessEquDo::getPlanstartdate)).collect(Collectors.toList());
+//                List<ApsProcessOperationProcessEquDo> updateProcessEquList = nextProcessOperationProcessEquDos.stream().filter(info -> finalUpdateOperationDo.getId().equals(info.getProcessid())).collect(Collectors.toList());
+//
+//            }
         }
+        // 保存工序作业信息
+        // 暂时不用对工序作业表中待加工料卷批次号字段处理
+//        if (!updateProcessData.isEmpty()) {
+//            log.debug("开始更新工序作业信息");
+//            apsProcessOperationService.saveOrUpdateBatch(updateProcessData);
+//        }
         // 保存工序作业明细信息
-        if (!updateProcessData.isEmpty()) {
-            log.debug("开始更新工序作业信息");
-            apsProcessOperationService.saveOrUpdateBatch(updateProcessData);
-        }
         if (!updateProcessEquData.isEmpty()) {
             log.debug("开始更新工序作业明细信息");
-            apsProcessOperationProcessEquService.saveOrUpdateBatch(updateProcessEquData);
+            apsProcessOperationProcessEquService.updateBatchById(updateProcessEquData);
         }
     }
 
@@ -1222,4 +1253,16 @@ public class ReportCheckServiceImpl implements ReportCheckService {
         }
         return result;
     }
+
+    @NotNull
+    private String toSortBatchNumber(@NotNull String batchNumber) {
+        String[] parts = batchNumber.split("-");
+        // 去掉第一个字符串
+        String[] remainingParts = Arrays.copyOfRange(parts, 1, parts.length);
+        // 将剩余字符串不足3位的补0后拼起来
+        String joinedString = Arrays.stream(remainingParts)
+                .map(part -> String.format("%03d", Integer.parseInt(part)))
+                .collect(Collectors.joining("-"));
+        return parts[0] + '-' + joinedString;
+    }
 }