Browse Source

排程数据组装优化

fangpy 1 year ago
parent
commit
e9b62938f2
15 changed files with 668 additions and 57 deletions
  1. 16 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsFurnaceInstallationDao.java
  2. 16 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsMergeFurnaceDao.java
  3. 16 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsFurnaceInstallationService.java
  4. 16 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsMergeFurnaceService.java
  5. 2 1
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  6. 20 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsFurnaceInstallationServiceImpl.java
  7. 20 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsMergeFurnaceServiceImpl.java
  8. 345 53
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsServiceImpl.java
  9. 3 3
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/utils/CodeGeneration.java
  10. 92 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsFurnaceInstallationDo.java
  11. 61 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsMergeFurnaceDo.java
  12. 12 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsOverallConfig.java
  13. 27 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CommonVo.java
  14. 10 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionProcesses.java
  15. 12 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionScheduleVo.java

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

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ApsFurnaceInstallationDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 小卷成退合并装炉分组 Mapper 接口
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+public interface ApsFurnaceInstallationDao extends BaseMapper<ApsFurnaceInstallationDo> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ApsMergeFurnaceDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 小卷成退合并装炉兼容 Mapper 接口
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+public interface ApsMergeFurnaceDao extends BaseMapper<ApsMergeFurnaceDo> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ApsFurnaceInstallationDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 小卷成退合并装炉分组 服务类
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+public interface ApsFurnaceInstallationService extends IService<ApsFurnaceInstallationDo> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ApsMergeFurnaceDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 小卷成退合并装炉兼容 服务类
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+public interface ApsMergeFurnaceService extends IService<ApsMergeFurnaceDo> {
+
+}

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

@@ -572,7 +572,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     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));
+        processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
+                .in(ApsProcessOperationProcessEquDo::getBlankid, blankids).eq(ApsProcessOperationProcessEquDo::getLockmark,"n"));
         logger.info("作业明细删除结束..: " + blankids);
         // 排程结果保存
         List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();

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

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ApsFurnaceInstallationDo;
+import com.rongwei.bscommon.sys.dao.ApsFurnaceInstallationDao;
+import com.rongwei.bscommon.sys.service.ApsFurnaceInstallationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 小卷成退合并装炉分组 服务实现类
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+@Service
+public class ApsFurnaceInstallationServiceImpl extends ServiceImpl<ApsFurnaceInstallationDao, ApsFurnaceInstallationDo> implements ApsFurnaceInstallationService {
+
+}

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

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ApsMergeFurnaceDo;
+import com.rongwei.bscommon.sys.dao.ApsMergeFurnaceDao;
+import com.rongwei.bscommon.sys.service.ApsMergeFurnaceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 小卷成退合并装炉兼容 服务实现类
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+@Service
+public class ApsMergeFurnaceServiceImpl extends ServiceImpl<ApsMergeFurnaceDao, ApsMergeFurnaceDo> implements ApsMergeFurnaceService {
+
+}

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

@@ -8,6 +8,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONConfig;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.rongwei.bscommon.sys.dao.ApsBlankOrderDao;
 import com.rongwei.bscommon.sys.fegin.RwApsServer;
 import com.rongwei.bscommon.sys.service.*;
@@ -21,6 +22,7 @@ import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.safecommon.utils.CXCommonUtils;
 import com.rongwei.safecommon.utils.SaveConstans;
+import org.apache.commons.math3.stat.descriptive.summary.Product;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -33,6 +35,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -65,6 +68,10 @@ public class ApsServiceImpl implements ApsService {
     private ApsEquipmentCalendarService apsEquipmentCalendarService;
     @Autowired
     private ApsProcessOperationOutMaterService apsProcessOperationOutMaterService;
+    @Autowired
+    private ApsFurnaceInstallationService apsFurnaceInstallationService;
+    @Autowired
+    private ApsMergeFurnaceService apsMergeFurnaceService;
 
     @Override
 //    @Async("customThreadPool")
@@ -166,14 +173,18 @@ public class ApsServiceImpl implements ApsService {
                     }
                     return a;
                 });
