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

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

Mp server test

See merge request quanshu/mp-server!424
zhong chunping пре 3 година
родитељ
комит
2372412e89
68 измењених фајлова са 1915 додато и 441 уклоњено
  1. 7 0
      mp-admin/pom.xml
  2. 3 0
      mp-admin/src/main/java/com/qs/mp/web/controller/BaseController.java
  3. 6 25
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java
  4. 73 20
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  5. 10 50
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  6. 66 16
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java
  7. 13 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelInviteController.java
  8. 187 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelMyTicketController.java
  9. 52 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  10. 47 7
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  11. 39 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java
  12. 5 2
      mp-admin/src/main/java/com/qs/mp/web/controller/common/FileUploadController.java
  13. 106 0
      mp-admin/src/main/java/com/qs/mp/web/controller/common/LogisticsController.java
  14. 12 0
      mp-admin/src/main/java/com/qs/mp/web/core/config/SwaggerConfig.java
  15. 0 5
      mp-admin/src/main/resources/application-test.yml
  16. 6 0
      mp-admin/src/main/resources/application.yml
  17. 4 10
      mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java
  18. 36 0
      mp-common/src/main/java/com/qs/mp/common/enums/DeliverTypeEnum.java
  19. 44 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgSaleStatusEnum.java
  20. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgStatusEnum.java
  21. 7 0
      mp-quartz/pom.xml
  22. 40 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/ChannelOrderTask.java
  23. 0 179
      mp-quartz/src/main/java/com/qs/mp/quartz/task/CosTask.java
  24. 7 2
      mp-quartz/src/main/java/com/qs/mp/quartz/task/DayStatTask.java
  25. 0 78
      mp-quartz/src/main/java/com/qs/mp/quartz/task/PictureTask.java
  26. 79 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/TicketPkgDataTask.java
  27. 66 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/UserDeliverOrderTask.java
  28. 17 0
      mp-service/src/main/java/com/qs/mp/admin/domain/Ticket.java
  29. 20 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketPackage.java
  30. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderShipParam.java
  31. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserDeliverOrderShipParam.java
  32. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketListVO.java
  33. 4 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  34. 33 0
      mp-service/src/main/java/com/qs/mp/channel/domain/Channel.java
  35. 29 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrder.java
  36. 79 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelTicketTransfer.java
  37. 27 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelMyTicketQueryParam.java
  38. 29 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelTicketTransferParam.java
  39. 60 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelMyTicketVO.java
  40. 5 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderInfoVO.java
  41. 32 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelTicketTransferDetailVO.java
  42. 18 10
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelMapper.java
  43. 16 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelOrderDetailMapper.java
  44. 34 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelTicketTransferMapper.java
  45. 11 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderDetailService.java
  46. 20 4
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelService.java
  47. 44 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelTicketTransferService.java
  48. 26 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderDetailServiceImpl.java
  49. 10 3
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  50. 20 4
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java
  51. 76 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelTicketTransferServiceImpl.java
  52. 35 0
      mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java
  53. 27 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrder.java
  54. 18 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrderItem.java
  55. 12 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/DeliverOrderVO.java
  56. 11 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/OrderDeliverItemVO.java
  57. 6 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserDeliverOrderItemVO.java
  58. 7 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserDeliverOrderVO.java
  59. 9 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderService.java
  60. 14 2
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderItemServiceImpl.java
  61. 79 5
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java
  62. 8 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  63. 6 3
      mp-service/src/main/resources/mapper/admin/TicketPackageMapper.xml
  64. 50 9
      mp-service/src/main/resources/mapper/channel/ChannelMapper.xml
  65. 19 0
      mp-service/src/main/resources/mapper/channel/ChannelOrderDetailMapper.xml
  66. 53 0
      mp-service/src/main/resources/mapper/channel/ChannelTicketTransferMapper.xml
  67. 1 1
      mp-service/src/main/resources/mapper/user/UserDeliverOrderItemMapper.xml
  68. 3 1
      mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

+ 7 - 0
mp-admin/pom.xml

@@ -17,6 +17,13 @@
 
     <dependencies>
 
+        <!--快递100SDK-->
+        <dependency>
+            <groupId>com.github.kuaidi100-api</groupId>
+            <artifactId>sdk</artifactId>
+            <version>1.0.8</version>
+        </dependency>
+
         <!-- swagger 增强-->
         <dependency>
             <groupId>com.github.xiaoymin</groupId>

+ 3 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/BaseController.java

@@ -2,14 +2,17 @@ package com.qs.mp.web.controller;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.qs.mp.common.constant.HttpStatus;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.PageDomain;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.page.TableSupport;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.common.utils.sql.SqlUtil;
+import com.qs.mp.core.domain.LoginUser;
 import java.beans.PropertyEditorSupport;
 import java.util.Date;
 import java.util.List;

+ 6 - 25
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java

@@ -59,7 +59,7 @@ public class ChannelMgrController extends BaseApiController {
 
 	@Autowired
 	private IChannelOrderService channelOrderService;
-	
+
 	@Autowired
 	private IUserTicketOrderService userTicketOrderService;
 
@@ -144,26 +144,7 @@ public class ChannelMgrController extends BaseApiController {
 		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());
-		queryWrapper.orderByAsc("t1.level").orderByDesc("t1.channel_id");
-		list = channelService.selectChannelVoList(queryWrapper);
-		if(null != list && list.size() > 0) {
-			for(ChannelVO channelVO : list) {
-				if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
-					int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
-					int userCnt = channelUserRelService.getChannelTotalUserCnt(channelVO.getChannelNo());
-					channelVO.setSiteCnt(siteCnt);
-					channelVO.setUserCnt(userCnt);
-					// 查询用户信息
-					// SysUser sysUser = userService.selectUserById(channelVO.getUserId());
-					// channelVO.setSysUser(sysUser);
-					// 查询子渠道数量
-					int childCnt = channelService.count(
-							new LambdaQueryWrapper<Channel>().eq(Channel::getParentId, channelVO.getChannelId())
-							.gt(Channel::getLevel, 0));
-					channelVO.setChildCnt(childCnt);
- 				}
-			}
-		}
+		list = channelService.selectChannelList(queryWrapper);
 		return getDataTable(list);
 	}
 
@@ -256,7 +237,7 @@ public class ChannelMgrController extends BaseApiController {
 		}
 		boolean mobileChange = false;  // 手机号码是否有变更
 		if(!channel.getMobile().equals(oldChannel.getMobile())) {
-			
+
 			int mobileCount = channelService.count(
 			        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
 			if(mobileCount > 0) {
@@ -355,15 +336,15 @@ public class ChannelMgrController extends BaseApiController {
 		//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)) {

+ 73 - 20
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -27,9 +27,7 @@ import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.domain.DeliveryCompany;
-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.enums.*;
 import com.qs.mp.common.service.IDeliveryCompanyService;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
@@ -44,6 +42,10 @@ import io.swagger.annotations.ApiOperation;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 
@@ -161,6 +163,9 @@ public class ChannelOrderMgrController extends BaseApiController {
   @Log(title = "经销商订单发货", businessType = BusinessType.UPDATE)
   @PostMapping("/ship")
   @ApiOperation(value = "订单发货" , notes = "在订单发货页面提交")
+  @ApiResponses(
+		  @ApiResponse(code = 200, message = "操作成功", response = AjaxResult.class)
+  )
   @PreAuthorize("@ss.hasPermi('order:channel:ship')")
   public AjaxResult ship(@RequestBody ChannelOrderShipParam shipParam) {
 		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
@@ -172,15 +177,36 @@ public class ChannelOrderMgrController extends BaseApiController {
 				|| null == order.getChannelId()) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
+		Integer deliveryType = shipParam.getDeliveryType();
+	  if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+		  if (Objects.isNull(shipParam.getDeliveryId())) {
+			  return AjaxResult.error("快递公司不能为空");
+		  }
+		  if (StringUtils.isBlank(shipParam.getDeliveryFlowId())) {
+			  return AjaxResult.error("快递单号不能为空");
+		  }
+	  }
 
 		if(null != shipParam && null != shipParam.getPkgIds()
 				&& shipParam.getPkgIds().size() > 0) {
 			ChannelOrder channelOrder = new ChannelOrder();
-			channelOrder.setOrderId(shipParam.getOrderId());
-			channelOrder.setChannelId(order.getChannelId());
-			channelOrder.setDeliveryId(shipParam.getDeliveryId());
-			channelOrder.setDeliveryFlowId(shipParam.getDeliveryFlowId());
-			channelOrder.setDeliveryTime(new Date());
+
+
+
+			if (DeliverTypeEnum.NO_DELIVER.getValue().equals(deliveryType)) {
+				// 无需物流,设置发货时间为当前时间
+				channelOrder.setOrderId(shipParam.getOrderId());
+				channelOrder.setChannelId(order.getChannelId());
+				channelOrder.setDeliveryTime(new Date());
+
+			} else if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+				// 快递发货,设置物流信息
+				channelOrder.setOrderId(shipParam.getOrderId());
+				channelOrder.setChannelId(order.getChannelId());
+				channelOrder.setDeliveryId(shipParam.getDeliveryId());
+				channelOrder.setDeliveryFlowId(shipParam.getDeliveryFlowId());
+				channelOrder.setDeliveryTime(new Date());
+			}
 			boolean rtn = channelOrderService.channelOrderShip(channelOrder, shipParam.getPkgIds());
 			return rtn ? AjaxResult.success() : AjaxResult.error("发货失败");
 		}
@@ -193,10 +219,12 @@ public class ChannelOrderMgrController extends BaseApiController {
 	@Log(title = "经销商订单发货单号修改", businessType = BusinessType.UPDATE)
 	@PostMapping("/ship/update")
 	@ApiOperation(value = "订单发货单号修改" , notes = "在订单发货页面提交")
+	@ApiResponses(
+			@ApiResponse(code = 200, message = "操作成功", response = AjaxResult.class)
+	)
 	@PreAuthorize("@ss.hasPermi('order:channel:ship')")
 	public AjaxResult updateShipInfo(@RequestBody ChannelOrderShipParam shipParam) {
-		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())
-			|| null == shipParam.getDeliveryId() || StringUtils.isBlank(shipParam.getDeliveryFlowId())) {
+		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 
@@ -206,10 +234,35 @@ public class ChannelOrderMgrController extends BaseApiController {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 
-		boolean rtn = channelOrderService.update(new LambdaUpdateWrapper<ChannelOrder>()
-				.set(ChannelOrder::getDeliveryId, shipParam.getDeliveryId())
-				.set(ChannelOrder::getDeliveryFlowId, shipParam.getDeliveryFlowId())
-				.eq(ChannelOrder::getOrderId, shipParam.getOrderId()));
+		Integer deliveryType = shipParam.getDeliveryType();
+		if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+			if (Objects.isNull(shipParam.getDeliveryId())) {
+				return AjaxResult.error("快递公司不能为空");
+			}
+			if (StringUtils.isBlank(shipParam.getDeliveryFlowId())) {
+				return AjaxResult.error("快递单号不能为空");
+			}
+		}
+
+
+		boolean rtn = false;
+		if (DeliverTypeEnum.NO_DELIVER.getValue().equals(deliveryType)) {
+			// 无需物流,设置单号为空,物流公司为空
+			rtn = channelOrderService.update(new LambdaUpdateWrapper<ChannelOrder>()
+					.set(ChannelOrder::getDeliveryId, null)
+					.set(ChannelOrder::getDeliveryFlowId, null)
+					.set(ChannelOrder::getStatus, DeliverOrderStatusEnum.FINISHED)
+					.eq(ChannelOrder::getOrderId, shipParam.getOrderId()));
+
+		} else if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+			// 快递发货,原逻辑
+			rtn = channelOrderService.update(new LambdaUpdateWrapper<ChannelOrder>()
+					.set(ChannelOrder::getDeliveryId, shipParam.getDeliveryId())
+					.set(ChannelOrder::getDeliveryFlowId, shipParam.getDeliveryFlowId())
+					.eq(ChannelOrder::getOrderId, shipParam.getOrderId()));
+		}
+
+
 		return rtn ? AjaxResult.success() : AjaxResult.error("修改失败");
 
 	}
@@ -260,9 +313,9 @@ public class ChannelOrderMgrController extends BaseApiController {
 		}
 		return AjaxResult.success(list);
 	}
-	
-	
-	
+
+
+
 	@Log(title = "提货订单导出", businessType = BusinessType.EXPORT)
 	@PostMapping("/export")
 	@PreAuthorize("@ss.hasPermi('order:channel:export')")
@@ -279,12 +332,12 @@ public class ChannelOrderMgrController extends BaseApiController {
 		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;
@@ -334,7 +387,7 @@ public class ChannelOrderMgrController extends BaseApiController {
 			  	channelOrderVO.setItems(itemVOList);
 		    }
 		}
-	    
+
 		if (null != listAll && listAll.size() > 0) {
 			// listAll.sort(Comparator.comparing(UserDeliverOrderVO::getOrderId));
 			for (ChannelOrderVO channelOrder : listAll) {

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

@@ -68,13 +68,13 @@ public class SaleSiteMgrController extends BaseApiController {
 
 	@Autowired
 	private IChannelOrderService channelOrderService;
-	
+
 	@Autowired
 	private IUserTicketOrderService userTicketOrderService;
 
 	@Autowired
 	private ISysUserService userService;
-	
+
 	@Autowired
 	private ITicketService ticketService;
 
@@ -102,30 +102,8 @@ public class SaleSiteMgrController extends BaseApiController {
 		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());
-		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 && null != channelVO.getChannelId()
-						&& StringUtils.isNotBlank(channelVO.getChannelNo())) {
-					channelIds.add(channelVO.getChannelId());
- 				}
-			}
-		}
-		List<TicketCntVO>  qtyCntList = new ArrayList<TicketCntVO>();
-		List<TicketCntVO>  saleCntList = new ArrayList<TicketCntVO>();
-		if(null != channelIds && channelIds.size() > 0) {
-			QueryWrapper<ChannelOrderDetail> ticketQtyCntQueryWrapper = new QueryWrapper<ChannelOrderDetail>();
-			ticketQtyCntQueryWrapper.in("t1.channel_id", channelIds);
-			qtyCntList = ticketService.listTicketQtyCnt(ticketQtyCntQueryWrapper);
-			
-	    	QueryWrapper<UserTicketOrder> ticketSaleCntQueryWrapper = new QueryWrapper<UserTicketOrder>();
-	    	ticketSaleCntQueryWrapper.in("t1.channel_id", channelIds);
-	    	ticketSaleCntQueryWrapper.eq("t1.`status`", 1);
-	    	saleCntList = userTicketOrderService.listTicketSaleCnt(ticketSaleCntQueryWrapper);
-		}
-		
+		list = channelService.selectSaleSiteList(queryWrapper);
+
 		if(null != list && list.size() > 0) {
 			for(ChannelVO channelVO : list) {
 				if(null != channelVO && null != channelVO.getChannelId()
@@ -139,30 +117,12 @@ public class SaleSiteMgrController extends BaseApiController {
 					//SysUser sysUser = userService.selectUserById(channelVO.getUserId());
 					// channelVO.setSysUser(sysUser);
 					channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
-					// 统计盲票库存, 销量
-					if(null != qtyCntList && qtyCntList.size() > 0) {
-						List<TicketCntVO> voList =  qtyCntList.stream().filter(item  -> item.getChannelId().equals(channelVO.getChannelId()))
-				                .collect(Collectors.toList());
-						if(null != voList && voList.size() > 0) {
-							TicketCntVO ticketQtyCnt =  voList.get(0);
-							channelVO.setOffLineQtyCnt(null != ticketQtyCnt?ticketQtyCnt.getOffLineQtyCnt():0);
-						}
-					}
-					if(null != saleCntList && saleCntList.size() > 0) {
-						List<TicketCntVO> voList =  saleCntList.stream().filter(item  -> item.getChannelId().equals(channelVO.getChannelId()))
-				                .collect(Collectors.toList());
-						if(null != voList && voList.size() > 0) {
-							TicketCntVO ticketSaleCnt =  voList.get(0);
-							channelVO.setOffLineSaleCnt(null != ticketSaleCnt?ticketSaleCnt.getOffLineSaleCnt():0);
-							channelVO.setOnLineSaleCnt(null != ticketSaleCnt?ticketSaleCnt.getOnLineSaleCnt():0);
-						}
-					}
  				}
 			}
 		}
 		return getDataTable(list);
 	}
-	
+
 	// 获取上级渠道迭代
 	private String getParentsName(String channelNo) {
 		if(StringUtils.isNotBlank(channelNo)) {
@@ -388,26 +348,26 @@ public class SaleSiteMgrController extends BaseApiController {
 		}
 	    // 查询经销商销售额、佣金收入、订单数等
 	    ChannelOperDataVO channelOperDataVO = channelService.getChannelTotalOperData(channelVO.getChannelNo());
-		
+
 		// 盲票销售张数
 		int ticketSaleCnt = userTicketOrderService.getSaleSiteTotalTicketNumCnt(channelVO.getChannelId());
 		channelOperDataVO.setTicketSaleCnt(ticketSaleCnt);
 	    channelVO.setOperData(channelOperDataVO);
-	    
+
         if(null != channelVO && null != channelVO.getChannelId()) {
 	    	LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
 			userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
 			int userCnt = channelUserRelService.count(userCntQueryWrapper);
 			channelVO.setUserCnt(userCnt);
-	    	
+
 	    	int ticketQtyCnt = ticketService.getTicketQtyCnt(channelVO.getChannelId());
 	    	channelVO.setOffLineQtyCnt(ticketQtyCnt);
-	    	
+
 	    	TicketCntVO ticketCnt = userTicketOrderService.getTicketSaleCnt(channelVO.getChannelId());
 			channelVO.setOffLineSaleCnt(null != ticketCnt?ticketCnt.getOffLineSaleCnt():0);
 			channelVO.setOnLineSaleCnt(null != ticketCnt?ticketCnt.getOnLineSaleCnt():0);
 	    }
-	    
+
 		return AjaxResult.success(channelVO);
 	}
 

+ 66 - 16
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java

@@ -1,5 +1,6 @@
 package com.qs.mp.web.controller.api.admin;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.param.UserDeliverOrderQueryParam;
@@ -8,6 +9,8 @@ import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import com.qs.mp.common.enums.DeliverTypeEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
@@ -21,10 +24,11 @@ import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
+
+import java.util.*;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
@@ -69,13 +73,16 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	 */
 	@PostMapping("/list")
 	@ApiOperation(value = "用户提货订单列表", notes = "获取用户提货订单列表")
+	@ApiResponses(
+			@ApiResponse(code = 200, message = "OK", response = UserDeliverOrderVO.class)
+	)
 	@PreAuthorize("@ss.hasPermi('order:deliver:list')")
 	public TableDataInfo list(@RequestBody UserDeliverOrderQueryParam queryParam) {
 		startPage();
 		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<UserDeliverOrder>();
 		queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getOrderId()), "t1.order_id", queryParam.getOrderId());
 		queryWrapper.eq(null != queryParam && null != queryParam.getStatus(), "t1.`status`", queryParam.getStatus());
-		queryWrapper.eq(null != queryParam && null != queryParam.getTel(), "t1.`tel`", queryParam.getTel());
+		queryWrapper.eq(null != queryParam && StringUtils.isNotBlank(queryParam.getTel()) , "t1.`tel`", queryParam.getTel());
 		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.getNickName()), "t2.nick_name", queryParam.getNickName());
