ソースを参照

连续生产优化

fangpy 1 年間 前
コミット
f692110203

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

@@ -31,6 +31,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.ZoneId;
 import java.util.*;
@@ -459,11 +460,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         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);
         if (fbNotLock != null && fbNotLock.size() > 0) {
             apsBlankOrders.addAll(fbNotLock);
         }
+
         // 先删除所有作业的明细
         List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
         processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
@@ -626,13 +628,17 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
         productionScheduleVo.setProductionScheduleId("批量排程");
         List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
+        ApsScheduleConfigDo apsScheduleConfig = null;
+        // 松散度
+        BigDecimal looseness = null;
         if (apsConfigs != null && apsConfigs.size() > 0) {
-            ApsScheduleConfigDo apsScheduleConfig = apsConfigs.get(0);
+            apsScheduleConfig = apsConfigs.get(0);
             productionScheduleVo.setPlanSeconds(apsScheduleConfig.getScheduleruntime());
             Map<String, Integer> roamTime = new HashMap<>();
             roamTime.put("WORKSHOP_IN", apsScheduleConfig.getWorkshopin());
             roamTime.put("WORKSHOP_CROSS", apsScheduleConfig.getWorkshopcross());
             productionScheduleVo.setRoamTime(roamTime);
+            looseness = apsScheduleConfig.getLooseness();
             // 排程计划开始时间
             int a = 8;
             if (apsScheduleConfig.getStartschedulerun() != null) {
@@ -698,13 +704,63 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                                             .ge(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
                                             .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
                                     );
+                                    // 查询当前设备最后一个生产任务、连续生产需要考虑使用
+                                    List<ApsProcessOperationProcessEquDo> processLastEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                            .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                            .gt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
+                                            .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                                    );
+                                    if(processLastEqus != null && processLastEqus.size()>0){
+                                        ApsProcessOperationProcessEquDo lastpro = processLastEqus.get(processLastEqus.size()-1);
+                                        ApsProcessOperationDo lastop = apsProcessOperationService.getById(lastpro.getProcessid());
+                                        equipment.setLastProcessType(lastop.getProcess());
+                                        // 铸轧
+                                        if ("铸轧".equals(lastop.getProcess())) {
+                                            // 合金+宽度
+                                            equipment.setLastSeriesProduceMark(lastop.getMetal() + "^_^" + lastop.getProwidth());
+                                        }
+                                        // 冷轧
+                                        else if ("冷轧".equals(lastop.getProcess())) {
+                                            // 合金+输入物料+宽度
+                                            equipment.setLastSeriesProduceMark(lastop.getMetal() + "^_^" + lastop.getPlaninput() + "^_^" + lastop.getProwidth());
+                                        }
+                                    }
+                                    // 查询相关工序作业
+                                    Set<String> processIds = new HashSet<>();
                                     if (processEqus != null && processEqus.size() > 0) {
+                                        for (ApsProcessOperationProcessEquDo equs : processEqus) {
+                                            processIds.add(equs.getProcessid());
+                                        }
+                                        List<ApsProcessOperationDo> processOperationDos = null;
+                                        if(processIds.size()>0){
+                                            processOperationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
+                                                    .in(ApsProcessOperationDo::getId,processIds));
+                                        }
+
                                         List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
                                         for (ApsProcessOperationProcessEquDo equs : processEqus) {
                                             EquipmentRunTime er = new EquipmentRunTime();
                                             er.setStartRunTime(equs.getPlanstartdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
                                             er.setEndRunTime(equs.getPlanenddate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
                                             equipmentRunTimes.add(er);
+                                            // 设备占用时间设置连续生产标识,参与排程
+                                            if(processOperationDos != null){
+                                                List<ApsProcessOperationDo> pos = processOperationDos.stream().filter(v -> v.getId().equals(equs.getProcessid())).collect(Collectors.toList());
+                                                if(pos != null && pos.size()>0){
+                                                    ApsProcessOperationDo processesDo = pos.get(0);
+                                                    er.setProcessType(processesDo.getProcess());
+                                                    // 铸轧
+                                                    if ("铸轧".equals(processesDo.getProcess())) {
+                                                        // 合金+宽度
+                                                        er.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getProwidth());
+                                                    }
+                                                    // 冷轧
+                                                    else if ("冷轧".equals(processesDo.getProcess())) {
+                                                        // 合金+输入物料+宽度
+                                                        er.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getPlaninput() + "^_^" + operationDo.getProwidth());
+                                                    }
+                                                }
+                                            }
                                         }
                                         equipment.setEquipmentRunTimes(equipmentRunTimes);
                                     }
@@ -738,8 +794,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         processes.setProcessType(operationDo.getProcess());
                         // 单次加工时长
                         processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
