Selaa lähdekoodia

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

chunping 2 vuotta sitten
vanhempi
commit
19fa826493
60 muutettua tiedostoa jossa 2674 lisäystä ja 14 poistoa
  1. 4 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java
  2. 206 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/MarketingMgrController.java
  3. 94 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  4. 94 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java
  5. 154 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/MarketingController.java
  6. 4 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelCertifyStatusEnum.java
  7. 65 0
      mp-common/src/main/java/com/qs/mp/common/enums/MarketingStatusEnum.java
  8. 4 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java
  9. 40 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserTypeEnum.java
  10. 123 0
      mp-service/src/main/java/com/qs/mp/admin/domain/Marketing.java
  11. 103 0
      mp-service/src/main/java/com/qs/mp/admin/domain/MarketingAwards.java
  12. 127 0
      mp-service/src/main/java/com/qs/mp/admin/domain/MarketingAwardsPrize.java
  13. 36 0
      mp-service/src/main/java/com/qs/mp/admin/domain/excel/ChannelExcel.java
  14. 64 0
      mp-service/src/main/java/com/qs/mp/admin/domain/excel/UserTicketOrderItemExcel.java
  15. 5 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsQueryParam.java
  16. 39 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingAwardsParam.java
  17. 32 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingAwardsPrizeParam.java
  18. 49 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingCreateParam.java
  19. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingQueryParam.java
  20. 52 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingUpdateParam.java
  21. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserTicketOrderQueryParam.java
  22. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/MarketingAwardsVO.java
  23. 68 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/MarketingListVO.java
  24. 37 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/MarketingUserCodeListVO.java
  25. 23 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/MarketingVO.java
  26. 71 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderItemVO.java
  27. 3 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderListVO.java
  28. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/MarketingAwardsMapper.java
  29. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/MarketingAwardsPrizeMapper.java
  30. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/MarketingMapper.java
  31. 16 0
      mp-service/src/main/java/com/qs/mp/admin/service/IMarketingAwardsPrizeService.java
  32. 16 0
      mp-service/src/main/java/com/qs/mp/admin/service/IMarketingAwardsService.java
  33. 46 0
      mp-service/src/main/java/com/qs/mp/admin/service/IMarketingService.java
  34. 20 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingAwardsPrizeServiceImpl.java
  35. 20 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingAwardsServiceImpl.java
  36. 218 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingServiceImpl.java
  37. 17 4
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelVO.java
  38. 11 0
      mp-service/src/main/java/com/qs/mp/system/domain/SysUser.java
  39. 100 0
      mp-service/src/main/java/com/qs/mp/user/domain/MarketingHitPrize.java
  40. 102 0
      mp-service/src/main/java/com/qs/mp/user/domain/MarketingUserCode.java
  41. 22 0
      mp-service/src/main/java/com/qs/mp/user/domain/param/UserMarketingQueryParam.java
  42. 73 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserMarketingDetailVO.java
  43. 65 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserMarketingListVO.java
  44. 13 0
      mp-service/src/main/java/com/qs/mp/user/mapper/MarketingHitPrizeMapper.java
  45. 25 0
      mp-service/src/main/java/com/qs/mp/user/mapper/MarketingUserCodeMapper.java
  46. 16 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderItemMapper.java
  47. 16 0
      mp-service/src/main/java/com/qs/mp/user/service/IMarketingHitPrizeService.java
  48. 27 0
      mp-service/src/main/java/com/qs/mp/user/service/IMarketingUserCodeService.java
  49. 16 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderItemService.java
  50. 1 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  51. 20 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/MarketingHitPrizeServiceImpl.java
  52. 29 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/MarketingUserCodeServiceImpl.java
  53. 11 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderItemServiceImpl.java
  54. 24 0
      mp-service/src/main/resources/mapper/admin/MarketingAwardsMapper.xml
  55. 27 0
      mp-service/src/main/resources/mapper/admin/MarketingAwardsPrizeMapper.xml
  56. 27 0
      mp-service/src/main/resources/mapper/admin/MarketingMapper.xml
  57. 23 0
      mp-service/src/main/resources/mapper/user/MarketingHitPrizeMapper.xml
  58. 38 0
      mp-service/src/main/resources/mapper/user/MarketingUserCodeMapper.xml
  59. 41 0
      mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml
  60. 9 8
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

+ 4 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java