@@ -95,6 +102,9 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	 */
 	@PostMapping("/detail")
 	@ApiOperation(value = "订单详情", notes = "在订单列表页面查看详情")
+	@ApiResponses(
+			@ApiResponse(code = 200, message = "OK", response = UserDeliverOrderVO.class)
+	)
 	@PreAuthorize("@ss.hasPermi('order:deliver:query')")
 	public AjaxResult query(@RequestBody UserDeliverOrder order) {
 		if (null == order || StringUtils.isBlank(order.getOrderId())) {
@@ -124,16 +134,40 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 		if (null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
+
+		Integer deliveryType = shipParam.getDeliveryType();
+		if (null == deliveryType) {
+			deliveryType = 1;
+		}
+
+		if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+			if (Objects.isNull(shipParam.getDeliveryId())) {
+				return AjaxResult.error("快递公司不能为空");
+			}
+			if (StringUtils.isBlank(shipParam.getDeliveryFlowId())) {
+				return AjaxResult.error("快递单号不能为空");
+			}
+		}
+
 		List<UserDeliverOrderItem> itemList = new ArrayList<UserDeliverOrderItem>();
 		if (null != shipParam && null != shipParam.getItemIds() && shipParam.getItemIds().size() > 0) {
 			Date deliveryTime = new Date();
 			for (String itemId : shipParam.getItemIds()) {
 				if (StringUtils.isNotBlank(itemId)) {
 					UserDeliverOrderItem item = new UserDeliverOrderItem();
-					item.setItemId(itemId);
-					item.setDeliveryId(shipParam.getDeliveryId());
-					item.setDeliveryFlowId(shipParam.getDeliveryFlowId());
-					item.setDeliveryTime(deliveryTime);
+
+					if (DeliverTypeEnum.NO_DELIVER.getValue().equals(deliveryType)) {
+						// 无需物流,设置发货时间为当前时间
+						item.setItemId(itemId);
+						item.setDeliveryTime(deliveryTime);
+
+					} else if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+						// 快递发货,设置物流信息
+						item.setItemId(itemId);
+						item.setDeliveryId(shipParam.getDeliveryId());
+						item.setDeliveryFlowId(shipParam.getDeliveryFlowId());
+						item.setDeliveryTime(deliveryTime);
+					}
 					itemList.add(item);
 				}
 			}
@@ -142,6 +176,7 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 			boolean rtn = userDeliverOrderService.userDeliverOrderShip(shipParam.getOrderId(), itemList);
 			return rtn ? AjaxResult.success() : AjaxResult.error("发货失败");
 		}
+
 		return AjaxResult.error("发货失败");
 	}
 
@@ -151,21 +186,36 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	@Log(title = "用户提货订单发货单号修改", businessType = BusinessType.UPDATE)
 	@PostMapping("/ship/update")
 	@ApiOperation(value = "订单发货修改", notes = "在订单发货页面提交")
+	@ApiResponses(
+			@ApiResponse(code = 200, message = "success", response = AjaxResult.class)
+	)
 	@PreAuthorize("@ss.hasPermi('order:deliver:ship')")
 	public AjaxResult updateShipInfo(@RequestBody UserDeliverOrderShipParam shipParam) {
 		if (null == shipParam || StringUtils.isBlank(shipParam.getOrderId())
-				|| null == shipParam.getDeliveryId() || StringUtils.isBlank(shipParam.getDeliveryFlowId())
 				|| CollectionUtils.isEmpty(shipParam.getItemIds())) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 
-		for (String itemId : shipParam.getItemIds()) {
-			userDeliverOrderItemService.update(new LambdaUpdateWrapper<UserDeliverOrderItem>()
-					.set(UserDeliverOrderItem::getDeliveryId, shipParam.getDeliveryId())
-					.set(UserDeliverOrderItem::getDeliveryFlowId, shipParam.getDeliveryFlowId())
-					.eq(UserDeliverOrderItem::getItemId, itemId));
+		Integer deliveryType = shipParam.getDeliveryType();
+		if (null == deliveryType) {
+			shipParam.setDeliveryType(1);
+		}
+
+		if (DeliverTypeEnum.DELIVER.getValue().equals(shipParam.getDeliveryType())) {
+			if (Objects.isNull(shipParam.getDeliveryId())) {
+				return AjaxResult.error("快递公司不能为空");
+			}
+			if (StringUtils.isBlank(shipParam.getDeliveryFlowId())) {
+				return AjaxResult.error("快递单号不能为空");
+			}
 		}
-		return AjaxResult.success();
+
+
+		// 修改物流信息
+		boolean res = userDeliverOrderService.updateShipInfo(shipParam);
+
+
+		return res ? AjaxResult.success() : AjaxResult.error("消息修改失败");
 	}
 
 	@Log(title = "提货订单导出", businessType = BusinessType.EXPORT)

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

@@ -9,11 +9,14 @@ import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.domain.AjaxResult.Type;
 import com.qs.mp.common.enums.ChannelRoleEnum;
+import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.jsms.JSMSUtils;
 import com.qs.mp.framework.service.IWxUrlLinkService;
+import com.qs.mp.framework.web.service.SysLoginService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
+import java.util.Map;
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +50,9 @@ public class ChannelInviteController extends BaseApiController {
 	@Value("${wx-channel.appId}")
 	private String channelAppId;
 
+	@Autowired
+	private SysLoginService sysLoginService;
+
 	/**
 	 * 生成邀请码
 	 *
@@ -99,6 +105,12 @@ public class ChannelInviteController extends BaseApiController {
 		channel.setMobile(param.getMobile());
 		channel.setName(param.getMobile());
 		channelService.saveChannel(channel,  ChannelRoleEnum.SALESITE);
-		return AjaxResult.success();
+		// 直接登录
+		Map<String, String> result = sysLoginService.wxAuthLogin(param.getMobile(), UserIdentityEnum.CHANNEL.ordinal());
+		AjaxResult ajax = AjaxResult.success();
+		for (String key : result.keySet()) {
+			ajax.put(key, result.get(key));
+		}
+		return ajax;
 	}
 }

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

@@ -0,0 +1,187 @@
+package com.qs.mp.web.controller.api.channel;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.service.ITicketPackageService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.param.ChannelTicketTransferParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelTicketTransferService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 我的盲票相关接口
+ * @author Cup
+ * @date 2022/4/21
+ */
+@RestController
+@RequestMapping("/api/v1/mp/channel/my/ticket")
+@Api(tags = "我的盲票相关接口")
+public class ChannelMyTicketController extends BaseApiController {
+
+    @Autowired
+    private IChannelOrderDetailService channelOrderDetailService;
+
+    @Autowired
+    private IChannelService channelService;
+
+    @Autowired
+    private IChannelTicketTransferService channelTicketTransferService;
+
+    @Autowired
+    private ITicketPackageService ticketPackageService;
+
+    @PostMapping("list")
+    @ApiOperation("我的盲票列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelMyTicketVO.class)
+    )
+    public TableDataInfo list(@RequestBody ChannelMyTicketQueryParam channelMyTicketQueryParam) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        if (channelId == null) {
+            throw new RuntimeException("非法调用");
+        }
+
+        startPage();
+        // 获取我的盲票列表
+        List<ChannelMyTicketVO> list =  channelOrderDetailService.listMyTicket(channelId, channelMyTicketQueryParam);
+        return getDataTable(list);
+    }
+
+    @PostMapping("/channel/mobile/{mobile}")
+    @ApiOperation("根据手机号获取经销商信息")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String", paramType = "path")
+    )
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Channel.class)
+    )
+    public AjaxResult channelInfoByMobile(@PathVariable("mobile") String mobile) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        if (channelId == null) {
+            return AjaxResult.error("非法调用");
+        }
+        if (StringUtils.isBlank(mobile)) {
+            return AjaxResult.success();
+        }
+        Channel channel = channelService.getOne(new LambdaQueryWrapper<Channel>()
+                .eq(Channel::getMobile, mobile)
+                .eq(Channel::getLevel, 0));
+
+        return AjaxResult.success(channel);
+    }
+
+
+
+
+    @PostMapping("/transfer/save")
+    @ApiOperation("盲票转让")
+    public AjaxResult transfer(@RequestBody ChannelTicketTransferParam channelTicketTransferParam) {
+        // 自己为转让人
+        Long transferChannelId = SecurityUtils.getLoginUser().getChannelId();
+        if (transferChannelId == null) {
+            return AjaxResult.error("非法调用");
+        }
+        if (StringUtils.isBlank(channelTicketTransferParam.getBoxId()) ||
+                StringUtils.isBlank(channelTicketTransferParam.getPkgId()) ||
+                Objects.isNull(channelTicketTransferParam.getChannelId()) ||
+                StringUtils.isBlank(channelTicketTransferParam.getMobile())) {
+            return AjaxResult.error("转让参数不能为空");
+        }
+
+        // 校验受让人信息
+        Channel channel = channelService.getOne(new LambdaQueryWrapper<Channel>()
+                .eq(Channel::getChannelId, channelTicketTransferParam.getChannelId())
+                .eq(Channel::getLevel, 0));
+        if (Objects.isNull(channel)) {
+            return AjaxResult.error("受让人信息不存在");
+        }
+        if (ChannelCertifyStatusEnum.NOT_CERTIFIED.equals(channel.getCertifyStatus())) {
+            return AjaxResult.error("受让门店未认证");
+        }
+        if (transferChannelId.equals(channel.getChannelId())) {
+            return AjaxResult.error("不能转让给自己");
+        }
+
+        // 校验当前操作的盲票是否为自己的盲票
+        int count = channelOrderDetailService.count(new LambdaQueryWrapper<ChannelOrderDetail>()
+                .eq(ChannelOrderDetail::getChannelId, transferChannelId)
+                .eq(ChannelOrderDetail::getPkgId, channelTicketTransferParam.getPkgId()));
+        if (count == 0) {
+            return AjaxResult.error("非法操作他人盲票");
+        }
+        // 校验票包是否为待售状态
+        count = ticketPackageService.count(new LambdaQueryWrapper<TicketPackage>().eq(TicketPackage::getPkgId, channelTicketTransferParam.getPkgId())
+                .eq(TicketPackage::getSaleStatus, TicketPkgSaleStatusEnum.WAIT_SALE));
+        if (count == 0) {
+            return AjaxResult.error("票包不为待售状态");
+        }
+
+        // 转让盲票
+        boolean flag  = channelTicketTransferService.transferTicket(transferChannelId, channelTicketTransferParam);
+
+        return AjaxResult.success(flag);
+
+    }
+
+
+
+    @PostMapping("/transfer/list")
+    @ApiOperation("已转让盲票列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelMyTicketVO.class)
+    )
+    public TableDataInfo transferList(){
+        Long transferChannelId = SecurityUtils.getLoginUser().getChannelId();
+        if (transferChannelId == null) {
+            throw new RuntimeException("非法调用");
+        }
+
+        // 开启分页
+        startPage();
+
+        // 获取我的已转让的盲票列表
+        List<ChannelMyTicketVO> list = channelTicketTransferService.listTransferTicketList(transferChannelId);
+        return getDataTable(list);
+    }
+
+
+    @PostMapping("/transfer/detail/{id}")
+    @ApiOperation("转让盲票详情")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "id", value = "转让详情id", required = true, dataType = "Long", paramType = "query")
+    )
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelTicketTransferDetailVO.class)
+    )
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        Long transferChannelId = SecurityUtils.getLoginUser().getChannelId();
+
+        if (transferChannelId == null) {
+            return AjaxResult.error("非法调用");
+        }
+
+        ChannelTicketTransferDetailVO channelTicketTransferDetailVO =  channelTicketTransferService.getTicketTransferDetailById(id, transferChannelId);
+
+        return AjaxResult.success(channelTicketTransferDetailVO);
+    }
+
+}

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

