Explorar el Código

APS平台新模型

fangpy hace 1 año
padre
commit
1dc2ee4b2f

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

@@ -2,6 +2,7 @@ package com.rongwei.rwapsserver.aps.domain;
 
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.Map;
 
 /**
@@ -11,6 +12,9 @@ import java.util.Map;
 public class ApsOverallConfig {
 
     // 排程计划指定开始时间
+    private LocalDateTime startTime;
+
+    // 排程计划指定开始时间戳
     private Long startTimeLong;
 
     /**

+ 1 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ApsSolution.java

@@ -39,7 +39,7 @@ public class ApsSolution extends ApsAbstractPersistable{
         this.equipmentList = equipmentList;
     }
 
-    @ValueRangeProvider
+    @ValueRangeProvider(id="taskRange")
     @PlanningEntityCollectionProperty
     public List<ProductionProcesses> getProcessesList() {
         return processesList;

+ 4 - 2
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/Equipment.java

@@ -3,6 +3,7 @@ package com.rongwei.rwapsserver.aps.domain;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import org.optaplanner.core.api.domain.entity.PlanningEntity;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -13,7 +14,8 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @Data
-public class Equipment extends ApsAbstractPersistable{
+//@PlanningEntity
+public class Equipment extends Step{
 
     /**
      * 业务表订单工序ID
@@ -86,7 +88,7 @@ public class Equipment extends ApsAbstractPersistable{
     private List<ProductionProcesses> processesList;
 
     public Equipment(String id, String equipmentType) {
-        super(id);
+        this.id = id;
         this.equipmentType = equipmentType;
     }
 

+ 26 - 8
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProductionProcesses.java

@@ -1,7 +1,11 @@
 package com.rongwei.rwapsserver.aps.domain;
 
+import com.rongwei.rwapsserver.aps.listener.TaskStartTimeListener;
 import org.optaplanner.core.api.domain.entity.PlanningEntity;
+import org.optaplanner.core.api.domain.variable.AnchorShadowVariable;
 import org.optaplanner.core.api.domain.variable.PlanningVariable;
+import org.optaplanner.core.api.domain.variable.PlanningVariableGraphType;
+import org.optaplanner.core.api.domain.variable.ShadowVariable;
 import org.springframework.beans.BeanUtils;
 
 import java.math.BigDecimal;
@@ -14,14 +18,14 @@ import java.util.stream.Collectors;
  * 工步,工艺路线里的工步
  */
 @PlanningEntity
