Browse Source

Merge branch 'dev' of http://113.31.163.91:7777/quanshu/mp-server.git into dev

Liugl 3 years ago
parent
commit
aa986df09a
23 changed files with 241 additions and 78 deletions
  1. 9 5
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  2. 2 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserAddrController.java
  3. 2 17
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  4. 4 4
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  5. 7 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  6. 5 4
      mp-admin/src/main/resources/application-dev.yml
  7. 3 2
      mp-admin/src/main/resources/application-test.yml
  8. 1 1
      mp-admin/src/main/resources/application.yml
  9. 1 1
      mp-admin/src/main/resources/logback-spring.xml
  10. 21 0
      mp-common/pom.xml
  11. 3 2
      mp-common/src/main/java/com/qs/mp/common/enums/BizTypeEnum.java
  12. 2 1
      mp-common/src/main/java/com/qs/mp/common/enums/MqTopicType.java
  13. 6 1
      mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java
  14. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketParam.java
  15. 2 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/TicketMapper.java
  16. 10 3
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketService.java
  17. 5 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketServiceImpl.java
  18. 28 15
      mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java
  19. 13 7
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  20. 2 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrder.java
  21. 70 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java
  22. 26 3
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  23. 16 5
      mp-service/src/main/resources/mapper/admin/TicketMapper.xml

