Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

xiahan před 1 rokem
rodič
revize
7c0fc98fdd
18 změnil soubory, kde provedl 430 přidání a 230 odebrání
  1. 9 8
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProductDetailDao.java
  2. 2 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsBlankOrderService.java
  3. 3 5
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProductDetailService.java
  4. 11 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsService.java
  5. 151 160
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  6. 13 8
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductDetailServiceImpl.java
  7. 35 35
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java
  8. 3 2
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportRecordsServiceImpl.java
  9. 94 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsServiceImpl.java
  10. 10 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOutputProductDo.java
  11. 23 3
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProductDetailDo.java
  12. 26 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProductionOrderDo.java
  13. 11 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsScheduleConfigDo.java
  14. 6 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/AspCheckItemsDo.java
  15. 5 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/Equipment.java
  16. 13 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionProcesses.java
  17. 9 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionScheduleVo.java
  18. 6 7
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProductDetailController.java

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

@@ -12,28 +12,28 @@ public interface ApsProductDetailDao extends BaseMapper<ApsProductDetailDo> {
 
 
     @Select({" <script>",
-            "select * from aps_production_order where DELETED='0' and CUSTOMORDERNO in",
+            "select * from aps_production_order where DELETED='0' and TENANTID=#{curtenantid} and CUSTOMORDERNO in",
             " <foreach collection=\"orderNos\" item=\"orderno\" index=\"index\" open=\"(\" close=\")\" separator=\",\"> ",
             "  #{orderno}",
             "</foreach>",
             "</script>"})
-    List<ApsProductionOrderDo> getProductionOrders(@Param("orderNos") List<String> orderNos);
+    List<ApsProductionOrderDo> getProductionOrders(@Param("curtenantid") String curtenantid, @Param("orderNos") List<String> orderNos);
 
     @Select({" <script>",
-            "select * from aps_production_merge_order where DELETED='0' and CUSTOMORDERNO in",
+            "select * from aps_production_merge_order where DELETED='0' and TENANTID=#{curtenantid} and CUSTOMORDERNO in",
             " <foreach collection=\"orderNos\" item=\"orderno\" index=\"index\" open=\"(\" close=\")\" separator=\",\"> ",
             "  #{orderno}",
             "</foreach>",
             "</script>"})
-    List<ApsProductionMergeOrderDo> getProductionMergeOrders(@Param("orderNos") List<String> orderNos);
+    List<ApsProductionMergeOrderDo> getProductionMergeOrders(@Param("curtenantid") String curtenantid, @Param("orderNos") List<String> orderNos);
 
     @Select({" <script>",
-            "select * from aps_product_detail where DELETED='0' and CUSTOMORDERNO in\n" +
-            " <foreach collection=\"orderNos\" item=\"orderno\" index=\"index\" open=\"(\" close=\")\" separator=\",\"> ",
+            "select * from aps_product_detail where DELETED='0' and TENANTID=#{curtenantid} and CUSTOMORDERNO in\n" +
+                    " <foreach collection=\"orderNos\" item=\"orderno\" index=\"index\" open=\"(\" close=\")\" separator=\",\"> ",
             "  #{orderno}",
             "</foreach>",
             "</script>"})
-    List<ApsProductDetailDo> getProductDetails(@Param("orderNos") List<String> orderNos);
+    List<ApsProductDetailDo> getProductDetails(@Param("curtenantid") String curtenantid, @Param("orderNos") List<String> orderNos);
 
     @Select("select ID,CUSTOMERNAME,DELIVERYTIME from aps_customer_management where DELETED='0'")
     List<ApsCustomerManagementDo> getCustomerData();
@@ -42,8 +42,9 @@ public interface ApsProductDetailDao extends BaseMapper<ApsProductDetailDo> {
 
     void updateProductstatus(@Param("productionOrderIds") List<String> productionOrderIds);
 
-    void updateProductStatusByBlankId(@Param("blankIds")List<String>blankIds,
+    void updateProductStatusByBlankId(@Param("blankIds") List<String> blankIds,
                                       @Param("productStatus") String productStatus);
+
     @Select("select ID,MATERIALCODE,MATERIALNAME,MATERIALUNIT from aps_material where DELETED='0'")
     List<ApsProcessMaterialDo> getMaterialData();
 

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

@@ -43,4 +43,6 @@ public interface ApsBlankOrderService extends IService<ApsBlankOrderDo> {
 
     R removeBlankOrder(ApsBlankOrderDo req);
     void removeBlankOrderAndChild(ApsBlankOrderDo req);
+
+    void apsAfter(ProductionScheduleRetVo productionScheduleRetVo,List<ApsBlankOrderVo> apsBlankOrders);
 }

+ 3 - 5
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProductDetailService.java

@@ -2,11 +2,9 @@ package com.rongwei.bscommon.sys.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ApsProductDetailDo;
-import com.rongwei.bsentity.domain.ApsProductionOrderDo;
-import com.rongwei.bsentity.domain.VNcOrderVo;
 import com.rongwei.rwcommon.base.R;
+import org.springframework.web.bind.annotation.RequestBody;
 
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -21,7 +19,7 @@ public interface ApsProductDetailService extends IService<ApsProductDetailDo> {
 
     R getCustomOrderData(Map<String, Object> params);
 
-    R updateCustomOrder(List<String> orderNos);
+    R updateCustomOrder(Map<String, Object> params);
 
-    R updateMergeCustomOrder(List<String> orderNos);
+    R updateMergeCustomOrder(@RequestBody Map<String, Object> params);
 }

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

@@ -0,0 +1,11 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.vo.ApsBlankOrderVo;
+
+import java.util.List;
+
+public interface ApsService {
+
+    void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders);
+
+}

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

@@ -71,8 +71,6 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     @Autowired
     private ApsBlankOrderDao apsBlankOrderDao;
     @Autowired
-    private RwApsServer rwApsServer;
-    @Autowired
     private ApsProcessOperationProcessEquServiceImpl processOperationProcessEquService;
     @Autowired
     private ApsScheduleConfigService apsScheduleConfigService;
@@ -99,9 +97,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     @Autowired
     private ApsProcessOperationProcessEquService apsProcessOperationProcessEquService;
     @Autowired
-    private RedissonClient redissonClient;
-    @Autowired
     private ApsEquipmentCalendarService apsEquipmentCalendarService;
+    @Autowired
+    private ApsService apsService;
 
 
     @Override
@@ -481,159 +479,129 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
      * @param apsBlankOrders
      */
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public void blankOrderAps(List<ApsBlankOrderVo> apsBlankOrders) {
-        // 当前等路人所属工厂
-        SysUserVo currentUser = CXCommonUtils.getCurrentUser();
-        String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
-        if (StringUtils.isBlank(tenantId)) {
-            throw new CustomException("所属工厂不能为空");
-        }
-        assert apsBlankOrders != null : "排程订单不能为空";
-        // 按照所属工厂加锁
-        RLock rLock = redissonClient.getLock(tenantId);
-        try {
-            // 加锁最大1小时
-            rLock.lock(1, TimeUnit.HOURS);
-            // 合并待发布未锁定的订单一起排程
-            List<String> hasIds = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
-            String idStrs = CollUtil.join(hasIds, "','");
-            idStrs = "'" + idStrs + "'";
-            // 查询存在未锁定的作业坯料计划
-//            List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getFbNotLock(idStrs,tenantId);
-            List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getOrdersHasNotLockProcess(idStrs,tenantId);
-            if (fbNotLock != null && fbNotLock.size() > 0) {
-                apsBlankOrders.addAll(fbNotLock);
-            }
+        apsService.apsSchedule(apsBlankOrders);
+    }
 
-            // 先删除所有作业的明细
-            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));
-            // APS平台排程接口调用
-            ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
-            if (!"200".equals(productionScheduleRetVo.getCode())) {
-                throw new CustomException(productionScheduleRetVo.getMsg());
-            }
-            // 排程结果保存
-            List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
-            // 最后节点集合
-            List<ProductionProcesses> lastProcess = new ArrayList<>();
-            if (productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size() > 0) {
-                for (ProductionProcesses process : productionScheduleRetVo.getProcesses()) {
-                    // 非合并生产工序
-                    if (process.getAluminumCoils() == null) {
+    /**
+     * 排程结果操作
+     * @param productionScheduleRetVo
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void apsAfter(ProductionScheduleRetVo productionScheduleRetVo,List<ApsBlankOrderVo> apsBlankOrders){
+        // 先删除所有作业的明细
+        List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
+        processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
+        // 排程结果保存
+        List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
+        // 最后节点集合
+        List<ProductionProcesses> lastProcess = new ArrayList<>();
+        if (productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size() > 0) {
+            for (ProductionProcesses process : productionScheduleRetVo.getProcesses()) {
+                // 非合并生产工序
+                if (process.getAluminumCoils() == null) {
+                    ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
+                    apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
+                    apsProcessOperationProcessEqu.setProcessid(process.getId());
+                    apsProcessOperationProcessEqu.setBlankid(process.getProduceOrder().get(0).getId());
+                    apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
+                    apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
+                    apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshopid());
+                    apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
+                    apsProcessOperationProcessEqu.setTenantid(process.getEquipment().getFactoryid());
+                    apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
+                    apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
+                    apsProcessOperationProcessEqu.setPlanprocessrall(process.getProducePcNum());
+                    apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict());
+                    apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
+                    apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
+                    apsProcessOperationProcessEqu.setDeleted("0");
+                    apsProcessOperationProcessEqu.setUnfinishroll(process.getProducePcNum());
+                    apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
+                }
+                // 合并生产工序
+                else {
+                    // 保存到明细表
+                    Map<String, List<AluminumCoil>> bsAl = new HashMap<>();
+                    for (AluminumCoil aluminumCoil : process.getAluminumCoils()) {
+                        if (bsAl.containsKey(aluminumCoil.getBsId())) {
+                            bsAl.get(aluminumCoil.getBsId()).add(aluminumCoil);
+                        } else {
+                            List<AluminumCoil> coils = new ArrayList<>();
+                            coils.add(aluminumCoil);
+                            bsAl.put(aluminumCoil.getBsId(), coils);
+                        }
+                    }
+                    bsAl.forEach((k, v) -> {
                         ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
                         apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
-                        apsProcessOperationProcessEqu.setProcessid(process.getId());
-                        apsProcessOperationProcessEqu.setBlankid(process.getProduceOrder().get(0).getId());
+                        apsProcessOperationProcessEqu.setProcessid(k);
+                        apsProcessOperationProcessEqu.setBlankid(v.get(0).getBlankid());
                         apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
                         apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
+                        apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
+                        apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
+                        apsProcessOperationProcessEqu.setPlanprocessrall(v.size());
                         apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshopid());
                         apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
                         apsProcessOperationProcessEqu.setTenantid(process.getEquipment().getFactoryid());
-                        apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
-                        apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
-                        apsProcessOperationProcessEqu.setPlanprocessrall(process.getProducePcNum());
                         apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict());
                         apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
                         apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
                         apsProcessOperationProcessEqu.setDeleted("0");
-                        apsProcessOperationProcessEqu.setUnfinishroll(process.getProducePcNum());
+                        apsProcessOperationProcessEqu.setUnfinishroll(v.size());
                         apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
-                    }
-                    // 合并生产工序
-                    else {
-                        // 保存到明细表
-                        Map<String, List<AluminumCoil>> bsAl = new HashMap<>();
-                        for (AluminumCoil aluminumCoil : process.getAluminumCoils()) {
-                            if (bsAl.containsKey(aluminumCoil.getBsId())) {
-                                bsAl.get(aluminumCoil.getBsId()).add(aluminumCoil);
-                            } else {
-                                List<AluminumCoil> coils = new ArrayList<>();
-                                coils.add(aluminumCoil);
-                                bsAl.put(aluminumCoil.getBsId(), coils);
-                            }
-                        }
-                        bsAl.forEach((k, v) -> {
-                            ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
-                            apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
-                            apsProcessOperationProcessEqu.setProcessid(k);
-                            apsProcessOperationProcessEqu.setBlankid(v.get(0).getBlankid());
-                            apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
-                            apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
-                            apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
-                            apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
-                            apsProcessOperationProcessEqu.setPlanprocessrall(v.size());
-                            apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshopid());
-                            apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
-                            apsProcessOperationProcessEqu.setTenantid(process.getEquipment().getFactoryid());
-                            apsProcessOperationProcessEqu.setHasconflict(process.getHasConflict());
-                            apsProcessOperationProcessEqu.setConflictdes(process.getConflictDes());
-                            apsProcessOperationProcessEqu.setSoftconflictdes(process.getSoftconflictdes());
-                            apsProcessOperationProcessEqu.setDeleted("0");
-                            apsProcessOperationProcessEqu.setUnfinishroll(v.size());
-                            apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
-                        });
-                    }
+                    });
+                }
 
-                    // 是否为最后一个节点
-                    if (process.getNextProcessesIds() == null || process.getNextProcessesIds().size() == 0) {
-                        lastProcess.add(process);
-                    }
+                // 是否为最后一个节点
+                if (process.getNextProcessesIds() == null || process.getNextProcessesIds().size() == 0) {
+                    lastProcess.add(process);
                 }
             }
-            if (apsProcessOperationProcessEquDos != null && apsProcessOperationProcessEquDos.size() > 0) {
-                // 再保存新数据
-                processOperationProcessEquService.saveBatch(apsProcessOperationProcessEquDos);
-                // 回写订单排程交货期
-                Map<String, Date> orderDeliveryTime = new HashMap<>();
-                for (ProductionProcesses process : lastProcess) {
-                    List<ProduceOrder> produceOrder = process.getProduceOrder();
-                    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 (endDate.compareTo(orderDeliveryTime.get(blankOrder.getProductionorderid())) > 0) {
-                                    orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
-                                }
-                            } else {
+        }
+        if (apsProcessOperationProcessEquDos != null && apsProcessOperationProcessEquDos.size() > 0) {
+            // 再保存新数据
+            processOperationProcessEquService.saveBatch(apsProcessOperationProcessEquDos);
+            // 回写订单排程交货期
+            Map<String, Date> orderDeliveryTime = new HashMap<>();
+            for (ProductionProcesses process : lastProcess) {
+                List<ProduceOrder> produceOrder = process.getProduceOrder();
+                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 (endDate.compareTo(orderDeliveryTime.get(blankOrder.getProductionorderid())) > 0) {
                                 orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
                             }
+                        } else {
+                            orderDeliveryTime.put(blankOrder.getProductionorderid(), endDate);
                         }
                     }
                 }
-                // 更新订单的排程交货期、排程状态
-                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 (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()));
+                    }
+                    // 排程状态更新为待发布
 //                    apsProductionOrderDo.setSchedulstatus(SCHEDULSTATUS_TORELEASE);
-                        apsProductionOrderService.updateById(apsProductionOrderDo);
-                    });
-                }
-
+                    apsProductionOrderService.updateById(apsProductionOrderDo);
+                });
             }
 
-            backupProcessOperation(apsProcessOperationProcessEquDos, productionScheduleRetVo.getProcesses());
-        } catch (Exception e) {
-            throw e;
-        } finally {
-            rLock.unlock();
         }
+
+        backupProcessOperation(apsProcessOperationProcessEquDos, productionScheduleRetVo.getProcesses());
     }
 
     /**
@@ -673,6 +641,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
      */
     @Override
     public ProductionScheduleVo apsPlanModelSet(List<ApsBlankOrderVo> apsBlankOrders) {
+        // 待排程坯料计划ID集合
+        List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
         ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
         productionScheduleVo.setProductionScheduleId("批量排程");
         List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
@@ -701,6 +671,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             } else {
                 productionScheduleVo.setApsPlanStartDate(DateUtil.date().offset(DateField.HOUR, a));
             }
+            productionScheduleVo.setWashingtime(apsScheduleConfig.getWashingtime());
+            productionScheduleVo.setStandingtime(apsScheduleConfig.getStandingtime());
         } else {
             throw new CustomException("排程参数缺失");
         }
@@ -716,7 +688,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         // 排程计划工序任务集合
         List<ProductionProcesses> processesList = new ArrayList<>();
         // 坯料计划ID和所属工序作业ID对应关系
-        Map<String,List<String>> blankProcessIds = new HashMap<>();
+        Map<String, List<String>> blankProcessIds = new HashMap<>();
         // 待合并生产的订单工序
         List<ApsProcessOperationVo> processOperationMs = new ArrayList<>();
         if (apsBlankOrders != null && apsBlankOrders.size() > 0) {
@@ -729,7 +701,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 List<ApsProcessOperationDo> operationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
                         .eq(ApsProcessOperationDo::getBlankid, apsBlankOrderVo.getId()));
                 // 锁定的合并工序缓存
-                Map<String,ProductionProcesses> lockHbPp = new HashMap<>();
+                Map<String, ProductionProcesses> lockHbPp = new HashMap<>();
                 // 转换工序模型数据
                 for (ApsProcessOperationDo operationDo : operationDos) {
                     processIdss.add(operationDo.getId());
@@ -757,15 +729,18 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                     equipment.setWorkshopname(checkItemsD.getUsedeptname());
                                     equipment.setFactoryid(checkItemsD.getTenantid());
                                     equipment.setFactory(checkItemsD.getOwnedfactory());
+                                    equipment.setEquassociated(checkItemsD.getEquassociated());
                                     // 查询设备锁定的已排程的时间段
                                     List<ApsProcessOperationProcessEquDo> processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                                             .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                            .notIn(ApsProcessOperationProcessEquDo::getBlankid,blankids)
                                             .ge(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
                                             .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
                                     );
                                     // 查询当前设备最后一个生产任务、连续生产需要考虑使用
                                     List<ApsProcessOperationProcessEquDo> lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                                             .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                            .notIn(ApsProcessOperationProcessEquDo::getBlankid,blankids)
                                             .gt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
                                             .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
                                     );
@@ -829,8 +804,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                         // 设备日历不可用时间段
                                         List<ApsEquipmentCalendarDo> equipmentCalendarDos = apsEquipmentCalendarService.list(
                                                 new LambdaQueryWrapper<ApsEquipmentCalendarDo>().ge(ApsEquipmentCalendarDo::getSdstarttime, productionScheduleVo.getApsPlanStartDate())
-                                                        .eq(ApsEquipmentCalendarDo::getProcessdeviceid,equipment.getBsEquipmentId()));
-                                        if(equipmentCalendarDos != null && equipmentCalendarDos.size()>0){
+                                                        .eq(ApsEquipmentCalendarDo::getProcessdeviceid, equipment.getBsEquipmentId()));
+                                        if (equipmentCalendarDos != null && equipmentCalendarDos.size() > 0) {
                                             for (ApsEquipmentCalendarDo equipmentCalendarDo : equipmentCalendarDos) {
                                                 EquipmentRunTime er = new EquipmentRunTime();
                                                 er.setStartRunTime(equipmentCalendarDo.getSdstarttime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
@@ -849,14 +824,14 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
                     if (SaveConstans.ProcessWay.PROCESS_WAY_MERGE.equals(productprocess)) {
                         // 锁定的作业
-                        if(LOCKMARK_Y.equals(operationDo.getLockmark())){
+                        if (LOCKMARK_Y.equals(operationDo.getLockmark())) {
 //                            List<ApsProcessOperationProcessEquDo> popes = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
 //                                    .eq(ApsProcessOperationProcessEquDo::getProcessid, operationDo.getId()));
                             List<ApsProcessOperationProcessEquDo> popes = apsBlankOrderDao.getGroupProcessOperationProcessEqus(operationDo.getId());
-                            if(popes != null && popes.size()>0){
+                            if (popes != null && popes.size() > 0) {
                                 for (ApsProcessOperationProcessEquDo pope : popes) {
                                     // 已存在的合并工序则添加上下道工序
-                                    if(lockHbPp.containsKey(pope.getProcessdeviceid())){
+                                    if (lockHbPp.containsKey(pope.getProcessdeviceid())) {
                                         ProductionProcesses processes1 = lockHbPp.get(pope.getProcessdeviceid());
                                         // 上道工序
                                         if (StringUtils.isNotBlank(operationDo.getPreviousprocessid())) {
@@ -874,7 +849,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                         }
                                     }
                                     // 不存在此合并工序则新增一个合并作业
-                                    else{
+                                    else {
                                         ProductionProcesses processeshb = new ProductionProcesses();
                                         // 模型ID
                                         processeshb.setId(SecurityUtil.getUUID());
@@ -914,12 +889,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                             processes.setNextProcessesIds(nexts);
                                         }
 
-                                        lockHbPp.put(pope.getProcessdeviceid(),processes);
+                                        lockHbPp.put(pope.getProcessdeviceid(), processes);
                                         processesList.add(processes);
                                     }
                                 }
                             }
-                        }else{
+                        } else {
                             // 合并生产工序
                             ApsProcessOperationVo processOperationVo = new ApsProcessOperationVo();
                             BeanUtil.copyProperties(operationDo, processOperationVo);
@@ -952,6 +927,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         if (operationDo.getMaxflowwaitmin() != null) {
                             processes.setMaxWaitTime(operationDo.getMaxflowwaitmin().intValue());
                         }
+                        // 合金
+                        processes.setVolumeMetal(operationDo.getMetal());
                         // 上道工序
                         if (StringUtils.isNotBlank(operationDo.getPreviousprocessid())) {
                             processes.setPreviousProcessesIds(Arrays.asList(operationDo.getPreviousprocessid().split(",")));
@@ -974,22 +951,24 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         processes.setPrepressworkmin(operationDo.getPrepressworkmin() == null ? null : operationDo.getPrepressworkmin().intValue());
                         processes.setCutfinishmin(operationDo.getCutfinishmin() == null ? null : operationDo.getCutfinishmin().intValue());
                         // 锁定的作业加上锁定标识
-                        if(LOCKMARK_Y.equals(operationDo.getLockmark())){
+                        if (LOCKMARK_Y.equals(operationDo.getLockmark())) {
                             ApsProcessOperationProcessEquDo processEquServiceOne = processOperationProcessEquService.getOne(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                                     .eq(ApsProcessOperationProcessEquDo::getProcessid, operationDo.getId()));
-                            processes.setIfLock(true);
-                            processes.setEquipmentId(processEquServiceOne.getProcessdeviceid());
-                            List<String> opeqs = new ArrayList<>();
-                            opeqs.add(processEquServiceOne.getProcessdeviceid());
-                            processes.setOptionalEquipments(opeqs);
-                            processes.setStartTime(processEquServiceOne.getPlanstartdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
-                            processes.setEndTime(processEquServiceOne.getPlanenddate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+                            if (processEquServiceOne != null) {
+                                processes.setIfLock(true);
+                                processes.setEquipmentId(processEquServiceOne.getProcessdeviceid());
+                                List<String> opeqs = new ArrayList<>();
+                                opeqs.add(processEquServiceOne.getProcessdeviceid());
+                                processes.setOptionalEquipments(opeqs);
+                                processes.setStartTime(processEquServiceOne.getPlanstartdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+                                processes.setEndTime(processEquServiceOne.getPlanenddate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+                            }
                         }
                         processesList.add(processes);
                     }
                 }
 
-                blankProcessIds.put(apsBlankOrderVo.getId(),processIdss);
+                blankProcessIds.put(apsBlankOrderVo.getId(), processIdss);
             }
         }
         // 合并生产工序
@@ -1046,6 +1025,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                 aspCheckItemUse.put(aspCheckItemsDo.getId(), 0);
                 // 退火炉套筒间隙扣除
                 if (apsScheduleConfig != null) {
+                    if(aspCheckItemsDo.getEquipmentwidth() == null){
+                        throw new CustomException("退火炉的宽度没有维护");
+                    }
                     aspCheckItemsDo.setEquipmentwidth(aspCheckItemsDo.getEquipmentwidth().subtract(apsScheduleConfig.getLooseness()));
                 }
             }
@@ -1454,11 +1436,11 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         haveProductDetail = true;
 
                         if (apsProductDetailDo.getInputmaterialdescription().equals(apsProcessOutputProductDo.getProductname())) {
-                            //如果输出单卷重<单卷重(起)或 输出单卷重>单卷重(止),错误提示:输出成品:{订单产品} 输出单卷重不符合订单要求
-                            if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightstart()) < 0
-                                    || apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightend()) > 0) {
-                                return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
-                            }
+//                            //如果输出单卷重<单卷重(起)或 输出单卷重>单卷重(止),错误提示:输出成品:{订单产品} 输出单卷重不符合订单要求
+////                            if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightstart()) < 0
+////                                    || apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightend()) > 0) {
+////                                return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
+////                            }
                         } else {//如果对应订单产品明细的订单产品字段值不等于输出成品的订单产品字段值,错误提示:输出成品:{订单产品} 对应订单产品已修改或已删除,请重新选择订单产品
                             return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                         }
@@ -1492,10 +1474,19 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                     if (apsBlankOrderDo.getNumberunit().equals(SaveConstans.CountUnit.TON)) {
                         blankWeight = apsBlankOrderDo.getSinglerollweight().multiply(new BigDecimal(1000));
                     }
+                    //校验 输出单卷重 必须小于等于坯料单卷重,必须大于等于单卷重(起),必须小于等于单卷重(止)
                     //输出单卷重>坯料单卷重
                     if (outputWeight.compareTo(blankWeight) > 0) {
                         return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不能超过坯料单卷重");
                     }
+                    //输出单卷重<单卷重(起)
+                    if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProcessOutputProductDo.getOnerollweigthstart()) < 0) {
+                        return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重必须大于等于单卷重(起)");
+                    }
+                    //输出单卷重>单卷重(止)
+                    if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProcessOutputProductDo.getOnerollweigthend()) > 0) {
+                        return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重必须小于等于单卷重(止)");
+                    }
                 } else {//不存在对应的产品明细
                     return R.error("输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                 }
@@ -1661,11 +1652,11 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         haveProductDetail = true;
 
                         if (apsProductDetailDo.getInputmaterialdescription().equals(apsProcessOutputProductDo.getProductname())) {
-                            //如果输出单卷重<单卷重(起)或 输出单卷重>单卷重(止),错误提示:输出成品:{订单产品} 输出单卷重不符合订单要求
-                            if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightstart()) < 0
-                                    || apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightend()) > 0) {
-                                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
-                            }
+//                            //如果输出单卷重<单卷重(起)或 输出单卷重>单卷重(止),错误提示:输出成品:{订单产品} 输出单卷重不符合订单要求
+//                            if (apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightstart()) < 0
+//                                    || apsProcessOutputProductDo.getOutputonerollweigth().compareTo(apsProductDetailDo.getSinglerollweightend()) > 0) {
+//                                return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 输出单卷重不符合订单要求");
+//                            }
                         } else {//如果对应订单产品明细的订单产品字段值不等于输出成品的订单产品字段值,错误提示:输出成品:{订单产品} 对应订单产品已修改或已删除,请重新选择订单产品
                             return R.error("第" + j + "个坯料计划 输出成品:" + apsProcessOutputProductDo.getProductname() + " 对应订单产品已修改或已删除,请重新选择订单产品");
                         }

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

@@ -13,6 +13,7 @@ import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -109,9 +110,11 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
     更新客户订单
      */
     @Override
-    public R updateCustomOrder(List<String> orderNos) {
+    public R updateCustomOrder(Map<String, Object> params) {
         StringBuffer noOrderNos = new StringBuffer();//不存在客户订单系统里的客户订单号
         List<String> hasOrderNos = new ArrayList<>();//存在客户订单系统里的客户订单号
+        String curtenantid = params.get("CURTENANTID").toString();
+        List<String> orderNos = (List<String>) params.get("ORDERNOS");
 
         //客户订单系统的数据
         List<VNcOrderVo> vNcOrderVoList = slaveSourceService.getVNcOrderVo(orderNos);
@@ -129,8 +132,8 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
         List<ApsProductDetailDo> apsProductDetailDoList = new ArrayList<>();
         List<String> delProductDetailIdList = new ArrayList<>();
         if (hasOrderNos.size() > 0) {
-            List<ApsProductionOrderDo> apsProductionOrderDos = apsProductDetailDao.getProductionOrders(hasOrderNos);
-            List<ApsProductDetailDo> apsProductDetailDos = apsProductDetailDao.getProductDetails(hasOrderNos);
+            List<ApsProductionOrderDo> apsProductionOrderDos = apsProductDetailDao.getProductionOrders(curtenantid, hasOrderNos);
+            List<ApsProductDetailDo> apsProductDetailDos = apsProductDetailDao.getProductDetails(curtenantid, hasOrderNos);
 //        List<ApsCustomerManagementDo> customDatas = apsProductDetailDao.getCustomerData();
             //明细 物料、合金、合金状态转换
             List<ApsProcessMaterialDo> materialDos = apsProductDetailDao.getMaterialData();
@@ -194,7 +197,7 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
                         apsProductDetailDo.setProwidth(vNcOrderDetailVo.getProwidth());
                         apsProductDetailDo.setProlength(vNcOrderDetailVo.getProlength());
                         apsProductDetailDo.setTotalordercount(vNcOrderDetailVo.getTotalordercount());
-                        apsProductDetailDo.setRollnum(vNcOrderDetailVo.getRollnum());
+//                        apsProductDetailDo.setRollnum(vNcOrderDetailVo.getRollnum());
                         apsProductDetailDo.setRemark(vNcOrderDetailVo.getRemark());
 
                         apsProductDetailDoList.add(apsProductDetailDo);
@@ -278,9 +281,11 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
     更新合并客户订单
      */
     @Override
-    public R updateMergeCustomOrder(List<String> orderNos) {
+    public R updateMergeCustomOrder(@RequestBody Map<String, Object> params) {
         StringBuffer noOrderNos = new StringBuffer();//不存在客户订单系统里的客户订单号
         List<String> hasOrderNos = new ArrayList<>();//存在客户订单系统里的客户订单号
+        String curtenantid = params.get("CURTENANTID").toString();
+        List<String> orderNos = (List<String>) params.get("ORDERNOS");
 
         //客户订单系统的数据
         List<VNcOrderVo> vNcOrderVoList = slaveSourceService.getVNcOrderVo(orderNos);
@@ -294,8 +299,8 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
         }
 
         //本系统的订单信息
-        List<ApsProductionMergeOrderDo> apsProductionMergeOrderDos = apsProductDetailDao.getProductionMergeOrders(hasOrderNos);
-        List<ApsProductDetailDo> apsProductDetailDos = apsProductDetailDao.getProductDetails(hasOrderNos);
+        List<ApsProductionMergeOrderDo> apsProductionMergeOrderDos = apsProductDetailDao.getProductionMergeOrders(curtenantid, hasOrderNos);
+        List<ApsProductDetailDo> apsProductDetailDos = apsProductDetailDao.getProductDetails(curtenantid, hasOrderNos);
         List<ApsProductionMergeOrderDo> apsProductionMergeOrderDoList = new ArrayList<>();
         List<ApsProductDetailDo> apsProductDetailDoList = new ArrayList<>();
         List<String> delProductDetailIdList = new ArrayList<>();
@@ -362,7 +367,7 @@ public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao
                     apsProductDetailDo.setProwidth(vNcOrderDetailVo.getProwidth());
                     apsProductDetailDo.setProlength(vNcOrderDetailVo.getProlength());
                     apsProductDetailDo.setTotalordercount(vNcOrderDetailVo.getTotalordercount());
-                    apsProductDetailDo.setRollnum(vNcOrderDetailVo.getRollnum());
+//                    apsProductDetailDo.setRollnum(vNcOrderDetailVo.getRollnum());
                     apsProductDetailDo.setRemark(vNcOrderDetailVo.getRemark());
 
                     apsProductDetailDoList.add(apsProductDetailDo);

+ 35 - 35
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductionOrderServiceImpl.java

@@ -199,50 +199,50 @@ public class ApsProductionOrderServiceImpl extends ServiceImpl<ApsProductionOrde
         }
 
         //查询此订单所有产品明细对应的输出成品的卷数和
-        List<ProductDetailIdAndPlanOutPutRollCountAllVo> planOutPutRollCountAllVos = this.baseMapper.getProductDetailIdAndPlanOutPutRollCountAll(apsProductDetailVoList.get(0).getMainid());
+//        List<ProductDetailIdAndPlanOutPutRollCountAllVo> planOutPutRollCountAllVos = this.baseMapper.getProductDetailIdAndPlanOutPutRollCountAll(apsProductDetailVoList.get(0).getMainid());
         //检查每个订单产品,如果该订单产品填写了卷数,
         //并且该订单产品对应坯料输出成品的计划输出订单卷数合计不等于订单产品的卷数,
         //错误提示:订单产品 {输入物料描述} 的卷数与坯料计划的计划输出订单卷数不一致
-        for (ApsProductDetailVo apsProductDetailVo : apsProductDetailVoList) {
-            if (ObjectUtil.isNotEmpty(apsProductDetailVo.getRollnum())) {
-                for (ProductDetailIdAndPlanOutPutRollCountAllVo planOutPutRollCountAllVo : planOutPutRollCountAllVos) {
-                    if (planOutPutRollCountAllVo.getProductDetailId().equals(apsProductDetailVo.getId())) {
-                        if (planOutPutRollCountAllVo.getPlanOutPutRollCountAll().equals(apsProductDetailVo.getRollnum())) {
-                            break;
-                        } else {
-                            return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + " 的卷数与坯料计划的计划输出订单卷数不一致");
-                        }
-                    }
-                }
-            }
-        }
+//        for (ApsProductDetailVo apsProductDetailVo : apsProductDetailVoList) {
+//            if (ObjectUtil.isNotEmpty(apsProductDetailVo.getRollnum())) {
+//                for (ProductDetailIdAndPlanOutPutRollCountAllVo planOutPutRollCountAllVo : planOutPutRollCountAllVos) {
+//                    if (planOutPutRollCountAllVo.getProductDetailId().equals(apsProductDetailVo.getId())) {
+//                        if (planOutPutRollCountAllVo.getPlanOutPutRollCountAll().equals(apsProductDetailVo.getRollnum())) {
+//                            break;
+//                        } else {
+//                            return R.error("订单产品 " + apsProductDetailVo.getInputmaterialdescription() + " 的卷数与坯料计划的计划输出订单卷数不一致");
+//                        }
+//                    }
+//                }
+//            }
+//        }
 
         //===============校验产品明细的长===================
         if (ObjectUtil.isEmpty(apsProductDetailVoList)) {
             return R.error("产品明细至少有一个");
         }
 
-        //获取产品明细的所有产品类型ID(去重)
-        Set<String> productTypeIds = apsProductDetailVoList.stream().map(ApsProductDetailVo::getProducttypeid).collect(Collectors.toSet());
-        String join = String.join("','", productTypeIds);
-
-        List<ProductTypeIdAndPidVo> productTypeIdAndPidList = this.baseMapper.selectProductTypeIdAndPid(join);
-        if (ObjectUtil.isNotEmpty(productTypeIdAndPidList)) {
-            for (ProductTypeIdAndPidVo productTypeIdAndPidVo : productTypeIdAndPidList) {
-                for (int i = 0; i < apsProductDetailVoList.size(); i++) {
-                    ApsProductDetailVo apsProductDetailVo = apsProductDetailVoList.get(i);
-                    if (apsProductDetailVo.getProducttypeid().equals(productTypeIdAndPidVo.getId())) {
-                        //如果是铝板或铝锭
-                        if (productTypeIdAndPidVo.getPid().equals(SaveConstans.ProductionType.LVBAN_ID) || productTypeIdAndPidVo.getPid().equals(SaveConstans.ProductionType.BANDING_ID)) {
-                            //判断长度是否为空
-                            if (ObjectUtil.isEmpty(apsProductDetailVo.getProlength())) {
-                                return R.error("第" + (i + 1) + "个产品明细,产品类型是铝板或板锭时长度必填");
-                            }
-                        }
-                    }
-                }
-            }
-        }
+//        //获取产品明细的所有产品类型ID(去重)
+//        Set<String> productTypeIds = apsProductDetailVoList.stream().map(ApsProductDetailVo::getProducttypeid).collect(Collectors.toSet());
+//        String join = String.join("','", productTypeIds);
+//
+//        List<ProductTypeIdAndPidVo> productTypeIdAndPidList = this.baseMapper.selectProductTypeIdAndPid(join);
+//        if (ObjectUtil.isNotEmpty(productTypeIdAndPidList)) {
+//            for (ProductTypeIdAndPidVo productTypeIdAndPidVo : productTypeIdAndPidList) {
+//                for (int i = 0; i < apsProductDetailVoList.size(); i++) {
+//                    ApsProductDetailVo apsProductDetailVo = apsProductDetailVoList.get(i);
+//                    if (apsProductDetailVo.getProducttypeid().equals(productTypeIdAndPidVo.getId())) {
+//                        //如果是铝板或铝锭
+//                        if (productTypeIdAndPidVo.getPid().equals(SaveConstans.ProductionType.LVBAN_ID) || productTypeIdAndPidVo.getPid().equals(SaveConstans.ProductionType.BANDING_ID)) {
+//                            //判断长度是否为空
+//                            if (ObjectUtil.isEmpty(apsProductDetailVo.getProlength())) {
+//                                return R.error("第" + (i + 1) + "个产品明细,产品类型是铝板或板锭时长度必填");
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//        }
 
         List<ApsProductDetailDo> productDetailDoList = BeanUtil.copyToList(apsProductDetailVoList, ApsProductDetailDo.class);
         //================循环校验坯料计划===============

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

@@ -199,8 +199,9 @@ public class ApsReportRecordsServiceImpl extends ServiceImpl<ApsReportRecordsDao
         //查询此工序对应工艺步骤中,对应设备的设备参数
         String equparames = "";
         //查询工序步骤
-        String processcode = apsProcessOperationDo.getProcesscode();
-        ApsCraftStepDo craftStepDo = apsCraftStepService.getOne(new QueryWrapper<ApsCraftStepDo>().lambda().eq(ApsCraftStepDo::getProcesscode, processcode));
+        String process = apsProcessOperationDo.getProcess();
+        String processname = apsProcessOperationDo.getProcessname();
+        ApsCraftStepDo craftStepDo = apsCraftStepService.getOne(new QueryWrapper<ApsCraftStepDo>().lambda().eq(ApsCraftStepDo::getProcess, process).eq(ApsCraftStepDo::getProcessname, processname));
         if (ObjectUtil.isNotEmpty(craftStepDo)) {
             //查询设备参数子表
             ApsCraftEquDo apsCraftEquDo = apsCraftEquService.getOne(new QueryWrapper<ApsCraftEquDo>().lambda().eq(ApsCraftEquDo::getMainid, craftStepDo.getId()).eq(ApsCraftEquDo::getResourceid, apsProcessOperationProcessEquDo.getProcessdeviceid()));

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

@@ -0,0 +1,94 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONConfig;
+import cn.hutool.json.JSONUtil;
+import com.rongwei.bscommon.sys.dao.ApsBlankOrderDao;
+import com.rongwei.bscommon.sys.fegin.RwApsServer;
+import com.rongwei.bscommon.sys.service.ApsBlankOrderService;
+import com.rongwei.bscommon.sys.service.ApsService;
+import com.rongwei.bsentity.vo.ApsBlankOrderVo;
+import com.rongwei.bsentity.vo.ProductionScheduleRetVo;
+import com.rongwei.bsentity.vo.ProductionScheduleVo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.StringUtils;
+import com.rongwei.safecommon.utils.CXCommonUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+@Service
+public class ApsServiceImpl implements ApsService {
+
+    private static final Logger logger = LoggerFactory.getLogger(ApsServiceImpl.class);
+    @Autowired
+    private RedissonClient redissonClient;
+    @Autowired
+    private ApsBlankOrderService apsBlankOrderService;
+    @Autowired
+    private ApsBlankOrderDao apsBlankOrderDao;
+    @Autowired
+    private RwApsServer rwApsServer;
+
+    @Override
+    public void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders) {
+        // 当前等路人所属工厂
+        SysUserVo currentUser = CXCommonUtils.getCurrentUser();
+        String tenantId = currentUser.getOrganizationDoList().get(0).getFullpid().split(",")[1];
+        if (StringUtils.isBlank(tenantId)) {
+            throw new CustomException("所属工厂不能为空");
+        }
+        assert apsBlankOrders != null : "排程订单不能为空";
+        // 按照所属工厂加锁
+        RLock rLock = redissonClient.getLock(tenantId);
+        boolean isLocked = rLock.isLocked();
+        // 锁是否被占用
+        if(isLocked){
+            throw new CustomException("正在排程、请稍等一会!");
+        }else{
+            try {
+                // 加锁最大1小时
+                rLock.lock(1, TimeUnit.HOURS);
+                // 合并待发布未锁定的订单一起排程
+                List<String> hasIds = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
+                String idStrs = CollUtil.join(hasIds, "','");
+                idStrs = "'" + idStrs + "'";
+                // 查询存在未锁定的作业坯料计划
+//            List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getFbNotLock(idStrs,tenantId);
+                List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getOrdersHasNotLockProcess(idStrs,tenantId);
+                if (fbNotLock != null && fbNotLock.size() > 0) {
+                    apsBlankOrders.addAll(fbNotLock);
+                }
+
+                // 模型转换
+                ProductionScheduleVo productionScheduleVo = apsBlankOrderService.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));
+                // APS平台排程接口调用
+                ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
+                if (!"200".equals(productionScheduleRetVo.getCode())) {
+                    throw new CustomException(productionScheduleRetVo.getMsg());
+                }
+                apsBlankOrderService.apsAfter(productionScheduleRetVo,apsBlankOrders);
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw e;
+            } finally {
+                rLock.forceUnlock();
+                System.out.println("解锁....");
+                logger.info("解锁....");
+            }
+        }
+    }
+
+}

+ 10 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOutputProductDo.java

@@ -167,5 +167,15 @@ public class ApsProcessOutputProductDo extends BaseDo {
      */
     private BigDecimal prolength;
 
+    /**
+     * 产品类型ID
+     */
+    private String producttypeid;
+
+    /**
+     * 输出卷径(mm)
+     */
+    private BigDecimal rolloutputdiameter;
+
     private static final long serialVersionUID = 1L;
 }

+ 23 - 3
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProductDetailDo.java

@@ -88,12 +88,12 @@ public class ApsProductDetailDo extends BaseDo {
     /**
      * 单卷重(起)
      */
-    private BigDecimal singlerollweightstart;
+//    private BigDecimal singlerollweightstart;
 
     /**
      * 单卷重(止)
      */
-    private BigDecimal singlerollweightend;
+//    private BigDecimal singlerollweightend;
 
     /**
      * 数量单位
@@ -103,7 +103,7 @@ public class ApsProductDetailDo extends BaseDo {
     /**
      * 卷数
      */
-    private Integer rollnum;
+//    private Integer rollnum;
 
     /**
      * 生产状态
@@ -150,6 +150,26 @@ public class ApsProductDetailDo extends BaseDo {
      */
     private String customorderno;
 
+    /**
+     * 卷重要求
+     */
+    private String rollweightrequirement;
+
+    /**
+     * 卷径要求
+     */
+    private String rolldiameterrequirement;
+
+    /**
+     * 套筒要求
+     */
+    private String sleeverequirement;
+
+    /**
+     * 卷数要求
+     */
+    private String rollnumberrequirement;
+
     private static final long serialVersionUID = 1L;
 }
 

+ 26 - 1
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProductionOrderDo.java

@@ -271,6 +271,16 @@ public class ApsProductionOrderDo extends BaseDo implements Serializable {
      */
     private BigDecimal innercorediameter;
 
+    /**
+     * 管芯材质
+     */
+    private String corematerial;
+
+    /**
+     * 正反面
+     */
+    private String frontandbacksides;
+
     /**
      * 包装方式
      */
@@ -282,7 +292,7 @@ public class ApsProductionOrderDo extends BaseDo implements Serializable {
     private String tag;
 
     /**
-     * 表面要求
+     * 亮暗面
      */
     private String surfacerequirement;
 
@@ -311,6 +321,11 @@ public class ApsProductionOrderDo extends BaseDo implements Serializable {
      */
     private String rollweightrequirement;
 
+    /**
+     * 托盘要求
+     */
+    private String pallentrequirements;
+
     /**
      * 其他订单执行标准
      */
@@ -331,6 +346,16 @@ public class ApsProductionOrderDo extends BaseDo implements Serializable {
      */
     private Date technicalreviewdate;
 
+    /**
+     * 是否需要质量评审
+     */
+    private String needqualityreview;
+
+    /**
+     * 是否需要部长评审
+     */
+    private String needreview;
+
     /**
      * 质量评审人ID
      */

+ 11 - 1
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsScheduleConfigDo.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author fpy
- * @since 2024-05-08
+ * @since 2024-05-28
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -127,6 +127,16 @@ public class ApsScheduleConfigDo extends BaseDo {
      */
     @TableField("ALUMINUMDENSITY")
     private BigDecimal aluminumdensity;
+    /**
+     * 洗炉时间(小时)
+     */
+    @TableField("WASHINGTIME")
+    private Integer washingtime;
+    /**
+     * 立板时间(小时)
+     */
+    @TableField("STANDINGTIME")
+    private Integer standingtime;
 
 
 }

+ 6 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/AspCheckItemsDo.java

@@ -370,5 +370,11 @@ public class AspCheckItemsDo extends BaseDo {
     @TableField("BEARINGUNIT")
     private String bearingunit;
 
+    /**
+     * 关联设备
+     */
+    @TableField("EQUASSOCIATED")
+    private String equassociated;
+
 
 }

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

@@ -87,6 +87,11 @@ public class Equipment{
      */
     private Integer lastProcessCutfinishmin;
 
+    /**
+     * 关联设备,铸轧机关联的熔炼炉
+     */
+    private String equassociated;
+
     /**
      * 设备运行时间段
      */

+ 13 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionProcesses.java

@@ -180,6 +180,11 @@ public class ProductionProcesses{
      */
     private boolean mergeProcesses;
 
+    /**
+     * 合金
+     */
+    private String volumeMetal;
+
     public String getEquipmentType() {
         return equipmentType;
     }
@@ -446,4 +451,12 @@ public class ProductionProcesses{
     public void setMergeProcesses(boolean mergeProcesses) {
         this.mergeProcesses = mergeProcesses;
     }
+
+    public String getVolumeMetal() {
+        return volumeMetal;
+    }
+
+    public void setVolumeMetal(String volumeMetal) {
+        this.volumeMetal = volumeMetal;
+    }
 }

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

@@ -48,4 +48,13 @@ public class ProductionScheduleVo {
 
     private Map<String,List<String>> blankProcessIds;
 
+    /**
+     * 洗炉时间(小时)
+     */
+    private Integer washingtime;
+    /**
+     * 立板时间(小时)
+     */
+    private Integer standingtime;
+
 }

+ 6 - 7
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProductDetailController.java

@@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -46,10 +45,10 @@ public class ApsProductDetailController {
     更新客户订单
      */
     @PostMapping("/updateCustomOrder")
-    public R updateCustomOrder(@RequestBody List<String> orderNos){
+    public R updateCustomOrder(@RequestBody Map<String, Object> params) {
         try {
-            log.info("更新客户订单;参数为:{}", orderNos);
-            return apsProductDetailService.updateCustomOrder(orderNos);
+            log.info("更新客户订单;参数为:{}", params);
+            return apsProductDetailService.updateCustomOrder(params);
         } catch (Exception e) {
             e.printStackTrace();
             return R.error("获取客户订单系统订单失败,请联系管理员");
@@ -60,10 +59,10 @@ public class ApsProductDetailController {
     更新合并客户订单
      */
     @PostMapping("/updateMergeCustomOrder")
-    public R updateMergeCustomOrder(@RequestBody List<String> orderNos){
+    public R updateMergeCustomOrder(@RequestBody Map<String, Object> params) {
         try {
-            log.info("更新客户订单;参数为:{}", orderNos);
-            return apsProductDetailService.updateMergeCustomOrder(orderNos);
+            log.info("更新客户订单;参数为:{}", params);
+            return apsProductDetailService.updateMergeCustomOrder(params);
         } catch (Exception e) {
             e.printStackTrace();
             return R.error("获取客户订单系统订单失败,请联系管理员");