Browse Source

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

Dev

See merge request quanshu/mp-server!467
zhong chunping 3 years ago
parent
commit
b741e1852b
24 changed files with 731 additions and 29 deletions
  1. 24 11
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  2. 137 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserTicketOrderMgrController.java
  3. 44 5
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java
  4. 29 0
      mp-common/src/main/java/com/qs/mp/common/enums/TicketBoxSaleChannelTypeEnum.java
  5. 49 0
      mp-service/src/main/java/com/qs/mp/admin/domain/excel/UserTicketOrderExcel.java
  6. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxCreateParam.java
  7. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxUpdateParam.java
  8. 36 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserTicketOrderQueryParam.java
  9. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java
  10. 36 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderDetailVO.java
  11. 50 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderListVO.java
  12. 48 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderTicketDetailVO.java
  13. 11 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/TicketBoxMapper.java
  14. 10 0
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java
  15. 86 8
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  16. 9 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderItemMapper.java
  17. 19 1
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java
  18. 9 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderItemService.java
  19. 25 1
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  20. 8 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderItemServiceImpl.java
  21. 23 2
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  22. 6 0
      mp-service/src/main/resources/mapper/admin/TicketBoxMapper.xml
  23. 18 0
      mp-service/src/main/resources/mapper/user/UserTicketOrderItemMapper.xml
  24. 36 1
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

+ 24 - 11
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -5,15 +5,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.*;
 import com.qs.mp.admin.domain.excel.TicketExcel;
 import com.qs.mp.admin.domain.param.*;
 import com.qs.mp.admin.domain.vo.TicketAwardsVO;
 import com.qs.mp.admin.domain.vo.TicketBoxVO;
-import com.qs.mp.admin.service.ITicketAwardsPrizeService;
-import com.qs.mp.admin.service.ITicketAwardsService;
-import com.qs.mp.admin.service.ITicketBoxService;
-import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.admin.service.*;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.param.ChannelParam;
 import com.qs.mp.channel.domain.vo.ChannelVO;
@@ -23,13 +21,8 @@ import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.constant.UserConstants;
 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.ChannelRoleEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.ServerEnvEnum;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.common.enums.*;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.RSAUtil;
