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

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

Mp server test

See merge request quanshu/mp-server!908
zhong chunping преди 2 години
родител
ревизия
9d1bc5f375
променени са 32 файла, в които са добавени 3246 реда и са изтрити 2867 реда
  1. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/AreaMgrController.java
  2. 300 252
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java
  3. 115 113
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsTagMgrController.java
  4. 431 415
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  5. 299 292
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  6. 134 112
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelCouponVerifyController.java
  7. 1 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  8. 228 147
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java
  9. 557 539
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  10. 21 2
      mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java
  11. 51 51
      mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java
  12. 26 26
      mp-common/src/main/java/com/qs/mp/common/enums/UserCouponStatusEnum.java
  13. 1 1
      mp-service/src/main/java/com/qs/mp/admin/domain/CouponChannel.java
  14. 113 113
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketAwardsPrize.java
  15. 20 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelQueryParam.java
  16. 2 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponParam.java
  17. 4 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxGoodsQueryParam.java
  18. 2 1
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponVO.java
  19. 7 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketListVO.java
  20. 11 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/CouponChannelMapper.java
  21. 9 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICouponChannelService.java
  22. 2 2
      mp-service/src/main/java/com/qs/mp/admin/service/ICouponService.java
  23. 8 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponChannelServiceImpl.java
  24. 68 18
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java
  25. 611 600
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  26. 28 27
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelVO.java
  27. 87 87
      mp-service/src/main/java/com/qs/mp/user/domain/UserCoupon.java
  28. 28 0
      mp-service/src/main/java/com/qs/mp/user/domain/param/CouponChannelQueryParam.java
  29. 70 65
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java
  30. 2 2
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java
  31. 7 0
      mp-service/src/main/resources/mapper/admin/CouponChannelMapper.xml
  32. 2 1
      mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

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

