|  | @@ -11,6 +11,9 @@ import cn.newfeifan.mall.framework.common.core.KeyValue;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.framework.common.enums.UserTypeEnum;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.constant.DistriConstants;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.member.api.address.MemberAddressApi;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.pay.api.order.PayOrderApi;
 | 
	
	
		
			
				|  | @@ -19,6 +22,8 @@ import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderRespDTO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.product.api.comment.ProductCommentApi;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.product.api.comment.dto.ProductCommentCreateReqDTO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.product.dal.dataobject.sku.ProductSkuDO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.product.dal.mysql.sku.ProductSkuMapper;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO;
 | 
	
	
		
			
				|  | @@ -68,12 +73,11 @@ import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.annotation.Resource;
 | 
	
		
			
				|  |  | +import java.math.BigDecimal;
 | 
	
		
			
				|  |  | +import java.math.RoundingMode;
 | 
	
		
			
				|  |  |  import java.time.LocalDateTime;
 | 
	
		
			
				|  |  |  import java.time.format.DateTimeFormatter;
 | 
	
		
			
				|  |  | -import java.util.ArrayList;
 | 
	
		
			
				|  |  | -import java.util.List;
 | 
	
		
			
				|  |  | -import java.util.Objects;
 | 
	
		
			
				|  |  | -import java.util.Set;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.*;
 | 
	
	
		
			
				|  | @@ -99,6 +103,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private TradeNoRedisDAO tradeNoRedisDAO;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Resource
 | 
	
		
			
				|  |  | +    private IntegralService integralService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private List<TradeOrderHandler> tradeOrderHandlers;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -126,6 +133,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |      @Value("${feifan.trade.express.kd100.key}")
 | 
	
		
			
				|  |  |      private String key;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Resource
 | 
	
		
			
				|  |  | +    private ProductSkuMapper productSkuMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // =================== Order ===================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
	
		
			
				|  | @@ -361,7 +371,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |      @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_DELIVERY)
 | 
	
		
			
				|  |  |      public void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO) {
 | 
	
		
			
				|  |  |          //校验发货信息不能都为空
 | 
	
		
			
				|  |  | -        if(deliveryReqVO.getLogisticsNo() == null && deliveryReqVO.getDeliveryRemark() == null){
 | 
	
		
			
				|  |  | +        if (deliveryReqVO.getLogisticsNo() == null && deliveryReqVO.getDeliveryRemark() == null) {
 | 
	
		
			
				|  |  |              throw exception(ORDER_DELIVERY_DETAILS_IS_NULL);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -398,10 +408,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 执行更新
 | 
	
		
			
				|  |  | -        if(deliveryReqVO.getDeliveryRemark() != null){
 | 
	
		
			
				|  |  | +        if (deliveryReqVO.getDeliveryRemark() != null) {
 | 
	
		
			
				|  |  |              //如果是虚拟商品直接完成发货和签收
 | 
	
		
			
				|  |  |              updateOrderObj.setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()).setDeliveryTime(LocalDateTime.now()).setReceivingTime(LocalDateTime.now());
 | 
	
		
			
				|  |  | -        }else{
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  |              updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj);
 | 
	
	
		
			
				|  | @@ -977,6 +987,50 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          tradeOrderMapper.updateById(order);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void updateOrderItemByFreezeHighQuota() {
 | 
	
		
			
				|  |  | +        List<TradeOrderDO> tradeOrderDOS = tradeOrderMapper.selectList(new LambdaQueryWrapper<TradeOrderDO>()
 | 
	
		
			
				|  |  | +                .eq(TradeOrderDO::getPayStatus, true)
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (TradeOrderDO tradeOrderDO : tradeOrderDOS) {
 | 
	
		
			
				|  |  | +            List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectList(new LambdaQueryWrapper<TradeOrderItemDO>()
 | 
	
		
			
				|  |  | +                    .eq(TradeOrderItemDO::getOrderId, tradeOrderDO.getId())
 | 
	
		
			
				|  |  | +                    .isNull(TradeOrderItemDO::getAfterSaleId)
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Long totalFreezeHighQuota = 0L;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //订单项
 | 
	
		
			
				|  |  | +            for (TradeOrderItemDO orderItem : tradeOrderItemDOS) {
 | 
	
		
			
				|  |  | +                ProductSkuDO productSkuDO = productSkuMapper.selectById(orderItem.getSkuId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //毛利
 | 
	
		
			
				|  |  | +                Integer promotionExpenses = (productSkuDO.getPrice() - productSkuDO.getCostPrice())
 | 
	
		
			
				|  |  | +                        * orderItem.getCount();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //毛利 * 10 = 峰值
 | 
	
		
			
				|  |  | +                BigDecimal grossProfit = new BigDecimal(promotionExpenses).multiply(new BigDecimal(1)).setScale(4, RoundingMode.DOWN);
 | 
	
		
			
				|  |  | +                BigDecimal freezeHighQuota = grossProfit.multiply(new BigDecimal("10"));
 | 
	
		
			
				|  |  | +                freezeHighQuota = money2Integral(freezeHighQuota);
 | 
	
		
			
				|  |  | +                Long freezeHighQuotaInt = freezeHighQuota.longValue();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                totalFreezeHighQuota += freezeHighQuotaInt;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                orderItem.setFreezeHighQuota(freezeHighQuotaInt);
 | 
	
		
			
				|  |  | +                tradeOrderItemMapper.updateById(orderItem);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //修改购物者本人获得的冻结峰值
 | 
	
		
			
				|  |  | +            integralService.updateIntegralFreezeHighQuota(tradeOrderDO.getUserId(), tradeOrderDO.getUserId(), CaclEnum.ORDER_PAY_FREEZE_HIGH_QUOTA,totalFreezeHighQuota,tradeOrderDO.getId(),tradeOrderDO.getNo(),tradeOrderDO.getPayTime());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public static BigDecimal money2Integral(BigDecimal money) {
 | 
	
		
			
				|  |  | +        return money.multiply(DistriConstants.MONEY2INTEGRAL_BIG_DECIMAL);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 创建单个订单的评论
 | 
	
		
			
				|  |  |       *
 |