diff --git a/src/main/java/com/spring/modules/base/dao/TransNoControlDao.java b/src/main/java/com/spring/modules/base/dao/TransNoControlDao.java index 16dcb55f..ca28cbf8 100644 --- a/src/main/java/com/spring/modules/base/dao/TransNoControlDao.java +++ b/src/main/java/com/spring/modules/base/dao/TransNoControlDao.java @@ -1,5 +1,6 @@ package com.spring.modules.base.dao; +import com.spring.modules.base.data.TransNoControlRuleData; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -27,4 +28,24 @@ public interface TransNoControlDao { * @return void **/ void updateOtherRollSeqNo(@Param("orderNo") String orderNo,@Param("seqNo") String seqNo); + + /** + * 获取编码规则(加锁) + */ + TransNoControlRuleData getRuleForUpdate(@Param("site") String site, @Param("no") String no); + + /** + * 获取基础编码规则(不依赖扩展字段) + */ + TransNoControlRuleData getBaseRuleForUpdate(@Param("site") String site, @Param("no") String no); + + /** + * 校验 TransNoControl 扩展字段是否存在 + */ + Integer checkExtendColumnsReady(); + + /** + * 自增下一个流水号(用于扩展生成方式) + */ + void increaseNextNumber(@Param("site") String site, @Param("no") String no); } diff --git a/src/main/java/com/spring/modules/base/data/TransNoControlRuleData.java b/src/main/java/com/spring/modules/base/data/TransNoControlRuleData.java new file mode 100644 index 00000000..32346668 --- /dev/null +++ b/src/main/java/com/spring/modules/base/data/TransNoControlRuleData.java @@ -0,0 +1,15 @@ +package com.spring.modules.base.data; + +import lombok.Data; + +@Data +public class TransNoControlRuleData { + private String site; + private String transType; + private Double nextNumber; + private Integer length; + private String transNo; + private String generateMethod; + private String dateFormat; + private String datePart; +} diff --git a/src/main/java/com/spring/modules/base/service/Impl/TransNoControlServiceImpl.java b/src/main/java/com/spring/modules/base/service/Impl/TransNoControlServiceImpl.java index ac27e08b..f968203c 100644 --- a/src/main/java/com/spring/modules/base/service/Impl/TransNoControlServiceImpl.java +++ b/src/main/java/com/spring/modules/base/service/Impl/TransNoControlServiceImpl.java @@ -1,9 +1,15 @@ package com.spring.modules.base.service.Impl; +import com.spring.modules.base.data.TransNoControlRuleData; import com.spring.modules.base.dao.TransNoControlDao; import com.spring.modules.base.service.TransNoControlService; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.SimpleDateFormat; +import java.util.Date; /** * @CLASSNAME TransNoControlServiceImpl @@ -15,15 +21,117 @@ import org.springframework.stereotype.Service; @Service("transNoControlService") public class TransNoControlServiceImpl implements TransNoControlService { + private static final String ROHS_REFERENCE_NO = "reference_no"; + private static final String METHOD_COMMON = "常规"; + private static final String METHOD_SERIAL = "流水号"; + private static final String METHOD_DATE_SERIAL = "年月日+流水号"; + private static final String DATE_FORMAT_YYMMDD = "yyMMdd"; + private static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd"; + @Autowired private TransNoControlDao transNoControlDao; @Override + @Transactional(rollbackFor = Exception.class) public String transNo(String site, String no) { - String transNo = transNoControlDao.transNo(site, no); - transNoControlDao.update(site, no); + // 当前仅对 RoHs 单据号(reference_no)启用扩展规则,其他业务保持原有逻辑 + if (!ROHS_REFERENCE_NO.equalsIgnoreCase(StringUtils.trimToEmpty(no))) { + TransNoControlRuleData baseRule = transNoControlDao.getBaseRuleForUpdate(site, no); + validateRuleExists(site, no, baseRule); + String transNo = transNoControlDao.transNo(site, no); + if (StringUtils.isBlank(transNo)) { + throw new RuntimeException("单号配置异常,请检查 TransNoControl 或 Get_TransNo 规则!site=" + site + ", transType=" + no); + } + transNoControlDao.update(site, no); + return transNo; + } + + TransNoControlRuleData baseRule = transNoControlDao.getBaseRuleForUpdate(site, no); + validateRuleExists(site, no, baseRule); + + Integer extendReady = transNoControlDao.checkExtendColumnsReady(); + if (extendReady == null || extendReady != 1) { + throw new RuntimeException("RoHs单号扩展字段缺失,请先执行TransNoControl升级SQL(generate_method、date_format、date_part)"); + } + + TransNoControlRuleData rule = transNoControlDao.getRuleForUpdate(site, no); + validateRuleExists(site, no, rule); + String generateMethod = normalizeMethod(rule.getGenerateMethod()); + if (StringUtils.isBlank(generateMethod) || METHOD_COMMON.equals(generateMethod)) { + String transNo = transNoControlDao.transNo(site, no); + if (StringUtils.isBlank(transNo)) { + throw new RuntimeException("RoHs单号配置异常,请检查 TransNoControl 或 Get_TransNo 规则!site=" + site + ", transType=" + no); + } + transNoControlDao.update(site, no); + return transNo; + } + + String transNo = generateByRule(rule, generateMethod); + transNoControlDao.increaseNextNumber(site, no); return transNo; } + private String generateByRule(TransNoControlRuleData rule, String generateMethod) { + String prefix = StringUtils.trimToEmpty(rule.getTransNo()); + if (StringUtils.isBlank(prefix)) { + throw new RuntimeException("编码前缀未配置,请维护 TransNoControl.TransNo!site=" + rule.getSite() + ", transType=" + rule.getTransType()); + } + Integer length = rule.getLength(); + if (length == null || length <= 0) { + throw new RuntimeException("编码长度未配置,请维护 TransNoControl.Length!site=" + rule.getSite() + ", transType=" + rule.getTransType()); + } + long seqNo = getCurrentSeqNo(rule.getNextNumber()); + if (METHOD_SERIAL.equals(generateMethod)) { + return prefix + formatSeqNo(seqNo, length); + } + if (METHOD_DATE_SERIAL.equals(generateMethod)) { + String datePart = formatDatePart(rule.getDateFormat()); + int seqLength = length - datePart.length(); + if (seqLength <= 0) { + throw new RuntimeException("编码长度配置异常:Length 必须大于日期长度(TransNoControl.Length/date_format)"); + } + return prefix + datePart + formatSeqNo(seqNo, seqLength); + } + throw new RuntimeException("编码生成方式配置异常:仅支持[常规/流水号/年月日+流水号]"); + } + + private String normalizeMethod(String method) { + return StringUtils.replace(StringUtils.trimToEmpty(method), "+", "+"); + } + + private long getCurrentSeqNo(Double nextNumber) { + if (nextNumber == null || nextNumber <= 0) { + return 1L; + } + return nextNumber.longValue(); + } + + private String formatDatePart(String dateFormat) { + String format = StringUtils.trimToEmpty(dateFormat); + if (StringUtils.isBlank(format)) { + format = DATE_FORMAT_YYYYMMDD; + } + if (!DATE_FORMAT_YYMMDD.equals(format) && !DATE_FORMAT_YYYYMMDD.equals(format)) { + throw new RuntimeException("日期格式配置异常:仅支持[yyMMdd/yyyyMMdd]"); + } + return new SimpleDateFormat(format).format(new Date()); + } + + private String formatSeqNo(long seqNo, int seqLength) { + if (seqNo <= 0) { + seqNo = 1L; + } + String seqStr = String.valueOf(seqNo); + if (seqStr.length() > seqLength) { + throw new RuntimeException("流水号已超出配置长度,请调整 TransNoControl.Length 或重置 NextNumber"); + } + return String.format("%0" + seqLength + "d", seqNo); + } + + private void validateRuleExists(String site, String no, TransNoControlRuleData rule) { + if (rule == null) { + throw new RuntimeException("未找到单号配置,请维护 TransNoControl!site=" + site + ", transType=" + no); + } + } } diff --git a/src/main/java/com/spring/modules/change/entity/TransNoEntity.java b/src/main/java/com/spring/modules/change/entity/TransNoEntity.java index f9f46e03..37f65e4e 100644 --- a/src/main/java/com/spring/modules/change/entity/TransNoEntity.java +++ b/src/main/java/com/spring/modules/change/entity/TransNoEntity.java @@ -42,6 +42,21 @@ public class TransNoEntity { */ private String transNo; + /** + * 生成方式(常规/流水号/年月日+流水号) + */ + private String generateMethod; + + /** + * 日期格式(yyMMdd/yyyyMMdd) + */ + private String dateFormat; + + /** + * 日期片段(预留) + */ + private String datePart; + /** * 所选技术参数卡集合 */ diff --git a/src/main/java/com/spring/modules/part/entity/APIEntity/TransNoControlData.java b/src/main/java/com/spring/modules/part/entity/APIEntity/TransNoControlData.java index 08ef8d98..b4c36138 100644 --- a/src/main/java/com/spring/modules/part/entity/APIEntity/TransNoControlData.java +++ b/src/main/java/com/spring/modules/part/entity/APIEntity/TransNoControlData.java @@ -37,4 +37,19 @@ public class TransNoControlData { */ private String transNo; + /** + * 生成方式(常规/流水号/年月日+流水号) + */ + private String generateMethod; + + /** + * 日期格式(yyMMdd/yyyyMMdd) + */ + private String dateFormat; + + /** + * 日期片段(预留) + */ + private String datePart; + } diff --git a/src/main/java/com/spring/modules/rohs/controller/RohsController.java b/src/main/java/com/spring/modules/rohs/controller/RohsController.java index 12ade183..f80358d1 100644 --- a/src/main/java/com/spring/modules/rohs/controller/RohsController.java +++ b/src/main/java/com/spring/modules/rohs/controller/RohsController.java @@ -3,6 +3,7 @@ package com.spring.modules.rohs.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.spring.common.utils.PageUtils; import com.spring.common.utils.R; +import com.spring.modules.base.service.TransNoControlService; import com.spring.modules.change.vo.ProcessFormVo; import com.spring.modules.oss.entity.SysOssEntity; import com.spring.modules.oss.service.SysOssService; @@ -16,7 +17,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; -import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.List; @@ -29,12 +29,17 @@ import java.util.Map; @RequestMapping("/rohs") public class RohsController { + private static final String REFERENCE_NO_TRANS_TYPE = "reference_no"; + @Autowired private RohsService rohsService; @Autowired private SysOssService sysOssService; + @Autowired + private TransNoControlService transNoControlService; + /** * 列表查询 */ @@ -81,33 +86,11 @@ public class RohsController { String originalReferenceNo = rohs.getReferenceNo(); String newReferenceNo = originalReferenceNo; - // 方案A:如果是前端传来的临时单号,则生成真实单号 (比如:RH20260428001) + // 如果是前端传来的临时单号,则从 TransNoControl 中获取真实单号 if (originalReferenceNo.startsWith("TEMP-")) { - String dateStr = new SimpleDateFormat("yyyyMMdd").format(new Date()); - String prefix = "RH" + dateStr; - - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.likeRight("reference_no", prefix); - queryWrapper.orderByDesc("reference_no"); - - // 为了兼容不同的数据库类型,此处通过列表方式获取第一条即为当天的最大号 - List list = rohsService.list(queryWrapper); - if (list != null && !list.isEmpty()) { - RohsEntity lastRecord = list.get(0); - String lastNo = lastRecord.getReferenceNo(); - // 判断后缀是否能提取为数字流水号 - if (lastNo != null && lastNo.length() >= 13) { - try { - int seq = Integer.parseInt(lastNo.substring(10)); - newReferenceNo = prefix + String.format("%03d", seq + 1); - } catch (NumberFormatException e) { - newReferenceNo = prefix + "001"; - } - } else { - newReferenceNo = prefix + "001"; - } - } else { - newReferenceNo = prefix + "001"; + newReferenceNo = transNoControlService.transNo(rohs.getSite(), REFERENCE_NO_TRANS_TYPE); + if (StringUtils.isBlank(newReferenceNo)) { + return R.error("请维护编码生成规则(TransNoControl)!"); } // 更新到实体类上准备入库 diff --git a/src/main/resources/mapper/base/TransNoControlDao.xml b/src/main/resources/mapper/base/TransNoControlDao.xml index e425e951..19096fc6 100644 --- a/src/main/resources/mapper/base/TransNoControlDao.xml +++ b/src/main/resources/mapper/base/TransNoControlDao.xml @@ -23,4 +23,53 @@ update other_roll_trans_no set next_no = next_no+1 where order_no = #{orderNo} and seq_no = #{seqNo} + + + + + + + + + update TransNoControl + set NextNumber = + case + when NextNumber is null then 2 + else NextNumber + 1 + end + where Site = #{site} + and TransType = #{no} + \ No newline at end of file