|  | @@ -9,6 +9,7 @@ import cn.hutool.core.util.RandomUtil;
 | 
	
		
			
				|  |  |  import cn.hutool.extra.spring.SpringUtil;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.framework.common.core.KeyValue;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.framework.common.enums.UserTypeEnum;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.framework.common.pojo.CommonResult;
 | 
	
		
			
				|  |  |  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;
 | 
	
	
		
			
				|  | @@ -19,6 +20,10 @@ import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.pay.api.order.PayOrderApi;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderRespDTO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderRespVO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.pay.convert.order.PayOrderConvert;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 | 
	
		
			
				|  |  | +import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderMapper;
 | 
	
		
			
				|  |  |  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;
 | 
	
	
		
			
				|  | @@ -57,23 +62,30 @@ import cn.newfeifan.mall.module.trade.service.price.TradePriceService;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
 | 
	
		
			
				|  |  |  import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
 | 
	
		
			
				|  |  | +import io.swagger.v3.oas.annotations.Operation;
 | 
	
		
			
				|  |  | +import io.swagger.v3.oas.annotations.Parameter;
 | 
	
		
			
				|  |  |  import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  |  import org.jetbrains.annotations.NotNull;
 | 
	
		
			
				|  |  |  import org.springframework.beans.BeanUtils;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | +import org.springframework.web.bind.annotation.GetMapping;
 | 
	
		
			
				|  |  | +import org.springframework.web.bind.annotation.RequestParam;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.annotation.Resource;
 | 
	
		
			
				|  |  |  import java.time.LocalDateTime;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
	
		
			
				|  |  | +import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.*;
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.framework.common.util.date.LocalDateTimeUtils.minusTime;
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.framework.common.util.servlet.ServletUtils.getClientIP;
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.framework.web.core.util.WebFrameworkUtils.getTerminal;
 | 
	
		
			
				|  |  |  import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 交易订单【写】Service 实现类
 | 
	
		
			
				|  |  |   *
 | 
	
	
		
			
				|  | @@ -125,8 +137,65 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private TradeOrderProperties tradeOrderProperties;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Resource
 | 
	
		
			
				|  |  | +    private PayOrderMapper payOrderMapper;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // =================== Order ===================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * add by Ben
 | 
	
		
			
				|  |  | +     * 待支付订单,点支付时的新增方法
 | 
	
		
			
				|  |  | +     * @param tradeOrderId
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public PayOrderDO getPayOrder(Long tradeOrderId) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//        PayOrderRespVO rs = null;
 | 
	
		
			
				|  |  | +        PayOrderDO thisPayOrderDO = null;//当前订单对应的支付订单
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //页面传入的订单
 | 
	
		
			
				|  |  | +        TradeOrderDO orderDO = tradeOrderMapper.selectOne("id", tradeOrderId);
 | 
	
		
			
				|  |  | +       Long parentPayOrderId = orderDO.getPayOrderId();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //本订单对应的支付订单id,是否是多个订单支付的合并支付订单
 | 
	
		
			
				|  |  | +        List<TradeOrderDO> tradeOrderList = tradeOrderMapper.selectList("pay_order_id", parentPayOrderId);
 | 
	
		
			
				|  |  | +        if(tradeOrderList.size()==1){//如果一个支付单只对应一个订单,证明不是合并支付订单
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            thisPayOrderDO = payOrderMapper.selectById(parentPayOrderId);
 | 
	
		
			
				|  |  | +//            rs = thisPayOrderDO;
 | 
	
		
			
				|  |  | +        }else if(tradeOrderList.size()>1){//如果一个支付单对应多个订单,证明是合并支付订单,则生成其下级拆分支付的支付单
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            PayOrderDO parentPayOrderDO = payOrderMapper.selectById(parentPayOrderId);
 | 
	
		
			
				|  |  | +            LocalDateTime expireTime = parentPayOrderDO.getExpireTime();//原合并支付订单的过期时间
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (int i = 0; i < tradeOrderList.size(); i++) {
 | 
	
		
			
				|  |  | +                TradeOrderDO tradeOrderDO = tradeOrderList.get(i);
 | 
	
		
			
				|  |  | +                Long tId = tradeOrderDO.getId();
 | 
	
		
			
				|  |  | +                List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectList("order_id", tId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //创建子支付订单,并且让trade_order记录关联子支付订单
 | 
	
		
			
				|  |  | +                Long childPayOrderId = createChildPayOrder(tradeOrderDO, tradeOrderItemDOS,
 | 
	
		
			
				|  |  | +                        parentPayOrderId,expireTime);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if(tId==tradeOrderId){//如果当前为页面传入的订单
 | 
	
		
			
				|  |  | +                    thisPayOrderDO = payOrderMapper.selectById(childPayOrderId);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            parentPayOrderDO = new PayOrderDO();
 | 
	
		
			
				|  |  | +            parentPayOrderDO.setId(parentPayOrderId);
 | 
	
		
			
				|  |  | +            parentPayOrderDO.setStatus(PayOrderStatusEnum.CLOSED.getStatus());
 | 
	
		
			
				|  |  | +            parentPayOrderDO.setExpireTime(LocalDateTime.now());
 | 
	
		
			
				|  |  | +            payOrderMapper.updateById(parentPayOrderDO);//修改订单状态为已关闭和修改过期时间为现在
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//            rs = thisPayOrderDO;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return thisPayOrderDO;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public AppTradeOrderSettlementRespVO settlementOrder(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) {
 | 
	
		
			
				|  |  |          // 1. 获得收货地址
 | 
	
	
		
			
				|  | @@ -578,6 +647,34 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 创建子支付订单
 | 
	
		
			
				|  |  | +     * @param order
 | 
	
		
			
				|  |  | +     * @param orderItems
 | 
	
		
			
				|  |  | +     * @param parentPayOrderId  父级支付订单id
 | 
	
		
			
				|  |  | +     * @param expireTime  支付过期时间
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private Long createChildPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems,
 | 
	
		
			
				|  |  | +                                     Long parentPayOrderId,LocalDateTime expireTime) {
 | 
	
		
			
				|  |  | +        // 创建支付单,用于后续的支付
 | 
	
		
			
				|  |  | +        PayOrderCreateReqDTO payOrderCreateReqDTO = TradeOrderConvert.INSTANCE.convert(
 | 
	
		
			
				|  |  | +                order, orderItems, tradeOrderProperties);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        payOrderCreateReqDTO.setParentPayOrderId(parentPayOrderId);
 | 
	
		
			
				|  |  | +        payOrderCreateReqDTO.setExpireTime(expireTime);
 | 
	
		
			
				|  |  | +        payOrderCreateReqDTO.setPrice(order.getPayRmb());//同步订单价格
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Long payOrderId = payOrderApi.createOrder(payOrderCreateReqDTO);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //支付订单id更新到交易单上
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        order.setPayOrderId(payOrderId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return payOrderId;//返回支付订单ID
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private Long createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
 | 
	
		
			
				|  |  |          // 创建支付单,用于后续的支付
 |