@@ -44,7 +44,7 @@ public class AreaMgrController extends BaseApiController {
     @PostMapping("/admin/area/tree/list")
     @ApiOperation("省市树状列表")
     @ApiResponses(
-            @ApiResponse(code = 200, message = "成功", response = Area.class)
+            @ApiResponse(code = 200, message = "成功", response = ProvinceVO.class)
     )
     public AjaxResult treeList() {
         // 获取省

+ 300 - 252
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java

@@ -19,6 +19,8 @@ import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.admin.service.ICouponTicketService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelUserRel;
+import com.qs.mp.channel.domain.vo.ChannelVO;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.constant.Constants;
@@ -65,280 +67,326 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/api/v1/mp/admin/coupon/*")
 public class CouponMgrController extends BaseApiController {
 
-	@Autowired
-	private ICouponService couponService;
+    @Autowired
+    private ICouponService couponService;
 
-	@Autowired
-	private ICouponTicketService couponTicketService;
+    @Autowired
+    private ICouponTicketService couponTicketService;
 
-	@Autowired
-	private ITicketBoxService ticketBoxService;
+    @Autowired
+    private ITicketBoxService ticketBoxService;
 
-	@Autowired
-	private ICouponChannelService couponChannelService;
+    @Autowired
+    private ICouponChannelService couponChannelService;
 
-	@Autowired
-	private IChannelService channelService;
+    @Autowired
+    private IChannelService channelService;
 
-	@Autowired
-	private ISysUserService userService;
+    @Autowired
+    private ISysUserService userService;
 
-	@Autowired
-	private MapperFacade mapperFacade;
+    @Autowired
+    private MapperFacade mapperFacade;
 
-	/**
-	 * 获取代金券列表信息,支持翻页
-	 *
-	 * @return
-	 */
-	@PostMapping("/list")
-	@PreAuthorize("@ss.hasPermi('business:coupon:list')")
-	@ApiOperation("获取代金券列表信息,支持翻页")
-	@ApiResponses(
-			@ApiResponse(code = 200, message = "成功", response = Coupon.class)
-	)
-	public TableDataInfo listCoupon(@RequestBody CouponParam coupon) {
-		List<Coupon> list = new ArrayList<Coupon>();
-		startPage();
-		QueryWrapper<Coupon> queryWrapper = new QueryWrapper<Coupon>();
-		queryWrapper.lambda().like(null != coupon && StringUtils.isNotBlank(coupon.getTitle()), Coupon::getTitle, coupon.getTitle());
-		queryWrapper.lambda().eq(null != coupon && null != coupon.getStatus(), Coupon::getStatus, coupon.getStatus());
-		queryWrapper.lambda().eq(null != coupon && null != coupon.getType(), Coupon::getType, coupon.getType());
-		queryWrapper.lambda().notIn(null != coupon && !CollectionUtils.isEmpty(coupon.getExcludeCouponIds()), Coupon::getCouponId, coupon.getExcludeCouponIds());
-		queryWrapper.lambda().eq(Coupon::getIsDeleted, 0);
-		queryWrapper.orderByAsc("FIELD(`status`, 'init', 'on', 'off')");
-		queryWrapper.lambda().orderByDesc(Coupon::getCouponId);
-		list = couponService.list(queryWrapper);
-		return getDataTable(list);
-	}
+    /**
+     * 获取代金券列表信息,支持翻页
+     *
+     * @return
+     */
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:coupon:list')")
+    @ApiOperation("获取代金券列表信息,支持翻页")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = Coupon.class)
+    )
+    public TableDataInfo listCoupon(@RequestBody CouponParam coupon) {
+        List<Coupon> list = new ArrayList<Coupon>();
+        startPage();
+        QueryWrapper<Coupon> queryWrapper = new QueryWrapper<Coupon>();
+        queryWrapper.lambda()
+            .like(null != coupon && StringUtils.isNotBlank(coupon.getTitle()), Coupon::getTitle, coupon.getTitle());
+        queryWrapper.lambda().eq(null != coupon && null != coupon.getStatus(), Coupon::getStatus, coupon.getStatus());
+        queryWrapper.lambda().eq(null != coupon && null != coupon.getType(), Coupon::getType, coupon.getType());
+        queryWrapper.lambda()
+            .notIn(null != coupon && !CollectionUtils.isEmpty(coupon.getExcludeCouponIds()), Coupon::getCouponId,
+                coupon.getExcludeCouponIds());
+        queryWrapper.lambda().eq(Coupon::getIsDeleted, 0);
+        queryWrapper.orderByAsc("FIELD(`status`, 'init', 'on', 'off')");
+        queryWrapper.lambda().orderByDesc(Coupon::getCouponId);
+        list = couponService.list(queryWrapper);
+        return getDataTable(list);
+    }
 
 
-	/**
-	 * 获取代金券详情信息
-	 *
-	 * @param
-	 * @return
-	 */
-	@PostMapping(value = "/detail")
-	@PreAuthorize("@ss.hasPermi('business:coupon:query')")
-	@ApiOperation("获取代金券详情信息")
-	@ApiResponses(
-			@ApiResponse(code = 200, message = "操作成功", response = CouponVO.class)
-	)
-	public AjaxResult getCouponDetail(@RequestBody JSONObject jsonObject) {
-		String couponId = jsonObject.getString("couponId");
-		if (StringUtils.isBlank(couponId)){
-			return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		Coupon coupon = couponService.getById(Long.valueOf(couponId));
-		if(null == coupon) {
-			 return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		CouponVO couponVO = new CouponVO();
-		BeanUtils.copyProperties(coupon, couponVO);
-		List<TicketBox> ticketBoxList = new ArrayList<>();
-		// 查询盲票限制列表
-		List<CouponTicket> ticketList = new ArrayList<>();
-		LambdaQueryWrapper<CouponTicket> ticketQueryWrapper = new LambdaQueryWrapper<>();
-		ticketQueryWrapper.eq(CouponTicket::getCouponId, coupon.getCouponId());
-		ticketQueryWrapper.orderByDesc(CouponTicket::getCreatedTime);
-		ticketList = couponTicketService.list(ticketQueryWrapper);
-		if(null != ticketList && ticketList.size() > 0) {
-			List<String> boxIdList = ticketList.stream().map(CouponTicket::getBoxId).collect(Collectors.toList());
-			if(null != boxIdList && boxIdList.size() > 0) {
-				LambdaQueryWrapper<TicketBox> ticketBoxQueryWrapper = new LambdaQueryWrapper<>();
-				ticketBoxQueryWrapper.in(TicketBox::getBoxId, boxIdList);
-				ticketBoxQueryWrapper.orderByDesc(TicketBox::getCreatedTime);
-				ticketBoxList = ticketBoxService.list(ticketBoxQueryWrapper);
-				couponVO.setTicketBoxList(ticketBoxList);
-			}
-		}
-		// 查询门店限制列表
-		List<Channel> channelList = new ArrayList<>();
-		List<CouponChannel> couponChannelList = new ArrayList<>();
-		LambdaQueryWrapper<CouponChannel> couponChanneQueryWrapper = new LambdaQueryWrapper<>();
-		couponChanneQueryWrapper.eq(CouponChannel::getCouponId, coupon.getCouponId());
-		couponChanneQueryWrapper.orderByDesc(CouponChannel::getCreatedTime);
-		couponChannelList = couponChannelService.list(couponChanneQueryWrapper);
-		if(null != couponChannelList && couponChannelList.size() > 0) {
-			List<Long> channelIdList = couponChannelList.stream().map(CouponChannel::getChannelId).collect(Collectors.toList());
-			if(null != channelIdList && channelIdList.size() > 0) {
-				LambdaQueryWrapper<Channel> channelQueryWrapper = new LambdaQueryWrapper<>();
-				channelQueryWrapper.in(Channel::getChannelId, channelIdList);
-				channelQueryWrapper.orderByDesc(Channel::getCreatedTime);
-				channelList = channelService.list(channelQueryWrapper);
-				couponVO.setChannelList(channelList);
-			}
-		}
-		return AjaxResult.success(couponVO);
-	}
+    /**
+     * 获取代金券详情信息
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/detail")
+    @PreAuthorize("@ss.hasPermi('business:coupon:query')")
+    @ApiOperation("获取代金券详情信息")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "操作成功", response = CouponVO.class)
+    )
+    public AjaxResult getCouponDetail(@RequestBody JSONObject jsonObject) {
+        String couponId = jsonObject.getString("couponId");
+        if (StringUtils.isBlank(couponId)) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Coupon coupon = couponService.getById(Long.valueOf(couponId));
+        if (null == coupon) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        CouponVO couponVO = new CouponVO();
+        BeanUtils.copyProperties(coupon, couponVO);
+        List<TicketBox> ticketBoxList = new ArrayList<>();
+        // 查询盲票限制列表
+        List<CouponTicket> ticketList = new ArrayList<>();
+        LambdaQueryWrapper<CouponTicket> ticketQueryWrapper = new LambdaQueryWrapper<>();
+        ticketQueryWrapper.eq(CouponTicket::getCouponId, coupon.getCouponId());
+        ticketQueryWrapper.orderByDesc(CouponTicket::getCreatedTime);
+        ticketList = couponTicketService.list(ticketQueryWrapper);
+        if (null != ticketList && ticketList.size() > 0) {
+            List<String> boxIdList = ticketList.stream().map(CouponTicket::getBoxId).collect(Collectors.toList());
+            if (null != boxIdList && boxIdList.size() > 0) {
+                LambdaQueryWrapper<TicketBox> ticketBoxQueryWrapper = new LambdaQueryWrapper<>();
+                ticketBoxQueryWrapper.in(TicketBox::getBoxId, boxIdList);
+                ticketBoxQueryWrapper.orderByDesc(TicketBox::getCreatedTime);
+                ticketBoxList = ticketBoxService.list(ticketBoxQueryWrapper);
+                couponVO.setTicketBoxList(ticketBoxList);
+            }
+        }
+        // 查询门店限制列表
+        List<CouponChannel> couponChannelList = new ArrayList<>();
+        LambdaQueryWrapper<CouponChannel> couponChanneQueryWrapper = new LambdaQueryWrapper<>();
+        couponChanneQueryWrapper.eq(CouponChannel::getCouponId, coupon.getCouponId());
+        couponChanneQueryWrapper.orderByDesc(CouponChannel::getCreatedTime);
+        couponChannelList = couponChannelService.list(couponChanneQueryWrapper);
+        if (null != couponChannelList && couponChannelList.size() > 0) {
+            List<Long> channelIdList = couponChannelList.stream().map(CouponChannel::getChannelId)
+                .collect(Collectors.toList());
+            if (null != channelIdList && channelIdList.size() > 0) {
+                QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+                queryWrapper.in("t1.channel_id", channelIdList);
+                List<ChannelVO> list = channelService.selectSaleSiteList(queryWrapper);
 
+                if (null != list && list.size() > 0) {
+                    for (ChannelVO channelVO : list) {
+                        if (null != channelVO && null != channelVO.getChannelId()
+                            && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+                            channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
+                        }
+                    }
+                }
+                couponVO.setChannelList(list);
+            }
+        }
+        return AjaxResult.success(couponVO);
+    }
 
-	public static void main(String[] args) {
-		String boxIds = "964952657896800257,979749771218649117,986362095543124033,986361444503257092,984109134842560513";
-		String[] boxIdArray = boxIds.split(",");
-		for (int i = 0; i < boxIdArray.length; i++) {
-			String boxId = boxIdArray[i];
-			System.out.println("boxId = " + boxId);
-		}
 
-	}
+    public static void main(String[] args) {
+        String boxIds = "964952657896800257,979749771218649117,986362095543124033,986361444503257092,984109134842560513";
+        String[] boxIdArray = boxIds.split(",");
+        for (int i = 0; i < boxIdArray.length; i++) {
+            String boxId = boxIdArray[i];
+            System.out.println("boxId = " + boxId);
+        }
 
-	/**
-	 * 新增优惠券信息
-	 * @param
-	 * @return
-	 */
-	@Log(title = "新增优惠券", businessType = BusinessType.INSERT)
-	@ApiOperation(value = "新增优惠券信息", notes = "新增优惠券")
-	@PostMapping("/create")
-	@PreAuthorize("@ss.hasPermi('business:coupon:add')")
-	public AjaxResult couponCreate(@Validated @RequestBody CouponParam couponParam) {
-		if (StringUtils.isNotBlank(couponParam.getCouponId())) {
-			return AjaxResult.error("该代金券已存在");
-		}
-		Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
-		// 1、校验名称是否重复(代金券表)
-		LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.eq(Coupon::getTitle, coupon.getTitle());
-		queryWrapper.eq(Coupon::getIsDeleted, 0);
-		int nameCount = couponService.count(queryWrapper);
-		if(nameCount > 0) {
-			return AjaxResult.error("代金券名称" + coupon.getTitle() + "已存在!");
-		}
-		// 使用范围
-		List<CouponTicket> ticketList = new ArrayList<>();
-		if(StringUtils.isNotBlank(couponParam.getBoxIds())) {
-			String[] boxIdArray = couponParam.getBoxIds().split(",");
-	        for (int i = 0; i < boxIdArray.length; i++) {
-	        	String boxId = boxIdArray[i];
-	        	CouponTicket couponTicket = new CouponTicket();
-	        	couponTicket.setBoxId(boxId);
-	        	ticketList.add(couponTicket);
-	        }
-		}
+    }
+
+    /**
+     * 新增优惠券信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "新增优惠券", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增优惠券信息", notes = "新增优惠券")
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:coupon:add')")
+    public AjaxResult couponCreate(@Validated @RequestBody CouponParam couponParam) {
+        if (StringUtils.isNotBlank(couponParam.getCouponId())) {
+            return AjaxResult.error("该代金券已存在");
+        }
+        Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
+        // 1、校验名称是否重复(代金券表)
+        LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Coupon::getTitle, coupon.getTitle());
+        queryWrapper.eq(Coupon::getIsDeleted, 0);
+        int nameCount = couponService.count(queryWrapper);
+        if (nameCount > 0) {
+            return AjaxResult.error("代金券名称" + coupon.getTitle() + "已存在!");
+        }
+        // 使用范围
+        List<CouponTicket> ticketList = new ArrayList<>();
+        if (StringUtils.isNotBlank(couponParam.getBoxIds())) {
+            String[] boxIdArray = couponParam.getBoxIds().split(",");
+            for (int i = 0; i < boxIdArray.length; i++) {
+                String boxId = boxIdArray[i];
+                CouponTicket couponTicket = new CouponTicket();
+                couponTicket.setBoxId(boxId);
+                ticketList.add(couponTicket);
+            }
+        }
 //		if(coupon.getUseArea() != CouponUseAreaEnum.COMMON
 //				&& ticketList.size() == 0) {
 //			return AjaxResult.error("使用范围为指定盲票时需要至少选择一种盲票");
 //		}
-		if(StringUtils.isBlank(coupon.getPicUrl())) {
-			coupon.setPicUrl(Constants.COUPON_PIC);
-		}
-		// 3.插入数据
-		try {
-			couponService.saveCoupon(coupon,ticketList);
-		} catch (Exception e) {
-			return AjaxResult.error("代金券'" + coupon.getTitle() + "'新增失败" + e.getMessage());
-		}
+        if (StringUtils.isBlank(coupon.getPicUrl())) {
+            coupon.setPicUrl(Constants.COUPON_PIC);
+        }
+        // 3.插入数据
+        try {
+            couponService.saveCoupon(coupon, ticketList, couponParam.getChannelIdList());
+        } catch (Exception e) {
+            return AjaxResult.error("代金券'" + coupon.getTitle() + "'新增失败" + e.getMessage());
+        }
+
+        return AjaxResult.success("代金券'" + coupon.getTitle() + "'新增成功");
+    }
 
-		return AjaxResult.success("代金券'" + coupon.getTitle() + "'新增成功");
-	}
+    /**
+     * 编辑代金券信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "修改优惠券", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "编辑代金券信息", notes = "代金券端编辑代金券")
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:coupon:edit')")
+    public AjaxResult couponUpdate(@Validated @RequestBody CouponParam couponParam) {
+        if (null == couponParam || StringUtils.isBlank(couponParam.getCouponId())) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
+        // 1、校验修改代金券是否为当前用户的代金券
+        Coupon oldCoupon = couponService.getById(coupon.getCouponId());
+        if (null == oldCoupon || null == oldCoupon.getCouponId()) {
+            return AjaxResult.error("代金券'" + oldCoupon.getTitle() + "'编辑失败,代金券ID异常");
+        }
+        // 2.校验名称是否重复(代金券表);
+        if (!coupon.getTitle().equals(oldCoupon.getTitle())) {
+            LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Coupon::getTitle, coupon.getTitle());
+            queryWrapper.eq(Coupon::getIsDeleted, 0);
+            int nameCount = couponService.count(queryWrapper);
+            if (nameCount > 0) {
+                return AjaxResult.error("代金券名称" + coupon.getTitle() + "已存在!");
+            }
+        }
+        // 使用范围
+        List<CouponTicket> ticketList = new ArrayList<>();
+        if (StringUtils.isNotBlank(couponParam.getBoxIds())) {
+            String[] boxIdArray = couponParam.getBoxIds().split(",");
+            for (int i = 0; i < boxIdArray.length; i++) {
+                String boxId = boxIdArray[i];
+                CouponTicket couponTicket = new CouponTicket();
+                couponTicket.setBoxId(boxId);
+                couponTicket.setCouponId(coupon.getCouponId());
+                ticketList.add(couponTicket);
+            }
+        }
+        try {
+            couponService.updateCoupon(coupon, ticketList, couponParam.getChannelIdList());
+        } catch (Exception e) {
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success("代金券'" + coupon.getTitle() + "'编辑成功");
+    }
 
-	/**
-	 * 编辑代金券信息
-	 * @param
-	 * @return
-	 */
-	@Log(title = "修改优惠券", businessType = BusinessType.UPDATE)
-	@ApiOperation(value = "编辑代金券信息", notes = "代金券端编辑代金券")
-	@PostMapping("/update")
-	@PreAuthorize("@ss.hasPermi('business:coupon:edit')")
-	public AjaxResult couponUpdate(@Validated @RequestBody CouponParam couponParam) {
-		if (null == couponParam || StringUtils.isBlank(couponParam.getCouponId())) {
-			return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
-		// 1、校验修改代金券是否为当前用户的代金券
-		Coupon oldCoupon = couponService.getById(coupon.getCouponId());
-		if(null == oldCoupon || null == oldCoupon.getCouponId()) {
-			return AjaxResult.error("代金券'" + oldCoupon.getTitle() + "'编辑失败,代金券ID异常");
-		}
-		// 2.校验名称是否重复(代金券表);
-		if(!coupon.getTitle().equals(oldCoupon.getTitle())) {
-			LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
-			queryWrapper.eq(Coupon::getTitle, coupon.getTitle());
-			queryWrapper.eq(Coupon::getIsDeleted, 0);
-			int nameCount = couponService.count(queryWrapper);
-			if(nameCount > 0) {
-				return AjaxResult.error("代金券名称" + coupon.getTitle() + "已存在!");
-			}
-		}
-		// 使用范围
-		List<CouponTicket> ticketList = new ArrayList<>();
-		if(StringUtils.isNotBlank(couponParam.getBoxIds())) {
-			String[] boxIdArray = couponParam.getBoxIds().split(",");
-	        for (int i = 0; i < boxIdArray.length; i++) {
-	        	String boxId = boxIdArray[i];
-	        	CouponTicket couponTicket = new CouponTicket();
-	        	couponTicket.setBoxId(boxId);
-	        	couponTicket.setCouponId(coupon.getCouponId());
-				ticketList.add(couponTicket);
-	        }
-		}
-		try {
-			couponService.updateCoupon(coupon, ticketList);
-		} catch (Exception e) {
-			return AjaxResult.error(e.getMessage());
-		}
-		return AjaxResult.success("代金券'" + coupon.getTitle() + "'编辑成功");
-	}
 
+    /**
+     * 上下架优惠券
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "上下架优惠券", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('business:coupon:on')")
+    @ApiOperation(value = "上下架优惠券信息", notes = "优惠券管理编辑代金券")
+    @PostMapping("/status")
+    public AjaxResult couponStatus(@RequestBody JSONObject jsonObject) {
+        String couponId = jsonObject.getString("couponId");
+        String status = jsonObject.getString("status");
+        if (StringUtils.isBlank(couponId) || StringUtils.isBlank(status)) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        try {
+            couponService.lambdaUpdate().set(Coupon::getStatus,
+                    CouponStatusEnum.PUT_ON.getValue().equals(status) ? CouponStatusEnum.PUT_ON : CouponStatusEnum.PUT_OFF)
+                .eq(Coupon::getCouponId, Long.valueOf(couponId)).update();
+            // 查询代金券信息
+        } catch (Exception e) {
+            return AjaxResult.error("操作失败");
+        }
+        return AjaxResult.success("操作成功");
+    }
 
-	/**
-	 * 上下架优惠券
-	 * @param
-	 * @return
-	 */
-	@Log(title = "上下架优惠券", businessType = BusinessType.UPDATE)
-	@PreAuthorize("@ss.hasPermi('business:coupon:on')")
-	@ApiOperation(value = "上下架优惠券信息", notes = "优惠券管理编辑代金券")
-	@PostMapping("/status")
-	public AjaxResult couponStatus(@RequestBody JSONObject jsonObject) {
-		String couponId = jsonObject.getString("couponId");
-		String status = jsonObject.getString("status");
-		if (StringUtils.isBlank(couponId) || StringUtils.isBlank(status)) {
-			return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		try {
-			couponService.lambdaUpdate().set(Coupon::getStatus, CouponStatusEnum.PUT_ON.getValue().equals(status)?CouponStatusEnum.PUT_ON:CouponStatusEnum.PUT_OFF).eq(Coupon::getCouponId, Long.valueOf(couponId)).update();
-			// 查询代金券信息
-		} catch (Exception e) {
-			return AjaxResult.error("操作失败");
-		}
-		return AjaxResult.success("操作成功");
-	}
 
+    /**
+     * 删除代金券商品(假删)
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "删除优惠券", businessType = BusinessType.DELETE)
+    @PostMapping(value = "/remove")
+    @PreAuthorize("@ss.hasPermi('business:coupon:remove')")
+    public AjaxResult removeCoupon(@RequestBody JSONObject jsonObject) {
+        String couponId = jsonObject.getString("couponId");
+        if (StringUtils.isBlank(couponId)) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Coupon coupon = couponService.getById(Long.valueOf(couponId));
+        if (null == coupon) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        // 商品未下架, 不允许删除
+        if (coupon.getStatus().equals("on")) {
+            return AjaxResult.error("代金券未下架,不允许删除");
+        }
+        LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(Coupon::getIsDeleted, 1);
+        updateWrapper.eq(Coupon::getCouponId, coupon.getCouponId());
+        boolean res = couponService.update(updateWrapper);
+        if (!res) {
+            return AjaxResult.error("代金券删除失败");
+        }
+        return AjaxResult.success("代金券删除成功");
+    }
 
-	/**
-	 * 删除代金券商品(假删)
-	 *
-	 * @param
-	 * @return
-	 */
-	@Log(title = "删除优惠券", businessType = BusinessType.DELETE)
-	@PostMapping(value = "/remove")
-	@PreAuthorize("@ss.hasPermi('business:coupon:remove')")
-	public AjaxResult removeCoupon(@RequestBody JSONObject jsonObject) {
-		String couponId = jsonObject.getString("couponId");
-	    if (StringUtils.isBlank(couponId)){
-	      return error(ErrorCodeEnum.ERROR_CODE_1001);
-	    }
-	    Coupon coupon = couponService.getById(Long.valueOf(couponId));
-		if(null == coupon) {
-			 return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		// 商品未下架, 不允许删除
-		if(coupon.getStatus().equals("on")) {
-			return AjaxResult.error("代金券未下架,不允许删除");
-		}
-		LambdaUpdateWrapper<Coupon> updateWrapper = new LambdaUpdateWrapper<>();
-		updateWrapper.set(Coupon::getIsDeleted, 1);
-		updateWrapper.eq(Coupon::getCouponId, coupon.getCouponId());
-		boolean res = couponService.update(updateWrapper);
-		if(!res) {
-			return AjaxResult.error("代金券删除失败");
-		}
-		return AjaxResult.success("代金券删除成功");
-	}
 
+    private String getParentsName(String channelNo) {
+        if (StringUtils.isNotBlank(channelNo)) {
+            String[] noArray = channelNo.split("\\.");
+            if (null != noArray && noArray.length > 0) {
+                List<String> noList = new ArrayList<String>();
+                String parentNo = "";
+                for (int i = 0; i < noArray.length; i++) {
+                    if (null != noArray[i] && StringUtils.isNotBlank(noArray[i])) {
+                        parentNo += (i > 0 ? "." : "") + noArray[i];
+                        if (StringUtils.isNotBlank(parentNo) && !parentNo.equals(channelNo)) {
+                            noList.add(parentNo);
+                        }
+                    }
+                }
+                if (noList.size() > 0) {
+                    LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+                    queryWrapper.gt(Channel::getLevel, 0);
+                    queryWrapper.in(Channel::getChannelNo, noList);
+                    queryWrapper.orderByAsc(Channel::getLevel);
+                    List<Channel> list = channelService.list(queryWrapper);
+                    if (null != list && list.size() > 0) {
+                        String names = list.stream().map(Channel::getName).collect(Collectors.joining(" > "));
+                        return names;
+                    }
+                }
+            }
+        }
+        return "";
+    }
 }

+ 115 - 113
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsTagMgrController.java

@@ -40,124 +40,126 @@ import org.springframework.web.bind.annotation.RestController;
 @Component
 public class GoodsTagMgrController extends BaseApiController {
 
-  @Autowired
-  private IGoodsTagService goodsTagService;
-
-  @Autowired
-  private IGoodsTagRelService goodsTagRelService;
-
-
-  /**
-   * 查询商品标签列表, 支持翻页
-   *
-   * @return
-   */
-  @PostMapping("/list")
-  @PreAuthorize("@ss.hasPermi('business:tag:list')")
-  public TableDataInfo list(@RequestBody JSONObject param) {
-    startPage();
-    List<GoodsTag> tagList = goodsTagService.list(new LambdaQueryWrapper<GoodsTag>().orderByDesc(GoodsTag::getSort));
-    return getDataTable(tagList);
-  }
-
-  /**
-   * 查询商品标签列表
-   *
-   * @return
-   */
-  @PostMapping("/items")
-  public AjaxResult items(@RequestBody JSONObject param) {
-    List<GoodsTag> tagList = goodsTagService.list(new LambdaQueryWrapper<GoodsTag>().orderByDesc(GoodsTag::getSort));
-    return AjaxResult.success(tagList);
-  }
-
-  /**
-   * 获取商品标签详情信息
-   *
-   * @param
-   * @return
-   */
-  @PostMapping(value = "/detail")
-  @PreAuthorize("@ss.hasPermi('business:tag:query')")
-  public AjaxResult info(@RequestBody JSONObject jsonObject) {
-    Long tagId = jsonObject.getLong("tagId");
-    if (null == tagId || 0 == tagId) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
+    @Autowired
+    private IGoodsTagService goodsTagService;
+
+    @Autowired
+    private IGoodsTagRelService goodsTagRelService;
+
+
+    /**
+     * 查询商品标签列表, 支持翻页
+     *
+     * @return
+     */
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:tag:list')")
+    public TableDataInfo list(@RequestBody JSONObject param) {
+        startPage();
+        List<GoodsTag> tagList = goodsTagService.list(
+            new LambdaQueryWrapper<GoodsTag>().orderByDesc(GoodsTag::getSort));
+        return getDataTable(tagList);
     }
-    GoodsTag goodsTag = goodsTagService.getById(tagId);
-    return AjaxResult.success(goodsTag);
-  }
-
-
-  /**
-   * 新增商品标签信息
-   *
-   * @param
-   * @return
-   */
-  @Log(title = "新增商品标签", businessType = BusinessType.INSERT)
-  @ApiOperation(value = "新增商品标签", notes = "后台商品管理新增标签")
-  @PostMapping("/create")
-  @PreAuthorize("@ss.hasPermi('business:tag:add')")
-  public AjaxResult create(@Validated @RequestBody GoodsTag goodsTag) {
-    // 1、校验名称是否重复
-    int cnt = goodsTagService.count(new LambdaQueryWrapper<GoodsTag>()
-        .eq(GoodsTag::getName, goodsTag.getName()));
-    if (cnt > 0) {
-      return AjaxResult.error("标签名称已存在!");
+
+    /**
+     * 查询商品标签列表
+     *
+     * @return
+     */
+    @PostMapping("/items")
+    public AjaxResult items(@RequestBody JSONObject param) {
+        List<GoodsTag> tagList = goodsTagService.list(
+            new LambdaQueryWrapper<GoodsTag>().orderByDesc(GoodsTag::getSort));
+        return AjaxResult.success(tagList);
     }
-    // 2.保存
-    goodsTagService.save(goodsTag);
-    return AjaxResult.success("保存成功");
-  }
-
-  /**
-   * 编辑商品标签信息
-   *
-   * @param
-   * @return
-   */
-  @Log(title = "修改商品标签", businessType = BusinessType.UPDATE)
-  @ApiOperation(value = "编辑商品标签信息", notes = "后台商品管理修改商品标签信息")
-  @PostMapping("/update")
-  @PreAuthorize("@ss.hasPermi('business:tag:edit')")
-  public AjaxResult update(@Validated @RequestBody GoodsTag goodsTag) {
-    if (null == goodsTag || null == goodsTag.getTagId()
-        || 0 == goodsTag.getTagId()) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
+
+    /**
+     * 获取商品标签详情信息
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/detail")
+    @PreAuthorize("@ss.hasPermi('business:tag:query')")
+    public AjaxResult info(@RequestBody JSONObject jsonObject) {
+        Long tagId = jsonObject.getLong("tagId");
+        if (null == tagId || 0 == tagId) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        GoodsTag goodsTag = goodsTagService.getById(tagId);
+        return AjaxResult.success(goodsTag);
     }
-    int cnt = goodsTagService.count(new LambdaQueryWrapper<GoodsTag>()
-        .eq(GoodsTag::getName, goodsTag.getName()).notIn(GoodsTag::getTagId,
-            Arrays.asList(goodsTag.getTagId())));
-    if (cnt > 0) {
-      return AjaxResult.error("标签名称已存在!");
+
+
+    /**
+     * 新增商品标签信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "新增商品标签", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增商品标签", notes = "后台商品管理新增标签")
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:tag:add')")
+    public AjaxResult create(@Validated @RequestBody GoodsTag goodsTag) {
+        // 1、校验名称是否重复
+        int cnt = goodsTagService.count(new LambdaQueryWrapper<GoodsTag>()
+            .eq(GoodsTag::getName, goodsTag.getName()));
+        if (cnt > 0) {
+            return AjaxResult.error("标签名称已存在!");
+        }
+        // 2.保存
+        goodsTagService.save(goodsTag);
+        return AjaxResult.success("保存成功");
     }
-    // 保存数据
-    boolean rst = goodsTagService.updateById(goodsTag);
-    return rst ? AjaxResult.success("更新成功") : AjaxResult.error("更新失败");
-  }
-
-
-  /**
-   * 删除商品标签
-   *
-   * @param
-   * @return
-   */
-  @Log(title = "删除商品标签", businessType = BusinessType.DELETE)
-  @PostMapping(value = "/remove")
-  @PreAuthorize("@ss.hasPermi('business:tag:remove')")
-  public AjaxResult remove(@RequestBody GoodsTag goodsTag) {
-
-    if (null == goodsTag || null == goodsTag.getTagId()
-        || 0 == goodsTag.getTagId()) {
-      return error(ErrorCodeEnum.ERROR_CODE_1001);
+
+    /**
+     * 编辑商品标签信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "修改商品标签", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "编辑商品标签信息", notes = "后台商品管理修改商品标签信息")
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:tag:edit')")
+    public AjaxResult update(@Validated @RequestBody GoodsTag goodsTag) {
+        if (null == goodsTag || null == goodsTag.getTagId()
+            || 0 == goodsTag.getTagId()) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        int cnt = goodsTagService.count(new LambdaQueryWrapper<GoodsTag>()
+            .eq(GoodsTag::getName, goodsTag.getName()).notIn(GoodsTag::getTagId,
+                Arrays.asList(goodsTag.getTagId())));
+        if (cnt > 0) {
+            return AjaxResult.error("标签名称已存在!");
+        }
+        // 保存数据
+        boolean rst = goodsTagService.updateById(goodsTag);
+        return rst ? AjaxResult.success("更新成功") : AjaxResult.error("更新失败");
     }
-    goodsTagRelService.remove(new LambdaQueryWrapper<GoodsTagRel>()
-        .eq(GoodsTagRel::getTagId, goodsTag.getTagId()));
 
-    boolean res = goodsTagService.removeById(goodsTag.getTagId());
-    return res ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
-  }
+
+    /**
+     * 删除商品标签
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "删除商品标签", businessType = BusinessType.DELETE)
+    @PostMapping(value = "/remove")
+    @PreAuthorize("@ss.hasPermi('business:tag:remove')")
+    public AjaxResult remove(@RequestBody GoodsTag goodsTag) {
+
+        if (null == goodsTag || null == goodsTag.getTagId()
+            || 0 == goodsTag.getTagId()) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        goodsTagRelService.remove(new LambdaQueryWrapper<GoodsTagRel>()
+            .eq(GoodsTagRel::getTagId, goodsTag.getTagId()));
+
+        boolean res = goodsTagService.removeById(goodsTag.getTagId());
+        return res ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
+    }
 
 }

+ 431 - 415
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.excel.ChannelExcel;
 import com.qs.mp.admin.domain.excel.UserTicketOrderItemExcel;
+import com.qs.mp.admin.domain.param.ChannelQueryParam;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
@@ -68,365 +69,378 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/api/v1/mp/admin/salesite/*")
 public class SaleSiteMgrController extends BaseApiController {
 
-	@Autowired
-	private IChannelService channelService;
-
-	@Autowired
-	private IChannelUserRelService channelUserRelService;
-
-	@Autowired
-	private IChannelOrderService channelOrderService;
-
-	@Autowired
-	private IUserTicketOrderService userTicketOrderService;
-
-	@Autowired
-	private ISysUserService userService;
-
-	@Autowired
-	private ITicketService ticketService;
-
-	@Autowired
-	private MapperFacade mapperFacade;
-
-
-	/**
-	 * 获取经销商列表信息,支持翻页
-	 *
-	 * @return
-	 */
-	@PostMapping("/list")
-	@PreAuthorize("@ss.hasPermi('business:salesite:list')")
-	@ApiOperation("获取经销商列表信息,支持翻页")
-	@ApiResponses(
-			@ApiResponse(code = 200, message = "经销商列表返回信息",response = ChannelVO.class)
-	)
-	public TableDataInfo listSite(@RequestBody Channel channel) {
-		List<ChannelVO> list = new ArrayList<ChannelVO>();
-		startPage();
-		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
-		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());
-		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
-		queryWrapper.eq(null != channel && null != channel.getProvinceId(), "t1.province_id", channel.getProvinceId());
-		queryWrapper.eq(null != channel && null != channel.getCityId(), "t1.city_id", channel.getCityId());
-		queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
-		list = channelService.selectSaleSiteList(queryWrapper);
-
-		if(null != list && list.size() > 0) {
-			for(ChannelVO channelVO : list) {
-				if(null != channelVO && null != channelVO.getChannelId()
-						&& StringUtils.isNotBlank(channelVO.getChannelNo())) {
-					// int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
-					LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
-					userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
-					int userCnt = channelUserRelService.count(userCntQueryWrapper);
-					channelVO.setUserCnt(userCnt);
-					// 查询用户信息
-					//SysUser sysUser = userService.selectUserById(channelVO.getUserId());
-					// channelVO.setSysUser(sysUser);
-					channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
- 				}
-			}
-		}
-		return getDataTable(list);
-	}
-
-	// 获取上级渠道迭代
-	private String getParentsName(String channelNo) {
-		if(StringUtils.isNotBlank(channelNo)) {
-			String[] noArray = channelNo.split("\\.");
-			if(null != noArray && noArray.length > 0) {
-				List<String> noList = new ArrayList<String>();
-				String parentNo = "";
-				for (int i = 0; i < noArray.length; i++) {
-					if(null != noArray[i] && StringUtils.isNotBlank(noArray[i])) {
-						parentNo += (i>0?".":"")+noArray[i];
-						if(StringUtils.isNotBlank(parentNo) && !parentNo.equals(channelNo)) {
-							noList.add(parentNo);
-						}
-					}
-				}
-				if(noList.size() > 0 ) {
-					LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
-					queryWrapper.gt(Channel::getLevel, 0);
-					queryWrapper.in(Channel::getChannelNo,noList);
-					queryWrapper.orderByAsc(Channel::getLevel);
-					List<Channel> list = channelService.list(queryWrapper);
-					if(null != list && list.size() >0) {
-						String names = list.stream().map(Channel::getName).collect(Collectors.joining(" > "));
-						return names;
-					}
-				}
-			}
-		}
-		return "";
-	}
-
-	@PostMapping("/export")
-	@PreAuthorize("@ss.hasPermi('business:salesite:export')")
-	@ApiOperation("导出经销商信息")
-	@ApiResponses(
-			@ApiResponse(code = 200, message = "经销商列表返回信息",response = ChannelVO.class)
-	)
-	public AjaxResult export(@RequestBody Channel channel) {
-		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
-		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());
-		queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name", channel.getName());
-		queryWrapper.eq(null != channel && null != channel.getProvinceId(), "t1.province_id", channel.getProvinceId());
-		queryWrapper.eq(null != channel && null != channel.getCityId(), "t1.city_id", channel.getCityId());
-		queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
-		List<ChannelVO> list  = channelService.selectSaleSiteList(queryWrapper);
-		if (CollectionUtils.isEmpty(list)) {
-			return AjaxResult.error("没有符合条件的经销商信息");
-		}
-
-		if(null != list && list.size() > 0) {
-			for(ChannelVO channelVO : list) {
-				if(null != channelVO && null != channelVO.getChannelId()
-						&& StringUtils.isNotBlank(channelVO.getChannelNo())) {
-					channelVO.setParentsName(getParentsNameAndCommRate(channelVO.getChannelNo()));
-				}
-			}
-		}
-
-		List<ChannelExcel> excelList = new ArrayList<>();
-		for (ChannelVO channelVO : list) {
-			ChannelExcel channelExcel = new ChannelExcel();
-			channelExcel.setChannelId(channelVO.getChannelId());
-			channelExcel.setCommRate(channelVO.getCommRate());
-			channelExcel.setName(channelVO.getName());
-			channelExcel.setParentsName(channelVO.getParentsName());
-			channelExcel.setCreatedTime(channelVO.getCreatedTime());
-			channelExcel.setOffLineSaleCnt(channelVO.getOffLineSaleCnt());
-			channelExcel.setOffLineQtyCnt(channelVO.getOffLineQtyCnt());
-			channelExcel.setOnLineSaleCnt(channelVO.getOnLineSaleCnt());
-			channelExcel.setUserCnt(channelVO.getUserCnt());
-			if (Objects.nonNull(channelVO.getCertifyStatus())) {
-				channelExcel.setCertifyStatus(channelVO.getCertifyStatus().getDesc());
-			}
-			excelList.add(channelExcel);
-		}
-
-		ExcelUtil<ChannelExcel> util = new ExcelUtil<>(ChannelExcel.class);
-		return util.exportExcel(excelList, "经销商导出", false);
-	}
-
-	private String getParentsNameAndCommRate(String channelNo) {
-		if(StringUtils.isNotBlank(channelNo)) {
-			String[] noArray = channelNo.split("\\.");
-			if(null != noArray && noArray.length > 0) {
-				List<String> noList = new ArrayList<String>();
-				String parentNo = "";
-				for (int i = 0; i < noArray.length; i++) {
-					if(null != noArray[i] && StringUtils.isNotBlank(noArray[i])) {
-						parentNo += (i>0?".":"")+noArray[i];
-						if(StringUtils.isNotBlank(parentNo) && !parentNo.equals(channelNo)) {
-							noList.add(parentNo);
-						}
-					}
-				}
-				if(noList.size() > 0 ) {
-					LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
-					queryWrapper.gt(Channel::getLevel, 0);
-					queryWrapper.in(Channel::getChannelNo,noList);
-					queryWrapper.orderByAsc(Channel::getLevel);
-					List<Channel> list = channelService.list(queryWrapper);
-					if(null != list && list.size() >0) {
-						return list.stream().map(channel -> channel.getName() + "(" + channel.getCommRate() + "%)").collect(Collectors.joining(" > "));
-					}
-				}
-			}
-		}
-		return "";
-	}
-
-
-	/**
-	 * 查询所有渠道列表
-	 *
-	 * @return
-	 */
-	@PostMapping("/listAll")
-	// @PreAuthorize("@ss.hasPermi('business:salesite:list')")
-	@ApiOperation("查询所有渠道列表")
-	@ApiResponses(
-			@ApiResponse(code = 200, message = "经销商列表返回信息",response = Channel.class)
-	)
-	public AjaxResult listAllSite() {
-		List<Channel> list = new ArrayList<Channel>();
-		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
-		queryWrapper.eq(Channel::getLevel, 0);
-		queryWrapper.orderByDesc(Channel::getChannelId);
-		list = channelService.list(queryWrapper);
-		return AjaxResult.success(list);
-	}
-
-	/**
-	 * 新增经销商信息
-	 * @param
-	 * @return
-	 */
-	@Log(title = "新增经销商", businessType = BusinessType.INSERT)
-	@ApiOperation(value = "新增经销商信息", notes = "经销商端新增经销商")
-	@PostMapping("/create")
-	@PreAuthorize("@ss.hasPermi('business:salesite:add')")
-	public AjaxResult siteCreate(@Validated @RequestBody SaleSiteParam channelParam) {
-		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
-			return AjaxResult.error("该经销商已存在");
-		}
-		Channel channel = mapperFacade.map(channelParam, Channel.class);
-		// 1、校验名称是否重复、手机号是否存在(经销商表)
-		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.eq(Channel::getName, channel.getName());
-		queryWrapper.eq(Channel::getLevel, 0);
-		int nameCount = channelService.count(queryWrapper);
-		if(nameCount > 0) {
-			return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
-		}
-		int mobileCount = channelService.count(
-		        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
-		if(mobileCount > 0) {
-			 return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
-		}
-		// 2.校验佣金比例,不能高于其父经销商的佣金比例
-		if(null != channel.getParentId() && channel.getParentId() != 0) {
-			Channel parentChannel = channelService.getById(channel.getParentId());
-			if(null != parentChannel) {
-				 if(null != parentChannel.getCommRate()
-						 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
-					 return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
-				 }
-				 channel.setLevel(parentChannel.getLevel()+1);
-				 channel.setChannelNo(parentChannel.getChannelNo()+".");
-			}else {
-				return AjaxResult.error("父经销商不存在");
-			}
-
-		}else {
-			channel.setLevel(1);
-			channel.setChannelNo("");
-		}
-		// 3.插入数据
-		try {
-			channelService.saveChannel(channel,ChannelRoleEnum.SALESITE);
-		} catch (Exception e) {
-			return AjaxResult.error("经销商'" + channel.getName() + "'新增失败" + e.getMessage());
-		}
-
-		return AjaxResult.success("经销商'" + channel.getName() + "'新增成功");
-	}
-
-	@PreAuthorize("@ss.hasPermi('business:salesite:edit')")
-	@ApiOperation("修改门店信息")
-	@PostMapping("/edit")
-	public AjaxResult edit(@RequestBody SaleSiteEditParam saleSiteEditParam){
-		Channel channel = channelService.getById(saleSiteEditParam.getChannelId());
-		if (channel == null) {
-			return AjaxResult.error("门店信息不存在");
-		}
-
-		boolean rtn = channelService.update(new LambdaUpdateWrapper<Channel>()
-			.set(Channel::getName, saleSiteEditParam.getName())
-			.eq(Channel::getChannelId, saleSiteEditParam.getChannelId()));
-
-		if (!rtn) {
-			return AjaxResult.error("更新门店信息失败");
-		}
-
-		return AjaxResult.success();
-	}
-
-
-	/**
-	 * 编辑经销商信息
-	 * @param
-	 * @return
-	 */
-	@Log(title = "修改经销商", businessType = BusinessType.UPDATE)
-	@ApiOperation(value = "编辑经销商信息", notes = "经销商端编辑经销商")
-	@PostMapping("/update")
-	@PreAuthorize("@ss.hasPermi('business:salesite:edit')")
-	public AjaxResult siteUpdate(@Validated @RequestBody ChannelParam channelParam) {
-		if (null == channelParam || null == channelParam.getChannelId()) {
-			return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		Channel channel = mapperFacade.map(channelParam, Channel.class);
-		// 1、校验修改子经销商是否为当前用户的子经销商
-		Channel oldChannel = channelService.getById(channel.getChannelId());
-		if(null == oldChannel || null == oldChannel.getChannelId()) {
-			return AjaxResult.error("经销商'" + oldChannel.getName() + "'编辑失败,ID异常");
-		}
-		// 2.校验名称是否重复、手机号是否存在(经销商表);
-		if(!channel.getName().equals(oldChannel.getName())) {
-			LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
-			queryWrapper.eq(Channel::getName, channel.getName());
-			queryWrapper.eq(Channel::getLevel, 0);
-			int nameCount = channelService.count(queryWrapper);
-			if(nameCount > 0) {
-				return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
-			}
-		}
-		boolean mobileChange = false;  // 手机号码是否有变更
-		if(!channel.getMobile().equals(oldChannel.getMobile())) {
-			int mobileCount = channelService.count(
-			        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
-			if(mobileCount > 0) {
-				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
-			}
-			if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(channel.getMobile()))) {
-				return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
-			}
-			mobileChange = true;
-		}
-		// 3.校验佣金比例,不能高于其父经销商的佣金比例,不能低于其子经销商的最大佣金比例
-		Channel parentChannel = channelService.getById(oldChannel.getParentId());
-		if(null != parentChannel) {
-			 if(null != parentChannel.getCommRate()
-					 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
-				 return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
-			 }
-			 channel.setLevel(parentChannel.getLevel()+1);
-			 channel.setChannelNo(parentChannel.getChannelNo()+".");
-		}else {
-			return AjaxResult.error("父经销商不存在");
-		}
-		try {
-			channel.setUserId(oldChannel.getUserId());
-			channelService.updateChannel(channel, mobileChange);
-		} catch (Exception e) {
-			return AjaxResult.error(e.getMessage());
-		}
-		return AjaxResult.success("经销商'" + channel.getName() + "'编辑成功");
-	}
-
-
-	/**
-	 * 停用、启用经销商
-	 * @param
-	 * @return
-	 */
-	@Log(title = "经销商启用停用", businessType = BusinessType.UPDATE)
-	@ApiOperation(value = "停用、启用经销商信息", notes = "经销商管理编辑经销商")
-	@PostMapping("/status")
-	@PreAuthorize("@ss.hasPermi('business:salesite:edit')")
-	public AjaxResult siteStatus(@RequestBody JSONObject jsonObject) {
-		String channelId = jsonObject.containsKey("channelId")?jsonObject.get("channelId").toString():"";
-		String status = jsonObject.containsKey("status")?jsonObject.get("status").toString():"";
-		if (null == jsonObject || StringUtils.isBlank(channelId)
-				|| StringUtils.isBlank(status)) {
-			return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		try {
-			channelService.lambdaUpdate().set(Channel::getStatus, status).eq(Channel::getChannelId, channelId).update();
-			// 查询经销商信息
+    @Autowired
+    private IChannelService channelService;
+
+    @Autowired
+    private IChannelUserRelService channelUserRelService;
+
+    @Autowired
+    private IChannelOrderService channelOrderService;
+
+    @Autowired
+    private IUserTicketOrderService userTicketOrderService;
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private ITicketService ticketService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+
+    /**
+     * 获取经销商列表信息,支持翻页
+     *
+     * @return
+     */
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:salesite:list')")
+    @ApiOperation("获取经销商列表信息,支持翻页")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "经销商列表返回信息", response = ChannelVO.class)
+    )
+    public TableDataInfo listSite(@RequestBody ChannelQueryParam channel) {
+        List<ChannelVO> list = new ArrayList<ChannelVO>();
+        startPage();
+        QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+        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());
+        queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name",
+            channel.getName());
+        queryWrapper.eq(null != channel && null != channel.getProvinceId(), "t1.province_id", channel.getProvinceId());
+        queryWrapper.eq(null != channel && null != channel.getCityId(), "t1.city_id", channel.getCityId());
+        queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
+
+        if (!CollectionUtils.isEmpty(channel.getExcludeChannelIds())) {
+            queryWrapper.notIn("t1.channel_id", channel.getExcludeChannelIds());
+        }
+
+        list = channelService.selectSaleSiteList(queryWrapper);
+
+        if (null != list && list.size() > 0) {
+            for (ChannelVO channelVO : list) {
+                if (null != channelVO && null != channelVO.getChannelId()
+                    && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+                    // int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+                    LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
+                    userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
+                    int userCnt = channelUserRelService.count(userCntQueryWrapper);
+                    channelVO.setUserCnt(userCnt);
+                    // 查询用户信息
+                    //SysUser sysUser = userService.selectUserById(channelVO.getUserId());
+                    // channelVO.setSysUser(sysUser);
+                    channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
+                }
+            }
+        }
+        return getDataTable(list);
+    }
+
+    // 获取上级渠道迭代
+    private String getParentsName(String channelNo) {
+        if (StringUtils.isNotBlank(channelNo)) {
+            String[] noArray = channelNo.split("\\.");
+            if (null != noArray && noArray.length > 0) {
+                List<String> noList = new ArrayList<String>();
+                String parentNo = "";
+                for (int i = 0; i < noArray.length; i++) {
+                    if (null != noArray[i] && StringUtils.isNotBlank(noArray[i])) {
+                        parentNo += (i > 0 ? "." : "") + noArray[i];
+                        if (StringUtils.isNotBlank(parentNo) && !parentNo.equals(channelNo)) {
+                            noList.add(parentNo);
+                        }
+                    }
+                }
+                if (noList.size() > 0) {
+                    LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+                    queryWrapper.gt(Channel::getLevel, 0);
+                    queryWrapper.in(Channel::getChannelNo, noList);
+                    queryWrapper.orderByAsc(Channel::getLevel);
+                    List<Channel> list = channelService.list(queryWrapper);
+                    if (null != list && list.size() > 0) {
+                        String names = list.stream().map(Channel::getName).collect(Collectors.joining(" > "));
+                        return names;
+                    }
+                }
+            }
+        }
+        return "";
+    }
+
+    @PostMapping("/export")
+    @PreAuthorize("@ss.hasPermi('business:salesite:export')")
+    @ApiOperation("导出经销商信息")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "经销商列表返回信息", response = ChannelVO.class)
+    )
+    public AjaxResult export(@RequestBody Channel channel) {
+        QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
+        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());
+        queryWrapper.likeRight(null != channel && StringUtils.isNotBlank(channel.getName()), "t1.name",
+            channel.getName());
+        queryWrapper.eq(null != channel && null != channel.getProvinceId(), "t1.province_id", channel.getProvinceId());
+        queryWrapper.eq(null != channel && null != channel.getCityId(), "t1.city_id", channel.getCityId());
+        queryWrapper.eq(null != channel && null != channel.getAreaId(), "t1.area_id", channel.getAreaId());
+        List<ChannelVO> list = channelService.selectSaleSiteList(queryWrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            return AjaxResult.error("没有符合条件的经销商信息");
+        }
+
+        if (null != list && list.size() > 0) {
+            for (ChannelVO channelVO : list) {
+                if (null != channelVO && null != channelVO.getChannelId()
+                    && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+                    channelVO.setParentsName(getParentsNameAndCommRate(channelVO.getChannelNo()));
+                }
+            }
+        }
+
+        List<ChannelExcel> excelList = new ArrayList<>();
+        for (ChannelVO channelVO : list) {
+            ChannelExcel channelExcel = new ChannelExcel();
+            channelExcel.setChannelId(channelVO.getChannelId());
+            channelExcel.setCommRate(channelVO.getCommRate());
+            channelExcel.setName(channelVO.getName());
+            channelExcel.setParentsName(channelVO.getParentsName());
+            channelExcel.setCreatedTime(channelVO.getCreatedTime());
+            channelExcel.setOffLineSaleCnt(channelVO.getOffLineSaleCnt());
+            channelExcel.setOffLineQtyCnt(channelVO.getOffLineQtyCnt());
+            channelExcel.setOnLineSaleCnt(channelVO.getOnLineSaleCnt());
+            channelExcel.setUserCnt(channelVO.getUserCnt());
+            if (Objects.nonNull(channelVO.getCertifyStatus())) {
+                channelExcel.setCertifyStatus(channelVO.getCertifyStatus().getDesc());
+            }
+            excelList.add(channelExcel);
+        }
+
+        ExcelUtil<ChannelExcel> util = new ExcelUtil<>(ChannelExcel.class);
+        return util.exportExcel(excelList, "经销商导出", false);
+    }
+
+    private String getParentsNameAndCommRate(String channelNo) {
+        if (StringUtils.isNotBlank(channelNo)) {
+            String[] noArray = channelNo.split("\\.");
+            if (null != noArray && noArray.length > 0) {
+                List<String> noList = new ArrayList<String>();
+                String parentNo = "";
+                for (int i = 0; i < noArray.length; i++) {
+                    if (null != noArray[i] && StringUtils.isNotBlank(noArray[i])) {
+                        parentNo += (i > 0 ? "." : "") + noArray[i];
+                        if (StringUtils.isNotBlank(parentNo) && !parentNo.equals(channelNo)) {
+                            noList.add(parentNo);
+                        }
+                    }
+                }
+                if (noList.size() > 0) {
+                    LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+                    queryWrapper.gt(Channel::getLevel, 0);
+                    queryWrapper.in(Channel::getChannelNo, noList);
+                    queryWrapper.orderByAsc(Channel::getLevel);
+                    List<Channel> list = channelService.list(queryWrapper);
+                    if (null != list && list.size() > 0) {
+                        return list.stream().map(channel -> channel.getName() + "(" + channel.getCommRate() + "%)")
+                            .collect(Collectors.joining(" > "));
+                    }
+                }
+            }
+        }
+        return "";
+    }
+
+
+    /**
+     * 查询所有渠道列表
+     *
+     * @return
+     */
+    @PostMapping("/listAll")
+    // @PreAuthorize("@ss.hasPermi('business:salesite:list')")
+    @ApiOperation("查询所有渠道列表")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "经销商列表返回信息", response = Channel.class)
+    )
+    public AjaxResult listAllSite() {
+        List<Channel> list = new ArrayList<Channel>();
+        LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
+        queryWrapper.eq(Channel::getLevel, 0);
+        queryWrapper.orderByDesc(Channel::getChannelId);
+        list = channelService.list(queryWrapper);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 新增经销商信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "新增经销商", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增经销商信息", notes = "经销商端新增经销商")
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:salesite:add')")
+    public AjaxResult siteCreate(@Validated @RequestBody SaleSiteParam channelParam) {
+        if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
+            return AjaxResult.error("该经销商已存在");
+        }
+        Channel channel = mapperFacade.map(channelParam, Channel.class);
+        // 1、校验名称是否重复、手机号是否存在(经销商表)
+        LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Channel::getName, channel.getName());
+        queryWrapper.eq(Channel::getLevel, 0);
+        int nameCount = channelService.count(queryWrapper);
+        if (nameCount > 0) {
+            return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+        }
+        int mobileCount = channelService.count(
+            new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+        if (mobileCount > 0) {
+            return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+        }
+        // 2.校验佣金比例,不能高于其父经销商的佣金比例
+        if (null != channel.getParentId() && channel.getParentId() != 0) {
+            Channel parentChannel = channelService.getById(channel.getParentId());
+            if (null != parentChannel) {
+                if (null != parentChannel.getCommRate()
+                    && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+                    return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
+                }
+                channel.setLevel(parentChannel.getLevel() + 1);
+                channel.setChannelNo(parentChannel.getChannelNo() + ".");
+            } else {
+                return AjaxResult.error("父经销商不存在");
+            }
+
+        } else {
+            channel.setLevel(1);
+            channel.setChannelNo("");
+        }
+        // 3.插入数据
+        try {
+            channelService.saveChannel(channel, ChannelRoleEnum.SALESITE);
+        } catch (Exception e) {
+            return AjaxResult.error("经销商'" + channel.getName() + "'新增失败" + e.getMessage());
+        }
+
+        return AjaxResult.success("经销商'" + channel.getName() + "'新增成功");
+    }
+
+    @PreAuthorize("@ss.hasPermi('business:salesite:edit')")
+    @ApiOperation("修改门店信息")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody SaleSiteEditParam saleSiteEditParam) {
+        Channel channel = channelService.getById(saleSiteEditParam.getChannelId());
+        if (channel == null) {
+            return AjaxResult.error("门店信息不存在");
+        }
+
+        boolean rtn = channelService.update(new LambdaUpdateWrapper<Channel>()
+            .set(Channel::getName, saleSiteEditParam.getName())
+            .eq(Channel::getChannelId, saleSiteEditParam.getChannelId()));
+
+        if (!rtn) {
+            return AjaxResult.error("更新门店信息失败");
+        }
+
+        return AjaxResult.success();
+    }
+
+
+    /**
+     * 编辑经销商信息
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "修改经销商", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "编辑经销商信息", notes = "经销商端编辑经销商")
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:salesite:edit')")
+    public AjaxResult siteUpdate(@Validated @RequestBody ChannelParam channelParam) {
+        if (null == channelParam || null == channelParam.getChannelId()) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        Channel channel = mapperFacade.map(channelParam, Channel.class);
+        // 1、校验修改子经销商是否为当前用户的子经销商
+        Channel oldChannel = channelService.getById(channel.getChannelId());
+        if (null == oldChannel || null == oldChannel.getChannelId()) {
+            return AjaxResult.error("经销商'" + oldChannel.getName() + "'编辑失败,ID异常");
+        }
+        // 2.校验名称是否重复、手机号是否存在(经销商表);
+        if (!channel.getName().equals(oldChannel.getName())) {
+            LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Channel::getName, channel.getName());
+            queryWrapper.eq(Channel::getLevel, 0);
+            int nameCount = channelService.count(queryWrapper);
+            if (nameCount > 0) {
+                return AjaxResult.error("经销商名称" + channel.getName() + "已存在!");
+            }
+        }
+        boolean mobileChange = false;  // 手机号码是否有变更
+        if (!channel.getMobile().equals(oldChannel.getMobile())) {
+            int mobileCount = channelService.count(
+                new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, channel.getMobile()));
+            if (mobileCount > 0) {
+                return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+            }
+            if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(channel.getMobile()))) {
+                return AjaxResult.error("手机号码" + channel.getMobile() + "已注册!");
+            }
+            mobileChange = true;
+        }
+        // 3.校验佣金比例,不能高于其父经销商的佣金比例,不能低于其子经销商的最大佣金比例
+        Channel parentChannel = channelService.getById(oldChannel.getParentId());
+        if (null != parentChannel) {
+            if (null != parentChannel.getCommRate()
+                && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
+                return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
+            }
+            channel.setLevel(parentChannel.getLevel() + 1);
+            channel.setChannelNo(parentChannel.getChannelNo() + ".");
+        } else {
+            return AjaxResult.error("父经销商不存在");
+        }
+        try {
+            channel.setUserId(oldChannel.getUserId());
+            channelService.updateChannel(channel, mobileChange);
+        } catch (Exception e) {
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success("经销商'" + channel.getName() + "'编辑成功");
+    }
+
+
+    /**
+     * 停用、启用经销商
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "经销商启用停用", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "停用、启用经销商信息", notes = "经销商管理编辑经销商")
+    @PostMapping("/status")
+    @PreAuthorize("@ss.hasPermi('business:salesite:edit')")
+    public AjaxResult siteStatus(@RequestBody JSONObject jsonObject) {
+        String channelId = jsonObject.containsKey("channelId") ? jsonObject.get("channelId").toString() : "";
+        String status = jsonObject.containsKey("status") ? jsonObject.get("status").toString() : "";
+        if (null == jsonObject || StringUtils.isBlank(channelId)
+            || StringUtils.isBlank(status)) {
+            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();
@@ -434,61 +448,63 @@ public class SaleSiteMgrController extends BaseApiController {
 //				sysUser.setStatus(status);
 //				userService.updateUserStatus(sysUser);
 //			}
-		} catch (Exception e) {
-			return AjaxResult.error("操作失败");
-		}
-		return AjaxResult.success("操作成功");
-	}
-
-
-	/**
-	 * 查询经销商详情
-	 * @param
-	 * @return
-	 */
-	@ApiOperation(value = "查询经销商详情信息", notes = "经销商管理编辑子经销商查询经销商详情")
-	@PostMapping("/detail")
-	@PreAuthorize("@ss.hasPermi('business:salesite:query')")
-	public AjaxResult getSiteDetail(@RequestBody JSONObject jsonObject) {
-		String channelId = (null != jsonObject && jsonObject.containsKey("channelId"))?jsonObject.getString("channelId"):"";
-		if (StringUtils.isBlank(channelId)) {
-			return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		ChannelVO channelVO = channelService.getChannelVoById(Long.valueOf(channelId));
-		if(null == channelVO || null == channelVO.getChannelId()) {
-			 return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		if(null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
-			// int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
-			LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
-			userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
-			int userCnt = channelUserRelService.count(userCntQueryWrapper);
-			channelVO.setUserCnt(userCnt);
-			channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
-		}
-	    // 查询经销商销售额、佣金收入、订单数等
-	    ChannelOperDataVO channelOperDataVO = channelService.getChannelTotalOperData(channelVO.getChannelNo());
-
-		// 盲票销售张数
-		int ticketSaleCnt = userTicketOrderService.getSaleSiteTotalTicketNumCnt(channelVO.getChannelId());
-		channelOperDataVO.setTicketSaleCnt(ticketSaleCnt);
-	    channelVO.setOperData(channelOperDataVO);
-
-        if(null != channelVO && null != channelVO.getChannelId()) {
-	    	LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
-			userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
-			int userCnt = channelUserRelService.count(userCntQueryWrapper);
-			channelVO.setUserCnt(userCnt);
-
-	    	int ticketQtyCnt = ticketService.getTicketQtyCnt(channelVO.getChannelId());
-	    	channelVO.setOffLineQtyCnt(ticketQtyCnt);
-
-	    	TicketCntVO ticketCnt = userTicketOrderService.getTicketSaleCnt(channelVO.getChannelId());
-			channelVO.setOffLineSaleCnt(null != ticketCnt?ticketCnt.getOffLineSaleCnt():0);
-			channelVO.setOnLineSaleCnt(null != ticketCnt?ticketCnt.getOnLineSaleCnt():0);
-	    }
-
-		return AjaxResult.success(channelVO);
-	}
+        } catch (Exception e) {
+            return AjaxResult.error("操作失败");
+        }
+        return AjaxResult.success("操作成功");
+    }
+
+
+    /**
+     * 查询经销商详情
+     *
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "查询经销商详情信息", notes = "经销商管理编辑子经销商查询经销商详情")
+    @PostMapping("/detail")
+    @PreAuthorize("@ss.hasPermi('business:salesite:query')")
+    public AjaxResult getSiteDetail(@RequestBody JSONObject jsonObject) {
+        String channelId =
+            (null != jsonObject && jsonObject.containsKey("channelId")) ? jsonObject.getString("channelId") : "";
+        if (StringUtils.isBlank(channelId)) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        ChannelVO channelVO = channelService.getChannelVoById(Long.valueOf(channelId));
+        if (null == channelVO || null == channelVO.getChannelId()) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        if (null != channelVO && StringUtils.isNotBlank(channelVO.getChannelNo())) {
+            // int siteCnt = channelService.getChannelSiteCnt(channelVO.getChannelNo());
+            LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
+            userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
+            int userCnt = channelUserRelService.count(userCntQueryWrapper);
+            channelVO.setUserCnt(userCnt);
+            channelVO.setParentsName(getParentsName(channelVO.getChannelNo()));
+        }
+        // 查询经销商销售额、佣金收入、订单数等
+        ChannelOperDataVO channelOperDataVO = channelService.getChannelTotalOperData(channelVO.getChannelNo());
+
+        // 盲票销售张数
+        int ticketSaleCnt = userTicketOrderService.getSaleSiteTotalTicketNumCnt(channelVO.getChannelId());
+        channelOperDataVO.setTicketSaleCnt(ticketSaleCnt);
+        channelVO.setOperData(channelOperDataVO);
+
+        if (null != channelVO && null != channelVO.getChannelId()) {
+            LambdaQueryWrapper<ChannelUserRel> userCntQueryWrapper = new LambdaQueryWrapper<ChannelUserRel>();
+            userCntQueryWrapper.eq(ChannelUserRel::getChannelId, channelVO.getChannelId());
+            int userCnt = channelUserRelService.count(userCntQueryWrapper);
+            channelVO.setUserCnt(userCnt);
+
+            int ticketQtyCnt = ticketService.getTicketQtyCnt(channelVO.getChannelId());
+            channelVO.setOffLineQtyCnt(ticketQtyCnt);
+
+            TicketCntVO ticketCnt = userTicketOrderService.getTicketSaleCnt(channelVO.getChannelId());
+            channelVO.setOffLineSaleCnt(null != ticketCnt ? ticketCnt.getOffLineSaleCnt() : 0);
+            channelVO.setOnLineSaleCnt(null != ticketCnt ? ticketCnt.getOnLineSaleCnt() : 0);
+        }
+
+        return AjaxResult.success(channelVO);
+    }
 
 }

+ 299 - 292
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -63,217 +63,223 @@ import org.springframework.web.multipart.MultipartFile;
 @Component
 public class TicketBoxMgrController extends BaseApiController {
 
-	@Autowired
-	private ITicketBoxService ticketBoxService;
-
-	@Autowired
-	private ITicketService ticketService;
-
-	@Autowired
-	private ITicketAwardsPrizeService ticketAwardsPrizeService;
-
-	@Autowired
-	private ITicketAwardsService ticketAwardsService;
-
-	@Autowired
-	private PulsarClientService pulsarClientService;
-
-	@Autowired
-	private MapperFacade mapperFacade;
-
-	@Autowired
-	private ITicketBoxChannelService ticketBoxChannelService;
-
-	@Autowired
-	private IChannelService channelService;
-
-	@Autowired
-	private ITicketBoxGoodsService ticketBoxGoodsService;
-
-	@Value("${mp.exportUrl}")
-	private String exportUrl;
-
-	@Value("${export.page-size}")
-	private int pageSize;
-
-	@Value("${server.env}")
-	private String env;
-
-	/**
-	 * 查询所有盲票组列表
-	 *
-	 * @return
-	 */
-	@PostMapping("/list")
-	@PreAuthorize("@ss.hasPermi('business:ticket:list')")
-	@ApiOperation("查询所有盲票组列表")
-	@ApiResponses(
-			@ApiResponse(code = 200, message = "查询成功", response = TicketBox.class)
-	)
-	public TableDataInfo list(@RequestBody TicketBoxQueryParam ticketBoxQueryParam) {
-		startPage();
-		QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<TicketBox>();
-		queryWrapper.like(null != ticketBoxQueryParam && StringUtils.isNotBlank(ticketBoxQueryParam.getTitle()), "title", ticketBoxQueryParam.getTitle());
-		queryWrapper.eq(null != ticketBoxQueryParam && null != ticketBoxQueryParam.getType(), "type", ticketBoxQueryParam.getType());
-		queryWrapper.eq(null != ticketBoxQueryParam && null != ticketBoxQueryParam.getStatus(), "status", ticketBoxQueryParam.getStatus());
-		// 排除指定票组
-		if (CollectionUtils.isNotEmpty(ticketBoxQueryParam.getExcludeBoxIds())) {
-			queryWrapper.notIn("box_id", ticketBoxQueryParam.getExcludeBoxIds());
-		}
-		queryWrapper.orderByAsc("FIELD(`status`, 'wait', 'doing', 'done', 'on', 'off')").orderByDesc("box_id");
-		List<TicketBox> list = ticketBoxService.list(queryWrapper);
-		return getDataTable(list);
-	}
-
-	@PostMapping("/update")
-	@PreAuthorize("@ss.hasPermi('business:ticket:edit')")
-	@ApiOperation("更新盲票信息")
-	public AjaxResult update(@RequestBody TicketBoxUpdateParam param) {
-		return AjaxResult.success(ticketBoxService.updateTicketBox(param));
-	}
-
-
+    @Autowired
+    private ITicketBoxService ticketBoxService;
+
+    @Autowired
+    private ITicketService ticketService;
+
+    @Autowired
+    private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+    @Autowired
+    private ITicketAwardsService ticketAwardsService;
+
+    @Autowired
+    private PulsarClientService pulsarClientService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @Autowired
+    private ITicketBoxChannelService ticketBoxChannelService;
+
+    @Autowired
+    private IChannelService channelService;
+
+    @Autowired
+    private ITicketBoxGoodsService ticketBoxGoodsService;
+
+    @Value("${mp.exportUrl}")
+    private String exportUrl;
+
+    @Value("${export.page-size}")
+    private int pageSize;
+
+    @Value("${server.env}")
+    private String env;
+
+    /**
+     * 查询所有盲票组列表
+     *
+     * @return
+     */
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:ticket:list')")
+    @ApiOperation("查询所有盲票组列表")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "查询成功", response = TicketBox.class)
+    )
+    public TableDataInfo list(@RequestBody TicketBoxQueryParam ticketBoxQueryParam) {
+        startPage();
+        QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<TicketBox>();
+        queryWrapper.like(null != ticketBoxQueryParam && StringUtils.isNotBlank(ticketBoxQueryParam.getTitle()),
+            "title", ticketBoxQueryParam.getTitle());
+        queryWrapper.eq(null != ticketBoxQueryParam && null != ticketBoxQueryParam.getType(), "type",
+            ticketBoxQueryParam.getType());
+        queryWrapper.eq(null != ticketBoxQueryParam && null != ticketBoxQueryParam.getStatus(), "status",
+            ticketBoxQueryParam.getStatus());
+        // 排除指定票组
+        if (CollectionUtils.isNotEmpty(ticketBoxQueryParam.getExcludeBoxIds())) {
+            queryWrapper.notIn("box_id", ticketBoxQueryParam.getExcludeBoxIds());
+        }
+        queryWrapper.orderByAsc("FIELD(`status`, 'wait', 'doing', 'done', 'on', 'off')").orderByDesc("box_id");
+        List<TicketBox> list = ticketBoxService.list(queryWrapper);
+        return getDataTable(list);
+    }
 
