Browse Source

排程数据组装优化

fangpy 9 months ago
parent
commit
7fee0e1768

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

@@ -65,6 +65,9 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
             "BLANKID in (SELECT ID FROM aps_blank_order where DELETED='0' and SCHEDULINGSTATUS='10' and ID in (${hasIds}))")
     void setLockMarkNullByToAps(@Param("hasIds") String hasIds);
 
+    @Update("delete from aps_process_operation_process_equ where BLANKID in (${blankids})")
+    void deleteBlankDetail(@Param("blankids") String blankids);
+
     @Select("UPDATE aps_process_operation_process_equ set LOCKMARK='n' where DELETED='0' and BLANKID in (${hasIds}) " +
             "and PROCESSID NOT IN (select ID from aps_process_operation where DELETED='0' and BLANKID in (${hasIds}) AND LOCKMARK='y')")
     void setProDetailLockMark(@Param("hasIds") String hasIds);

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

@@ -581,9 +581,14 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         // 先删除所有作业的明细
         List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
 //        processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
-//                .in(ApsProcessOperationProcessEquDo::getBlankid, blankids).eq(ApsProcessOperationProcessEquDo::getLockmark, "n"));
-        processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+//                .in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
+        // 查询坯料计划所有已存在的作业明细
+        List<ApsProcessOperationProcessEquDo> equDos = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                 .in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
+        // 物理删除作业明细
+        String idStrs = CollUtil.join(blankids, "','");
+        idStrs = "'" + idStrs + "'";
+        apsBlankOrderDao.deleteBlankDetail(idStrs);
         logger.info("作业明细删除结束..: " + blankids);
         // 排程结果保存
         List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
