diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java index 9cdfc13..ae65bac 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysOrderNoRuleService.java @@ -67,10 +67,11 @@ public interface ISysOrderNoRuleService { /** * 根据单号代码获取单号信息 * @param orderNoRule 单号代码 + * @param orderNoTemplate * @return 单号信息 */ @ApiOperation(value = "根据单号代码获取单号信息") - List doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,int num); + List doGetSysOrderNoRuleByNum(SysOrderNoRule orderNoRule,String orderNoTemplate,int num); /** * 根据id修改单号规则状态 diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java index 35ddaea..0bec397 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java @@ -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 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 orderNoRuleList = sysOrderNoRuleService.doGetSysOrderNoRuleByNum(codeRole, num); + List orderNoRuleList = sysOrderNoRuleService.doGetSysOrderNoRuleByNum(codeRole, orderNoTemplate, num); try { rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_ORDER_NO_RECORD, JsonUtilTool.encode(orderNoRuleList)); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java index 2cdfbf7..a04bb9b 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRuleService.java @@ -104,15 +104,16 @@ public class SysOrderNoRuleService implements ISysOrderNoRuleService { * 根据单号代码获取单号信息 * * @param sysOrderNoRule 单号代码 + * @param orderNoTemplate * @param num * @return 单号信息 */ @Override - public synchronized List doGetSysOrderNoRuleByNum(SysOrderNoRule sysOrderNoRule, int num) { + public synchronized List doGetSysOrderNoRuleByNum(SysOrderNoRule sysOrderNoRule, String orderNoTemplate, int num) { List 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){ diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java index 8734d8f..abe4414 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/OrderNoMakeUtil.java @@ -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 diff --git a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java index e592865..2bc5e2e 100644 --- a/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java +++ b/modules/i3plus-core-apiservice/src/test/java/test/cn/estsh/i3plus/core/apiservice/util/TestOrderNoMakeUtil.java @@ -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);