浏览代码

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

Liugl 3 年之前
父节点
当前提交
2ffdf23ea7
共有 47 个文件被更改,包括 1374 次插入153 次删除
  1. 2 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  2. 447 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java
  3. 35 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  4. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java
  5. 32 32
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java
  6. 2 5
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  7. 48 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserShareController.java
  8. 13 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  9. 3 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  10. 17 0
      mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java
  11. 1 0
      mp-admin/src/main/resources/application-8100.yml
  12. 1 0
      mp-admin/src/main/resources/application-8200.yml
  13. 1 0
      mp-admin/src/main/resources/application-dev.yml
  14. 1 0
      mp-admin/src/main/resources/application-test.yml
  15. 15 0
      mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java
  16. 1 0
      mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java
  17. 4 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketTypeEnum.java
  18. 108 16
      mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java
  19. 11 1
      mp-common/src/main/java/com/qs/mp/common/utils/WebhookService.java
  20. 2 1
      mp-common/src/main/java/com/qs/mp/common/utils/http/HttpUtils.java
  21. 1 1
      mp-framework/src/main/java/com/qs/mp/framework/web/exception/GlobalExceptionHandler.java
  22. 226 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/DayStatTask.java
  23. 24 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/IndexQueryParam.java
  24. 35 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/IndexVO.java
  25. 17 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketAwardsVO.java
  26. 4 1
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java
  27. 2 9
      mp-service/src/main/java/com/qs/mp/admin/service/impl/GoodsServiceImpl.java
  28. 1 5
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderInfoVO.java
  29. 2 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderVO.java
  30. 9 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelMapper.java
  31. 11 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelService.java
  32. 8 2
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java
  33. 8 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java
  34. 10 1
      mp-service/src/main/java/com/qs/mp/framework/service/IWxUrlLinkService.java
  35. 51 1
      mp-service/src/main/java/com/qs/mp/framework/service/impl/WxUrlLinkServiceImpl.java
  36. 1 1
      mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java
  37. 16 14
      mp-service/src/main/java/com/qs/mp/system/mapper/SysUserMapper.java
  38. 26 24
      mp-service/src/main/java/com/qs/mp/system/service/ISysUserService.java
  39. 30 27
      mp-service/src/main/java/com/qs/mp/system/service/impl/SysUserServiceImpl.java
  40. 6 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java
  41. 16 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserShareVO.java
  42. 22 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java
  43. 22 1
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  44. 41 5
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  45. 12 0
      mp-service/src/main/resources/mapper/channel/ChannelMapper.xml
  46. 2 1
      mp-service/src/main/resources/mapper/channel/ChannelOrderMapper.xml
  47. 26 1
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

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

@@ -15,6 +15,7 @@ import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.vo.ChannelOrderInfoVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderItemVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.channel.domain.vo.ChannelVO;
 import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