-public class ProductionProcesses extends ApsAbstractPersistable{
+public class ProductionProcesses extends Step{
 
     public ProductionProcesses(){
 
     }
 
     public ProductionProcesses(String id, String equipmentType, List<ProduceOrder> produceOrder, Integer produceTime) {
-        super(id);
+        this.id = id;
         this.equipmentType = equipmentType;
         this.produceOrder = produceOrder;
         this.produceTime = produceTime;
@@ -52,6 +56,8 @@ public class ProductionProcesses extends ApsAbstractPersistable{
      */
     private Equipment equipment;
 
+    private Step previousStep;
+
     /**
      * 工序类型
      */
@@ -188,11 +194,28 @@ public class ProductionProcesses extends ApsAbstractPersistable{
         this.equipmentType = equipmentType;
     }
 
-    @PlanningVariable(valueRangeProviderRefs={"equipmentRange"})
+//    @PlanningVariable(valueRangeProviderRefs={"equipmentRange"})
+    @AnchorShadowVariable(sourceVariableName = "previousStep")
     public Equipment getEquipment() {
         return equipment;
     }
 
+    //    @PlanningVariable(valueRangeProviderRefs={"timeRange"})
+    @ShadowVariable(variableListenerClass = TaskStartTimeListener.class, sourceVariableName = "equipment")
+//    @AnchorShadowVariable(sourceVariableName = "equipment")
+    public LocalDateTime getStartTime() {
+        return startTime;
+    }
+
+    @PlanningVariable(valueRangeProviderRefs = {"equipmentRange", "taskRange"},graphType = PlanningVariableGraphType.CHAINED)
+    public Step getPreviousStep() {
+        return previousStep;
+    }
+
+    public void setPreviousStep(Step previousStep) {
+        this.previousStep = previousStep;
+    }
+
     public void setEquipment(Equipment equipment) {
         if(this.ifLock == null || !this.ifLock){
             this.equipment = equipment;
@@ -247,11 +270,6 @@ public class ProductionProcesses extends ApsAbstractPersistable{
         this.produceTime = produceTime;
     }
 
-    @PlanningVariable(valueRangeProviderRefs={"timeRange"})
-    public LocalDateTime getStartTime() {
-        return startTime;
-    }
-
     public void setStartTime(LocalDateTime startTime) {
         if(this.ifLock == null || !this.ifLock){
             this.startTime = startTime;

+ 17 - 6
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -48,7 +48,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 .filter(productionProcesses -> {
                     return !productionProcesses.getOptionalEquipments().contains(productionProcesses.getEquipment().getId());
                 })
-                .penalize(HardSoftScore.ONE_HARD,(productionProcesses) -> 100)
+                .penalize(HardSoftScore.ONE_HARD,(productionProcesses) -> 300)
                 .asConstraint("eqTypeSame");
     }
 
@@ -338,7 +338,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                                 // 开始时间:最后一批次结束时间加流转时间,再往前倒排批次数减一乘以单批次生产时间
                                 LocalDateTime startTime1 = endTime.plusMinutes(lzTimes).minusMinutes(productionProcesses.getUnitProduceTime() * (productionProcesses.getProducePcNum() - 1));
                                 // 结束时间重新赋值
-                                productionProcesses.setEndTime(endTime.plusMinutes(lzTimes).plusMinutes(productionProcesses.getUnitProduceTime()));
+//                                productionProcesses.setEndTime(endTime.plusMinutes(lzTimes).plusMinutes(productionProcesses.getUnitProduceTime()));
                                 if(productionProcesses.getStartTime().compareTo(startTime1)<0){
                                     bln = true;
                                 }
@@ -399,6 +399,10 @@ public class ApsConstraintProvider implements ConstraintProvider {
                                 if(equipmentRunTime.getStartRunTime() != null && equipmentRunTime.getEndRunTime() != null){
                                     LocalDateTime startTime = equipmentRunTime.getStartRunTime();
                                     LocalDateTime endRunTime = equipmentRunTime.getEndRunTime();
+                                    if(productionProcesses.getStartTime() == null || productionProcesses.getEndTime() == null){
+                                        bol = false;
+                                        break;
+                                    }
                                     if((productionProcesses.getStartTime().compareTo(startTime)>=0 && productionProcesses.getStartTime().compareTo(endRunTime)<=0)
                                             || (productionProcesses.getEndTime().compareTo(startTime)>=0 && productionProcesses.getEndTime().compareTo(endRunTime)<=0)){
                                         bol = true;
@@ -461,9 +465,6 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     boolean bol = false;
                     if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
                         for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
-                            if(previousProcess.getEquipment() == null){
-                                continue;
-                            }
                             Integer lzTimes = 0;
                             if(previousProcess.getEquipment() == null){
                                 System.out.println("previousProcess.getEquipment() == null");
@@ -505,6 +506,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             (StrUtil.isNotBlank(proc1.getMergeProcessMark()) && StrUtil.isNotBlank(proc2.getMergeProcessMark()) && proc1.getMergeProcessMark().equals(proc2.getMergeProcessMark()))){
                         return false;
                     }
+                    if(proc1.getStartTime() == null || proc2.getStartTime() == null){
+                        return false;
+                    }
                     Boolean b1 = (proc1.getStartTime().compareTo(proc2.getStartTime())<=0 && proc2.getStartTime().compareTo(proc1.getEndTime())<=0);
                     Boolean b2 = (proc2.getStartTime().compareTo(proc1.getStartTime())<=0 && proc1.getStartTime().compareTo(proc2.getEndTime())<=0);
                     return b1 || b2;
@@ -536,7 +540,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             }
                         }
                     }
-
+                    if(productionProcesses.getEndTime() == null){
+                        return false;
+                    }
                     Boolean bol = productionProcesses.getNextProcesses() == null &&
                             productionProcesses.getEndTime().atZone(zoneId).toInstant().toEpochMilli()>deliveryMinDate.getTime();
                     return bol;
@@ -599,6 +605,11 @@ public class ApsConstraintProvider implements ConstraintProvider {
         return constraintFactory.forEach(ProductionProcesses.class)
                 .groupBy(ProductionProcesses::getEquipmentId, ConstraintCollectors.toList())
                 .filter((equipmentId,processes) -> {
+                    for (ProductionProcesses process : processes) {
+                        if(process.getStartTime() == null){
+                            return false;
+                        }
+                    }
                     if(processes != null && processes.size()>1){
                         // 安装开始时间排序
                         Collections.sort(processes, Comparator.comparing(ProductionProcesses::getStartTime));

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

@@ -2,6 +2,7 @@ package com.rongwei.rwapsserver.aps.service.impl;
 
 import com.rongwei.rwapsserver.aps.domain.ApsOverallConfig;
 import com.rongwei.rwapsserver.aps.domain.ApsSolution;
+import com.rongwei.rwapsserver.aps.domain.Equipment;
 import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
 import com.rongwei.rwapsserver.aps.score.ApsConstraintProvider;
 import com.rongwei.rwapsserver.aps.service.ProductionScheduleService;
@@ -41,7 +42,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         // 排程运行时长
         Integer planSeconds = productionScheduleVo.getPlanSeconds();
         if(planSeconds == null || planSeconds <= 0){
-            planSeconds = 15;
+            planSeconds = 300;
         }
 
         // optaplanner 求解器配置实例化
@@ -50,8 +51,8 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 .withSolutionClass(ApsSolution.class)
                 .withEntityClasses(ProductionProcesses.class)
                 .withConstraintProviderClass(ApsConstraintProvider.class)
-                .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(10L))
-//                .withTerminationSpentLimit(Duration.ofSeconds(planSeconds))
+//                .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(10L))
+                .withTerminationSpentLimit(Duration.ofSeconds(planSeconds))
         );
         Solver<ApsSolution> solver = solverFactory.buildSolver();
         // optaplanner 求解器数据装配
@@ -70,6 +71,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
             productionProcesses.setPreviousProcesses(null);
             productionProcesses.setNextProcesses(null);
+            productionProcesses.getEquipment().setProcessesList(null);
         }
         productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
         return productionScheduleRetVo;
@@ -88,6 +90,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         Date startDate = productionScheduleVo.getApsPlanStartDate();
         LocalDateTime startTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
         apsOverallConfig.setStartTimeLong(startDate.getTime());
+        apsOverallConfig.setStartTime(startTime);
         // 排程全局配置
         apsOverallConfig.setRoamTime(productionScheduleVo.getRoamTime());
         unsolvedCloudBalance.setStartTime(startTime);