@@ -1,5 +1,6 @@
 package com.qs.mp.web.controller.api.channel.mall;
 
+import cn.hutool.core.date.LocalDateTimeUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.admin.domain.TicketBox;
@@ -10,6 +11,7 @@ import com.qs.mp.channel.domain.vo.ChannelOrderInfoVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderItemVO;
 import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.common.domain.DeliveryCompany;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.service.IDeliveryCompanyService;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.system.domain.SysUser;
@@ -23,6 +25,7 @@ import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.service.IUserAddrService;
 import com.qs.mp.channel.service.IChannelCartService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
@@ -31,9 +34,6 @@ import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
-import com.qs.mp.common.enums.BizTypeEnum;
-import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.framework.redis.RedisKey;
@@ -42,9 +42,17 @@ 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.time.Duration;
+import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -137,6 +145,18 @@ public class ChannelOrderController extends BaseApiController {
         .eq(ChannelOrder::getOrderId, order.getOrderId()).eq(ChannelOrder::getChannelId, channelId));
     ChannelOrderInfoVO channelOrderVO = mapperFacade.map(channelOrder, ChannelOrderInfoVO.class);
 
+    // 设置自动确认收货的时间;
+    if (channelOrderVO != null && Objects.nonNull(channelOrderVO.getDeliveryTime())) {
+      Date deliveryTime = channelOrderVO.getDeliveryTime();
+      LocalDateTime autoConfirmTime = LocalDateTimeUtil.of(deliveryTime).plusDays(10);
+      Duration between = LocalDateTimeUtil.between(LocalDateTime.now(), autoConfirmTime);
+      long hours = between.toHours();
+      long day = hours / 24;
+      long hour = hours % 24;
+      channelOrderVO.setAutoConfirmTime(day + "天" + hour + "小时");
+    }
+
+
     if(null != channelOrderVO && null != channelOrderVO.getDeliveryId()) {
       DeliveryCompany deliveryCompany = deliveryCompanyService.getById(channelOrderVO.getDeliveryId());
       channelOrderVO.setDeliveryCompany(deliveryCompany);
@@ -280,4 +300,33 @@ public class ChannelOrderController extends BaseApiController {
     }
     return AjaxResult.success(jsonObject);
   }
+
+
+
+  @PostMapping("/order/confirm")
+  @ApiOperation("订单确认收货")
+  public AjaxResult confirm(@RequestBody ChannelOrder order){
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    ChannelOrder channelOrder = channelOrderService.getById(order.getOrderId());
+    if (Objects.isNull(channelOrder)) {
+      return AjaxResult.error("订单不存在");
+    }
+
+    if (!ChannelOrderStatusEnum.NOT_CONFIRM.equals(channelOrder.getStatus())) {
+      return AjaxResult.error("订单状态不为待收货");
+    }
+
+    if (!channelId.equals(channelOrder.getChannelId())) {
+      return AjaxResult.error("非法操作他人订单");
+    }
+
+    // 更新用户提货订单状态为已完成,并且设置收货时间
+    ChannelOrder param = new ChannelOrder();
+    param.setOrderId(order.getOrderId());
+    param.setStatus(ChannelOrderStatusEnum.FINISHED);
+    param.setConfirmTime(new Date());
+    channelOrderService.updateById(param);
+
+    return AjaxResult.success();
+  }
 }

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

@@ -1,9 +1,11 @@
 package com.qs.mp.web.controller.api.user;
 
+import cn.hutool.core.date.LocalDateTimeUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.param.OrderPayParam;
@@ -12,6 +14,7 @@ import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
@@ -22,10 +25,7 @@ import com.qs.mp.framework.redis.RedisKey;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
-import com.qs.mp.user.domain.UserAddr;
-import com.qs.mp.user.domain.UserDeliverOrder;
-import com.qs.mp.user.domain.UserDeliverOrderItem;
-import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.*;
 import com.qs.mp.user.domain.param.DeliverOrderParam;
 import com.qs.mp.user.domain.vo.DeliverOrderSettleVO;
 import com.qs.mp.user.domain.vo.DeliverOrderVO;
@@ -37,9 +37,10 @@ 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.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
 import lombok.AllArgsConstructor;
@@ -121,6 +122,18 @@ public class UserDeliverOrderController extends BaseApiController {
     UserDeliverOrder deliverOrder = userDeliverOrderService.getOne(new LambdaQueryWrapper<UserDeliverOrder>()
         .eq(UserDeliverOrder::getOrderId, order.getOrderId()).eq(UserDeliverOrder::getUserId, userId));
     DeliverOrderVO deliverOrderVO = mapperFacade.map(deliverOrder, DeliverOrderVO.class);
+
+    // 设置自动确认收货时间
+    if (deliverOrder != null && !Objects.isNull(deliverOrder.getDeliveryTime())) {
+      Date deliveryTime = deliverOrder.getDeliveryTime();
+      LocalDateTime autoConfirmTime = LocalDateTimeUtil.of(deliveryTime).plusDays(10);
+      Duration between = LocalDateTimeUtil.between(LocalDateTime.now(), autoConfirmTime);
+      long hours = between.toHours();
+      long day = hours / 24;
+      long hour = hours % 24;
+      deliverOrderVO.setAutoConfirmTime(day + "天" + hour + "小时");
+    }
+
     deliverOrderVO.setItems(userDeliverOrderItemService.selectUserDeliverOrderItemVOList(deliverOrder.getOrderId()));
     deliverOrderVO.setDeliverList(userDeliverOrderItemService.getDeliverItemList(order.getOrderId(), deliverOrderVO.getItems()));
     return AjaxResult.success(deliverOrderVO);
@@ -225,4 +238,31 @@ public class UserDeliverOrderController extends BaseApiController {
     return AjaxResult.success(jsonObject);
   }
 
+  @PostMapping("/order/confirm")
+  @ApiOperation("订单确认收货")
+  public AjaxResult confirm(@RequestBody UserDeliverOrder order){
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    UserDeliverOrder userDeliverOrder = userDeliverOrderService.getById(order.getOrderId());
+    if (Objects.isNull(userDeliverOrder)) {
+      return AjaxResult.error("订单不存在");
+    }
+
+    if (!DeliverOrderStatusEnum.NOT_CONFIRM.equals(userDeliverOrder.getStatus())) {
+      return AjaxResult.error("订单状态不为待收货");
+    }
+
+    if (!userId.equals(userDeliverOrder.getUserId())) {
+      return AjaxResult.error("非法操作他人订单");
+    }
+
+    // 更新用户提货订单状态为已完成,并且设置收货时间
+    UserDeliverOrder param = new UserDeliverOrder();
+    param.setOrderId(order.getOrderId());
+    param.setStatus(DeliverOrderStatusEnum.FINISHED);
+    param.setConfirmTime(new Date());
+    userDeliverOrderService.updateById(param);
+
+    return AjaxResult.success();
+  }
+
 }

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

@@ -8,9 +8,11 @@ import com.qs.mp.admin.domain.vo.TicketListVO;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.user.domain.UserCoin;
 import com.qs.mp.user.domain.UserCoinLog;
 import com.qs.mp.user.domain.UserCoupon;
@@ -27,9 +29,13 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import java.util.List;
 import java.util.Map;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -66,11 +72,28 @@ public class UserMineController extends BaseApiController {
    */
   @PostMapping("/ticket/list")
   @ApiOperation(value = "我的盲票列表", notes = "获取我的盲票列表")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "成功", response = TicketListVO.class)
+  )
   public TableDataInfo listTicket(@RequestBody Ticket param) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
     startPage();
     List<TicketListVO> ticketListVOS = userTicketOrderItemService.listMyTicketVO(userId,
         param.getStatus());
+
+
+    // 已兑奖的盲豆奖品需要拼接数量
+    if (TicketStatusEnum.CASHED.equals(param.getStatus())) {
+      for (TicketListVO ticketListVO : ticketListVOS) {
+        if (StringUtils.isBlank(ticketListVO.getPrizeInfo())) {
+          continue;
+        }
+        // 如果为盲豆需要拼接数量
+        if (TicketPrizeTypeEnum.COIN.getValue().equals(ticketListVO.getPrizeType())) {
+          ticketListVO.setPrizeInfo(ticketListVO.getPrizeInfo() + ticketListVO.getValue() + "颗");
+        }
+      }
+    }
     return getDataTable(ticketListVOS);
   }
 
@@ -86,6 +109,22 @@ public class UserMineController extends BaseApiController {
     return getDataTable(userCouponVOList);
   }
 
+  /**
+   * 优惠券详情
+   */
+  @PostMapping("/coupon/detail")
+  @ApiOperation(value = "优惠券详情", notes = "获取我的优惠券详情")
+  public AjaxResult getCouponInfo(@RequestBody UserCoupon param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    List<UserCouponVO> userCouponVOList = userCouponService.listUserCouponVO(new QueryWrapper<UserCoupon>()
+        .eq("t1.id", param.getId())
+        .eq("t1.user_id", userId));
+    if (!CollectionUtils.isEmpty(userCouponVOList)) {
+      return AjaxResult.success(userCouponVOList.get(0));
+    }
+    return AjaxResult.error("优惠券不存在");
+  }
+
   /**
    * 我的盲豆
    */

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

@@ -146,6 +146,7 @@ public class FileUploadController extends BaseApiController {
                 name = cropPicAndUpLoadOSS(file, mimeType, 480, 480, bucketName);
             }else if (PicHandlerTypeEnum.COMPRESSION.getValue().equals(handlerType)) {
                 // 压缩并上传图片
+                // 后台不用压缩
                 name = commpressPicAndUpLoadOSS(file, mimeType, bucketName);
             }
             if (StringUtils.isBlank(name)) {
@@ -242,7 +243,9 @@ public class FileUploadController extends BaseApiController {
         String name = UUIDUtils.newId() + suffix;
         try {
             QcloudFileUtils.putStream(file.getInputStream(), name, bucketName, mimeType );
-            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
+
+            // 后台不再需要压缩,直接前端调用cos的压缩方法 2022.4.20
+ /*           BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
 //            Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
 
 
@@ -293,7 +296,7 @@ public class FileUploadController extends BaseApiController {
             if(outFile.exists()) {
                 LogUtil.info(log, "delete file..."+outFilePath);
                 outFile.delete();
-            }
+            }*/
         }  catch (Exception e) {
             LogUtil.error(log, e, "");
             return null;

+ 106 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/common/LogisticsController.java

@@ -0,0 +1,106 @@
+package com.qs.mp.web.controller.common;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONConfig;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.gson.Gson;
+import com.kuaidi100.sdk.api.AutoNum;
+import com.kuaidi100.sdk.core.IBaseClient;
+import com.kuaidi100.sdk.pojo.HttpResult;
+import com.kuaidi100.sdk.request.AutoNumReq;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.domain.DeliveryCompany;
+import com.qs.mp.common.service.IDeliveryCompanyService;
+import io.swagger.annotations.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author Cup
+ * @date 2022/4/20
+ */
+@RequestMapping("/api/v1/mp/logistics")
+@RestController
+@Api(tags = "物流相关接口")
+public class LogisticsController extends BaseApiController {
+
+
+    @Value("${kuaidi100.key}")
+    public String key;
+
+    @Value("${kuaidi100.customer}")
+    private String customer;
+
+    @Value("${kuaidi100.secret}")
+    private String secret;
+
+    @Value("${kuaidi100.userid}")
+    private String userid;
+
+    @Autowired
+    private IDeliveryCompanyService deliveryCompanyService;
+
+    @PostMapping("/autonumber/auto/{number}")
+    @ApiOperation("自动单号识别接口")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "number", value = "快递单号", required = true, dataType = "String", paramType = "path")
+    )
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = DeliveryCompany.class)
+    )
+    public AjaxResult autonumber(@PathVariable("number") String number) {
+        if (StringUtils.isBlank(number)) {
+            return error("快递单号不能为空");
+        }
+        AutoNumReq autoNumReq = new AutoNumReq();
+        autoNumReq.setKey(key);
+        autoNumReq.setNum(number);
+        IBaseClient baseClient = new AutoNum();
+        try {
+            HttpResult execute = baseClient.execute(autoNumReq);
+            if (Objects.isNull(execute)) {
+                return error("自动单号识别失败");
+            }
+            String body = execute.getBody();
+            if (StringUtils.isBlank(body)) {
+                return error("自动单号识别失败");
+            }
+
+            JSONArray jsonArray = JSONUtil.parseArray(body);
+            if (jsonArray.size() != 1) {
+                return AjaxResult.success();
+            }
+            String name = jsonArray.getJSONObject(0).getStr("name");
+
+            DeliveryCompany deliveryCompany = deliveryCompanyService.getOne(new LambdaQueryWrapper<DeliveryCompany>().eq(DeliveryCompany::getCompanyName, name));
+            return AjaxResult.success(deliveryCompany);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        try {
+            return AjaxResult.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return error(e.getMessage());
+        }
+    }
+
+
+
+
+}

+ 12 - 0
mp-admin/src/main/java/com/qs/mp/web/core/config/SwaggerConfig.java

@@ -85,6 +85,18 @@ public class SwaggerConfig
 
     }
 