-	@PostMapping("/update/sortWeight")
-	@PreAuthorize("@ss.hasPermi('business:ticket:edit')")
-	@ApiOperation("更新盲票排序权重")
-	public AjaxResult updateSortWeight(@RequestBody TicketUpdateSortWeightParam param) {
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:ticket:edit')")
+    @ApiOperation("更新盲票信息")
+    public AjaxResult update(@RequestBody TicketBoxUpdateParam param) {
+        return AjaxResult.success(ticketBoxService.updateTicketBox(param));
+    }
 
-		TicketBox ticketBox = new TicketBox();
-		ticketBox.setBoxId(param.getBoxId());
-		ticketBox.setSortWeight(param.getSortWeight());
-		return AjaxResult.success(ticketBoxService.updateById(ticketBox));
-	}
 
+    @PostMapping("/update/sortWeight")
+    @PreAuthorize("@ss.hasPermi('business:ticket:edit')")
+    @ApiOperation("更新盲票排序权重")
+    public AjaxResult updateSortWeight(@RequestBody TicketUpdateSortWeightParam param) {
 
+        TicketBox ticketBox = new TicketBox();
+        ticketBox.setBoxId(param.getBoxId());
+        ticketBox.setSortWeight(param.getSortWeight());
+        return AjaxResult.success(ticketBoxService.updateById(ticketBox));
+    }
 
-	/**
-	 * 查看盲票详情
-	 */
-	@PostMapping("/detail")
-	@PreAuthorize("@ss.hasPermi('business:ticket:query')")
-	@ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
-	@ApiResponses(
-			@ApiResponse(code = 200, message = "查询成功", response = TicketBoxVO.class)
-	)
-	public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
-		if (com.qs.mp.common.utils.StringUtils.isBlank(param.getBoxId())) {
-			return AjaxResult.error("参数异常,盲票组ID缺失");
-		}
-		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
-		TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
-
-		// 设置关联商品信息
-		QueryWrapper<TicketBoxGoods> ticketBoxGoodsQueryWrapper = new QueryWrapper<>();
-		ticketBoxGoodsQueryWrapper.eq("t1.box_id", param.getBoxId());
-		ticketBoxVO.setGoodsList(ticketBoxGoodsService.listByQueryWrapper(ticketBoxGoodsQueryWrapper));
-
-		// 设置经销商信息
-		if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(ticketBox.getSaleChannelType())) {
-			List<TicketBoxChannel> ticketBoxChannelList = ticketBoxChannelService.list(new LambdaQueryWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
-			if (CollectionUtils.isNotEmpty(ticketBoxChannelList)) {
-				List<Long> channelIds = ticketBoxChannelList.stream().map(TicketBoxChannel::getChannelId).collect(Collectors.toList());
-				List<Channel> channelList = channelService.list(new LambdaQueryWrapper<Channel>().select(Channel::getChannelId, Channel::getName)
-						.in(Channel::getChannelId, channelIds));
-				ticketBoxVO.setChannelList(channelList);
-			}
-		}
-		List<TicketAwards> ticketAwardsList = ticketAwardsService.list(new LambdaQueryWrapper<TicketAwards>()
-				.eq(TicketAwards::getBoxId, ticketBox.getBoxId()).orderByAsc(TicketAwards::getSort));
-		List<TicketAwardsVO> ticketAwardsVOS = mapperFacade.mapAsList(ticketAwardsList, TicketAwardsVO.class);
-		for (TicketAwardsVO ticketAwardsVO : ticketAwardsVOS) {
-			QueryWrapper<TicketAwardsPrize> queryWrapper = new QueryWrapper<>();
-			queryWrapper.eq("t1.awards_id", ticketAwardsVO.getAwardsId());
-			ticketAwardsVO.setPrizeList(ticketAwardsPrizeService.listByQueryWrapper(queryWrapper));
-		}
-		ticketBoxVO.setAwardsList(ticketAwardsVOS);
-		return AjaxResult.success(ticketBoxVO);
-	}
 
-	/**
-	 * 新增盲票
-	 *
-	 * @param
-	 * @return
-	 */
-	@Log(title = "盲票新增", businessType = BusinessType.INSERT)
-	@ApiOperation(value = "新增盲票", notes = "管理端创建盲票")
-	@PostMapping("/create")
-	@PreAuthorize("@ss.hasPermi('business:ticket:add')")
-	public AjaxResult create(@Validated @RequestBody TicketBoxCreateParam param) {
-		if (param.getType() == TicketTypeEnum.OFFLINE) {
-			if (param.getPkgSalePrice() == null || param.getPkgSalePrice() == 0) {
-				return AjaxResult.error("采购单价必须大于0");
-			}
-			if (param.getPkgUnit() == null || param.getPkgUnit() == 0) {
-				return AjaxResult.error("每包张数必须大于0");
-			}
-		}
-		if (param.getAwardsList().size() <= 1) {
-			return AjaxResult.error("至少需要两个奖级");
-		}
-		String boxId = ticketBoxService.createTicketBox(param);
-		if (StringUtils.isNotBlank(boxId)) {
-			return AjaxResult.success();
-		}
-		return AjaxResult.error("创建失败");
-	}
+    /**
+     * 查看盲票详情
+     */
+    @PostMapping("/detail")
+    @PreAuthorize("@ss.hasPermi('business:ticket:query')")
+    @ApiOperation(value = "查看盲票详情", notes = "根据盲票组ID,获取盲票信息")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "查询成功", response = TicketBoxVO.class)
+    )
+    public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
+        if (com.qs.mp.common.utils.StringUtils.isBlank(param.getBoxId())) {
+            return AjaxResult.error("参数异常,盲票组ID缺失");
+        }
+        TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+        TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+
+        // 设置关联商品信息
+        QueryWrapper<TicketBoxGoods> ticketBoxGoodsQueryWrapper = new QueryWrapper<>();
+        ticketBoxGoodsQueryWrapper.eq("t1.box_id", param.getBoxId());
+        ticketBoxVO.setGoodsList(ticketBoxGoodsService.listByQueryWrapper(ticketBoxGoodsQueryWrapper));
+
+        // 设置经销商信息
+        if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(ticketBox.getSaleChannelType())) {
+            List<TicketBoxChannel> ticketBoxChannelList = ticketBoxChannelService.list(
+                new LambdaQueryWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
+            if (CollectionUtils.isNotEmpty(ticketBoxChannelList)) {
+                List<Long> channelIds = ticketBoxChannelList.stream().map(TicketBoxChannel::getChannelId)
+                    .collect(Collectors.toList());
+                List<Channel> channelList = channelService.list(
+                    new LambdaQueryWrapper<Channel>().select(Channel::getChannelId, Channel::getName)
+                        .in(Channel::getChannelId, channelIds));
+                ticketBoxVO.setChannelList(channelList);
+            }
+        }
+        List<TicketAwards> ticketAwardsList = ticketAwardsService.list(new LambdaQueryWrapper<TicketAwards>()
+            .eq(TicketAwards::getBoxId, ticketBox.getBoxId()).orderByAsc(TicketAwards::getSort));
+        List<TicketAwardsVO> ticketAwardsVOS = mapperFacade.mapAsList(ticketAwardsList, TicketAwardsVO.class);
+        for (TicketAwardsVO ticketAwardsVO : ticketAwardsVOS) {
+            QueryWrapper<TicketAwardsPrize> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("t1.awards_id", ticketAwardsVO.getAwardsId());
+            ticketAwardsVO.setPrizeList(ticketAwardsPrizeService.listByQueryWrapper(queryWrapper));
+        }
+        ticketBoxVO.setAwardsList(ticketAwardsVOS);
+        return AjaxResult.success(ticketBoxVO);
+    }
 
-	/**
-	 * 盲票上下架
-	 *
-	 * @param
-	 * @return
-	 */
-	@Log(title = "盲票上下架", businessType = BusinessType.UPDATE)
-	@ApiOperation(value = "盲票上下架", notes = "管理端盲票上下架")
-	@PostMapping("/put")
-	@PreAuthorize("@ss.hasPermi('business:ticket:on')")
-	public AjaxResult putOnOff(@RequestBody TicketBox param) {
-		if (StringUtils.isBlank(param.getBoxId()) || param.getStatus() == null) {
-				return AjaxResult.error("参数缺失");
-		}
-		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
-		if (param.getStatus() == TicketBoxStatusEnum.PUT_OFF) {
-			if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_ON) {
-				return AjaxResult.error("当前状态不是已上架,不能下架");
-			}
-			ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
-					.set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
-					.set(TicketBox::getManualOff, 1)
-					.eq(TicketBox::getBoxId, ticketBox.getBoxId()));
-		} else if (param.getStatus() == TicketBoxStatusEnum.PUT_ON) {
-			if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_OFF && ticketBox.getStatus() != TicketBoxStatusEnum.DONE) {
-				return AjaxResult.error("当前状态不是待上架或已下架,不能上架");
-			}
-			ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
-					.eq(TicketBox::getBoxId, ticketBox.getBoxId()));
-		}
+    /**
+     * 新增盲票
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "盲票新增", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增盲票", notes = "管理端创建盲票")
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:ticket:add')")
+    public AjaxResult create(@Validated @RequestBody TicketBoxCreateParam param) {
+        if (param.getType() == TicketTypeEnum.OFFLINE) {
+            if (param.getPkgSalePrice() == null || param.getPkgSalePrice() == 0) {
+                return AjaxResult.error("采购单价必须大于0");
+            }
+            if (param.getPkgUnit() == null || param.getPkgUnit() == 0) {
+                return AjaxResult.error("每包张数必须大于0");
+            }
+        }
+        if (param.getAwardsList().size() <= 1) {
+            return AjaxResult.error("至少需要两个奖级");
+        }
+        String boxId = ticketBoxService.createTicketBox(param);
+        if (StringUtils.isNotBlank(boxId)) {
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("创建失败");
+    }
 
-		return AjaxResult.success("操作成功");
-	}
+    /**
+     * 盲票上下架
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "盲票上下架", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "盲票上下架", notes = "管理端盲票上下架")
+    @PostMapping("/put")
+    @PreAuthorize("@ss.hasPermi('business:ticket:on')")
+    public AjaxResult putOnOff(@RequestBody TicketBox param) {
+        if (StringUtils.isBlank(param.getBoxId()) || param.getStatus() == null) {
+            return AjaxResult.error("参数缺失");
+        }
+        TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+        if (param.getStatus() == TicketBoxStatusEnum.PUT_OFF) {
+            if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_ON) {
+                return AjaxResult.error("当前状态不是已上架,不能下架");
+            }
+            ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+                .set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
+                .set(TicketBox::getManualOff, 1)
+                .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+        } else if (param.getStatus() == TicketBoxStatusEnum.PUT_ON) {
+            if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_OFF
+                && ticketBox.getStatus() != TicketBoxStatusEnum.DONE) {
+                return AjaxResult.error("当前状态不是待上架或已下架,不能上架");
+            }
+            ticketBoxService.update(
+                new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+                    .eq(TicketBox::getBoxId, ticketBox.getBoxId()));
+        }
+
+        return AjaxResult.success("操作成功");
+    }
 
-	/**
-	 * 盲票删除
-	 *
-	 * @param
-	 * @return
-	 */
-	@Log(title = "盲票删除", businessType = BusinessType.DELETE)
-	@ApiOperation(value = "盲票删除", notes = "管理端盲票删除")
-	@PostMapping("/remove")
-	@PreAuthorize("@ss.hasPermi('business:ticket:remove')")
-	public AjaxResult remove(@RequestBody TicketBox param) {
-		if (StringUtils.isBlank(param.getBoxId())) {
-			return AjaxResult.error("参数缺失");
-		}
-		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
-		if (ticketBox.getStatus() != TicketBoxStatusEnum.DONE) {
-			return AjaxResult.error("当前状态不是待上架,不能删除");
-		}
-		ticketBoxService.removeTicketBox(param.getBoxId());
-		return AjaxResult.success("删除成功");
-	}
+    /**
+     * 盲票删除
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "盲票删除", businessType = BusinessType.DELETE)
+    @ApiOperation(value = "盲票删除", notes = "管理端盲票删除")
+    @PostMapping("/remove")
+    @PreAuthorize("@ss.hasPermi('business:ticket:remove')")
+    public AjaxResult remove(@RequestBody TicketBox param) {
+        if (StringUtils.isBlank(param.getBoxId())) {
+            return AjaxResult.error("参数缺失");
+        }
+        TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+        if (ticketBox.getStatus() != TicketBoxStatusEnum.DONE) {
+            return AjaxResult.error("当前状态不是待上架,不能删除");
+        }
+        ticketBoxService.removeTicketBox(param.getBoxId());
+        return AjaxResult.success("删除成功");
+    }
 
 	/*@Log(title = "盲票导出", businessType = BusinessType.EXPORT)
 	@PostMapping("/export")
@@ -364,100 +370,101 @@ public class TicketBoxMgrController extends BaseApiController {
 	}*/
 
 
