Browse Source

APS平台生产排程平台规划算法

fangpy 1 year ago
parent
commit
9331674548

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

@@ -29,6 +29,8 @@ public class ApsSolution extends ApsAbstractPersistable{
     @Getter(value = AccessLevel.NONE)
     private HardSoftScore score;
 
+    private Long incrementUnitAmount;
+
     public LocalDateTime startTime;
 
     public ApsSolution(String id, List<ProductionProcesses> processesList, List<Equipment> equipmentList) {
@@ -51,7 +53,7 @@ public class ApsSolution extends ApsAbstractPersistable{
 
     @ValueRangeProvider(id="timeRange")
     public CountableValueRange<LocalDateTime> getxRange(){
-        Integer produceTimeTotal = 0;
+        Long produceTimeTotal = 0L;
         for (ProductionProcesses productionProcesses : processesList) {
             produceTimeTotal = produceTimeTotal + productionProcesses.getProduceTime();
         }
@@ -59,8 +61,18 @@ public class ApsSolution extends ApsAbstractPersistable{
         if(startTime != null){
             fromTime = startTime;
         }
+        Long incrementUnit = this.incrementUnitAmount;
+        if(incrementUnit == null){
+            incrementUnit = 10L;
+        }
+
+        long sy = produceTimeTotal % incrementUnit;
+        if(sy>0){
+            produceTimeTotal = produceTimeTotal - sy;
+        }
+
         System.out.println("startTime:"+startTime);
-        return ValueRangeFactory.createLocalDateTimeValueRange(fromTime,fromTime.plusMinutes(produceTimeTotal),1, ChronoUnit.MINUTES);
+        return ValueRangeFactory.createLocalDateTimeValueRange(fromTime,fromTime.plusMinutes(produceTimeTotal),incrementUnit, ChronoUnit.MINUTES);
     }
 
     @PlanningScore
@@ -68,4 +80,11 @@ public class ApsSolution extends ApsAbstractPersistable{
         return score;
     }
 
+    public Long getIncrementUnitAmount() {
+        return incrementUnitAmount;
+    }
+
+    public void setIncrementUnitAmount(Long incrementUnitAmount) {
+        this.incrementUnitAmount = incrementUnitAmount;
+    }
 }

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

@@ -184,7 +184,7 @@ public class ProductionProcesses extends ApsAbstractPersistable{
                 this.equipmentId = equipment.getId();
             }
         }
-        if(this.equipment != null){
+        /*if(this.equipment != null){
             // 设置设备的工序占用
             if(this.equipment.getProcessesList() == null){
                 this.equipment.setProcessesList(new ArrayList<>());
@@ -197,7 +197,7 @@ public class ProductionProcesses extends ApsAbstractPersistable{
             pp.setStartTime(this.getStartTime());
             pp.setEndTime(this.getEndTime());
             this.equipment.getProcessesList().add(pp);
-        }
+        }*/
     }
 
     public String getEquipmentId() {
@@ -244,13 +244,13 @@ public class ProductionProcesses extends ApsAbstractPersistable{
 
     public void setPreviousProcesses(List<ProductionProcesses> previousProcesses) {
         this.previousProcesses = previousProcesses;
-        if(previousProcesses != null){
+        /*if(previousProcesses != null){
             List<String> ids = new ArrayList<>();
             for (ProductionProcesses previousProcess : previousProcesses) {
                 ids.add(previousProcess.getId());
             }
             this.previousProcessesIds = ids;
-        }
+        }*/
     }
 
     public List<ProductionProcesses> getNextProcesses() {

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

@@ -352,8 +352,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             }
 
                             if(bln){
-                                System.out.println("log-开始时间:"+productionProcesses.getStartTime());
-                                System.out.println("log-正确的开始时间:"+startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(lzTimes));
+//                                System.out.println("log-开始时间:"+productionProcesses.getStartTime());
+//                                System.out.println("log-正确的开始时间:"+startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(lzTimes));
                             }
                         }
                     }

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

@@ -12,7 +12,9 @@ import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
 import org.optaplanner.core.api.solver.SolutionManager;
 import org.optaplanner.core.api.solver.Solver;
 import org.optaplanner.core.api.solver.SolverFactory;
+import org.optaplanner.core.config.solver.EnvironmentMode;
 import org.optaplanner.core.config.solver.SolverConfig;
+import org.optaplanner.core.config.solver.termination.TerminationConfig;
 import org.springframework.stereotype.Service;
 import java.time.Duration;
 import java.time.LocalDateTime;
@@ -44,10 +46,13 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
 
         // optaplanner 求解器配置实例化
         SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
+//                .withEnvironmentMode(EnvironmentMode.FULL_ASSERT)
                 .withSolutionClass(ApsSolution.class)
                 .withEntityClasses(ProductionProcesses.class)
                 .withConstraintProviderClass(ApsConstraintProvider.class)
-                .withTerminationSpentLimit(Duration.ofSeconds(planSeconds)));
+                .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(30L))
+//                .withTerminationSpentLimit(Duration.ofSeconds(planSeconds))
+        );
         Solver<ApsSolution> solver = solverFactory.buildSolver();
         // optaplanner 求解器数据装配
         ApsSolution apsSolution = getPreApsSolution(productionScheduleVo);
@@ -113,8 +118,16 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             // 后道工序
             if(process.getNextProcessesIds() != null && process.getNextProcessesIds().size()>0){
                 List<ProductionProcesses> nexts = new ArrayList<>();
-                for (String nextId : process.getNextProcessesIds()) {
+                /*for (String nextId : process.getNextProcessesIds()) {
                     nexts.add(idMaps.get(nextId));
+                }*/
+                for (String previousProcessesId : process.getNextProcessesIds()) {
+                    for (ProductionProcesses nextprocess : productionScheduleVo.getProcesses()) {
+                        if(nextprocess.getBsProcessesId().contains(previousProcessesId)){
+                            nexts.add(nextprocess);
+                        }
+                    }
+
                 }
                 if(nexts != null && nexts.size()>0){
                     process.setNextProcesses(nexts);

+ 36 - 0
rw-aps-server/src/main/resources/logback-spring.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration  scan="true" scanPeriod="60 seconds" debug="false">
+    <contextName>logback</contextName>
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!--按天生成日志-->
+    <appender name="logFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>
+                rw-aps/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
+            </FileNamePattern>
+        </rollingPolicy>
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>
+                %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level -%msg%n
+            </Pattern>
+        </layout>
+    </appender>
+
+    <logger name="com.rongwei" additivity="false">
+        <appender-ref ref="console"/>
+        <appender-ref ref="logFile" />
+    </logger>
+
+    <root level="debug">
+        <appender-ref ref="console"/>
+        <appender-ref ref="logFile" />
+    </root>
+
+</configuration>