소스 검색

Merge branch 'dev' of 113.31.163.91:quanshu/mp-server into dev

dai xiaodan 3 년 전
부모
커밋
3ae9125f6f
52개의 변경된 파일1365개의 추가작업 그리고 377개의 파일을 삭제
  1. 12 11
      mp-admin/pom.xml
  2. 73 20
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  3. 109 28
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java
  4. 66 15
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java
  5. 13 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelInviteController.java
  6. 52 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  7. 47 7
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  8. 22 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java
  9. 6 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  10. 37 11
      mp-admin/src/main/java/com/qs/mp/web/controller/common/FileUploadController.java
  11. 106 0
      mp-admin/src/main/java/com/qs/mp/web/controller/common/LogisticsController.java
  12. 104 49
      mp-admin/src/main/java/com/qs/mp/web/core/config/SwaggerConfig.java
  13. 9 1
      mp-admin/src/main/resources/application.yml
  14. 4 10
      mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java
  15. 7 13
      mp-common/pom.xml
  16. 36 0
      mp-common/src/main/java/com/qs/mp/common/enums/DeliverTypeEnum.java
  17. 44 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgSaleStatusEnum.java
  18. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPkgStatusEnum.java
  19. 89 0
      mp-common/src/main/java/com/qs/mp/common/image/CompressUtil.java
  20. 1 1
      mp-common/src/main/java/com/qs/mp/common/image/ThumbnailsImgFilter.java
  21. 5 10
      mp-common/src/main/java/com/qs/mp/common/jsms/JSMSUtils.java
  22. 1 0
      mp-common/src/main/java/com/qs/mp/common/utils/MD5.java
  23. 7 0
      mp-quartz/pom.xml
  24. 40 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/ChannelOrderTask.java
  25. 0 167
      mp-quartz/src/main/java/com/qs/mp/quartz/task/CosTask.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. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserDeliverOrderQueryParam.java
  32. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserDeliverOrderShipParam.java
  33. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketListVO.java
  34. 4 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  35. 29 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelOrder.java
  36. 5 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelOrderInfoVO.java
  37. 10 3
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  38. 27 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrder.java
  39. 18 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserDeliverOrderItem.java
  40. 12 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/DeliverOrderVO.java
  41. 11 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/OrderDeliverItemVO.java
  42. 6 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserDeliverOrderItemVO.java
  43. 7 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserDeliverOrderVO.java
  44. 9 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderService.java
  45. 14 2
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderItemServiceImpl.java
  46. 79 5
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java
  47. 16 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  48. 6 3
      mp-service/src/main/resources/mapper/admin/TicketPackageMapper.xml
  49. 1 1
      mp-service/src/main/resources/mapper/user/UserDeliverOrderItemMapper.xml
  50. 3 1
      mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml
  51. 1 1
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml
  52. 0 13
      pom.xml

+ 12 - 11
mp-admin/pom.xml

@@ -17,24 +17,25 @@
 
     <dependencies>
 
-        <!-- spring-boot-devtools -->
+        <!--快递100SDK-->
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-devtools</artifactId>
-            <optional>true</optional> <!-- 表示依赖不会传递 -->
+            <groupId>com.github.kuaidi100-api</groupId>
+            <artifactId>sdk</artifactId>
+            <version>1.0.8</version>
         </dependency>
 
-        <!-- swagger3-->
+        <!-- swagger 增强-->
         <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>2.0.8</version>
         </dependency>
 
-        <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
+        <!-- spring-boot-devtools -->
         <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-models</artifactId>
-            <version>1.6.2</version>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional> <!-- 表示依赖不会传递 -->
         </dependency>
 
          <!-- Mysql驱动包 -->

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

+ 109 - 28
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java

