Переглянути джерело

生成盲票改成先保存再发消息;支付回执逻辑改成一个事务

chunping 3 роки тому
батько
коміт
49f6579779

+ 16 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -31,9 +31,11 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.ChannelRoleEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.ServerEnvEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.RSAUtil;
 import com.qs.mp.system.domain.SysUser;
@@ -50,6 +52,7 @@ import java.util.List;
 import java.util.Map;
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.pulsar.client.api.PulsarClientException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -85,6 +88,9 @@ public class TicketBoxMgrController extends BaseApiController {
 	@Autowired
 	private ITicketAwardsService ticketAwardsService;
 
+	@Autowired
+	private PulsarClientService pulsarClientService;
+
 	@Autowired
 	private MapperFacade mapperFacade;
 
@@ -157,8 +163,16 @@ public class TicketBoxMgrController extends BaseApiController {
 				return AjaxResult.error("每包张数必须大于0");
 			}
 		}
-		boolean rtn = ticketBoxService.createTicketBox(param);
-		return rtn ? AjaxResult.success() : AjaxResult.error("创建失败");
+		String boxId = ticketBoxService.createTicketBox(param);
+		if (StringUtils.isNotBlank(boxId)) {
+			try {
+				pulsarClientService.producer(MqTopicType.ticket_generate, boxId);
+			} catch (PulsarClientException e) {
+				LogUtil.error(logger, e, "盲票组保存成功,发送异步消息失败. {0}", boxId);
+			}
+			return AjaxResult.success();
+		}
+		return AjaxResult.error("创建失败");
 	}
 
 	/**

+ 6 - 10
mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java

@@ -77,18 +77,14 @@ public class PayCallBackController {
     payOrder.setCompleteDate(completeDate);
     payOrder.setChannelNo(channelNo);
     payOrder.setOrderStatus(orderStatus);
-    // 订单支付状态单独保存
-    LambdaUpdateWrapper<PayOrder> updateWrapper = new LambdaUpdateWrapper<>();
-    updateWrapper.eq(PayOrder::getOrderStatus,2);
-    updateWrapper.eq(PayOrder::getOrderId,shopOrderNo);
-    boolean ret = payOrderService.update(payOrder,updateWrapper);
-    if(ret){
-      // 更新订单,单独封装一个事物接口服务
+
+    try {
+      // 更新订单,单个事务处理
       logger.info("支付回调消息更新成功 shopOrderNo:"+shopOrderNo);
-      walletService.payOrderStatusHandle(shopOrderNo);
+      walletService.payOrderStatusHandle(payOrder);
       responseWrite(response,"success");
-    }else{
-      LogUtil.error(logger,"支付回调消息更新失败 shopOrderNo:"+shopOrderNo);
+    } catch (Exception e){
+      LogUtil.error(logger, e, "支付回调消息更新失败 shopOrderNo:"+shopOrderNo);
       responseWrite(response,"error");
     }
   }

+ 41 - 0
mp-common/src/main/java/com/qs/mp/common/enums/PayOrderStatusEnum.java

@@ -0,0 +1,41 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ *
+ * 支付订单状态类型
+ *
+ */
+public enum PayOrderStatusEnum implements IEnum<String> {
+
+  SUCCESS("1", "支付成功"),
+  WAIT("2", "待支付");
+
+
+  private final String value;
+  private final String desc;
+
+  PayOrderStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java

@@ -19,7 +19,7 @@ public interface ITicketBoxService extends IService<TicketBox> {
    * @param param
    * @return
    */
-  boolean createTicketBox(TicketBoxCreateParam param);
+  String createTicketBox(TicketBoxCreateParam param);
 
   /**
    * 生成盲票

+ 2 - 11
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -97,12 +97,9 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
   @Autowired
   private ITicketPackageService ticketPackageService;
 
-  @Autowired
-  private PulsarClientService pulsarClientService;
-
   @Override
   @Transactional
-  public boolean createTicketBox(TicketBoxCreateParam param) {
+  public String createTicketBox(TicketBoxCreateParam param) {
     // 创建盲票组
     TicketBox ticketBox = mapperFacade.map(param, TicketBox.class);
     ticketBox.setPkgQty(ticketBox.getQuantity() / ticketBox.getPkgUnit());
@@ -160,13 +157,7 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     }
     ticketAwardsService.saveBatch(ticketAwardsList);
     ticketAwardsPrizeService.saveBatch(awardsPrizeList);
-
-    try {
-      pulsarClientService.producer(MqTopicType.ticket_generate, ticketBox.getBoxId());
-    } catch (PulsarClientException e) {
-      LogUtil.error(logger, e, "盲票组保存成功,发送异步消息失败. {0}", JSONObject.toJSONString(ticketBox));
-    }
-    return true;
+    return ticketBox.getBoxId();
   }
 
   @Override

+ 3 - 3
mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java

@@ -24,10 +24,10 @@ public interface IWalletService {
   /**
    *
    *订单支付回调统一处理函数
-   * @param orderNo
-   * @return
+   *
+   * @param payOrder@return
    */
-  void payOrderStatusHandle(String orderNo);
+  void payOrderStatusHandle(PayOrder payOrder);
 
   /**
    * 账户提现

+ 23 - 19
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -2,8 +2,10 @@ package com.qs.mp.pay.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.PayOrderStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
@@ -22,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @auther duota
@@ -118,34 +121,35 @@ public class WalletServiceImpl implements IWalletService {
   }
 
   @Override
-  @Async
-  public void payOrderStatusHandle(String orderNo) {
+  @Transactional
+  public void payOrderStatusHandle(PayOrder payOrder) {
+    String orderNo = payOrder.getOrderId();
+    // 订单支付状态单独保存
+    LambdaUpdateWrapper<PayOrder> updateWrapper = new LambdaUpdateWrapper<>();
+    updateWrapper.eq(PayOrder::getOrderStatus, PayOrderStatusEnum.WAIT.getValue());
+    updateWrapper.eq(PayOrder::getOrderId, orderNo);
+    boolean ret = payOrderService.update(payOrder, updateWrapper);
+    if (!ret) {
+      throw new ServiceException("支付订单更新失败,orderNo:" + orderNo);
+    }
     //查询统一支付订单表,查询订单类型,然后根据不同类型做对应的逻辑处理
     //查询支付状态为1:支付成功,2:订单创建成功,等待支付。
-    LambdaQueryWrapper<PayOrder> wrapper = new LambdaQueryWrapper();
-    wrapper.eq(PayOrder::getOrderId, orderNo);
-    wrapper.eq(PayOrder::getOrderStatus, "1");
-    List<PayOrder> payOrderList = payOrderService.list(wrapper);
-    if (payOrderList.size() != 1) {
-      //数据结构异常,告警
-      LogUtil.error(logger, "数据结构异常,违反唯一约束,orderNo:" + orderNo);
-    }
-    //渠道订单
-    PayOrder payOrder = payOrderList.get(0);
+    PayOrder order = payOrderService.getById(orderNo);
     LogUtil.info(logger, "支付回调,bizType:{0},bizId:{1}" ,
-        new Object[]{payOrder.getBizType(), payOrder.getBizId()});
-    if (BizTypeEnum.CHANNEL_ORDER == payOrder.getBizType()) {
+        new Object[]{order.getBizType(), order.getBizId()});
+    if (BizTypeEnum.CHANNEL_ORDER == order.getBizType()) {
       // 渠道盲票采购订单支付成功,调用业务订单服务处理
-      channelOrderService.paySuccess(payOrder);
-    } else if (BizTypeEnum.TICKET_ORDER == payOrder.getBizType()) {
+      channelOrderService.paySuccess(order);
+    } else if (BizTypeEnum.TICKET_ORDER == order.getBizType()) {
       // 用户盲票购买订单支付成功,调用业务订单服务处理
-      userTicketOrderService.paySuccess(payOrder);
-    } else if (BizTypeEnum.DELIVER_ORDER == payOrder.getBizType()) {
+      userTicketOrderService.paySuccess(order);
+    } else if (BizTypeEnum.DELIVER_ORDER == order.getBizType()) {
       // 用户提货订单支付成功,调用业务订单服务处理
-      userDeliverOrderService.paySuccess(payOrder);
+      userDeliverOrderService.paySuccess(order);
     } else {
       //数据结构异常,告警
       LogUtil.error(logger, "该业务单据类型未支持,orderNo:" + orderNo);
+      throw new ServiceException("该业务单据类型未支持,orderNo:" + orderNo);
     }
   }