-	@Log(title = "导出印刷", businessType = BusinessType.EXPORT)
-	@PostMapping("/exportDraw")
-	@PreAuthorize("@ss.hasPermi('business:ticket:export')")
-	public AjaxResult exportDraw(@RequestBody BathIdParam ids) {
-		if (null == ids || null == ids.getIds() || ids.getIds().size() == 0) {
-			return AjaxResult.error("请选择需要导出的盲票组");
-		}
-		TicketBox ticketBox = ticketBoxService.getById(ids.getIds().get(0));
-		if (null == ticketBox || StringUtils.isBlank(ticketBox.getBoxId())) {
-			return AjaxResult.error("选择的盲票组数据异常, 请联系管理员或重试");
-		}
-		List<TicketExcel> excelList = new ArrayList<TicketExcel>();
-		List<Ticket> listAll = new ArrayList<Ticket>();
-		// 首先查询要导出的数据总数
-		LambdaQueryWrapper<Ticket> queryWrapper = new LambdaQueryWrapper<Ticket>();
-		queryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
-		int totalSize = ticketService.count(queryWrapper);
-		if (totalSize == 0) {
-			return AjaxResult.error("选择的盲票组中没有可导出的数据");
-		}
-
-		if(totalSize > pageSize) {
-			int totalPage = totalSize%pageSize == 0 ? totalSize/pageSize : totalSize/pageSize+1;
-			for (int i = 0; i < totalPage; i++) {
-				LambdaQueryWrapper<Ticket> pageQueryWrapper = new LambdaQueryWrapper<Ticket>();
-				pageQueryWrapper.select(Ticket::getSerialNo, Ticket::getDrawNum, Ticket::getCipherLuckyNum);
-				pageQueryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
-				pageQueryWrapper.last("limit "+ (i*pageSize) +", " + pageSize);
-				List<Ticket> list = ticketService.list(pageQueryWrapper);
-				if(null != list && list.size() > 0 ) {
-					listAll.addAll(list);
-				}
-			}
-		}else {
-			listAll = ticketService.list(queryWrapper);
-		}
+    @Log(title = "导出印刷", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportDraw")
+    @PreAuthorize("@ss.hasPermi('business:ticket:export')")
+    public AjaxResult exportDraw(@RequestBody BathIdParam ids) {
+        if (null == ids || null == ids.getIds() || ids.getIds().size() == 0) {
+            return AjaxResult.error("请选择需要导出的盲票组");
+        }
+        TicketBox ticketBox = ticketBoxService.getById(ids.getIds().get(0));
+        if (null == ticketBox || StringUtils.isBlank(ticketBox.getBoxId())) {
+            return AjaxResult.error("选择的盲票组数据异常, 请联系管理员或重试");
+        }
+        List<TicketExcel> excelList = new ArrayList<TicketExcel>();
+        List<Ticket> listAll = new ArrayList<Ticket>();
+        // 首先查询要导出的数据总数
+        LambdaQueryWrapper<Ticket> queryWrapper = new LambdaQueryWrapper<Ticket>();
+        queryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
+        int totalSize = ticketService.count(queryWrapper);
+        if (totalSize == 0) {
+            return AjaxResult.error("选择的盲票组中没有可导出的数据");
+        }
+
+        if (totalSize > pageSize) {
+            int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
+            for (int i = 0; i < totalPage; i++) {
+                LambdaQueryWrapper<Ticket> pageQueryWrapper = new LambdaQueryWrapper<Ticket>();
+                pageQueryWrapper.select(Ticket::getSerialNo, Ticket::getDrawNum, Ticket::getCipherLuckyNum);
+                pageQueryWrapper.eq(Ticket::getBoxId, ids.getIds().get(0));
+                pageQueryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+                List<Ticket> list = ticketService.list(pageQueryWrapper);
+                if (null != list && list.size() > 0) {
+                    listAll.addAll(list);
+                }
+            }
+        } else {
+            listAll = ticketService.list(queryWrapper);
+        }
+
+        if (null != listAll && listAll.size() > 0) {
+            listAll.sort(Comparator.comparing(Ticket::getSerialNo));
+            for (Ticket ticket : listAll) {
+                if (null != ticket && StringUtils.isNotBlank(ticket.getSerialNo())
+                    && StringUtils.isNotBlank(ticket.getDrawNum())
+                    && StringUtils.isNotBlank(ticket.getCipherLuckyNum())) {
+                    TicketExcel ticketExcel = new TicketExcel();
+                    ticketExcel.setSerialNo(ticket.getSerialNo());
+                    if (ticketBox.getIsEncrypt() == 1) {
+                        // 加密序列号
+                        ticketExcel.setUrl(exportUrl + AESUtil.encrypt(ticket.getSerialNo()));
+                    } else {
+                        ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
+                    }
+                    if (!ServerEnvEnum.PROD.getCode().equals(env)) {
+                        ticketExcel.setDrawNum(formatDraw(ticket.getDrawNum()));
+                        ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
+                    }
+                    excelList.add(ticketExcel);
+                }
+            }
+        }
 
-		if(null != listAll && listAll.size() > 0 ) {
-			listAll.sort(Comparator.comparing(Ticket::getSerialNo));
-			for (Ticket ticket : listAll) {
-				if (null != ticket && StringUtils.isNotBlank(ticket.getSerialNo())
-						&& StringUtils.isNotBlank(ticket.getDrawNum())
-						&& StringUtils.isNotBlank(ticket.getCipherLuckyNum())) {
-					TicketExcel ticketExcel = new TicketExcel();
-					ticketExcel.setSerialNo(ticket.getSerialNo());
-					if (ticketBox.getIsEncrypt() == 1){
-						// 加密序列号
-						ticketExcel.setUrl(exportUrl + AESUtil.encrypt(ticket.getSerialNo()));
-					}else {
-						ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
-					}
-					if (!ServerEnvEnum.PROD.getCode().equals(env)) {
-						ticketExcel.setDrawNum(formatDraw(ticket.getDrawNum()));
-						ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
-					}
-					excelList.add(ticketExcel);
-				}
-			}
-		}
-
-		ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
-		return util.exportExcel(excelList, ticketBox.getTitle(), false);
-	}
+        ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
+        return util.exportExcel(excelList, ticketBox.getTitle(), false);
+    }
 
 
-	/**
-	 * 导出印刷格式化
-	 * @param drawNum
-	 * @return
-	 */
-	private String formatDraw(String drawNum) {
-		if(StringUtils.isNotBlank(drawNum)) {
-			try {
-				List<String> drawList = new ArrayList<String>();
-				JSONArray jsonArray = JSONArray.parseArray(drawNum);
-				if(null != jsonArray && jsonArray.size() > 0) {
-					for (int i = 0; i < jsonArray.size(); i++) {
-						JSONObject jo = jsonArray.getJSONObject(i);
-						if(null != jo && jo.containsKey("name")
-								&& jo.containsKey("num")) {
-							drawList.add(jo.getString("name")+","+jo.getString("num"));
-						}
-					}
-				}
-				if(null != drawList && drawList.size() >0) {
-					return StringUtils.join(drawList.toArray(), ",");
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-		return "";
+    /**
+     * 导出印刷格式化
+     *
+     * @param drawNum
+     * @return
+     */
+    private String formatDraw(String drawNum) {
+        if (StringUtils.isNotBlank(drawNum)) {
+            try {
+                List<String> drawList = new ArrayList<String>();
+                JSONArray jsonArray = JSONArray.parseArray(drawNum);
+                if (null != jsonArray && jsonArray.size() > 0) {
+                    for (int i = 0; i < jsonArray.size(); i++) {
+                        JSONObject jo = jsonArray.getJSONObject(i);
+                        if (null != jo && jo.containsKey("name")
+                            && jo.containsKey("num")) {
+                            drawList.add(jo.getString("name") + "," + jo.getString("num"));
+                        }
+                    }
+                }
+                if (null != drawList && drawList.size() > 0) {
+                    return StringUtils.join(drawList.toArray(), ",");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return "";
 
-	}
+    }
 
 
 }

+ 134 - 112
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelCouponVerifyController.java

@@ -3,11 +3,17 @@ package com.qs.mp.web.controller.api.channel;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponChannel;
+import com.qs.mp.admin.service.ICouponChannelService;
+import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.channel.domain.ChannelCouponVerifyLog;
 import com.qs.mp.channel.service.IChannelCouponVerifyLogService;
 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.enums.CouponTypeEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.user.domain.UserCoupon;
@@ -41,125 +47,141 @@ import org.springframework.web.bind.annotation.RestController;
 @Component
 public class ChannelCouponVerifyController extends BaseApiController {
 
-  @Autowired
-  private IChannelService channelService;
-
-  @Autowired
-  private IUserCouponService userCouponService;
-
-  @Autowired
-  private IUserCouponChannelService userCouponChannelService;
-
-  @Autowired
-  private IChannelCouponVerifyLogService channelCouponVerifyLogService;
-
-  @Autowired
-  private MapperFacade mapperFacade;
-
-  /**
-   * 优惠券查询
-   *
-   * @param
-   * @return
-   */
-  @PostMapping(value = "coupon/query")
-  public AjaxResult query(@RequestBody JSONObject param) {
-    String verifyCode = param.getString("verifyCode");
-    Long channelId = SecurityUtils.getLoginUser().getChannelId();
-    UserCoupon userCoupon = userCouponService.getOne(new LambdaQueryWrapper<UserCoupon>()
-        .eq(UserCoupon::getVerifyCode, verifyCode));
-    if (null == userCoupon) {
-      return error("券码非法");
-    }
-    AjaxResult result = checkCoupon(verifyCode, channelId, userCoupon);
-    if (null != result) {
-      return result;
-    }
-    List<UserCouponVO> userCouponVOList = userCouponService.listUserCouponVO(
-        new QueryWrapper<UserCoupon>()
-            .eq("t1.verify_code", verifyCode));
+    @Autowired
+    private IChannelService channelService;
 
-    return AjaxResult.success(userCouponVOList.get(0));
-  }
+    @Autowired
+    private IUserCouponService userCouponService;
 
-  private AjaxResult checkCoupon(String verifyCode, Long channelId, UserCoupon userCoupon) {
-    AjaxResult result = null;
+    @Autowired
+    private IUserCouponChannelService userCouponChannelService;
 
-    if (StringUtils.isBlank(verifyCode)) {
-      result = error(ErrorCodeEnum.ERROR_CODE_1001);
-    }
-    if (null == userCoupon) {
-      result = error("该券不存在!");
-    }
-    if (userCoupon.getStatus() == UserCouponStatusEnum.USED) {
-      result = error("该券已使用!");
+    @Autowired
+    private IChannelCouponVerifyLogService channelCouponVerifyLogService;
+
+    @Autowired
+    private MapperFacade mapperFacade;
+
+    @Autowired
+    private ICouponChannelService couponChannelService;
+
+    @Autowired
+    private ICouponService couponService;
+
+    /**
+     * 优惠券查询
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "coupon/query")
+    public AjaxResult query(@RequestBody JSONObject param) {
+        String verifyCode = param.getString("verifyCode");
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        UserCoupon userCoupon = userCouponService.getOne(new LambdaQueryWrapper<UserCoupon>()
+            .eq(UserCoupon::getVerifyCode, verifyCode));
+        if (null == userCoupon) {
+            return error("券码非法");
+        }
+        AjaxResult result = checkCoupon(verifyCode, channelId, userCoupon);
+        if (null != result) {
+            return result;
+        }
+        List<UserCouponVO> userCouponVOList = userCouponService.listUserCouponVO(
+            new QueryWrapper<UserCoupon>()
+                .eq("t1.verify_code", verifyCode));
+
+        return AjaxResult.success(userCouponVOList.get(0));
     }
-    if (userCoupon.getValidEnd().before(new Date())) {
-      result = error("该券已过期!");
+
+    private AjaxResult checkCoupon(String verifyCode, Long channelId, UserCoupon userCoupon) {
+        AjaxResult result = null;
+
+        if (StringUtils.isBlank(verifyCode)) {
+            result = error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        if (null == userCoupon) {
+            result = error("该券不存在!");
+        }
+        if (userCoupon.getStatus() == UserCouponStatusEnum.USED) {
+            result = error("该券已使用!");
+        }
+        if (userCoupon.getValidEnd().before(new Date())) {
+            result = error("该券已过期!");
+        }
+        UserCouponChannel couponChannel = userCouponChannelService.getOne(
+            new LambdaQueryWrapper<UserCouponChannel>()
+                .eq(UserCouponChannel::getUserCouponId, userCoupon.getId())
+                .eq(UserCouponChannel::getChannelId, channelId));
+        if (null == couponChannel) {
+            Coupon coupon = couponService.getById(userCoupon.getCouponId());
+            if (CouponTypeEnum.SITE_CONSUME.equals(coupon.getType())) {
+                if (CouponUseAreaEnum.PRE_SCOPE.equals(coupon.getUseArea())) {
+                    int count = couponChannelService.count(new LambdaQueryWrapper<CouponChannel>()
+                        .eq(CouponChannel::getCouponId, userCoupon.getCouponId())
+                        .eq(CouponChannel::getChannelId, channelId));
+                    if (count <= 0) {
+                        result = error("无权核销该券");
+                    }
+                }
+            }
+        }
+        return result;
     }
-    UserCouponChannel couponChannel = userCouponChannelService.getOne(
-        new LambdaQueryWrapper<UserCouponChannel>()
-            .eq(UserCouponChannel::getUserCouponId, userCoupon.getId())
-            .eq(UserCouponChannel::getChannelId, channelId));
-    if (null == couponChannel) {
-      result = error("无权核销该券");
+
+    /**
+     * 优惠券核销
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "coupon/verify")
+    public AjaxResult verify(@RequestBody JSONObject param) {
+        String verifyCode = param.getString("verifyCode");
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        UserCoupon userCoupon = userCouponService.getOne(new LambdaQueryWrapper<UserCoupon>()
+            .eq(UserCoupon::getVerifyCode, verifyCode));
+        if (null == userCoupon) {
+            return error("券码非法");
+        }
+        AjaxResult result = checkCoupon(verifyCode, channelId, userCoupon);
+        if (null != result) {
+            return result;
+        }
+        channelCouponVerifyLogService.verify(channelId, userCoupon);
+        return AjaxResult.success("核销成功");
     }
-    return result;
-  }
-
-  /**
-   * 优惠券核销
-   *
-   * @param
-   * @return
-   */
-  @PostMapping(value = "coupon/verify")
-  public AjaxResult verify(@RequestBody JSONObject param) {
-    String verifyCode = param.getString("verifyCode");
-    Long channelId = SecurityUtils.getLoginUser().getChannelId();
-    UserCoupon userCoupon = userCouponService.getOne(new LambdaQueryWrapper<UserCoupon>()
-        .eq(UserCoupon::getVerifyCode, verifyCode));
-    if (null == userCoupon) {
-      return error("券码非法");
+
+    /**
+     * 获取我的核销记录
+     *
+     * @return
+     */
+    @PostMapping("coupon/verify/log/list")
+    public TableDataInfo list(@RequestBody JSONObject jsonObject) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        startPage();
+        List<ChannelCouponVerifyLog> verifyLogList = channelCouponVerifyLogService.list(
+            new LambdaQueryWrapper<ChannelCouponVerifyLog>()
+                .eq(ChannelCouponVerifyLog::getChannelId, channelId)
+                .orderByDesc(ChannelCouponVerifyLog::getVerifyTime));
+        return getDataTable(verifyLogList);
     }
-    AjaxResult result = checkCoupon(verifyCode, channelId, userCoupon);
-    if (null != result) {
-      return result;
+
+    /**
+     * 优惠券核销记录详情
+     *
+     * @param
+     * @return
+     */
+    @PostMapping(value = "coupon/verify/log/detail")
+    public AjaxResult detail(@RequestBody JSONObject param) {
+        Long logId = param.getLong("logId");
+        if (null == logId || 0 == logId) {
+            return error(ErrorCodeEnum.ERROR_CODE_1001);
+        }
+        ChannelCouponVerifyLog verifyLog = channelCouponVerifyLogService.getById(logId);
+        return AjaxResult.success(verifyLog);
     }
-    channelCouponVerifyLogService.verify(channelId, userCoupon);
-    return AjaxResult.success("核销成功");
-  }
-
-  /**
-   * 获取我的核销记录
-   *
-   * @return
-   */
-  @PostMapping("coupon/verify/log/list")
-  public TableDataInfo list(@RequestBody JSONObject jsonObject) {
-    Long channelId = SecurityUtils.getLoginUser().getChannelId();
-    startPage();
-    List<ChannelCouponVerifyLog> verifyLogList = channelCouponVerifyLogService.list(
-        new LambdaQueryWrapper<ChannelCouponVerifyLog>()
-            .eq(ChannelCouponVerifyLog::getChannelId, channelId)
-            .orderByDesc(ChannelCouponVerifyLog::getVerifyTime));
-    return getDataTable(verifyLogList);
-  }
-
-	/**
-	 * 优惠券核销记录详情
-	 *
-	 * @param
-	 * @return
-	 */
-	@PostMapping(value = "coupon/verify/log/detail")
-	public AjaxResult detail(@RequestBody JSONObject param) {
-		Long logId = param.getLong("logId");
-		if (null == logId || 0 == logId) {
-			return error(ErrorCodeEnum.ERROR_CODE_1001);
-		}
-		ChannelCouponVerifyLog verifyLog = channelCouponVerifyLogService.getById(logId);
-		return AjaxResult.success(verifyLog);
-	}
 
 }

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

@@ -375,6 +375,7 @@ public class UserController extends BaseApiController {
         AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(wxLoginParams.getAppSource());
         if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
             appId = AppSourceEnum.MSDQ.getAppId();
+            appSecret = AppSourceEnum.MSDQ.getAppSecret();
         }
 
 

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

@@ -4,9 +4,15 @@ 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.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponChannel;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.service.ICouponChannelService;
+import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.*;
@@ -16,6 +22,7 @@ import com.qs.mp.user.domain.UserCoin;
 import com.qs.mp.user.domain.UserCoinLog;
 import com.qs.mp.user.domain.UserCoupon;
 import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.param.CouponChannelQueryParam;
 import com.qs.mp.user.domain.param.UserPrizeStorageQueryParam;
 import com.qs.mp.user.domain.param.UserPrizeStorageUpdateParam;
 import com.qs.mp.user.domain.vo.UserCouponVO;
@@ -36,6 +43,7 @@ import java.util.Map;
 
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import java.util.stream.Collectors;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.BeanUtils;
@@ -55,176 +63,249 @@ import org.springframework.web.bind.annotation.RestController;
 public class UserMineController extends BaseApiController {
 
 
-  @Autowired
-  private IUserTicketOrderItemService userTicketOrderItemService;
+    @Autowired
+    private IUserTicketOrderItemService userTicketOrderItemService;
 
-  @Autowired
-  private IUserPrizeStorageService userPrizeStorageService;
+    @Autowired
+    private IUserPrizeStorageService userPrizeStorageService;
 
-  @Autowired
-  private IUserCoinService userCoinService;
+    @Autowired
+    private IUserCoinService userCoinService;
 
-  @Autowired
-  private IUserCouponService userCouponService;
+    @Autowired
+    private IUserCouponService userCouponService;
 
-  @Autowired
-  private IUserCoinLogService userCoinLogService;
+    @Autowired
+    private IUserCoinLogService userCoinLogService;
 
-  @Autowired
-  private MapperFacade mapperFacade;
+    @Autowired
+    private MapperFacade mapperFacade;
 
-  @Autowired
-  private IGoodsService goodsService;
+    @Autowired
+    private IGoodsService goodsService;
 
-  /**
-   * 我的票包
-   */
-  @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());
+    @Autowired
+    private ICouponChannelService couponChannelService;
 
+    @Autowired
+    private ICouponService couponService;
 
-    // 已兑奖的盲豆奖品需要拼接数量
-    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() + "个");
+    @Autowired
+    private IChannelService channelService;
+
+    /**
+     * 我的票包
+     */
+    @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);
     }
-    return getDataTable(ticketListVOS);
-  }
-
-  /**
-   * 我的优惠券
-   */
-  @PostMapping("/coupon/list")
-  @ApiOperation(value = "我的优惠券列表", notes = "获取我的优惠券列表")
-  public TableDataInfo listCoupon(@RequestBody UserCoupon param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    startPage();
-    List<UserCouponVO> userCouponVOList = userCouponService.listCoupon(userId, param.getStatus());
-    return getDataTable(userCouponVOList);
-  }
-
-  /**
-   * 优惠券详情
-   */
-  @PostMapping("/coupon/detail")
-  @ApiOperation(value = "优惠券详情", notes = "获取我的优惠券详情")
-  public AjaxResult getCouponInfo(@RequestBody UserCoupon param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    List<UserCouponVO> userCouponVOList = userCouponService.listUserCouponVO(new QueryWrapper<UserCoupon>()
-        .eq("t1.id", param.getId())
-        .eq("t1.user_id", userId));
-    if (!CollectionUtils.isEmpty(userCouponVOList)) {
-      return AjaxResult.success(userCouponVOList.get(0));
+
+    /**
+     * 我的优惠券
+     */
+    @PostMapping("/coupon/list")
+    @ApiOperation(value = "我的优惠券列表", notes = "获取我的优惠券列表")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
+    )
+    public TableDataInfo listCoupon(@RequestBody UserCoupon param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        startPage();
+        List<UserCouponVO> userCouponVOList = userCouponService.listCoupon(userId, param.getStatus());
+        return getDataTable(userCouponVOList);
     }
-    return AjaxResult.error("优惠券不存在");
-  }
-
-  /**
-   * 我的盲豆
-   */
-  @PostMapping("/coin/log/list")
-  @ApiOperation(value = "我的盲豆记录", notes = "获取我的盲豆记录")
-  public TableDataInfo listCoinLog(@RequestBody JSONObject param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    startPage();
-    List<UserCoinLog> userCoinLogList = userCoinLogService.list(
-        new LambdaQueryWrapper<UserCoinLog>()
-            .eq(UserCoinLog::getUserId, userId).orderByDesc(UserCoinLog::getBizTime));
-    return getDataTable(userCoinLogList);
-  }
-
-  /**
-   * 我的实物奖品库
-   */
-  @PostMapping("/prize/list")
-  @ApiOperation(value = "我的实物奖品库", notes = "获取我的实物奖品库")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "成功", response = UserPrizeStorageVO.class)
-  )
-  public TableDataInfo listPrize(@RequestBody JSONObject param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    startPage();
-    QueryWrapper<UserPrizeStorage> queryWrapper = new QueryWrapper<>();
-    queryWrapper.eq("t1.user_id", userId);
-    queryWrapper.eq("t1.status", PrizeStorageStatusEnum.NOT_DISTRIBUTED);
-    queryWrapper.orderByDesc("t1.created_time");
-    List<UserPrizeStorageVO> userPrizeStorageVOList = userPrizeStorageService.listByQueryWrapper(queryWrapper);
-    return getDataTable(userPrizeStorageVOList);
-  }
-
-
-  @PostMapping("/prize/saveSku")
-  @ApiOperation("设置实物奖品的SKU")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "success")
-  )
-  public AjaxResult saveSku(@Validated @RequestBody UserPrizeStorageUpdateParam userPrizeStorageUpdateParam) {
-    UserPrizeStorage userPrizeStorage = userPrizeStorageService.getById(userPrizeStorageUpdateParam.getStorageId());
-    if (userPrizeStorage == null) {
-      return AjaxResult.error("奖品存储ID不正确");
+
+    /**
+     * 优惠券详情
+     */
+    @PostMapping("/coupon/detail")
+    @ApiOperation(value = "优惠券详情", notes = "获取我的优惠券详情")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = UserCouponVO.class)
+    )
+    public AjaxResult getCouponInfo(@RequestBody UserCoupon param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        List<UserCouponVO> userCouponVOList = userCouponService.listUserCouponVO(new QueryWrapper<UserCoupon>()
+            .eq("t1.id", param.getId())
+            .eq("t1.user_id", userId));
+        if (!CollectionUtils.isEmpty(userCouponVOList)) {
+            UserCouponVO userCouponVO = userCouponVOList.get(0);
+
+            Coupon coupon = couponService.getById(userCouponVO.getCouponId());
+            if (CouponTypeEnum.SITE_CONSUME.equals(coupon.getType())) {
+                if (CouponUseAreaEnum.COMMON.equals(coupon.getUseArea())) {
+                    // 所有门店
+                    int channelTotal = channelService.count(new LambdaQueryWrapper<Channel>().eq(Channel::getLevel, 0));
+                    userCouponVO.setChannelTotal(channelTotal);
+
+                }else if (CouponUseAreaEnum.PRE_SCOPE.equals(coupon.getUseArea())) {
+                    // 指定门店
+                    int channelTotal = couponChannelService.count(new LambdaQueryWrapper<CouponChannel>()
+                        .eq(CouponChannel::getCouponId, userCouponVO.getCouponId()));
+                    userCouponVO.setChannelTotal(channelTotal);
+                }
+            }
+            return AjaxResult.success(userCouponVO);
+        }
+        return AjaxResult.error("优惠券不存在");
     }
 
-    if (PrizeStorageInTypeEnum.COIN_EXCHANGE.equals(userPrizeStorage.getInType())) {
-      return AjaxResult.error("当前来源不支持选择规格");
+
+    @PostMapping("/coupon/channel/list")
+    @ApiOperation("优惠券关联门店列表")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = Channel.class)
+    )
+    public TableDataInfo listCouponChannel(@RequestBody CouponChannelQueryParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        if (param.getCouponId() == null) {
+            return getErrorDataTable("优惠券id不能为空");
+        }
+
+        Coupon coupon = couponService.getById(param.getCouponId());
+        if (coupon == null) {
+            return getErrorDataTable("优惠券信息不存在");
+        }
+
+        List<Channel> channelList = new ArrayList<>();
+        LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(null != param.getProvinceId(), Channel::getProvinceId, param.getProvinceId());
+        queryWrapper.eq(null != param.getCityId(), Channel::getCityId, param.getCityId());
+        queryWrapper.eq(null != param.getAreaId(), Channel::getAreaId, param.getAreaId());
+
+        if (CouponUseAreaEnum.PRE_SCOPE.equals(coupon.getUseArea())) {
+            List<CouponChannel> couponChannelList = couponChannelService.list(
+                new LambdaQueryWrapper<CouponChannel>().eq(CouponChannel::getCouponId, coupon.getCouponId()));
+            if (CollectionUtils.isEmpty(couponChannelList)) {
+                return getDataTable(channelList);
+            }
+            List<Long> channelIds = couponChannelList.stream().map(CouponChannel::getChannelId)
+                .collect(Collectors.toList());
+            queryWrapper.in(Channel::getChannelId, channelIds);
+        }
+        startPage();
+        channelList = channelService.list(queryWrapper);
+        return getDataTable(channelList);
     }
 
-    if (userPrizeStorage.getSkuId() != null) {
-      return AjaxResult.error("非法调用,已存在规格");
+
+    /**
+     * 我的盲豆
+     */
+    @PostMapping("/coin/log/list")
+    @ApiOperation(value = "我的盲豆记录", notes = "获取我的盲豆记录")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = UserCoinLog.class)
+    )
+    public TableDataInfo listCoinLog(@RequestBody JSONObject param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        startPage();
+        List<UserCoinLog> userCoinLogList = userCoinLogService.list(
+            new LambdaQueryWrapper<UserCoinLog>()
+                .eq(UserCoinLog::getUserId, userId).orderByDesc(UserCoinLog::getBizTime));
+        return getDataTable(userCoinLogList);
     }
 
-    // 保存商品的sku信息
-    boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
+    /**
+     * 我的实物奖品库
+     */
+    @PostMapping("/prize/list")
+    @ApiOperation(value = "我的实物奖品库", notes = "获取我的实物奖品库")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = UserPrizeStorageVO.class)
+    )
+    public TableDataInfo listPrize(@RequestBody JSONObject param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        startPage();
+        QueryWrapper<UserPrizeStorage> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.user_id", userId);
+        queryWrapper.eq("t1.status", PrizeStorageStatusEnum.NOT_DISTRIBUTED);
+        queryWrapper.orderByDesc("t1.created_time");
+        List<UserPrizeStorageVO> userPrizeStorageVOList = userPrizeStorageService.listByQueryWrapper(queryWrapper);
+        return getDataTable(userPrizeStorageVOList);
+    }
+
+
+    @PostMapping("/prize/saveSku")
+    @ApiOperation("设置实物奖品的SKU")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "success")
+    )
+    public AjaxResult saveSku(@Validated @RequestBody UserPrizeStorageUpdateParam userPrizeStorageUpdateParam) {
+        UserPrizeStorage userPrizeStorage = userPrizeStorageService.getById(userPrizeStorageUpdateParam.getStorageId());
+        if (userPrizeStorage == null) {
+            return AjaxResult.error("奖品存储ID不正确");
+        }
+
+        if (PrizeStorageInTypeEnum.COIN_EXCHANGE.equals(userPrizeStorage.getInType())) {
+            return AjaxResult.error("当前来源不支持选择规格");
+        }
+
+        if (userPrizeStorage.getSkuId() != null) {
+            return AjaxResult.error("非法调用,已存在规格");
+        }
+
+        // 保存商品的sku信息
+        boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
             .set(UserPrizeStorage::getSkuId, userPrizeStorageUpdateParam.getSkuId())
             .set(UserPrizeStorage::getProperties, userPrizeStorageUpdateParam.getProperties())
             .eq(UserPrizeStorage::getStorageId, userPrizeStorageUpdateParam.getStorageId()));
-    if (!rtn) {
-      return AjaxResult.error("保存规格失败,请重试");
+        if (!rtn) {
+            return AjaxResult.error("保存规格失败,请重试");
+        }
+
+        return AjaxResult.success();
     }
 
-    return AjaxResult.success();
-  }
-
-
-  /**
-   * 我的
-   */
-  @PostMapping("/init")
-  @ApiOperation(value = "查看我的", notes = "查看我的")
-  public AjaxResult getInfo(@RequestBody JSONObject param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    Map<String, Object> storageMap = userPrizeStorageService.getMap(
-        new QueryWrapper<UserPrizeStorage>()
-            .select("count(IFNULL(goods_num,0)) as total")
-            .eq("user_id", userId).eq("status", PrizeStorageStatusEnum.NOT_DISTRIBUTED));
-    int couponCnt = userCouponService.count(new LambdaQueryWrapper<UserCoupon>()
+
+    /**
+     * 我的
+     */
+    @PostMapping("/init")
+    @ApiOperation(value = "查看我的", notes = "查看我的")
+    public AjaxResult getInfo(@RequestBody JSONObject param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        Map<String, Object> storageMap = userPrizeStorageService.getMap(
+            new QueryWrapper<UserPrizeStorage>()
+                .select("count(IFNULL(goods_num,0)) as total")
+                .eq("user_id", userId).eq("status", PrizeStorageStatusEnum.NOT_DISTRIBUTED));
+        int couponCnt = userCouponService.count(new LambdaQueryWrapper<UserCoupon>()
             .eq(UserCoupon::getUserId, userId)
-        .eq(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
-        .le(UserCoupon::getValidStart, DateUtils.getToday())
-        .ge(UserCoupon::getValidEnd, DateUtils.getToday()));
-    JSONObject result = new JSONObject();
-    result.put("prizeNum", Integer.valueOf(String.valueOf(null != storageMap ? storageMap.get("total") : 0)) + couponCnt);
-
-    int ticketNum = userTicketOrderItemService.countMyTicket(userId, null);
-    result.put("ticketNum", ticketNum);
-
-    UserCoin userCoin = userCoinService.getById(userId);
-    result.put("coinNum", null != userCoin ? userCoin.getCoin() : 0);
-    return AjaxResult.success(result);
-  }
+            .eq(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
+            .le(UserCoupon::getValidStart, DateUtils.getToday())
+            .ge(UserCoupon::getValidEnd, DateUtils.getToday()));
+        JSONObject result = new JSONObject();
+        result.put("prizeNum",
+            Integer.valueOf(String.valueOf(null != storageMap ? storageMap.get("total") : 0)) + couponCnt);
+
+        int ticketNum = userTicketOrderItemService.countMyTicket(userId, null);
+        result.put("ticketNum", ticketNum);
+
+        UserCoin userCoin = userCoinService.getById(userId);
+        result.put("coinNum", null != userCoin ? userCoin.getCoin() : 0);
+        return AjaxResult.success(result);
+    }
 
 }

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

@@ -62,98 +62,105 @@ import javax.ws.rs.POST;
 public class UserTicketController extends BaseApiController {
 
 
-  @Autowired
-  private ITicketBoxService ticketBoxService;
+    @Autowired
+    private ITicketBoxService ticketBoxService;
 
-  @Autowired
-  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+    @Autowired
+    private ITicketAwardsPrizeService ticketAwardsPrizeService;
 
-  @Autowired
-  private ITicketService ticketService;
+    @Autowired
+    private ITicketService ticketService;
 
-  @Autowired
-  private IUserTicketOrderItemService userTicketOrderItemService;
+    @Autowired
+    private IUserTicketOrderItemService userTicketOrderItemService;
 
-  @Autowired
-  private IUserHitPrizeService userHitPrizeService;
+    @Autowired
+    private IUserHitPrizeService userHitPrizeService;
 
-  @Autowired
-  private ITicketPackageService ticketPackageService;
+    @Autowired
+    private ITicketPackageService ticketPackageService;
 
-  @Autowired
-  private MapperFacade mapperFacade;
+    @Autowired
+    private MapperFacade mapperFacade;
 
 
-  @Autowired
-  private HostHolder hostHolder;
+    @Autowired
+    private HostHolder hostHolder;
 
-  @Autowired
-  private IUserExchangeOrderService userExchangeOrderService;
+    @Autowired
+    private IUserExchangeOrderService userExchangeOrderService;
 
-  @Autowired
-  private ITicketAwardsService ticketAwardsService;
+    @Autowired
+    private ITicketAwardsService ticketAwardsService;
 
-  @Autowired
-  private DistributedLocker distributedLocker;
+    @Autowired
+    private DistributedLocker distributedLocker;
 
-  @Autowired
-  private IChannelService channelService;
+    @Autowired
+    private IChannelService channelService;
 
-  @PostMapping("/isJump")
-  @ApiOperation("是否跳转")
-  public AjaxResult isJump() {
-    return AjaxResult.success(true);
-  }
+    @PostMapping("/isJump")
+    @ApiOperation("是否跳转")
+    public AjaxResult isJump() {
+        return AjaxResult.success(true);
+    }
 
-  @PostMapping("/mall/ticket/goods/list")
-  @ApiOperation("盲票关联商品列表")
-  @ApiResponses(
-      @ApiResponse(code = 200, message = "成功", response = TicketBoxGoodsVO.class)
-  )
-  public TableDataInfo ticketGoodsList(@RequestBody TicketBoxGoodsQueryParam param) {
-    startPage();
-    QueryWrapper<TicketBoxGoodsListVO> queryWrapper = new QueryWrapper<>();
-    queryWrapper.eq("t1.is_deleted",0);
-    queryWrapper.eq("t1.type",param.getType());
+    @PostMapping("/mall/ticket/goods/list")
+    @ApiOperation("盲票关联商品列表")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = TicketBoxGoodsVO.class)
+    )
+    public TableDataInfo ticketGoodsList(@RequestBody TicketBoxGoodsQueryParam param) {
+        startPage();
+        QueryWrapper<TicketBoxGoodsListVO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.is_deleted", 0);
+        queryWrapper.eq("t1.type", param.getType());
+
+        if (param.getCategoryId() != null && param.getCategoryId() != 0) {
+            queryWrapper.eq("t1.category_id", param.getCategoryId());
+        }
 
-    if (param.getCategoryId() != null && param.getCategoryId() != 0) {
-      queryWrapper.eq("t1.category_id", param.getCategoryId());
-    }
+        if (CollectionUtils.isNotEmpty(param.getBoxIds())) {
+            queryWrapper.in("t1.box_id", param.getBoxIds());
+        }
 
-    if (CollectionUtils.isNotEmpty(param.getBoxIds())) {
-      queryWrapper.in("t1.box_id", param.getBoxIds());
+        queryWrapper.eq("t1.status", TicketBoxStatusEnum.PUT_ON);
+        queryWrapper.eq("t2.is_deleted", 0);
+        queryWrapper.orderByDesc("t1.sort_weight");
+        if (param.getSalePriceSort() != null && param.getSalePriceSort() != 0) {
+            if (param.getSalePriceSort() == 1) {
+                queryWrapper.orderByAsc("t1.sale_price");
+            } else {
+                queryWrapper.orderByDesc("t1.sale_price");
+            }
+        }
+        List<TicketBoxGoodsListVO> list = ticketBoxService.listTicketGoodsByQueryWrapper(queryWrapper);
+        return getDataTable(list);
     }
 
-    queryWrapper.eq("t1.status", TicketBoxStatusEnum.PUT_ON);
-    queryWrapper.eq("t2.is_deleted", 0);
-    queryWrapper.orderByDesc("t1.sort_weight");
-    List<TicketBoxGoodsListVO> list = ticketBoxService.listTicketGoodsByQueryWrapper(queryWrapper);
-    return getDataTable(list);
-  }
-
-
-  /**
-   * 盲票列表
-   */
-  @PostMapping("/mall/ticket/list")
-  @ApiOperation(value = "盲票组列表", notes = "获取所有盲票信息")
-  public TableDataInfo list(@RequestBody TicketBoxParam param) {
-
-    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())
-            .in(CollectionUtils.isNotEmpty(param.getBoxIds()), TicketBox::getBoxId, param.getBoxIds())
-            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
-            .orderByDesc(TicketBox::getSortWeight)
-    );
-    List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes,
-        TicketBoxListVO.class);
-    TableDataInfo rspData = getDataTable(ticketBoxes);
-    rspData.setRows(ticketBoxListVOList);
-    return rspData;
-  }
+
+    /**
+     * 盲票列表
+     */
+    @PostMapping("/mall/ticket/list")
+    @ApiOperation(value = "盲票组列表", notes = "获取所有盲票信息")
+    public TableDataInfo list(@RequestBody TicketBoxParam param) {
+
+        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())
+                .in(CollectionUtils.isNotEmpty(param.getBoxIds()), TicketBox::getBoxId, param.getBoxIds())
+                .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+                .orderByDesc(TicketBox::getSortWeight)
+        );
+        List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes,
+            TicketBoxListVO.class);
+        TableDataInfo rspData = getDataTable(ticketBoxes);
+        rspData.setRows(ticketBoxListVOList);
+        return rspData;
+    }
 
 
     /**
@@ -163,532 +170,543 @@ public class UserTicketController extends BaseApiController {
     @PostMapping("/mall/ticket/detail")
     @ApiOperation(value = "查看盲票详情", notes = "根据盲票组ID,获取盲票信息")
     @ApiResponses(
-            @ApiResponse(code = 200, message = "成功", response = TicketBoxVO.class)
+        @ApiResponse(code = 200, message = "成功", response = TicketBoxVO.class)
     )
     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);
-
-
-      // 设置经销商佣金比
-      if (hostHolder.getUser() != null) {
-        Long channelId = hostHolder.getUser().getChannelId();
-        if (channelId != null && channelId > 0) {
-          Channel channel = channelService.getById(channelId);
-          if (channel != null) {
-            ticketBoxVO.setChannelCommRate(channel.getCommRate());
-          }
-        }
-      }
-
-
-
-      // 设置奖项标签信息
-      QueryWrapper<TicketAwards> queryWrapper = new QueryWrapper<>();
-      queryWrapper.eq("box_id",ticketBox.getBoxId());
-      queryWrapper.isNotNull("awards_label");
-      queryWrapper.ne("awards_label", "");
-      queryWrapper.groupBy("awards_label");
-      StringBuilder sortField = new StringBuilder("FIELD(awards_label,'");
-      int index = 0;
-      for (AwardsLabelEnum awardsLabelEnum : AwardsLabelEnum.values()) {
-        index++;
-        if (index == AwardsLabelEnum.values().length) {
-          sortField.append(awardsLabelEnum.getValue()).append("'");
-        }else {
-          sortField.append(awardsLabelEnum.getValue()).append("','");
-        }
-      }
-      sortField.append(")");
-      queryWrapper.orderByAsc(sortField.toString());
-      List<TicketAwardsLabelVO> ticketAwardsLabelVOS = ticketAwardsService.groupSumQuantityByQueryWrapper(queryWrapper);
-      if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
-        for (TicketAwardsLabelVO ticketAwardsLabelVO : ticketAwardsLabelVOS) {
-          AwardsLabelEnum awardsLabelEnum = AwardsLabelEnum.getByValue(ticketAwardsLabelVO.getLabelTitle());
-          if (Objects.isNull(awardsLabelEnum)) {
-            continue;
-          }
-          ticketAwardsLabelVO.setPicUrl(awardsLabelEnum.getPicUrl());
-          Integer quantity = ticketBox.getQuantity();
-          int num = ticketAwardsLabelVO.getQuantity();
-          ticketAwardsLabelVO.setHitRate(BigDecimal.valueOf(num).divide(BigDecimal.valueOf(quantity), 3, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)));
-        }
-      }
-
-    if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
-      // 精度问题处理
-      int maxIndex = 0;
-      BigDecimal maxHitRate = BigDecimal.valueOf(100);
-      for (int i = 0; i < ticketAwardsLabelVOS.size(); i++) {
-        TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(i);
-        if (BigDecimal.ZERO.equals(ticketAwardsLabelVO.getHitRate())) {
-          ticketAwardsLabelVO.setHitRate(BigDecimal.valueOf(0.1));
-        }
-        if (ticketAwardsLabelVO.getHitRate().compareTo(ticketAwardsLabelVOS.get(maxIndex).getHitRate()) > 0) {
-          maxIndex = i;
-        }
-        maxHitRate = maxHitRate.subtract(ticketAwardsLabelVO.getHitRate());
-      }
-      if (maxHitRate.compareTo(BigDecimal.ZERO) > 0) {
-        TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
-        ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().subtract(maxHitRate));
-      } else {
-        TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
-        ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().add(maxHitRate));
-      }
-    }
-
-    ticketBoxVO.setTicketAwardsLabelList(ticketAwardsLabelVOS);
-
-    List<TicketAwardsPrizeVO> ticketAwardsPrizeVOS = ticketAwardsPrizeService.listPrizeVO(ticketBox.getBoxId());
-    ticketBoxVO.setPrizeList(ticketAwardsPrizeVOS);
-    return AjaxResult.success(ticketBoxVO);
-  }
-
-
-  /**
-   * 查看盲票详情
-   */
-  @PostMapping("/mall/ticket/detail/new")
-  @ApiOperation(value = "查看盲票详情(新)", notes = "根据盲票组ID,获取盲票信息")
-  @ApiResponses(
-      @ApiResponse(code = 200, message = "成功", response = TicketBoxVO.class)
-  )
-  public AjaxResult getInfoNew(@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);
-
-
-    // 设置经销商佣金比
-    if (hostHolder.getUser() != null) {
-      Long channelId = hostHolder.getUser().getChannelId();
-      if (channelId != null && channelId > 0) {
-        Channel channel = channelService.getById(channelId);
-        if (channel != null) {
-          ticketBoxVO.setChannelCommRate(channel.getCommRate());
+        if (StringUtils.isBlank(param.getBoxId())) {
+            return AjaxResult.error("参数异常,盲票组ID缺失");
+        }
+        TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+        TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+
+        // 设置经销商佣金比
+        if (hostHolder.getUser() != null) {
+            Long channelId = hostHolder.getUser().getChannelId();
+            if (channelId != null && channelId > 0) {
+                Channel channel = channelService.getById(channelId);
+                if (channel != null) {
+                    ticketBoxVO.setChannelCommRate(channel.getCommRate());
+                }
+            }
         }
-      }
-    }
 
+        // 设置奖项标签信息
+        QueryWrapper<TicketAwards> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("box_id", ticketBox.getBoxId());
+        queryWrapper.isNotNull("awards_label");
+        queryWrapper.ne("awards_label", "");
+        queryWrapper.groupBy("awards_label");
+        StringBuilder sortField = new StringBuilder("FIELD(awards_label,'");
+        int index = 0;
+        for (AwardsLabelEnum awardsLabelEnum : AwardsLabelEnum.values()) {
+            index++;
+            if (index == AwardsLabelEnum.values().length) {
+                sortField.append(awardsLabelEnum.getValue()).append("'");
+            } else {
+                sortField.append(awardsLabelEnum.getValue()).append("','");
+            }
+        }
+        sortField.append(")");
+        queryWrapper.orderByAsc(sortField.toString());
+        List<TicketAwardsLabelVO> ticketAwardsLabelVOS = ticketAwardsService.groupSumQuantityByQueryWrapper(
+            queryWrapper);
+        if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
+            for (TicketAwardsLabelVO ticketAwardsLabelVO : ticketAwardsLabelVOS) {
+                AwardsLabelEnum awardsLabelEnum = AwardsLabelEnum.getByValue(ticketAwardsLabelVO.getLabelTitle());
+                if (Objects.isNull(awardsLabelEnum)) {
+                    continue;
+                }
+                ticketAwardsLabelVO.setPicUrl(awardsLabelEnum.getPicUrl());
+                Integer quantity = ticketBox.getQuantity();
+                int num = ticketAwardsLabelVO.getQuantity();
+                ticketAwardsLabelVO.setHitRate(
+                    BigDecimal.valueOf(num).divide(BigDecimal.valueOf(quantity), 3, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100)));
+            }
+        }
 
