lumaojun преди 3 седмици
родител
ревизия
ea2bfc952b

+ 62 - 0
easydo-mes/src/main/java/easydo/technology/controller/ProductOrderController.java

@@ -0,0 +1,62 @@
+package easydo.technology.controller;
+
+import easydo.technology.model.ProductOrder;
+import easydo.technology.service.ProductOrderService;
+import easydo.technology.utils.SecurityUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/productOrder")
+public class ProductOrderController {
+
+    @Resource
+    private ProductOrderService productOrderService;
+
+    /**
+     * 分页查询工单列表
+     */
+    @PostMapping("/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) throws Exception {
+        // 校验用户登录状态
+        Long userId = SecurityUtils.getCurrentUserId();
+        
+        Map<String, Object> result = productOrderService.getPage(map);
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    /**
+     * 保存工单
+     */
+    @PostMapping("/save")
+    public Object save(@RequestBody ProductOrder model) throws Exception {
+        Long userId = SecurityUtils.getCurrentUserId();
+        model.setCreateId(userId);
+        return new ResponseEntity<>(productOrderService.save(model), HttpStatus.OK);
+    }
+
+    /**
+     * 更新工单
+     */
+    @PostMapping("/update")
+    public Object update(@RequestBody ProductOrder model) throws Exception {
+        Long userId = SecurityUtils.getCurrentUserId();
+        model.setUpdateId(userId);
+        return new ResponseEntity<>(productOrderService.update(model), HttpStatus.OK);
+    }
+
+    /**
+     * 删除工单
+     */
+    @PostMapping("/remove")
+    public Object remove(@RequestBody ProductOrder model) throws Exception {
+        // 校验用户登录状态
+        Long userId = SecurityUtils.getCurrentUserId();
+        
+        return new ResponseEntity<>(productOrderService.remove(model), HttpStatus.OK);
+    }
+}

+ 10 - 0
easydo-mes/src/main/java/easydo/technology/enums/MESEnum.java

@@ -64,11 +64,21 @@ public enum MESEnum {
     SALE_ORDER_OF_STATUS_COMPLETE("complete", "已完成"),
 
     FLOW_NO_TYPE_PRODUCT_PLAN("product_plan", "生产计划"),
+    FLOW_NO_TYPE_PRODUCT_ORDER("product_order", "工单"),
 
     PRODUCT_PLAN_OF_STATUS_PENDING("pending", "待进行"),
     PRODUCT_PLAN_OF_STATUS_PROCESSING("processing", "进行中"),
     PRODUCT_PLAN_OF_STATUS_COMPLETE("complete", "已完成"),
     
+    PRODUCT_ORDER_OF_STATUS_PENDING("pending", "待进行"),
+    PRODUCT_ORDER_OF_STATUS_PROCESSING("processing", "进行中"),
+    PRODUCT_ORDER_OF_STATUS_COMPLETE("complete", "已完成"),
+    
+    PRODUCT_ORDER_OF_PRIORITY_URGENT("urgent", "紧急"),
+    PRODUCT_ORDER_OF_PRIORITY_HIGH("high", "高"),
+    PRODUCT_ORDER_OF_PRIORITY_MEDIUM("medium", "中"),
+    PRODUCT_ORDER_OF_PRIORITY_LOW("low", "低"),
+    
     PURCHASE_PLAN_OF_STATUS_PENDING("pending", "待进行"),
     PURCHASE_PLAN_OF_STATUS_PROCESSING("processing", "进行中"),
     PURCHASE_PLAN_OF_STATUS_COMPLETE("complete", "已完成"),

+ 37 - 0
easydo-mes/src/main/java/easydo/technology/model/ProductOrder.java

@@ -0,0 +1,37 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.Minio;
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Minio
+public class ProductOrder extends CommonModel {
+    private String id;
+    private String planId;
+    private String code;
+    private String name;
+    private String beginDate;
+    private String endDate;
+    private String finishDate;
+    private String status;
+    private String saleOrderId;
+    private String remark;
+    private String createTime;
+    private String updateTime;
+    private Long createId;
+    private String tenantId;
+    private Long updateId;
+    private String priority;
+
+    @NotTableField
+    private ProductPlan productPlan;
+    @NotTableField
+    private List<ProductOrderBom> bomList;
+    @NotTableField
+    private List<ProductOrderDevice> deviceList;
+}

+ 27 - 0
easydo-mes/src/main/java/easydo/technology/model/ProductOrderBom.java

@@ -0,0 +1,27 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProductOrderBom extends CommonModel {
+    private String id;
+    private String orderId;
+    private String bomId;
+    private String routeId;
+    private Double number;
+    private String createTime;
+    private String inspectProgramId;
+    private String status;
+    private Double finishNumber;
+    private String toWarehouseId;
+
+    @NotTableField
+    private ProductBom productBom;
+    @NotTableField
+    private ProcessRoute processRoute;
+    @NotTableField
+    private QualityInspectProgram inspectProgram;
+}

+ 18 - 0
easydo-mes/src/main/java/easydo/technology/model/ProductOrderDevice.java

@@ -0,0 +1,18 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProductOrderDevice extends CommonModel {
+    private String id;
+    private String orderId;
+    private String deviceId;
+    private String createTime;
+    private String status;
+
+    @NotTableField
+    private Device device;
+}

+ 57 - 0
easydo-mes/src/main/java/easydo/technology/service/FlowNoService.java

@@ -38,6 +38,7 @@ public class FlowNoService {
     private final Object outsourcingPlanLock = new Object();
     private final Object productPlanLock = new Object();
     private final Object purchaseOrderLock = new Object();
+    private final Object productOrderLock = new Object();
 
 
     /**
@@ -704,6 +705,62 @@ public class FlowNoService {
         }
     }
 
+    /**
+     * 生成工单编码 (ProductOrder) - 独立解耦实现
+     */
+    public String generateProductOrderCode(ProductOrder model, Connection connection) throws Exception {
+        synchronized (productOrderLock) {
+            String manualCode = model.getCode();
+            String tenantId = model.getTenantId();
+            if (StringUtil.isNotEmpty(manualCode)) {
+                Map<String, Object> checkMap = new HashMap<>();
+                checkMap.put("code", manualCode);
+                checkMap.put("tenantId", tenantId);
+                int count = (int) jdbcClient.getJdbcCountByMap(checkMap, ProductOrder.class, connection);
+                if (count > 0) {
+                    throw new BizException("工单编号已存在: " + manualCode);
+                }
+                return manualCode;
+            }
+
+            while (true) {
+                FlowNo flowNo = new FlowNo();
+                flowNo.setType(MESEnum.FLOW_NO_TYPE_PRODUCT_ORDER.getValue());
+                flowNo.setTenantId(tenantId);
+                flowNo = jdbcClient.getJdbcModel(flowNo, connection);
+                if (flowNo == null) throw new BizException("未配置工单流水号规则");
+
+                String currDate = DFY_MD.format(LocalDateTime.now());
+                String currDate2 = DFY_MD_2.format(LocalDateTime.now());
+                if (StringUtil.isEmpty(flowNo.getCurrDate()) || !flowNo.getCurrDate().equals(currDate)) {
+                    flowNo.setCurrDate(currDate);
+                    flowNo.setCurrSeq(1);
+                } else {
+                    flowNo.setCurrSeq(flowNo.getCurrSeq() + 1);
+                }
+
+                String no;
+                if (StringUtil.isEmpty(flowNo.getCurrDate())) {
+                    no = (flowNo.getPrefix() != null ? flowNo.getPrefix() : "") + String.format("%06d", flowNo.getCurrSeq());
+                } else {
+                    no = (flowNo.getPrefix() != null ? flowNo.getPrefix() : "") + currDate2 + String.format("%05d", flowNo.getCurrSeq());
+                }
+                flowNo.setCurrNo(no);
+
+                Map<String, Object> updateMap = new HashMap<>();
+                updateMap.put("type", MESEnum.FLOW_NO_TYPE_PRODUCT_ORDER.getValue());
+                updateMap.put("tenantId", tenantId);
+                jdbcClient.jdbcUpdate(flowNo, updateMap, connection);
+
+                Map<String, Object> checkMap = new HashMap<>();
+                checkMap.put("code", no);
+                checkMap.put("tenantId", tenantId);
+                int count = (int) jdbcClient.getJdbcCountByMap(checkMap, ProductOrder.class, connection);
+                if (count == 0) return no;
+            }
+        }
+    }
+
     /**
      * 原始流水号生成方法
      */

+ 28 - 0
easydo-mes/src/main/java/easydo/technology/service/ProductOrderService.java

@@ -0,0 +1,28 @@
+package easydo.technology.service;
+
+import easydo.technology.model.ProductOrder;
+
+import java.util.Map;
+
+public interface ProductOrderService {
+    
+    /**
+     * 分页查询工单列表
+     */
+    Map<String, Object> getPage(Map<String, Object> map) throws Exception;
+    
+    /**
+     * 保存工单
+     */
+    ProductOrder save(ProductOrder model) throws Exception;
+    
+    /**
+     * 更新工单
+     */
+    ProductOrder update(ProductOrder model) throws Exception;
+    
+    /**
+     * 删除工单
+     */
+    ProductOrder remove(ProductOrder model) throws Exception;
+}

+ 266 - 0
easydo-mes/src/main/java/easydo/technology/service/impl/ProductOrderServiceImpl.java

@@ -0,0 +1,266 @@
+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.FlowNoService;
+import easydo.technology.service.ProductOrderService;
+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 ProductOrderServiceImpl implements ProductOrderService {
+
+    @Resource
+    private JdbcClient jdbcClient;
+    @Resource
+    private DataSource dataSource;
+    @Resource
+    private FlowNoService flowNoService;
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Map<String, Object> getPage(Map<String, Object> map) throws Exception {
+        Connection connection = dataSource.getConnection();
+        try {
+            // 1) 查询工单分页数据
+            Map<String, Object> result = jdbcClient.getJdbcPage(map, ProductOrder.class, connection);
+            List<ProductOrder> list = (List<ProductOrder>) result.get("records");
+            if (list == null || list.isEmpty()) {
+                return result;
+            }
+
+            for (ProductOrder model : list) {
+                // 2) 查询并回填工单的附件
+                jdbcClient.getMinioFile(model, connection);
+
+                // 3) 查询并回填关联生产计划
+                if (model.getPlanId() != null) {
+                    ProductPlan planParam = new ProductPlan();
+                    planParam.setId(model.getPlanId());
+                    ProductPlan plan = jdbcClient.getJdbcModelById(planParam, connection);
+                    model.setProductPlan(plan);
+                }
+
+                // 4) 查询并回填工单 BOM 列表
+                ProductOrderBom bomParam = new ProductOrderBom();
+                bomParam.setOrderId(model.getId());
+                List<ProductOrderBom> bomList = jdbcClient.getJdbcList(bomParam, connection);
+                if (bomList != null) {
+                    for (ProductOrderBom orderBom : bomList) {
+                        // 4.1) 工艺路线
+                        if (orderBom.getRouteId() != null) {
+                            ProcessRoute routeParam = new ProcessRoute();
+                            routeParam.setId(orderBom.getRouteId());
+                            orderBom.setProcessRoute(jdbcClient.getJdbcModelById(routeParam, connection));
+                        }
+                        // 4.2) 质检方案
+                        if (orderBom.getInspectProgramId() != null) {
+                            QualityInspectProgram programParam = new QualityInspectProgram();
+                            programParam.setId(orderBom.getInspectProgramId());
+                            orderBom.setInspectProgram(jdbcClient.getJdbcModelById(programParam, connection));
+                        }
+                        // 4.3) 产品 BOM
+                        if (orderBom.getBomId() != null) {
+                            ProductBom productBomParam = new ProductBom();
+                            productBomParam.setId(orderBom.getBomId());
+                            ProductBom productBom = jdbcClient.getJdbcModelById(productBomParam, connection);
+                            
+                            // 4.3.1) 查询 ProductBom 的物料信息
+                            if (productBom != null && productBom.getMaterialCode() != null) {
+                                ProductMaterial materialParam = new ProductMaterial();
+                                materialParam.setCode(productBom.getMaterialCode());
+                                productBom.setMaterial(jdbcClient.getJdbcModel(materialParam, connection));
+                            }
+                            
+                            orderBom.setProductBom(productBom);
+                        }
+                    }
+                }
+                model.setBomList(bomList);
+
+                // 5) 查询并回填工单设备列表
+                ProductOrderDevice deviceParam = new ProductOrderDevice();
+                deviceParam.setOrderId(model.getId());
+                List<ProductOrderDevice> deviceList = jdbcClient.getJdbcList(deviceParam, connection);
+                if (deviceList != null) {
+                    for (ProductOrderDevice orderDevice : deviceList) {
+                        if (orderDevice.getDeviceId() != null) {
+                            Device deviceModel = new Device();
+                            deviceModel.setId(orderDevice.getDeviceId());
+                            orderDevice.setDevice(jdbcClient.getJdbcModelById(deviceModel, connection));
+                        }
+                    }
+                }
+                model.setDeviceList(deviceList);
+            }
+
+            return result;
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            connection.close();
+        }
+    }
+
+    @Override
+    public ProductOrder save(ProductOrder model) throws Exception {
+        Connection connection = dataSource.getConnection();
+        connection.setAutoCommit(false);
+        try {
+            // 1) 生成编码(支持手填校验 + 自动生成)
+            String code = flowNoService.generateProductOrderCode(model, connection);
+            model.setCode(code);
+
+            // 2) 设置初始状态为 pending
+            model.setStatus(MESEnum.PRODUCT_ORDER_OF_STATUS_PENDING.getValue());
+
+            // 3) 插入主表(会自动保存附件 fileList)
+            jdbcClient.jdbcInsert(model, connection);
+
+            // 4) 插入 BOM 列表
+            List<ProductOrderBom> bomList = model.getBomList();
+            if (bomList != null) {
+                for (ProductOrderBom bom : bomList) {
+                    bom.setOrderId(model.getId());
+                    
+                    // 根据 bomId 查询 product_bom 表获取工艺路线ID
+                    if (bom.getBomId() != null) {
+                        ProductBom productBomParam = new ProductBom();
+                        productBomParam.setId(bom.getBomId());
+                        ProductBom productBom = jdbcClient.getJdbcModelById(productBomParam, connection);
+                        if (productBom != null && productBom.getRouteId() != null) {
+                            bom.setRouteId(productBom.getRouteId());
+                            
+                            // 根据工艺路线ID查询工艺路线表获取质检方案ID
+                            ProcessRoute processRouteParam = new ProcessRoute();
+                            processRouteParam.setId(productBom.getRouteId());
+                            ProcessRoute processRoute = jdbcClient.getJdbcModelById(processRouteParam, connection);
+                            if (processRoute != null && processRoute.getInspectProgramId() != null) {
+                                bom.setInspectProgramId(processRoute.getInspectProgramId());
+                            }
+                        }
+                    }
+                    
+                    jdbcClient.jdbcInsert(bom, connection);
+                }
+            }
+
+            // 5) 插入设备列表
+            List<ProductOrderDevice> deviceList = model.getDeviceList();
+            if (deviceList != null) {
+                for (ProductOrderDevice device : deviceList) {
+                    device.setOrderId(model.getId());
+                    jdbcClient.jdbcInsert(device, connection);
+                }
+            }
+
+            connection.commit();
+            return model;
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            connection.close();
+        }
+    }
+
+    @Override
+    public ProductOrder update(ProductOrder model) throws Exception {
+        Connection connection = dataSource.getConnection();
+        connection.setAutoCommit(false);
+        try {
+            // 1) 更新主表(会自动保存附件 fileList)
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            // 2) 删除旧 BOM 列表
+            ProductOrderBom bomRemoveParam = new ProductOrderBom();
+            bomRemoveParam.setOrderId(model.getId());
+            jdbcClient.jdbcRemove(bomRemoveParam, connection);
+
+            // 3) 插入新 BOM 列表
+            List<ProductOrderBom> bomList = model.getBomList();
+            if (bomList != null) {
+                for (ProductOrderBom bom : bomList) {
+                    bom.setOrderId(model.getId());
+                    
+                    // 根据 bomId 查询 product_bom 表获取工艺路线ID
+                    if (bom.getBomId() != null) {
+                        ProductBom productBomParam = new ProductBom();
+                        productBomParam.setId(bom.getBomId());
+                        ProductBom productBom = jdbcClient.getJdbcModelById(productBomParam, connection);
+                        if (productBom != null && productBom.getRouteId() != null) {
+                            bom.setRouteId(productBom.getRouteId());
+                            
+                            // 根据工艺路线ID查询工艺路线表获取质检方案ID
+                            ProcessRoute processRouteParam = new ProcessRoute();
+                            processRouteParam.setId(productBom.getRouteId());
+                            ProcessRoute processRoute = jdbcClient.getJdbcModelById(processRouteParam, connection);
+                            if (processRoute != null && processRoute.getInspectProgramId() != null) {
+                                bom.setInspectProgramId(processRoute.getInspectProgramId());
+                            }
+                        }
+                    }
+                    
+                    jdbcClient.jdbcInsert(bom, connection);
+                }
+            }
+
+            // 4) 删除旧设备列表
+            ProductOrderDevice deviceRemoveParam = new ProductOrderDevice();
+            deviceRemoveParam.setOrderId(model.getId());
+            jdbcClient.jdbcRemove(deviceRemoveParam, connection);
+
+            // 5) 插入新设备列表
+            List<ProductOrderDevice> deviceList = model.getDeviceList();
+            if (deviceList != null) {
+                for (ProductOrderDevice device : deviceList) {
+                    device.setOrderId(model.getId());
+                    jdbcClient.jdbcInsert(device, connection);
+                }
+            }
+
+            connection.commit();
+            return model;
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            connection.close();
+        }
+    }
+
+    @Override
+    public ProductOrder remove(ProductOrder model) throws Exception {
+        Connection connection = dataSource.getConnection();
+        connection.setAutoCommit(false);
+        try {
+            // 1) 删除主表(JdbcClient 会自动删除附件)
+            jdbcClient.jdbcRemoveById(model, connection);
+
+            // 2) 删除 BOM 列表
+            ProductOrderBom bomRemoveParam = new ProductOrderBom();
+            bomRemoveParam.setOrderId(model.getId());
+            jdbcClient.jdbcRemove(bomRemoveParam, connection);
+
+            // 3) 删除设备列表
+            ProductOrderDevice deviceRemoveParam = new ProductOrderDevice();
+            deviceRemoveParam.setOrderId(model.getId());
+            jdbcClient.jdbcRemove(deviceRemoveParam, connection);
+
+            connection.commit();
+            return model;
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            connection.close();
+        }
+    }
+}