提交 e802a68e authored 作者: huyufan's avatar huyufan

修改bug 货单编号生成

上级 5a3ba269
...@@ -65,6 +65,7 @@ public enum PerformanceResultEnum implements ResultEnum { ...@@ -65,6 +65,7 @@ public enum PerformanceResultEnum implements ResultEnum {
ORDER_CHILD_DIRECT_REJECT_TRUCK_ERROR(1381, "非定向车辆无法取消"), ORDER_CHILD_DIRECT_REJECT_TRUCK_ERROR(1381, "非定向车辆无法取消"),
ORDER_CHILD_CANCEL_FORBID(1382, "运单无法取消"), ORDER_CHILD_CANCEL_FORBID(1382, "运单无法取消"),
ORDER_CHILD_CANCEL_FORBID_COUNT(1383, "今日取消运单次数超过上限,暂时无法取消"), ORDER_CHILD_CANCEL_FORBID_COUNT(1383, "今日取消运单次数超过上限,暂时无法取消"),
ORDER_GOODS_ID_GENERATE_LOCK(1384, "货单编号ID获取锁出问题"),
......
...@@ -2,15 +2,22 @@ package com.clx.performance.component; ...@@ -2,15 +2,22 @@ package com.clx.performance.component;
import com.clx.performance.constant.RedisConstants; import com.clx.performance.constant.RedisConstants;
import com.clx.performance.dao.OrderGoodsDao; import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.enums.PerformanceResultEnum;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils; import com.msl.common.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.concurrent.TimeUnit;
@Component @Component
@Slf4j
public class OrderGoodsIdGenerate { public class OrderGoodsIdGenerate {
@Autowired @Autowired
...@@ -19,38 +26,60 @@ public class OrderGoodsIdGenerate { ...@@ -19,38 +26,60 @@ public class OrderGoodsIdGenerate {
@Autowired @Autowired
private OrderGoodsDao orderGoodsDao; private OrderGoodsDao orderGoodsDao;
@Autowired
private RedissonClient redissonClient;
private static final String type = "id"; private static final String type = "id";
public long getOrderGoodsId(Integer size) { public long getOrderGoodsId(Integer size) {
long baseStart = Long.parseLong(DateUtils.formatDate(LocalDate.now(), "yyyyMMdd").get() + "00001"); RLock rLock = null;
Object o = redisTemplate.opsForHash().get(RedisConstants.ORDER_GOODS_ID, type); try {
if (o == null ) { rLock = redissonClient.getLock(RedisConstants.ORDER_NO_BLOCK + type);
Long maxOrderGoodsId = null;
String maxID = orderGoodsDao.getMaxOrderGoodsId(type);
if (StringUtils.isNotBlank(maxID)) {
maxOrderGoodsId = Long.valueOf(maxID.substring(2));
}
if (maxOrderGoodsId == null) { rLock.lock(5, TimeUnit.SECONDS);
maxOrderGoodsId = 0L; long baseStart = Long.parseLong(DateUtils.formatDate(LocalDate.now(), "yyyyMMdd").get() + "00001");
} Object o = redisTemplate.opsForHash().get(RedisConstants.ORDER_GOODS_ID, type);
if (baseStart > maxOrderGoodsId) { if (o == null) {
redisTemplate.opsForHash().put(RedisConstants.ORDER_GOODS_ID, type, String.valueOf(baseStart + size)); Long maxOrderGoodsId = null;
return baseStart; String maxID = orderGoodsDao.getMaxOrderGoodsId(type);
if (StringUtils.isNotBlank(maxID)) {
maxOrderGoodsId = Long.valueOf(maxID.substring(2));
}
if (maxOrderGoodsId == null) {
maxOrderGoodsId = 0L;
}
if (baseStart > maxOrderGoodsId) {
redisTemplate.opsForHash().put(RedisConstants.ORDER_GOODS_ID, type, String.valueOf(baseStart + size));
return baseStart;
} else {
long orderGoodsId = maxOrderGoodsId + size;
redisTemplate.opsForHash().put(RedisConstants.ORDER_GOODS_ID, type, String.valueOf(orderGoodsId));
return maxOrderGoodsId + 1;
}
} else { } else {
long orderGoodsId = maxOrderGoodsId + size; long redisOrderGoodsId = Long.parseLong(o.toString());
if (redisOrderGoodsId < baseStart) {
redisOrderGoodsId = baseStart;
}
long orderGoodsId = redisOrderGoodsId + size;
redisTemplate.opsForHash().put(RedisConstants.ORDER_GOODS_ID, type, String.valueOf(orderGoodsId)); redisTemplate.opsForHash().put(RedisConstants.ORDER_GOODS_ID, type, String.valueOf(orderGoodsId));
return maxOrderGoodsId + 1; return redisOrderGoodsId;
} }
} else { } catch (Exception e) {
long redisOrderGoodsId = Long.parseLong(o.toString()); throw new ServiceSystemException(PerformanceResultEnum.ORDER_GOODS_ID_GENERATE_LOCK, e.getMessage());
if (redisOrderGoodsId < baseStart) {
redisOrderGoodsId = baseStart; } finally {
try {
if (rLock != null && rLock.isLocked()) {
rLock.unlock();
}
log.info("锁释放完成货单ID生成");
} catch (Exception e) {
log.error("redis 货单ID生成 分布式锁释放异常!", e);
} }
long orderGoodsId = redisOrderGoodsId + size;
redisTemplate.opsForHash().put(RedisConstants.ORDER_GOODS_ID, type, String.valueOf(orderGoodsId));
return redisOrderGoodsId;
} }
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论