Przeglądaj źródła

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

Mp server test

See merge request quanshu/mp-server!348
zhong chunping 3 lat temu
rodzic
commit
ab72f7db26
42 zmienionych plików z 882 dodań i 159 usunięć
  1. 50 5
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java
  2. 134 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  3. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsCategoryMgrController.java
  4. 20 22
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java
  5. 104 10
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  6. 16 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  7. 6 10
      mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java
  8. 49 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java
  9. 1 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java
  10. 5 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  11. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java
  12. 6 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserShareController.java
  13. 22 16
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  14. 1 1
      mp-admin/src/main/resources/application-dev.yml
  15. 4 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelOrderStatusEnum.java
  16. 3 1
      mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java
  17. 41 0
      mp-common/src/main/java/com/qs/mp/common/enums/PayOrderStatusEnum.java
  18. 26 7
      mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java
  19. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketCntVO.java
  20. 17 2
      mp-service/src/main/java/com/qs/mp/admin/mapper/TicketMapper.java
  21. 1 1
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java
  22. 18 0
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketService.java
  23. 2 11
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  24. 13 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketServiceImpl.java
  25. 66 0
      mp-service/src/main/java/com/qs/mp/channel/domain/excel/ChannelOrderExcel.java
  26. 3 1
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOperDataVO.java
  27. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderVO.java
  28. 10 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelVO.java
  29. 9 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelOrderMapper.java
  30. 12 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java
  31. 7 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  32. 3 3
      mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java
  33. 23 19
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  34. 20 5
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java
  35. 10 7
      mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java
  36. 23 5
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  37. 65 13
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java
  38. 1 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderItemServiceImpl.java
  39. 14 9
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  40. 24 0
      mp-service/src/main/resources/mapper/admin/TicketMapper.xml
  41. 11 1
      mp-service/src/main/resources/mapper/channel/ChannelOrderMapper.xml
  42. 16 0
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

+ 50 - 5
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java

@@ -20,6 +20,7 @@ import com.qs.mp.common.enums.ChannelRoleEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -27,8 +28,10 @@ import ma.glasnost.orika.MapperFacade;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -60,6 +63,9 @@ public class ChannelMgrController extends BaseApiController {
 
 	@Autowired
 	private IChannelOrderService channelOrderService;
+	
+	@Autowired
+	private IUserTicketOrderService userTicketOrderService;
 
 	@Autowired
 	private ISysUserService userService;
@@ -127,7 +133,7 @@ public class ChannelMgrController extends BaseApiController {
 	 */
 	@PostMapping("/list")
 	@PreAuthorize("@ss.hasPermi('business:channel:list')")
-	public TableDataInfo listChannel(@RequestBody Channel channel) {
+	public TableDataInfo listChannel(@RequestBody ChannelVO channel) {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		startPage();
 		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
@@ -135,8 +141,10 @@ public class ChannelMgrController extends BaseApiController {
 			queryWrapper.eq("t1.parent_id", channel.getParentId());
 		}
 		queryWrapper.gt("t1.level", 0);
+		queryWrapper.eq(null != channel && null != channel.getLevel(),"t1.level", channel.getLevel());
 		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getMobile()), "t1.mobile", channel.getMobile());
 		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
+		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getParentName()), "t2.name", channel.getParentName());
 		queryWrapper.eq(null != channel && null != channel.getProvinceId(), "t1.province_id", channel.getProvinceId());
 		queryWrapper.eq(null != channel && null != channel.getCityId(), "t1.city_id", channel.getCityId());
 		queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
@@ -338,15 +346,52 @@ public class ChannelMgrController extends BaseApiController {
 			int userCnt = channelUserRelService.getChannelTotalUserCnt(channelVO.getChannelNo());
 			channelVO.setSiteCnt(siteCnt);
 			channelVO.setUserCnt(userCnt);
+			channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
 		}
 	    // 查询渠道销售额、佣金收入、订单数等
 	    ChannelOperDataVO channelOperDataVO = channelService.getChannelTotalOperData(channelVO.getChannelNo());
-		LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
-		queryWrapper.eq(ChannelOrder::getChannelId, channelId);
-		int orderCnt = channelOrderService.count(queryWrapper);
-		channelOperDataVO.setOrderCnt(orderCnt);
+		// LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
+		//queryWrapper.eq(ChannelOrder::getChannelId, channelId);
+		//int orderCnt = channelOrderService.count(queryWrapper);
+		//channelOperDataVO.setOrderCnt(orderCnt);
+		
+		// 盲票销量
+		int ticketSaleCnt = userTicketOrderService.getChannelTotalTicketNumCnt(channelVO.getChannelNo());
+		channelOperDataVO.setTicketSaleCnt(ticketSaleCnt);
 	    channelVO.setOperData(channelOperDataVO);
 		return AjaxResult.success(channelVO);
 	}
+	
+	
+	// 获取上级渠道迭代
+	private String getParentsName(String channelNo) {
+		if(StringUtils.isNotBlank(channelNo)) {
+			String[] noArray = channelNo.split("\\.");
+			if(null != noArray && noArray.length > 0) {
+				List<String> noList = new ArrayList<String>();
+				String parentNo = "";
+				for (int i = 0; i < noArray.length; i++) {
+					if(null != noArray[i] && StringUtils.isNotBlank(noArray[i])) {
+						parentNo += (i>0?".":"")+noArray[i];
+						if(StringUtils.isNotBlank(parentNo) && !parentNo.equals(channelNo)) {
+							noList.add(parentNo);
+						}
+					}
+				}
+				if(noList.size() > 0 ) {
+					LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+					queryWrapper.gt(Channel::getLevel, 0);
+					queryWrapper.in(Channel::getChannelNo,noList);
+					queryWrapper.orderByAsc(Channel::getLevel);
+					List<Channel> list = channelService.list(queryWrapper);
+					if(null != list && list.size() >0) {
+						String names = list.stream().map(Channel::getName).collect(Collectors.joining(" > "));
+						return names;
+					}
+				}
+			}
+		}
+		return "";
+	}
 
 }

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

@@ -7,12 +7,14 @@ import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.domain.param.ChannelOrderPkgParam;
 import com.qs.mp.admin.domain.param.ChannelOrderQueryParam;
 import com.qs.mp.admin.domain.param.ChannelOrderShipParam;
+import com.qs.mp.admin.domain.param.UserDeliverOrderQueryParam;
 import com.qs.mp.admin.domain.vo.TicketPackageVO;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelOrderItem;
+import com.qs.mp.channel.domain.excel.ChannelOrderExcel;
 import com.qs.mp.channel.domain.vo.ChannelOrderInfoVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderItemVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
@@ -29,6 +31,12 @@ import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.service.IDeliveryCompanyService;
+import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
+import com.qs.mp.user.domain.excel.DeliverOrderExcel;
+import com.qs.mp.user.domain.vo.UserDeliverOrderItemVO;
+import com.qs.mp.user.domain.vo.UserDeliverOrderVO;
+import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -93,8 +101,11 @@ public class ChannelOrderMgrController extends BaseApiController {
     queryWrapper.orderByDesc("t1.order_id");
     List<ChannelOrderVO> channelOrderVOList = channelOrderService.selectChannelOrderVoList(queryWrapper);
     for (ChannelOrderVO channelOrderVO : channelOrderVOList) {
-      channelOrderVO.setItems(channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
-          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId())));
+    	List<ChannelOrderItem> itemList = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+   	          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId()));
+
+   	    List<ChannelOrderItemVO> itemVOList = mapperFacade.mapAsList(itemList, ChannelOrderItemVO.class);
+        channelOrderVO.setItems(itemVOList);
     }
     return getDataTable(channelOrderVOList);
   }
@@ -249,4 +260,125 @@ public class ChannelOrderMgrController extends BaseApiController {
 		}
 		return AjaxResult.success(list);
 	}
