|
@@ -77,52 +77,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
// runPlanSeconds = 20;
|
|
|
// CPU核数
|
|
|
String cores = Runtime.getRuntime().availableProcessors() + "";
|
|
|
- // optaplanner 求解器配置实例化
|
|
|
- /*SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
- .withEnvironmentMode(mode)
|
|
|
- .withSolutionClass(ApsSolution.class)
|
|
|
- .withEntityClasses(ProductionProcesses.class)
|
|
|
- .withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
-// .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(180L))
|
|
|
- .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
- .withMoveThreadCount(cores)
|
|
|
- );
|
|
|
- Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
|
- solver.addEventListener(new SolverEventListener<ApsSolution>() {
|
|
|
- public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
|
|
|
- if(solver.isEveryProblemChangeProcessed()) {
|
|
|
- event.getNewBestSolution().setConstructionHeuristicEnd(true);
|
|
|
- if(event.getNewBestSolution().getStepBestProcessesList() == null){
|
|
|
- List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
-// List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
|
|
|
- for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
|
|
|
- ProductionProcesses newPro = new ProductionProcesses();
|
|
|
- newPro.setId(productionProcesses.getId());
|
|
|
- newPro.setEquipmentId(productionProcesses.getEquipmentId());
|
|
|
- Equipment eq = new Equipment();
|
|
|
- if(productionProcesses.getEquipment() != null){
|
|
|
- eq.setId(productionProcesses.getEquipment().getId());
|
|
|
- }
|
|
|
- newPro.setEquipment(eq);
|
|
|
- newPro.setProduceTime(productionProcesses.getProduceTime());
|
|
|
- newPro.setStartTime(productionProcesses.getStartTime());
|
|
|
- newPro.setEndTime(productionProcesses.getEndTime());
|
|
|
- newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
- newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
- processesList.add(newPro);
|
|
|
-
|
|
|
- productionProcesses.setApsStatus("LS");
|
|
|
- }
|
|
|
- event.getNewBestSolution().setStepBestProcessesList(processesList);
|
|
|
- }
|
|
|
- System.out.println("************"+event.getNewBestScore()+"************");
|
|
|
- log.info("************"+event.getNewBestScore()+"************");
|
|
|
|
|
|
- // 终止排程
|
|
|
-// solver.terminateEarly();
|
|
|
- }
|
|
|
- }
|
|
|
- });*/
|
|
|
// optaplanner 求解器数据装配
|
|
|
List<ProductionProcesses> otherThproces = new ArrayList<>();
|
|
|
List<ProductionProcesses> otherNotThproces = new ArrayList<>();
|
|
@@ -232,131 +187,90 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
// }
|
|
|
apsSolution.setProcessesList(notLocks);
|
|
|
|
|
|
+ ApsSolution solvedBalance = null;
|
|
|
+ // 异常坯料计划ID
|
|
|
List<String> exOrderIds = new ArrayList<>();
|
|
|
- // 按照退火组炉分批排程
|
|
|
- List<CommonJavaBean> orderMerges = produceOrderMerge(ordergrous,apsSolution);
|
|
|
- log.info("退火组炉分批排程:"+ JSONUtil.toJsonStr(orderMerges));
|
|
|
- Collections.sort(orderMerges, (pro1, pro2) -> {return pro2.getMaxVolumeWidth().compareTo(pro1.getMaxVolumeWidth());});
|
|
|
- ApsSolution solvedBalance = new ApsSolution();
|
|
|
- solvedBalance.setProcessesList(new ArrayList<>());
|
|
|
- List<String> thOrderids = new ArrayList<>();
|
|
|
- if(ordergrous != null && ordergrous.size()>0){
|
|
|
- for (CommonJavaBean cjb : orderMerges) {
|
|
|
- List<String> v = new ArrayList<>();
|
|
|
- for (String orderid : cjb.getOrderids()) {
|
|
|
- if(!thOrderids.contains(orderid)){
|
|
|
- v.add(orderid);
|
|
|
- }
|
|
|
- }
|
|
|
- if(v.size() == 0){
|
|
|
- continue;
|
|
|
- }
|
|
|
- try{
|
|
|
- log.info("分批排程开始,当前批次坯料计划ID:"+v);
|
|
|
- ApsSolution apsSolution1 = new ApsSolution();
|
|
|
- apsSolution1.setStartTime(apsSolution.getStartTime());
|
|
|
- List<ProductionProcesses> processesList1 = apsSolution.getProcessesList().stream().filter(m -> v.contains(m.getProduceOrder().get(0).getId())).collect(Collectors.toList());
|
|
|
- apsSolution1.setProcessesList(processesList1);
|
|
|
- apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
|
|
|
-
|
|
|
- runPlanSeconds = (apsSolution1.getProcessesList().size()/prospeed + 1)*60;
|
|
|
- SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
- .withEnvironmentMode(mode)
|
|
|
- .withSolutionClass(ApsSolution.class)
|
|
|
- .withEntityClasses(ProductionProcesses.class)
|
|
|
- .withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
- .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
|
|
|
-// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
- .withMoveThreadCount(cores)
|
|
|
- );
|
|
|
- Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
|
- solver.addEventListener(new SolverEventListener<ApsSolution>() {
|
|
|
- public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
|
|
|
- if(solver.isEveryProblemChangeProcessed()) {
|
|
|
- event.getNewBestSolution().setConstructionHeuristicEnd(true);
|
|
|
- if(event.getNewBestSolution().getStepBestProcessesList() == null){
|
|
|
- List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
-// List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
|
|
|
- for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
|
|
|
- ProductionProcesses newPro = new ProductionProcesses();
|
|
|
- newPro.setId(productionProcesses.getId());
|
|
|
- newPro.setEquipmentId(productionProcesses.getEquipmentId());
|
|
|
- Equipment eq = new Equipment();
|
|
|
- if(productionProcesses.getEquipment() != null){
|
|
|
- eq.setId(productionProcesses.getEquipment().getId());
|
|
|
- }
|
|
|
- newPro.setEquipment(eq);
|
|
|
- newPro.setProduceTime(productionProcesses.getProduceTime());
|
|
|
- newPro.setStartTime(productionProcesses.getStartTime());
|
|
|
- newPro.setEndTime(productionProcesses.getEndTime());
|
|
|
- newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
- newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
- processesList.add(newPro);
|
|
|
-
|
|
|
- productionProcesses.setApsStatus("LS");
|
|
|
- }
|
|
|
- event.getNewBestSolution().setStepBestProcessesList(processesList);
|
|
|
+ // 混合排程
|
|
|
+ if("2".equals(productionScheduleVo.getScheduleType())){
|
|
|
+ // optaplanner 求解器配置实例化
|
|
|
+ SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
+ .withEnvironmentMode(mode)
|
|
|
+ .withSolutionClass(ApsSolution.class)
|
|
|
+ .withEntityClasses(ProductionProcesses.class)
|
|
|
+ .withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
+ .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(180L))
|
|
|
+// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
+ .withMoveThreadCount(cores)
|
|
|
+ );
|
|
|
+ Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
|
+ solver.addEventListener(new SolverEventListener<ApsSolution>() {
|
|
|
+ public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
|
|
|
+ if(solver.isEveryProblemChangeProcessed()) {
|
|
|
+ event.getNewBestSolution().setConstructionHeuristicEnd(true);
|
|
|
+ if(event.getNewBestSolution().getStepBestProcessesList() == null){
|
|
|
+ List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
+ for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
|
|
|
+ ProductionProcesses newPro = new ProductionProcesses();
|
|
|
+ newPro.setId(productionProcesses.getId());
|
|
|
+ newPro.setEquipmentId(productionProcesses.getEquipmentId());
|
|
|
+ Equipment eq = new Equipment();
|
|
|
+ if(productionProcesses.getEquipment() != null){
|
|
|
+ eq.setId(productionProcesses.getEquipment().getId());
|
|
|
}
|
|
|
- System.out.println("************"+event.getNewBestScore()+"************");
|
|
|
- log.info("************"+event.getNewBestScore()+"************");
|
|
|
-
|
|
|
- // 终止排程
|
|
|
-// solver.terminateEarly();
|
|
|
+ newPro.setEquipment(eq);
|
|
|
+ newPro.setProduceTime(productionProcesses.getProduceTime());
|
|
|
+ newPro.setStartTime(productionProcesses.getStartTime());
|
|
|
+ newPro.setEndTime(productionProcesses.getEndTime());
|
|
|
+ newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
+ processesList.add(newPro);
|
|
|
+
|
|
|
+ productionProcesses.setApsStatus("LS");
|
|
|
}
|
|
|
+ event.getNewBestSolution().setStepBestProcessesList(processesList);
|
|
|
}
|
|
|
- });
|
|
|
- SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
-
|
|
|
- ApsSolution solvedBalance1 = solver.solve(apsSolution1);
|
|
|
- log.info("**************排程评分分析***************");
|
|
|
- ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance1);
|
|
|
- log.info(explain.toString());
|
|
|
- log.info("**************排程评分分析***************");
|
|
|
- productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance1).toString());
|
|
|
- // 得分分析
|
|
|
- softExplain(explain,solvedBalance1.getProcessesList());
|
|
|
-
|
|
|
- solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
|
|
|
- thOrderids.addAll(v);
|
|
|
-
|
|
|
- // 排程结束的数据手动添加到设备占用列表中
|
|
|
- setEqRunTimes(solvedBalance1.getProcessesList());
|
|
|
- }catch (Exception e){
|
|
|
- exOrderIds.addAll(v);
|
|
|
- if(productionScheduleRetVo.getMsg() == null){
|
|
|
- productionScheduleRetVo.setMsg("排程异常,");
|
|
|
+ System.out.println("************"+event.getNewBestScore()+"************");
|
|
|
+ log.info("************"+event.getNewBestScore()+"************");
|
|
|
+
|
|
|
+ // 终止排程
|
|
|
+ // solver.terminateEarly();
|
|
|
}
|
|
|
- productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+v);
|
|
|
- e.printStackTrace();
|
|
|
- log.error("分批排程异常,当前批次坯料计划ID:"+v,e);
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
- // 剩余数据按照坯料计划分组排程
|
|
|
- List<ProductionProcesses> otherPros = apsSolution.getProcessesList().stream().filter(n -> !thOrderids.contains(n.getProduceOrder().get(0).getId())).collect(Collectors.toList());
|
|
|
- if(otherPros != null && otherPros.size()>0){
|
|
|
- Map<String, List<ProductionProcesses>> equass = new HashMap<>();
|
|
|
- for (ProductionProcesses otherPro : otherPros) {
|
|
|
- if(equass.containsKey(otherPro.getProduceOrder().get(0).getId())){
|
|
|
- equass.get(otherPro.getProduceOrder().get(0).getId()).add(otherPro);
|
|
|
- }else {
|
|
|
- List<ProductionProcesses> p1 = new ArrayList<>();
|
|
|
- p1.add(otherPro);
|
|
|
- equass.put(otherPro.getProduceOrder().get(0).getId(),p1);
|
|
|
- }
|
|
|
- }
|
|
|
- if(equass != null && equass.size()>0){
|
|
|
- for(Map.Entry<String, List<ProductionProcesses>> entry : equass.entrySet()){
|
|
|
- String k = entry.getKey();
|
|
|
- if(exOrderIds.contains(k)){
|
|
|
+ });
|
|
|
+
|
|
|
+ solvedBalance = solver.solve(apsSolution);
|
|
|
+ log.info("**************排程评分分析***************");
|
|
|
+ SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
+ ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance);
|
|
|
+ log.info(explain.toString());
|
|
|
+ log.info("**************排程评分分析***************");
|
|
|
+ productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance).toString());
|
|
|
+ // 得分分析
|
|
|
+ softExplain(explain,solvedBalance.getProcessesList());
|
|
|
+ }else{
|
|
|
+ // 按照退火组炉分批排程
|
|
|
+ List<CommonJavaBean> orderMerges = produceOrderMerge(ordergrous,apsSolution);
|
|
|
+ log.info("退火组炉分批排程:"+ JSONUtil.toJsonStr(orderMerges));
|
|
|
+ Collections.sort(orderMerges, (pro1, pro2) -> {return pro2.getMaxVolumeWidth().compareTo(pro1.getMaxVolumeWidth());});
|
|
|
+ solvedBalance = new ApsSolution();
|
|
|
+ solvedBalance.setProcessesList(new ArrayList<>());
|
|
|
+ List<String> thOrderids = new ArrayList<>();
|
|
|
+ if(ordergrous != null && ordergrous.size()>0){
|
|
|
+ for (CommonJavaBean cjb : orderMerges) {
|
|
|
+ List<String> v = new ArrayList<>();
|
|
|
+ for (String orderid : cjb.getOrderids()) {
|
|
|
+ if(!thOrderids.contains(orderid)){
|
|
|
+ v.add(orderid);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(v.size() == 0){
|
|
|
continue;
|
|
|
}
|
|
|
try{
|
|
|
- log.info("剩余分批排程开始,当前批次坯料计划ID:"+k);
|
|
|
- List<ProductionProcesses> processesList1 = entry.getValue();
|
|
|
-
|
|
|
+ log.info("分批排程开始,当前批次坯料计划ID:"+v);
|
|
|
ApsSolution apsSolution1 = new ApsSolution();
|
|
|
apsSolution1.setStartTime(apsSolution.getStartTime());
|
|
|
+ List<ProductionProcesses> processesList1 = apsSolution.getProcessesList().stream().filter(m -> v.contains(m.getProduceOrder().get(0).getId())).collect(Collectors.toList());
|
|
|
apsSolution1.setProcessesList(processesList1);
|
|
|
apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
|
|
|
|
|
@@ -367,7 +281,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
.withEntityClasses(ProductionProcesses.class)
|
|
|
.withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
.withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
|
|
|
-// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
+// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
.withMoveThreadCount(cores)
|
|
|
);
|
|
|
Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
@@ -418,32 +332,123 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
softExplain(explain,solvedBalance1.getProcessesList());
|
|
|
|
|
|
solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
|
|
|
+ thOrderids.addAll(v);
|
|
|
|
|
|
// 排程结束的数据手动添加到设备占用列表中
|
|
|
setEqRunTimes(solvedBalance1.getProcessesList());
|
|
|
}catch (Exception e){
|
|
|
- exOrderIds.add(k);
|
|
|
+ exOrderIds.addAll(v);
|
|
|
if(productionScheduleRetVo.getMsg() == null){
|
|
|
productionScheduleRetVo.setMsg("排程异常,");
|
|
|
}
|
|
|
- productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+k);
|
|
|
+ productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+v);
|
|
|
e.printStackTrace();
|
|
|
- log.error("剩余分批排程开始,当前批次坯料计划ID:"+k,e);
|
|
|
+ log.error("分批排程异常,当前批次坯料计划ID:"+v,e);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
+ // 剩余数据按照坯料计划分组排程
|
|
|
+ List<ProductionProcesses> otherPros = apsSolution.getProcessesList().stream().filter(n -> !thOrderids.contains(n.getProduceOrder().get(0).getId())).collect(Collectors.toList());
|
|
|
+ if(otherPros != null && otherPros.size()>0){
|
|
|
+ Map<String, List<ProductionProcesses>> equass = new HashMap<>();
|
|
|
+ for (ProductionProcesses otherPro : otherPros) {
|
|
|
+ if(equass.containsKey(otherPro.getProduceOrder().get(0).getId())){
|
|
|
+ equass.get(otherPro.getProduceOrder().get(0).getId()).add(otherPro);
|
|
|
+ }else {
|
|
|
+ List<ProductionProcesses> p1 = new ArrayList<>();
|
|
|
+ p1.add(otherPro);
|
|
|
+ equass.put(otherPro.getProduceOrder().get(0).getId(),p1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(equass != null && equass.size()>0){
|
|
|
+ for(Map.Entry<String, List<ProductionProcesses>> entry : equass.entrySet()){
|
|
|
+ String k = entry.getKey();
|
|
|
+ if(exOrderIds.contains(k)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ try{
|
|
|
+ log.info("剩余分批排程开始,当前批次坯料计划ID:"+k);
|
|
|
+ List<ProductionProcesses> processesList1 = entry.getValue();
|
|
|
+
|
|
|
+ ApsSolution apsSolution1 = new ApsSolution();
|
|
|
+ apsSolution1.setStartTime(apsSolution.getStartTime());
|
|
|
+ apsSolution1.setProcessesList(processesList1);
|
|
|
+ apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
|
|
|
+
|
|
|
+ runPlanSeconds = (apsSolution1.getProcessesList().size()/prospeed + 1)*60;
|
|
|
+ SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
+ .withEnvironmentMode(mode)
|
|
|
+ .withSolutionClass(ApsSolution.class)
|
|
|
+ .withEntityClasses(ProductionProcesses.class)
|
|
|
+ .withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
+ .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
|
|
|
+// .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
|
|
|
+ .withMoveThreadCount(cores)
|
|
|
+ );
|
|
|
+ Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
|
+ solver.addEventListener(new SolverEventListener<ApsSolution>() {
|
|
|
+ public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
|
|
|
+ if(solver.isEveryProblemChangeProcessed()) {
|
|
|
+ event.getNewBestSolution().setConstructionHeuristicEnd(true);
|
|
|
+ if(event.getNewBestSolution().getStepBestProcessesList() == null){
|
|
|
+ List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
+// List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
|
|
|
+ for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
|
|
|
+ ProductionProcesses newPro = new ProductionProcesses();
|
|
|
+ newPro.setId(productionProcesses.getId());
|
|
|
+ newPro.setEquipmentId(productionProcesses.getEquipmentId());
|
|
|
+ Equipment eq = new Equipment();
|
|
|
+ if(productionProcesses.getEquipment() != null){
|
|
|
+ eq.setId(productionProcesses.getEquipment().getId());
|
|
|
+ }
|
|
|
+ newPro.setEquipment(eq);
|
|
|
+ newPro.setProduceTime(productionProcesses.getProduceTime());
|
|
|
+ newPro.setStartTime(productionProcesses.getStartTime());
|
|
|
+ newPro.setEndTime(productionProcesses.getEndTime());
|
|
|
+ newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
+ processesList.add(newPro);
|
|
|
+
|
|
|
+ productionProcesses.setApsStatus("LS");
|
|
|
+ }
|
|
|
+ event.getNewBestSolution().setStepBestProcessesList(processesList);
|
|
|
+ }
|
|
|
+ System.out.println("************"+event.getNewBestScore()+"************");
|
|
|
+ log.info("************"+event.getNewBestScore()+"************");
|
|
|
|
|
|
- /*ApsSolution solvedBalance = solver.solve(apsSolution);
|
|
|
- log.info("**************排程评分分析***************");
|
|
|
- SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
- ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance);
|
|
|
- log.info(explain.toString());
|
|
|
- log.info("**************排程评分分析***************");
|
|
|
- productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance).toString());
|
|
|
- // 得分分析
|
|
|
- softExplain(explain,solvedBalance.getProcessesList());*/
|
|
|
+ // 终止排程
|
|
|
+// solver.terminateEarly();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
+
|
|
|
+ ApsSolution solvedBalance1 = solver.solve(apsSolution1);
|
|
|
+ log.info("**************排程评分分析***************");
|
|
|
+ ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance1);
|
|
|
+ log.info(explain.toString());
|
|
|
+ log.info("**************排程评分分析***************");
|
|
|
+ productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance1).toString());
|
|
|
+ // 得分分析
|
|
|
+ softExplain(explain,solvedBalance1.getProcessesList());
|
|
|
+
|
|
|
+ solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
|
|
|
+
|
|
|
+ // 排程结束的数据手动添加到设备占用列表中
|
|
|
+ setEqRunTimes(solvedBalance1.getProcessesList());
|
|
|
+ }catch (Exception e){
|
|
|
+ exOrderIds.add(k);
|
|
|
+ if(productionScheduleRetVo.getMsg() == null){
|
|
|
+ productionScheduleRetVo.setMsg("排程异常,");
|
|
|
+ }
|
|
|
+ productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+k);
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("剩余分批排程开始,当前批次坯料计划ID:"+k,e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// 最大等待时间冲突手动解决
|
|
|
/*List<ProductionProcesses> maxSetPros = new ArrayList<>();
|