Sfoglia il codice sorgente

新增情侣套餐获取支付参数接口

codingliang 10 mesi fa
parent
commit
8850409449

+ 10 - 0
src/main/java/com/sqx/modules/lovers/controller/app/AppLoversSetOrderController.java

@@ -4,10 +4,12 @@ import com.sqx.common.utils.Result;
 import com.sqx.modules.app.annotation.Login;
 import com.sqx.modules.lovers.dto.LoversSetOrderSubmitDTO;
 import com.sqx.modules.lovers.service.LoversSetOrderInfoService;
+import com.sqx.modules.pay.vo.WechatTransactionsParamVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -31,6 +33,14 @@ public class AppLoversSetOrderController {
     }
 
     @Login
+    @ApiOperation("获取支付参数")
+    @GetMapping("pay-params/{orderId}")
+    public Result getPayParams(@RequestAttribute Long userId, @PathVariable Long orderId){
+        WechatTransactionsParamVO transactionsParamVO = loversSetOrderInfoService.getPayParams(userId, orderId);
+        return Result.success().put("data", transactionsParamVO);
+    }
+
+    @Login
     @ApiOperation("获取提交订单token")
     @GetMapping("submit-token")
     public Result getSubmitToken(@RequestAttribute Long userId){

+ 4 - 3
src/main/java/com/sqx/modules/lovers/entity/LoversSetOrderDeliveryInfo.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 
 @Data
 @ApiModel("lovers_set_order_delivery_info")
@@ -20,11 +21,11 @@ public class LoversSetOrderDeliveryInfo implements Serializable {
     @ApiModelProperty("情侣套餐订单id")
     private Long loversSetOrderId;
 
-    @ApiModelProperty("情侣套餐订单详情id")
-    private Long loversSetOrderDetailId;
+    @ApiModelProperty("配送内容")
+    private String deliveryContent;
 
     @ApiModelProperty("预计配送时间")
-    private String deliveryTimeOfExpect;
+    private LocalDateTime deliveryTimeOfExpect;
 
     @ApiModelProperty("配送单id(跑腿订单id)")
     private Long deliveryOrderId;

+ 10 - 0
src/main/java/com/sqx/modules/lovers/service/LoversSetOrderDetailService.java

@@ -3,5 +3,15 @@ package com.sqx.modules.lovers.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.modules.lovers.entity.LoversSetOrderDetail;
 
+import java.util.List;
+
 public interface LoversSetOrderDetailService extends IService<LoversSetOrderDetail> {
+
+    /**
+     * 根据订单id查询订单详情
+     *
+     * @param orderInfoId 订单id
+     * @return 订单详情列表
+     */
+    List<LoversSetOrderDetail> getByOrderId(Long orderInfoId);
 }

+ 17 - 0
src/main/java/com/sqx/modules/lovers/service/LoversSetOrderInfoService.java

@@ -3,6 +3,7 @@ package com.sqx.modules.lovers.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.modules.lovers.dto.LoversSetOrderSubmitDTO;
 import com.sqx.modules.lovers.entity.LoversSetOrderInfo;
+import com.sqx.modules.pay.vo.WechatTransactionsParamVO;
 
 public interface LoversSetOrderInfoService extends IService<LoversSetOrderInfo> {
 
@@ -22,4 +23,20 @@ public interface LoversSetOrderInfoService extends IService<LoversSetOrderInfo>
      * @return token
      */
     String getSubmitToken(Long userId);
+
+    /**
+     * 获取支付参数
+     *
+     * @param userId 用户id
+     * @param orderId 订单id
+     * @return 支付参数
+     */
+    WechatTransactionsParamVO getPayParams(Long userId, Long orderId);
+
+    /**
+     * 订单支付成功后更新订单状态
+     *
+     * @param orderNo 订单编号
+     */
+    void updateOrderAfterPaySuccess(String orderNo);
 }

+ 10 - 0
src/main/java/com/sqx/modules/lovers/service/impl/LoversSetOrderDetailServiceImpl.java

@@ -1,11 +1,21 @@
 package com.sqx.modules.lovers.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.modules.lovers.dao.LoversSetOrderDetailDao;
 import com.sqx.modules.lovers.entity.LoversSetOrderDetail;
 import com.sqx.modules.lovers.service.LoversSetOrderDetailService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class LoversSetOrderDetailServiceImpl extends ServiceImpl<LoversSetOrderDetailDao, LoversSetOrderDetail> implements LoversSetOrderDetailService {
+
+    @Override
+    public List<LoversSetOrderDetail> getByOrderId(Long orderInfoId) {
+        LambdaQueryWrapper<LoversSetOrderDetail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(LoversSetOrderDetail::getLoversSetOrderInfoId, orderInfoId);
+        return baseMapper.selectList(wrapper);
+    }
 }

+ 96 - 0
src/main/java/com/sqx/modules/lovers/service/impl/LoversSetOrderInfoServiceImpl.java

@@ -3,30 +3,47 @@ package com.sqx.modules.lovers.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.constant.RedisKey;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.RedisUtils;
+import com.sqx.modules.app.entity.UserEntity;
+import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.lovers.dao.LoversSetOrderInfoDao;
 import com.sqx.modules.lovers.dto.LoversSetMenstrualPeriodSettingDTO;
 import com.sqx.modules.lovers.dto.LoversSetOrderSubmitDTO;
+import com.sqx.modules.lovers.entity.LoversSetOrderDeliveryInfo;
 import com.sqx.modules.lovers.entity.LoversSetOrderDetail;
 import com.sqx.modules.lovers.entity.LoversSetOrderInfo;
 import com.sqx.modules.lovers.service.LoversSetMenstrualPeriodSettingService;
+import com.sqx.modules.lovers.service.LoversSetOrderDeliveryInfoService;
 import com.sqx.modules.lovers.service.LoversSetOrderDetailService;
 import com.sqx.modules.lovers.service.LoversSetOrderInfoService;
 import com.sqx.modules.lovers.service.LoversSetService;
 import com.sqx.modules.lovers.vo.LoversSetVO;
+import com.sqx.modules.pay.dto.GetPayParamDTO;
+import com.sqx.modules.pay.enums.PayChannelEnum;
+import com.sqx.modules.pay.enums.PaySceneEnum;
+import com.sqx.modules.pay.service.NewPayService;
+import com.sqx.modules.pay.vo.WechatTransactionsParamVO;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 @Service
 @RequiredArgsConstructor
@@ -36,6 +53,9 @@ public class LoversSetOrderInfoServiceImpl extends ServiceImpl<LoversSetOrderInf
     private final LoversSetService loversSetService;
     private final LoversSetMenstrualPeriodSettingService loversSetMenstrualPeriodSettingService;
     private final LoversSetOrderDetailService loversSetOrderDetailService;
+    private final LoversSetOrderDeliveryInfoService loversSetOrderDeliveryInfoService;
+    private final NewPayService newPayService;
+    private final UserService userService;
 
     @Override
     @Transactional
@@ -67,6 +87,82 @@ public class LoversSetOrderInfoServiceImpl extends ServiceImpl<LoversSetOrderInf
         return token;
     }
 
+    @Override
+    public WechatTransactionsParamVO getPayParams(Long userId, Long orderId) {
+        LoversSetOrderInfo orderInfo = getById(orderId);
+
+        UserEntity userEntity = userService.queryByUserId(userId);
+
+        GetPayParamDTO dto = GetPayParamDTO.builder()
+                .orderNo(orderInfo.getOrderNumber())
+                .orderDesc("情侣套餐:" + orderInfo.getLoversSetName())
+                .amount(orderInfo.getPayAmount().setScale(2, RoundingMode.HALF_UP))
+                .userId(userId)
+                .userThirdId(userEntity.getOpenId())
+                .payChannel(PayChannelEnum.WECHAT_JS_API)
+                .paySceneEnum(PaySceneEnum.LOVERS_SET_ORDER_PAY)
+                .build();
+
+        return newPayService.getWechatTransactionsParamVO(dto);
+    }
+
+    @Override
+    @Transactional
+    public void updateOrderAfterPaySuccess(String orderNo) {
+        LoversSetOrderInfo orderInfo = getOne(new LambdaQueryWrapper<LoversSetOrderInfo>()
+                .eq(LoversSetOrderInfo::getOrderNumber, orderNo));
+
+        orderInfo.setPayStatus(Constant.YES);
+        orderInfo.setActiveStatus(Constant.YES);
+        orderInfo.setUpdateTime(LocalDateTime.now());
+        updateById(orderInfo);
+
+        // 新增并保存配送信息
+        saveDeliveryInfo(orderInfo);
+    }
+
+    private void saveDeliveryInfo(LoversSetOrderInfo orderInfo) {
+        // 生成订单配送信息
+        List<LoversSetOrderDetail> orderDetails = loversSetOrderDetailService.getByOrderId(orderInfo.getId());
+        // 按shopId分组订单详情
+        Map<Long, List<LoversSetOrderDetail>> detailsByShopId = orderDetails.stream()
+                .collect(Collectors.groupingBy(LoversSetOrderDetail::getShopId));
+
+        // 配送起止时间
+        LocalDate startDate = orderInfo.getReceiveStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate endDate = orderInfo.getReceiveEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+
+        List<LoversSetOrderDeliveryInfo> deliveryInfoList = IntStream.range(0, (int) ChronoUnit.DAYS.between(startDate, endDate))
+                .mapToObj(i -> startDate.plusDays(i))
+                .flatMap(date -> {
+                    LocalDateTime expectReceiveTime = LocalDateTime.parse(
+                            date + " " + orderInfo.getExpectReceiveTime(),
+                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+                    );
+
+                    return detailsByShopId.values().stream()
+                            .map(orderDetailList -> {
+                                String content = orderDetailList.stream()
+                                        .map(e -> e.getGoodsName() + "x" + e.getNum())
+                                        .collect(Collectors.joining(";"));
+
+                                return new LoversSetOrderDeliveryInfo() {
+                                    {
+                                        setLoversSetOrderId(orderInfo.getId());
+                                        setDeliveryContent(content);
+                                        setDeliveryTimeOfExpect(expectReceiveTime);
+                                        // 1等待生成配送单
+                                        setDeliveryStatus("1");
+                                    }
+                                };
+                            });
+                })
+                .collect(Collectors.toList());
+
+        // 保存配送信息
+        loversSetOrderDeliveryInfoService.saveBatch(deliveryInfoList);
+    }
+
     private LoversSetOrderInfo generateLoversSetOrder(Long userId, LoversSetOrderSubmitDTO submitDTO, LoversSetVO loversSetVO) {
         LoversSetOrderInfo loversSetOrderInfo = new LoversSetOrderInfo();
         loversSetOrderInfo.setOrderNumber(IdWorker.getTimeId());

+ 2 - 1
src/main/java/com/sqx/modules/pay/enums/PaySceneEnum.java

@@ -18,7 +18,8 @@ public enum PaySceneEnum {
     ORDER_PAY(1, "订单支付"),
     BALANCE_RECHARGE(2, "余额充值"),
     BOND_PAY(3, "保证金缴纳"),
-    VIP_PAY(4, "购买会员");
+    VIP_PAY(4, "购买会员"),
+    LOVERS_SET_ORDER_PAY(5, "情侣套餐订单支付");
 
     private int sceneCode;
     private String sceneDesc;

+ 11 - 0
src/main/java/com/sqx/modules/pay/service/impl/NewPayServiceImpl.java

@@ -21,6 +21,7 @@ import com.sqx.modules.app.service.UserMoneyService;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.datacentre.service.DataCentreService;
 import com.sqx.modules.goods.service.GoodsShopService;
+import com.sqx.modules.lovers.service.LoversSetOrderInfoService;
 import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.service.AppOrderService;
 import com.sqx.modules.pay.config.WechatPayConfig;
@@ -235,6 +236,7 @@ public class NewPayServiceImpl implements NewPayService {
                     case BALANCE_RECHARGE: handleBalanceRechargePaySuccess(payDetails); break;
                     case BOND_PAY: handleBondPaySuccess(payDetails); break;
                     case VIP_PAY: handleVipPaySuccess(payDetails); break;
+                    case LOVERS_SET_ORDER_PAY: handleLoversSetOrderPaySuccess(orderNo); break;
                     default:
                         log.error("监测到不支持的支付成功场景,支付订单信息:{}", JSONUtil.toJsonStr(payDetails));
                 }
@@ -254,6 +256,15 @@ public class NewPayServiceImpl implements NewPayService {
     }
 
     /**
+     * 处理情侣套餐订单支付成功通知
+     * @param orderNo 订单编号
+     */
+    private void handleLoversSetOrderPaySuccess(String orderNo) {
+        LoversSetOrderInfoService loversSetOrderInfoService = SpringContextUtils.getBean(LoversSetOrderInfoService.class);
+        loversSetOrderInfoService.updateOrderAfterPaySuccess(orderNo);
+    }
+
+    /**
      * 处理vip购买成功通知
      * @param payDetails
      */