Просмотр исходного кода

异常处理、device、warehouse、qualityInspectProgram

lumaojun 1 месяц назад
Родитель
Сommit
e5f0c1b01e

+ 32 - 2
easydo-mes/src/main/java/easydo/technology/config/exception/BizExceptionHandler.java

@@ -1,5 +1,6 @@
 package easydo.technology.config.exception;
 
+import easydo.technology.exception.BizException;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -19,6 +20,34 @@ import java.util.Map;
 @Log4j2
 public class BizExceptionHandler {
 
+    /**
+     * 处理业务异常 (BizException)
+     * 返回 400 错误
+     */
+    @ExceptionHandler(BizException.class)
+    public ResponseEntity<Object> handleBizException(BizException e) {
+        log.error("[ 业务异常捕获 ] " + e.getMessage());
+        Map<String, Object> vo = new HashMap<>();
+        vo.put("success", false);
+        vo.put("message", e.getMessage());
+        vo.put("error", "");
+        return new ResponseEntity<>(vo, HttpStatus.BAD_REQUEST);
+    }
+
+    /**
+     * 处理所有不可知的系统异常 (Exception)
+     * 返回 500 错误
+     */
+    @ExceptionHandler(Exception.class)
+    public ResponseEntity<Object> handleException(Exception e) {
+        log.error("[ 系统异常捕获 ] ", e);
+        Map<String, Object> vo = new HashMap<>();
+        vo.put("success", false);
+        vo.put("message", "系统错误");
+        vo.put("error", e.getMessage() != null ? e.getMessage() : e.getClass().getName());
+        return new ResponseEntity<>(vo, HttpStatus.INTERNAL_SERVER_ERROR);
+    }
+
     /**
      * 为 @NotNull / @NotEmpty / @NotBlank 提供异常后的消息抛出*
      * @param bindException
@@ -28,8 +57,9 @@ public class BizExceptionHandler {
     public ResponseEntity<Object> throwCustomException(BindException bindException){
         log.error("[ @Vaild异常捕获 ] " + bindException.getMessage());
         Map<String, Object> vo = new HashMap<>();
+        vo.put("success", false);
         vo.put("message", bindException.getBindingResult().getFieldError().getDefaultMessage());
-        vo.put("code", HttpStatus.BAD_REQUEST.value());
-        return new ResponseEntity(vo, HttpStatus.OK);
+        vo.put("error", "参数校验失败");
+        return new ResponseEntity<>(vo, HttpStatus.BAD_REQUEST);
     }
 }

+ 121 - 0
easydo-mes/src/main/java/easydo/technology/controller/DeviceController.java

@@ -0,0 +1,121 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.model.Device;
+import easydo.technology.service.FlowNoService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+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;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/device")
+public class DeviceController {
+
+    @Resource
+    private JdbcClient jdbcClient;
+
+    @Resource
+    private DataSource dataSource;
+
+    @Resource
+    FlowNoService flowNoService;
+
+    @PostMapping(value = "/getPage")
+    public Object getPage(@RequestBody(required = false) Map<String, Object> map) {
+        try {
+            if (map == null) {
+                map = new HashMap<>();
+            }
+            // 分页查询设备信息
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, Device.class);
+            if (page.get("records") == null) {
+                page.put("records", new java.util.ArrayList<>());
+            }
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @PostMapping(value = "/getList")
+    public Object getList(@RequestBody(required = false) Map<String, Object> map) {
+        try {
+            if (map == null) {
+                map = new HashMap<>();
+            }
+            // 全量查询设备信息
+            List<Device> list = jdbcClient.getJdbcList(map, Device.class);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @PostMapping(value = "/save")
+    public Object save(@RequestBody Device model) throws Exception {
+        Connection connection = dataSource.getConnection();
+        try {
+            connection.setAutoCommit(false); // 开启事务
+
+            // 对齐 Go 逻辑:直接新增记录,不处理自动编码生成
+            jdbcClient.jdbcInsert(model, connection);
+
+            connection.commit(); // 提交事务
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            if (connection != null) {
+                connection.rollback(); // 异常回滚
+            }
+            throw e;
+        } finally {
+            if (connection != null) {
+                connection.close();
+            }
+        }
+    }
+
+    @PostMapping(value = "/update")
+    public Object update(@RequestBody Device model) {
+        try {
+            // 根据ID修改设备信息
+            jdbcClient.jdbcUpdateById(model);
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @PostMapping(value = "/remove")
+    public Object remove(@RequestBody Device model) throws Exception {
+        Connection connection = dataSource.getConnection();
+        try {
+            connection.setAutoCommit(false); // 开启事务 (对齐Go版)
+
+            // 根据ID删除设备记录
+            jdbcClient.jdbcRemoveById(model, connection);
+
+            connection.commit(); // 提交事务
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            if (connection != null) {
+                connection.rollback();
+            }
+            throw e;
+        } finally {
+            if (connection != null) {
+                connection.close();
+            }
+        }
+    }
+}
+

+ 2 - 2
easydo-mes/src/main/java/easydo/technology/controller/ProcessRouteController.java

@@ -81,7 +81,7 @@ public class ProcessRouteController {
         try {
             connection.setAutoCommit(false);
             model.setCreateId(SecurityUtils.getCurrentUserId());
-            generateCode(model, connection);
+            model.setCode(flowNoService.generateProcessRouteCode(model, connection));
             model.setParentId("0");
             model.setStatus(MESEnum.PROCESS_OF_STATUS_ENABLE.getValue());
             jdbcClient.jdbcInsert(model, connection);
@@ -181,7 +181,7 @@ public class ProcessRouteController {
             jdbcClient.jdbcUpdate(childrenRoute, paramMap, connection);
 
             model.setCreateId(SecurityUtils.getCurrentUserId());
-            generateCode(model,connection);
+            model.setCode(flowNoService.generateProcessRouteCode(model, connection));
             model.setParentId("0");
             model.setId(newId);
             model.setStatus(MESEnum.PROCESS_OF_STATUS_ENABLE.getValue());

+ 1 - 1
easydo-mes/src/main/java/easydo/technology/controller/ProcessStageController.java

@@ -60,7 +60,7 @@ public class ProcessStageController {
             connection.setAutoCommit(false);
             model.setStatus(MESEnum.PROCESS_OF_STATUS_ENABLE.getValue());
             model.setCreateId(SecurityUtils.getCurrentUserId());
-            generateCode(model, connection);
+            model.setCode(flowNoService.generateProcessStageCode(model, connection));
             jdbcClient.jdbcInsert(model, connection);
             connection.commit();
             return new ResponseEntity<>(model, HttpStatus.OK);

+ 1 - 1
easydo-mes/src/main/java/easydo/technology/controller/QualityInspectProgramController.java

@@ -68,7 +68,7 @@ public class QualityInspectProgramController {
         Connection connection = dataSource.getConnection();
         try {
             connection.setAutoCommit(false);
-            generateCode(model, connection);
+            model.setCode(flowNoService.generateQualityCode(model, connection));
             jdbcClient.jdbcInsert(model, connection);
             connection.commit();
             return new ResponseEntity<>(model, HttpStatus.OK);

+ 125 - 0
easydo-mes/src/main/java/easydo/technology/controller/WarehouseController.java

@@ -0,0 +1,125 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.model.Warehouse;
+import easydo.technology.service.FlowNoService;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+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;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/warehouse")
+public class WarehouseController {
+
+    @Resource
+    private JdbcClient jdbcClient;
+
+    @Resource
+    private DataSource dataSource;
+
+    @Resource
+    private FlowNoService flowNoService;
+
+    @PostMapping(value = "/getPage")
+    public Object getPage(@RequestBody(required = false) Map<String, Object> map) {
+        try {
+            if (map == null) {
+                map = new HashMap<>();
+            }
+            // 分页查询仓库信息
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, Warehouse.class);
+            if (page.get("records") == null) {
+                page.put("records", new java.util.ArrayList<>());
+            }
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @PostMapping(value = "/getList")
+    public Object getList(@RequestBody(required = false) Map<String, Object> map) {
+        try {
+            if (map == null) {
+                map = new HashMap<>();
+            }
+            // 全量查询仓库信息
+            List<Warehouse> list = jdbcClient.getJdbcList(map, Warehouse.class);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @PostMapping(value = "/save")
+    public Object save(@RequestBody Warehouse model) throws Exception {
+        Connection connection = dataSource.getConnection();
+        try {
+            connection.setAutoCommit(false); // 开启事务
+
+            // 1) 调用面向对象的专用方法生成编码 (含细粒度锁、租户隔离、重复检查)
+            String code = flowNoService.generateWarehouseCode(model, connection);
+            model.setCode(code);
+
+            // 2) 插入仓库记录
+            jdbcClient.jdbcInsert(model, connection);
+
+            connection.commit(); // 提交事务
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            if (connection != null) {
+                connection.rollback(); // 发生异常回滚
+            }
+            throw e;
+        } finally {
+            if (connection != null) {
+                connection.close();
+            }
+        }
+    }
+
+    @PostMapping(value = "/update")
+    public Object update(@RequestBody Warehouse model) {
+        try {
+            // 根据 ID 修改仓库信息
+            jdbcClient.jdbcUpdateById(model);
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @PostMapping(value = "/remove")
+    public Object remove(@RequestBody Warehouse model) throws Exception {
+        Connection connection = dataSource.getConnection();
+        try {
+            connection.setAutoCommit(false); // 开启事务 (对齐 Go 版)
+
+            // 根据 ID 删除仓库记录
+            jdbcClient.jdbcRemoveById(model, connection);
+
+            connection.commit(); // 提交事务
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            if (connection != null) {
+                connection.rollback(); // 发生异常回滚
+            }
+            throw e;
+        } finally {
+            if (connection != null) {
+                connection.close();
+            }
+        }
+    }
+}
+

+ 17 - 0
easydo-mes/src/main/java/easydo/technology/model/Device.java

@@ -0,0 +1,17 @@
+package easydo.technology.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Device extends CommonModel {
+    private String id;
+    private String name;
+    private String code;
+    private String remark;
+    private LocalDateTime createTime;
+    private String tenantId;
+}
+

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

@@ -13,4 +13,6 @@ public class FlowNo {
     private String currNo;
 
     private Integer currSeq;
+
+    private String tenantId;
 }

+ 1 - 0
easydo-mes/src/main/java/easydo/technology/model/ProcessRoute.java

@@ -22,6 +22,7 @@ public class ProcessRoute extends CommonModel {
     private String remark;
     private String version;
     private String inspectProgramId;
+    private String tenantId;
 
     @NotTableField
     private List<ProcessRouteDetail> detailList;

+ 1 - 0
easydo-mes/src/main/java/easydo/technology/model/ProcessStage.java

@@ -21,6 +21,7 @@ public class ProcessStage extends CommonModel {
     private String createTime;
     private Long createId;
     private String status;
+    private String tenantId;
 }
 
 

+ 1 - 0
easydo-mes/src/main/java/easydo/technology/model/QualityInspectProgram.java

@@ -22,6 +22,7 @@ public class QualityInspectProgram extends CommonModel{
     private String createTime;
     private Integer sampleRate;
     private Integer passedRate;
+    private String tenantId;
 
     @NotTableField
     private String inspectUserName;

+ 19 - 0
easydo-mes/src/main/java/easydo/technology/model/Warehouse.java

@@ -0,0 +1,19 @@
+package easydo.technology.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Warehouse extends CommonModel {
+    private String id;
+    private String name;
+    private String code;
+    private Long createId;
+    private LocalDateTime createTime;
+    private String tenantId;
+    private Long updateId;
+    private LocalDateTime updateTime;
+}
+

+ 234 - 3
easydo-mes/src/main/java/easydo/technology/service/FlowNoService.java

@@ -2,7 +2,7 @@ package easydo.technology.service;
 
 import easydo.technology.components.JdbcClient;
 import easydo.technology.exception.BizException;
-import easydo.technology.model.FlowNo;
+import easydo.technology.model.*;
 import easydo.technology.utils.StringUtil;
 import org.springframework.stereotype.Service;
 
@@ -18,11 +18,242 @@ import java.util.Map;
 public class FlowNoService {
     private static final DateTimeFormatter DFY_MD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     private static final DateTimeFormatter DFY_MD_2 = DateTimeFormatter.ofPattern("yyyyMMdd");
+
     @Resource
-    JdbcClient jdbcClient;
+    private JdbcClient jdbcClient;
     @Resource
-    DataSource dataSource;
+    private DataSource dataSource;
+
+    // 为每个类定义独立的私有锁,实现细粒度并发控制 (Warehouse 锁 Warehouse)
+    private final Object warehouseLock = new Object();
+    private final Object qualityLock = new Object();
+    private final Object processStageLock = new Object();
+    private final Object processRouteLock = new Object();
+
+
+    /**
+     * 生成仓库编码 (Warehouse) - 独立解耦实现
+     */
+    public String generateWarehouseCode(Warehouse model, Connection connection) throws Exception {
+        synchronized (warehouseLock) {
+            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, Warehouse.class, connection);
+                if (count > 0) {
+                    throw new BizException("仓库编号已存在: " + manualCode);
+                }
+                return manualCode;
+            }
+            while (true) {
+                FlowNo flowNo = new FlowNo();
+                flowNo.setType("warehouse");
+                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", "warehouse");
+                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, Warehouse.class, connection);
+                if (count == 0) return no;
+            }
+        }
+    }
+
+    /**
+     * 生成质检方案编码 (QualityInspectProgram) - 独立解耦实现
+     */
+    public String generateQualityCode(QualityInspectProgram model, Connection connection) throws Exception {
+        synchronized (qualityLock) {
+            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, QualityInspectProgram.class, connection);
+                if (count > 0) {
+                    throw new BizException("质检编号已存在: " + manualCode);
+                }
+                return manualCode;
+            }
+            while (true) {
+                FlowNo flowNo = new FlowNo();
+                flowNo.setType("quality_inspect_program");
+                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", "quality_inspect_program");
+                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, QualityInspectProgram.class, connection);
+                if (count == 0) return no;
+            }
+        }
+    }
+
+    /**
+     * 生成工序管理编码 (ProcessStage) - 独立解耦实现
+     */
+    public String generateProcessStageCode(ProcessStage model, Connection connection) throws Exception {
+        synchronized (processStageLock) {
+            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, ProcessStage.class, connection);
+                if (count > 0) {
+                    throw new BizException("工序编号已存在: " + manualCode);
+                }
+                return manualCode;
+            }
+            while (true) {
+                FlowNo flowNo = new FlowNo();
+                flowNo.setType("process_stage");
+                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", "process_stage");
+                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, ProcessStage.class, connection);
+                if (count == 0) return no;
+            }
+        }
+    }
+
+    /**
+     * 生成工艺路线编码 (ProcessRoute) - 独立解耦实现
+     */
+    public String generateProcessRouteCode(ProcessRoute model, Connection connection) throws Exception {
+        synchronized (processRouteLock) {
+            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, ProcessRoute.class, connection);
+                if (count > 0) {
+                    throw new BizException("工艺路线编号已存在: " + manualCode);
+                }
+                return manualCode;
+            }
+            while (true) {
+                FlowNo flowNo = new FlowNo();
+                flowNo.setType("process_route");
+                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", "process_route");
+                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, ProcessRoute.class, connection);
+                if (count == 0) return no;
+            }
+        }
+    }
 
+    /**
+     * 原始流水号生成方法
+     */
     public String getFlowNo(String type, Connection... connections) throws Exception {
         Connection connection = null;
         if (connections.length > 0) {