@@ -114,7 +115,7 @@ public class ChannelOrderMgrController extends BaseApiController {
     ChannelOrderInfoVO channelOrderInfoVO = mapperFacade.map(channelOrder, ChannelOrderInfoVO.class);
 
     if(null != channelOrderInfoVO && null != channelOrderInfoVO.getChannelId()) {
-    	Channel channel = channelService.getById(channelOrderInfoVO.getChannelId());
+    	ChannelVO channel = channelService.getChannelVoById(channelOrderInfoVO.getChannelId());
     	channelOrderInfoVO.setChannel(channel);
     }
     if(null != channelOrderInfoVO && null != channelOrderInfoVO.getDeliveryId()) {

+ 447 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java

@@ -0,0 +1,447 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.param.IndexQueryParam;
+import com.qs.mp.admin.domain.vo.IndexVO;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+
+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 org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther quanshu
+ * @create 2022-03-31 16:17:48
+ * @describe 首页渠道管理前端控制器
+ */
+@Api("首页管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/index/*")
+@Component
+public class IndexMgrController extends BaseApiController {
+
+	@Autowired
+	private IChannelService channelService;
+
+    @Autowired
+    private IUserTicketOrderService userTicketOrderService;
+
+
+
+	/**
+	 * 查询统计交易金额
+	 * @return
+	 */
+	@PostMapping("/pay/amt")
+	// @PreAuthorize("@ss.hasPermi('business:channel:list')")
+	public AjaxResult listPayAmtData(@RequestBody IndexQueryParam indeQueryParam) {
+		
+		IndexQueryParam queryParam = getQueryParam(indeQueryParam);
+		
+		List<IndexVO> list = new ArrayList<IndexVO>();
+		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<>();
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getEndTime());
+		queryWrapper.gt("t1.`status`", 0);
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if(null != channelId && 0 != channelId) {
+			Channel channel = channelService.getById(channelId);
+			if(null!=channel && StringUtils.isNotBlank(channel.getChannelNo())) {
+				queryWrapper.and(wrapper -> wrapper.likeRight("t2.channel_no", channel.getChannelNo())
+						.or().eq("t2.channel_no", channel.getChannelNo()));
+			}
+		}
+	
+		list = userTicketOrderService.selectIndexPayAmtList(queryWrapper);
+		return  AjaxResult.success(getPayAmtList(list, queryParam));
+	}
+	
+	private List<Map<String,Object>> getPayAmtList(List<IndexVO> list, IndexQueryParam queryParam){
+		List<Map<String,Object>> mapList = new ArrayList<>();
+		if(null != queryParam && queryParam.getLevel().equals("month")) {  // 月粒度
+			List<String> monthList = DateUtils.addMonths(queryParam.getStartTime(), queryParam.getEndTime());
+			if(null != monthList && monthList.size() > 0) {
+				for(String month : monthList) {
+					if(StringUtils.isNotBlank(month)) {
+						Map<String,Object> map = new HashMap<String,Object>();
+						map.put("x", month);
+						map.put("y", getMonthPayAmt(month, list));
+						mapList.add(map);
+					}
+				}
+			}
+		}else if(null != queryParam && queryParam.getLevel().equals("week")) {  // 周粒度
+			List<Map<String,Object>> weekList = DateUtils.getDateOfWeek(queryParam.getStartTime(), queryParam.getEndTime());
+			if(null != weekList && weekList.size() > 0) {
+				for(Map<String,Object> weekMap : weekList) {
+					if(null != weekMap && weekMap.containsKey("start")
+							&& weekMap.containsKey("end")
+							&& weekMap.containsKey("dayList")) {
+						String start = weekMap.get("start").toString();
+						String end = weekMap.get("end").toString();
+						List<String> dayList = (List<String>) weekMap.get("dayList");
+						Map<String,Object> map = new HashMap<String,Object>();
+						map.put("x", start +"-"+end);
+						map.put("y", getWeekPayAmt(dayList, list));
+						mapList.add(map);
+					}
+				}
+			}
+		}else {  // 日粒度
+			List<String> dayList = DateUtils.addDates(DateUtils.dateTime(queryParam.getStartTime()), DateUtils.dateTime(queryParam.getEndTime()));
+			if(null != dayList && dayList.size() > 0) {
+				for(String day : dayList) {
+					int payAmt = 0;
+					if(null != list && list.size() > 0) {
+						if(StringUtils.isNotBlank(day)) {
+							for(IndexVO indexVo : list) {
+								if(null != indexVo 
+										&& null != indexVo.getPayAmt()
+										&& StringUtils.isNotBlank(indexVo.getTime())
+										&& indexVo.getTime().equals(day)) {
+									payAmt = indexVo.getPayAmt();
+									break;
+								}
+							}
+						}
+					}
+					Map<String,Object> map = new HashMap<String,Object>();
+					map.put("x", day);
+					map.put("y", payAmt);
+					mapList.add(map);
+				}
+			}
+		}
+		return mapList;
+	} 
+	
+	
+	private int getWeekPayAmt(List<String> dayList, List<IndexVO> list) {
+		BigDecimal payAmt = new BigDecimal(0);
+		if(null != list && list.size() > 0
+				&& null != dayList && dayList.size() > 0) {
+			for(IndexVO indexVo : list) {
+				if(null != indexVo 
+						&& null != indexVo.getPayAmt()
+						&& StringUtils.isNotBlank(indexVo.getTime())
+						&& dayList.contains(indexVo.getTime())) {
+					payAmt = payAmt.add(new BigDecimal(indexVo.getPayAmt()));
+				}
+			}
+			return payAmt.intValue();
+		}
+		return 0;
+	}
+	
+	private int getMonthPayAmt(String month, List<IndexVO> list) {
+		BigDecimal payAmt = new BigDecimal(0);
+		if(null != list && list.size() > 0
+				&& StringUtils.isNotBlank(month)) {
+			for(IndexVO indexVo : list) {
+				if(null != indexVo 
+						&& null != indexVo.getPayAmt()
+						&& StringUtils.isNotBlank(indexVo.getTime())
+						&& indexVo.getTime().indexOf(month) >= 0) {
+					payAmt = payAmt.add(new BigDecimal(indexVo.getPayAmt()));
+				}
+			}
+			return payAmt.intValue();
+		}
+		return 0;
+	}
+	
+	
+	/**
+	 * 查询统计交易用户数
+	 * @return
+	 */
+	@PostMapping("/pay/user")
+	// @PreAuthorize("@ss.hasPermi('business:channel:list')")
+	public AjaxResult listPayUserData(@RequestBody IndexQueryParam indeQueryParam) {
+		
+		IndexQueryParam queryParam = getQueryParam(indeQueryParam);
+		
+		List<IndexVO> list = new ArrayList<IndexVO>();
+		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<>();
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getEndTime());
+		queryWrapper.gt("t1.`status`", 0);
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if(null != channelId && 0 != channelId) {
+			Channel channel = channelService.getById(channelId);
+			if(null!=channel && StringUtils.isNotBlank(channel.getChannelNo())) {
+				queryWrapper.and(wrapper -> wrapper.likeRight("t2.channel_no", channel.getChannelNo())
+						.or().eq("t2.channel_no", channel.getChannelNo()));
+			}
+		}
+	
+		list = userTicketOrderService.selectIndexPayUserCntList(queryWrapper);
+		return  AjaxResult.success(getPayUserList(list, queryParam));
+	}
+	
+	private List<Map<String,Object>> getPayUserList(List<IndexVO> list, IndexQueryParam queryParam){
+		List<Map<String,Object>> mapList = new ArrayList<>();
+		if(null != queryParam && queryParam.getLevel().equals("month")) {  // 月粒度
+			List<String> monthList = DateUtils.addMonths(queryParam.getStartTime(), queryParam.getEndTime());
+			if(null != monthList && monthList.size() > 0) {
+				for(String month : monthList) {
+					if(StringUtils.isNotBlank(month)) {
+						Map<String,Object> map = new HashMap<String,Object>();
+						map.put("x", month);
+						map.put("y", getMonthPayUser(month, list));
+						mapList.add(map);
+					}
+				}
+			}
+		}else if(null != queryParam && queryParam.getLevel().equals("week")) {  // 周粒度
+			List<Map<String,Object>> weekList = DateUtils.getDateOfWeek(queryParam.getStartTime(), queryParam.getEndTime());
+			if(null != weekList && weekList.size() > 0) {
+				for(Map<String,Object> weekMap : weekList) {
+					if(null != weekMap && weekMap.containsKey("start")
+							&& weekMap.containsKey("end")
+							&& weekMap.containsKey("dayList")) {
+						String start = weekMap.get("start").toString();
+						String end = weekMap.get("end").toString();
+						List<String> dayList = (List<String>) weekMap.get("dayList");
+						Map<String,Object> map = new HashMap<String,Object>();
+						map.put("x", start +"-"+end);
+						map.put("y", getWeekPayUser(dayList, list));
+						mapList.add(map);
+					}
+				}
+			}
+		}else {  // 日粒度
+			List<String> dayList = DateUtils.addDates(DateUtils.dateTime(queryParam.getStartTime()), DateUtils.dateTime(queryParam.getEndTime()));
+			if(null != dayList && dayList.size() > 0) {
+				for(String day : dayList) {
+					int payUser = 0;
+					if(null != list && list.size() > 0) {
+						if(StringUtils.isNotBlank(day)) {
+							for(IndexVO indexVo : list) {
+								if(null != indexVo 
+										&& null != indexVo.getPayUserCnt()
+										&& StringUtils.isNotBlank(indexVo.getTime())
+										&& indexVo.getTime().equals(day)) {
+									payUser = indexVo.getPayUserCnt();
+									break;
+								}
+							}
+						}
+					}
+					Map<String,Object> map = new HashMap<String,Object>();
+					map.put("x", day);
+					map.put("y", payUser);
+					mapList.add(map);
+				}
+			}
+		}
+		return mapList;
+	} 
+	
+	
+	private int getWeekPayUser(List<String> dayList, List<IndexVO> list) {
+		int payUserCnt = 0;
+		if(null != list && list.size() > 0
+				&& null != dayList && dayList.size() > 0) {
+			for(IndexVO indexVo : list) {
+				if(null != indexVo 
+						&& null != indexVo.getPayUserCnt()
+						&& StringUtils.isNotBlank(indexVo.getTime())
+						&& dayList.contains(indexVo.getTime())) {
+					payUserCnt = payUserCnt + indexVo.getPayUserCnt();
+				}
+			}
+			return payUserCnt;
+		}
+		return 0;
+	}
+	
+	private int getMonthPayUser(String month, List<IndexVO> list) {
+		int payUserCnt = 0;
+		if(null != list && list.size() > 0
+				&& StringUtils.isNotBlank(month)) {
+			for(IndexVO indexVo : list) {
+				if(null != indexVo 
+						&& null != indexVo.getPayUserCnt()
+						&& StringUtils.isNotBlank(indexVo.getTime())
+						&& indexVo.getTime().indexOf(month) >= 0) {
+					payUserCnt = payUserCnt + indexVo.getPayUserCnt();
+				}
+			}
+			return payUserCnt;
+		}
+		return 0;
+	}
+	
+	
+	/**
+	 * 初始化查询参数
+	 * @param indeQueryParam
+	 * @return
+	 */
+	private IndexQueryParam getQueryParam(IndexQueryParam indeQueryParam) {
+		IndexQueryParam queryParam = new IndexQueryParam();
+		queryParam.setDays(null != indeQueryParam && null != indeQueryParam.getDays()?indeQueryParam.getDays():7);
+		queryParam.setLevel(null != indeQueryParam && StringUtils.isNotBlank(indeQueryParam.getLevel())?indeQueryParam.getLevel():"day");
+		if(queryParam.getDays() == 0) { // 自定义
+			if(null != indeQueryParam.getStartTime() && null != indeQueryParam.getEndTime()) {
+				queryParam.setStartTime(indeQueryParam.getStartTime());
+				queryParam.setEndTime(indeQueryParam.getEndTime());
+			}else {
+				queryParam.setStartTime(DateUtils.getPreDayOfNow(7));
+				queryParam.setEndTime(new Date());
+			}
+		}else {
+			queryParam.setStartTime(DateUtils.getPreDayOfNow(queryParam.getDays()));
+			queryParam.setEndTime(new Date());
+		}
+		return queryParam;
+	}
+	
+	
+	/**
+	 * 查询统计新增经销商数量
+	 * @return
+	 */
+	@PostMapping("/site/increase")
+	// @PreAuthorize("@ss.hasPermi('business:channel:list')")
+	public AjaxResult listSiteIncreaseData(@RequestBody IndexQueryParam indeQueryParam) {
+		
+		IndexQueryParam queryParam = getQueryParam(indeQueryParam);
+		
+		List<IndexVO> list = new ArrayList<IndexVO>();
+		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getEndTime());
+		queryWrapper.eq("t1.`level`", 0);
+		Long channelId = SecurityUtils.getLoginUser().getChannelId();
+		if(null != channelId && 0 != channelId) {
+			Channel channel = channelService.getById(channelId);
+			if(null!=channel && StringUtils.isNotBlank(channel.getChannelNo())) {
+				queryWrapper.and(wrapper -> wrapper.likeRight("t2.channel_no", channel.getChannelNo())
+						.or().eq("t2.channel_no", channel.getChannelNo()));
+			}
+		}
+	
+		list = channelService.selectIndexSiteIncreaseList(queryWrapper);
+		return  AjaxResult.success(getSiteIncreaseList(list, queryParam));
+	}
+	
+	private List<Map<String,Object>> getSiteIncreaseList(List<IndexVO> list, IndexQueryParam queryParam){
+		List<Map<String,Object>> mapList = new ArrayList<>();
+		if(null != queryParam && queryParam.getLevel().equals("month")) {  // 月粒度
+			List<String> monthList = DateUtils.addMonths(queryParam.getStartTime(), queryParam.getEndTime());
+			if(null != monthList && monthList.size() > 0) {
+				for(String month : monthList) {
+					if(StringUtils.isNotBlank(month)) {
+						Map<String,Object> map = new HashMap<String,Object>();
+						map.put("x", month);
+						map.put("y", getMonthSiteIncrease(month, list));
+						mapList.add(map);
+					}
+				}
+			}
+		}else if(null != queryParam && queryParam.getLevel().equals("week")) {  // 周粒度
+			List<Map<String,Object>> weekList = DateUtils.getDateOfWeek(queryParam.getStartTime(), queryParam.getEndTime());
+			if(null != weekList && weekList.size() > 0) {
+				for(Map<String,Object> weekMap : weekList) {
+					if(null != weekMap && weekMap.containsKey("start")
+							&& weekMap.containsKey("end")
+							&& weekMap.containsKey("dayList")) {
+						String start = weekMap.get("start").toString();
+						String end = weekMap.get("end").toString();
+						List<String> dayList = (List<String>) weekMap.get("dayList");
+						Map<String,Object> map = new HashMap<String,Object>();
+						map.put("x", start +"-"+end);
+						map.put("y", getWeekSiteIncrease(dayList, list));
+						mapList.add(map);
+					}
+				}
+			}
+		}else {  // 日粒度
+			List<String> dayList = DateUtils.addDates(DateUtils.dateTime(queryParam.getStartTime()), DateUtils.dateTime(queryParam.getEndTime()));
+			if(null != dayList && dayList.size() > 0) {
+				for(String day : dayList) {
+					int newSiteCnt = 0;
+					if(null != list && list.size() > 0) {
+						if(StringUtils.isNotBlank(day)) {
+							for(IndexVO indexVo : list) {
+								if(null != indexVo 
+										&& null != indexVo.getNewSiteCnt()
+										&& StringUtils.isNotBlank(indexVo.getTime())
+										&& indexVo.getTime().equals(day)) {
+									newSiteCnt = indexVo.getNewSiteCnt();
+									break;
+								}
+							}
+						}
+					}
+					
+					Map<String,Object> map = new HashMap<String,Object>();
+					map.put("x", day);
+					map.put("y", newSiteCnt);
+					mapList.add(map);
+				}
+			}
+		}
+		return mapList;
+	} 
+	
+	
+	private int getWeekSiteIncrease(List<String> dayList, List<IndexVO> list) {
+		int newSiteCnt = 0;
+		if(null != list && list.size() > 0
+				&& null != dayList && dayList.size() > 0) {
+			for(IndexVO indexVo : list) {
+				if(null != indexVo 
+						&& null != indexVo.getNewSiteCnt()
+						&& StringUtils.isNotBlank(indexVo.getTime())
+						&& dayList.contains(indexVo.getTime())) {
+					newSiteCnt = newSiteCnt + indexVo.getNewSiteCnt();
+				}
+			}
+			return newSiteCnt;
+		}
+		return 0;
+	}
+	
+	private int getMonthSiteIncrease(String month, List<IndexVO> list) {
+		int newSiteCnt = 0;
+		if(null != list && list.size() > 0
+				&& StringUtils.isNotBlank(month)) {
+			for(IndexVO indexVo : list) {
+				if(null != indexVo 
+						&& null != indexVo.getNewSiteCnt()
+						&& StringUtils.isNotBlank(indexVo.getTime())
+						&& indexVo.getTime().indexOf(month) >= 0) {
+					newSiteCnt = newSiteCnt + indexVo.getNewSiteCnt();
+				}
+			}
+			return newSiteCnt;
+		}
+		return 0;
+	}
+	
+	
+
+
+}

+ 35 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -6,10 +6,17 @@ 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.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwards;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.excel.TicketExcel;
 import com.qs.mp.admin.domain.param.BathIdParam;
 import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.vo.TicketAwardsVO;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketAwardsService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