+        if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
+            // 精度问题处理
+            int maxIndex = 0;
+            BigDecimal maxHitRate = BigDecimal.valueOf(100);
+            for (int i = 0; i < ticketAwardsLabelVOS.size(); i++) {
+                TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(i);
+                if (BigDecimal.ZERO.equals(ticketAwardsLabelVO.getHitRate())) {
+                    ticketAwardsLabelVO.setHitRate(BigDecimal.valueOf(0.1));
+                }
+                if (ticketAwardsLabelVO.getHitRate().compareTo(ticketAwardsLabelVOS.get(maxIndex).getHitRate()) > 0) {
+                    maxIndex = i;
+                }
+                maxHitRate = maxHitRate.subtract(ticketAwardsLabelVO.getHitRate());
+            }
+            if (maxHitRate.compareTo(BigDecimal.ZERO) > 0) {
+                TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
+                ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().subtract(maxHitRate));
+            } else {
+                TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
+                ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().add(maxHitRate));
+            }
+        }
 
-    // 设置奖项标签信息
-    QueryWrapper<TicketAwards> queryWrapper = new QueryWrapper<>();
-    queryWrapper.eq("box_id",ticketBox.getBoxId());
-    queryWrapper.isNotNull("awards_label");
-    queryWrapper.ne("awards_label", "");
-    queryWrapper.groupBy("awards_label");
-    StringBuilder sortField = new StringBuilder("FIELD(awards_label,'");
-    int index = 0;
-    for (AwardsLabelEnum awardsLabelEnum : AwardsLabelEnum.values()) {
-      index++;
-      if (index == AwardsLabelEnum.values().length) {
-        sortField.append(awardsLabelEnum.getValue()).append("'");
-      }else {
-        sortField.append(awardsLabelEnum.getValue()).append("','");
-      }
-    }
-    sortField.append(")");
-    queryWrapper.orderByAsc(sortField.toString());
-    List<TicketAwardsLabelVO> ticketAwardsLabelVOS = ticketAwardsService.groupSumQuantityByQueryWrapper(queryWrapper);
-    if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
-      for (TicketAwardsLabelVO ticketAwardsLabelVO : ticketAwardsLabelVOS) {
-        AwardsLabelEnum awardsLabelEnum = AwardsLabelEnum.getByValue(ticketAwardsLabelVO.getLabelTitle());
-        if (Objects.isNull(awardsLabelEnum)) {
-          continue;
-        }
-        ticketAwardsLabelVO.setPicUrl(awardsLabelEnum.getPicUrl());
-        Integer quantity = ticketBox.getQuantity();
-        int num = ticketAwardsLabelVO.getQuantity();
-        ticketAwardsLabelVO.setHitRate(BigDecimal.valueOf(num).divide(BigDecimal.valueOf(quantity), 3, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)));
-      }
-    }
+        ticketBoxVO.setTicketAwardsLabelList(ticketAwardsLabelVOS);
 
-    if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
-      // 精度问题处理
-      int maxIndex = 0;
-      BigDecimal maxHitRate = BigDecimal.valueOf(100);
-      for (int i = 0; i < ticketAwardsLabelVOS.size(); i++) {
-        TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(i);
-        if (BigDecimal.ZERO.equals(ticketAwardsLabelVO.getHitRate())) {
-          ticketAwardsLabelVO.setHitRate(BigDecimal.valueOf(0.1));
-        }
-        if (ticketAwardsLabelVO.getHitRate().compareTo(ticketAwardsLabelVOS.get(maxIndex).getHitRate()) > 0) {
-          maxIndex = i;
-        }
-        maxHitRate = maxHitRate.subtract(ticketAwardsLabelVO.getHitRate());
-      }
-      if (maxHitRate.compareTo(BigDecimal.ZERO) > 0) {
-        TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
-        ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().subtract(maxHitRate));
-      } else {
-        TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
-        ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().add(maxHitRate));
-      }
+        List<TicketAwardsPrizeVO> ticketAwardsPrizeVOS = ticketAwardsPrizeService.listPrizeVO(ticketBox.getBoxId());
+        ticketBoxVO.setPrizeList(ticketAwardsPrizeVOS);
+        return AjaxResult.success(ticketBoxVO);
     }
 
-    ticketBoxVO.setTicketAwardsLabelList(ticketAwardsLabelVOS);
 
+    /**
+     * 查看盲票详情
+     */
+    @PostMapping("/mall/ticket/detail/new")
+    @ApiOperation(value = "查看盲票详情(新)", notes = "根据盲票组ID,获取盲票信息")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "成功", response = TicketBoxVO.class)
+    )
+    public AjaxResult getInfoNew(@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);
+
+        // 设置经销商佣金比
+        if (hostHolder.getUser() != null) {
+            Long channelId = hostHolder.getUser().getChannelId();
+            if (channelId != null && channelId > 0) {
+                Channel channel = channelService.getById(channelId);
+                if (channel != null) {
+                    ticketBoxVO.setChannelCommRate(channel.getCommRate());
+                }
+            }
+        }
 
-    // 轮播图的十个奖品
-    StringBuilder sb = new StringBuilder("FIELD(t1.awards_label,'");
-    int i = 0;
-    for (AwardsLabelEnum awardsLabelEnum : AwardsLabelEnum.values()) {
-      i++;
-      if (i == AwardsLabelEnum.values().length) {
-        sb.append(awardsLabelEnum.getValue()).append("'");
-      }else {
-        sb.append(awardsLabelEnum.getValue()).append("','");
-      }
-    }
-    sb.append(")");
-
-    List<TicketAwardsPrizeVO> ticketAwardsPrizeVOS = ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
-        .eq("t1.box_id", ticketBox.getBoxId())
-        .eq("t2.is_deleted", 0)
-        .orderByAsc(sb.toString())
-        .orderByAsc("t1.sort")
-        .orderByDesc("t2.sort_weight")
-        .orderByDesc("t2.value")
-        .last("limit 10"));
-    ticketBoxVO.setPrizeList(ticketAwardsPrizeVOS);
-    return AjaxResult.success(ticketBoxVO);
-  }
-
-
-  @PostMapping("/ticket/prize/list/{boxId}")
-  @ApiOperation("查询盲票下奖品列表")
-  public TableDataInfo listPrize(@PathVariable("boxId") String boxId) {
-      startPage();
-      List<TicketAwardsPrizeVO> ticketAwardsPrizeVOS = ticketAwardsPrizeService.listPrizeVO(boxId);
-      return getDataTable(ticketAwardsPrizeVOS);
-  }
-
-  /**
-   * 扫码查看盲票幸运数字
-   */
-  @PostMapping("/ticket/queryLuckyNum")
-  @ApiOperation(value = "查看盲票幸运数字", notes = "根据盲票组ID,获取盲票幸运数字")
-  @ApiResponses(
-          @ApiResponse(code = 200, message = "success", response = TicketVO.class)
-  )
-  public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
-
-    if (StringUtils.isBlank(param.getSerialNo())) {
-      return AjaxResult.error("参数异常,盲票序列号缺失");
-    }
+        // 设置奖项标签信息
+        QueryWrapper<TicketAwards> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("box_id", ticketBox.getBoxId());
+        queryWrapper.isNotNull("awards_label");
+        queryWrapper.ne("awards_label", "");
+        queryWrapper.groupBy("awards_label");
+        StringBuilder sortField = new StringBuilder("FIELD(awards_label,'");
+        int index = 0;
+        for (AwardsLabelEnum awardsLabelEnum : AwardsLabelEnum.values()) {
+            index++;
+            if (index == AwardsLabelEnum.values().length) {
+                sortField.append(awardsLabelEnum.getValue()).append("'");
+            } else {
+                sortField.append(awardsLabelEnum.getValue()).append("','");
+            }
+        }
+        sortField.append(")");
+        queryWrapper.orderByAsc(sortField.toString());
+        List<TicketAwardsLabelVO> ticketAwardsLabelVOS = ticketAwardsService.groupSumQuantityByQueryWrapper(
+            queryWrapper);
+        if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
+            for (TicketAwardsLabelVO ticketAwardsLabelVO : ticketAwardsLabelVOS) {
+                AwardsLabelEnum awardsLabelEnum = AwardsLabelEnum.getByValue(ticketAwardsLabelVO.getLabelTitle());
+                if (Objects.isNull(awardsLabelEnum)) {
+                    continue;
+                }
+                ticketAwardsLabelVO.setPicUrl(awardsLabelEnum.getPicUrl());
+                Integer quantity = ticketBox.getQuantity();
+                int num = ticketAwardsLabelVO.getQuantity();
+                ticketAwardsLabelVO.setHitRate(
+                    BigDecimal.valueOf(num).divide(BigDecimal.valueOf(quantity), 3, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100)));
+            }
+        }
 
-    String serialNo = param.getSerialNo();
-    boolean match = ReUtil.isMatch("^\\w*-\\w*-\\w*$", serialNo);
-    if (!match) {
-      serialNo = AESUtil.decrypt(serialNo);
-    }
-    Ticket ticket = ticketService.getOne(
-            new LambdaQueryWrapper<Ticket>().eq(Ticket::getSerialNo, serialNo));
+        if (CollectionUtils.isNotEmpty(ticketAwardsLabelVOS)) {
+            // 精度问题处理
+            int maxIndex = 0;
+            BigDecimal maxHitRate = BigDecimal.valueOf(100);
+            for (int i = 0; i < ticketAwardsLabelVOS.size(); i++) {
+                TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(i);
+                if (BigDecimal.ZERO.equals(ticketAwardsLabelVO.getHitRate())) {
+                    ticketAwardsLabelVO.setHitRate(BigDecimal.valueOf(0.1));
+                }
+                if (ticketAwardsLabelVO.getHitRate().compareTo(ticketAwardsLabelVOS.get(maxIndex).getHitRate()) > 0) {
+                    maxIndex = i;
+                }
+                maxHitRate = maxHitRate.subtract(ticketAwardsLabelVO.getHitRate());
+            }
+            if (maxHitRate.compareTo(BigDecimal.ZERO) > 0) {
+                TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
+                ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().subtract(maxHitRate));
+            } else {
+                TicketAwardsLabelVO ticketAwardsLabelVO = ticketAwardsLabelVOS.get(maxIndex);
+                ticketAwardsLabelVO.setHitRate(ticketAwardsLabelVO.getHitRate().add(maxHitRate));
+            }
+        }
 
-    if (null == ticket) {
-      return AjaxResult.error("参数异常,盲票不存在");
-    }
+        ticketBoxVO.setTicketAwardsLabelList(ticketAwardsLabelVOS);
+
+        // 轮播图的十个奖品
+        StringBuilder sb = new StringBuilder("FIELD(t1.awards_label,'");
+        int i = 0;
+        for (AwardsLabelEnum awardsLabelEnum : AwardsLabelEnum.values()) {
+            i++;
+            if (i == AwardsLabelEnum.values().length) {
+                sb.append(awardsLabelEnum.getValue()).append("'");
+            } else {
+                sb.append(awardsLabelEnum.getValue()).append("','");
+            }
+        }
+        sb.append(")");
 
-    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
-    if (ticketBox.getIsEncrypt() == 1 && match) {
-      LogUtil.error(logger, "非法访问,serialNo:{0},param:{1}", serialNo, param);
-      return AjaxResult.error("非法访问!");
+        List<TicketAwardsPrizeVO> ticketAwardsPrizeVOS = ticketAwardsPrizeService.listPrizeVO(
+            new QueryWrapper<TicketAwardsPrize>()
+                .eq("t1.box_id", ticketBox.getBoxId())
+                .eq("t2.is_deleted", 0)
+                .orderByAsc(sb.toString())
+                .orderByAsc("t1.sort")
+                .orderByDesc("t2.sort_weight")
+                .orderByDesc("t2.value")
+                .last("limit 10"));
+        ticketBoxVO.setPrizeList(ticketAwardsPrizeVOS);
+        return AjaxResult.success(ticketBoxVO);
     }
 
 
-    /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
-    }*/
-    TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
-    if (ticketPackage.getStatus() != TicketPkgStatusEnum.SOLD) {
-      LogUtil.warn(logger, "盲票未激活。sn:{0},pkgId:{1}", new Object[]{ticket.getSerialNo(), ticket.getPkgId()});
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1023);
+    @PostMapping("/ticket/prize/list/{boxId}")
+    @ApiOperation("查询盲票下奖品列表")
+    public TableDataInfo listPrize(@PathVariable("boxId") String boxId) {
+        startPage();
+        List<TicketAwardsPrizeVO> ticketAwardsPrizeVOS = ticketAwardsPrizeService.listPrizeVO(boxId);
+        return getDataTable(ticketAwardsPrizeVOS);
     }
 
+    /**
+     * 扫码查看盲票幸运数字
+     */
+    @PostMapping("/ticket/queryLuckyNum")
+    @ApiOperation(value = "查看盲票幸运数字", notes = "根据盲票组ID,获取盲票幸运数字")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "success", response = TicketVO.class)
+    )
+    public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
 
-    TicketVO ticketVO = new TicketVO();
-    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(ticket.getBoxId()));
-    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());
-    ticketVO.setPicUrl(ticketBox.getPicUrl());
-
-    // 设置奖项名
-    if (Objects.nonNull(ticket.getPlainLuckyNum())) {
-      List<TicketDrawNumDTO> drawNumDTOList = JSONObject.parseArray(ticket.getDrawNum(), TicketDrawNumDTO.class);
-      for (TicketDrawNumDTO ticketDrawNumDTO : drawNumDTOList) {
-        if (ticketDrawNumDTO.getNum() == ticket.getPlainLuckyNum()) {
-          ticketVO.setAwardsName(ticketDrawNumDTO.getName());
-        }
-      }
-    }
+        if (StringUtils.isBlank(param.getSerialNo())) {
+            return AjaxResult.error("参数异常,盲票序列号缺失");
+        }
 
-    if (ticketPackage.getIsPre() == 1) {
-      // 预付票设置售价为0
-      ticketVO.setSalePrice(0);
-    }
+        String serialNo = param.getSerialNo();
+        boolean match = ReUtil.isMatch("^\\w*-\\w*-\\w*$", serialNo);
+        if (!match) {
+            serialNo = AESUtil.decrypt(serialNo);
+        }
+        Ticket ticket = ticketService.getOne(
+            new LambdaQueryWrapper<Ticket>().eq(Ticket::getSerialNo, serialNo));
 
-    return AjaxResult.success(ticketVO);
-  }
-
-  /**
-   * 根据盲票购买订单号查看盲票详情
-   */
-  @PostMapping("/ticket/query")
-  @ApiOperation(value = "查看盲票详情", notes = "根据盲票购买订单号,查看盲票详情")
-  public AjaxResult queryTicket(@RequestBody TicketParam param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    if (StringUtils.isBlank(param.getOrderId())) {
-      return AjaxResult.error("参数缺失");
-    }
+        if (null == ticket) {
+            return AjaxResult.error("参数异常,盲票不存在");
+        }
 
-    TicketListVO ticketListVO = userTicketOrderItemService.queryTicketVO(userId,
-        param.getOrderId());
-    return AjaxResult.success(ticketListVO);
-  }
-
-  /**
-   * 查看能兑奖的奖品
-   */
-  @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("参数缺失");
-    }
-    Ticket ticket = ticketService.getById(param.getTicketId());
+        TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+        if (ticketBox.getIsEncrypt() == 1 && match) {
+            LogUtil.error(logger, "非法访问,serialNo:{0},param:{1}", serialNo, param);
+            return AjaxResult.error("非法访问!");
+        }
 
-    if (null == ticket) {
-      return AjaxResult.error("参数异常,盲票不存在");
-    }
-    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+
+    /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
-    }
-    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
-    }
-    // 已付款的盲票,需要校验当前用户是否有权限查看
-    UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId,
-        ticket.getTicketId());
-    if (null == orderItem) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
-    }
+    }*/
+        TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
+        if (ticketPackage.getStatus() != TicketPkgStatusEnum.SOLD) {
+            LogUtil.warn(logger, "盲票未激活。sn:{0},pkgId:{1}", new Object[]{ticket.getSerialNo(), ticket.getPkgId()});
+            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1023);
+        }
 
-    // 线上盲票不支持查看兑奖奖品
-    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
-    if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
-      LogUtil.error(logger, "线上盲票不支持查看兑奖奖品。ticketId:{0}", ticket.getTicketId());
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1000);
-    }
+        TicketVO ticketVO = new TicketVO();
+        ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(ticket.getBoxId()));
+        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());
+        ticketVO.setPicUrl(ticketBox.getPicUrl());
+
+        // 设置奖项名
+        if (Objects.nonNull(ticket.getPlainLuckyNum())) {
+            List<TicketDrawNumDTO> drawNumDTOList = JSONObject.parseArray(ticket.getDrawNum(), TicketDrawNumDTO.class);
+            for (TicketDrawNumDTO ticketDrawNumDTO : drawNumDTOList) {
+                if (ticketDrawNumDTO.getNum() == ticket.getPlainLuckyNum()) {
+                    ticketVO.setAwardsName(ticketDrawNumDTO.getName());
+                }
+            }
+        }
 
-    List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
-    JSONObject jsonObject = new JSONObject();
-    jsonObject.put("prizeList", ticketAwardsPrizes);
-    jsonObject.put("ticketId", ticket.getTicketId());
-    jsonObject.put("boxId", ticket.getBoxId());
-    return AjaxResult.success(jsonObject);
-  }
-
-  @PostMapping("/ticket/autoCashPrize")
-  @ApiOperation("自动开奖")
-  public AjaxResult autoCashPrize(@Validated @RequestBody TicketAutoCashPrizeParam param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    if (Objects.nonNull(param.getTicketId())) {
-      Ticket ticket = ticketService.getById(param.getTicketId());
-      UserTicketOrderItem userTicketOrderItem = userTicketOrderItemService.getOne(new LambdaQueryWrapper<UserTicketOrderItem>()
-              .eq(UserTicketOrderItem::getTicketId, param.getTicketId())
-              .eq(UserTicketOrderItem::getUserId, userId));
-      if (Objects.isNull(ticket) || Objects.isNull(userTicketOrderItem)) {
-        return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
-      }
-      param.setBoxId(ticket.getBoxId());
-      param.setOrderId(userTicketOrderItem.getOrderId());
-      param.setIsTry(0);
-    }
+        if (ticketPackage.getIsPre() == 1) {
+            // 预付票设置售价为0
+            ticketVO.setSalePrice(0);
+        }
 
-    return AjaxResult.success(userHitPrizeService.autoCashPrize(userId, param));
-  }
-
-  /**
-   * 兑奖
-   */
-  @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("参数缺失");
+        return AjaxResult.success(ticketVO);
     }
 
-    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);
-    }
+    /**
+     * 根据盲票购买订单号查看盲票详情
+     */
+    @PostMapping("/ticket/query")
+    @ApiOperation(value = "根据单号查看盲票详情", notes = "根据盲票购买订单号,查看盲票详情")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "success", response = TicketListVO.class)
+    )
+    public AjaxResult queryTicket(@RequestBody TicketParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        if (StringUtils.isBlank(param.getOrderId())) {
+            return AjaxResult.error("参数缺失");
+        }
 
-    // 线上盲票不支持手动兑奖
-    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
-    if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
-      LogUtil.error(logger, "线上盲票不支持手动兑奖。ticketId:{0}", ticket.getTicketId());
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1000);
-    }
+        TicketListVO ticketListVO = userTicketOrderItemService.queryTicketVO(userId,
+            param.getOrderId());
+
+        if (ticketListVO != null) {
+            // 设置奖项名
+            if (Objects.nonNull(ticketListVO.getPlainLuckyNum())) {
+                List<TicketDrawNumDTO> drawNumDTOList = JSONObject.parseArray(ticketListVO.getDrawNum(), TicketDrawNumDTO.class);
+                for (TicketDrawNumDTO ticketDrawNumDTO : drawNumDTOList) {
+                    if (ticketDrawNumDTO.getNum() == ticketListVO.getPlainLuckyNum()) {
+                        ticketListVO.setAwardsName(ticketDrawNumDTO.getName());
+                    }
+                }
+            }
+        }
 
-    // 兑奖
-    String lockKey = RedisLockKey.build(RedisLockKey.USER_TICKET_CASH_LOCK, param.getPrizeId());
-    if (!distributedLocker.tryLock(lockKey)) {
-      return AjaxResult.error("系统繁忙,请稍后再试");
-    }
-    try {
-      // 兑奖
-      userHitPrizeService.cashPrize(ticket, userId, param.getAwardsId(), param.getPrizeId());
-    } finally {
-      distributedLocker.unlock(lockKey);
+        return AjaxResult.success(ticketListVO);
     }
 
-    return AjaxResult.success();
-  }
+    /**
+     * 查看能兑奖的奖品
+     */
+    @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("参数缺失");
+        }
+        Ticket ticket = ticketService.getById(param.getTicketId());
 
-  @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() {
+        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);
+        }
+        // 已付款的盲票,需要校验当前用户是否有权限查看
+        UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId,
+            ticket.getTicketId());
+        if (null == orderItem) {
+            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
+        }
 
-    // 获取用户 id
-    Long userId = 0L;
+        // 线上盲票不支持查看兑奖奖品
+        TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+//        if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
+//            LogUtil.error(logger, "线上盲票不支持查看兑奖奖品。ticketId:{0}", ticket.getTicketId());
+//            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1000);
+//        }
+
+        List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("prizeList", ticketAwardsPrizes);
+        jsonObject.put("ticketId", ticket.getTicketId());
+        jsonObject.put("boxId", ticket.getBoxId());
+        jsonObject.put("type", ticketBox.getType().getValue());
+        return AjaxResult.success(jsonObject);
+    }
+
+    @PostMapping("/ticket/autoCashPrize")
+    @ApiOperation("自动开奖")
+    public AjaxResult autoCashPrize(@Validated @RequestBody TicketAutoCashPrizeParam param) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        if (Objects.nonNull(param.getTicketId())) {
+            Ticket ticket = ticketService.getById(param.getTicketId());
+            UserTicketOrderItem userTicketOrderItem = userTicketOrderItemService.getOne(
+                new LambdaQueryWrapper<UserTicketOrderItem>()
+                    .eq(UserTicketOrderItem::getTicketId, param.getTicketId())
+                    .eq(UserTicketOrderItem::getUserId, userId));
+            if (Objects.isNull(ticket) || Objects.isNull(userTicketOrderItem)) {
+                return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
+            }
+            param.setBoxId(ticket.getBoxId());
+            param.setOrderId(userTicketOrderItem.getOrderId());
+            param.setIsTry(0);
+        }
 
-    if (hostHolder.getUser() != null) {
-      userId = hostHolder.getUser().getUserId();
+        return AjaxResult.success(userHitPrizeService.autoCashPrize(userId, param));
     }
 
-    // 弹幕列表
-    List<TicketHitPrizeBarrageVO> listOne = new ArrayList<>();
-    List<TicketHitPrizeBarrageVO> listTwo = new ArrayList<>();
-
-
-    // 获取除当前用户外最近10条盲豆大于1000的商品兑换数据
-    QueryWrapper<TicketHitPrizeBarrageVO> queryWrapper = new QueryWrapper<>();
-    queryWrapper.ge("t1.order_coin", 1000);
-    queryWrapper.notIn("t1.user_id", userId);
-    queryWrapper.orderByDesc("t1.created_time");
-    queryWrapper.last("limit 10");
-    List<TicketHitPrizeBarrageVO> exchangeList = userExchangeOrderService.listByWrapper(queryWrapper);
-
-    // 获取当前用户当天的商品兑换数据
-    LocalDateTime startTime = LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN);
-    LocalDateTime endTime = LocalDateTime.now().withNano(0);
-    queryWrapper.clear();
-    queryWrapper.eq("t1.user_id", userId);
-    queryWrapper.between("t1.created_time", startTime, endTime);
-    List<TicketHitPrizeBarrageVO> userExchangeList = userExchangeOrderService.listByWrapper(queryWrapper);
+    /**
+     * 兑奖
+     */
+    @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);
+        }
 
-    if (CollectionUtils.isNotEmpty(userExchangeList)) {
-      exchangeList.addAll(userExchangeList);
-    }
+        // 线上盲票不支持手动兑奖
+//        TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+//        if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
+//            LogUtil.error(logger, "线上盲票不支持手动兑奖。ticketId:{0}", ticket.getTicketId());
+//            return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1000);
+//        }
+
+        // 兑奖
+        String lockKey = RedisLockKey.build(RedisLockKey.USER_TICKET_CASH_LOCK, param.getPrizeId());
+        if (!distributedLocker.tryLock(lockKey)) {
+            return AjaxResult.error("系统繁忙,请稍后再试");
+        }
+        try {
+            // 兑奖
+            userHitPrizeService.cashPrize(ticket, userId, param.getAwardsId(), param.getPrizeId());
+        } finally {
+            distributedLocker.unlock(lockKey);
+        }
 
-    for (TicketHitPrizeBarrageVO ticketHitPrizeBarrageVO : exchangeList) {
-      // 设置为兑换类型
-      ticketHitPrizeBarrageVO.setType(2);
+        return AjaxResult.success();
     }
 
+    @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
+        Long userId = 0L;
 
-    // 获取用户当天中奖的 2 条弹幕
-    if (userId != 0L) {
-      List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrageByUserId(userId);
-      if (CollectionUtils.isNotEmpty(ticketHitPrizeBarrageVOList)) {
-        for (int i = 0; i < ticketHitPrizeBarrageVOList.size(); i++) {
-          // 类型为盲豆则拼接数量
-          if(TicketPrizeTypeEnum.COIN.getValue().equals(ticketHitPrizeBarrageVOList.get(i).getPrizeType())){
-            ticketHitPrizeBarrageVOList.get(i).setPrizeInfo(ticketHitPrizeBarrageVOList.get(i).getPrizeInfo() + ticketHitPrizeBarrageVOList.get(i).getValue() + "个");
-          }
-
-          // 设置类型为中奖
-          ticketHitPrizeBarrageVOList.get(i).setType(1);
-
-
-          listOne.add(ticketHitPrizeBarrageVOList.get(i));
+        if (hostHolder.getUser() != null) {
+            userId = hostHolder.getUser().getUserId();
+        }
 
+        // 弹幕列表
+        List<TicketHitPrizeBarrageVO> listOne = new ArrayList<>();
+        List<TicketHitPrizeBarrageVO> listTwo = new ArrayList<>();
+
+        // 获取除当前用户外最近10条盲豆大于1000的商品兑换数据
+        QueryWrapper<TicketHitPrizeBarrageVO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.ge("t1.order_coin", 1000);
+        queryWrapper.notIn("t1.user_id", userId);
+        queryWrapper.orderByDesc("t1.created_time");
+        queryWrapper.last("limit 10");
+        List<TicketHitPrizeBarrageVO> exchangeList = userExchangeOrderService.listByWrapper(queryWrapper);
+
+        // 获取当前用户当天的商品兑换数据
+        LocalDateTime startTime = LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN);
+        LocalDateTime endTime = LocalDateTime.now().withNano(0);
+        queryWrapper.clear();
+        queryWrapper.eq("t1.user_id", userId);
+        queryWrapper.between("t1.created_time", startTime, endTime);
+        List<TicketHitPrizeBarrageVO> userExchangeList = userExchangeOrderService.listByWrapper(queryWrapper);
+
+        if (CollectionUtils.isNotEmpty(userExchangeList)) {
+            exchangeList.addAll(userExchangeList);
         }
-      }
-    }
-    // 获取除该用户外,最近中奖的 40 条弹幕信息
-    List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrage(userId);
 