@@ -450,41 +450,46 @@ public class IndexMgrController extends BaseApiController {
 	// @PreAuthorize("@ss.hasPermi('business:channel:list')")
 	public AjaxResult listDailyData(@RequestBody IndexQueryParam indeQueryParam) {
 		
+		// 今天
 		IndexQueryParam queryParam = new IndexQueryParam();
-		queryParam.setStartTime(DateUtils.getPreDayOfNowZero(1));  // 昨天
+		queryParam.setStartTime(DateUtils.getPreDayOfNowZero(0));  // 今天0点
 		queryParam.setEndTime(new Date());  // 今天
 		
-		List<IndexVO> list = new ArrayList<IndexVO>();
-		List<IndexVO> siteList = new ArrayList<IndexVO>();
+		List<IndexVO> todayList = new ArrayList<IndexVO>();
+		List<IndexVO> yestodayList = new ArrayList<IndexVO>();
+		List<IndexVO> todaySiteList = new ArrayList<IndexVO>();
+		List<IndexVO> yetodaySiteList = new ArrayList<IndexVO>();
 		
-		QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
-		queryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
-		queryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
-		queryWrapper.gt("t1.`status`", 0);
+		QueryWrapper<UserTicketOrder> queryWrapper1 = new QueryWrapper<>();
+		queryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		queryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		queryWrapper1.gt("t1.`status`", 0);
+		todayList = userTicketOrderService.selectIndexDailyInfoList(queryWrapper1);
 		
-
-		QueryWrapper<Channel> siteQueryWrapper = new QueryWrapper<>();
-		siteQueryWrapper.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
-		siteQueryWrapper.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
-		siteQueryWrapper.eq("t1.`level`", 0);
+		QueryWrapper<Channel> siteQueryWrapper1 = new QueryWrapper<>();
+		siteQueryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		siteQueryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		siteQueryWrapper1.eq("t1.`level`", 0);
+		todaySiteList = channelService.selectIndexSiteIncreaseList(siteQueryWrapper1);
 		
-//		Long channelId = SecurityUtils.getLoginUser().getChannelId();
-//		if(null != channelId && 0 != channelId) {
-//			Channel channel = channelService.getById(channelId);
-//			if(null!=channel && StringUtils.isNotBlank(channel.getChannelNo())) {
-//				queryWrapper.and(wrapper -> wrapper.likeRight("t2.channel_no", channel.getChannelNo())
-//						.or().eq("t2.channel_no", channel.getChannelNo()));
-//				
-//				siteQueryWrapper.and(wrapper -> wrapper.likeRight("t2.channel_no", channel.getChannelNo())
-//						.or().eq("t2.channel_no", channel.getChannelNo()));
-//			}
-//		}
-	
-		list = userTicketOrderService.selectIndexDailyInfoList(queryWrapper);
-	
-		siteList = channelService.selectIndexSiteIncreaseList(siteQueryWrapper);
+		// 昨天
+		queryParam.setStartTime(DateUtils.getPreDayOfNowZero(1));  // 昨天0点
+		queryParam.setEndTime(DateUtils.getPreDayOfNow(1));  // 今天减去24小时
+		
+		QueryWrapper<UserTicketOrder> queryWrapper2 = new QueryWrapper<>();
+		queryWrapper2.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		queryWrapper2.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		queryWrapper2.gt("t1.`status`", 0);
+		yestodayList = userTicketOrderService.selectIndexDailyInfoList(queryWrapper2);
 		
-		return  AjaxResult.success(getDailyInfoData(list, siteList));
+
+		QueryWrapper<Channel> siteQueryWrapper2 = new QueryWrapper<>();
+		siteQueryWrapper2.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		siteQueryWrapper2.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		siteQueryWrapper2.eq("t1.`level`", 0);
+		yetodaySiteList = channelService.selectIndexSiteIncreaseList(siteQueryWrapper2);
+		
+		return  AjaxResult.success(calcDailyInfoData(todayList, yestodayList, todaySiteList, yetodaySiteList));
 	}
 	
 	
@@ -551,6 +556,82 @@ public class IndexMgrController extends BaseApiController {
 		return map;
 	} 
 	
+	
+	@SuppressWarnings("unused")
+	private Map<String,Object> calcDailyInfoData(List<IndexVO> todayList, List<IndexVO> yetodayList,  List<IndexVO> todaySiteList, List<IndexVO> yetodaySiteList){
+		Map<String,Object> payAmt = new HashMap<String,Object>();
+		Map<String,Object> payUser = new HashMap<String,Object>();
+		Map<String,Object> ticketNum = new HashMap<String,Object>();
+		Map<String,Object> newSite = new HashMap<String,Object>();
+		
+		String today = DateUtils.parseDateToStr(DateUtils.YYYYMMDD,new Date());
+		
+		int todayPayAmt = 0;
+		int todayPayUserCnt = 0;
+		int todayTicketNum = 0;
+		int todayNewSiteCnt = 0;
+		
+		int yesterdayPayAmt = 0;
+		int yesterdayPayUserCnt = 0;
+		int yesterdayTicketNum = 0;
+		int yesterdayNewSiteCnt = 0;
+		
+		if(null != todayList && todayList.size() > 0) {
+			for(IndexVO indexVo : todayList) {
+				if(null != indexVo 
+						&& StringUtils.isNotBlank(indexVo.getTime())) {
+					todayPayAmt +=  null != indexVo.getPayAmt()?indexVo.getPayAmt():0;
+					todayPayUserCnt +=  null != indexVo.getPayUserCnt()?indexVo.getPayUserCnt():0;
+					todayTicketNum += null != indexVo.getTicketNum()?indexVo.getTicketNum():0;
+				}
+			}
+		}
+		
+		if(null != yetodayList && yetodayList.size() > 0) {
+			for(IndexVO indexVo : yetodayList) {
+				if(null != indexVo) {
+					yesterdayPayAmt += null != indexVo.getPayAmt()?indexVo.getPayAmt():0;
+					yesterdayPayUserCnt += null != indexVo.getPayUserCnt()?indexVo.getPayUserCnt():0;
+					yesterdayTicketNum +=  null != indexVo.getTicketNum()?indexVo.getTicketNum():0;
+				}
+			}
+		}
+		
+		if(null != todaySiteList && todaySiteList.size() > 0) {
+			for(IndexVO indexVo : todaySiteList) {
+				if(null != indexVo 
+						&& null != indexVo.getNewSiteCnt()) {
+					todayNewSiteCnt += null != indexVo.getNewSiteCnt()?indexVo.getNewSiteCnt():0;
+				}
+			}
+		}
+		
+		if(null != yetodaySiteList && yetodaySiteList.size() > 0) {
+			for(IndexVO indexVo : yetodaySiteList) {
+				if(null != indexVo 
+						&& null != indexVo.getNewSiteCnt()) {
+					yesterdayNewSiteCnt += null != indexVo.getNewSiteCnt()?indexVo.getNewSiteCnt():0;
+				}
+			}
+		}
+		
+		payAmt.put("today", todayPayAmt);
+		payAmt.put("yesterday", yesterdayPayAmt);
+		payUser.put("today", todayPayUserCnt);
+		payUser.put("yesterday", yesterdayPayUserCnt);
+		ticketNum.put("today", todayTicketNum);
+		ticketNum.put("yesterday", yesterdayTicketNum);
+		newSite.put("today", todayNewSiteCnt);
+		newSite.put("yesterday", yesterdayNewSiteCnt);
+		
+		Map<String,Object> map = new HashMap<String,Object>();
+		map.put("payAmt", payAmt);
+		map.put("payUser", payUser);
+		map.put("ticketNum", ticketNum);
+		map.put("newSite", newSite);
+		return map;
+	} 
+	
 	/**
 	 * 查询统计统计票组销售TOP10
 	 * @return

+ 66 - 15
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,12 +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 && 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());
@@ -94,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())) {
@@ -123,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);
 				}
 			}
@@ -141,6 +176,7 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 			boolean rtn = userDeliverOrderService.userDeliverOrderShip(shipParam.getOrderId(), itemList);
 			return rtn ? AjaxResult.success() : AjaxResult.error("发货失败");
 		}
+
 		return AjaxResult.error("发货失败");
 	}
 
@@ -150,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;
 	}
 }

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

+ 22 - 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,6 +29,9 @@ 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;
@@ -66,11 +71,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);
   }
 

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

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
+import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.TicketBox;
@@ -242,6 +244,10 @@ public class UserTicketController extends BaseApiController {
 
   @PostMapping("/ticket/hitPrizeBarrage")
   @ApiOperation(value = "中奖弹幕", notes = "获取最近中奖的 20-22 条信息")
+  @DynamicResponseParameters(properties = {
+    @DynamicParameter(name = "listOne", value = "列表 1",required = true, dataTypeClass = TicketHitPrizeBarrageVO.class),
+    @DynamicParameter(name = "listTwo", value = "列表 2",required = true, dataTypeClass = TicketHitPrizeBarrageVO.class)
+  })
   public AjaxResult hitPrizeBarrage() {
 
     // 获取用户 id

+ 37 - 11
mp-admin/src/main/java/com/qs/mp/web/controller/common/FileUploadController.java

@@ -1,10 +1,10 @@
 package com.qs.mp.web.controller.common;
 
 
-import com.alibaba.druid.sql.visitor.functions.If;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.enums.PicHandlerTypeEnum;
-import com.qs.mp.common.filter.ThumbnailsImgFilter;
+import com.qs.mp.common.image.CompressUtil;
+import com.qs.mp.common.image.ThumbnailsImgFilter;
 import com.qs.mp.common.qcloud.QcloudFileUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
@@ -13,7 +13,10 @@ import com.qs.mp.core.domain.LoginUser;
 import com.qs.mp.core.domain.UploadAttachment;
 import com.qs.mp.framework.security.handle.HostHolder;
 import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
 import javax.imageio.ImageIO;
 import net.coobird.thumbnailator.Thumbnails;
 import net.coobird.thumbnailator.Thumbnails.Builder;
@@ -55,7 +58,6 @@ public class FileUploadController extends BaseApiController {
     @Value("${cloud.private-bucket-name}")
     private String privateBucketName;
 
-
     @Autowired
     protected HostHolder hostHolder;
 
@@ -144,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)) {
@@ -240,13 +243,17 @@ public class FileUploadController extends BaseApiController {
         String name = UUIDUtils.newId() + suffix;
         try {
             QcloudFileUtils.putStream(file.getInputStream(), name, bucketName, mimeType );
-            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
-            Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
+
+            // 后台不再需要压缩,直接前端调用cos的压缩方法 2022.4.20
+ /*           BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
+//            Builder<BufferedImage> builder = Thumbnails.of(bufferedImage);
 
 
             int pWidth = bufferedImage.getWidth();
             int pHeight = bufferedImage.getHeight();
-            builder.size(pWidth, pHeight);
+//            builder.size(pWidth, pHeight);
+            double accuracy = CompressUtil.getAccuracy(file.getSize()/1024);
+            LogUtil.info(logger, "原始文件长:{0},大小:{1},contentType:{2}", pWidth, file.getSize()/1024, mimeType);
 
             String outFileDir = filePath+"/thumb";
             File tempFile = new File(outFileDir);
@@ -255,27 +262,46 @@ public class FileUploadController extends BaseApiController {
             }
             String thumbName = name +"_s";
             String outFilePath = filePath+"/thumb/"+thumbName+"."+mimeType.substring(mimeType.lastIndexOf("/")+1);
-            builder.toFile(outFilePath);
+//            builder.toFile(outFilePath);
 
             // 压缩图片
             if (pWidth > 500) {
                 float scale = 500f / pWidth;
-                Thumbnails.of(outFilePath).scale(scale).outputQuality(0.8f).toFile(outFilePath);
+                if ("image/png".equals(file.getContentType())) {
+                    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 {
-                Thumbnails.of(outFilePath).scale(1f).outputQuality(0.8f).toFile(outFilePath);
+                if ("image/png".equals(file.getContentType())) {
+                    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);
-            QcloudFileUtils.putFile(outFile, thumbName, bucketName, mimeType);
+            LogUtil.info(logger, "压缩后文件大小:{0}", outFile.length()/ 1024);
+            if (outFile.length() < file.getSize()) {
+                QcloudFileUtils.putFile(outFile, thumbName, bucketName, mimeType);
+            } else {
+                // 如果大小没被压缩,则用原图作为缩略图
+                QcloudFileUtils.putStream(file.getInputStream(), thumbName, bucketName, mimeType );
+            }
             if(outFile.exists()) {
                 LogUtil.info(log, "delete file..."+outFilePath);
                 outFile.delete();
-            }
+            }*/
         }  catch (Exception e) {
             LogUtil.error(log, e, "");
             return null;
         }
         return name;
     }
