|
|
|
@ -21,6 +21,7 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX_LOCK_GET_ORDER_NO;
|
|
|
|
|
|
|
|
|
@ -58,6 +59,71 @@ public class SynchronizedService implements ISynchronizedService {
|
|
|
|
|
return list.stream().findFirst().get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public SysOrderNoRule nextOrderNo(String code, Map<String, String> map) {
|
|
|
|
|
int num = NumberUtils.INTEGER_ONE;
|
|
|
|
|
//先拿规则
|
|
|
|
|
String lockKey = CommonConstWords.REDIS_PREFIX_LOCK_GET_ORDER_NO + ":" + "LOCK" + ":" + code;
|
|
|
|
|
RLock rLock = (RLock) redisRes.getLock(lockKey);
|
|
|
|
|
rLock.lock();
|
|
|
|
|
try {
|
|
|
|
|
SysOrderNoRule codeRole = sysOrderNoRuleService.getSysOrderNoRuleByCode(code);
|
|
|
|
|
if (codeRole == null) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
|
|
|
|
|
.setErrorDetail("[" + code + "]规则代码不存在存在")
|
|
|
|
|
.setErrorSolution("请重新输入规则代码")
|
|
|
|
|
.build();
|
|
|
|
|
} else if (codeRole.getOrderNoRuleStatus() == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
|
|
|
|
|
.setErrorDetail("[" + code + "]单号规则已禁用")
|
|
|
|
|
.setErrorSolution("请重新输入规则代码")
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sysOrderNoRuleService.detachSysOrderNoRule(codeRole);
|
|
|
|
|
|
|
|
|
|
String orderNoTemplate = OrderNoMakeUtil.getOrderNoTemplate(codeRole);
|
|
|
|
|
String redisKey = REDIS_PREFIX_LOCK_GET_ORDER_NO + ":" + code + ":" + orderNoTemplate;
|
|
|
|
|
|
|
|
|
|
long orginSerialNo = codeRole.getSerialNo();
|
|
|
|
|
if (codeRole.getSerialNo() < 0 || OrderNoMakeUtil.isCycleByPrefix(codeRole, orderNoTemplate)) {
|
|
|
|
|
orginSerialNo = 0;
|
|
|
|
|
}
|
|
|
|
|
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, map, orderNoTemplate, num);
|
|
|
|
|
|
|
|
|
|
// FIXME 松下推送量太大并且该记录无意义 先注释
|
|
|
|
|
// try {
|
|
|
|
|
// rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_ORDER_NO_RECORD, JsonUtilTool.encode(orderNoRuleList));
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// LOGGER.error("单号记录推送异常", e);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 生成单号更缓存
|
|
|
|
|
return orderNoRuleList.stream().findFirst().get();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
LOGGER.error("生成单号失败,单号代码:{},num:{}", code, num, e);
|
|
|
|
|
} finally {
|
|
|
|
|
if (rLock.isHeldByCurrentThread()) {
|
|
|
|
|
rLock.unlock();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据单号代码获取单号信息
|
|
|
|
|
*
|
|
|
|
|