+ 9 - 5
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -182,21 +182,25 @@ public class TicketBoxMgrController extends BaseApiController {
 		if (totalSize == 0) {
 			return AjaxResult.error("选择的盲票组中没有可导出的数据");
 		}
-		if(totalSize > 1000) {
-			int totalPage = totalSize%1000 == 0?totalSize/1000:totalSize/1000+1;
+		int pageSize = 2000;
+		if(totalSize > pageSize) {
+			int totalPage = totalSize%pageSize == 0 ? totalSize/pageSize : totalSize/pageSize+1;
 			for (int i = 0; i < totalPage; i++) {
 				LambdaQueryWrapper<Ticket> pageQueryWrapper = new LambdaQueryWrapper<Ticket>();
 				pageQueryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
-				pageQueryWrapper.last("limit "+(i+1)+", 1000");
+				pageQueryWrapper.orderByAsc(Ticket::getSerialNo);
+				//pageQueryWrapper.last("limit "+ (i*pageSize) +", " + pageSize);
+				pageQueryWrapper.last("limit " + pageSize);
 				List<Ticket> list = ticketService.list(pageQueryWrapper);
 				if(null != list && list.size() > 0 ) {
 					listAll.addAll(list);
 				}
 			}
 		}else {
+			queryWrapper.orderByAsc(Ticket::getSerialNo);
 			listAll = ticketService.list(queryWrapper);
 		}
-		
+
 		if(null != listAll && listAll.size() > 0 ) {
 			for (Ticket ticket : listAll) {
 				if (null != ticket && StringUtils.isNotBlank(ticket.getSerialNo())
@@ -211,7 +215,7 @@ public class TicketBoxMgrController extends BaseApiController {
 				}
 			}
 		}
-		
+
 		ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
 		return util.exportExcel(excelList, "盲票导出数据", true);
 	}

+ 2 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserAddrController.java

@@ -49,9 +49,9 @@ public class UserAddrController {
   @PostMapping("/addr/list")
   @ApiOperation(value = "渠道地址列表" , notes = "获取渠道的所有地址信息")
   public AjaxResult list(@RequestBody AddrParam addrParam) {
-    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Long userId = SecurityUtils.getLoginUser().getUserId();
     List<UserAddr> userAddrs = userAddrService.list(
-        new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, channelId)
+        new LambdaQueryWrapper<UserAddr>().eq(UserAddr::getUserId, userId)
             .orderByDesc(UserAddr::getCommonAddr).orderByDesc(UserAddr::getUpdateTime));
     return AjaxResult.success(userAddrs);
   }

+ 2 - 17
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java

@@ -12,37 +12,23 @@ package com.qs.mp.web.controller.api.user;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.qs.mp.admin.domain.CouponTicket;
-import com.qs.mp.admin.domain.Ticket;
-import com.qs.mp.admin.domain.TicketBox;
-import com.qs.mp.admin.service.ICouponTicketService;
-import com.qs.mp.admin.service.ITicketBoxService;
-import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.BizTypeEnum;
-import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
-import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.framework.redis.RedisKey;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserPrizeStorage;
-import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.param.DeliverOrderParam;
-import com.qs.mp.user.domain.param.TicketOrderParam;
 import com.qs.mp.user.domain.vo.DeliverOrderSettleVO;
-import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
-import com.qs.mp.user.domain.vo.UserCouponVO;
 import com.qs.mp.user.service.IUserAddrService;
-import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.qs.mp.user.service.IUserPrizeStorageService;
-import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
@@ -53,7 +39,6 @@ import javax.validation.Valid;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -161,13 +146,13 @@ public class UserDeliverOrderController extends BaseApiController {
    * 订单支付
    */
   @PostMapping("/order/pay")
-  @ApiOperation(value = "订单支付" , notes = "在盲票页面支付")
+  @ApiOperation(value = "订单支付" , notes = "订单支付")
   public AjaxResult pay(@Valid @RequestBody OrderPayParam param) {
     String openId = SecurityUtils.getLoginUser().getUser().getOpenId();
     UserDeliverOrder deliverOrder = userDeliverOrderService.getById(param.getOrderId());
     JSONObject jsonObject;
     try {
-      jsonObject = walletService.pay(BizTypeEnum.USER_ORDER, param.getOrderId(), openId, deliverOrder.getFreightAmt());
+      jsonObject = walletService.pay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), openId, deliverOrder.getPayAmt());
     }catch (ServiceException e) {
       return AjaxResult.error(e.getMessage());
     }

+ 4 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java

@@ -158,11 +158,11 @@ public class UserTicketController extends BaseApiController {
   @ApiOperation(value = "查看兑奖奖品" , notes = "根据盲票ID,查看兑奖奖品")
   public AjaxResult queryHitPrizeList(@RequestBody TicketParam param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
-    if (StringUtils.isBlank(param.getSerialNo())) {
+    if (StringUtils.isBlank(param.getTicketId())) {
       return AjaxResult.error("参数异常,盲票ID缺失");
     }
 
-    Ticket ticket = ticketService.getOne(new LambdaQueryWrapper<Ticket>().eq(Ticket::getSerialNo, param.getSerialNo()));
+    Ticket ticket = ticketService.getById(param.getTicketId());
     if (null == ticket) {
       return AjaxResult.error("参数异常,盲票不存在");
     }
@@ -184,12 +184,12 @@ public class UserTicketController extends BaseApiController {
   @ApiOperation(value = "兑奖" , notes = "选择奖品兑奖")
   public AjaxResult cashPrize(@RequestBody TicketParam param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
-    if (StringUtils.isBlank(param.getSerialNo()) || StringUtils.isBlank(param.getAwardsId())
+    if (StringUtils.isBlank(param.getTicketId()) || StringUtils.isBlank(param.getAwardsId())
     || StringUtils.isBlank(param.getPrizeId())) {
       return AjaxResult.error("参数缺失");
     }
 
-    Ticket ticket = ticketService.getOne(new LambdaQueryWrapper<Ticket>().eq(Ticket::getSerialNo, param.getSerialNo()));
+    Ticket ticket = ticketService.getById(param.getTicketId());
     if (null == ticket) {
       return AjaxResult.error("参数异常,盲票不存在");
     }

+ 7 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -161,11 +161,15 @@ public class UserTicketOrderController extends BaseApiController {
       return AjaxResult.error("订单已过期,请重新下单");
     }
     String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO);
-
+    JSONObject jsonObject = new JSONObject();
+    jsonObject.put("orderId", orderId);
+    if (orderSettleVO.getPayAmt() > 0) {
+      jsonObject.put("needPay", 1);
+    }
     // 清除缓存的订单
     redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
 
-    return AjaxResult.success(orderId);
+    return AjaxResult.success(jsonObject);
   }
 
 
@@ -189,7 +193,7 @@ public class UserTicketOrderController extends BaseApiController {
     UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
     JSONObject jsonObject;
     try {
-      jsonObject = walletService.pay(BizTypeEnum.USER_ORDER, param.getOrderId(), openId, ticketOrder.getPayAmt());
+      jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), openId, ticketOrder.getPayAmt());
     }catch (ServiceException e) {
       return AjaxResult.error(e.getMessage());
     }

+ 5 - 4
mp-admin/src/main/resources/application-dev.yml

@@ -25,9 +25,9 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
-                username: root
-                password: 123456
+                url: jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
+                username: mptest
+                password: wan789*@dfhzHu518!dr2xosn
                 # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
@@ -111,7 +111,8 @@ mq:
     service-url: http://pulsar-rkrxw2wx8zeo.tdmq-pulsar.ap-sh.public.tencenttdmq.com:8080
     auth-token: eyJrZXlJZCI6InB1bHNhci1ya3J4dzJ3eDh6ZW8iLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwdWxzYXItcmtyeHcyd3g4emVvX21wLXNlcnZlci10ZXN0In0.12cemXSqXGn9beDFnB-uUe477G6pP9bNbDUA4fIRsgk
     topic-ticket-generate: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate
-    consumer-topics: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate
+    topic-ticket-pay: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
+    consumer-topics: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate,pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
 
 # 小程序
 miniprogram:

+ 3 - 2
mp-admin/src/main/resources/application-test.yml

@@ -35,7 +35,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
+                url: jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
                 username: mptest
                 password: wan789*@dfhzHu518!dr2xosn
             # 从库数据源
@@ -116,7 +116,8 @@ mq:
   service-url: http://pulsar-rkrxw2wx8zeo.tdmq-pulsar.ap-sh.public.tencenttdmq.com:8080
   auth-token: eyJrZXlJZCI6InB1bHNhci1ya3J4dzJ3eDh6ZW8iLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwdWxzYXItcmtyeHcyd3g4emVvX21wLXNlcnZlci10ZXN0In0.12cemXSqXGn9beDFnB-uUe477G6pP9bNbDUA4fIRsgk
   topic-ticket-generate: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate
-  consumer-topics: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate
+  topic-ticket-pay: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
+  consumer-topics: pulsar-rkrxw2wx8zeo/test-share/topic-ticket-generate,pulsar-rkrxw2wx8zeo/test-share/topic-ticket-pay
 
 
 # 小程序

+ 1 - 1
mp-admin/src/main/resources/application.yml

@@ -15,7 +15,7 @@ mp:
   # 验证码类型 math 数组计算 char 字符验证
   captchaType: math
   # 盲票导出baseUrl
-  exportUrl: https://adm.51jiazhu.com/jump.html?no=
+  exportUrl: https://mp-agent.51jiazhu.com/jump.html?id=
 
 # 开发环境配置
 server:

+ 1 - 1
mp-admin/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/Users/steven/Documents/logs" />
+	<property name="log.path" value="/Users/daixiaodan/Documents/logs" />
     <!-- 日志输出格式 -->
     <!-- You can override this to have a custom pattern -->
 	<property name="CONSOLE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

+ 21 - 0
mp-common/pom.xml

@@ -138,6 +138,27 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>redis.clients</groupId>
+                    <artifactId>jedis</artifactId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>lettuce-core</artifactId>
+                    <groupId>io.lettuce</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- jedis客户端 -->
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <!-- spring2.X集成redis所需common-pool2,使用jedis必须依赖它-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
         </dependency>
 
         <!-- pool 对象池 -->

+ 3 - 2
mp-common/src/main/java/com/qs/mp/common/enums/BizTypeEnum.java

@@ -10,8 +10,9 @@ import com.baomidou.mybatisplus.annotation.IEnum;
  */
 public enum BizTypeEnum implements IEnum<Integer> {
 
-  CHANNEL_ORDER(1, "渠道订单"),
-  USER_ORDER(2, "用户订单");
+  CHANNEL_ORDER(1, "渠道盲票采购订单"),
+  TICKET_ORDER(2, "用户盲票购买订单"),
+  DELIVER_ORDER(3, "用户提货订单");
 
 
   private final int value;

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/enums/MqTopicType.java

@@ -9,7 +9,8 @@ import com.baomidou.mybatisplus.annotation.IEnum;
  */
 public enum MqTopicType implements IEnum<String> {
 
-  ticket_generate("1", "盲票生成");
+  ticket_generate("1", "盲票生成"),
+  ticket_pay("2", "盲票付款"),;
 
 
   private final String value;

+ 6 - 1
mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java

@@ -42,6 +42,9 @@ public class PulsarClientService {
   @Value("${mq.topic-ticket-generate}")
   private String topicTicketGenerate;
 
+  @Value("${mq.topic-ticket-pay}")
+  private String topicTicketPay;
+
   @Value("${mq.consumer-conn}")
   private boolean consumerConn;
 
@@ -108,7 +111,9 @@ public class PulsarClientService {
     logger.info("start producer mq data:" + data);
     String topic = "";
     if (mqTopicType.getValue() == MqTopicType.ticket_generate.getValue()) {
-      topic = topicTicketGenerate; //
+      topic = topicTicketGenerate; // 盲票生成
+    } else if (mqTopicType.getValue() == MqTopicType.ticket_pay.getValue()) {
+      topic = topicTicketPay; // 盲票付款成功
     }
     Producer<byte[]> producer = null;
     if (Producers.containsKey(mqTopicType.getValue())) {

+ 3 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketParam.java

@@ -13,6 +13,9 @@ public class TicketParam {
 	@ApiModelProperty(value = "盲票序列号",required=false)
 	private String serialNo;
 
+	@ApiModelProperty(value = "盲票ID",required=false)
+	private String ticketId;
+
 	@ApiModelProperty(value = "奖项ID",required=false)
 	private String awardsId;
 

+ 2 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/TicketMapper.java

@@ -16,4 +16,6 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface TicketMapper extends BaseMapper<Ticket> {
   Ticket getRandOne(@Param(Constants.WRAPPER) Wrapper<Ticket> queryWrapper);
+
+  List<Ticket> listTicket(@Param(Constants.WRAPPER) Wrapper<Ticket> queryWrapper);
 }

+ 10 - 3
mp-service/src/main/java/com/qs/mp/admin/service/ITicketService.java

@@ -25,9 +25,9 @@ public interface ITicketService extends IService<Ticket> {
    * @param queryWrapper
    * @return
    */
-  Ticket getRandOne(@Param(Constants.WRAPPER) Wrapper<Ticket> queryWrapper);
-  
-  
+  Ticket getRandOne(Wrapper<Ticket> queryWrapper);
+
+
   /**
    * 盲票导入
    * 导入就是只根据盲票序号更新幸运数字和抽奖数字两个字段
@@ -35,4 +35,11 @@ public interface ITicketService extends IService<Ticket> {
    * @return 导入的条数
    */
   int importTicket(List<TicketExcel> ticketExcelList);
+
+  /**
+   * 查询盲票列表
+   * @param queryWrapper
+   * @return
+   */
+  List<Ticket> listTicket(Wrapper<Ticket> queryWrapper);
 }

+ 5 - 1
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketServiceImpl.java

@@ -64,8 +64,12 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
 				return ticketList.size();
 			}
 		}
-		
+
 		return 0;
 	}
 
+	@Override
+	public List<Ticket> listTicket(Wrapper<Ticket> queryWrapper) {
+		return getBaseMapper().listTicket(queryWrapper);
+	}
 }

+ 28 - 15
mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java

@@ -9,6 +9,8 @@ import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.pulsar.PulsarConsumer;
 import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.service.IUserTicketOrderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,26 +31,37 @@ public class PulsarConsumerImpl implements PulsarConsumer {
   @Autowired
   private ITicketBoxService ticketBoxService;
 
+  @Autowired
+  private IUserTicketOrderService userTicketOrderService;
+
   @Override
   @Async("threadPoolTaskExecutor")
   public void wsConsumer(String topicType, String mqData) {
     logger.info(topicType + "  >>>>>>>>>>>>>>>>>>>:" + mqData);
-    //监听商户充值消息,后续业务处理
+    //监听盲票生成消息,后续业务处理
     if (MqTopicType.ticket_generate.getValue().equals(topicType)) {
-      String boxId = mqData;
-      TicketBox ticketBox = ticketBoxService.getById(boxId);
-      if (ticketBox.getStatus() != TicketBoxStatusEnum.WAIT ) {
-        LogUtil.error(logger, "收到盲票生成消息,票组状态不是待出票,忽略消息。boxId=" + boxId);
-        return;
-      }
-      // 先更新状态,防并发。如果最后生成失败了,暂时人工重新触发
-      boolean rst = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.DOING)
-          .eq(TicketBox::getBoxId, boxId).eq(TicketBox::getStatus, TicketBoxStatusEnum.WAIT));
-      if (!rst) {
-        LogUtil.error(logger, "收到盲票生成消息,更新票组状态为出票中失败。boxId=" + boxId);
-        return;
-      }
-      ticketBoxService.generateTicket(boxId);
+      processTicketGenerateMsg(mqData);
+    } else if (MqTopicType.ticket_pay.getValue().equals(topicType)) {
+      String orderId = mqData;
+      UserTicketOrder ticketOrder = userTicketOrderService.getById(orderId);
+
+    }
+  }
+
+  private void processTicketGenerateMsg(String mqData) {
+    String boxId = mqData;
+    TicketBox ticketBox = ticketBoxService.getById(boxId);
+    if (ticketBox.getStatus() != TicketBoxStatusEnum.WAIT ) {
+      LogUtil.error(logger, "收到盲票生成消息,票组状态不是待出票,忽略消息。boxId=" + boxId);
+      return;
+    }
+    // 先更新状态,防并发。如果最后生成失败了,暂时人工重新触发
+    boolean rst = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.DOING)
+        .eq(TicketBox::getBoxId, boxId).eq(TicketBox::getStatus, TicketBoxStatusEnum.WAIT));
+    if (!rst) {
+      LogUtil.error(logger, "收到盲票生成消息,更新票组状态为出票中失败。boxId=" + boxId);
+      return;
     }
+    ticketBoxService.generateTicket(boxId);
   }
 }

+ 13 - 7
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -13,6 +13,7 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import java.util.List;
 import org.slf4j.Logger;
@@ -21,7 +22,6 @@ 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
@@ -42,6 +42,9 @@ public class WalletServiceImpl implements IWalletService {
   @Autowired
   private IUserTicketOrderService userTicketOrderService;
 
+  @Autowired
+  private IUserDeliverOrderService userDeliverOrderService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
@@ -76,7 +79,7 @@ public class WalletServiceImpl implements IWalletService {
     String appId = channelAppId;
     String payShopNo = channelPayShopNo;
     String paySign = channelPaySign;
-    if (bizType == BizTypeEnum.USER_ORDER) {
+    if (bizType == BizTypeEnum.TICKET_ORDER || bizType == BizTypeEnum.DELIVER_ORDER) {
       appId = userAppId;
       payShopNo = userPayShopNo;
       paySign = userPaySign;
@@ -85,7 +88,7 @@ public class WalletServiceImpl implements IWalletService {
     String result = OkHttpUtil.postJsonParams(reqUrl, params.toJSONString());
     logger.info("request params:" + params.toJSONString() + "  result:" + result);
     if (StringUtils.isBlank(result)) {
-      LogUtil.error(logger, "创建充值订单接口失败");
+      LogUtil.error(logger, "创建支付订单接口失败");
       throw new ServiceException("创建三方支付订单失败");
     }
     JSONObject resultJson = JSONObject.parseObject(result);
@@ -107,7 +110,7 @@ public class WalletServiceImpl implements IWalletService {
     payOrder.setOrderStatus(orderstatus);
     boolean ret = payOrderService.save(payOrder);
     if (!ret) {
-      LogUtil.error(logger, "渠道支付订单数据库保存失败.");
+      LogUtil.error(logger, "支付订单数据库保存失败.");
       throw new ServiceException("支付订单保存失败");
     }
     return data;
@@ -132,11 +135,14 @@ public class WalletServiceImpl implements IWalletService {
     LogUtil.info(logger, "支付回调,bizType:{0},bizId:{1}" ,
         new Object[]{payOrder.getBizType(), payOrder.getBizId()});
     if (BizTypeEnum.CHANNEL_ORDER == payOrder.getBizType()) {
-      // 业务订单支付成功,调用业务订单服务处理
+      // 渠道盲票采购订单支付成功,调用业务订单服务处理
       channelOrderService.paySuccess(payOrder);
-    } else if (BizTypeEnum.CHANNEL_ORDER == payOrder.getBizType()) {
-      // 业务订单支付成功,调用业务订单服务处理
+    } else if (BizTypeEnum.TICKET_ORDER == payOrder.getBizType()) {
+      // 用户盲票购买订单支付成功,调用业务订单服务处理
       userTicketOrderService.paySuccess(payOrder);
+    } else if (BizTypeEnum.DELIVER_ORDER == payOrder.getBizType()) {
+      // 用户提货订单支付成功,调用业务订单服务处理
+      userDeliverOrderService.paySuccess(payOrder);
     } else {
       //数据结构异常,告警
       LogUtil.error(logger, "该业务单据类型未支持,orderNo:" + orderNo);

+ 2 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrder.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.Version;
 import com.qs.mp.common.enums.DeliverOrderStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
@@ -123,6 +124,7 @@ public class UserDeliverOrder implements Serializable {
    * 更新时间
    */
   @TableField("updated_time")
+  @Version
   private Date updatedTime;
 
 

+ 70 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java

@@ -1,17 +1,33 @@
 package com.qs.mp.user.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.common.enums.DeliverOrderStatusEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.vo.DeliverOrderSettleVO;
 import com.qs.mp.user.mapper.UserDeliverOrderMapper;
+import com.qs.mp.user.service.IUserDeliverOrderItemService;
 import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
 
 /**
  * <p>
@@ -24,9 +40,17 @@ import org.springframework.transaction.annotation.Transactional;
 @Service
 public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMapper, UserDeliverOrder> implements IUserDeliverOrderService {
 
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
+  @Autowired
+  private IUserDeliverOrderItemService userDeliverOrderItemService;
+
+  @Autowired
+  private IUserPrizeStorageService userPrizeStorageService;
+
   @Override
   @Transactional
   public String submitOrder(Long userId, DeliverOrderSettleVO orderSettleVO) {
@@ -51,17 +75,62 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
     }
     save(userDeliverOrder);
 
+    for (UserPrizeStorage prizeStorage : orderSettleVO.getPrizeList()) {
+      UserDeliverOrderItem orderItem = new UserDeliverOrderItem();
+      orderItem.setItemId(bizIdGenerator.newId());
+      orderItem.setOrderId(userDeliverOrder.getOrderId());
+      orderItem.setStorageId(prizeStorage.getStorageId());
+      orderItem.setGoodsId(prizeStorage.getGoodsId());
+      orderItem.setSkuId(prizeStorage.getSkuId());
+      orderItem.setProperties(prizeStorage.getProperties());
+      orderItem.setTitle(prizeStorage.getTitle());
+      orderItem.setPicUrl(prizeStorage.getPicUrl());
+      orderItem.setGoodsNum(prizeStorage.getGoodsNum());
+      userDeliverOrderItemService.save(orderItem);
+      userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
+          .set(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.HAS_DISTRIBUTED)
+          .eq(UserPrizeStorage::getStorageId, prizeStorage.getStorageId()));
+    }
 
     return userDeliverOrder.getOrderId();
   }
 
   @Override
+  @Transactional
   public boolean cancelOrder(String orderId) {
-    return false;
+    UserDeliverOrder userDeliverOrder = getById(orderId);
+    if (userDeliverOrder.getStatus() != DeliverOrderStatusEnum.NOT_PAY) {
+      LogUtil.warn(logger, "取消提货订单时,订单状态不是待支付,忽略。orderId:{0}, status:{1}",
+          orderId, userDeliverOrder.getStatus());
+      return false;
+    }
+    // 恢复奖品库状态
+    List<UserDeliverOrderItem> orderItemList = userDeliverOrderItemService.list(new LambdaQueryWrapper<UserDeliverOrderItem>()
+        .eq(UserDeliverOrderItem::getOrderId, userDeliverOrder.getOrderId()));
+    for (UserDeliverOrderItem orderItem : orderItemList) {
+      boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
+          .set(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)
+          .eq(UserPrizeStorage::getStorageId, orderItem.getStorageId())
+          .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.HAS_DISTRIBUTED));
+      Assert.isTrue(rtn, "取消提货订单时,更新奖品库里奖品状态失败。orderItem:" + JSONObject.toJSONString(orderItem));
+    }
+    userDeliverOrder.setStatus(DeliverOrderStatusEnum.CANCELED);
+    boolean updateRst = updateById(userDeliverOrder);
+    Assert.isTrue(updateRst, "取消提货订单时,更新提货订单状态失败。userDeliverOrder:" + JSONObject.toJSONString(userDeliverOrder));
+    return true;
   }
 
   @Override
   public boolean paySuccess(PayOrder payOrder) {
+    UserDeliverOrder deliverOrder = getById(payOrder.getBizId());
+    if (null == deliverOrder || deliverOrder.getStatus() != DeliverOrderStatusEnum.NOT_PAY) {
+      LogUtil.error(logger, "支付回调用户提货订单处理,订单状态异常,不是待支付。payOrder:{0}, deliverOrder:{1}",
+          JSONObject.toJSONString(payOrder), JSONObject.toJSONString(deliverOrder));
+      throw new ServiceException("支付回调用户提货订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
+    }
+    deliverOrder.setStatus(DeliverOrderStatusEnum.NOT_DELIVER);
+    boolean rst = updateById(deliverOrder);
+    Assert.isTrue(rst, "支付回调用户提货订单处理,更新订单状态失败,orderId:" + deliverOrder.getOrderId());
     return false;
   }
 }

+ 26 - 3
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -11,12 +11,14 @@ import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.ChannelUserRel;
 import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
+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.common.utils.StringUtils;
@@ -34,6 +36,8 @@ import com.qs.mp.user.service.IUserTicketOrderService;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import org.apache.pulsar.client.api.PulsarClient;
+import org.apache.pulsar.client.api.PulsarClientException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -70,6 +74,9 @@ public class UserTicketOrderServiceImpl extends
   @Autowired
   private ITicketService ticketService;
 
+  @Autowired
+  private PulsarClientService pulsarClientService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
@@ -120,7 +127,11 @@ public class UserTicketOrderServiceImpl extends
     userTicketOrder.setMemo("");
     userTicketOrder.setResource(TicketTypeEnum.ONLINE);
     userTicketOrder.setCouponInfo(couponIds);
-    userTicketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+    if (orderSettleVO.getPayAmt() > 0) {
+      userTicketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+    } else {
+      userTicketOrder.setStatus(UserTicketOrderStatusEnum.FINISHED);
+    }
     save(userTicketOrder);
 
     // 查询用户的所属经销商,线上票直接查询
@@ -160,7 +171,11 @@ public class UserTicketOrderServiceImpl extends
     ticketOrder.setMemo("");
     ticketOrder.setResource(TicketTypeEnum.OFFLINE);
     ticketOrder.setCouponInfo(couponIds);
-    ticketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+    if (orderSettleVO.getPayAmt() > 0) {
+      ticketOrder.setStatus(UserTicketOrderStatusEnum.NOT_PAY);
+    } else {
+      ticketOrder.setStatus(UserTicketOrderStatusEnum.FINISHED);
+    }
     save(ticketOrder);
 
     // 查询用户的所属经销商,线上票直接查询
@@ -237,10 +252,11 @@ public class UserTicketOrderServiceImpl extends
   }
 
   @Override
+  @Transactional
   public boolean paySuccess(PayOrder payOrder) {
     UserTicketOrder ticketOrder = getById(payOrder.getBizId());
     if (null == ticketOrder || ticketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
-      LogUtil.error(logger, "支付回调用户购票订单处理,订单状态异常,不是待支付。payOrder:{0}, channelOrder:{1}",
+      LogUtil.error(logger, "支付回调用户购票订单处理,订单状态异常,不是待支付。payOrder:{0}, ticketOrder:{1}",
           JSONObject.toJSONString(payOrder), JSONObject.toJSONString(ticketOrder));
       throw new ServiceException("支付回调用户购票订单处理,订单状态异常,不是待支付。orderId:" + payOrder.getBizId());
     }
@@ -271,6 +287,13 @@ public class UserTicketOrderServiceImpl extends
     ticketOrder.setStatus(UserTicketOrderStatusEnum.FINISHED);
     boolean updateRst = updateById(ticketOrder);
     Assert.isTrue(updateRst, "支付回调用户购票订单处理,更新订单状态失败,orderId:" + ticketOrder.getOrderId());
+
+    try {
+      pulsarClientService.producer(MqTopicType.ticket_pay, ticketOrder.getOrderId());
+    } catch (PulsarClientException e) {
+      LogUtil.error(logger, e, "盲票支付成功,发送异步消息失败. {0}", JSONObject.toJSONString(ticketOrder));
+    }
+
     return true;
   }
 }

+ 16 - 5
mp-service/src/main/resources/mapper/admin/TicketMapper.xml

@@ -13,15 +13,15 @@
         <result column="cipher_lucky_num" property="cipherLuckyNum" />
         <result column="plain_lucky_num" property="plainLuckyNum" />
         <result column="draw_num" property="drawNum" />
-        <result column="IS_PHYSICAL" property="isPhysical" />
-        <result column="STATUS" property="status" />
-        <result column="CREATED_TIME" property="createdTime" />
-        <result column="UPDATED_TIME" property="updatedTime" />
+        <result column="is_physical" property="isPhysical" />
+        <result column="status" property="status" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        ticket_id, box_id, pkg_id, title, serial_no, face_price, cipher_lucky_num, plain_lucky_num, draw_num, IS_PHYSICAL, STATUS, CREATED_TIME, UPDATED_TIME
+        ticket_id, box_id, pkg_id, title, serial_no, face_price, cipher_lucky_num, plain_lucky_num, draw_num, is_physical, status, created_time, updated_time
     </sql>
 
     <select id="getRandOne" resultMap="BaseResultMap">
@@ -31,4 +31,15 @@
         order by rand() limit 1
     </select>
 
+    <select id="listTicket" resultMap="BaseResultMap">
+        select t1.serial_no, t1.cipher_lucky_num, t1.draw_num
+        from mp_ticket t1
+        left join (
+            select ticket_id
+            from mp_ticket
+                     ${ew.customSqlSegment}
+        ) t2
+        on t1.ticket_id = t2.ticket_id
+
+    </select>
 </mapper>