Browse Source

2026-05-11

RoHs功能优化
master
fengyuan_yang 1 month ago
parent
commit
36c9f1db48
  1. 21
      src/main/java/com/spring/modules/base/dao/TransNoControlDao.java
  2. 15
      src/main/java/com/spring/modules/base/data/TransNoControlRuleData.java
  3. 112
      src/main/java/com/spring/modules/base/service/Impl/TransNoControlServiceImpl.java
  4. 15
      src/main/java/com/spring/modules/change/entity/TransNoEntity.java
  5. 15
      src/main/java/com/spring/modules/part/entity/APIEntity/TransNoControlData.java
  6. 37
      src/main/java/com/spring/modules/rohs/controller/RohsController.java
  7. 49
      src/main/resources/mapper/base/TransNoControlDao.xml

21
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);
}

15
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;
}

112
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);
}
}
}

15
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;
/**
* 所选技术参数卡集合
*/

15
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;
}

37
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<RohsEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("reference_no", prefix);
queryWrapper.orderByDesc("reference_no");
// 为了兼容不同的数据库类型此处通过列表方式获取第一条即为当天的最大号
List<RohsEntity> 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)!");
}
// 更新到实体类上准备入库

49
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>
<select id="getRuleForUpdate" resultType="com.spring.modules.base.data.TransNoControlRuleData">
select
Site as site,
TransType as transType,
NextNumber as nextNumber,
Length as length,
TransNo as transNo,
generate_method as generateMethod,
date_format as dateFormat,
date_part as datePart
from TransNoControl with (updlock, rowlock)
where Site = #{site}
and TransType = #{no}
</select>
<select id="getBaseRuleForUpdate" resultType="com.spring.modules.base.data.TransNoControlRuleData">
select
Site as site,
TransType as transType,
NextNumber as nextNumber,
Length as length,
TransNo as transNo
from TransNoControl with (updlock, rowlock)
where Site = #{site}
and TransType = #{no}
</select>
<select id="checkExtendColumnsReady" resultType="java.lang.Integer">
select
case
when COL_LENGTH('dbo.TransNoControl', 'generate_method') is not null
and COL_LENGTH('dbo.TransNoControl', 'date_format') is not null
and COL_LENGTH('dbo.TransNoControl', 'date_part') is not null
then 1
else 0
end
</select>
<update id="increaseNextNumber">
update TransNoControl
set NextNumber =
case
when NextNumber is null then 2
else NextNumber + 1
end
where Site = #{site}
and TransType = #{no}
</update>
</mapper>
Loading…
Cancel
Save