@@ -591,6 +596,11 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         List<ProductionProcesses> lastProcess = new ArrayList<>();
         if (productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size() > 0) {
             for (ProductionProcesses process : productionScheduleRetVo.getProcesses()) {
+                ApsProcessOperationProcessEquDo hasEqu = null;
+                if(equDos != null && equDos.size()>0){
+                    List<ApsProcessOperationProcessEquDo> equid = equDos.stream().filter(v -> v.getId().equals(process.getId())).collect(Collectors.toList());
+                    hasEqu = equid.get(0);
+                }
                 // 非合并生产工序
                 if (process.getAluminumCoils() == null) {
                     ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
@@ -618,6 +628,19 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     apsProcessOperationProcessEqu.setPreviousprocessesids(CollUtil.join(process.getPreviousProcessesIds(), ","));
                     apsProcessOperationProcessEqu.setNextprocessesids(CollUtil.join(process.getNextProcessesIds(), ","));
                     apsProcessOperationProcessEqu.setLockmark("y");
+                    if(hasEqu != null){
+                        apsProcessOperationProcessEqu.setClosestatus(hasEqu.getClosestatus());
+                        apsProcessOperationProcessEqu.setPlanprocessrall(hasEqu.getPlanprocessrall());
+                        apsProcessOperationProcessEqu.setStartingroll(hasEqu.getStartingroll());
+                        apsProcessOperationProcessEqu.setReportroll(hasEqu.getReportroll());
+                        apsProcessOperationProcessEqu.setCheckoutroll(hasEqu.getCheckoutroll());
+                        apsProcessOperationProcessEqu.setUnfinishroll(hasEqu.getUnfinishroll());
+                        apsProcessOperationProcessEqu.setWorkstatus(hasEqu.getWorkstatus());
+                        apsProcessOperationProcessEqu.setBachmaterialprocess(hasEqu.getBachmaterialprocess());
+                        apsProcessOperationProcessEqu.setWaitreportid(hasEqu.getWaitreportid());
+                        apsProcessOperationProcessEqu.setActualstartdate(hasEqu.getActualstartdate());
+                        apsProcessOperationProcessEqu.setActualfinishdate(hasEqu.getActualfinishdate());
+                    }
                     apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
                 }
                 // 合并生产工序
@@ -703,7 +726,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                             ApsBlankOrderDo blankOrder = this.getById(order.getId());
                             ApsBlankOrderDo updateBlank = new ApsBlankOrderDo();
                             updateBlank.setId(order.getId());
-                            updateBlank.setSchedulingstatus(TO_BE_PUBLISHED);
+                            if(StringUtils.isBlank(nowOrder.getSchedulingstatus()) || nowOrder.getSchedulingstatus().equals(TO_BE_SCHEDULED)){
+                                updateBlank.setSchedulingstatus(TO_BE_PUBLISHED);
+                            }
                             updateBlank.setScheduledatestart(endDate);
                             updateBlank.setScheduledateend(endDate);
                             if (nowOrder != null && nowOrder.getPromisedatestart() == null) {
@@ -750,7 +775,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
 
             //更新生产状态为“待发布”(20)
-            updateProductStatusByOrderIds(apsBlankOrders);
+            List<ApsBlankOrderVo> toupstatus = apsBlankOrders.stream().filter(v -> StringUtils.isBlank(v.getIfcp()) || "N".equals(v.getIfcp())).collect(Collectors.toList());
+            updateProductStatusByOrderIds(toupstatus);
             // 自动加锁坯料计划下的工序作业
             apsProcessOperationService.update(new LambdaUpdateWrapper<ApsProcessOperationDo>().in(ApsProcessOperationDo::getBlankid, blankKeys).set(ApsProcessOperationDo::getLockmark, "y"));
             // 自动加锁坯料计划下的排程作业明细

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

@@ -119,21 +119,24 @@ public class ApsServiceImpl implements ApsService {
                 if("cd".equals(apsType) && apsBlankOrders != null && apsBlankOrders.size()>0){
                     for (ApsBlankOrderVo apsBlankOrder : apsBlankOrders) {
                         apsBlankOrder.setCdbs(1);
+                        apsBlankOrder.setIfcp("Y");
                     }
                 }else{
                     for (ApsBlankOrderVo apsBlankOrder : apsBlankOrders) {
                         apsBlankOrder.setCdbs(2);
+                        apsBlankOrder.setIfcp("N");
                     }
                 }
                 List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getOrdersHasNotLockProcess(idStrs,tenantId);
                 if (fbNotLock != null && fbNotLock.size() > 0) {
                     for (ApsBlankOrderVo apsBlankOrderVo : fbNotLock) {
                         apsBlankOrderVo.setCdbs(2);
+                        apsBlankOrderVo.setIfcp("Y");
                     }
                     apsBlankOrders.addAll(fbNotLock);
                 }
                 apsOrderScheduleNew(apsBlankOrders,currentUser);
-//                apsOrderSchedule(apsBlankOrders);
+//                apsOrderSchedule(apsBlankOrders,currentUser);
             } catch (Exception e) {
                 e.printStackTrace();
                 logger.info("排程异常",e);
@@ -141,7 +144,7 @@ public class ApsServiceImpl implements ApsService {
                 if(e instanceof CustomException){
                     msg = e.getMessage();
                 }
-                currentUser.setRoption(msg);
+                currentUser.setRoption(msg+" "+DateUtil.formatDateTime(new Date()));
                 redisService.redisCatchInit("apsUser-"+tenantId,currentUser,3600*24);
                 throw e;
             } finally {
@@ -152,7 +155,7 @@ public class ApsServiceImpl implements ApsService {
         }
     }
 
-    private void apsOrderSchedule(List<ApsBlankOrderVo> apsBlankOrders){
+    private void apsOrderSchedule(List<ApsBlankOrderVo> apsBlankOrders,SysUserVo currentUser){
         // 坯料计划排序
         Collections.sort(apsBlankOrders,(v1,v2)->{
             // 合金
@@ -264,47 +267,60 @@ public class ApsServiceImpl implements ApsService {
         List<ProductionScheduleVo> apsProductionSchedules = new ArrayList<>();
         // 多卷先排
         apsBlankOrders.forEach((bo)->{
-            List<ApsBlankOrderVo> v = new ArrayList<>();
-            v.add(bo);
-            dataMapOrder.put(bo.getId(),bo);
+            try{
+                List<ApsBlankOrderVo> v = new ArrayList<>();
+                v.add(bo);
+                dataMapOrder.put(bo.getId(),bo);
 
-            // 模型转换
-            ProductionScheduleVo productionScheduleVo = apsProductionScheduleInit(v);
-            productionScheduleVos.add(productionScheduleVo);
-            dataMap.put(productionScheduleVo.getProductionScheduleId(),v);
+                // 模型转换
+                ProductionScheduleVo productionScheduleVo = apsProductionScheduleInit(v);
+                productionScheduleVos.add(productionScheduleVo);
+                dataMap.put(productionScheduleVo.getProductionScheduleId(),v);
 //                        int mergeThNum = mergeThNum(bo, productionScheduleVo);
-            // 排程计划设备集合
-            List<Equipment> equipmentList1 = new ArrayList<>();
-            List<ApsProcessOperationDo> operationDos1 = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
-                    .in(ApsProcessOperationDo::getBlankid, bo.getId()));
-            List<String> blankids = new ArrayList<>();
-            blankids.add(bo.getId());
-            for (ApsProcessOperationDo operationDo : operationDos1) {
-                List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankids,null,productionScheduleVo,apsConfigs.get(0));
-            }
-            productionScheduleVo.setEquipmentList(equipmentList1);
-            apsProductionSchedules.add(productionScheduleVo);
+                // 排程计划设备集合
+                List<Equipment> equipmentList1 = new ArrayList<>();
+                List<ApsProcessOperationDo> operationDos1 = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
+                        .in(ApsProcessOperationDo::getBlankid, bo.getId()));
+                List<String> blankids = new ArrayList<>();
+                blankids.add(bo.getId());
+                for (ApsProcessOperationDo operationDo : operationDos1) {
+                    List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankids,null,productionScheduleVo,apsConfigs.get(0));
+                }
+                productionScheduleVo.setEquipmentList(equipmentList1);
+                apsProductionSchedules.add(productionScheduleVo);
 
-            System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
-            logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
-            // APS平台排程接口调用
-            ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
-            if (!"200".equals(productionScheduleRetVo.getCode())) {
-                logger.info("排程异常,坯料计划ID:" + bo.getId());
-                // 排程异常后恢复历史排程结果为锁定状态
-                processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark,"y")
-                        .eq(ApsProcessOperationProcessEquDo::getBlankid,bo.getId()));
-                // 没有可排程工序的订单跳过
-                if("没有可排程的工序".equals(productionScheduleRetVo.getMsg())){
-                    logger.info("排程异常:没有可排程的工序,坯料计划编号:" + bo.getBlanknumber());
+                System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
+                logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
+                // APS平台排程接口调用
+                ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
+                if (!"200".equals(productionScheduleRetVo.getCode())) {
+                    logger.info("排程异常,坯料计划ID:" + bo.getId());
+                    // 排程异常后恢复历史排程结果为锁定状态
+                    processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark,"y")
+                            .eq(ApsProcessOperationProcessEquDo::getBlankid,bo.getId()));
+                    // 没有可排程工序的订单跳过
+                    if("没有可排程的工序".equals(productionScheduleRetVo.getMsg())){
+                        logger.info("排程异常:没有可排程的工序,坯料计划编号:" + bo.getBlanknumber());
+                    }else{
+                        throw new CustomException(productionScheduleRetVo.getMsg()+" "+DateUtil.formatDateTime(new Date()));
+                    }
                 }else{
-                    throw new CustomException(productionScheduleRetVo.getMsg());
+                    // 获取坯料计划
+                    List<ApsBlankOrderVo> apsBlankOrderss = new ArrayList<>();
+                    apsBlankOrderss.add(bo);
+                    apsBlankOrderService.apsAfter(productionScheduleRetVo,apsBlankOrderss);
                 }
-            }else{
-                // 获取坯料计划
-                List<ApsBlankOrderVo> apsBlankOrderss = new ArrayList<>();
-                apsBlankOrderss.add(bo);
-                apsBlankOrderService.apsAfter(productionScheduleRetVo,apsBlankOrderss);
+            }catch (Exception e) {
+                e.printStackTrace();
+                logger.info("排程异常",e);
+                String blankNos = bo.getBlanknumber();
+                String msg = "排程服务异常(坯料计划号:"+blankNos+")"+DateUtil.formatDateTime(new Date());
+                if(e instanceof CustomException){
+                    msg = e.getMessage();
+                }
+                currentUser.setRoption(msg+" "+DateUtil.formatDateTime(new Date()));
+                String tenantId = CXCommonUtils.getCurrentUserFactoryId(currentUser);
+                redisService.redisCatchInit("apsUser-"+tenantId,currentUser,3600*24);
             }
         });
     }
@@ -330,11 +346,11 @@ public class ApsServiceImpl implements ApsService {
                             blankNos = blankNos+";"+apsBlankOrderVo.getBlanknumber();
                         }
                     }
-                    String msg = "排程服务异常(坯料计划号:"+blankNos+")";
+                    String msg = "排程服务异常(坯料计划号:"+blankNos+")"+DateUtil.formatDateTime(new Date());
                     if(e instanceof CustomException){
                         msg = e.getMessage();
                     }
-                    currentUser.setRoption(msg);
+                    currentUser.setRoption(msg+" "+DateUtil.formatDateTime(new Date()));
                     String tenantId = CXCommonUtils.getCurrentUserFactoryId(currentUser);
                     redisService.redisCatchInit("apsUser-"+tenantId,currentUser,3600*24);
 //                    throw e;
@@ -481,7 +497,7 @@ public class ApsServiceImpl implements ApsService {
             }catch(Exception e){
                 logger.info("坯料计划:+bo.getBlanknumber() + ;排程数据初始化异常",e);
                 String msg = "坯料计划:"+bo.getBlanknumber() + ";排程数据初始化异常";
-                throw new CustomException(msg);
+                throw new CustomException(msg+" "+DateUtil.formatDateTime(new Date()));
             }
         });
 
