| 
					
				 | 
			
			
				@@ -0,0 +1,128 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.yc.ship.module.trade.service.order.handler; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSONArray; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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.dal.dataobject.order.TradeDetailDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.yc.ship.module.trade.service.order.bo.TradeOrderBO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.yc.ship.module.trade.service.order.bo.TradeOrderDetailBO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.core.annotation.Order; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.stereotype.Component; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import javax.annotation.Resource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.math.BigDecimal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Order(TradeOrderHandler.PRE_ORDER_STOCK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Slf4j 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class TradeStockOrderHandler implements TradeOrderHandler{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private VoyageApi voyageApi; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void beforeOrderCreate(TradeOrderBO order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Integer sellMethod = order.getTradeOrderDO().getSellMethod(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        switch (sellMethod) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case 1: //OTC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                reduceStock(order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void reduceStock(TradeOrderBO order){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ReduceStockReqDTO reqDTO = new ReduceStockReqDTO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reqDTO.setOrderId(order.getTradeOrderDO().getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reqDTO.setOrderStatus(order.getTradeOrderDO().getOrderStatus()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reqDTO.setType(DistributorOrStoreEnum.DISTRIBUTOR.getValue());//TODO: 当前默认为分销商,扣分销商库存,门店的后续再完善 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reqDTO.setVoyageId(order.getTradeOrderDO().getVoyageId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(roomNums != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return roomNums.stream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new ArrayList<TradeVisitorDO>().stream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<OrderRoomUseDTO> orderRoomUseDTOList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, Long> collect = tradeDetailDOList.stream().collect(Collectors.groupingBy(TradeVisitorDO::getRoomId, Collectors.counting())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        collect.keySet().stream().forEach(roomId -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            OrderRoomUseDTO orderRoomUseDTO = new OrderRoomUseDTO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            orderRoomUseDTO.setRoomId(Long.valueOf(roomId)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            orderRoomUseDTO.setNum(BigDecimal.valueOf(collect.get(roomId)).divide(new BigDecimal(2))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            orderRoomUseDTOList.add(orderRoomUseDTO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reqDTO.setOrderRoomList(orderRoomUseDTOList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Integer orderStatus = reqDTO.getOrderStatus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(orderStatus == TradeOrderStatusEnum.YD.getStatus()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            voyageApi.preReduceStock(reqDTO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //TODO:走定单扣库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterOrderCreate(TradeOrderBO order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterOrderCreate(order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterCancelOrder(TradeOrderDO tradeOrderDO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterCancelOrder(tradeOrderDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterOrderCreateFail(TradeOrderBO order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterOrderCreateFail(order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterSupplierOrderCreateFail(TradeOrderDO tradeOrderDO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterSupplierOrderCreateFail(tradeOrderDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterProcessSuccess(TradeOrderDO tradeOrderDO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterProcessSuccess(tradeOrderDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterProcessFail(TradeOrderDO tradeOrderDO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterProcessFail(tradeOrderDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterRefundOrder(Long refundId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterRefundOrder(refundId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterRefundAmountSuccess(Long orderId, Long refundId, BigDecimal refundAmount) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterRefundAmountSuccess(orderId, refundId, refundAmount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void afterCheckSuccess(Long orderId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.afterCheckSuccess(orderId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void processOrderCreateSuccess(TradeOrderDO tradeOrderDO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradeOrderHandler.super.processOrderCreateSuccess(tradeOrderDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |