fangpy 10 mēneši atpakaļ
vecāks
revīzija
ffd1f9f9aa

+ 53 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ApsAnnealingDifferenceDo.java

@@ -0,0 +1,53 @@
+package com.rongwei.rwapsserver.aps.domain;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 退火组炉度差
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-09-25
+ */
+@Data
+public class ApsAnnealingDifferenceDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键ID
+     */
+    private String id;
+    /**
+     * 租户ID
+     */
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    private String roption;
+    /**
+     * 厚度起
+     */
+    private BigDecimal startthickness;
+    /**
+     * 厚度止
+     */
+    private BigDecimal endthickness;
+    /**
+     * 中退厚差
+     */
+    private BigDecimal moderatedifference;
+    /**
+     * 成退厚差
+     */
+    private BigDecimal declinedifference;
+    /**
+     * 主表ID
+     */
+    private String mainid;
+
+
+}

+ 14 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ApsOverallConfig.java

@@ -44,6 +44,11 @@ public class ApsOverallConfig implements Serializable {
      */
     private List<ApsMergeFurnaceDo> mergeFurnaces;
 
+    /**
+     * 退火合炉厚差配置表
+     */
+    private List<ApsAnnealingDifferenceDo> apsAnnealingDifferences;
+
     /**
      * 洗炉时间(小时)
      */
@@ -61,4 +66,13 @@ public class ApsOverallConfig implements Serializable {
      */
     private BigDecimal looseness;
 
+    /**
+     * 中退组炉宽差,默认:250mm
+     */
+    private Integer middifference;
+    /**
+     * 成退组炉宽差,默认:200mm
+     */
+    private Integer furnacedifference;
+
 }

+ 11 - 6
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/listener/TaskStartTimeListener.java

@@ -517,12 +517,12 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                     lzTimes = lzTimes + losinttime;
                 }*/
                 // 最小等待时间对比流转时间
-                if(preProcess.getMinWaitTime() != null && lzTimes<preProcess.getMinWaitTime()){
+                /*if(preProcess.getMinWaitTime() != null && lzTimes<preProcess.getMinWaitTime()){
                     lzTimes = preProcess.getMinWaitTime();
-                }
-                /*if(process.getMinWaitTime() != null && lzTimes<process.getMinWaitTime()){
-                    lzTimes = process.getMinWaitTime();
                 }*/
+                if(process.getMinWaitTime() != null && lzTimes<process.getMinWaitTime()){
+                    lzTimes = process.getMinWaitTime();
+                }
             }
 
             // 当前工序最小开始时间、结束时间
@@ -554,6 +554,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                     EquipmentRunTime copy = new EquipmentRunTime();
                     copy.setStartRunTime(equipmentRunTime.getStartRunTime());
                     copy.setEndRunTime(equipmentRunTime.getEndRunTime());
+                    copy.setProcessType(equipmentRunTime.getProcessType());
                     copy.setTotalVolumeWidth(equipmentRunTime.getTotalVolumeWidth());
                     copy.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
                     copy.setOccupyType(equipmentRunTime.getOccupyType());
@@ -561,6 +562,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                     copy.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
                     copy.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
                     copy.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
+                    copy.setMinThGroupNames(equipmentRunTime.getMinThGroupNames());
                     equipmentRunTimes.add(copy);
                 }
             }
@@ -640,7 +642,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             // 按照开始时间排序
             equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
 