@@ -537,7 +553,7 @@ public class ApsServiceImpl implements ApsService {
                 if("没有可排程的工序".equals(productionScheduleRetVo.getMsg())){
                     logger.info("排程异常:没有可排程的工序,坯料计划编号:" + blankOrderIds);
                 }else{
-                    throw new CustomException(productionScheduleRetVo.getMsg());
+                    throw new CustomException(productionScheduleRetVo.getMsg()+" "+DateUtil.formatDateTime(new Date()));
                 }
             }else{
                 // 获取坯料计划
@@ -654,6 +670,13 @@ public class ApsServiceImpl implements ApsService {
     public ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders) {
         // 待排程坯料计划ID集合
         List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
+        // 查询当前坯料计划的历史排程明细
+        List<ApsProcessOperationProcessEquDo> apopes = processOperationProcessEquService.list(
+                new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                        .in(ApsProcessOperationProcessEquDo::getBlankid,blankids)
+                        .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate));
+        Map<String, List<ApsProcessOperationProcessEquDo>> proEqus = apopes.stream().collect(Collectors.groupingBy(ApsProcessOperationProcessEquDo::getProcessid));
+
         ProductionScheduleVo productionScheduleVo = productionScheduleVoInit();
         // 排程计划工序任务集合
         List<ProductionProcesses> processesList = new ArrayList<>();
@@ -702,7 +725,7 @@ public class ApsServiceImpl implements ApsService {
                     // 设备列表初始化
 //                    List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList,eqMaps,blankids,productionScheduleVo,apsScheduleConfig);
                     // 工序作业相关数据初始化
-                    productionProcessesInit(operationDo,produceOrder,processesList,operationProductionProcesses,apsBlankOrderVo,productionScheduleVo);
+                    productionProcessesInit(operationDo,produceOrder,processesList,operationProductionProcesses,apsBlankOrderVo,productionScheduleVo,proEqus);
                 }
                 // 前后关联关系初始化
                 processesRelationInit(rootOperationDo,operationProductionProcesses,operationMaps,apsBlankOrderVo);
@@ -755,7 +778,7 @@ public class ApsServiceImpl implements ApsService {
             }
             String[] sbIds = canchoosedeviceid.split(",");
             for (String equIds : sbIds) {
-                if(equIds.equals("09be204864014e88ac19d5ac9950fa32")){
+                if(equIds.equals("0001be252874536843730b100051")){
                     System.out.println(equIds);
                 }
                 AspCheckItemsDo checkItemsD = eqMaps.get(equIds);
@@ -1055,7 +1078,8 @@ public class ApsServiceImpl implements ApsService {
      * @param operationProductionProcesses
      */
     private void productionProcessesInit(ApsProcessOperationDo operationDo,ProduceOrder produceOrder
-            ,List<ProductionProcesses> processesList,Map<String,List<ProductionProcesses>> operationProductionProcesses,ApsBlankOrderVo apsBlankOrderVo,ProductionScheduleVo productionScheduleVo){
+            ,List<ProductionProcesses> processesList,Map<String,List<ProductionProcesses>> operationProductionProcesses
+            ,ApsBlankOrderVo apsBlankOrderVo,ProductionScheduleVo productionScheduleVo,Map<String, List<ApsProcessOperationProcessEquDo>> proEqus){
         // 输出物料
         List<ApsProcessOperationOutMaterDo> outMaterDos = apsProcessOperationOutMaterService.list(new LambdaQueryWrapper<ApsProcessOperationOutMaterDo>()
                 .eq(ApsProcessOperationOutMaterDo::getMainid, operationDo.getId()));
@@ -1072,6 +1096,8 @@ public class ApsServiceImpl implements ApsService {
                         .eq(ApsProcessOperationProcessEquDo::getProcessid, operationDo.getId()).orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate));
                 for (ApsProcessOperationProcessEquDo processDetail : processDetails) {
                     ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos,apsBlankOrderVo);
+                    // 锁定的作业保留作业ID
+                    processes.setId(processDetail.getId());
                     processes.setIfLock(true);
                     processes.setEquipmentId(processDetail.getProcessdeviceid());
                     List<String> opeqs = new ArrayList<>();
@@ -1107,6 +1133,8 @@ public class ApsServiceImpl implements ApsService {
                     operationProcess.add(processes);
                 }
             }else{
+                // 已排程的当前作业
+                List<ApsProcessOperationProcessEquDo> processEquDos = proEqus.get(operationDo.getId());
                 if("小卷成退".equals(operationDo.getProcess())){
                     String previousprocessid = operationDo.getPreviousprocessid();
                     ApsProcessOperationDo preprocess = apsProcessOperationService.getById(previousprocessid);
@@ -1118,6 +1146,10 @@ public class ApsServiceImpl implements ApsService {
                     Integer js = operationDo.getPlanprocessrall() / planprocessrall;
                     for (Integer i = 0; i < planprocessrall; i++) {
                         ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos,apsBlankOrderVo);
+                        // 已排程的作业明细数据保持ID不变
+                        if(processEquDos != null && i<processEquDos.size()){
+                            processes.setId(processEquDos.get(i).getId());
+                        }
                         if(apsBlankOrderVo.getPlanhavematerialdate() != null){
                             // 全局配置
                             ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
@@ -1161,6 +1193,10 @@ public class ApsServiceImpl implements ApsService {
                     Integer js = operationDo.getPlanprocessrall() / planprocessrall;
                     for (Integer i = 0; i < planprocessrall; i++) {
                         ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos,apsBlankOrderVo);
+                        // 已排程的作业明细数据保持ID不变
+                        if(processEquDos != null && i<processEquDos.size()){
+                            processes.setId(processEquDos.get(i).getId());
+                        }
                         if(apsBlankOrderVo.getPlanhavematerialdate() != null){
                             // 全局配置
                             ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
@@ -1192,6 +1228,10 @@ public class ApsServiceImpl implements ApsService {
                 }else{
                     for (Integer i = 0; i < operationDo.getPlanprocessrall(); i++) {
                         ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos,apsBlankOrderVo);
+                        // 已排程的作业明细数据保持ID不变
+                        if(processEquDos != null && i<processEquDos.size()){
+                            processes.setId(processEquDos.get(i).getId());
+                        }
                         if(apsBlankOrderVo.getPlanhavematerialdate() != null){
                             // 全局配置
                             ApsOverallConfig apsOverallConfig = new ApsOverallConfig();

+ 3 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsBlankOrderVo.java

@@ -17,4 +17,7 @@ public class ApsBlankOrderVo extends ApsBlankOrderDo {
     // 合金加合金状态
     private String volumeMetalAndState;
 
+    // 是否重排订单:Y:是,N:否
+    private String ifcp;
+
 }