Parcourir la source

商城下单逻辑梳理修改,余额支付支持

mac il y a 2 ans
Parent
commit
f0d28a2bc0
15 fichiers modifiés avec 185 ajouts et 86 suppressions
  1. 4 0
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/CommonConstants.java
  2. 1 1
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/exception/GlobalBizExceptionHandler.java
  3. 1 1
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/ali/AliPayService.java
  4. 0 7
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/dto/kxsapp/shop/GoodsSubmitDTO.java
  5. 2 0
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/dto/kxsapp/shop/PayOrderDTO.java
  6. 9 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/config/AesOldCryptoConfig.java
  7. 10 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/constant/enums/KxsShopEnum.java
  8. 10 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/handlers/AliPayMessageHandler.java
  9. 5 5
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/mapper/KxsShopOrderMapper.java
  10. 0 1
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/mq/RabbitShopQueueListener.java
  11. 7 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsShopOrderService.java
  12. 10 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsTicketService.java
  13. 100 69
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java
  14. 25 1
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsTicketServiceImpl.java
  15. 1 1
      kxs-product/kxs-product-biz/src/main/resources/mapper/KxsShopOrderMapper.xml

+ 4 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/CommonConstants.java

@@ -113,6 +113,10 @@ public interface CommonConstants {
 	 */
 	BigDecimal GD_CARDINAL_NUMBER = new BigDecimal(10000);
 
+	/**
+	 * 商城订单支付标记
+	 */
+	String SHOP_ORDER_FLAG = "shop_order_flag";
 	/**
 	 * 扶持期天数
 	 */

+ 1 - 1
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/exception/GlobalBizExceptionHandler.java

@@ -145,7 +145,7 @@ public class GlobalBizExceptionHandler {
 	 */
 	@ExceptionHandler(GlobalCustomerException.class)
 	public R handlerCustomException(GlobalCustomerException exception){
-		log.info("自定义异常:{}", exception.getMessage());
+		log.error("自定义异常:{}", exception.getMessage());
 		return R.failed(exception.getMessage());
 	}
 

+ 1 - 1
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/ali/AliPayService.java

@@ -126,7 +126,7 @@ public class AliPayService implements PayService {
      * @param request 请求
      * @return {@link Map}< {@link String} , {@link String}>
      */
-    public Map< String , String> getNoticeParams(HttpServletRequest request) {
+    private Map<String, String> getNoticeParams(HttpServletRequest request) {
         Map< String , String > params = new HashMap<>();
         Map<String, String[]> requestParams = request.getParameterMap();
         for (String name : requestParams.keySet()) {

+ 0 - 7
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/dto/kxsapp/shop/GoodsSubmitDTO.java

@@ -37,13 +37,6 @@ public class GoodsSubmitDTO extends KxsShopOrder {
     @NotNull(message = "SKU ID不能为空")
     private Integer skuId;
 
-    /**
-     * 规格参数
-     */
-    @Schema(description = "规格参数")
-    @NotNull(message = "规格参数不能为空")
-    private String specifications;
-
 
 
 }

+ 2 - 0
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/dto/kxsapp/shop/PayOrderDTO.java

@@ -2,6 +2,7 @@ package com.kxs.product.api.dto.kxsapp.shop;
 
 import com.kxs.product.api.model.KxsShopOrder;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -41,6 +42,7 @@ public class PayOrderDTO extends KxsShopOrder {
      * 支付密码
      */
     @Schema(description = "支付密码")
+    @NotBlank(message = "请输入支付密码")
     private String payPwd;
 
     /**

+ 9 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/config/AesOldCryptoConfig.java

@@ -21,6 +21,15 @@ public class AesOldCryptoConfig {
 	private final static  String ENCODE_MODE = "CBC";
 	private final static  String ENCODE_PADDING = "PKCS7Padding";
 
+	public static void main(String[] args) {
+		AES aes = new AES("CBC", "PKCS7Padding",
+				// 密钥,可以自定义
+				"CBTU1dD4Kd5pyiGWTsI10jRQ3SvKusSV".getBytes(),
+				// iv加盐,按照实际需求添加
+				"DYgjCEIMVrj2W9xN".getBytes());
+		System.out.println(aes.decryptStr("RFlnakNFSU1WcmoyVzl4Tl0lFdbug//AzBamqjjGzESAJcOEu3pcaH2zmRAAQ3O+dTSV4bFG1Ks7leC0GMtFaUEr7CIpniE4CX2AaBp+y60="));
+	}
+
 	/**
 	 * <p>
 	 * aes加密配置 此处设在配置类可以避免每次请求都去创建加密类,以此节约性能

+ 10 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/constant/enums/KxsShopEnum.java

@@ -22,6 +22,16 @@ public enum KxsShopEnum {
     ORDER_NO_TAKE(2, "待收货"),
     ORDER_CONFIRM(3, "已完成"),
     ORDER_CANCEL(4, "已取消"),
+    /**
+     * 发货方式
+     */
+    ORDER_PICK(0, "自提"),
+    ORDER_ERP(1, "邮寄"),
+    /**
+     * 商品类型
+     */
+    GOODS_ENTITY(0, "实物商品"),
+    GOODS_VIRTUAL(1, "虚拟商品"),
 
     /**
      * 支付方式

+ 10 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/handlers/AliPayMessageHandler.java

@@ -1,10 +1,13 @@
 package com.kxs.product.biz.handlers;
 
+import com.kxs.common.core.constant.CommonConstants;
 import com.kxs.common.pay.enums.PayConstants;
 import com.kxs.common.pay.enums.PayPlatformEnum;
 import com.kxs.common.pay.handlers.PayMessageHandler;
 import com.kxs.common.pay.model.AliPayMessage;
 import com.kxs.common.pay.service.ali.AliPayService;
+import com.kxs.product.biz.service.KxsShopOrderService;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -14,8 +17,10 @@ import org.springframework.stereotype.Component;
  */
 @Component
 @Slf4j
+@RequiredArgsConstructor
 public class AliPayMessageHandler implements PayMessageHandler<AliPayMessage, AliPayService> {
 
+    private final KxsShopOrderService orderService;
 
     /**
      * 处理支付回调消息的处理器接口
@@ -28,6 +33,11 @@ public class AliPayMessageHandler implements PayMessageHandler<AliPayMessage, Al
     public String handle(AliPayMessage payMessage, AliPayService payService) {
 
         log.info("支付宝支付回调消息处理,订单号:{}", payMessage.getOutTradeNo());
+
+        //商城订单处理
+        if (payMessage.getPassbackParams().equals(CommonConstants.SHOP_ORDER_FLAG)) {
+            orderService.payBack(payMessage.getOutTradeNo());
+        }
         return PayConstants.ALI_PAY_SUCCESS;
     }
 

+ 5 - 5
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/mapper/KxsShopOrderMapper.java

@@ -1,8 +1,6 @@
 package com.kxs.product.biz.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kxs.product.api.model.KxsShopOrder;
 import com.kxs.product.api.vo.kxsapp.shop.ShopOrderGoodsUserVO;
 import com.kxs.product.api.vo.kxsapp.shop.ShopOrderListVO;
@@ -41,9 +39,11 @@ public interface KxsShopOrderMapper extends BaseMapper<KxsShopOrder> {
 
     /**
      * 查询用户购买指定商品的全部订单
-     * @param userId
-     * @return
+     *
+     * @param userId  用户 ID
+     * @param shopIds 店铺 ID
+     * @return {@link List}<{@link KxsShopOrder}>
      */
-    List<KxsShopOrder> verifyUserTickteCountAndShopAndActivite(@Param("userId") Long userId,@Param("shopIds")List<Long> shopIds);
+    List<KxsShopOrder> verifyUserTicketCountAndShopAndAct(@Param("userId") Long userId, @Param("shopIds")List<Long> shopIds);
 }
 

+ 0 - 1
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/mq/RabbitShopQueueListener.java

@@ -43,7 +43,6 @@ public class RabbitShopQueueListener {
 			KxsShopOrder order = kxsShopOrderService.getById(id);
 			if (order != null && order.getStatus().equals(KxsShopEnum.ORDER_NO_PAY.getType())){
 
-				//todo 这里只取消了我们平台的订单,如已发起支付渠道调用,仍需取消支付渠道
 				order.setStatus(KxsShopEnum.ORDER_CANCEL.getType());
 				kxsShopOrderService.updateById(order);
 			}

+ 7 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsShopOrderService.java

@@ -86,5 +86,12 @@ public interface KxsShopOrderService extends IService<KxsShopOrder> {
      * @return {@link List}<{@link ShopOrderGoodsUserVO}>
      */
     List<ShopOrderGoodsUserVO> getDateBetweenOrders(String startTime, String endTime);
+
+    /**
+     * 支付订单回调
+     *
+     * @param outTradeNo 订单编号
+     */
+    void payBack(String outTradeNo);
 }
 

+ 10 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/KxsTicketService.java

@@ -36,5 +36,15 @@ public interface KxsTicketService extends IService<KxsTicket> {
      * @return {@link R}
      */
     Boolean checkUserPreLevelTicket(Long userId, Long level);
+
+    /**
+     * 用户购券
+     *
+     * @param userId     用户 ID
+     * @param ticketType 门票类型
+     * @param orderId    订单 ID
+     * @param number 购买数量
+     */
+    Boolean userBuyTicket(Long userId, Integer ticketType, Integer orderId, Integer number);
 }
 

+ 100 - 69
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.kxs.product.biz.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import com.alipay.api.AlipayApiException;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -25,8 +26,10 @@ import com.kxs.product.api.model.*;
 import com.kxs.product.api.vo.kxsapp.shop.*;
 import com.kxs.product.biz.constant.enums.KxsShopEnum;
 import com.kxs.product.biz.constant.enums.ProductErrorTypeEnum;
+import com.kxs.product.biz.constant.enums.TicketTypeEnum;
 import com.kxs.product.biz.mapper.*;
 import com.kxs.product.biz.service.KxsShopOrderService;
+import com.kxs.product.biz.service.KxsTicketService;
 import com.kxs.user.api.feign.RemoteKxsUserService;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.RequiredArgsConstructor;
@@ -35,6 +38,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Objects;
@@ -60,7 +64,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
 
     private final PaymentFactory paymentFactory;
     private final KxsShopGoodsSkuMapper kxsShopGoodsSkuMapper;
-    private final KxsTicketMapper kxsTicketMapper;
+    private final KxsTicketService kxsTicketService;
     private final IMQSender mqSender;
     private final KxsShopGoodsMapper kxsShopGoodsMapper;
     @Override
@@ -72,6 +76,17 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
         //订单号
         String orderSn = CommonConstants.KXS_SHOP_PREFIX + IdUtil.getSnowflakeNextIdStr();
 
+        //查询商品
+        KxsShopGoods goods = goodsMapper.selectById(param.getGoodsId());
+        Optional.ofNullable(goods).orElseThrow(() -> new GlobalCustomerException("商品不存在"));
+        //查询商品sku
+        KxsShopGoodsSku kxsShopGoodsSku = kxsShopGoodsSkuMapper.selectOne(Wrappers.<KxsShopGoodsSku>query().lambda().eq(KxsShopGoodsSku::getGoodId, goods.getId()));
+        Optional.ofNullable(kxsShopGoodsSku).orElseThrow(() -> new GlobalCustomerException("商品sku不存在"));
+        BigDecimal totalPrice = kxsShopGoodsSku.getPrice().multiply(new BigDecimal(param.getNumber()));
+        if(totalPrice.compareTo(param.getTotalPrice()) != 0){
+            return R.failed("订单金额不一致");
+        }
+
         KxsShopOrder order = new KxsShopOrder();
         //参数赋值
         BeanUtils.copyProperties(param, order);
@@ -81,41 +96,35 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
         order.setPayPrice(order.getTotalPrice());
         baseMapper.insert(order);
 
-        //查询商品
-        KxsShopGoods goods = goodsMapper.selectById(param.getGoodsId());
-        Optional.ofNullable(goods).orElseThrow(() -> new GlobalCustomerException("商品不存在"));
-        //查询商品sku
-        KxsShopGoodsSku kxsShopGoodsSku = kxsShopGoodsSkuMapper.selectOne(Wrappers.<KxsShopGoodsSku>query().lambda().eq(KxsShopGoodsSku::getGoodId, goods.getId()));
-        if (kxsShopGoodsSku != null){
-            //当sku库存不为null时需做存量校验
-            if (kxsShopGoodsSku.getStockNum() != null && kxsShopGoodsSku.getStockNum() != -1){
-                int i = kxsShopGoodsSku.getStockNum() - param.getNumber();
-                if(i < 0){
-                    return R.failed("当前库存不足");
-                }
-                kxsShopGoodsSku.setStockNum(i);
-                //修改库存
-                kxsShopGoodsSkuMapper.updateById(kxsShopGoodsSku);
+
+        //当sku库存不为null时需做存量校验
+        if (kxsShopGoodsSku.getStockNum() != null && kxsShopGoodsSku.getStockNum() != -1){
+            int i = kxsShopGoodsSku.getStockNum() - param.getNumber();
+            if(i < 0){
+                throw new GlobalCustomerException("当前库存不足");
             }
-            //校验是否存在起购以及限购数量校验
-            if (kxsShopGoodsSku.getStartByCount() != null && kxsShopGoodsSku.getStartByCount() != 0){
-                boolean b = kxsShopGoodsSku.getStartByCount() > param.getNumber();
-                if (b){
-                    return R.failed("该商品最低" + kxsShopGoodsSku.getStartByCount() + "件起购");
-                }
-            }else if (kxsShopGoodsSku.getLimitCount() != null && kxsShopGoodsSku.getLimitCount() != 0){
-                boolean b = kxsShopGoodsSku.getLimitCount() < param.getNumber();
-                if (b){
-                    return R.failed("该商品每人最多购买" + kxsShopGoodsSku.getLimitCount() + "件");
-                }
+            kxsShopGoodsSku.setStockNum(i);
+            //修改库存
+            kxsShopGoodsSkuMapper.updateById(kxsShopGoodsSku);
+        }
+        //校验是否存在起购以及限购数量校验
+        if (kxsShopGoodsSku.getStartByCount() != null && kxsShopGoodsSku.getStartByCount() != 0){
+            boolean b = kxsShopGoodsSku.getStartByCount() > param.getNumber();
+            if (b){
+                throw new GlobalCustomerException("该商品最低" + kxsShopGoodsSku.getStartByCount() + "件起购");
+            }
+        }else if (kxsShopGoodsSku.getLimitCount() != null && kxsShopGoodsSku.getLimitCount() != 0){
+            boolean b = kxsShopGoodsSku.getLimitCount() < param.getNumber();
+            if (b){
+                throw new GlobalCustomerException("该商品每人最多购买" + kxsShopGoodsSku.getLimitCount() + "件");
             }
         }
         //订单详情
         KxsShopOrderInfo orderInfo = new KxsShopOrderInfo();
         orderInfo.setNumber(param.getNumber());
         orderInfo.setGoodsId(param.getGoodsId());
-        orderInfo.setSkuId(param.getSkuId());
-        orderInfo.setSpecifications(param.getSpecifications());
+        orderInfo.setSkuId(kxsShopGoodsSku.getId());
+        orderInfo.setSpecifications(kxsShopGoodsSku.getSpecifications());
         orderInfo.setGoodsName(goods.getGoodsName());
         orderInfo.setGoodsPrice(goods.getPrice());
         orderInfo.setPicUrl(goods.getPicUrl());
@@ -152,7 +161,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
             shopOrderDetailVO.getGoodsList().add(infoListVO);
         });
         //机具券集合
-        List<KxsTicket> kxsTickets = kxsTicketMapper.selectList(Wrappers.<KxsTicket>lambdaQuery().eq(KxsTicket::getOrderId, orderId));
+        List<KxsTicket> kxsTickets = kxsTicketService.list(Wrappers.<KxsTicket>lambdaQuery().eq(KxsTicket::getOrderId, orderId));
         shopOrderDetailVO.setTicketCodes(kxsTickets.stream().map(KxsTicket::getTicketCode).collect(Collectors.toList()));
 
         return shopOrderDetailVO;
@@ -177,7 +186,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
         }
 
         //校验支付方式,邮寄需要
-        if (param.getGetMode().equals(1)){
+        if (Objects.equals(param.getGetMode(), KxsShopEnum.ORDER_ERP.getType())){
             order.setGetMode(param.getGetMode());
             order.setPhone(param.getPhone());
             order.setConsignee(param.getConsignee());
@@ -186,7 +195,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
             order.setRemark(param.getRemark());
             //修改订单地址
             updateById(order);
-        }else if (param.getGetMode().equals(0)){
+        }else {
             order.setGetMode(param.getGetMode());
             order.setPayType(param.getPayType());
             order.setRemark(param.getRemark());
@@ -202,71 +211,92 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
 
         //余额支付
         if(param.getPayType().equals(KxsShopEnum.YUE_PAY.getType())){
-            Optional.ofNullable(param.getPayPwd()).orElseThrow(() -> new GlobalCustomerException("请输入支付密码"));
+
             //校验支付密码
             R<Boolean> booleanR = remoteKxsUserService.checkPayPwd(param.getPayPwd());
             if(booleanR.getStatus() != 1 || !booleanR.getData()){
-                return R.failed("支付密码错误");
+                throw new GlobalCustomerException("支付密码错误");
             }
 
             LambdaUpdateWrapper<KxsShopOrder> lambdaUpdateWrapper = Wrappers.<KxsShopOrder>lambdaUpdate().eq(KxsShopOrder::getId, param.getId());
-            lambdaUpdateWrapper.set(KxsShopOrder::getPayType, param.getPayType())
-                    .set(KxsShopOrder::getGetMode, param.getGetMode())
-                    .set(KxsShopOrder::getRemark, param.getRemark());
 
             PayRequest payReq = new PayRequest();
-            payReq.setPayTypeEnum(PayPlatformEnum.ALIPAY);
+            payReq.setPayTypeEnum(PayPlatformEnum.YUEPAY);
             payReq.setOutTradeNo(order.getOrderSn());
             payReq.setSubject(subject);
             payReq.setTotalAmount(order.getPayPrice().doubleValue());
             try {
                 PayResponse payResponse = paymentFactory.getPayService(PayPlatformEnum.YUEPAY.getType()).appPay(payReq);
 
-                YuePayMessage payMessage = BeanUtil.toBean(payResponse, YuePayMessage.class);
+                YuePayMessage payMessage = BeanUtil.toBean(payResponse.getResult(), YuePayMessage.class);
                 if (payMessage != null) {
                     //支付成功
                     lambdaUpdateWrapper.set(KxsShopOrder::getStatus, KxsShopEnum.ORDER_NO_SEND.getType());
                     lambdaUpdateWrapper.set(KxsShopOrder::getPayTime, LocalDateTime.now());
                 }else{
-                    return R.failed(payResponse.getResult());
+                    throw new GlobalCustomerException("余额支付异常");
                 }
             } catch (AlipayApiException e) {
                 throw new GlobalCustomerException("余额支付异常");
             }
-            //修改订单信息
-            this.update(lambdaUpdateWrapper);
-            //TODO 余额走支付接下来的逻辑
-            //根据订单详情依次处理
-            for (KxsShopOrderInfo kxsShopOrderInfo : kxsShopOrderInfos) {
-                switch(kxsShopOrderInfo.getGoodsId()){
-                    case 10:
-                        //电签兑换券流程
-                        List<KxsTicket> kxsTickets = kxsTicketMapper.selectList(new Page<>(1, 3), Wrappers.<KxsTicket>query().lambda()
-                                .eq(KxsTicket::getUserId, 0)
-                                .eq(KxsTicket::getTicketType, 0)
-                                .eq(KxsTicket::getStatus, 0));
-                        if (kxsTickets.size() < 3){
-                            throw new GlobalCustomerException("劵码库存不足");
-                        }
-                        for (KxsTicket kxsTicket : kxsTickets) {
-                            kxsTicket.setUpdateTime(LocalDateTime.now());
-                            kxsTicket.setStatus(0);
-                            kxsTicket.setUserId(Math.toIntExact(order.getUserId()));
-                            kxsTicket.setTicketAllotPath(kxsTicket.getTicketAllotPath() + order.getUserId() + "," );
-                            kxsTicket.setOrderId(order.getId());
-                            //todo 盟主 合伙人标记
-//                            kxsTicket.setLeaderId();
-//                            kxsTicket.setPartnerId();
-                            kxsTicketMapper.updateById(kxsTicket);
-                        }
-                }
+
+            //目前只能下单一个商品,故直接取之
+            KxsShopOrderInfo kxsShopOrderInfo = kxsShopOrderInfos.get(0);
+            switch(kxsShopOrderInfo.getGoodsId()){
+                case 10:
+                    if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DQ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 3)){
+                        throw new GlobalCustomerException("兑换电签机具券失败" + order.getOrderSn());
+                    }
+                case 11:
+                    if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DJ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 2)){
+                        throw new GlobalCustomerException("兑换大机机具券失败" + order.getOrderSn());
+                    }
+            }
+            KxsShopGoods goods = kxsShopGoodsMapper.selectById(kxsShopOrderInfo.getGoodsId());
+            //虚拟商品改为已完成
+            if(Objects.equals(goods.getGoodsType(), KxsShopEnum.GOODS_VIRTUAL.getType())){
+                lambdaUpdateWrapper.set(KxsShopOrder::getStatus, KxsShopEnum.ORDER_CONFIRM.getType());
             }
 
+            this.update(lambdaUpdateWrapper);
+        }
 
+        return R.ok();
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void payBack(String outTradeNo) {
+        KxsShopOrder order = baseMapper.selectOne(Wrappers.<KxsShopOrder>lambdaQuery().eq(KxsShopOrder::getOrderSn, outTradeNo).last("FOR UPDATE"));
+        if(order == null){
+            throw new GlobalCustomerException("订单支付回调未找到订单号:" + outTradeNo);
+        }
+        if(!Objects.equals(order.getStatus(), KxsShopEnum.ORDER_NO_PAY.getType())){
+            throw new GlobalCustomerException("订单支付回调状态错误订单号:" + outTradeNo);
+        }
+        order.setStatus(KxsShopEnum.ORDER_NO_SEND.getType());
+        order.setPayTime(LocalDateTime.now());
+        List<KxsShopOrderInfo> kxsShopOrderInfos = orderInfoMapper.selectList(Wrappers.<KxsShopOrderInfo>lambdaQuery().eq(KxsShopOrderInfo::getOrderId, order.getId()));
+        KxsShopOrderInfo kxsShopOrderInfo = kxsShopOrderInfos.get(0);
+        switch(kxsShopOrderInfo.getGoodsId()){
+            case 10:
+                if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DQ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 3)){
+                    throw new GlobalCustomerException("兑换电签机具券失败订单号:" + outTradeNo);
+                }
+            case 11:
+                if(!kxsTicketService.userBuyTicket(order.getUserId(), TicketTypeEnum.CODE_DJ.getType(), order.getId(), kxsShopOrderInfo.getNumber() * 2)){
+                    throw new GlobalCustomerException("兑换大机机具券失败订单号:" + outTradeNo);
+                }
+        }
+        KxsShopGoods goods = kxsShopGoodsMapper.selectById(kxsShopOrderInfo.getGoodsId());
+        //虚拟商品改为已完成
+        if(Objects.equals(goods.getGoodsType(), KxsShopEnum.GOODS_VIRTUAL.getType())){
+            order.setStatus(KxsShopEnum.ORDER_CONFIRM.getType());
         }
 
+        this.updateById(order);
 
-        return R.ok();
     }
 
 
@@ -343,6 +373,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
     }
 
 
+
     /**
      * 支付宝支付
      *
@@ -359,7 +390,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
             payReq.setSubject(subject);
             payReq.setTotalAmount(param.getPayPrice().doubleValue());
             //扩展参数
-            payReq.setPassbackParams("shop_order");
+            payReq.setPassbackParams(CommonConstants.SHOP_ORDER_FLAG);
 
             PayResponse payResponse = paymentFactory.getPayService(PayPlatformEnum.ALIPAY.getType()).appPay(payReq);
 

+ 25 - 1
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsTicketServiceImpl.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.common.core.constant.CommonConstants;
+import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.security.util.SecurityUtils;
 import com.kxs.product.api.model.KxsBrand;
 import com.kxs.product.api.model.KxsMachine;
@@ -62,7 +64,7 @@ public class KxsTicketServiceImpl extends ServiceImpl<KxsTicketMapper, KxsTicket
         //指定商品id  (10-电签机具/广电卡通兑券,11-大POS兑换券,77-来客吧产品组合包A.78-来客吧产品组合包B.79-来客产品组合包C)
         List<Long> shopIds = Arrays.asList(10L,11L,77L,78L,79L);
         //校验是否下单过指定商品
-        List<KxsShopOrder> kxsShopOrderList = kxsShopOrderMapper.verifyUserTickteCountAndShopAndActivite(userId,shopIds);
+        List<KxsShopOrder> kxsShopOrderList = kxsShopOrderMapper.verifyUserTicketCountAndShopAndAct(userId,shopIds);
         if (!kxsShopOrderList.isEmpty()){
             return true;
         }
@@ -87,5 +89,27 @@ public class KxsTicketServiceImpl extends ServiceImpl<KxsTicketMapper, KxsTicket
         }
 
     }
+
+    @Override
+    public Boolean userBuyTicket(Long userId, Integer ticketType, Integer orderId, Integer number) {
+        //电签兑换券流程
+        List<KxsTicket> kxsTickets = baseMapper.selectList( Wrappers.<KxsTicket>query().lambda()
+                .eq(KxsTicket::getUserId, 0)
+                .eq(KxsTicket::getTicketType, ticketType)
+                .eq(KxsTicket::getStatus, TicketTypeEnum.CODE_UNUSED.getType()).last("limit " + number));
+        if (kxsTickets == null || kxsTickets.size() != 3){
+            throw new GlobalCustomerException("劵码库存不足订单id:" + orderId);
+        }
+        for (KxsTicket kxsTicket : kxsTickets) {
+            kxsTicket.setUserId(userId.intValue());
+            kxsTicket.setTicketAllotPath(CommonConstants.FAIL + "," + userId + "," );
+            kxsTicket.setOrderId(orderId);
+            //todo 盟主 合伙人标记
+//            kxsTicket.setLeaderId();
+//            kxsTicket.setPartnerId();
+            baseMapper.updateById(kxsTicket);
+        }
+        return Boolean.TRUE;
+    }
 }
 

+ 1 - 1
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsShopOrderMapper.xml

@@ -83,7 +83,7 @@
         </where>
 
     </select>
-    <select id="verifyUserTickteCountAndShopAndActivite" resultType="com.kxs.product.api.model.KxsShopOrder">
+    <select id="verifyUserTicketCountAndShopAndAct" resultType="com.kxs.product.api.model.KxsShopOrder">
         select kso.* from kxs_shop_order kso
         left join kxs_shop_order_info ksoi on kso.id = ksoi.order_id
         where kso.del_flag != 1