Ver Fonte

单卷模型转换

fangpy há 1 ano atrás
pai
commit
29b0f0113b

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

@@ -1,6 +1,7 @@
 package com.rongwei.bscommon.sys.service;
 
 import com.rongwei.bsentity.vo.ApsBlankOrderVo;
+import com.rongwei.bsentity.vo.ProductionScheduleVo;
 
 import java.util.List;
 
@@ -8,4 +9,6 @@ public interface ApsService {
 
     void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders);
 
+    ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders);
+
 }

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

@@ -1,19 +1,23 @@
 package com.rongwei.bscommon.sys.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONConfig;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.rongwei.bscommon.sys.dao.ApsBlankOrderDao;
 import com.rongwei.bscommon.sys.fegin.RwApsServer;
-import com.rongwei.bscommon.sys.service.ApsBlankOrderService;
-import com.rongwei.bscommon.sys.service.ApsService;
-import com.rongwei.bsentity.vo.ApsBlankOrderVo;
-import com.rongwei.bsentity.vo.ProductionScheduleRetVo;
-import com.rongwei.bsentity.vo.ProductionScheduleVo;
+import com.rongwei.bscommon.sys.service.*;
+import com.rongwei.bsentity.domain.*;
+import com.rongwei.bsentity.vo.*;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.safecommon.utils.CXCommonUtils;
+import com.rongwei.safecommon.utils.SaveConstans;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -21,10 +25,15 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.ZoneId;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+import static com.rongwei.safecommon.utils.SaveConstans.LockmarkType.LOCKMARK_Y;
+
 @Service
 public class ApsServiceImpl implements ApsService {
 
@@ -37,6 +46,16 @@ public class ApsServiceImpl implements ApsService {
     private ApsBlankOrderDao apsBlankOrderDao;
     @Autowired
     private RwApsServer rwApsServer;
+    @Autowired
+    private ApsScheduleConfigService apsScheduleConfigService;
+    @Autowired
+    private AspCheckItemsService aspCheckItemsService;
+    @Autowired
+    private ApsProcessOperationService apsProcessOperationService;
+    @Autowired
+    private ApsProcessOperationProcessEquServiceImpl processOperationProcessEquService;
+    @Autowired
+    private ApsEquipmentCalendarService apsEquipmentCalendarService;
 
     @Override
     public void apsSchedule(List<ApsBlankOrderVo> apsBlankOrders) {
@@ -73,7 +92,8 @@ public class ApsServiceImpl implements ApsService {
                 }
 
                 // 模型转换
-                ProductionScheduleVo productionScheduleVo = apsBlankOrderService.apsPlanModelSet(apsBlankOrders);
+//                ProductionScheduleVo productionScheduleVo = apsBlankOrderService.apsPlanModelSet(apsBlankOrders);
+                ProductionScheduleVo productionScheduleVo = apsProductionScheduleInit(apsBlankOrders);
                 JSONConfig jsonConfig = JSONConfig.create();
                 jsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
                 System.out.println("排程数据:" + JSONUtil.toJsonStr(productionScheduleVo, jsonConfig));
@@ -95,4 +115,336 @@ public class ApsServiceImpl implements ApsService {
         }
     }
 
+    /**
+     * 原始订单表数据转换APS平台模型数据
+     *
+     * @param apsBlankOrders
+     * @return
+     */
+    @Override
+    public ProductionScheduleVo apsProductionScheduleInit(List<ApsBlankOrderVo> apsBlankOrders) {
+        // 待排程坯料计划ID集合
+        List<String> blankids = apsBlankOrders.stream().map(v -> v.getId()).collect(Collectors.toList());
+        ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
+        productionScheduleVo.setProductionScheduleId("批量排程");
+        List<ApsScheduleConfigDo> apsConfigs = apsScheduleConfigService.list();
+        ApsScheduleConfigDo apsScheduleConfig = null;
+        // 松散度
+        BigDecimal looseness = null;
+        if (apsConfigs != null && apsConfigs.size() > 0) {
+            apsScheduleConfig = apsConfigs.get(0);
+            looseness = apsScheduleConfig.getLooseness();
+            productionScheduleVo.setPlanSeconds(apsScheduleConfig.getScheduleruntime());
+            Map<String, Integer> roamTime = new HashMap<>();
+            Integer workshopin = new BigDecimal(apsScheduleConfig.getWorkshopin()).multiply((looseness.divide(new BigDecimal("100"))).add(new BigDecimal("1")))
+                    .setScale(0, RoundingMode.CEILING).intValue();
+            Integer workshopcross = new BigDecimal(apsScheduleConfig.getWorkshopcross()).multiply((looseness.divide(new BigDecimal("100"))).add(new BigDecimal("1")))
+                    .setScale(0, RoundingMode.CEILING).intValue();
+            roamTime.put("WORKSHOP_IN", workshopin);
+            roamTime.put("WORKSHOP_CROSS", workshopcross);
+            productionScheduleVo.setRoamTime(roamTime);
+            // 排程计划开始时间
+            int a = 8;
+            if (apsScheduleConfig.getStartschedulerun() != null) {
+                a = apsScheduleConfig.getStartschedulerun();
+            }
+            if (apsScheduleConfig.getApsplanstartdate() != null) {
+                productionScheduleVo.setApsPlanStartDate(apsScheduleConfig.getApsplanstartdate());
+            } else {
+                productionScheduleVo.setApsPlanStartDate(DateUtil.date().offset(DateField.HOUR, a));
+            }
+            productionScheduleVo.setWashingtime(apsScheduleConfig.getWashingtime());
+            productionScheduleVo.setStandingtime(apsScheduleConfig.getStandingtime());
+        } else {
+            throw new CustomException("排程参数缺失");
+        }
+        // 洗炉合金配置数据设置
+        List<WashingMetal> washingMetalConfig = apsBlankOrderDao.getWashingMetalConfig();
+        productionScheduleVo.setClosealloynames(washingMetalConfig);
+
+        // 所有设备
+        List<AspCheckItemsDo> eqs = aspCheckItemsService.list(new LambdaQueryWrapper<>());
+        Map<String, AspCheckItemsDo> eqMaps = new HashMap<>();
+        for (AspCheckItemsDo eq : eqs) {
+            eqMaps.put(eq.getId(), eq);
+        }
+        // 排程计划设备集合
+        List<Equipment> equipmentList = new ArrayList<>();
+        // 排程计划工序任务集合
+        List<ProductionProcesses> processesList = new ArrayList<>();
+        // 坯料计划ID和所属工序作业ID对应关系
+        Map<String, List<String>> blankProcessIds = new HashMap<>();
+        // 待合并生产的订单工序
+        List<ApsProcessOperationVo> processOperationMs = new ArrayList<>();
+        if (apsBlankOrders != null && apsBlankOrders.size() > 0) {
+            for (ApsBlankOrderVo apsBlankOrderVo : apsBlankOrders) {
+                // 当前坯料计划作业集合
+                List<ProductionProcesses> blankProcessesList = new ArrayList<>();
+                // 父子ID对应关系处理
+                List<String> processIdss = new ArrayList<>();
+                // 坯料计划订单
+                ProduceOrder produceOrder = new ProduceOrder(apsBlankOrderVo.getId(), apsBlankOrderVo.getMaterialname(), DateUtil.offsetHour(apsBlankOrderVo.getDeliverydate(), -apsBlankOrderVo.getDeliverytime()));
+                // 获取所有订单工序
+                List<ApsProcessOperationDo> operationDos = apsProcessOperationService.list(new LambdaQueryWrapper<ApsProcessOperationDo>()
+                        .eq(ApsProcessOperationDo::getBlankid, apsBlankOrderVo.getId()));
+                // 起始节点
+                ApsProcessOperationDo rootOperationDo = null;
+                // 作业维度缓存
+                Map<String,List<ProductionProcesses>> operationProductionProcesses = new HashMap<>();
+                Map<String,ApsProcessOperationDo> operationMaps = new HashMap<>();
+                // 锁定的合并工序缓存
+                Map<String, ProductionProcesses> lockHbPp = new HashMap<>();
+                // 转换工序模型数据
+                for (ApsProcessOperationDo operationDo : operationDos) {
+                    processIdss.add(operationDo.getId());
+                    ProductionProcesses processes = new ProductionProcesses();
+                    // 工序所属订单
+                    processes.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder}));
+                    // 判断是否合并生产工序,加工方式是“合并加工”
+                    String productprocess = operationDo.getProcessway();
+                    // 设备列表
+                    List<String> optionalEquipments = new ArrayList<>();
+                    if (StringUtils.isNotBlank(operationDo.getCanchoosedeviceid())) {
+                        String[] sbIds = operationDo.getCanchoosedeviceid().split(",");
+                        for (String equIds : sbIds) {
+                            AspCheckItemsDo checkItemsD = eqMaps.get(equIds);
+                            if (checkItemsD != null) {
+                                optionalEquipments.add(equIds);
+                                List<Equipment> eqpts = equipmentList.stream().filter(v -> v.getId().equals(equIds)).collect(Collectors.toList());
+                                // 设备集合里不存在时新增
+                                if (eqpts == null || eqpts.size() == 0) {
+                                    Equipment equipment = new Equipment();
+                                    equipment.setBsEquipmentId(equIds);
+                                    equipment.setId(equIds);
+                                    equipment.setEquipmentName(checkItemsD.getCheckitemname());
+                                    equipment.setWorkshopid(checkItemsD.getUsedeptid());
+                                    equipment.setWorkshopname(checkItemsD.getUsedeptname());
+                                    equipment.setFactoryid(checkItemsD.getTenantid());
+                                    equipment.setFactory(checkItemsD.getOwnedfactory());
+                                    equipment.setEquassociated(checkItemsD.getEquassociated());
+                                    // 查询设备锁定的已排程的时间段
+                                    List<ApsProcessOperationProcessEquDo> processEqus = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                            .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                            .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
+                                            .ge(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
+                                            .orderByAsc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                                    );
+                                    // 查询当前设备最后一个生产任务、连续生产需要考虑使用
+                                    List<ApsProcessOperationProcessEquDo> lastpros = processOperationProcessEquService.list(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                                            .eq(ApsProcessOperationProcessEquDo::getProcessdeviceid, equIds)
+                                            .notIn(ApsProcessOperationProcessEquDo::getBlankid, blankids)
+                                            .gt(ApsProcessOperationProcessEquDo::getPlanstartdate, productionScheduleVo.getApsPlanStartDate())
+                                            .orderByDesc(ApsProcessOperationProcessEquDo::getPlanstartdate)
+                                    );
+                                    if (lastpros != null && lastpros.size() > 0) {
+                                        ApsProcessOperationProcessEquDo lastpro = lastpros.get(0);
+                                        ApsProcessOperationDo lastop = apsProcessOperationService.getById(lastpro.getProcessid());
+                                        equipment.setLastProcessType(lastop.getProcess());
+                                        equipment.setLastProcessEndTime(lastpro.getPlanenddate());
+                                        equipment.setLastProcessCutfinishmin(lastop.getCutfinishmin() == null ? null : lastop.getCutfinishmin().intValue());
+                                        // 合金+输入物料+宽度
+                                        equipment.setLastSeriesProduceMark(lastop.getMetal() + "^_^" + lastop.getPlaninput() + "^_^" + lastop.getProwidth());
+                                        equipment.setLastProcessCutfinishmin(lastop.getCutfinishmin() == null ? null : lastop.getCutfinishmin().intValue());
+                                    }
+                                    // 查询相关工序作业
+                                    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());
+                                            // 设备占用时间设置连续生产标识,参与排程
+                                            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());
+                                                    // 合金+输入物料+宽度
+                                                    er.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getPlaninput() + "^_^" + operationDo.getProwidth());
+                                                    er.setPrepressworkmin(processesDo.getPrepressworkmin() == null ? null : processesDo.getPrepressworkmin().intValue());
+                                                    er.setCutfinishmin(processesDo.getCutfinishmin() == null ? null : processesDo.getCutfinishmin().intValue());
+                                                }
+                                            }
+                                            equipmentRunTimes.add(er);
+                                        }
+                                        // 设备日历不可用时间段
+                                        List<ApsEquipmentCalendarDo> equipmentCalendarDos = apsEquipmentCalendarService.list(
+                                                new LambdaQueryWrapper<ApsEquipmentCalendarDo>().ge(ApsEquipmentCalendarDo::getSdstarttime, productionScheduleVo.getApsPlanStartDate())
+                                                        .eq(ApsEquipmentCalendarDo::getProcessdeviceid, equipment.getBsEquipmentId()));
+                                        if (equipmentCalendarDos != null && equipmentCalendarDos.size() > 0) {
+                                            for (ApsEquipmentCalendarDo equipmentCalendarDo : equipmentCalendarDos) {
+                                                EquipmentRunTime er = new EquipmentRunTime();
+                                                er.setStartRunTime(equipmentCalendarDo.getSdstarttime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+                                                er.setEndRunTime(equipmentCalendarDo.getSdendtime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+                                                equipmentRunTimes.add(er);
+                                            }
+                                        }
+
+                                        equipment.setEquipmentRunTimes(equipmentRunTimes);
+                                    }
+                                    equipmentList.add(equipment);
+                                }
+                            }
+                        }
+                    }
+                    // 工序作业相关数据初始化
+                    productionProcessesInit(operationDo,produceOrder,optionalEquipments,processesList,operationProductionProcesses);
+                }
+                // 前后关联关系初始化
+                processesRelationInit(rootOperationDo,operationProductionProcesses,operationMaps,apsBlankOrderVo);
+
+                blankProcessIds.put(apsBlankOrderVo.getId(), processIdss);
+            }
+        }
+        // 合并生产工序
+        productionScheduleVo.setProcesses(processesList);
+        productionScheduleVo.setEquipmentList(equipmentList);
+        productionScheduleVo.setBlankProcessIds(blankProcessIds);
+        return productionScheduleVo;
+    }
+
+
+    /**
+     * 前后道工序作业关联关系初始化
+     * @param rootOperationDo
+     * @param operationProductionProcesses
+     * @param operationMaps
+     * @param apsBlankOrderVo
+     */
+    private void processesRelationInit(ApsProcessOperationDo rootOperationDo,Map<String,List<ProductionProcesses>> operationProductionProcesses
+            ,Map<String,ApsProcessOperationDo> operationMaps,ApsBlankOrderVo apsBlankOrderVo){
+        String[] nextids = rootOperationDo.getNextprocessid().split(",");
+        // 前后道工序关联关系处理
+        if(rootOperationDo == null){
+            throw new CustomException("数据异常,ID为:"+apsBlankOrderVo.getId()+"的坯料计划没有根节点");
+        }else{
+            boolean isEnd = true;
+            // 当前作业计划加工卷数
+            Integer planPres = rootOperationDo.getPlanprocessrall();
+            // 下道工序按物料类型分组
+            Map<String, List<ProductionProcesses>> wlPros = new HashMap<>();
+            if(nextids != null && nextids.length>0){
+                for (String nextid : nextids) {
+                    List<ProductionProcesses> productionProcesses = operationProductionProcesses.get(nextid);
+                    if(productionProcesses != null && productionProcesses.size()>0 && operationMaps.get(nextid) != null){
+                        if(wlPros.containsKey(operationMaps.get(operationMaps.get(nextid).getPlaninput()))){
+                            wlPros.get(operationMaps.get(operationMaps.get(nextid).getPlaninput())).addAll(productionProcesses);
+                        }else{
+                            wlPros.put(operationMaps.get(nextid).getPlaninput(),productionProcesses);
+                        }
+                    }
+                }
+            }
+            // 当前作业和下道工序建立关联关系
+            wlPros.forEach((k,v)->{
+                boolean isConnect = true;
+                int vi = 0;
+                List<ProductionProcesses> productionProcesses = operationProductionProcesses.get(rootOperationDo.getId());
+                while (vi<v.size()){
+                    for(int i = 0;i <planPres;i++){
+                        vi++;
+                        if(vi>=v.size()){
+                            break;
+                        }
+                        if(productionProcesses.get(i).getNextProcessesIds() == null){
+                            List<String> ids = new ArrayList<>();
+                            ids.add(v.get(i).getId());
+                            productionProcesses.get(i).setNextProcessesIds(ids);
+                        }else{
+                            productionProcesses.get(i).getNextProcessesIds().add(v.get(i).getId());
+                        }
+                        if(v.get(vi).getPreviousProcessesIds() == null){
+                            List<String> ids = new ArrayList<>();
+                            ids.add(productionProcesses.get(i).getId());
+                            v.get(vi).setPreviousProcessesIds(ids);
+                        }else{
+                            v.get(vi).getPreviousProcessesIds().add(productionProcesses.get(i).getId());
+                        }
+                    }
+                }
+            });
+        }
+        // 递归处理下道工序数据
+        if(nextids != null && nextids.length>0){
+            for (String nextid : nextids) {
+                ApsProcessOperationDo apsProcessOperationDo = operationMaps.get(nextid);
+                processesRelationInit(apsProcessOperationDo,operationProductionProcesses,operationMaps,apsBlankOrderVo);
+            }
+        }
+    }
+
+    /**
+     * 工序作业模型初始化
+     * @param operationDo
+     * @param produceOrder
+     * @param optionalEquipments
+     * @param processesList
+     * @param operationProductionProcesses
+     */
+    private void productionProcessesInit(ApsProcessOperationDo operationDo,ProduceOrder produceOrder,List<String> optionalEquipments
+            ,List<ProductionProcesses> processesList,Map<String,List<ProductionProcesses>> operationProductionProcesses){
+        List<ProductionProcesses> operationProcess = new ArrayList<>();
+        if(operationDo != null && operationDo.getPlanprocessrall() != null && operationDo.getPlanprocessrall()>0){
+            for (Integer i = 0; i < operationDo.getPlanprocessrall(); i++) {
+                ProductionProcesses processes = new ProductionProcesses();
+                // 工序所属订单
+                processes.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder}));
+                // 模型ID
+                processes.setId(operationDo.getId());
+                // 业务表主键ID
+                List<String> bss = new ArrayList<>();
+                bss.add(operationDo.getId());
+                processes.setBsProcessesId(bss);
+                // 工序任务可选设备
+                processes.setOptionalEquipments(optionalEquipments);
+                // 批次
+                processes.setProducePcNum(operationDo.getPlanprocessrall());
+                processes.setProcessType(operationDo.getProcess());
+                // 单次加工时长
+                processes.setUnitProduceTime(operationDo.getOnceprocessmin().intValue());
+                processes.setProduceTime(operationDo.getOnceprocessmin().intValue());
+                if (operationDo.getMinflowwaitmin() != null) {
+                    processes.setMinWaitTime(operationDo.getMinflowwaitmin().intValue());
+                }
+                if (operationDo.getMaxflowwaitmin() != null) {
+                    processes.setMaxWaitTime(operationDo.getMaxflowwaitmin().intValue());
+                }
+                // 合金
+                processes.setVolumeMetal(operationDo.getMetal());
+                // 连续生产标识设置
+                // 合金+输入物料+宽度
+                processes.setSeriesProduceMark(operationDo.getMetal() + "^_^" + operationDo.getPlaninput() + "^_^" + operationDo.getProwidth());
+                processes.setPrepressworkmin(operationDo.getPrepressworkmin() == null ? null : operationDo.getPrepressworkmin().intValue());
+                processes.setCutfinishmin(operationDo.getCutfinishmin() == null ? null : operationDo.getCutfinishmin().intValue());
+                // 锁定的作业加上锁定标识
+                if (LOCKMARK_Y.equals(operationDo.getLockmark())) {
+                    ApsProcessOperationProcessEquDo processEquServiceOne = processOperationProcessEquService.getOne(new LambdaQueryWrapper<ApsProcessOperationProcessEquDo>()
+                            .eq(ApsProcessOperationProcessEquDo::getProcessid, operationDo.getId()));
+                    if (processEquServiceOne != null) {
+                        processes.setIfLock(true);
+                        processes.setEquipmentId(processEquServiceOne.getProcessdeviceid());
+                        List<String> opeqs = new ArrayList<>();
+                        opeqs.add(processEquServiceOne.getProcessdeviceid());
+                        processes.setOptionalEquipments(opeqs);
+                        processes.setStartTime(processEquServiceOne.getPlanstartdate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+                        processes.setEndTime(processEquServiceOne.getPlanenddate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+                    }
+                }
+                operationProcess.add(processes);
+            }
+            processesList.addAll(operationProcess);
+            operationProductionProcesses.put(operationDo.getId(),operationProcess);
+        }
+    }
+
 }