+
 }

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

+ 104 - 49
mp-admin/src/main/java/com/qs/mp/web/core/config/SwaggerConfig.java

@@ -21,6 +21,7 @@ import springfox.documentation.service.SecurityScheme;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
 
 /**
  * Swagger2的接口配置
@@ -28,6 +29,7 @@ import springfox.documentation.spring.web.plugins.Docket;
  * @author ygp
  */
 @Configuration
+@EnableSwagger2WebMvc
 public class SwaggerConfig
 {
     /** 系统基础配置 */
@@ -42,68 +44,121 @@ public class SwaggerConfig
     @Value("${swagger.pathMapping}")
     private String pathMapping;
 
-    /**
-     * 创建API
-     */
+
+
     @Bean
-    public Docket createRestApi()
-    {
-        return new Docket(DocumentationType.OAS_30)
-                // 是否启用Swagger
+    public Docket defaultApi1() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .enable(enabled)
+                .apiInfo(apiInfo())
+                .groupName("管理端接口")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.qs.mp.web.controller.api.admin"))
+                .paths(PathSelectors.any())
+                .build();
+
+    }
+
+    @Bean
+    public Docket defaultApi2() {
+        return new Docket(DocumentationType.SWAGGER_2)
                 .enable(enabled)
-                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
                 .apiInfo(apiInfo())
-                // 设置哪些接口暴露给Swagger展示
+                .groupName("用户端接口")
                 .select()
-                // 扫描所有有注解的api,用这种方式更灵活
-                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
-                // 扫描指定包中的swagger注解
-                // .apis(RequestHandlerSelectors.basePackage("com.qs.mp.project.tool.swagger"))
-                // 扫描所有 .apis(RequestHandlerSelectors.any())
+                .apis(RequestHandlerSelectors.basePackage("com.qs.mp.web.controller.api.user"))
                 .paths(PathSelectors.any())
-                .build()
-                /* 设置安全模式,swagger可以设置访问token */
-                .securitySchemes(securitySchemes())
-                .securityContexts(securityContexts())
-                .pathMapping(pathMapping);
+                .build();
+
     }
 
+    @Bean
+    public Docket defaultApi3() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .enable(enabled)
+                .apiInfo(apiInfo())
+                .groupName("渠道端接口")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.qs.mp.web.controller.api.channel"))
+                .paths(PathSelectors.any())
+                .build();
+
+    }
+
+    @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();
+
+    }
+
+
     /**
-     * 安全模式,这里指定token通过Authorization头请求头传递
+     * 创建API
      */