@@ -45,6 +38,7 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
@@ -86,6 +80,12 @@ public class TicketBoxMgrController extends BaseApiController {
 	@Autowired
 	private MapperFacade mapperFacade;
 
+	@Autowired
+	private ITicketBoxChannelService ticketBoxChannelService;
+
+	@Autowired
+	private IChannelService channelService;
+
 	@Value("${mp.exportUrl}")
 	private String exportUrl;
 
@@ -145,12 +145,25 @@ public class TicketBoxMgrController extends BaseApiController {
 	@PostMapping("/detail")
 	@PreAuthorize("@ss.hasPermi('business:ticket:query')")
 	@ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
+	@ApiResponses(
+			@ApiResponse(code = 200, message = "查询成功", response = TicketBoxVO.class)
+	)
 	public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
 		if (com.qs.mp.common.utils.StringUtils.isBlank(param.getBoxId())) {
 			return AjaxResult.error("参数异常,盲票组ID缺失");
 		}
 		TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
 		TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+		// 设置经销商信息
+		if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(ticketBox.getSaleChannelType())) {
+			List<TicketBoxChannel> ticketBoxChannelList = ticketBoxChannelService.list(new LambdaQueryWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
+			if (CollectionUtils.isNotEmpty(ticketBoxChannelList)) {
+				List<Long> channelIds = ticketBoxChannelList.stream().map(TicketBoxChannel::getChannelId).collect(Collectors.toList());
+				List<Channel> channelList = channelService.list(new LambdaQueryWrapper<Channel>().select(Channel::getChannelId, Channel::getName)
+						.in(Channel::getChannelId, channelIds));
+				ticketBoxVO.setChannelList(channelList);
+			}
+		}
 		List<TicketAwards> ticketAwardsList = ticketAwardsService.list(new LambdaQueryWrapper<TicketAwards>()
 				.eq(TicketAwards::getBoxId, ticketBox.getBoxId()).orderByAsc(TicketAwards::getSort));
 		List<TicketAwardsVO> ticketAwardsVOS = mapperFacade.mapAsList(ticketAwardsList, TicketAwardsVO.class);

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

@@ -0,0 +1,137 @@
+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.param.UserTicketOrderQueryParam;
+import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
+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.utils.StringUtils;
+import com.qs.mp.user.domain.UserTicketOrder;
+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.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 org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author Cup
+ * @date 2022/5/6
+ */
+@RestController
+@RequestMapping("/api/v1/mp/admin/ticket/order")
+@Api(tags = "用户盲票订单接口")
+public class UserTicketOrderMgrController extends BaseApiController {
+
+
+    @Autowired
+    private IUserTicketOrderService userTicketOrderService;
+
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('order:userTicket:list')")
+    @ApiOperation("用户盲票订单列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserTicketOrderListVO.class)
+    )
+    public TableDataInfo list(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
+        startPage();
+        QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
+            queryWrapper.like("t1.title", userTicketOrderQueryParam.getBoxTitle());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
+            queryWrapper.eq("t3.type", userTicketOrderQueryParam.getBoxType());
+        }
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
+            queryWrapper.eq("t2.phonenumber", userTicketOrderQueryParam.getPhone());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
+            queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
+        }
+        queryWrapper.orderByDesc("t1.created_time");
+
+        List<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
+        return getDataTable(list);
+    }
+
+    @PostMapping("/detail/{orderId}")
+    @PreAuthorize("@ss.hasPermi('order:userTicket:query')")
+    @ApiOperation("用户盲票订单详情")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserTicketOrderDetailVO.class)
+    )
+    public AjaxResult detail(@PathVariable("orderId") String orderId) {
+
+        return AjaxResult.success(userTicketOrderService.detail(orderId));
+    }
+
+    @Log(title = "用户订单导出", businessType = BusinessType.EXPORT)
+    @PostMapping("export")
+    @PreAuthorize("@ss.hasPermi('order:userTicket:export')")
+    @ApiOperation("用户订单导出")
+    public AjaxResult export(@RequestBody UserTicketOrderQueryParam userTicketOrderQueryParam) {
+        QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getBoxTitle())) {
+            queryWrapper.like("t1.title", userTicketOrderQueryParam.getBoxTitle());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getBoxType())) {
+            queryWrapper.eq("t3.type", userTicketOrderQueryParam.getBoxType());
+        }
+        if (StringUtils.isNotBlank(userTicketOrderQueryParam.getPhone())) {
+            queryWrapper.eq("t2.phonenumber", userTicketOrderQueryParam.getPhone());
+        }
+        if (Objects.nonNull(userTicketOrderQueryParam.getStartTime()) && Objects.nonNull(userTicketOrderQueryParam.getEndTime())) {
+            queryWrapper.between("t1.created_time", userTicketOrderQueryParam.getStartTime(), userTicketOrderQueryParam.getEndTime());
+        }
+        queryWrapper.orderByDesc("t1.created_time");
+        int totalSize = userTicketOrderService.countUserTicketOrder(queryWrapper);
+        if (totalSize == 0) {
+            return AjaxResult.error("没有符合条件的用户订单");
+        }
+        int pageSize = 2000;
+        List<UserTicketOrderListVO> userTicketOrderListVOList = 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<UserTicketOrderListVO> list = userTicketOrderService.listUserTicketOrder(queryWrapper);
+                if (CollectionUtils.isNotEmpty(list)) {
+                    userTicketOrderListVOList.addAll(list);
+                }
+            }
+        } else {
+            userTicketOrderListVOList = userTicketOrderService.listUserTicketOrder(queryWrapper);
+        }
+        List<UserTicketOrderExcel> excelList = userTicketOrderListVOList.stream().map(userTicketOrderListVO -> {
+            UserTicketOrderExcel userTicketOrderExcel = new UserTicketOrderExcel();
+            BeanUtils.copyProperties(userTicketOrderListVO, userTicketOrderExcel);
+            if (Objects.nonNull(userTicketOrderListVO.getBoxType())){
+                userTicketOrderExcel.setBoxType(userTicketOrderListVO.getBoxType().getDesc());
+            }
+            return userTicketOrderExcel;
+        }).collect(Collectors.toList());
+
+        ExcelUtil<UserTicketOrderExcel> util = new ExcelUtil<>(UserTicketOrderExcel.class);
+        return util.exportExcel(excelList, "用户盲票订单导出", false);
+    }
+
+
+}