+        for (TicketHitPrizeBarrageVO ticketHitPrizeBarrageVO : exchangeList) {
+            // 设置为兑换类型
+            ticketHitPrizeBarrageVO.setType(2);
+        }
 
-    for (TicketHitPrizeBarrageVO ticketHitPrizeBarrageVO : ticketHitPrizeBarrageVOList) {
-      // 设置为中奖类型
-      ticketHitPrizeBarrageVO.setType(1);
-    }
+        // 获取用户当天中奖的 2 条弹幕
+        if (userId != 0L) {
+            List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrageByUserId(
+                userId);
+            if (CollectionUtils.isNotEmpty(ticketHitPrizeBarrageVOList)) {
+                for (int i = 0; i < ticketHitPrizeBarrageVOList.size(); i++) {
+                    // 类型为盲豆则拼接数量
+                    if (TicketPrizeTypeEnum.COIN.getValue().equals(ticketHitPrizeBarrageVOList.get(i).getPrizeType())) {
+                        ticketHitPrizeBarrageVOList.get(i).setPrizeInfo(
+                            ticketHitPrizeBarrageVOList.get(i).getPrizeInfo() + ticketHitPrizeBarrageVOList.get(i)
+                                .getValue() + "个");
+                    }
+
+                    // 设置类型为中奖
+                    ticketHitPrizeBarrageVOList.get(i).setType(1);
+
+                    listOne.add(ticketHitPrizeBarrageVOList.get(i));
+
+                }
+            }
+        }
+        // 获取除该用户外,最近中奖的 40 条弹幕信息
+        List<TicketHitPrizeBarrageVO> ticketHitPrizeBarrageVOList = userHitPrizeService.hitPrizeBarrage(userId);
 
-    // 增加兑奖信息并且按时间排序
-    ticketHitPrizeBarrageVOList.addAll(exchangeList);
+        for (TicketHitPrizeBarrageVO ticketHitPrizeBarrageVO : ticketHitPrizeBarrageVOList) {
+            // 设置为中奖类型
+            ticketHitPrizeBarrageVO.setType(1);
+        }
 
-    ticketHitPrizeBarrageVOList.sort((o1, o2) -> o2.getCreatedTime().compareTo(o1.getCreatedTime()));
+        // 增加兑奖信息并且按时间排序
+        ticketHitPrizeBarrageVOList.addAll(exchangeList);
 
-    // 获取除该用户外,近 6 个月,8 条高级中奖弹幕信息
-    List<TicketHitPrizeBarrageVO> expensiveHitPrizeBarrageList = userHitPrizeService.expensiveHitPrizeBarrage(userId);
-    int count = 0;
-    int index = 0;
-    if (CollectionUtils.isNotEmpty(expensiveHitPrizeBarrageList)) {
-      count = expensiveHitPrizeBarrageList.size();
-      // 去重
-      ticketHitPrizeBarrageVOList.removeAll(expensiveHitPrizeBarrageList);
-    }
+        ticketHitPrizeBarrageVOList.sort((o1, o2) -> o2.getCreatedTime().compareTo(o1.getCreatedTime()));
 
+        // 获取除该用户外,近 6 个月,8 条高级中奖弹幕信息
+        List<TicketHitPrizeBarrageVO> expensiveHitPrizeBarrageList = userHitPrizeService.expensiveHitPrizeBarrage(
+            userId);
+        int count = 0;
+        int index = 0;
+        if (CollectionUtils.isNotEmpty(expensiveHitPrizeBarrageList)) {
+            count = expensiveHitPrizeBarrageList.size();
+            // 去重
+            ticketHitPrizeBarrageVOList.removeAll(expensiveHitPrizeBarrageList);
+        }
 
-    for (int i = 0; i < ticketHitPrizeBarrageVOList.size(); i++) {
-      // 类型为盲豆则拼接数量
-      if(TicketPrizeTypeEnum.COIN.getValue().equals(ticketHitPrizeBarrageVOList.get(i).getPrizeType())){
-        ticketHitPrizeBarrageVOList.get(i).setPrizeInfo(ticketHitPrizeBarrageVOList.get(i).getPrizeInfo() + ticketHitPrizeBarrageVOList.get(i).getValue() + "个");
-      }
+        for (int i = 0; i < ticketHitPrizeBarrageVOList.size(); i++) {
+            // 类型为盲豆则拼接数量
+            if (TicketPrizeTypeEnum.COIN.getValue().equals(ticketHitPrizeBarrageVOList.get(i).getPrizeType())) {
+                ticketHitPrizeBarrageVOList.get(i).setPrizeInfo(
+                    ticketHitPrizeBarrageVOList.get(i).getPrizeInfo() + ticketHitPrizeBarrageVOList.get(i).getValue()
+                        + "个");
+            }
 
-      // 插入大奖弹幕
-      if (count != 0 && i % 5 == 0) {
-        // 设置类型为中奖
-        expensiveHitPrizeBarrageList.get(index).setType(1);
-        listOne.add(expensiveHitPrizeBarrageList.get(index));
+            // 插入大奖弹幕
+            if (count != 0 && i % 5 == 0) {
+                // 设置类型为中奖
+                expensiveHitPrizeBarrageList.get(index).setType(1);
+                listOne.add(expensiveHitPrizeBarrageList.get(index));
 
-        count--;
-        index++;
-      }
+                count--;
+                index++;
+            }
 
+            listOne.add(ticketHitPrizeBarrageVOList.get(i));
 
-      listOne.add(ticketHitPrizeBarrageVOList.get(i));
+        }
+        Map<String, List<TicketHitPrizeBarrageVO>> ticketHitPrizeBarrageMap = new HashMap<>();
+        ticketHitPrizeBarrageMap.put("listOne", listOne);
+        ticketHitPrizeBarrageMap.put("listTwo", listTwo);
 
+        return AjaxResult.success(ticketHitPrizeBarrageMap);
     }
-    Map<String,List<TicketHitPrizeBarrageVO>> ticketHitPrizeBarrageMap = new HashMap<>();
-    ticketHitPrizeBarrageMap.put("listOne",listOne);
-    ticketHitPrizeBarrageMap.put("listTwo",listTwo);
-
-    return AjaxResult.success(ticketHitPrizeBarrageMap);
-  }
-
-
-
-
 
 
 }

+ 21 - 2
mp-common/src/main/java/com/qs/mp/common/enums/CouponUseAreaEnum.java

