|
@@ -32,6 +32,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.time.ZoneId;
|
|
|
import java.util.*;
|
|
@@ -458,11 +459,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
List<String> hasIds = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
String idStrs = CollUtil.join(hasIds, "','");
|
|
|
idStrs = "'" + idStrs + "'";
|
|
|
- // 查询待发布未锁定的所有坯料计划
|
|
|
+ // 查询存在未锁定的作业坯料计划
|
|
|
List<ApsBlankOrderVo> fbNotLock = apsBlankOrderDao.getFbNotLock(idStrs);
|
|
|
if (fbNotLock != null && fbNotLock.size() > 0) {
|
|
|
apsBlankOrders.addAll(fbNotLock);
|
|
|
}
|
|
|
+
|
|
|
// 先删除所有作业的明细
|
|
|
List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
|
|
|
processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
|
|
@@ -621,13 +623,17 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
|
|
|
productionScheduleVo.setProductionScheduleId("批量排程");
|
|
|
List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
|
|
|
+ ApsScheduleConfigDo apsScheduleConfig = null;
|
|
|
+ // 松散度
|
|
|
+ BigDecimal looseness = null;
|
|
|
if (apsConfigs != null && apsConfigs.size() > 0) {
|
|
|
- ApsScheduleConfigDo apsScheduleConfig = apsConfigs.get(0);
|
|
|
+ apsScheduleConfig = apsConfigs.get(0);
|
|
|
productionScheduleVo.setPlanSeconds(apsScheduleConfig.getScheduleruntime());
|
|
|
Map<String, Integer> roamTime = new HashMap<>();
|
|
|
roamTime.put("WORKSHOP_IN", apsScheduleConfig.getWorkshopin());
|
|
|
roamTime.put("WORKSHOP_CROSS", apsScheduleConfig.getWorkshopcross());
|
|
|
productionScheduleVo.setRoamTime(roamTime);
|
|
|
+ looseness = apsScheduleConfig.getLooseness();
|
|
|
// 排程计划开始时间
|
|
|
int a = 8;
|
|
|
if (apsScheduleConfig.getStartschedulerun() != null) {
|
|
@@ -693,13 +699,63 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
.ge(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
.orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
);
|
|
|
+ // 查询当前设备最后一个生产任务、连续生产需要考虑使用
|
|
|
+ List<ApsProcessOperationProcessEquDo> processLastEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
|
|
|
+ .gt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
|
|
|
+ .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
|
|
|
+ );
|
|
|
+ if(processLastEqus != null && processLastEqus.size()>0){
|
|
|
+ ApsProcessOperationProcessEquDo lastpro = processLastEqus.get(processLastEqus.size()-1);
|
|
|
+ ApsProcessOperationDo lastop = apsProcessOperationService.getById(lastpro.getProcessid());
|
|
|
+ equipment.setLastProcessType(lastop.getProcess());
|
|
|
+ // 铸轧
|
|
|
+ if ("铸轧".equals(lastop.getProcess())) {
|
|
|
+ // 合金+宽度
|
|
|
+ equipment.setLastSeriesProduceMark(lastop.getMetal() + "^_^" + lastop.getProwidth());
|
|
|
+ }
|
|
|
+ // 冷轧
|
|
|
+ else if ("冷轧".equals(lastop.getProcess())) {
|
|
|
+ // 合金+输入物料+宽度
|
|
|
+ equipment.setLastSeriesProduceMark(lastop.getMetal() + "^_^" + lastop.getPlaninput() + "^_^" + lastop.getProwidth());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 查询相关工序作业
|
|
|
+ Set<String> processIds = new HashSet<>();
|
|
|
if (processEqus != null && processEqus.size() > 0) {
|
|
|
+ for (ApsProcessOperationProcessEquDo equs : processEqus) {
|
|
|
+ processIds.add(equs.getProcessid());
|
|
|
+ }
|
|
|
+ List<ApsProcessOperationDo> processOperationDos = null;
|
|
|
+ if(processIds.size()>0){
|
|
|
+ processOperationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
|
|
|
+ .in(ApsProcessOperationDo::getId,processIds));
|
|
|
+ }
|
|
|
+
|
|
|
List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
|
|
|
for (ApsProcessOperationProcessEquDo equs : processEqus) {
|
|
|
EquipmentRunTime er = new EquipmentRunTime();
|
|
|
er.setStartRunTime(equs.getPlanstartdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
|
|
|
er.setEndRunTime(equs.getPlanenddate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
|
|
|
equipmentRunTimes.add(er);
|
|
|
+ // 设备占用时间设置连续生产标识,参与排程
|
|
|
+ if(processOperationDos != null){
|
|
|
+ List<ApsProcessOperationDo> pos = processOperationDos.stream().filter(v -> v.getId().equals(equs.getProcessid())).collect(Collectors.toList());
|
|
|
+ if(pos != null && pos.size()>0){
|
|
|
+ ApsProcessOperationDo processesDo = pos.get(0);
|
|
|
+ er.setProcessType(processesDo.getProcess());
|
|
|
+ // 铸轧
|
|
|
+ if ("铸轧".equals(processesDo.getProcess())) {
|
|
|
+ // 合金+宽度
|
|
|
+ er.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getProwidth());
|
|
|
+ }
|
|
|
+ // 冷轧
|
|
|
+ else if ("冷轧".equals(processesDo.getProcess())) {
|
|
|
+ // 合金+输入物料+宽度
|
|
|
+ er.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getPlaninput() + "^_^" + operationDo.getProwidth());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
equipment.setEquipmentRunTimes(equipmentRunTimes);
|
|
|
}
|
|
@@ -733,9 +789,9 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
processes.setProcessType(operationDo.getProcess());
|
|
|
// 单次加工时长
|
|
|
processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
|
|
|
- processes.setProduceTime(processes.getUnitProduceTime() * processes.getProducePcNum());
|
|
|
-// processes.setProduceTime(operationDo.getProcesstotaltime().intValue());
|
|
|
- if (operationDo.getMinflowwaitmin() != null) {
|
|
|
+// processes.setProduceTime(processes.getUnitProduceTime()*processes.getProducePcNum());
|
|
|
+ processes.setProduceTime(operationDo.getProcesstotaltime().intValue());
|
|
|
+ if(operationDo.getMinflowwaitmin() != null){
|
|
|
processes.setMinWaitTime(operationDo.getMinflowwaitmin().intValue());
|
|
|
}
|
|
|
if (operationDo.getMaxflowwaitmin() != null) {
|
|
@@ -767,9 +823,15 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
}
|
|
|
}
|
|
|
// 合并生产工序
|
|
|
- List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs, eqMaps);
|
|
|
+ List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs, eqMaps,apsScheduleConfig);
|
|
|
processesList.addAll(productionProcesses);
|
|
|
-
|
|
|
+ // 加工时间松散度设置
|
|
|
+ if(looseness != null){
|
|
|
+ for (ProductionProcesses process : processesList) {
|
|
|
+ // 加工时间乘以松散度并向上取整
|
|
|
+ process.setProduceTime(new BigDecimal(process.getProduceTime()).multiply(looseness.add(new BigDecimal("1"))).setScale(0, RoundingMode.CEILING).intValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
productionScheduleVo.setProcesses(processesList);
|
|
|
productionScheduleVo.setEquipmentList(equipmentList);
|
|
|
return productionScheduleVo;
|
|
@@ -781,7 +843,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
* @param processOperationMs
|
|
|
* @return
|
|
|
*/
|
|
|
- private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs, Map<String, AspCheckItemsDo> eqMaps) {
|
|
|
+ private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs, Map<String, AspCheckItemsDo> eqMaps,ApsScheduleConfigDo apsScheduleConfig) {
|
|
|
// 最终的合并工序
|
|
|
List<ProductionProcesses> processesList = new ArrayList<>();
|
|
|
if (processOperationMs != null && processOperationMs.size() > 0) {
|
|
@@ -811,6 +873,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
for (AspCheckItemsDo aspCheckItemsDo : aspCheckItemsDos) {
|
|
|
aspCheckItemMap.put(aspCheckItemsDo.getId(), aspCheckItemsDo);
|
|
|
aspCheckItemUse.put(aspCheckItemsDo.getId(), 0);
|
|
|
+ // 退火炉套筒间隙扣除
|
|
|
+ if(apsScheduleConfig != null){
|
|
|
+ aspCheckItemsDo.setEquipmentwidth(aspCheckItemsDo.getEquipmentwidth().subtract(apsScheduleConfig.getLooseness()));
|
|
|
+ }
|
|
|
}
|
|
|
for (ApsProcessOperationVo processOperationM : processOperationMs) {
|
|
|
// 首先查看是否有可以合并的已存在的工序
|
|
@@ -1071,6 +1137,10 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void checkIfCanMerge(){
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 排程结束之后根据订单IDs修改生产状态
|
|
|
*/
|
|
@@ -1348,4 +1418,5 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
|
|
|
|
|
|
return R.ok();
|
|
|
}
|
|
|
+
|
|
|
}
|