+ 44 - 5
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelTicketController.java

@@ -1,20 +1,30 @@
 package com.qs.mp.web.controller.api.channel.mall;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.vo.TicketBoxListVO;
 import com.qs.mp.admin.domain.param.TicketBoxParam;
 import com.qs.mp.admin.domain.vo.TicketBoxVO;
 import com.qs.mp.admin.service.ITicketAwardsPrizeService;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.TicketBoxSaleChannelTypeEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +50,9 @@ public class ChannelTicketController extends BaseApiController {
   @Autowired
   private MapperFacade mapperFacade;
 
+  @Autowired
+  private IChannelService channelService;
+
   /**
    * 盲票进货列表
    */
@@ -48,11 +61,37 @@ public class ChannelTicketController extends BaseApiController {
   public TableDataInfo list(@RequestBody TicketBoxParam param) {
     // TODO 根据标签过滤
     startPage();
-    List<TicketBox> ticketBoxes = ticketBoxService.list(
-        new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
-            .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
-            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
-            .orderByDesc(TicketBox::getSortWeight));
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    Channel channel = channelService.getById(channelId);
+    List<Long> channelIds = new ArrayList<>();
+    if (StringUtils.isBlank(channel.getChannelNo())) {
+      String[] split = StringUtils.split(channel.getChannelNo(), ".");
+      for (String s : split) {
+        channelIds.add(Long.valueOf(s));
+      }
+    }
+    QueryWrapper<TicketBox> queryWrapper = new QueryWrapper<>();
+    queryWrapper.eq("t1.type",param.getType());
+    if (Objects.nonNull(param.getCategoryId()) && param.getCategoryId() != 0) {
+      queryWrapper.eq("t1.category_id",param.getCategoryId());
+    }
+    queryWrapper.eq("t1.status", TicketBoxStatusEnum.PUT_ON);
+    queryWrapper.orderByDesc("t1.sort_weight");
+
+    queryWrapper.nested(wrapper -> {
+      wrapper.eq("t1.sale_channel_type", TicketBoxSaleChannelTypeEnum.ALL.getValue());
+      if (channelIds.size() != 0) {
+        wrapper.or().in("t2.channel_id",channelIds);
+      }
+    });
+
+    List<TicketBox> ticketBoxes  = ticketBoxService.listBySaleChannel(queryWrapper);
+
+//    List<TicketBox> ticketBoxes = ticketBoxService.list(
+//        new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
+//            .eq(null != param.getCategoryId() && 0 != param.getCategoryId(), TicketBox::getCategoryId, param.getCategoryId())
+//            .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+//            .orderByDesc(TicketBox::getSortWeight));
     List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes, TicketBoxListVO.class);
     TableDataInfo rspData = getDataTable(ticketBoxes);
     rspData.setRows(ticketBoxListVOList);

+ 29 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketBoxSaleChannelTypeEnum.java

@@ -0,0 +1,29 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import lombok.AllArgsConstructor;
+
+/**
+ * 盲票销售渠道类型
+ *
+ * @author Cup
+ * @date 2022/5/6
+ */
+public enum TicketBoxSaleChannelTypeEnum implements IEnum<Integer> {
+
+    ALL(1, "所有渠道"),
+    PART(2, "部分渠道");
+
+    private int value;
+    private final String desc;
+
+    TicketBoxSaleChannelTypeEnum(int value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+}

+ 49 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/excel/UserTicketOrderExcel.java

@@ -0,0 +1,49 @@
+package com.qs.mp.admin.domain.excel;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.annotation.Excel;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户盲票订单导出类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单导出类")
+@Data
+public class UserTicketOrderExcel {
+
+    @Excel(name = "订单编号")
+    private String orderId;
+
+    @Excel(name = "下单时间")
+    private Date createdTime;
+
+    @Excel(name = "盲票组名称")
+    private String title;
+
+    @Excel(name = "盲票类型")
+    private String boxType;
+
+    @Excel(name = "盲票售价")
+    private Integer salePrice;
+
+    @Excel(name = "支付金额")
+    private Integer payAmt;
+
+
+    @Excel(name = "用户昵称")
+    private String nickName;
+
+    @Excel(name = "用户手机号")
+    private String phone;
+
+
+
+}

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxCreateParam.java

@@ -25,6 +25,12 @@ public class TicketBoxCreateParam {
 	@ApiModelProperty(value = "图片",required=true)
 	private String picUrl;
 
+	@ApiModelProperty("销售渠道类型  1 所有渠道 2 指定渠道")
+	private Integer saleChannelType;
+
+	@ApiModelProperty("渠道商id列表")
+	private List<Long> channelIdList;
+
 	@NotNull(message = "面值不能为空")
 	@ApiModelProperty(value = "面值",required=true)
 	private Integer facePrice;

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxUpdateParam.java

@@ -32,6 +32,12 @@ public class TicketBoxUpdateParam {
     @ApiModelProperty(value = "售价",required=true)
     private Integer salePrice;
 
+    @ApiModelProperty("销售渠道类型  1 所有渠道 2 指定渠道")
+    private Integer saleChannelType;
+
+    @ApiModelProperty("渠道商id列表")
+    private List<Long> channelIdList;
+
     @ApiModelProperty(value = "盲票包采购单价,线下票时必传")
     private Integer pkgSalePrice;
 

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

@@ -0,0 +1,36 @@
+package com.qs.mp.admin.domain.param;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户盲票订单查询入参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单查询入参类")
+@Data
+public class UserTicketOrderQueryParam {
+
+    @ApiModelProperty("盲票组名称")
+    private String boxTitle;
+
+    @ApiModelProperty("盲票形式(线上或线下)")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketTypeEnum boxType;
+
+    @ApiModelProperty("用户手机号")
+    private String phone;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+}

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java

@@ -3,6 +3,8 @@ package com.qs.mp.admin.domain.vo;
 import com.qs.mp.admin.domain.TicketBox;
 import java.util.List;
 
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.vo.ChannelVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -15,6 +17,10 @@ import lombok.Data;
 @Data
 @ApiModel(value = "票组出参类")
 public class TicketBoxVO extends TicketBox {
+
+  @ApiModelProperty("经销商信息")
+  List<Channel> channelList;
+
   // 奖品列表(小程序端显示)
   @ApiModelProperty("奖品列表(小程序端显示)")
   List<TicketAwardsPrizeVO> prizeList;

+ 36 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderDetailVO.java

@@ -0,0 +1,36 @@
+package com.qs.mp.admin.domain.vo;
+
+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/6
+ */
+@ApiModel("用户盲票订单详情出参类")
+@Data
+public class UserTicketOrderDetailVO {
+
+    @ApiModelProperty("订单id")
+    private String orderId;
+
+    @ApiModelProperty("用户昵称")
+    private String nickName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("渠道商名称")
+    private String channelName;
+
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+    @ApiModelProperty("票相关信息列表")
+    private List<UserTicketOrderTicketDetailVO>  ticketDetailList;
+}

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

@@ -0,0 +1,50 @@
+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.TicketTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户盲票订单列表出参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单列表出参类")
+@Data
+public class UserTicketOrderListVO {
+
+    @ApiModelProperty("订单id")
+    private String orderId;
+
+    @ApiModelProperty("盲票组名称")
+    private String title;
+
+    @ApiModelProperty("盲票销售价格")
+    private Integer salePrice;
+
+    @ApiModelProperty("实付金额")
+    private Integer payAmt;
+
+    @ApiModelProperty("盲票形式(线上或线下)")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketTypeEnum boxType;
+
+    @ApiModelProperty("用户昵称")
+    private String nickName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+}

+ 48 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserTicketOrderTicketDetailVO.java

@@ -0,0 +1,48 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.enums.TicketTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 用户盲票订单盲票详情出参类
+ * @author Cup
+ * @date 2022/5/6
+ */
+@ApiModel("用户盲票订单盲票详情出参类")
+@Data
+public class UserTicketOrderTicketDetailVO {
+
+    @ApiModelProperty("盲票序列号")
+    private String serialNo;
+
+    @ApiModelProperty("销售价格")
+    private Integer salePrice;
+
+    @ApiModelProperty("盲票组标题")
+    private String ticketBoxTitle;
+
+    @ApiModelProperty("盲票形式(线上或线下)")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketTypeEnum TicketBoxType;
+
+    @ApiModelProperty("分佣的销售额百分比")
+    private BigDecimal saleCommRate;
+
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    @ApiModelProperty("盲票状态;1未付款、2已激活、3已兑奖、4付款中")
+    private TicketStatusEnum status;
+
+    @ApiModelProperty("奖级")
+    private String prizeGrade;
+
+    @ApiModelProperty("奖品名称")
+    private String prizeTitle;
+}

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

@@ -1,7 +1,12 @@
 package com.qs.mp.admin.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.TicketBox;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @auther quanshu
@@ -10,4 +15,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface TicketBoxMapper extends BaseMapper<TicketBox> {
 
+    /**
+     * 根据条件查询盲票组列表
+     * @param queryWrapper
+     * @return
+     */
+    List<TicketBox> listBySaleChannel(@Param(Constants.WRAPPER) QueryWrapper<TicketBox> queryWrapper);
 }

+ 10 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ITicketBoxService.java

@@ -1,10 +1,13 @@
 package com.qs.mp.admin.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.TicketBox;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
 import com.qs.mp.admin.domain.param.TicketBoxUpdateParam;
 
+import java.util.List;
+
 /**
  * <p>
  * 盲票组 服务类
@@ -40,4 +43,11 @@ public interface ITicketBoxService extends IService<TicketBox> {
      * @return
      */
   boolean updateTicketBox(TicketBoxUpdateParam param);
+
+  /**
+   * 根据条件查询盲票组列表
+   * @param queryWrapper
+   * @return
+   */
+  List<TicketBox> listBySaleChannel(QueryWrapper<TicketBox> queryWrapper);
 }

+ 86 - 8
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -2,6 +2,7 @@ package com.qs.mp.admin.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,13 +14,9 @@ import com.qs.mp.admin.domain.param.TicketBoxCreateParam;
 import com.qs.mp.admin.domain.param.TicketBoxUpdateParam;
 import com.qs.mp.admin.mapper.TicketBoxMapper;
 import com.qs.mp.admin.service.*;
-import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
-import com.qs.mp.common.enums.TicketPkgStatusEnum;
-import com.qs.mp.common.enums.TicketPrizeTypeEnum;
-import com.qs.mp.common.enums.TicketStatusEnum;
-import com.qs.mp.common.enums.TicketTypeEnum;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.LogUtil;
@@ -93,6 +90,18 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
   @Autowired
   private ICouponPkgService couponPkgService;
 
+  @Autowired
+  private ITicketBoxChannelService ticketBoxChannelService;
+
+  @Autowired
+  private IChannelService channelService;
+
+
+  @Override
+  public List<TicketBox> listBySaleChannel(QueryWrapper<TicketBox> queryWrapper) {
+    return getBaseMapper().listBySaleChannel(queryWrapper);
+  }
+
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean updateTicketBox(TicketBoxUpdateParam param) {
@@ -107,8 +116,43 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     ticketBox.setSalePrice(param.getSalePrice());
     ticketBox.setPkgSalePrice(param.getPkgSalePrice());
     ticketBox.setSaleCommRate(param.getSaleCommRate());
+    ticketBox.setSaleChannelType(param.getSaleChannelType());
     this.updateById(ticketBox);
 
+    // 清除指定渠道内容
+    ticketBoxChannelService.remove(new LambdaUpdateWrapper<TicketBoxChannel>().eq(TicketBoxChannel::getBoxId, ticketBox.getBoxId()));
+
+    // 指定渠道
+    if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
+      List<Long> channelIdList = param.getChannelIdList();
+      if (CollectionUtils.isEmpty(channelIdList)) {
+        throw new ServiceException("渠道列表为空");
+      }
+      // 校验嵌套问题
+      List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
+                      .in(Channel::getChannelId, channelIdList))
+              .stream().map(Channel::getChannelNo)
+              .collect(Collectors.toList());
+      for (int i = 0; i < channelNoList.size(); i++) {
+        for (int j = 0; j < channelNoList.size(); j++) {
+          if (i == j) {
+            continue;
+          }
+          if (channelNoList.get(i).contains(channelNoList.get(j))) {
+            throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
+          }
+        }
+      }
+      List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
+      for (Long channelId : channelIdList) {
+        TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
+        ticketBoxChannel.setBoxId(ticketBox.getBoxId());
+        ticketBoxChannel.setChannelId(channelId);
+        ticketBoxChannelList.add(ticketBoxChannel);
+      }
+      ticketBoxChannelService.saveBatch(ticketBoxChannelList);
+    }
+
     // 校验更新奖品信息
     if (CollectionUtils.isEmpty(param.getAwardsList())) {
       throw new ServiceException("奖品列表不能为空");
@@ -196,7 +240,7 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
   }
 
   @Override
-  @Transactional
+  @Transactional(rollbackFor = Exception.class)
   public String createTicketBox(TicketBoxCreateParam param) {
     // 创建盲票组
     TicketBox ticketBox = mapperFacade.map(param, TicketBox.class);
@@ -204,8 +248,42 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     ticketBox.setStatus(TicketBoxStatusEnum.WAIT);
     ticketBox.setBoxNo(ticketBoxSerialService.generateSerial(ticketBox.getType()));
     ticketBox.setBoxId(bizIdGenerator.newId());
+    ticketBox.setSaleChannelType(param.getSaleChannelType());
     save(ticketBox);
 
+    // 指定渠道
+    if (TicketBoxSaleChannelTypeEnum.PART.getValue().equals(param.getSaleChannelType())) {
+      List<Long> channelIdList = param.getChannelIdList();
+      if (CollectionUtils.isEmpty(channelIdList)) {
+        throw new ServiceException("渠道列表为空");
+      }
+
+      // 校验嵌套问题
+      List<String> channelNoList = channelService.list(new LambdaQueryWrapper<Channel>()
+                                .in(Channel::getChannelId, channelIdList))
+                                .stream().map(Channel::getChannelNo)
+                                .collect(Collectors.toList());
+      for (int i = 0; i < channelNoList.size(); i++) {
+        for (int j = 0; j < channelNoList.size(); j++) {
+          if (i == j) {
+            continue;
+          }
+          if (channelNoList.get(i).contains(channelNoList.get(j))) {
+            throw new ServiceException("已选择更高级的渠道,不支持渠道相互嵌套!");
+          }
+        }
+      }
+
+      List<TicketBoxChannel> ticketBoxChannelList = new ArrayList<>();
+      for (Long channelId : channelIdList) {
+        TicketBoxChannel ticketBoxChannel = new TicketBoxChannel();
+        ticketBoxChannel.setBoxId(ticketBox.getBoxId());
+        ticketBoxChannel.setChannelId(channelId);
+        ticketBoxChannelList.add(ticketBoxChannel);
+      }
+      ticketBoxChannelService.saveBatch(ticketBoxChannelList);
+    }
+
     // 创建奖级
     List<TicketAwards> ticketAwardsList = new ArrayList<>();
     List<TicketAwardsPrize> awardsPrizeList = new ArrayList<>();

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

@@ -1,10 +1,12 @@
 package com.qs.mp.user.mapper;
 
 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.TicketAwardsPrize;
 import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import java.util.List;
@@ -21,4 +23,11 @@ public interface UserTicketOrderItemMapper extends BaseMapper<UserTicketOrderIte
   List<TicketListVO> listMyTicketVO(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
 
   int countMyTicket(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
+
+  /**
+   * 获取订单下盲票相关详情信息
+   * @param queryWrapper
+   * @return
+   */
+  List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrderTicketDetailVO> queryWrapper);
 }

+ 19 - 1
mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java

@@ -1,7 +1,10 @@
 package com.qs.mp.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 
@@ -82,5 +85,20 @@ public interface UserTicketOrderMapper extends BaseMapper<UserTicketOrder> {
 	    * @return
 	    */
 	   List<TicketCntVO> listTicketSaleCnt(@Param(Constants.WRAPPER) Wrapper<UserTicketOrder> queryWrapper);
-	  
+
+	/**
+	 * 获取用户盲票订单列表
+	 * @param queryWrapper
+	 * @return
+	 */
+	List<UserTicketOrderListVO> listUserTicketOrder(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
+
+	/**
+	 * 查询用户盲票订单详情
+	 * @param
+	 * @return
+	 */
+	UserTicketOrderDetailVO selectUserTicketOrderDetail(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
+
+	int countUserTicketOrder(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
 }

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

@@ -3,6 +3,7 @@ package com.qs.mp.user.service;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -47,4 +48,12 @@ public interface IUserTicketOrderItemService extends IService<UserTicketOrderIte
    * @return
    */
   TicketListVO queryTicketVO(Long userId, String orderId);
+
+  /**
+   * 获取订单下盲票相关详情信息
+   *
+   * @param orderId
+   * @return
+   */
+  List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(String orderId);
 }

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

@@ -1,7 +1,11 @@
 package com.qs.mp.user.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
+import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
@@ -128,5 +132,25 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
     * @return
     */
    List<TicketCntVO> listTicketSaleCnt(Wrapper<UserTicketOrder> queryWrapper);
-  
+
+
+    /**
+     * 获取用户盲票订单列表
+     * @return
+     */
+    List<UserTicketOrderListVO> listUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper);
+
+
+    /**
+     * 查询用户订单详情
+     * @param orderId
+     * @return
+     */
+    UserTicketOrderDetailVO detail(String orderId);
+
+    /**
+     * 统计用户订单数量
+     * @return
+     */
+    int countUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper);
 }

+ 8 - 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.UserTicketOrderTicketDetailVO;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
@@ -59,4 +60,11 @@ public class UserTicketOrderItemServiceImpl extends ServiceImpl<UserTicketOrderI
     }
     return ticketListVOS.get(0);
   }
+
+  @Override
+  public List<UserTicketOrderTicketDetailVO> listTicketDetailByOrderId(String orderId) {
+    QueryWrapper<UserTicketOrderTicketDetailVO> queryWrapper = new QueryWrapper<>();
+    queryWrapper.eq("t1.order_id", orderId);
+    return getBaseMapper().listTicketDetailByOrderId(queryWrapper);
+  }
 }

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

@@ -3,13 +3,14 @@ package com.qs.mp.user.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketPackage;
-import com.qs.mp.admin.domain.vo.IndexVO;
-import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
+import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
@@ -55,6 +56,7 @@ import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -549,5 +551,24 @@ public class UserTicketOrderServiceImpl extends
     return getBaseMapper().listTicketSaleCnt(queryWrapper);
   }
 
