|
@@ -1,17 +1,161 @@
|
|
|
package com.rongwei.bscommon.sys.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.rongwei.bscommon.sys.service.ApsDispatchService;
|
|
|
+import com.rongwei.bscommon.sys.service.ApsProcessOperationService;
|
|
|
+import com.rongwei.bscommon.sys.service.ApsService;
|
|
|
+import com.rongwei.bsentity.domain.*;
|
|
|
+import com.rongwei.bsentity.vo.*;
|
|
|
+import com.rongwei.rwcommon.base.exception.CustomException;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 某段时间某个设备所有作业在前后工序锁定的情况下重排
|
|
|
+ */
|
|
|
@Service
|
|
|
public class ApsDispatchServiceImpl implements ApsDispatchService {
|
|
|
|
|
|
@Autowired
|
|
|
private ApsProcessOperationProcessEquServiceImpl processOperationProcessEquService;
|
|
|
+ @Autowired
|
|
|
+ private ApsService apsService;
|
|
|
+ @Autowired
|
|
|
+ private ApsProcessOperationService apsProcessOperationService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 轧机工序混排
|
|
|
+ * @param apsDispatchVo
|
|
|
+ */
|
|
|
+ public void apsLxDispatch(ApsDispatchVo apsDispatchVo){
|
|
|
+ // 解锁指定设备指定时间段作业
|
|
|
+ processOperationProcessEquService.update(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .ge(ApsProcessOperationProcessEquDo::getPlanstartdate, apsDispatchVo.getStartTime())
|
|
|
+ .le(ApsProcessOperationProcessEquDo::getPlanenddate, apsDispatchVo.getEndTime())
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, apsDispatchVo.getEquipmentId())
|
|
|
+ .set(ApsProcessOperationProcessEquDo::getLockmarkdetail,"n"));
|
|
|
+// apsService.apsSchedule(new ArrayList<>(),);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 已排程明细指定时间段,指定设备重排
|
|
|
+ */
|
|
|
+ public void apsDispatch(ApsDispatchVo apsDispatchVo){
|
|
|
+ // 待排程作业
|
|
|
+ List<ApsProcessOperationProcessEquDo> toApsPros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .ge(ApsProcessOperationProcessEquDo::getPlanstartdate, apsDispatchVo.getStartTime())
|
|
|
+ .le(ApsProcessOperationProcessEquDo::getPlanenddate, apsDispatchVo.getEndTime())
|
|
|
+ .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, apsDispatchVo.getEquipmentId()));
|
|
|
+ if(toApsPros != null && toApsPros.size()>0){
|
|
|
+ // 所有待排程作业坯料计划ID
|
|
|
+ List<String> blankids = toApsPros.stream().map(ApsProcessOperationProcessEquDo::getBlankid).distinct().collect(Collectors.toList());
|
|
|
+ // 所有待排程作业ID
|
|
|
+ List<String> processids = toApsPros.stream().map(ApsProcessOperationProcessEquDo::getProcessid).distinct().collect(Collectors.toList());
|
|
|
+ // 所有相关坯料计划作业
|
|
|
+ List<ApsProcessOperationProcessEquDo> allPros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
|
|
|
+ .in(ApsProcessOperationProcessEquDo::getBlankid, blankids));
|
|
|
+ // 所有作业
|
|
|
+ List<ApsProcessOperationDo> processDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>().in(ApsProcessOperationDo::getId, processids));
|
|
|
+ // 所有坯料计划
|
|
|
+
|
|
|
+ ProductionScheduleVo productionScheduleVo = apsService.productionScheduleVoInit(DateUtil.offsetDay(apsDispatchVo.getStartTime(), -1));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- public void apsDispatch(){
|
|
|
+ private ProductionProcesses processesDetailInit(ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu, ApsBlankOrderDo apsBlankOrderVo
|
|
|
+ , ProductionScheduleVo productionScheduleVo, ApsProcessOperationDo operationDo
|
|
|
+ , List<String> optionalEquipments, List<ApsProcessOperationOutMaterDo> outMaterDos, List<ApsProcessOperationEquDo> processOperationEquDos){
|
|
|
+ String warnPreMsg = "坯料计划号:"+apsBlankOrderVo.getBlanknumber()+" 作业类型:"+operationDo.getProcess()+" 作业名称:"+operationDo.getProcessname();
|
|
|
+ ProductionProcesses processes = new ProductionProcesses();
|
|
|
+ processes.setId(apsProcessOperationProcessEqu.getId());
|
|
|
+ // 工序所属订单
|
|
|
+ Date promisedateend = apsBlankOrderVo.getPromisedateend();
|
|
|
+ if(promisedateend == null){
|
|
|
+ promisedateend = apsBlankOrderVo.getDeliverydate();
|
|
|
+ }
|
|
|
+ // ProduceOrder 初始化
|
|
|
+ ProduceOrder produceOrder = new ProduceOrder(apsBlankOrderVo.getId(), apsBlankOrderVo.getMaterialname(), promisedateend);
|
|
|
+ produceOrder.setMaxheatroll(apsBlankOrderVo.getMaxheatroll());
|
|
|
+ produceOrder.setOrderNo(apsBlankOrderVo.getBlanknumber());
|
|
|
+ produceOrder.setCustomerOrderId(apsBlankOrderVo.getProductionorderid());
|
|
|
+ produceOrder.setProwidth(apsBlankOrderVo.getProwidth());
|
|
|
+ // 期望交货天数
|
|
|
+ produceOrder.setExpecteddays(productionScheduleVo.getExpecteddays());
|
|
|
+ if(apsBlankOrderVo.getExpecteddays() != null && apsBlankOrderVo.getExpecteddays()>0){
|
|
|
+ produceOrder.setExpecteddays(apsBlankOrderVo.getExpecteddays());
|
|
|
+ }
|
|
|
+ processes.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder}));
|
|
|
+ // 业务表主键ID
|
|
|
+ List<String> bss = new ArrayList<>();
|
|
|
+ bss.add(operationDo.getId());
|
|
|
+ processes.setBsProcessesId(bss);
|
|
|
+ processes.setProcessName(operationDo.getProcessname());
|
|
|
+ // 工序任务可选设备
|
|
|
+ processes.setOptionalEquipments(optionalEquipments);
|
|
|
+ // 批次
|
|
|
+ processes.setProducePcNum(operationDo.getPlanprocessrall());
|
|
|
+ processes.setOpeProducePcNum(1);
|
|
|
+ processes.setProcessType(operationDo.getProcess());
|
|
|
+ // 单次加工时长
|
|
|
+ if(operationDo.getOnceprocessmin() == null){
|
|
|
+ throw new CustomException(warnPreMsg + "的作业单卷加工时间为空");
|
|
|
+ }
|
|
|
+ // 是否分卷作业
|
|
|
+ processes.setIssubsection(operationDo.getIssubsection());
|
|
|
+ processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
|
|
|
+ processes.setProduceTime(operationDo.getOnceprocessmin().intValue());
|
|
|
+ // 轧辊ID
|
|
|
+ List<ApsProcessOperationEquDo> operationEquDos = processOperationEquDos.stream().filter(v ->
|
|
|
+ v.getBlankid().equals(operationDo.getBlankid()) && v.getMainid().equals(operationDo.getId())).collect(Collectors.toList());
|
|
|
+ if(operationEquDos != null && operationEquDos.size()>0){
|
|
|
+ Map<String,String> optionalEquipmentZg = new HashMap<>();
|
|
|
+ for (ApsProcessOperationEquDo operationEquDo : operationEquDos) {
|
|
|
+ optionalEquipmentZg.put(operationEquDo.getResourceid(),operationEquDo.getRollerid());
|
|
|
+ }
|
|
|
+ processes.setOptionalEquipmentZg(optionalEquipmentZg);
|
|
|
+ }
|
|
|
+ // 单卷宽度和重量
|
|
|
+ if(operationDo.getProwidth() == null){
|
|
|
+ throw new CustomException(warnPreMsg + "的作业单卷宽度为空");
|
|
|
+ }
|
|
|
+ if(operationDo.getSinglerollweight() == null){
|
|
|
+ throw new CustomException(warnPreMsg + "的作业单卷重量为空");
|
|
|
+ }
|
|
|
+ if(operationDo.getThickness() == null){
|
|
|
+ throw new CustomException(warnPreMsg + "的作业单卷厚度为空");
|
|
|
+ }
|
|
|
+ processes.setVolumeWidth(operationDo.getProwidth());
|
|
|
+ processes.setSinglerollweight(operationDo.getSinglerollweight());
|
|
|
+ processes.setVolumeThickness(operationDo.getThickness());
|
|
|
+ if (operationDo.getMinflowwaitmin() != null) {
|
|
|
+ processes.setMinWaitTime(operationDo.getMinflowwaitmin().intValue());
|
|
|
+ }
|
|
|
+ if (operationDo.getMaxflowwaitmin() != null) {
|
|
|
+ processes.setMaxWaitTime(operationDo.getMaxflowwaitmin().intValue());
|
|
|
+ }
|
|
|
+ // 合金
|
|
|
+ if(operationDo.getMetal() == null){
|
|
|
+ throw new CustomException(warnPreMsg + "的作业合金为空");
|
|
|
+ }
|
|
|
+ processes.setVolumeMetal(operationDo.getMetal());
|
|
|
+ if("成退".equals(operationDo.getProcess()) || "中退".equals(operationDo.getProcess()) || "小卷成退".equals(operationDo.getProcess())){
|
|
|
+ processes.setVolumeMetalstate(outMaterDos.get(0).getMetalstate());
|
|
|
+ }else{
|
|
|
+ processes.setVolumeMetalstate(operationDo.getMetalstate());
|
|
|
+ }
|
|
|
+ processes.setProducttype(operationDo.getProducttype());
|
|
|
+ // 连续生产标识设置
|
|
|
+ // 合金+输入物料+宽度+输入物料厚度+输出物料厚度(取第一个冷轧工序使用)
|
|
|
+ processes.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getProducttype() + "^_^" + operationDo.getProwidth() + "^_^" + operationDo.getThickness() + "^_^" + outMaterDos.get(0).getThickness());
|
|
|
+ processes.setPrepressworkmin(operationDo.getPrepressworkmin() == null ? null : operationDo.getPrepressworkmin().intValue());
|
|
|
+ processes.setCutfinishmin(operationDo.getCutfinishmin() == null ? null : operationDo.getCutfinishmin().intValue());
|
|
|
|
|
|
+ return processes;
|
|
|
}
|
|
|
|
|
|
}
|