|
@@ -361,6 +361,11 @@ public class ApsServiceImpl implements ApsService {
|
|
|
return a;
|
|
|
});
|
|
|
ApsSolution solvedBalance1 = solver1.solve(apsSolutionTh);
|
|
|
+ /*for (ProductionProcesses productionProcesses : solvedBalance1.getProcessesList()) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ LocalDateTime parsedDateTime = LocalDateTime.parse("2025-01-02 07:00:00", formatter);
|
|
|
+ productionProcesses.setStartTime(parsedDateTime);
|
|
|
+ }*/
|
|
|
log.info("**************退火排程评分分析***************");
|
|
|
SolutionManager<ApsSolution, HardSoftScore> scoreManager1 = SolutionManager.create(solverFactory1);
|
|
|
ScoreExplanation<ApsSolution, HardSoftScore> explain1 = scoreManager1.explain(solvedBalance1);
|
|
@@ -461,6 +466,100 @@ public class ApsServiceImpl implements ApsService {
|
|
|
List<ProductionProcesses> hbThPros = apsSolution.getProcessesList().stream().filter(vp -> hbThIds.contains(vp.getId())).collect(Collectors.toList());
|
|
|
ProductionProcesses mainTh = thOrdersMerge(hbThPros, otherThproces, allProMap,apsSolution);
|
|
|
apsSolution.getProcessesList().sort(Comparator.comparing(ProductionProcesses::getOrderMark));
|
|
|
+ // 退火后一道工序如果是精整类别的则合并
|
|
|
+ List<ProductionProcesses> lastProMerge = new ArrayList<>();
|
|
|
+ /*for (ProductionProcesses hbThPro : hbThPros) {
|
|
|
+ if(hbThPro.getNextProcesses() != null && hbThPro.getNextProcesses().size() == 1){
|
|
|
+ ProductionProcesses productionProcesses = hbThPro.getNextProcesses().get(0);
|
|
|
+ if(productionProcesses.getProcessCategory() != null && "40".equals(productionProcesses.getProcessCategory())
|
|
|
+ && (productionProcesses.getNextProcesses() == null || productionProcesses.getNextProcesses().size() == 0)){
|
|
|
+ lastProMerge.add(productionProcesses);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+ for (ProductionProcesses productionProcesses : mainTh.getNextProcesses()) {
|
|
|
+ if(productionProcesses.getProcessCategory() != null && "40".equals(productionProcesses.getProcessCategory())
|
|
|
+ && (productionProcesses.getNextProcesses() == null || productionProcesses.getNextProcesses().size() == 0)){
|
|
|
+ lastProMerge.add(productionProcesses);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(lastProMerge.size()>0){
|
|
|
+ Map<String, List<ProductionProcesses>> orderProcess = lastProMerge.stream().collect(Collectors.groupingBy(ProductionProcesses::getProcessType));
|
|
|
+ orderProcess.forEach((k1,v1)->{
|
|
|
+ if(v1.size()>1){
|
|
|
+ List<String> sameEqs = new ArrayList<>();
|
|
|
+ boolean issameeq = true;
|
|
|
+ for (ProductionProcesses productionProcesses : v1) {
|
|
|
+ if(sameEqs.size() == 0){
|
|
|
+ sameEqs.addAll(productionProcesses.getOptionalEquipments());
|
|
|
+ }else{
|
|
|
+ List<String> a = new ArrayList<>();
|
|
|
+ for (String sameEq : sameEqs) {
|
|
|
+ for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
|
|
|
+ if(sameEq.equals(optionalEquipment)){
|
|
|
+ a.add(sameEq);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(a.size()>0){
|
|
|
+ sameEqs = a;
|
|
|
+ }else{
|
|
|
+ issameeq = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(issameeq && sameEqs.size()>0){
|
|
|
+ ProductionProcesses mergePro = v1.get(0);
|
|
|
+ List<String> mergeProOrders = new ArrayList<>();
|
|
|
+ if(mergePro.getMergeProOrders() != null && mergePro.getMergeProOrders().size()>0){
|
|
|
+ mergeProOrders.addAll(mergePro.getMergeProOrders());
|
|
|
+ }else{
|
|
|
+ mergeProOrders.add(mergePro.getId());
|
|
|
+ }
|
|
|
+ mergePro.setMergeProOrders(mergeProOrders);
|
|
|
+ mergePro.setOptionalEquipments(sameEqs);
|
|
|
+ for (int i = 0; i < v1.size(); i++) {
|
|
|
+ if(i>0){
|
|
|
+ if(v1.get(i).getMergeProOrders() != null && v1.get(i).getMergeProOrders().size()>0){
|
|
|
+ mergePro.getMergeProOrders().addAll(v1.get(i).getMergeProOrders());
|
|
|
+ }else{
|
|
|
+ mergePro.getMergeProOrders().add(v1.get(i).getId());
|
|
|
+ }
|
|
|
+ // 设置待合并退火的主ID
|
|
|
+ v1.get(i).setMergeThMainId(v1.get(0).getId());
|
|
|
+ mergePro.setOpeProducePcNum(mergePro.getOpeProducePcNum()+v1.get(i).getOpeProducePcNum());
|
|
|
+ mergePro.setProduceTime(mergePro.getProduceTime()+v1.get(i).getProduceTime());
|
|
|
+ if(mergePro.getOrderMark()<v1.get(i).getOrderMark()){
|
|
|
+ mergePro.setOrderMark(v1.get(i).getOrderMark());
|
|
|
+ }
|
|
|
+ // 前后道工序关联关系设置
|
|
|
+ List<String> preids = new ArrayList<>();
|
|
|
+ preids.add(mainTh.getId());
|
|
|
+ List<ProductionProcesses> prepros = new ArrayList<>();
|
|
|
+ prepros.add(mainTh);
|
|
|
+ mergePro.setPreviousProcessesIds(preids);
|
|
|
+ mergePro.setPreviousProcesses(prepros);
|
|
|
+ String vid1 = v1.get(i).getId();
|
|
|
+ if(mainTh.getNextProcessesIds().contains(v1.get(i).getId())){
|
|
|
+ mainTh.getNextProcessesIds().remove(v1.get(i).getId());
|
|
|
+ List<ProductionProcesses> vidpros1 = mainTh.getNextProcesses().stream().filter(v2 -> !v2.getId().equals(vid1)).collect(Collectors.toList());
|
|
|
+ mainTh.setNextProcesses(vidpros1);
|
|
|
+ }
|
|
|
+ // 小卷退火卷数合并
|
|
|
+ if(v1.get(i).getProcessType().equals("小卷成退")){
|
|
|
+ v1.get(0).setMinThPcNum(v1.get(0).getMinThPcNum()+v1.get(i).getMinThPcNum());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ProductionProcesses> collect = apsSolution.getProcessesList().stream().filter(va -> !va.getId().equals(vid1)).collect(Collectors.toList());
|
|
|
+ apsSolution.setProcessesList(collect);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
}else{
|
|
|
for (ProductionProcesses process : v) {
|
|
|
List<ProductionProcesses> collect = apsSolution.getProcessesList().stream().filter(vp -> vp.getId().equals(process.getId())).collect(Collectors.toList());
|
|
@@ -1250,6 +1349,11 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}
|
|
|
// 合并退火作业
|
|
|
for (List<ProductionProcesses> thps : chunks) {
|
|
|
+ // 按照铸轧时间排序
|
|
|
+ if(thps.get(0).getRooprocess() != null && thps.get(0).getRooprocess().getStartTime() != null){
|
|
|
+ Collections.sort(thps,Comparator.comparing(pro -> pro.getRooprocess().getStartTime()));
|
|
|
+ }
|
|
|
+
|
|
|
ProductionProcesses mergePro = thps.get(0);
|
|
|
List<String> mergeProOrders = new ArrayList<>();
|
|
|
mergeProOrders.add(mergePro.getId());
|
|
@@ -1423,6 +1527,10 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}else{
|
|
|
List<ProductionProcesses> mergePres = new ArrayList<>();
|
|
|
mergePres.addAll(nextProcesses);
|
|
|
+ // 按照铸轧时间排序
|
|
|
+ if(mergePres.get(0).getRooprocess() != null && mergePres.get(0).getRooprocess().getStartTime() != null){
|
|
|
+ Collections.sort(mergePres,Comparator.comparing(pro -> pro.getRooprocess().getStartTime()));
|
|
|
+ }
|
|
|
if(!hasMerge.contains(mergePres.get(0).getId())){
|
|
|
ProductionProcesses mergePro = mergePres.get(0);
|
|
|
Map<String,ProductionProcesses> mergeProNexts = new HashMap<>();
|
|
@@ -1535,6 +1643,10 @@ public class ApsServiceImpl implements ApsService {
|
|
|
}else{
|
|
|
List<ProductionProcesses> mergePres = new ArrayList<>();
|
|
|
mergePres.addAll(previousProcesses);
|
|
|
+ // 按照铸轧时间排序
|
|
|
+ if(mergePres.get(0).getRooprocess() != null && mergePres.get(0).getRooprocess().getStartTime() != null){
|
|
|
+ Collections.sort(mergePres,Comparator.comparing(pro -> pro.getRooprocess().getStartTime()));
|
|
|
+ }
|
|
|
if(!hasMerge.contains(mergePres.get(0).getId())){
|
|
|
ProductionProcesses mergePro = mergePres.get(0);
|
|
|
Map<String,ProductionProcesses> mergeProPres = new HashMap<>();
|