-    private List<SecurityScheme> securitySchemes()
-    {
-        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
-        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
-        return apiKeyList;
-    }
+//    @Bean
+//    public Docket createRestApi()
+//    {
+//        return new Docket(DocumentationType.SWAGGER_2)
+//                // 是否启用Swagger
+//                .enable(enabled)
+//                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
+//                .apiInfo(apiInfo())
+//                // 设置哪些接口暴露给Swagger展示
+//                .select()
+//                // 扫描所有有注解的api,用这种方式更灵活
+//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+//                // 扫描指定包中的swagger注解
+//                // .apis(RequestHandlerSelectors.basePackage("com.qs.mp.project.tool.swagger"))
+//                // 扫描所有 .apis(RequestHandlerSelectors.any())
+//                .paths(PathSelectors.any())
+//                .build()
+//
+//                .pathMapping(pathMapping);
+//    }
 
     /**
-     * 安全上下文
+     * 安全模式,这里指定token通过Authorization头请求头传递
      */
-    private List<SecurityContext> securityContexts()
-    {
-        List<SecurityContext> securityContexts = new ArrayList<>();
-        securityContexts.add(
-                SecurityContext.builder()
-                        .securityReferences(defaultAuth())
-                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
-                        .build());
-        return securityContexts;
-    }
+//    private List<SecurityScheme> securitySchemes()
+//    {
+//        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
+//        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
+//        return apiKeyList;
+//    }
 
     /**
-     * 默认的安全上引用
+     * 安全上下文
      */