@@ -13,11 +13,30 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 @JSONType(deserializer = EnumValueDeserializer.class)
 public enum CouponUseAreaEnum implements IEnum<Integer> {
 
+  /**
+   * 通用
+   */
   COMMON(0, "通用"),
-  ONLINE_SOME(1, "指定线上盲票"), // 盲票购买类优惠券,指定线上盲票
-  POST_SCOPE(2, "指定范围"), // 门店消费类优惠券,发放的时候动态设定使用范围
+
+  /**
+   * 指定范围,盲票购买和门店消费的时候指定范围
+   */
+  PRE_SCOPE(1, "指定范围"),
+  /**
+   * 门店消费类优惠券,发放的时候动态设定使用范围
+   */
+  POST_SCOPE(2, "门店消费"), // 门店消费类优惠券,发放的时候动态设定使用范围
+  /**
+   * 所有线上盲票
+   */
   ONLINE_SCOPE(3, "所有线上盲票"), // 盲票购买类优惠券,仅限线上盲票
+  /**
+   * 所有线下盲票
+   */
   OFFLINE_SCOPE(4, "所有线下盲票"), // 盲票购买类优惠券,仅限线下盲票
+  /**
+   * 指定线下盲票
+   */
   OFFLINE_SOME(5, "指定线下盲票"); // 盲票购买类优惠券,指定线下盲票
 
 

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

@@ -7,56 +7,56 @@ package com.qs.mp.common.enums;
  */
 public enum ErrorCodeEnum {
 
-  ERROR_CODE_1000(1000, "数据访问错误"),
-  ERROR_CODE_1001(1001, "请求参数为空"),
-  ERROR_CODE_1002(1002, "用户登录信息为空"),
-  ERROR_CODE_1004(1004, "获取锁失败"),
-  ERROR_CODE_1005(1005, "用户微信未授权登录"),
-  ERROR_CODE_1006(1006, "客户ID不存在"),
-  ERROR_CODE_1007(1007, "收支类型错误"),
-  ERROR_CODE_1008(1008, "余额不足,结算失败"),
-  ERROR_CODE_1009(1009, "数据更新异常"),
-  ERROR_CODE_1010(1010, "数据对象不存在或者返回重复记录"),
-  ERROR_CODE_1011(1011, "请求参数错误"),
-  ERROR_CODE_1012(1012, "查询微信用户信息失败"),
-  ERROR_CODE_1013(1013, "账号不存在"),
-  ERROR_CODE_1014(1014, "当前账号不能删除"),
-  ERROR_CODE_1015(1015, "保存失败"),
-  ERROR_CODE_1016(1016, "账号未认证,请先完成认证再提交"),
-  ERROR_CODE_1017(1017, "盲票已兑奖"),
-  ERROR_CODE_1018(1018, "无权限查看"),
-  ERROR_CODE_1019(1019, "盲票未付款"),
-  ERROR_CODE_1020(1020, "库存不足"),
-  ERROR_CODE_1021(1021, "盲豆余额不足"),
-  ERROR_CODE_1022(1022, "订单支付中"),
-  ERROR_CODE_1023(1023, "盲票未激活"),
-  ERROR_CODE_1024(1024, "删除失败,分类下存在商品"),
-  ERROR_CODE_1025(1025, "删除失败,标签下存在商品"),
-
-  ERROR_CODE_1026(1026, "用户支付宝未授权登录"),
-  ;
-  private int code;
-  private String msg;
-
-  ErrorCodeEnum(int code, String description) {
-    this.code = code;
-    this.msg = description;
-  }
-
-  public void setCode(int code) {
-    this.code = code;
-  }
-
-  public int getCode() {
-    return code;
-  }
-
-  public void setMsg(String description) {
-    this.msg = description;
-  }
-
-  public String getMsg() {
-    return msg;
-  }
+    ERROR_CODE_1000(1000, "数据访问错误"),
+    ERROR_CODE_1001(1001, "请求参数为空"),
+    ERROR_CODE_1002(1002, "用户登录信息为空"),
+    ERROR_CODE_1004(1004, "获取锁失败"),
+    ERROR_CODE_1005(1005, "用户微信未授权登录"),
+    ERROR_CODE_1006(1006, "客户ID不存在"),
+    ERROR_CODE_1007(1007, "收支类型错误"),
+    ERROR_CODE_1008(1008, "余额不足,结算失败"),
+    ERROR_CODE_1009(1009, "数据更新异常"),
+    ERROR_CODE_1010(1010, "数据对象不存在或者返回重复记录"),
+    ERROR_CODE_1011(1011, "请求参数错误"),
+    ERROR_CODE_1012(1012, "查询微信用户信息失败"),
+    ERROR_CODE_1013(1013, "账号不存在"),
+    ERROR_CODE_1014(1014, "当前账号不能删除"),
+    ERROR_CODE_1015(1015, "保存失败"),
+    ERROR_CODE_1016(1016, "账号未认证,请先完成认证再提交"),
+    ERROR_CODE_1017(1017, "盲票已兑奖"),
+    ERROR_CODE_1018(1018, "无权限查看"),
+    ERROR_CODE_1019(1019, "盲票未付款"),
+    ERROR_CODE_1020(1020, "库存不足"),
+    ERROR_CODE_1021(1021, "盲豆余额不足"),
+    ERROR_CODE_1022(1022, "订单支付中"),
+    ERROR_CODE_1023(1023, "盲票未激活"),
+    ERROR_CODE_1024(1024, "删除失败,分类下存在商品"),
+    ERROR_CODE_1025(1025, "删除失败,标签下存在商品"),
+
+    ERROR_CODE_1026(1026, "用户支付宝未授权登录"),
+    ;
+    private int code;
+    private String msg;
+
+    ErrorCodeEnum(int code, String description) {
+        this.code = code;
+        this.msg = description;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setMsg(String description) {
+        this.msg = description;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
 
 }

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

@@ -6,39 +6,39 @@ import com.baomidou.mybatisplus.annotation.IEnum;
 import com.qs.mp.common.json.EnumValueDeserializer;
 
 /**
- *
  * 用户卡券使用状态
- *
  */
 @JSONType(deserializer = EnumValueDeserializer.class)
 public enum UserCouponStatusEnum implements IEnum<Integer> {
 
-  UNUSED(1, "未使用"),
-  USED(2, "已使用"),
-  OVERDUE(3, "已过期"),;
+    UNUSED(1, "未使用"),
+    USED(2, "已使用"),
+    OVERDUE(3, "已过期"),
+    ;
 
-  private final Integer value;
-  private final String desc;
+    private final Integer value;
+    private final String desc;
 
-  UserCouponStatusEnum(final Integer value, final String desc) {
-    this.value = value;
-    this.desc = desc;
-  }
+    UserCouponStatusEnum(final Integer value, final String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
 
-  @Override
-  public Integer getValue() {
-    return value;
-  }
+    @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();
-  }
+    /**
+     * 重写toString,单个转化成json
+     *
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value", value);
+        object.put("desc", desc);
+        return object.toString();
+    }
 }

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

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

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

@@ -25,118 +25,118 @@ import lombok.Data;
 @ApiModel("盲票盒奖项对应的奖品设置实体类")
 public class TicketAwardsPrize implements Serializable {
 
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * 主键
-   */
-  @ApiModelProperty("奖品id,主键")
-  @TableId(value = "prize_id" , type = IdType.INPUT)
-  private String prizeId;
-
-  /**
-   * 盲票组ID
-   */
-  @ApiModelProperty("盲票组ID")
-  @TableField("box_id")
-  private String boxId;
-
-  /**
-   * 奖项ID
-   */
-  @ApiModelProperty("奖项ID")
-  @TableField("awards_id")
-  private String awardsId;
-
-  /**
-   * 奖品ID(GOODS_ID或COUPON_ID)
-   */
-  @ApiModelProperty("奖品ID(GOODS_ID或COUPON_ID)")
-  @TableField("ref_id")
-  private String refId;
-
-  /**
-   * 奖品名称
-   */
-  @ApiModelProperty("奖品名称")
-  @TableField("title")
-  private String title;
-
-  /**
-   * 奖品图片url
-   */
-  @ApiModelProperty("奖品图片url")
-  @TableField("pic_url")
-  private String picUrl;
-
-  /**
-   * 奖品类型 1 实物商品 2优惠券 3平台代币
-   */
-  @ApiModelProperty("奖品类型 1 实物商品 2优惠券 3平台代币")
-  @TableField("prize_type")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private TicketPrizeTypeEnum prizeType;
-
-  /**
-   * 奖品数
-   */
-  @ApiModelProperty("奖品数")
-  @TableField("quantity")
-  private Integer quantity;
-
-  /**
-   * 已兑奖品数
-   */
-  @ApiModelProperty("已兑奖品数")
-  @TableField("cashed_qty")
-  private Integer cashedQty;
-
-  /**
-   * 剩余奖品数
-   */
-  @ApiModelProperty("剩余奖品数")
-  @TableField("remain_qty")
-  private Integer remainQty;
-
-  /**
-   * 奖品价值
-   */
-  @ApiModelProperty("奖品价值")
-  @TableField("value")
-  private Integer value;
-
-  @ApiModelProperty("排序权重,越大越靠前")
-  @TableField("sort_weight")
-  private Integer sortWeight;
-
-  /**
-   * 逻辑删除标识
-   */
-  @ApiModelProperty("逻辑删除标识")
-  @TableField("is_deleted")
-  @TableLogic
-  private Integer isDeleted;
-
-  /**
-   * 创建时间
-   */
-  @ApiModelProperty("创建时间")
-  @TableField("created_time")
-  private Date createdTime;
-
-  /**
-   * 更新时间
-   */
-  @ApiModelProperty("更新时间")
-  @TableField("updated_time")
-  private Date updatedTime;
-
-
-  /**
-   * 商品成本
-   */
-  @ApiModelProperty("商品成本")
-  @TableField(exist = false)
-  private Integer cost;
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("奖品id,主键")
+    @TableId(value = "prize_id", type = IdType.INPUT)
+    private String prizeId;
+
+    /**
+     * 盲票组ID
+     */
+    @ApiModelProperty("盲票组ID")
+    @TableField("box_id")
+    private String boxId;
+
+    /**
+     * 奖项ID
+     */
+    @ApiModelProperty("奖项ID")
+    @TableField("awards_id")
+    private String awardsId;
+
+    /**
+     * 奖品ID(GOODS_ID或COUPON_ID)
+     */
+    @ApiModelProperty("奖品ID(GOODS_ID或COUPON_ID)")
+    @TableField("ref_id")
+    private String refId;
+
+    /**
+     * 奖品名称
+     */
+    @ApiModelProperty("奖品名称")
+    @TableField("title")
+    private String title;
+
+    /**
+     * 奖品图片url
+     */
+    @ApiModelProperty("奖品图片url")
+    @TableField("pic_url")
+    private String picUrl;
+
+    /**
+     * 奖品类型 1 实物商品 2优惠券 3平台代币
+     */
+    @ApiModelProperty("奖品类型 1 实物商品 2优惠券 3平台代币")
+    @TableField("prize_type")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketPrizeTypeEnum prizeType;
+
+    /**
+     * 奖品数
+     */
+    @ApiModelProperty("奖品数")
+    @TableField("quantity")
+    private Integer quantity;
+
+    /**
+     * 已兑奖品数
+     */
+    @ApiModelProperty("已兑奖品数")
+    @TableField("cashed_qty")
+    private Integer cashedQty;
+
+    /**
+     * 剩余奖品数
+     */
+    @ApiModelProperty("剩余奖品数")
+    @TableField("remain_qty")
+    private Integer remainQty;
+
+    /**
+     * 奖品价值
+     */
+    @ApiModelProperty("奖品价值")
+    @TableField("value")
+    private Integer value;
+
+    @ApiModelProperty("排序权重,越大越靠前")
+    @TableField("sort_weight")
+    private Integer sortWeight;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+    /**
+     * 商品成本
+     */
+    @ApiModelProperty("商品成本")
+    @TableField(exist = false)
+    private Integer cost;
 
 }

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

@@ -0,0 +1,20 @@
+package com.qs.mp.admin.domain.param;
+
+import com.qs.mp.channel.domain.Channel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.List;
+import lombok.Data;
+
+/**
+ * 经销商查询入参类
+ * @author Cup
+ * @date 2022/7/28
+ */
+@ApiModel("经销商查询入参类")
+@Data
+public class ChannelQueryParam extends Channel {
+
+    @ApiModelProperty("排除门店id列表")
+    private List<Long> excludeChannelIds;
+}

+ 2 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponParam.java

@@ -112,6 +112,8 @@ public class CouponParam {
   @ApiModelProperty(value = "盲票购买优惠券使用范围限制实体类列表", required = false)
   private String boxIds;
 
+  @ApiModelProperty("门店消费优惠券使用范围限制实体类列表")
+  private List<Long> channelIdList;
 
   @ApiModelProperty("排除的优惠券id列表")
   private List<Long> excludeCouponIds;

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

@@ -26,5 +26,9 @@ public class TicketBoxGoodsQueryParam {
     @ApiModelProperty(value = "盲票类型",required=true)
     private TicketTypeEnum type;
 
+    @ApiModelProperty("价格排序,1正序,2倒序")
+    private Integer salePriceSort;
+
+
 
 }

+ 2 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponVO.java

@@ -6,6 +6,7 @@ import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.vo.ChannelVO;
 import com.qs.mp.common.enums.CouponDiscountTypeEnum;
 import com.qs.mp.common.enums.CouponDistributeTypeEnum;
 import com.qs.mp.common.enums.CouponStatusEnum;
@@ -39,7 +40,7 @@ public class CouponVO {
      * 经销商门店优惠券使用范围限制列表
      */
     @ApiModelProperty("经销商门店优惠券使用范围限制列表")
-    private List<Channel> channelList;
+    private List<ChannelVO> channelList;
 
 
     /**

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

@@ -86,4 +86,11 @@ public class TicketListVO {
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private TicketTypeEnum type;
 
+
+  @ApiModelProperty("抽奖数字描述json")
+  private String drawNum;
+
+  @ApiModelProperty("奖级名称")
+  private String awardsName;
+
 }

+ 11 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/CouponChannelMapper.java

@@ -1,7 +1,12 @@
 package com.qs.mp.admin.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.CouponChannel;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.Channel;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @auther quanshu
@@ -10,4 +15,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface CouponChannelMapper extends BaseMapper<CouponChannel> {
 
+    /**
+     * 根据条件查询优惠券关联的门店列表
+     * @param queryWrapper
+     * @return
+     */
+    List<Channel> listCouponChannelByQueryWrapper(@Param(Constants.WRAPPER) QueryWrapper<CouponChannel> queryWrapper);
 }

+ 9 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICouponChannelService.java

@@ -1,7 +1,10 @@
 package com.qs.mp.admin.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.CouponChannel;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.Channel;
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ICouponChannelService extends IService<CouponChannel> {
 
+    /**
+     * 根据条件查询优惠券关联的门店列表
+     * @param queryWrapper
+     * @return
+     */
+    List<Channel> listCouponChannelByQueryWrapper(QueryWrapper<CouponChannel> queryWrapper);
 }

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

@@ -23,7 +23,7 @@ public interface ICouponService extends IService<Coupon> {
 	 * @param coupon
 	 * @param ticketList
 	 */
-	public void saveCoupon(Coupon coupon, List<CouponTicket> ticketList);
+	public void saveCoupon(Coupon coupon, List<CouponTicket> ticketList, List<Long> channelIdList);
 
 	/**
 	 * 修改信息
@@ -31,7 +31,7 @@ public interface ICouponService extends IService<Coupon> {
 	 * @param coupon
 	 * @param ticketList
 	 */
-	public void updateCoupon(Coupon coupon, List<CouponTicket> ticketList);
+	public void updateCoupon(Coupon coupon, List<CouponTicket> ticketList, List<Long> channelIdList);
 
 	/**
 	 * 发放

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

@@ -1,9 +1,12 @@
 package com.qs.mp.admin.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.CouponChannel;
 import com.qs.mp.admin.mapper.CouponChannelMapper;
 import com.qs.mp.admin.service.ICouponChannelService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.channel.domain.Channel;
+import java.util.List;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +20,9 @@ import org.springframework.stereotype.Service;
 @Service
 public class CouponChannelServiceImpl extends ServiceImpl<CouponChannelMapper, CouponChannel> implements ICouponChannelService {
 
+
+    @Override
+    public List<Channel> listCouponChannelByQueryWrapper(QueryWrapper<CouponChannel> queryWrapper) {
+        return getBaseMapper().listCouponChannelByQueryWrapper(queryWrapper);
+    }
 }

+ 68 - 18
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java

@@ -2,12 +2,15 @@ package com.qs.mp.admin.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.domain.CouponChannel;
 import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsSku;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.mapper.CouponMapper;
+import com.qs.mp.admin.service.ICouponChannelService;
 import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.admin.service.ICouponTicketService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -30,6 +33,7 @@ import com.qs.mp.user.service.IUserTicketOrderItemService;
 
 import com.qs.mp.user.service.IUserTicketOrderService;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.slf4j.Logger;
@@ -76,6 +80,9 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
     @Autowired
     private IChannelService channelService;
 
+    @Autowired
+    private ICouponChannelService couponChannelService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void distributeByMarketing(Long userId, String couponId) {
@@ -140,13 +147,28 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void saveCoupon(Coupon coupon, List<CouponTicket> ticketList) {
+    public void saveCoupon(Coupon coupon, List<CouponTicket> ticketList,List<Long> channelIdList) {
         boolean res = couponService.save(coupon);
         if (!res) {
             throw new ServiceException("请联系管理员");
         }
-        if (res && null != ticketList
-                && ticketList.size() > 0) {
+
+        // 指定门店
+        if (CollectionUtils.isNotEmpty(channelIdList)) {
+            List<CouponChannel> channelList = new ArrayList<>();
+            for (Long channelId : channelIdList) {
+                CouponChannel couponChannel = new CouponChannel();
+                couponChannel.setChannelId(channelId);
+                couponChannel.setCouponId(coupon.getCouponId());
+                channelList.add(couponChannel);
+            }
+            if (!couponChannelService.saveBatch(channelList)) {
+                throw new ServiceException("保存指定门店失败");
+            }
+        }
+
+        // 指定盲票
+        if (CollectionUtils.isNotEmpty(ticketList)) {
             for (CouponTicket couponTicket : ticketList) {
                 if (null != couponTicket) {
                     couponTicket.setCouponId(coupon.getCouponId());
@@ -154,39 +176,67 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
             }
             boolean skuRes = couponTicketService.saveBatch(ticketList);
             if (!skuRes) {
-                throw new ServiceException("请联系管理员");
+                throw new ServiceException("保存指定盲票失败");
             }
         }
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void updateCoupon(Coupon coupon, List<CouponTicket> ticketList) {
+    public void updateCoupon(Coupon coupon, List<CouponTicket> ticketList, List<Long> channelIdList) {
         boolean res = couponService.updateById(coupon);
         if (!res) {
             throw new ServiceException("请联系管理员");
         }
-        // 多SKU
-        if (res && null != ticketList
-                && ticketList.size() > 0) {
+
+        // 删除指定票
+        LambdaQueryWrapper<CouponTicket> couponTicketQueryWrapper = new LambdaQueryWrapper<>();
+        couponTicketQueryWrapper.eq(CouponTicket::getCouponId, coupon.getCouponId());
+        if (couponTicketService.count(couponTicketQueryWrapper) > 0) {
+            boolean delRes = couponTicketService.remove(couponTicketQueryWrapper);
+            if (!delRes) {
+                throw new ServiceException("删除原指定盲票关联失败");
+            }
+        }
+
+
+        // 删除指定门店
+        LambdaQueryWrapper<CouponChannel> couponChannelLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        couponChannelLambdaQueryWrapper.eq(CouponChannel::getCouponId, coupon.getCouponId());
+        if (couponChannelService.count(couponChannelLambdaQueryWrapper) > 0) {
+            boolean delRes = couponChannelService.remove(couponChannelLambdaQueryWrapper);
+            if (!delRes) {
+                throw new ServiceException("删除原指定门店关联失败");
+            }
+        }
+
+        // 保存指定门店
+        if (CollectionUtils.isNotEmpty(channelIdList)) {
+            List<CouponChannel> channelList = new ArrayList<>();
+            for (Long channelId : channelIdList) {
+                CouponChannel couponChannel = new CouponChannel();
+                couponChannel.setChannelId(channelId);
+                couponChannel.setCouponId(coupon.getCouponId());
+                channelList.add(couponChannel);
+            }
+            if (!couponChannelService.saveBatch(channelList)) {
+                throw new ServiceException("保存指定门店失败");
+            }
+        }
+
+
+        // 保存指定盲票
+        if (CollectionUtils.isNotEmpty(ticketList)) {
             for (CouponTicket couponTicket : ticketList) {
                 if (null != couponTicket) {
-                    couponTicket.setCouponId(couponTicket.getCouponId());
+                    couponTicket.setCouponId(coupon.getCouponId());
                 }
-            }
 
-            LambdaQueryWrapper<CouponTicket> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(CouponTicket::getCouponId, coupon.getCouponId());
-            boolean delRes = couponTicketService.remove(queryWrapper);
-            if (delRes) {
                 boolean skuRes = couponTicketService.saveBatch(ticketList);
                 if (!skuRes) {
-                    throw new ServiceException("请联系管理员");
+                    throw new ServiceException("更新指定盲票失败");
                 }
-            } else {
-                throw new ServiceException("请联系管理员");
             }
-
         }
     }
 }

+ 611 - 600
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -54,666 +54,677 @@ import org.springframework.util.Assert;
 public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox> implements
     ITicketBoxService {
 
-  protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
-  @Autowired
-  private MapperFacade mapperFacade;
+    @Autowired
+    private MapperFacade mapperFacade;
 
-  @Autowired
-  private BizIdGenerator bizIdGenerator;
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
 
-  @Autowired
-  private ITicketAwardsService ticketAwardsService;
+    @Autowired
+    private ITicketAwardsService ticketAwardsService;
 
-  @Autowired
-  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+    @Autowired
+    private ITicketAwardsPrizeService ticketAwardsPrizeService;
 
-  @Autowired
-  private IGoodsService goodsService;
+    @Autowired
+    private IGoodsService goodsService;
 
-  @Autowired
-  private ICouponService couponService;
+    @Autowired
+    private ICouponService couponService;
 
-  @Autowired
-  private ITicketBoxSerialService ticketBoxSerialService;
+    @Autowired
+    private ITicketBoxSerialService ticketBoxSerialService;
 
-  @Autowired
-  private ITicketService ticketService;
+    @Autowired
+    private ITicketService ticketService;
 
-  @Autowired
-  private ITicketPackageService ticketPackageService;
+    @Autowired
+    private ITicketPackageService ticketPackageService;
 
-  @Autowired
-  private ICouponPkgService couponPkgService;
+    @Autowired
+    private ICouponPkgService couponPkgService;
 
-  @Autowired
-  private ITicketBoxChannelService ticketBoxChannelService;
+    @Autowired
+    private ITicketBoxChannelService ticketBoxChannelService;
 
-  @Autowired
-  private IChannelService channelService;
+    @Autowired
+    private IChannelService channelService;
 
-  @Autowired
-  private IAsyncTaskService asyncTaskService;
+    @Autowired
+    private IAsyncTaskService asyncTaskService;
 
-  @Autowired
-  private ITicketBoxGoodsService ticketBoxGoodsService;
+    @Autowired
+    private ITicketBoxGoodsService ticketBoxGoodsService;
 
 
-  @Override
-  public List<TicketBoxGoodsListVO> listTicketGoodsByQueryWrapper(QueryWrapper<TicketBoxGoodsListVO> queryWrapper) {
-    return getBaseMapper().listTicketGoodsByQueryWrapper(queryWrapper);
-  }
-
-  @Override
-  public List<TicketBox> listBySaleChannel(QueryWrapper<TicketBox> queryWrapper) {
-    return getBaseMapper().listBySaleChannel(queryWrapper);
-  }
-
-
-  @Override
-  @Transactional(rollbackFor = Exception.class)
-  public boolean updateTicketBox(TicketBoxUpdateParam param) {
-    if (StringUtils.isBlank(param.getBoxId())) {
-      throw new ServiceException("盲票组ID不能为空");
-    }
-    // 设置更新盲票基本信息
-    TicketBox ticketBox = this.getById(param.getBoxId());
-    if (Objects.isNull(ticketBox)) {
-      throw new ServiceException("盲票信息不存在");
+    @Override
+    public List<TicketBoxGoodsListVO> listTicketGoodsByQueryWrapper(QueryWrapper<TicketBoxGoodsListVO> queryWrapper) {
+        return getBaseMapper().listTicketGoodsByQueryWrapper(queryWrapper);
     }
 
-    ticketBox.setBoxId(param.getBoxId());
-    ticketBox.setTitle(param.getTitle());
-    ticketBox.setPicUrl(param.getPicUrl());
-    ticketBox.setSalePrice(param.getSalePrice());
-    // 设置预购价
-    ticketBox.setPrePrice(param.getPrePrice());
-    ticketBox.setPkgSalePrice(param.getPkgSalePrice());
-    ticketBox.setOriginPrice(param.getOriginPrice());
-    ticketBox.setSaleCommRate(param.getSaleCommRate());
-    ticketBox.setSaleChannelType(param.getSaleChannelType());
-    this.updateById(ticketBox);
-
-
-    // 清除盲票关联商品
-    ticketBoxGoodsService.remove(new LambdaUpdateWrapper<TicketBoxGoods>().eq(TicketBoxGoods::getBoxId, ticketBox.getBoxId()));
-
-    // 关联商品
-    if (CollectionUtils.isNotEmpty(param.getGoodsList())) {
-      // 设置boxId和商品信息
-      for (TicketBoxGoods ticketBoxGoods : param.getGoodsList()) {
-        ticketBoxGoods.setId(null);
-        ticketBoxGoods.setBoxId(ticketBox.getBoxId());
-        Goods goods = goodsService.getById(ticketBoxGoods.getRefId());
-        if (goods != null) {
-          ticketBoxGoods.setTitle(goods.getTitle());
-          ticketBoxGoods.setPicUrl(goods.getPicUrl());
-          ticketBoxGoods.setValue(goods.getValue());
-        }
-      }
-      ticketBoxGoodsService.saveBatch(param.getGoodsList());
+    @Override
+    public List<TicketBox> listBySaleChannel(QueryWrapper<TicketBox> queryWrapper) {
+        return getBaseMapper().listBySaleChannel(queryWrapper);
     }
 
 
-    // 清除指定渠道内容
-    ticketBoxChannelService.remove(new LambdaUpdateWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
-
-    // 指定渠道
-    if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
-      List<Long> channelIdList = param.getChannelIdList();
-      if (CollectionUtils.isEmpty(channelIdList)) {
-        throw new ServiceException("渠道列表为空");
-      }
-      // 校验嵌套问题
-      List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
-                      .in(Channel::getChannelId, channelIdList)
-                      .orderByDesc(Channel::getLevel))
-              .stream().map(Channel::getChannelNo)
-              .collect(Collectors.toList());
-      for (int i = 0; i < channelNoList.size(); i++) {
-        for (int j = 0; j < channelNoList.size(); j++) {
-          if (i == j) {
-            continue;
-          }
-
-          boolean flag = channelNoList.get(i).startsWith(channelNoList.get(j) + ".");
-          if (flag) {
-            throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
-          }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateTicketBox(TicketBoxUpdateParam param) {
+        if (StringUtils.isBlank(param.getBoxId())) {
+            throw new ServiceException("盲票组ID不能为空");
+        }
+        // 设置更新盲票基本信息
+        TicketBox ticketBox = this.getById(param.getBoxId());
+        if (Objects.isNull(ticketBox)) {
+            throw new ServiceException("盲票信息不存在");
         }
-      }
-      List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
-      for (Long channelId : channelIdList) {
-        TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
-        ticketBoxChannel.setBoxId(ticketBox.getBoxId());
-        ticketBoxChannel.setChannelId(channelId);
-        ticketBoxChannelList.add(ticketBoxChannel);
-      }
-      ticketBoxChannelService.saveBatch(ticketBoxChannelList);
-    }
-
-    // 校验更新奖品信息
-    if (CollectionUtils.isEmpty(param.getAwardsList())) {
-      throw new ServiceException("奖品列表不能为空");
-    }
-    // 校验奖品信息
-    int count = ticketAwardsService.count(new LambdaQueryWrapper<TicketAwards>().eq(TicketAwards::getBoxId, param.getBoxId()));
-    if (count != param.getAwardsList().size()) {
-      throw new ServiceException("奖级数量与原来不同");
-    }
 
-    List<TicketAwards> ticketAwardsList = new ArrayList<>();
-    // 更新奖品信息
-    for (TicketAwardsParam ticketAwardsParam : param.getAwardsList()) {
-       if (CollectionUtils.isEmpty(ticketAwardsParam.getPrizeList())) {
-        throw new ServiceException("奖品列表不能为空");
-       }
-
-      // 线上票需要判断商品数量合法性
-      if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
-        int quantity = ticketAwardsParam.getPrizeList().stream().mapToInt(TicketAwardsPrizeParam::getQuantity).sum();
-        if (quantity != ticketAwardsParam.getQuantity()) {
-          throw new ServiceException("奖品总数值不相同");
+        ticketBox.setBoxId(param.getBoxId());
+        ticketBox.setTitle(param.getTitle());
+        ticketBox.setPicUrl(param.getPicUrl());
+        ticketBox.setSalePrice(param.getSalePrice());
+        // 设置预购价
+        ticketBox.setPrePrice(param.getPrePrice());
+        ticketBox.setPkgSalePrice(param.getPkgSalePrice());
+        ticketBox.setOriginPrice(param.getOriginPrice());
+        ticketBox.setSaleCommRate(param.getSaleCommRate());
+        ticketBox.setSaleChannelType(param.getSaleChannelType());
+        this.updateById(ticketBox);
+
+        // 清除盲票关联商品
+        ticketBoxGoodsService.remove(
+            new LambdaUpdateWrapper<TicketBoxGoods>().eq(TicketBoxGoods::getBoxId, ticketBox.getBoxId()));
+
+        // 关联商品
+        if (CollectionUtils.isNotEmpty(param.getGoodsList())) {
+            // 设置boxId和商品信息
+            for (TicketBoxGoods ticketBoxGoods : param.getGoodsList()) {
+                ticketBoxGoods.setId(null);
+                ticketBoxGoods.setBoxId(ticketBox.getBoxId());
+                Goods goods = goodsService.getById(ticketBoxGoods.getRefId());
+                if (goods != null) {
+                    ticketBoxGoods.setTitle(goods.getTitle());
+                    ticketBoxGoods.setPicUrl(goods.getPicUrl());
+                    ticketBoxGoods.setValue(goods.getValue());
+                }
+            }
+            ticketBoxGoodsService.saveBatch(param.getGoodsList());
         }
-      }
-      TicketAwards ticketAwards = new TicketAwards();
-      ticketAwards.setAwardsId(ticketAwardsParam.getAwardsId());
-      ticketAwards.setAwardsLabel(ticketAwardsParam.getAwardsLabel());
-      ticketAwardsList.add(ticketAwards);
-
-      List<TicketAwardsPrize> ticketAwardsPrizeList = new ArrayList<>();
-      List<String> prizeIdList = ticketAwardsParam.getPrizeList().stream().map(ticketAwardsPrizeParam -> {
-        // 奖品id为空则封装要新增的奖品
-        if (StringUtils.isBlank(ticketAwardsPrizeParam.getPrizeId())) {
-          // 封装奖品信息
-          TicketAwardsPrize awardsPrize = mapperFacade.map(ticketAwardsPrizeParam, TicketAwardsPrize.class);
-          awardsPrize.setPrizeId(bizIdGenerator.newId());
-          awardsPrize.setBoxId(ticketBox.getBoxId());
-          awardsPrize.setAwardsId(ticketAwardsParam.getAwardsId());
-          if (TicketTypeEnum.OFFLINE.equals(ticketBox.getType())) {
-            // 线下票的则默认为整个奖项的数量
-            awardsPrize.setQuantity(ticketAwardsParam.getQuantity());
-          }
-          awardsPrize.setRemainQty(awardsPrize.getQuantity());
-          awardsPrize.setCashedQty(0);
-          if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
-            Goods goods = goodsService.getById(awardsPrize.getRefId());
-            awardsPrize.setTitle(goods.getTitle());
-            awardsPrize.setPicUrl(goods.getPicUrl());
-            awardsPrize.setValue(goods.getValue());
-          } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
-            Coupon coupon = couponService.getById(awardsPrize.getRefId());
-            awardsPrize.setTitle(coupon.getTitle());
-            awardsPrize.setPicUrl(coupon.getPicUrl());
-            awardsPrize.setValue(coupon.getDiscount());
-          } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
-            CouponPkg couponPkg = couponPkgService.getById(awardsPrize.getRefId());
-            awardsPrize.setTitle(couponPkg.getTitle());
-            awardsPrize.setValue(couponPkg.getFacePrice());
-            awardsPrize.setPicUrl(couponPkg.getPicUrl());
-          } else {
-            awardsPrize.setTitle("盲豆");
-            awardsPrize.setPicUrl(Constants.MANGDOU_PIC);
-          }
-          ticketAwardsPrizeList.add(awardsPrize);
-        } else {
-          boolean rtn = true;
-          if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
-            TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizeService.getById(ticketAwardsPrizeParam.getPrizeId());
-            // 校验奖品数量不能少于已兑奖数量
-            if (ticketAwardsPrizeParam.getQuantity() < ticketAwardsPrize.getCashedQty()) {
-              throw new ServiceException("奖品数量不能少于已兑奖数量");
+
+        // 清除指定渠道内容
+        ticketBoxChannelService.remove(
+            new LambdaUpdateWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
+
+        // 指定渠道
+        if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
+            List<Long> channelIdList = param.getChannelIdList();
+            if (CollectionUtils.isEmpty(channelIdList)) {
+                throw new ServiceException("渠道列表为空");
             }
-            // 更新奖级信息等
-            rtn = ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>()
-                    .set(TicketAwardsPrize::getSortWeight, ticketAwardsPrizeParam.getSortWeight())
-                    .set(TicketAwardsPrize::getQuantity, ticketAwardsPrizeParam.getQuantity())
-                    .set(TicketAwardsPrize::getRemainQty, ticketAwardsPrizeParam.getQuantity() - ticketAwardsPrize.getCashedQty())
-                    .eq(TicketAwardsPrize::getPrizeId, ticketAwardsPrizeParam.getPrizeId())
-                    .eq(TicketAwardsPrize::getRemainQty, ticketAwardsPrize.getRemainQty()));
-
-          } else {
-            // 更新排序权重字段
-            rtn = ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>()
-                    .set(TicketAwardsPrize::getSortWeight, ticketAwardsPrizeParam.getSortWeight())
-                    .eq(TicketAwardsPrize::getPrizeId, ticketAwardsPrizeParam.getPrizeId()));
-          }
-          if (!rtn) {
-            throw new ServiceException("操作盲票频繁,请重试");
-          }
+            // 校验嵌套问题
+            List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
+                    .in(Channel::getChannelId, channelIdList)
+                    .orderByDesc(Channel::getLevel))
+                .stream().map(Channel::getChannelNo)
+                .collect(Collectors.toList());
+            for (int i = 0; i < channelNoList.size(); i++) {
+                for (int j = 0; j < channelNoList.size(); j++) {
+                    if (i == j) {
+                        continue;
+                    }
+
+                    boolean flag = channelNoList.get(i).startsWith(channelNoList.get(j) + ".");
+                    if (flag) {
+                        throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
+                    }
+                }
+            }
+            List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
+            for (Long channelId : channelIdList) {
+                TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
+                ticketBoxChannel.setBoxId(ticketBox.getBoxId());
+                ticketBoxChannel.setChannelId(channelId);
+                ticketBoxChannelList.add(ticketBoxChannel);
+            }
+            ticketBoxChannelService.saveBatch(ticketBoxChannelList);
+        }
 
+        // 校验更新奖品信息
+        if (CollectionUtils.isEmpty(param.getAwardsList())) {
+            throw new ServiceException("奖品列表不能为空");
         }
-        return ticketAwardsPrizeParam.getPrizeId();
-      }).collect(Collectors.toList());
-
-      // 如果新的奖品id为空,则清除原来的所有奖品
-      if (CollectionUtils.isEmpty(prizeIdList)) {
-        if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
-          int cashedCount = ticketAwardsPrizeService.count(new LambdaQueryWrapper<TicketAwardsPrize>()
-                  .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId())
-                  .ne(TicketAwardsPrize::getCashedQty, 0));
-          if (cashedCount != 0) {
-            throw new ServiceException("包含已兑奖记录的奖品不能从奖级中删除");
-          }
+        // 校验奖品信息
+        int count = ticketAwardsService.count(
+            new LambdaQueryWrapper<TicketAwards>().eq(TicketAwards::getBoxId, param.getBoxId()));
+        if (count != param.getAwardsList().size()) {
+            throw new ServiceException("奖级数量与原来不同");
         }
 
-        ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getIsDeleted, 1).eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
-      } else {
-        // 去重后,清除原来的奖品
-        // 查询原来的奖品信息
-        List<TicketAwardsPrize> oldTicketAwardsPrizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
-                .select(TicketAwardsPrize::getPrizeId)
-                .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId())
-            .eq(TicketAwardsPrize::getIsDeleted, 0));
-        if (CollectionUtils.isEmpty(oldTicketAwardsPrizeList)) {
-          throw new ServiceException("原奖品列表为空");
-        }
-        List<String> oldPrizeIdList = oldTicketAwardsPrizeList.stream().map(TicketAwardsPrize::getPrizeId).collect(Collectors.toList());
-        // 去重原来的奖品信息
-        oldPrizeIdList.removeAll(prizeIdList);
-
-        if (CollectionUtils.isNotEmpty(oldPrizeIdList)) {
-          if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
-            int cashedCount = ticketAwardsPrizeService.count(new LambdaQueryWrapper<TicketAwardsPrize>()
-                    .in(TicketAwardsPrize::getPrizeId, oldPrizeIdList)
-                    .ne(TicketAwardsPrize::getCashedQty, 0));
-            if (cashedCount != 0) {
-              throw new ServiceException("包含已兑奖记录的奖品不能从奖级中删除");
+        List<TicketAwards> ticketAwardsList = new ArrayList<>();
+        // 更新奖品信息
+        for (TicketAwardsParam ticketAwardsParam : param.getAwardsList()) {
+            if (CollectionUtils.isEmpty(ticketAwardsParam.getPrizeList())) {
+                throw new ServiceException("奖品列表不能为空");
             }
-          }
 
-          // 删除原来的奖品信息
-          ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getIsDeleted, 1).in(TicketAwardsPrize::getPrizeId, oldPrizeIdList));
-        }
-      }
+            // 线上票需要判断商品数量合法性
+//            if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
+//                int quantity = ticketAwardsParam.getPrizeList().stream().mapToInt(TicketAwardsPrizeParam::getQuantity)
+//                    .sum();
+//                if (quantity != ticketAwardsParam.getQuantity()) {
+//                    throw new ServiceException("奖品总数值不相同");
+//                }
+//            }
+            TicketAwards ticketAwards = new TicketAwards();
+            ticketAwards.setAwardsId(ticketAwardsParam.getAwardsId());
+            ticketAwards.setAwardsLabel(ticketAwardsParam.getAwardsLabel());
+            ticketAwardsList.add(ticketAwards);
+
+            List<TicketAwardsPrize> ticketAwardsPrizeList = new ArrayList<>();
+            List<String> prizeIdList = ticketAwardsParam.getPrizeList().stream().map(ticketAwardsPrizeParam -> {
+                // 奖品id为空则封装要新增的奖品
+                if (StringUtils.isBlank(ticketAwardsPrizeParam.getPrizeId())) {
+                    // 封装奖品信息
+                    TicketAwardsPrize awardsPrize = mapperFacade.map(ticketAwardsPrizeParam, TicketAwardsPrize.class);
+                    awardsPrize.setPrizeId(bizIdGenerator.newId());
+                    awardsPrize.setBoxId(ticketBox.getBoxId());
+                    awardsPrize.setAwardsId(ticketAwardsParam.getAwardsId());
+//                    if (TicketTypeEnum.OFFLINE.equals(ticketBox.getType())) {
+                        // 线下票的则默认为整个奖项的数量
+                        awardsPrize.setQuantity(ticketAwardsParam.getQuantity());
+//                    }
+                    awardsPrize.setRemainQty(awardsPrize.getQuantity());
+                    awardsPrize.setCashedQty(0);
+                    if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
+                        Goods goods = goodsService.getById(awardsPrize.getRefId());
+                        awardsPrize.setTitle(goods.getTitle());
+                        awardsPrize.setPicUrl(goods.getPicUrl());
+                        awardsPrize.setValue(goods.getValue());
+                    } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+                        Coupon coupon = couponService.getById(awardsPrize.getRefId());
+                        awardsPrize.setTitle(coupon.getTitle());
+                        awardsPrize.setPicUrl(coupon.getPicUrl());
+                        awardsPrize.setValue(coupon.getDiscount());
+                    } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
+                        CouponPkg couponPkg = couponPkgService.getById(awardsPrize.getRefId());
+                        awardsPrize.setTitle(couponPkg.getTitle());
+                        awardsPrize.setValue(couponPkg.getFacePrice());
+                        awardsPrize.setPicUrl(couponPkg.getPicUrl());
+                    } else {
+                        awardsPrize.setTitle("盲豆");
+                        awardsPrize.setPicUrl(Constants.MANGDOU_PIC);
+                    }
+                    ticketAwardsPrizeList.add(awardsPrize);
+                } else {
+                    boolean rtn = true;
+                    if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
+                        TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizeService.getById(
+                            ticketAwardsPrizeParam.getPrizeId());
+                        // 校验奖品数量不能少于已兑奖数量
+                        if (ticketAwardsPrizeParam.getQuantity() < ticketAwardsPrize.getCashedQty()) {
+                            throw new ServiceException("奖品数量不能少于已兑奖数量");
+                        }
+                        // 更新奖级信息等
+                        rtn = ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>()
+                            .set(TicketAwardsPrize::getSortWeight, ticketAwardsPrizeParam.getSortWeight())
+                            .set(TicketAwardsPrize::getQuantity, ticketAwardsPrizeParam.getQuantity())
+                            .set(TicketAwardsPrize::getRemainQty,
+                                ticketAwardsPrizeParam.getQuantity() - ticketAwardsPrize.getCashedQty())
+                            .eq(TicketAwardsPrize::getPrizeId, ticketAwardsPrizeParam.getPrizeId())
+                            .eq(TicketAwardsPrize::getRemainQty, ticketAwardsPrize.getRemainQty()));
+
+                    } else {
+                        // 更新排序权重字段
+                        rtn = ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>()
+                            .set(TicketAwardsPrize::getSortWeight, ticketAwardsPrizeParam.getSortWeight())
+                            .eq(TicketAwardsPrize::getPrizeId, ticketAwardsPrizeParam.getPrizeId()));
+                    }
+                    if (!rtn) {
+                        throw new ServiceException("操作盲票频繁,请重试");
+                    }
+
+                }
+                return ticketAwardsPrizeParam.getPrizeId();
+            }).collect(Collectors.toList());
+
+            // 如果新的奖品id为空,则清除原来的所有奖品
+            if (CollectionUtils.isEmpty(prizeIdList)) {
+                if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
+                    int cashedCount = ticketAwardsPrizeService.count(new LambdaQueryWrapper<TicketAwardsPrize>()
+                        .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId())
+                        .ne(TicketAwardsPrize::getCashedQty, 0));
+                    if (cashedCount != 0) {
+                        throw new ServiceException("包含已兑奖记录的奖品不能从奖级中删除");
+                    }
+                }
+
+                ticketAwardsPrizeService.update(
+                    new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getIsDeleted, 1)
+                        .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
+            } else {
+                // 去重后,清除原来的奖品
+                // 查询原来的奖品信息
+                List<TicketAwardsPrize> oldTicketAwardsPrizeList = ticketAwardsPrizeService.list(
+                    new LambdaQueryWrapper<TicketAwardsPrize>()
+                        .select(TicketAwardsPrize::getPrizeId)
+                        .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId())
+                        .eq(TicketAwardsPrize::getIsDeleted, 0));
+                if (CollectionUtils.isEmpty(oldTicketAwardsPrizeList)) {
+                    throw new ServiceException("原奖品列表为空");
+                }
+                List<String> oldPrizeIdList = oldTicketAwardsPrizeList.stream().map(TicketAwardsPrize::getPrizeId)
+                    .collect(Collectors.toList());
+                // 去重原来的奖品信息
+                oldPrizeIdList.removeAll(prizeIdList);
+
+                if (CollectionUtils.isNotEmpty(oldPrizeIdList)) {
+                    if (TicketTypeEnum.ONLINE.equals(ticketBox.getType())) {
+                        int cashedCount = ticketAwardsPrizeService.count(new LambdaQueryWrapper<TicketAwardsPrize>()
+                            .in(TicketAwardsPrize::getPrizeId, oldPrizeIdList)
+                            .ne(TicketAwardsPrize::getCashedQty, 0));
+                        if (cashedCount != 0) {
+                            throw new ServiceException("包含已兑奖记录的奖品不能从奖级中删除");
+                        }
+                    }
+
+                    // 删除原来的奖品信息
+                    ticketAwardsPrizeService.update(
+                        new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getIsDeleted, 1)
+                            .in(TicketAwardsPrize::getPrizeId, oldPrizeIdList));
+                }
+            }
 
-      // 新增奖品
-      if (CollectionUtils.isNotEmpty(ticketAwardsPrizeList)) {
-        ticketAwardsPrizeService.saveBatch(ticketAwardsPrizeList);
-      }
+            // 新增奖品
+            if (CollectionUtils.isNotEmpty(ticketAwardsPrizeList)) {
+                ticketAwardsPrizeService.saveBatch(ticketAwardsPrizeList);
+            }
 
-    }
-    //更新奖级信息
-    ticketAwardsService.updateBatchById(ticketAwardsList);
-    return true;
-  }
-
-  @Override
-  @Transactional(rollbackFor = Exception.class)
-  public String createTicketBox(TicketBoxCreateParam param) {
-    // 创建盲票组
-    TicketBox ticketBox = mapperFacade.map(param, TicketBox.class);
-    ticketBox.setPkgQty(ticketBox.getQuantity() / ticketBox.getPkgUnit());
-    ticketBox.setStatus(TicketBoxStatusEnum.WAIT);
-    ticketBox.setBoxNo(ticketBoxSerialService.generateSerial(ticketBox.getType()));
-    ticketBox.setBoxId(bizIdGenerator.newId());
-    // 序列号加密
-    ticketBox.setIsEncrypt(1);
-    ticketBox.setSaleChannelType(param.getSaleChannelType());
-    save(ticketBox);
-
-
-    // 关联商品
-    if (CollectionUtils.isNotEmpty(param.getGoodsList())) {
-      // 设置boxId和商品信息
-      for (TicketBoxGoods ticketBoxGoods : param.getGoodsList()) {
-        ticketBoxGoods.setBoxId(ticketBox.getBoxId());
-        Goods goods = goodsService.getById(ticketBoxGoods.getRefId());
-        if (goods != null) {
-          ticketBoxGoods.setTitle(goods.getTitle());
-          ticketBoxGoods.setPicUrl(goods.getPicUrl());
-          ticketBoxGoods.setValue(goods.getValue());
         }
-      }
-      ticketBoxGoodsService.saveBatch(param.getGoodsList());
+        //更新奖级信息
+        ticketAwardsService.updateBatchById(ticketAwardsList);
+        return true;
     }
 
-    // 指定渠道
-    if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
-      List<Long> channelIdList = param.getChannelIdList();
-      if (CollectionUtils.isEmpty(channelIdList)) {
-        throw new ServiceException("渠道列表为空");
-      }
-
-      // 校验嵌套问题
-      List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
-                                .in(Channel::getChannelId, channelIdList)
-                                .orderByDesc(Channel::getLevel))
-                                .stream().map(Channel::getChannelNo)
-                                .collect(Collectors.toList());
-      for (int i = 0; i < channelNoList.size(); i++) {
-        for (int j = 0; j < channelNoList.size(); j++) {
-          if (i == j) {
-            continue;
-          }
-          boolean flag = channelNoList.get(i).startsWith(channelNoList.get(j) + ".");
-          if (flag) {
-            throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
-          }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String createTicketBox(TicketBoxCreateParam param) {
+        // 创建盲票组
+        TicketBox ticketBox = mapperFacade.map(param, TicketBox.class);
+        ticketBox.setPkgQty(ticketBox.getQuantity() / ticketBox.getPkgUnit());
+        ticketBox.setStatus(TicketBoxStatusEnum.WAIT);
+        ticketBox.setBoxNo(ticketBoxSerialService.generateSerial(ticketBox.getType()));
+        ticketBox.setBoxId(bizIdGenerator.newId());
+        // 序列号加密
+        ticketBox.setIsEncrypt(1);
+        ticketBox.setSaleChannelType(param.getSaleChannelType());
+        save(ticketBox);
+
+        // 关联商品
+        if (CollectionUtils.isNotEmpty(param.getGoodsList())) {
+            // 设置boxId和商品信息
+            for (TicketBoxGoods ticketBoxGoods : param.getGoodsList()) {
+                ticketBoxGoods.setBoxId(ticketBox.getBoxId());
+                Goods goods = goodsService.getById(ticketBoxGoods.getRefId());
+                if (goods != null) {
+                    ticketBoxGoods.setTitle(goods.getTitle());
+                    ticketBoxGoods.setPicUrl(goods.getPicUrl());
+                    ticketBoxGoods.setValue(goods.getValue());
+                }
+            }
+            ticketBoxGoodsService.saveBatch(param.getGoodsList());
+        }
+
+        // 指定渠道
+        if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
+            List<Long> channelIdList = param.getChannelIdList();
+            if (CollectionUtils.isEmpty(channelIdList)) {
+                throw new ServiceException("渠道列表为空");
+            }
+
+            // 校验嵌套问题
+            List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
+                    .in(Channel::getChannelId, channelIdList)
+                    .orderByDesc(Channel::getLevel))
+                .stream().map(Channel::getChannelNo)
+                .collect(Collectors.toList());
+            for (int i = 0; i < channelNoList.size(); i++) {
+                for (int j = 0; j < channelNoList.size(); j++) {
+                    if (i == j) {
+                        continue;
+                    }
+                    boolean flag = channelNoList.get(i).startsWith(channelNoList.get(j) + ".");
+                    if (flag) {
+                        throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
+                    }
+                }
+            }
+
+            List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
+            for (Long channelId : channelIdList) {
+                TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
+                ticketBoxChannel.setBoxId(ticketBox.getBoxId());
+                ticketBoxChannel.setChannelId(channelId);
+                ticketBoxChannelList.add(ticketBoxChannel);
+            }
+            ticketBoxChannelService.saveBatch(ticketBoxChannelList);
         }
-      }
-
-      List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
-      for (Long channelId : channelIdList) {
-        TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
-        ticketBoxChannel.setBoxId(ticketBox.getBoxId());
-        ticketBoxChannel.setChannelId(channelId);
-        ticketBoxChannelList.add(ticketBoxChannel);
-      }
-      ticketBoxChannelService.saveBatch(ticketBoxChannelList);
-    }
 
-    // 创建奖级
-    List<TicketAwards> ticketAwardsList = new ArrayList<>();
-    List<TicketAwardsPrize> awardsPrizeList = new ArrayList<>();
-    BigDecimal sumHitRate = BigDecimal.ZERO;
-    for (int i = 0; i < param.getAwardsList().size(); i ++) {
-      TicketAwardsParam awardsParam = param.getAwardsList().get(i);
-      TicketAwards ticketAwards = mapperFacade.map(awardsParam, TicketAwards.class);
-      ticketAwards.setAwardsId(bizIdGenerator.newId());
-      ticketAwards.setBoxId(ticketBox.getBoxId());
-      if (i == param.getAwardsList().size() - 1) {
-        ticketAwards.setHitRate(new BigDecimal(100).subtract(sumHitRate));
-      } else {
-        BigDecimal hitRate = new BigDecimal(awardsParam.getQuantity() * 100).divide(
-            new BigDecimal(ticketBox.getQuantity()), 4, RoundingMode.DOWN);
-        sumHitRate = sumHitRate.add(hitRate);
-        ticketAwards.setHitRate(hitRate);
-      }
-      ticketAwardsList.add(ticketAwards);
-
-      for (TicketAwardsPrizeParam prizeParam : awardsParam.getPrizeList()) {
-        TicketAwardsPrize awardsPrize = mapperFacade.map(prizeParam, TicketAwardsPrize.class);
-        awardsPrize.setPrizeId(bizIdGenerator.newId());
-        awardsPrize.setBoxId(ticketBox.getBoxId());
-        awardsPrize.setAwardsId(ticketAwards.getAwardsId());
-        if (TicketTypeEnum.OFFLINE.equals(ticketBox.getType())) {
-          // 线下票的则默认为整个奖项的数量
-          awardsPrize.setQuantity(ticketAwards.getQuantity());
+        // 创建奖级
+        List<TicketAwards> ticketAwardsList = new ArrayList<>();
+        List<TicketAwardsPrize> awardsPrizeList = new ArrayList<>();
+        BigDecimal sumHitRate = BigDecimal.ZERO;
+        for (int i = 0; i < param.getAwardsList().size(); i++) {
+            TicketAwardsParam awardsParam = param.getAwardsList().get(i);
+            TicketAwards ticketAwards = mapperFacade.map(awardsParam, TicketAwards.class);
+            ticketAwards.setAwardsId(bizIdGenerator.newId());
+            ticketAwards.setBoxId(ticketBox.getBoxId());
+            if (i == param.getAwardsList().size() - 1) {
+                ticketAwards.setHitRate(new BigDecimal(100).subtract(sumHitRate));
+            } else {
+                BigDecimal hitRate = new BigDecimal(awardsParam.getQuantity() * 100).divide(
+                    new BigDecimal(ticketBox.getQuantity()), 4, RoundingMode.DOWN);
+                sumHitRate = sumHitRate.add(hitRate);
+                ticketAwards.setHitRate(hitRate);
+            }
+            ticketAwardsList.add(ticketAwards);
+
+            for (TicketAwardsPrizeParam prizeParam : awardsParam.getPrizeList()) {
+                TicketAwardsPrize awardsPrize = mapperFacade.map(prizeParam, TicketAwardsPrize.class);
+                awardsPrize.setPrizeId(bizIdGenerator.newId());
+                awardsPrize.setBoxId(ticketBox.getBoxId());
+                awardsPrize.setAwardsId(ticketAwards.getAwardsId());
+//                if (TicketTypeEnum.OFFLINE.equals(ticketBox.getType())) {
+                    // 线下票的则默认为整个奖项的数量
+                    awardsPrize.setQuantity(ticketAwards.getQuantity());
+//                }
+                awardsPrize.setRemainQty(awardsPrize.getQuantity());
+                awardsPrize.setCashedQty(0);
+                if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
+                    Goods goods = goodsService.getById(awardsPrize.getRefId());
+                    awardsPrize.setTitle(goods.getTitle());
+                    awardsPrize.setPicUrl(goods.getPicUrl());
+                    awardsPrize.setValue(goods.getValue());
+                } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+                    Coupon coupon = couponService.getById(awardsPrize.getRefId());
+                    awardsPrize.setTitle(coupon.getTitle());
+                    awardsPrize.setPicUrl(coupon.getPicUrl());
+                    awardsPrize.setValue(coupon.getDiscount());
+                } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
+                    CouponPkg couponPkg = couponPkgService.getById(awardsPrize.getRefId());
+                    awardsPrize.setTitle(couponPkg.getTitle());
+                    awardsPrize.setValue(couponPkg.getFacePrice());
+                    awardsPrize.setPicUrl(couponPkg.getPicUrl());
+                } else {
+                    awardsPrize.setTitle("盲豆");
+                    awardsPrize.setPicUrl(Constants.MANGDOU_PIC);
+                }
+                awardsPrizeList.add(awardsPrize);
+            }
         }
-        awardsPrize.setRemainQty(awardsPrize.getQuantity());
-        awardsPrize.setCashedQty(0);
-        if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
-          Goods goods = goodsService.getById(awardsPrize.getRefId());
-          awardsPrize.setTitle(goods.getTitle());
-          awardsPrize.setPicUrl(goods.getPicUrl());
-          awardsPrize.setValue(goods.getValue());
-        } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
-          Coupon coupon = couponService.getById(awardsPrize.getRefId());
-          awardsPrize.setTitle(coupon.getTitle());
-          awardsPrize.setPicUrl(coupon.getPicUrl());
-          awardsPrize.setValue(coupon.getDiscount());
-        } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
-          CouponPkg couponPkg = couponPkgService.getById(awardsPrize.getRefId());
-          awardsPrize.setTitle(couponPkg.getTitle());
-          awardsPrize.setValue(couponPkg.getFacePrice());
-          awardsPrize.setPicUrl(couponPkg.getPicUrl());
-        } else {
-          awardsPrize.setTitle("盲豆");
-          awardsPrize.setPicUrl(Constants.MANGDOU_PIC);
+        ticketAwardsService.saveBatch(ticketAwardsList);
+        ticketAwardsPrizeService.saveBatch(awardsPrizeList);
+
+        if (StringUtils.isNotBlank(ticketBox.getBoxId())) {
+            // 插入盲票生成异步任务
+            Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_GENERATE, ticketBox.getBoxId()),
+                "盲票组保存,创建异步任务失败. boxId:" + ticketBox.getBoxId());
         }
-        awardsPrizeList.add(awardsPrize);
-      }
+
+        return ticketBox.getBoxId();
     }
-    ticketAwardsService.saveBatch(ticketAwardsList);
-    ticketAwardsPrizeService.saveBatch(awardsPrizeList);
 
-    if (StringUtils.isNotBlank(ticketBox.getBoxId())) {
-      // 插入盲票生成异步任务
-      Assert.isTrue(asyncTaskService.insertAsyncTask(AsyncTaskTypeEnum.TICKET_GENERATE, ticketBox.getBoxId()),"盲票组保存,创建异步任务失败. boxId:" +  ticketBox.getBoxId());
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void removeTicketBox(String boxId) {
+        removeById(boxId);
+        ticketPackageService.remove(new LambdaQueryWrapper<TicketPackage>().eq(TicketPackage::getBoxId, boxId));
+        ticketService.remove(new LambdaQueryWrapper<Ticket>().eq(Ticket::getBoxId, boxId));
+        ticketAwardsService.remove(new LambdaQueryWrapper<TicketAwards>().eq(TicketAwards::getBoxId, boxId));
+        ticketAwardsPrizeService.remove(
+            new LambdaQueryWrapper<TicketAwardsPrize>().eq(TicketAwardsPrize::getBoxId, boxId));
     }
 
-    return ticketBox.getBoxId();
-  }
-
-  @Override
-  @Transactional(rollbackFor = Exception.class)
-  public void removeTicketBox(String boxId) {
-    removeById(boxId);
-    ticketPackageService.remove(new LambdaQueryWrapper<TicketPackage>().eq(TicketPackage::getBoxId, boxId));
-    ticketService.remove(new LambdaQueryWrapper<Ticket>().eq(Ticket::getBoxId, boxId));
-    ticketAwardsService.remove(new LambdaQueryWrapper<TicketAwards>().eq(TicketAwards::getBoxId, boxId));
-    ticketAwardsPrizeService.remove(new LambdaQueryWrapper<TicketAwardsPrize>().eq(TicketAwardsPrize::getBoxId, boxId));
-  }
-
-  @Override
-  @Transactional(rollbackFor = Exception.class)
-  public void generateTicket(String boxId) {
-    TicketBox ticketBox = getById(boxId);
-    Assert.isTrue(ticketBox.getStatus() == TicketBoxStatusEnum.WAIT,
-        "盲票生成时,票组状态不是出票中,boxId=" + boxId);
-    List<TicketAwards> ticketAwardsList = ticketAwardsService.list(
-        new LambdaQueryWrapper<TicketAwards>()
-            .eq(TicketAwards::getBoxId, ticketBox.getBoxId())
-            .orderByAsc(TicketAwards::getQuantity));
-    // 分包
-    int pkgNum = ticketBox.getPkgQty();
-    int pkgUnit = ticketBox.getPkgUnit();
-
-    Map<Integer, List<PkgAwards>> pkgAwardsMap = generatePkgAwards(
-        ticketBox, ticketAwardsList, pkgNum, pkgUnit);
-
-    // 生成票包记录和盲票记录
-    int pkgCnt = 0;
-    int ticketCnt = 0;
-    List<TicketPackage> ticketPackageList = new ArrayList<>();
-    for (Integer key : pkgAwardsMap.keySet()) {
-      pkgCnt += 1;
-      TicketPackage ticketPackage = new TicketPackage();
-      ticketPackage.setPkgId(bizIdGenerator.newId());
-      ticketPackage.setBoxId(ticketBox.getBoxId());
-      ticketPackage.setPkgNo(ticketBox.getBoxNo() + "-" + String.format("%1$04d", pkgCnt));
-      ticketPackage.setStartSn(
-          ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 1));
-      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);
-      LogUtil.debug(logger, "第{0}包盲票奖项数量为{1}", pkgCnt, pkgAwardsList);
-      List<Ticket> ticketList = new ArrayList<>();
-      for (int j = 1; j <= pkgUnit; j++) {
-        ticketCnt += 1;
-        Iterator<PkgAwards> iterator = pkgAwardsList.iterator();
-        while (iterator.hasNext()) {
-          PkgAwards next = iterator.next();
-          if (next.getQuantity() == 0) {
-            iterator.remove();
-          }
-        }
-        LogUtil.debug(logger, "开始生成第{0}包、第{1}盲票", pkgCnt, j);
-        int random = getPrizeIndex(pkgAwardsList);
-        PkgAwards pkgAwards = pkgAwardsList.get(random);
-        pkgAwards.setQuantity(pkgAwards.getQuantity() - 1);
-
-        Ticket ticket = new Ticket();
-        ticket.setTicketId(bizIdGenerator.newIdWithUidSharding(ticketBox.getBoxNo()));
-        ticket.setBoxId(ticketBox.getBoxId());
-        ticket.setPkgId(ticketPackage.getPkgId());
-        ticket.setTitle(ticketBox.getTitle());
-        ticket.setSerialNo(ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt));
-        ticket.setFacePrice(ticketBox.getFacePrice());
-        int luckyNum = new Random().nextInt(99) + 1;
-        ticket.setCipherLuckyNum(RSAUtil.encrypt(String.valueOf(luckyNum)));
-        List<TicketDrawNumDTO> drawNumDTOList = new ArrayList<>();
-        drawNumDTOList.add(new TicketDrawNumDTO(pkgAwards.getName(), luckyNum));
-        // 再生成17个随机数字
-        List<Integer> randomNumList = getRandomList(Arrays.asList(luckyNum), 17, 99);
-        for (Integer drawNum : randomNumList) {
-          int awardsNum = new Random().nextInt(ticketAwardsList.size());
-          drawNumDTOList.add(
-              new TicketDrawNumDTO(ticketAwardsList.get(awardsNum).getName(), drawNum));
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void generateTicket(String boxId) {
+        TicketBox ticketBox = getById(boxId);
+        Assert.isTrue(ticketBox.getStatus() == TicketBoxStatusEnum.WAIT,
+            "盲票生成时,票组状态不是出票中,boxId=" + boxId);
+        List<TicketAwards> ticketAwardsList = ticketAwardsService.list(
+            new LambdaQueryWrapper<TicketAwards>()
+                .eq(TicketAwards::getBoxId, ticketBox.getBoxId())
+                .orderByAsc(TicketAwards::getQuantity));
+        // 分包
+        int pkgNum = ticketBox.getPkgQty();
+        int pkgUnit = ticketBox.getPkgUnit();
+
+        Map<Integer, List<PkgAwards>> pkgAwardsMap = generatePkgAwards(
+            ticketBox, ticketAwardsList, pkgNum, pkgUnit);
+
+        // 生成票包记录和盲票记录
+        int pkgCnt = 0;
+        int ticketCnt = 0;
+        List<TicketPackage> ticketPackageList = new ArrayList<>();
+        for (Integer key : pkgAwardsMap.keySet()) {
+            pkgCnt += 1;
+            TicketPackage ticketPackage = new TicketPackage();
+            ticketPackage.setPkgId(bizIdGenerator.newId());
+            ticketPackage.setBoxId(ticketBox.getBoxId());
+            ticketPackage.setPkgNo(ticketBox.getBoxNo() + "-" + String.format("%1$04d", pkgCnt));
+            ticketPackage.setStartSn(
+                ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt + 1));
+            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);
+            LogUtil.debug(logger, "第{0}包盲票奖项数量为{1}", pkgCnt, pkgAwardsList);
+            List<Ticket> ticketList = new ArrayList<>();
+            for (int j = 1; j <= pkgUnit; j++) {
+                ticketCnt += 1;
+                Iterator<PkgAwards> iterator = pkgAwardsList.iterator();
+                while (iterator.hasNext()) {
+                    PkgAwards next = iterator.next();
+                    if (next.getQuantity() == 0) {
+                        iterator.remove();
+                    }
+                }
+                LogUtil.debug(logger, "开始生成第{0}包、第{1}盲票", pkgCnt, j);
+                int random = getPrizeIndex(pkgAwardsList);
+                PkgAwards pkgAwards = pkgAwardsList.get(random);
+                pkgAwards.setQuantity(pkgAwards.getQuantity() - 1);
+
+                Ticket ticket = new Ticket();
+                ticket.setTicketId(bizIdGenerator.newIdWithUidSharding(ticketBox.getBoxNo()));
+                ticket.setBoxId(ticketBox.getBoxId());
+                ticket.setPkgId(ticketPackage.getPkgId());
+                ticket.setTitle(ticketBox.getTitle());
+                ticket.setSerialNo(ticketPackage.getPkgNo() + "-" + String.format("%1$07d", ticketCnt));
+                ticket.setFacePrice(ticketBox.getFacePrice());
+                int luckyNum = new Random().nextInt(99) + 1;
+                ticket.setCipherLuckyNum(RSAUtil.encrypt(String.valueOf(luckyNum)));
+                List<TicketDrawNumDTO> drawNumDTOList = new ArrayList<>();
+                drawNumDTOList.add(new TicketDrawNumDTO(pkgAwards.getName(), luckyNum));
+                // 再生成17个随机数字
+                List<Integer> randomNumList = getRandomList(Arrays.asList(luckyNum), 17, 99);
+                for (Integer drawNum : randomNumList) {
+                    int awardsNum = new Random().nextInt(ticketAwardsList.size());
+                    drawNumDTOList.add(
+                        new TicketDrawNumDTO(ticketAwardsList.get(awardsNum).getName(), drawNum));
+                }
+                Collections.shuffle(drawNumDTOList);
+
+                ticket.setDrawNum(JSONObject.toJSONString(drawNumDTOList));
+                ticket.setIsPhysical(1);
+                ticket.setStatus(TicketStatusEnum.NOT_PAY);
+                ticketList.add(ticket);
+            }
+            ticketService.saveBatch(ticketList);
         }
-        Collections.shuffle(drawNumDTOList);
-
-        ticket.setDrawNum(JSONObject.toJSONString(drawNumDTOList));
-        ticket.setIsPhysical(1);
-        ticket.setStatus(TicketStatusEnum.NOT_PAY);
-        ticketList.add(ticket);
-      }
-      ticketService.saveBatch(ticketList);
-    }
-    ticketPackageService.saveBatch(ticketPackageList);
-
-    boolean rst = update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.DONE)
-        .eq(TicketBox::getBoxId, boxId).eq(TicketBox::getStatus, TicketBoxStatusEnum.WAIT));
-    Assert.isTrue(rst, "盲票生成完,更新盲票组状态失败。boxId:{0}" + ticketBox.getBoxId());
-  }
-
-  private Map<Integer, List<PkgAwards>> generatePkgAwards(TicketBox ticketBox,
-      List<TicketAwards> ticketAwardsList, int pkgNum, int pkgUnit) {
-    // 1.把各奖级的中奖数量分摊到每包上
-    Map<Integer, List<PkgAwards>> pkgAwardsMap = new HashMap<>();
-    for (int m = 1; m <= pkgNum; m++) {
-      pkgAwardsMap.put(m, new ArrayList<PkgAwards>());
+        ticketPackageService.saveBatch(ticketPackageList);
+
+        boolean rst = update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.DONE)
+            .eq(TicketBox::getBoxId, boxId).eq(TicketBox::getStatus, TicketBoxStatusEnum.WAIT));
+        Assert.isTrue(rst, "盲票生成完,更新盲票组状态失败。boxId:{0}" + ticketBox.getBoxId());
     }
-    List<Integer> excludePkgList = new ArrayList<>();
-    for (int k = 0; k < ticketAwardsList.size(); k++) {
-      TicketAwards ticketAwards = ticketAwardsList.get(k);
-      if (ticketAwards.getQuantity() < pkgNum) {
-        // 奖级数量少于包数的,随机不重复分配,随机数从1开始
-        int totalNone = pkgNum - ticketAwards.getQuantity(); // 轮空数
-        int moreExInt = excludePkgList.size() - totalNone; // 本轮要排除的数 - 轮空数
-        if (moreExInt > 0) {
-          // 多出来的数,从末尾开始删除
-          for (int l = 0; l < moreExInt; l++) {
-            excludePkgList.remove(excludePkgList.size() - 1);
-          }
+
+    private Map<Integer, List<PkgAwards>> generatePkgAwards(TicketBox ticketBox,
+        List<TicketAwards> ticketAwardsList, int pkgNum, int pkgUnit) {
+        // 1.把各奖级的中奖数量分摊到每包上
+        Map<Integer, List<PkgAwards>> pkgAwardsMap = new HashMap<>();
+        for (int m = 1; m <= pkgNum; m++) {
+            pkgAwardsMap.put(m, new ArrayList<PkgAwards>());
         }
-        List<Integer> randomList = getRandomList(excludePkgList, ticketAwards.getQuantity(),
-            pkgNum);
-        excludePkgList.addAll(randomList);
+        List<Integer> excludePkgList = new ArrayList<>();
+        for (int k = 0; k < ticketAwardsList.size(); k++) {
+            TicketAwards ticketAwards = ticketAwardsList.get(k);
+            if (ticketAwards.getQuantity() < pkgNum) {
+                // 奖级数量少于包数的,随机不重复分配,随机数从1开始
+                int totalNone = pkgNum - ticketAwards.getQuantity(); // 轮空数
+                int moreExInt = excludePkgList.size() - totalNone; // 本轮要排除的数 - 轮空数
+                if (moreExInt > 0) {
+                    // 多出来的数,从末尾开始删除
+                    for (int l = 0; l < moreExInt; l++) {
+                        excludePkgList.remove(excludePkgList.size() - 1);
+                    }
+                }
+                List<Integer> randomList = getRandomList(excludePkgList, ticketAwards.getQuantity(),
+                    pkgNum);
+                excludePkgList.addAll(randomList);
 //        LogUtil.debug(logger, "随机分配到的包序号为:{0}", JSONObject.toJSONString(randomList));
-        for (Integer pkgId : randomList) {
-          pkgAwardsMap.get(pkgId).add(
-              new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
-                  ticketAwards.getSort(), 1));
-        }
-      } else {
-        // 奖级数量大于包数的,平均分配,四舍五入
-        int remainQty = ticketAwards.getQuantity();
-        for (int i = 1; i <= pkgNum; i++) {
-          int quantity;
-          if (k == ticketAwardsList.size() - 1) {
-            // 最后一个奖项直接分配奖级数量差额即可
-            int hasQty = pkgAwardsMap.get(i).stream().mapToInt(PkgAwards::getQuantity).sum();
-            quantity = pkgUnit - hasQty;
-          } else {
-            if (i == pkgNum) {
-              quantity = remainQty;
+                for (Integer pkgId : randomList) {
+                    pkgAwardsMap.get(pkgId).add(
+                        new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
+                            ticketAwards.getSort(), 1));
+                }
             } else {
-              quantity = new BigDecimal(remainQty).divide(new BigDecimal(pkgNum - i + 1), 0,
-                  RoundingMode.HALF_UP).intValue();
+                // 奖级数量大于包数的,平均分配,四舍五入
+                int remainQty = ticketAwards.getQuantity();
+                for (int i = 1; i <= pkgNum; i++) {
+                    int quantity;
+                    if (k == ticketAwardsList.size() - 1) {
+                        // 最后一个奖项直接分配奖级数量差额即可
+                        int hasQty = pkgAwardsMap.get(i).stream().mapToInt(PkgAwards::getQuantity).sum();
+                        quantity = pkgUnit - hasQty;
+                    } else {
+                        if (i == pkgNum) {
+                            quantity = remainQty;
+                        } else {
+                            quantity = new BigDecimal(remainQty).divide(new BigDecimal(pkgNum - i + 1), 0,
+                                RoundingMode.HALF_UP).intValue();
+                        }
+                    }
+                    remainQty -= quantity;
+                    Assert.isTrue(remainQty >= 0, "剩余奖级数量不足分配。boxId:" + ticketBox.getBoxId());
+                    pkgAwardsMap.get(i).add(
+                        new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
+                            ticketAwards.getSort(), quantity));
+                }
             }
-          }
-          remainQty -= quantity;
-          Assert.isTrue(remainQty >= 0, "剩余奖级数量不足分配。boxId:" + ticketBox.getBoxId());
-          pkgAwardsMap.get(i).add(
-              new PkgAwards(ticketAwards.getAwardsId(), ticketAwards.getName(),
-                  ticketAwards.getSort(), quantity));
-        }
-      }
       /*LogUtil.debug(logger, "奖级{0}分包结果:{1}",
           k, JSONObject.toJSONString(pkgAwardsMap));*/
+        }
+        return pkgAwardsMap;
     }
-    return pkgAwardsMap;
-  }
-
-  /**
-   * 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率
-   *
-   * @param prizes
-   * @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
-   */
-  public int getPrizeIndex(List<PkgAwards> prizes) {
-    DecimalFormat df = new DecimalFormat("######0.00");
-    int random = -1;
-
-    //计算总权重
-    double sumWeight = 0;
-    for (PkgAwards p : prizes) {
-      sumWeight += p.getQuantity();
-    }
-    LogUtil.info(logger, "sumWeight:{0}", sumWeight);
-    //产生随机数
-    double randomNumber;
-    randomNumber = Math.random();
-    LogUtil.debug(logger, "随机数:" + randomNumber);
-    //根据随机数在所有奖品分布的区域并确定所抽奖品
-    double d1 = 0;
-    double d2 = 0;
-    for (int i = 0; i < prizes.size(); i++) {
-      d2 += Double.parseDouble(String.valueOf(prizes.get(i).getQuantity())) / sumWeight;
-      if (i == 0) {
-        d1 = 0;
-      } else {
-        d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getQuantity())) / sumWeight;
-      }
-      LogUtil.debug(logger, "prize:{0},区间 d1:{1}, d2:{2}",
-          JSONObject.toJSONString(prizes.get(i)), d1, d2);
-      if (randomNumber >= d1 && randomNumber < d2) {
-        random = i;
-        break;
-      }
-    }
-    LogUtil.debug(logger, "抽中序号:{0}", random);
-    return random;
-  }
-
-  /**
-   * 从total中随机取n个不重复的数,范围[1, total]
-   *
-   * @param n
-   * @param total
-   * @return
-   */
-  private List<Integer> getRandomList(List<Integer> excludeList, int n, int total) {
-    List<Integer> randomList = new ArrayList<>();
-    Random rand = new Random();
-    boolean[] bool = new boolean[total];
-    for (Integer exInt : excludeList) {
-      bool[exInt - 1] = true;
-    }
-    int randInt = 0;
-    for (int i = 0; i < n; i++) {
-      do {
-        randInt = rand.nextInt(total);
-      } while (bool[randInt]);
-      bool[randInt] = true;
-      randomList.add(randInt + 1);
-    }
-    return randomList;
-  }
-
-  @Data
-  private static class PkgAwards {
-
-    private String awardsId;
 
     /**
-     * 奖项名
+     * 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率
+     *
+     * @param prizes
+     * @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
      */
-    private String name;
+    public int getPrizeIndex(List<PkgAwards> prizes) {
+        DecimalFormat df = new DecimalFormat("######0.00");
+        int random = -1;
+
+        //计算总权重
+        double sumWeight = 0;
+        for (PkgAwards p : prizes) {
+            sumWeight += p.getQuantity();
+        }
+        LogUtil.info(logger, "sumWeight:{0}", sumWeight);
+        //产生随机数
+        double randomNumber;
+        randomNumber = Math.random();
+        LogUtil.debug(logger, "随机数:" + randomNumber);
+        //根据随机数在所有奖品分布的区域并确定所抽奖品
+        double d1 = 0;
+        double d2 = 0;
+        for (int i = 0; i < prizes.size(); i++) {
+            d2 += Double.parseDouble(String.valueOf(prizes.get(i).getQuantity())) / sumWeight;
+            if (i == 0) {
+                d1 = 0;
+            } else {
+                d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getQuantity())) / sumWeight;
+            }
+            LogUtil.debug(logger, "prize:{0},区间 d1:{1}, d2:{2}",
+                JSONObject.toJSONString(prizes.get(i)), d1, d2);
+            if (randomNumber >= d1 && randomNumber < d2) {
+                random = i;
+                break;
+            }
+        }
+        LogUtil.debug(logger, "抽中序号:{0}", random);
+        return random;
+    }
 
     /**
-     * 奖项顺序
+     * 从total中随机取n个不重复的数,范围[1, total]
+     *
+     * @param n
+     * @param total
+     * @return
      */