+                // 排程前解锁所有待排程订单
+                List<String> blankOrderIds = new ArrayList<>();
+                apsBlankOrders.forEach((bo)->{
+                    blankOrderIds.add(bo.getId());
+                });
+                processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().set(ApsProcessOperationProcessEquDo::getLockmark,"n")
+                        .in(ApsProcessOperationProcessEquDo::getBlankid,blankOrderIds));
                 // 排程
                 List<ProductionScheduleVo> productionScheduleVos = new ArrayList<>();
                 Map<String,List<ApsBlankOrderVo>> dataMap = new HashMap<>();
-                // 自动排序
-                List<List<ApsBlankOrderVo>> apsOrders = new ArrayList<>();
-                for (ApsBlankOrderVo apsBlankOrder : apsBlankOrders) {
+                Map<String,ApsBlankOrderVo> dataMapOrder = new HashMap<>();
 
-                }
                 // 所有设备
                 List<AspCheckItemsDo> eqs = aspCheckItemsService.list(new LambdaQueryWrapper<>());
                 Map<String, AspCheckItemsDo> eqMaps = new HashMap<>();
@@ -183,14 +194,18 @@ public class ApsServiceImpl implements ApsService {
                 apsBlankOrders.forEach((bo)->{
                     List<ApsBlankOrderVo> v = new ArrayList<>();
                     v.add(bo);
+                    dataMapOrder.put(bo.getId(),bo);
                     // 模型转换
                     ProductionScheduleVo productionScheduleVo = apsProductionScheduleInit(v);
                     productionScheduleVos.add(productionScheduleVo);
                     dataMap.put(productionScheduleVo.getProductionScheduleId(),v);
                 });
                 if(productionScheduleVos != null && productionScheduleVos.size()>0){
+                    JSONConfig jsonConfig = JSONConfig.create();
+                    jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
+                    List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
                     // 提前退火排程
-                    ProductionScheduleVo productionScheduleThVo = new ProductionScheduleVo();
+                    /*ProductionScheduleVo productionScheduleThVo = new ProductionScheduleVo();
                     productionScheduleThVo.setProductionScheduleId("提前退火排程-"+SecurityUtil.getUUID());
                     productionScheduleThVo.setApsPlanStartDate(productionScheduleVos.get(0).getApsPlanStartDate());
                     productionScheduleThVo.setPlanSeconds(productionScheduleVos.get(0).getPlanSeconds());
@@ -223,25 +238,166 @@ public class ApsServiceImpl implements ApsService {
                     List<Equipment> equipmentList = new ArrayList<>();
                     List<ApsProcessOperationDo> operationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
                             .in(ApsProcessOperationDo::getBlankid, thBlankIds));
-                    List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
                     for (ApsProcessOperationDo operationDo : operationDos) {
-                        List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList,eqMaps,thBlankIds,productionScheduleThVo,apsConfigs.get(0));
+                        List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList,eqMaps,thBlankIds,null,productionScheduleThVo,apsConfigs.get(0));
                     }
                     productionScheduleThVo.setEquipmentList(equipmentList);
 
                     // 退火排程
-                    JSONConfig jsonConfig = JSONConfig.create();
-                    jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
                     System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleThVo, jsonConfig));
                     logger.info("排程数据:" + JSONUtil.toJsonStr(productionScheduleThVo, jsonConfig));
                     // APS平台排程接口调用
                     ProductionScheduleRetVo productionScheduleRetThVo = rwApsServer.productionThSchedule(productionScheduleThVo);
                     if (!"200".equals(productionScheduleRetThVo.getCode())) {
                         throw new CustomException(productionScheduleRetThVo.getMsg());
-                    }
+                    }*/
 
-                    // 全部排程
+                    // 全部排程,每4个一组
+                    Map<String,ProductionProcesses> allProcesses = new HashMap<>();
+                    List<ProductionProcesses> rootProcesses = new ArrayList<>();
                     for (ProductionScheduleVo productionScheduleVo : productionScheduleVos) {
+                        for (ProductionProcesses process : productionScheduleVo.getProcesses()) {
+                            allProcesses.put(process.getId(),process);
+                            if(process.getPreviousProcessesIds() == null || process.getPreviousProcessesIds().size() == 0){
+                                rootProcesses.add(process);
+                            }
+                        }
+                    }
+                    // 坯料计划排序
+                    Collections.sort(rootProcesses,(v1,v2)->{
+                        // 合金
+                        String alloy1 = v1.getVolumeMetal();
+                        String alloy2 = v2.getVolumeMetal();
+                        // 合金状态
+                        String alloystatus1 = v1.getVolumeMetalstate();
+                        String alloystatus2 = v2.getVolumeMetalstate();
+                        // 产品类型
+                        String producttype1 = v1.getProducttype();
+                        String producttype2 = v2.getProducttype();
+                        // 宽度
+                        BigDecimal prowidth1 = v1.getVolumeWidth();
+                        BigDecimal prowidth2 = v2.getVolumeWidth();
+                        // 厚度
+                        BigDecimal thickness1 = v1.getVolumeThickness();
+                        BigDecimal thickness2 = v2.getVolumeThickness();
+                        // 重量
+                        BigDecimal singlerollweight1 = v1.getSinglerollweight();
+                        BigDecimal singlerollweight2 = v2.getSinglerollweight();
+
+                        int a = 0;
+                        // 宽度
+                        if(prowidth1.compareTo(prowidth2) == 0){
+                            // 合金
+                            if(alloy1.compareTo(alloy2) == 0){
+                                // 产品类型
+                                if(producttype1 == null || producttype2 == null || producttype1.compareTo(producttype2) == 0){
+                                    // 厚度
+                                    if(thickness1.compareTo(thickness2) == 0){
+                                        // 合金状态
+                                        if(alloystatus1 == null || alloystatus2 == null || alloystatus1.compareTo(alloystatus2) == 0){
+                                            // 重量
+                                            if(singlerollweight1.compareTo(singlerollweight2) == 0){
+                                                a = 0;
+                                            }else if(singlerollweight1.compareTo(singlerollweight2) > 0){
+                                                a = -1;
+                                            }else{
+                                                a = 1;
+                                            }
+                                        }else{
+                                            a = alloystatus1.compareTo(alloystatus2);
+                                        }
+                                    }else{
+                                        if(thickness1.compareTo(thickness2) > 0){
+                                            a = -1;
+                                        }else{
+                                            a = 1;
+                                        }
+                                    }
+                                }else{
+                                    a = producttype1.compareTo(producttype2);
+                                }
+                            }else{
+                                a = alloy1.compareTo(alloy2);
+                            }
+                        }else{
+                            if(prowidth1.compareTo(prowidth2) > 0){
+                                a = -1;
+                            }else{
+                                a = 1;
+                            }
+                        }
+                        return a;
+                    });
+                    List<List<ProductionProcesses>> chunks = new ArrayList<>();
+                    int listSize = rootProcesses.size();
+                    for (int i = 0; i < listSize; i += 4) {
+                        chunks.add(rootProcesses.subList(i, Math.min(i + 4, listSize)));
+                    }
+
+                    // 全部排程,每4个一组
+                    for (List<ProductionProcesses> rootpros : chunks) {
+                        ProductionScheduleVo productionScheduleVo = productionScheduleVoInit();
+                        // 工序作业ID
+                        Set<String> opId = new LinkedHashSet<>();
+                        Set<String> orderIds = new LinkedHashSet<>();
+                        List<ProductionProcesses> pssall = new ArrayList<>();
+                        for (ProductionProcesses processes : rootpros) {
+                            pssall.add(processes);
+                            for (String s : processes.getBsProcessesId()) {
+                                opId.add(s);
+                            }
+                            for (ProduceOrder produceOrder : processes.getProduceOrder()) {
+                                orderIds.add(produceOrder.getId());
+                            }
+                            getAllNextPross(processes,allProcesses,pssall,opId);
+                        }
+                        // 退火工序锁定
+                        /*if(productionScheduleRetThVo.getProcesses() != null && productionScheduleRetThVo.getProcesses().size()>0){
+                            for (ProductionProcesses process : pssall) {
+                                for (ProductionProcesses productionScheduleRetThVoProcess : productionScheduleRetThVo.getProcesses()) {
+                                    if(productionScheduleRetThVoProcess.getId().equals(process.getId())){
+                                        process.setEquipmentId(productionScheduleRetThVoProcess.getEquipmentId());
+                                        List<String> opeqs = new ArrayList<>();
+                                        opeqs.add(productionScheduleRetThVoProcess.getEquipmentId());
+                                        process.setOptionalEquipments(opeqs);
+                                        process.setDelay(0);
+                                        process.setStartTime(productionScheduleRetThVoProcess.getStartTime());
+                                        process.setEndTime(productionScheduleRetThVoProcess.getEndTime());
+                                        process.setIfLock(true);
+                                    }
+                                }
+                            }
+                        }*/
+                        // 排程计划设备集合
+                        List<Equipment> equipmentList1 = new ArrayList<>();
+                        List<ApsProcessOperationDo> operationDos1 = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
+                                .in(ApsProcessOperationDo::getId, opId));
+                        for (ApsProcessOperationDo operationDo : operationDos1) {
+                            List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,null,opId,productionScheduleVo,apsConfigs.get(0));
+                        }
+                        productionScheduleVo.setEquipmentList(equipmentList1);
+                        productionScheduleVo.setProcesses(pssall);
+
+                        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<ApsBlankOrderVo> apsBlankOrderss = new ArrayList<>();
+                        for (String orderId : orderIds) {
+                            ApsBlankOrderVo apsBlankOrderVo = dataMapOrder.get(orderId);
+                            if(apsBlankOrderVo != null){
+                                apsBlankOrderss.add(apsBlankOrderVo);
+                            }
+                        }
+
+                        apsBlankOrderService.apsAfter(productionScheduleRetVo,apsBlankOrderss);
+                    }
+
+                    /*for (ProductionScheduleVo productionScheduleVo : productionScheduleVos) {
                         // 退火工序锁定
                         if(productionScheduleRetThVo.getProcesses() != null && productionScheduleRetThVo.getProcesses().size()>0){
                             for (ProductionProcesses process : productionScheduleVo.getProcesses()) {
@@ -272,7 +428,7 @@ public class ApsServiceImpl implements ApsService {
                         List<ApsProcessOperationDo> operationDos1 = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
                                 .in(ApsProcessOperationDo::getBlankid, blankIds));
                         for (ApsProcessOperationDo operationDo : operationDos1) {
-                            List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankIds,productionScheduleVo,apsConfigs.get(0));
+                            List<String> optionalEquipments = equipmentListInit(operationDo,equipmentList1,eqMaps,blankIds,null,productionScheduleVo,apsConfigs.get(0));
                         }
                         productionScheduleVo.setEquipmentList(equipmentList1);
 
@@ -284,7 +440,7 @@ public class ApsServiceImpl implements ApsService {
                             throw new CustomException(productionScheduleRetVo.getMsg());
                         }
                         apsBlankOrderService.apsAfter(productionScheduleRetVo,dataMap.get(productionScheduleVo.getProductionScheduleId()));
-                    }
+                    }*/
                 }
             } catch (Exception e) {
                 e.printStackTrace();
@@ -297,16 +453,22 @@ public class ApsServiceImpl implements ApsService {
         }
     }
 