@@ -98,6 +98,10 @@ public class GoodsMgrController extends BaseApiController {
     queryWrapper.lambda()
         .eq(null != queryParam.getGoodsId() && 0 != queryParam.getGoodsId(),
             Goods::getGoodsId, queryParam.getGoodsId());
+    // 供应商
+    queryWrapper.lambda()
+            .eq(null != queryParam.getSupplierId() && 0 != queryParam.getSupplierId(),
+                    Goods::getSupplierId, queryParam.getSupplierId());
     // 成本
     queryWrapper.lambda()
         .ge(null != queryParam.getMinCost(), Goods::getCost, queryParam.getMinCost());

+ 206 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/MarketingMgrController.java

@@ -0,0 +1,206 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Marketing;
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.qs.mp.admin.domain.param.MarketingCreateParam;
+import com.qs.mp.admin.domain.param.MarketingQueryParam;
+import com.qs.mp.admin.domain.param.MarketingUpdateParam;
+import com.qs.mp.admin.domain.vo.MarketingAwardsVO;
+import com.qs.mp.admin.domain.vo.MarketingListVO;
+import com.qs.mp.admin.domain.vo.MarketingUserCodeListVO;
+import com.qs.mp.admin.domain.vo.MarketingVO;
+import com.qs.mp.admin.service.IMarketingAwardsPrizeService;
+import com.qs.mp.admin.service.IMarketingAwardsService;
+import com.qs.mp.admin.service.IMarketingService;
+import com.qs.mp.common.annotation.Log;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.enums.UserTypeEnum;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.service.IMarketingUserCodeService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 营销活动管理相关接口
+ * @author Cup
+ * @date 2022/5/16
+ */
+@RestController
+@RequestMapping("/api/v1/mp/admin/marketing")
+@Api(tags = "营销活动管理相关接口")
+public class MarketingMgrController extends BaseApiController {
+
+    @Autowired
+    private IMarketingService marketingService;
+
+    @Autowired
+    private IMarketingAwardsService marketingAwardsService;
+
+    @Autowired
+    private IMarketingAwardsPrizeService marketingAwardsPrizeService;
+
+    @Autowired
+    private IMarketingUserCodeService marketingUserCodeService;
+
+    @Log(title = "营销活动新增", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "营销活动新增")
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermi('business:marketing:add')")
+    public AjaxResult create(@Validated @RequestBody MarketingCreateParam marketingCreateParam) {
+        marketingService.createMarketing(marketingCreateParam);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('business:marketing:edit')")
+    @ApiOperation("修改营销活动")
+    public AjaxResult update(@Validated @RequestBody MarketingUpdateParam marketingUpdateParam) {
+        marketingService.updateMarketing(marketingUpdateParam);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('business:marketing:list')")
+    @ApiOperation("营销活动列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "营销活动列表",response = MarketingListVO.class)
+    )
+    public TableDataInfo list(@RequestBody MarketingQueryParam marketingQueryParam) {
+        startPage();
+        List<MarketingListVO> list =  marketingService.listMarketing(marketingQueryParam);
+        return getDataTable(list);
+    }
+
+    @PostMapping("/detail/{id}")
+    @PreAuthorize("@ss.hasPermi('business:marketing:query')")
+    @ApiOperation("活动详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "活动详情",response = MarketingVO.class)
+    )
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        MarketingVO marketingVO = new MarketingVO();
+        Marketing marketing = marketingService.getById(id);
+        if (Objects.isNull(marketing)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+        BeanUtils.copyProperties(marketing, marketingVO);
+
+        // 获取奖级信息
+        List<MarketingAwards> marketingAwardsList = marketingAwardsService.list(new LambdaQueryWrapper<MarketingAwards>()
+                .eq(MarketingAwards::getMarketingId, id)
+                .orderByAsc(MarketingAwards::getSort));
+
+        List<MarketingAwardsVO> marketingAwardsVOS = marketingAwardsList.stream().map(marketingAwards -> {
+            MarketingAwardsVO marketingAwardsVO = new MarketingAwardsVO();
+            BeanUtils.copyProperties(marketingAwards, marketingAwardsVO);
+            List<MarketingAwardsPrize> marketingAwardsPrizeList = marketingAwardsPrizeService.list(new LambdaQueryWrapper<MarketingAwardsPrize>()
+                    .eq(MarketingAwardsPrize::getAwardsId, marketingAwards.getId()));
+            marketingAwardsVO.setPrizeList(marketingAwardsPrizeList);
+            return marketingAwardsVO;
+        }).collect(Collectors.toList());
+
+        marketingVO.setAwardsList(marketingAwardsVOS);
+
+        return AjaxResult.success(marketingVO);
+    }
+
+
+    @PostMapping("/on/{id}")
+    @PreAuthorize("@ss.hasPermi('business:marketing:on')")
+    @ApiOperation("开启活动")
+    public AjaxResult putOn(@PathVariable("id") Long id) {
+        Marketing marketing = marketingService.getById(id);
+        if (Objects.isNull(marketing)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+        if (MarketingStatusEnum.CLOSE.getValue().equals(marketing.getIsOn())) {
+            return AjaxResult.error("已关闭的活动不支持开启");
+        }
+
+        if (MarketingStatusEnum.ON.getValue().equals(marketing.getIsOn())) {
+            return AjaxResult.error("频繁操作,请刷新后重试");
+        }
+
+        // 开启活动
+        marketingService.update(new LambdaUpdateWrapper<Marketing>()
+                .set(Marketing::getIsOn, MarketingStatusEnum.ON.getValue())
+                .eq(Marketing::getId, id));
+
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/off/{id}")
+    @PreAuthorize("@ss.hasPermi('business:marketing:off')")
+    @ApiOperation("关闭活动")
+    public AjaxResult putOff(@PathVariable("id") Long id) {
+        Marketing marketing = marketingService.getById(id);
+        if (Objects.isNull(marketing)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+        if (MarketingStatusEnum.CLOSE.getValue().equals(marketing.getIsOn())) {
+            return AjaxResult.error("频繁操作,请刷新后重试");
+        }
+
+        // 关闭活动
+        marketingService.update(new LambdaUpdateWrapper<Marketing>()
+                .set(Marketing::getIsOn, MarketingStatusEnum.CLOSE.getValue())
+                .eq(Marketing::getId, id));
+
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/delete/{id}")
+    @PreAuthorize("@ss.hasPermi('business:marketing:remove')")
+    @ApiOperation("删除活动")
+    public AjaxResult delete(@PathVariable("id") Long id) {
+        Marketing marketing = marketingService.getById(id);
+        if (Objects.isNull(marketing)) {
+            return AjaxResult.error("活动信息不存在");
+        }
+
+        if (!MarketingStatusEnum.OFF.getValue().equals(marketing.getIsOn())) {
+            return AjaxResult.error("频繁操作,请刷新后重试");
+        }
+        marketingService.deleteById(id);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/data/{id}")
+    @PreAuthorize("@ss.hasPermi('business:marketing:queryData')")
+    @ApiOperation("活动数据")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "success",response = MarketingUserCodeListVO.class)
+    )
+    public TableDataInfo dataInfo(@PathVariable("id") Long id) {
+        startPage();
+        QueryWrapper<MarketingUserCode> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.marketing_id", id);
+        queryWrapper.eq("t1.user_type", UserTypeEnum.ORDINARY.getValue());
+
+        queryWrapper.orderByAsc("t4.sort");
+        queryWrapper.orderByDesc("t1.created_time");
+
+        List<MarketingUserCodeListVO> list = marketingUserCodeService.listMarketingUserCodeByQueryWrapper(queryWrapper);
+        return getDataTable(list);
+    }
+
+}

+ 94 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -3,6 +3,8 @@ package com.qs.mp.web.controller.api.admin;
 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.excel.ChannelExcel;
+import com.qs.mp.admin.domain.excel.UserTicketOrderItemExcel;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
@@ -28,21 +30,26 @@ import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.service.IUserTicketOrderService;
+import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import ma.glasnost.orika.MapperFacade;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -54,10 +61,9 @@ import org.springframework.web.bind.annotation.RestController;
  * @create 2022-02-28 16:17:48
  * @describe 经销商管理前端控制器
  */
-@Api("经销商管理API")
+@Api(tags = "经销商管理API")
 @RestController
 @RequestMapping("/api/v1/mp/admin/salesite/*")
-@Component
 public class SaleSiteMgrController extends BaseApiController {
 
 	@Autowired
@@ -89,6 +95,10 @@ public class SaleSiteMgrController extends BaseApiController {
 	 */
 	@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();
@@ -154,6 +164,84 @@ public class SaleSiteMgrController extends BaseApiController {
 		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());
+			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 "";
+	}
+
+
 	/**
 	 * 查询所有渠道列表
 	 *
@@ -161,6 +249,10 @@ public class SaleSiteMgrController extends BaseApiController {
 	 */
 	@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>();

+ 94 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java

@@ -3,20 +3,25 @@ package com.qs.mp.web.controller.api.admin;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.excel.UserTicketOrderExcel;
+import com.qs.mp.admin.domain.excel.UserTicketOrderItemExcel;
 import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
 import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderItemVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
 import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.PayOrderStatusEnum;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.excel.DeliverOrderExcel;
 import com.qs.mp.user.domain.vo.UserDeliverOrderItemVO;
 import com.qs.mp.user.domain.vo.UserDeliverOrderVO;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
@@ -49,6 +54,10 @@ public class UserTicketOrderMgrController extends BaseApiController {
     @Autowired
     private IUserTicketOrderService userTicketOrderService;
 
+
+    @Autowired
+    private IUserTicketOrderItemService userTicketOrderItemService;
+
     @PostMapping("/list")
     @PreAuthorize("@ss.hasPermi('order:userTicket:list')")
     @ApiOperation("用户盲票订单列表")
@@ -73,6 +82,9 @@ public class UserTicketOrderMgrController extends BaseApiController {
         if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
             queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
         }
+        if (Objects.nonNull(userTicketOrderQueryParam.getChannelId()) && userTicketOrderQueryParam.getChannelId() != 0) {
+            queryWrapper.eq("t1.channel_id", userTicketOrderQueryParam.getChannelId());
+        }
 
         queryWrapper.orderByDesc("t1.created_time");
 
@@ -112,6 +124,9 @@ public class UserTicketOrderMgrController extends BaseApiController {
         if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
             queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
         }
+        if (Objects.nonNull(userTicketOrderQueryParam.getChannelId()) && userTicketOrderQueryParam.getChannelId() != 0) {
+            queryWrapper.eq("t1.channel_id", userTicketOrderQueryParam.getChannelId());
+        }
         queryWrapper.orderByDesc("t1.created_time");
         int totalSize = userTicketOrderService.countUserTicketOrder(queryWrapper);
         if (totalSize == 0) {
@@ -158,4 +173,83 @@ public class UserTicketOrderMgrController extends BaseApiController {
     }
 
 
+    @Log(title = "销售订单盲票导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/ticket/export")
+    @PreAuthorize("@ss.hasPermi('order:userTicket:ticketExport')")
+    @ApiOperation("销售订单盲票导出")
+    public AjaxResult ticketExport(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
+        QueryWrapper<UserTicketOrderItem> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
+            queryWrapper.like("t2.title", userTicketOrderQueryParam.getBoxTitle());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
+            queryWrapper.eq("t2.resource", userTicketOrderQueryParam.getBoxType());
+        }
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
+            queryWrapper.eq("t8.phonenumber", userTicketOrderQueryParam.getPhone());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStatus())) {
+            queryWrapper.eq("t2.status", userTicketOrderQueryParam.getStatus());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
+            queryWrapper.between("t2.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getChannelId()) && userTicketOrderQueryParam.getChannelId() != 0) {
+            queryWrapper.eq("t2.channel_id", userTicketOrderQueryParam.getChannelId());
+        }
+        queryWrapper.orderByDesc("t2.created_time");
+
+        int totalSize = userTicketOrderItemService.countUserTicketOrderItem(queryWrapper);
+        if (totalSize == 0) {
+            return AjaxResult.error("没有符合条件的用户订单");
+        }
+
+        int pageSize = 2000;
+        List<UserTicketOrderItemVO> userTicketOrderItemVOList = new ArrayList<>();
+        if (totalSize > pageSize) {
+            int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
+            for (int i = 0; i < totalPage; i++) {
+                queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
+                List<UserTicketOrderItemVO> list = userTicketOrderItemService.listUserTicketOrderItem(queryWrapper);
+                if (CollectionUtils.isNotEmpty(list)) {
+                    userTicketOrderItemVOList.addAll(list);
+                }
+            }
+        } else {
+            userTicketOrderItemVOList = userTicketOrderItemService.listUserTicketOrderItem(queryWrapper);
+        }
+
+        List<UserTicketOrderItemExcel> excelList = userTicketOrderItemVOList.stream().map(userTicketOrderItemVO -> {
+            UserTicketOrderItemExcel userTicketOrderItemExcel = new UserTicketOrderItemExcel();
+            BeanUtils.copyProperties(userTicketOrderItemVO, userTicketOrderItemExcel);
+            if (Objects.nonNull(userTicketOrderItemVO.getSalePrice())) {
+                userTicketOrderItemExcel.setSalePrice(new BigDecimal(userTicketOrderItemVO.getSalePrice()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
+            }
+            if (Objects.nonNull(userTicketOrderItemVO.getTicketType())) {
+                userTicketOrderItemExcel.setTicketType(userTicketOrderItemVO.getTicketType().getDesc());
+            }
+
+            if (Objects.nonNull(userTicketOrderItemVO.getTicketStatus())) {
+                userTicketOrderItemExcel.setTicketStatus(userTicketOrderItemVO.getTicketStatus().getDesc());
+            }
+
+            if (Objects.nonNull(userTicketOrderItemVO.getOrderStatus())) {
+                userTicketOrderItemExcel.setOrderStatus(userTicketOrderItemVO.getOrderStatus().getDesc());
+            }
+
+            // 如果为盲豆,拼接盲豆数量
+            if (Objects.nonNull(userTicketOrderItemVO.getPrizeType()) && TicketPrizeTypeEnum.COIN.equals(userTicketOrderItemVO.getPrizeType())) {
+                if (StringUtils.isNotBlank(userTicketOrderItemVO.getPrizeName()) && Objects.nonNull(userTicketOrderItemVO.getValue())) {
+                    userTicketOrderItemExcel.setPrizeName(userTicketOrderItemVO.getPrizeName() + "x" + userTicketOrderItemVO.getValue());
+                }
+            }
+            return userTicketOrderItemExcel;
+        }).collect(Collectors.toList());
+
+        ExcelUtil<UserTicketOrderItemExcel> util = new ExcelUtil<>(UserTicketOrderItemExcel.class);
+        return util.exportExcel(excelList, "销售订单盲票导出", false);
+    }
+
+
+
 }

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

@@ -0,0 +1,154 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.Marketing;
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.qs.mp.admin.domain.vo.MarketingAwardsVO;
+import com.qs.mp.admin.service.IMarketingAwardsPrizeService;
+import com.qs.mp.admin.service.IMarketingAwardsService;
+import com.qs.mp.admin.service.IMarketingService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.domain.param.UserMarketingQueryParam;
+import com.qs.mp.user.domain.vo.UserMarketingDetailVO;
+import com.qs.mp.user.domain.vo.UserMarketingListVO;
+import com.qs.mp.user.service.IMarketingHitPrizeService;
+import com.qs.mp.user.service.IMarketingUserCodeService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author Cup
+ * @date 2022/5/17
+ */
+@RestController
+@RequestMapping("/api/v1/mp/user/marketing")
+@Api(tags = "营销活动相关接口")
+public class MarketingController extends BaseApiController {
+
+    @Autowired
+    private IMarketingService marketingService;
+
+    @Autowired
+    private IMarketingHitPrizeService marketingHitPrizeService;
+
+    @Autowired
+    private IMarketingAwardsService marketingAwardsService;
+
+    @Autowired
+    private IMarketingAwardsPrizeService marketingAwardsPrizeService;
+
+    @Autowired
+    private IMarketingUserCodeService marketingUserCodeService;
+
+    @PostMapping("list")
+    @ApiOperation("获取营销活动列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserMarketingListVO.class)
+    )
+    public TableDataInfo list(@Validated @RequestBody UserMarketingQueryParam userMarketingQueryParam) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        startPage();
+        LambdaQueryWrapper<Marketing> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Marketing::getIsOn, MarketingStatusEnum.ON.getValue());
+        queryWrapper.eq(Marketing::getTriggerStatus, userMarketingQueryParam.getTriggerStatus());
+        if (userMarketingQueryParam.getTriggerStatus() == 0) {
+            // 已开启的列表
+            Date now = DateUtils.getNowDate();
+            // 结束时间大于当前时间的
+            queryWrapper.gt(Marketing::getEndTime, now);
+            queryWrapper.orderByAsc(Marketing::getStartTime);
+            queryWrapper.orderByAsc(Marketing::getEndTime);
+        }else if(userMarketingQueryParam.getTriggerStatus() == 1) {
+            // 开奖的排序
+            queryWrapper.orderByDesc(Marketing::getEndTime);
+        }
+        List<UserMarketingListVO> userMarketingListVOList = new ArrayList<>();
+        List<Marketing> list = marketingService.list(queryWrapper);
+        if (CollectionUtils.isNotEmpty(list)) {
+            userMarketingListVOList = list.stream().map(marketing -> {
+                UserMarketingListVO userMarketingListVO = new UserMarketingListVO();
+                BeanUtils.copyProperties(marketing, userMarketingListVO);
+                if (userMarketingQueryParam.getTriggerStatus() == 1) {
+                    int count = marketingHitPrizeService.count(new LambdaQueryWrapper<MarketingHitPrize>()
+                            .eq(MarketingHitPrize::getMarketingId, marketing.getId())
+                            .eq(MarketingHitPrize::getUserId, userId));
+                    userMarketingListVO.setIsHit(count);
+                }
+                return userMarketingListVO;
+            }).collect(Collectors.toList());
+        }
+
+        return getDataTable(userMarketingListVOList);
+    }
+
+    @PostMapping("/detail/{id}")
+    @ApiOperation("活动详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserMarketingDetailVO.class)
+    )
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        Marketing marketing = marketingService.getById(id);
+        if (Objects.isNull(marketing)) {
+            return AjaxResult.error("活动不存在");
+        }
+
+        UserMarketingDetailVO userMarketingDetailVO = new UserMarketingDetailVO();
+        BeanUtils.copyProperties(marketing, userMarketingDetailVO);
+
+        List<MarketingAwards> awardsList = marketingAwardsService.list(new LambdaQueryWrapper<MarketingAwards>().eq(MarketingAwards::getMarketingId, id));
+        if (CollectionUtils.isNotEmpty(awardsList)) {
+            List<MarketingAwardsVO> list = awardsList.stream().map(marketingAwards -> {
+                MarketingAwardsVO marketingAwardsVO = new MarketingAwardsVO();
+                BeanUtils.copyProperties(marketingAwards, marketingAwardsVO);
+
+                // 获取奖品信息
+                List<MarketingAwardsPrize> prizeList = marketingAwardsPrizeService.list(new LambdaQueryWrapper<MarketingAwardsPrize>()
+                        .eq(MarketingAwardsPrize::getMarketingId, id)
+                        .eq(MarketingAwardsPrize::getAwardsId, marketingAwards.getId()));
+                marketingAwardsVO.setPrizeList(prizeList);
+                return marketingAwardsVO;
+            }).collect(Collectors.toList());
+
+            userMarketingDetailVO.setAwardsList(list);
+        }
+
+        // 设置抽奖码列表
+        List<MarketingUserCode> codeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
+                .select(MarketingUserCode::getCode)
+                .eq(MarketingUserCode::getMarketingId, id)
+                .eq(MarketingUserCode::getUserId, userId));
+
+        if (CollectionUtils.isNotEmpty(codeList)) {
+            userMarketingDetailVO.setCodeList(codeList.stream().map(MarketingUserCode::getCode).collect(Collectors.toList()));
+        }
+
+        return AjaxResult.success(userMarketingDetailVO);
+    }
+
+
+
+}

+ 4 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelCertifyStatusEnum.java

@@ -29,6 +29,10 @@ public enum ChannelCertifyStatusEnum implements IEnum<String> {
     return value;
   }
 
+  public String getDesc() {
+    return desc;
+  }
+
   /**
    * 重写toString,单个转化成json
    * @return

+ 65 - 0
mp-common/src/main/java/com/qs/mp/common/enums/MarketingStatusEnum.java

@@ -0,0 +1,65 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 活动状态枚举类
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动状态枚举类")
+public enum MarketingStatusEnum implements IEnum<Integer> {
+
+    CLOSE(-1, "已关闭"),
+
+    OFF(0,"草稿"),
+
+    ON(1,"开启"),
+
+    UNSTART(2,"未开始"),
+
+    START(3,"进行中"),
+
+    END(4,"已结束");
+
+    private Integer value;
+    private String desc;
+
+    MarketingStatusEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+
+    public static MarketingStatusEnum getByValue(Integer value) {
+        for (MarketingStatusEnum statusEnum : MarketingStatusEnum.values()) {
+            if (statusEnum.getValue().equals(value)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}

+ 4 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java

@@ -29,6 +29,10 @@ public enum TicketStatusEnum implements IEnum<Integer> {
     return value;
   }
 
+  public String getDesc() {
+    return desc;
+  }
+
   /**
    * 重写toString,单个转化成json
    * @return

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

@@ -0,0 +1,40 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 用户类型枚举类
+ * @author Cup
+ * @date 2022/5/17
+ */
+@ApiModel("用户类型枚举类")
+public enum UserTypeEnum implements IEnum<String> {
+
+    ORDINARY("00", "普通用户"),
+
+    INSIDE("11", "内部用户");
+
+
+    private String value;
+
+    private String desc;
+
+    UserTypeEnum(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+
+    public String getDesc() {
+        return desc;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+
+
+}

+ 123 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/Marketing.java

@@ -0,0 +1,123 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 营销活动表实体类
+ * @auther quanshu
+ * @create 2022-05-16 14:25:44
+ */
+@TableName("mp_marketing")
+@Data
+@ApiModel("营销活动表实体类")
+public class Marketing implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 活动id,主键
+     */
+    @ApiModelProperty(value = "活动id,主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 活动标题
+     */
+    @ApiModelProperty("活动标题")
+    @TableField("title")
+    private String title;
+
+    /**
+     * 活动主图
+     */
+    @ApiModelProperty("活动主图")
+    @TableField("pic_url")
+    private String picUrl;
+
+    /**
+     * 真实人数
+     */
+    @ApiModelProperty("真实人数")
+    @TableField("real_num")
+    private Integer realNum;
+
+    /**
+     * 虚假人数
+     */
+    @ApiModelProperty("虚假人数")
+    @TableField("fake_num")
+    private Integer fakeNum;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty("开始时间")
+    @TableField("start_time")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty("结束时间")
+    @TableField("end_time")
+    private Date endTime;
+
+    /**
+     * 活动描述
+     */
+    @ApiModelProperty("活动描述")
+    @TableField("description")
+    private String description;
+
+    /**
+     * 是否开启: -1关闭,0待开启, 1开启  默认0
+     */
+    @ApiModelProperty("是否开启: -1关闭,0待开启, 1开启  默认0")
+    @TableField("is_on")
+    private Integer isOn;
+
+    /**
+     * 开奖状态: 0未开奖,1已开奖, 默认0
+     */
+    @ApiModelProperty("开奖状态: 0未开奖,1已开奖, 默认0")
+    @TableField("trigger_status")
+    private Integer triggerStatus;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 103 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/MarketingAwards.java

@@ -0,0 +1,103 @@
+package com.qs.mp.admin.domain;
+
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 营销活动奖项设置实体类
+ * @auther quanshu
+ * @create 2022-05-16 14:29:18
+ */
+@TableName("mp_marketing_awards")
+@Data
+@ApiModel("营销活动奖项设置实体类")
+public class MarketingAwards implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 奖项id
+     */
+    @ApiModelProperty("奖项id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 营销活动id
+     */
+    @ApiModelProperty("营销活动id")
+    @TableField("marketing_id")
+    private Long marketingId;
+
+    /**
+     * 奖项名
+     */
+    @ApiModelProperty("奖项名")
+    @TableField("name")
+    private String name;
+
+    /**
+     * 奖项顺序
+     */
+    @ApiModelProperty("奖项顺序")
+    @TableField("sort")
+    private Integer sort;
+
+    /**
+     * 奖项数量
+     */
+    @ApiModelProperty("奖项数量")
+    @TableField("quantity")
+    private Integer quantity;
+
+
+    @ApiModelProperty("内定数量")
+    @TableField("inside_num")
+    private Integer insideNum;
+
+    /**
+     * 奖项描述
+     */
+    @ApiModelProperty("奖项描述")
+    @TableField("memo")
+    private String memo;
+
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 127 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/MarketingAwardsPrize.java

@@ -0,0 +1,127 @@
+package com.qs.mp.admin.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 营销活动奖项对应奖品设置实体类
+ * @auther quanshu
+ * @create 2022-05-16 14:29:31
+ */
+@TableName("mp_marketing_awards_prize")
+@Data
+@ApiModel("营销活动奖项对应奖品设置实体类")
+public class MarketingAwardsPrize implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 奖品ID
+     */
+    @ApiModelProperty("奖品ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 营销活动id
+     */
+    @ApiModelProperty("营销活动id")
+    @TableField("marketing_id")
+    private Long marketingId;
+
+    /**
+     * 奖项ID
+     */
+    @ApiModelProperty("奖项ID")
+    @TableField("awards_id")
+    private Long awardsId;
+
+    /**
+     * 奖品ID(GOODS_ID或TEMPL_ID)
+     */
+    @ApiModelProperty("奖品ID(GOODS_ID或TEMPL_ID)")
+    @TableField("ref_id")
+    private String refId;
+
+    /**
+     * 奖品图片
+     */
+    @ApiModelProperty("奖品图片")
+    @TableField("pic_url")
+    private String picUrl;
+
+    /**
+     * 奖品名称
+     */
+    @ApiModelProperty("奖品名称")
+    @TableField("title")
+    private String title;
+
+    /**
+     * 奖品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包
+     */
+    @ApiModelProperty("奖品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    @TableField("prize_type")
+    private TicketPrizeTypeEnum prizeType;
+
+    /**
+     * 奖品数
+     */
+    @ApiModelProperty("奖品数")
+    @TableField("quantity")
+    private Integer quantity;
+
+    /**
+     * 奖品价值
+     */
+    @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;
+
+
+}

+ 36 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/excel/ChannelExcel.java

@@ -0,0 +1,36 @@
+package com.qs.mp.admin.domain.excel;
+
+import com.qs.mp.common.annotation.Excel;
+import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
+import com.qs.mp.common.enums.SiteTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 经销商导出
+ * @author Cup
+ * @date 2022/5/13
+ */
+@ApiModel("经销商导出")
+@Data
+public class ChannelExcel {
+
+    @Excel(name = "经销商编号")
+    private Long channelId;
+
+    @Excel(name = "经销商名称")
+    private String name;
+
+    @Excel(name = "经销商认证状态")
+    private String certifyStatus;
+
+    @Excel(name = "经销商佣金比例(%)")
+    private BigDecimal commRate;
+
+    @Excel(name = "上级渠道")
+    String parentsName;
+
+}

+ 64 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/excel/UserTicketOrderItemExcel.java

@@ -0,0 +1,64 @@
+package com.qs.mp.admin.domain.excel;
+
+import com.qs.mp.common.annotation.Excel;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户盲票相关导出
+ * @author Cup
+ * @date 2022/5/13
+ */
+@ApiModel("用户盲票订单明细相关导出")
+@Data
+public class UserTicketOrderItemExcel {
+
+    @Excel(name = "盲票序列号")
+    private String serialNo;
+
+    @Excel(name = "盲票名称")
+    private String ticketTitle;
+
+    @Excel(name = "盲票类型")
+    private String ticketType;
+
+    @Excel(name = "盲票售价(元)")
+    private BigDecimal salePrice;
+
+    @Excel(name = "佣金系数(%)")
+    private BigDecimal saleCommRate;
+
+    @Excel(name = "盲票状态")
+    private String ticketStatus;
+
+    @Excel(name = "奖级")
+    private String awardsName;
+
+    @Excel(name = "奖品")
+    private String prizeName;
+
+    @Excel(name = "订单编号")
+    private String orderId;
+
+    @Excel(name = "订单状态")
+    private String orderStatus;
+
+    @Excel(name = "下单时间")
+    private Date createdTime;
+
+    @Excel(name = "用户昵称")
+    private String userName;
+
+    @Excel(name = "用户手机号")
+    private String userPhone;
+
+    @Excel(name = "经销商")
+    private String channelName;
+}

+ 5 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/GoodsQueryParam.java

@@ -33,6 +33,11 @@ public class GoodsQueryParam {
 	@ApiModelProperty(value = "商品名称", required = true)
 	private String title;
 
+
+	@ApiModelProperty(value = "供应商id", required = false)
+	private Long supplierId;
+
+
 	/**
 	 * 最低成本
 	 */

+ 39 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingAwardsParam.java

@@ -0,0 +1,39 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel(value= "营销活动奖级入参类")
+@Data
+public class MarketingAwardsParam {
+
+
+    @NotEmpty(message = "奖品列表不能为空")
+    @ApiModelProperty(value = "奖品列表",required=true)
+    List<MarketingAwardsPrizeParam> prizeList;
+
+    @NotNull(message = "奖级名称不能为空")
+    @ApiModelProperty(value = "奖级名称",required=true)
+    private String name;
+
+    @NotNull(message = "奖级数量不能为空")
+    @ApiModelProperty(value = "奖级数量",required=true)
+    private Integer quantity;
+
+    @NotNull(message = "内定数量不能为空")
+    @ApiModelProperty(value = "内定数量",required = true)
+    private Integer insideNum;
+
+    @NotNull(message = "奖级顺序不能为空")
+    @ApiModelProperty(value = "奖级顺序",required=true)
+    private Integer sort;
+}

+ 32 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingAwardsPrizeParam.java

@@ -0,0 +1,32 @@
+package com.qs.mp.admin.domain.param;
+
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动奖级对应奖品入参类")
+@Data
+public class MarketingAwardsPrizeParam {
+
+    @NotNull(message = "奖品关联ID不能为空")
+    @ApiModelProperty(value = "奖品关联ID",required=true)
+    private String refId;
+
+    @NotNull(message = "奖品类型不能为空")
+    @ApiModelProperty(value = "奖品类型",required=true)
+    private TicketPrizeTypeEnum prizeType;
+
+    @NotNull(message = "奖品数量不能为空")
+    @ApiModelProperty(value = "奖品数量",required=true)
+    private Integer quantity;
+
+    @ApiModelProperty(value = "奖品价值",required=true)
+    private Integer value;
+}

+ 49 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingCreateParam.java

@@ -0,0 +1,49 @@
+package com.qs.mp.admin.domain.param;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 营销活动创建入参类
+ *
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动创建入参类")
+@Data
+public class MarketingCreateParam {
+
+    @ApiModelProperty(value = "活动标题", required = true)
+    @NotBlank(message = "活动标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "活动主图", required = true)
+    @NotBlank(message = "活动主图不能为空")
+    private String picUrl;
+
+    @ApiModelProperty(value = "初始人数", required = true)
+    private Integer fakeNum;
+
+    @ApiModelProperty(value = "开始时间", required = true)
+    @NotNull(message = "开始时间不能为空")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间", required = true)
+    @NotNull(message = "结束时间不能为空")
+    private Date endTime;
+
+    @ApiModelProperty(value = "活动描述",required = false)
+    private String description;
+
+    @NotEmpty(message = "奖级列表不能为空")
+    @ApiModelProperty(value = "奖级列表", required = true)
+    List<MarketingAwardsParam> awardsList;
+}

+ 23 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingQueryParam.java

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 营销活动查询入参类
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动查询入参类")
+@Data
+public class MarketingQueryParam {
+
+
+    @ApiModelProperty("营销活动名称")
+    private String title;
+
+    @ApiModelProperty("活动状态:-1关闭,0草稿,1开启,2未开始,3进行中,4已结束")
+    private Integer status;
+
+}

+ 52 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/MarketingUpdateParam.java

@@ -0,0 +1,52 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 营销活动更新入参类
+ *
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动更新入参类")
+@Data
+public class MarketingUpdateParam {
+
+    @ApiModelProperty("营销活动id")
+    @NotNull(message = "营销活动id不能为空")
+    private Long id;
+
+    @ApiModelProperty(value = "活动标题", required = true)
+    @NotBlank(message = "活动标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "活动主图", required = true)
+    @NotBlank(message = "活动主图不能为空")
+    private String picUrl;
+
+    @ApiModelProperty(value = "初始人数", required = true)
+    private Integer fakeNum;
+
+    @ApiModelProperty(value = "开始时间", required = true)
+    @NotNull(message = "开始时间不能为空")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间", required = true)
+    @NotNull(message = "结束时间不能为空")
+    private Date endTime;
+
+    @ApiModelProperty(value = "活动描述",required = false)
+    private String description;
+
+    @NotEmpty(message = "奖级列表不能为空")
+    @ApiModelProperty(value = "奖级列表", required = true)
+    List<MarketingAwardsParam> awardsList;
+}

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

@@ -33,6 +33,9 @@ public class UserTicketOrderQueryParam {
     @ApiModelProperty("订单状态;-1 已取消 0:待付款 1:已完成")
     private Integer status;
 
+    @ApiModelProperty("经销商id")
+    private Long channelId;
+
     @ApiModelProperty("开始时间")
     private Date startTime;
 

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

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 营销活动奖项出参类
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动奖项出参类")
+@Data
+public class MarketingAwardsVO extends MarketingAwards {
+
+    @ApiModelProperty("奖品列表")
+    List<MarketingAwardsPrize> prizeList;
+}

+ 68 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/MarketingListVO.java

@@ -0,0 +1,68 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * 营销活动列表出参类
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动列表出参类")
+@Data
+public class MarketingListVO {
+
+    @ApiModelProperty(value = "活动id,主键")
+    private Long id;
+
+    @ApiModelProperty("活动标题")
+    private String title;
+
+    @ApiModelProperty("真实人数")
+    private Integer realNum;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+    @ApiModelProperty("是否开启: -1关闭,0待开启, 1开启 ")
+    private Integer isOn;
+
+    @ApiModelProperty("活动状态-1关闭,0待开启,1开启,2未开始,3进行中,4已结束")
+    private String status;
+
+    public String getStatus() {
+
+        if (MarketingStatusEnum.OFF.getValue().equals(this.isOn)) {
+            return MarketingStatusEnum.OFF.toString();
+        }
+        if (MarketingStatusEnum.CLOSE.getValue().equals(this.isOn)) {
+            return MarketingStatusEnum.CLOSE.toString();
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (now.before(this.startTime)) {
+            return MarketingStatusEnum.UNSTART.toString();
+        }
+
+        if (now.after(this.endTime)) {
+            return MarketingStatusEnum.END.toString();
+        }
+
+        return MarketingStatusEnum.START.toString();
+    }
+
+}

+ 37 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/MarketingUserCodeListVO.java

@@ -0,0 +1,37 @@
+package com.qs.mp.admin.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 活动抽奖码列表数据出参类
+ * @author Cup
+ * @date 2022/5/17
+ */
+@ApiModel("活动抽奖码列表数据出参类")
+@Data
+public class MarketingUserCodeListVO {
+
+
+    @ApiModelProperty("用户编号")
+    private Long userId;
+
+    @ApiModelProperty("用户名称")
+    private String nickName;
+
+    @ApiModelProperty("抽奖码")
+    private String code;
+
+    @ApiModelProperty("抽奖码获取时间")
+    private Date createdTime;
+
+    @ApiModelProperty("奖级")
+    private String awardsName;
+
+    @ApiModelProperty("奖品")
+    private String prizeName;
+
+}

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

@@ -0,0 +1,23 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.admin.domain.Marketing;
+import com.qs.mp.admin.domain.MarketingAwards;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 营销活动详情出参类
+ * @author Cup
+ * @date 2022/5/16
+ */
+@ApiModel("营销活动详情出参类")
+@Data
+public class MarketingVO extends Marketing {
+
+    @ApiModelProperty("奖级列表(后台显示)")
+    List<MarketingAwardsVO> awardsList;
+
+}

+ 71 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderItemVO.java

@@ -0,0 +1,71 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户盲票订单明细相关出参类
+ * @author Cup
+ * @date 2022/5/13
+ */
+@ApiModel("用户盲票订单明细相关出参类")
+@Data
+public class UserTicketOrderItemVO {
+
+    @ApiModelProperty("盲票序列号")
+    private String serialNo;
+
+    @ApiModelProperty("盲票名称")
+    private String ticketTitle;
+
+    @ApiModelProperty("盲票类型")
+    private TicketTypeEnum ticketType;
+
+    @ApiModelProperty("盲票售价")
+    private Integer salePrice;
+
+    @ApiModelProperty("佣金系数")
+    private BigDecimal saleCommRate;
+
+    @ApiModelProperty("盲票状态")
+    private TicketStatusEnum ticketStatus;
+
+    @ApiModelProperty("奖级")
+    private String awardsName;
+
+    @ApiModelProperty("奖品")
+    private String prizeName;
+
+    @ApiModelProperty("价值")
+    private Integer value;
+
+    @ApiModelProperty("奖品类型")
+    private TicketPrizeTypeEnum prizeType;
+
+    @ApiModelProperty("订单编号")
+    private String orderId;
+
+    @ApiModelProperty("订单状态")
+    private UserTicketOrderStatusEnum orderStatus;
+
+    @ApiModelProperty("下单时间")
+    private Date createdTime;
+
+    @ApiModelProperty("用户昵称")
+    private String userName;
+
+    @ApiModelProperty("用户手机号")
+    private String userPhone;
+
+    @ApiModelProperty("经销商")
+    private String channelName;
+
+}

+ 3 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderListVO.java

@@ -54,6 +54,9 @@ public class UserTicketOrderListVO {
     @ApiModelProperty("手机号")
     private String phone;
 
+    @ApiModelProperty("经销商")
+    private String channelName;
+
 
     @ApiModelProperty("创建时间")
     private Date createdTime;

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/MarketingAwardsMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-05-16 14:29:18
+ * @describe 营销活动奖项设置mapper类
+ */
+public interface MarketingAwardsMapper extends BaseMapper<MarketingAwards> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/MarketingAwardsPrizeMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-05-16 14:29:31
+ * @describe 营销活动奖项对应奖品设置mapper类
+ */
+public interface MarketingAwardsPrizeMapper extends BaseMapper<MarketingAwardsPrize> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/MarketingMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.Marketing;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-05-16 14:25:44
+ * @describe 营销活动表mapper类
+ */
+public interface MarketingMapper extends BaseMapper<Marketing> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IMarketingAwardsPrizeService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 营销活动奖项对应奖品设置 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+public interface IMarketingAwardsPrizeService extends IService<MarketingAwardsPrize> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IMarketingAwardsService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 营销活动奖项设置 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+public interface IMarketingAwardsService extends IService<MarketingAwards> {
+
+}

+ 46 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IMarketingService.java

@@ -0,0 +1,46 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.Marketing;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.admin.domain.param.MarketingCreateParam;
+import com.qs.mp.admin.domain.param.MarketingQueryParam;
+import com.qs.mp.admin.domain.param.MarketingUpdateParam;
+import com.qs.mp.admin.domain.vo.MarketingListVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 营销活动表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+public interface IMarketingService extends IService<Marketing> {
+
+    /**
+     * 创建营销活动
+     * @param marketingCreateParam
+     */
+    void createMarketing(MarketingCreateParam marketingCreateParam);
+
+    /**
+     * 更新营销活动
+     * @param marketingUpdateParam
+     */
+    void updateMarketing(MarketingUpdateParam marketingUpdateParam);
+
+    /**
+     * 获取营销活动列表
+     * @param
+     * @return
+     */
+    List<MarketingListVO> listMarketing(MarketingQueryParam marketingQueryParam);
+
+    /**
+     * 根据活动id删除活动相关信息
+     * @param id
+     */
+    void deleteById(Long id);
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingAwardsPrizeServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.admin.service.impl;
+
+import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.qs.mp.admin.mapper.MarketingAwardsPrizeMapper;
+import com.qs.mp.admin.service.IMarketingAwardsPrizeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 营销活动奖项对应奖品设置 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+@Service
+public class MarketingAwardsPrizeServiceImpl extends ServiceImpl<MarketingAwardsPrizeMapper, MarketingAwardsPrize> implements IMarketingAwardsPrizeService {
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingAwardsServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.admin.service.impl;
+
+import com.qs.mp.admin.domain.MarketingAwards;
+import com.qs.mp.admin.mapper.MarketingAwardsMapper;
+import com.qs.mp.admin.service.IMarketingAwardsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 营销活动奖项设置 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+@Service
+public class MarketingAwardsServiceImpl extends ServiceImpl<MarketingAwardsMapper, MarketingAwards> implements IMarketingAwardsService {
+
+}

+ 218 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingServiceImpl.java

@@ -0,0 +1,218 @@
+package com.qs.mp.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.*;
+import com.qs.mp.admin.domain.param.*;
+import com.qs.mp.admin.domain.vo.MarketingListVO;
+import com.qs.mp.admin.mapper.MarketingMapper;
+import com.qs.mp.admin.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.bean.BeanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 营销活动表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+@Service
+public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing> implements IMarketingService {
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private ICouponService couponService;
+
+    @Autowired
+    private ICouponPkgService couponPkgService;
+
+    @Autowired
+    private IMarketingAwardsService marketingAwardsService;
+
+    @Autowired
+    private IMarketingAwardsPrizeService marketingAwardsPrizeService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteById(Long id) {
+        this.removeById(id);
+
+        // 删除奖级和奖品信息
+        marketingAwardsService.remove(new LambdaQueryWrapper<MarketingAwards>().eq(MarketingAwards::getMarketingId, id));
+
+        marketingAwardsPrizeService.remove(new LambdaQueryWrapper<MarketingAwardsPrize>().eq(MarketingAwardsPrize::getMarketingId, id));
+
+    }
+
+    @Override
+    public List<MarketingListVO> listMarketing(MarketingQueryParam marketingQueryParam) {
+        LambdaQueryWrapper<Marketing> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(marketingQueryParam.getTitle())) {
+            queryWrapper.like(Marketing::getTitle, marketingQueryParam.getTitle());
+        }
+
+        if (Objects.nonNull(marketingQueryParam.getStatus())) {
+            if (MarketingStatusEnum.CLOSE.getValue().equals(marketingQueryParam.getStatus()) ||
+                    MarketingStatusEnum.OFF.getValue().equals(marketingQueryParam.getStatus()) ||
+                    MarketingStatusEnum.ON.getValue().equals(marketingQueryParam.getStatus())) {
+                queryWrapper.eq(Marketing::getIsOn, marketingQueryParam.getStatus());
+            }else if (MarketingStatusEnum.UNSTART.getValue().equals(marketingQueryParam.getStatus())){
+                queryWrapper.gt(Marketing::getStartTime, new Date());
+                queryWrapper.eq(Marketing::getIsOn, MarketingStatusEnum.ON.getValue());
+            }else if (MarketingStatusEnum.START.getValue().equals(marketingQueryParam.getStatus())){
+                queryWrapper.le(Marketing::getStartTime, new Date());
+                queryWrapper.ge(Marketing::getEndTime, new Date());
+                queryWrapper.eq(Marketing::getIsOn, MarketingStatusEnum.ON.getValue());
+            }else if (MarketingStatusEnum.END.getValue().equals(marketingQueryParam.getStatus())){
+                queryWrapper.lt(Marketing::getEndTime, new Date());
+                queryWrapper.eq(Marketing::getIsOn, MarketingStatusEnum.ON.getValue());
+            }
+        }
+
+        queryWrapper.orderByDesc(Marketing::getCreatedTime);
+
+
+        List<MarketingListVO> marketingListVOS = new ArrayList<>();
+        List<Marketing> list = this.list(queryWrapper);
+        if (CollectionUtils.isNotEmpty(list)) {
+            marketingListVOS = list.stream().map(marketing -> {
+                MarketingListVO marketingListVO = new MarketingListVO();
+                BeanUtils.copyProperties(marketing, marketingListVO);
+                return marketingListVO;
+            }).collect(Collectors.toList());
+        }
+
+
+        return marketingListVOS;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void createMarketing(MarketingCreateParam marketingCreateParam) {
+        // 保存营销活动
+        Marketing marketing = new Marketing();
+        BeanUtils.copyProperties(marketingCreateParam, marketing);
+
+        if (StringUtils.isNotBlank(marketingCreateParam.getDescription())) {
+            marketing.setDescription(URLDecoder.decode(marketingCreateParam.getDescription()));
+        }
+
+        this.save(marketing);
+
+        // 创建奖级和奖品信息
+        createAwardsAndPrize(marketingCreateParam.getAwardsList(), marketing);
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMarketing(MarketingUpdateParam marketingUpdateParam) {
+        Marketing marketing = this.getById(marketingUpdateParam.getId());
+        if (Objects.isNull(marketing)) {
+            throw new ServiceException("营销活动不存在");
+        }
+
+        if (MarketingStatusEnum.CLOSE.getValue().equals(marketing.getIsOn())) {
+            throw new ServiceException("活动当前状态不支持修改");
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (MarketingStatusEnum.ON.getValue().equals(marketing.getIsOn()) && now.after(marketing.getEndTime())) {
+            throw new ServiceException("活动当前状态不支持修改");
+        }
+
+
+        // 更新营销活动
+        BeanUtils.copyProperties(marketingUpdateParam, marketing);
+
+        if (StringUtils.isNotBlank(marketingUpdateParam.getDescription())) {
+            marketing.setDescription(URLDecoder.decode(marketingUpdateParam.getDescription()));
+        }
+
+        this.updateById(marketing);
+
+        // 删除奖级和奖品信息
+        marketingAwardsService.remove(new LambdaUpdateWrapper<MarketingAwards>().eq(MarketingAwards::getMarketingId, marketing.getId()));
+        marketingAwardsPrizeService.remove(new LambdaUpdateWrapper<MarketingAwardsPrize>().eq(MarketingAwardsPrize::getMarketingId, marketing.getId()));
+
+        // 创建奖级和奖品信息
+        createAwardsAndPrize(marketingUpdateParam.getAwardsList(), marketing);
+    }
+
+    /**
+     * 创建奖级和奖品信息
+     * @param awardsList
+     * @param marketing
+     */
+    private void createAwardsAndPrize(List<MarketingAwardsParam> awardsList, Marketing marketing) {
+        // 创建奖级
+        List<MarketingAwardsPrize> marketingAwardsPrizeList = new ArrayList<>();
+        for (MarketingAwardsParam awardsParam : awardsList) {
+            if (awardsParam.getInsideNum() > awardsParam.getQuantity()) {
+                throw new ServiceException("内定数量不能大于奖品数量");
+            }
+
+            MarketingAwards marketingAwards = new MarketingAwards();
+            BeanUtils.copyProperties(awardsParam, marketingAwards);
+            marketingAwards.setId(null);
+            // 设置活动id
+            marketingAwards.setMarketingId(marketing.getId());
+            marketingAwardsService.save(marketingAwards);
+
+            for (MarketingAwardsPrizeParam prizeParam : awardsParam.getPrizeList()) {
+                MarketingAwardsPrize awardsPrize = new MarketingAwardsPrize();
+                BeanUtils.copyProperties(prizeParam, awardsPrize);
+                awardsPrize.setId(null);
+                awardsPrize.setMarketingId(marketing.getId());
+                awardsPrize.setAwardsId(marketingAwards.getId());
+                if (null == awardsPrize.getQuantity() || 0 == awardsPrize.getQuantity()) {
+                    // 页面没设置奖品的具体数量,则默认为整个奖项的数量
+                    awardsPrize.setQuantity(marketingAwards.getQuantity());
+                }
+                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("md.jpeg");
+                }
+                marketingAwardsPrizeList.add(awardsPrize);
+            }
+        }
+        marketingAwardsPrizeService.saveBatch(marketingAwardsPrizeList);
+    }
+
+
+}

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

@@ -1,6 +1,8 @@
 package com.qs.mp.channel.domain.vo;
 
 import com.qs.mp.channel.domain.Channel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -8,21 +10,32 @@ import lombok.Data;
  * @Date 2022/3/1
  */
 @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; // 线上销售(显示盲票销售张数)
   
   

+ 11 - 0
mp-service/src/main/java/com/qs/mp/system/domain/SysUser.java

@@ -52,6 +52,9 @@ public class SysUser extends BaseEntity
     @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
     private String sex;
 
+    /** 用户类型(00系统用户)(11内部用户) */
+    private String userType;
+
     /** 用户头像 */
     private String avatar;
 
@@ -101,6 +104,14 @@ public class SysUser extends BaseEntity
     private String unionId;  //用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
     private String sessionKey; //会话密钥
 
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
     public void setOpenId(String openId) {
         this.openId = openId;
     }

+ 100 - 0
mp-service/src/main/java/com/qs/mp/user/domain/MarketingHitPrize.java

@@ -0,0 +1,100 @@
+package com.qs.mp.user.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 营销活动中奖信息表实体类
+ * @auther quanshu
+ * @create 2022-05-16 14:29:06
+ */
+@TableName("mp_marketing_hit_prize")
+@Data
+@ApiModel("营销活动中奖信息表实体类")
+public class MarketingHitPrize implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("中奖记录id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 营销活动id
+     */
+    @ApiModelProperty("营销活动id")
+    @TableField("marketing_id")
+    private Long marketingId;
+
+
+    @ApiModelProperty("用户参与码关系id")
+    @TableField("marketing_user_code_id")
+    private Long marketingUserCodeId;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty("用户id")
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 用户类型(00系统用户)(11内部用户)
+     */
+    @ApiModelProperty("用户类型(00系统用户)(11内部用户)")
+    @TableField("user_type")
+    private String userType;
+
+    /**
+     * 奖项id
+     */
+    @ApiModelProperty("奖项id")
+    @TableField("awards_id")
+    private Long awardsId;
+
+    /**
+     * 奖品id
+     */
+    @ApiModelProperty("奖品id")
+    @TableField("prize_id")
+    private Long prizeId;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 102 - 0
mp-service/src/main/java/com/qs/mp/user/domain/MarketingUserCode.java

@@ -0,0 +1,102 @@
+package com.qs.mp.user.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 营销活动用户参与码关系表实体类
+ * @auther quanshu
+ * @create 2022-05-16 14:28:52
+ */
+@TableName("mp_marketing_user_code")
+@Data
+@ApiModel("营销活动用户参与码关系表实体类")
+public class MarketingUserCode implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 营销活动id
+     */
+    @ApiModelProperty("营销活动id")
+    @TableField("marketing_id")
+    private Long marketingId;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty("用户id")
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 用户类型(00系统用户)(11内部用户)
+     */
+    @ApiModelProperty("用户类型(00系统用户)(11内部用户)")
+    @TableField("user_type")
+    private String userType;
+
+    /**
+     * 助力用户id
+     */
+    @ApiModelProperty("助力用户id")
+    @TableField("help_user_id")
+    private Long helpUserId;
+
+    /**
+     * 参与码
+     */
+    @ApiModelProperty("参与码")
+    @TableField("code")
+    private String code;
+
+    /**
+     * 是否中奖 0未中奖,1中奖
+     */
+    @ApiModelProperty("是否中奖 0未中奖,1中奖")
+    @TableField("is_hit")
+    private Integer isHit;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 22 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/UserMarketingQueryParam.java

@@ -0,0 +1,22 @@
+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;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 营销活动查询入参类
+ * @author Cup
+ * @date 2022/5/17
+ */
+@ApiModel("营销活动查询入参类")
+@Data
+public class UserMarketingQueryParam {
+
+    @NotNull(message = "状态不能为空")
+    @ApiModelProperty("开奖状态: 0未开奖,1已开奖")
+    private Integer triggerStatus;
+}

+ 73 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserMarketingDetailVO.java

@@ -0,0 +1,73 @@
+package com.qs.mp.user.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.admin.domain.vo.MarketingAwardsVO;
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 营销活动详情出参类
+ * @author Cup
+ * @date 2022/5/17
+ */
+@ApiModel("营销活动详情出参类")
+@Data
+public class UserMarketingDetailVO {
+
+    @ApiModelProperty("活动id")
+    private Long id;
+
+    @ApiModelProperty("活动标题")
+    private String title;
+
+    @ApiModelProperty("参与人数")
+    private Integer fakeNum;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+    @ApiModelProperty("是否开启: -1关闭,0待开启, 1开启 ")
+    private Integer isOn;
+
+    @ApiModelProperty("活动状态-1关闭,0待开启,1开启,2未开始,3进行中,4已结束")
+    private String status;
+
+    @ApiModelProperty("活动描述")
+    private String description;
+
+    @ApiModelProperty("抽奖码列表")
+    private List<String> codeList;
+
+    @ApiModelProperty("奖级列表")
+    List<MarketingAwardsVO> awardsList;
+
+    public String getStatus() {
+
+        if (MarketingStatusEnum.OFF.getValue().equals(this.isOn)) {
+            return MarketingStatusEnum.OFF.toString();
+        }
+        if (MarketingStatusEnum.CLOSE.getValue().equals(this.isOn)) {
+            return MarketingStatusEnum.CLOSE.toString();
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (now.before(this.startTime)) {
+            return MarketingStatusEnum.UNSTART.toString();
+        }
+
+        if (now.after(this.endTime)) {
+            return MarketingStatusEnum.END.toString();
+        }
+
+        return MarketingStatusEnum.START.toString();
+    }
+}

+ 65 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserMarketingListVO.java

@@ -0,0 +1,65 @@
+package com.qs.mp.user.domain.vo;
+
+import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 盲票营销活动列表出参类
+ * @author Cup
+ * @date 2022/5/17
+ */
+@ApiModel("营销活动列表出参类")
+@Data
+public class UserMarketingListVO {
+
+    @ApiModelProperty("活动id")
+    private Long id;
+
+    @ApiModelProperty("活动标题")
+    private String title;
+
+    @ApiModelProperty("活动主图")
+    private String picUrl;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+    @ApiModelProperty("是否开启: -1关闭,0待开启, 1开启 ")
+    private Integer isOn;
+
+    @ApiModelProperty("是否中奖,0:未中奖,1:中奖")
+    private Integer isHit;
+
+    @ApiModelProperty("活动状态-1关闭,0待开启,1开启,2未开始,3进行中,4已结束")
+    private String status;
+
+    public String getStatus() {
+
+        if (MarketingStatusEnum.OFF.getValue().equals(this.isOn)) {
+            return MarketingStatusEnum.OFF.toString();
+        }
+        if (MarketingStatusEnum.CLOSE.getValue().equals(this.isOn)) {
+            return MarketingStatusEnum.CLOSE.toString();
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (now.before(this.startTime)) {
+            return MarketingStatusEnum.UNSTART.toString();
+        }
+
+        if (now.after(this.endTime)) {
+            return MarketingStatusEnum.END.toString();
+        }
+
+        return MarketingStatusEnum.START.toString();
+    }
+
+}

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

@@ -0,0 +1,13 @@
+package com.qs.mp.user.mapper;
+
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-05-16 14:29:06
+ * @describe 营销活动中奖信息表mapper类
+ */
+public interface MarketingHitPrizeMapper extends BaseMapper<MarketingHitPrize> {
+
+}

+ 25 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/MarketingUserCodeMapper.java

@@ -0,0 +1,25 @@
+package com.qs.mp.user.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.vo.MarketingUserCodeListVO;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2022-05-16 14:28:52
+ * @describe 营销活动用户参与码关系表mapper类
+ */
+public interface MarketingUserCodeMapper extends BaseMapper<MarketingUserCode> {
+
+    /**
+     * 根据参数查询参与码相关信息
+     * @param queryWrapper
+     * @return
+     */
+    List<MarketingUserCodeListVO> listMarketingUserCodeByQueryWrapper(@Param(Constants.WRAPPER) QueryWrapper<MarketingUserCode> queryWrapper);
+}

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderItemVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -30,4 +31,19 @@ public interface UserTicketOrderItemMapper extends BaseMapper<UserTicketOrderIte
    * @return
    */
   List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrderTicketDetailVO> queryWrapper);
+
+  /**
+   * 根据条件获取用户盲票订单明细相关信息
+   * @param queryWrapper
+   * @return
+   */
+  List<UserTicketOrderItemVO> listUserTicketOrderItem(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrderItem> queryWrapper);
+
+  /**
+   * 统计用户盲票订单明细相关数量
+   * @param queryWrapper
+   * @return
+   */
+  int countUserTicketOrderItem(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrderItem> queryWrapper);
+
 }

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

@@ -0,0 +1,16 @@
+package com.qs.mp.user.service;
+
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 营销活动中奖信息表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+public interface IMarketingHitPrizeService extends IService<MarketingHitPrize> {
+
+}

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

@@ -0,0 +1,27 @@
+package com.qs.mp.user.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.vo.MarketingUserCodeListVO;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 营销活动用户参与码关系表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+public interface IMarketingUserCodeService extends IService<MarketingUserCode> {
+
+
+    /**
+     * 根据参数查询抽奖码相关列表信息
+     * @param queryWrapper
+     * @return
+     */
+    List<MarketingUserCodeListVO> listMarketingUserCodeByQueryWrapper(QueryWrapper<MarketingUserCode> queryWrapper);
+}

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

@@ -1,8 +1,10 @@
 package com.qs.mp.user.service;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderItemVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.user.domain.UserTicketOrderItem;
@@ -56,4 +58,18 @@ public interface IUserTicketOrderItemService extends IService<UserTicketOrderIte
    * @return
    */
   List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(String orderId);
+
+  /**
+   * 根据条件获取用户盲票订单明细相关信息
+   * @param queryWrapper
+   * @return
+   */
+  List<UserTicketOrderItemVO> listUserTicketOrderItem(QueryWrapper<UserTicketOrderItem> queryWrapper);
+
+  /**
+   * 统计用户盲票订单明细相关数量
+   * @param queryWrapper
+   * @return
+   */
+  int countUserTicketOrderItem(QueryWrapper<UserTicketOrderItem> queryWrapper);
 }

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

@@ -12,6 +12,7 @@ import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 import com.qs.mp.user.domain.vo.UserShareVO;
 import java.util.List;

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

@@ -0,0 +1,20 @@
+package com.qs.mp.user.service.impl;
+
+import com.qs.mp.user.domain.MarketingHitPrize;
+import com.qs.mp.user.mapper.MarketingHitPrizeMapper;
+import com.qs.mp.user.service.IMarketingHitPrizeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 营销活动中奖信息表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+@Service
+public class MarketingHitPrizeServiceImpl extends ServiceImpl<MarketingHitPrizeMapper, MarketingHitPrize> implements IMarketingHitPrizeService {
+
+}

+ 29 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/MarketingUserCodeServiceImpl.java

@@ -0,0 +1,29 @@
+package com.qs.mp.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.vo.MarketingUserCodeListVO;
+import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.mapper.MarketingUserCodeMapper;
+import com.qs.mp.user.service.IMarketingUserCodeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 营销活动用户参与码关系表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-05-16
+ */
+@Service
+public class MarketingUserCodeServiceImpl extends ServiceImpl<MarketingUserCodeMapper, MarketingUserCode> implements IMarketingUserCodeService {
+
+
+    @Override
+    public List<MarketingUserCodeListVO> listMarketingUserCodeByQueryWrapper(QueryWrapper<MarketingUserCode> queryWrapper) {
+        return getBaseMapper().listMarketingUserCodeByQueryWrapper(queryWrapper);
+    }
+}

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

@@ -2,6 +2,7 @@ package com.qs.mp.user.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderItemVO;
 import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
@@ -26,6 +27,16 @@ import org.springframework.util.CollectionUtils;
 @Service
 public class UserTicketOrderItemServiceImpl extends ServiceImpl<UserTicketOrderItemMapper, UserTicketOrderItem> implements IUserTicketOrderItemService {
 
+  @Override
+  public int countUserTicketOrderItem(QueryWrapper<UserTicketOrderItem> queryWrapper) {
+    return getBaseMapper().countUserTicketOrderItem(queryWrapper);
+  }
+
+  @Override
+  public List<UserTicketOrderItemVO> listUserTicketOrderItem(QueryWrapper<UserTicketOrderItem> queryWrapper) {
+    return getBaseMapper().listUserTicketOrderItem(queryWrapper);
+  }
+
   @Override
   public UserTicketOrderItem queryFinishedOrderItem(Long userId, String ticketId) {
     List<UserTicketOrderItem> itemList = getBaseMapper().listTicketOrderItemVO(new QueryWrapper<UserTicketOrderItem>().eq("t1.ticket_id", ticketId)

+ 24 - 0
mp-service/src/main/resources/mapper/admin/MarketingAwardsMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.admin.mapper.MarketingAwardsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.MarketingAwards">
+        <id column="id" property="id" />
+        <result column="marketing_id" property="marketingId" />
+        <result column="name" property="name" />
+        <result column="sort" property="sort" />
+        <result column="quantity" property="quantity" />
+        <result column="memo" property="memo" />
+        <result column="hit_rate" property="hitRate" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, marketing_id, name, sort, quantity, memo, hit_rate, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 27 - 0
mp-service/src/main/resources/mapper/admin/MarketingAwardsPrizeMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.admin.mapper.MarketingAwardsPrizeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.MarketingAwardsPrize">
+        <id column="id" property="id" />
+        <result column="marketing_id" property="marketingId" />
+        <result column="awards_id" property="awardsId" />
+        <result column="ref_id" property="refId" />
+        <result column="pic_url" property="picUrl" />
+        <result column="title" property="title" />
+        <result column="prize_type" property="prizeType" />
+        <result column="quantity" property="quantity" />
+        <result column="value" property="value" />
+        <result column="sort_weight" property="sortWeight" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, marketing_id, awards_id, ref_id, pic_url, title, prize_type, quantity, value, sort_weight, is_deleted, created_time, updated_time
+    </sql>
+
+</mapper>

+ 27 - 0
mp-service/src/main/resources/mapper/admin/MarketingMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.admin.mapper.MarketingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.Marketing">
+        <id column="id" property="id" />
+        <result column="title" property="title" />
+        <result column="pic_url" property="picUrl" />
+        <result column="real_num" property="realNum" />
+        <result column="fake_num" property="fakeNum" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="description" property="description" />
+        <result column="is_on" property="isOn" />
+        <result column="trigger_status" property="triggerStatus" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, title, pic_url, real_num, fake_num, start_time, end_time, description, is_on, trigger_status, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 23 - 0
mp-service/src/main/resources/mapper/user/MarketingHitPrizeMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.user.mapper.MarketingHitPrizeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.user.domain.MarketingHitPrize">
+        <id column="id" property="id" />
+        <result column="marketing_id" property="marketingId" />
+        <result column="user_id" property="userId" />
+        <result column="user_type" property="userType" />
+        <result column="awards_id" property="awardsId" />
+        <result column="prize_id" property="prizeId" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, marketing_id, user_id, user_type, awards_id, prize_id, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 38 - 0
mp-service/src/main/resources/mapper/user/MarketingUserCodeMapper.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.user.mapper.MarketingUserCodeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.user.domain.MarketingUserCode">
+        <id column="id" property="id" />
+        <result column="marketing_id" property="marketingId" />
+        <result column="user_id" property="userId" />
+        <result column="user_type" property="userType" />
+        <result column="help_user_id" property="helpUserId" />
+        <result column="code" property="code" />
+        <result column="is_hit" property="isHit" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, marketing_id, user_id, user_type, help_user_id, code, is_hit, created_time, updated_time, is_deleted
+    </sql>
+
+    <select id="listMarketingUserCodeByQueryWrapper" resultType="com.qs.mp.admin.domain.vo.MarketingUserCodeListVO">
+        select t1.user_id,
+                t1.code,
+                t1.created_time,
+                t3.nick_name,
+                t4.name awardsName,
+                t5.title prizeName
+        from mp_marketing_user_code t1
+                left join mp_marketing_hit_prize t2 on t1.id = t2.marketing_user_code_id
+                left join sys_user t3 on t1.user_id = t3.user_id
+                left join mp_marketing_awards t4 on t2.awards_id = t4.id
+                left join mp_marketing_awards_prize t5 on t2.prize_id = t5.id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 41 - 0
mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml

@@ -67,4 +67,45 @@
             left join mp_ticket_awards_prize t5 on t3.prize_id = t5.prize_id
         ${ew.customSqlSegment}
     </select>
+
+    <select id="listUserTicketOrderItem" resultType="com.qs.mp.admin.domain.vo.UserTicketOrderItemVO">
+        select t3.serial_no,
+               t1.title ticketTitle,
+               t2.resource ticketType,
+               t2.sale_price ,
+               t2.sale_comm_rate,
+               t3.status ticketStatus,
+               t5.name awardsName,
+               t6.title prizeName,
+               t6.value,
+               t6.prize_type,
+               t1.order_id,
+               t2.status orderStatus,
+               t2.created_time,
+               t8.user_name,
+               t8.phonenumber userPhone,
+               t7.name channelName
+        from mp_user_ticket_order_item t1
+                 left join mp_user_ticket_order t2 on t1.order_id = t2.order_id
+                 left join mp_ticket t3 on t1.ticket_id = t3.ticket_id
+                 left join mp_user_hit_prize t4 on t1.item_id = t4.order_item_id
+                 left join mp_ticket_awards t5 on t4.awards_id = t5.awards_id
+                 left join mp_ticket_awards_prize t6 on t4.prize_id = t6.prize_id
+                 left join mp_channel t7 on t2.channel_id = t7.channel_id
+                 left join sys_user t8 on t1.user_id = t8.user_id
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="countUserTicketOrderItem" resultType="int">
+        select count(*)
+        from mp_user_ticket_order_item t1
+            left join mp_user_ticket_order t2 on t1.order_id = t2.order_id
+            left join mp_ticket t3 on t1.ticket_id = t3.ticket_id
+            left join mp_user_hit_prize t4 on t1.item_id = t4.order_item_id
+            left join mp_ticket_awards t5 on t4.awards_id = t5.awards_id
+            left join mp_ticket_awards_prize t6 on t4.prize_id = t6.prize_id
+            left join mp_channel t7 on t2.channel_id = t7.channel_id
+            left join sys_user t8 on t1.user_id = t8.user_id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

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

@@ -143,10 +143,12 @@
 				t1.ticket_num,
 				t2.nick_name,
 				t2.phonenumber phone,
-				t3.type boxType
+				t3.type boxType,
+				t4.name channelName
 		from mp_user_ticket_order t1
-				 left join sys_user t2 on t1.user_id = t2.user_id
-				 left join mp_ticket_box t3 on t1.box_id = t3.box_id
+			left join sys_user t2 on t1.user_id = t2.user_id
+			left join mp_ticket_box t3 on t1.box_id = t3.box_id
+			left join mp_channel t4 on t1.channel_id = t4.channel_id
 		${ew.customSqlSegment}
     </select>
 
@@ -162,13 +164,12 @@
 				t1.ticket_num,
 				t2.nick_name,
 				t2.phonenumber phone,
-				t4.name channelName,
-				t5.type ticketBoxType
+				t3.name channelName,
+				t4.type ticketBoxType
 		from mp_user_ticket_order t1
 			left join sys_user t2 on t1.user_id = t2.user_id
-			left join mp_channel_user_rel t3 on t2.user_id = t3.user_id
-			left join mp_channel t4 on t3.channel_id = t4.channel_id
-			left join mp_ticket_box t5 on t1.box_id = t5.box_id
+			left join mp_channel t3 on t1.channel_id = t3.channel_id
+			left join mp_ticket_box t4 on t1.box_id = t4.box_id
 		${ew.customSqlSegment}
 	</select>