Przeglądaj źródła

fix:预生产计划

lumaojun 1 miesiąc temu
rodzic
commit
4d86ce58d8

+ 26 - 0
easydo-mes/src/main/java/easydo/technology/controller/ProductPrePlanController.java

@@ -0,0 +1,26 @@
+package easydo.technology.controller;
+
+import easydo.technology.service.ProductPrePlanService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/productPrePlan")
+public class ProductPrePlanController {
+
+    @Resource
+    private ProductPrePlanService productPrePlanService;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) throws Exception {
+        Map<String, Object> result = productPrePlanService.getPage(map);
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+}
+

+ 2 - 0
easydo-mes/src/main/java/easydo/technology/model/ProductBom.java

@@ -31,6 +31,8 @@ public class ProductBom extends CommonModel{
     @NotTableField
     private ProductMaterial material;
     @NotTableField
+    private List<WarehouseMaterial> warehouseMaterialList;
+    @NotTableField
     private List<ProductBom> childrenList;
     @NotTableField
     private Boolean isHaveChildren = false;

+ 5 - 0
easydo-mes/src/main/java/easydo/technology/model/SaleOrderDetail.java

@@ -4,6 +4,7 @@ import easydo.technology.annotation.NotTableField;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 public class SaleOrderDetail {
@@ -16,4 +17,8 @@ public class SaleOrderDetail {
 
     @NotTableField
     private ProductMaterial material;
+    @NotTableField
+    private List<ProductBom> bomList;
+    @NotTableField
+    private List<WarehouseMaterial> warehouseMaterialList;
 }

+ 21 - 0
easydo-mes/src/main/java/easydo/technology/model/WarehouseMaterial.java

@@ -0,0 +1,21 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class WarehouseMaterial extends CommonModel {
+    private String id;
+    private String warehouseId;
+    private String materialCode;
+    private Double number;
+    private String createTime;
+    private String status;
+    private String tenantId;
+
+    @NotTableField
+    private Warehouse warehouse;
+}
+

+ 8 - 0
easydo-mes/src/main/java/easydo/technology/service/ProductPrePlanService.java

@@ -0,0 +1,8 @@
+package easydo.technology.service;
+
+import java.util.Map;
+
+public interface ProductPrePlanService {
+    Map<String, Object> getPage(Map<String, Object> map) throws Exception;
+}
+

+ 16 - 0
easydo-mes/src/main/java/easydo/technology/service/impl/ProductPlanServiceImpl.java

@@ -24,8 +24,11 @@ public class ProductPlanServiceImpl implements ProductPlanService {
     @Override
     @SuppressWarnings("unchecked")
     public Map<String, Object> getPage(Map<String, Object> map) throws Exception {
+        // 说明:该接口按 Go 版本的实现方式进行 1:1 同步,采用“分页查询 + 循环逐条补齐关联数据”的方式组装返回结果。
+        // 注意:这种写法会产生较多的数据库访问(N+1 查询),但可以确保前端一次请求拿到完整的数据树结构。
         Connection connection = dataSource.getConnection();
         try {
+            // 1) 查询生产计划分页数据(基础字段来自 product_plan 表)
             Map<String, Object> result = jdbcClient.getJdbcPage(map, ProductPlan.class, connection);
             List<ProductPlan> list = (List<ProductPlan>) result.get("records");
             if (list == null || list.isEmpty()) {
@@ -33,46 +36,57 @@ public class ProductPlanServiceImpl implements ProductPlanService {
             }
 
             for (ProductPlan model : list) {
+                // 2) 查询并回填生产计划的附件(Minio 文件列表)
                 jdbcClient.getMinioFile(model, connection);
 
+                // 3) 查询并回填关联销售订单(SaleOrder)及其附件、明细、明细物料信息
                 if (model.getSaleOrderId() != null) {
+                    // 3.1) 按 saleOrderId 查询销售订单主表
                     SaleOrder saleOrderParam = new SaleOrder();
                     saleOrderParam.setId(model.getSaleOrderId());
                     SaleOrder saleOrder = jdbcClient.getJdbcModelById(saleOrderParam, connection);
                     if (saleOrder != null) {
+                        // 3.2) 查询并回填销售订单附件
                         jdbcClient.getMinioFile(saleOrder, connection);
 
+                        // 3.3) 查询销售订单明细(SaleOrderDetail 列表)
                         SaleOrderDetail detailParam = new SaleOrderDetail();
                         detailParam.setOrderId(saleOrder.getId());
                         List<SaleOrderDetail> detailList = jdbcClient.getJdbcList(detailParam, connection);
                         if (detailList != null) {
                             for (SaleOrderDetail detail : detailList) {
+                                // 3.4) 对每条明细查询物料信息(ProductMaterial)并回填到 detail.material
                                 ProductMaterial materialParam = new ProductMaterial();
                                 materialParam.setCode(detail.getMaterialCode());
                                 ProductMaterial material = jdbcClient.getJdbcModel(materialParam, connection);
                                 detail.setMaterial(material);
                             }
                         }
+                        // 3.5) 将明细列表回填到 saleOrder.childrenList,并将 saleOrder 回填到 plan.saleOrder
                         saleOrder.setChildrenList(detailList);
                         model.setSaleOrder(saleOrder);
                     }
                 }
 
+                // 4) 查询并回填计划 BOM 列表(ProductPlanBom),并补齐其关联:工艺路线/质检方案/产品BOM
                 ProductPlanBom bomParam = new ProductPlanBom();
                 bomParam.setPlanId(model.getId());
                 List<ProductPlanBom> bomList = jdbcClient.getJdbcList(bomParam, connection);
                 if (bomList != null) {
                     for (ProductPlanBom planBom : bomList) {
+                        // 4.1) 工艺路线(ProcessRoute)
                         if (planBom.getRouteId() != null) {
                             ProcessRoute routeParam = new ProcessRoute();
                             routeParam.setId(planBom.getRouteId());
                             planBom.setProcessRoute(jdbcClient.getJdbcModelById(routeParam, connection));
                         }
+                        // 4.2) 质检方案(QualityInspectProgram)
                         if (planBom.getInspectProgramId() != null) {
                             QualityInspectProgram programParam = new QualityInspectProgram();
                             programParam.setId(planBom.getInspectProgramId());
                             planBom.setInspectProgram(jdbcClient.getJdbcModelById(programParam, connection));
                         }
+                        // 4.3) 产品 BOM(ProductBom)
                         if (planBom.getBomId() != null) {
                             ProductBom productBomParam = new ProductBom();
                             productBomParam.setId(planBom.getBomId());
@@ -82,6 +96,7 @@ public class ProductPlanServiceImpl implements ProductPlanService {
                 }
                 model.setBomList(bomList);
 
+                // 5) 查询并回填计划设备列表(ProductPlanDevice),并补齐设备基础信息(Device)
                 ProductPlanDevice deviceParam = new ProductPlanDevice();
                 deviceParam.setPlanId(model.getId());
                 List<ProductPlanDevice> deviceList = jdbcClient.getJdbcList(deviceParam, connection);
@@ -96,6 +111,7 @@ public class ProductPlanServiceImpl implements ProductPlanService {
                 }
                 model.setDeviceList(deviceList);
 
+                // 6) 查询并回填计划人员列表(ProductPlanUser),并补齐人员信息(SysUser)
                 ProductPlanUser userParam = new ProductPlanUser();
                 userParam.setPlanId(model.getId());
                 List<ProductPlanUser> userList = jdbcClient.getJdbcList(userParam, connection);

+ 156 - 0
easydo-mes/src/main/java/easydo/technology/service/impl/ProductPrePlanServiceImpl.java

@@ -0,0 +1,156 @@
+package easydo.technology.service.impl;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.enums.MESEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.*;
+import easydo.technology.service.ProductPrePlanService;
+import easydo.technology.system.model.SysUser;
+import easydo.technology.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class ProductPrePlanServiceImpl implements ProductPrePlanService {
+
+    @Resource
+    private JdbcClient jdbcClient;
+    @Resource
+    private DataSource dataSource;
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Map<String, Object> getPage(Map<String, Object> map) throws Exception {
+        // 说明:该接口同步自 Go 端的 productPrePlanGetPage 逻辑,基于销售订单(SaleOrder)维度进行深度级联查询和组装。
+        // 注意:这种 1:1 对齐方式涉及多层嵌套循环查询(N+1),在数据量较大时需关注性能。
+        Connection connection = dataSource.getConnection();
+        try {
+            // 1) 查询销售订单分页数据
+            Map<String, Object> result = jdbcClient.getJdbcPage(map, SaleOrder.class, connection);
+            List<SaleOrder> list = (List<SaleOrder>) result.get("records");
+            if (list == null || list.isEmpty()) {
+                return result;
+            }
+
+            for (SaleOrder model : list) {
+                // 2) 查询并回填销售订单附件(Minio 文件)
+                jdbcClient.getMinioFile(model, connection);
+
+                // 3) 查询并回填订单明细列表(SaleOrderDetail)
+                SaleOrderDetail detailParam = new SaleOrderDetail();
+                detailParam.setOrderId(model.getId());
+                List<SaleOrderDetail> detailList = jdbcClient.getJdbcList(detailParam, connection);
+
+                if (detailList != null) {
+                    for (SaleOrderDetail detail : detailList) {
+                        // 3.1) 查询并回填明细对应的物料基础信息(ProductMaterial)
+                        ProductMaterial materialParam = new ProductMaterial();
+                        materialParam.setCode(detail.getMaterialCode());
+                        materialParam.setTenantId(model.getTenantId());
+                        ProductMaterial material = jdbcClient.getJdbcModel(materialParam, connection);
+                        detail.setMaterial(material);
+
+                        // 3.2) 查询该物料是否存在启用的顶级 BOM(parentId = 0)
+                        ProductBom bomParam = new ProductBom();
+                        bomParam.setParentId("0");
+                        bomParam.setMaterialCode(material.getCode());
+                        bomParam.setTenantId(model.getTenantId());
+                        bomParam.setStatus(MESEnum.PROCESS_OF_STATUS_ENABLE.getValue());
+                        ProductBom topBom = null;
+                        try {
+                            topBom = jdbcClient.getJdbcModel(bomParam, connection);
+                        } catch (Exception ex) {
+                            // 若未找到对应的 BOM,则 topBom 保持为 null
+                        }
+
+                        if (topBom != null && StringUtil.isNotEmpty(topBom.getId())) {
+                            // 3.3) 分支 A:存在 BOM,则按 bomCode 查询出该 BOM 下的所有组成项
+                            ProductBom bomListParam = new ProductBom();
+                            bomListParam.setBomCode(topBom.getBomCode());
+                            bomListParam.setTenantId(model.getTenantId());
+                            List<ProductBom> bomList = jdbcClient.getJdbcList(bomListParam, connection);
+
+                            if (bomList != null) {
+                                for (ProductBom bomModel : bomList) {
+                                    // 3.3.1) 查询并回填 BOM 组成项的物料信息
+                                    ProductMaterial bmMaterialParam = new ProductMaterial();
+                                    bmMaterialParam.setCode(bomModel.getMaterialCode());
+                                    bmMaterialParam.setTenantId(model.getTenantId());
+                                    ProductMaterial bmMaterial = jdbcClient.getJdbcModel(bmMaterialParam, connection);
+                                    bomModel.setMaterial(bmMaterial);
+
+                                    // 3.3.2) 查询并回填该物料在所有仓库中的可用库存(WarehouseMaterial)
+                                    WarehouseMaterial wmParam = new WarehouseMaterial();
+                                    wmParam.setMaterialCode(bmMaterial.getCode());
+                                    wmParam.setTenantId(model.getTenantId());
+                                    wmParam.setStatus(MESEnum.PROCESS_OF_STATUS_ENABLE.getValue());
+                                    List<WarehouseMaterial> wmList = jdbcClient.getJdbcList(wmParam, connection);
+                                    if (wmList != null) {
+                                        for (WarehouseMaterial wm : wmList) {
+                                            // 同时回填仓库的基础信息(Warehouse)
+                                            Warehouse wParam = new Warehouse();
+                                            wParam.setId(wm.getWarehouseId());
+                                            wm.setWarehouse(jdbcClient.getJdbcModelById(wParam, connection));
+                                        }
+                                    }
+                                    bomModel.setWarehouseMaterialList(wmList);
+                                }
+                            }
+                            detail.setBomList(bomList);
+                        } else {
+                            // 3.4) 分支 B:不存在 BOM,则直接查询该明细物料的可用库存信息
+                            WarehouseMaterial wmParam = new WarehouseMaterial();
+                            wmParam.setMaterialCode(material.getCode());
+                            wmParam.setTenantId(model.getTenantId());
+                            wmParam.setStatus(MESEnum.PROCESS_OF_STATUS_ENABLE.getValue());
+                            List<WarehouseMaterial> wmList = jdbcClient.getJdbcList(wmParam, connection);
+                            if (wmList != null) {
+                                for (WarehouseMaterial wm : wmList) {
+                                    Warehouse wParam = new Warehouse();
+                                    wParam.setId(wm.getWarehouseId());
+                                    wm.setWarehouse(jdbcClient.getJdbcModelById(wParam, connection));
+                                }
+                            }
+                            detail.setWarehouseMaterialList(wmList);
+                        }
+                    }
+                }
+
+                // 4) 将组装好的明细列表回填给订单
+                model.setChildrenList(detailList);
+
+                // 5) 查询并回填负责人姓名(来自 sys_user)
+                if (model.getManagerId() != null && model.getManagerId() != 0) {
+                    SysUser managerParam = new SysUser();
+                    managerParam.setId(model.getManagerId());
+                    SysUser manager = jdbcClient.getJdbcModelById(managerParam, connection);
+                    if (manager != null) {
+                        model.setManagerName(manager.getNickName());
+                    }
+                }
+
+                // 6) 查询并回填客户名称(来自 customer 表)
+                if (StringUtil.isNotEmpty(model.getCustomerId())) {
+                    Customer customerParam = new Customer();
+                    customerParam.setId(model.getCustomerId());
+                    Customer customer = jdbcClient.getJdbcModelById(customerParam, connection);
+                    if (customer != null) {
+                        model.setCustomerName(customer.getName());
+                    }
+                }
+            }
+
+            return result;
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            connection.close();
+        }
+    }
+}
+