|
@@ -11,6 +11,7 @@ import com.rongwei.rwapsserver.aps.service.DdApsService;
|
|
|
import com.rongwei.rwapsserver.aps.service.ProductionScheduleService;
|
|
|
import com.rongwei.rwapsserver.aps.util.ApsConstants;
|
|
|
import com.rongwei.rwapsserver.aps.util.ApsException;
|
|
|
+import com.rongwei.rwapsserver.aps.util.ApsUtils;
|
|
|
import com.rongwei.rwapsserver.aps.vo.ProductionScheduleRetVo;
|
|
|
import com.rongwei.rwapsserver.aps.vo.ProductionScheduleVo;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -48,11 +49,12 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
public ProductionScheduleRetVo productionLxSchedule(ProductionScheduleVo productionScheduleVo) throws Exception {
|
|
|
log.info("*************** 排程开始(productionLxSchedule):"+productionScheduleVo.getProductionScheduleId()+" *******************");
|
|
|
|
|
|
- List<ProductionProcesses> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
|
|
|
+ /*List<ProductionProcesses> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
|
|
|
!v.getProduceOrder().get(0).getId().equals("53bf294756e3457fac9a0e0e174314b3"))
|
|
|
.collect(Collectors.toList());
|
|
|
- productionScheduleVo.setProcesses(pdps);
|
|
|
+ productionScheduleVo.setProcesses(pdps);*/
|
|
|
// 排程结果对象
|
|
|
+ ApsUtils apsUtils = new ApsUtils();
|
|
|
ProductionScheduleRetVo productionScheduleRetVo = new ProductionScheduleRetVo();
|
|
|
// optaplanner 求解器数据装配
|
|
|
List<ProductionProcesses> otherThproces = new ArrayList<>();
|
|
@@ -135,7 +137,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
.withEntityClasses(ProductionProcesses.class, Equipment.class)
|
|
|
.withConstraintProviderClass(ApsConstraintListProvider.class)
|
|
|
// .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
|
|
|
- .withTerminationSpentLimit(Duration.ofSeconds(300))
|
|
|
+ .withTerminationSpentLimit(Duration.ofSeconds(180))
|
|
|
.withMoveThreadCount(cores)
|
|
|
);
|
|
|
Solver<ApsSolution> solver = solverFactory.buildSolver();
|
|
@@ -173,65 +175,45 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- List<Equipment> equipments = new ArrayList<>();
|
|
|
- for (ProductionProcesses productionProcesses : apsSolution.getProcessesList()) {
|
|
|
- for (Equipment optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
|
|
|
- List<Equipment> 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);
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- }
|
|
|
- apsSolution.setEquipmentList(equipments);
|
|
|
// 根据可选设备分组排程
|
|
|
Map<String,List<ProductionProcesses>> equPros = new HashMap<>();
|
|
|
- for (ProductionProcesses productionProcesses : apsSolution.getProcessesList()) {
|
|
|
- String equids = CollUtil.join(productionProcesses.getOptionalEquipments(), ",");
|
|
|
- if(equPros.size() == 0){
|
|
|
- List<ProductionProcesses> pps = new ArrayList<>();
|
|
|
- pps.add(productionProcesses);
|
|
|
- equPros.put(equids,pps);
|
|
|
- }else {
|
|
|
- boolean hasSameKeys = false;
|
|
|
- String haskey = null;
|
|
|
- Set<String> keys = equPros.keySet();
|
|
|
- for (String key : keys) {
|
|
|
- for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
|
|
|
- if(key.contains(optionalEquipment)){
|
|
|
- hasSameKeys = true;
|
|
|
- haskey = key;
|
|
|
- }
|
|
|
+ apsUtils.groupProsByEqu(apsSolution.getProcessesList(),equPros);
|
|
|
+ // 分批排程
|
|
|
+ ApsSolution solvedBalance = new ApsSolution();
|
|
|
+ solvedBalance.setProcessesList(new ArrayList<>());
|
|
|
+ equPros.forEach((kk,vv)->{
|
|
|
+ List<Equipment> equipments = new ArrayList<>();
|
|
|
+ for (ProductionProcesses productionProcesses : vv) {
|
|
|
+ for (Equipment optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
|
|
|
+ List<Equipment> 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);
|
|
|
}
|
|
|
}
|
|
|
- if(hasSameKeys){
|
|
|
- List<ProductionProcesses> processesList1 = equPros.get(haskey);
|
|
|
- processesList1.add(productionProcesses);
|
|
|
- equPros.remove(haskey);
|
|
|
- for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
|
|
|
- if(!haskey.contains(optionalEquipment)){
|
|
|
- haskey = haskey + "," + optionalEquipment;
|
|
|
- }
|
|
|
- }
|
|
|
- equPros.put(haskey,processesList1);
|
|
|
- }else{
|
|
|
- List<ProductionProcesses> pps = new ArrayList<>();
|
|
|
- pps.add(productionProcesses);
|
|
|
- equPros.put(equids,pps);
|
|
|
+
|
|
|
+ }
|
|
|
+ apsSolution.setEquipmentList(equipments);
|
|
|
+ apsSolution.setProcessesList(vv);
|
|
|
+
|
|
|
+ ApsSolution solvedBalance1 = solver.solve(apsSolution);
|
|
|
+ for (ProductionProcesses productionProcesses : solvedBalance1.getProcessesList()) {
|
|
|
+ if(productionProcesses.getOptionalEquipmentZg() != null && productionProcesses.getOptionalEquipmentZg().size()>0){
|
|
|
+ productionProcesses.setProZg(productionProcesses.getOptionalEquipmentZg().get(productionProcesses.getEquipment().getId()));
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ log.info("**************排程评分分析***************");
|
|
|
+ SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
|
|
|
+ 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());
|
|
|
+ });
|
|
|
|
|
|
- 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());
|
|
|
|
|
|
solvedBalance.getProcessesList().addAll(hasLocks);
|
|
|
// 退火合并工序排程完拆分
|