@@ -72,6 +79,12 @@ public class TicketBoxMgrController extends BaseApiController {
 	@Autowired
 	private ITicketService ticketService;
 
+	@Autowired
+	private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+	@Autowired
+	private ITicketAwardsService ticketAwardsService;
+
 	@Autowired
 	private MapperFacade mapperFacade;
 
@@ -102,6 +115,28 @@ public class TicketBoxMgrController extends BaseApiController {
 		return getDataTable(list);
 	}
 
+	/**
+	 * 查看盲票详情
+	 */
+	@PostMapping("/detail")
+	@ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
+	public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
+		if (com.qs.mp.common.utils.StringUtils.isBlank(param.getBoxId())) {
+			return AjaxResult.error("参数异常,盲票组ID缺失");
+		}
+		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+		TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+		List<TicketAwards> ticketAwardsList = ticketAwardsService.list(new LambdaQueryWrapper<TicketAwards>()
+				.eq(TicketAwards::getBoxId, ticketBox.getBoxId()).orderByAsc(TicketAwards::getSort));
+		List<TicketAwardsVO> ticketAwardsVOS = mapperFacade.mapAsList(ticketAwardsList, TicketAwardsVO.class);
+		for (TicketAwardsVO ticketAwardsVO : ticketAwardsVOS) {
+			ticketAwardsVO.setPrizeList(ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
+					.eq(TicketAwardsPrize::getAwardsId, ticketAwardsVO.getAwardsId())));
+		}
+		ticketBoxVO.setAwardsList(ticketAwardsVOS);
+		return AjaxResult.success(ticketBoxVO);
+	}
+
 	/**
 	 * 新增盲票
 	 *

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

@@ -45,7 +45,7 @@ public class PayCallBackController {
     String orderNo =  request.getParameter("orderNo");
     if(!"121.196.180.137".equalsIgnoreCase(ipAddress)){
       //暂时增加机器人告警,防止三方服务器ip变更信息同步不到位,导致支付故障
-      WebhookService.sendMonitorData("【三方支付请求IP异常】{"+ipAddress+"} 订单号:"+orderNo);
+      WebhookService.sendLogAlertMsg("【三方支付请求IP异常】{"+ipAddress+"} 订单号:"+orderNo);
     }
     String orderStatus =  request.getParameter("orderStatus");
     String shopOrderNo =  request.getParameter("shopOrderNo");

+ 32 - 32
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java

@@ -123,7 +123,7 @@ public class ChannelController extends BaseApiController {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 		if(!parentlId.equals(queryChannel.getParentId())) {
-			return AjaxResult.error("非当前用户的子渠道,查询失败");
+			return AjaxResult.error("非当前用户的下级,查询失败");
 		}
 	    BeanUtils.copyProperties(queryChannel, channelVO);
 	    // 查询今日的销售额、佣金收入、新增用户数
@@ -141,7 +141,7 @@ public class ChannelController extends BaseApiController {
 	@PostMapping("subchannel/create")
 	public AjaxResult channelCreate(@Validated @RequestBody ChannelParam channelParam) {
 		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
-			return AjaxResult.error("该渠道已存在");
+			return AjaxResult.error("该代理已存在");
 		}
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 		Channel channel = mapperFacade.map(channelParam, Channel.class);
@@ -152,7 +152,7 @@ public class ChannelController extends BaseApiController {
 		queryWrapper.gt(Channel::getLevel, 0);
 		int nameCount = channelService.count(queryWrapper);
 		if(nameCount > 0) {
-			return AjaxResult.error("渠道名称" + channel.getName() + "已存在!");
+			return AjaxResult.error("代理名称" + channel.getName() + "已存在!");
 		}
 		int mobileCount = channelService.count(
 		        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
@@ -163,7 +163,7 @@ public class ChannelController extends BaseApiController {
 		Channel parentChannel = channelService.getById(channel.getParentId());
 		if(null != parentChannel && null != parentChannel.getCommRate()) {
 			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
-				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+				 return AjaxResult.error("佣金比例不能高于上级代理的佣金比例");
 			 }
 		}
 		channel.setLevel(parentChannel.getLevel()+1);
@@ -172,10 +172,10 @@ public class ChannelController extends BaseApiController {
 		try {
 			channelService.saveChannel(channel, ChannelRoleEnum.CHANNEL);
 		} catch (Exception e) {
-			return AjaxResult.error("渠道'" + channel.getName() + "'新增失败" + e.getMessage());
+			return AjaxResult.error("代理'" + channel.getName() + "'新增失败" + e.getMessage());
 		}
 
-		return AjaxResult.success("渠道'" + channel.getName() + "'新增成功");
+		return AjaxResult.success("代理'" + channel.getName() + "'新增成功");
 	}
 
 	/**
@@ -194,11 +194,11 @@ public class ChannelController extends BaseApiController {
 		// 1、校验修改子渠道是否为当前用户的子渠道
 		Channel oldChannel = channelService.getById(channel.getChannelId());
 		if(null == oldChannel || null == oldChannel.getChannelId()) {
-			return AjaxResult.error("渠道'" + oldChannel.getName() + "'编辑失败,渠道ID异常");
+			return AjaxResult.error("代理'" + oldChannel.getName() + "'编辑失败");
 		}
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 		if(!oldChannel.getParentId().equals(channelId)) {
-			return AjaxResult.error("渠道'" + oldChannel.getName() + "'编辑失败,非当前用户子渠道");
+			return AjaxResult.error("代理'" + oldChannel.getName() + "'编辑失败");
 		}
 		// 2.校验名称是否重复、手机号是否存在(渠道表);
 		if(!channel.getName().equals(oldChannel.getName())) {
@@ -207,7 +207,7 @@ public class ChannelController extends BaseApiController {
 			queryWrapper.gt(Channel::getLevel, 0);
 			int nameCount = channelService.count(queryWrapper);
 			if(nameCount > 0) {
-				return AjaxResult.error("渠道名称" + channel.getName() + "已存在!");
+				return AjaxResult.error("代理名称" + channel.getName() + "已存在!");
 			}
 		}
 		boolean mobileChange = false;  // 手机号码是否有变更
@@ -226,7 +226,7 @@ public class ChannelController extends BaseApiController {
 		Channel parentChannel = channelService.getById(oldChannel.getParentId());
 		if(null != parentChannel && null != parentChannel.getCommRate()) {
 			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
-				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+				 return AjaxResult.error("佣金比例不能高于上级代理的佣金比例");
 			 }
 		}
 		// 查询子渠道的最大佣金比例
@@ -237,7 +237,7 @@ public class ChannelController extends BaseApiController {
 		if(null != map && map.containsKey("commRate")) {
 			BigDecimal commRate = new BigDecimal(map.get("commRate").toString());
 			if(!commRate.equals(BigDecimal.ZERO) && channel.getCommRate().compareTo(commRate) < 0) {
-				return AjaxResult.error("不能低于其子渠道的最大佣金比例");
+				return AjaxResult.error("不能低于其下级的最大佣金比例");
 			}
 		}
 		try {
@@ -246,7 +246,7 @@ public class ChannelController extends BaseApiController {
 		} catch (Exception e) {
 			return AjaxResult.error(e.getMessage());
 		}
-		return AjaxResult.success("渠道'" + channel.getName() + "'编辑成功");
+		return AjaxResult.success("代理'" + channel.getName() + "'编辑成功");
 	}
 
 
@@ -270,7 +270,7 @@ public class ChannelController extends BaseApiController {
 				return error(ErrorCodeEnum.ERROR_CODE_1001);
 			}
 			if(!channelId.equals(queryChannel.getParentId())) {
-				return AjaxResult.error("非当前用户的子渠道,查询失败");
+				return AjaxResult.error("非当前用户的下级,查询失败");
 			}
 			channelId = _channelId;
 		}
@@ -363,7 +363,7 @@ public class ChannelController extends BaseApiController {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 		if(!parentlId.equals(queryChannel.getParentId())) {
-			return AjaxResult.error("非当前用户的经销商,查询失败");
+			return AjaxResult.error("非当前用户的门店,查询失败");
 		}
 	    BeanUtils.copyProperties(queryChannel, channelVO);
 	    // 查询今日的销售额、佣金收入、新增用户数
@@ -381,7 +381,7 @@ public class ChannelController extends BaseApiController {
 	@PostMapping("site/create")
 	public AjaxResult siteCreate(@Validated @RequestBody ChannelParam channelParam) {
 		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
-			return AjaxResult.error("该经销商已存在");
+			return AjaxResult.error("该门店已存在");
 		}
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 
@@ -393,7 +393,7 @@ public class ChannelController extends BaseApiController {
 		queryWrapper.eq(Channel::getLevel, 0);
 		int nameCount = channelService.count(queryWrapper);
 		if(nameCount > 0) {
-			return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+			return AjaxResult.error("门店名称" + channel.getName() + "已存在!");
 		}
 		int mobileCount = channelService.count(
 		        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
@@ -404,7 +404,7 @@ public class ChannelController extends BaseApiController {
 		Channel parentChannel = channelService.getById(channel.getParentId());
 		if(null != parentChannel && null != parentChannel.getCommRate()) {
 			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
-				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+				 return AjaxResult.error("佣金比例不能高于上级代理的佣金比例");
 			 }
 		}
 		channel.setLevel(0);
@@ -413,9 +413,9 @@ public class ChannelController extends BaseApiController {
 		try {
 			channelService.saveChannel(channel,ChannelRoleEnum.SALESITE);
 		} catch (Exception e) {
-			return AjaxResult.error("经销商'" + channel.getName() + "'新增失败"+e.getMessage());
+			return AjaxResult.error("门店'" + channel.getName() + "'新增失败"+e.getMessage());
 		}
-		return AjaxResult.success("经销商'" + channel.getName() + "'新增成功");
+		return AjaxResult.success("门店'" + channel.getName() + "'新增成功");
 	}
 
 	/**
@@ -435,11 +435,11 @@ public class ChannelController extends BaseApiController {
 		// 1、校验修改子渠道是否为当前用户的子渠道
 		Channel oldChannel = channelService.getById(channel.getChannelId());
 		if(null == oldChannel || null == oldChannel.getChannelId()) {
-			return AjaxResult.error("经销商'" + oldChannel.getName() + "'编辑失败,渠道ID异常");
+			return AjaxResult.error("门店'" + oldChannel.getName() + "'编辑失败");
 		}
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 		if(!oldChannel.getParentId().equals(channelId)) {
-			return AjaxResult.error("经销商'" + oldChannel.getName() + "'编辑失败,非当前用户子渠道");
+			return AjaxResult.error("门店'" + oldChannel.getName() + "'编辑失败");
 		}
 		// 2.校验名称是否重复、手机号是否存在(渠道表);
 		if(!channel.getName().equals(oldChannel.getName())) {
@@ -449,7 +449,7 @@ public class ChannelController extends BaseApiController {
 			queryWrapper.eq(Channel::getLevel, 0);
 			int nameCount = channelService.count(queryWrapper);
 			if(nameCount > 0) {
-				return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+				return AjaxResult.error("门店名称" + channel.getName() + "已存在!");
 			}
 		}
 		boolean mobileChange = false;  // 手机号码是否有变更
@@ -468,16 +468,16 @@ public class ChannelController extends BaseApiController {
 		Channel parentChannel = channelService.getById(oldChannel.getParentId());
 		if(null != parentChannel && null != parentChannel.getCommRate()) {
 			 if(channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
-				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
+				 return AjaxResult.error("佣金比例不能高于上级代理的佣金比例");
 			 }
 		}
 		try {
 			channel.setUserId(oldChannel.getUserId());
 			channelService.updateChannel(channel, mobileChange);
 		} catch (Exception e) {
-			return AjaxResult.error("经销商'" + channel.getName() + "'编辑失败");
+			return AjaxResult.error("门店'" + channel.getName() + "'编辑失败");
 		}
-		return AjaxResult.success("经销商'" + channel.getName() + "'编辑成功");
+		return AjaxResult.success("门店'" + channel.getName() + "'编辑成功");
 	}
 
 
@@ -500,7 +500,7 @@ public class ChannelController extends BaseApiController {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 		if(!parentlId.equals(queryChannel.getParentId())) {
-			return AjaxResult.error(queryChannel.getName() + "非当前用户的经销商, 认证审核失败");
+			return AjaxResult.error(queryChannel.getName() + "非当前用户的门店, 认证审核失败");
 		}
 		try {
 			if(channel.getVerifyStatus() == ChannelVerifyStatusEnum.ACCEPT) {
@@ -510,9 +510,9 @@ public class ChannelController extends BaseApiController {
 			}
 			channelService.updateById(channel);
 		} catch (Exception e) {
-			return AjaxResult.error("经销商'" + channel.getName() + "'认证审核失败");
+			return AjaxResult.error("门店'" + channel.getName() + "'认证审核失败");
 		}
-		return AjaxResult.success("经销商'" + channel.getName() + "'认证审核成功");
+		return AjaxResult.success("门店'" + channel.getName() + "'认证审核成功");
 	}
 
 	/**
@@ -532,9 +532,9 @@ public class ChannelController extends BaseApiController {
 			channel.setVerifyStatus(ChannelVerifyStatusEnum.WAIT);
 			channelService.updateById(channel);
 		} catch (Exception e) {
-			return AjaxResult.error("经销商'" + channel.getName() + "'提交认证信息失败");
+			return AjaxResult.error("门店'" + channel.getName() + "'提交认证信息失败");
 		}
-		return AjaxResult.success("经销商'" + channel.getName() + "'提交认证信息成功");
+		return AjaxResult.success("门店'" + channel.getName() + "'提交认证信息成功");
 	}
 
 
@@ -596,8 +596,8 @@ public class ChannelController extends BaseApiController {
 		}
 		return AjaxResult.success(channelVO);
 	}
-	
-	
+
+
 	/**
 	 * 场景是这里要显示待审核数量
 	 *

+ 2 - 5
mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java

@@ -301,6 +301,7 @@ public class UserController extends BaseApiController {
     loginUser.getUser().getRoles().forEach(sysRole -> roles.add(sysRole.getRoleName()));
     jsonObject.put("roleKeys", roleKeys);
     jsonObject.put("roles", roles);
+    jsonObject.put("userId", SecurityUtils.getUserId());
 
     return success(jsonObject);
   }
@@ -432,11 +433,7 @@ public class UserController extends BaseApiController {
 
   public static void main(String[] args) {
     UserController userController = new UserController();
-    BASE64Encoder encoder = new BASE64Encoder();
-    String sessionKey = encoder.encode("f7a104e09d6c2e55445be2a45c4ab551".getBytes(
-        StandardCharsets.UTF_8));
-    System.out.println(sessionKey);
-    System.out.println(userController.weixinDecrypt("1U2iT7fucPip+hYDO+fcksOJCyFMIzxe5qXKGPbLZVfz2kwlKkbRDbfjECRHtjg0yFiTXpHuvR9gBShL9Id7p8KO1w2Y2vhgj5idU/VYSOhF7IRyXEObDApMCs4JSWuS997hIl/JMX3N43IHC99Ak5aeTuk4UHtvHeJsTYfvNKrp7c4fDt0n9yX9MJijsoOjFQ/TFh0jJuWKpzS2QwhdGg==", sessionKey, "C9Kc2ibw/cy7U0Vv6vneOg=="));
+    System.out.println(userController.weixinDecrypt("qvNE+SHdiP2GTbmNaqahrhhLw7EZetcMhUMV9yPXHxBbWOMcZ5gFxOGliXC9uojyC0NDUXCUi1xvFVDKMYREQ7rLXXrZIkB1jEleJNuUb9kO3LCDRucvbGAbVwm2EsTNsd5VbqI3fKdu0IOxmmSAWCLZNGXZBlki4ke62lI+ASg6dPohQmmCux8jwD2Js3ZnDQN2mb0JPRT68Qj716gYvA==", "QJ/WdeFANTIfIErOCJ2jNg==", "60YJmIckq4kaXp88wAGGHA=="));
   }
 
 }

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

@@ -0,0 +1,48 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.domain.AjaxResult.Type;
+import com.qs.mp.framework.service.IWxUrlLinkService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 用户分享前端控制器
+ */
+@Api("用户分享调用API")
+@RestController
+@RequestMapping("/api/v1/mp/user/share")
+@Component
+public class UserShareController extends BaseApiController {
+
+	@Autowired
+	private IWxUrlLinkService wxUrlLinkService;
+
+	@Value("${wx-user.appId}")
+	private String userAppId;
+
+	/**
+	 * 生成盲票详情小程序码
+	 *
+	 * @return
+	 */
+	@PostMapping("/code/generate")
+	public AjaxResult generateInviteCode(@RequestBody  JSONObject jsonObject) {
+		String boxId = jsonObject.getString("boxId"); // 票组ID
+		String type = jsonObject.getString("type"); // 分享类型,1/2
+		Long userId = SecurityUtils.getUserId();
+		String rst = wxUrlLinkService.generateUnlimitCode("pages/ticketBox/detail", boxId + "&" + userId + "&" + type, userAppId);
+		return new AjaxResult(Type.SUCCESS, "", rst);
+	}
+}

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.domain.param.TicketBoxParam;
 import com.qs.mp.admin.domain.param.TicketParam;
 import com.qs.mp.admin.domain.vo.TicketBoxListVO;