+  @Override
+  public List<UserTicketOrderListVO> listUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper) {
+    return getBaseMapper().listUserTicketOrder(queryWrapper);
+  }
 
+  @Override
+  public int countUserTicketOrder(QueryWrapper<UserTicketOrder> queryWrapper) {
+    return getBaseMapper().countUserTicketOrder(queryWrapper);
+  }
+
+  @Override
+  public UserTicketOrderDetailVO detail(String orderId) {
+    QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();
+    queryWrapper.eq("t1.order_id", orderId);
+    UserTicketOrderDetailVO userTicketOrderDetailVO = getBaseMapper().selectUserTicketOrderDetail(queryWrapper);
+
+    List<UserTicketOrderTicketDetailVO> list = userTicketOrderItemService.listTicketDetailByOrderId(orderId);
+    userTicketOrderDetailVO.setTicketDetailList(list);
+    return userTicketOrderDetailVO;
+  }
 }

+ 6 - 0
mp-service/src/main/resources/mapper/admin/TicketBoxMapper.xml

@@ -37,4 +37,10 @@
         box_id, box_no, title, pic_url, category_id, description, sale_point, type, quantity, sale_qty, pkg_sale_price, pkg_unit, pkg_qty, sale_pkg_qty, face_price, sale_price, sale_comm_rate, properties, sort_weight, on_time, off_time, manual_off, status, is_deleted, created_time, updated_time
     </sql>
 