+	
+	
+	
+	@Log(title = "提货订单导出", businessType = BusinessType.EXPORT)
+	@PostMapping("/export")
+	@PreAuthorize("@ss.hasPermi('order:channel:export')")
+	public AjaxResult export(@RequestBody ChannelOrderQueryParam queryParam) {
+
+		List<ChannelOrderExcel> excelList = new ArrayList<ChannelOrderExcel>();
+		List<ChannelOrderVO> listAll = new ArrayList<ChannelOrderVO>();
+		// 首先查询要导出的数据总数
+		QueryWrapper<ChannelOrder> queryWrapper = new QueryWrapper<ChannelOrder>();
+	    queryWrapper.eq(null != queryParam && null != queryParam.getChannelId(), "t1.channel_id" ,queryParam.getChannelId());
+	    queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getOrderId()), "t1.order_id" ,queryParam.getOrderId());
+		queryWrapper.eq(null != queryParam && null != queryParam.getStatus(), "t1.`status`" ,queryParam.getStatus());
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(),  "t1.created_time", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		queryWrapper.like(null != queryParam && StringUtils.isNotBlank(queryParam.getTitle()), "t1.title", queryParam.getTitle());
+	    queryWrapper.orderByDesc("t1.order_id");
+	    
+	    int totalSize = channelOrderService.selectChannelOrderCount(queryWrapper);
+		if (totalSize == 0) {
+			return AjaxResult.error("没有符合条件的经销商订单");
+		}
+	    
+		int pageSize = 2000;
+		if (totalSize > pageSize) {
+			int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
+			for (int i = 0; i < totalPage; i++) {
+				queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+			    List<ChannelOrderVO> channelOrderVOList = channelOrderService.selectChannelOrderVoList(queryWrapper);
+			    for (ChannelOrderVO channelOrderVO : channelOrderVOList) {
+			    	List<ChannelOrderItem> itemList = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+			     	          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId()));
+				  	List<ChannelOrderItemVO> itemVOList = mapperFacade.mapAsList(itemList, ChannelOrderItemVO.class);
+				  	if(null != itemVOList && itemVOList.size() > 0) {
+				  		for(ChannelOrderItemVO itemVO : itemVOList) {
+				  			if(null != itemVO && StringUtils.isNotBlank(itemVO.getBoxId())
+				  					&& StringUtils.isNotBlank(itemVO.getOrderId())) {
+				  				LambdaQueryWrapper<ChannelOrderDetail> detailQueryWrapper = new LambdaQueryWrapper<ChannelOrderDetail>();
+				  				detailQueryWrapper.eq(ChannelOrderDetail::getOrderId, itemVO.getOrderId());
+				  				detailQueryWrapper.eq(ChannelOrderDetail::getBoxId, itemVO.getBoxId());
+				  				List<ChannelOrderDetail> detailList = channelOrderDetailService.list(detailQueryWrapper);
+				  				itemVO.setDetailList(detailList);
+				  			}
+				  		}
+				  	}
+				  	channelOrderVO.setItems(itemVOList);
+			    }
+				if (null != channelOrderVOList && channelOrderVOList.size() > 0) {
+					listAll.addAll(channelOrderVOList);
+				}
+			}
+		} else {
+			listAll = channelOrderService.selectChannelOrderVoList(queryWrapper);
+		    for (ChannelOrderVO channelOrderVO : listAll) {
+		    	List<ChannelOrderItem> itemList = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+		     	          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId()));
+			  	List<ChannelOrderItemVO> itemVOList = mapperFacade.mapAsList(itemList, ChannelOrderItemVO.class);
+			  	if(null != itemVOList && itemVOList.size() > 0) {
+			  		for(ChannelOrderItemVO itemVO : itemVOList) {
+			  			if(null != itemVO && StringUtils.isNotBlank(itemVO.getBoxId())
+			  					&& StringUtils.isNotBlank(itemVO.getOrderId())) {
+			  				LambdaQueryWrapper<ChannelOrderDetail> detailQueryWrapper = new LambdaQueryWrapper<ChannelOrderDetail>();
+			  				detailQueryWrapper.eq(ChannelOrderDetail::getOrderId, itemVO.getOrderId());
+			  				detailQueryWrapper.eq(ChannelOrderDetail::getBoxId, itemVO.getBoxId());
+			  				List<ChannelOrderDetail> detailList = channelOrderDetailService.list(detailQueryWrapper);
+			  				itemVO.setDetailList(detailList);
+			  			}
+			  		}
+			  	}
+			  	channelOrderVO.setItems(itemVOList);
+		    }
+		}
+	    
+		if (null != listAll && listAll.size() > 0) {
+			// listAll.sort(Comparator.comparing(UserDeliverOrderVO::getOrderId));
+			for (ChannelOrderVO channelOrder : listAll) {
+				if (null != channelOrder && StringUtils.isNotBlank(channelOrder.getOrderId())
+						&& StringUtils.isNotBlank(channelOrder.getReceiver())
+						&& StringUtils.isNotBlank(channelOrder.getTel())
+						&& StringUtils.isNotBlank(channelOrder.getProvince())
+						&& StringUtils.isNotBlank(channelOrder.getCity())
+						&& StringUtils.isNotBlank(channelOrder.getArea())
+						&& StringUtils.isNotBlank(channelOrder.getAddress()) && null != channelOrder.getItems()
+						&& channelOrder.getItems().size() > 0) {
+					for (ChannelOrderItemVO channelOrderItem : channelOrder.getItems()) {
+						if (null != channelOrderItem) {
+							ChannelOrderExcel channelOrderExcel = new ChannelOrderExcel();
+							channelOrderExcel.setTitle(channelOrderItem.getTitle());
+							channelOrderExcel.setOrderNum(channelOrderItem.getOrderNum());
+							if(null != channelOrderItem.getDetailList() && channelOrderItem.getDetailList().size() > 0) {
+								StringBuffer buff = new StringBuffer();
+								for(ChannelOrderDetail orderDetail: channelOrderItem.getDetailList()) {
+									if(null != orderDetail && StringUtils.isNotBlank(orderDetail.getStartSn())
+											&& StringUtils.isNotBlank(orderDetail.getEndSn())) {
+										buff.append("("+orderDetail.getStartSn()+"-"+orderDetail.getEndSn()+")");
+									}
+								}
+								channelOrderExcel.setSnRrange(buff.toString());
+							}
+							channelOrderExcel.setCreatedTime(channelOrder.getCreatedTime());
+							channelOrderExcel.setItemStatus(channelOrder.getStatus().getValue() > 1 ? "已发货" : "未发货");
+							channelOrderExcel.setOrderId(channelOrder.getOrderId());
+							channelOrderExcel.setStatus(channelOrder.getStatus().getDesc());
+							channelOrderExcel.setChannelName(channelOrder.getChannelName());
+							channelOrderExcel.setParentName(channelOrder.getParentName());
+							channelOrderExcel.setReceiver(channelOrder.getReceiver());
+							channelOrderExcel.setTel(channelOrder.getTel());
+							String address = channelOrder.getProvince() + channelOrder.getCity()
+									+ channelOrder.getArea() + channelOrder.getAddress();
+							channelOrderExcel.setAddress(address);
+							excelList.add(channelOrderExcel);
+						}
+					}
+				}
+			}
+		}
+		ExcelUtil<ChannelOrderExcel> util = new ExcelUtil<ChannelOrderExcel>(ChannelOrderExcel.class);
+		return util.exportExcel(excelList, "经销商订单导出", false);
+	}
 }

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

@@ -152,7 +152,7 @@ public class GoodsCategoryMgrController extends BaseApiController {
       return error(ErrorCodeEnum.ERROR_CODE_1001);
     }
     int cnt = goodsService.count(new LambdaQueryWrapper<Goods>()
-        .eq(Goods::getCategoryId, goodsCategory.getCategoryId()).eq(Goods::getIsDeleted, 1));
+        .eq(Goods::getCategoryId, goodsCategory.getCategoryId()).eq(Goods::getIsDeleted, 0));
     if (cnt > 0) {
       return error(ErrorCodeEnum.ERROR_CODE_1024);
     }

+ 20 - 22
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java