-            if(process.getId().equals("edc2319424ae4bd684e8c76ff6c5042c")){
+            if(process.getEquipmentId().equals("ea69835012de4f2cb9c52496df8be111")){
                 int a = 0;
             }
             Integer delay = process.getDelay();
@@ -659,11 +661,14 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
 
                         // 退火工序合并处理
                         // 开始时间一样
-                        if(equipmentRunTime.getStartRunTime().compareTo(proStartTime) == 0){
+                        if(equipmentRunTime.getStartRunTime().compareTo(proStartTime) >= 0 && equipmentRunTime.getStartRunTime().compareTo(proEndTime) <= 0){
                             boolean hasMergeTh = thMerge(process,equipmentRunTime);
                             if(!hasMergeTh){
                                 proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(60);
                                 proEndTime = proStartTime.plusMinutes(process.getProduceTime());
+                            }else{
+                                proStartTime = equipmentRunTime.getStartRunTime();
+                                proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                             }
                         }else{
                             if(equipmentRunTime.getEndRunTime().compareTo(proStartTime)<=0 || equipmentRunTime.getStartRunTime().compareTo(proEndTime)>=0){

+ 55 - 8
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -1473,13 +1473,56 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 BigDecimal btVolumeWidth = null;
                 BigDecimal btVolumeThickness = null;
                 BigDecimal btSinglerollweight = null;
+                // 根据最小厚度查询厚差
+                BigDecimal ztkc = new BigDecimal("250");
+                BigDecimal ctkc = new BigDecimal("200");
+                if(processes.get(0).getApsOverallConfig().getMiddifference() != null && processes.get(0).getApsOverallConfig().getMiddifference()>0){
+                    ztkc = new BigDecimal(processes.get(0).getApsOverallConfig().getMiddifference());
+                }
+                if(processes.get(0).getApsOverallConfig().getFurnacedifference() != null && processes.get(0).getApsOverallConfig().getFurnacedifference()>0){
+                    ctkc = new BigDecimal(processes.get(0).getApsOverallConfig().getFurnacedifference());
+                }
+                BigDecimal zthc = new BigDecimal("0.05");
+                BigDecimal cthc = new BigDecimal("0.05");
+                List<ApsAnnealingDifferenceDo> apsAnnealingDifferences = processes.get(0).getApsOverallConfig().getApsAnnealingDifferences();
+                if(apsAnnealingDifferences != null && apsAnnealingDifferences.size()>0){
+                    for (ApsAnnealingDifferenceDo apsAnnealingDifference : apsAnnealingDifferences) {
+                        BigDecimal startthickness = apsAnnealingDifference.getStartthickness();
+                        BigDecimal endthickness = apsAnnealingDifference.getEndthickness();
+                        if(startthickness == null && endthickness == null){
+                            continue;
+                        }
+                        boolean fl = true;
+                        if(startthickness != null){
+                            if(minVolumeThickness.compareTo(startthickness)<0){
+                                fl = false;
+                            }
+                        }
+                        if(endthickness != null){
+                            if(minVolumeThickness.compareTo(endthickness)>0){
+                                fl = false;
+                            }
+                        }
+                        if(fl){
+                            BigDecimal declinedifference = apsAnnealingDifference.getDeclinedifference();
+                            BigDecimal moderatedifference = apsAnnealingDifference.getModeratedifference();
+                            if(declinedifference != null){
+                                cthc = declinedifference;
+                            }
+                            if(moderatedifference != null){
+                                zthc = moderatedifference;
+                            }
+                        }
+                    }
+                }
+
                 if("成退".equals(processType)){
-                    btVolumeWidth = new BigDecimal("50");
-                    btVolumeThickness = new BigDecimal("0.05");
+                    btVolumeWidth = ctkc;
+                    btVolumeThickness = cthc;
                     btSinglerollweight = new BigDecimal("1");
                 }else if ("中退".equals(processType)){
-                    btVolumeWidth = new BigDecimal("100");
-                    btVolumeThickness = new BigDecimal("0.08");
+                    btVolumeWidth = ztkc;
+                    btVolumeThickness = zthc;
                     btSinglerollweight = new BigDecimal("1");
                 }
                 if(maxVolumeWidth.subtract(minVolumeWidth).compareTo(btVolumeWidth)>0 || maxVolumeThickness.subtract(minVolumeThickness).compareTo(btVolumeThickness)>0
@@ -1604,10 +1647,14 @@ public class ApsConstraintProvider implements ConstraintProvider {
         // 有铸轧的工序取铸轧后第一道工序开始时间,没有铸轧的直接取第一道工序开始时间
         LocalDateTime startTime = null;
         ProductionProcesses rooprocess = productionProcesses.getRooprocess();
-        if("铸轧".equals(rooprocess.getProcessType())){
-            startTime = rooprocess.getNextProcesses().get(0).getStartTime();
+        if(rooprocess != null){
+            if("铸轧".equals(rooprocess.getProcessType())){
+                startTime = rooprocess.getNextProcesses().get(0).getStartTime();
+            }else{
+                startTime = rooprocess.getStartTime();
+            }
         }else{
-            startTime = rooprocess.getStartTime();
+            return 0L;
         }
         long daysBetween = ChronoUnit.DAYS.between(startTime, productionProcesses.getEndTime());
         return daysBetween-deliveryMinDate;
@@ -2233,7 +2280,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     }
                 })
                 .penalize(HardMediumSoftScore.ONE_MEDIUM,(equipmentId,processes)->{
-                    if("0001be252874536843730b100176".equals(equipmentId) && processes.get(0).getDelay() == 1){
+                    if("ea69835012de4f2cb9c52496df8be111".equals(equipmentId) && processes.get(0).getDelay() == 2){
                         int a = 1;
                     }
                     // 已占用的

+ 3 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/impl/ApsServiceImpl.java

@@ -442,7 +442,9 @@ public class ApsServiceImpl implements ApsService {
                         }
                     }
                 }
-                fjNextMerge(secondbsid,notMergeProces,othermergeprocesses,bsProceses,hasMerge,allProMap);
+                if(secondbsid != null){
+                    fjNextMerge(secondbsid,notMergeProces,othermergeprocesses,bsProceses,hasMerge,allProMap);
+                }
             }
             // 剩余作业合并
             List<ProductionProcesses> sypros = new ArrayList<>();

+ 20 - 12
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/impl/ProductionScheduleServiceImpl.java

@@ -236,8 +236,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             }
         }
 
-        solvedBalance.getProcessesList().addAll(hasLocks);
-        /*log.info("**************排程最终评分分析***************");
+        log.info("**************排程最终评分分析***************");
         if(notLocks != null && notLocks.size()>0){
             for (ProductionProcesses notLock : notLocks) {
                 for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
@@ -264,8 +263,9 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         }
         ScoreExplanation<ApsSolution, HardSoftScore> explain2 = scoreManager.explain(solvedBalance);
         log.info(explain2.toString());
-        log.info("**************排程最终评分分析***************");*/
-        softExplain(explain,solvedBalance.getProcessesList());
+        log.info("**************排程最终评分分析***************");
+        productionScheduleRetVo.setScoreResult(explain2.toString());
+        softExplain(explain2,solvedBalance.getProcessesList());
 
         productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
         // 循环引用ProductionProcesses置空
@@ -353,7 +353,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                     po.setEquipmentId(productionProcesses.getEquipmentId());
                     po.setEquipment(productionProcesses.getEquipment());
 //                    po.setConflictRoptions(productionProcesses.getConflictRoptions());
-
+                    po.setConflictDes(productionProcesses.getConflictDes());
                     productionProcesses.setOpeProducePcNum(1);
                     productionProcesses.setProduceTime(productionProcesses.getProduceTime()-po.getUnitProduceTime());
                     productionProcesses.setEndTime(productionProcesses.getEndTime().minusMinutes(po.getUnitProduceTime()));
@@ -365,6 +365,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
 
         solvedBalance.getProcessesList().addAll(otherThproces);
         solvedBalance.getProcessesList().addAll(sers);
+        solvedBalance.getProcessesList().addAll(hasLocks);
 //        solvedBalance.getProcessesList().addAll(otherNotThproces);
         for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
             productionProcesses.setPreviousProcesses(null);
@@ -374,6 +375,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             productionProcesses.getEquipment().setEquipmentRunTimes(null);
             productionProcesses.setPreviousStep(null);
             productionProcesses.setOptionalProviderEquipments(null);
+            productionProcesses.setEquass(null);
             if(productionProcesses.getApsOverallConfig() != null){
                 productionProcesses.getApsOverallConfig().setFurnaceInstallations(null);
                 productionProcesses.getApsOverallConfig().setMergeFurnaces(null);
@@ -417,7 +419,10 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         List<ProductionProcesses> previousProcesses = process.getPreviousProcesses();
         if(previousProcesses != null){
             for (ProductionProcesses previousProcess : previousProcesses) {
-                if(previousProcess.getEndTime().plusMinutes(previousProcess.getMaxWaitTime()).compareTo(process.getStartTime())>0){
+                /*if(previousProcess.getEndTime().plusMinutes(previousProcess.getMaxWaitTime()).compareTo(process.getStartTime())>0){
+                    continue;
+                }*/
+                if(previousProcess.getEndTime().plusMinutes(process.getMaxWaitTime()).compareTo(process.getStartTime())>0){
                     continue;
                 }
                 ProductionProcesses preProcess = previousProcess;
@@ -509,10 +514,10 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         EquipmentRunTime maxRunTime = null;
         for (EquipmentRunTime equipmentRunTime : equipmentRunTimesAll) {
             if(equipmentRunTime.getEndRunTime().compareTo(process.getStartTime().plusMinutes(-lzTimes))<=0
-                    && equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>=0){
+                    && equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))>=0){
                 equipmentRunTimes.add(equipmentRunTime);
             }else{
-                if(equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))<0){
+                if(equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))<0){
                     if(minRunTime == null){
                         minRunTime = equipmentRunTime;
                     }else{
@@ -542,7 +547,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 // 首个占用时间
                 if(i == 0){
                     if(equipmentRunTimes.size() == 1){
-                        proStartTime = process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()/2);
+                        proStartTime = process.getStartTime().plusMinutes(-process.getMaxWaitTime()/2);
                         proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
                         hasSet = true;
                     }else{
@@ -554,7 +559,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                             proEndTime1 = proEndTime1.plusMinutes(-preProcess.getCutfinishmin()).plusMinutes(-nextEquipmentRunTime.getPrepressworkmin());
                         }
                         LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
-                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>0){
+                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))>0){
                             LocalDateTime minproStartTime = proStartTime1;
                             boolean nextseries = seriesLz(equipmentRunTime, preProcess, -1);
                             if(!nextseries){
@@ -618,14 +623,14 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 // 首个占用时间
                 if(i == 0){
                     if(equipmentRunTimes.size() == 1){
-                        proStartTime = process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()/2);
+                        proStartTime = process.getStartTime().plusMinutes(-process.getMaxWaitTime()/2);
                         proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
                         hasSet = true;
                     }else{
                         EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
                         LocalDateTime proEndTime1 = nextEquipmentRunTime.getStartRunTime().plusMinutes(-1);
                         LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
-                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>0){
+                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))>0){
                             LocalDateTime minproStartTime = proStartTime1;
                             if(minproStartTime.compareTo(equipmentRunTime.getEndRunTime())>0){
                                 proStartTime = proStartTime1;
@@ -843,6 +848,9 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             if(process.getApsOverallConfig() == null){
                 process.setApsOverallConfig(apsOverallConfig);
             }
+            process.getApsOverallConfig().setApsAnnealingDifferences(productionScheduleVo.getApsAnnealingDifferences());
+            process.getApsOverallConfig().setMiddifference(productionScheduleVo.getMiddifference());
+            process.getApsOverallConfig().setFurnacedifference(productionScheduleVo.getFurnacedifference());
 
             if(StrUtil.isBlank(process.getTaskType())){
                 process.setTaskType("processes");

+ 13 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/vo/ProductionScheduleVo.java

@@ -59,6 +59,11 @@ public class ProductionScheduleVo {
      */
     private List<ApsMergeFurnaceDo> mergeFurnaces;
 
+    /**
+     * 退火合炉厚差配置表
+     */
+    private List<ApsAnnealingDifferenceDo> apsAnnealingDifferences;
+
     /**
      * 洗炉时间(小时)
      */
@@ -84,5 +89,13 @@ public class ProductionScheduleVo {
      * 除铸轧外期望交货天数
      */
     private Integer expecteddays;
+    /**
+     * 中退组炉宽差,默认:250mm
+     */
+    private Integer middifference;
+    /**
+     * 成退组炉宽差,默认:200mm
+     */
+    private Integer furnacedifference;
 
 }