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

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

@ -67,10 +67,11 @@ public interface ISysOrderNoRuleService {
/** /**
* *
* @param orderNoRule * @param orderNoRule
* @param orderNoTemplate
* @return * @return
*/ */
@ApiOperation(value = "根据单号代码获取单号信息") @ApiOperation(value = "根据单号代码获取单号信息")
List<SysOrderNoRule> doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,int num); List<SysOrderNoRule> doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,String orderNoTemplate,int num);
/** /**
* id * 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.base.ISynchronizedService;
import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService; 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.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.CommonConstWords;
@ -66,7 +67,6 @@ public class SynchronizedService implements ISynchronizedService {
*/ */
@Override @Override
public synchronized List<SysOrderNoRule> nextOrderNo(String code, int num) { public synchronized List<SysOrderNoRule> nextOrderNo(String code, int num) {
String redisKey = REDIS_PREFIX_LOCK_GET_ORDER_NO + ":" + code;
//先拿规则 //先拿规则
SysOrderNoRule codeRole = sysOrderNoRuleService.getSysOrderNoRuleByCode(code); SysOrderNoRule codeRole = sysOrderNoRuleService.getSysOrderNoRuleByCode(code);
if (codeRole == null) { if (codeRole == null) {
@ -87,14 +87,20 @@ public class SynchronizedService implements ISynchronizedService {
sysOrderNoRuleService.detachSysOrderNoRule(codeRole); 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 orginSerialNo = codeRole.getSerialNo() < 0 ? 0 : codeRole.getSerialNo();
long incr = codeRole.getSerialNoIncrement() * num; long incr = codeRole.getSerialNoIncrement() * num;
//缓存增加 //缓存增加
//先判断redis是否存在如果不存在则用默认初始值+步长*数量,如果存在,则添加步长 * 数量 //先判断redis是否存在如果不存在则用默认初始值+步长*数量,如果存在,则添加步长 * 数量
codeRole.setSerialNo(redisRes.putObjAdditional(redisKey, orginSerialNo, incr) - incr); 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 { try {
rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_ORDER_NO_RECORD, JsonUtilTool.encode(orderNoRuleList)); rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_ORDER_NO_RECORD, JsonUtilTool.encode(orderNoRuleList));

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

@ -10,6 +10,8 @@ import org.apache.commons.lang3.StringUtils;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import static cn.estsh.i3plus.platform.common.util.PlatformConstWords.SERIAL_NO;
/** /**
* @Description : * @Description :
* @Reference : * @Reference :
@ -19,11 +21,12 @@ import java.text.SimpleDateFormat;
**/ **/
public class OrderNoMakeUtil { 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() throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.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("-"); 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(orderNoTemplate, PlatformConstWords.YEAR_FULL, dateTime[0]);
replace(orderNo, PlatformConstWords.YEAR, dateTime[1]); replace(orderNoTemplate, PlatformConstWords.YEAR, dateTime[1]);
replace(orderNo, PlatformConstWords.MONTH, dateTime[2]); replace(orderNoTemplate, PlatformConstWords.MONTH, dateTime[2]);
replace(orderNo, PlatformConstWords.DAY, dateTime[3]); replace(orderNoTemplate, PlatformConstWords.DAY, dateTime[3]);
replace(orderNo, PlatformConstWords.HOUR_OF_DAY, dateTime[4]); replace(orderNoTemplate, PlatformConstWords.HOUR_OF_DAY, dateTime[4]);
replace(orderNo, PlatformConstWords.MINUTE, dateTime[5]); replace(orderNoTemplate, PlatformConstWords.MINUTE, dateTime[5]);
replace(orderNo, PlatformConstWords.SECOND, dateTime[6]); 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()); String serialNoFormatStr = MessageFormat.format(PlatformConstWords.SERIAL_NO_FORMAT, orderNoRule.getSerialNoLength());
// 判断是否首次生成SerialNo初始值-1 // 判断是否首次生成SerialNo初始值-1
if (orderNoRule.getSerialNo() > 0 && orderNo.indexOf(PlatformConstWords.SERIAL_NO) != -1) { if (orderNoRule.getSerialNo() > 0 && prefixIdx != -1) {
String newNo = orderNo.substring(0,orderNo.indexOf(PlatformConstWords.SERIAL_NO)); String newNo = orderNoTemplate.substring(0, prefixIdx);
String oldNo = orderNoRule.getOrderNo().substring(0,orderNo.indexOf(PlatformConstWords.SERIAL_NO)); String oldNo = orderNoRule.getOrderNo().substring(0, prefixIdx);
long serialNo = orderNoRule.getSerialNo() + orderNoRule.getSerialNoIncrement(); 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()); orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed());
} else { } else {
orderNoRule.setSerialNo(serialNo); orderNoRule.setSerialNo(serialNo);
@ -67,14 +82,14 @@ public class OrderNoMakeUtil {
} else { } else {
orderNoRule.setSerialNo(orderNoRule.getSerialNoSeed() * orderNoRule.getSerialNoIncrement()); 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; return orderNoRule;
} }
/** /**
* *
*
* @param no * @param no
* @param constant * @param constant
* @param param * @param param

@ -24,7 +24,8 @@ public class TestOrderNoMakeUtil extends TestBase {
sysOrderNoRule.setSerialNo(9999L); sysOrderNoRule.setSerialNo(9999L);
sysOrderNoRule.setIsCycle(1); 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); // String d= MessageFormat.format("%0{0}d", 3);
// System.out.println(d); // System.out.println(d);

Loading…
Cancel
Save