@@ -14,12 +15,15 @@ import com.qs.mp.admin.domain.vo.TicketListVO;
 import com.qs.mp.admin.domain.vo.TicketVO;
 import com.qs.mp.admin.service.ITicketAwardsPrizeService;
 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.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.service.IUserHitPrizeService;
@@ -60,6 +64,9 @@ public class UserTicketController extends BaseApiController {
   @Autowired
   private IUserHitPrizeService userHitPrizeService;
 
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+
   @Autowired
   private MapperFacade mapperFacade;
 
@@ -121,6 +128,11 @@ public class UserTicketController extends BaseApiController {
     /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
     }*/
+    TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
+    if (ticketPackage.getStatus() != TicketPkgStatusEnum.SOLD) {
+      LogUtil.error(logger, "盲票未激活。sn:{0},pkgId:{1}", new Object[]{ticket.getSerialNo(), ticket.getPkgId()});
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1023);
+    }
 
     TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
 
@@ -188,6 +200,7 @@ public class UserTicketController extends BaseApiController {
     JSONObject jsonObject = new JSONObject();
     jsonObject.put("prizeList", ticketAwardsPrizes);
     jsonObject.put("ticketId", ticket.getTicketId());
+    jsonObject.put("boxId", ticket.getBoxId());
     return AjaxResult.success(jsonObject);
   }
 

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

@@ -26,6 +26,7 @@ import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.param.TicketOrderParam;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.domain.vo.UserShareVO;
 import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.SecurityUtils;