-    private List<SecurityReference> defaultAuth()
-    {
-        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
-        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
-        authorizationScopes[0] = authorizationScope;
-        List<SecurityReference> securityReferences = new ArrayList<>();
-        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
-        return securityReferences;
-    }
+//    private List<SecurityContext> securityContexts()
+//    {
+//        List<SecurityContext> securityContexts = new ArrayList<>();
+//        securityContexts.add(
+//                SecurityContext.builder()
+//                        .securityReferences(defaultAuth())
+//                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
+//                        .build());
+//        return securityContexts;
+//    }
+//
+//    /**
+//     * 默认的安全上引用
+//     */
+//    private List<SecurityReference> defaultAuth()
+//    {
+//        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+//        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+//        authorizationScopes[0] = authorizationScope;
+//        List<SecurityReference> securityReferences = new ArrayList<>();
+//        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
+//        return securityReferences;
+//    }
 
     /**
      * 添加摘要信息
@@ -113,9 +168,9 @@ public class SwaggerConfig
         // 用ApiInfoBuilder进行定制
         return new ApiInfoBuilder()
                 // 设置标题
-                .title("标题:旺铺管家_接口文档")
+                .title("标题:盲票_接口文档")
                 // 描述
-                .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
+                .description("描述:用于管理盲票各端接口信息...")
                 // 作者信息
                 .contact(new Contact(mpConfig.getName(), null, null))
                 // 版本

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

@@ -87,7 +87,9 @@ swagger:
   # 是否开启swagger
   enabled: true
   # 请求前缀
-  pathMapping: /dev-api
+  pathMapping: /
+knife4j:
+  enable: true
 
 # 防止XSS攻击
 xss:
@@ -152,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();
   }
 
 

+ 7 - 13
mp-common/pom.xml

@@ -18,11 +18,17 @@
      <properties>
         <hutool.version>5.3.1</hutool.version>
         <lombok.version>1.18.10</lombok.version>
-         <swagger.version>3.0.0</swagger.version>
     </properties>
 
     <dependencies>
 
+        <!-- swagger 增强-->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>2.0.8</version>
+        </dependency>
+
         <!-- Spring框架基本的核心工具 -->
         <dependency>
             <groupId>org.springframework</groupId>
@@ -210,18 +216,6 @@
            <scope>compile</scope>
         </dependency>
 
-         <!-- Swagger3依赖 -->
-         <dependency>
-             <groupId>io.springfox</groupId>
-             <artifactId>springfox-boot-starter</artifactId>
-             <version>${swagger.version}</version>
-             <exclusions>
-                 <exclusion>
-                     <groupId>io.swagger</groupId>
-                     <artifactId>swagger-models</artifactId>
-                 </exclusion>
-             </exclusions>
-         </dependency>
 
     </dependencies>
 

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

+ 89 - 0
mp-common/src/main/java/com/qs/mp/common/image/CompressUtil.java

@@ -0,0 +1,89 @@
+package com.qs.mp.common.image;
+
+import com.qs.mp.common.utils.LogUtil;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import net.coobird.thumbnailator.Thumbnails;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 压缩工具类
+ *
+ * @author zhongcp
+ * @Date 2022/4/16
+ */
+public class CompressUtil {
+
+  protected static final Logger logger = LoggerFactory.getLogger(CompressUtil.class);
+
+  private static final Integer ZERO = 0;
+  private static final Integer ONE_ZERO_TWO_FOUR = 1024;
+  private static final Integer NINE_ZERO_ZERO = 400;
+  private static final Integer THREE_TWO_SEVEN_FIVE = 2047;
+  private static final Integer TWO_ZERO_FOUR_SEVEN = 900;
+  private static final Double ZERO_EIGHT_FIVE = 0.85;
+  private static final Double ZERO_SIX = 0.6;
+  private static final Double ZERO_FOUR_FOUR = 0.44;
+  private static final Double ZERO_FOUR = 0.4;
+
+  /**
+   * 根据指定大小压缩图片
+   *
+   * @param imageBytes  源图片字节数组
+   * @param desFileSize 指定图片大小,单位kb
+   * @return 压缩质量后的图片字节数组
+   */
+  public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
+    if (imageBytes == null || imageBytes.length <= ZERO
+        || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
+      return imageBytes;
+    }
+    long srcSize = imageBytes.length;
+    double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
+    try {
+
+      ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
+      while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
+        ByteArrayInputStream inputStream = null;
+        try {
+          inputStream = new ByteArrayInputStream(imageBytes);
+          Thumbnails.of(inputStream)
+              .scale(accuracy)
+              .outputQuality(accuracy)
+              .toOutputStream(outputStream);
+          imageBytes = outputStream.toByteArray();
+        } finally {
+          if (null != inputStream) {
+            inputStream.close();
+          }
+        }
+      }
+      LogUtil.info(logger, "图片原大小={}kb | 压缩后大小={}kb",
+          srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
+    } catch (Exception e) {
+      LogUtil.error(logger, "【图片压缩】msg=图片压缩失败!", e);
+    }
+    return imageBytes;
+  }
+
+  /**
+   * 自动调节精度(经验数值)
+   *
+   * @param size 源图片大小
+   * @return 图片压缩质量比
+   */
+  public static double getAccuracy(long size) {
+    double accuracy;
+    if (size < NINE_ZERO_ZERO) {
+      accuracy = ZERO_EIGHT_FIVE;
+    } else if (size < TWO_ZERO_FOUR_SEVEN) {
+      accuracy = ZERO_SIX;
+    } else if (size < THREE_TWO_SEVEN_FIVE) {
+      accuracy = ZERO_FOUR_FOUR;
+    } else {
+      accuracy = ZERO_FOUR;
+    }
+    return accuracy;
+  }
+}