@@ -7,7 +7,7 @@ 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.domain.UserTicketOrder;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
@@ -58,9 +58,9 @@ public class IndexMgrController extends BaseApiController {
 		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<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 		queryWrapper.gt("t1.`status`", 0);
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 		if(null != channelId && 0 != channelId) {
@@ -181,9 +181,9 @@ public class IndexMgrController extends BaseApiController {
 		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<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 		queryWrapper.gt("t1.`status`", 0);
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 		if(null != channelId && 0 != channelId) {
@@ -300,18 +300,18 @@ public class IndexMgrController extends BaseApiController {
 	 */
 	private IndexQueryParam getQueryParam(IndexQueryParam indeQueryParam) {
 		IndexQueryParam queryParam = new IndexQueryParam();
-		queryParam.setDays(null != indeQueryParam && null != indeQueryParam.getDays()?indeQueryParam.getDays():7);
+		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());
+				queryParam.setEndTime(DateUtils.getEndTimeOfNow(indeQueryParam.getEndTime()));
 			}else {
-				queryParam.setStartTime(DateUtils.getPreDayOfNowZero(7));
+				queryParam.setStartTime(DateUtils.getPreDayOfNowZero(6));
 				queryParam.setEndTime(new Date());
 			}
 		}else {
-			queryParam.setStartTime(DateUtils.getPreDayOfNowZero(queryParam.getDays()));
+			queryParam.setStartTime(DateUtils.getPreDayOfNowZero(queryParam.getDays() - 1));
 			queryParam.setEndTime(new Date());
 		}
 		return queryParam;
@@ -330,8 +330,8 @@ public class IndexMgrController extends BaseApiController {
 		
 		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.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 		queryWrapper.eq("t1.`level`", 0);
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
 		if(null != channelId && 0 != channelId) {
@@ -457,15 +457,15 @@ public class IndexMgrController extends BaseApiController {
 		List<IndexVO> list = new ArrayList<IndexVO>();
 		List<IndexVO> siteList = 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<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 		queryWrapper.gt("t1.`status`", 0);
 		
 
 		QueryWrapper<Channel> siteQueryWrapper = new QueryWrapper<>();
-		siteQueryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getStartTime());
-		siteQueryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "DATE_FORMAT(t1.created_time, '%Y-%m-%d')", queryParam.getEndTime());
+		siteQueryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		siteQueryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
 		siteQueryWrapper.eq("t1.`level`", 0);
 		
 		Long channelId = SecurityUtils.getLoginUser().getChannelId();
@@ -518,8 +518,6 @@ public class IndexMgrController extends BaseApiController {
 						yesterdayPayUserCnt = null != indexVo.getPayUserCnt()?indexVo.getPayUserCnt():0;
 						yesterdayTicketNum =  null != indexVo.getTicketNum()?indexVo.getTicketNum():0;
 					}
-					
-					break;
 				}
 			}
 		}
@@ -563,7 +561,7 @@ public class IndexMgrController extends BaseApiController {
 		
 		IndexQueryParam queryParam = getQueryParam(indeQueryParam);
 		List<IndexVO> list = new ArrayList<IndexVO>();
-		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<>();
+		QueryWrapper<UserTicketOrder> 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);
@@ -606,7 +604,7 @@ public class IndexMgrController extends BaseApiController {
 		
 		IndexQueryParam queryParam = getQueryParam(indeQueryParam);
 		List<IndexVO> list = new ArrayList<IndexVO>();
-		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<>();
+		QueryWrapper<UserTicketOrder> 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);

+ 104 - 10
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -3,8 +3,11 @@ package com.qs.mp.web.controller.api.admin;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelUserRel;
 import com.qs.mp.channel.domain.param.ChannelParam;
 import com.qs.mp.channel.domain.param.SaleSiteParam;
@@ -20,8 +23,11 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.ChannelRoleEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -31,6 +37,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,9 +68,15 @@ public class SaleSiteMgrController extends BaseApiController {
 
 	@Autowired
 	private IChannelOrderService channelOrderService;
+	
+	@Autowired
+	private IUserTicketOrderService userTicketOrderService;
 
 	@Autowired
 	private ISysUserService userService;
+	
+	@Autowired
+	private ITicketService ticketService;
 
 	@Autowired
 	private MapperFacade mapperFacade;
@@ -76,7 +89,7 @@ public class SaleSiteMgrController extends BaseApiController {
 	 */
 	@PostMapping("/list")
 	@PreAuthorize("@ss.hasPermi('business:salesite:list')")
-	public TableDataInfo listChannel(@RequestBody Channel channel) {
+	public TableDataInfo listSite(@RequestBody Channel channel) {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		startPage();
 		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
@@ -91,9 +104,26 @@ public class SaleSiteMgrController extends BaseApiController {
 		queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
 		queryWrapper.orderByDesc("t1.channel_id");
 		list = channelService.selectChannelVoList(queryWrapper);
+		List<Long> channelIds = new ArrayList<Long>();
 		if(null != list && list.size() > 0) {
 			for(ChannelVO channelVO : list) {
-				if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+				if(null != channelVO && null != channelVO.getChannelId()
+						&& StringUtils.isNotBlank(channelVO.getChannelNo())) {
+					channelIds.add(channelVO.getChannelId());
+ 				}
+			}
+		}
+		List<TicketCntVO>  cntList = new ArrayList<TicketCntVO>();
+		if(null != channelIds && channelIds.size() > 0) {
+			QueryWrapper<ChannelOrderDetail> ticketCntQueryWrapper = new QueryWrapper<ChannelOrderDetail>();
+			ticketCntQueryWrapper.in("t1.channel_id", channelIds);
+			cntList = ticketService.listTicketCnt(ticketCntQueryWrapper);
+		}
+		
+		if(null != list && list.size() > 0) {
+			for(ChannelVO channelVO : list) {
+				if(null != channelVO && null != channelVO.getChannelId()
+						&& StringUtils.isNotBlank(channelVO.getChannelNo())) {
 					// int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
 					LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
 					userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
@@ -102,12 +132,70 @@ public class SaleSiteMgrController extends BaseApiController {
 					// 查询用户信息
 					//SysUser sysUser = userService.selectUserById(channelVO.getUserId());
 					// channelVO.setSysUser(sysUser);
+					channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
+					// 统计盲票库存, 销量
+					if(null != cntList && cntList.size() > 0) {
+						List<TicketCntVO> voList =  cntList.stream().filter(item  -> item.getChannelId().equals(channelVO.getChannelId()))
+				                .collect(Collectors.toList());
+						if(null != voList && voList.size() > 0) {
+							TicketCntVO ticketCnt =  voList.get(0);
+							channelVO.setOffLineQtyCnt(null != ticketCnt?ticketCnt.getOffLineQtyCnt():0);
+							channelVO.setOffLineSaleCnt(null != ticketCnt?ticketCnt.getOffLineSaleCnt():0);
+							channelVO.setOnLineSaleCnt(null != ticketCnt?ticketCnt.getOnLineSaleCnt():0);
+						}
+					}
  				}
 			}
 		}
 		return getDataTable(list);
 	}
+	
+	// 获取上级渠道迭代
+	private String getParentsName(String channelNo) {
+		if(StringUtils.isNotBlank(channelNo)) {
+			String[] noArray = channelNo.split("\\.");
+			if(null != noArray && noArray.length > 0) {
+				List<String> noList = new ArrayList<String>();
+				String parentNo = "";
+				for (int i = 0; i < noArray.length; i++) {
+					if(null != noArray[i] && StringUtils.isNotBlank(noArray[i])) {
+						parentNo += (i>0?".":"")+noArray[i];
+						if(StringUtils.isNotBlank(parentNo) && !parentNo.equals(channelNo)) {
+							noList.add(parentNo);
+						}
+					}
+				}
+				if(noList.size() > 0 ) {
+					LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+					queryWrapper.gt(Channel::getLevel, 0);
+					queryWrapper.in(Channel::getChannelNo,noList);
+					queryWrapper.orderByAsc(Channel::getLevel);
+					List<Channel> list = channelService.list(queryWrapper);
+					if(null != list && list.size() >0) {
+						String names = list.stream().map(Channel::getName).collect(Collectors.joining(" > "));
+						return names;
+					}
+				}
+			}
+		}
+		return "";
+	}
 
+	/**
+	 * 查询所有渠道列表
+	 *
+	 * @return
+	 */
+	@PostMapping("/listAll")
+	// @PreAuthorize("@ss.hasPermi('business:salesite:list')")
+	public AjaxResult listAllSite() {
+		List<Channel> list = new ArrayList<Channel>();
+		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+		queryWrapper.eq(Channel::getLevel, 0);
+		queryWrapper.orderByDesc(Channel::getChannelId);
+		list = channelService.list(queryWrapper);
+		return AjaxResult.success(list);
+	}
 
 	/**
 	 * 新增经销商信息
@@ -118,7 +206,7 @@ public class SaleSiteMgrController extends BaseApiController {
 	@ApiOperation(value = "新增经销商信息", notes = "经销商端新增经销商")
 	@PostMapping("/create")
 	@PreAuthorize("@ss.hasPermi('business:salesite:add')")
-	public AjaxResult channelCreate(@Validated @RequestBody SaleSiteParam channelParam) {
+	public AjaxResult siteCreate(@Validated @RequestBody SaleSiteParam channelParam) {
 		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
 			return AjaxResult.error("该经销商已存在");
 		}
@@ -173,7 +261,7 @@ public class SaleSiteMgrController extends BaseApiController {
 	@ApiOperation(value = "编辑经销商信息", notes = "经销商端编辑经销商")
 	@PostMapping("/update")
 	@PreAuthorize("@ss.hasPermi('business:salesite:edit')")
-	public AjaxResult channelUpdate(@Validated @RequestBody ChannelParam channelParam) {
+	public AjaxResult siteUpdate(@Validated @RequestBody ChannelParam channelParam) {
 		if (null == channelParam || null == channelParam.getChannelId()) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
@@ -236,7 +324,7 @@ public class SaleSiteMgrController extends BaseApiController {
 	@ApiOperation(value = "停用、启用经销商信息", notes = "经销商管理编辑经销商")
 	@PostMapping("/status")
 	@PreAuthorize("@ss.hasPermi('business:salesite:edit')")
-	public AjaxResult channelStatus(@RequestBody JSONObject jsonObject) {
+	public AjaxResult siteStatus(@RequestBody JSONObject jsonObject) {
 		String channelId = jsonObject.containsKey("channelId")?jsonObject.get("channelId").toString():"";
 		String status = jsonObject.containsKey("status")?jsonObject.get("status").toString():"";
 		if (null == jsonObject || StringUtils.isBlank(channelId)
@@ -268,7 +356,7 @@ public class SaleSiteMgrController extends BaseApiController {
 	@ApiOperation(value = "查询经销商详情信息", notes = "经销商管理编辑子经销商查询经销商详情")
 	@PostMapping("/detail")
 	@PreAuthorize("@ss.hasPermi('business:salesite:query')")
-	public AjaxResult getChannelDetail(@RequestBody JSONObject jsonObject) {
+	public AjaxResult getSiteDetail(@RequestBody JSONObject jsonObject) {
 		String channelId = (null != jsonObject && jsonObject.containsKey("channelId"))?jsonObject.getString("channelId"):"";
 		if (StringUtils.isBlank(channelId)) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
@@ -283,13 +371,19 @@ public class SaleSiteMgrController extends BaseApiController {
 			userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
 			int userCnt = channelUserRelService.count(userCntQueryWrapper);
 			channelVO.setUserCnt(userCnt);
+			channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
 		}
 	    // 查询经销商销售额、佣金收入、订单数等
 	    ChannelOperDataVO channelOperDataVO = channelService.getChannelTotalOperData(channelVO.getChannelNo());
-		LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
-		queryWrapper.eq(ChannelOrder::getChannelId, channelId);
-		int orderCnt = channelOrderService.count(queryWrapper);
-		channelOperDataVO.setOrderCnt(orderCnt);
+		// LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
+		// queryWrapper.eq(ChannelOrder::getChannelId, channelId);
+//		int orderCnt = channelOrderService.count(queryWrapper);
+//		channelOperDataVO.setOrderCnt(orderCnt);
+		
+		// 盲票销售张数
+		int ticketSaleCnt = userTicketOrderService.getSaleSiteTotalTicketNumCnt(channelVO.getChannelId());
+		channelOperDataVO.setTicketSaleCnt(ticketSaleCnt);
+		
 	    channelVO.setOperData(channelOperDataVO);
 		return AjaxResult.success(channelVO);
 	}

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

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

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

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

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

@@ -3,8 +3,12 @@ package com.qs.mp.web.controller.api.channel;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelCommission;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
+import com.qs.mp.channel.domain.ChannelUserRel;
 import com.qs.mp.channel.domain.param.ChannelParam;
 import com.qs.mp.channel.domain.param.SiteQueryParam;
 import com.qs.mp.channel.domain.param.VerifyParam;
@@ -36,6 +40,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -70,6 +75,9 @@ public class ChannelController extends BaseApiController {
 
     @Autowired
     private ISysUserService userService;
+    
+	@Autowired
+	private ITicketService ticketService;
 
 	@Autowired
 	private MapperFacade mapperFacade;
@@ -341,6 +349,47 @@ public class ChannelController extends BaseApiController {
 				queryWrapper.eq("t1.certify_status", siteParam.getCertifyStatus());
 			}
 			list = channelService.selectChannelVoList(queryWrapper);
+			
+			List<Long> channelIds = new ArrayList<Long>();
+			if(null != list && list.size() > 0) {
+				for(ChannelVO channelVO : list) {
+					if(null != channelVO && null != channelVO.getChannelId()
+							&& StringUtils.isNotBlank(channelVO.getChannelNo())) {
+						channelIds.add(channelVO.getChannelId());
+	 				}
+				}
+			}
+			List<TicketCntVO>  cntList = new ArrayList<TicketCntVO>();
+			if(null != channelIds && channelIds.size() > 0) {
+				QueryWrapper<ChannelOrderDetail> ticketCntQueryWrapper = new QueryWrapper<ChannelOrderDetail>();
+				ticketCntQueryWrapper.in("t1.channel_id", channelIds);
+				cntList = ticketService.listTicketCnt(ticketCntQueryWrapper);
+			}
+			
+			if(null != list && list.size() > 0) {
+				for(ChannelVO channelVO : list) {
+					if(null != channelVO && null != channelVO.getChannelId()
+							&& StringUtils.isNotBlank(channelVO.getChannelNo())) {
+						// int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+						LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
+						userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
+						int userCnt = channelUserRelService.count(userCntQueryWrapper);
+						channelVO.setUserCnt(userCnt);
+						// 统计盲票库存, 销量
+						if(null != cntList && cntList.size() > 0) {
+							List<TicketCntVO> voList =  cntList.stream().filter(item  -> item.getChannelId().equals(channelVO.getChannelId()))
+					                .collect(Collectors.toList());
+							if(null != voList && voList.size() > 0) {
+								TicketCntVO ticketCnt =  voList.get(0);
+								channelVO.setOffLineQtyCnt(null != ticketCnt?ticketCnt.getOffLineQtyCnt():0);
+								channelVO.setOffLineSaleCnt(null != ticketCnt?ticketCnt.getOffLineSaleCnt():0);
+								channelVO.setOnLineSaleCnt(null != ticketCnt?ticketCnt.getOnLineSaleCnt():0);
+							}
+						}
+	 				}
+				}
+			}
+			
 		}
 		return getDataTable(list);
 	}

+ 1 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java

@@ -110,6 +110,7 @@ public class ChannelWithdrawController extends BaseApiController {
   }
     channelWithdraw.setUserName(param.getUserName());
     channelWithdraw.setCardNo(param.getCardNo());
+    channelWithdraw.setBankName(param.getBankName());
     channelWithdraw.setBranchName(param.getBranchName());
 
     // 缓存订单结算对象

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

@@ -115,8 +115,11 @@ public class ChannelOrderController extends BaseApiController {
             .orderByDesc(ChannelOrder::getCreatedTime));
     List<ChannelOrderVO> channelOrderVOList = mapperFacade.mapAsList(channelOrders, ChannelOrderVO.class);
     for (ChannelOrderVO channelOrderVO : channelOrderVOList) {
-      channelOrderVO.setItems(channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
-          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId())));
+    	List<ChannelOrderItem> itemList = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
+     	          .eq(ChannelOrderItem::getOrderId, channelOrderVO.getOrderId()));
+
+     	 List<ChannelOrderItemVO> itemVOList = mapperFacade.mapAsList(itemList, ChannelOrderItemVO.class);
+         channelOrderVO.setItems(itemVOList);
     }
     TableDataInfo rspData = getDataTable(channelOrders);
     rspData.setRows(channelOrderVOList);

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java

@@ -136,7 +136,7 @@ public class UserMineController extends BaseApiController {
     JSONObject result = new JSONObject();
     result.put("prizeNum", Integer.valueOf(String.valueOf(null != storageMap ? storageMap.get("total") : 0)) + couponCnt);
 
-    int ticketNum = userTicketOrderItemService.countMyTicket(userId, TicketStatusEnum.ACTIVATED);
+    int ticketNum = userTicketOrderItemService.countMyTicket(userId, null);
     result.put("ticketNum", ticketNum);
 
     UserCoin userCoin = userCoinService.getById(userId);

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

@@ -4,6 +4,7 @@ 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.user.domain.vo.UserShareVO;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
@@ -42,6 +43,11 @@ public class UserShareController extends BaseApiController {
 		String boxId = jsonObject.getString("boxId"); // 票组ID
 		String type = jsonObject.getString("type"); // 分享类型,1/2
 		Long userId = SecurityUtils.getUserId();
+		if (UserShareVO.SHARE_TYPE_SITE.equals(type)) {
+			// 经销商分享,默认到盲票小程序首页
+			String rst = wxUrlLinkService.generateUnlimitCode("", userId + "&" + type, userAppId);
+			return new AjaxResult(Type.SUCCESS, "", rst);
+		}
 		String rst = wxUrlLinkService.generateUnlimitCode("pages/ticketBox/detail", boxId + "&" + userId + "&" + type, userAppId);
 		return new AjaxResult(Type.SUCCESS, "", rst);
 	}

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

@@ -15,6 +15,7 @@ import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.BizTypeEnum;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
@@ -33,6 +34,7 @@ import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
@@ -111,21 +113,10 @@ public class UserTicketOrderController extends BaseApiController {
     }
 
     if (param.getAutoCoupon() == 1) {
-      // 系统自动选择优惠券,按照金额从大到小排序
-      List<UserCouponVO> userCouponList = userCouponService.listTicketOrderCoupon(userId);
-      for (UserCouponVO userCouponVO : userCouponList) {
-        if (orderAmt >= userCouponVO.getMinOrderAmt() && orderAmt >= userCouponVO.getDiscount()) {
-          if (userCouponVO.getUseArea() == CouponUseAreaEnum.PRE_SCOPE) {
-            // 使用范围验证
-            List<CouponTicket> couponTicketList = couponTicketService.list(new LambdaQueryWrapper<CouponTicket>()
-                .eq(CouponTicket::getCouponId, userCouponVO.getCouponId()).eq(CouponTicket::getBoxId, ticketBox.getBoxId()));
-            if (CollectionUtils.isEmpty(couponTicketList)) {
-              continue;
-            }
-          }
-          orderSettleVO.getCouponList().add(userCouponVO);
-          discountAmt = userCouponVO.getDiscount();
-        }
+      List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderAmt, ticketBox);
+      if (!CollectionUtils.isEmpty(userCouponVOList)) {
+        orderSettleVO.getCouponList().add(userCouponVOList.get(0));
+        discountAmt = userCouponVOList.get(0).getDiscount();
       }
     } else if (!CollectionUtils.isEmpty(param.getUserCouponIds())){
       // 查询指定券
@@ -146,7 +137,6 @@ public class UserTicketOrderController extends BaseApiController {
     return AjaxResult.success(orderSettleVO);
   }
 
-
   /**
    * 提交订单
    */
@@ -205,4 +195,20 @@ public class UserTicketOrderController extends BaseApiController {
     return AjaxResult.success(jsonObject);
   }
 
+  /**
+   * 取消订单
+   */
+  @PostMapping("/order/coupon/list")
+  @ApiOperation(value = "取消订单" , notes = "在订单列表页面取消")
+  public AjaxResult cancel(@RequestBody TicketOrderParam param) {
+    Long userId = SecurityUtils.getUserId();
+    TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+    if (null == orderSettleVO) {
+      return AjaxResult.error("订单已过期,请重新下单");
+    }
+    TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
+    List<UserCouponVO> userCouponVOList = userCouponService.queryUserCouponList(userId, orderSettleVO.getOrderAmt(), ticketBox);
+    return AjaxResult.success(userCouponVOList);
+  }
+
 }

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

@@ -29,7 +29,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
+                url: jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: mptest
                 password: wan789*@dfhzHu518!dr2xosn
                 # 从库数据源

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

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

+ 3 - 1
mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java

@@ -15,7 +15,9 @@ public enum CouponUseAreaEnum implements IEnum<Integer> {
 
   COMMON(0, "通用"),
   PRE_SCOPE(1, "指定范围"), // 生成优惠券的时候设定使用范围
-  POST_SCOPE(2, "指定范围"); // 发放的时候动态设定使用范围
+  POST_SCOPE(2, "指定范围"), // 门店消费类优惠券,发放的时候动态设定使用范围
+  ONLINE_SCOPE(3, "线上盲票"), // 盲票购买类优惠券,仅限线上盲票
+  OFFLINE_SCOPE(4, "线下盲票"); // 盲票购买类优惠券,仅限线下盲票
 
 
   private final int value;

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

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

+ 26 - 7
mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java

@@ -280,6 +280,24 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 			return null;
 		}
   	 }
+  	 
+  	/** 
+   	 * 取得指定日期的最晚时间
+   	 */ 
+   	 public static Date getEndTimeOfNow(Date endDate) { 
+   		try {
+ 			Calendar c = Calendar.getInstance();
+ 		   	c.setTime(endDate);
+ 		   	c.set(Calendar.HOUR_OF_DAY, 23);
+ 		   	c.set(Calendar.MINUTE, 59);
+ 		   	c.set(Calendar.SECOND, 59);
+ 		    c.set(Calendar.MILLISECOND, 59);
+ 		   	return c.getTime(); 
+ 		} catch (Exception e) {
+ 			e.printStackTrace();
+ 			return null;
+ 		}
+   	 }
     
     /** 
      * @Title: getDateOfWeek 
@@ -310,12 +328,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
             System.out.println("currentWeekOfYear_e == " +endWeekOfYear);
               
             int j = 12;  
-            for (int i=0; i < endWeekOfYear; i++) {  
+            for (int i=0; i < endWeekOfYear + 53; i++) {  
             	
             	 //只取两个日期之间的周  
-                if(startWeekOfYear > endWeekOfYear - i){  
-                    break;  
-                }  
+//                if(startWeekOfYear > endWeekOfYear - i){  
+//                    break;  
+//                }  
                 int dayOfWeek = endCalendar.get(Calendar.DAY_OF_WEEK) - 2;  
                 
                 System.out.println("dayOfWeek == " +dayOfWeek);
@@ -539,12 +557,13 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 //      list.forEach(i ->
 //              System.out.println(i)
 //      );
-//    	DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-//        String start_time = "2022-02-01";
-//		String end_time = "2022-05-30";
+    	DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//        String start_time = "2021-01-01";
+//		String end_time = "2022-01-30";
 //		List<Map<String,Object>> lsit = getDateOfWeek(dateFormat.parse(start_time), dateFormat.parse(end_time));  
 //		System.out.println(JSON.toJSONString(lsit));
 		
+		System.out.println(dateFormat.format(getPreDayOfNowZero(1)));
 		
 //		List<String> monthList = addMonths(dateFormat.parse(start_time), dateFormat.parse(end_time));
 //		System.out.println(JSON.toJSONString(monthList));

+ 23 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketCntVO.java

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @author mp
+ * @Date 2022/3/7
+ */
+@Data
+public class TicketCntVO {
+
+	// 渠道ID
+	Long channelId;
+	// 线下库存(盲票张数)
+	long offLineQtyCnt; // 线下库存(盲票张数)
+	
+	// 线下销售(线下盲票销售张数)
+	long offLineSaleCnt; // 线下销售(线下盲票销售张数)
+	
+	//  线上销售(显示盲票销售张数)
+	long onLineSaleCnt; // 线上销售(显示盲票销售张数)
+
+}

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

@@ -4,8 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.Ticket;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.qs.mp.admin.domain.TicketAwardsPrize;
-import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
+import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
+
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
 
@@ -18,4 +19,18 @@ public interface TicketMapper extends BaseMapper<Ticket> {
   Ticket getRandOne(@Param("boxId") String boxId, @Param("status") int status);
 
   List<Ticket> listTicket(@Param(Constants.WRAPPER) Wrapper<Ticket> queryWrapper);
+  
+  /**
+   * 统计经销商盲票销量,库存
+   * @param channelId
+   * @return
+   */
+  TicketCntVO getTicketCnt(@Param("channelId") Long channelId);
+  
+  /**
+   * 查询统计数据
+   * @param queryWrapper
+   * @return
+   */
+  List<TicketCntVO> listTicketCnt(@Param(Constants.WRAPPER) Wrapper<ChannelOrderDetail> queryWrapper);
 }

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

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

+ 18 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ITicketService.java

@@ -3,10 +3,14 @@ package com.qs.mp.admin.service;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.excel.TicketExcel;
+import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
 
+import org.apache.ibatis.annotations.Param;
+
 /**
  * <p>
  * 盲票 服务类
@@ -39,4 +43,18 @@ public interface ITicketService extends IService<Ticket> {
    * @return
    */
   List<Ticket> listTicket(Wrapper<Ticket> queryWrapper);
+  
+  /**
+   * 统计经销商盲票销量,库存
+   * @param channelId
+   * @return
+   */
+  TicketCntVO getTicketCnt(Long channelId);
+  
+  /**
+   * 查询统计数据
+   * @param queryWrapper
+   * @return
+   */
+  List<TicketCntVO> listTicketCnt(Wrapper<ChannelOrderDetail> queryWrapper);
 }

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

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

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketServiceImpl.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.excel.TicketExcel;
+import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.mapper.TicketMapper;
 import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.RSAUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -76,4 +78,15 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
 	public List<Ticket> listTicket(Wrapper<Ticket> queryWrapper) {
 		return getBaseMapper().listTicket(queryWrapper);
 	}
+
+	@Override
+	public TicketCntVO getTicketCnt(Long channelId) {
+		return getBaseMapper().getTicketCnt(channelId);
+	}
+
+	@Override
+	public List<TicketCntVO> listTicketCnt(Wrapper<ChannelOrderDetail> queryWrapper) {
+		return getBaseMapper().listTicketCnt(queryWrapper);
+	}
+	
 }

+ 66 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/excel/ChannelOrderExcel.java

@@ -0,0 +1,66 @@
+package com.qs.mp.channel.domain.excel;
+
+import com.qs.mp.common.annotation.Excel;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/3
+ */
+@Data
+public class ChannelOrderExcel {
+
+	@Excel(name = "盲票组名称")
+	private String title;
+
+	@Excel(name = "盲票包数量")
+	private Integer orderNum;
+
+	@Excel(name = "盲票序列号范围")
+	private String snRrange;
+
+	@Excel(name = "下单时间")
+	private Date createdTime;
+	
+	/**
+	 * 订单状态 >=1 已发货
+	 */
+	@Excel(name = "发货状态")
+	private String itemStatus;
+	
+
+	@Excel(name = "订单编号")
+	private String orderId;
+	
+	/**
+	 * 订单状态
+	 */
+	@Excel(name = "订单状态")
+	private String status;
+	
+	@Excel(name = "经销商名称")
+	private String channelName;
+	
+	@Excel(name = "经销商上级渠道名称")
+	private String parentName;  // 上级渠道名称
+
+	/**
+	 * 收货人
+	 */
+	@Excel(name = "收货人")
+	private String receiver;
+
+	/**
+	 * 收货人电话
+	 */
+	@Excel(name = "联系电话")
+	private String tel;
+
+	/**
+	 * (省-市-区-详细地址)
+	 */
+	@Excel(name = "收货地址")
+	private String address;
+
+}

+ 3 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOperDataVO.java

@@ -14,5 +14,7 @@ public class ChannelOperDataVO {
   long newUserCnt; // 新增用户数
   String name; // 渠道名称
   String mobile; // 手机号
-  int orderCnt; // 新增用户数
+  int orderCnt; // 订单数
+  
+  long ticketSaleCnt; // 盲票销量
 }

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

@@ -12,7 +12,7 @@ import lombok.Data;
 @Data
 public class ChannelOrderVO extends ChannelOrder {
 
-  private List<ChannelOrderItem> items;
+  private List<ChannelOrderItemVO> items;
 
   private String channelName;  // 经销商名称
   

+ 10 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelVO.java

@@ -13,9 +13,19 @@ import lombok.Data;
 public class ChannelVO extends Channel {
   long siteCnt;   // 经销网点数
   long userCnt;   // 经销用户数
+  
   String parentName; // 上级渠道名称
+  
   long orderCnt;   // 订单数
   int childCnt;  // 子渠道数量
   ChannelOperDataVO operData;  // 经营数据
   // SysUser sysUser;  // 关联的用户账号信息
+  
+  String parentsName; // 所有上级渠道名称 eg: 一级渠道 > 上N级渠道 ** > 上级渠道
+  
+  long offLineQtyCnt; // 线下库存(盲票张数)
+  long offLineSaleCnt; // 线下销售(线下盲票销售张数)
+  long onLineSaleCnt; // 线上销售(显示盲票销售张数)
+  
+  
 }

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

@@ -26,4 +26,13 @@ public interface ChannelOrderMapper extends BaseMapper<ChannelOrder> {
 	 * @return
 	 */
 	public List<ChannelOrderVO> selectChannelOrderVoList(@Param(Constants.WRAPPER) Wrapper<ChannelOrder> wrapper);
+	
+	
+	/**
+	 * 查询满足筛选条件的经销商订单数量
+	 *
+	 * @param wrapper
+	 * @return
+	 */
+	int selectChannelOrderCount(@Param(Constants.WRAPPER) Wrapper<ChannelOrder> wrapper);
 }

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

@@ -1,6 +1,8 @@
 package com.qs.mp.channel.service;
 
+import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 
 import java.util.List;
 
@@ -62,4 +64,14 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
 	 * @return
 	 */
 	public List<ChannelOrderVO> selectChannelOrderVoList(Wrapper<ChannelOrder> wrapper);
+	
+	
+	/**
+	 * 查询满足筛选条件的经销商订单数量
+	 *
+	 * @param wrapper
+	 * @return
+	 */
+	int selectChannelOrderCount(Wrapper<ChannelOrder> wrapper);
+	
 }

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

@@ -282,4 +282,11 @@ public class ChannelOrderServiceImpl extends
 	public List<ChannelOrderVO> selectChannelOrderVoList(Wrapper<ChannelOrder> wrapper) {
 		return getBaseMapper().selectChannelOrderVoList(wrapper);
 	}
+
+	@Override
+	public int selectChannelOrderCount(Wrapper<ChannelOrder> wrapper) {
+		return getBaseMapper().selectChannelOrderCount(wrapper);
+	}
+	
+	
 }

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

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

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

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

+ 20 - 5
mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java

@@ -24,33 +24,48 @@ public interface UserTicketOrderMapper extends BaseMapper<UserTicketOrder> {
 	   * @param wrapper
 	   * @return
 	   */
-	  List<IndexVO> selectIndexPayAmtList(@Param(Constants.WRAPPER) Wrapper<UserDeliverOrder> wrapper);
+	  List<IndexVO> selectIndexPayAmtList(@Param(Constants.WRAPPER) Wrapper<UserTicketOrder> wrapper);
 	  
 	  /**
 	   * 统计交易用户数
 	   * @param wrapper
 	   * @return
 	   */
-	  List<IndexVO> selectIndexPayUserCntList(@Param(Constants.WRAPPER) Wrapper<UserDeliverOrder> wrapper);
+	  List<IndexVO> selectIndexPayUserCntList(@Param(Constants.WRAPPER) Wrapper<UserTicketOrder> wrapper);
 	  
 	  /**
 	   * 统计实时交易数据
 	   * @param wrapper
 	   * @return
 	   */
-	  List<IndexVO> selectIndexDailyInfoList(@Param(Constants.WRAPPER) Wrapper<UserDeliverOrder> wrapper);
+	  List<IndexVO> selectIndexDailyInfoList(@Param(Constants.WRAPPER) Wrapper<UserTicketOrder> wrapper);
 	  
 	  /**
 	   * 统计票组销售TOP10
 	   * @param wrapper
 	   * @return
 	   */
-	  List<IndexVO> selectIndexTicketBoxTop(@Param(Constants.WRAPPER) Wrapper<UserDeliverOrder> wrapper);
+	  List<IndexVO> selectIndexTicketBoxTop(@Param(Constants.WRAPPER) Wrapper<UserTicketOrder> wrapper);
 	  
 	  /**
 	   * 统计经销商交易额TOP10
 	   * @param wrapper
 	   * @return
 	   */
-	  List<IndexVO> selectIndexTicketSiteTop(@Param(Constants.WRAPPER) Wrapper<UserDeliverOrder> wrapper);
+	  List<IndexVO> selectIndexTicketSiteTop(@Param(Constants.WRAPPER) Wrapper<UserTicketOrder> wrapper);
+	  
+	  /**
+	   * 查询子渠道全部的盲票销售张数
+	   * @param channelNo
+	   * @return
+	   */
+	  int getChannelTotalTicketNumCnt(@Param("channelNo") String channelNo);
+	  
+	  /**
+	   * 查询经销商的盲票销售张数
+	   * @param channelNo
+	   * @return
+	   */
+	  int getSaleSiteTotalTicketNumCnt(@Param("channelId") Long channelId);
+	  
 }

+ 10 - 7
mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java

@@ -2,6 +2,7 @@ package com.qs.mp.user.service;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.user.domain.UserCoupon;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -19,13 +20,6 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface IUserCouponService extends IService<UserCoupon> {
 
-  /**
-   * 查询用户当前可用于盲票购买的优惠券,按优惠大小排序
-   * @param userId
-   * @return
-   */
-  List<UserCouponVO> listTicketOrderCoupon(Long userId);
-
   /**
    * 根据用户优惠券ID列表查询
    * @param userCouponIds
@@ -46,4 +40,13 @@ public interface IUserCouponService extends IService<UserCoupon> {
    * @return
    */
   List<UserCouponVO> listUserCouponVO(Wrapper<UserCoupon> queryWrapper);
+
+  /**
+   * 查询盲票购买可用优惠券
+   * @param userId
+   * @param orderAmt
+   * @param ticketBox
+   * @return
+   */
+  List<UserCouponVO> queryUserCouponList(Long userId, Integer orderAmt, TicketBox ticketBox);
 }

+ 23 - 5
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java

@@ -10,6 +10,8 @@ import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 import com.qs.mp.user.domain.vo.UserShareVO;
 import java.util.List;
 
+import org.apache.ibatis.annotations.Param;
+
 /**
  * <p>
  * 用户盲票订单 服务类
@@ -64,21 +66,21 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
    * @param wrapper
    * @return
    */
-  List<IndexVO> selectIndexPayAmtList(Wrapper<UserDeliverOrder> wrapper);
+  List<IndexVO> selectIndexPayAmtList(Wrapper<UserTicketOrder> wrapper);
   
   /**
    * 统计交易用户数
    * @param wrapper
    * @return
    */
-  List<IndexVO> selectIndexPayUserCntList(Wrapper<UserDeliverOrder> wrapper);
+  List<IndexVO> selectIndexPayUserCntList(Wrapper<UserTicketOrder> wrapper);
   
   /**
    * 统计实时交易数据
    * @param wrapper
    * @return
    */
-  List<IndexVO> selectIndexDailyInfoList(Wrapper<UserDeliverOrder> wrapper);
+  List<IndexVO> selectIndexDailyInfoList(Wrapper<UserTicketOrder> wrapper);
   
   
   /**
@@ -86,13 +88,29 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
    * @param wrapper
    * @return
    */
-  List<IndexVO> selectIndexTicketBoxTop(Wrapper<UserDeliverOrder> wrapper);
+  List<IndexVO> selectIndexTicketBoxTop(Wrapper<UserTicketOrder> wrapper);
   
   /**
    * 统计经销商交易额TOP10
    * @param wrapper
    * @return
    */
-  List<IndexVO> selectIndexTicketSiteTop(Wrapper<UserDeliverOrder> wrapper);
+  List<IndexVO> selectIndexTicketSiteTop(Wrapper<UserTicketOrder> wrapper);
+  
+
+ /**
+ * 查询子渠道全部的盲票销售张数
+ * @param channelNo
+ * @return
+  */
+  int getChannelTotalTicketNumCnt(String channelNo);
+  
+
+  /**
+  * 查询子渠道全部的盲票销售张数
+  * @param channelNo
+  * @return
+   */
+   int getSaleSiteTotalTicketNumCnt(Long channelId);
   
 }

