瀏覽代碼

aps-一键排程、重新排程接口,排完后增加修改生产状态

sucheng 1 年之前
父節點
當前提交
3a70b414bd

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

@@ -47,4 +47,7 @@ public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
     void cancelSchedulingUpdate(@Param("idList") List<String> idList);
 
     void reportCheckUpdateJobStatus(@Param("id") String id);
+
+    @Select("select PRODUCTID from aps_process_output_product where DELETED = 0 AND BLANKID in (${idStrs}) group by PRODUCTID")
+    List<String> selectOutputProductIdList(@Param("idStrs") String idStrs);
 }

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

@@ -33,4 +33,5 @@ public interface ApsBlankOrderService extends IService<ApsBlankOrderDo> {
 
     ProductionScheduleVo apsPlanModelSet(List<ApsBlankOrderVo> apsBlankOrders);
 
+    void blankApsCancel(List<String> apsBlankIds);
 }

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

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONConfig;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -72,6 +73,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     private ApsProductDetailService apsProductDetailService;
     @Autowired
     private ApsProductDetailDao apsProductDetailDao;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void test() {
@@ -100,44 +102,39 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         }
         // 校验取消的订单中是否存在已加工的工序作业
         List<String> startWorkOrderNo = apsProcessOperationDao.getStartWorkById(apsProductionOrderIds);
