|
@@ -38,6 +38,9 @@ import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
+import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
|
|
+import static com.yc.ship.module.product.enums.ErrorCodeConstants.VOYAGE_STOCK_CHANGED;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 航次库存 Service 实现类
|
|
* 航次库存 Service 实现类
|
|
|
*
|
|
*
|
|
@@ -79,8 +82,32 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
|
|
|
RLock lock = redissonClient.getLock(lockKey);
|
|
RLock lock = redissonClient.getLock(lockKey);
|
|
|
try {
|
|
try {
|
|
|
lock.lock(60, TimeUnit.SECONDS);
|
|
lock.lock(60, TimeUnit.SECONDS);
|
|
|
- voyageStockDetailMapper.deleteByVoyageId(voyageId);
|
|
|
|
|
|
|
+ // 获取数据库中现在的库存详情数
|
|
|
|
|
+ List<VoyageStockDetailDO> detailDos = voyageStockDetailMapper.selectListByVoyageId(voyageId);
|
|
|
List<VoyageStockDetailDO> list = BeanUtils.toBean(createReqVO, VoyageStockDetailDO.class);
|
|
List<VoyageStockDetailDO> list = BeanUtils.toBean(createReqVO, VoyageStockDetailDO.class);
|
|
|
|
|
+ // 现有库存数中的预约数、实际房间数和修改的预约数、实际房间数比较,如果不一致,则返回库存数有变动,请刷新页面后重新设置
|
|
|
|
|
+ Map<String, VoyageStockDetailDO> existMap = detailDos.stream()
|
|
|
|
|
+ .collect(Collectors.toMap(
|
|
|
|
|
+ item -> item.getRoomModelId() + "_" + item.getFloor(),
|
|
|
|
|
+ item -> item,
|
|
|
|
|
+ (a, b) -> a));
|
|
|
|
|
+ for (VoyageStockDetailDO reqItem : list) {
|
|
|
|
|
+ // 排除合计和内舱房
|
|
|
|
|
+ if(ProductStockStaticsName.TOTAL.equals(reqItem.getRoomModelName()) || ProductStockStaticsName.IN_ROOM.equals(reqItem.getRoomModelName())) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ String key = reqItem.getRoomModelId() + "_" + reqItem.getFloor();
|
|
|
|
|
+ VoyageStockDetailDO exist = existMap.get(key);
|
|
|
|
|
+ if (exist == null) {
|
|
|
|
|
+ // 现有库存里没有该房型楼层,视为已被变动(如被删除/新增)
|
|
|
|
|
+ throw exception(VOYAGE_STOCK_CHANGED);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!equalsBigDecimal(exist.getBookNum(), reqItem.getBookNum())
|
|
|
|
|
+ || !equalsBigDecimal(exist.getRealTotalNum(), reqItem.getRealTotalNum())) {
|
|
|
|
|
+ throw exception(VOYAGE_STOCK_CHANGED);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ voyageStockDetailMapper.deleteByVoyageId(voyageId);
|
|
|
List<VoyageStockDetailDO> insertList = new ArrayList<>();
|
|
List<VoyageStockDetailDO> insertList = new ArrayList<>();
|
|
|
list.stream().forEach(item -> {
|
|
list.stream().forEach(item -> {
|
|
|
if(ProductStockStaticsName.TOTAL.equals(item.getRoomModelName())) {
|
|
if(ProductStockStaticsName.TOTAL.equals(item.getRoomModelName())) {
|
|
@@ -93,10 +120,6 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
Boolean aBoolean = voyageStockDetailMapper.insertBatch(insertList);
|
|
Boolean aBoolean = voyageStockDetailMapper.insertBatch(insertList);
|
|
|
- // 设置缓存
|
|
|
|
|
- if(aBoolean) {
|
|
|
|
|
- productRedisUtils.set(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId, insertList);
|
|
|
|
|
- }
|
|
|
|
|
return aBoolean;
|
|
return aBoolean;
|
|
|
}finally {
|
|
}finally {
|
|
|
if(lock.isHeldByCurrentThread() && lock.isLocked()){
|
|
if(lock.isHeldByCurrentThread() && lock.isLocked()){
|
|
@@ -105,6 +128,22 @@ public class VoyageStockDetailServiceImpl implements VoyageStockDetailService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 比较两个 BigDecimal 是否相等
|
|
|
|
|
+ * @param a
|
|
|
|
|
+ * @param b
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ private boolean equalsBigDecimal(BigDecimal a, BigDecimal b) {
|
|
|
|
|
+ if (a == null && b == null) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (a == null || b == null) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ return a.compareTo(b) == 0; // 用 compareTo 避免 1.0 与 1.00 被判不等
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 处理共享库存
|
|
* 处理共享库存
|
|
|
* @param voyageId
|
|
* @param voyageId
|