-    private Integer sort;
+    private List<Integer> getRandomList(List<Integer> excludeList, int n, int total) {
+        List<Integer> randomList = new ArrayList<>();
+        Random rand = new Random();
+        boolean[] bool = new boolean[total];
+        for (Integer exInt : excludeList) {
+            bool[exInt - 1] = true;
+        }
+        int randInt = 0;
+        for (int i = 0; i < n; i++) {
+            do {
+                randInt = rand.nextInt(total);
+            } while (bool[randInt]);
+            bool[randInt] = true;
+            randomList.add(randInt + 1);
+        }
+        return randomList;
+    }
 
-    /**
-     * 奖项数量
-     */
-    private Integer quantity;
+    @Data
+    private static class PkgAwards {
+
+        private String awardsId;
 
-    PkgAwards(String awardsId, String name, Integer sort, Integer quantity) {
-      this.awardsId = awardsId;
-      this.name = name;
-      this.sort = sort;
-      this.quantity = quantity;
+        /**
+         * 奖项名
+         */
+        private String name;
+
+        /**
+         * 奖项顺序
+         */
+        private Integer sort;
+
+        /**
+         * 奖项数量
+         */
+        private Integer quantity;
+
+        PkgAwards(String awardsId, String name, Integer sort, Integer quantity) {
+            this.awardsId = awardsId;
+            this.name = name;
+            this.sort = sort;
+            this.quantity = quantity;
+        }
     }
-  }
 }

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

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

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

@@ -25,93 +25,93 @@ import lombok.Data;
 @ApiModel("用户的优惠券实体类")
 public class UserCoupon implements Serializable {
 
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * 主键
-   */
-  @ApiModelProperty("主键")
-  @TableId(value = "id", type = IdType.INPUT)
-  private String id;
-
-  /**
-   * 用户ID
-   */
-  @ApiModelProperty("用户id")
-  @TableField("user_id")
-  private Long userId;
-
-  /**
-   * 核销码
-   */
-  @ApiModelProperty("核销码")
-  @TableField("verify_code")
-  private String verifyCode;
-
-  /**
-   * 优惠券ID
-   */
-  @ApiModelProperty("优惠券id")
-  @TableField("coupon_id")
-  private Long couponId;
-
-  /**
-   * 生效日
-   */
-  @ApiModelProperty("生效日")
-  @TableField("valid_start")
-  private Date validStart;
-
-  /**
-   * 到期日
-   */
-  @ApiModelProperty("到期日")
-  @TableField("valid_end")
-  private Date validEnd;
-
-  /**
-   * 适用范围说明
-   */
-  @ApiModelProperty("使用范围;0通用, 1指定范围, 2门店消费,发放时动态指定范围, 3线上票, 4线下票")
-  @TableField("use_area_desc")
-  private String useAreaDesc;
-
-  /**
-   * 使用订单ID
-   */
-  @ApiModelProperty("使用订单id")
-  @TableField("order_id")
-  private String orderId;
-
-  /**
-   * 核销时间
-   */
-  @ApiModelProperty("核销时间")
-  @TableField("verify_time")
-  private Date verifyTime;
-
-  /**
-   * 状态;1未使用 2已使用 3已过期
-   */
-  @ApiModelProperty("状态;1未使用 2已使用 3已过期")
-  @TableField("status")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private UserCouponStatusEnum status;
-
-  /**
-   * 创建时间
-   */
-  @ApiModelProperty("创建时间")
-  @TableField("created_time")
-  private Date createdTime;
-
-  /**
-   * 更新时间
-   */
-  @ApiModelProperty("更新时间")
-  @TableField("updated_time")
-  @Version
-  private Date updatedTime;
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.INPUT)
+    private String id;
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户id")
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 核销码
+     */
+    @ApiModelProperty("核销码")
+    @TableField("verify_code")
+    private String verifyCode;
+
+    /**
+     * 优惠券ID
+     */
+    @ApiModelProperty("优惠券id")
+    @TableField("coupon_id")
+    private Long couponId;
+
+    /**
+     * 生效日
+     */
+    @ApiModelProperty("生效日")
+    @TableField("valid_start")
+    private Date validStart;
+
+    /**
+     * 到期日
+     */
+    @ApiModelProperty("到期日")
+    @TableField("valid_end")
+    private Date validEnd;
+
+    /**
+     * 适用范围说明
+     */
+    @ApiModelProperty("使用范围;0通用, 1指定范围, 2门店消费,发放时动态指定范围, 3线上票, 4线下票")
+    @TableField("use_area_desc")
+    private String useAreaDesc;
+
+    /**
+     * 使用订单ID
+     */
+    @ApiModelProperty("使用订单id")
+    @TableField("order_id")
+    private String orderId;
+
+    /**
+     * 核销时间
+     */
+    @ApiModelProperty("核销时间")
+    @TableField("verify_time")
+    private Date verifyTime;
+
+    /**
+     * 状态;1未使用 2已使用 3已过期
+     */
+    @ApiModelProperty("状态;1未使用 2已使用 3已过期")
+    @TableField("status")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private UserCouponStatusEnum status;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    @Version
+    private Date updatedTime;
 
 
 }

+ 28 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/CouponChannelQueryParam.java

@@ -0,0 +1,28 @@
+package com.qs.mp.user.domain.param;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Cup
+ * @date 2022/7/28
+ */
+@ApiModel("优惠券关联门店查询入参类")
+@Data
+public class CouponChannelQueryParam {
+
+    @ApiModelProperty("优惠券ID")
+    private Long couponId;
+
+    @ApiModelProperty("省ID")
+    private Long provinceId;
+
+    @ApiModelProperty("城市ID")
+    private Long cityId;
+
+    @ApiModelProperty("区ID")
+    private Long areaId;
+
+}

+ 70 - 65
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java

@@ -29,71 +29,76 @@ import lombok.Data;
 @Data
 @ApiModel("用户的优惠券出参类")
 public class UserCouponVO extends UserCoupon {
-  /**
-   * 标题
-   */
-  @ApiModelProperty("标题")
-  private String title;
-
-  /**
-   * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
-   */
-  @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponTypeEnum type;
-
-  /**
-   * 图片
-   */
-  @ApiModelProperty("图片")
-  private String picUrl;
-
-  /**
-   * 使用说明
-   */
-  @ApiModelProperty("使用说明")
-  private String description;
-
-  /**
-   * 优惠类型;1代金券、2折扣券、3兑换券
-   */
-  @ApiModelProperty("优惠类型;1代金券、2折扣券、3兑换券")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponDiscountTypeEnum discountType;
-
-  /**
-   * 优惠金额(比例)
-   */
-  @ApiModelProperty("优惠金额(比例)")
-  private Integer discount;
-
-  /**
-   * 最低消费金额
-   */
-  @ApiModelProperty("最低消费金额")
-  private Integer minOrderAmt;
-
-  /**
-   * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
-   */
-  @ApiModelProperty("使用范围;0通用 1生成券时指定范围 2发放时动态指定范围")
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  private CouponUseAreaEnum useArea;
-
-  @ApiModelProperty("指定票组列表,type为1,useArea为1时才有值")
-  private List<String> boxIds;
-
-  /**
-   * 叠加使用;0不允许 1允许
-   */
-  @ApiModelProperty("叠加使用;0不允许 1允许")
-  private Integer compositeUse;
-
-  /**
-   * 是否选中
-   */
-  @ApiModelProperty("是否选中")
-  private boolean checked = false;
+
+    /**
+     * 标题
+     */
+    @ApiModelProperty("标题")
+    private String title;
+
+    /**
+     * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
+     */
+    @ApiModelProperty("类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponTypeEnum type;
+
+    /**
+     * 图片
+     */
+    @ApiModelProperty("图片")
+    private String picUrl;
+
+    /**
+     * 使用说明
+     */
+    @ApiModelProperty("使用说明")
+    private String description;
+
+    /**
+     * 优惠类型;1代金券、2折扣券、3兑换券
+     */
+    @ApiModelProperty("优惠类型;1代金券、2折扣券、3兑换券")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponDiscountTypeEnum discountType;
+
+    /**
+     * 优惠金额(比例)
+     */
+    @ApiModelProperty("优惠金额(比例)")
+    private Integer discount;
+
+    /**
+     * 最低消费金额
+     */
+    @ApiModelProperty("最低消费金额")
+    private Integer minOrderAmt;
+
+    /**
+     * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
+     */
+    @ApiModelProperty("使用范围;0通用 1生成券时指定范围 2发放时动态指定范围")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CouponUseAreaEnum useArea;
+
+    @ApiModelProperty("指定票组列表,type为1,useArea为1时才有值")
+    private List<String> boxIds;
+
+    /**
+     * 叠加使用;0不允许 1允许
+     */
+    @ApiModelProperty("叠加使用;0不允许 1允许")
+    private Integer compositeUse;
+
+    /**
+     * 是否选中
+     */
+    @ApiModelProperty("是否选中")
+    private boolean checked = false;
+
+
+    @ApiModelProperty("关联门店总数")
+    private Integer channelTotal;
 
 
 }

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

@@ -63,7 +63,7 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
     List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(queryWrapper);
     for (UserCouponVO couponVO : userCouponVOList) {
       // 指定盲票购买的优惠券
-      if (couponVO.getType() == CouponTypeEnum.TICKET_ORDER && couponVO.getUseArea() == CouponUseAreaEnum.ONLINE_SOME) {
+      if (couponVO.getType() == CouponTypeEnum.TICKET_ORDER && couponVO.getUseArea() == CouponUseAreaEnum.PRE_SCOPE) {
         List<CouponTicket> couponTicketList = couponTicketService.list(new LambdaQueryWrapper<CouponTicket>()
             .eq(CouponTicket::getCouponId, couponVO.getCouponId()));
         List<String> boxIds = couponTicketList.stream().map(couponTicket -> {
@@ -90,7 +90,7 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
     while (iterator.hasNext()) {
       UserCouponVO userCouponVO = iterator.next();
       // 校验使用范围
-      if (userCouponVO.getUseArea() == CouponUseAreaEnum.ONLINE_SOME) {
+      if (userCouponVO.getUseArea() == CouponUseAreaEnum.PRE_SCOPE) {
         // 指定盲票
         List<CouponTicket> couponTicketList = couponTicketService.list(
             new LambdaQueryWrapper<CouponTicket>()

+ 7 - 0
mp-service/src/main/resources/mapper/admin/CouponChannelMapper.xml

@@ -16,4 +16,11 @@
         id, coupon_id, channel_id, created_time, updated_time
     </sql>
 
+    <select id="listCouponChannelByQueryWrapper" resultType="com.qs.mp.channel.domain.Channel">
+        select t2.*
+        from mp_coupon_channel t1
+         left join mp_channel t2 on t1.channel_id = t2.channel_id
+        ${ew.customSqlSegment}
+    </select>
+
 </mapper>

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

@@ -38,7 +38,8 @@
                 t4.type,
                 t6.title prizeInfo,
                 t6.`value`,
-                t6.prize_type
+                t6.prize_type,
+                t3.draw_num
         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