-    /**
-     * 原始订单表数据转换APS平台模型数据
-     *
-     * @param apsBlankOrders
-     * @return
-     */
-    @Override
-    public ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders) {
-        // 待排程坯料计划ID集合
-        List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
+    private void getAllNextPross(ProductionProcesses rootProcesses,Map<String,ProductionProcesses> allProcesses,List<ProductionProcesses> pss,Set<String> opId){
+        if(rootProcesses.getNextProcessesIds() != null && rootProcesses.getNextProcessesIds().size()>0){
+            for (String nextProcessesId : rootProcesses.getNextProcessesIds()) {
+                ProductionProcesses processes = allProcesses.get(nextProcessesId);
+                if(processes != null){
+                    pss.add(processes);
+                    for (String s : processes.getBsProcessesId()) {
+                        opId.add(s);
+                    }
+                    getAllNextPross(processes,allProcesses,pss,opId);
+                }
+            }
+        }
+    }
+
+    private ProductionScheduleVo productionScheduleVoInit(){
         ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
         productionScheduleVo.setProductionScheduleId("批量排程-"+SecurityUtil.getUUID());
         List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
@@ -341,7 +503,26 @@ public class ApsServiceImpl implements ApsService {
         // 洗炉合金配置数据设置
         List<WashingMetal> washingMetalConfig = apsBlankOrderDao.getWashingMetalConfig();
         productionScheduleVo.setClosealloynames(washingMetalConfig);
+        // 小卷退火合并
+        List<ApsFurnaceInstallationDo> furnaceInstallationDos = apsFurnaceInstallationService.list();
+        productionScheduleVo.setFurnaceInstallations(furnaceInstallationDos);
+        // 小卷退火兼容
+        List<ApsMergeFurnaceDo> mergeFurnaceDos = apsMergeFurnaceService.list();
+        productionScheduleVo.setMergeFurnaces(mergeFurnaceDos);
+        return productionScheduleVo;
+    }
 
+    /**
+     * 原始订单表数据转换APS平台模型数据
+     *
+     * @param apsBlankOrders
+     * @return
+     */
+    @Override
+    public ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders) {
+        // 待排程坯料计划ID集合
+        List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
+        ProductionScheduleVo productionScheduleVo = productionScheduleVoInit();
         // 排程计划工序任务集合
         List<ProductionProcesses> processesList = new ArrayList<>();
         // 坯料计划ID和所属工序作业ID对应关系
@@ -398,7 +579,7 @@ public class ApsServiceImpl implements ApsService {
     }
 
     private List<String> equipmentListInit(ApsProcessOperationDo operationDo,List<Equipment> equipmentList,Map<String, AspCheckItemsDo> eqMaps
-            ,List<String> blankids,ProductionScheduleVo productionScheduleVo,ApsScheduleConfigDo apsScheduleConfig){
+            ,List<String> blankids,Set<String> opId,ProductionScheduleVo productionScheduleVo,ApsScheduleConfigDo apsScheduleConfig){
         // 设备列表
         List<String> optionalEquipments = new ArrayList<>();
         if (StringUtils.isNotBlank(operationDo.getCanchoosedeviceid())) {
@@ -429,19 +610,45 @@ public class ApsServiceImpl implements ApsService {
                         ep.setFurnace(apsScheduleConfig.getFurnace());
                         equipment.setEquipmentParameter(ep);
                         // 查询设备锁定的已排程的时间段
-                        List<ApsProcessOperationProcessEquDo> processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
-                                .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
-                                .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
-                                .ge(ApsProcessOperationProcessEquDo::getPlanenddate, productionScheduleVo.getApsPlanStartDate())
-                                .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
-                        );
+                        List<ApsProcessOperationProcessEquDo> processEqus = null;
+                        if(blankids != null && blankids.size()>0){
+                            processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                    .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+//                                    .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
+                                    .ge(ApsProcessOperationProcessEquDo::getPlanenddate, productionScheduleVo.getApsPlanStartDate())
+                                    .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                            );
+                        }else if(opId != null && opId.size()>0){
+                            processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                    .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+//                                    .notIn(ApsProcessOperationProcessEquDo::getProcessid, opId)
+                                    .ge(ApsProcessOperationProcessEquDo::getPlanenddate, productionScheduleVo.getApsPlanStartDate())
+                                    .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                            );
+                        }
+
                         // 查询当前设备最后一个生产任务、连续生产需要考虑使用
-                        List<ApsProcessOperationProcessEquDo> lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
-                                .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
-                                .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
-                                .lt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
-                                .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
-                        );
+                        List<ApsProcessOperationProcessEquDo> lastpros = null;
+                        if(blankids != null && blankids.size()>0){
+                            lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                    .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+//                                    .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
+                                    .lt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
+                                    .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                            );
+                        }else if(opId != null && opId.size()>0){
+                            lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                    .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                    .eq(ApsProcessOperationProcessEquDo::getLockmark, "y")
+//                                    .notIn(ApsProcessOperationProcessEquDo::getProcessid, opId)
+                                    .lt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
+                                    .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                            );
+                        }
+
                         if (lastpros != null && lastpros.size() > 0) {
                             boolean hasLast = true;
                             ApsProcessOperationProcessEquDo lastpro = lastpros.get(0);
@@ -629,6 +836,7 @@ public class ApsServiceImpl implements ApsService {
             for (String equIds : sbIds) {
                 optionalEquipments.add(equIds);
             }
+            // 锁定的作业
             if(LOCKMARK_Y.equals(operationDo.getLockmark())){
                 List<ApsProcessOperationProcessEquDo> processDetails = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
                         .eq(ApsProcessOperationProcessEquDo::getProcessid, operationDo.getId()));
@@ -645,24 +853,104 @@ public class ApsServiceImpl implements ApsService {
                     operationProcess.add(processes);
                 }
             }else{
-                for (Integer i = 0; i < operationDo.getPlanprocessrall(); i++) {
-                    ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
-                    if(apsBlankOrderVo.getPlanhavematerialdate() != null){
-                        // 全局配置
-                        ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
-                        Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
-                        LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
-                        apsOverallConfig.setStartTimeLong(startDate.getTime());
-                        apsOverallConfig.setStartTime(startTime);
-                        // 排程全局配置
-                        apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
-                        apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
-                        apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
-                        apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
-                        apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
-                        processes.setApsOverallConfig(apsOverallConfig);
+                if("小卷成退".equals(operationDo.getProcess())){
+                    String previousprocessid = operationDo.getPreviousprocessid();
+                    ApsProcessOperationDo preprocess = apsProcessOperationService.getById(previousprocessid);
+                    if(preprocess == null){
+                        throw new CustomException("小卷成退没有前道工序:"+operationDo.getId());
+                    }
+                    Integer planprocessrall = preprocess.getPlanprocessrall();
+                    Integer ys = operationDo.getPlanprocessrall() % planprocessrall;
+                    Integer js = operationDo.getPlanprocessrall() / planprocessrall;
+                    for (Integer i = 0; i < planprocessrall; i++) {
+                        ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
+                        if(apsBlankOrderVo.getPlanhavematerialdate() != null){
+                            // 全局配置
+                            ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
+                            Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
+                            LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                            apsOverallConfig.setStartTimeLong(startDate.getTime());
+                            apsOverallConfig.setStartTime(startTime);
+                            // 排程全局配置
+                            apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
+                            apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
+                            apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
+                            apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
+                            apsOverallConfig.setFurnaceInstallations(productionScheduleVo.getFurnaceInstallations());
+                            apsOverallConfig.setMergeFurnaces(productionScheduleVo.getMergeFurnaces());
+                            apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
+                            processes.setApsOverallConfig(apsOverallConfig);
+                        }
+                        Integer alls = js;
+                        if(i<ys){
+                            alls = alls + 1;
+                        }
+                        processes.setSinglerollweight(operationDo.getSinglerollweight().multiply(new BigDecimal(alls)));
+
+                        operationProcess.add(processes);
+                    }
+
+                } else if ("小卷包装".equals(operationDo.getProcess())) {
+                    String previousprocessid = operationDo.getPreviousprocessid();
+                    ApsProcessOperationDo preprocess = apsProcessOperationService.getById(previousprocessid);
+                    if(preprocess == null){
+                        throw new CustomException("小卷成退没有前道工序:"+operationDo.getId());
+                    }
+                    if("小卷成退".equals(preprocess.getProcess())){
+                        preprocess = apsProcessOperationService.getById(preprocess.getPreviousprocessid());
+                    }
+                    Integer planprocessrall = preprocess.getPlanprocessrall();
+                    Integer ys = operationDo.getPlanprocessrall() % planprocessrall;
+                    Integer js = operationDo.getPlanprocessrall() / planprocessrall;
+                    for (Integer i = 0; i < planprocessrall; i++) {
+                        ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
+                        if(apsBlankOrderVo.getPlanhavematerialdate() != null){
+                            // 全局配置
+                            ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
+                            Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
+                            LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                            apsOverallConfig.setStartTimeLong(startDate.getTime());
+                            apsOverallConfig.setStartTime(startTime);
+                            // 排程全局配置
+                            apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
+                            apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
+                            apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
+                            apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
+                            apsOverallConfig.setFurnaceInstallations(productionScheduleVo.getFurnaceInstallations());
+                            apsOverallConfig.setMergeFurnaces(productionScheduleVo.getMergeFurnaces());
+                            apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
+                            processes.setApsOverallConfig(apsOverallConfig);
+                        }
+                        Integer alls = js;
+                        if(i<ys){
+                            alls = alls + 1;
+                        }
+                        processes.setProduceTime(operationDo.getOnceprocessmin().intValue() * alls);
+
+                        operationProcess.add(processes);
+                    }
+                }else{
+                    for (Integer i = 0; i < operationDo.getPlanprocessrall(); i++) {
+                        ProductionProcesses processes = productionProcessesDetailInit(operationDo, produceOrder, optionalEquipments,outMaterDos);
+                        if(apsBlankOrderVo.getPlanhavematerialdate() != null){
+                            // 全局配置
+                            ApsOverallConfig apsOverallConfig = new ApsOverallConfig();
+                            Date startDate = apsBlankOrderVo.getPlanhavematerialdate();
+                            LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                            apsOverallConfig.setStartTimeLong(startDate.getTime());
+                            apsOverallConfig.setStartTime(startTime);
+                            // 排程全局配置
+                            apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
+                            apsOverallConfig.setWashingtime(productionScheduleVo.getWashingtime());
+                            apsOverallConfig.setStandingtime(productionScheduleVo.getStandingtime());
+                            apsOverallConfig.setClosealloynames(productionScheduleVo.getClosealloynames());
+                            apsOverallConfig.setFurnaceInstallations(productionScheduleVo.getFurnaceInstallations());
+                            apsOverallConfig.setMergeFurnaces(productionScheduleVo.getMergeFurnaces());
+                            apsOverallConfig.setLooseness(productionScheduleVo.getLooseness());
+                            processes.setApsOverallConfig(apsOverallConfig);
+                        }
+                        operationProcess.add(processes);
                     }
-                    operationProcess.add(processes);
                 }
             }
             processesList.addAll(operationProcess);
@@ -687,6 +975,9 @@ public class ApsServiceImpl implements ApsService {
         processes.setProducePcNum(operationDo.getPlanprocessrall());
         processes.setProcessType(operationDo.getProcess());
         // 单次加工时长
+        if(operationDo.getOnceprocessmin() == null){
+            throw new CustomException("坯料计划ID:"+operationDo.getBlankid()+"  作业类型:"+operationDo.getProcess()+"  作业名称:"+operationDo.getProcessname()+"的作业单卷加工时间为空");
+        }
         processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
         processes.setProduceTime(operationDo.getOnceprocessmin().intValue());
         // 单卷宽度和重量
@@ -706,6 +997,7 @@ public class ApsServiceImpl implements ApsService {
         }else{
             processes.setVolumeMetalstate(operationDo.getMetalstate());
         }
+        processes.setProducttype(operationDo.getProducttype());
         // 连续生产标识设置
         // 合金+输入物料+宽度+输入物料厚度+输出物料厚度(取第一个冷轧工序使用)
         processes.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getProducttype() + "^_^" + operationDo.getProwidth() + "^_^" + operationDo.getThickness() + "^_^" + outMaterDos.get(0).getThickness());

+ 3 - 3
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/utils/CodeGeneration.java

@@ -83,7 +83,7 @@ public class CodeGeneration {
         strategy.setSuperEntityClass(BaseDo.class);
         strategy.setRestControllerStyle(true);
         // 设置要映射的表名(重要,需要修改的地方)
-        strategy.setInclude("aps_schedule_config");
+        strategy.setInclude("aps_furnace_installation");
         strategy.setNaming(NamingStrategy.underline_to_camel); // 自动转换表名的驼峰命名法
         strategy.setColumnNaming(NamingStrategy.no_change); // 自动转换列名的驼峰命名法
         strategy.setEntityLombokModel(true); // 是否使用lombox
@@ -127,7 +127,7 @@ public class CodeGeneration {
                 return entityParentPath + tableInfo.getEntityName() + "Do" + StringPool.DOT_JAVA;
             }
         });
-        /*focList.add(new FileOutConfig("/gentemplates/mapper.java.vm") {
+        focList.add(new FileOutConfig("/gentemplates/mapper.java.vm") {
             @Override
             public String outputFile(TableInfo tableInfo) {
                 // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
@@ -147,7 +147,7 @@ public class CodeGeneration {
                 // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                 return commonPath + "service\\impl\\" + tableInfo.getEntityName() + "ServiceImpl" + StringPool.DOT_JAVA;
             }
-        });*/
+        });
         cfg.setFileOutConfigList(focList);
 
         autoGenerator.setCfg(cfg);