+ 65 - 13
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java

@@ -1,17 +1,26 @@
 package com.qs.mp.user.service.impl;
 
 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.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.CouponTicket;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.service.ICouponTicketService;
 import com.qs.mp.common.enums.CouponTypeEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.user.domain.UserCoupon;
 import com.qs.mp.user.domain.vo.UserCouponVO;
 import com.qs.mp.user.mapper.UserCouponMapper;
 import com.qs.mp.user.service.IUserCouponService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.Iterator;
 import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -22,22 +31,17 @@ import org.springframework.stereotype.Service;
  * @since 2022-03-07
  */
 @Service
-public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements IUserCouponService {
+public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements
+    IUserCouponService {
 
-  @Override
-  public List<UserCouponVO> listTicketOrderCoupon(Long userId) {
-    List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(new QueryWrapper<UserCoupon>()
-        .eq("t1.user_id", userId).eq("t2.type", CouponTypeEnum.TICKET_ORDER)
-        .eq("t1.status", UserCouponStatusEnum.UNUSED)
-        .le("t1.valid_start", DateUtils.getToday()).ge("t1.valid_end", DateUtils.getToday())
-        .orderByDesc("t2.discount"));
-    return userCouponVOList;
-  }
+  @Autowired
+  private ICouponTicketService couponTicketService;
 
   @Override
   public List<UserCouponVO> listTicketOrderCouponByIds(List<String> userCouponIds) {
-    List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(new QueryWrapper<UserCoupon>()
-        .in("t1.id", userCouponIds));
+    List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(
+        new QueryWrapper<UserCoupon>()
+            .in("t1.id", userCouponIds));
     return userCouponVOList;
   }
 
@@ -63,4 +67,52 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
   public List<UserCouponVO> listUserCouponVO(Wrapper<UserCoupon> queryWrapper) {
     return getBaseMapper().listUserCouponVO(queryWrapper);
   }
+
+  @Override
+  public List<UserCouponVO> queryUserCouponList(Long userId, Integer orderAmt,
+      TicketBox ticketBox) {
+    // 系统自动选择优惠券,按照金额从大到小排序
+    List<UserCouponVO> userCouponList = listTicketOrderCoupon(userId, orderAmt);
+    Iterator<UserCouponVO> iterator = userCouponList.iterator();
+    while (iterator.hasNext()) {
+      UserCouponVO userCouponVO = iterator.next();
+      // 校验使用范围
+      if (userCouponVO.getUseArea() == CouponUseAreaEnum.PRE_SCOPE) {
+        // 指定盲票
+        List<CouponTicket> couponTicketList = couponTicketService.list(
+            new LambdaQueryWrapper<CouponTicket>()
+                .eq(CouponTicket::getCouponId, userCouponVO.getCouponId())
+                .eq(CouponTicket::getBoxId, ticketBox.getBoxId()));
+        if (CollectionUtils.isEmpty(couponTicketList)) {
+          iterator.remove();
+          continue;
+        }
+      } else if (userCouponVO.getUseArea() == CouponUseAreaEnum.ONLINE_SCOPE) {
+        // 线上票
+        if (ticketBox.getType() != TicketTypeEnum.ONLINE) {
+          iterator.remove();
+          continue;
+        }
+      } else if (userCouponVO.getUseArea() == CouponUseAreaEnum.OFFLINE_SCOPE) {
+        // 线下票
+        if (ticketBox.getType() != TicketTypeEnum.OFFLINE) {
+          iterator.remove();
+          continue;
+        }
+      }
+    }
+    return userCouponList;
+  }
+
+  private List<UserCouponVO> listTicketOrderCoupon(Long userId, Integer orderAmt) {
+    List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(
+        new QueryWrapper<UserCoupon>()
+            .eq("t1.user_id", userId).eq("t2.type", CouponTypeEnum.TICKET_ORDER)
+            .eq("t1.status", UserCouponStatusEnum.UNUSED)
+            .le("t1.valid_start", DateUtils.getToday()).ge("t1.valid_end", DateUtils.getToday())
+            .le("t2.min_order_amt", orderAmt)
+            .le("t2.discount", orderAmt)
+            .orderByDesc("t2.discount"));
+    return userCouponVOList;
+  }
 }

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

@@ -47,7 +47,7 @@ public class UserTicketOrderItemServiceImpl extends ServiceImpl<UserTicketOrderI
   public int countMyTicket(Long userId, TicketStatusEnum status) {
     return getBaseMapper().countMyTicket(new QueryWrapper<UserTicketOrderItem>()
         .eq("t1.user_id", userId).eq("t2.status", UserTicketOrderStatusEnum.FINISHED)
-        .eq("t3.status", status));
+        .eq(null != status, "t3.status", status));
   }
 
   @Override

