|
@@ -55,10 +55,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 ->
|
|
|
- !v.getProduceOrder().get(0).getId().equals("53bf294756e3457fac9a0e0e174314b3"))
|
|
|
+ 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();
|
|
@@ -115,22 +115,7 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
}
|
|
|
apsSolution.setProcessesList(notLocks);
|
|
|
|
|
|
- // 取每个坯料计划的第一道待排序
|
|
|
- List<ProductionProcessesTa> firstpros = apsSolution.getProcessesList().stream().filter(v -> {
|
|
|
- boolean firstpro = true;
|
|
|
- List<ProductionProcessesTa> previousProcesses = v.getPreviousProcesses();
|
|
|
- if (previousProcesses != null && previousProcesses.size() > 0) {
|
|
|
- for (ProductionProcessesTa previousProcess : previousProcesses) {
|
|
|
- if (!previousProcess.getIfLock()) {
|
|
|
- firstpro = false;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return firstpro;
|
|
|
- }).collect(Collectors.toList());
|
|
|
- apsSolution.setProcessesList(firstpros);
|
|
|
-
|
|
|
+ // 求解器初始化
|
|
|
String cores = Runtime.getRuntime().availableProcessors() + "";
|
|
|
SolverFactory<ApsSolutionTa> solverFactory = SolverFactory.create(new SolverConfig()
|
|
|
.withEnvironmentMode(EnvironmentMode.REPRODUCIBLE)
|
|
@@ -178,9 +163,59 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+ List<ProductionProcessesTa> notaps = new ArrayList<>();
|
|
|
+ List<String> hasids = new ArrayList<>();
|
|
|
+ // 所有分批排程
|
|
|
+ List<List<ProductionProcessesTa>> allSteppros = new ArrayList<>();
|
|
|
+ // 取每个坯料计划的第一道待排序
|
|
|
+ List<ProductionProcessesTa> firstpros = apsSolution.getProcessesList().stream().filter(v -> {
|
|
|
+ boolean firstpro = true;
|
|
|
+ List<ProductionProcessesTa> previousProcesses = v.getPreviousProcesses();
|
|
|
+ if (previousProcesses != null && previousProcesses.size() > 0) {
|
|
|
+ for (ProductionProcessesTa previousProcess : previousProcesses) {
|
|
|
+ if (!previousProcess.getIfLock()) {
|
|
|
+ firstpro = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (firstpro){
|
|
|
+ hasids.add(v.getId());
|
|
|
+ }
|
|
|
+ return firstpro;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ allSteppros.add(firstpros);
|
|
|
+ // 从第一批开始遍历每一批的数据
|
|
|
+ List<ProductionProcessesTa> midPros = firstpros;
|
|
|
+ while (midPros != null && midPros.size()>0){
|
|
|
+ List<ProductionProcessesTa> nextSteps = new ArrayList<>();
|
|
|
+ for (ProductionProcessesTa midPro : midPros) {
|
|
|
+ if(midPro.getNextProcesses() != null && midPro.getNextProcesses().size()>0){
|
|
|
+ for (ProductionProcessesTa nextProcess : midPro.getNextProcesses()) {
|
|
|
+ if(!nextProcess.getIfLock()){
|
|
|
+ nextSteps.add(nextProcess);
|
|
|
+ hasids.add(nextProcess.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(nextSteps != null && nextSteps.size()>0){
|
|
|
+ allSteppros.add(nextSteps);
|
|
|
+ }
|
|
|
+ midPros = nextSteps;
|
|
|
+ }
|
|
|
+ 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(apsSolution.getProcessesList(),equPros);
|
|
|
+ apsUtils.groupProsByEqu(apsSolution1.getProcessesList(),equPros);
|
|
|
// 分批排程
|
|
|
ApsSolutionTa solvedBalance = new ApsSolutionTa();
|
|
|
solvedBalance.setProcessesList(new ArrayList<>());
|
|
@@ -196,10 +231,10 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- apsSolution.setEquipmentList(equipments);
|
|
|
- apsSolution.setProcessesList(vv);
|
|
|
+ apsSolution1.setEquipmentList(equipments);
|
|
|
+ apsSolution1.setProcessesList(vv);
|
|
|
|
|
|
- ApsSolutionTa solvedBalance1 = solver.solve(apsSolution);
|
|
|
+ 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()));
|
|
@@ -380,11 +415,49 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
|
|
|
}
|
|
|
|
|
|
- private void testOne(ProductionProcessesTa root){
|
|
|
- System.out.println(root.getId()+"-"+root.getOrderMark());
|
|
|
- if(root.getNextProcesses() != null && root.getNextProcesses().size()>0){
|
|
|
- for (ProductionProcessesTa nextProcess : root.getNextProcesses()) {
|
|
|
- testOne(nextProcess);
|
|
|
+ /**
|
|
|
+ * 排程结束数据手动添加到设备占用列表中
|
|
|
+ * @param pps
|
|
|
+ */
|
|
|
+ private void setEqRunTimes(List<ProductionProcessesTa> pps){
|
|
|
+ if(pps != null && pps.size()>0){
|
|
|
+ for (ProductionProcessesTa productionProcesses : pps) {
|
|
|
+ // 添加锁定工序设备占用时间
|
|
|
+ List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
|
|
|
+ EquipmentRunTime pper = new EquipmentRunTime();
|
|
|
+ pper.setStartRunTime(productionProcesses.getStartTime());
|
|
|
+ pper.setEndRunTime(productionProcesses.getEndTime());
|
|
|
+ pper.setSeriesProduceMark(productionProcesses.getSeriesProduceMark());
|
|
|
+ pper.setProcessType(productionProcesses.getProcessType());
|
|
|
+ pper.setVolumeMetal(productionProcesses.getVolumeMetal());
|
|
|
+ if("小卷成退,小卷包装".contains(productionProcesses.getProcessType())){
|
|
|
+ pper.setTotalVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ }else{
|
|
|
+ pper.setTotalVolumeWidth(productionProcesses.getVolumeWidth().multiply(new BigDecimal(productionProcesses.getOpeProducePcNum())));
|
|
|
+ }
|
|
|
+ pper.setTotalSinglerollweight(productionProcesses.getTotalSinglerollweight());
|
|
|
+ pper.setTotalThickness(productionProcesses.getVolumeThickness());
|
|
|
+ pper.setMaxSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
+ pper.setMinSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
+ pper.setMaxVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ pper.setMinVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ pper.setMaxThickness(productionProcesses.getVolumeThickness());
|
|
|
+ pper.setMinThickness(productionProcesses.getVolumeThickness());
|
|
|
+ pper.setProducttype(productionProcesses.getProducttype());
|
|
|
+ pper.setOnceprocessmin(productionProcesses.getProduceTime());
|
|
|
+ pper.setPcNum(productionProcesses.getOpeProducePcNum());
|
|
|
+ pper.setZjgid(productionProcesses.getProZg());
|
|
|
+ pper.setOccupyType("process");
|
|
|
+ equipmentRunTimes.add(pper);
|
|
|
+
|
|
|
+ if(equipmentRunTimes.size()>0){
|
|
|
+ if(productionProcesses.getEquipment().getEquipmentRunTimes() == null){
|
|
|
+ productionProcesses.getEquipment().setEquipmentRunTimes(equipmentRunTimes);
|
|
|
+ }else{
|
|
|
+ productionProcesses.getEquipment().getEquipmentRunTimes().addAll(equipmentRunTimes);
|
|
|
+ }
|
|
|
+// apsService.equipmentRunTimeMerge(productionProcesses.getEquipment(),productionProcesses.getApsOverallConfig().getFurnaceInstallations());
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -475,53 +548,6 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 排程结束数据手动添加到设备占用列表中
|
|
|
- * @param pps
|
|
|
- */
|
|
|
- private void setEqRunTimes(List<ProductionProcessesTa> pps){
|
|
|
- if(pps != null && pps.size()>0){
|
|
|
- for (ProductionProcessesTa productionProcesses : pps) {
|
|
|
- // 添加锁定工序设备占用时间
|
|
|
- List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
|
|
|
- EquipmentRunTime pper = new EquipmentRunTime();
|
|
|
- pper.setStartRunTime(productionProcesses.getStartTime());
|
|
|
- pper.setEndRunTime(productionProcesses.getEndTime());
|
|
|
- pper.setSeriesProduceMark(productionProcesses.getSeriesProduceMark());
|
|
|
- pper.setProcessType(productionProcesses.getProcessType());
|
|
|
- pper.setVolumeMetal(productionProcesses.getVolumeMetal());
|
|
|
- if("小卷成退,小卷包装".contains(productionProcesses.getProcessType())){
|
|
|
- pper.setTotalVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
- }else{
|
|
|
- pper.setTotalVolumeWidth(productionProcesses.getVolumeWidth().multiply(new BigDecimal(productionProcesses.getOpeProducePcNum())));
|
|
|
- }
|
|
|
- pper.setTotalSinglerollweight(productionProcesses.getTotalSinglerollweight());
|
|
|
- pper.setTotalThickness(productionProcesses.getVolumeThickness());
|
|
|
- pper.setMaxSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
- pper.setMinSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
- pper.setMaxVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
- pper.setMinVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
- pper.setMaxThickness(productionProcesses.getVolumeThickness());
|
|
|
- pper.setMinThickness(productionProcesses.getVolumeThickness());
|
|
|
- pper.setProducttype(productionProcesses.getProducttype());
|
|
|
- pper.setOnceprocessmin(productionProcesses.getProduceTime());
|
|
|
- pper.setPcNum(productionProcesses.getOpeProducePcNum());
|
|
|
- pper.setZjgid(productionProcesses.getProZg());
|
|
|
- pper.setOccupyType("process");
|
|
|
- equipmentRunTimes.add(pper);
|
|
|
-
|
|
|
- if(equipmentRunTimes.size()>0){
|
|
|
- if(productionProcesses.getEquipment().getEquipmentRunTimes() == null){
|
|
|
- productionProcesses.getEquipment().setEquipmentRunTimes(equipmentRunTimes);
|
|
|
- }else{
|
|
|
- productionProcesses.getEquipment().getEquipmentRunTimes().addAll(equipmentRunTimes);
|
|
|
- }
|
|
|
- ddApsService.equipmentRunTimeMerge(productionProcesses.getEquipment(),productionProcesses.getApsOverallConfig().getFurnaceInstallations());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
private ProductionProcessesTa maxWaitTimeCheck(ProductionProcessesTa process,List<ProductionProcessesTa> maxSetPros,List<ProductionProcessesTa> processes,List<EquipmentTa> equipments){
|
|
|
ProductionProcessesTa newPre = null;
|
|
|
List<ProductionProcessesTa> previousProcesses = process.getPreviousProcesses();
|