Browse Source

冷轧重排

fangpy 6 tháng trước cách đây
mục cha
commit
b8a9f19c49

+ 2 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsService.java

@@ -14,4 +14,6 @@ public interface ApsService {
 
     ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders, Date apsPlanStartDate);
 
+    ProductionScheduleVo productionScheduleVoInit(Date apsPlanStartDate);
+
 }

+ 145 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsDispatchServiceImpl.java

@@ -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;
     }
 
 }

+ 6 - 1
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsServiceImpl.java

@@ -785,7 +785,12 @@ public class ApsServiceImpl implements ApsService {
         }
     }
 
-    private ProductionScheduleVo productionScheduleVoInit(Date apsPlanStartDate){
+    /**
+     * 排程参数配置
+     * @param apsPlanStartDate
+     * @return
+     */
+    public ProductionScheduleVo productionScheduleVoInit(Date apsPlanStartDate){
         ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
         productionScheduleVo.setProductionScheduleId("批量排程-"+SecurityUtil.getUUID());
         List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();

+ 24 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsDispatchVo.java

@@ -0,0 +1,24 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class ApsDispatchVo {
+
+    /**
+     * 重排开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 重排结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 设备ID
+     */
+    private String equipmentId;
+
+}