@@ -151,13 +152,13 @@ public class UserTicketOrderController extends BaseApiController {
    */
   @PostMapping("/order/submit")
   @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
-  public AjaxResult submit(@RequestBody UserTicketOrder order) {
+  public AjaxResult submit(@RequestBody UserShareVO userShareVO) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
     TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
     if (null == orderSettleVO) {
       return AjaxResult.error("订单已过期,请重新下单");
     }
-    String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO);
+    String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO, userShareVO);
     JSONObject jsonObject = new JSONObject();
     jsonObject.put("orderId", orderId);
     if (orderSettleVO.getPayAmt() > 0) {

+ 17 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java

@@ -4,6 +4,7 @@ package com.qs.mp.web.controller.system;
 import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.domain.model.LoginBody;
+import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.framework.security.handle.HostHolder;
 import com.qs.mp.framework.web.service.SysLoginService;
 import com.qs.mp.framework.web.service.SysPermissionService;
@@ -11,6 +12,7 @@ import com.qs.mp.sms.domain.SmsCode;
 import com.qs.mp.system.domain.SysMenu;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysMenuService;
+import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.utils.SecurityUtils;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -41,6 +43,9 @@ public class SysLoginController
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private ISysUserService sysUserService;
+
     @Autowired
     private HostHolder hostHolder;
 
@@ -87,6 +92,18 @@ public class SysLoginController
         if (!codePattern.matcher(smsCode.getCode()).matches()) {
             return AjaxResult.error("请输入6位验证码");
         }
+        SysUser sysUser = sysUserService.selectUserByUserName(smsCode.getMobile());
+        if (null == sysUser) {
+            if (smsCode.getIdentity() != UserIdentityEnum.USER.ordinal()) {
+                return AjaxResult.error("账号不存在");
+            }
+            // C端直接注册新用户
+            sysUser = new SysUser();
+            sysUser.setUserName(smsCode.getMobile());
+            sysUser.setNickName(smsCode.getMobile());
+            sysUserService.registerUser(sysUser);
+        }
+
         AjaxResult ajax = AjaxResult.success();
         Map<String, String> result = loginService.login(smsCode);
         for (String key : result.keySet()) {

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

@@ -16,6 +16,7 @@ logging:
     io.lettuce.core: warn
     org.quartz.core: warn
     com.qs.mp.framework.interceptor: warn
+    ma.glasnost.orika: warn
 # 数据源配置
 spring:
     redis:

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

@@ -16,6 +16,7 @@ logging:
     io.lettuce.core: warn
     org.quartz.core: warn
     com.qs.mp.framework.interceptor: warn
+    ma.glasnost.orika: warn
 # 数据源配置
 spring:
     redis:

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

@@ -87,6 +87,7 @@ logging:
         org.apache: warn
         io.lettuce.core: warn
         com.qs.mp.framework.interceptor: warn
+        ma.glasnost.orika: warn
 
 # 开发环境配置
 server:

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

@@ -14,6 +14,7 @@ logging:
     io.lettuce.core: warn
     org.quartz.core: warn
     com.qs.mp.framework.interceptor: warn
+    ma.glasnost.orika: warn
 # 数据源配置
 spring:
     redis:

+ 15 - 0
mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java

@@ -3,6 +3,7 @@ package com.qs.mp.service;
 import com.qs.mp.MpApplication;
 import com.qs.mp.admin.service.ITicketBoxSerialService;
 import com.qs.mp.framework.service.IWxUrlLinkService;
+import com.qs.mp.quartz.task.DayStatTask;
 import com.qs.mp.quartz.task.TicketBoxTask;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
@@ -34,12 +35,21 @@ public class ServiceImplTest {
   @Autowired
   private TicketBoxTask ticketBoxTask;
 
+  @Autowired
+  private DayStatTask dayStatTask;
+
   @Test
   public void testGenerateQrCode() {
     System.out.println(wxUrlLinkService.generateCode("pages/index/index", "id=1", "wxc3a684f1196f6e15"));
 
   }
 
+  @Test
+  public void testGenerateUnlimitCode() {
+    System.out.println(wxUrlLinkService.generateUnlimitCode("pages/ticketBox/detail", "boxId=1&suid=2&type=user", "wx8533800e393dbd6b"));
+
+  }
+
   @Test
   public void testGenerateShortUrl() {
     System.out.println(wxUrlLinkService.generate("", "", "wxc3a684f1196f6e15"));
@@ -65,6 +75,11 @@ public class ServiceImplTest {
 
   }
 
+  @Test
+  public void testDayStat() {
+    dayStatTask.stat(null);
+  }
+
 
   public static void main(String[] args) {
     /*int n = 500;

+ 1 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java

@@ -29,6 +29,7 @@ public enum ErrorCodeEnum {
   ERROR_CODE_1020(1020, "库存不足"),
   ERROR_CODE_1021(1021, "盲豆余额不足"),
   ERROR_CODE_1022(1022, "订单支付中"),
+  ERROR_CODE_1023(1023, "盲票未激活"),
   ;
   private int code;
   private String msg;

+ 4 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketTypeEnum.java

@@ -29,6 +29,10 @@ public enum TicketTypeEnum implements IEnum<String> {
     return value;
   }
 
+  public String getDesc() {
+    return desc;
+  }
+
   /**
    * 重写toString,单个转化成json
    * @return

+ 108 - 16
mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java

@@ -6,6 +6,7 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collections;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
@@ -246,6 +247,23 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     }
     
     // 首页统计日期处理
+    
+    
+  	 /** 
+  	 * 取得指定日期所在周的最后一天 
+  	 */ 
+  	 public static Date getPreDayOfNow(int days) { 
+  		try {
+			Calendar c = Calendar.getInstance();
+		   	c.setFirstDayOfWeek(Calendar.MONDAY); 
+		   	c.add(Calendar.DATE, - days);
+		   	return c.getTime(); 
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+  	 }
+    
     /** 
      * @Title: getDateOfWeek 
      * @Description: 获取两个时间内所有周之间的时间段,并且获得是今年第几周
@@ -255,7 +273,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     public static List<Map<String,Object>> getDateOfWeek(Date startTime, Date endTime) {
     	List<Map<String,Object>> rtnList = new ArrayList<Map<String,Object>>();
     	try {  
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");  
             
             Calendar startCalendar = Calendar.getInstance();  
             startCalendar.setTime(startTime);  
@@ -302,7 +320,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
                 Long time = startTIme;
                 //循环得出
                 while (time <= endTIme) {
-                    list.add(new SimpleDateFormat("yyyy-MM-dd").format(new Date(time)));
+                    list.add(new SimpleDateFormat("yyyyMMdd").format(new Date(time)));
                     time += oneDay;
                 }
                 endCalendar.add(Calendar.DATE, -j); //减去增加的日期  
@@ -318,12 +336,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 	 	            	e_date = sdf.format(endTime);
 	 	            }
 	            	 Calendar yearCalendar = Calendar.getInstance();  
-	            	 Date sDate = sdf.parse(s_date);
-	            	 yearCalendar.setTime(sDate);  
+	            	 yearCalendar.setTime(startTime);  
 	            	int year = yearCalendar.get(Calendar.YEAR);  
 	            	String s = year+ "年的第" + (endWeekOfYear - i) + "周" + "(" + s_date + "至" + e_date + ")";     
 	                System.out.println(s);  
-	                System.out.println("包含的日期 = " +list.toString());
+	               // System.out.println("包含的日期 = " +list.toString());
 	                Map<String,Object> map = new HashMap<String,Object>();
 	                map.put("start", s_date);
 	                map.put("end", e_date);
@@ -338,17 +355,17 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         } catch (Exception e) {  
             e.printStackTrace();  
         }
+    	Collections.reverse(rtnList);
     	return rtnList;
     }
     
     
-    
     /** 
    	 * 取得指定日期所在周的第一天 
    	 */ 
    	 public static String getFirstDayOfWeek(Date date) { 
 		try {
-			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
 			Calendar c = new GregorianCalendar(); 
 		   	c.setFirstDayOfWeek(Calendar.MONDAY); 
 		   	c.setTime(date); 
@@ -367,7 +384,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
    	 */ 
    	 public static String getLastDayOfWeek(Date date) { 
    		try {
-			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
 			Calendar c = new GregorianCalendar(); 
 		   	c.setFirstDayOfWeek(Calendar.MONDAY); 
 		   	c.setTime(date); 
@@ -388,7 +405,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
  	 */
   	public static boolean compareDate(String startDate, String endDate) {
  		try {
- 			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ 			DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
  			java.util.Date date1 = dateFormat.parse(startDate);
  			java.util.Date date2 = dateFormat.parse(endDate);
  			if (date1.getTime() > date2.getTime())
@@ -424,23 +441,98 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         Long time = startTIme;
         //循环得出
         while (time <= endTime) {
-            list.add(new SimpleDateFormat("yyyy-MM-dd").format(new Date(time)));
+            list.add(new SimpleDateFormat("yyyyMMdd").format(new Date(time)));
             time += oneDay;
         }
         return list;
     }
     
     
+    /** 
+     * @Title: getDateOfWeek 
+     * @Description: 获取两个时间内所有周之间的时间段,并且获得是今年第几周
+     * @param start_time    开始时间 
+     * @param end_time      结束时间 
+     */  
+    public static List<String> addMonths(Date startTime, Date endTime) {
+    	List<String> list = new ArrayList<String>();
+    	try {  
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(startTime);
+            // 获取开始年份和开始月份
+            int startYear = calendar.get(Calendar.YEAR);
+            int startMonth = calendar.get(Calendar.MONTH);
+            // 获取结束年份和结束月份
+            calendar.setTime(endTime);
+            int endYear = calendar.get(Calendar.YEAR);
+            int endMonth = calendar.get(Calendar.MONTH);
+            //
+            
+            for (int i = startYear; i <= endYear; i++) {
+                String date = "";
+                if (startYear == endYear) {
+                    for (int j = startMonth; j <= endMonth; j++) {
+                        if (j < 9) {
+                            date = i + "0" + (j + 1);
+                        } else {
+                            date = i + "" + (j + 1);
+                        }
+                        list.add(date);
+                    }
+                } else {
+                    if (i == startYear) {
+                        for (int j = startMonth; j < 12; j++) {
+                            if (j < 9) {
+                                date = i + "0" + (j + 1);
+                            } else {
+                                date = i + "" + (j + 1);
+                            }
+                            list.add(date);
+                        }
+                    } else if (i == endYear) {
+                        for (int j = 0; j <= endMonth; j++) {
+                            if (j < 9) {
+                                date = i + "0" + (j + 1);
+                            } else {
+                                date = i + "" + (j + 1);
+                            }
+                            list.add(date);
+                        }
+                    } else {
+                        for (int j = 0; j < 12; j++) {
+                            if (j < 9) {
+                                date = i + "0" + (j + 1);
+                            } else {
+                                date = i + "" + (j + 1);
+                            }
+                            list.add(date);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {  
+            e.printStackTrace();  
+        }
+    	return list;
+    }
+    
+    
     public static void main(String[] args) throws Exception {
 //      List<String> list = addDates("2022-02-01", "2022-03-31");
 //      list.forEach(i ->
 //              System.out.println(i)
 //      );
-    	DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-        String start_time = "2022-02-02";
-		String end_time = "2022-04-11";
-		List<Map<String,Object>> lsit = getDateOfWeek(dateFormat.parse(start_time), dateFormat.parse(end_time));  
-		System.out.println(JSON.toJSONString(lsit));
-
+//    	DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//        String start_time = "2022-02-01";
+//		String end_time = "2022-05-30";
+//		List<Map<String,Object>> lsit = getDateOfWeek(dateFormat.parse(start_time), dateFormat.parse(end_time));  
+//		System.out.println(JSON.toJSONString(lsit));
+		
+		
+//		List<String> monthList = addMonths(dateFormat.parse(start_time), dateFormat.parse(end_time));
+//		System.out.println(JSON.toJSONString(monthList));
+//       
+//		
+//		System.out.println(start_time.indexOf("2022-01"));
   }
 }

+ 11 - 1
mp-common/src/main/java/com/qs/mp/common/utils/WebhookService.java

@@ -68,12 +68,22 @@ public class WebhookService {
         return OkHttpUtil.post(url, jsonStr, null);
     }
 
+    /**
+     * 系统监控
+     * @param msg
+     * @return
+     */
     public static String sendLogAlertMsg(String msg) {
 
         return sendWXRobot(wxLogMonitorUrl,msg);
     }
 
-    public static String sendMonitorData(String msg){
+    /**
+     * 业务通知
+     * @param msg
+     * @return
+     */
+    public static String sendBizData(String msg){
         if (ServerEnvEnum.PROD.getCode().equals(env)){
             return sendWXRobot(wxRobotUrl,msg);
         }

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/utils/http/HttpUtils.java

@@ -1,6 +1,7 @@
 package com.qs.mp.common.utils.http;
 
 import cn.hutool.http.ssl.TrustAnyHostnameVerifier;
+import com.qs.mp.common.utils.LogUtil;
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -195,7 +196,7 @@ public class HttpUtils
         try
         {
             String urlNameString = url;
-            log.info("sendPost - {}", urlNameString, param);
+            LogUtil.info(log, "sendImagePost - url:{0},param:{1}", new Object[]{urlNameString, param});
             URL realUrl = new URL(urlNameString);
             URLConnection conn = realUrl.openConnection();
             conn.setRequestProperty("accept", "*/*");

+ 1 - 1
mp-framework/src/main/java/com/qs/mp/framework/web/exception/GlobalExceptionHandler.java

@@ -79,7 +79,7 @@ public class GlobalExceptionHandler
     public AjaxResult handleException(Exception e, HttpServletRequest request)
     {
         String requestURI = request.getRequestURI();
-        log.error("请求地址'{}',发生系统异常.", requestURI, e);
+        LogUtil.error(log, e, "请求地址'{0}',发生系统异常.", requestURI);
         return AjaxResult.error(e.getMessage());
     }
 

+ 226 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/DayStatTask.java

@@ -0,0 +1,226 @@
+package com.qs.mp.quartz.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelCommission;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.service.IChannelCommissionService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.enums.CoinLogTypeEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.common.utils.WebhookService;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.user.domain.UserCoinLog;
+import com.qs.mp.user.domain.UserExchangeOrder;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.service.IUserCoinLogService;
+import com.qs.mp.user.service.IUserExchangeOrderService;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * 日统计任务
+ *
+ * @author zhongcp
+ * @Date 2022/3/17
+ */
+@Component("dayStatTask")
+public class DayStatTask {
+
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+  @Autowired
+  private ISysUserService sysUserService;
+
+  @Autowired
+  private IChannelService channelService;
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private IUserTicketOrderService userTicketOrderService;
+
+  @Autowired
+  private IChannelCommissionService channelCommissionService;
+
+  @Autowired
+  private IChannelWithdrawService channelWithdrawService;
+
+  @Autowired
+  private IUserExchangeOrderService userExchangeOrderService;
+
+  @Autowired
+  private IUserCoinLogService userCoinLogService;
+
+  @Value("${export.page-size}")
+  private int pageSize;
+
+  /**
+   * 日统计任务 2022.04.02 代理:xxx 门店:xxx 用户:xxx =============== 票组名字|线上(面值),销售:¥0.00 票组名字|线上(面值),销售:¥0.00
+   * 总销售额:¥0.00 累计分佣:¥0.00 累计提现:¥0.00 兑换订单:5689 派发盲豆:8880 兑换盲豆:6666
+   */
+  public void stat(String executeDay) {
+    LogUtil.info(logger, "...日统计定时任务开始...");
+    Date bizDay;
+    if (StringUtils.isNotBlank(executeDay)) {
+      bizDay = DateUtils.parseStrToDate(executeDay, DateUtils.YYYYMMDD);
+    } else {
+      bizDay = DateUtils.addDays(DateUtils.getToday(), -1);
+    }
+    StringBuilder sb = new StringBuilder();
+    sb.append(DateUtils.dateTime(bizDay)).append("\n");
+    int allChannelCnt = channelService.count(new LambdaQueryWrapper<Channel>().gt(Channel::getLevel, 0));
+    int channelCnt = channelService.count(new LambdaQueryWrapper<Channel>().gt(Channel::getLevel, 0)
+        .ge(Channel::getCreatedTime, bizDay)
+        .lt(Channel::getCreatedTime, DateUtils.addDays(bizDay, 1)));
+    sb.append("累计代理:").append(allChannelCnt).append(",当日新增:").append(channelCnt).append("\n");
+    int siteCnt = channelService.count(new LambdaQueryWrapper<Channel>().eq(Channel::getLevel, 0)
+        .ge(Channel::getCreatedTime, bizDay)
+        .lt(Channel::getCreatedTime, DateUtils.addDays(bizDay, 1)));
+    int allSiteCnt = channelService.count(new LambdaQueryWrapper<Channel>().eq(Channel::getLevel, 0));
+    sb.append("累计门店:").append(allSiteCnt).append(",当日新增:").append(siteCnt).append("\n");
+    int userCnt = sysUserService.count(new LambdaQueryWrapper<SysUser>()
+        .ge(SysUser::getCreateTime, bizDay)
+        .lt(SysUser::getCreateTime, DateUtils.addDays(bizDay, 1)));
+    int allUserCnt = sysUserService.count(new LambdaQueryWrapper<SysUser>());
+    sb.append("累计用户:").append(allUserCnt - allSiteCnt - allChannelCnt).append(",当日新增:").append(userCnt - siteCnt - channelCnt).append("\n");
+    sb.append("===================\n");
+
+    LambdaQueryWrapper<TicketBox> queryWrapper = new LambdaQueryWrapper<TicketBox>()
+        .nested(wrapper -> {
+          wrapper.eq(TicketBox::getType, TicketTypeEnum.ONLINE).eq(TicketBox::getStatus,
+              TicketBoxStatusEnum.PUT_ON).or().eq(TicketBox::getType, TicketTypeEnum.OFFLINE);
+        })
+        .notLike(TicketBox::getTitle, "测试票")
+        .eq(TicketBox::getIsDeleted, 0);
+
+    int totalSize = ticketBoxService.count(queryWrapper);
+    int totalPage = 1;
+    if (totalSize > pageSize) {
+      totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
+    }
+    BigDecimal sumSaleAmt = BigDecimal.ZERO;
+    BigDecimal sumAllSaleAmt = BigDecimal.ZERO;
+    for (int i = 0; i < totalPage; i++) {
+      queryWrapper.orderByAsc(TicketBox::getBoxNo);
+      queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+      List<TicketBox> ticketBoxList = ticketBoxService.list(queryWrapper);
+      for (TicketBox ticketBox : ticketBoxList) {
+        Map<String, Object> orderMap = userTicketOrderService.getMap(
+            new QueryWrapper<UserTicketOrder>()
+                .select("IFNULL(sum(pay_amt) ,0) as orderAmt")
+                .lambda().eq(UserTicketOrder::getBoxId, ticketBox.getBoxId())
+                .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.FINISHED)
+                .ge(UserTicketOrder::getCreatedTime, bizDay)
+                .lt(UserTicketOrder::getCreatedTime, DateUtils.addDays(bizDay, 1)));
+        if (null != orderMap) {
+          BigDecimal orderAmt = new BigDecimal(
+              Integer.valueOf(String.valueOf(orderMap.get("orderAmt")))).divide(new BigDecimal(100),
+              2, RoundingMode.DOWN);
+          sumSaleAmt = sumSaleAmt.add(orderAmt);
+          BigDecimal allOrderAmt = new BigDecimal(ticketBox.getSalePrice() * ticketBox.getSaleQty()).divide(new BigDecimal(100),
+              2, RoundingMode.DOWN);
+          sumAllSaleAmt = sumAllSaleAmt.add(allOrderAmt);
+
+          sb.append(ticketBox.getTitle()).append("|").append(ticketBox.getType().getDesc())
+              .append("(").append(
+                  new BigDecimal(ticketBox.getSalePrice()).divide(new BigDecimal(100), 2,
+                      RoundingMode.DOWN)).append("元),累计销售额:")
+              .append(allOrderAmt).append("元,当日:")
+              .append(orderAmt).append("元\n");
+        }
+      }
+    }
+    sb.append("累计销售额:").append(sumAllSaleAmt).append("元,当日:").append(sumSaleAmt).append("元\n");
+
+    Map<String, Object> commMap = channelCommissionService.getMap(
+        new QueryWrapper<ChannelCommission>()
+            .select("IFNULL(sum(comm_amt) ,0) as commAmt")
+            .lambda().ge(ChannelCommission::getCreatedTime, bizDay)
+            .lt(ChannelCommission::getCreatedTime, DateUtils.addDays(bizDay, 1)));
+    Map<String, Object> allCommMap = channelCommissionService.getMap(
+        new QueryWrapper<ChannelCommission>()
+            .select("IFNULL(sum(comm_amt) ,0) as commAmt"));
+    if (null != commMap) {
+      sb.append("累计分佣:").append(
+          new BigDecimal(Integer.valueOf(String.valueOf(allCommMap.get("commAmt")))).divide(
+              new BigDecimal(100), 2, RoundingMode.DOWN))
+          .append("元,当日:").append(
+          new BigDecimal(Integer.valueOf(String.valueOf(commMap.get("commAmt")))).divide(
+              new BigDecimal(100), 2, RoundingMode.DOWN)).append("元\n");
+    }
+
+    Map<String, Object> withdrawMap = channelWithdrawService.getMap(
+        new QueryWrapper<ChannelWithdraw>()
+            .select("IFNULL(sum(money) ,0) as withdrawAmt")
+            .lambda().ge(ChannelWithdraw::getCreateTime, bizDay)
+            .lt(ChannelWithdraw::getCreateTime, DateUtils.addDays(bizDay, 1)));
+    Map<String, Object> allWithdrawMap = channelWithdrawService.getMap(
+        new QueryWrapper<ChannelWithdraw>()
+            .select("IFNULL(sum(money) ,0) as withdrawAmt"));
+    if (null != withdrawMap) {
+      sb.append("累计提现:").append(
+          new BigDecimal(Integer.valueOf(String.valueOf(allWithdrawMap.get("withdrawAmt")))).divide(
+              new BigDecimal(100), 2, RoundingMode.DOWN))
+          .append("元,当日:").append(
+          new BigDecimal(Integer.valueOf(String.valueOf(withdrawMap.get("withdrawAmt")))).divide(
+              new BigDecimal(100), 2, RoundingMode.DOWN)).append("元\n");
+    }
+
+    int exCnt = userExchangeOrderService.count(new LambdaQueryWrapper<UserExchangeOrder>()
+        .ge(UserExchangeOrder::getCreatedTime, bizDay)
+        .lt(UserExchangeOrder::getCreatedTime, DateUtils.addDays(bizDay, 1)));
+    int allExCnt = userExchangeOrderService.count(new LambdaQueryWrapper<UserExchangeOrder>());
+    sb.append("累计兑换订单:").append(allExCnt).append("个,当日:").append(exCnt).append("个\n");
+
+    Map<String, Object> deliverMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
+        .select("IFNULL(sum(log_money) ,0) as deliverAmt")
+        .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.PRIZE)
+        .ge(UserCoinLog::getCreatedTime, bizDay)
+        .lt(UserCoinLog::getCreatedTime, DateUtils.addDays(bizDay, 1)));
+    Map<String, Object> allDeliverMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
+        .select("IFNULL(sum(log_money) ,0) as deliverAmt")
+        .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.PRIZE));
+    if (null != deliverMap) {
+      sb.append("累计派发盲豆:").append(Integer.valueOf(String.valueOf(allDeliverMap.get("deliverAmt"))))
+          .append("颗,当日:").append(Integer.valueOf(String.valueOf(deliverMap.get("deliverAmt"))))
+          .append("颗\n");
+    }
+
+    Map<String, Object> exchangeMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
+        .select("IFNULL(sum(log_money) ,0) as exchangeAmt")
+        .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.EXCHANGE)
+        .ge(UserCoinLog::getCreatedTime, bizDay)
+        .lt(UserCoinLog::getCreatedTime, DateUtils.addDays(bizDay, 1)));
+    Map<String, Object> allExchangeMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
+        .select("IFNULL(sum(log_money) ,0) as exchangeAmt")
+        .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.EXCHANGE));
+    if (null != withdrawMap) {
+      sb.append("累计兑换盲豆:").append(0 - Integer.valueOf(String.valueOf(allExchangeMap.get("exchangeAmt"))))
+          .append("颗,当日:").append(0 - Integer.valueOf(String.valueOf(exchangeMap.get("exchangeAmt"))))
+          .append("颗\n");
+    }
+    WebhookService.sendBizData(sb.toString());
+    LogUtil.info(logger, "...日统计任务结束..." );
+  }
+}

+ 24 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/IndexQueryParam.java

@@ -0,0 +1,24 @@
+package com.qs.mp.admin.domain.param;
+
+import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel(value= "首页统计参数")
+@Data
+public class IndexQueryParam {
+
+	@ApiModelProperty(value = "统计最近几天",required=false)
+	private Integer days;
+
+	@ApiModelProperty(value = "自定义开始时间",required=false)
+	private Date startTime;
+
+	@ApiModelProperty(value = "自定义截止时间",required=false)
+	private Date endTime;
+
+	@ApiModelProperty(value = "统计粒度",required=false)
+	private String level;
+}

+ 35 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/IndexVO.java

@@ -0,0 +1,35 @@
+package com.qs.mp.admin.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @describe 首页统计数据
+ * @auther quanshu
+ * @create 2022-03-07 20:43:44
+ */
+@Data
+public class IndexVO {
+
+
+	/**
+	 * 日期  yyyy-MM-dd
+	 */
+	private String time;
+
+	/**
+	 * 交易金额
+	 */
+	private Integer payAmt;
+
+	
+	/**
+	 * 交易用户数
+	 */
+	private Integer payUserCnt;
+	
+	
+	/**
+	 * 新增经销商数
+	 */
+	private Integer newSiteCnt;
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketAwardsVO.java

@@ -0,0 +1,17 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.admin.domain.TicketAwards;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import java.math.BigDecimal;
+import java.util.List;
+import lombok.Data;
+
+/**
+ * @describe 盲票盒奖项对应的奖品
+ * @auther quanshu
+ * @create 2022-03-02 12:25:55
+ */
+@Data
+public class TicketAwardsVO extends TicketAwards {
+  List<TicketAwardsPrize> prizeList;
+}

+ 4 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java

@@ -10,6 +10,9 @@ import lombok.Data;
  */
 @Data
 public class TicketBoxVO extends TicketBox {
-  // 奖品列表
+  // 奖品列表(小程序端显示)
   List<TicketAwardsPrizeVO> prizeList;
+
+  // 奖级列表(后台显示)
+  List<TicketAwardsVO> awardsList;
 }

+ 2 - 9
mp-service/src/main/java/com/qs/mp/admin/service/impl/GoodsServiceImpl.java

@@ -83,17 +83,10 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
 			LambdaQueryWrapper<GoodsSku> queryWrapper = new LambdaQueryWrapper<>();
 			queryWrapper.eq(GoodsSku::getGoodsId, goods.getGoodsId());
 			boolean delRes = goodsSkuService.remove(queryWrapper);
-			if(delRes) {
-				boolean skuRes = goodsSkuService.saveBatch(skuList);
-				if(!skuRes) {
-					throw new ServiceException("请联系管理员");
-				}
-			}else {
+			boolean skuRes = goodsSkuService.saveBatch(skuList);
+			if(!skuRes) {
 				throw new ServiceException("请联系管理员");
 			}
-
-
-
 		}
 	}
 }

+ 1 - 5
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderInfoVO.java

@@ -1,11 +1,7 @@
 package com.qs.mp.channel.domain.vo;
 
-import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelOrder;
-import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.common.domain.DeliveryCompany;
-import com.qs.mp.common.mapper.DeliveryCompanyMapper;
-
 import java.util.List;
 import lombok.Data;
 
@@ -17,7 +13,7 @@ import lombok.Data;
 public class ChannelOrderInfoVO extends ChannelOrder {
 	
   // 渠道名称
-  private Channel channel;
+  private ChannelVO channel;
   
   // 渠道名称
   private DeliveryCompany deliveryCompany;

+ 2 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderVO.java

@@ -15,6 +15,8 @@ public class ChannelOrderVO extends ChannelOrder {
   private List<ChannelOrderItem> items;
 
   private String channelName;  // 经销商名称
+  
+  private String parentName;  // 上级渠道名称
 
   private String companyName; // 物流公司名称
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelMapper.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.mapper;
 
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.vo.ChannelVO;
 
@@ -41,4 +42,12 @@ public interface ChannelMapper extends BaseMapper<Channel> {
      * @return
      */
     int getChannelSiteCnt(@Param("channelNo") String channelNo);
+    
+	
+    /**
+     * 统计新增的经销商数
+     * @param wrapper
+     * @return
+     */
+ 	List<IndexVO> selectIndexSiteIncreaseList(@Param(Constants.WRAPPER) Wrapper<Channel> wrapper);
 }

+ 11 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelService.java

@@ -1,10 +1,13 @@
 package com.qs.mp.channel.service;
 
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.vo.ChannelOperDataVO;
 import com.qs.mp.channel.domain.vo.ChannelVO;
 
 import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.user.domain.UserDeliverOrder;
+
 import java.util.List;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -82,5 +85,13 @@ public interface IChannelService extends IService<Channel> {
 	 * 根据channelNo统计全部的经营数据
 	 */
 	public ChannelOperDataVO getChannelTotalOperData(String channelNo);
+	
+	
+   /**
+    * 统计新增的经销商数
+    * @param wrapper
+    * @return
+    */
+	List<IndexVO> selectIndexSiteIncreaseList(Wrapper<Channel> wrapper);
 
 }

+ 8 - 2
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java

@@ -3,6 +3,7 @@ package com.qs.mp.channel.service.impl;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.vo.ChannelOperDataVO;
 import com.qs.mp.channel.domain.vo.ChannelVO;
@@ -163,6 +164,11 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
     // channelOperData.setNewUserCnt(newUserCnt);
     return channelOperData;
   }
-
-
+  
+  
+  @Override
+  public List<IndexVO> selectIndexSiteIncreaseList(Wrapper<Channel> wrapper) {
+	 return getBaseMapper().selectIndexSiteIncreaseList(wrapper);
+  }
+  
 }

+ 8 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java

@@ -17,6 +17,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.common.enums.ChannelMoneyEnum;
 import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
 import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.WebhookService;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -87,6 +90,11 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
       feeMoneyLog.setRefId(String.valueOf(channelWithdraw.getId()));
       channelMoneyLogService.changeMoney(feeMoneyLog);
     }
+    StringBuilder sb = new StringBuilder();
+    sb.append("提现申请\n");
+    sb.append("申请人:").append(channel.getName()).append("\n");
+    sb.append("提现金额:").append(new BigDecimal(channelWithdraw.getMoney()).divide(new BigDecimal(100), 2, RoundingMode.DOWN)).append("元\n");
+    WebhookService.sendBizData(sb.toString());
     // 创建提现记录
     return rst;
   }

+ 10 - 1
mp-service/src/main/java/com/qs/mp/framework/service/IWxUrlLinkService.java

@@ -25,11 +25,20 @@ public interface IWxUrlLinkService {
   String generateUrlSchema(String path, String query, String appId);
 
   /**
-   * 生成小程序码,返回的是base64字符串
+   * 生成小程序码(每个小程序限制10w个),返回图片名
    * @param path
    * @param scene
    * @param appId
    * @return
    */
   String generateCode(String path, String scene, String appId);
+
+  /**
+   * 生成小程序码(不受限制),返回图片名
+   * @param path
+   * @param scene
+   * @param appId
+   * @return
+   */
+  String generateUnlimitCode(String path, String scene, String appId);
 }

+ 51 - 1
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxUrlLinkServiceImpl.java

@@ -8,9 +8,12 @@ import com.qs.mp.common.utils.UUIDUtils;
 import com.qs.mp.common.utils.http.HttpUtils;
 import com.qs.mp.framework.service.IAppTokenService;
 import com.qs.mp.framework.service.IWxUrlLinkService;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
+import org.apache.commons.codec.binary.Base64;
 import org.apache.http.entity.ContentType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -106,7 +109,7 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     InputStream in = HttpUtils.sendImagePost(
         "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken,
         JSON.toJSONString(param));
-    LogUtil.info(logger, "小程序链接获取,path:{0},scene:{1}",
+    LogUtil.info(logger, "小程序获取,path:{0},scene:{1}",
         new Object[]{path, scene});
 //    JSONObject jsonObject = JSON.parseObject(res);
     if (null == in) {
@@ -124,4 +127,51 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     }
     return uuid;
   }
+
+  @Override
+  public String generateUnlimitCode(String path, String scene, String appId) {
+    Map<String, Object> param = new HashMap<String, Object>();
+    param.put("page", path); // 页面路径
+    param.put("scene", scene); // 参数
+//    param.put("check_path", true);// 为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在
+    param.put("env_version", "trial");
+    // 获取access_token
+    String accessToken = appTokenService.getAccessToken(appId);
+    InputStream in = HttpUtils.sendImagePost(
+        "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken,
+        JSON.toJSONString(param));
+    LogUtil.info(logger, "小程序码生成,path:{0},scene:{1}",
+        new Object[]{path, scene});
+//    JSONObject jsonObject = JSON.parseObject(res);
+    if (null == in) {
+      LogUtil.error(logger, "小程序码生成错误");
+      return null;
+    }
+    /*byte[] data = null;
+    // 读取图片字节数组
+    ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+    byte[] buff = new byte[100];
+    int rc = 0;
+    while (true) {
+      try {
+        if (!((rc = in.read(buff, 0, 100)) > 0))
+          break;
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+      swapStream.write(buff, 0, rc);
+    }
+    data = swapStream.toByteArray();
+    LogUtil.info(logger, "image:" + new String(data));
+*/
+    // 上传图片
+    String fileName = "s/" + UUIDUtils.newId();
+    try {
+      QcloudFileUtils.putStream(in, fileName, publicBucketName, ContentType.IMAGE_JPEG.getMimeType());
+    } catch (Exception e) {
+      LogUtil.error(logger, e, "小程序码获取错误");
+      return null;
+    }
+    return fileName;
+  }
 }

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

@@ -55,7 +55,7 @@ public class PulsarConsumerImpl implements PulsarConsumer {
       LogUtil.error(logger, "收到盲票支付成功消息,订单结佣状态不是未结佣,忽略消息。orderId=" + orderId);
       return;
     }
-    // 先更新状态,防并发。如果最后生成失败了,暂时人工重新触发
+    // 先更新状态,防并发。
     boolean rst = userTicketOrderService.update(new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus, CommStatusEnum.DOING)
         .eq(UserTicketOrder::getOrderId, orderId).eq(UserTicketOrder::getCommStatus, CommStatusEnum.NO));
     if (!rst) {

+ 16 - 14
mp-service/src/main/java/com/qs/mp/system/mapper/SysUserMapper.java

@@ -1,19 +1,21 @@
 package com.qs.mp.system.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.ChannelUserRel;
 import com.qs.mp.system.domain.SysUser;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
 
 /**
  * 用户表 数据层
- * 
+ *
  * @author ygp
  */
-public interface SysUserMapper
+public interface SysUserMapper  extends BaseMapper<SysUser>
 {
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param sysUser 用户信息
      * @return 用户信息集合信息
      */
@@ -21,7 +23,7 @@ public interface SysUserMapper
 
     /**
      * 根据条件分页查询未已配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -29,7 +31,7 @@ public interface SysUserMapper
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -46,7 +48,7 @@ public interface SysUserMapper
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -54,7 +56,7 @@ public interface SysUserMapper
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
@@ -62,7 +64,7 @@ public interface SysUserMapper
 
     /**
      * 新增用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -70,7 +72,7 @@ public interface SysUserMapper
 
     /**
      * 修改用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -78,7 +80,7 @@ public interface SysUserMapper
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
      * @param avatar 头像地址
      * @return 结果
@@ -87,7 +89,7 @@ public interface SysUserMapper
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
@@ -96,7 +98,7 @@ public interface SysUserMapper
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -104,7 +106,7 @@ public interface SysUserMapper
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
@@ -112,7 +114,7 @@ public interface SysUserMapper
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param userName 用户名称
      * @return 结果
      */

+ 26 - 24
mp-service/src/main/java/com/qs/mp/system/service/ISysUserService.java

@@ -1,18 +1,20 @@
 package com.qs.mp.system.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.ChannelBankCard;
 import com.qs.mp.system.domain.SysUser;
 import java.util.List;
 
 /**
  * 用户 业务层
- * 
+ *
  * @author ygp
  */
-public interface ISysUserService
+public interface ISysUserService  extends IService<SysUser>
 {
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -20,7 +22,7 @@ public interface ISysUserService
 
     /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -28,7 +30,7 @@ public interface ISysUserService
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -44,7 +46,7 @@ public interface ISysUserService
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -52,7 +54,7 @@ public interface ISysUserService
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
@@ -60,7 +62,7 @@ public interface ISysUserService
 
     /**
      * 根据用户ID查询用户所属角色组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -68,7 +70,7 @@ public interface ISysUserService
 
     /**
      * 根据用户ID查询用户所属岗位组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -76,7 +78,7 @@ public interface ISysUserService
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param userName 用户名称
      * @return 结果
      */
@@ -100,21 +102,21 @@ public interface ISysUserService
 
     /**
      * 校验用户是否允许操作
-     * 
+     *
      * @param user 用户信息
      */
     public void checkUserAllowed(SysUser user);
 
     /**
      * 校验用户是否有数据权限
-     * 
+     *
      * @param userId 用户id
      */
     public void checkUserDataScope(Long userId);
 
     /**
      * 新增用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -122,7 +124,7 @@ public interface ISysUserService
 
     /**
      * 注册用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -130,7 +132,7 @@ public interface ISysUserService
 
     /**
      * 修改用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -138,7 +140,7 @@ public interface ISysUserService
 
     /**
      * 用户授权角色
-     * 
+     *
      * @param userId 用户ID
      * @param roleIds 角色组
      */
@@ -146,7 +148,7 @@ public interface ISysUserService
 
     /**
      * 修改用户状态
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -154,7 +156,7 @@ public interface ISysUserService
 
     /**
      * 修改用户基本信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -162,7 +164,7 @@ public interface ISysUserService
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
      * @param avatar 头像地址
      * @return 结果
@@ -179,7 +181,7 @@ public interface ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -187,7 +189,7 @@ public interface ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
@@ -196,7 +198,7 @@ public interface ISysUserService
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -204,7 +206,7 @@ public interface ISysUserService
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
@@ -212,7 +214,7 @@ public interface ISysUserService
 
     /**
      * 导入用户数据
-     * 
+     *
      * @param userList 用户数据列表
      * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
      * @param operName 操作用户

+ 30 - 27
mp-service/src/main/java/com/qs/mp/system/service/impl/SysUserServiceImpl.java

@@ -1,5 +1,8 @@
 package com.qs.mp.system.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.channel.domain.ChannelBankCard;
+import com.qs.mp.channel.mapper.ChannelBankCardMapper;
 import com.qs.mp.common.annotation.DataScope;
 import com.qs.mp.common.constant.UserConstants;
 import com.qs.mp.common.exception.ServiceException;
@@ -28,11 +31,11 @@ import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 用户 业务层处理
- * 
+ *
  * @author ygp
  */
 @Service
-public class SysUserServiceImpl implements ISysUserService
+public class SysUserServiceImpl  extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService
 {
     private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
 
@@ -56,7 +59,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询用户列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -69,7 +72,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -82,7 +85,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 根据条件分页查询未分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -100,7 +103,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户名查询用户
-     * 
+     *
      * @param userName 用户名
      * @return 用户对象信息
      */
@@ -112,7 +115,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户ID查询用户
-     * 
+     *
      * @param userId 用户ID
      * @return 用户对象信息
      */
@@ -124,7 +127,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 查询用户所属角色组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -146,7 +149,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 查询用户所属岗位组
-     * 
+     *
      * @param userName 用户名
      * @return 结果
      */
@@ -168,7 +171,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户名称是否唯一
-     * 
+     *
      * @param userName 用户名称
      * @return 结果
      */
@@ -221,7 +224,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户是否允许操作
-     * 
+     *
      * @param user 用户信息
      */
     @Override
@@ -235,7 +238,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 校验用户是否有数据权限
-     * 
+     *
      * @param userId 用户id
      */
     @Override
@@ -255,7 +258,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -274,7 +277,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 注册用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -286,7 +289,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改保存用户信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -308,7 +311,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 用户授权角色
-     * 
+     *
      * @param userId 用户ID
      * @param roleIds 角色组
      */
@@ -322,7 +325,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户状态
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -334,7 +337,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户基本信息
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -346,7 +349,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 修改用户头像
-     * 
+     *
      * @param userName 用户名
      * @param avatar 头像地址
      * @return 结果
@@ -364,7 +367,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param user 用户信息
      * @return 结果
      */
@@ -376,7 +379,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 重置用户密码
-     * 
+     *
      * @param userName 用户名
      * @param password 密码
      * @return 结果
@@ -389,7 +392,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户角色信息
-     * 
+     *
      * @param user 用户对象
      */
     public void insertUserRole(SysUser user)
@@ -415,7 +418,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户岗位信息
-     * 
+     *
      * @param user 用户对象
      */
     public void insertUserPost(SysUser user)
@@ -441,7 +444,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 新增用户角色信息
-     * 
+     *
      * @param userId 用户ID
      * @param roleIds 角色组
      */
@@ -467,7 +470,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 通过用户ID删除用户
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */
@@ -484,7 +487,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 批量删除用户信息
-     * 
+     *
      * @param userIds 需要删除的用户ID
      * @return 结果
      */
@@ -505,7 +508,7 @@ public class SysUserServiceImpl implements ISysUserService
 
     /**
      * 导入用户数据
-     * 
+     *
      * @param userList 用户数据列表
      * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
      * @param operName 操作用户

+ 6 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java

@@ -92,6 +92,12 @@ public class UserTicketOrder implements Serializable {
   @TableField("coupon_info")
   private String couponInfo;
 
+  /**
+   * 分享信息
+   */
+  @TableField("share_info")
+  private String shareInfo;
+
   /**
    * 订单状态;-1 已取消 0:待付款 1:已完成
    */

+ 16 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserShareVO.java

@@ -0,0 +1,16 @@
+package com.qs.mp.user.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/31
+ */
+@Data
+public class UserShareVO {
+  private Long suid; // 分享者uid
+  private String type; // 分享者类型
+
+  public static final String SHARE_TYPE_USER = "1"; // 用户分享
+  public static final String SHARE_TYPE_SITE = "2"; // 经销商分享
+}

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

@@ -1,7 +1,16 @@
 package com.qs.mp.user.mapper;
 
+import com.qs.mp.admin.domain.vo.IndexVO;
+import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 
 /**
  * @auther quanshu
@@ -10,4 +19,17 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface UserTicketOrderMapper extends BaseMapper<UserTicketOrder> {
 
+	  /**
+	   * 统计交易金额
+	   * @param wrapper
+	   * @return
+	   */
+	  List<IndexVO> selectIndexPayAmtList(@Param(Constants.WRAPPER) Wrapper<UserDeliverOrder> wrapper);
+	  
+	  /**
+	   * 统计交易用户数
+	   * @param wrapper
+	   * @return
+	   */
+	  List<IndexVO> selectIndexPayUserCntList(@Param(Constants.WRAPPER) Wrapper<UserDeliverOrder> wrapper);
 }

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

@@ -1,9 +1,13 @@
 package com.qs.mp.user.service;
 
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.pay.domain.PayOrder;
+import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
+import com.qs.mp.user.domain.vo.UserShareVO;
 import java.util.List;
 
 /**
@@ -20,9 +24,10 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
    * 提交盲票购买订单
    * @param userId
    * @param orderSettleVO
+   * @param userShareVO
    * @return
    */
-  String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO);
+  String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO, UserShareVO userShareVO);
 
   /**
    * 批量取消一个票组(线上)的订单(恢复优惠券、票组销量)
@@ -52,4 +57,20 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
    * @return
    */
   boolean commToChannel(String orderId);
+  
+  
+  /**
+   * 统计交易金额
+   * @param wrapper
+   * @return
+   */
+  List<IndexVO> selectIndexPayAmtList(Wrapper<UserDeliverOrder> wrapper);
+  
+  /**
+   * 统计交易用户数
+   * @param wrapper
+   * @return
+   */
+  List<IndexVO> selectIndexPayUserCntList(Wrapper<UserDeliverOrder> wrapper);
+  
 }

+ 41 - 5
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -1,12 +1,13 @@
 package com.qs.mp.user.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.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
@@ -36,10 +37,12 @@ import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.domain.vo.UserShareVO;
 import com.qs.mp.user.mapper.UserTicketOrderMapper;
 import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
@@ -106,16 +109,16 @@ public class UserTicketOrderServiceImpl extends
 
   @Override
   @Transactional
-  public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+  public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO, UserShareVO userShareVO) {
     if (StringUtils.isBlank(orderSettleVO.getTicketId())) {
-      return createOnlineOrder(userId, orderSettleVO);
+      return createOnlineOrder(userId, orderSettleVO, userShareVO);
     }
 
     // 线下票不需锁库存,待付款成功后再更新票组销量
     return createOfflineOrder(userId, orderSettleVO);
   }
 
-  private String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+  private String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO, UserShareVO userShareVO) {
     // 线上票更新票组销量,防止超卖
     TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
     if (ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
@@ -160,7 +163,30 @@ public class UserTicketOrderServiceImpl extends
     ChannelUserRel channelUserRel = channelUserRelService.getOne(
         new LambdaQueryWrapper<ChannelUserRel>()
             .eq(ChannelUserRel::getUserId, userId));
-    userTicketOrder.setChannelId(null == channelUserRel ? null : channelUserRel.getChannelId());
+    if (null != channelUserRel) {
+      userTicketOrder.setChannelId(channelUserRel.getChannelId());
+    } else {
+      // 没被绑定,看有没有分享者
+      if (null != userShareVO.getSuid() && 0 != userShareVO.getSuid()) {
+        if (UserShareVO.SHARE_TYPE_USER.equals(userShareVO.getType())) {
+          ChannelUserRel channelShareUserRel = channelUserRelService.getOne(
+              new LambdaQueryWrapper<ChannelUserRel>()
+                  .eq(ChannelUserRel::getUserId, userShareVO.getSuid()));
+          if (null != channelShareUserRel) {
+            userTicketOrder.setChannelId(channelShareUserRel.getChannelId());
+            userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
+          }
+        } else if (UserShareVO.SHARE_TYPE_SITE.equals(userShareVO.getType())) {
+          Channel channel = channelService.getOne(
+              new LambdaQueryWrapper<Channel>()
+                  .eq(Channel::getUserId, userShareVO.getSuid()));
+          if (null != channel) {
+            userTicketOrder.setChannelId(channel.getChannelId());
+            userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
+          }
+        }
+      }
+    }
     save(userTicketOrder);
 
     for (int i = 0; i < orderSettleVO.getOrderNum(); i++) {
@@ -445,4 +471,14 @@ public class UserTicketOrderServiceImpl extends
     channelCommissionService.save(siteCommission);
     return siteCommission;
   }
+
+	@Override
+	public List<IndexVO> selectIndexPayAmtList(Wrapper<UserDeliverOrder> wrapper) {
+		return getBaseMapper().selectIndexPayAmtList(wrapper);
+	}
+	
+	@Override
+	public List<IndexVO> selectIndexPayUserCntList(Wrapper<UserDeliverOrder> wrapper) {
+		return getBaseMapper().selectIndexPayUserCntList(wrapper);
+	}
 }

+ 12 - 0
mp-service/src/main/resources/mapper/channel/ChannelMapper.xml

@@ -63,5 +63,17 @@
 		left join mp_channel t2 on t1.parent_id = t2.channel_id
 		where t1.channel_id = #{channelId}
 	</select>
+	
+	
+	<!-- 统计新增经销商数列表 -->
+    <select id="selectIndexSiteIncreaseList" resultType="com.qs.mp.admin.domain.vo.IndexVO">
+		select 
+          DATE_FORMAT(t1.created_time, '%Y%m%d') AS time,
+          COUNT(t1.channel_id) AS newSiteCnt
+	     from `mp_channel` t1
+	left join mp_channel t2 on t1.channel_id = t2.channel_id
+		${ew.customSqlSegment}
+		GROUP BY time
+	</select>
 
 </mapper>

+ 2 - 1
mp-service/src/main/resources/mapper/channel/ChannelOrderMapper.xml

@@ -34,9 +34,10 @@
     
     <!-- 查询用户提货订单列表 -->
     <select id="selectChannelOrderVoList" resultType="com.qs.mp.channel.domain.vo.ChannelOrderVO">
-		select DISTINCT t1.* , t2.name channelName
+		select DISTINCT t1.* , t2.name channelName, t3.name parentName
 		from mp_channel_order t1
 		left join mp_channel t2 on t1.channel_id = t2.channel_id
+		left join mp_channel t3 on t2.parent_id = t3.channel_id
 		${ew.customSqlSegment}
 	</select>
 

+ 26 - 1
mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

@@ -15,6 +15,7 @@
         <result column="memo" property="memo" />
         <result column="resource" property="resource" />
         <result column="coupon_info" property="couponInfo" />
+        <result column="share_info" property="shareInfo" />
         <result column="status" property="status" />
         <result column="comm_status" property="commStatus" />
         <result column="channel_id" property="channelId" />
@@ -24,7 +25,31 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        order_id, user_id, title, box_id, order_amt, discount_amt, pay_amt, ticket_num, memo, resource, coupon_info, status, comm_status, channel_id, created_time, updated_time
+        order_id, user_id, title, box_id, order_amt, discount_amt, pay_amt, ticket_num, memo, resource, coupon_info, share_info, status, comm_status, channel_id, created_time, updated_time
     </sql>
+    
+    
+    <!-- 统计交易金额列表 -->
+    <select id="selectIndexPayAmtList" 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_user_ticket_order` t1
+	left join mp_channel t2 on t1.channel_id = t2.channel_id
+		${ew.customSqlSegment}
+		GROUP BY time
+	</select>
+	
+	 <!-- 统计交易用户数列表 -->
+    <select id="selectIndexPayUserCntList" resultType="com.qs.mp.admin.domain.vo.IndexVO">
+		select 
+          DATE_FORMAT(t1.created_time, '%Y%m%d') AS time,
+          COUNT(DISTINCT t1.user_id) AS payUserCnt
+	     from `mp_user_ticket_order` t1
+	left join mp_channel t2 on t1.channel_id = t2.channel_id
+		${ew.customSqlSegment}
+		GROUP BY time
+	</select>
+    
 
 </mapper>