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