+ 92 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsFurnaceInstallationDo.java

@@ -0,0 +1,92 @@
+package com.rongwei.bsentity.domain;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 小卷成退合并装炉分组
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("aps_furnace_installation")
+public class ApsFurnaceInstallationDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId("ID")
+    private String id;
+    /**
+     * 租户ID
+     */
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 分组编号
+     */
+    @TableField("GROUPNUMBER")
+    private String groupnumber;
+    /**
+     * 合金
+     */
+    @TableField("ALLOY")
+    private String alloy;
+    /**
+     * 输出合金状态
+     */
+    @TableField("ALLOYSTATUS")
+    private String alloystatus;
+    /**
+     * 厚度-起(毫米)
+     */
+    @TableField("STARTTHICKNESS")
+    private BigDecimal startthickness;
+    /**
+     * 厚度-止(毫米)
+     */
+    @TableField("ENDTHICKNESS")
+    private BigDecimal endthickness;
+    /**
+     * 宽度-起(毫米)
+     */
+    @TableField("STARTWIDTH")
+    private Integer startwidth;
+    /**
+     * 宽度-止(毫米)
+     */
+    @TableField("ENDWIDTH")
+    private Integer endwidth;
+    /**
+     * 主表id
+     */
+    @TableField("MAINID")
+    private String mainid;
+    /**
+     * 分组描述
+     */
+    @TableField("DESCRIPTION")
+    private String description;
+
+
+}

