Browse Source

APS二开服务业务数据转换模型数据

fangpy 1 year ago
parent
commit
8194824775
17 changed files with 691 additions and 15 deletions
  1. 14 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsBlankOrderDao.java
  2. 16 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java
  3. 16 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/fegin/RwApsServer.java
  4. 2 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsBlankOrderService.java
  5. 16 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProcessOperationProcessEquService.java
  6. 329 9
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java
  7. 20 0
      cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java
  8. 138 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationProcessEquDo.java
  9. 5 5
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/AspCheckItemsDo.java
  10. 22 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/AluminumCoil.java
  11. 0 1
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsBlankOrderVo.java
  12. 3 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsPlanVo.java
  13. 11 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsProcessOperationVo.java
  14. 5 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/Equipment.java
  15. 52 0
      cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionProcesses.java
  16. 22 0
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsBlankOrderController.java
  17. 20 0
      cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProcessOperationProcessEquController.java

+ 14 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsBlankOrderDao.java

@@ -2,6 +2,12 @@ package com.rongwei.bscommon.sys.dao;
 
 import com.rongwei.bsentity.domain.ApsBlankOrderDo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.rongwei.bsentity.domain.AspCheckItemsDo;
+import com.rongwei.bsentity.vo.ApsBlankOrderVo;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ApsBlankOrderDao extends BaseMapper<ApsBlankOrderDo> {
 
+    @Select("select a.*,b.PLANENDDATE from asp_check_items a LEFT JOIN \n" +
+            "(select PROCESSDEVICEID,MAX(PLANENDDATE) PLANENDDATE from aps_process_operation_process_equ where DELETED='0' GROUP BY PROCESSDEVICEID) b on a.ID=b.PROCESSDEVICEID\n" +
+            "where a.DELETED='0' and a.ID in (${ids}) ORDER BY b.PLANENDDATE ASC")
+    List<AspCheckItemsDo> eqAscs(@Param("ids") String ids);
+
+    @Select("select a.*,b.DELIVERYDATE from aps_blank_order a LEFT JOIN aps_production_order b on a.PRODUCTIONORDERID=b.ID where a.PRODUCTIONORDERID=#{orderId} and a.DELETED='0' and b.DELETED='0'")
+    List<ApsBlankOrderVo> getByOrderId(@Param("orderId") String orderId);
+
 }

+ 16 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 生产订单-坯料计划-工序作业加工设备 Mapper 接口
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-03-25
+ */
+public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessOperationProcessEquDo> {
+
+}

+ 16 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/fegin/RwApsServer.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.fegin;
+
+import com.rongwei.bsentity.vo.ProductionScheduleRetVo;
+import com.rongwei.bsentity.vo.ProductionScheduleVo;
+import com.rongwei.rwcommon.vo.MailDo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(value = "rw-aps")
+public interface RwApsServer {
+
+    @PostMapping("/apsSchedule/productionSchedule")
+    ProductionScheduleRetVo productionSchedule(@RequestBody ProductionScheduleVo productionScheduleVo);
+
+}

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

@@ -17,6 +17,8 @@ import java.util.List;
  */
 public interface ApsBlankOrderService extends IService<ApsBlankOrderDo> {
 
+    void apsScheduling(ApsPlanVo apsPlanVo);
+
     ProductionScheduleVo apsPlanModelSet(ApsPlanVo apsPlanVo);
 
 }

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

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 生产订单-坯料计划-工序作业加工设备 服务类
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-03-25
+ */
+public interface ApsProcessOperationProcessEquService extends IService<ApsProcessOperationProcessEquDo> {
+
+}

+ 329 - 9
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsBlankOrderServiceImpl.java

@@ -1,24 +1,30 @@
 package com.rongwei.bscommon.sys.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateField;
+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.dao.ApsBlankOrderDao;
+import com.rongwei.bscommon.sys.fegin.RwApsServer;
 import com.rongwei.bscommon.sys.service.ApsBlankOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.service.ApsProcessOperationService;
+import com.rongwei.bscommon.sys.service.ApsProductionOrderService;
 import com.rongwei.bscommon.sys.service.AspCheckItemsService;
-import com.rongwei.bsentity.domain.ApsBlankOrderDo;
-import com.rongwei.bsentity.domain.ApsProcessOperationDo;
-import com.rongwei.bsentity.domain.AspCheckItemsDo;
+import com.rongwei.bsentity.domain.*;
 import com.rongwei.bsentity.vo.*;
