ApsUtils.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package com.rongwei.rwapsserver.aps.util;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.rongwei.rwapsserver.aps.domain.ApsSolution;
  5. import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
  6. import com.rongwei.rwapsserver.aps.taskassigning.tado.ProductionProcessesTa;
  7. import org.optaplanner.core.api.score.ScoreExplanation;
  8. import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
  9. import org.optaplanner.core.api.score.constraint.ConstraintMatch;
  10. import java.util.*;
  11. public class ApsUtils {
  12. /**
  13. * 最终得分分析
  14. * @param explain
  15. * @param processes
  16. */
  17. public void softExplain(ScoreExplanation<ApsSolution, HardSoftScore> explain, List<ProductionProcesses> processes){
  18. if(explain != null && explain.getConstraintMatchTotalMap() != null && explain.getConstraintMatchTotalMap().size()>0){
  19. explain.getConstraintMatchTotalMap().forEach((k,v)->{
  20. String constraintName = v.getConstraintName();
  21. if(constraintName != null){
  22. String desc = ApsConstants.constraintDesc.get(constraintName);
  23. String consLevel = ApsConstants.hardConstraint.contains(constraintName) ? "hard" : "soft";
  24. if(desc != null && v.getConstraintMatchSet() != null && v.getConstraintMatchSet().size()>0){
  25. for (ConstraintMatch<HardSoftScore> hardSoftScoreConstraintMatch : v.getConstraintMatchSet()) {
  26. if(hardSoftScoreConstraintMatch.getIndictedObjectList() != null && hardSoftScoreConstraintMatch.getIndictedObjectList().size() > 0){
  27. for (Object o : hardSoftScoreConstraintMatch.getIndictedObjectList()) {
  28. if(o instanceof ProductionProcesses){
  29. ProductionProcesses productionProcesses = (ProductionProcesses)o;
  30. constraintDescInit(productionProcesses,desc,consLevel);
  31. } else if (o instanceof ArrayList) {
  32. List<ProductionProcesses> processesList = (ArrayList)o;
  33. for (ProductionProcesses productionProcesses : processesList) {
  34. constraintDescInit(productionProcesses,desc,consLevel);
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. });
  43. }
  44. }
  45. /**
  46. * 冲突描述
  47. * @param productionProcesses
  48. * @param desc
  49. * @param consLevel
  50. */
  51. private void constraintDescInit(ProductionProcesses productionProcesses,String desc,String consLevel){
  52. if("y".equals(productionProcesses.getHasConflict())){
  53. if("hard".equals(consLevel)){
  54. if(StrUtil.isBlank(productionProcesses.getConflictDes())){
  55. productionProcesses.setConflictDes(desc);
  56. }else{
  57. if(!productionProcesses.getConflictDes().contains(desc)){
  58. productionProcesses.setConflictDes(productionProcesses.getConflictDes()+";"+desc);
  59. }
  60. }
  61. }else{
  62. if(StrUtil.isBlank(productionProcesses.getSoftconflictdes())){
  63. productionProcesses.setSoftconflictdes(desc);
  64. }else{
  65. if(!productionProcesses.getSoftconflictdes().contains(desc)){
  66. productionProcesses.setSoftconflictdes(productionProcesses.getSoftconflictdes()+";"+desc);
  67. }
  68. }
  69. }
  70. }else{
  71. productionProcesses.setHasConflict("y");
  72. if("hard".equals(consLevel)){
  73. productionProcesses.setConflictDes(desc);
  74. }else{
  75. productionProcesses.setSoftconflictdes(desc);
  76. }
  77. }
  78. }
  79. /**
  80. * 根据可选设备分组排程
  81. * @param processes
  82. * @param equPros
  83. */
  84. public void groupProsByEqu(List<ProductionProcessesTa> processes, Map<String,List<ProductionProcessesTa>> equPros){
  85. // 根据可选设备分组排程
  86. for (ProductionProcessesTa productionProcesses : processes) {
  87. if(productionProcesses.getOptionalEquipments().size()>1){
  88. int aaa = 0;
  89. }
  90. String equids = CollUtil.join(productionProcesses.getOptionalEquipments(), ",");
  91. if(equPros.size() == 0){
  92. List<ProductionProcessesTa> pps = new ArrayList<>();
  93. pps.add(productionProcesses);
  94. equPros.put(equids,pps);
  95. }else {
  96. boolean hasSameKeys = false;
  97. List<String> haskey = new ArrayList<>();
  98. Set<String> keys = equPros.keySet();
  99. for (String key : keys) {
  100. for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
  101. if(key.contains(optionalEquipment)){
  102. hasSameKeys = true;
  103. haskey.add(key);
  104. }
  105. }
  106. }
  107. if(hasSameKeys){
  108. List<ProductionProcessesTa> mergePros = new ArrayList<>();
  109. Set<String> keyIds = new HashSet<>();
  110. for (String s : haskey) {
  111. List<ProductionProcessesTa> processesList1 = equPros.get(s);
  112. if(processesList1 != null && processesList1.size() > 0){
  113. mergePros.addAll(processesList1);
  114. equPros.remove(s);
  115. String[] keysps = s.split(",");
  116. for (String key : keysps) {
  117. keyIds.add(key);
  118. }
  119. }
  120. }
  121. mergePros.add(productionProcesses);
  122. String keyIdStrs = CollUtil.join(keyIds, ",");
  123. for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
  124. if(!keyIdStrs.contains(optionalEquipment)){
  125. keyIdStrs = keyIdStrs + "," + optionalEquipment;
  126. }
  127. }
  128. equPros.put(keyIdStrs,mergePros);
  129. }else{
  130. List<ProductionProcessesTa> pps = new ArrayList<>();
  131. pps.add(productionProcesses);
  132. equPros.put(equids,pps);
  133. }
  134. }
  135. }
  136. }
  137. }