自己手动编写了一个获取流水号的代码,测试两个线程同时调用接口,得到的流水号是一样的
下面是流水号相关获取方法,日志输出的tNumberMake 也是一样的
public synchronized String getCode(String numberType, String jcjg, String jcff, String gcbh) {
StringBuilder code = new StringBuilder();
try {
List<TNumberMake> numberMakes = list(new QueryWrapper<TNumberMake>().eq("number_type", numberType));
if (numberMakes.isEmpty()) {
throw new RuntimeException("未找到对应类型的编号配置");
}
TNumberMake tNumberMake = numberMakes.get(0);
log.debug(JSONUtil.toJsonStr(tNumberMake));
List<TNumberRulerelation> relations = tNumberRulerelationService.list(new QueryWrapper<TNumberRulerelation>().eq("number_id", tNumberMake.getNumberId()));
for (TNumberRulerelation relation : relations) {
if (relation.getRuleName().equals(TNumberMakeConstant.RULE_GCBH)) {
code.append(gcbh);
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_JCJJ)) {
code.append(jcff);
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_JCFF)) {
code.append(jcjg);
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_BANF)) {
// 使用 DateTimeFormatter 简化日期格式化
String lastTwoDigits = LocalDate.now().format(DateTimeFormatter.ofPattern("yy"));
code.append(lastTwoDigits);
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_ZDY)) {
code.append(relation.getRuleExpression());
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_LSH2)) {
code.append(String.format("%02d", tNumberMake.getSerialNumber()));
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_LSH3)) {
code.append(String.format("%03d", tNumberMake.getSerialNumber()));
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_LSH4)) {
code.append(String.format("%04d", tNumberMake.getSerialNumber()));
} else if (relation.getRuleName().equals(TNumberMakeConstant.RULE_LSH5)) {
code.append(String.format("%05d", tNumberMake.getSerialNumber()));
}
if ("1".equals(relation.getIsConnector())) {
code.append("-");
}
}
tNumberMake.setSerialNumber(tNumberMake.getSerialNumber() + 1);
updateById(tNumberMake);
} catch (Exception e) {
log.error("获取编号失败", e);
throw new RuntimeException("获取编号失败: " + e.getMessage(), e);
}
return code.toString();
}