+import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.safecommon.utils.SaveConstans;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.math.BigDecimal;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * <p>
@@ -35,6 +41,96 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
     private ApsProcessOperationService apsProcessOperationService;
     @Autowired
     private AspCheckItemsService aspCheckItemsService;
+    @Autowired
+    private ApsBlankOrderDao apsBlankOrderDao;
+    @Autowired
+    private RwApsServer rwApsServer;
+    @Autowired
+    private ApsProcessOperationProcessEquServiceImpl processOperationProcessEquService;
+
+    /**
+     * 订单批量排程
+     * @param apsPlanVo
+     */
+    public void apsScheduling(ApsPlanVo apsPlanVo){
+        // 设置批量排程默认开始时间(当前时间向后移8小时)
+        if(apsPlanVo.getApsPlanStartDate() == null){
+            apsPlanVo.setApsPlanStartDate(DateUtil.date().offset(DateField.HOUR,8));
+        }
+        List<ApsBlankOrderVo> apsBlankOrders = new ArrayList<>();
+        if(apsPlanVo.getApsProductionOrders() != null){
+            for (ApsProductionOrderDo apsProductionOrder : apsPlanVo.getApsProductionOrders()) {
+                List<ApsBlankOrderVo> byOrderId = apsBlankOrderDao.getByOrderId(apsProductionOrder.getId());
+                if(byOrderId != null && byOrderId.size()>0){
+                    apsBlankOrders.addAll(byOrderId);
+                }
+            }
+        }
+        apsPlanVo.setApsBlankOrderDos(apsBlankOrders);
+        // 模型转换
+        ProductionScheduleVo productionScheduleVo = apsPlanModelSet(apsPlanVo);
+        // APS平台排程接口调用
+        ProductionScheduleRetVo productionScheduleRetVo = rwApsServer.productionSchedule(productionScheduleVo);
+        // 排程结果保存
+        List<ApsProcessOperationProcessEquDo> apsProcessOperationProcessEquDos = new ArrayList<>();
+        // 作业ID集合
+        List<String> zyIds = new ArrayList<>();
+        if(productionScheduleRetVo.getProcesses() != null && productionScheduleRetVo.getProcesses().size()>0){
+            for (ProductionProcesses process : productionScheduleRetVo.getProcesses()) {
+                // 非合并生产工序
+                if(process.getAluminumCoils() == null){
+                    ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
+                    apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
+                    apsProcessOperationProcessEqu.setProcessid(process.getId());
+                    apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
+                    apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
+                    apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshop());
+                    apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
+                    apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
+                    apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
+                    apsProcessOperationProcessEqu.setPlanprocessrall(process.getProducePcNum());
+                    apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
+                    zyIds.add(process.getId());
+                }
+                // 合并生产工序
+                else {
+                    // 保存到明细表
+                    Map<String,List<AluminumCoil>> bsAl = new HashMap<>();
+                    for (AluminumCoil aluminumCoil : process.getAluminumCoils()) {
+                        if(bsAl.containsKey(aluminumCoil.getBsId())){
+                            bsAl.get(aluminumCoil.getBsId()).add(aluminumCoil);
+                        }else{
+                            List<AluminumCoil> coils = new ArrayList<>();
+                            coils.add(aluminumCoil);
+                            bsAl.put(aluminumCoil.getBsId(),coils);
+                        }
+                    }
+                    bsAl.forEach((k,v)->{
+                        ApsProcessOperationProcessEquDo apsProcessOperationProcessEqu = new ApsProcessOperationProcessEquDo();
+                        apsProcessOperationProcessEqu.setId(SecurityUtil.getUUID());
+                        apsProcessOperationProcessEqu.setProcessid(k);
+                        apsProcessOperationProcessEqu.setProcessdeviceid(process.getEquipment().getId());
+                        apsProcessOperationProcessEqu.setProcessdevice(process.getEquipment().getEquipmentName());
+                        apsProcessOperationProcessEqu.setProcessworkshopid(process.getEquipment().getWorkshop());
+                        apsProcessOperationProcessEqu.setProcessworkshop(process.getEquipment().getWorkshopname());
+                        apsProcessOperationProcessEqu.setPlanstartdate(Date.from(process.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
+                        apsProcessOperationProcessEqu.setPlanenddate(Date.from(process.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
+                        apsProcessOperationProcessEqu.setPlanprocessrall(v.size());
+                        apsProcessOperationProcessEquDos.add(apsProcessOperationProcessEqu);
+                        zyIds.add(k);
+                    });
+                }
+            }
+        }
+        if(apsProcessOperationProcessEquDos != null && apsProcessOperationProcessEquDos.size()>0){
+            // 先删除所有作业的明细
+            if (zyIds != null && zyIds.size()>0){
+                processOperationProcessEquService.remove(new LambdaUpdateWrapper<ApsProcessOperationProcessEquDo>().in(ApsProcessOperationProcessEquDo::getProcessid,zyIds));
+            }
+            // 再保存新数据
+            processOperationProcessEquService.saveBatch(apsProcessOperationProcessEquDos);
+        }
+    }
 
     /**
      * 原始订单表数据转换APS平台模型数据
@@ -47,6 +143,14 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
         ProductionScheduleVo productionScheduleVo = new ProductionScheduleVo();
         // 排程计划开始时间
         productionScheduleVo.setApsPlanStartDate(apsPlanVo.getApsPlanStartDate());
+        productionScheduleVo.setProductionScheduleId("批量排程");
+        productionScheduleVo.setPlanSeconds(10);
+        // 所有设备
+        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<>();
         // 排程计划工序任务集合
@@ -72,6 +176,8 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         ApsProcessOperationVo processOperationVo = new ApsProcessOperationVo();
                         BeanUtil.copyProperties(operationDo,processOperationVo);
                         processOperationVo.setProduceOrder(produceOrder);
+                        processOperationVo.setDeliverydate(apsBlankOrderVo.getDeliverydate());
+                        processOperationVo.setApsBlankOrderVo(apsBlankOrderVo);
                         processOperationMs.add(processOperationVo);
                     }else {
                         // 非合并生产工序
@@ -79,7 +185,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         if(StringUtils.isNotBlank(operationDo.getCanchoosedeviceid())){
                             String[] sbIds = operationDo.getCanchoosedeviceid().split(",");
                             for (String equIds : sbIds) {
-                                AspCheckItemsDo checkItemsD = aspCheckItemsService.getById(equIds);
+                                AspCheckItemsDo checkItemsD = eqMaps.get(equIds);
                                 Equipment equipment = new Equipment();
                                 equipment.setBsEquipmentId(equIds);
                                 equipment.setId(equIds);
@@ -95,6 +201,12 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
                         processes.setBsProcessesId(operationDo.getId());
                         // 工序任务可选设备
                         processes.setOptionalEquipments(optionalEquipments);
+                        // 批次
+                        processes.setProducePcNum(operationDo.getPlanprocessrall());
+                        // 单次加工时长
+                        processes.setUnitProduceTime(operationDo.getPlanoncetime().intValue());
+                        processes.setProduceTime(processes.getUnitProduceTime()*processes.getProducePcNum());
+
                         // 上道工序
                         if(StringUtils.isNotBlank(operationDo.getPreviousprocess())){
                             processes.setPreviousProcessesIds(Arrays.asList(operationDo.getPreviousprocess().split(",")));
@@ -109,7 +221,7 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
             }
         }
         // 合并生产工序
-        List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs);
+        List<ProductionProcesses> productionProcesses = mergeProcesses(processOperationMs,eqMaps);
         processesList.addAll(productionProcesses);
 
         productionScheduleVo.setProcesses(processesList);
@@ -122,9 +234,217 @@ public class ApsBlankOrderServiceImpl extends ServiceImpl<ApsBlankOrderDao, ApsB
      * @param processOperationMs
      * @return
      */
-    private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs){
+    private List<ProductionProcesses> mergeProcesses(List<ApsProcessOperationVo> processOperationMs,Map<String,AspCheckItemsDo> eqMaps){
+        // 最终的合并工序
         List<ProductionProcesses> processesList = new ArrayList<>();
+        if(processOperationMs != null && processOperationMs.size()>0){
+            // 按照期望交货期排序
+            processOperationMs.sort(Comparator.comparing(ApsProcessOperationVo::getDeliverydate));
+            // 获取所有设备,并按已存在最晚完工时间排序
+            String allSelEqs = null;
+            for (ApsProcessOperationVo processOperationM : processOperationMs) {
+                if(StringUtils.isNotBlank(processOperationM.getCanchoosedeviceid())){
+                    String[] sbIds = processOperationM.getCanchoosedeviceid().split(",");
+                    for (String equIds : sbIds) {
+                        if(allSelEqs == null){
+                            allSelEqs = "'"+equIds+"'";
+                        }else{
+                            if(!allSelEqs.contains(equIds)){
+                                allSelEqs = allSelEqs + ",'"+equIds+"'";
+                            }
+                        }
+                    }
+                }
+            }
+            // 设备排序
+            List<AspCheckItemsDo> aspCheckItemsDos = apsBlankOrderDao.eqAscs(allSelEqs);
+            Map<String,AspCheckItemsDo> aspCheckItemMap = new HashMap<>();
+            for (AspCheckItemsDo aspCheckItemsDo : aspCheckItemsDos) {
+                aspCheckItemMap.put(aspCheckItemsDo.getId(),aspCheckItemsDo);
+            }
+            // 记录最后选择的设备序号
+            Integer m = 0;
+            for (ApsProcessOperationVo processOperationM : processOperationMs) {
+                // 作业加工卷数
+                int planprocessrall = processOperationM.getPlanprocessrall();
+                if(planprocessrall<=0){
+                    continue;
+                }
+                Boolean a = true;
+                long timestart = DateUtil.date().getTime();
+
+                while (a){
+                    int lastnum = planprocessrall;
+
+                    // 首先看已合并生产的设备是否还有余量继续排产
+                    for (ProductionProcesses processes : processesList) {
+                        // 加工设备
+                        String eq = processes.getOptionalEquipments().get(0);
+                        AspCheckItemsDo aspCheckItem = aspCheckItemMap.get(eq);
+
+                        // 合金和合金状态要一致
+                        if(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;
+                            for (AluminumCoil aluminumCoil : processes.getAluminumCoils()) {
+                                // 宽度不超过50mm
+                                if(aluminumCoil.getVolumeWidth().subtract(processOperationM.getProwidth()).abs().compareTo(new BigDecimal("50"))>0){
+                                    bol = false;
+                                }
+                                // 厚度不超过0.05mm
+                                if(aluminumCoil.getVolumeThickness().subtract(processOperationM.getThickness()).abs().compareTo(new BigDecimal("0.05"))>0){
+                                    bol = false;
+                                }
+                                // 重量不超过1吨
+                                if(aluminumCoil.getVolumeWeight().subtract(processOperationM.getSinglerollweight()).abs().compareTo(new BigDecimal("1"))>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.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.getPreviousprocess())){
+                                        processes.getPreviousProcessesIds().addAll(Arrays.asList(processOperationM.getPreviousprocess().split(",")));
+                                    }
+                                    // 下道工序
+                                    if(StringUtils.isNotBlank(processOperationM.getNextprocess())){
+                                        processes.getNextProcessesIds().addAll(Arrays.asList(processOperationM.getNextprocess().split(",")));
+                                    }
+                                    // 单次加工时长
+                                    if(processes.getUnitProduceTime() == null){
+                                        processes.setUnitProduceTime(processOperationM.getPlanoncetime().intValue());
+                                        processes.setProduceTime(processOperationM.getPlanoncetime().intValue());
+                                    }
+                                    // 加工时长取最大值
+                                    else{
+                                        if(processes.getUnitProduceTime()<processOperationM.getPlanoncetime().intValue()){
+                                            processes.setUnitProduceTime(processOperationM.getPlanoncetime().intValue());
+                                            processes.setProduceTime(processOperationM.getPlanoncetime().intValue());
+                                        }
+                                    }
+
+                                }
+                            }
+                        }
+                    }
+
+                    // 剩余的料卷
+                    if(lastnum>0){
+                        if(m == aspCheckItemsDos.size()-1){
+                            m = -1;
+                        }
+                        int haslast = 0;
+                        for(int i=m+1;i<aspCheckItemsDos.size();i++){
+                            if(haslast == lastnum){
+                                break;
+                            }
+                            AspCheckItemsDo aspCheckItem = aspCheckItemsDos.get(i);
+                            // 选择的设备要在可选设备的范围内
+                            if(processOperationM.getCanchoosedeviceid().contains(aspCheckItem.getId())){
+                                // 单卷宽度不能超过设备宽度并且单卷重不能超过设备的承重
+                                if(processOperationM.getProwidth().compareTo(aspCheckItem.getEquipmentwidth())<0
+                                        && processOperationM.getSinglerollweight().compareTo(aspCheckItem.getEquipmentbearing())<0){
+                                    for(int n=1;n<=lastnum;n++){
+                                        // 宽度余量
+                                        if(aspCheckItem.getEquipmentwidth().compareTo(processOperationM.getProwidth().multiply(new BigDecimal(n)))<0){
+                                            break;
+                                        }
+                                        // 重量余量
+                                        if(aspCheckItem.getEquipmentbearing().compareTo(processOperationM.getSinglerollweight().multiply(new BigDecimal(n)))<0){
+                                            break;
+                                        }
+                                        haslast = n;
+                                    }
+                                    if(haslast>0){
+                                        ProductionProcesses processes = new ProductionProcesses();
+                                        processes.setId(processOperationM.getId());
+                                        processes.setOptionalEquipments(Arrays.asList(new String[]{aspCheckItem.getId()}));
+                                        // 坯料计划订单
+                                        ProduceOrder produceOrder = new ProduceOrder(processOperationM.getApsBlankOrderVo().getId(),processOperationM.getApsBlankOrderVo().getMaterialname(),processOperationM.getApsBlankOrderVo().getDeliverydate());
+                                        processes.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder}));
+
+                                        processes.setAluminumCoils(new ArrayList<>());
+                                        for (int j=1;j<=haslast;j++){
+                                            AluminumCoil aluminumCoil = new AluminumCoil();
+                                            aluminumCoil.setBsId(processOperationM.getId());
+                                            aluminumCoil.setVolumeWidth(processOperationM.getProwidth());
+                                            aluminumCoil.setVolumeThickness(processOperationM.getThickness());
+                                            aluminumCoil.setVolumeWeight(processOperationM.getSinglerollweight());
+                                            aluminumCoil.setVolumeMetal(processOperationM.getMetal());
+                                            aluminumCoil.setVolumeMetalstate(processOperationM.getMetalstate());
+                                            processes.getAluminumCoils().add(aluminumCoil);
+                                        }
+                                        // 批次
+                                        processes.setProducePcNum(1);
+                                        // 单次加工时长
+                                        processes.setUnitProduceTime(processOperationM.getPlanoncetime().intValue());
+                                        processes.setProduceTime(processOperationM.getPlanoncetime().intValue());
+                                        // 上道工序
+                                        if(StringUtils.isNotBlank(processOperationM.getPreviousprocess())){
+                                            processes.setPreviousProcessesIds(Arrays.asList(processOperationM.getPreviousprocess().split(",")));
+                                        }
+                                        // 下道工序
+                                        if(StringUtils.isNotBlank(processOperationM.getNextprocess())){
+                                            processes.setNextProcessesIds(Arrays.asList(processOperationM.getNextprocess().split(",")));
+                                        }
+                                        processesList.add(processes);
+
+                                        lastnum = lastnum - haslast;
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    if(lastnum == 0){
+                        a = false;
+                    }
+
+                    // 循环超过2秒则强制退出防止内存溢出
+                    /*long timeend = DateUtil.date().getTime();
+                    if(timeend-timestart>3000){
+                        a = false;
+                    }*/
+                }
+            }
+        }
         return processesList;
     }
 

+ 20 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ApsProcessOperationProcessEquDo;
+import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquDao;
+import com.rongwei.bscommon.sys.service.ApsProcessOperationProcessEquService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 生产订单-坯料计划-工序作业加工设备 服务实现类
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-03-25
+ */
+@Service
+public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsProcessOperationProcessEquDao, ApsProcessOperationProcessEquDo> implements ApsProcessOperationProcessEquService {
+
+}

+ 138 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProcessOperationProcessEquDo.java

@@ -0,0 +1,138 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 生产订单-坯料计划-工序作业加工设备
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-03-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("aps_process_operation_process_equ")
+public class ApsProcessOperationProcessEquDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId("ID")
+    private String id;
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 所属工厂
+     */
+    @TableField("OWNEDFACTORY")
+    private String ownedfactory;
+    /**
+     * 工序作业ID
+     */
+    @TableField("PROCESSID")
+    private String processid;
+    /**
+     * 加工车间ID
+     */
+    @TableField("PROCESSWORKSHOPID")
+    private String processworkshopid;
+    /**
+     * 加工车间
+     */
+    @TableField("PROCESSWORKSHOP")
+    private String processworkshop;
+    /**
+     * 加工设备ID
+     */
+    @TableField("PROCESSDEVICEID")
+    private String processdeviceid;
+    /**
+     * 加工设备
+     */
+    @TableField("PROCESSDEVICE")
+    private String processdevice;
+    /**
+     * 计划开工时间
+     */
+    @TableField("PLANSTARTDATE")
+    private Date planstartdate;
+    /**
+     * 实际开工时间
+     */
+    @TableField("ACTUALSTARTDATE")
+    private Date actualstartdate;
+    /**
+     * 计划完工时间
+     */
+    @TableField("PLANENDDATE")
+    private Date planenddate;
+    /**
+     * 实际完工时间
+     */
+    @TableField("ACTUALFINISHDATE")
+    private Date actualfinishdate;
+    /**
+     * 完工状态
+     */
+    @TableField("CLOSESTATUS")
+    private String closestatus;
+    /**
+     * 计划加工卷数
+     */
+    @TableField("PLANPROCESSRALL")
+    private Integer planprocessrall;
+    /**
+     * 已开工卷数
+     */
+    @TableField("STARTINGROLL")
+    private Integer startingroll;
+    /**
+     * 已报工卷数
+     */
+    @TableField("REPORTROLL")
+    private Integer reportroll;
+    /**
+     * 已检验卷数
+     */
+    @TableField("CHECKOUTROLL")
+    private Integer checkoutroll;
+    /**
+     * 未完工卷数
+     */
+    @TableField("UNFINISHROLL")
+    private Integer unfinishroll;
+    /**
+     * 作业状态
+     */
+    @TableField("WORKSTATUS")
+    private String workstatus;
+    /**
+     * 待加工料卷批次号
+     */
+    @TableField("BACHMATERIALPROCESS")
+    private String bachmaterialprocess;
+    /**
+     * 待报工记录ID
+     */
+    @TableField("WAITREPORTID")
+    private String waitreportid;
+
+
+}

+ 5 - 5
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/AspCheckItemsDo.java

@@ -338,17 +338,17 @@ public class AspCheckItemsDo extends BaseDo {
      * 宽度
      */
     @TableField("EQUIPMENTWIDTH")
-    private Float equipmentwidth;
+    private BigDecimal equipmentwidth;
     /**
      * 长度
      */
     @TableField("EQUIPMENTLENGTH")
-    private Float equipmentlength;
+    private BigDecimal equipmentlength;
     /**
      * 高度
      */
     @TableField("EQUIPMENTHEIGHT")
-    private Float equipmentheight;
+    private BigDecimal equipmentheight;
     /**
      * 长宽高单位
      */
@@ -358,12 +358,12 @@ public class AspCheckItemsDo extends BaseDo {
      * 容量
      */
     @TableField("EQUIPMENTCAPACITY")
-    private Float equipmentcapacity;
+    private BigDecimal equipmentcapacity;
     /**
      * 承重
      */
     @TableField("EQUIPMENTBEARING")
-    private Float equipmentbearing;
+    private BigDecimal equipmentbearing;
     /**
      * 承重单位
      */

+ 22 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/AluminumCoil.java

@@ -0,0 +1,22 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+@Data
+public class AluminumCoil {
+
+    // 业务作业ID
+    private String bsId;
+    // 单卷宽
+    private BigDecimal volumeWidth;
+    // 单卷厚度
+    private BigDecimal volumeThickness;
+    // 单卷重
+    private BigDecimal volumeWeight;
+    // 合金
+    private String volumeMetal;
+    // 合金状态
+    private String volumeMetalstate;
+
+}

+ 0 - 1
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsBlankOrderVo.java

@@ -2,7 +2,6 @@ package com.rongwei.bsentity.vo;
 
 import com.rongwei.bsentity.domain.ApsBlankOrderDo;
 import lombok.Data;
-
 import java.util.Date;
 
 @Data

+ 3 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsPlanVo.java

@@ -1,6 +1,7 @@
 package com.rongwei.bsentity.vo;
 
 import com.rongwei.bsentity.domain.ApsBlankOrderDo;
+import com.rongwei.bsentity.domain.ApsProductionOrderDo;
 import lombok.Data;
 import java.util.Date;
 import java.util.List;
@@ -15,4 +16,6 @@ public class ApsPlanVo {
 
     private List<ApsBlankOrderVo> apsBlankOrderDos;
 
+    private List<ApsProductionOrderDo> apsProductionOrders;
+
 }

+ 11 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ApsProcessOperationVo.java

@@ -2,6 +2,7 @@ package com.rongwei.bsentity.vo;
 
 import com.rongwei.bsentity.domain.ApsProcessOperationDo;
 import lombok.Data;
+import java.util.Date;
 
 @Data
 public class ApsProcessOperationVo extends ApsProcessOperationDo {
@@ -11,4 +12,14 @@ public class ApsProcessOperationVo extends ApsProcessOperationDo {
      */
     private ProduceOrder produceOrder;
 
+    /**
+     * 期望交货期
+     */
+    private Date deliverydate;
+
+    /**
+     * 所属坯料计划
+     */
+    private ApsBlankOrderVo apsBlankOrderVo;
+
 }

+ 5 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/Equipment.java

@@ -45,6 +45,11 @@ public class Equipment{
      */
     private String workshop;
 
+    /**
+     * 设备所属车间
+     */
+    private String workshopname;
+
     /**
      * 设备满负荷物料
      */

+ 52 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/ProductionProcesses.java

@@ -1,5 +1,6 @@
 package com.rongwei.bsentity.vo;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -81,6 +82,20 @@ public class ProductionProcesses{
      */
     private Integer produceTime;
 
+    /**
+     * 加工数量
+     */
+    private BigDecimal produceNum;
+
+    /**
+     * 单批次生产时间
+     */
+    private Integer unitProduceTime;
+    /**
+     * 生产批次数量
+     */
+    private Integer producePcNum;
+
     /**
      * 开始时间
      */
@@ -109,6 +124,11 @@ public class ProductionProcesses{
      */
     private List<String> nextProcessesIds;
 
+    /**
+     * 加工铝卷的集合
+     */
+    private List<AluminumCoil> aluminumCoils;
+
     public String getEquipmentType() {
         return equipmentType;
     }
@@ -263,4 +283,36 @@ public class ProductionProcesses{
     public void setOptionalEquipments(List<String> optionalEquipments) {
         this.optionalEquipments = optionalEquipments;
     }
+
+    public List<AluminumCoil> getAluminumCoils() {
+        return aluminumCoils;
+    }
+
+    public void setAluminumCoils(List<AluminumCoil> aluminumCoils) {
+        this.aluminumCoils = aluminumCoils;
+    }
+
+    public BigDecimal getProduceNum() {
+        return produceNum;
+    }
+
+    public void setProduceNum(BigDecimal produceNum) {
+        this.produceNum = produceNum;
+    }
+
+    public Integer getUnitProduceTime() {
+        return unitProduceTime;
+    }
+
+    public void setUnitProduceTime(Integer unitProduceTime) {
+        this.unitProduceTime = unitProduceTime;
+    }
+
+    public Integer getProducePcNum() {
+        return producePcNum;
+    }
+
+    public void setProducePcNum(Integer producePcNum) {
+        this.producePcNum = producePcNum;
+    }
 }

+ 22 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsBlankOrderController.java

@@ -1,6 +1,14 @@
 package com.rongwei.bsserver.controller;
 
 
+import com.rongwei.bscommon.sys.service.ApsBlankOrderService;
+import com.rongwei.bsentity.vo.ApsPlanVo;
+import com.rongwei.bsentity.vo.ProductionScheduleRetVo;
+import com.rongwei.bsentity.vo.ProductionScheduleVo;
+import com.rongwei.rwcommon.base.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -16,5 +24,19 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/apsBlankOrder")
 public class ApsBlankOrderController {
 
+    @Autowired
+    private ApsBlankOrderService apsBlankOrderService;
+
+    /**
+     * 订单批量排程
+     * @param apsPlanVo
+     * @return
+     */
+    @PostMapping("/apsScheduling")
+    public R apsScheduling(@RequestBody ApsPlanVo apsPlanVo) throws Exception{
+        apsBlankOrderService.apsScheduling(apsPlanVo);
+        return R.ok();
+    }
+
 }
 

+ 20 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProcessOperationProcessEquController.java

@@ -0,0 +1,20 @@
+package com.rongwei.bsserver.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 生产订单-坯料计划-工序作业加工设备 前端控制器
+ * </p>
+ *
+ * @author fpy
+ * @since 2024-03-25
+ */
+@RestController
+@RequestMapping("/apsProcessOperationProcessEqu")
+public class ApsProcessOperationProcessEquController {
+
+}
+