Browse Source

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

Liugl 3 years ago
parent
commit
7f2e4f3c7f
24 changed files with 514 additions and 94 deletions
  1. 134 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  2. 20 5
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  3. 16 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  4. 6 10
      mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java
  5. 49 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java
  6. 1 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java
  7. 5 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  8. 6 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserShareController.java
  9. 22 16
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  10. 4 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelOrderStatusEnum.java
  11. 3 1
      mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java
  12. 41 0
      mp-common/src/main/java/com/qs/mp/common/enums/PayOrderStatusEnum.java
  13. 1 1
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java
  14. 2 11
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  15. 66 0
      mp-service/src/main/java/com/qs/mp/channel/domain/excel/ChannelOrderExcel.java
  16. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderVO.java
  17. 9 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelOrderMapper.java
  18. 9 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java
  19. 7 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  20. 3 3
      mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java
  21. 23 19
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  22. 10 7
      mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java
  23. 65 13
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java
  24. 11 1
      mp-service/src/main/resources/mapper/channel/ChannelOrderMapper.xml

+ 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);
+	}
 }

+ 20 - 5
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -89,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<>();
@@ -181,6 +181,21 @@ public class SaleSiteMgrController extends BaseApiController {
 		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);
+	}
 
 	/**
 	 * 新增经销商信息
@@ -191,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("该经销商已存在");
 		}
@@ -246,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);
 		}
@@ -309,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)
@@ -341,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);

+ 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);

+ 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);
+  }
+
 }

+ 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();
+  }
+}

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

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

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

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

+ 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;
+
+}

+ 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;  // 经销商名称
   

+ 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);
 }

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

@@ -65,4 +65,13 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
 	 */
 	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);
     }
   }
 

+ 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);
 }

+ 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;
+  }
 }

+ 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>