|
@@ -28,6 +28,7 @@ import org.optaplanner.core.api.solver.event.BestSolutionChangedEvent;
|
|
|
import org.optaplanner.core.api.solver.event.SolverEventListener;
|
|
|
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.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
@@ -55,10 +56,10 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
public ProductionScheduleRetTaVo productionSchedule(ProductionScheduleTaVo productionScheduleVo) throws Exception{
|
|
|
log.info("*************** 排程开始(productionLxSchedule):"+productionScheduleVo.getProductionScheduleId()+" *******************");
|
|
|
|
|
|
- List<ProductionProcessesTa> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
|
|
|
+ /*List<ProductionProcessesTa> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
|
|
|
v.getProduceOrder().get(0).getId().equals("85e8e1938b7445939713f70f00401333"))
|
|
|
.collect(Collectors.toList());
|
|
|
- productionScheduleVo.setProcesses(pdps);
|
|
|
+ productionScheduleVo.setProcesses(pdps);*/
|
|
|
// 排程结果对象
|
|
|
ApsUtils apsUtils = new ApsUtils();
|
|
|
ProductionScheduleRetTaVo productionScheduleRetVo = new ProductionScheduleRetTaVo();
|
|
@@ -123,8 +124,8 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
.withSolutionClass(ApsSolutionTa.class)
|
|
|
.withEntityClasses(ProductionProcessesTa.class, EquipmentTa.class)
|
|
|
.withConstraintProviderClass(ApsConstraintListProvider.class)
|
|
|
-// .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
|
|
|
- .withTerminationSpentLimit(Duration.ofSeconds(180))
|
|
|
+ .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
|
|
|
+// .withTerminationSpentLimit(Duration.ofSeconds(180))
|
|
|
.withMoveThreadCount(cores)
|
|
|
);
|
|
|
Solver<ApsSolutionTa> solver = solverFactory.buildSolver();
|
|
@@ -204,53 +205,64 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
}
|
|
|
midPros = nextSteps;
|
|
|
}
|
|
|
- for (ProductionProcessesTa productionProcessesTa : apsSolution.getProcessesList()) {
|
|
|
+ /*for (ProductionProcessesTa productionProcessesTa : apsSolution.getProcessesList()) {
|
|
|
if(!hasids.contains(productionProcessesTa.getId())){
|
|
|
notaps.add(productionProcessesTa);
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
- ApsSolutionTa apsSolution1 = new ApsSolutionTa();
|
|
|
- apsSolution1.setStartTime(apsSolution.getStartTime());
|
|
|
- apsSolution1.setProcessesList(firstpros);
|
|
|
- // 根据可选设备分组排程
|
|
|
- Map<String,List<ProductionProcessesTa>> equPros = new HashMap<>();
|
|
|
- apsUtils.groupProsByEqu(apsSolution1.getProcessesList(),equPros);
|
|
|
- // 分批排程
|
|
|
+ // 分批执行、每一批执行完后回写设备占用时间
|
|
|
ApsSolutionTa solvedBalance = new ApsSolutionTa();
|
|
|
solvedBalance.setProcessesList(new ArrayList<>());
|
|
|
- equPros.forEach((kk,vv)->{
|
|
|
- List<EquipmentTa> equipments = new ArrayList<>();
|
|
|
- for (ProductionProcessesTa productionProcesses : vv) {
|
|
|
- for (EquipmentTa optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
|
|
|
- List<EquipmentTa> esss = equipments.stream().filter(v -> v.getId().equals(optionalProviderEquipment.getId())).collect(Collectors.toList());
|
|
|
- if(esss == null || esss.size() == 0){
|
|
|
- optionalProviderEquipment.setTasks(new ArrayList<>());
|
|
|
- equipments.add(optionalProviderEquipment);
|
|
|
+ int a = 0;
|
|
|
+ for (List<ProductionProcessesTa> allSteppro : allSteppros) {
|
|
|
+ a++;
|
|
|
+ System.out.println("******************第"+a+"批开始排程******************");
|
|
|
+ log.info("******************第"+a+"批开始排程******************");
|
|
|
+ ApsSolutionTa apsSolution1 = new ApsSolutionTa();
|
|
|
+ apsSolution1.setStartTime(apsSolution.getStartTime());
|
|
|
+ apsSolution1.setProcessesList(allSteppro);
|
|
|
+ // 根据可选设备分组排程
|
|
|
+ Map<String,List<ProductionProcessesTa>> equPros = new HashMap<>();
|
|
|
+ apsUtils.groupProsByEqu(apsSolution1.getProcessesList(),equPros);
|
|
|
+ // 按设备分批排程
|
|
|
+ equPros.forEach((kk,vv)->{
|
|
|
+ List<EquipmentTa> equipments = new ArrayList<>();
|
|
|
+ for (ProductionProcessesTa productionProcesses : vv) {
|
|
|
+ for (EquipmentTa optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
|
|
|
+ List<EquipmentTa> esss = equipments.stream().filter(v -> v.getId().equals(optionalProviderEquipment.getId())).collect(Collectors.toList());
|
|
|
+ if(esss == null || esss.size() == 0){
|
|
|
+ optionalProviderEquipment.setTasks(new ArrayList<>());
|
|
|
+ equipments.add(optionalProviderEquipment);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- }
|
|
|
- apsSolution1.setEquipmentList(equipments);
|
|
|
- apsSolution1.setProcessesList(vv);
|
|
|
+ }
|
|
|
+ apsSolution1.setEquipmentList(equipments);
|
|
|
+ apsSolution1.setProcessesList(vv);
|
|
|
|
|
|
- ApsSolutionTa solvedBalance1 = solver.solve(apsSolution1);
|
|
|
- for (ProductionProcessesTa productionProcesses : solvedBalance1.getProcessesList()) {
|
|
|
- if(productionProcesses.getOptionalEquipmentZg() != null && productionProcesses.getOptionalEquipmentZg().size()>0){
|
|
|
- productionProcesses.setProZg(productionProcesses.getOptionalEquipmentZg().get(productionProcesses.getEquipment().getId()));
|
|
|
+ ApsSolutionTa solvedBalance1 = solver.solve(apsSolution1);
|
|
|
+ for (ProductionProcessesTa productionProcesses : solvedBalance1.getProcessesList()) {
|
|
|
+ if(productionProcesses.getOptionalEquipmentZg() != null && productionProcesses.getOptionalEquipmentZg().size()>0){
|
|
|
+ productionProcesses.setProZg(productionProcesses.getOptionalEquipmentZg().get(productionProcesses.getEquipment().getId()));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- log.info("**************排程评分分析***************");
|
|
|
- SolutionManager<ApsSolutionTa, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
- ScoreExplanation<ApsSolutionTa, 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());
|
|
|
- });
|
|
|
+ log.info("**************排程评分分析***************");
|
|
|
+ SolutionManager<ApsSolutionTa, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
+ ScoreExplanation<ApsSolutionTa, 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(),apsSolution);
|
|
|
+ // 回写时间和设备
|
|
|
+ timeAndEquSet(solvedBalance1.getProcessesList(),apsSolution);
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
solvedBalance.getProcessesList().addAll(hasLocks);
|
|
|
// 退火合并工序排程完拆分
|
|
@@ -415,11 +427,32 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 冷轧调度回写时间和设备
|
|
|
+ * @param pps
|
|
|
+ * @param apsSolutionTa
|
|
|
+ */
|
|
|
+ private void timeAndEquSet(List<ProductionProcessesTa> pps,ApsSolutionTa apsSolutionTa){
|
|
|
+ if(pps != null && pps.size()>0){
|
|
|
+ for (ProductionProcessesTa productionProcesses : pps) {
|
|
|
+ List<ProductionProcessesTa> hasPro = apsSolutionTa.getProcessesList().stream().filter(v -> v.getId().equals(productionProcesses.getId())).collect(Collectors.toList());
|
|
|
+ List<EquipmentTa> equipmentTas = apsSolutionTa.getEquipmentList().stream().filter(v -> v.getId().equals(productionProcesses.getEquipment().getId())).collect(Collectors.toList());
|
|
|
+ if(hasPro != null && hasPro.size() == 1 && equipmentTas != null && equipmentTas.size() == 1){
|
|
|
+ ProductionProcessesTa productionProcessesTa = hasPro.get(0);
|
|
|
+ productionProcessesTa.setStartTime(productionProcesses.getStartTime());
|
|
|
+ productionProcessesTa.setEndTime(productionProcesses.getEndTime());
|
|
|
+ productionProcessesTa.setEquipment(equipmentTas.get(0));
|
|
|
+ productionProcessesTa.setEquipmentId(equipmentTas.get(0).getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 排程结束数据手动添加到设备占用列表中
|
|
|
* @param pps
|
|
|
*/
|
|
|
- private void setEqRunTimes(List<ProductionProcessesTa> pps){
|
|
|
+ private void setEqRunTimes(List<ProductionProcessesTa> pps,ApsSolutionTa apsSolutionTa){
|
|
|
if(pps != null && pps.size()>0){
|
|
|
for (ProductionProcessesTa productionProcesses : pps) {
|
|
|
// 添加锁定工序设备占用时间
|
|
@@ -451,10 +484,17 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
equipmentRunTimes.add(pper);
|
|
|
|
|
|
if(equipmentRunTimes.size()>0){
|
|
|
- if(productionProcesses.getEquipment().getEquipmentRunTimes() == null){
|
|
|
- productionProcesses.getEquipment().setEquipmentRunTimes(equipmentRunTimes);
|
|
|
- }else{
|
|
|
- productionProcesses.getEquipment().getEquipmentRunTimes().addAll(equipmentRunTimes);
|
|
|
+ // 找到设备
|
|
|
+ List<EquipmentTa> equipmentTas = apsSolutionTa.getEquipmentList().stream().filter(v -> v.getId().equals(productionProcesses.getEquipment().getId())).collect(Collectors.toList());
|
|
|
+ if(equipmentTas != null && equipmentTas.size() == 1){
|
|
|
+ EquipmentTa equipmentTa = equipmentTas.get(0);
|
|
|
+
|
|
|
+ if(equipmentTa.getEquipmentRunTimes() == null){
|
|
|
+ equipmentTa.setEquipmentRunTimes(equipmentRunTimes);
|
|
|
+ }else{
|
|
|
+ equipmentTa.getEquipmentRunTimes().addAll(equipmentRunTimes);
|
|
|
+ Collections.sort(equipmentTa.getEquipmentRunTimes(),Comparator.comparing(EquipmentRunTime::getStartRunTime));
|
|
|
+ }
|
|
|
}
|
|
|
// apsService.equipmentRunTimeMerge(productionProcesses.getEquipment(),productionProcesses.getApsOverallConfig().getFurnaceInstallations());
|
|
|
}
|