|
|
@@ -7,14 +7,17 @@ import com.yc.ship.module.product.api.dto.ReduceStockReqDTO;
|
|
|
import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewDetailReqVO;
|
|
|
import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewRespVO;
|
|
|
import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
|
|
|
+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockLogDO;
|
|
|
import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockRoomUsedDO;
|
|
|
import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO;
|
|
|
import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
|
|
|
+import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockLogMapper;
|
|
|
import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper;
|
|
|
import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockRoomUsedMapper;
|
|
|
import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailMapper;
|
|
|
import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeNewMapper;
|
|
|
import com.yc.ship.module.product.enums.DistributorOrStoreEnum;
|
|
|
+import com.yc.ship.module.product.enums.VoyageStockLogTypeEnum;
|
|
|
import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants;
|
|
|
import com.yc.ship.module.product.service.voyagestockdistribute.VoyageStockDistributeNewService;
|
|
|
import com.yc.ship.module.resource.api.room.RoomApi;
|
|
|
@@ -60,6 +63,9 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
@Resource
|
|
|
private VoyageStockRoomUsedMapper voyageStockRoomUsedMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private VoyageStockLogMapper voyageStockLogMapper;
|
|
|
+
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public void preReduceStock(ReduceStockReqDTO reqDTO) {
|
|
|
@@ -84,11 +90,57 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void preCancelReduceStock(ReduceStockReqDTO reqDTO) {
|
|
|
+ //TODO: 当前阶段不考虑门店库存
|
|
|
+
|
|
|
+ Long voyageId = reqDTO.getVoyageId();
|
|
|
+ //现在给整个航次的库存加锁
|
|
|
+ String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
|
|
|
+ RLock lock = redissonClient.getLock(lockKey);
|
|
|
+ try {
|
|
|
+ lock.lock(60, TimeUnit.SECONDS);
|
|
|
+ Integer type = reqDTO.getType();//判断是分销商还是门店下单 1:分销商,2:门店
|
|
|
+ if (type == DistributorOrStoreEnum.DISTRIBUTOR.getValue()) {//分销商下单,当前阶段不考虑门店下单
|
|
|
+ //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
|
|
|
+ //初定扣分销商库存
|
|
|
+ preCancelReduceStockDistributor(reqDTO);
|
|
|
+ }
|
|
|
+ }finally {
|
|
|
+ if(lock.isHeldByCurrentThread() && lock.isLocked()){
|
|
|
+ lock.unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
- * 预定扣分销商库存
|
|
|
+ * 初定取消还分销商库存
|
|
|
+ * @param reqDTO
|
|
|
+ */
|
|
|
+ private void preCancelReduceStockDistributor(ReduceStockReqDTO reqDTO) {
|
|
|
+ Integer type = reqDTO.getType();
|
|
|
+ Long voyageId = reqDTO.getVoyageId(); //航次ID
|
|
|
+ Long distributorId = reqDTO.getDistributorId(); //分销商ID
|
|
|
+ Long storeId = reqDTO.getStoreId(); //门店ID
|
|
|
+ BigDecimal totalUseNum = reqDTO.getUseRoomNum(); //总共使用房间数量
|
|
|
+ Long orderId = reqDTO.getOrderId();
|
|
|
+ Integer orderStatus = reqDTO.getOrderStatus();
|
|
|
+
|
|
|
+ //删除已使用房间记录
|
|
|
+ voyageStockRoomUsedMapper.deleteByOrderId(orderId);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初定扣分销商库存
|
|
|
* @param reqDTO
|
|
|
*/
|
|
|
private void preReduceStockDistributor(ReduceStockReqDTO reqDTO) {
|
|
|
+ //航次库存操作日志
|
|
|
+ VoyageStockLogDO voyageStockLogDO = new VoyageStockLogDO();
|
|
|
+
|
|
|
Integer type = reqDTO.getType();
|
|
|
Long voyageId = reqDTO.getVoyageId(); //航次ID
|
|
|
Long distributorId = reqDTO.getDistributorId(); //分销商ID
|
|
|
@@ -97,6 +149,12 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
Long orderId = reqDTO.getOrderId();
|
|
|
Integer orderStatus = reqDTO.getOrderStatus();
|
|
|
|
|
|
+ voyageStockLogDO.setVoyageId(voyageId);
|
|
|
+ voyageStockLogDO.setType(2);//标识减少
|
|
|
+ voyageStockLogDO.setOrderId(orderId);
|
|
|
+ voyageStockLogDO.setOrderStatus(orderStatus);
|
|
|
+ voyageStockLogDO.setOperateType(VoyageStockLogTypeEnum.ORDER_PRE_SUB.getValue());
|
|
|
+
|
|
|
// 获取航次总库存
|
|
|
VoyageStockDO stockDO = voyageStockMapper.selectById(voyageId);
|
|
|
if(stockDO == null) {
|
|
|
@@ -166,7 +224,11 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
// 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
|
|
|
if(stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
|
|
|
stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
|
|
|
+ voyageStockLogDO.setVirtualNum(totalUseNum);
|
|
|
+ voyageStockLogDO.setRealNum(BigDecimal.ZERO);
|
|
|
}else {
|
|
|
+ voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
|
|
|
+ voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
|
|
|
stockDO.setVirtualNum(BigDecimal.ZERO);
|
|
|
// 扣实际房间数
|
|
|
stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
|
|
|
@@ -175,6 +237,7 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
|
|
|
// 扣共享库存
|
|
|
stockDO.setShareNum(stockDO.getShareNum().subtract(totalUseNum));
|
|
|
+ voyageStockLogDO.setShareNum(totalUseNum);
|
|
|
voyageStockMapper.updateById(stockDO);
|
|
|
}else {
|
|
|
//分销商已分配库存,扣自身库存
|
|
|
@@ -233,7 +296,11 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
// 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
|
|
|
if(stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
|
|
|
stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
|
|
|
+ voyageStockLogDO.setVirtualNum(totalUseNum);
|
|
|
+ voyageStockLogDO.setRealNum(BigDecimal.ZERO);
|
|
|
}else {
|
|
|
+ voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
|
|
|
+ voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
|
|
|
stockDO.setVirtualNum(BigDecimal.ZERO);
|
|
|
// 扣实际房间数
|
|
|
stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
|
|
|
@@ -242,6 +309,7 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
|
|
|
// 扣共享库存
|
|
|
stockDO.setShareNum(stockDO.getShareNum().subtract(totalUseNum));
|
|
|
+ voyageStockLogDO.setShareNum(totalUseNum);
|
|
|
voyageStockMapper.updateById(stockDO);
|
|
|
}
|
|
|
// 添加房间使用记录
|
|
|
@@ -268,5 +336,7 @@ public class VoyageApiImpl implements VoyageApi{
|
|
|
voyageStockRoomUsedMapper.insertBatch(roomUsedList);
|
|
|
}
|
|
|
|
|
|
+ // 添加库存日志
|
|
|
+ voyageStockLogMapper.insert(voyageStockLogDO);
|
|
|
}
|
|
|
}
|