-        if (!startWorkOrderNo.isEmpty()){
-            throw new CustomException(CollUtil.join(startWorkOrderNo, ",")+" 以上客户所对应的订单存在已开工的坯料计划,不可以取消排程=!");
+        if (!startWorkOrderNo.isEmpty()) {
+            throw new CustomException(CollUtil.join(startWorkOrderNo, ",") + " 以上客户所对应的订单存在已开工的坯料计划,不可以取消排程=!");
         }
         List<String> blankids = blankOrderDos.stream().map(ApsBlankOrderDo::getId).collect(Collectors.toList());
-        // 删除工序作业和工序作业明备份数据
-        apsProcessOperationBackupDao.deletedByBlankId(blankids);
-        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankids);
-        // 更工序作业生产状态=待排程,是否锁定=否,
-        apsProcessOperationService.remove(new LambdaQueryWrapper<ApsProcessOperationDo>().in(ApsProcessOperationDo::getBlankid,blankids));
-        // 清空作业明细
-        processOperationProcessEquService.remove(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
-        // 更新订单的排程状态
-        List<ApsProductionOrderDo> productionOrderDos = new ArrayList<>();
-        for (String apsProductionOrderId : apsProductionOrderIds) {
-            ApsProductionOrderDo productionOrderDo = new ApsProductionOrderDo();
-            productionOrderDo.setId(apsProductionOrderId);
-            productionOrderDo.setSchedulstatus(SaveConstans.SchedulstatusTyep.SCHEDULSTATUS_TOSCHEDULE);
-            productionOrderDo.setScheduledeliverydate(null);
-            productionOrderDo.setProductionstatus(TO_BE_SCHEDULED);
-            productionOrderDos.add(productionOrderDo);
+        //清除排程备份和状态修改
+        deleteBackup(blankids, apsProductionOrderIds);
+    }
+
+
+    @Override
+    public void blankApsCancel(List<String> apsBlankIds) {
+        if (ObjectUtil.isEmpty(apsBlankIds)) {
+            log.debug("坯料计划排程取消参数为空");
+            return;
         }
-        // 更新生产订单的状态
-        apsProductionOrderService.updateBatchById(productionOrderDos);
-        // 更新坯料计划的状态
-        this.baseMapper.cancelSchedulingUpdate(blankids);
-        // 更新坯料计划产品明细的的生产状态
-        apsProductDetailDao.updateProductstatus(apsProductionOrderIds);
+        //获取订单ID
+        List<ApsBlankOrderDo> blankOrderDoList = this.list(new QueryWrapper<ApsBlankOrderDo>().lambda().in(ApsBlankOrderDo::getId, apsBlankIds));
+        Set<String> orderIds = blankOrderDoList.stream().map(ApsBlankOrderDo::getProductionorderid).collect(Collectors.toSet());
+
+        //清除排程备份
+        deleteBackup(apsBlankIds, new ArrayList<>(orderIds));
     }
 
     /**
      * 锁定、解锁
+     *
      * @param orderLockVo
      * @throws Exception
      */
     @Override
     public void orderLock(OrderLockVo orderLockVo) throws Exception {
-        if(StringUtils.isNotBlank(orderLockVo.getLockMark())){
-            if(orderLockVo.getBlackOrderId() != null && orderLockVo.getBlackOrderId().size()>0){
+        if (StringUtils.isNotBlank(orderLockVo.getLockMark())) {
+            if (orderLockVo.getBlackOrderId() != null && orderLockVo.getBlackOrderId().size() > 0) {
                 // 组装待更新坯料计划实体
                 List<ApsBlankOrderDo> blankOrderDos = new ArrayList<>();
                 List<String> blankids = new ArrayList<>();
@@ -149,13 +146,13 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     blankids.add(id);
                 }
                 // 坯料计划锁定标识更新
-                if(blankOrderDos != null && blankOrderDos.size()>0){
+                if (blankOrderDos != null && blankOrderDos.size() > 0) {
                     this.updateBatchById(blankOrderDos);
                 }
                 // 工序作业锁定标识更新
-                apsProcessOperationService.update(new LambdaQueryWrapper<ApsProcessOperationDo>().in(ApsProcessOperationDo::getBlankid,blankids));
+                apsProcessOperationService.update(new LambdaQueryWrapper<ApsProcessOperationDo>().in(ApsProcessOperationDo::getBlankid, blankids));
                 // 工序作业排程计划锁定
-                processOperationProcessEquService.update(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid,blankids));
+                processOperationProcessEquService.update(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
             }
         }
     }
@@ -165,7 +162,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
      * 所有待发布的未锁定的订单重新排程
      */
     @Override
-    public void apsReScheduling() throws Exception{
+    public void apsReScheduling() throws Exception {
         //获取当前用户的所属工厂
         SysUserVo currentUser = CXCommonUtils.getCurrentUser();
         String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
@@ -178,14 +175,15 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
     /**
      * 订单批量排程
+     *
      * @param apsPlanVo
      */
-    public void apsScheduling(ApsPlanVo apsPlanVo) throws Exception{
+    public void apsScheduling(ApsPlanVo apsPlanVo) throws Exception {
         List<ApsBlankOrderVo> apsBlankOrders = new ArrayList<>();
-        if(apsPlanVo.getApsProductionOrders() != null){
+        if (apsPlanVo.getApsProductionOrders() != null) {
             for (ApsProductionOrderDo apsProductionOrder : apsPlanVo.getApsProductionOrders()) {
                 List<ApsBlankOrderVo> byOrderId = apsBlankOrderDao.getByOrderId(apsProductionOrder.getId());
-                if(byOrderId != null && byOrderId.size()>0){
+                if (byOrderId != null && byOrderId.size() > 0) {
                     apsBlankOrders.addAll(byOrderId);
                 }
             }
@@ -198,40 +196,41 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
     /**
      * 生产订单排程
+     *
      * @param apsBlankOrders
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void blankOrderAps(List<ApsBlankOrderVo> apsBlankOrders){
+    public void blankOrderAps(List<ApsBlankOrderVo> apsBlankOrders) {
         assert apsBlankOrders != null : "排程订单不能为空";
         // 合并待发布未锁定的订单一起排程
         List<String> hasIds = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
         String idStrs = CollUtil.join(hasIds, "','");
-        idStrs = "'"+idStrs+"'";
+        idStrs = "'" + idStrs + "'";
         // 查询待发布未锁定的所有坯料计划
         List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getFbNotLock(idStrs);
-        if(fbNotLock != null && fbNotLock.size()>0){
+        if (fbNotLock != null && fbNotLock.size() > 0) {
             apsBlankOrders.addAll(fbNotLock);
         }
         // 先删除所有作业的明细
-        List<String> blankids = apsBlankOrders.stream().map(v->v.getId()).collect(Collectors.toList());
-        processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid,blankids));
+        List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
+        processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
         // 模型转换
         ProductionScheduleVo productionScheduleVo = apsPlanModelSet(apsBlankOrders);
         JSONConfig jsonConfig = JSONConfig.create();
         jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
-        System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo,jsonConfig));
-        logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo,jsonConfig));
+        System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
+        logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
         // APS平台排程接口调用
         ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
         // 排程结果保存
         List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
         // 最后节点集合
         List<ProductionProcesses> lastProcess = new ArrayList<>();
-        if(productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size()>0){
+        if (productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size() > 0) {
             for (ProductionProcesses process : productionScheduleRetVo.getProcesses()) {
                 // 非合并生产工序
-                if(process.getAluminumCoils() == null){
+                if (process.getAluminumCoils() == null) {
                     ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
                     apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
                     apsProcessOperationProcessEqu.setProcessid(process.getId());
@@ -252,17 +251,17 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 // 合并生产工序
                 else {
                     // 保存到明细表
-                    Map<String,List<AluminumCoil>> bsAl = new HashMap<>();
+                    Map<String, List<AluminumCoil>> bsAl = new HashMap<>();
                     for (AluminumCoil aluminumCoil : process.getAluminumCoils()) {
-                        if(bsAl.containsKey(aluminumCoil.getBsId())){
+                        if (bsAl.containsKey(aluminumCoil.getBsId())) {
                             bsAl.get(aluminumCoil.getBsId()).add(aluminumCoil);
-                        }else{
+                        } else {
                             List<AluminumCoil> coils = new ArrayList<>();
                             coils.add(aluminumCoil);
-                            bsAl.put(aluminumCoil.getBsId(),coils);
+                            bsAl.put(aluminumCoil.getBsId(), coils);
                         }
                     }
-                    bsAl.forEach((k,v)->{
+                    bsAl.forEach((k, v) -> {
                         ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
                         apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
                         apsProcessOperationProcessEqu.setProcessid(k);
@@ -283,42 +282,42 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 }
 
                 // 是否为最后一个节点
-                if(process.getNextProcessesIds() == null || process.getNextProcessesIds().size() == 0){
+                if (process.getNextProcessesIds() == null || process.getNextProcessesIds().size() == 0) {
                     lastProcess.add(process);
                 }
             }
         }
-        if(apsProcessOperationProcessEquDos != null && apsProcessOperationProcessEquDos.size()>0){
+        if (apsProcessOperationProcessEquDos != null && apsProcessOperationProcessEquDos.size() > 0) {
             // 再保存新数据
             processOperationProcessEquService.saveBatch(apsProcessOperationProcessEquDos);
             // 回写订单排程交货期
-            Map<String,Date> orderDeliveryTime = new HashMap<>();
+            Map<String, Date> orderDeliveryTime = new HashMap<>();
             for (ProductionProcesses process : lastProcess) {
                 List<ProduceOrder> produceOrder = process.getProduceOrder();
-                if(produceOrder != null && produceOrder.size()>0){
+                if (produceOrder != null && produceOrder.size() > 0) {
                     for (ProduceOrder order : produceOrder) {
                         Date endDate = Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant());
                         ApsBlankOrderDo blankOrder = this.getById(order.getId());
-                        if(orderDeliveryTime.containsKey(blankOrder.getProductionorderid())){
+                        if (orderDeliveryTime.containsKey(blankOrder.getProductionorderid())) {
                             // 对比取最大值
-                            if(endDate.compareTo(orderDeliveryTime.get(blankOrder.getProductionorderid()))>0){
-                                orderDeliveryTime.put(blankOrder.getProductionorderid(),endDate);
+                            if (endDate.compareTo(orderDeliveryTime.get(blankOrder.getProductionorderid())) > 0) {
+                                orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
                             }
-                        }else{
-                            orderDeliveryTime.put(blankOrder.getProductionorderid(),endDate);
+                        } else {
+                            orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
                         }
                     }
                 }
             }
             // 更新订单的排程交货期、排程状态
-            if(orderDeliveryTime.size()>0){
-                orderDeliveryTime.forEach((k, v)->{
+            if (orderDeliveryTime.size() > 0) {
+                orderDeliveryTime.forEach((k, v) -> {
                     ApsProductionOrderDo productionOrderDo = apsProductionOrderService.getById(k);
                     ApsProductionOrderDo apsProductionOrderDo = new ApsProductionOrderDo();
                     apsProductionOrderDo.setId(k);
                     apsProductionOrderDo.setScheduledeliverydate(v);
-                    if(productionOrderDo.getDeliverytime() != null && productionOrderDo.getDeliverytime()>0 && v != null){
-                        apsProductionOrderDo.setScheduledeliverydate(DateUtil.offsetHour(v,productionOrderDo.getDeliverytime()));
+                    if (productionOrderDo.getDeliverytime() != null && productionOrderDo.getDeliverytime() > 0 && v != null) {
+                        apsProductionOrderDo.setScheduledeliverydate(DateUtil.offsetHour(v, productionOrderDo.getDeliverytime()));
                     }
                     // 排程状态更新为待发布
                     apsProductionOrderDo.setSchedulstatus(SaveConstans.SchedulstatusTyep.SCHEDULSTATUS_TORELEASE);
@@ -352,12 +351,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankIdList);
         //增加备份
         List<List<String>> partition1 = Lists.partition(apsProcessOperationIds, 500);
-        partition1.forEach(data->{
+        partition1.forEach(data -> {
             apsProcessOperationBackupDao.processOperationBackup(apsProcessOperationIds,
                     currentUser == null ? null : currentUser.getId(), currentUser == null ? null : currentUser.getName());
         });
         List<List<ApsProcessOperationProcessEquDo>> partition = Lists.partition(apsProcessOperationProcessEquDos, 100);
-        partition.forEach(data->{
+        partition.forEach(data -> {
             apsProcessOperationProcessEquBackupDao.processOperationEquBackup(apsProcessOperationProcessEquDos,
                     currentUser == null ? null : currentUser.getId(), currentUser == null ? null : currentUser.getName());
         });
@@ -384,23 +383,23 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             productionScheduleVo.setRoamTime(roamTime);
             // 排程计划开始时间
             int a = 8;
-            if(apsScheduleConfig.getStartschedulerun() != null){
+            if (apsScheduleConfig.getStartschedulerun() != null) {
                 a = apsScheduleConfig.getStartschedulerun();
             }
-            if(apsScheduleConfig.getApsplanstartdate() != null){
+            if (apsScheduleConfig.getApsplanstartdate() != null) {
                 productionScheduleVo.setApsPlanStartDate(apsScheduleConfig.getApsplanstartdate());
-            }else{
-                productionScheduleVo.setApsPlanStartDate(DateUtil.date().offset(DateField.HOUR,a));
+            } else {
+                productionScheduleVo.setApsPlanStartDate(DateUtil.date().offset(DateField.HOUR, a));
             }
-        }else{
+        } else {
             throw new CustomException("排程参数缺失");
         }
 
         // 所有设备
         List<AspCheckItemsDo> eqs = aspCheckItemsService.list(new LambdaQueryWrapper<>());
-        Map<String,AspCheckItemsDo> eqMaps = new HashMap<>();
+        Map<String, AspCheckItemsDo> eqMaps = new HashMap<>();
         for (AspCheckItemsDo eq : eqs) {
-            eqMaps.put(eq.getId(),eq);
+            eqMaps.put(eq.getId(), eq);
         }
         // 排程计划设备集合
         List<Equipment> equipmentList = new ArrayList<>();
@@ -408,10 +407,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         List<ProductionProcesses> processesList = new ArrayList<>();
         // 待合并生产的订单工序
         List<ApsProcessOperationVo> processOperationMs = new ArrayList<>();
-        if(apsBlankOrders != null && apsBlankOrders.size()>0){
+        if (apsBlankOrders != null && apsBlankOrders.size() > 0) {
             for (ApsBlankOrderVo apsBlankOrderVo : apsBlankOrders) {
                 // 坯料计划订单
-                ProduceOrder produceOrder = new ProduceOrder(apsBlankOrderVo.getId(),apsBlankOrderVo.getMaterialname(),apsBlankOrderVo.getDeliverydate());
+                ProduceOrder produceOrder = new ProduceOrder(apsBlankOrderVo.getId(), apsBlankOrderVo.getMaterialname(), apsBlankOrderVo.getDeliverydate());
                 // 获取所有订单工序
                 List<ApsProcessOperationDo> operationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
                         .eq(ApsProcessOperationDo::getBlankid, apsBlankOrderVo.getId()));
@@ -424,15 +423,15 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     String productprocess = operationDo.getProcessway();
                     // 设备列表
                     List<String> optionalEquipments = new ArrayList<>();
-                    if(StringUtils.isNotBlank(operationDo.getCanchoosedeviceid())){
+                    if (StringUtils.isNotBlank(operationDo.getCanchoosedeviceid())) {
                         String[] sbIds = operationDo.getCanchoosedeviceid().split(",");
                         for (String equIds : sbIds) {
                             AspCheckItemsDo checkItemsD = eqMaps.get(equIds);
-                            if(checkItemsD != null){
+                            if (checkItemsD != null) {
                                 optionalEquipments.add(equIds);
                                 List<Equipment> eqpts = equipmentList.stream().filter(v -> v.getId().equals(equIds)).collect(Collectors.toList());
                                 // 设备集合里不存在时新增
-                                if(eqpts == null || eqpts.size() == 0){
+                                if (eqpts == null || eqpts.size() == 0) {
                                     Equipment equipment = new Equipment();
                                     equipment.setBsEquipmentId(equIds);
                                     equipment.setId(equIds);
@@ -444,10 +443,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                     // 查询设备锁定的已排程的时间段
                                     List<ApsProcessOperationProcessEquDo> processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                                             .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
-                                            .ge(ApsProcessOperationProcessEquDo::getPlanstartdate,productionScheduleVo.getApsPlanStartDate())
+                                            .ge(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
                                             .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
                                     );
-                                    if(processEqus != null && processEqus.size()>0){
+                                    if (processEqus != null && processEqus.size() > 0) {
                                         List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
                                         for (ApsProcessOperationProcessEquDo equs : processEqus) {
                                             EquipmentRunTime er = new EquipmentRunTime();
@@ -463,15 +462,15 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         }
                     }
 
-                    if(SaveConstans.ProcessWay.PROCESS_WAY_MERGE.equals(productprocess)){
+                    if (SaveConstans.ProcessWay.PROCESS_WAY_MERGE.equals(productprocess)) {
                         // 合并生产工序
                         ApsProcessOperationVo processOperationVo = new ApsProcessOperationVo();
-                        BeanUtil.copyProperties(operationDo,processOperationVo);
+                        BeanUtil.copyProperties(operationDo, processOperationVo);
                         processOperationVo.setProduceOrder(produceOrder);
                         processOperationVo.setDeliverydate(apsBlankOrderVo.getDeliverydate());
                         processOperationVo.setApsBlankOrderVo(apsBlankOrderVo);
                         processOperationMs.add(processOperationVo);
-                    }else {
+                    } else {
                         // 非合并生产工序
 
                         // 模型ID
@@ -487,31 +486,31 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         processes.setProcessType(operationDo.getProcess());
                         // 单次加工时长
                         processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
-                        processes.setProduceTime(processes.getUnitProduceTime()*processes.getProducePcNum());
-                        if(operationDo.getMinflowwaitmin() != null){
+                        processes.setProduceTime(processes.getUnitProduceTime() * processes.getProducePcNum());
+                        if (operationDo.getMinflowwaitmin() != null) {
                             processes.setMinWaitTime(operationDo.getMinflowwaitmin().intValue());
                         }
-                        if(operationDo.getMaxflowwaitmin() != null){
+                        if (operationDo.getMaxflowwaitmin() != null) {
                             processes.setMaxWaitTime(operationDo.getMaxflowwaitmin().intValue());
                         }
                         // 上道工序
-                        if(StringUtils.isNotBlank(operationDo.getPreviousprocessid())){
+                        if (StringUtils.isNotBlank(operationDo.getPreviousprocessid())) {
                             processes.setPreviousProcessesIds(Arrays.asList(operationDo.getPreviousprocessid().split(",")));
                         }
                         // 下道工序
-                        if(StringUtils.isNotBlank(operationDo.getNextprocessid())){
+                        if (StringUtils.isNotBlank(operationDo.getNextprocessid())) {
                             processes.setNextProcessesIds(Arrays.asList(operationDo.getNextprocessid().split(",")));
                         }
                         // 连续生产标识设置
                         // 铸轧
-                        if("铸轧".equals(processes.getProcessType())){
+                        if ("铸轧".equals(processes.getProcessType())) {
                             // 合金+宽度
-                            processes.setSeriesProduceMark(operationDo.getMetal()+"^_^"+operationDo.getProwidth());
+                            processes.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getProwidth());
                         }
                         // 冷轧
-                        else if("冷轧".equals(processes.getProcessType())){
+                        else if ("冷轧".equals(processes.getProcessType())) {
                             // 合金+输入物料+宽度
-                            processes.setSeriesProduceMark(operationDo.getMetal()+"^_^"+operationDo.getPlaninput()+"^_^"+operationDo.getProwidth());
+                            processes.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getPlaninput() + "^_^" + operationDo.getProwidth());
                         }
 
                         processesList.add(processes);
@@ -520,7 +519,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
         }
         // 合并生产工序
-        List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs,eqMaps);
+        List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs, eqMaps);
         processesList.addAll(productionProcesses);
 
         productionScheduleVo.setProcesses(processesList);
@@ -530,26 +529,27 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
     /**
      * 合并生产工序
+     *
      * @param processOperationMs
      * @return
      */
-    private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs,Map<String,AspCheckItemsDo> eqMaps){
+    private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs, Map<String, AspCheckItemsDo> eqMaps) {
         // 最终的合并工序
         List<ProductionProcesses> processesList = new ArrayList<>();
-        if(processOperationMs != null && processOperationMs.size()>0){
+        if (processOperationMs != null && processOperationMs.size() > 0) {
             // 按照期望交货期排序
             processOperationMs.sort(Comparator.comparing(ApsProcessOperationVo::getDeliverydate));
             // 获取所有设备,并按已存在最晚完工时间排序
             String allSelEqs = null;
             for (ApsProcessOperationVo processOperationM : processOperationMs) {
-                if(StringUtils.isNotBlank(processOperationM.getCanchoosedeviceid())){
+                if (StringUtils.isNotBlank(processOperationM.getCanchoosedeviceid())) {
                     String[] sbIds = processOperationM.getCanchoosedeviceid().split(",");
                     for (String equIds : sbIds) {
-                        if(allSelEqs == null){
-                            allSelEqs = "'"+equIds+"'";
-                        }else{
-                            if(!allSelEqs.contains(equIds)){
-                                allSelEqs = allSelEqs + ",'"+equIds+"'";
+                        if (allSelEqs == null) {
+                            allSelEqs = "'" + equIds + "'";
+                        } else {
+                            if (!allSelEqs.contains(equIds)) {
+                                allSelEqs = allSelEqs + ",'" + equIds + "'";
                             }
                         }
                     }
@@ -557,22 +557,22 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
             // 设备排序
             List<AspCheckItemsDo> aspCheckItemsDos = apsBlankOrderDao.eqAscs(allSelEqs);
-            Map<String,AspCheckItemsDo> aspCheckItemMap = new HashMap<>();
+            Map<String, AspCheckItemsDo> aspCheckItemMap = new HashMap<>();
             for (AspCheckItemsDo aspCheckItemsDo : aspCheckItemsDos) {
-                aspCheckItemMap.put(aspCheckItemsDo.getId(),aspCheckItemsDo);
+                aspCheckItemMap.put(aspCheckItemsDo.getId(), aspCheckItemsDo);
             }
             // 记录最后选择的设备序号
             Integer m = 0;
             for (ApsProcessOperationVo processOperationM : processOperationMs) {
                 // 作业加工卷数
                 int planprocessrall = processOperationM.getPlanprocessrall();
-                if(planprocessrall<=0){
+                if (planprocessrall <= 0) {
                     continue;
                 }
                 Boolean a = true;
                 long timestart = DateUtil.date().getTime();
 
-                while (a){
+                while (a) {
                     int lastnum = processOperationM.getPlanprocessrall();
 
                     // 首先看已合并生产的设备是否还有余量继续排产
@@ -582,8 +582,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         AspCheckItemsDo aspCheckItem = aspCheckItemMap.get(eq);
 
                         // 工序类型一致,合金和合金状态要一致
-                        if(processes.getProcessType().equals(processOperationM.getProcess()) && processes.getAluminumCoils().get(0).getVolumeMetal().equals(processOperationM.getMetal())
-                                && processes.getAluminumCoils().get(0).getVolumeMetalstate().equals(processOperationM.getMetalstate())){
+                        if (processes.getProcessType().equals(processOperationM.getProcess()) && processes.getAluminumCoils().get(0).getVolumeMetal().equals(processOperationM.getMetal())
+                                && processes.getAluminumCoils().get(0).getVolumeMetalstate().equals(processOperationM.getMetalstate())) {
                             // 宽度不超过50mm,厚度不超过0.05mm,重量不超过1吨
                             boolean bol = true;
                             BigDecimal totalWidth = null;
@@ -592,7 +592,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                             BigDecimal knum = null;
                             BigDecimal hnum = null;
                             BigDecimal znum = null;
-                            if(SaveConstans.ProcessType.PROCESS_TYPE_CHENTUI.equals(processes.getProcessType())){
+                            if (SaveConstans.ProcessType.PROCESS_TYPE_CHENTUI.equals(processes.getProcessType())) {
                                 knum = new BigDecimal("50");
                                 hnum = new BigDecimal("0.05");
                                 znum = new BigDecimal("1");
@@ -601,50 +601,50 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                 hnum = new BigDecimal("0.08");
                                 znum = new BigDecimal("1");
                             }
-                            if(knum == null || hnum == null || znum == null){
+                            if (knum == null || hnum == null || znum == null) {
                                 continue;
                             }
 
                             for (AluminumCoil aluminumCoil : processes.getAluminumCoils()) {
                                 // 宽度不超过50mm
-                                if(aluminumCoil.getVolumeWidth().subtract(processOperationM.getProwidth()).abs().compareTo(knum)>0){
+                                if (aluminumCoil.getVolumeWidth().subtract(processOperationM.getProwidth()).abs().compareTo(knum) > 0) {
                                     bol = false;
                                 }
                                 // 厚度不超过0.05mm
-                                if(aluminumCoil.getVolumeThickness().subtract(processOperationM.getThickness()).abs().compareTo(hnum)>0){
+                                if (aluminumCoil.getVolumeThickness().subtract(processOperationM.getThickness()).abs().compareTo(hnum) > 0) {
                                     bol = false;
                                 }
                                 // 重量不超过1吨
-                                if(aluminumCoil.getVolumeWeight().subtract(processOperationM.getSinglerollweight()).abs().compareTo(znum)>0){
+                                if (aluminumCoil.getVolumeWeight().subtract(processOperationM.getSinglerollweight()).abs().compareTo(znum) > 0) {
                                     bol = false;
                                 }
-                                if(totalWidth == null){
+                                if (totalWidth == null) {
                                     totalWidth = aluminumCoil.getVolumeWidth();
-                                }else{
+                                } else {
                                     totalWidth = totalWidth.add(aluminumCoil.getVolumeWidth());
                                 }
-                                if(totalWeight == null){
+                                if (totalWeight == null) {
                                     totalWeight = aluminumCoil.getVolumeWeight();
-                                }else{
+                                } else {
                                     totalWeight = totalWeight.add(aluminumCoil.getVolumeWeight());
                                 }
                             }
-                            if(bol){
+                            if (bol) {
                                 Integer sy = 0;
-                                for (int j=1;j<=planprocessrall;j++){
+                                for (int j = 1; j <= planprocessrall; j++) {
                                     // 宽度余量
-                                    if(aspCheckItem.getEquipmentwidth().subtract(totalWidth).compareTo(processOperationM.getProwidth().multiply(new BigDecimal(j)))<0){
+                                    if (aspCheckItem.getEquipmentwidth().subtract(totalWidth).compareTo(processOperationM.getProwidth().multiply(new BigDecimal(j))) < 0) {
                                         break;
                                     }
                                     // 重量余量
-                                    if(aspCheckItem.getEquipmentbearing().subtract(totalWeight).compareTo(processOperationM.getSinglerollweight().multiply(new BigDecimal(j)))<0){
+                                    if (aspCheckItem.getEquipmentbearing().subtract(totalWeight).compareTo(processOperationM.getSinglerollweight().multiply(new BigDecimal(j))) < 0) {
                                         break;
                                     }
                                     sy = j;
                                 }
-                                if(sy>0){
+                                if (sy > 0) {
                                     lastnum = planprocessrall - sy;
-                                    for (int j=1;j<=sy;j++){
+                                    for (int j = 1; j <= sy; j++) {
                                         AluminumCoil aluminumCoil = new AluminumCoil();
                                         aluminumCoil.setBsId(processOperationM.getId());
                                         aluminumCoil.setBlankid(processOperationM.getBlankid());
@@ -657,40 +657,40 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                     }
 
                                     // 上道工序
-                                    if(StringUtils.isNotBlank(processOperationM.getPreviousprocessid())){
-                                        if(processes.getPreviousProcessesIds() == null){
+                                    if (StringUtils.isNotBlank(processOperationM.getPreviousprocessid())) {
+                                        if (processes.getPreviousProcessesIds() == null) {
                                             List<String> list = new ArrayList<>();
                                             list.addAll(Arrays.asList(processOperationM.getPreviousprocessid().split(",")));
                                             processes.setPreviousProcessesIds(list);
-                                        }else{
+                                        } else {
                                             processes.getPreviousProcessesIds().addAll(new ArrayList<>(Arrays.asList(processOperationM.getPreviousprocessid().split(","))));
                                         }
                                     }
                                     // 下道工序
-                                    if(StringUtils.isNotBlank(processOperationM.getNextprocessid())){
-                                        if(processes.getNextProcessesIds() == null){
+                                    if (StringUtils.isNotBlank(processOperationM.getNextprocessid())) {
+                                        if (processes.getNextProcessesIds() == null) {
                                             List<String> list = new ArrayList<>();
                                             list.addAll(Arrays.asList(processOperationM.getNextprocessid().split(",")));
                                             processes.setNextProcessesIds(list);
-                                        }else{
+                                        } else {
                                             processes.getNextProcessesIds().addAll(new ArrayList<>(Arrays.asList(processOperationM.getNextprocessid().split(","))));
                                         }
                                     }
                                     // 所属订单
                                     List<ProduceOrder> produceOrders = processes.getProduceOrder().stream().filter(v ->
                                             v.getId().equals(processOperationM.getApsBlankOrderVo().getId())).collect(Collectors.toList());
-                                    if(produceOrders == null || produceOrders.size() == 0){
-                                        ProduceOrder produceOrder = new ProduceOrder(processOperationM.getApsBlankOrderVo().getId(),processOperationM.getApsBlankOrderVo().getMaterialname(),processOperationM.getApsBlankOrderVo().getDeliverydate());
+                                    if (produceOrders == null || produceOrders.size() == 0) {
+                                        ProduceOrder produceOrder = new ProduceOrder(processOperationM.getApsBlankOrderVo().getId(), processOperationM.getApsBlankOrderVo().getMaterialname(), processOperationM.getApsBlankOrderVo().getDeliverydate());
                                         processes.getProduceOrder().add(produceOrder);
                                     }
                                     // 单次加工时长
-                                    if(processes.getUnitProduceTime() == null){
+                                    if (processes.getUnitProduceTime() == null) {
                                         processes.setUnitProduceTime(processOperationM.getOnceprocessmin().intValue());
                                         processes.setProduceTime(processOperationM.getOnceprocessmin().intValue());
                                     }
                                     // 加工时长取最大值
-                                    else{
-                                        if(processes.getUnitProduceTime()<processOperationM.getOnceprocessmin().intValue()){
+                                    else {
+                                        if (processes.getUnitProduceTime() < processOperationM.getOnceprocessmin().intValue()) {
                                             processes.setUnitProduceTime(processOperationM.getOnceprocessmin().intValue());
                                             processes.setProduceTime(processOperationM.getOnceprocessmin().intValue());
                                         }
@@ -702,33 +702,33 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     }
 
                     // 剩余的料卷
-                    if(lastnum>0){
-                        if(m == aspCheckItemsDos.size()-1){
+                    if (lastnum > 0) {
+                        if (m == aspCheckItemsDos.size() - 1) {
                             m = -1;
                         }
                         int haslast = 0;
-                        for(int i=m+1;i<aspCheckItemsDos.size();i++){
-                            if(lastnum <= 0){
+                        for (int i = m + 1; i < aspCheckItemsDos.size(); i++) {
+                            if (lastnum <= 0) {
                                 break;
                             }
                             AspCheckItemsDo aspCheckItem = aspCheckItemsDos.get(i);
                             // 选择的设备要在可选设备的范围内
-                            if(processOperationM.getCanchoosedeviceid().contains(aspCheckItem.getId())){
+                            if (processOperationM.getCanchoosedeviceid().contains(aspCheckItem.getId())) {
                                 // 单卷宽度不能超过设备宽度并且单卷重不能超过设备的承重
-                                if(processOperationM.getProwidth().compareTo(aspCheckItem.getEquipmentwidth())<0
-                                        && processOperationM.getSinglerollweight().compareTo(aspCheckItem.getEquipmentbearing())<0){
-                                    for(int n=1;n<=lastnum;n++){
+                                if (processOperationM.getProwidth().compareTo(aspCheckItem.getEquipmentwidth()) < 0
+                                        && processOperationM.getSinglerollweight().compareTo(aspCheckItem.getEquipmentbearing()) < 0) {
+                                    for (int n = 1; n <= lastnum; n++) {
                                         // 宽度余量
-                                        if(aspCheckItem.getEquipmentwidth().compareTo(processOperationM.getProwidth().multiply(new BigDecimal(n)))<0){
+                                        if (aspCheckItem.getEquipmentwidth().compareTo(processOperationM.getProwidth().multiply(new BigDecimal(n))) < 0) {
                                             break;
                                         }
                                         // 重量余量
-                                        if(aspCheckItem.getEquipmentbearing().compareTo(processOperationM.getSinglerollweight().multiply(new BigDecimal(n)))<0){
+                                        if (aspCheckItem.getEquipmentbearing().compareTo(processOperationM.getSinglerollweight().multiply(new BigDecimal(n))) < 0) {
                                             break;
                                         }
                                         haslast = n;
                                     }
-                                    if(haslast>0){
+                                    if (haslast > 0) {
                                         ProductionProcesses processes = new ProductionProcesses();
                                         processes.setId(SecurityUtil.getUUID());
                                         List<String> bss = new ArrayList<>();
@@ -737,13 +737,13 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                         processes.setProcessType(processOperationM.getProcess());
                                         processes.setOptionalEquipments(Arrays.asList(new String[]{aspCheckItem.getId()}));
                                         // 坯料计划订单
-                                        ProduceOrder produceOrder = new ProduceOrder(processOperationM.getApsBlankOrderVo().getId(),processOperationM.getApsBlankOrderVo().getMaterialname(),processOperationM.getApsBlankOrderVo().getDeliverydate());
+                                        ProduceOrder produceOrder = new ProduceOrder(processOperationM.getApsBlankOrderVo().getId(), processOperationM.getApsBlankOrderVo().getMaterialname(), processOperationM.getApsBlankOrderVo().getDeliverydate());
                                         List<ProduceOrder> produceOrders = new ArrayList<>();
                                         produceOrders.add(produceOrder);
                                         processes.setProduceOrder(produceOrders);
 
                                         processes.setAluminumCoils(new ArrayList<>());
-                                        for (int j=1;j<=haslast;j++){
+                                        for (int j = 1; j <= haslast; j++) {
                                             AluminumCoil aluminumCoil = new AluminumCoil();
                                             aluminumCoil.setBsId(processOperationM.getId());
                                             aluminumCoil.setBlankid(processOperationM.getBlankid());
@@ -757,11 +757,11 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                         // 批次
                                         processes.setProducePcNum(1);
                                         // 最小等待时长
-                                        if(processOperationM.getMinflowwaitmin() != null){
+                                        if (processOperationM.getMinflowwaitmin() != null) {
                                             processes.setMinWaitTime(processOperationM.getMinflowwaitmin().intValue());
                                         }
                                         // 最大等待时长
-                                        if(processOperationM.getMaxflowwaitmin() != null){
+                                        if (processOperationM.getMaxflowwaitmin() != null) {
                                             processes.setMaxWaitTime(processOperationM.getMaxflowwaitmin().intValue());
                                         }
                                         // 合并加工的为瓶颈工序
@@ -770,11 +770,11 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                         processes.setUnitProduceTime(processOperationM.getOnceprocessmin().intValue());
                                         processes.setProduceTime(processOperationM.getOnceprocessmin().intValue());
                                         // 上道工序
-                                        if(StringUtils.isNotBlank(processOperationM.getPreviousprocessid())){
+                                        if (StringUtils.isNotBlank(processOperationM.getPreviousprocessid())) {
                                             processes.setPreviousProcessesIds(new ArrayList<>(Arrays.asList(processOperationM.getPreviousprocessid().split(","))));
                                         }
                                         // 下道工序
-                                        if(StringUtils.isNotBlank(processOperationM.getNextprocessid())){
+                                        if (StringUtils.isNotBlank(processOperationM.getNextprocessid())) {
                                             processes.setNextProcessesIds(new ArrayList<>(Arrays.asList(processOperationM.getNextprocessid().split(","))));
                                         }
                                         processesList.add(processes);
@@ -789,7 +789,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         }
                     }
                     processOperationM.setPlanprocessrall(lastnum);
-                    if(lastnum <= 0){
+                    if (lastnum <= 0) {
                         a = false;
                     }
 
@@ -830,8 +830,43 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
     /**
      * 物理删除排程备份(工序作业备份【aps_process_operation_backup】、加工设备备份【aps_process_operation_process_equ_backup】)
+     * 更新状态
      */
-    private void deleteBackup(){
-
+    private void deleteBackup(List<String> blankids, List<String> apsProductionOrderIds) {
+        // 删除工序作业和工序作业明备份数据
+        apsProcessOperationBackupDao.deletedByBlankId(blankids);
+        apsProcessOperationProcessEquBackupDao.deletedByBlankId(blankids);
+        // 更工序作业生产状态=待排程,是否锁定=否,
+        apsProcessOperationService.remove(new LambdaQueryWrapper<ApsProcessOperationDo>().in(ApsProcessOperationDo::getBlankid, blankids));
+        // 清空作业明细
+        processOperationProcessEquService.remove(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
+        // 更新订单的排程状态
+        List<ApsProductionOrderDo> productionOrderDos = new ArrayList<>();
+        for (String apsProductionOrderId : apsProductionOrderIds) {
+            ApsProductionOrderDo productionOrderDo = new ApsProductionOrderDo();
+            productionOrderDo.setId(apsProductionOrderId);
+            productionOrderDo.setSchedulstatus(SaveConstans.SchedulstatusTyep.SCHEDULSTATUS_TOSCHEDULE);
+            productionOrderDo.setScheduledeliverydate(null);
+            productionOrderDo.setProductionstatus(TO_BE_SCHEDULED);
+            productionOrderDos.add(productionOrderDo);
+        }
+        // 更新生产订单的状态
+        apsProductionOrderService.updateBatchById(productionOrderDos);
+        // 更新坯料计划的状态
+        this.baseMapper.cancelSchedulingUpdate(blankids);
+        //获取坯料计划用到的产品明细ID
+        String idStrs = CollUtil.join(blankids, "','");
+        idStrs = "'" + idStrs + "'";
+        List<String> productIdList = this.baseMapper.selectOutputProductIdList(idStrs);
+        List<ApsProductDetailDo> productDetailDoList = new LinkedList<>();
+        for (String productId : productIdList) {
+            ApsProductDetailDo apsProductDetailDo = new ApsProductDetailDo();
+            apsProductDetailDo.setId(productId);
+            apsProductDetailDo.setProductstatus(TO_BE_SCHEDULED);
+            productDetailDoList.add(apsProductDetailDo);
+        }
+        // 更新坯料计划产品明细的的生产状态
+        apsProductDetailService.updateBatchById(productDetailDoList);
+//        apsProductDetailDao.updateProductstatus(apsProductionOrderIds);
     }
 }

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

@@ -70,6 +70,17 @@ public class ApsBlankOrderController {
         return R.ok();
     }
 
+    /**
+     * 坯料计划排程取消
+     * @return
+     */
+    @PostMapping("/blankApsCancel")
+    public R blankApsCancel(@RequestBody List<String> apsBlankIds){
+        apsBlankOrderService.blankApsCancel(apsBlankIds);
+        return R.ok();
+    }
+
+
     @PostMapping("/test")
     public R test(){
         apsBlankOrderService.test();