+    @Bean
+    public Docket defaultApi4() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .enable(enabled)
+                .apiInfo(apiInfo())
+                .groupName("通用开放接口")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.qs.mp.web.controller.common"))
+                .paths(PathSelectors.any())
+                .build();
+
+    }
 
 
     /**

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

@@ -99,11 +99,6 @@ server:
   # 环境标识
   env: test
 
-# Swagger配置
-swagger:
-  # 请求前缀
-  pathMapping: /test-api
-
 
 #API访问
 client:

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

@@ -154,3 +154,9 @@ rsa:
   public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbHZ2LjUBsM7rXAT81V1z/aIs4uZ1TJSOCKIXKCx+YldnWd/V5HFjG44rYZ+BQXtmOze5aLoFQkbUsjgi3Ot7yfVdsOza6h50FSDpLHvV4YgTRKUMvTyhJtZTPZWWS+n8muFA2mMxmVA/aquxczQQb18IZVz9wY+LkqHX9TOB5gQIDAQAB
 
 
+#快递100的基础账号信息
+kuaidi100:
+  key: vjxrpSAd2653
+  customer: 3964DA3B34FC656A7ED1DA610CC92193
+  secret: 437495658dc649bba7b31fbf0b545e95
+  userid: 2e5b03120bac44dfbc62fc42d988b5f6

+ 4 - 10
mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java

@@ -3,9 +3,9 @@ package com.qs.mp.service;
 import com.qs.mp.MpApplication;
 import com.qs.mp.admin.service.ITicketBoxSerialService;
 import com.qs.mp.framework.service.IWxUrlLinkService;
-import com.qs.mp.quartz.task.CosTask;
 import com.qs.mp.quartz.task.DayStatTask;
 import com.qs.mp.quartz.task.TicketBoxTask;
+import com.qs.mp.quartz.task.TicketPkgDataTask;
 import java.io.IOException;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
@@ -41,7 +41,7 @@ public class ServiceImplTest {
   private DayStatTask dayStatTask;
 
   @Autowired
-  private CosTask cosTask;
+  private TicketPkgDataTask ticketPkgDataTask;
 
   @Test
   public void testGenerateQrCode() {
@@ -86,14 +86,8 @@ public class ServiceImplTest {
   }
 
   @Test
-  public void testCosCompress() {
-    try {
-      cosTask.compressPicture();
-    } catch (IOException e) {
-      e.printStackTrace();
-    } catch (InterruptedException e) {
-      e.printStackTrace();
-    }
+  public void testPkgDataRefresh() {
+    ticketPkgDataTask.refresh();
   }
 
 

+ 36 - 0
mp-common/src/main/java/com/qs/mp/common/enums/DeliverTypeEnum.java

@@ -0,0 +1,36 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+/**
+ * 物流配送方式枚举类
+ * @author Cup
+ * @date 2022/4/19
+ */
+@ApiModel("物流配送方式枚举类")
+public enum DeliverTypeEnum implements IEnum<Integer> {
+
+    DELIVER(1,"快递"),
+
+    NO_DELIVER(2, "无需物流");
+
+    DeliverTypeEnum(int value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+
+    private final int value;
+
+    private final String desc;
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+}

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgSaleStatusEnum.java

@@ -0,0 +1,44 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 盲票包用户端销售状态
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum TicketPkgSaleStatusEnum implements IEnum<Integer> {
+
+  WAIT_SALE(1, "待售"),
+  ON_SALE(2, "销售中"),
+  SALE_OUT(3, "已售完");
+
+  private final Integer value;
+  private final String desc;
+
+  TicketPkgSaleStatusEnum(final Integer value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer 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-common/src/main/java/com/qs/mp/common/enums/TicketPkgStatusEnum.java

@@ -7,7 +7,7 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 
 /**
  *
- * 盲票包销售状态
+ * 盲票包门店销售状态
  *
  */
 @JSONType(deserializer = EnumValueDeserializer.class)

+ 7 - 0
mp-quartz/pom.xml

@@ -17,6 +17,13 @@
 
     <dependencies>
 
+        <!-- hutool 工具包-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.0.M3</version>
+        </dependency>
+
         <!-- 定时任务 -->
         <dependency>
             <groupId>org.quartz-scheduler</groupId>

+ 40 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/ChannelOrderTask.java

@@ -1,12 +1,22 @@
 package com.qs.mp.quartz.task;
 
+import cn.hutool.core.date.LocalDateTimeUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.common.enums.ChannelOrderStatusEnum;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+
+import com.qs.mp.user.domain.UserDeliverOrder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +36,36 @@ public class ChannelOrderTask {
 
   private final int PAGE_SIZE = 500;
 
+
+  /**
+   * x天前的待收货订单自动确认收货任务
+   */
+  public void confirm(Integer day) {
+    LogUtil.info(logger, "...渠道商订单自动确认收货任务开始...");
+    LocalDateTime now = LocalDateTimeUtil.now();
+    LocalDateTime deliveryTime = LocalDateTimeUtil.offset(now, -day, ChronoUnit.DAYS);
+
+    List<ChannelOrder> channelOrderList = channelOrderService.list(new LambdaQueryWrapper<ChannelOrder>()
+            .eq(ChannelOrder::getStatus, ChannelOrderStatusEnum.NOT_CONFIRM.getValue())
+            .le(ChannelOrder::getDeliveryTime, deliveryTime));
+
+    List<ChannelOrder> params = new ArrayList<>();
+    if (CollectionUtils.isNotEmpty(channelOrderList)) {
+      for (ChannelOrder channelOrder : channelOrderList) {
+        ChannelOrder param = new ChannelOrder();
+        param.setOrderId(channelOrder.getOrderId());
+        param.setConfirmTime(new Date());
+        param.setStatus(ChannelOrderStatusEnum.FINISHED);
+        params.add(param);
+      }
+    }
+    channelOrderService.updateBatchById(params);
+
+    LogUtil.info(logger, "...渠道商订单自动确认收货任务结束...");
+  }
+
+
+
   /**
    * 订单取消到期任务
    */

+ 0 - 179
mp-quartz/src/main/java/com/qs/mp/quartz/task/CosTask.java

@@ -1,179 +0,0 @@
-package com.qs.mp.quartz.task;
-
-import com.qcloud.cos.COSClient;
-import com.qcloud.cos.exception.CosClientException;
-import com.qcloud.cos.exception.CosServiceException;
-import com.qcloud.cos.model.COSObjectSummary;
-import com.qcloud.cos.model.GetObjectRequest;
-import com.qcloud.cos.model.ListObjectsRequest;
-import com.qcloud.cos.model.ObjectListing;
-import com.qcloud.cos.model.ObjectMetadata;
-import com.qs.mp.common.image.CompressUtil;
-import com.qs.mp.common.qcloud.QcloudFileUtils;
-import com.qs.mp.common.utils.LogUtil;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import javax.imageio.ImageIO;
-import net.coobird.thumbnailator.Thumbnails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-
-/**
- * 腾讯 COS 操作任务
- *
- * @author Cup
- * @date 2022/4/15
- */
-@Component("cosTask")
-public class CosTask {
-
-  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
-
-
-  /**
-   * 文件上传路径
-   */
-  @Value("${mp.profile}")
-  public String filePath;
-
-  /**
-   * 公开
-   */
-  @Value("${cloud.public-bucket-name}")
-  private String publicBucketName;
-
-
-  /**
-   * 腾讯COS图片压缩替换任务
-   */
-  public void compressPicture() throws IOException, InterruptedException {
-    LogUtil.info(logger, "...图片压缩替换任务开始...");
-
-    ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
-    // 设置bucket名称
-    listObjectsRequest.setBucketName(publicBucketName);
-    // prefix表示列出的object的key以prefix开始
-    listObjectsRequest.setPrefix("/");
-    // deliter表示分隔符, 设置为/表示列出当前目录下的object, 设置为空表示列出所有的object
-    listObjectsRequest.setDelimiter("/");
-    // 设置最大遍历出多少个对象, 一次listobject最大支持1000
-    listObjectsRequest.setMaxKeys(500);
-    ObjectListing objectListing = null;
-    do {
-      try {
-        COSClient cosClient = QcloudFileUtils.getCosClient();
-        objectListing = cosClient.listObjects(listObjectsRequest);
-      } catch (CosServiceException e) {
-        e.printStackTrace();
-        return;
-      } catch (CosClientException e) {
-        e.printStackTrace();
-        return;
-      }
-      // common prefix表示表示被delimiter截断的路径, 如delimter设置为/, common prefix则表示所有子目录的路径
-      List<String> commonPrefixs = objectListing.getCommonPrefixes();
-
-      // object summary表示所有列出的object列表
-      List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
-
-      for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
-        // 文件的路径key
-        String key = cosObjectSummary.getKey();
-
-        if (key.length() < 2) {
-          continue;
-        }
-
-        if ("_s".equals(key.substring(key.length() - 2))) {
-          //  if("EJU6PLW0GUARR4EWIHZA.jpg_s".equals(key)) {
-          // 获取原图文件名
-          String picName = key.substring(0, key.length() - 2);
-          System.err.println("key = " + picName);
-          try {
-            uploadAndCommpressImg(picName);
-          } catch (Exception e) {
-            System.err.println(e);
-          }
-        }
-      }
-      String nextMarker = objectListing.getNextMarker();
-      listObjectsRequest.setMarker(nextMarker);
-    } while (objectListing.isTruncated());
-
-    LogUtil.info(logger, "...图片压缩替换完成!!...");
-  }
-
-  private void uploadAndCommpressImg(String key) throws IOException, InterruptedException {
-    String path = filePath + "/thumb/" + key;
-    File downFile = new File(path);
-    GetObjectRequest getObjectRequest = new GetObjectRequest(publicBucketName, key);
-    COSClient cosClient = QcloudFileUtils.getCosClient();
-    ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);
-//        FileInputStream fileInputStream = new FileInputStream(path);
-    String contentType = downObjectMeta.getContentType();
-//        QcloudFileUtils.putStream(fileInputStream, key, publicBucketName, mimeType);
-
-    // 压缩图片
-    BufferedImage bufferedImage = ImageIO.read(downFile);
-//    Thumbnails.Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
-    int pWidth = bufferedImage.getWidth();
-    int pHeight = bufferedImage.getHeight();
-//    builder.size(pWidth, pHeight);
-    double accuracy = CompressUtil.getAccuracy(downObjectMeta.getContentLength()/1024);
-    LogUtil.info(logger, "原始文件长:{0},大小:{1},类型:{2},压缩比:{3}", pWidth, downObjectMeta.getContentLength()/1024, contentType, 0.8);
-
-    String outFileDir = filePath + "/thumb";
-    File tempFile = new File(outFileDir);
-    if (!tempFile.exists()) {
-      tempFile.mkdirs();
-    }
-    String thumbName = key + "_s";
-    String outFilePath =
-        filePath + "/thumb/" + thumbName + "." + contentType.substring(contentType.lastIndexOf("/") + 1);
-//    builder.toFile(outFilePath);
-
-    // 压缩图片
-    // 压缩图片
-    // 压缩图片
-    if (pWidth > 500) {
-      float scale = 500f / pWidth;
-      if ("image/png".equals(contentType)) {
-        Thumbnails.of(bufferedImage).scale(scale > 0.5 ? 0.5 : scale).outputQuality(0.8)
-            .imageType(BufferedImage.TYPE_INT_ARGB).outputFormat("png")
-            .toFile(outFilePath);
-      } else {
-        Thumbnails.of(bufferedImage).scale(scale).outputQuality(0.8).toFile(outFilePath);
-      }
-    }else {
-      if ("image/png".equals(contentType)) {
-        Thumbnails.of(bufferedImage).scale(0.5).outputQuality(0.8)
-            .imageType(BufferedImage.TYPE_INT_ARGB).outputFormat("png")
-            .toFile(outFilePath);
-      } else {
-        Thumbnails.of(bufferedImage).scale(1f).outputQuality(0.8).toFile(outFilePath);
-      }
-    }
-
-    File outFile = new File(outFilePath);
-    LogUtil.info(logger, "压缩后文件大小:{0}", outFile.length()/ 1024);
-    if (outFile.length() > downObjectMeta.getContentLength()) {
-      // 没压缩,则使用原文件作为缩略图
-      QcloudFileUtils.putFile(downFile, thumbName, publicBucketName, contentType);
-    } else {
-      QcloudFileUtils.putFile(outFile, thumbName, publicBucketName, contentType);
-    }
-
-    downFile.delete();
-    outFile.delete();
-
-
-  }
-
-
-}
-

+ 7 - 2
mp-quartz/src/main/java/com/qs/mp/quartz/task/DayStatTask.java

@@ -113,6 +113,7 @@ public class DayStatTask {
     sb.append("累计用户:").append(allUserCnt - allSiteCnt - allChannelCnt).append(",当日新增:").append(userCnt - siteCnt - channelCnt).append("\n");
     sb.append("===================\n");
 
+    StringBuffer sbDetail = new StringBuffer("");
     LambdaQueryWrapper<TicketBox> queryWrapper = new LambdaQueryWrapper<TicketBox>()
         .nested(wrapper -> {
           wrapper.eq(TicketBox::getType, TicketTypeEnum.ONLINE).eq(TicketBox::getStatus,
@@ -126,7 +127,7 @@ public class DayStatTask {
     if (totalSize > pageSize) {
       totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
     }
-    BigDecimal sumSaleAmt = BigDecimal.ZERO;
+      BigDecimal sumSaleAmt = BigDecimal.ZERO;
     BigDecimal sumAllSaleAmt = BigDecimal.ZERO;
     for (int i = 0; i < totalPage; i++) {
       queryWrapper.orderByAsc(TicketBox::getBoxNo);
@@ -149,15 +150,17 @@ public class DayStatTask {
               2, RoundingMode.DOWN);
           sumAllSaleAmt = sumAllSaleAmt.add(allOrderAmt);
 
-          sb.append(ticketBox.getTitle()).append("|").append(ticketBox.getType().getDesc())
+          sbDetail.append(ticketBox.getTitle()).append("|").append(ticketBox.getType().getDesc())
               .append("(").append(
                   new BigDecimal(ticketBox.getSalePrice()).divide(new BigDecimal(100), 2,
                       RoundingMode.DOWN)).append("元),累计销售额:")
               .append(allOrderAmt).append("元,当日:")
               .append(orderAmt).append("元\n");
+          sbDetail.append("------------------------");
         }
       }
     }
+
     sb.append("累计销售额:").append(sumAllSaleAmt).append("元,当日:").append(sumSaleAmt).append("元\n");
 
     Map<String, Object> commMap = channelCommissionService.getMap(
@@ -248,6 +251,8 @@ public class DayStatTask {
           .append("颗,当日:").append(0 - Integer.valueOf(String.valueOf(exchangeMap.get("exchangeAmt"))))
           .append("颗\n");
     }
+    sb.append("===================\n");
+    sb.append(sbDetail);
     WebhookService.sendBizData(sb.toString());
     LogUtil.info(logger, "...日统计任务结束..." );
   }

+ 0 - 78
mp-quartz/src/main/java/com/qs/mp/quartz/task/PictureTask.java

@@ -1,78 +0,0 @@
-package com.qs.mp.quartz.task;
-
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.qs.mp.admin.domain.Goods;
-import com.qs.mp.admin.service.IGoodsService;
-import com.qs.mp.admin.service.impl.GoodsServiceImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 图片相关处理任务
- *
- * @author Cup
- * @date 2022/4/18
- */
-@Component("pictureTask")
-public class PictureTask {
-
-    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
-
-
-    @Autowired
-    private IGoodsService goodsService;
-
-
-    public void detailPictureReplace(Long goodsId) {
-        List<Goods> goodsList = new ArrayList<>();
-        Goods goods = goodsService.getById(goodsId);
-        if (goods != null) {
-            goodsList.add(goods);
-            pictureReplace(goodsList);
-        }
-    }
-
-    public void detailPictureReplace() {
-        List<Goods> goodsList = goodsService.list();
-        if (CollectionUtils.isNotEmpty(goodsList)) {
-            pictureReplace(goodsList);
-        }
-
-    }
-
-    /**
-     * 商品详情图片处理方法
-     */
-    private void pictureReplace(List<Goods> goodsList) {
-        if (CollectionUtils.isNotEmpty(goodsList)) {
-            List<Goods> params = new ArrayList<>();
-            for (Goods goods : goodsList) {
-                String desc = goods.getDescription();
-                if (StringUtils.isBlank(desc)) {
-                    continue;
-                }
-                // 将字符串中所有的.jpg和.png 替换为.jpg_s和.png_s
-                String result = desc.replaceAll(".jpg\"", ".jpg_s\"").replaceAll(".jpeg\"", ".jpeg_s\"").replaceAll(".png\"", ".png_s\"");
-                Goods param = new Goods();
-                param.setGoodsId(goods.getGoodsId());
-                param.setDescription(result);
-                params.add(param);
-            }
-
-            // 批量修改商品详情图片
-            if (CollectionUtils.isNotEmpty(params)) {
-                goodsService.updateBatchById(params);
-            }
-        }
-    }
-
-
-
-}

+ 79 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/TicketPkgDataTask.java

@@ -0,0 +1,79 @@
+package com.qs.mp.quartz.task;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketPackageService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.common.enums.ChannelOrderStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.LogUtil;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 票包销售数量更新
+ * @author zhongcp
+ * @Date 2022/3/17
+ */
+@Component("ticketPkgDataTask")
+public class TicketPkgDataTask {
+
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private ITicketService ticketService;
+
+
+  /**
+   * 刷新票包的销量数据
+   */
+  public void refresh() {
+    LogUtil.info(logger, "...票包销售数量更新任务开始...");
+
+    List<TicketPackage> ticketPackageList = ticketPackageService.list(new LambdaQueryWrapper<TicketPackage>());
+
+    for (TicketPackage ticketPackage : ticketPackageList) {
+      TicketBox ticketBox = ticketBoxService.getById(ticketPackage.getBoxId());
+      int saleQty = ticketService.count(new LambdaQueryWrapper<Ticket>()
+          .eq(Ticket::getPkgId, ticketPackage.getPkgId())
+          .gt(Ticket::getStatus, TicketStatusEnum.NOT_PAY));
+      TicketPkgSaleStatusEnum saleStatusEnum;
+      if (saleQty == 0) {
+        saleStatusEnum = TicketPkgSaleStatusEnum.WAIT_SALE;
+      } else if (saleQty < ticketBox.getPkgUnit()) {
+        saleStatusEnum = TicketPkgSaleStatusEnum.ON_SALE;
+      } else {
+        saleStatusEnum = TicketPkgSaleStatusEnum.SALE_OUT;
+      }
+      ticketPackageService.update(new LambdaUpdateWrapper<TicketPackage>()
+          .set(TicketPackage::getPkgUnit, ticketBox.getPkgUnit())
+          .set(TicketPackage::getSaleQty, saleQty)
+          .set(TicketPackage::getSaleStatus, saleStatusEnum)
+          .eq(TicketPackage::getPkgId, ticketPackage.getPkgId()));
+    }
+    LogUtil.info(logger, "...票包销售数量更新任务结束...");
+  }
+}

+ 66 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/UserDeliverOrderTask.java

@@ -0,0 +1,66 @@
+package com.qs.mp.quartz.task;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.date.TemporalUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.service.IUserDeliverOrderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户提货订单任务
+ * @author Cup
+ * @date 2022/4/20
+ */
+@Component("userDeliverOrderTask")
+public class UserDeliverOrderTask {
+
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+    @Autowired
+    private IUserDeliverOrderService userDeliverOrderService;
+
+
+    /**
+     * x天前的待收货订单自动确认收货任务
+     */
+    public void confirm(Integer day) {
+        LogUtil.info(logger, "...用户提货订单自动确认收货任务开始...");
+        LocalDateTime now = LocalDateTimeUtil.now();
+        LocalDateTime deliveryTime = LocalDateTimeUtil.offset(now, -day, ChronoUnit.DAYS);
+
+        List<UserDeliverOrder> userDeliverOrderList = userDeliverOrderService.list(new LambdaQueryWrapper<UserDeliverOrder>()
+                .eq(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.NOT_CONFIRM.getValue())
+                .le(UserDeliverOrder::getDeliveryTime, deliveryTime));
+
+        List<UserDeliverOrder> params = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(userDeliverOrderList)) {
+            for (UserDeliverOrder userDeliverOrder : userDeliverOrderList) {
+                UserDeliverOrder param = new UserDeliverOrder();
+                param.setOrderId(userDeliverOrder.getOrderId());
+                param.setConfirmTime(new Date());
+                param.setStatus(DeliverOrderStatusEnum.FINISHED);
+                params.add(param);
+            }
+        }
+        userDeliverOrderService.updateBatchById(params);
+
+        LogUtil.info(logger, "...用户提货订单自动确认收货任务结束...");
+    }
+
+
+}

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

@@ -10,6 +10,9 @@ import com.baomidou.mybatisplus.annotation.Version;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -19,6 +22,7 @@ import lombok.Data;
  */
 @TableName("mp_ticket")
 @Data
+@ApiModel(value = "盲票实体类")
 public class Ticket implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -27,60 +31,70 @@ public class Ticket implements Serializable {
    * 主键
    */
   @TableId(value = "ticket_id", type = IdType.INPUT)
+  @ApiModelProperty("盲票id")
   private String ticketId;
 
   /**
    * 盲票组ID
    */
   @TableField("box_id")
+  @ApiModelProperty("盲票组ID")
   private String boxId;
 
   /**
    * 盲票包ID
    */
   @TableField("pkg_id")
+  @ApiModelProperty("盲票包ID")
   private String pkgId;
 
   /**
    * 标题
    */
   @TableField("title")
+  @ApiModelProperty("标题")
   private String title;
 
   /**
    * 序列号
    */
   @TableField("serial_no")
+  @ApiModelProperty("序列号")
   private String serialNo;
 
   /**
    * 面值
    */
   @TableField("face_price")
+  @ApiModelProperty("面值")
   private Integer facePrice;
 
   /**
    * 加密幸运数字
    */
   @TableField("cipher_lucky_num")
+  @ApiModelProperty("加密幸运数字")
   private String cipherLuckyNum;
 
   /**
    * 明文幸运数字
    */
   @TableField("plain_lucky_num")
+  @ApiModelProperty("明文幸运数字")
   private Integer plainLuckyNum;
 
   /**
    * 抽奖数字描述(json格式,包含数字、奖项)
    */
   @TableField("draw_num")
+  @ApiModelProperty("抽奖数字描述(json格式,包含数字、奖项)")
   private String drawNum;
 
   /**
    * 是否实体纸质票(0否1是)
    */
   @TableField("is_physical")
+  @ApiModelProperty("是否实体纸质票(0否1是)")
   private Integer isPhysical;
 
   /**
@@ -88,12 +102,14 @@ public class Ticket implements Serializable {
    */
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("盲票状态;1未付款、2已激活、3已兑奖、4付款中")
   private TicketStatusEnum status;
 
   /**
    * 创建时间
    */
   @TableField("created_time")
+  @ApiModelProperty("创建时间")
   private Date createdTime;
 
   /**
@@ -101,6 +117,7 @@ public class Ticket implements Serializable {
    */
   @TableField("updated_time")
   @Version
+  @ApiModelProperty("更新时间")
   private Date updatedTime;
 
 

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
@@ -59,6 +60,25 @@ public class TicketPackage implements Serializable {
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketPkgStatusEnum status;
 
+  /**
+   * 用户端销售状态(待售、销售中、已售罄)
+   */
+  @TableField("sale_status")
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private TicketPkgSaleStatusEnum saleStatus;
+
+  /**
+   * 销售张数
+   */
+  @TableField("sale_qty")
+  private Integer saleQty;
+
+  /**
+   * 每包张数
+   */
+  @TableField("pkg_unit")
+  private Integer pkgUnit;
+
   /**
    * 创建时间
    */

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

@@ -28,6 +28,10 @@ public class ChannelOrderShipParam {
 	@ApiModelProperty(value = "订单编号", required = false)
 	private String orderId;
 
+	@NotNull(message = "配送类型不能为空")
+	@ApiModelProperty(value = "配送类型 1快递 2 无需物流", required = false)
+	private Integer deliveryType;
+
 	/**
 	 * 物流公司ID
 	 */

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

@@ -26,6 +26,10 @@ public class UserDeliverOrderShipParam {
 	@ApiModelProperty(value = "订单编号", required = false)
 	private String orderId;
 
+	@NotNull(message = "配送类型不能为空")
+	@ApiModelProperty(value = "配送类型 1快递 2 无需物流", required = false)
+	private Integer deliveryType;
+
 	/**
 	 * 物流公司ID
 	 */

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

@@ -1,6 +1,9 @@
 package com.qs.mp.admin.domain.vo;
 
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -8,51 +11,71 @@ import lombok.Data;
  * @Date 2022/3/7
  */
 @Data
+@ApiModel("盲票列表VO类")
 public class TicketListVO {
 
   /**
    * 订单明细ID
    */
+  @ApiModelProperty("订单明细id")
   private String itemId;
 
   /**
    * 盲票ID
    */
+  @ApiModelProperty("盲票id")
   private String ticketId;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组id")
   private String boxId;
 
   /**
    * 标题
    */
+  @ApiModelProperty("标题")
   private String title;
 
   /**
    * 图片
    */
+  @ApiModelProperty("图片")
   private String picUrl;
 
   /**
    * 序列号
    */
+  @ApiModelProperty("序列号")
   private String serialNo;
 
   /**
    * 面值
    */
+  @ApiModelProperty("面值")
   private Integer facePrice;
 
   /**
    * 明文幸运数字
    */
+  @ApiModelProperty("明文幸运数字")
   private Integer plainLuckyNum;
 
   /**
    * 盲票状态(初始、已激活、已兑奖)
    */
+  @ApiModelProperty("盲票状态(初始、已激活、已兑奖)")
   private String status;
 
+
+  @ApiModelProperty("奖品信息")
+  private String prizeInfo;
+
+  @ApiModelProperty("价值")
+  private Integer value;
+
+  @ApiModelProperty("奖品类型")
+  private String prizeType;
+
 }

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

@@ -26,6 +26,7 @@ import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
@@ -201,6 +202,9 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
       ticketPackage.setEndSn(
           ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + pkgUnit));
       ticketPackage.setStatus(TicketPkgStatusEnum.FOR_SALE);
+      ticketPackage.setSaleStatus(TicketPkgSaleStatusEnum.WAIT_SALE);
+      ticketPackage.setSaleQty(0);
+      ticketPackage.setPkgUnit(ticketBox.getPkgUnit());
       ticketPackageList.add(ticketPackage);
 
       List<PkgAwards> pkgAwardsList = pkgAwardsMap.get(key);

+ 33 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/Channel.java

@@ -13,6 +13,9 @@ import com.qs.mp.common.enums.SiteTypeEnum;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -22,6 +25,7 @@ import lombok.Data;
  */
 @TableName("mp_channel")
 @Data
+@ApiModel("渠道经销商实体类")
 public class Channel implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -30,30 +34,35 @@ public class Channel implements Serializable {
    * 主键
    */
   @TableId(value = "channel_id" , type = IdType.AUTO)
+  @ApiModelProperty("渠道经销商id")
   private Long channelId;
 
   /**
    * 渠道编码
    */
   @TableField("channel_no")
+  @ApiModelProperty("渠道编码")
   private String channelNo;
 
   /**
    * 渠道名称
    */
   @TableField("name")
+  @ApiModelProperty("渠道名称")
   private String name;
 
   /**
    * 父渠道ID
    */
   @TableField("parent_id")
+  @ApiModelProperty("父渠道ID")
   private Long parentId;
 
   /**
    * 渠道级别,0:经销商;1:一级渠道;2:二级渠道
    */
   @TableField("level")
+  @ApiModelProperty("渠道级别,0:经销商;1:一级渠道;2:二级渠道")
   private Integer level;
 
   /**
@@ -61,6 +70,7 @@ public class Channel implements Serializable {
    */
   @TableField("site_type")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("经销商类型")
   private SiteTypeEnum siteType;
   
   
@@ -68,84 +78,98 @@ public class Channel implements Serializable {
    * 门店名称(用于用户端优惠券的详情页,说明优惠券的适用门店)
    */
   @TableField("site_name")
+  @ApiModelProperty("门店名称(用于用户端优惠券的详情页,说明优惠券的适用门店)")
   private String siteName;
 
   /**
    * 分佣百分比
    */
   @TableField("comm_rate")
+  @ApiModelProperty("分佣百分比")
   private BigDecimal commRate;
 
   /**
    * 省ID
    */
   @TableField("province_id")
+  @ApiModelProperty("省ID")
   private Long provinceId;
 
   /**
    * 省
    */
   @TableField("province")
+  @ApiModelProperty("省")
   private String province;
 
   /**
    * 城市
    */
   @TableField("city")
+  @ApiModelProperty("城市")
   private String city;
 
   /**
    * 城市ID
    */
   @TableField("city_id")
+  @ApiModelProperty("城市ID")
   private Long cityId;
 
   /**
    * 区
    */
   @TableField("area")
+  @ApiModelProperty("区")
   private String area;
 
   /**
    * 区ID
    */
   @TableField("area_id")
+  @ApiModelProperty("区ID")
   private Long areaId;
 
   /**
    * 详细地址
    */
   @TableField("address")
+  @ApiModelProperty("详细地址")
   private String address;
 
   /**
    * 联系人
    */
   @TableField("contact")
+  @ApiModelProperty("联系人")
   private String contact;
 
   /**
    * 手机号
    */
   @TableField("mobile")
+  @ApiModelProperty("手机号")
   private String mobile;
 
   /**
    * 用户ID
    */
   @TableField("user_id")
+  @ApiModelProperty("用户ID")
   private Long userId;
 
   /**
    * 账户余额
    */
   @TableField("money")
+  @ApiModelProperty("账户余额")
   private Integer money;
 
   /**
    * 账户冻结金额
    */
   @TableField("frozen_money")
+  @ApiModelProperty("账户冻结金额")
   private Integer frozenMoney;
 
   /**
@@ -153,6 +177,7 @@ public class Channel implements Serializable {
    */
   @TableField("certify_status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("认证状态,未认证n,已认证y")
   private ChannelCertifyStatusEnum certifyStatus;
 
   /**
@@ -160,30 +185,35 @@ public class Channel implements Serializable {
    */
   @TableField("verify_status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("审核状态")
   private ChannelVerifyStatusEnum verifyStatus;
 
   /**
    * 营业执照
    */
   @TableField("biz_license_pic")
+  @ApiModelProperty("营业执照")
   private String bizLicensePic;
 
   /**
    * 门头照片
    */
   @TableField("door_pic")
+  @ApiModelProperty("门头照片")
   private String doorPic;
 
   /**
    * 备注信息
    */
   @TableField("memo")
+  @ApiModelProperty("备注信息")
   private String memo;
 
   /**
    * 邀请码图片
    */
   @TableField("invite_pic")
+  @ApiModelProperty("邀请码图片")
   private String invitePic;
 
   /**
@@ -191,18 +221,21 @@ public class Channel implements Serializable {
    */
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("状态,启用.停用")
   private ChannelStatusEnum status;
 
   /**
    * 创建时间
    */
   @TableField("created_time")
+  @ApiModelProperty("创建时间")
   private Date createdTime;
 
   /**
    * 更新时间
    */
   @TableField("updated_time")
+  @ApiModelProperty("更新时间")
   private Date updatedTime;
 
 

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

@@ -10,6 +10,9 @@ import com.baomidou.mybatisplus.annotation.Version;
 import com.qs.mp.common.enums.ChannelOrderStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -19,6 +22,7 @@ import lombok.Data;
  */
 @TableName("mp_channel_order")
 @Data
+@ApiModel("经销商盲票采购订单实体类")
 public class ChannelOrder implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -27,48 +31,56 @@ public class ChannelOrder implements Serializable {
    * 主键
    */
   @TableId(value = "order_id" , type = IdType.INPUT)
+  @ApiModelProperty("订单id")
   private String orderId;
 
   /**
    * 渠道ID
    */
   @TableField("channel_id")
+  @ApiModelProperty("渠道id")
   private Long channelId;
 
   /**
    * 标题
    */
   @TableField("title")
+  @ApiModelProperty("标题")
   private String title;
 
   /**
    * 订单金额
    */
   @TableField("order_amt")
+  @ApiModelProperty("订单金额")
   private Integer orderAmt;
 
   /**
    * 优惠金额
    */
   @TableField("discount_amt")
+  @ApiModelProperty("优惠金额")
   private Integer discountAmt;
 
   /**
    * 运费金额
    */
   @TableField("freight_amt")
+  @ApiModelProperty("运费金额")
   private Integer freightAmt;
 
   /**
    * 实付金额
    */
   @TableField("pay_amt")
+  @ApiModelProperty("实付金额")
   private Integer payAmt;
 
   /**
    * 订单状态,-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成
    */
   @TableField("status")
+  @ApiModelProperty("订单状态,-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private ChannelOrderStatusEnum status;
 
@@ -76,78 +88,95 @@ public class ChannelOrder implements Serializable {
    * 盲票总包数
    */
   @TableField("pkg_num")
+  @ApiModelProperty("盲票总包数")
   private Integer pkgNum;
 
   /**
    * 备注
    */
   @TableField("memo")
+  @ApiModelProperty("备注")
   private String memo;
 
   /**
    * 收货人
    */
   @TableField("receiver")
+  @ApiModelProperty("收货人")
   private String receiver;
 
   /**
    * 收货人电话
    */
   @TableField("tel")
+  @ApiModelProperty("收货人电话")
   private String tel;
 
   /**
    * 收货地址-省
    */
   @TableField("province")
+  @ApiModelProperty("收货地址-省")
   private String province;
 
   /**
    * 收货地址-市
    */
   @TableField("city")
+  @ApiModelProperty("收货地址-市")
   private String city;
 
   /**
    * 收货地址-区
    */
   @TableField("area")
+  @ApiModelProperty("收货地址-区")
   private String area;
 
   /**
    * 收货地址-详细
    */
   @TableField("address")
+  @ApiModelProperty("收货地址-详细")
   private String address;
 
   /**
    * 物流ID
    */
   @TableField("delivery_id")
+  @ApiModelProperty("物流ID")
   private Long deliveryId;
 
   /**
    * 物流单号
    */
   @TableField("delivery_flow_id")
+  @ApiModelProperty("物流单号")
   private String deliveryFlowId;
   
   /**
    * 发货时间
    */
   @TableField("delivery_time")
+  @ApiModelProperty("发货时间")
   private Date deliveryTime;
 
+  @TableField("confirm_time")
+  @ApiModelProperty("确认收货时间")
+  private Date confirmTime;
+
   /**
    * 创建时间
    */
   @TableField("created_time")
+  @ApiModelProperty("创建时间")
   private Date createdTime;
 
   /**
    * 更新时间
    */
   @TableField("updated_time")
+  @ApiModelProperty("更新时间")
   private Date updatedTime;
 
 

+ 79 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelTicketTransfer.java

@@ -0,0 +1,79 @@
+package com.qs.mp.channel.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 经销商盲票转让信息表实体类
+ * @auther quanshu
+ * @create 2022-04-21 10:47:03
+ */
+@TableName("mp_channel_ticket_transfer")
+@Data
+@ApiModel("经销商盲票转让信息表实体类")
+public class ChannelTicketTransfer implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty("主键")
+    private Long id;
+
+    /**
+     * 转让人ID
+     */
+    @TableField("transfer_channel_id")
+    @ApiModelProperty("转让人ID")
+    private Long transferChannelId;
+
+    /**
+     * 拥有人ID
+     */
+    @TableField("channel_id")
+    @ApiModelProperty("拥有人ID")
+    private Long channelId;
+
+    /**
+     * 盲票组ID
+     */
+    @TableField("box_id")
+    @ApiModelProperty("盲票组ID")
+    private String boxId;
+
+    /**
+     * 盲票包ID
+     */
+    @TableField("pkg_id")
+    @ApiModelProperty("盲票包ID")
+    private String pkgId;
+
+    /**
+     * 创建时间
+     */
+    @TableField("created_time")
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("updated_time")
+    @ApiModelProperty("更新时间")
+    private Date updatedTime;
+
+
+}

+ 27 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelMyTicketQueryParam.java

@@ -0,0 +1,27 @@
+package com.qs.mp.channel.domain.param;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 经销商我的盲票查询入参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel(value= "经销商我的盲票查询入参类")
+@Data
+public class ChannelMyTicketQueryParam {
+
+    @ApiModelProperty("销售状态 1待售,2销售中,3已售罄")
+    public TicketPkgSaleStatusEnum saleStatus;
+
+
+    @ApiModelProperty("搜索名称")
+    public String searchTitle;
+
+
+}

+ 29 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelTicketTransferParam.java

@@ -0,0 +1,29 @@
+package com.qs.mp.channel.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 经销商盲票转让入参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel("经销商盲票转让入参类")
+@Data
+public class ChannelTicketTransferParam {
+
+
+    @ApiModelProperty("盲票组id")
+    private String boxId;
+
+    @ApiModelProperty("盲票包id")
+    private String pkgId;
+
+    @ApiModelProperty("受让人id")
+    private Long channelId;
+
+    @ApiModelProperty("受让人手机号")
+    private String mobile;
+
+}

+ 60 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelMyTicketVO.java

@@ -0,0 +1,60 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 经销商我的盲票出参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel("经销商我的盲票出参类")
+@Data
+public class ChannelMyTicketVO {
+
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("盲票组ID")
+    private String boxId;
+
+    @ApiModelProperty("盲票包ID")
+    private String pkgId;
+
+
+    @ApiModelProperty("票包编号")
+    public String pkgNo;
+
+    @ApiModelProperty("主图")
+    private String picUrl;
+
+    @ApiModelProperty("票包名称")
+    private String title;
+
+    @ApiModelProperty("票的规格")
+    private Integer pkgUnit;
+
+    @ApiModelProperty("销售状态 1待售,2销售中,3已售罄")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketPkgSaleStatusEnum saleStatus;
+
+    @ApiModelProperty("销售数量")
+    private Integer saleQty;
+
+    @ApiModelProperty("面值")
+    private Integer facePrice;
+
+
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+
+
+
+}

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

@@ -3,6 +3,8 @@ package com.qs.mp.channel.domain.vo;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.common.domain.DeliveryCompany;
 import java.util.List;
+
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -19,4 +21,7 @@ public class ChannelOrderInfoVO extends ChannelOrder {
   private DeliveryCompany deliveryCompany;
 	
   private List<ChannelOrderItemVO> items;
+
+  @ApiModelProperty("自动确认收货时间")
+  private String autoConfirmTime;
 }

+ 32 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelTicketTransferDetailVO.java

@@ -0,0 +1,32 @@
+package com.qs.mp.channel.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 盲票转让详情出参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel("盲票转让详情出参类")
+@Data
+public class ChannelTicketTransferDetailVO {
+
+    @ApiModelProperty("盲票名称")
+    private String title;
+
+    @ApiModelProperty("票包编号")
+    private String pkgNo;
+
+    @ApiModelProperty("门店名称")
+    private String channelName;
+
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    @ApiModelProperty("转让时间")
+    private Date createdTime;
+}

+ 18 - 10
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelMapper.java

@@ -21,29 +21,37 @@ public interface ChannelMapper extends BaseMapper<Channel> {
 
 	/**
 	 * 获取我的下级渠道列表信息,支持翻页
-	 * 
-	 * @param channel
+	 *
+	 * @param wrapper
 	 * @return
 	 */
 	public List<ChannelVO> selectChannelVoList(@Param(Constants.WRAPPER) Wrapper<Channel> wrapper);
-	
+
+	/**
+	 * 获取我的下级渠道列表信息,支持翻页
+	 *
+	 * @param wrapper
+	 * @return
+	 */
+	public List<ChannelVO> selectChannelList(@Param(Constants.WRAPPER) Wrapper<Channel> wrapper);
+
 	/**
-	 * 根据ID查询渠道VO
+	 * 查询经销商列表
 	 *
-	 * @param userId
+	 * @param wrapper
 	 * @return
 	 */
-	public ChannelVO getChannelVoById(@Param("channelId") Long channelId);
-	
-	
+	public List<ChannelVO> selectSaleSiteList(@Param(Constants.WRAPPER) Wrapper<Channel> wrapper);
+
+
     /**
      * 查询渠道及其子渠道经销商总数
      * @param channelNo
      * @return
      */
     int getChannelSiteCnt(@Param("channelNo") String channelNo);
-    
-	
+
+
     /**
      * 统计新增的经销商数
      * @param wrapper

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

@@ -1,7 +1,15 @@
 package com.qs.mp.channel.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @auther quanshu
@@ -10,4 +18,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ChannelOrderDetailMapper extends BaseMapper<ChannelOrderDetail> {
 
+
+    /**
+     * 查询我的盲票列表
+     * @param wrapper
+     * @return
+     */
+    List<ChannelMyTicketVO> selectListMyTicketByChannelIdAndchannelMyTicketQueryParam(@Param(Constants.WRAPPER) Wrapper<ChannelOrderDetail> wrapper);
+
 }

+ 34 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelTicketTransferMapper.java

@@ -0,0 +1,34 @@
+package com.qs.mp.channel.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-21 10:47:03
+ * @describe 经销商盲票转让信息表mapper类
+ */
+public interface ChannelTicketTransferMapper extends BaseMapper<ChannelTicketTransfer> {
+
+    /**
+     * 获取已转让盲票列表
+     * @param queryWrapper
+     * @return
+     */
+    List<ChannelMyTicketVO> listTransferTicketList(@Param(Constants.WRAPPER) QueryWrapper<ChannelMyTicketVO> queryWrapper);
+
+    /**
+     * 获取已转让盲票详情
+     * @param queryWrapper
+     * @return
+     */
+    ChannelTicketTransferDetailVO getTicketTransferDetail(@Param(Constants.WRAPPER) QueryWrapper<ChannelTicketTransferDetailVO> queryWrapper);
+
+}

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

@@ -2,6 +2,10 @@ package com.qs.mp.channel.service;
 
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IChannelOrderDetailService extends IService<ChannelOrderDetail> {
 
+    /**
+     * 获取我的盲票列表
+     * @param channelId 经销商id
+     * @param channelMyTicketQueryParam 查询参数
+     * @return
+     */
+    List<ChannelMyTicketVO> listMyTicket(Long channelId, ChannelMyTicketQueryParam channelMyTicketQueryParam);
 }

+ 20 - 4
mp-service/src/main/java/com/qs/mp/channel/service/IChannelService.java

@@ -43,13 +43,29 @@ public interface IChannelService extends IService<Channel> {
 
 
 	/**
-	 * 获取我的下级渠道、经销商列表信息,支持翻页
+	 * 获取我的下级渠道信息,支持翻页
 	 *
-	 * @param channel
+	 * @param queryWrapper
 	 * @return
 	 */
 	public List<ChannelVO> selectChannelVoList(Wrapper<Channel> queryWrapper);
 
+	/**
+	 * 获取我的下级渠道信息,统计经销商数和用户数,支持翻页
+	 *
+	 * @param queryWrapper
+	 * @return
+	 */
+	public List<ChannelVO> selectChannelList(Wrapper<Channel> queryWrapper);
+
+	/**
+	 * 获取经销商列表信息,支持翻页
+	 *
+	 * @param queryWrapper
+	 * @return
+	 */
+	public List<ChannelVO> selectSaleSiteList(Wrapper<Channel> queryWrapper);
+
 	/**
 	 * 根据用户ID查询渠道
 	 *
@@ -85,8 +101,8 @@ public interface IChannelService extends IService<Channel> {
 	 * 根据channelNo统计全部的经营数据
 	 */
 	public ChannelOperDataVO getChannelTotalOperData(String channelNo);
-	
-	
+
+
    /**
     * 统计新增的经销商数
     * @param wrapper

+ 44 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelTicketTransferService.java

@@ -0,0 +1,44 @@
+package com.qs.mp.channel.service;
+
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.param.ChannelTicketTransferParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 经销商盲票转让信息表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-21
+ */
+public interface IChannelTicketTransferService extends IService<ChannelTicketTransfer> {
+
+
+    /**
+     * 转让盲票
+     * @param transferChannelId     转让人id
+     * @param channelTicketTransferParam        转让参数
+     * @return
+     */
+    boolean transferTicket(Long transferChannelId, ChannelTicketTransferParam channelTicketTransferParam);
+
+    /**
+     * 获取已转让盲票列表
+     * @param transferChannelId     转让人id
+     * @return
+     */
+    List<ChannelMyTicketVO> listTransferTicketList(Long transferChannelId);
+
+    /**
+     * 根据id和转让人id查询盲票转让详情
+     * @param id
+     * @param transferChannelId
+     * @return
+     */
+    ChannelTicketTransferDetailVO getTicketTransferDetailById(Long id, Long transferChannelId);
+}

+ 26 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderDetailServiceImpl.java

@@ -1,11 +1,18 @@
 package com.qs.mp.channel.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
 import com.qs.mp.channel.mapper.ChannelOrderDetailMapper;
 import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Objects;
+
 /**
  * <p>
  * 经销商采购订单盲票包明细 服务实现类
@@ -17,4 +24,23 @@ import org.springframework.stereotype.Service;
 @Service
 public class ChannelOrderDetailServiceImpl extends ServiceImpl<ChannelOrderDetailMapper, ChannelOrderDetail> implements IChannelOrderDetailService {
 
+
+    @Override
+    public List<ChannelMyTicketVO> listMyTicket(Long channelId, ChannelMyTicketQueryParam channelMyTicketQueryParam) {
+        QueryWrapper<ChannelOrderDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.channel_id", channelId);
+        if (Objects.nonNull(channelMyTicketQueryParam.getSaleStatus())) {
+            queryWrapper.eq("t2.sale_status", channelMyTicketQueryParam.getSaleStatus());
+        }
+        if (StringUtils.isNotBlank(channelMyTicketQueryParam.getSearchTitle())) {
+            queryWrapper.nested(wrapper -> {
+                wrapper.likeRight("t2.pkg_no", channelMyTicketQueryParam.getSearchTitle())
+                        .or()
+                        .likeRight("t3.title", channelMyTicketQueryParam.getSearchTitle());
+            });
+
+        }
+        queryWrapper.orderByDesc("t1.created_time");
+        return this.baseMapper.selectListMyTicketByChannelIdAndchannelMyTicketQueryParam(queryWrapper);
+    }
 }

+ 10 - 3
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -209,7 +209,7 @@ public class ChannelOrderServiceImpl extends
   }
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	public boolean channelOrderShip(ChannelOrder channelOrder, List<String> pkgIdList) {
 		if(null == channelOrder || StringUtils.isBlank(channelOrder.getOrderId())) {
 			throw new ServiceException("发货订单异常,发货失败");
@@ -271,8 +271,15 @@ public class ChannelOrderServiceImpl extends
 			boolean rtn = ticketPackageService.update(updateWrapper);
 			if(rtn){
 				// 修改订单信息
-				channelOrder.setStatus(ChannelOrderStatusEnum.NOT_CONFIRM);
-				return updateById(channelOrder);
+                String deliveryFlowId = channelOrder.getDeliveryFlowId();
+
+                // 物流单号为空则表示无需物流发货
+                if (StringUtils.isBlank(deliveryFlowId)) {
+                    channelOrder.setStatus(ChannelOrderStatusEnum.FINISHED);
+                } else {
+                    channelOrder.setStatus(ChannelOrderStatusEnum.NOT_CONFIRM);
+                }
+                return updateById(channelOrder);
 			}
 		}
 		return false;

+ 20 - 4
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java

@@ -2,6 +2,7 @@ package com.qs.mp.channel.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
@@ -24,6 +25,7 @@ import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -122,6 +124,16 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
     return getBaseMapper().selectChannelVoList(queryWrapper);
   }
 
+  @Override
+  public List<ChannelVO> selectChannelList(Wrapper<Channel> queryWrapper) {
+    return getBaseMapper().selectChannelList(queryWrapper);
+  }
+
+  @Override
+  public List<ChannelVO> selectSaleSiteList(Wrapper<Channel> queryWrapper) {
+    return getBaseMapper().selectSaleSiteList(queryWrapper);
+  }
+
   @Override
   public Channel getChannelByUserId(Long userId) {
     return getBaseMapper().selectOne(
@@ -135,7 +147,11 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
 
   @Override
   public ChannelVO getChannelVoById(Long channelId) {
-    return getBaseMapper().getChannelVoById(channelId);
+    List<ChannelVO> channelVOList = getBaseMapper().selectChannelVoList(new QueryWrapper<Channel>().eq("t1.channel_id", channelId));
+    if (CollectionUtils.isEmpty(channelVOList)) {
+      return null;
+    }
+    return channelVOList.get(0);
   }
 
   @Override
@@ -164,11 +180,11 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
     // channelOperData.setNewUserCnt(newUserCnt);
     return channelOperData;
   }
-  
-  
+
+
   @Override
   public List<IndexVO> selectIndexSiteIncreaseList(Wrapper<Channel> wrapper) {
 	 return getBaseMapper().selectIndexSiteIncreaseList(wrapper);
   }
-  
+
 }

+ 76 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelTicketTransferServiceImpl.java

@@ -0,0 +1,76 @@
+package com.qs.mp.channel.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.qs.mp.channel.domain.param.ChannelTicketTransferParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+import com.qs.mp.channel.mapper.ChannelTicketTransferMapper;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
+import com.qs.mp.channel.service.IChannelTicketTransferService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 经销商盲票转让信息表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-21
+ */
+@Service
+public class ChannelTicketTransferServiceImpl extends ServiceImpl<ChannelTicketTransferMapper, ChannelTicketTransfer> implements IChannelTicketTransferService {
+
+
+    @Autowired
+    private IChannelOrderDetailService channelOrderDetailService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean transferTicket(Long transferChannelId, ChannelTicketTransferParam channelTicketTransferParam) {
+
+        // 转让盲票
+        ChannelTicketTransfer channelTicketTransfer = new ChannelTicketTransfer();
+        channelTicketTransfer.setTransferChannelId(transferChannelId);
+        channelTicketTransfer.setChannelId(channelTicketTransferParam.getChannelId());
+        channelTicketTransfer.setBoxId(channelTicketTransferParam.getBoxId());
+        channelTicketTransfer.setPkgId(channelTicketTransferParam.getPkgId());
+
+
+        // 记录盲票转让信息
+        this.save(channelTicketTransfer);
+
+        // 更新盲票拥有人
+        channelOrderDetailService.update(new LambdaUpdateWrapper<ChannelOrderDetail>()
+                .set(ChannelOrderDetail::getChannelId, channelTicketTransferParam.getChannelId())
+                .eq(ChannelOrderDetail::getPkgId, channelTicketTransferParam.getPkgId())
+                .eq(ChannelOrderDetail::getChannelId, transferChannelId));
+
+        return true;
+    }
+
+    @Override
+    public List<ChannelMyTicketVO> listTransferTicketList(Long transferChannelId) {
+        QueryWrapper<ChannelMyTicketVO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t.transfer_channel_id", transferChannelId);
+        queryWrapper.orderByDesc("t.created_time");
+        return this.baseMapper.listTransferTicketList(queryWrapper);
+    }
+
+    @Override
+    public ChannelTicketTransferDetailVO getTicketTransferDetailById(Long id, Long transferChannelId) {
+        QueryWrapper<ChannelTicketTransferDetailVO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.id", id);
+        queryWrapper.eq("t1.transfer_channel_id", transferChannelId);
+        return this.baseMapper.getTicketTransferDetail(queryWrapper);
+    }
+}

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

@@ -1,19 +1,28 @@
 package com.qs.mp.mq.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketAwards;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.service.ITicketBoxSerialService;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketPackageService;
+import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.common.enums.CommStatusEnum;
 import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.common.pulsar.PulsarConsumer;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderService;
+import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +46,15 @@ public class PulsarConsumerImpl implements PulsarConsumer {
   @Autowired
   private IUserTicketOrderService userTicketOrderService;
 
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+
+  @Autowired
+  private ITicketService ticketService;
+
   @Override
   @Async("threadPoolTaskExecutor")
   public void wsConsumer(String topicType, String mqData) {
@@ -62,6 +80,23 @@ public class PulsarConsumerImpl implements PulsarConsumer {
               .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
     }
 
+
+    // 更新票组销售数量,此处只做累计,允许并发容错
+    List<UserTicketOrderItem> ticketOrderItemList = userTicketOrderItemService.list(new LambdaQueryWrapper<UserTicketOrderItem>()
+        .eq(UserTicketOrderItem::getOrderId, orderId));
+    for (UserTicketOrderItem orderItem : ticketOrderItemList) {
+      Ticket ticket = ticketService.getById(orderItem.getTicketId());
+      TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
+      ticketPackageService.update(new LambdaUpdateWrapper<TicketPackage>()
+          .set(TicketPkgSaleStatusEnum.WAIT_SALE == ticketPackage.getSaleStatus(),
+              TicketPackage::getSaleStatus, TicketPkgSaleStatusEnum.ON_SALE)
+          .set(TicketPkgSaleStatusEnum.ON_SALE == ticketPackage.getSaleStatus()
+                  && ticketPackage.getSaleQty() + 1 >= ticketPackage.getPkgUnit(),
+              TicketPackage::getSaleStatus, TicketPkgSaleStatusEnum.SALE_OUT)
+          .set(TicketPackage::getSaleQty, ticketPackage.getSaleQty() + 1)
+          .eq(TicketPackage::getPkgId, ticketPackage.getPkgId()));
+    }
+
     if (ticketOrder.getCommStatus() != CommStatusEnum.NO) {
       LogUtil.warn(logger, "收到盲票支付成功消息,订单结佣状态不是未结佣,忽略消息。orderId=" + orderId);
       return;

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

@@ -10,6 +10,9 @@ import com.baomidou.mybatisplus.annotation.Version;
 import com.qs.mp.common.enums.DeliverOrderStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -19,6 +22,7 @@ import lombok.Data;
  */
 @TableName("mp_user_deliver_order")
 @Data
+@ApiModel("用户提货订单实体类")
 public class UserDeliverOrder implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -26,91 +30,114 @@ public class UserDeliverOrder implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("订单 id")
   @TableId(value = "order_id", type = IdType.INPUT)
   private String orderId;
 
   /**
    * 用户ID
    */
+  @ApiModelProperty("用户ID")
   @TableField("user_id")
   private Long userId;
 
   /**
    * 收货人
    */
+  @ApiModelProperty("收货人")
   @TableField("receiver")
   private String receiver;
 
   /**
    * 收货人电话
    */
+  @ApiModelProperty("收货人电话")
   @TableField("tel")
   private String tel;
 
   /**
    * 省
    */
+  @ApiModelProperty("省")
   @TableField("province")
   private String province;
 
   /**
    * 市
    */
+  @ApiModelProperty("市")
   @TableField("city")
   private String city;
 
   /**
    * 区
    */
+  @ApiModelProperty("区")
   @TableField("area")
   private String area;
 
   /**
    * 详细地址
    */
+  @ApiModelProperty("详细地址")
   @TableField("address")
   private String address;
 
   /**
    * 总商品数
    */
+  @ApiModelProperty("总商品数")
   @TableField("order_num")
   private Integer orderNum;
 
   /**
    * 支付金额
    */
+  @ApiModelProperty("支付金额")
   @TableField("pay_amt")
   private Integer payAmt;
 
   /**
    * 运费
    */
+  @ApiModelProperty("运费")
   @TableField("freight_amt")
   private Integer freightAmt;
 
   /**
    * 备注
    */
+  @ApiModelProperty("备注")
   @TableField("memo")
   private String memo;
 
   /**
    * 订单状态;-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成
    */
+  @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:待发货 2:待收货 3:已完成")
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private DeliverOrderStatusEnum status;
 
+  @TableField("delivery_time")
+  @ApiModelProperty("发货时间")
+  private Date deliveryTime;
+
+  @TableField("confirm_Time")
+  @ApiModelProperty("确认收货时间")
+  private Date confirmTime;
+
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   @Version
   private Date updatedTime;

+ 18 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrderItem.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -15,6 +18,7 @@ import lombok.Data;
  */
 @TableName("mp_user_deliver_order_item")
 @Data
+@ApiModel("用户提货订单明细实体类")
 public class UserDeliverOrderItem implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -23,65 +27,76 @@ public class UserDeliverOrderItem implements Serializable {
    * 主键
    */
   @TableId(value = "item_id", type = IdType.INPUT)
+  @ApiModelProperty("项目id")
   private String itemId;
 
   /**
    * 订单ID
    */
   @TableField("order_id")
+  @ApiModelProperty("订单id")
   private String orderId;
 
   /**
    * 奖品库ID
    */
   @TableField("storage_id")
+  @ApiModelProperty("奖品库id")
   private String storageId;
 
   /**
    * 商品ID
    */
   @TableField("goods_id")
+  @ApiModelProperty("商品id")
   private Long goodsId;
 
   /**
    * sku ID
    */
+  @ApiModelProperty("skuId")
   @TableField("sku_id")
   private Long skuId;
 
   /**
    * sku 属性
    */
+  @ApiModelProperty("sku属性")
   @TableField("properties")
   private String properties;
 
   /**
    * 商品标题
    */
+  @ApiModelProperty("商品标题")
   @TableField("title")
   private String title;
 
   /**
    * 商品图片
    */
+  @ApiModelProperty("商品图片")
   @TableField("pic_url")
   private String picUrl;
 
   /**
    * 商品数量
    */
+  @ApiModelProperty("商品数量")
   @TableField("goods_num")
   private Integer goodsNum;
 
   /**
    * 物流公司ID
    */
+  @ApiModelProperty("物流公司id")
   @TableField("delivery_id")
   private Long deliveryId;
 
   /**
    * 物流单号ID
    */
+  @ApiModelProperty("物流单号id")
   @TableField("delivery_flow_id")
   private String deliveryFlowId;
 
@@ -89,18 +104,21 @@ public class UserDeliverOrderItem implements Serializable {
   /**
    * 发货时间
    */
+  @ApiModelProperty("发货时间")
   @TableField("delivery_time")
   private Date deliveryTime;
   
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

+ 12 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/DeliverOrderVO.java

@@ -2,7 +2,12 @@ package com.qs.mp.user.domain.vo;
 
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
+
+import java.time.LocalDateTime;
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -10,8 +15,15 @@ import lombok.Data;
  * @Date 2022/3/17
  */
 @Data
+@ApiModel(value = "提货订单展示VO")
 public class DeliverOrderVO extends UserDeliverOrder {
+
+  @ApiModelProperty("提货订单VO")
   List<UserDeliverOrderItemVO> items;
   // 物流信息
+  @ApiModelProperty("物流信息")
   List<OrderDeliverItemVO> deliverList;
+
+  @ApiModelProperty("自动确认收货时间")
+  private String autoConfirmTime;
 }

+ 11 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/OrderDeliverItemVO.java

@@ -5,6 +5,9 @@ import com.qs.mp.user.domain.UserDeliverOrderItem;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -12,36 +15,44 @@ import lombok.Data;
  * @Date 2022/3/17
  */
 @Data
+@ApiModel("用户提货订单物流信息")
 public class OrderDeliverItemVO {
 
 	/**
 	   * 物流公司ID
 	   */
+	@ApiModelProperty("物流公司id")
 	  private Long deliveryId;
 
 	  // 物流公司名称
+	@ApiModelProperty("物流公司名称")
 	  private  String companyName;
 
 	  /**
 	   * 公司主页
 	   */
+	  @ApiModelProperty("公司主页")
 	  private String companyHomeUrl;
 
 	  /**
 	   * 物流查询接口
 	   */
+	  @ApiModelProperty("物流查询接口")
 	  private String queryUrl;
 
 	  /**
 	   * 物流单号ID
 	   */
+	  @ApiModelProperty("物流单号id")
 	  private String deliveryFlowId;
 
 	  /**
 	   * 发货时间
 	   */
+	  @ApiModelProperty("发货时间")
 	  private Date deliveryTime;
 
 	  // 物流商品清单
+	  @ApiModelProperty("物流商品清单")
 	  List<UserDeliverOrderItemVO> items = new ArrayList<>();
 }

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

@@ -2,6 +2,8 @@ package com.qs.mp.user.domain.vo;
 
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -9,18 +11,22 @@ import lombok.Data;
  * @Date 2022/3/17
  */
 @Data
+@ApiModel("用户提货订单项VO")
 public class UserDeliverOrderItemVO  extends UserDeliverOrderItem {
 
 	  // 物流公司名称
+	@ApiModelProperty("物流公司名称")
 	  private  String companyName;
 
 	  /**
 	   * 公司主页
 	   */
+	  @ApiModelProperty("公司主页")
 	  private String companyHomeUrl;
 
 	  /**
 	   * 物流查询接口
 	   */
+	  @ApiModelProperty("物流查询接口")
 	  private String queryUrl;
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserDeliverOrderVO.java

@@ -2,6 +2,9 @@ package com.qs.mp.user.domain.vo;
 
 import com.qs.mp.user.domain.UserDeliverOrder;
 import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -9,15 +12,19 @@ import lombok.Data;
  * @Date 2022/3/17
  */
 @Data
+@ApiModel("用户提货订单详情")
 public class UserDeliverOrderVO extends UserDeliverOrder {
 
 	// 明细
+	@ApiModelProperty("提货订单项明细")
 	List<UserDeliverOrderItemVO> items;
 
 	// 用户昵称
+	@ApiModelProperty("用户昵称")
 	private String nickName;
 
 	// 物流信息
+	@ApiModelProperty("物流信息")
 	List<OrderDeliverItemVO> deliverList;
 
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderService.java

@@ -1,5 +1,6 @@
 package com.qs.mp.user.service;
 
+import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
@@ -83,4 +84,12 @@ public interface IUserDeliverOrderService extends IService<UserDeliverOrder> {
 	 * @return
 	 */
 	boolean userDeliverOrderShip(String orderId, List<UserDeliverOrderItem> itemList);
+
+	/**
+	 * 修改物流信息
+	 * @param shipParam
+	 * @return
+	 */
+    boolean updateShipInfo(UserDeliverOrderShipParam shipParam);
+
 }

+ 14 - 2
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderItemServiceImpl.java

@@ -1,5 +1,7 @@
 package com.qs.mp.user.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.vo.OrderDeliverItemVO;
 import com.qs.mp.user.domain.vo.UserDeliverOrderItemVO;
@@ -8,8 +10,10 @@ import com.qs.mp.user.service.IUserDeliverOrderItemService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
@@ -37,16 +41,24 @@ public class UserDeliverOrderItemServiceImpl extends ServiceImpl<UserDeliverOrde
 	@Override
 	public List<OrderDeliverItemVO> getDeliverItemList(String orderId, List<UserDeliverOrderItemVO> orderItems) {
 		List<OrderDeliverItemVO> itemList = new ArrayList<OrderDeliverItemVO>();
+
+
 		// 1.查询物流公司信息
 		itemList = selectOrderDeliverItemVOList(orderId);
-		// 2.查询物流包裹内的商品信息
+
 		for (OrderDeliverItemVO itemVO : itemList) {
 			for (UserDeliverOrderItemVO item : orderItems) {
-				if (itemVO.getDeliveryFlowId().equals(item.getDeliveryFlowId())) {
+
+				if (item.getDeliveryTime() == null) {
+					continue;
+				}
+
+				if (itemVO.getDeliveryTime().equals(item.getDeliveryTime())) {
 					UserDeliverOrderItemVO flowItem = new UserDeliverOrderItemVO();
 					BeanUtils.copyProperties(item, flowItem);
 					itemVO.getItems().add(flowItem);
 				}
+
 			}
 		}
 		return itemList;

+ 79 - 5
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java

@@ -4,7 +4,9 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import com.qs.mp.common.enums.DeliverTypeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
@@ -23,6 +25,8 @@ import com.qs.mp.user.service.IUserDeliverOrderItemService;
 import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.user.service.IUserPrizeStorageService;
+
+import java.util.Date;
 import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -150,21 +154,43 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
 	}
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	public boolean userDeliverOrderShip(String orderId, List<UserDeliverOrderItem> itemList) {
 		boolean res = userDeliverOrderItemService.updateBatchById(itemList);
 		if(res) {
 			// 检测订单是否全部提货完成
 			LambdaQueryWrapper<UserDeliverOrderItem> queryWrapper = new LambdaQueryWrapper<UserDeliverOrderItem>();
 			queryWrapper.eq(UserDeliverOrderItem::getOrderId, orderId);
-			queryWrapper.isNull(UserDeliverOrderItem::getDeliveryFlowId);
+			queryWrapper.isNull(UserDeliverOrderItem::getDeliveryTime);
 			int noShipCnt = userDeliverOrderItemService.count(queryWrapper);
 			// 部分发货是订单状态仍保留待发货状态, 全部发完的时候再修改订单状态为待收货
 			LambdaUpdateWrapper<UserDeliverOrder> updateWrapper = new LambdaUpdateWrapper<UserDeliverOrder>();
 			updateWrapper.eq(UserDeliverOrder::getOrderId, orderId);
 			if(noShipCnt == 0) {
-				updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.NOT_CONFIRM);
-			}else {
+                // 判断订单是否全部都是无需物流; 有发货时间并且物流单号是空的就是无需物流
+                LambdaQueryWrapper<UserDeliverOrderItem> userDeliverOrderItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                userDeliverOrderItemLambdaQueryWrapper.eq(UserDeliverOrderItem::getOrderId, orderId);
+                // 获取订单下所有提货统计
+                int orderItemCount = userDeliverOrderItemService.count(userDeliverOrderItemLambdaQueryWrapper);
+
+                userDeliverOrderItemLambdaQueryWrapper.isNotNull(UserDeliverOrderItem::getDeliveryTime);
+                userDeliverOrderItemLambdaQueryWrapper.isNull(UserDeliverOrderItem::getDeliveryFlowId);
+
+                // 获取无需物流状态数量
+                int noNeedShipCnt = userDeliverOrderItemService.count(userDeliverOrderItemLambdaQueryWrapper);
+
+                // 如果相等则表示所有商品都是无需物流,直接设置订单状态为已完成,并且设置订单的收货时间和发货时间
+                if (orderItemCount == noNeedShipCnt) {
+                    updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.FINISHED);
+                    updateWrapper.set(UserDeliverOrder::getDeliveryTime, new Date());
+                    updateWrapper.set(UserDeliverOrder::getConfirmTime, new Date());
+                } else {
+                    // 否则订单状态为待收货,设置发货时间
+                    updateWrapper.set(UserDeliverOrder::getDeliveryTime, new Date());
+                    updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.NOT_CONFIRM);
+                }
+
+            }else {
 				updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.PART_DELIVER);
 			}
 			return userDeliverOrderService.update(updateWrapper);
@@ -172,7 +198,55 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
 		return false;
 	}
 
-	@Override
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateShipInfo(UserDeliverOrderShipParam shipParam) {
+        Integer deliveryType = shipParam.getDeliveryType();
+        boolean res = false;
+
+        for (String itemId : shipParam.getItemIds()) {
+
+            if (DeliverTypeEnum.NO_DELIVER.getValue().equals(deliveryType)) {
+                // 无需物流,设置物流信息为空
+                res = userDeliverOrderItemService.update(new LambdaUpdateWrapper<UserDeliverOrderItem>()
+                        .set(UserDeliverOrderItem::getDeliveryId, null)
+                        .set(UserDeliverOrderItem::getDeliveryFlowId, null)
+                        .eq(UserDeliverOrderItem::getItemId, itemId));
+                // 查询判断是否所有都是无需物流
+                LambdaQueryWrapper<UserDeliverOrderItem> userDeliverOrderItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                userDeliverOrderItemLambdaQueryWrapper.eq(UserDeliverOrderItem::getOrderId, shipParam.getOrderId());
+                // 获取订单下所有提货统计数
+                int orderItemCount = userDeliverOrderItemService.count(userDeliverOrderItemLambdaQueryWrapper);
+
+                userDeliverOrderItemLambdaQueryWrapper.isNotNull(UserDeliverOrderItem::getDeliveryTime);
+                userDeliverOrderItemLambdaQueryWrapper.isNull(UserDeliverOrderItem::getDeliveryFlowId);
+
+                // 获取无需物流状态数量
+                int noNeedShipCnt = userDeliverOrderItemService.count(userDeliverOrderItemLambdaQueryWrapper);
+
+                // 如果相等则表示所有商品都是无需物流,直接设置订单状态为已完成,并且设置订单的发货和收货时间
+                if (orderItemCount == noNeedShipCnt) {
+                    res = userDeliverOrderService.update(new LambdaUpdateWrapper<UserDeliverOrder>()
+                            .set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.FINISHED)
+                            .set(UserDeliverOrder::getConfirmTime, new Date())
+                            .set(UserDeliverOrder::getDeliveryTime, new Date())
+                            .eq(UserDeliverOrder::getOrderId, shipParam.getOrderId()));
+                }
+
+
+            } else if (DeliverTypeEnum.DELIVER.getValue().equals(deliveryType)) {
+                // 快递发货,原逻辑
+                res = userDeliverOrderItemService.update(new LambdaUpdateWrapper<UserDeliverOrderItem>()
+                        .set(UserDeliverOrderItem::getDeliveryId, shipParam.getDeliveryId())
+                        .set(UserDeliverOrderItem::getDeliveryFlowId, shipParam.getDeliveryFlowId())
+                        .eq(UserDeliverOrderItem::getItemId, itemId));
+            }
+
+        }
+        return res;
+    }
+
+    @Override
 	public UserDeliverOrderVO selectUserDeliverOrderVo(String orderId) {
 		return getBaseMapper().selectUserDeliverOrderVo(orderId);
 	}

+ 8 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelCommission;
@@ -26,6 +28,7 @@ import com.qs.mp.common.enums.ChannelMoneyEnum;
 import com.qs.mp.common.enums.CommStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
@@ -101,6 +104,9 @@ public class UserTicketOrderServiceImpl extends
   @Autowired
   private IChannelMoneyLogService channelMoneyLogService;
 
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
@@ -385,6 +391,7 @@ public class UserTicketOrderServiceImpl extends
       } else {
         ticket = ticketService.getById(orderItem.getTicketId());
       }
+
       // 开幸运数字,更新ticket状态为已激活
       boolean rtn = ticketService.update(
           new LambdaUpdateWrapper<Ticket>().set(Ticket::getPlainLuckyNum,
@@ -392,6 +399,7 @@ public class UserTicketOrderServiceImpl extends
               .set(Ticket::getStatus, TicketStatusEnum.ACTIVATED)
               .eq(Ticket::getTicketId, ticket.getTicketId()));
       Assert.isTrue(rtn, "支付回调用户购票订单处理,更新盲票状态失败,ticketId:" + ticket.getTicketId());
+
     }
 
     // 更新订单状态为已完成

+ 6 - 3
mp-service/src/main/resources/mapper/admin/TicketPackageMapper.xml

@@ -10,16 +10,19 @@
         <result column="start_sn" property="startSn" />
         <result column="end_sn" property="endSn" />
         <result column="status" property="status" />
+        <result column="sale_status" property="saleStatus" />
+        <result column="sale_qty" property="saleQty" />
+        <result column="pkg_unit" property="pkgUnit" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        pkg_id, box_id, pkg_no, start_sn, end_sn, status, created_time, updated_time
+        pkg_id, box_id, pkg_no, start_sn, end_sn, status, sale_status, sale_qty, pkg_unit, created_time, updated_time
     </sql>
-    
-    
+
+
     <!-- 查询盲票包列表 -->
     <select id="listTicketPackageVO" resultType="com.qs.mp.admin.domain.vo.TicketPackageVO">
 		select t1.* , t2.title

+ 50 - 9
mp-service/src/main/resources/mapper/channel/ChannelMapper.xml

@@ -56,18 +56,59 @@
 		and (t1.channel_no like concat(#{channelNo}, '.%') or t1.channel_no = #{channelNo})
     </select>
 
-     <!-- 查询渠道信息 -->
-    <select id="getChannelVoById" resultType="com.qs.mp.channel.domain.vo.ChannelVO">
-		select t1.* , t2.name parentName
-		from mp_channel t1
-		left join mp_channel t2 on t1.parent_id = t2.channel_id
-		where t1.channel_id = #{channelId}
+  <!-- 查询子渠道信息 -->
+  <select id="selectChannelList" resultType="com.qs.mp.channel.domain.vo.ChannelVO">
+    select t1.* , t2.name parentName, t3.site_cnt, t4.child_cnt, t5.user_cnt
+    from mp_channel t1
+           left join mp_channel t2 on t1.parent_id = t2.channel_id
+           left join (select q1.channel_id, count(q2.channel_id) as site_cnt
+                      from mp_channel q1
+                             left join mp_channel q2 on q2.channel_no like concat(q1.channel_id, '.%')
+                      where q1.level > 0 and q2.level= 0
+                      group by q1.channel_id) t3 on t3.channel_id = t1.channel_id
+           left join (select q1.channel_id, count(q2.channel_id) as child_cnt
+                      from mp_channel q1
+                             left join mp_channel q2 on q2.channel_no like concat(q1.channel_id, '.%')
+                      where q1.level > 0 and q2.level> 0
+                      group by q1.channel_id) t4 on t4.channel_id = t1.channel_id
+           left join (select q1.channel_id,sum(q2.user_cnt) as user_cnt
+                      from mp_channel q1
+                             left join (select b.channel_no, a.channel_id, count(a.id) AS user_cnt
+                                        from mp_channel_user_rel a
+                                               left join mp_channel b on a.channel_id=b.channel_id
+                                        group by a.channel_id, b.channel_no) q2 on q2.channel_no like concat(q1.channel_no, '.%')
+                      group by q1.channel_id
+                    ) t5 on t5.channel_id=t1.channel_id
+      ${ew.customSqlSegment}
+  </select>
+
+     <!-- 查询经销商列表信息 -->
+    <select id="selectSaleSiteList" resultType="com.qs.mp.channel.domain.vo.ChannelVO">
+      select t1.channel_id as channelId, t1.channel_no, t1.name, t1.parent_id, t1.level, t1.site_type, t1.site_name, t1.comm_rate as commRate, t1.province, t1.province_id, t1.city, t1.city_id, t1.area, t1.area_id, t1.address, t1.contact, t1.mobile, t1.user_id, t1.certify_status, t1.verify_status, t1.status, t1.created_time, t1.updated_time ,
+             t2.off_line_qty_cnt, t2.off_line_sale_cnt, t4.sale_qty-t2.off_line_sale_cnt as on_line_sale_cnt, t3.user_cnt
+      from mp_channel t1
+             left join (
+                select channel_id, SUM(  b.pkg_unit - b.sale_qty ) AS off_line_qty_cnt,
+                       SUM(  b.sale_qty  ) AS off_line_sale_cnt
+                from mp_channel_order_detail a
+                       left join mp_ticket_package b on a.pkg_id=b.pkg_id
+                group by a.channel_id) t2 on t1.channel_id = t2.channel_id
+             left join (
+                select channel_id, count(*) AS user_cnt
+                from mp_channel_user_rel
+                group by channel_id) t3 on t1.channel_id = t3.channel_id
+             left join (
+                select channel_id, sum(ticket_num) AS sale_qty
+                from mp_user_ticket_order
+                where status=1
+                group by channel_id) t4 on t1.channel_id = t4.channel_id
+        ${ew.customSqlSegment}
 	</select>
-	
-	
+
+
 	<!-- 统计新增经销商数列表 -->
     <select id="selectIndexSiteIncreaseList" resultType="com.qs.mp.admin.domain.vo.IndexVO">
-		select 
+		select
           DATE_FORMAT(t1.created_time, '%Y%m%d') AS time,
           COUNT(t1.channel_id) AS newSiteCnt
 	     from `mp_channel` t1

+ 19 - 0
mp-service/src/main/resources/mapper/channel/ChannelOrderDetailMapper.xml

@@ -20,4 +20,23 @@
         id, order_id, channel_id, box_id, pkg_id, start_sn, end_sn, created_time, updated_time
     </sql>
 
+    <select id="selectListMyTicketByChannelIdAndchannelMyTicketQueryParam"
+            resultType="com.qs.mp.channel.domain.vo.ChannelMyTicketVO">
+        SELECT t1.id,
+               t1.channel_id,
+               t1.box_id,
+               t1.pkg_id,
+               t1.created_time,
+               t2.pkg_no,
+               t2.sale_status,
+               t2.sale_qty,
+               t2.pkg_unit,
+               t3.title,
+               t3.pic_url,
+               t3.face_price
+        FROM mp_channel_order_detail t1
+         LEFT JOIN mp_ticket_package t2 ON t1.pkg_id = t2.pkg_id
+         LEFT JOIN mp_ticket_box t3 ON t2.box_id = t3.box_id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 53 - 0
mp-service/src/main/resources/mapper/channel/ChannelTicketTransferMapper.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.channel.mapper.ChannelTicketTransferMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelTicketTransfer">
+        <id column="id" property="id" />
+        <result column="transfer_channel_id" property="transferChannelId" />
+        <result column="channel_id" property="channelId" />
+        <result column="box_id" property="boxId" />
+        <result column="pkg_id" property="pkgId" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, transfer_channel_id, channel_id, box_id, pkg_id, created_time, updated_time
+    </sql>
+
+    <select id="listTransferTicketList" resultType="com.qs.mp.channel.domain.vo.ChannelMyTicketVO">
+        SELECT t.id,
+               t1.channel_id,
+               t1.box_id,
+               t1.pkg_id,
+               t1.created_time,
+               t2.pkg_no,
+               t2.sale_status,
+               t2.sale_qty,
+               t2.pkg_unit,
+               t3.title,
+               t3.pic_url,
+               t3.face_price
+        FROM mp_channel_ticket_transfer t
+         Left JOIN mp_channel_order_detail t1 ON t.pkg_id = t1.pkg_id
+         LEFT JOIN mp_ticket_package t2 ON t1.pkg_id = t2.pkg_id
+         LEFT JOIN mp_ticket_box t3 ON t2.box_id = t3.box_id
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="getTicketTransferDetail" resultType="com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO">
+        SELECT t4.title,
+               t3.pkg_no,
+               t2.name channelName,
+               t2.mobile,
+               t1.created_time
+        FROM mp_channel_ticket_transfer t1
+         LEFT JOIN mp_channel t2 ON t1.channel_id = t2.channel_id
+         LEFT JOIN mp_ticket_package t3 ON t1.pkg_id = t3.pkg_id
+         LEFT JOIN mp_ticket_box t4 ON t1.box_id = t4.box_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>

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

@@ -31,7 +31,7 @@
 		select DISTINCT t1.delivery_id , t1.delivery_flow_id, t1.delivery_time, t2.company_name ,t2.company_home_url ,t2.query_url
 		from mp_user_deliver_order_item t1
 		left join mp_delivery_company t2 on t1.delivery_id = t2.delivery_id
-		where t1.order_id = #{orderId} and t1.delivery_flow_id is not null
+		where t1.order_id = #{orderId} and t1.delivery_time is not null
 	</select>
 	
 	 <!-- 查询用户订单明细列表 -->

+ 3 - 1
mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

@@ -26,11 +26,13 @@
     </select>
 
     <select id="listMyTicketVO" resultType="com.qs.mp.admin.domain.vo.TicketListVO">
-        select t1.item_id, t3.*, t4.pic_url
+        select t1.item_id, t3.*, t4.pic_url, t6.title prizeInfo, t6.`value`,t6.prize_type
         from mp_user_ticket_order_item t1
          left join mp_user_ticket_order t2 on t1.order_id = t2.order_id
          left join mp_ticket t3 on t1.ticket_id = t3.ticket_id
          left join mp_ticket_box t4 on t3.box_id = t4.box_id
+         left join mp_user_hit_prize t5 on t2.order_id = t5.order_id
+         left join mp_ticket_awards_prize t6 on t5.prize_id = t6.prize_id
             ${ew.customSqlSegment}
     </select>