Преглед на файлове

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

Dev

See merge request quanshu/mp-server!48
zhong chunping преди 3 години
родител
ревизия
80e545b470
променени са 65 файла, в които са добавени 1490 реда и са изтрити 272 реда
  1. 31 12
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelTreeController.java
  2. 12 11
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteController.java
  3. 211 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  4. 42 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelStatusEnum.java
  5. 49 0
      mp-common/src/main/java/com/qs/mp/common/enums/CoinLogTypeEnum.java
  6. 39 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponDiscountTypeEnum.java
  7. 38 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponDistributeTypeEnum.java
  8. 40 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponStatusEnum.java
  9. 39 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponTypeEnum.java
  10. 39 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java
  11. 3 1
      mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java
  12. 39 0
      mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageInTypeEnum.java
  13. 38 0
      mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageStatusEnum.java
  14. 44 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.java
  15. 41 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserCouponStatusEnum.java
  16. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserTicketOrderStatusEnum.java
  17. 87 19
      mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java
  18. 1 0
      mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java
  19. 22 10
      mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java
  20. 1 1
      mp-service/src/main/java/com/qs/mp/admin/domain/CouponChannel.java
  21. 1 1
      mp-service/src/main/java/com/qs/mp/admin/domain/CouponTicket.java
  22. 10 112
      mp-service/src/main/java/com/qs/mp/admin/domain/Ticket.java
  23. 11 1
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketAwardsPrize.java
  24. 19 0
      mp-service/src/main/java/com/qs/mp/admin/domain/dto/TicketDrawNumDTO.java
  25. 7 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketParam.java
  26. 7 2
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketVO.java
  27. 1 1
      mp-service/src/main/java/com/qs/mp/admin/mapper/TicketMapper.java
  28. 8 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICouponService.java
  29. 1 1
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketService.java
  30. 65 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java
  31. 1 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketServiceImpl.java
  32. 8 0
      mp-service/src/main/java/com/qs/mp/channel/domain/Channel.java
  33. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelVO.java
  34. 12 2
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelCommissionMapper.java
  35. 14 2
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelCommissionService.java
  36. 7 2
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelCommissionServiceImpl.java
  37. 5 5
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java
  38. 1 7
      mp-service/src/main/java/com/qs/mp/user/domain/UserCoin.java
  39. 5 1
      mp-service/src/main/java/com/qs/mp/user/domain/UserCoinLog.java
  40. 7 3
      mp-service/src/main/java/com/qs/mp/user/domain/UserCoupon.java
  41. 53 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserCouponChannel.java
  42. 20 2
      mp-service/src/main/java/com/qs/mp/user/domain/UserPrizeStorage.java
  43. 5 1
      mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java
  44. 6 0
      mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrderItem.java
  45. 13 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserCouponChannelMapper.java
  46. 7 1
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderItemMapper.java
  47. 7 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserCoinService.java
  48. 16 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserCouponChannelService.java
  49. 17 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserHitPrizeService.java
  50. 10 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserPrizeStorageService.java
  51. 7 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderItemService.java
  52. 0 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCoinLogServiceImpl.java
  53. 36 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCoinServiceImpl.java
  54. 20 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponChannelServiceImpl.java
  55. 116 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java
  56. 29 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserPrizeStorageServiceImpl.java
  57. 13 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderItemServiceImpl.java
  58. 2 1
      mp-service/src/main/resources/mapper/admin/TicketAwardsPrizeMapper.xml
  59. 6 23
      mp-service/src/main/resources/mapper/admin/TicketMapper.xml
  60. 16 3
      mp-service/src/main/resources/mapper/channel/ChannelCommissionMapper.xml
  61. 6 36
      mp-service/src/main/resources/mapper/channel/ChannelMapper.xml
  62. 2 3
      mp-service/src/main/resources/mapper/user/UserCoinMapper.xml
  63. 19 0
      mp-service/src/main/resources/mapper/user/UserCouponChannelMapper.xml
  64. 4 2
      mp-service/src/main/resources/mapper/user/UserPrizeStorageMapper.xml
  65. 10 2
      mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

+ 31 - 12
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelTreeController.java

@@ -65,7 +65,7 @@ public class ChannelTreeController extends BaseApiController {
 	public AjaxResult treeChannel(@RequestBody Channel channel) {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
-		queryWrapper.eq("t1.parent_id", null!=channel && null != channel.getChannelId()?channel.getChannelId():0);
+		queryWrapper.eq("t1.parent_id", null!=channel && null != channel.getParentId()?channel.getParentId():0);
 		queryWrapper.gt("t1.level", 0);
 		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getMobile()), "t1.mobile", channel.getMobile());
 		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
@@ -90,6 +90,23 @@ public class ChannelTreeController extends BaseApiController {
 		return AjaxResult.success(list);
 	}
 	
