|
@@ -156,12 +156,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if(apsBlankOrders.size()>0){
|
|
|
- if(apsPlanVo.getApsBlankOrderDos() != null){
|
|
|
- apsPlanVo.getApsBlankOrderDos().addAll(apsBlankOrders);
|
|
|
- }else{
|
|
|
- apsPlanVo.setApsBlankOrderDos(apsBlankOrders);
|
|
|
- }
|
|
|
+ if(apsPlanVo.getApsBlankOrderDos() != null && apsPlanVo.getApsBlankOrderDos().size()>0){
|
|
|
+ apsBlankOrders.addAll(apsPlanVo.getApsBlankOrderDos());
|
|
|
}
|
|
|
blankOrderAps(apsBlankOrders);
|
|
|
}
|
|
@@ -188,6 +184,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid,blankids));
|
|
|
// 模型转换
|
|
|
ProductionScheduleVo productionScheduleVo = apsPlanModelSet(apsBlankOrders);
|
|
|
+ /*if(1 == 1){
|
|
|
+ return;
|
|
|
+ }*/
|
|
|
JSONConfig jsonConfig = JSONConfig.create();
|
|
|
jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo,jsonConfig));
|
|
@@ -489,161 +488,50 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
}
|
|
|
// 设备排序
|
|
|
List<AspCheckItemsDo> aspCheckItemsDos = apsBlankOrderDao.eqAscs(allSelEqs);
|
|
|
+ // 记录当前设备已排程个数
|
|
|
+ Map<String,Integer> aspCheckItemUse = new HashMap<>();
|
|
|
Map<String,AspCheckItemsDo> aspCheckItemMap = new HashMap<>();
|
|
|
for (AspCheckItemsDo aspCheckItemsDo : aspCheckItemsDos) {
|
|
|
aspCheckItemMap.put(aspCheckItemsDo.getId(),aspCheckItemsDo);
|
|
|
+ aspCheckItemUse.put(aspCheckItemsDo.getId(),0);
|
|
|
}
|
|
|
- // 记录最后选择的设备序号
|
|
|
- Integer m = 0;
|
|
|
for (ApsProcessOperationVo processOperationM : processOperationMs) {
|
|
|
- // 作业加工卷数
|
|
|
+ // 首先查看是否有可以合并的已存在的工序
|
|
|
+ hasProcessmerge(processesList,processOperationM,aspCheckItemMap);
|
|
|
+ // 剩下作业加工卷数,启用新的作业
|
|
|
int planprocessrall = processOperationM.getPlanprocessrall();
|
|
|
if(planprocessrall<=0){
|
|
|
continue;
|
|
|
}
|
|
|
Boolean a = true;
|
|
|
- long timestart = DateUtil.date().getTime();
|
|
|
-
|
|
|
while (a){
|
|
|
int lastnum = processOperationM.getPlanprocessrall();
|
|
|
-
|
|
|
- // 首先看已合并生产的设备是否还有余量继续排产
|
|
|
- for (ProductionProcesses processes : processesList) {
|
|
|
- // 加工设备
|
|
|
- String eq = processes.getOptionalEquipments().get(0);
|
|
|
- AspCheckItemsDo aspCheckItem = aspCheckItemMap.get(eq);
|
|
|
-
|
|
|
- // 工序类型一致,合金和合金状态要一致
|
|
|
- if(processes.getProcessType().equals(processOperationM.getProcess()) && processes.getAluminumCoils().get(0).getVolumeMetal().equals(processOperationM.getMetal())
|
|
|
- && processes.getAluminumCoils().get(0).getVolumeMetalstate().equals(processOperationM.getMetalstate())){
|
|
|
- // 宽度不超过50mm,厚度不超过0.05mm,重量不超过1吨
|
|
|
- boolean bol = true;
|
|
|
- BigDecimal totalWidth = null;
|
|
|
- BigDecimal totalWeight = null;
|
|
|
- // 宽度、厚度、重量绝对值差限制
|
|
|
- BigDecimal knum = null;
|
|
|
- BigDecimal hnum = null;
|
|
|
- BigDecimal znum = null;
|
|
|
- if(SaveConstans.ProcessType.PROCESS_TYPE_CHENTUI.equals(processes.getProcessType())){
|
|
|
- knum = new BigDecimal("50");
|
|
|
- hnum = new BigDecimal("0.05");
|
|
|
- znum = new BigDecimal("1");
|
|
|
- } else if (SaveConstans.ProcessType.PROCESS_TYPE_ZHONGTUI.equals(processes.getProcessType())) {
|
|
|
- knum = new BigDecimal("100");
|
|
|
- hnum = new BigDecimal("0.08");
|
|
|
- znum = new BigDecimal("1");
|
|
|
- }
|
|
|
- if(knum == null || hnum == null || znum == null){
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- for (AluminumCoil aluminumCoil : processes.getAluminumCoils()) {
|
|
|
- // 宽度不超过50mm
|
|
|
- if(aluminumCoil.getVolumeWidth().subtract(processOperationM.getProwidth()).abs().compareTo(knum)>0){
|
|
|
- bol = false;
|
|
|
- }
|
|
|
- // 厚度不超过0.05mm
|
|
|
- if(aluminumCoil.getVolumeThickness().subtract(processOperationM.getThickness()).abs().compareTo(hnum)>0){
|
|
|
- bol = false;
|
|
|
- }
|
|
|
- // 重量不超过1吨
|
|
|
- if(aluminumCoil.getVolumeWeight().subtract(processOperationM.getSinglerollweight()).abs().compareTo(znum)>0){
|
|
|
- bol = false;
|
|
|
- }
|
|
|
- if(totalWidth == null){
|
|
|
- totalWidth = aluminumCoil.getVolumeWidth();
|
|
|
- }else{
|
|
|
- totalWidth = totalWidth.add(aluminumCoil.getVolumeWidth());
|
|
|
- }
|
|
|
- if(totalWeight == null){
|
|
|
- totalWeight = aluminumCoil.getVolumeWeight();
|
|
|
- }else{
|
|
|
- totalWeight = totalWeight.add(aluminumCoil.getVolumeWeight());
|
|
|
- }
|
|
|
- }
|
|
|
- if(bol){
|
|
|
- Integer sy = 0;
|
|
|
- for (int j=1;j<=planprocessrall;j++){
|
|
|
- // 宽度余量
|
|
|
- if(aspCheckItem.getEquipmentwidth().subtract(totalWidth).compareTo(processOperationM.getProwidth().multiply(new BigDecimal(j)))<0){
|
|
|
- break;
|
|
|
- }
|
|
|
- // 重量余量
|
|
|
- if(aspCheckItem.getEquipmentbearing().subtract(totalWeight).compareTo(processOperationM.getSinglerollweight().multiply(new BigDecimal(j)))<0){
|
|
|
- break;
|
|
|
- }
|
|
|
- sy = j;
|
|
|
- }
|
|
|
- if(sy>0){
|
|
|
- lastnum = planprocessrall - sy;
|
|
|
- for (int j=1;j<=sy;j++){
|
|
|
- AluminumCoil aluminumCoil = new AluminumCoil();
|
|
|
- aluminumCoil.setBsId(processOperationM.getId());
|
|
|
- aluminumCoil.setBlankid(processOperationM.getBlankid());
|
|
|
- aluminumCoil.setVolumeWidth(processOperationM.getProwidth());
|
|
|
- aluminumCoil.setVolumeThickness(processOperationM.getThickness());
|
|
|
- aluminumCoil.setVolumeWeight(processOperationM.getSinglerollweight());
|
|
|
- aluminumCoil.setVolumeMetal(processOperationM.getMetal());
|
|
|
- aluminumCoil.setVolumeMetalstate(processOperationM.getMetalstate());
|
|
|
- processes.getAluminumCoils().add(aluminumCoil);
|
|
|
- }
|
|
|
-
|
|
|
- // 上道工序
|
|
|
- if(StringUtils.isNotBlank(processOperationM.getPreviousprocessid())){
|
|
|
- if(processes.getPreviousProcessesIds() == null){
|
|
|
- List<String> list = new ArrayList<>();
|
|
|
- list.addAll(Arrays.asList(processOperationM.getPreviousprocessid().split(",")));
|
|
|
- processes.setPreviousProcessesIds(list);
|
|
|
- }else{
|
|
|
- processes.getPreviousProcessesIds().addAll(new ArrayList<>(Arrays.asList(processOperationM.getPreviousprocessid().split(","))));
|
|
|
- }
|
|
|
- }
|
|
|
- // 下道工序
|
|
|
- if(StringUtils.isNotBlank(processOperationM.getNextprocessid())){
|
|
|
- if(processes.getNextProcessesIds() == null){
|
|
|
- List<String> list = new ArrayList<>();
|
|
|
- list.addAll(Arrays.asList(processOperationM.getNextprocessid().split(",")));
|
|
|
- processes.setNextProcessesIds(list);
|
|
|
- }else{
|
|
|
- processes.getNextProcessesIds().addAll(new ArrayList<>(Arrays.asList(processOperationM.getNextprocessid().split(","))));
|
|
|
- }
|
|
|
- }
|
|
|
- // 所属订单
|
|
|
- List<ProduceOrder> produceOrders = processes.getProduceOrder().stream().filter(v ->
|
|
|
- v.getId().equals(processOperationM.getApsBlankOrderVo().getId())).collect(Collectors.toList());
|
|
|
- if(produceOrders == null || produceOrders.size() == 0){
|
|
|
- ProduceOrder produceOrder = new ProduceOrder(processOperationM.getApsBlankOrderVo().getId(),processOperationM.getApsBlankOrderVo().getMaterialname(),processOperationM.getApsBlankOrderVo().getDeliverydate());
|
|
|
- processes.getProduceOrder().add(produceOrder);
|
|
|
- }
|
|
|
- // 单次加工时长
|
|
|
- if(processes.getUnitProduceTime() == null){
|
|
|
- processes.setUnitProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
- processes.setProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
- }
|
|
|
- // 加工时长取最大值
|
|
|
- else{
|
|
|
- if(processes.getUnitProduceTime()<processOperationM.getOnceprocessmin().intValue()){
|
|
|
- processes.setUnitProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
- processes.setProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
+ // 剩余的料卷
|
|
|
+ if(lastnum>0){
|
|
|
+ Integer minUse = null;
|
|
|
+ int haslast = 0;
|
|
|
+ AspCheckItemsDo aspCheckItem = null;
|
|
|
+ for(int i=0;i<aspCheckItemsDos.size();i++){
|
|
|
+ // 选择的设备要在可选设备的范围内
|
|
|
+ if(processOperationM.getCanchoosedeviceid().contains(aspCheckItemsDos.get(i).getId())){
|
|
|
+ // 单卷宽度不能超过设备宽度并且单卷重不能超过设备的承重
|
|
|
+ if(processOperationM.getProwidth().compareTo(aspCheckItemsDos.get(i).getEquipmentwidth())<0
|
|
|
+ && processOperationM.getSinglerollweight().compareTo(aspCheckItemsDos.get(i).getEquipmentbearing())<0){
|
|
|
+ // 获取使用次数最小的可选设备
|
|
|
+ if(aspCheckItem == null){
|
|
|
+ minUse = aspCheckItemUse.get(aspCheckItemsDos.get(i).getId());
|
|
|
+ aspCheckItem = aspCheckItemsDos.get(i);
|
|
|
+ }else{
|
|
|
+ if(minUse>aspCheckItemUse.get(aspCheckItemsDos.get(i).getId())){
|
|
|
+ minUse = aspCheckItemUse.get(aspCheckItemsDos.get(i).getId());
|
|
|
+ aspCheckItem = aspCheckItemsDos.get(i);
|
|
|
}
|
|
|
}
|
|
|
- processes.getBsProcessesId().add(processOperationM.getId());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- // 剩余的料卷
|
|
|
- if(lastnum>0){
|
|
|
- if(m == aspCheckItemsDos.size()-1){
|
|
|
- m = -1;
|
|
|
- }
|
|
|
- int haslast = 0;
|
|
|
- for(int i=m+1;i<aspCheckItemsDos.size();i++){
|
|
|
- if(lastnum <= 0){
|
|
|
- break;
|
|
|
- }
|
|
|
- AspCheckItemsDo aspCheckItem = aspCheckItemsDos.get(i);
|
|
|
+ // 新增工序作业
|
|
|
+ if(aspCheckItem != null){
|
|
|
// 选择的设备要在可选设备的范围内
|
|
|
if(processOperationM.getCanchoosedeviceid().contains(aspCheckItem.getId())){
|
|
|
// 单卷宽度不能超过设备宽度并且单卷重不能超过设备的承重
|
|
@@ -712,29 +600,157 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
processesList.add(processes);
|
|
|
|
|
|
lastnum = lastnum - haslast;
|
|
|
+ // 更新设备使用次数
|
|
|
+ aspCheckItemUse.put(aspCheckItem.getId(),aspCheckItemUse.get(aspCheckItem.getId())+1);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // 记录最后选用设备的顺序
|
|
|
- m = i;
|
|
|
- System.out.println("******m = " + m);
|
|
|
}
|
|
|
}
|
|
|
+ // 重新设置计划加工卷数
|
|
|
processOperationM.setPlanprocessrall(lastnum);
|
|
|
if(lastnum <= 0){
|
|
|
a = false;
|
|
|
}
|
|
|
-
|
|
|
- // 循环超过2秒则强制退出防止内存溢出
|
|
|
- /*long timeend = DateUtil.date().getTime();
|
|
|
- if(timeend-timestart>3000){
|
|
|
- System.out.println("数据异常强制退出,剩余待加工数量:" + lastnum);
|
|
|
- a = false;
|
|
|
- }*/
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return processesList;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 查看是否有可以合并的已存在的工序
|
|
|
+ * @param processesList
|
|
|
+ * @param processOperationM
|
|
|
+ * @param aspCheckItemMap
|
|
|
+ */
|
|
|
+ private void hasProcessmerge(List<ProductionProcesses> processesList,ApsProcessOperationVo processOperationM,Map<String,AspCheckItemsDo> aspCheckItemMap){
|
|
|
+ // 首先看已合并生产的设备是否还有余量继续排产
|
|
|
+ for (ProductionProcesses processes : processesList) {
|
|
|
+ // 加工设备
|
|
|
+ String eq = processes.getOptionalEquipments().get(0);
|
|
|
+ AspCheckItemsDo aspCheckItem = aspCheckItemMap.get(eq);
|
|
|
+
|
|
|
+ // 工序类型一致,合金和合金状态要一致
|
|
|
+ if(processes.getProcessType().equals(processOperationM.getProcess()) && processes.getAluminumCoils().get(0).getVolumeMetal().equals(processOperationM.getMetal())
|
|
|
+ && processes.getAluminumCoils().get(0).getVolumeMetalstate().equals(processOperationM.getMetalstate())){
|
|
|
+ // 宽度不超过50mm,厚度不超过0.05mm,重量不超过1吨
|
|
|
+ boolean bol = true;
|
|
|
+ BigDecimal totalWidth = null;
|
|
|
+ BigDecimal totalWeight = null;
|
|
|
+ // 宽度、厚度、重量绝对值差限制
|
|
|
+ BigDecimal knum = null;
|
|
|
+ BigDecimal hnum = null;
|
|
|
+ BigDecimal znum = null;
|
|
|
+ if(SaveConstans.ProcessType.PROCESS_TYPE_CHENTUI.equals(processes.getProcessType())){
|
|
|
+ knum = new BigDecimal("50");
|
|
|
+ hnum = new BigDecimal("0.05");
|
|
|
+ znum = new BigDecimal("1");
|
|
|
+ } else if (SaveConstans.ProcessType.PROCESS_TYPE_ZHONGTUI.equals(processes.getProcessType())) {
|
|
|
+ knum = new BigDecimal("100");
|
|
|
+ hnum = new BigDecimal("0.08");
|
|
|
+ znum = new BigDecimal("1");
|
|
|
+ }
|
|
|
+ if(knum == null || hnum == null || znum == null){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (AluminumCoil aluminumCoil : processes.getAluminumCoils()) {
|
|
|
+ // 宽度不超过50mm
|
|
|
+ if(aluminumCoil.getVolumeWidth().subtract(processOperationM.getProwidth()).abs().compareTo(knum)>0){
|
|
|
+ bol = false;
|
|
|
+ }
|
|
|
+ // 厚度不超过0.05mm
|
|
|
+ if(aluminumCoil.getVolumeThickness().subtract(processOperationM.getThickness()).abs().compareTo(hnum)>0){
|
|
|
+ bol = false;
|
|
|
+ }
|
|
|
+ // 重量不超过1吨
|
|
|
+ if(aluminumCoil.getVolumeWeight().subtract(processOperationM.getSinglerollweight()).abs().compareTo(znum)>0){
|
|
|
+ bol = false;
|
|
|
+ }
|
|
|
+ if(totalWidth == null){
|
|
|
+ totalWidth = aluminumCoil.getVolumeWidth();
|
|
|
+ }else{
|
|
|
+ totalWidth = totalWidth.add(aluminumCoil.getVolumeWidth());
|
|
|
+ }
|
|
|
+ if(totalWeight == null){
|
|
|
+ totalWeight = aluminumCoil.getVolumeWeight();
|
|
|
+ }else{
|
|
|
+ totalWeight = totalWeight.add(aluminumCoil.getVolumeWeight());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(bol){
|
|
|
+ Integer sy = 0;
|
|
|
+ for (int j=1;j<=processOperationM.getPlanprocessrall();j++){
|
|
|
+ // 宽度余量
|
|
|
+ if(aspCheckItem.getEquipmentwidth().subtract(totalWidth).compareTo(processOperationM.getProwidth().multiply(new BigDecimal(j)))<0){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 重量余量
|
|
|
+ if(aspCheckItem.getEquipmentbearing().subtract(totalWeight).compareTo(processOperationM.getSinglerollweight().multiply(new BigDecimal(j)))<0){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ sy = j;
|
|
|
+ }
|
|
|
+ if(sy>0){
|
|
|
+ // 更新计划加工卷数
|
|
|
+ processOperationM.setPlanprocessrall(processOperationM.getPlanprocessrall() - sy);
|
|
|
+ for (int j=1;j<=sy;j++){
|
|
|
+ AluminumCoil aluminumCoil = new AluminumCoil();
|
|
|
+ aluminumCoil.setBsId(processOperationM.getId());
|
|
|
+ aluminumCoil.setBlankid(processOperationM.getBlankid());
|
|
|
+ aluminumCoil.setVolumeWidth(processOperationM.getProwidth());
|
|
|
+ aluminumCoil.setVolumeThickness(processOperationM.getThickness());
|
|
|
+ aluminumCoil.setVolumeWeight(processOperationM.getSinglerollweight());
|
|
|
+ aluminumCoil.setVolumeMetal(processOperationM.getMetal());
|
|
|
+ aluminumCoil.setVolumeMetalstate(processOperationM.getMetalstate());
|
|
|
+ processes.getAluminumCoils().add(aluminumCoil);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 上道工序
|
|
|
+ if(StringUtils.isNotBlank(processOperationM.getPreviousprocessid())){
|
|
|
+ if(processes.getPreviousProcessesIds() == null){
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ list.addAll(Arrays.asList(processOperationM.getPreviousprocessid().split(",")));
|
|
|
+ processes.setPreviousProcessesIds(list);
|
|
|
+ }else{
|
|
|
+ processes.getPreviousProcessesIds().addAll(new ArrayList<>(Arrays.asList(processOperationM.getPreviousprocessid().split(","))));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 下道工序
|
|
|
+ if(StringUtils.isNotBlank(processOperationM.getNextprocessid())){
|
|
|
+ if(processes.getNextProcessesIds() == null){
|
|
|
+ List<String> list = new ArrayList<>();
|
|
|
+ list.addAll(Arrays.asList(processOperationM.getNextprocessid().split(",")));
|
|
|
+ processes.setNextProcessesIds(list);
|
|
|
+ }else{
|
|
|
+ processes.getNextProcessesIds().addAll(new ArrayList<>(Arrays.asList(processOperationM.getNextprocessid().split(","))));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 所属订单
|
|
|
+ List<ProduceOrder> produceOrders = processes.getProduceOrder().stream().filter(v ->
|
|
|
+ v.getId().equals(processOperationM.getApsBlankOrderVo().getId())).collect(Collectors.toList());
|
|
|
+ if(produceOrders == null || produceOrders.size() == 0){
|
|
|
+ ProduceOrder produceOrder = new ProduceOrder(processOperationM.getApsBlankOrderVo().getId(),processOperationM.getApsBlankOrderVo().getMaterialname(),processOperationM.getApsBlankOrderVo().getDeliverydate());
|
|
|
+ processes.getProduceOrder().add(produceOrder);
|
|
|
+ }
|
|
|
+ // 单次加工时长
|
|
|
+ if(processes.getUnitProduceTime() == null){
|
|
|
+ processes.setUnitProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
+ processes.setProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
+ }
|
|
|
+ // 加工时长取最大值
|
|
|
+ else{
|
|
|
+ if(processes.getUnitProduceTime()<processOperationM.getOnceprocessmin().intValue()){
|
|
|
+ processes.setUnitProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
+ processes.setProduceTime(processOperationM.getOnceprocessmin().intValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ processes.getBsProcessesId().add(processOperationM.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|