瀏覽代碼

fix: 修改下单扣库存问题

luofeiyun 1 月之前
父節點
當前提交
aecc382f24

+ 10 - 0
ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/api/dto/OrderRoomUseDTO.java

@@ -15,4 +15,14 @@ public class OrderRoomUseDTO {
     // 因为这个可能为0.5,为1则完全被使用,为0.5则使用一半
     @Schema(description = "房间使用数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private BigDecimal num;
+
+    @Schema(description = "房型ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long roomModelId;
+
+    @Schema(description = "楼层", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Integer floor;
+
+    public String getKey() {
+        return roomModelId + "_" + floor;
+    }
 }

+ 2 - 2
ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/enums/ErrorCodeConstants.java

@@ -45,9 +45,9 @@ public interface ErrorCodeConstants {
 
     ErrorCode VOYAGE_SHARE_STOCK_NOT_ENOUGH = new ErrorCode(10_029, "该航次共享库存不足");
 
-    ErrorCode VOYAGE_SHARE_ROOM_NOT_ENOUGH = new ErrorCode(10_030, "共享库存-%s-%s可售房间不足");
+    ErrorCode VOYAGE_SHARE_ROOM_NOT_ENOUGH = new ErrorCode(10_030, "共享库存-%s-%sF可售房间不足");
 
-    ErrorCode VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH = new ErrorCode(10_031, "分销商库存-%s-%s可售房间不足");
+    ErrorCode VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH = new ErrorCode(10_031, "分销商库存-%s-%sF可售房间不足");
 
     ErrorCode VOYAGE_ROOM_NOT_EXIST = new ErrorCode(10_032, "订单所选房间%s不存在");
 

+ 27 - 25
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -20,6 +20,7 @@ import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailM
 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.enums.YesOrNoEnum;
 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;
@@ -38,6 +39,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+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.*;
@@ -289,14 +291,14 @@ public class VoyageApiImpl implements VoyageApi {
         detailReqVO.setVoyageId(voyageId);
         detailReqVO.setType(type);
         detailReqVO.setObjectId(distributorId);
+        detailReqVO.setEnableShare(YesOrNoEnum.NO.getType());//先获取非共享库存(分销商库存)
         List<VoyageStockDistributeNewRespVO> distributeNewRespVOS = voyageStockDistributeNewService.getDetail(detailReqVO);
         List<OrderRoomUseDTO> orderRoomList = reqDTO.getOrderRoomList();//订单使用房间详情
-        List<Long> roomIds = CollectionUtils.convertList(orderRoomList, OrderRoomUseDTO::getRoomId);
-        List<RoomRespDTO> roomList = roomApi.getRoomListByIds(roomIds);
-        Map<Long, BigDecimal> roomMap = CollectionUtils.convertMap(orderRoomList, item -> item.getRoomId(), item -> item.getNum());
-        Map<String, BigDecimal> roomModelFloorNumMap = CollectionUtils.convertMap(roomList,
-                item -> item.getRoomModelId() + "_" + item.getFloors(),
-                item -> roomMap.get(item.getId()) == null ? BigDecimal.ZERO : roomMap.get(item.getId()));
+        Map<String, BigDecimal> roomModelFloorNumMap = orderRoomList.stream()
+                .collect(Collectors.groupingBy(
+                        OrderRoomUseDTO::getKey,
+                        Collectors.mapping(OrderRoomUseDTO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)) // 直接使用BigDecimal的reduce操作进行求和
+                ));
         if (distributeNewRespVOS.isEmpty()) {//分销商未分配库存,扣共享库存
 
             voyageStockLogDO.setStockType(1); //1共享库存
@@ -480,17 +482,17 @@ public class VoyageApiImpl implements VoyageApi {
         }
         // 添加房间使用记录
         List<VoyageStockRoomUsedDO> roomUsedList = new ArrayList<>();
-        Map<Long, RoomRespDTO> roomIdMap = CollectionUtils.convertMap(roomList, RoomRespDTO::getId);
+        Map<Long, OrderRoomUseDTO> roomIdMap = CollectionUtils.convertMap(orderRoomList, OrderRoomUseDTO::getRoomId);
         orderRoomList.forEach(item -> {
+            if(item.getRoomId() == null) {
+                return;
+            }
             VoyageStockRoomUsedDO roomUsedDO = new VoyageStockRoomUsedDO();
             roomUsedDO.setOrderId(orderId);
             roomUsedDO.setVoyageId(voyageId);
-            RoomRespDTO roomRespDTO = roomIdMap.get(item.getRoomId());
-            if (roomRespDTO == null) {
-                throw exception(VOYAGE_ROOM_NOT_EXIST.getCode(), String.format(VOYAGE_ROOM_NOT_EXIST.getMsg(), item.getRoomId()));
-            }
+            OrderRoomUseDTO roomRespDTO = roomIdMap.get(item.getRoomId());
             roomUsedDO.setRoomModelId(roomRespDTO.getRoomModelId());
-            roomUsedDO.setFloor(roomRespDTO.getFloors());
+            roomUsedDO.setFloor(roomRespDTO.getFloor());
             roomUsedDO.setRoomId(item.getRoomId());
             roomUsedDO.setNum(item.getNum());
             roomUsedDO.setStatus(orderStatus);
@@ -627,16 +629,15 @@ public class VoyageApiImpl implements VoyageApi {
         detailReqVO.setVoyageId(voyageId);
         detailReqVO.setType(type);
         detailReqVO.setObjectId(distributorId);
+        detailReqVO.setEnableShare(YesOrNoEnum.NO.getType());//先获取非共享库存(分销商库存)
         List<VoyageStockDistributeNewRespVO> distributeNewRespVOS = voyageStockDistributeNewService.getDetail(detailReqVO);
         List<OrderRoomUseDTO> orderRoomList = reqDTO.getOrderRoomList();//订单使用房间详情
-        List<Long> roomIds = CollectionUtils.convertList(orderRoomList, OrderRoomUseDTO::getRoomId);
-        List<RoomRespDTO> roomList = roomApi.getRoomListByIds(roomIds);
-        Map<Long, BigDecimal> roomMap = CollectionUtils.convertMap(orderRoomList, item -> item.getRoomId(), item -> item.getNum());
-        Map<String, BigDecimal> roomModelFloorNumMap = CollectionUtils.convertMap(roomList,
-                item -> item.getRoomModelId() + "_" + item.getFloors(),
-                item -> roomMap.get(item.getId()) == null ? BigDecimal.ZERO : roomMap.get(item.getId()));
+        Map<String, BigDecimal> roomModelFloorNumMap = orderRoomList.stream()
+                .collect(Collectors.groupingBy(
+                        OrderRoomUseDTO::getKey,
+                        Collectors.mapping(OrderRoomUseDTO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)) // 直接使用BigDecimal的reduce操作进行求和
+                ));
         if (distributeNewRespVOS.isEmpty()) {//分销商未分配库存,扣共享库存
-
             voyageStockLogDO.setStockType(1); //1共享库存
             //判断共享库存是否充足
             if (shareNum.compareTo(totalUseNum) < 0) {
@@ -651,6 +652,7 @@ public class VoyageApiImpl implements VoyageApi {
                     useNum = BigDecimal.ZERO;
                 }
                 if (canSellNum.compareTo(useNum) < 0) {
+                    log.error(String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor()));
                     throw exception(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getCode(), String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor()));
                 }
             });
@@ -822,17 +824,17 @@ public class VoyageApiImpl implements VoyageApi {
         }
         // 添加房间使用记录
         List<VoyageStockRoomUsedDO> roomUsedList = new ArrayList<>();
-        Map<Long, RoomRespDTO> roomIdMap = CollectionUtils.convertMap(roomList, RoomRespDTO::getId);
+        Map<Long, OrderRoomUseDTO> roomIdMap = CollectionUtils.convertMap(orderRoomList, OrderRoomUseDTO::getRoomId);
         orderRoomList.forEach(item -> {
+            if(item.getRoomId() == null) {
+                return;
+            }
             VoyageStockRoomUsedDO roomUsedDO = new VoyageStockRoomUsedDO();
             roomUsedDO.setOrderId(orderId);
             roomUsedDO.setVoyageId(voyageId);
-            RoomRespDTO roomRespDTO = roomIdMap.get(item.getRoomId());
-            if (roomRespDTO == null) {
-                throw exception(VOYAGE_ROOM_NOT_EXIST.getCode(), String.format(VOYAGE_ROOM_NOT_EXIST.getMsg(), item.getRoomId()));
-            }
+            OrderRoomUseDTO roomRespDTO = roomIdMap.get(item.getRoomId());
             roomUsedDO.setRoomModelId(roomRespDTO.getRoomModelId());
-            roomUsedDO.setFloor(roomRespDTO.getFloors());
+            roomUsedDO.setFloor(roomRespDTO.getFloor());
             roomUsedDO.setRoomId(item.getRoomId());
             roomUsedDO.setNum(item.getNum());
             roomUsedDO.setStatus(orderStatus);

+ 3 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/ShipTradeOrderCreateReqVO.java

@@ -169,6 +169,9 @@ public class ShipTradeOrderCreateReqVO implements Serializable {
     @Schema(description = "修改内容")
     private String changedFields1;
 
+    @Schema(description = "房型信息")
+    private List<TradeOrderRoomModelVO> roomModelList;
+
 
     @Schema(description = "订单项")
     @Data

+ 5 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/TradeOrderRoomModelVO.java

@@ -134,4 +134,9 @@ public class TradeOrderRoomModelVO {
      */
     @Schema(description = "升楼层数", example = "")
     private Integer floorNum;
+
+    /**
+     * 房间ID
+     */
+    private Long roomId;
 }

+ 5 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/TradeVistorReqVO.java

@@ -4,6 +4,8 @@ import com.yc.ship.module.trade.enums.CredentialTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class TradeVistorReqVO {
     @Schema(description = "明细ID")
@@ -72,6 +74,9 @@ public class TradeVistorReqVO {
     @Schema(description = "房型ID")
     private Long roomModelId;
 
+    @Schema(description = "房间价格")
+    private BigDecimal roomPrice;
+
     @Schema(description = "楼层")
     private Integer floor;
 }

+ 3 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/bo/TradeOrderBO.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.service.order.bo;
 
+import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderRoomModelVO;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderTotalVO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderBindDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -26,6 +27,8 @@ public class TradeOrderBO {
     private TradeOrderUserDO tradeOrderUserDO;
     private List<TradeOrderDetailBO> tradeOrderDetailBOList;
     private TradeOrderDeliveryDO tradeOrderDeliveryDO;
+    @Schema(description = "房型信息")
+    private List<TradeOrderRoomModelVO> roomModelList;
     private ExtraInfo extraInfo;
     private OrderJzDO orderJzDO;
     private TradeOrderBindDO tradeOrderBindDO;

+ 13 - 11
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/handler/TradeStockOrderHandler.java

@@ -4,6 +4,7 @@ import com.yc.ship.module.product.api.VoyageApi;
 import com.yc.ship.module.product.api.dto.OrderRoomUseDTO;
 import com.yc.ship.module.product.api.dto.ReduceStockReqDTO;
 import com.yc.ship.module.product.enums.DistributorOrStoreEnum;
+import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderRoomModelVO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
 import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
@@ -34,9 +35,9 @@ public class TradeStockOrderHandler implements TradeOrderHandler{
     @Override
     public void beforeOrderCreate(TradeOrderBO order) {
         Integer sellMethod = order.getTradeOrderDO().getSellMethod();
-        if (sellMethod == 1) { //OTC
+//        if (sellMethod == 1) { //OTC
             reduceStock(order);
-        }
+//        }
 
     }
 
@@ -49,6 +50,7 @@ public class TradeStockOrderHandler implements TradeOrderHandler{
         reqDTO.setDistributorId(Long.valueOf(order.getTradeOrderDO().getSourceId()));
         reqDTO.setStoreId(order.getTradeOrderDO().getStoreId());
         reqDTO.setUseRoomNum(order.getSummary().getUseRoomTotalNum());
+
         List<TradeOrderDetailBO> tradeOrderDetailBOList = order.getTradeOrderDetailBOList();
         List<TradeVisitorDO> tradeDetailDOList = tradeOrderDetailBOList.stream().flatMap(list1 -> {
             List<TradeVisitorDO> roomNums = list1.getTradeVisitorDOList();
@@ -58,21 +60,21 @@ public class TradeStockOrderHandler implements TradeOrderHandler{
             return Stream.empty();
         }).collect(Collectors.toList());
         List<OrderRoomUseDTO> orderRoomUseDTOList = new ArrayList<>();
-        Map<String, Long> collect = tradeDetailDOList.stream().filter(tradeVisitorDO -> tradeVisitorDO.getRoomId() != null).collect(Collectors.groupingBy(TradeVisitorDO::getRoomId, Collectors.counting()));
-        collect.keySet().forEach(roomId -> {
-            if(StringUtils.isNotBlank(roomId)) {
-                OrderRoomUseDTO orderRoomUseDTO = new OrderRoomUseDTO();
-                orderRoomUseDTO.setRoomId(Long.valueOf(roomId));
-                orderRoomUseDTO.setNum(BigDecimal.valueOf(collect.get(roomId)).divide(new BigDecimal(2)));
-                orderRoomUseDTOList.add(orderRoomUseDTO);
-            }
+        List<TradeOrderRoomModelVO> roomModelList = order.getRoomModelList();
+        roomModelList.stream().forEach(roomModelVO -> {
+            OrderRoomUseDTO orderRoomUseDTO = new OrderRoomUseDTO();
+            orderRoomUseDTO.setRoomId(roomModelVO.getRoomId());
+            orderRoomUseDTO.setNum(BigDecimal.valueOf(roomModelVO.getUseRoomNum()));
+            orderRoomUseDTO.setRoomModelId(roomModelVO.getRoomModelId());
+            orderRoomUseDTO.setFloor(roomModelVO.getFloor());
+            orderRoomUseDTOList.add(orderRoomUseDTO);
         });
         reqDTO.setOrderRoomList(orderRoomUseDTOList);
         Integer orderStatus = reqDTO.getOrderStatus();
         if(Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
             voyageApi.preReduceStock(reqDTO);
         }else {
-            //TODO:走定单扣库存
+            voyageApi.reduceStock(reqDTO);
         }
     }
 

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java

@@ -604,6 +604,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
         //订单总计信息
         tradeOrderBO.setSummary(orderCreateReqDTO.getSummary());
+        // 订单房型信息
+        tradeOrderBO.setRoomModelList(orderCreateReqDTO.getRoomModelList());
         return tradeOrderBO;
     }