|
@@ -2,7 +2,7 @@ package easydo.technology.service;
|
|
|
|
|
|
|
|
import easydo.technology.components.JdbcClient;
|
|
import easydo.technology.components.JdbcClient;
|
|
|
import easydo.technology.exception.BizException;
|
|
import easydo.technology.exception.BizException;
|
|
|
-import easydo.technology.model.FlowNo;
|
|
|
|
|
|
|
+import easydo.technology.model.*;
|
|
|
import easydo.technology.utils.StringUtil;
|
|
import easydo.technology.utils.StringUtil;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
@@ -18,11 +18,242 @@ import java.util.Map;
|
|
|
public class FlowNoService {
|
|
public class FlowNoService {
|
|
|
private static final DateTimeFormatter DFY_MD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
private static final DateTimeFormatter DFY_MD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
private static final DateTimeFormatter DFY_MD_2 = DateTimeFormatter.ofPattern("yyyyMMdd");
|
|
private static final DateTimeFormatter DFY_MD_2 = DateTimeFormatter.ofPattern("yyyyMMdd");
|
|
|
|
|
+
|
|
|
@Resource
|
|
@Resource
|
|
|
- JdbcClient jdbcClient;
|
|
|
|
|
|
|
+ private JdbcClient jdbcClient;
|
|
|
@Resource
|
|
@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 {
|
|
public String getFlowNo(String type, Connection... connections) throws Exception {
|
|
|
Connection connection = null;
|
|
Connection connection = null;
|
|
|
if (connections.length > 0) {
|
|
if (connections.length > 0) {
|