+ 61 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsMergeFurnaceDo.java

@@ -0,0 +1,61 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 小卷成退合并装炉兼容
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-07-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("aps_merge_furnace")
+public class ApsMergeFurnaceDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId("ID")
+    private String id;
+    /**
+     * 租户ID
+     */
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 兼容组
+     */
+    @TableField("COMPATIBILITYGROUP")
+    private String compatibilitygroup;
+    /**
+     * 主表id
+     */
+    @TableField("MAINID")
+    private byte[] mainid;
+    /**
+     * 兼容组描述
+     */
+    @TableField("COMDESCRIPTION")
+    private String comdescription;
+
+
+}

+ 12 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsOverallConfig.java

@@ -1,6 +1,8 @@
 package com.rongwei.bsentity.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.rongwei.bsentity.domain.ApsFurnaceInstallationDo;
+import com.rongwei.bsentity.domain.ApsMergeFurnaceDo;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -34,6 +36,16 @@ public class ApsOverallConfig implements Serializable {
      */
     private List<WashingMetal> closealloynames;
 
+    /**
+     * 小卷成退合并装炉分组规则
+     */
+    private List<ApsFurnaceInstallationDo> furnaceInstallations;
+
+    /**
+     * 小卷成退合并装炉兼容规则
+     */
+    private List<ApsMergeFurnaceDo> mergeFurnaces;
+
     /**
      * 洗炉时间(小时)
      */

+ 27 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/CommonVo.java

@@ -0,0 +1,27 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class CommonVo {
+
+    private String str1;
+
+    private String str2;
+
+    private String str3;
+
+    private String str4;
+
+    private Integer int1;
+
+    private Integer int2;
+
+    private BigDecimal big1;
+
+    private BigDecimal big2;
+
+    private BigDecimal big3;
+}

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

@@ -109,6 +109,8 @@ public class ProductionProcesses{
     private BigDecimal volumeWidth;
     // 单卷厚度
     private BigDecimal volumeThickness;
+    // 产品类型
+    private String producttype;
 
     /**
      * 单卷重
@@ -535,4 +537,12 @@ public class ProductionProcesses{
     public void setApsOverallConfig(ApsOverallConfig apsOverallConfig) {
         this.apsOverallConfig = apsOverallConfig;
     }
+
+    public String getProducttype() {
+        return producttype;
+    }
+
+    public void setProducttype(String producttype) {
+        this.producttype = producttype;
+    }
 }

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

@@ -3,6 +3,8 @@ package com.rongwei.bsentity.vo;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.rongwei.bsentity.domain.ApsFurnaceInstallationDo;
+import com.rongwei.bsentity.domain.ApsMergeFurnaceDo;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -55,6 +57,16 @@ public class ProductionScheduleVo {
      */
     private List<WashingMetal> closealloynames;
 
+    /**
+     * 小卷成退合并装炉分组规则
+     */
+    private List<ApsFurnaceInstallationDo> furnaceInstallations;
+
+    /**
+     * 小卷成退合并装炉兼容规则
+     */
+    private List<ApsMergeFurnaceDo> mergeFurnaces;
+
     /**
      * 洗炉时间(小时)
      */