+ 14 - 9
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -473,32 +473,37 @@ public class UserTicketOrderServiceImpl extends
   }
 
 	@Override
-	public List<IndexVO> selectIndexPayAmtList(Wrapper<UserDeliverOrder> wrapper) {
+	public List<IndexVO> selectIndexPayAmtList(Wrapper<UserTicketOrder> wrapper) {
 		return getBaseMapper().selectIndexPayAmtList(wrapper);
 	}
 	
 	@Override
-	public List<IndexVO> selectIndexPayUserCntList(Wrapper<UserDeliverOrder> wrapper) {
+	public List<IndexVO> selectIndexPayUserCntList(Wrapper<UserTicketOrder> wrapper) {
 		return getBaseMapper().selectIndexPayUserCntList(wrapper);
 	}
 
 	@Override
-	public List<IndexVO> selectIndexDailyInfoList(Wrapper<UserDeliverOrder> wrapper) {
+	public List<IndexVO> selectIndexDailyInfoList(Wrapper<UserTicketOrder> wrapper) {
 		return getBaseMapper().selectIndexDailyInfoList(wrapper);
 	}
 
 	@Override
-	public List<IndexVO> selectIndexTicketBoxTop(Wrapper<UserDeliverOrder> wrapper) {
+	public List<IndexVO> selectIndexTicketBoxTop(Wrapper<UserTicketOrder> wrapper) {
 		return getBaseMapper().selectIndexTicketBoxTop(wrapper);
 	}
 
 	@Override
-	public List<IndexVO> selectIndexTicketSiteTop(Wrapper<UserDeliverOrder> wrapper) {
+	public List<IndexVO> selectIndexTicketSiteTop(Wrapper<UserTicketOrder> wrapper) {
 		return getBaseMapper().selectIndexTicketSiteTop(wrapper);
 	}
+
+	@Override
+	public int getChannelTotalTicketNumCnt(String channelNo) {
+		return getBaseMapper().getChannelTotalTicketNumCnt(channelNo);
+	}
 	
-	
-	
-	
-	
+	@Override
+	public int getSaleSiteTotalTicketNumCnt(Long channelId) {
+		return getBaseMapper().getSaleSiteTotalTicketNumCnt(channelId);
+	}
 }

+ 24 - 0
mp-service/src/main/resources/mapper/admin/TicketMapper.xml

@@ -43,4 +43,28 @@
         on t1.ticket_id = t2.ticket_id
 
     </select>
+    
+    <select id="getTicketCnt" resultType="com.qs.mp.admin.domain.vo.TicketCntVO">
+       select
+		 SUM( CASE WHEN (t2.`status` != 1 and t3.type = 'online') THEN 1 ELSE 0 END ) AS onLineSaleCnt,
+		 SUM( CASE WHEN (t2.`status` != 1 and t3.type = 'offline') THEN 1 ELSE 0 END ) AS offLineSaleCnt,
+		 SUM( CASE WHEN (t2.`status` = 1 and t3.type = 'offline') THEN 1 ELSE 0 END ) AS offLineQtyCnt
+		from mp_channel_order_detail t1
+		left join mp_ticket t2 on t1.pkg_id = t2.pkg_id
+		left join mp_ticket_box t3 on t2.box_id = t3.box_id
+		where t1.channel_id = #{channelId};
+    </select>
+    
+     <select id="listTicketCnt" resultType="com.qs.mp.admin.domain.vo.TicketCntVO">
+       select
+         t1.channel_id channelId,
+		 SUM( CASE WHEN (t2.`status` != 1 and t3.type = 'online') THEN 1 ELSE 0 END ) AS onLineSaleCnt,
+		 SUM( CASE WHEN (t2.`status` != 1 and t3.type = 'offline') THEN 1 ELSE 0 END ) AS offLineSaleCnt,
+		 SUM( CASE WHEN (t2.`status` = 1 and t3.type = 'offline') THEN 1 ELSE 0 END ) AS offLineQtyCnt
+		from mp_channel_order_detail t1
+		left join mp_ticket t2 on t1.pkg_id = t2.pkg_id
+		left join mp_ticket_box t3 on t2.box_id = t3.box_id
+		${ew.customSqlSegment}
+		GROUP BY t1.channel_id
+    </select>
 </mapper>

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

@@ -32,7 +32,7 @@
         order_id, channel_id, title, order_amt, discount_amt, freight_amt, pay_amt, status, pkg_num, memo, receiver, tel, province, city, area, address, delivery_id, delivery_flow_id, delivery_time, created_time, updated_time
     </sql>
     
-    <!-- 查询用户提货订单列表 -->
+    <!-- 查询经销商订单列表 -->
     <select id="selectChannelOrderVoList" resultType="com.qs.mp.channel.domain.vo.ChannelOrderVO">
 		select DISTINCT t1.* , t2.name channelName, t3.name parentName
 		from mp_channel_order t1
@@ -40,5 +40,15 @@
 		left join mp_channel t3 on t2.parent_id = t3.channel_id
 		${ew.customSqlSegment}
 	</select>
+	
+	
+	<!-- 查询经销商订单数量 -->
+    <select id="selectChannelOrderCount" resultType="integer">
+		select count(DISTINCT t1.order_id) 
+		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>
 
 </mapper>

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

@@ -94,5 +94,21 @@
 		ORDER BY pay_amt DESC limit 10 ) a
 		left join mp_channel b on a.channel_id = b.channel_id
 	</select>
+	
+	 <!-- 查询子渠道全部的盲票销量 -->
+    <select id="getChannelTotalTicketNumCnt" resultType="integer">
+		select IFNULL(SUM(t1.ticket_num),0) as ticketNum
+		from mp_user_ticket_order t1
+		left join mp_channel t2 on t1.channel_id = t2.channel_id
+		where (t2.channel_no like concat(#{channelNo},'.%') or t2.channel_no = #{channelNo})
+		and t1.`status` = 1
+	</select>
+	
+	<!-- 查询经销商的盲票销量 -->
+    <select id="getSaleSiteTotalTicketNumCnt" resultType="integer">
+		select IFNULL(SUM(t1.ticket_num),0) as ticketNum
+		from mp_user_ticket_order t1
+		where t1.`status` = 1 and t1.channel_id = #{channelId}
+	</select>
     
 </mapper>