+    <select id="listBySaleChannel" resultMap="BaseResultMap">
+        select t1.*
+        from mp_ticket_box t1
+        left join mp_ticket_box_channel t2 on t1.box_id = t2.box_id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

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

@@ -55,4 +55,22 @@
             ${ew.customSqlSegment}
     </select>
 
+    <select id="listTicketDetailByOrderId" resultType="com.qs.mp.admin.domain.vo.UserTicketOrderTicketDetailVO">
+        select t3.serial_no,
+               t2.sale_price,
+               t2.title ticketBoxTitle,
+               t7.type ticketBoxType,
+               t7.sale_comm_rate,
+               t3.status,
+               t6.name prizeGrade,
+               t5.title prizeTitle
+        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 t3.ticket_id = t4.ticket_id
+             left join mp_ticket_awards_prize t5 on t4.prize_id = t5.prize_id
+             left join mp_ticket_awards t6 on t5.awards_id = t6.awards_id
+             left join mp_ticket_box t7 on t7.box_id = t2.box_id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

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

@@ -131,5 +131,40 @@
 		${ew.customSqlSegment}
 		GROUP BY t1.channel_id
 	</select>
-    
+
+    <select id="listUserTicketOrder" resultType="com.qs.mp.admin.domain.vo.UserTicketOrderListVO">
+		select t1.order_id,
+				t1.created_time,
+				t1.title,
+				t1.sale_price,
+				t1.pay_amt,
+				t2.nick_name,
+				t2.phonenumber phone,
+				t3.type boxType
+		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
+		${ew.customSqlSegment}
+    </select>
+
+    <select id="selectUserTicketOrderDetail" resultType="com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO">
+		select t1.order_id,
+			   t1.created_time,
+			   t2.nick_name,
+			   t2.phonenumber phone,
+			   t4.name channelName
+		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
+		${ew.customSqlSegment}
+	</select>
+
+    <select id="countUserTicketOrder" resultType="integer">
+		select count(*)
+		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
+		${ew.customSqlSegment}
+	</select>
 </mapper>