|
|
|
@ -49,6 +49,10 @@ public class TransNoControlServiceImpl implements TransNoControlService { |
|
|
|
return legacyTransNo(site, no); |
|
|
|
} |
|
|
|
|
|
|
|
if (METHOD_DATE_SERIAL.equals(generateMethod)) { |
|
|
|
return generateDateSerialWithReset(rule); |
|
|
|
} |
|
|
|
|
|
|
|
String transNo = generateByRule(rule, generateMethod); |
|
|
|
transNoControlDao.increaseNextNumber(site, no); |
|
|
|
return transNo; |
|
|
|
@ -67,17 +71,40 @@ public class TransNoControlServiceImpl implements TransNoControlService { |
|
|
|
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 generateDateSerialWithReset(TransNoControlRuleData rule) { |
|
|
|
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()); |
|
|
|
} |
|
|
|
|
|
|
|
String currentDatePart = formatDatePart(rule.getDateFormat()); |
|
|
|
int seqLength = length - currentDatePart.length(); |
|
|
|
if (seqLength <= 0) { |
|
|
|
throw new RuntimeException("编码长度配置异常:Length 必须大于日期长度(TransNoControl.Length/date_format)"); |
|
|
|
} |
|
|
|
|
|
|
|
long seqNo = resolveDateSerialSeqNo(rule, currentDatePart); |
|
|
|
String transNo = prefix + currentDatePart + formatSeqNo(seqNo, seqLength); |
|
|
|
transNoControlDao.updateDateSerialState(rule.getSite(), rule.getTransType(), currentDatePart, seqNo + 1L); |
|
|
|
return transNo; |
|
|
|
} |
|
|
|
|
|
|
|
private long resolveDateSerialSeqNo(TransNoControlRuleData rule, String currentDatePart) { |
|
|
|
String storedDatePart = StringUtils.trimToEmpty(rule.getDatePart()); |
|
|
|
if (!StringUtils.equals(storedDatePart, currentDatePart)) { |
|
|
|
// 日期变化时,流水号从001重新开始 |
|
|
|
return 1L; |
|
|
|
} |
|
|
|
return getCurrentSeqNo(rule.getNextNumber()); |
|
|
|
} |
|
|
|
|
|
|
|
private String normalizeMethod(String method) { |
|
|
|
return StringUtils.replace(StringUtils.trimToEmpty(method), "+", "+"); |
|
|
|
} |
|
|
|
|