+ 1 - 1
mp-common/src/main/java/com/qs/mp/common/filter/ThumbnailsImgFilter.java → mp-common/src/main/java/com/qs/mp/common/image/ThumbnailsImgFilter.java

@@ -1,4 +1,4 @@
-package com.qs.mp.common.filter;
+package com.qs.mp.common.image;
 
 import java.awt.Color;
 import java.awt.Graphics2D;

+ 5 - 10
mp-common/src/main/java/com/qs/mp/common/jsms/JSMSUtils.java

@@ -66,11 +66,9 @@ public class JSMSUtils {
 
             }
         } catch (APIConnectionException e) {
-            logger.error("Connection error. Should retry later. ", e);
+            logger.error("Connection error. Should retry later. " + e.getMessage());
         } catch (APIRequestException e) {
-            logger.error("Error response from JPush server. Should review and fix it. ", e);
-            logger.info("HTTP Status: " + e.getStatus());
-            logger.info("Error Message: " + e.getMessage());
+            logger.error("Error response from JPush server. Should review and fix it. " + e.getMessage());
         }
         return null;
     }
@@ -95,9 +93,9 @@ public class JSMSUtils {
 
             }
         } catch (APIConnectionException e) {
-            LogUtil.error(logger, e, "短信发送失败,mobile:{0}", mobile);
+            LogUtil.error(logger, "短信发送失败,mobile:{0},msg:{1}", new Object[]{mobile, e.getMessage()});
         } catch (APIRequestException e) {
-            LogUtil.error(logger, e, "短信发送失败,mobile:{0}", mobile);
+            LogUtil.error(logger, "短信发送失败,mobile:{0},msg:{1}", new Object[]{mobile, e.getMessage()});
         }
         return null;
     }
