fix(core):单号生成因缓存未正常重置

yun-zuoyi
汪云昊 4 years ago
parent e708a99bc4
commit 85b6a2211e

@ -67,10 +67,11 @@ public interface ISysOrderNoRuleService {
/**
*
* @param orderNoRule
* @param orderNoTemplate
* @return
*/
@ApiOperation(value = "根据单号代码获取单号信息")
List<SysOrderNoRule> doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,int num);
List<SysOrderNoRule> doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,String orderNoTemplate,int num);
/**
* id

@ -2,6 +2,7 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.base;
import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService;
import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService;
import cn.estsh.i3plus.core.apiservice.util.OrderNoMakeUtil;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
@ -66,7 +67,6 @@ public class SynchronizedService implements ISynchronizedService {
*/
@Override
public synchronized List<SysOrderNoRule> nextOrderNo(String code, int num) {
String redisKey = REDIS_PREFIX_LOCK_GET_ORDER_NO + ":" + code;
//先拿规则
SysOrderNoRule codeRole = sysOrderNoRuleService.getSysOrderNoRuleByCode(code);
if (codeRole == null) {
@ -87,14 +87,20 @@ public class SynchronizedService implements ISynchronizedService {
sysOrderNoRuleService.detachSysOrderNoRule(codeRole);
String orderNoTemplate = OrderNoMakeUtil.getOrderNoTemplate(codeRole);
String redisKey = REDIS_PREFIX_LOCK_GET_ORDER_NO + ":" + code + ":" + orderNoTemplate;
long orginSerialNo = codeRole.getSerialNo() < 0 ? 0 : codeRole.getSerialNo();
long incr = codeRole.getSerialNoIncrement() * num;
//缓存增加
//先判断redis是否存在如果不存在则用默认初始值+步长*数量,如果存在,则添加步长 * 数量
codeRole.setSerialNo(redisRes.putObjAdditional(redisKey, orginSerialNo, incr) - incr);
// 设置缓存有效期
redisRes.expire(redisKey, PlatformConstWords.REDIS_EXPIRE_SECONDS);
// 生成单号更缓存
List<SysOrderNoRule> orderNoRuleList = sysOrderNoRuleService.doGetSysOrderNoRuleByNum(codeRole, num);
List<SysOrderNoRule> orderNoRuleList = sysOrderNoRuleService.doGetSysOrderNoRuleByNum(codeRole, orderNoTemplate, num);
try {
rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_ORDER_NO_RECORD, JsonUtilTool.encode(orderNoRuleList));

@ -104,15 +104,16 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService {
*
*
* @param sysOrderNoRule
* @param orderNoTemplate
* @param num
* @return
*/
@Override
public synchronized List<SysOrderNoRule> doGetSysOrderNoRuleByNum(SysOrderNoRule sysOrderNoRule, int num) {
public synchronized List<SysOrderNoRule> doGetSysOrderNoRuleByNum(SysOrderNoRule sysOrderNoRule, String orderNoTemplate, int num) {
List<SysOrderNoRule> resultList = new ArrayList<>();
try {
for (int i = 0; i < num; i++) {
sysOrderNoRule = OrderNoMakeUtil.next(CloneTool.clone(sysOrderNoRule));
sysOrderNoRule = OrderNoMakeUtil.next(CloneTool.clone(sysOrderNoRule), orderNoTemplate);
resultList.add(sysOrderNoRule);
}
}catch (Exception e){

@ -10,6 +10,8 @@ import org.apache.commons.lang3.StringUtils;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import static cn.estsh.i3plus.platform.common.util.PlatformConstWords.SERIAL_NO;
/**
* @Description :
* @Reference :
@ -19,11 +21,12 @@ import java.text.SimpleDateFormat;
**/
public class OrderNoMakeUtil {
private OrderNoMakeUtil(){}
private OrderNoMakeUtil() {
}
public static SysOrderNoRule next(SysOrderNoRule orderNoRule) {
public static String getOrderNoTemplate(SysOrderNoRule orderNoRule) {
// 数据校验
if(orderNoRule == null || StringUtils.isBlank(orderNoRule.getOrderNoRule())){
if (orderNoRule == null || StringUtils.isBlank(orderNoRule.getOrderNoRule())) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
@ -32,29 +35,41 @@ public class OrderNoMakeUtil {
}
String[] dateTime = new SimpleDateFormat("yyyy-yy-MM-dd-HH-mm-ss").format(System.currentTimeMillis()).split("-");
StringBuilder orderNo = new StringBuilder(orderNoRule.getOrderNoRule());
StringBuilder orderNoTemplate = new StringBuilder(orderNoRule.getOrderNoRule());
// 单号表达式
replace(orderNo, PlatformConstWords.YEAR_FULL, dateTime[0]);
replace(orderNo, PlatformConstWords.YEAR, dateTime[1]);
replace(orderNo, PlatformConstWords.MONTH, dateTime[2]);
replace(orderNo, PlatformConstWords.DAY, dateTime[3]);
replace(orderNo, PlatformConstWords.HOUR_OF_DAY, dateTime[4]);
replace(orderNo, PlatformConstWords.MINUTE, dateTime[5]);
replace(orderNo, PlatformConstWords.SECOND, dateTime[6]);
replace(orderNoTemplate, PlatformConstWords.YEAR_FULL, dateTime[0]);
replace(orderNoTemplate, PlatformConstWords.YEAR, dateTime[1]);
replace(orderNoTemplate, PlatformConstWords.MONTH, dateTime[2]);
replace(orderNoTemplate, PlatformConstWords.DAY, dateTime[3]);
replace(orderNoTemplate, PlatformConstWords.HOUR_OF_DAY, dateTime[4]);
replace(orderNoTemplate, PlatformConstWords.MINUTE, dateTime[5]);
replace(orderNoTemplate, PlatformConstWords.SECOND, dateTime[6]);
return orderNoTemplate.toString();
}
/**
*
* @param orderNoRule
* @param orderNoTemplate
* @return
*/
public static SysOrderNoRule next(SysOrderNoRule orderNoRule, String orderNoTemplate) {
int prefixIdx = orderNoTemplate.indexOf(SERIAL_NO);
// 流水号长度补全表达式
String serialNoFormatStr = MessageFormat.format(PlatformConstWords.SERIAL_NO_FORMAT, orderNoRule.getSerialNoLength());
// 判断是否首次生成SerialNo初始值-1
if (orderNoRule.getSerialNo() > 0 && orderNo.indexOf(PlatformConstWords.SERIAL_NO) != -1) {
String newNo = orderNo.substring(0,orderNo.indexOf(PlatformConstWords.SERIAL_NO));
String oldNo = orderNoRule.getOrderNo().substring(0,orderNo.indexOf(PlatformConstWords.SERIAL_NO));
if (orderNoRule.getSerialNo() > 0 && prefixIdx != -1) {
String newNo = orderNoTemplate.substring(0, prefixIdx);
String oldNo = orderNoRule.getOrderNo().substring(0, prefixIdx);
long serialNo = orderNoRule.getSerialNo() + orderNoRule.getSerialNoIncrement();
// 前缀(日期)不同后是否重置流水号
if(!newNo.equals(oldNo) && orderNoRule.getIsCycle() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()){
if (!newNo.equals(oldNo) && orderNoRule.getIsCycle() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed());
} else {
orderNoRule.setSerialNo(serialNo);
@ -67,14 +82,14 @@ public class OrderNoMakeUtil {
} else {
orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed() * orderNoRule.getSerialNoIncrement());
}
replace(orderNo, PlatformConstWords.SERIAL_NO, String.format(serialNoFormatStr, orderNoRule.getSerialNo()));
orderNoRule.setOrderNo(orderNo.toString());
orderNoRule.setOrderNo(orderNoTemplate.replace(SERIAL_NO,String.format(serialNoFormatStr, orderNoRule.getSerialNo())));
return orderNoRule;
}
/**
*
*
* @param no
* @param constant
* @param param

@ -24,7 +24,8 @@ public class TestOrderNoMakeUtil extends TestBase {
sysOrderNoRule.setSerialNo(9999L);
sysOrderNoRule.setIsCycle(1);
System.out.println(OrderNoMakeUtil.next(sysOrderNoRule));
String orderNoTemplate = OrderNoMakeUtil.getOrderNoTemplate(sysOrderNoRule);
System.out.println(OrderNoMakeUtil.next(sysOrderNoRule,orderNoTemplate));
// String d= MessageFormat.format("%0{0}d", 3);
// System.out.println(d);

Loading…
Cancel
Save