Преглед изворни кода

Merge branch 'mp-server-test' into 'master'

Mp server test

See merge request quanshu/mp-server!695
zhong chunping пре 2 година
родитељ
комит
ae1e7c0d10
64 измењених фајлова са 1209 додато и 130 уклоњено
  1. 15 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  2. 84 16
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java
  3. 2 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/MarketingMgrController.java
  4. 8 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  5. 12 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java
  6. 12 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserExchangeOrderMgrController.java
  7. 13 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserPrizeRecoveryMgrController.java
  8. 24 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java
  9. 26 8
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  10. 15 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java
  11. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/open/LinkController.java
  12. 33 17
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  13. 14 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  14. 1 0
      mp-admin/src/main/resources/application-8100.yml
  15. 1 0
      mp-admin/src/main/resources/application-8200.yml
  16. 2 1
      mp-admin/src/main/resources/application-dev.yml
  17. 1 0
      mp-admin/src/main/resources/application-test.yml
  18. 54 0
      mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java
  19. 32 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelCommissionResourceEnum.java
  20. 57 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelOrderTypeEnum.java
  21. 49 0
      mp-common/src/main/java/com/qs/mp/common/utils/AESUtil.java
  22. 3 1
      mp-framework/src/main/java/com/qs/mp/framework/monitor/SendErrorMsgAppender.java
  23. 86 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java
  24. 1 7
      mp-quartz/src/main/java/com/qs/mp/quartz/task/ChannelOrderTask.java
  25. 14 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java
  26. 19 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketPackage.java
  27. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderQueryParam.java
  28. 31 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/IndexTicketBoxTopQueryParam.java
  29. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxCreateParam.java
  30. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxParam.java
  31. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxUpdateParam.java
  32. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxListVO.java
  33. 14 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketVO.java
  34. 4 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  35. 19 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCommission.java
  36. 6 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrder.java
  37. 13 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrderDetail.java
  38. 17 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrderItem.java
  39. 39 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelCommParam.java
  40. 3 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelOrderParam.java
  41. 19 2
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelMyTicketVO.java
  42. 5 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderItemVO.java
  43. 4 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderSettleVO.java
  44. 9 1
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderVO.java
  45. 10 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelOrderMapper.java
  46. 16 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java
  47. 7 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelUserRelService.java
  48. 50 4
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  49. 15 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelUserRelServiceImpl.java
  50. 85 0
      mp-service/src/main/java/com/qs/mp/framework/domain/AsyncTask.java
  51. 13 0
      mp-service/src/main/java/com/qs/mp/framework/mapper/AsyncTaskMapper.java
  52. 1 1
      mp-service/src/main/java/com/qs/mp/framework/redis/RedisLockKey.java
  53. 21 0
      mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java
  54. 57 0
      mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java
  55. 8 5
      mp-service/src/main/java/com/qs/mp/framework/service/impl/WxUrlLinkServiceImpl.java
  56. 9 7
      mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java
  57. 8 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java
  58. 12 1
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  59. 55 50
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  60. 1 1
      mp-service/src/main/resources/mapper/admin/TicketBoxMapper.xml
  61. 3 1
      mp-service/src/main/resources/mapper/channel/ChannelOrderDetailMapper.xml
  62. 9 0
      mp-service/src/main/resources/mapper/channel/ChannelOrderMapper.xml
  63. 21 0
      mp-service/src/main/resources/mapper/framework/AsyncTaskMapper.xml
  64. 27 0
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

+ 15 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -26,6 +26,7 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.domain.DeliveryCompany;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.service.IDeliveryCompanyService;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.excel.DeliverOrderExcel;
@@ -47,6 +48,7 @@ import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 
 import org.apache.commons.lang3.StringUtils;
+import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -89,12 +91,16 @@ public class ChannelOrderMgrController extends BaseApiController {
   @PostMapping("/list")
   @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
   @PreAuthorize("@ss.hasPermi('order:channel:list')")
+  @ApiResponses(
+		  @ApiResponse(code = 200, message = "success", response = ChannelOrderVO.class)
+  )
   public TableDataInfo list(@RequestBody ChannelOrderQueryParam queryParam) {
     startPage();
     QueryWrapper<ChannelOrder> queryWrapper = new QueryWrapper<ChannelOrder>();
     queryWrapper.eq(null != queryParam && null != queryParam.getChannelId(), "t1.channel_id" ,queryParam.getChannelId());
     queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getOrderId()), "t1.order_id" ,queryParam.getOrderId());
 	queryWrapper.eq(null != queryParam && null != queryParam.getStatus(), "t1.`status`" ,queryParam.getStatus());
+	queryWrapper.eq(null != queryParam && null != queryParam.getType(), "t1.`type`" ,queryParam.getType());
 	queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(),  "t1.created_time", queryParam.getStartTime());
 	queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 	queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), "t1.title", queryParam.getTitle());