-                        processes.setProduceTime(processes.getUnitProduceTime()*processes.getProducePcNum());
-//                        processes.setProduceTime(operationDo.getProcesstotaltime().intValue());
+//                        processes.setProduceTime(processes.getUnitProduceTime()*processes.getProducePcNum());
+                        processes.setProduceTime(operationDo.getProcesstotaltime().intValue());
                         if(operationDo.getMinflowwaitmin() != null){
                             processes.setMinWaitTime(operationDo.getMinflowwaitmin().intValue());
                         }
@@ -772,9 +828,15 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
         }
         // 合并生产工序
-        List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs, eqMaps);
+        List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs, eqMaps,apsScheduleConfig);
         processesList.addAll(productionProcesses);
-
+        // 加工时间松散度设置
+        if(looseness != null){
+            for (ProductionProcesses process : processesList) {
+                // 加工时间乘以松散度并向上取整
+                process.setProduceTime(new BigDecimal(process.getProduceTime()).multiply(looseness.add(new BigDecimal("1"))).setScale(0, RoundingMode.CEILING).intValue());
+            }
+        }
         productionScheduleVo.setProcesses(processesList);
         productionScheduleVo.setEquipmentList(equipmentList);
         return productionScheduleVo;
@@ -786,7 +848,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
      * @param processOperationMs
      * @return
      */
-    private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs, Map<String, AspCheckItemsDo> eqMaps) {
+    private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs, Map<String, AspCheckItemsDo> eqMaps,ApsScheduleConfigDo apsScheduleConfig) {
         // 最终的合并工序
         List<ProductionProcesses> processesList = new ArrayList<>();
         if (processOperationMs != null && processOperationMs.size() > 0) {
@@ -816,6 +878,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             for (AspCheckItemsDo aspCheckItemsDo : aspCheckItemsDos) {
                 aspCheckItemMap.put(aspCheckItemsDo.getId(), aspCheckItemsDo);
                 aspCheckItemUse.put(aspCheckItemsDo.getId(), 0);
+                // 退火炉套筒间隙扣除
+                if(apsScheduleConfig != null){
+                    aspCheckItemsDo.setEquipmentwidth(aspCheckItemsDo.getEquipmentwidth().subtract(apsScheduleConfig.getLooseness()));
+                }
             }
             for (ApsProcessOperationVo processOperationM : processOperationMs) {
                 // 首先查看是否有可以合并的已存在的工序
@@ -1076,6 +1142,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         }
     }
 
+    private void checkIfCanMerge(){
+
+    }
+
     /**
      * 排程结束之后根据订单IDs修改生产状态
      */
@@ -1339,4 +1409,5 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
 
         return R.ok();
     }
+
 }

+ 16 - 6
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-04-07
+ * @since 2024-05-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -48,7 +48,7 @@ public class ApsScheduleConfigDo extends BaseDo {
     @TableField("FACTORYCROSS")
     private Integer factorycross;
     /**
-     * 排程算法运行时间
+     * 排程算法运行时间(单位:秒)
      */
     @TableField("SCHEDULERUNTIME")
     private Integer scheduleruntime;
@@ -96,27 +96,37 @@ public class ApsScheduleConfigDo extends BaseDo {
      * 铸轧立板周期(单位:天)
      */
     @TableField("TRCCROSS")
-    private Integer trccross;
+    private Float trccross;
     /**
      * 换辊周期(单位:天)
      */
     @TableField("REPLACECROSS")
-    private Integer replacecross;
+    private Float replacecross;
     /**
      * 默认交货期(单位:天)
      */
     @TableField("DELIVERYDATA")
-    private Integer deliverydata;
+    private Float deliverydata;
     /**
      * 交期允许浮动(单位:天)
      */
     @TableField("ALLOWFLOAT")
-    private Integer allowfloat;
+    private Float allowfloat;
     /**
      * 瓶颈工序
      */
     @TableField("BOTTLENPROCESS")
     private String bottlenprocess;
+    /**
+     * 退火炉套筒间隙(毫米)
+     */
+    @TableField("FURNACE")
+    private BigDecimal furnace;
+    /**
+     * 铝密度
+     */
+    @TableField("ALUMINUMDENSITY")
+    private Double aluminumdensity;
 
 
 }

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

@@ -66,6 +66,16 @@ public class Equipment{
      */
     private Integer unitProductTime;
 
+    /**
+     * 当前设备最后连续生产标识
+     */
+    private String lastSeriesProduceMark;
+
+    /**
+     * 当前设备最后工序类型
+     */
+    private String lastProcessType;
+
     /**
      * 设备运行时间段
      */

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

@@ -23,4 +23,14 @@ public class EquipmentRunTime {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endRunTime;
 
+    /**
+     * 连续生产标识
+     */
+    private String seriesProduceMark;
+
+    /**
+     * 工序
+     */
+    private String processType;
+
 }