+	
+	/**
+	 * 查询所有渠道列表
+	 *
+	 * @return
+	 */
+	@PostMapping("/listAll")
+	public AjaxResult listAllChannel() {
+		List<Channel> list = new ArrayList<Channel>();
+		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+		queryWrapper.gt(Channel::getLevel, 0);
+		queryWrapper.orderByAsc(Channel::getCreatedTime);
+		list = channelService.list(queryWrapper);
+		return AjaxResult.success(list);
+	}
+	
+	
 	/**
 	 * 获取我的下级渠道列表信息,支持翻页
 	 *
@@ -100,12 +117,13 @@ public class ChannelTreeController extends BaseApiController {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		startPage();
 		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
-		queryWrapper.eq("t1.parent_id", null!=channel && null != channel.getChannelId()?channel.getChannelId():0);
+		if(null!=channel && null != channel.getParentId()) {
+			queryWrapper.eq("t1.parent_id", channel.getParentId());
+		}
 		queryWrapper.gt("t1.level", 0);
 		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getMobile()), "t1.mobile", channel.getMobile());
 		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
 		queryWrapper.orderByAsc("t1.channel_id");
-		queryWrapper.last("limit 50");
 		list = channelService.selectChannelVoList(queryWrapper);
 		if(null != list && list.size() > 0) {
 			for(ChannelVO channelVO : list) {
@@ -115,8 +133,8 @@ public class ChannelTreeController extends BaseApiController {
 					channelVO.setSiteCnt(siteCnt);
 					channelVO.setUserCnt(userCnt);
 					// 查询用户信息
-					SysUser sysUser = userService.selectUserById(channelVO.getUserId());
-					channelVO.setSysUser(sysUser);
+					// SysUser sysUser = userService.selectUserById(channelVO.getUserId());
+					// channelVO.setSysUser(sysUser);
  				}
 			}
 		}
@@ -263,14 +281,15 @@ public class ChannelTreeController extends BaseApiController {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 		try {
+			channelService.lambdaUpdate().set(Channel::getStatus, status).eq(Channel::getChannelId, channelId).update();
 			// 查询渠道信息
-			Channel channel = channelService.getById(channelId);
-			if(null != channel && null != channel.getUserId()) {
-				SysUser sysUser = new SysUser();
-				sysUser.setUserId(channel.getUserId());
-				sysUser.setStatus(status);
-				userService.updateUserStatus(sysUser);
-			}
+//			Channel channel = channelService.getById(channelId);
+//			if(null != channel && null != channel.getUserId()) {
+//				SysUser sysUser = new SysUser();
+//				sysUser.setUserId(channel.getUserId());
+//				sysUser.setStatus(status);
+//				userService.updateUserStatus(sysUser);
+//			}
 		} catch (Exception e) {
 			return AjaxResult.error("操作失败");
 		}

+ 12 - 11
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteController.java

@@ -67,8 +67,8 @@ public class SaleSiteController extends BaseApiController {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		startPage();
 		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
-		if(null!=channel && null != channel.getChannelId()) {
-			queryWrapper.eq("t1.parent_id", channel.getChannelId());
+		if(null!=channel && null != channel.getParentId()) {
+			queryWrapper.eq("t1.parent_id", channel.getParentId());
 		}
 		queryWrapper.eq("t1.level", 0);
 		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getMobile()), "t1.mobile", channel.getMobile());
@@ -86,8 +86,8 @@ public class SaleSiteController extends BaseApiController {
 					channelVO.setSiteCnt(siteCnt);
 					channelVO.setUserCnt(userCnt);
 					// 查询用户信息
-					SysUser sysUser = userService.selectUserById(channelVO.getUserId());
-					channelVO.setSysUser(sysUser);
+					//SysUser sysUser = userService.selectUserById(channelVO.getUserId());
+					// channelVO.setSysUser(sysUser);
  				}
 			}
 		}
@@ -223,14 +223,15 @@ public class SaleSiteController extends BaseApiController {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
 		}
 		try {
+			channelService.lambdaUpdate().set(Channel::getStatus, status).eq(Channel::getChannelId, channelId).update();
 			// 查询渠道信息
-			Channel channel = channelService.getById(channelId);
-			if(null != channel && null != channel.getUserId()) {
-				SysUser sysUser = new SysUser();
-				sysUser.setUserId(channel.getUserId());
-				sysUser.setStatus(status);
-				userService.updateUserStatus(sysUser);
-			}
+//			Channel channel = channelService.getById(channelId);
+//			if(null != channel && null != channel.getUserId()) {
+//				SysUser sysUser = new SysUser();
+//				sysUser.setUserId(channel.getUserId());
+//				sysUser.setStatus(status);
+//				userService.updateUserStatus(sysUser);
+//			}
 		} catch (Exception e) {
 			return AjaxResult.error("操作失败");
 		}

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

@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
+ *
+ * https://www.mall4j.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.qs.mp.web.controller.api.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.param.TicketParam;
+import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.domain.vo.TicketVO;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserHitPrizeService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user")
+@Api(tags = "渠道盲票商城接口")
+@AllArgsConstructor
+public class UserTicketController extends BaseApiController {
+
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+  @Autowired
+  private ITicketService ticketService;
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private IUserHitPrizeService userHitPrizeService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 盲票进货列表
+   */
+  @PostMapping("/mall/ticket/list")
+  @ApiOperation(value = "盲票组列表" , notes = "获取所有盲票信息")
+  public TableDataInfo list(@RequestBody TicketBoxParam param) {
+    // TODO 根据标签过滤
+    startPage();
+    List<TicketBox> ticketBoxes = ticketBoxService.list(
+        new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
+            .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
+            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON));
+    List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes, TicketBoxListVO.class);
+    TableDataInfo rspData = getDataTable(ticketBoxes);
+    rspData.setRows(ticketBoxListVOList);
+    return rspData;
+  }
+
+
+  /**
+   * 查看盲票详情
+   */
+  @PostMapping("/mall/ticket/detail")
+  @ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
+  public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
+    if (StringUtils.isBlank(param.getBoxId())) {
+      return AjaxResult.error("参数异常,盲票组ID缺失");
+    }
+    TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+    TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    return AjaxResult.success(ticketBoxVO);
+  }
+
+  /**
+   * 扫码查看盲票幸运数字
+   */
+  @PostMapping("/ticket/queryLuckyNum")
+  @ApiOperation(value = "查看盲票幸运数字" , notes = "根据盲票组ID,获取盲票幸运数字")
+  public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId())) {
+      return AjaxResult.error("参数异常,盲票ID缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+
+    // 已付款的盲票,需要校验当前用户是否有权限查看
+    if (ticket.getStatus() == TicketStatusEnum.ACTIVATED) {
+      UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, param.getTicketId());
+      if (null == orderItem) {
+        return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
+      }
+    }
+
+    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+
+    TicketVO ticketVO = new TicketVO();
+    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    ticketVO.setTicketId(ticket.getTicketId());
+    ticketVO.setBoxId(ticket.getBoxId());
+    ticketVO.setTitle(ticketBox.getTitle());
+    ticketVO.setSerialNo(ticket.getSerialNo());
+    ticketVO.setFacePrice(ticket.getFacePrice());
+    ticketVO.setSalePrice(ticketBox.getSalePrice());
+    ticketVO.setPlainLuckyNum(ticket.getPlainLuckyNum());
+    ticketVO.setStatus(ticket.getStatus().getValue());
+
+    return AjaxResult.success(ticketVO);
+  }
+
+  /**
+   * 查看能兑奖的奖品
+   */
+  @PostMapping("/ticket/queryHitPrizeList")
+  @ApiOperation(value = "查看兑奖奖品" , notes = "根据盲票ID,查看兑奖奖品")
+  public AjaxResult queryHitPrizeList(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId())) {
+      return AjaxResult.error("参数异常,盲票ID缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+
+    List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
+    return AjaxResult.success(ticketAwardsPrizes);
+  }
+
+  /**
+   * 兑奖
+   */
+  @PostMapping("/ticket/cashPrize")
+  @ApiOperation(value = "兑奖" , notes = "选择奖品兑奖")
+  public AjaxResult cashPrize(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId()) || StringUtils.isBlank(param.getAwardsId())
+    || StringUtils.isBlank(param.getPrizeId())) {
+      return AjaxResult.error("参数缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+
+    userHitPrizeService.cashPrize(ticket, userId, param.getAwardsId(), param.getPrizeId());
+    return AjaxResult.success();
+  }
+
+}

+ 42 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelStatusEnum.java

@@ -0,0 +1,42 @@
+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 ChannelStatusEnum implements IEnum<Integer> {
+  ON(1, "启用"),
+  OFF(2, "停用");
+
+  private final int value;
+  private final String desc;
+
+  ChannelStatusEnum(final int 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();
+  }
+}

+ 49 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CoinLogTypeEnum.java