@@ -140,12 +138,9 @@ public class JSMSUtils {
                 return (new GsonBuilder()).excludeFieldsWithoutExposeAnnotation().create().fromJson("{\"is_valid\":TRUE}", ValidSMSResult.class);
             }
         } catch (APIConnectionException e) {
-            logger.error("Connection error. Should retry later. ", e);
+            logger.error("Connection error. Should retry later. " +  e.getMessage());
         } catch (APIRequestException e) {
             logger.error(e.getStatus() + " errorCode: " + e.getErrorCode() + " " + e.getErrorMessage());
-            logger.error("Error response from JPush server. Should review and fix it. ", e);
-            logger.info("HTTP Status: " + e.getStatus());
-            logger.info("Error Message: " + e.getMessage());
         }
         return null;
     }

+ 1 - 0
mp-common/src/main/java/com/qs/mp/common/utils/MD5.java

@@ -1,6 +1,7 @@
 package com.qs.mp.common.utils;
 
 import java.security.MessageDigest;
+import java.util.Iterator;
 /** 
  * 说明:MD5处理
  * 创建人:FH Q313596790

+ 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(int 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 - 167
mp-quartz/src/main/java/com/qs/mp/quartz/task/CosTask.java

@@ -1,167 +0,0 @@
-package com.qs.mp.quartz.task;
-
-import cn.hutool.core.img.Img;
-import com.qcloud.cos.COSClient;
-import com.qcloud.cos.exception.CosClientException;
-import com.qcloud.cos.exception.CosServiceException;
-import com.qcloud.cos.model.*;
-import com.qs.mp.common.core.domain.AjaxResult;
-import com.qs.mp.common.enums.PicHandlerTypeEnum;
-import com.qs.mp.common.filter.ThumbnailsImgFilter;
-import com.qs.mp.common.qcloud.QcloudFileUtils;
-import com.qs.mp.common.utils.LogUtil;
-import com.qs.mp.common.utils.StringUtils;
-import com.qs.mp.common.utils.UUIDUtils;
-import com.qs.mp.core.domain.LoginUser;
-import com.qs.mp.core.domain.UploadAttachment;
-import net.coobird.thumbnailator.Thumbnails;
-import net.coobird.thumbnailator.geometry.Positions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-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.PutMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * 腾讯 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 mimeType = "image/jpg";
-//        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);
-
-        String outFileDir = filePath + "/thumb";
-        File tempFile = new File(outFileDir);
-        if (!tempFile.exists()) {
-            tempFile.mkdirs();
-        }
-        String thumbName = key + "_s";
-        String outFilePath = filePath + "/thumb/" + thumbName + "." + mimeType.substring(mimeType.lastIndexOf("/") + 1);
-        builder.toFile(outFilePath);
-
-        // 压缩图片
-        if (pWidth > 500) {
-
-            float scale = 500f / pWidth;
-
-            Thumbnails.of(outFilePath).scale(scale).outputQuality(0.8f).toFile(outFilePath);
-        }else {
-            Thumbnails.of(outFilePath).scale(1f).outputQuality(0.8f).toFile(outFilePath);
-        }
-
-
-        File outFile = new File(outFilePath);
-        QcloudFileUtils.putFile(outFile, thumbName, publicBucketName, mimeType);
-
-        downFile.delete();
-        outFile.delete();
-
-
-    }
-
-
-}

+ 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(int 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
 	 */

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