@@ -196,8 +202,7 @@ public class ChannelOrderMgrController extends BaseApiController {
 		if(null != shipParam && null != shipParam.getPkgIds()
 				&& shipParam.getPkgIds().size() > 0) {
 			ChannelOrder channelOrder = new ChannelOrder();
-
-
+			channelOrder.setType(order.getType());
 
 			if (DeliverTypeEnum.NO_DELIVER.getValue().equals(deliveryType)) {
 				// 无需物流,设置发货时间为当前时间
@@ -326,6 +331,14 @@ public class ChannelOrderMgrController extends BaseApiController {
 	@PostMapping("/export")
 	@PreAuthorize("@ss.hasPermi('order:channel:export')")
 	public AjaxResult export(@RequestBody ChannelOrderQueryParam queryParam) {
+		Date startTime = queryParam.getStartTime();
+		Date endTime = queryParam.getEndTime();
+		if (startTime == null || endTime == null) {
+			return AjaxResult.error("导出数据必须设置日期范围");
+		}
+		if (DateUtils.diff(startTime, endTime) > 30) {
+			return AjaxResult.error("导出的数据不能超过31天");
+		}
 
 		List<ChannelOrderExcel> excelList = new ArrayList<ChannelOrderExcel>();
 		List<ChannelOrderVO> listAll = new ArrayList<ChannelOrderVO>();

+ 84 - 16
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java

@@ -1,9 +1,13 @@
 package com.qs.mp.web.controller.api.admin;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.param.IndexQueryParam;
+import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.utils.DateUtils;
@@ -14,11 +18,7 @@ import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +45,9 @@ public class IndexMgrController extends BaseApiController {
     @Autowired
     private IUserTicketOrderService userTicketOrderService;
 
+	@Autowired
+	private IChannelOrderService channelOrderService;
+
 
 
 	/**
@@ -70,8 +73,20 @@ public class IndexMgrController extends BaseApiController {
 //						.or().eq("t2.channel_no", channel.getChannelNo()));
 //			}
 //		}
-	
+
 		list = userTicketOrderService.selectIndexPayAmtList(queryWrapper);
+
+
+		// 预付票信息
+		List<IndexVO> channelOrderList = new ArrayList<>();
+		QueryWrapper<ChannelOrder> channelOrderQueryWrapper1 = new QueryWrapper<>();
+		channelOrderQueryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		channelOrderQueryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		channelOrderQueryWrapper1.gt("t1.`status`", 0);
+		channelOrderQueryWrapper1.gt("t1.type" , 1);
+		channelOrderList = channelOrderService.selectIndexChannelOrderDailyInfoList(channelOrderQueryWrapper1);
+		list = addPrePayOrderInfo(list, channelOrderList);
+
 		return  AjaxResult.success(getPayAmtList(list, queryParam));
 	}
 	
@@ -459,13 +474,24 @@ public class IndexMgrController extends BaseApiController {
 		List<IndexVO> yestodayList = new ArrayList<IndexVO>();
 		List<IndexVO> todaySiteList = new ArrayList<IndexVO>();
 		List<IndexVO> yetodaySiteList = new ArrayList<IndexVO>();
-		
+
+		List<IndexVO> channelOrderTodayList = new ArrayList<>();
+		List<IndexVO> channelOrderYestodayList= new ArrayList<>();
+
 		QueryWrapper<UserTicketOrder> queryWrapper1 = new QueryWrapper<>();
 		queryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
 		queryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 		queryWrapper1.gt("t1.`status`", 0);
 		todayList = userTicketOrderService.selectIndexDailyInfoList(queryWrapper1);
-		
+
+		QueryWrapper<ChannelOrder> channelOrderQueryWrapper1 = new QueryWrapper<>();
+		channelOrderQueryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		channelOrderQueryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		channelOrderQueryWrapper1.gt("t1.`status`", 0);
+		channelOrderQueryWrapper1.gt("t1.type" , 1);
+		channelOrderTodayList = channelOrderService.selectIndexChannelOrderDailyInfoList(channelOrderQueryWrapper1);
+		todayList = addPrePayOrderInfo(todayList, channelOrderTodayList);
+
 		QueryWrapper<Channel> siteQueryWrapper1 = new QueryWrapper<>();
 		siteQueryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
 		siteQueryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
@@ -481,6 +507,14 @@ public class IndexMgrController extends BaseApiController {
 		queryWrapper2.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 		queryWrapper2.gt("t1.`status`", 0);
 		yestodayList = userTicketOrderService.selectIndexDailyInfoList(queryWrapper2);
+
+		QueryWrapper<ChannelOrder> channelOrderQueryWrapper2 = new QueryWrapper<>();
+		channelOrderQueryWrapper2.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		channelOrderQueryWrapper2.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		channelOrderQueryWrapper2.gt("t1.`status`", 0);
+		channelOrderQueryWrapper2.gt("t1.type" , 1);
+		channelOrderYestodayList = channelOrderService.selectIndexChannelOrderDailyInfoList(channelOrderQueryWrapper2);
+		yestodayList = addPrePayOrderInfo(yestodayList, channelOrderYestodayList);
 		
 
 		QueryWrapper<Channel> siteQueryWrapper2 = new QueryWrapper<>();
@@ -491,8 +525,32 @@ public class IndexMgrController extends BaseApiController {
 		
 		return  AjaxResult.success(calcDailyInfoData(todayList, yestodayList, todaySiteList, yetodaySiteList));
 	}
-	
-	
+
+	// 增加预付票的信息
+	private List<IndexVO> addPrePayOrderInfo(List<IndexVO> indexList, List<IndexVO> channelOrderIndexList) {
+		List<IndexVO> newIndexList = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(indexList) && CollectionUtils.isNotEmpty(channelOrderIndexList)){
+			TreeMap<String, IndexVO> treeMap = new TreeMap<>();
+			indexList.addAll(channelOrderIndexList);
+			for (IndexVO indexVO : indexList) {
+				IndexVO index = treeMap.get(indexVO.getTime());
+				if (Objects.isNull(index)) {
+					treeMap.put(indexVO.getTime(), indexVO);
+				} else {
+					index.setPayAmt(index.getPayAmt() + indexVO.getPayAmt());
+				}
+			}
+			for (String key : treeMap.keySet()) {
+				newIndexList.add(treeMap.get(key));
+			}
+			return newIndexList;
+		}
+		if (CollectionUtils.isEmpty(indexList) && CollectionUtils.isNotEmpty(channelOrderIndexList)) {
+			return channelOrderIndexList;
+		}
+		return indexList;
+	}
+
 	private Map<String,Object> getDailyInfoData(List<IndexVO> list,List<IndexVO> siteList){
 		Map<String,Object> payAmt = new HashMap<String,Object>();
 		Map<String,Object> payUser = new HashMap<String,Object>();
@@ -642,10 +700,10 @@ public class IndexMgrController extends BaseApiController {
 		
 		IndexQueryParam queryParam = getQueryParam(indeQueryParam);
 		List<IndexVO> list = new ArrayList<IndexVO>();
-		QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
-		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
-		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
-		queryWrapper.gt("t1.`status`", 0);
+//		QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+//		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+//		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+//		queryWrapper.gt("t1.`status`", 0);
 		
 //		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 //		if(null != channelId && 0 != channelId) {
@@ -656,8 +714,18 @@ public class IndexMgrController extends BaseApiController {
 //				
 //			}
 //		}
-	
-		list = userTicketOrderService.selectIndexTicketBoxTop(queryWrapper);
+
+		IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam = new IndexTicketBoxTopQueryParam();
+		indexTicketBoxTopQueryParam.setStartTime(queryParam.getStartTime());
+		indexTicketBoxTopQueryParam.setEndTime(queryParam.getEndTime());
+		indexTicketBoxTopQueryParam.setTicketOrderStatus(0);
+		indexTicketBoxTopQueryParam.setChannelOrderStatus(0);
+		indexTicketBoxTopQueryParam.setChannelOrderType(1);
+
+//		list = userTicketOrderService.selectIndexTicketBoxTop(queryWrapper);
+
+		list = userTicketOrderService.selectIndexTicketBoxTopByTicketOrderAndChannelOrder(indexTicketBoxTopQueryParam);
+
 		List<Map<String,Object>> mapList = new ArrayList<>();
 		if(null != list && list.size() > 0) {
 			for(IndexVO indexVo : list) {

+ 2 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/MarketingMgrController.java

@@ -22,6 +22,7 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.MarketingStatusEnum;
 import com.qs.mp.common.enums.UserTypeEnum;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.user.domain.MarketingHitPrize;
 import com.qs.mp.user.domain.MarketingUserCode;
 import com.qs.mp.user.service.IMarketingHitPrizeService;
@@ -40,6 +41,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;

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

@@ -24,6 +24,7 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
+import com.qs.mp.common.utils.AESUtil;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.RSAUtil;
 import com.qs.mp.system.domain.SysUser;
@@ -400,9 +401,14 @@ public class TicketBoxMgrController extends BaseApiController {
 						&& StringUtils.isNotBlank(ticket.getCipherLuckyNum())) {
 					TicketExcel ticketExcel = new TicketExcel();
 					ticketExcel.setSerialNo(ticket.getSerialNo());
-					ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
-					ticketExcel.setDrawNum(formatDraw(ticket.getDrawNum()));
+					if (ticketBox.getIsEncrypt() == 1){
+						// 加密序列号
+						ticketExcel.setUrl(exportUrl + AESUtil.encrypt(ticket.getSerialNo()));
+					}else {
+						ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
+					}
 					if (!ServerEnvEnum.PROD.getCode().equals(env)) {
+						ticketExcel.setDrawNum(formatDraw(ticket.getDrawNum()));
 						ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
 					}
 					excelList.add(ticketExcel);

+ 12 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java

@@ -14,6 +14,7 @@ import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.DeliverOrderStatusEnum;
 import com.qs.mp.common.enums.DeliverTypeEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.excel.DeliverOrderExcel;
@@ -226,10 +227,20 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 
 	@Log(title = "提货订单导出", businessType = BusinessType.EXPORT)
 	@PostMapping("/export")
-	@ApiOperation("替换订单导出")
+	@ApiOperation("提货订单导出")
 	@PreAuthorize("@ss.hasPermi('order:deliver:export')")
 	public AjaxResult export(@RequestBody UserDeliverOrderQueryParam queryParam) {
 
+		// 导出时间范围限制校验
+		Date startTime = queryParam.getStartTime();
+		Date endTime = queryParam.getEndTime();
+		if (startTime == null || endTime == null) {
+			return AjaxResult.error("导出数据必须设置日期范围");
+		}
+		if (DateUtils.diff(startTime, endTime) > 30) {
+			return AjaxResult.error("导出的数据不能超过31天");
+		}
+
 		List<DeliverOrderExcel> excelList = new ArrayList<DeliverOrderExcel>();
 		List<UserDeliverOrderVO> listAll = new ArrayList<UserDeliverOrderVO>();
 		// 首先查询要导出的数据总数

+ 12 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserExchangeOrderMgrController.java

@@ -9,6 +9,7 @@ import com.qs.mp.admin.domain.vo.UserExchangeOrderVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.user.domain.UserExchangeOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.service.IUserExchangeOrderService;
@@ -28,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -86,6 +88,16 @@ public class UserExchangeOrderMgrController extends BaseApiController {
     @PreAuthorize("@ss.hasPermi('order:exchange:export')")
     @ApiOperation("用户兑换订单导出")
     public AjaxResult export(@RequestBody UserExchangeOrderQueryParam userExchangeOrderQueryParam) {
+        // 导出时间范围限制校验
+        Date startTime = userExchangeOrderQueryParam.getStartTime();
+        Date endTime = userExchangeOrderQueryParam.getEndTime();
+        if (startTime == null || endTime == null) {
+            return AjaxResult.error("导出数据必须设置日期范围");
+        }
+        if (DateUtils.diff(startTime, endTime) > 30) {
+            return AjaxResult.error("导出的数据不能超过31天");
+        }
+
         QueryWrapper<UserExchangeOrder> queryWrapper = new QueryWrapper<>();
 
         // 封装条件

+ 13 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserPrizeRecoveryMgrController.java

@@ -8,6 +8,7 @@ import com.qs.mp.admin.domain.vo.PrizeRecoveryListVO;
 import com.qs.mp.admin.service.IPrizeRecoveryService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.user.domain.excel.DeliverOrderExcel;
 import com.qs.mp.user.domain.vo.UserDeliverOrderItemVO;
@@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -73,6 +75,17 @@ public class UserPrizeRecoveryMgrController extends BaseApiController {
     @PreAuthorize("@ss.hasPermi('business:recovery:export')")
     @ApiOperation("回收订单列表导出")
     public AjaxResult export(@RequestBody PrizeRecoveryListQueryParam prizeRecoveryListQueryParam) {
+
+        // 导出时间范围限制校验
+        Date startTime = prizeRecoveryListQueryParam.getStartTime();
+        Date endTime = prizeRecoveryListQueryParam.getEndTime();
+        if (startTime == null || endTime == null) {
+            return AjaxResult.error("导出数据必须设置日期范围");
+        }
+        if (DateUtils.diff(startTime, endTime) > 30) {
+            return AjaxResult.error("导出的数据不能超过31天");
+        }
+
         QueryWrapper<PrizeRecovery> queryWrapper = new QueryWrapper<>();
         if (StringUtils.isNotBlank(prizeRecoveryListQueryParam.getTitle())) {
             queryWrapper.like("t1.title",prizeRecoveryListQueryParam.getTitle());

+ 24 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java

@@ -15,6 +15,7 @@ import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.PayOrderStatusEnum;
 import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.UserTicketOrderItem;
@@ -37,6 +38,7 @@ import org.springframework.web.bind.annotation.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -108,6 +110,17 @@ public class UserTicketOrderMgrController extends BaseApiController {
     @PreAuthorize("@ss.hasPermi('order:userTicket:export')")
     @ApiOperation("用户订单导出")
     public AjaxResult export(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
+
+        // 导出时间范围限制校验
+        Date startTime = userTicketOrderQueryParam.getStartTime();
+        Date endTime = userTicketOrderQueryParam.getEndTime();
+        if (startTime == null || endTime == null) {
+            return AjaxResult.error("导出数据必须设置日期范围");
+        }
+        if (DateUtils.diff(startTime, endTime) > 30) {
+            return AjaxResult.error("导出的数据不能超过31天");
+        }
+
         QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
         if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
             queryWrapper.like("t1.title", userTicketOrderQueryParam.getBoxTitle());
@@ -178,6 +191,17 @@ public class UserTicketOrderMgrController extends BaseApiController {
     @PreAuthorize("@ss.hasPermi('order:userTicket:ticketExport')")
     @ApiOperation("销售订单盲票导出")
     public AjaxResult ticketExport(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
+
+        // 导出时间范围限制校验
+        Date startTime = userTicketOrderQueryParam.getStartTime();
+        Date endTime = userTicketOrderQueryParam.getEndTime();
+        if (startTime == null || endTime == null) {
+            return AjaxResult.error("导出数据必须设置日期范围");
+        }
+        if (DateUtils.diff(startTime, endTime) > 30) {
+            return AjaxResult.error("导出的数据不能超过31天");
+        }
+
         QueryWrapper<UserTicketOrderItem> queryWrapper = new QueryWrapper<>();
         if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
             queryWrapper.like("t2.title", userTicketOrderQueryParam.getBoxTitle());

+ 26 - 8
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -55,6 +55,8 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
 
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -124,6 +126,9 @@ public class ChannelOrderController extends BaseApiController {
    */
   @PostMapping("/order/list")
   @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "成功", response = ChannelOrderVO.class)
+  )
   public TableDataInfo list(@RequestBody JSONObject param) {
     Long channelId = SecurityUtils.getLoginUser().getChannelId();
     Integer status = param.getInteger("status");
@@ -197,6 +202,9 @@ public class ChannelOrderController extends BaseApiController {
    */
   @PostMapping("/order/settle")
   @ApiOperation(value = "订单结算" , notes = "购物车里点结算或者单个盲票组商品上点立即购买")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success", response = ChannelOrderSettleVO.class)
+  )
   public AjaxResult settle(@Valid @RequestBody ChannelOrderParam param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
     Long channelId = SecurityUtils.getLoginUser().getChannelId();
@@ -231,11 +239,26 @@ public class ChannelOrderController extends BaseApiController {
       }
     } else {
       TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
-      orderAmt += ticketBox.getPkgSalePrice() * param.getOrderNum();
+      if (Objects.nonNull(param.getIsPre()) && param.getIsPre() == 1) {
+        // 预购票金额计算处理
+        orderAmt = ticketBox.getPkgPrePrice() * param.getOrderNum();
+        // 设置类型
+        if (TicketTypeEnum.OFFLINE.equals(ticketBox.getType())) {
+          orderSettleVO.setType(ChannelOrderTypeEnum.OFFLINE_PRE.getValue());
+        } else {
+          orderSettleVO.setType(ChannelOrderTypeEnum.ONLINE_PRE.getValue());
+        }
+      } else {
+        // 非预购票金额计算处理
+        orderAmt += ticketBox.getPkgSalePrice() * param.getOrderNum();
+        // 设置类型
+        orderSettleVO.setType(ChannelOrderTypeEnum.RETAIL.getValue());
+      }
       ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
       cartVO.setOrderNum(param.getOrderNum());
       orderSettleVO.getItems().add(cartVO);
       pkgNum += param.getOrderNum();
+
     }
 
 
@@ -358,13 +381,8 @@ public class ChannelOrderController extends BaseApiController {
     if (!channelId.equals(channelOrder.getChannelId())) {
       return AjaxResult.error("非法操作他人订单");
     }
-
-    // 更新用户提货订单状态为已完成,并且设置收货时间
-    ChannelOrder param = new ChannelOrder();
-    param.setOrderId(order.getOrderId());
-    param.setStatus(ChannelOrderStatusEnum.FINISHED);
-    param.setConfirmTime(new Date());
-    channelOrderService.updateById(param);
+    // 确认收货
+    channelOrderService.confirm(order);
 
     return AjaxResult.success();
   }

+ 15 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java

@@ -25,6 +25,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,6 +60,9 @@ public class ChannelTicketController extends BaseApiController {
    */
   @PostMapping("/ticket/list")
   @ApiOperation(value = "盲票组列表" , notes = "获取所有盲票信息")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success", response = TicketBoxListVO.class)
+  )
   public TableDataInfo list(@RequestBody TicketBoxParam param) {
     // TODO 根据标签过滤
 
@@ -71,7 +76,13 @@ public class ChannelTicketController extends BaseApiController {
       }
     }
     QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<>();
-    queryWrapper.eq("t1.type",param.getType());
+
+    if (Objects.nonNull(param.getIsPre()) && param.getIsPre() == 1) {
+      queryWrapper.gt("t1.pre_price", 0);
+    }
+    if (Objects.nonNull(param.getType())) {
+      queryWrapper.eq("t1.type",param.getType());
+    }
     if (Objects.nonNull(param.getCategoryId()) && param.getCategoryId() != 0) {
       queryWrapper.eq("t1.category_id",param.getCategoryId());
     }
@@ -103,6 +114,9 @@ public class ChannelTicketController extends BaseApiController {
    * 查看盲票详情
    */
   @PostMapping("/ticket/detail")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success", response =  TicketBoxVO.class)
+  )
   @ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
   public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
     if (StringUtils.isBlank(param.getBoxId())) {

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/open/LinkController.java

@@ -105,7 +105,7 @@ public class LinkController {
 
 
         // 生成scheme,并缓存到redis中,1天过期
-        scheme = wxUrlLinkService.generateUrlSchema("", channel.getUserId() + "&" + UserShareVO.SHARE_TYPE_SITE, userAppId);
+        scheme = wxUrlLinkService.generateUrlSchema("", "uid=" + channel.getUserId() + "&t=" + UserShareVO.SHARE_TYPE_SITE, userAppId);
         redisCache.setCacheObject(key, scheme,1, TimeUnit.DAYS);
         LogUtil.info(logger, "生成的scheme码:{0}", scheme);
         return AjaxResult.success("success",scheme);

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

@@ -1,5 +1,6 @@
 package com.qs.mp.web.controller.api.user;
 
+import cn.hutool.core.util.ReUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -16,6 +17,7 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.DistributedLocker;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.AESUtil;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
@@ -197,18 +199,34 @@ public class UserTicketController extends BaseApiController {
    */
   @PostMapping("/ticket/queryLuckyNum")
   @ApiOperation(value = "查看盲票幸运数字", notes = "根据盲票组ID,获取盲票幸运数字")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "success", response = TicketVO.class)
+  )
   public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
 
     if (StringUtils.isBlank(param.getSerialNo())) {
       return AjaxResult.error("参数异常,盲票序列号缺失");
     }
 
+    String serialNo = param.getSerialNo();
+    boolean match = ReUtil.isMatch("^\\w*-\\w*-\\w*$", serialNo);
+    if (!match) {
+      serialNo = AESUtil.decrypt(serialNo);
+    }
     Ticket ticket = ticketService.getOne(
-        new LambdaQueryWrapper<Ticket>().eq(Ticket::getSerialNo, param.getSerialNo()));
+            new LambdaQueryWrapper<Ticket>().eq(Ticket::getSerialNo, serialNo));
+
     if (null == ticket) {
       return AjaxResult.error("参数异常,盲票不存在");
     }
 
+    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+    if (ticketBox.getIsEncrypt() == 1 && match) {
+      LogUtil.error(logger, "非法访问,serialNo:{0},param:{1}", serialNo, param);
+      return AjaxResult.error("非法访问!");
+    }
+
+
     /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
     }*/
@@ -218,7 +236,6 @@ public class UserTicketController extends BaseApiController {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1023);
     }
 
-    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
 
     TicketVO ticketVO = new TicketVO();
     ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(ticket.getBoxId()));
@@ -232,6 +249,11 @@ public class UserTicketController extends BaseApiController {
     ticketVO.setStatus(ticket.getStatus().getValue());
     ticketVO.setPicUrl(ticketBox.getPicUrl());
 
+    if (ticketPackage.getIsPre() == 1) {
+      // 预付票设置售价为0
+      ticketVO.setSalePrice(0);
+    }
+
     return AjaxResult.success(ticketVO);
   }
 
@@ -378,6 +400,7 @@ public class UserTicketController extends BaseApiController {
     List<TicketHitPrizeBarrageVO> listOne = new ArrayList<>();
     List<TicketHitPrizeBarrageVO> listTwo = new ArrayList<>();
 
+
     // 获取除当前用户外最近10条盲豆大于1000的商品兑换数据
     QueryWrapper<TicketHitPrizeBarrageVO> queryWrapper = new QueryWrapper<>();
     queryWrapper.ge("t1.order_coin", 1000);
@@ -419,11 +442,9 @@ public class UserTicketController extends BaseApiController {
           // 设置类型为中奖
           ticketHitPrizeBarrageVOList.get(i).setType(1);
 
-          if (i % 2 == 0) {
-            listOne.add(ticketHitPrizeBarrageVOList.get(i));
-          }else {
-            listTwo.add(ticketHitPrizeBarrageVOList.get(i));
-          }
+
+          listOne.add(ticketHitPrizeBarrageVOList.get(i));
+
         }
       }
     }
@@ -462,20 +483,15 @@ public class UserTicketController extends BaseApiController {
       if (count != 0 && i % 5 == 0) {
         // 设置类型为中奖
         expensiveHitPrizeBarrageList.get(index).setType(1);
-        if (index % 2 == 0) {
-          listOne.add(expensiveHitPrizeBarrageList.get(index));
-        }else {
-          listTwo.add(expensiveHitPrizeBarrageList.get(index));
-        }
+        listOne.add(expensiveHitPrizeBarrageList.get(index));
+
         count--;
         index++;
       }
 
-      if (i % 2 == 0) {
-        listOne.add(ticketHitPrizeBarrageVOList.get(i));
-      }else {
-        listTwo.add(ticketHitPrizeBarrageVOList.get(i));
-      }
+
+      listOne.add(ticketHitPrizeBarrageVOList.get(i));
+
     }
     Map<String,List<TicketHitPrizeBarrageVO>> ticketHitPrizeBarrageMap = new HashMap<>();
     ticketHitPrizeBarrageMap.put("listOne",listOne);

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

@@ -1,9 +1,12 @@
 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.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.OrderPayParam;
@@ -34,6 +37,7 @@ import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
 
@@ -84,6 +88,9 @@ public class UserTicketOrderController extends BaseApiController {
   @Autowired
   private PulsarClientService pulsarClientService;
 
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+
 
   /**
    * 订单结算,每次更换优惠券时需重新请求此接口
@@ -108,6 +115,12 @@ public class UserTicketOrderController extends BaseApiController {
       Ticket ticket = ticketService.getById(param.getTicketId());
       ticketBox = ticketBoxService.getById(ticket.getBoxId());
       orderAmt = ticketBox.getSalePrice();
+
+      // 预付票设置金额为0
+      TicketPackage ticketPackage =  ticketPackageService.getById(ticket.getPkgId());
+      if (ticketPackage.getIsPre() == 1) {
+        orderAmt = 0;
+      }
     } else {
       // 线上购票
       ticketBox = ticketBoxService.getById(param.getBoxId());
@@ -140,6 +153,7 @@ public class UserTicketOrderController extends BaseApiController {
     orderSettleVO.setTicketId(param.getTicketId());
     orderSettleVO.setPicUrl(ticketBox.getPicUrl());
     orderSettleVO.setTitle(ticketBox.getTitle());
+
     // 缓存订单结算对象
     redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
     return AjaxResult.success(orderSettleVO);

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

@@ -134,6 +134,7 @@ mq:
 miniprogram:
   # 接收通知的状态
   state: formal
+  env_version: release
 
 # 盲票导出每页查询数量
 export:

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

@@ -134,6 +134,7 @@ mq:
 miniprogram:
   # 接收通知的状态
   state: formal
+  env_version: release
 
 # 盲票导出每页查询数量
 export:

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

@@ -1,6 +1,6 @@
 mp:
     # 文件路径 示例( Windows配置D:/ygp/uploadPath,Linux配置 /home/ygp/uploadPath)
-    profile: /Users/Steven/Documents/logs
+    profile: /Users/cup/Documents/logs
 
 pay:
     callbackUrl: https://test-mp.quanshu123.com/service/notify/payCallback
@@ -127,6 +127,7 @@ mq:
 miniprogram:
     # 接收通知的状态
     state: developer
+    env_version: trial
 
 # 盲票导出每页查询数量
 export:

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

@@ -132,6 +132,7 @@ mq:
 miniprogram:
   # 接收通知的状态
   state: trial
+  env_version: trial
 
 # 盲票导出每页查询数量
 export:

+ 54 - 0
mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java

@@ -0,0 +1,54 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 异步任务类型枚举
+ * @author Cup
+ * @date 2022/6/7
+ */
+@ApiModel("异步任务类型枚举")
+public enum AsyncTaskTypeEnum implements IEnum<Integer> {
+    CHANNEL_CONFIRM_RECEIPT(1,"经销商确认收货任务");
+
+    private Integer value;
+    private String desc;
+
+    AsyncTaskTypeEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    public static AsyncTaskTypeEnum getByValue(String value){
+        for (AsyncTaskTypeEnum asyncTaskTypeEnum : AsyncTaskTypeEnum.values()) {
+            if (asyncTaskTypeEnum.getValue().equals(value)) {
+                return asyncTaskTypeEnum;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+
+}

+ 32 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelCommissionResourceEnum.java

@@ -0,0 +1,32 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 渠道分佣订单来源枚举类
+ * @author Cup
+ * @date 2022/6/7
+ */
+@ApiModel("渠道分佣订单来源枚举类")
+public enum ChannelCommissionResourceEnum implements IEnum<Integer> {
+    USER(1, "用户"),
+    CHANNEL(2,"经销商");
+
+    private Integer value;
+    private String desc;
+
+    ChannelCommissionResourceEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 57 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelOrderTypeEnum.java

@@ -0,0 +1,57 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @author Cup
+ * @date 2022/6/6
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelOrderTypeEnum implements IEnum<Integer> {
+
+    RETAIL(1,"普通票"),
+    OFFLINE_PRE(2,"线下预购票"),
+    ONLINE_PRE(3,"线上预购票");
+
+    private final int value;
+    private final String desc;
+
+    ChannelOrderTypeEnum(int value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return this.value;
+    }
+
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static ChannelOrderTypeEnum getByValue(Integer value) {
+        for (ChannelOrderTypeEnum statusEnum : ChannelOrderTypeEnum.values()) {
+            if (statusEnum.getValue().equals(value)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+}

+ 49 - 0
mp-common/src/main/java/com/qs/mp/common/utils/AESUtil.java

@@ -0,0 +1,49 @@
+package com.qs.mp.common.utils;
+
+import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
+import cn.hutool.crypto.symmetric.SymmetricCrypto;
+import com.qs.mp.common.exception.ServiceException;
+import org.springframework.stereotype.Component;
+
+/**
+ * AES加密工具类
+ * @author Cup
+ * @date 2022/6/6
+ */
+@Component
+public class AESUtil {
+
+
+    private static String key = "oZODJRrW2h3txLey";
+    /**
+     * AES加密
+     * @param str   加密字符串
+     * @return
+     */
+    public static String encrypt(String str) {
+        try {
+            SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes());
+            return aes.encryptHex(str);
+        } catch (Exception e) {
+            throw new ServiceException("AES加密异常,str:" + str, e);
+        }
+    }
+
+
+    /**
+     * AES解密
+     * @param str   加密字符串
+     * @return
+     */
+    public static String decrypt(String str) {
+        try {
+            SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes());
+            return aes.decryptStr(str);
+        } catch (Exception e) {
+            throw new ServiceException("AES解密异常,str:" + str, e);
+
+        }
+    }
+
+
+}

+ 3 - 1
mp-framework/src/main/java/com/qs/mp/framework/monitor/SendErrorMsgAppender.java

@@ -29,7 +29,9 @@ public class SendErrorMsgAppender extends UnsynchronizedAppenderBase<ILoggingEve
         String throwableMsg = throwable.getMessage();
         if (StringUtils.isNotBlank(throwableMsg) && (throwableMsg.startsWith("验证码失效") || throwableMsg.startsWith("重复购买,请稍后再试")
         || throwableMsg.startsWith("盲票已付款,") || throwableMsg.startsWith("盲票已兑奖") || throwableMsg.startsWith("登录用户不存在:")
-        || throwableMsg.startsWith("用户不存在/密码错误") || throwableMsg.startsWith("验证码已失效") || throwableMsg.startsWith("您已经助力过了"))) {
+        || throwableMsg.startsWith("用户不存在/密码错误") || throwableMsg.startsWith("验证码已失效") || throwableMsg.startsWith("您已经助力过了")
+        || throwableMsg.startsWith("您已经获取过抽奖码了") || throwableMsg.startsWith("奖品总数值不相同") || throwableMsg.startsWith("包含已兑奖记录的奖品不能从奖级中删除")
+        )) {
           return;
         }
         StackTraceElementProxy[] stackTraceElementProxy = iThrowableProxy.getStackTraceElementProxyArray();

+ 86 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java

@@ -0,0 +1,86 @@
+package com.qs.mp.quartz.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.common.core.redis.DistributedLocker;
+import com.qs.mp.common.enums.AsyncTaskTypeEnum;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.framework.domain.AsyncTask;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.framework.redis.RedisLockKey;
+import com.qs.mp.framework.service.IAsyncTaskService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 异步消息消费任务
+ * @author Cup
+ * @date 2022/6/7
+ */
+@Component("asyncConsumeTask")
+public class AsyncConsumeTask {
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+    @Autowired
+    private IAsyncTaskService asyncTaskService;
+
+    @Autowired
+    private DistributedLocker distributedLocker;
+
+    public void processingTask(){
+
+        List<AsyncTask> asyncTaskList = asyncTaskService.list(new LambdaQueryWrapper<AsyncTask>().eq(AsyncTask::getStatus, 0));
+        if (CollectionUtils.isEmpty(asyncTaskList)) {
+            return;
+        }
+
+        for (AsyncTask asyncTask : asyncTaskList) {
+            String lockKey = RedisLockKey.build(RedisLockKey.ASYNC_TASK_KEY, asyncTask.getId());
+            // 加锁,自动续期
+            if (!distributedLocker.tryLock(lockKey,0,-1, TimeUnit.SECONDS)) {
+                continue;
+            }
+            try {
+                AsyncConsumeTask proxy = (AsyncConsumeTask)AopContext.currentProxy();
+                proxy.execute(asyncTask);
+            } catch (Exception e) {
+                // 更新异步任务执行次数
+                asyncTaskService.update(new LambdaUpdateWrapper<AsyncTask>()
+                        .set(AsyncTask::getOperateNum, asyncTask.getOperateNum() + 1)
+                        .eq(AsyncTask::getId, asyncTask.getId()));
+                LogUtil.error(logger, e, "异步任务处理异常。任务id:{0}", asyncTask.getId());
+            } finally {
+                // 释放锁
+                distributedLocker.unlock(lockKey);
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void execute(AsyncTask asyncTask){
+        if (AsyncTaskTypeEnum.CHANNEL_CONFIRM_RECEIPT.getValue().equals(asyncTask.getType())) {
+            // 确认收货后相关任务处理
+            asyncTaskService.channelConfirmReceipt(asyncTask);
+        }
+
+        // 更新异步任务状态
+        boolean rtn = asyncTaskService.update(new LambdaUpdateWrapper<AsyncTask>()
+                .set(AsyncTask::getOperateNum, asyncTask.getOperateNum() + 1)
+                .set(AsyncTask::getStatus, 1)
+                .eq(AsyncTask::getId, asyncTask.getId()));
+
+        Assert.isTrue(rtn,"异步任务状态更新失败, id:{0}", asyncTask.getId());
+    }
+
+}

+ 1 - 7
mp-quartz/src/main/java/com/qs/mp/quartz/task/ChannelOrderTask.java

@@ -49,17 +49,11 @@ public class ChannelOrderTask {
             .eq(ChannelOrder::getStatus, ChannelOrderStatusEnum.NOT_CONFIRM.getValue())
             .le(ChannelOrder::getDeliveryTime, deliveryTime));
 
-    List<ChannelOrder> params = new ArrayList<>();
     if (CollectionUtils.isNotEmpty(channelOrderList)) {
       for (ChannelOrder channelOrder : channelOrderList) {
-        ChannelOrder param = new ChannelOrder();
-        param.setOrderId(channelOrder.getOrderId());
-        param.setConfirmTime(new Date());
-        param.setStatus(ChannelOrderStatusEnum.FINISHED);
-        params.add(param);
+        channelOrderService.confirm(channelOrder);
       }
     }
-    channelOrderService.updateBatchById(params);
 
     LogUtil.info(logger, "...渠道商订单自动确认收货任务结束...");
   }

+ 14 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java

@@ -146,6 +146,11 @@ public class TicketBox implements Serializable {
   @TableField("sale_price")
   private Integer salePrice;
 
+
+  @ApiModelProperty("预购价")
+  @TableField("pre_price")
+  private Integer prePrice;
+
   /**
    * 分佣的销售额百分比
    */
@@ -197,6 +202,10 @@ public class TicketBox implements Serializable {
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketBoxStatusEnum status;
 
+  @ApiModelProperty("序列号加密:0否,1是")
+  @TableField("is_encrypt")
+  private Integer isEncrypt;
+
   /**
    * 逻辑删除标识
    */
@@ -221,4 +230,9 @@ public class TicketBox implements Serializable {
   private Date updatedTime;
 
 
+  @ApiModelProperty("预付票包价格")
+  public Integer getPkgPrePrice() {
+    return this.prePrice * this.pkgUnit;
+  }
+
 }

+ 19 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/TicketPackage.java

@@ -10,6 +10,9 @@ import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -19,6 +22,7 @@ import lombok.Data;
  */
 @TableName("mp_ticket_package")
 @Data
+@ApiModel("盲票实体类")
 public class TicketPackage implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -26,36 +30,46 @@ public class TicketPackage implements Serializable {
   /**
    * 盲票包ID
    */
+  @ApiModelProperty("盲票包ID")
   @TableId(value = "pkg_id" , type = IdType.INPUT)
   private String pkgId;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组ID")
   @TableField("box_id")
   private String boxId;
 
   /**
    * 盲票包编号
    */
+  @ApiModelProperty("盲票包编号")
   @TableField("pkg_no")
   private String pkgNo;
 
   /**
    * 开始序号
    */
+  @ApiModelProperty("开始序号")
   @TableField("start_sn")
   private String startSn;
 
   /**
    * 结束序号
    */
+  @ApiModelProperty("结束序号")
   @TableField("end_sn")
   private String endSn;
 
+  @ApiModelProperty("是否预购票0否,1是")
+  @TableField("is_pre")
+  private Integer isPre;
+
   /**
    * 状态(待销售、已销售)
    */
+  @ApiModelProperty("状态(待销售、已销售)")
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketPkgStatusEnum status;
@@ -63,6 +77,7 @@ public class TicketPackage implements Serializable {
   /**
    * 用户端销售状态(待售、销售中、已售罄)
    */
+  @ApiModelProperty("用户端销售状态(待售、销售中、已售罄)")
   @TableField("sale_status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketPkgSaleStatusEnum saleStatus;
@@ -70,24 +85,28 @@ public class TicketPackage implements Serializable {
   /**
    * 销售张数
    */
+  @ApiModelProperty("销售张数")
   @TableField("sale_qty")
   private Integer saleQty;
 
   /**
    * 每包张数
    */
+  @ApiModelProperty("每包张数")
   @TableField("pkg_unit")
   private Integer pkgUnit;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

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

@@ -29,6 +29,9 @@ public class ChannelOrderQueryParam {
 
 	@ApiModelProperty(value = "订单状态", required = false)
 	private Integer status;
+
+	@ApiModelProperty("订单类型1零售票,2线下预购票,3线上预购票")
+	private Integer type;
 	
 	/**
 	 * 下单区间-开始时间

+ 31 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/IndexTicketBoxTopQueryParam.java

@@ -0,0 +1,31 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author Cup
+ * @date 2022/6/8
+ */
+@ApiModel("后台首页盲票组销售统计查询入参类")
+@Data
+public class IndexTicketBoxTopQueryParam {
+
+    @ApiModelProperty(value = "自定义开始时间",required=false)
+    private Date startTime;
+
+    @ApiModelProperty(value = "自定义截止时间",required=false)
+    private Date endTime;
+
+    @ApiModelProperty("盲票订单状态")
+    private Integer ticketOrderStatus;
+
+    @ApiModelProperty("经销商订单状态")
+    private Integer channelOrderStatus;
+
+    @ApiModelProperty("经销商订单类型")
+    private Integer channelOrderType;
+}

+ 4 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxCreateParam.java

@@ -42,6 +42,10 @@ public class TicketBoxCreateParam {
 	@ApiModelProperty(value = "售价",required=true)
 	private Integer salePrice;
 
+	@NotNull(message = "预购价不能为空")
+	@ApiModelProperty(value = "预购价",required=true)
+	private Integer prePrice;
+
 	@NotNull(message = "数量不能为空")
 	@ApiModelProperty(value = "数量",required=true)
 	private Integer quantity;

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

@@ -20,6 +20,9 @@ public class TicketBoxParam {
 	@ApiModelProperty(value = "标签ID",required=false)
 	private Long tagId;
 
+	@ApiModelProperty("是否预购票:0否,1是")
+	private Integer isPre;
+
 	@NotNull(message = "盲票类型不能为空")
 	@ApiModelProperty(value = "盲票类型",required=true)
 	private TicketTypeEnum type;

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

@@ -28,6 +28,9 @@ public class TicketBoxUpdateParam {
     @ApiModelProperty(value = "图片")
     private String picUrl;
 
+    @ApiModelProperty(value = "预购价",required=true)
+    private Integer prePrice;
+
     @NotNull(message = "售价不能为空")
     @ApiModelProperty(value = "售价",required=true)
     private Integer salePrice;

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxListVO.java

@@ -90,6 +90,12 @@ public class TicketBoxListVO {
   @ApiModelProperty("盲票销售价格")
   private Integer salePrice;
 
+  @ApiModelProperty("盲票预购价")
+  private Integer prePrice;
+
+  @ApiModelProperty("盲票包预购价")
+  private Integer pkgPrePrice;
+
   /**
    * 分佣的销售额百分比
    */

+ 14 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketVO.java

@@ -3,6 +3,9 @@ package com.qs.mp.admin.domain.vo;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.qs.mp.admin.domain.TicketBox;
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -10,53 +13,64 @@ import lombok.Data;
  * @Date 2022/3/7
  */
 @Data
+@ApiModel("盲票出参类")
 public class TicketVO {
   // 奖品列表
+  @ApiModelProperty("奖品列表")
   List<TicketAwardsPrizeVO> prizeList;
 
   /**
    * 盲票ID
    */
+  @ApiModelProperty("盲票ID")
   private String ticketId;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组ID")
   private String boxId;
 
   /**
    * 图片
    */
+  @ApiModelProperty("图片")
   private String picUrl;
 
   /**
    * 标题
    */
+  @ApiModelProperty("标题")
   private String title;
 
   /**
    * 序列号
    */
+  @ApiModelProperty("序列号")
   private String serialNo;
 
   /**
    * 面值
    */
+  @ApiModelProperty("面值")
   private Integer facePrice;
 
   /**
    *
    */
+  @ApiModelProperty("销售价格")
   private Integer salePrice;
 
   /**
    * 明文幸运数字
    */
+  @ApiModelProperty("明文幸运数字")
   private Integer plainLuckyNum;
 
   /**
    * 盲票状态(未付款、已激活、已兑奖、付款中)
    */
+  @ApiModelProperty("盲票状态(未付款、已激活、已兑奖、付款中)")
   private Integer status;
 
 }

+ 4 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -112,6 +112,8 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     ticketBox.setTitle(param.getTitle());
     ticketBox.setPicUrl(param.getPicUrl());
     ticketBox.setSalePrice(param.getSalePrice());
+    // 设置预购价
+    ticketBox.setPrePrice(param.getPrePrice());
     ticketBox.setPkgSalePrice(param.getPkgSalePrice());
     ticketBox.setOriginPrice(param.getOriginPrice());
     ticketBox.setSaleCommRate(param.getSaleCommRate());
@@ -307,6 +309,8 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     ticketBox.setStatus(TicketBoxStatusEnum.WAIT);
     ticketBox.setBoxNo(ticketBoxSerialService.generateSerial(ticketBox.getType()));
     ticketBox.setBoxId(bizIdGenerator.newId());
+    // 序列号加密
+    ticketBox.setIsEncrypt(1);
     ticketBox.setSaleChannelType(param.getSaleChannelType());
     save(ticketBox);
 

+ 19 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCommission.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -16,6 +19,7 @@ import lombok.Data;
  */
 @TableName("mp_channel_commission")
 @Data
+@ApiModel("渠道佣金记录实体类")
 public class ChannelCommission implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -23,66 +27,81 @@ public class ChannelCommission implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("主键")
   @TableId(value = "id" , type = IdType.AUTO)
   private Long id;
 
   /**
    * 渠道ID
    */
+  @ApiModelProperty("渠道id")
   @TableField("channel_id")
   private Long channelId;
 
   /**
    * 用户订单ID
    */
+  @ApiModelProperty("用户订单ID")
   @TableField("order_id")
   private String orderId;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组id")
   @TableField("box_id")
   private String boxId;
 
+  @ApiModelProperty("订单来源1用户,2经销商")
+  @TableField("resource")
+  private Integer resource;
+
   /**
    * 销售金额
    */
+  @ApiModelProperty("销售金额")
   @TableField("sale_amt")
   private Integer saleAmt;
 
   /**
    * 参与分佣的销售金额比例
    */
+  @ApiModelProperty("参与分佣的销售金额比例")
   @TableField("sale_comm_rate")
   private BigDecimal saleCommRate;
 
   /**
    * 参与分佣的销售金额
    */
+  @ApiModelProperty("参与分佣的销售金额")
   @TableField("sale_comm_amt")
   private Integer saleCommAmt;
 
   /**
    * 佣金比例
    */
+  @ApiModelProperty("佣金比例")
   @TableField("comm_rate")
   private BigDecimal commRate;
 
   /**
    * 佣金金额
    */
+  @ApiModelProperty("佣金金额")
   @TableField("comm_amt")
   private Integer commAmt;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

+ 6 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrder.java

@@ -11,6 +11,7 @@ import com.qs.mp.common.enums.ChannelOrderStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
 
+import com.qs.mp.common.enums.ChannelOrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -76,6 +77,11 @@ public class ChannelOrder implements Serializable {
   @ApiModelProperty("实付金额")
   private Integer payAmt;
 
+  @ApiModelProperty("订单类型1普通票,2线下预购票,3线上预付票")
+  @TableField("type")
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private ChannelOrderTypeEnum type;
+
   /**
    * 订单状态,-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成
    */

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrderDetail.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -15,6 +18,7 @@ import lombok.Data;
  */
 @TableName("mp_channel_order_detail")
 @Data
+@ApiModel("经销商采购订单盲票包明细实体类")
 public class ChannelOrderDetail implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -22,54 +26,63 @@ public class ChannelOrderDetail implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("主键")
   @TableId(value = "id" , type = IdType.AUTO)
   private Long id;
 
   /**
    * 订单ID
    */
+  @ApiModelProperty("订单id")
   @TableField("order_id")
   private String orderId;
 
   /**
    * 渠道ID
    */
+  @ApiModelProperty("渠道id")
   @TableField("channel_id")
   private Long channelId;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组id")
   @TableField("box_id")
   private String boxId;
 
   /**
    * 盲票包ID
    */
+  @ApiModelProperty("盲票包id")
   @TableField("pkg_id")
   private String pkgId;
 
   /**
    * 起始序号
    */
+  @ApiModelProperty("起始序号")
   @TableField("start_sn")
   private String startSn;
 
   /**
    * 结束序号
    */
+  @ApiModelProperty("结束序号")
   @TableField("end_sn")
   private String endSn;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

+ 17 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrderItem.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -15,6 +18,7 @@ import lombok.Data;
  */
 @TableName("mp_channel_order_item")
 @Data
+@ApiModel("经销商订单明细")
 public class ChannelOrderItem implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -22,78 +26,91 @@ public class ChannelOrderItem implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("主键")
   @TableId(value = "id" , type = IdType.AUTO)
   private Long id;
 
   /**
    * 订单ID
    */
+  @ApiModelProperty("订单id")
   @TableField("order_id")
   private String orderId;
 
   /**
    * 渠道ID
    */
+  @ApiModelProperty("渠道id")
   @TableField("channel_id")
   private Long channelId;
 
   /**
    * 盲票组标题
    */
+  @ApiModelProperty("盲票组标题")
   @TableField("title")
   private String title;
 
   /**
    * 盲票组主图
    */
+  @ApiModelProperty("盲票组主图")
   @TableField("pic_url")
   private String picUrl;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组id")
   @TableField("box_id")
   private String boxId;
 
   /**
    * 盲票组属性
    */
+  @ApiModelProperty("盲票组属性")
   @TableField("properties")
   private String properties;
 
   /**
    * 每包盲票张数
    */
+  @ApiModelProperty("每包盲票张数")
   @TableField("pkg_unit")
   private Integer pkgUnit;
 
   /**
    * 盲票面值
    */
+  @ApiModelProperty("盲票面值")
   @TableField("face_price")
   private Integer facePrice;
 
   /**
    * 盲票包数量
    */
+  @ApiModelProperty("盲票包数量")
   @TableField("order_num")
   private Integer orderNum;
 
   /**
    * 盲票包单价
    */
+  @ApiModelProperty("盲票包单价")
   @TableField("pkg_sale_price")
   private Integer pkgSalePrice;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

+ 39 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelCommParam.java

@@ -0,0 +1,39 @@
+package com.qs.mp.channel.domain.param;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.common.enums.CommStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 渠道分佣入参类
+ * @author Cup
+ * @date 2022/6/7
+ */
+@ApiModel("渠道分佣入参类")
+@Data
+public class ChannelCommParam {
+
+    @ApiModelProperty("订单id")
+    private String orderId;
+
+    @ApiModelProperty("盲票组id")
+    private String boxId;
+
+    @ApiModelProperty("渠道id")
+    private Long channelId;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("实付金额")
+    private Integer payAmt;
+
+    @ApiModelProperty("结佣标识,1代表已结佣 0代表未结佣")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CommStatusEnum commStatus;
+
+}

+ 3 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelOrderParam.java

@@ -21,4 +21,7 @@ public class ChannelOrderParam {
 
 	@ApiModelProperty(value = "收货地址ID",required=false)
 	private Long addrId;
+
+	@ApiModelProperty("是否预付票:0否,1是")
+	private Integer isPre;
 }

+ 19 - 2
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelMyTicketVO.java

@@ -2,7 +2,9 @@ package com.qs.mp.channel.domain.vo;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.ChannelOrderTypeEnum;
 import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -50,11 +52,26 @@ public class ChannelMyTicketVO {
     @ApiModelProperty("面值")
     private Integer facePrice;
 
+    @ApiModelProperty("盲票类型")
+    private TicketTypeEnum ticketType;
+
+    @ApiModelProperty("是否预付票,0否,1是")
+    private Integer isPre;
 
     @ApiModelProperty("创建时间")
     private Date createdTime;
 
-
-
+    @ApiModelProperty("票包类型")
+    public ChannelOrderTypeEnum getType() {
+        if (this.isPre == 0){
+            return ChannelOrderTypeEnum.RETAIL;
+        } else {
+            if (TicketTypeEnum.OFFLINE.equals(this.ticketType)){
+                return ChannelOrderTypeEnum.OFFLINE_PRE;
+            }else {
+                return ChannelOrderTypeEnum.ONLINE_PRE;
+            }
+        }
+    }
 
 }

+ 5 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderItemVO.java

@@ -4,6 +4,8 @@ import java.util.List;
 
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelOrderItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -11,11 +13,14 @@ import lombok.Data;
  * @Date 2022/3/3
  */
 @Data
+@ApiModel("经销商订单明细出参类")
 public class ChannelOrderItemVO extends ChannelOrderItem {
 	
 	// 盲票组编号
+	@ApiModelProperty("盲票组编号")
 	private String boxNo;
 	
 	// 发货的票包详情
+	@ApiModelProperty("发货的票包详情")
 	private List<ChannelOrderDetail> detailList;
 }

+ 4 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderSettleVO.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.domain.vo;
 
+import com.qs.mp.common.enums.ChannelOrderTypeEnum;
 import com.qs.mp.user.domain.UserAddr;
 import java.util.ArrayList;
 import java.util.List;
@@ -60,4 +61,7 @@ public class ChannelOrderSettleVO {
    */
   @ApiModelProperty("盲票包数")
   private Integer pkgNum = 0;
+
+  @ApiModelProperty("订单类型1普通票,2线下预购票,3线上预付票")
+  private Integer type;
 }

+ 9 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderVO.java

@@ -3,6 +3,9 @@ package com.qs.mp.channel.domain.vo;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -10,13 +13,18 @@ import lombok.Data;
  * @Date 2022/3/3
  */
 @Data
+@ApiModel("经销商订单出参类")
 public class ChannelOrderVO extends ChannelOrder {
 
+  @ApiModelProperty("经销商订单明细出参类")
   private List<ChannelOrderItemVO> items;
 
+  @ApiModelProperty("经销商名称")
   private String channelName;  // 经销商名称
-  
+
+  @ApiModelProperty("上级渠道名称")
   private String parentName;  // 上级渠道名称
 
+  @ApiModelProperty("物流公司名称")
   private String companyName; // 物流公司名称
 }

+ 10 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelOrderMapper.java

@@ -1,5 +1,7 @@
 package com.qs.mp.channel.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
 
@@ -35,4 +37,12 @@ public interface ChannelOrderMapper extends BaseMapper<ChannelOrder> {
 	 * @return
 	 */
 	int selectChannelOrderCount(@Param(Constants.WRAPPER) Wrapper<ChannelOrder> wrapper);
+
+	/**
+	 * 统计实时交易数据
+	 * @param wrapper
+	 * @return
+	 */
+    List<IndexVO> selectIndexChannelOrderDailyInfoList(@Param(Constants.WRAPPER) QueryWrapper<ChannelOrder> wrapper);
+
 }

+ 16 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java

@@ -1,6 +1,8 @@
 package com.qs.mp.channel.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.param.ChannelOrderCancelParam;
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
@@ -81,4 +83,18 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
 	 * @return
 	 */
     boolean cancelOrderByAdmin(ChannelOrderCancelParam param);
+
+	/**
+	 * 订单确认收货
+	 * @param order
+	 */
+    void confirm(ChannelOrder order);
+
+	/**
+	 * 统计实时交易数据
+	 * @param wrapper
+	 * @return
+	 */
+	List<IndexVO> selectIndexChannelOrderDailyInfoList(QueryWrapper<ChannelOrder> wrapper);
+
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelUserRelService.java

@@ -26,4 +26,11 @@ public interface IChannelUserRelService extends IService<ChannelUserRel> {
 	 * @return
 	 */
 	int getChannelNewUserCnt(String channelNo, int days);
+
+	/**
+	 * 经销商绑定用户关系
+	 * @param userId
+	 * @param channelId
+	 */
+	void bindUser(Long userId,Long channelId);
 }

+ 50 - 4
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -3,17 +3,22 @@ package com.qs.mp.channel.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.domain.param.ChannelOrderCancelParam;
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
-import com.qs.mp.common.enums.PayOrderStatusEnum;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.framework.domain.AsyncTask;
+import com.qs.mp.framework.service.IAsyncTaskService;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.user.domain.UserAddr;
@@ -29,9 +34,6 @@ import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.common.core.domain.AjaxResult;
-import com.qs.mp.common.enums.ChannelOrderStatusEnum;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.pay.domain.PayOrder;
@@ -89,6 +91,9 @@ public class ChannelOrderServiceImpl extends
   @Autowired
   private IPayOrderService payOrderService;
 
+  @Autowired
+  private IAsyncTaskService asyncTaskService;
+
   @Override
   @Transactional
   public String submitOrder(Long channelId, String memo, ChannelOrderSettleVO orderSettleVO) {
@@ -114,6 +119,11 @@ public class ChannelOrderServiceImpl extends
       item.setFacePrice(ticketBox.getFacePrice());
       item.setOrderNum(channelCartVO.getOrderNum());
       item.setPkgSalePrice(ticketBox.getPkgSalePrice());
+      // 预付票处理
+      if (Objects.nonNull(orderSettleVO.getType()) && !orderSettleVO.getType().equals(ChannelOrderTypeEnum.RETAIL)) {
+          item.setPkgSalePrice(ticketBox.getPkgPrePrice());
+      }
+
       orderItemList.add(item);
       // 累计商品数,拼接标题
       prodNum += channelCartVO.getOrderNum();
@@ -155,6 +165,7 @@ public class ChannelOrderServiceImpl extends
     channelOrder.setCity(addr.getCity());
     channelOrder.setArea(addr.getArea());
     channelOrder.setAddress(addr.getAddr());
+    channelOrder.setType(ChannelOrderTypeEnum.getByValue(orderSettleVO.getType()));
 
     channelOrderService.save(channelOrder);
     channelOrderItemService.saveBatch(orderItemList);
@@ -233,6 +244,24 @@ public class ChannelOrderServiceImpl extends
         return true;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirm(ChannelOrder order) {
+        // 更新用户提货订单状态为已完成,并且设置收货时间
+        ChannelOrder param = new ChannelOrder();
+        param.setOrderId(order.getOrderId());
+        param.setStatus(ChannelOrderStatusEnum.FINISHED);
+        param.setConfirmTime(new Date());
+        boolean rtn = channelOrderService.updateById(param);
+        Assert.isTrue(rtn,"更新提货订单状态失败,orderId:{0}", order.getOrderId());
+
+        // 提交异步任务
+        AsyncTask asyncTask = new AsyncTask();
+        asyncTask.setType(AsyncTaskTypeEnum.CHANNEL_CONFIRM_RECEIPT.getValue());
+        asyncTask.setBizId(order.getOrderId());
+        Assert.isTrue(asyncTaskService.save(asyncTask),"提交经销商提货订单确认收货任务失败,orderId:{0}", order.getOrderId());
+    }
+
     /**
      * 回滚盲票组销量和状态
      * @param orderItem
@@ -331,6 +360,10 @@ public class ChannelOrderServiceImpl extends
     }
     // 修改票包已销售状态
     LambdaUpdateWrapper<TicketPackage> updateWrapper = new LambdaUpdateWrapper<TicketPackage>();
+    // 如果为预购票,则修改票包的状态
+    if (!ChannelOrderTypeEnum.RETAIL.equals(channelOrder.getType())) {
+        updateWrapper.set(TicketPackage::getIsPre, 1);
+    }
     updateWrapper.set(TicketPackage::getStatus, TicketPkgStatusEnum.SOLD);
     updateWrapper.in(TicketPackage::getPkgId, pkgIdList);
     updateWrapper.eq(TicketPackage::getStatus, TicketPkgStatusEnum.FOR_SALE);
@@ -344,6 +377,14 @@ public class ChannelOrderServiceImpl extends
     // 物流单号为空则表示无需物流发货
     if (StringUtils.isBlank(deliveryFlowId)) {
         channelOrder.setStatus(ChannelOrderStatusEnum.FINISHED);
+
+        // 无需物流插入分佣异步任务
+        // 提交异步任务
+        AsyncTask asyncTask = new AsyncTask();
+        asyncTask.setType(AsyncTaskTypeEnum.CHANNEL_CONFIRM_RECEIPT.getValue());
+        asyncTask.setBizId(channelOrder.getOrderId());
+        Assert.isTrue(asyncTaskService.save(asyncTask),"提交订单无需物流发货确认收货任务失败,orderId:{0}", channelOrder.getOrderId());
+
     } else {
         channelOrder.setStatus(ChannelOrderStatusEnum.NOT_CONFIRM);
     }
@@ -364,5 +405,10 @@ public class ChannelOrderServiceImpl extends
 		return getBaseMapper().selectChannelOrderCount(wrapper);
 	}
 
+    @Override
+    public List<IndexVO> selectIndexChannelOrderDailyInfoList(QueryWrapper<ChannelOrder> wrapper) {
+        return getBaseMapper().selectIndexChannelOrderDailyInfoList(wrapper);
+    }
+
 
 }

+ 15 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelUserRelServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.channel.domain.ChannelUserRel;
 import com.qs.mp.channel.mapper.ChannelUserRelMapper;
 import com.qs.mp.channel.service.IChannelUserRelService;
@@ -26,4 +27,18 @@ public class ChannelUserRelServiceImpl extends ServiceImpl<ChannelUserRelMapper,
 	public int getChannelNewUserCnt(String channelNo, int days) {
 		return getBaseMapper().getChannelNewUserCnt(channelNo, days == 1?0:days);
 	}
+
+	@Override
+	public void bindUser(Long userId, Long channelId) {
+		// 线下票如果用户没被绑定,则保存经销商用户绑定关系
+		ChannelUserRel channelUserRel = this.getOne(
+				new LambdaQueryWrapper<ChannelUserRel>()
+						.eq(ChannelUserRel::getUserId, userId));
+		if (null == channelUserRel) {
+			channelUserRel = new ChannelUserRel();
+			channelUserRel.setChannelId(channelId);
+			channelUserRel.setUserId(userId);
+			this.save(channelUserRel);
+		}
+	}
 }

+ 85 - 0
mp-service/src/main/java/com/qs/mp/framework/domain/AsyncTask.java

@@ -0,0 +1,85 @@
+package com.qs.mp.framework.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 异步任务表实体类
+ * @auther quanshu
+ * @create 2022-06-07 10:34:20
+ */
+@TableName("mp_async_task")
+@Data
+@ApiModel("异步任务表实体类")
+public class AsyncTask implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 异步任务id
+     */
+    @ApiModelProperty("异步任务id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 任务类型
+     */
+    @ApiModelProperty("任务类型")
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 业务id
+     */
+    @ApiModelProperty("业务id")
+    @TableField("biz_id")
+    private String bizId;
+
+    @ApiModelProperty("任务状态-1已取消,0未完成,1已完成")
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 操作次数
+     */
+    @ApiModelProperty("操作次数")
+    @TableField("operate_num")
+    private Integer operateNum;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/framework/mapper/AsyncTaskMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.framework.mapper;
+
+import com.qs.mp.framework.domain.AsyncTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-06-07 10:34:20
+ * @describe mapper类
+ */
+public interface AsyncTaskMapper extends BaseMapper<AsyncTask> {
+
+}

+ 1 - 1
mp-service/src/main/java/com/qs/mp/framework/redis/RedisLockKey.java

@@ -9,7 +9,7 @@ import com.qs.mp.common.utils.MessageHelper;
  *
  */
 public enum RedisLockKey {
-
+    ASYNC_TASK_KEY("async_task_key_{0}", "异步任务key"),
     MARKETING_REAL_NUM_LOCK("marketing_real_num_lock_{0}", "活动真实人数增加锁"),
     MARKETING_LOTTERY_KEY("marketing_lottery_key_{0}","免费抽奖活动开奖"),
     USER_TICKET_CASH_LOCK("user_ticket_cash_lock_{0}", "盲票兑奖锁");

+ 21 - 0
mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java

@@ -0,0 +1,21 @@
+package com.qs.mp.framework.service;
+
+import com.qs.mp.framework.domain.AsyncTask;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-06-07
+ */
+public interface IAsyncTaskService extends IService<AsyncTask> {
+
+    /**
+     * 经销商确认收货后相关任务处理
+     * @param asyncTask
+     */
+    void channelConfirmReceipt(AsyncTask asyncTask);
+}

+ 57 - 0
mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java

@@ -0,0 +1,57 @@
+package com.qs.mp.framework.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.enums.ChannelCommissionResourceEnum;
+import com.qs.mp.common.enums.ChannelOrderTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.framework.domain.AsyncTask;
+import com.qs.mp.framework.mapper.AsyncTaskMapper;
+import com.qs.mp.framework.service.IAsyncTaskService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-06-07
+ */
+@Service
+public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask> implements IAsyncTaskService {
+
+    @Autowired
+    private IChannelOrderService channelOrderService;
+
+    @Autowired
+    private IUserTicketOrderService userTicketService;;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void channelConfirmReceipt(AsyncTask asyncTask) {
+        // 获取供应商订单编号
+        String orderId = asyncTask.getBizId();
+
+        // 查询订单
+        ChannelOrder channelOrder = channelOrderService.getById(orderId);
+        if (Objects.isNull(channelOrder)) {
+            throw new ServiceException("经销商订单不存在,OrderId:" + orderId);
+        }
+
+        if (ChannelOrderTypeEnum.RETAIL.equals(channelOrder.getType())) {
+            return;
+        }
+
+        // 分佣
+        userTicketService.commToChannel(orderId, ChannelCommissionResourceEnum.CHANNEL.getValue());
+    }
+}

+ 8 - 5
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxUrlLinkServiceImpl.java

@@ -41,6 +41,9 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
   @Value("${cloud.public-bucket-name}")
   private String publicBucketName;
 
+  @Value("${miniprogram.env_version}")
+  private String envVersion;
+
   @Override
   public String generate(String path, String query, String appId) {
     Map<String, Object> param = new HashMap<String, Object>();
@@ -74,7 +77,7 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     Map<String, Object> jumpParam = new HashMap<>();
     jumpParam.put("path", path);
     jumpParam.put("query", query);
-    jumpParam.put("env_version", "release");
+    jumpParam.put("env_version", envVersion);
     param.put("jump_wxa", jumpParam);
     // 有效时间超过31天的 Link 或永久有效的 Link 为长期有效Link,
     // 单个小程序总共可生成长期有效 Link 上限为10万个,请谨慎调用
@@ -87,8 +90,8 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     String res = HttpUtils.sendPost(
         "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + accessToken,
         JSON.toJSONString(param));
-    LogUtil.info(logger, "小程序UrlSchema获取,path:{0},query:{1},res:{2}",
-        new Object[]{path, query, res});
+    LogUtil.info(logger, "小程序UrlSchema获取,path:{0},query:{1},res:{2},jumpParam:{3}",
+        new Object[]{path, query, res, jumpParam});
     JSONObject jsonObject = JSON.parseObject(res);
     if (jsonObject.getIntValue("errcode") != 0) {
       LogUtil.error(logger, "小程序UrlSchema获取错误,res:{0}", res);
@@ -103,7 +106,7 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     param.put("path", path + "?" + scene); // 页面路径
     //param.put("scene", scene); // 参数
 //    param.put("check_path", true);// 为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在
-//    param.put("env_version", "release");
+//    param.put("env_version", envVersion);
     // 获取access_token
     String accessToken = appTokenService.getAccessToken(appId);
     InputStream in = HttpUtils.sendImagePost(
@@ -134,7 +137,7 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     param.put("page", path); // 页面路径
     param.put("scene", scene); // 参数
 //    param.put("check_path", true);// 为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在
-    param.put("env_version", "release");
+    param.put("env_version", envVersion);
     // 获取access_token
     String accessToken = appTokenService.getAccessToken(appId);
     InputStream in = HttpUtils.sendImagePost(

+ 9 - 7
mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java

@@ -10,12 +10,8 @@ import com.qs.mp.admin.service.ITicketBoxSerialService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
-import com.qs.mp.common.enums.CommStatusEnum;
-import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
-import com.qs.mp.common.enums.TicketTypeEnum;
-import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.pulsar.PulsarConsumer;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.user.domain.UserTicketOrder;
@@ -55,6 +51,9 @@ public class PulsarConsumerImpl implements PulsarConsumer {
   @Autowired
   private ITicketService ticketService;
 
+  @Autowired
+  private IChannelUserRelService channelUserRelService;
+
   @Override
   @Async("threadPoolTaskExecutor")
   public void wsConsumer(String topicType, String mqData) {
@@ -97,6 +96,9 @@ public class PulsarConsumerImpl implements PulsarConsumer {
           .eq(TicketPackage::getPkgId, ticketPackage.getPkgId()));
     }
 
+    // 用户关系绑定
+    channelUserRelService.bindUser(ticketOrder.getUserId(), ticketOrder.getChannelId());
+
     if (ticketOrder.getCommStatus() != CommStatusEnum.NO) {
       LogUtil.warn(logger, "收到盲票支付成功消息,订单结佣状态不是未结佣,忽略消息。orderId=" + orderId);
       return;
@@ -108,7 +110,7 @@ public class PulsarConsumerImpl implements PulsarConsumer {
       LogUtil.error(logger, "收到盲票支付成功消息,更新订单结佣状态为结佣中失败。orderId=" + orderId);
       return;
     }
-    userTicketOrderService.commToChannel(orderId);
+    userTicketOrderService.commToChannel(orderId, ChannelCommissionResourceEnum.USER.getValue());
   }
 
   private void processTicketGenerateMsg(String mqData) {

+ 8 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java

@@ -1,10 +1,12 @@
 package com.qs.mp.user.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
+import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 
@@ -101,4 +103,10 @@ public interface UserTicketOrderMapper extends BaseMapper<UserTicketOrder> {
 	UserTicketOrderDetailVO selectUserTicketOrderDetail(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
 
 	int countUserTicketOrder(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
+
+	/**
+	 * 统计盲票组销量
+	 * @return
+	 */
+    List<IndexVO> selectIndexTicketBoxTopByTicketOrderAndChannelOrder(@Param("param") IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam );
 }

+ 12 - 1
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java

@@ -1,11 +1,13 @@
 package com.qs.mp.user.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
+import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
@@ -63,9 +65,10 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
   /**
    * 给渠道分润
    * @param orderId
+   * @param resource 订单来源1用户,2经销商
    * @return
    */
-  boolean commToChannel(String orderId);
+  boolean commToChannel(String orderId,Integer resource);
   
   
   /**
@@ -154,4 +157,12 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
      * @return
      */
     int countUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper);
+
+    /**
+     * 统计盲票组销量
+     * @param queryWrapper
+     * @param channelOrderQueryWrapper
+     * @return
+     */
+    List<IndexVO> selectIndexTicketBoxTopByTicketOrderAndChannelOrder(IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam );
 }

+ 55 - 50
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -9,31 +9,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
 import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
-import com.qs.mp.channel.domain.Channel;
-import com.qs.mp.channel.domain.ChannelCommission;
-import com.qs.mp.channel.domain.ChannelMoneyLog;
-import com.qs.mp.channel.domain.ChannelOrderDetail;
-import com.qs.mp.channel.domain.ChannelUserRel;
-import com.qs.mp.channel.service.IChannelCommissionService;
-import com.qs.mp.channel.service.IChannelMoneyLogService;
-import com.qs.mp.channel.service.IChannelOrderDetailService;
-import com.qs.mp.channel.service.IChannelService;
-import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.channel.domain.*;
+import com.qs.mp.channel.domain.param.ChannelCommParam;
+import com.qs.mp.channel.service.*;
 import com.qs.mp.common.core.redis.RedisCache;
-import com.qs.mp.common.enums.ChannelMoneyEnum;
-import com.qs.mp.common.enums.CommStatusEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
-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.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
@@ -61,6 +47,7 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -110,6 +97,12 @@ public class UserTicketOrderServiceImpl extends
   @Autowired
   private ITicketPackageService ticketPackageService;
 
+  @Autowired
+  private IChannelOrderService channelOrderService;
+
+  @Autowired
+  private IChannelOrderItemService channelOrderItemService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
@@ -431,17 +424,31 @@ public class UserTicketOrderServiceImpl extends
   }
 
   @Override
-  @Transactional
-  public boolean commToChannel(String orderId) {
-    UserTicketOrder ticketOrder = getById(orderId);
-    Assert.isTrue(ticketOrder.getCommStatus() == CommStatusEnum.DOING,
-        "结佣处理,结佣状态异常,不是结佣中。orderId=" + orderId);
-
-    if (null != ticketOrder.getChannelId()) {
+  @Transactional(rollbackFor = Exception.class)
+  public boolean commToChannel(String orderId, Integer resource) {
+    ChannelCommParam channelCommParam = new ChannelCommParam();
+    if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
+      UserTicketOrder ticketOrder = getById(orderId);
+      BeanUtils.copyProperties(ticketOrder, channelCommParam);
+      Assert.isTrue(channelCommParam.getCommStatus() == CommStatusEnum.DOING,
+              "结佣处理,结佣状态异常,不是结佣中。orderId=" + orderId);
+    } else {
+      ChannelOrder channelOrder = channelOrderService.getById(orderId);
+      ChannelOrderItem channelOrderItem = channelOrderItemService.getOne(new LambdaQueryWrapper<ChannelOrderItem>()
+              .eq(ChannelOrderItem::getOrderId, orderId));
+      channelCommParam.setBoxId(channelOrderItem.getBoxId());
+      channelCommParam.setChannelId(channelOrder.getChannelId());
+      channelCommParam.setOrderId(channelOrder.getOrderId());
+      channelCommParam.setPayAmt(channelOrder.getPayAmt());
+    }
+    if (channelCommParam.getPayAmt() == 0) {
+      return true;
+    }
+    if (null != channelCommParam.getChannelId()) {
       // 线下购票,优先给当前票的经销商渠道分润
-      TicketBox ticketBox = ticketBoxService.getById(ticketOrder.getBoxId());
-      Channel channel = channelService.getById(ticketOrder.getChannelId());
-      ChannelCommission siteCommission = saveSiteCommAmt(ticketOrder, ticketBox, channel);
+      TicketBox ticketBox = ticketBoxService.getById(channelCommParam.getBoxId());
+      Channel channel = channelService.getById(channelCommParam.getChannelId());
+      ChannelCommission siteCommission = saveSiteCommAmt(channelCommParam, ticketBox, channel);
       // 经销商账户余额增加
       changeMoney(channel, siteCommission);
 
@@ -452,6 +459,7 @@ public class UserTicketOrderServiceImpl extends
         ChannelCommission channelCommission = new ChannelCommission();
         channelCommission.setChannelId(channel.getChannelId());
         channelCommission.setOrderId(siteCommission.getOrderId());
+        channelCommission.setResource(resource);
         channelCommission.setBoxId(siteCommission.getBoxId());
         channelCommission.setSaleAmt(siteCommission.getSaleAmt());
         channelCommission.setSaleCommRate(siteCommission.getSaleCommRate());
@@ -463,26 +471,18 @@ public class UserTicketOrderServiceImpl extends
         channelCommissionService.save(channelCommission);
         sumCommAmt += channelCommission.getCommAmt();
       }
-      // 线下票如果用户没被绑定,则保存经销商用户绑定关系
-      ChannelUserRel channelUserRel = channelUserRelService.getOne(
-          new LambdaQueryWrapper<ChannelUserRel>()
-              .eq(ChannelUserRel::getUserId, ticketOrder.getUserId()));
-      if (null == channelUserRel) {
-        channelUserRel = new ChannelUserRel();
-        channelUserRel.setChannelId(ticketOrder.getChannelId());
-        channelUserRel.setUserId(ticketOrder.getUserId());
-        channelUserRelService.save(channelUserRel);
-      }
     } else {
       LogUtil.info(logger, "渠道结佣时,订单对应的渠道不存在,无需结佣。orderId:{0}",
-          ticketOrder.getOrderId());
+          channelCommParam.getOrderId());
+    }
+    if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
+      boolean rst = update(
+              new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
+                              CommStatusEnum.YES)
+                      .eq(UserTicketOrder::getOrderId, orderId)
+                      .eq(UserTicketOrder::getCommStatus, CommStatusEnum.DOING));
+      Assert.isTrue(rst, "渠道结佣完成,更新订单状态失败。orderId:" + orderId);
     }
-    boolean rst = update(
-        new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
-                CommStatusEnum.YES)
-            .eq(UserTicketOrder::getOrderId, orderId)
-            .eq(UserTicketOrder::getCommStatus, CommStatusEnum.DOING));
-    Assert.isTrue(rst, "渠道结佣完成,更新订单状态失败。orderId:" + orderId);
     return true;
   }
 
@@ -496,13 +496,13 @@ public class UserTicketOrderServiceImpl extends
     channelMoneyLogService.changeMoney(moneyLog);
   }
 
-  private ChannelCommission saveSiteCommAmt(UserTicketOrder ticketOrder, TicketBox ticketBox,
+  private ChannelCommission saveSiteCommAmt(ChannelCommParam channelCommParam, TicketBox ticketBox,
       Channel channel) {
     ChannelCommission siteCommission = new ChannelCommission();
     siteCommission.setChannelId(channel.getChannelId());
-    siteCommission.setOrderId(ticketOrder.getOrderId());
-    siteCommission.setBoxId(ticketOrder.getBoxId());
-    siteCommission.setSaleAmt(ticketOrder.getPayAmt());
+    siteCommission.setOrderId(channelCommParam.getOrderId());
+    siteCommission.setBoxId(channelCommParam.getBoxId());
+    siteCommission.setSaleAmt(channelCommParam.getPayAmt());
     siteCommission.setSaleCommRate(ticketBox.getSaleCommRate());
     siteCommission.setSaleCommAmt(new BigDecimal(siteCommission.getSaleAmt()).multiply(
             siteCommission.getSaleCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)
@@ -569,6 +569,11 @@ public class UserTicketOrderServiceImpl extends
     return getBaseMapper().countUserTicketOrder(queryWrapper);
   }
 
+  @Override
+  public List<IndexVO> selectIndexTicketBoxTopByTicketOrderAndChannelOrder(IndexTicketBoxTopQueryParam indexTicketBoxTopQueryParam ) {
+    return getBaseMapper().selectIndexTicketBoxTopByTicketOrderAndChannelOrder(indexTicketBoxTopQueryParam);
+  }
+
   @Override
   public UserTicketOrderDetailVO detail(String orderId) {
     QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();

+ 1 - 1
mp-service/src/main/resources/mapper/admin/TicketBoxMapper.xml

@@ -37,7 +37,7 @@
         box_id, box_no, title, pic_url, category_id, description, sale_point, type, quantity, sale_qty, pkg_sale_price, pkg_unit, pkg_qty, sale_pkg_qty, face_price, sale_price, sale_comm_rate, properties, sort_weight, on_time, off_time, manual_off, status, is_deleted, created_time, updated_time
     </sql>
 
-    <select id="listBySaleChannel" resultMap="BaseResultMap">
+    <select id="listBySaleChannel" resultType="com.qs.mp.admin.domain.TicketBox">
         select t1.*
         from mp_ticket_box t1
         left join mp_ticket_box_channel t2 on t1.box_id = t2.box_id

+ 3 - 1
mp-service/src/main/resources/mapper/channel/ChannelOrderDetailMapper.xml

@@ -33,7 +33,9 @@
                t2.pkg_unit,
                t3.title,
                t3.pic_url,
-               t3.face_price
+               t3.face_price,
+                t2.is_pre,
+                t3.type ticketType
         FROM mp_channel_order_detail t1
          LEFT JOIN mp_ticket_package t2 ON t1.pkg_id = t2.pkg_id
          LEFT JOIN mp_ticket_box t3 ON t2.box_id = t3.box_id

+ 9 - 0
mp-service/src/main/resources/mapper/channel/ChannelOrderMapper.xml

@@ -51,4 +51,13 @@
 		${ew.customSqlSegment}
 	</select>
 
+    <select id="selectIndexChannelOrderDailyInfoList" resultType="com.qs.mp.admin.domain.vo.IndexVO">
+        select
+            DATE_FORMAT(t1.created_time, '%Y%m%d') AS time,
+        SUM(t1.pay_amt) AS payAmt
+        from mp_channel_order t1
+        ${ew.customSqlSegment}
+        group by time
+    </select>
+
 </mapper>

+ 21 - 0
mp-service/src/main/resources/mapper/framework/AsyncTaskMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.framework.mapper.AsyncTaskMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.framework.domain.AsyncTask">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="biz_id" property="bizId" />
+        <result column="operate_num" property="operateNum" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, biz_id, operate_num, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 27 - 0
mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

@@ -180,4 +180,31 @@
 		left join mp_ticket_box t3 on t1.box_id = t3.box_id
 		${ew.customSqlSegment}
 	</select>
+
+    <select id="selectIndexTicketBoxTopByTicketOrderAndChannelOrder" resultType="com.qs.mp.admin.domain.vo.IndexVO">
+		select SUM(a.pay_amt) as payAmt,
+				b.title,
+				a.box_id
+		from (select t1.box_id,
+		SUM(t1.pay_amt) AS pay_amt
+		from `mp_user_ticket_order` t1
+		where t1.created_time between #{param.startTime} and #{param.endTime}
+		and t1.status > #{param.ticketOrderStatus}
+		group by t1.box_id
+
+		union
+
+		select a2.box_id,
+		sum(a1.pay_amt) as pay_amt
+		from mp_channel_order a1
+		left join mp_channel_order_item a2
+		on a1.order_id = a2.order_id
+		where a1.created_time between #{param.startTime} and #{param.endTime}
+		and a1.status > #{param.channelOrderStatus}
+		and  a1.type > #{param.channelOrderType}
+		group by a2.box_id) a
+		left join mp_ticket_box b on a.box_id = b.box_id
+		group by a.box_id
+		ORDER BY payAmt DESC
+	</select>
 </mapper>