@@ -0,0 +1,49 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum CoinLogTypeEnum implements IEnum<Integer> {
+
+  PRIZE(1, "盲票奖品"),
+  CASHED(2, "商品兑换");
+
+
+  private final int value;
+  private final String desc;
+  public static final int INCOME = 1;   //收支类型 1收入
+  public static final int EXPENSES = 0;  //0支出
+
+  CoinLogTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  public static CoinLogTypeEnum getCoinLogTypeEnum(int value) {
+    for (CoinLogTypeEnum coinLogTypeEnum : CoinLogTypeEnum.values()) {
+      if (coinLogTypeEnum.getValue() == value) {
+        return coinLogTypeEnum;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 39 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponDiscountTypeEnum.java

@@ -0,0 +1,39 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum CouponDiscountTypeEnum implements IEnum<Integer> {
+
+  MONEY_OFF(1, "代金券"),
+  DISCOUNT(2, "折扣券"),
+  EXCHANGE(3, "兑换券");
+
+
+  private final int value;
+  private final String desc;
+
+  CouponDiscountTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 38 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponDistributeTypeEnum.java

@@ -0,0 +1,38 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum CouponDistributeTypeEnum implements IEnum<Integer> {
+
+  SYSTEM(1, "系统发放"),
+  USER_DRAW(2, "用户主动领取");
+
+
+  private final int value;
+  private final String desc;
+
+  CouponDistributeTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 40 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponStatusEnum.java

@@ -0,0 +1,40 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ *
+ * 卡券上下架状态
+ *
+ */
+public enum CouponStatusEnum implements IEnum<String> {
+
+  PUT_ON("on", "上架"),
+  PUT_OFF("off", "下架");
+
+  private final String value;
+  private final String desc;
+
+  CouponStatusEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 39 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponTypeEnum.java

@@ -0,0 +1,39 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum CouponTypeEnum implements IEnum<Integer> {
+
+  TICKET_ORDER(1, "用户盲票购买优惠券"),
+  SITE_CONSUME(2, "用户门店消费优惠券"),
+  CHANNEL(3, "经销商盲票采购优惠券");
+
+
+  private final int value;
+  private final String desc;
+
+  CouponTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 39 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java

@@ -0,0 +1,39 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum CouponUseAreaEnum implements IEnum<Integer> {
+
+  COMMON(0, "通用"),
+  PRE_SCOPE(1, "指定范围"), // 生成优惠券的时候设定使用范围
+  POST_SCOPE(2, "指定范围"); // 发放的时候动态设定使用范围
+
+
+  private final int value;
+  private final String desc;
+
+  CouponUseAreaEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

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

@@ -23,7 +23,9 @@ public enum ErrorCodeEnum {
   ERROR_CODE_1014(1014, "当前账号不能删除"),
   ERROR_CODE_1015(1015, "保存失败"),
   ERROR_CODE_1016(1016, "账号未认证,请先完成认证再提交"),
-
+  ERROR_CODE_1017(1017, "盲票已兑奖"),
+  ERROR_CODE_1018(1018, "无权限查看"),
+  ERROR_CODE_1019(1019, "盲票未付款"),
   ;
   private int code;
   private String msg;

+ 39 - 0
mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageInTypeEnum.java

@@ -0,0 +1,39 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * 奖品入库类型
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum PrizeStorageInTypeEnum implements IEnum<Integer> {
+
+  TICKET_CASHED(1, "奖品兑奖"),
+  COIN_EXCHANGE(2, "盲豆兑换");
+
+
+  private final int value;
+  private final String desc;
+
+  PrizeStorageInTypeEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 38 - 0
mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageStatusEnum.java

@@ -0,0 +1,38 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ * @auther zhongcp
+ * @create 2022 2022/3/7 2:30 下午
+ * @describe
+ */
+public enum PrizeStorageStatusEnum implements IEnum<Integer> {
+
+  NOT_DISTRIBUTED(1, "待提货"),
+  HAS_DISTRIBUTED(2, "已提货");
+
+
+  private final int value;
+  private final String desc;
+
+  PrizeStorageStatusEnum(int value, String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value", value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.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 TicketPrizeTypeEnum implements IEnum<String> {
+
+  GOODS("goods", "商品"),
+  COUPON("coupon", "优惠券"),
+  COIN("coin", "盲币");
+
+  private final String value;
+  private final String desc;
+
+  TicketPrizeTypeEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

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

@@ -0,0 +1,41 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ *
+ * 用户卡券使用状态
+ *
+ */
+public enum UserCouponStatusEnum implements IEnum<Integer> {
+
+  UNUSED(1, "未使用"),
+  USED(2, "已使用"),
+  OVERDUE(3, "已过期"),;
+
+  private final Integer value;
+  private final String desc;
+
+  UserCouponStatusEnum(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();
+  }
+}

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/UserTicketOrderStatusEnum.java

@@ -0,0 +1,43 @@
+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 UserTicketOrderStatusEnum implements IEnum<Integer> {
+  CANCELED(-1, "已取消"),
+  NOT_PAY(0, "待付款"),
+  FINISHED(1, "已完成");
+
+  private final int value;
+  private final String desc;
+
+  UserTicketOrderStatusEnum(final int 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();
+  }
+}

+ 87 - 19
mp-common/src/main/java/com/qs/mp/common/utils/DateUtils.java

@@ -6,10 +6,15 @@ import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import org.apache.commons.lang3.time.DateFormatUtils;
+import org.joda.time.DateTime;
+import org.joda.time.Days;
+import org.joda.time.Months;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
 
 /**
  * 时间工具类
- * 
+ *
  * @author ygp
  */
 public class DateUtils extends org.apache.commons.lang3.time.DateUtils
@@ -18,20 +23,26 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
     public static String YYYY_MM = "yyyy-MM";
 
+    public static String YYYYMM = "yyyyMM";
+
     public static String YYYY_MM_DD = "yyyy-MM-dd";
 
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
+    public static String YYYYMMDD = "yyyyMMdd";
+
+    public static String YYYYDOTMMDOTDD = "yyyy.MM.dd";
+
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
-    
+
     private static String[] parsePatterns = {
-            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
     /**
      * 获取当前Date型日期
-     * 
+     *
      * @return Date() 当前日期
      */
     public static Date getNowDate()
@@ -39,9 +50,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return new Date();
     }
 
+    public static Date getToday() {
+        String s = parseDateToStr(YYYY_MM_DD, new Date());
+        return dateTime(YYYY_MM_DD, s);
+    }
+
     /**
      * 获取当前日期, 默认格式为yyyy-MM-dd
-     * 
+     *
      * @return String
      */
     public static String getDate()
@@ -86,6 +102,45 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         }
     }
 
+    public static final Date parseDateToDay(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String s = sdf.format(date);
+        try {
+            return sdf.parse(s);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 计算两个日期之间相差多少天,一个月按30天算
+     * @param begin
+     * @param end
+     * @return
+     */
+    public static final int diff(Date begin, Date end) {
+        DateTimeFormatter formatter = DateTimeFormat.forPattern(YYYY_MM_DD);
+        DateTime startDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, begin));
+        DateTime endDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, end));
+        int days = Days.daysBetween(startDay, endDay).getDays();
+        return days;
+    }
+
+    /**
+     * 计算两个日期之间相差多少个月
+     * @param begin
+     * @param end
+     * @return
+     */
+    public static final int diffMonth(Date begin, Date end) {
+
+        DateTimeFormatter formatter = DateTimeFormat.forPattern(YYYY_MM_DD);
+        DateTime startDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, begin));
+        DateTime endDay = formatter.parseDateTime(parseDateToStr(YYYY_MM_DD, end));
+        int months = Months.monthsBetween(startDay, endDay).getMonths();
+        return months;
+    }
+
     /**
      * 日期路径 即年/月/日 如2018/08/08
      */
@@ -104,6 +159,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return DateFormatUtils.format(now, "yyyyMMdd");
     }
 
+    public static final Date parseStrToDate(String str, String pattern){
+        if (str == null)
+        {
+            return null;
+        }
+        try
+        {
+            return parseDate(str, pattern);
+        }
+        catch (ParseException e)
+        {
+            return null;
+        }
+    }
     /**
      * 日期型字符串转化为日期 格式
      */
@@ -122,7 +191,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
             return null;
         }
     }
-    
+
     /**
      * 获取服务器启动时间
      */
@@ -153,18 +222,17 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         // long sec = diff % nd % nh % nm / ns;
         return day + "天" + hour + "小时" + min + "分钟";
     }
-    
-    /**
-     * 获取当天零点零分时间
-     * @return
-     */
-    public static Date getNowZero() {
-	    Calendar calendar = Calendar.getInstance();
-        calendar.setTime(new Date());
-        calendar.set(Calendar.HOUR_OF_DAY, 0);
-        calendar.set(Calendar.MINUTE, 0);
-        calendar.set(Calendar.SECOND, 0);
-        Date zero = calendar.getTime();
-        return zero;
+
+    public static Date getNowAddMonth(Date now, int months) {
+    	SimpleDateFormat sj = new SimpleDateFormat("yyyyMMdd");
+        try {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(now);
+            calendar.add(Calendar.MONTH, months);
+            return calendar.getTime();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
     }
 }

+ 1 - 0
mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java

@@ -124,6 +124,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/*/api-docs").anonymous()
                 .antMatchers("/druid/**").anonymous()
                 .antMatchers("/service/notify/**").anonymous()
+                .antMatchers("/api/v1/mp/user/mall/**").anonymous()
 
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()

+ 22 - 10
mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java

@@ -1,9 +1,16 @@
 package com.qs.mp.admin.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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.CouponDiscountTypeEnum;
+import com.qs.mp.common.enums.CouponDistributeTypeEnum;
+import com.qs.mp.common.enums.CouponStatusEnum;
+import com.qs.mp.common.enums.CouponTypeEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -22,8 +29,8 @@ public class Coupon implements Serializable {
   /**
    * 主键
    */
-  @TableId(value = "coupon_id", type = IdType.AUTO)
-  private Long couponId;
+  @TableId(value = "coupon_id", type = IdType.INPUT)
+  private String couponId;
 
   /**
    * 标题
@@ -35,7 +42,8 @@ public class Coupon implements Serializable {
    * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
    */
   @TableField("type")
-  private Integer type;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponTypeEnum type;
 
   /**
    * 图片
@@ -53,7 +61,8 @@ public class Coupon implements Serializable {
    * 优惠类型;1代金券、2折扣券、3兑换券
    */
   @TableField("discount_type")
-  private Integer discountType;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponDiscountTypeEnum discountType;
 
   /**
    * 优惠金额(比例)
@@ -68,22 +77,25 @@ public class Coupon implements Serializable {
   private Integer minOrderAmt;
 
   /**
-   * 状态;0下架 1正常
+   * 状态;off下架 on正常
    */
   @TableField("status")
-  private Integer status;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponStatusEnum status;
 
   /**
-   * 使用范围;0通用 1指定范围
+   * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
    */
   @TableField("use_area")
-  private Integer useArea;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponUseAreaEnum useArea;
 
   /**
-   * 发放方式;0系统发放 1用户主动领取
+   * 发放方式;1系统发放 2用户主动领取
    */
   @TableField("distribute_type")
-  private Integer distributeType;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponDistributeTypeEnum distributeType;
 
   /**
    * 叠加使用;0不允许 1允许

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

@@ -29,7 +29,7 @@ public class CouponChannel implements Serializable {
    * 优惠券ID
    */
   @TableField("coupon_id")
-  private Long couponId;
+  private String couponId;
 
   /**
    * 渠道ID

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

@@ -29,7 +29,7 @@ public class CouponTicket implements Serializable {
    * 优惠券ID
    */
   @TableField("coupon_id")
-  private Long couponId;
+  private String couponId;
 
   /**
    * 盲票组ID

+ 10 - 112
mp-service/src/main/java/com/qs/mp/admin/domain/Ticket.java

@@ -14,7 +14,7 @@ import lombok.Data;
 /**
  * @describe 盲票实体类
  * @auther quanshu
- * @create 2022-03-02 12:25:55
+ * @create 2022-03-08 11:35:25
  */
 @TableName("mp_ticket")
 @Data
@@ -25,7 +25,7 @@ public class Ticket implements Serializable {
   /**
    * 主键
    */
-  @TableId(value = "ticket_id" , type = IdType.INPUT)
+  @TableId(value = "ticket_id", type = IdType.INPUT)
   private String ticketId;
 
   /**
@@ -71,136 +71,34 @@ public class Ticket implements Serializable {
   private Integer plainLuckyNum;
 
   /**
-   * 抽奖数字1描述(json格式,包含数字、奖项)
+   * 抽奖数字描述(json格式,包含数字、奖项)
    */
-  @TableField("draw_num1")
-  private String drawNum1;
-
-  /**
-   * 抽奖数字2描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num2")
-  private String drawNum2;
-
-  /**
-   * 抽奖数字3描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num3")
-  private String drawNum3;
-
-  /**
-   * 抽奖数字4描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num4")
-  private String drawNum4;
-
-  /**
-   * 抽奖数字5描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num5")
-  private String drawNum5;
-
-  /**
-   * 抽奖数字6描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num6")
-  private String drawNum6;
-
-  /**
-   * 抽奖数字7描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num7")
-  private String drawNum7;
-
-  /**
-   * 抽奖数字8描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num8")
-  private String drawNum8;
-
-  /**
-   * 抽奖数字9描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num9")
-  private String drawNum9;
-
-  /**
-   * 抽奖数字10描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num10")
-  private String drawNum10;
-
-  /**
-   * 抽奖数字11描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num11")
-  private String drawNum11;
-
-  /**
-   * 抽奖数字12描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num12")
-  private String drawNum12;
-
-  /**
-   * 抽奖数字13描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num13")
-  private String drawNum13;
-
-  /**
-   * 抽奖数字14描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num14")
-  private String drawNum14;
-
-  /**
-   * 抽奖数字15描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num15")
-  private String drawNum15;
-
-  /**
-   * 抽奖数字16描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num16")
-  private String drawNum16;
-
-  /**
-   * 抽奖数字17描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num17")
-  private String drawNum17;
-
-  /**
-   * 抽奖数字18描述(json格式,包含数字、奖项)
-   */
-  @TableField("draw_num18")
-  private String drawNum18;
+  @TableField("draw_num")
+  private String drawNum;
 
   /**
    * 是否实体纸质票(0否1是)
    */
-  @TableField("is_physical")
+  @TableField("IS_PHYSICAL")
   private Integer isPhysical;
 
   /**
-   * 盲票状态(初始、已激活、已兑奖)
+   * 盲票状态;1未付款、2已激活、3已兑奖、4付款中
    */
-  @TableField("status")
+  @TableField("STATUS")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketStatusEnum status;
 
   /**
    * 创建时间
    */
-  @TableField("created_time")
+  @TableField("CREATED_TIME")
   private Date createdTime;
 
   /**
    * 更新时间
    */
-  @TableField("updated_time")
+  @TableField("UPDATED_TIME")
   private Date updatedTime;
 
 

+ 11 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/TicketAwardsPrize.java

@@ -1,9 +1,12 @@
 package com.qs.mp.admin.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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.TicketPrizeTypeEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -59,7 +62,8 @@ public class TicketAwardsPrize implements Serializable {
    * 奖品类型 1 实物商品 2优惠券 3平台代币
    */
   @TableField("prize_type")
-  private String prizeType;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private TicketPrizeTypeEnum prizeType;
 
   /**
    * 奖品数
@@ -73,6 +77,12 @@ public class TicketAwardsPrize implements Serializable {
   @TableField("cashed_qty")
   private Integer cashedQty;
 
+  /**
+   * 剩余奖品数
+   */
+  @TableField("remain_qty")
+  private Integer remainQty;
+
   /**
    * 奖品价值
    */

+ 19 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/dto/TicketDrawNumDTO.java

@@ -0,0 +1,19 @@
+package com.qs.mp.admin.domain.dto;
+
+import lombok.Data;
+
+/**
+ * 盲票抽奖号码
+ * @author zhongcp
+ * @Date 2022/3/8
+ */
+@Data
+public class TicketDrawNumDTO {
+  // 奖项ID
+  private String id;
+  // 奖项名
+  private String name;
+  // 号码
+  private int num;
+
+}

+ 7 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketParam.java

@@ -13,4 +13,11 @@ public class TicketParam {
 	@ApiModelProperty(value = "盲票ID",required=false)
 	private String ticketId;
 
+	@ApiModelProperty(value = "奖项ID",required=false)
+	private String awardsId;
+
+	@ApiModelProperty(value = "奖品ID",required=false)
+	private String prizeId;
+
+
 }

+ 7 - 2
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketVO.java

@@ -39,14 +39,19 @@ public class TicketVO {
    */
   private Integer facePrice;
 
+  /**
+   *
+   */
+  private Integer salePrice;
+
   /**
    * 明文幸运数字
    */
   private Integer plainLuckyNum;
 
   /**
-   * 盲票状态(初始、已激活、已兑奖
+   * 盲票状态(未付款、已激活、已兑奖、付款中
    */
-  private String status;
+  private Integer status;
 
 }

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

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
  * @auther quanshu
- * @create 2022-03-02 12:25:55
+ * @create 2022-03-08 11:35:25
  * @describe 盲票mapper类
  */
 public interface TicketMapper extends BaseMapper<Ticket> {

+ 8 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICouponService.java

@@ -2,6 +2,7 @@ package com.qs.mp.admin.service;
 
 import com.qs.mp.admin.domain.Coupon;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.Ticket;
 
 /**
  * <p>
@@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ICouponService extends IService<Coupon> {
 
+  /**
+   * 发放
+   * @param ticket
+   * @param userId
+   * @param couponId
+   */
+  void distribute(Ticket ticket, Long userId, String couponId);
 }

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

@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * </p>
  *
  * @author quanshu
- * @since 2022-03-02
+ * @since 2022-03-08
  */
 public interface ITicketService extends IService<Ticket> {
 

+ 65 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java

@@ -1,10 +1,28 @@
 package com.qs.mp.admin.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.mapper.CouponMapper;
 import com.qs.mp.admin.service.ICouponService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.UserCouponChannel;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserCouponChannelService;
+import com.qs.mp.user.service.IUserCouponService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
@@ -17,4 +35,51 @@ import org.springframework.stereotype.Service;
 @Service
 public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements ICouponService {
 
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  @Autowired
+  private IUserCouponService userCouponService;
+
+  @Autowired
+  private IUserCouponChannelService userCouponChannelService;
+
+  @Autowired
+  private BizIdGenerator bizIdGenerator;
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Override
+  @Transactional
+  public void distribute(Ticket ticket, Long userId, String couponId) {
+    Coupon coupon = getById(couponId);
+    UserCoupon userCoupon = new UserCoupon();
+    userCoupon.setId(bizIdGenerator.newId());
+    userCoupon.setUserId(userId);
+    userCoupon.setVerifyCode(bizIdGenerator.newId());
+    userCoupon.setCouponId(coupon.getCouponId());
+    if (coupon.getDueDays() > 0) {
+      userCoupon.setValidStart(DateUtils.getToday());
+      userCoupon.setValidEnd(DateUtils.addDays(userCoupon.getValidStart(), coupon.getDueDays()));
+    } else {
+      userCoupon.setValidStart(coupon.getValidStart());
+      userCoupon.setValidEnd(coupon.getValidEnd());
+    }
+    userCoupon.setStatus(UserCouponStatusEnum.UNUSED);
+    userCouponService.save(userCoupon);
+
+    // 确定限定范围
+    if (coupon.getUseArea() == CouponUseAreaEnum.POST_SCOPE) {
+      UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
+      if (null == orderItem || null == orderItem.getChannelId()) {
+        LogUtil.error(logger, "优惠券的限定使用范围类型为发放时生成,但找不到关联的渠道ID。orderItem:{0}", new Object[]{
+            JSONObject.toJSONString(orderItem)});
+        throw new ServiceException("优惠券发放失败");
+      }
+      UserCouponChannel userCouponChannel = new UserCouponChannel();
+      userCouponChannel.setUserCouponId(userCoupon.getId());
+      userCouponChannel.setChannelId(orderItem.getChannelId());
+      userCouponChannelService.save(userCouponChannel);
+    }
+  }
 }

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

@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
  * </p>
  *
  * @author quanshu
- * @since 2022-03-02
+ * @since 2022-03-08
  */
 @Service
 public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> implements ITicketService {

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

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
+import com.qs.mp.common.enums.ChannelStatusEnum;
 import com.qs.mp.common.enums.ChannelVerifyStatusEnum;
 import com.qs.mp.common.enums.SiteTypeEnum;
 import java.io.Serializable;
@@ -172,6 +173,13 @@ public class Channel implements Serializable {
   @TableField("memo")
   private String memo;
 
+  /**
+   * 状态,启用、停用
+   */
+  @TableField("status")
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private ChannelStatusEnum status;
+
   /**
    * 创建时间
    */

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

@@ -17,5 +17,5 @@ public class ChannelVO extends Channel {
   
   int childCnt;  // 子渠道数量
   ChannelOperDataVO operData;  // 经营数据
-  SysUser sysUser;  // 关联的用户账号信息
+  // SysUser sysUser;  // 关联的用户账号信息
 }

+ 12 - 2
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelCommissionMapper.java

@@ -14,10 +14,20 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 public interface ChannelCommissionMapper extends BaseMapper<ChannelCommission> {
 
 	/**
-	 * 根据渠道No查询渠道的经营数据
+	 * 查询子渠道一定时间范围内的佣金金额 -
 	 * @param channelNo
 	 * @param days
 	 * @return
 	 */
-	public ChannelCommission getChannelCommissionCnt(@Param("channelNo") String channelNo,@Param("days") int days);
+	public int getChannelCommAmtCnt(@Param("channelNo") String channelNo,@Param("days") int days);
+	
+	
+	/**
+	 * 查询子渠道一定时间范围内的销售金额
+	 * @param channelNo
+	 * @param days
+	 * @return
+	 */
+	public int getChannelSaleAmtCnt(@Param("channelNo") String channelNo,@Param("days") int days);
+	
 }

+ 14 - 2
mp-service/src/main/java/com/qs/mp/channel/service/IChannelCommissionService.java

@@ -1,6 +1,7 @@
 package com.qs.mp.channel.service;
 
 import com.qs.mp.channel.domain.ChannelCommission;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
@@ -14,9 +15,20 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface IChannelCommissionService extends IService<ChannelCommission> {
 
 	/**
-	 * 根据渠道No查询渠道的经营数据
+	 * 查询子渠道一定时间范围内的佣金金额 -
+	 * @param channelNo
+	 * @param days
+	 * @return
+	 */
+	public int getChannelCommAmtCnt(String channelNo, int days);
+	
+	
+	/**
+	 * 查询子渠道一定时间范围内的销售金额
 	 * @param channelNo
+	 * @param days
 	 * @return
 	 */
-	public ChannelCommission getChannelCommissionCnt(String channelNo, int days);
+	public int getChannelSaleAmtCnt(String channelNo, int days);
+	
 }

+ 7 - 2
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelCommissionServiceImpl.java

@@ -18,7 +18,12 @@ import org.springframework.stereotype.Service;
 public class ChannelCommissionServiceImpl extends ServiceImpl<ChannelCommissionMapper, ChannelCommission> implements IChannelCommissionService {
 
 	@Override
-	public ChannelCommission getChannelCommissionCnt(String channelNo, int days) {
-		return getBaseMapper().getChannelCommissionCnt(channelNo, days == 1?0: (~(days - 1)));
+	public int getChannelCommAmtCnt(String channelNo, int days) {
+		return getBaseMapper().getChannelCommAmtCnt(channelNo, days == 1?0: (~(days - 1)));
+	}
+
+	@Override
+	public int getChannelSaleAmtCnt(String channelNo, int days) {
+		return getBaseMapper().getChannelSaleAmtCnt(channelNo, days == 1?0: (~(days - 1)));
 	}
 }

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

@@ -129,11 +129,11 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
 	@Override
 	public ChannelOperDataVO getChannelOperData(String channelNo, int days) {
 		ChannelOperDataVO channelOperData = new ChannelOperDataVO();
-		ChannelCommission channelCommission = channelCommissionService.getChannelCommissionCnt(channelNo, days);
-		if(null != channelCommission) {
-			channelOperData.setSaleAmt(channelCommission.getSaleAmt());
-			channelOperData.setCommAmt(channelCommission.getCommAmt());
-		}
+		// 查询销售金额
+		channelOperData.setSaleAmt(channelCommissionService.getChannelSaleAmtCnt(channelNo, days));
+		// 查询佣金金额
+		channelOperData.setCommAmt(channelCommissionService.getChannelCommAmtCnt(channelNo, days));
+		// 查询新增用户数
 		int newUserCnt = channelUserRelService.getChannelNewUserCnt(channelNo, days);
 		channelOperData.setNewUserCnt(newUserCnt);
 		return channelOperData;

+ 1 - 7
mp-service/src/main/java/com/qs/mp/user/domain/UserCoin.java

@@ -19,16 +19,10 @@ public class UserCoin implements Serializable {
 
   private static final long serialVersionUID = 1L;
 
-  /**
-   * 主键
-   */
-  @TableId(value = "id", type = IdType.AUTO)
-  private Long id;
-
   /**
    * 用户ID
    */
-  @TableField("user_id")
+  @TableId(value = "user_id", type = IdType.INPUT)
   private Long userId;
 
   /**

+ 5 - 1
mp-service/src/main/java/com/qs/mp/user/domain/UserCoinLog.java

@@ -1,9 +1,12 @@
 package com.qs.mp.user.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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.CoinLogTypeEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -35,7 +38,8 @@ public class UserCoinLog implements Serializable {
    * 交易类型
    */
   @TableField("type")
-  private Integer type;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CoinLogTypeEnum type;
 
   /**
    * 交易后余额

+ 7 - 3
mp-service/src/main/java/com/qs/mp/user/domain/UserCoupon.java

@@ -1,9 +1,12 @@
 package com.qs.mp.user.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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.UserCouponStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -23,7 +26,7 @@ public class UserCoupon implements Serializable {
    * 主键
    */
   @TableId(value = "id", type = IdType.INPUT)
-  private Long id;
+  private String id;
 
   /**
    * 用户ID
@@ -41,7 +44,7 @@ public class UserCoupon implements Serializable {
    * 优惠券ID
    */
   @TableField("coupon_id")
-  private Long couponId;
+  private String couponId;
 
   /**
    * 生效日
@@ -71,7 +74,8 @@ public class UserCoupon implements Serializable {
    * 状态;1未使用 2已使用 3已过期
    */
   @TableField("status")
-  private Integer status;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private UserCouponStatusEnum status;
 
   /**
    * 创建时间

+ 53 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserCouponChannel.java

@@ -0,0 +1,53 @@
+package com.qs.mp.user.domain;
+
+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 java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @describe 经销商门店优惠券使用范围限制实体类
+ * @auther quanshu
+ * @create 2022-03-09 09:23:17
+ */
+@TableName("mp_user_coupon_channel")
+@Data
+public class UserCouponChannel implements Serializable {
+
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 主键
+   */
+  @TableId(value = "id", type = IdType.AUTO)
+  private Long id;
+
+  /**
+   * 用户优惠券ID
+   */
+  @TableField("user_coupon_id")
+  private String userCouponId;
+
+  /**
+   * 渠道ID
+   */
+  @TableField("channel_id")
+  private Long channelId;
+
+  /**
+   * 创建时间
+   */
+  @TableField("created_time")
+  private Date createdTime;
+
+  /**
+   * 更新时间
+   */
+  @TableField("updated_time")
+  private Date updatedTime;
+
+
+}

+ 20 - 2
mp-service/src/main/java/com/qs/mp/user/domain/UserPrizeStorage.java

@@ -1,9 +1,13 @@
 package com.qs.mp.user.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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.PrizeStorageInTypeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -65,13 +69,27 @@ public class UserPrizeStorage implements Serializable {
    * 商品数
    */
   @TableField("goods_num")
-  private String goodsNum;
+  private Integer goodsNum;
+
+  /**
+   * 入库类型;1盲票兑奖、2盲豆兑换
+   */
+  @TableField("in_type")
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private PrizeStorageInTypeEnum inType;
+
+  /**
+   * 关联业务ID
+   */
+  @TableField("ref_id")
+  private String refId;
 
   /**
    * 状态;1待提货、2已提货
    */
   @TableField("status")
-  private Integer status;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private PrizeStorageStatusEnum status;
 
   /**
    * 创建时间

+ 5 - 1
mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java

@@ -1,9 +1,12 @@
 package com.qs.mp.user.domain;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 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.UserTicketOrderStatusEnum;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -77,7 +80,8 @@ public class UserTicketOrder implements Serializable {
    * 订单状态;-1 已取消 0:待付款 1:已完成
    */
   @TableField("status")
-  private Integer status;
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private UserTicketOrderStatusEnum status;
 
   /**
    * 创建时间

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

@@ -49,6 +49,12 @@ public class UserTicketOrderItem implements Serializable {
   @TableField("ticket_id")
   private String ticketId;
 
+  /**
+   * 线下购买渠道ID
+   */
+  @TableField("channel_id")
+  private Long channelId;
+
   /**
    * 创建时间
    */

+ 13 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/UserCouponChannelMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.user.mapper;
+
+import com.qs.mp.user.domain.UserCouponChannel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-03-09 09:23:17
+ * @describe 经销商门店优惠券使用范围限制mapper类
+ */
+public interface UserCouponChannelMapper extends BaseMapper<UserCouponChannel> {
+
+}

+ 7 - 1
mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderItemMapper.java

@@ -1,7 +1,13 @@
 package com.qs.mp.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @auther quanshu
@@ -9,5 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @describe 用户盲票订单明细mapper类
  */
 public interface UserTicketOrderItemMapper extends BaseMapper<UserTicketOrderItem> {
-
+  List<UserTicketOrderItem> listTicketOrderItemVO(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserCoinService.java

@@ -13,4 +13,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IUserCoinService extends IService<UserCoin> {
 
+  /**
+   * 发放代币
+   * @param userId
+   * @param logCoin
+   * @param bizId
+   */
+  void produce(Long userId, Integer logCoin, String bizId);
 }

+ 16 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserCouponChannelService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.user.service;
+
+import com.qs.mp.user.domain.UserCouponChannel;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 经销商门店优惠券使用范围限制 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-09
+ */
+public interface IUserCouponChannelService extends IService<UserCouponChannel> {
+
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserHitPrizeService.java

@@ -1,7 +1,11 @@
 package com.qs.mp.user.service;
 
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.user.domain.UserHitPrize;
 import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,17 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IUserHitPrizeService extends IService<UserHitPrize> {
 
+  /**
+   * 查看盲票中奖奖品列表
+   * @param ticket
+   * @return
+   */
+  List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId);
+
+  /**
+   * 兑奖
+   * @param ticket
+   * @return
+   */
+  void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId);
 }

+ 10 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserPrizeStorageService.java

@@ -1,5 +1,7 @@
 package com.qs.mp.user.service;
 
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +15,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IUserPrizeStorageService extends IService<UserPrizeStorage> {
 
+  /**
+   * 商品入用户的奖品库
+   * @param userId
+   * @param ticketAwardsPrize
+   * @param inTypeEnum
+   * @param refId
+   */
+  void takeInStorage(Long userId, TicketAwardsPrize ticketAwardsPrize, PrizeStorageInTypeEnum inTypeEnum, String refId);
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderItemService.java

@@ -13,4 +13,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IUserTicketOrderItemService extends IService<UserTicketOrderItem> {
 
+  /**
+   * 查询购票订单明细
+   * @param userId
+   * @param ticketId
+   * @return
+   */
+  UserTicketOrderItem queryFinishedOrderItem(Long userId, String ticketId);
 }

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

@@ -16,5 +16,4 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class UserCoinLogServiceImpl extends ServiceImpl<UserCoinLogMapper, UserCoinLog> implements IUserCoinLogService {
-
 }

+ 36 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCoinServiceImpl.java

@@ -1,10 +1,17 @@
 package com.qs.mp.user.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.common.enums.CoinLogTypeEnum;
 import com.qs.mp.user.domain.UserCoin;
+import com.qs.mp.user.domain.UserCoinLog;
 import com.qs.mp.user.mapper.UserCoinMapper;
+import com.qs.mp.user.service.IUserCoinLogService;
 import com.qs.mp.user.service.IUserCoinService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.Date;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * <p>
@@ -17,4 +24,33 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserCoinServiceImpl extends ServiceImpl<UserCoinMapper, UserCoin> implements IUserCoinService {
 
+  @Autowired
+  private IUserCoinLogService userCoinLogService;
+
+  @Override
+  @Transactional
+  public void produce(Long userId, Integer logCoin, String bizId) {
+    UserCoin userCoin = getById(userId);
+    if (null == userCoin) {
+      userCoin = new UserCoin();
+      userCoin.setUserId(userId);
+      userCoin.setCoin(logCoin);
+      save(userCoin);
+    } else {
+      update(new LambdaUpdateWrapper<UserCoin>().set(UserCoin::getCoin, userCoin.getCoin() + logCoin)
+          .eq(UserCoin::getUserId, userId).eq(UserCoin::getCoin, userCoin.getCoin()));
+    }
+
+    UserCoinLog userCoinLog = new UserCoinLog();
+    userCoinLog.setUserId(userId);
+    userCoinLog.setType(CoinLogTypeEnum.PRIZE);
+    userCoinLog.setMoney(userCoin.getCoin() + logCoin);
+    userCoinLog.setLogMoney(logCoin);
+    userCoinLog.setIncomeExpense(CoinLogTypeEnum.INCOME);
+    userCoinLog.setLogText("盲票奖品");
+    userCoinLog.setBizTime(new Date());
+    userCoinLog.setRefType(1);
+    userCoinLog.setRefId(bizId);
+    userCoinLogService.save(userCoinLog);
+  }
 }

+ 20 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponChannelServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.user.service.impl;
+
+import com.qs.mp.user.domain.UserCouponChannel;
+import com.qs.mp.user.mapper.UserCouponChannelMapper;
+import com.qs.mp.user.service.IUserCouponChannelService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 经销商门店优惠券使用范围限制 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-09
+ */
+@Service
+public class UserCouponChannelServiceImpl extends ServiceImpl<UserCouponChannelMapper, UserCouponChannel> implements IUserCouponChannelService {
+
+}

+ 116 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java

@@ -1,10 +1,47 @@
 package com.qs.mp.user.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.dto.TicketDrawNumDTO;
+import com.qs.mp.admin.service.ICouponService;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.UserCouponChannel;
 import com.qs.mp.user.domain.UserHitPrize;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.mapper.UserHitPrizeMapper;
+import com.qs.mp.user.service.IUserCoinService;
+import com.qs.mp.user.service.IUserCouponChannelService;
+import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserHitPrizeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import org.codehaus.janino.IClass.IField;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -17,4 +54,83 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, UserHitPrize> implements IUserHitPrizeService {
 
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+  @Autowired
+  private IUserPrizeStorageService userPrizeStorageService;
+
+  @Autowired
+  private IUserCoinService userCoinService;
+
+  @Autowired
+  private ICouponService couponService;
+
+  @Override
+  public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
+    UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
+    UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
+    if (null == orderItem) {
+      LogUtil.error(logger, "查询盲票的奖品信息,盲票订单不存在。ticketId:{0}, userId:{1}",
+          new Object[]{ticket.getTicketId(), userId});
+      throw new ServiceException("盲票订单不存在");
+    }
+
+    if (null == userHitPrize) {
+      List<TicketDrawNumDTO> drawNumDTOList = JSONObject.parseArray(ticket.getDrawNum(), TicketDrawNumDTO.class);
+      for (TicketDrawNumDTO ticketDrawNumDTO : drawNumDTOList) {
+        if (ticketDrawNumDTO.getNum() == ticket.getPlainLuckyNum()) {
+          userHitPrize = new UserHitPrize();
+          userHitPrize.setUserId(userId);
+          userHitPrize.setOrderId(orderItem.getOrderId());
+          userHitPrize.setOrderItemId(orderItem.getItemId());
+          userHitPrize.setTicketId(ticket.getTicketId());
+          userHitPrize.setAwardsId(ticketDrawNumDTO.getId());
+          // 奖品ID等用户选择后填入
+//          userHitPrize.setPrizeId();
+          save(userHitPrize);
+        }
+      }
+    }
+    List<TicketAwardsPrize> awardsPrizes = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
+        .eq(TicketAwardsPrize::getAwardsId, userHitPrize.getAwardsId()).orderByDesc(TicketAwardsPrize::getRemainQty));
+    return awardsPrizes;
+  }
+
+  @Override
+  @Transactional
+  public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {
+    // 更新奖品已兑奖数量
+    TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizeService.getById(prizeId);
+    if (ticketAwardsPrize.getRemainQty() <= 0) {
+      throw new ServiceException("奖品已兑完,请重新选择");
+    }
+    // 乐观锁
+    ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty() + 1)
+        .set(TicketAwardsPrize::getRemainQty, ticketAwardsPrize.getRemainQty() - 1)
+        .eq(TicketAwardsPrize::getPrizeId, prizeId).eq(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty()));
+
+    // 保存奖品到中奖记录中
+    UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
+    userHitPrize.setPrizeId(prizeId);
+    updateById(userHitPrize);
+
+    // 放入仓库
+    if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COIN) {
+      userCoinService.produce(userId, ticketAwardsPrize.getValue(), String.valueOf(userHitPrize.getId()));
+    } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+      couponService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
+    } else {
+      userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize, PrizeStorageInTypeEnum.TICKET_CASHED, String.valueOf(userHitPrize.getId()));
+    }
+  }
+
+
+
+
 }

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

@@ -1,5 +1,10 @@
 package com.qs.mp.user.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.qs.mp.user.mapper.UserPrizeStorageMapper;
 import com.qs.mp.user.service.IUserPrizeStorageService;
@@ -16,5 +21,28 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class UserPrizeStorageServiceImpl extends ServiceImpl<UserPrizeStorageMapper, UserPrizeStorage> implements IUserPrizeStorageService {
-
+  @Override
+  public void takeInStorage(Long userId, TicketAwardsPrize ticketAwardsPrize, PrizeStorageInTypeEnum inTypeEnum, String refId) {
+    UserPrizeStorage userPrizeStorage = getOne(new LambdaQueryWrapper<UserPrizeStorage>()
+        .eq(UserPrizeStorage::getGoodsId, ticketAwardsPrize.getRefId()).eq(UserPrizeStorage::getUserId,
+            userId)
+        .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED));
+    if (null == userPrizeStorage) {
+      userPrizeStorage = new UserPrizeStorage();
+      userPrizeStorage.setUserId(userId);
+      userPrizeStorage.setGoodsId(ticketAwardsPrize.getRefId());
+      userPrizeStorage.setSkuId(null);
+      userPrizeStorage.setProperties(null);
+      userPrizeStorage.setTitle(ticketAwardsPrize.getTitle());
+      userPrizeStorage.setPicUrl(ticketAwardsPrize.getPicUrl());
+      userPrizeStorage.setGoodsNum(1);
+      userPrizeStorage.setInType(inTypeEnum);
+      userPrizeStorage.setRefId(refId);
+      userPrizeStorage.setStatus(PrizeStorageStatusEnum.NOT_DISTRIBUTED);
+      save(userPrizeStorage);
+    } else {
+      update(new LambdaUpdateWrapper<UserPrizeStorage>().set(UserPrizeStorage::getGoodsNum, userPrizeStorage.getGoodsNum() + 1)
+          .eq(UserPrizeStorage::getStorageId, userPrizeStorage.getStorageId()).eq(UserPrizeStorage::getGoodsNum, userPrizeStorage.getGoodsNum()));
+    }
+  }
 }

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

@@ -1,10 +1,14 @@
 package com.qs.mp.user.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.mapper.UserTicketOrderItemMapper;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.List;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 /**
  * <p>
@@ -17,4 +21,13 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserTicketOrderItemServiceImpl extends ServiceImpl<UserTicketOrderItemMapper, UserTicketOrderItem> implements IUserTicketOrderItemService {
 
+  @Override
+  public UserTicketOrderItem queryFinishedOrderItem(Long userId, String ticketId) {
+    List<UserTicketOrderItem> itemList = getBaseMapper().listTicketOrderItemVO(new QueryWrapper<UserTicketOrderItem>().eq("t1.ticket_id", ticketId)
+        .eq("t1.userId", userId).eq("t2.status", UserTicketOrderStatusEnum.FINISHED));
+    if (CollectionUtils.isEmpty(itemList)) {
+      return null;
+    }
+    return itemList.get(0);
+  }
 }

+ 2 - 1
mp-service/src/main/resources/mapper/admin/TicketAwardsPrizeMapper.xml

@@ -13,6 +13,7 @@
         <result column="prize_type" property="prizeType" />
         <result column="quantity" property="quantity" />
         <result column="cashed_qty" property="cashedQty" />
+        <result column="remain_qty" property="remainQty" />
         <result column="value" property="value" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
@@ -20,7 +21,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        prize_id, box_id, awards_id, ref_id, title, pic_url, prize_type, quantity, cashed_qty, value, created_time, updated_time
+        prize_id, box_id, awards_id, ref_id, title, pic_url, prize_type, quantity, cashed_qty, remain_qty, value, created_time, updated_time
     </sql>
 
     <select id="listPrizeVO" resultType="com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO">

+ 6 - 23
mp-service/src/main/resources/mapper/admin/TicketMapper.xml

@@ -12,33 +12,16 @@
         <result column="face_price" property="facePrice" />
         <result column="cipher_lucky_num" property="cipherLuckyNum" />
         <result column="plain_lucky_num" property="plainLuckyNum" />
-        <result column="draw_num1" property="drawNum1" />
-        <result column="draw_num2" property="drawNum2" />
-        <result column="draw_num3" property="drawNum3" />
-        <result column="draw_num4" property="drawNum4" />
-        <result column="draw_num5" property="drawNum5" />
-        <result column="draw_num6" property="drawNum6" />
-        <result column="draw_num7" property="drawNum7" />
-        <result column="draw_num8" property="drawNum8" />
-        <result column="draw_num9" property="drawNum9" />
-        <result column="draw_num10" property="drawNum10" />
-        <result column="draw_num11" property="drawNum11" />
-        <result column="draw_num12" property="drawNum12" />
-        <result column="draw_num13" property="drawNum13" />
-        <result column="draw_num14" property="drawNum14" />
-        <result column="draw_num15" property="drawNum15" />
-        <result column="draw_num16" property="drawNum16" />
-        <result column="draw_num17" property="drawNum17" />
-        <result column="draw_num18" property="drawNum18" />
-        <result column="is_physical" property="isPhysical" />
-        <result column="status" property="status" />
-        <result column="created_time" property="createdTime" />
-        <result column="updated_time" property="updatedTime" />
+        <result column="draw_num" property="drawNum" />
+        <result column="IS_PHYSICAL" property="isPhysical" />
+        <result column="STATUS" property="status" />
+        <result column="CREATED_TIME" property="createdTime" />
+        <result column="UPDATED_TIME" property="updatedTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        ticket_id, box_id, pkg_id, title, serial_no, face_price, cipher_lucky_num, plain_lucky_num, draw_num1, draw_num2, draw_num3, draw_num4, draw_num5, draw_num6, draw_num7, draw_num8, draw_num9, draw_num10, draw_num11, draw_num12, draw_num13, draw_num14, draw_num15, draw_num16, draw_num17, draw_num18, is_physical, status, created_time, updated_time
+        ticket_id, box_id, pkg_id, title, serial_no, face_price, cipher_lucky_num, plain_lucky_num, draw_num, IS_PHYSICAL, STATUS, CREATED_TIME, UPDATED_TIME
     </sql>
 
 </mapper>

+ 16 - 3
mp-service/src/main/resources/mapper/channel/ChannelCommissionMapper.xml

@@ -22,14 +22,27 @@
         id, channel_id, order_id, ticket_id, sale_amt, sale_comm_rate, sale_comm_amt, comm_rate, comm_amt, created_time, updated_time
     </sql>
     
-    <!-- 查询子渠道信息 -->
-    <select id="getChannelCommissionCnt" resultMap="BaseResultMap">
-		select IFNULL(SUM(t1.sale_amt),0) sale_amt, IFNULL(SUM(t1.comm_amt),0) comm_amt
+    <!-- 查询子渠道一定时间范围内的佣金金额 -->
+    <select id="getChannelCommAmtCnt" resultType="integer">
+		select IFNULL(SUM(t1.comm_amt),0) as commAmt
 		from mp_channel_commission t1
 		left join mp_channel t2 on t1.channel_id = t2.channel_id
 		where t2.channel_no like concat(#{channelNo},'.%')
 		AND t1.created_time between DATE_ADD(CURDATE(),INTERVAL #{days} DAY) and NOW()
 	</select>
     
+    
+    <!-- 查询子渠道一定时间范围内的销售金额 -->
+    <select id="getChannelSaleAmtCnt" resultType="integer">
+		select IFNULL(SUM(t3.sale_amt),0) as saleAmt
+		from (
+			select t1.ticket_id, MIN(t1.sale_amt)
+			from mp_channel_commission t1
+			left join mp_channel t2 on t1.channel_id = t2.channel_id
+			where t2.channel_no like concat(#{channelNo},'.%')
+			AND t1.created_time between DATE_ADD(CURDATE(),INTERVAL #{days} DAY) and NOW()
+			GROUP BY t1.ticket_id
+		) t3
+	</select>
 
 </mapper>

+ 6 - 36
mp-service/src/main/resources/mapper/channel/ChannelMapper.xml

@@ -28,60 +28,30 @@
         <result column="biz_license_pic" property="bizLicensePic" />
         <result column="door_pic" property="doorPic" />
         <result column="memo" property="memo" />
+        <result column="status" property="status" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
     </resultMap>
 
-    <!-- 通用查询VO映射结果 -->
-    <resultMap id="ChannelVoResultMap" type="com.qs.mp.channel.domain.vo.ChannelVO">
-        <id column="channel_id" property="channelId" />
-        <result column="channel_no" property="channelNo" />
-        <result column="name" property="name" />
-        <result column="parent_id" property="parentId" />
-        <result column="level" property="level" />
-        <result column="site_type" property="siteType" />
-        <result column="comm_rate" property="commRate" />
-        <result column="province" property="province" />
-        <result column="province_id" property="provinceId" />
-        <result column="city" property="city" />
-        <result column="city_id" property="cityId" />
-        <result column="area" property="area" />
-        <result column="area_id" property="areaId" />
-        <result column="address" property="address" />
-        <result column="contact" property="contact" />
-        <result column="mobile" property="mobile" />
-        <result column="user_id" property="userId" />
-        <result column="money" property="money" />
-        <result column="frozen_money" property="frozenMoney" />
-        <result column="certify_status" property="certifyStatus" />
-        <result column="verify_status" property="verifyStatus" />
-        <result column="biz_license_pic" property="bizLicensePic" />
-        <result column="door_pic" property="doorPic" />
-        <result column="memo" property="memo" />
-        <result column="created_time" property="createdTime" />
-        <result column="updated_time" property="updatedTime" />
-        <result column="parentName" property="parentName" />
-    </resultMap>
-
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        channel_id, channel_no, name, parent_id, level, site_type, comm_rate, province, province_id, city, city_id, area, area_id, address, contact, mobile, user_id, money, frozen_money, certify_status, verify_status, biz_license_pic, door_pic, memo, created_time, updated_time
+        channel_id, channel_no, name, parent_id, level, site_type, comm_rate, province, province_id, city, city_id, area, area_id, address, contact, mobile, user_id, money, frozen_money, certify_status, verify_status, biz_license_pic, door_pic, memo, status, created_time, updated_time
     </sql>
 
     <!-- 查询子渠道信息 -->
-    <select id="selectChannelVoList" resultMap="ChannelVoResultMap">
+    <select id="selectChannelVoList" resultType="com.qs.mp.channel.domain.vo.ChannelVO">
 		select t1.* , t2.name parentName
 		from mp_channel t1
 		left join mp_channel t2 on t1.parent_id = t2.channel_id
 		${ew.customSqlSegment}
 	</select>
-	
-	<!-- 查询渠道及其子渠道经销商用户数总和 -->
+
+	<!-- 查询渠道及其子渠道经销商数总和 -->
     <select id="getChannelSiteCnt" resultType="integer">
         select count(t1.channel_id) as siteCnt
 		from mp_channel t1
 		left join mp_channel t2 on t1.parent_id = t2.channel_id
-		where t1.`level`= 0 and t1.certify_status = 'y'
+		where t1.`level`= 0
 		and t2.channel_no like concat(#{channelNo}, '.%')
     </select>
 

+ 2 - 3
mp-service/src/main/resources/mapper/user/UserCoinMapper.xml

@@ -4,7 +4,6 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.qs.mp.user.domain.UserCoin">
-        <id column="id" property="id" />
         <result column="user_id" property="userId" />
         <result column="coin" property="coin" />
         <result column="created_time" property="createdTime" />
@@ -13,7 +12,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, user_id, coin, created_time, updated_time
+        user_id, coin, created_time, updated_time
     </sql>
 
-</mapper>
+</mapper>

+ 19 - 0
mp-service/src/main/resources/mapper/user/UserCouponChannelMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.user.mapper.UserCouponChannelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.user.domain.UserCouponChannel">
+        <id column="id" property="id" />
+        <result column="user_coupon_id" property="userCouponId" />
+        <result column="channel_id" property="channelId" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_coupon_id, channel_id, created_time, updated_time
+    </sql>
+
+</mapper>

+ 4 - 2
mp-service/src/main/resources/mapper/user/UserPrizeStorageMapper.xml

@@ -12,6 +12,8 @@
         <result column="title" property="title" />
         <result column="pic_url" property="picUrl" />
         <result column="goods_num" property="goodsNum" />
+        <result column="in_type" property="inType" />
+        <result column="ref_id" property="refId" />
         <result column="status" property="status" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
@@ -19,7 +21,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        storage_id, user_id, goods_id, sku_id, properties, title, pic_url, goods_num, status, created_time, updated_time
+        storage_id, user_id, goods_id, sku_id, properties, title, pic_url, goods_num, in_type, ref_id, status, created_time, updated_time
     </sql>
 
-</mapper>
+</mapper>

+ 10 - 2
mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

@@ -9,13 +9,21 @@
         <result column="user_id" property="userId" />
         <result column="box_id" property="boxId" />
         <result column="ticket_id" property="ticketId" />
+        <result column="channel_id" property="channelId" />
         <result column="created_time" property="createdTime" />
         <result column="updated_time" property="updatedTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        item_id, order_id, user_id, box_id, ticket_id, created_time, updated_time
+        item_id, order_id, user_id, box_id, ticket_id, channel_id, created_time, updated_time
     </sql>
 
-</mapper>
+    <select id="listTicketOrderItemVO" resultMap="BaseResultMap">
+        select t1.*
+        from mp_ticket_order_item t1
+        left join mp_ticket_order t2 on t1.order_id = t2.order_id
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>