@@ -31,6 +31,9 @@ public class UserDeliverOrderQueryParam {
 	@ApiModelProperty(value = "订单状态", required = false)
 	private Integer status;
 
+	@ApiModelProperty(value = "收货人手机号", required = false)
+	private String tel;
+
 	/**
 	 * 下单区间-开始时间
 	 */

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

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

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

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

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

+ 16 - 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.CommStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 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.TicketStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
@@ -106,6 +109,9 @@ public class UserTicketOrderServiceImpl extends
   @Autowired
   private IChannelMoneyLogService channelMoneyLogService;
 
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
@@ -379,6 +385,7 @@ public class UserTicketOrderServiceImpl extends
             new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty, ticketBox.getSaleQty() + 1)
                 .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
       }
+
       // 开幸运数字,更新ticket状态为已激活
       boolean rtn = ticketService.update(
           new LambdaUpdateWrapper<Ticket>().set(Ticket::getPlainLuckyNum,
@@ -386,6 +393,15 @@ public class UserTicketOrderServiceImpl extends
               .set(Ticket::getStatus, TicketStatusEnum.ACTIVATED)
               .eq(Ticket::getTicketId, ticket.getTicketId()));
       Assert.isTrue(rtn, "支付回调用户购票订单处理,更新盲票状态失败,ticketId:" + ticket.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()));
+
     }
 
     // 更新订单状态为已完成

+ 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

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

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

@@ -54,7 +54,7 @@
 		select 
           DATE_FORMAT(t1.created_time, '%Y%m%d') AS time,
           SUM(t1.pay_amt) AS payAmt,
-          SUM(IFNULL(t1.ticket_num,0)) AS 'ticketNum',
+          SUM(IFNULL(t1.ticket_num,0)) AS ticketNum,
           COUNT(DISTINCT t1.user_id) AS payUserCnt
 	     from `mp_user_ticket_order` t1
 		${ew.customSqlSegment}

+ 0 - 13
pom.xml

@@ -20,7 +20,6 @@
         <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
         <druid.version>1.2.6</druid.version>
         <bitwalker.version>1.21</bitwalker.version>
-        <swagger.version>3.0.0</swagger.version>
         <orika.version>1.5.4</orika.version>
 		    <kaptcha.version>2.3.2</kaptcha.version>
 		    <mybatis-spring-boot.version>2.1.4</mybatis-spring-boot.version>
@@ -147,18 +146,6 @@
                 <artifactId>orika-core</artifactId>
                 <version>${orika.version}</version>
             </dependency>
-            <!-- Swagger3依赖 -->
-            <dependency>
-                <groupId>io.springfox</groupId>
-                <artifactId>springfox-boot-starter</artifactId>
-                <version>${swagger.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>io.swagger</groupId>
-                        <artifactId>swagger-models</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
 
             <!-- io常用工具类 -->
             <dependency>