Browse Source

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

chunping 3 years ago
parent
commit
fdd9a0ae98

+ 184 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelMyTicketController.java

@@ -0,0 +1,184 @@
+package com.qs.mp.web.controller.api.channel;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.service.ITicketPackageService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.param.ChannelTicketTransferParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.channel.service.IChannelTicketTransferService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+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.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 我的盲票相关接口
+ * @author Cup
+ * @date 2022/4/21
+ */
+@RestController
+@RequestMapping("/api/v1/mp/channel/my/ticket")
+@Api(tags = "我的盲票相关接口")
+public class ChannelMyTicketController extends BaseApiController {
+
+    @Autowired
+    private IChannelOrderDetailService channelOrderDetailService;
+
+    @Autowired
+    private IChannelService channelService;
+
+    @Autowired
+    private IChannelTicketTransferService channelTicketTransferService;
+
+    @Autowired
+    private ITicketPackageService ticketPackageService;
+
+    @PostMapping("list")
+    @ApiOperation("我的盲票列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelMyTicketVO.class)
+    )
+    public TableDataInfo list(@RequestBody ChannelMyTicketQueryParam channelMyTicketQueryParam) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        if (channelId == null) {
+            throw new RuntimeException("非法调用");
+        }
+
+        startPage();
+        // 获取我的盲票列表
+        List<ChannelMyTicketVO> list =  channelOrderDetailService.listMyTicket(channelId, channelMyTicketQueryParam);
+        return getDataTable(list);
+    }
+
+    @PostMapping("/channel/mobile/{mobile}")
+    @ApiOperation("根据手机号获取经销商信息")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String", paramType = "path")
+    )
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = Channel.class)
+    )
+    public AjaxResult channelInfoByMobile(@PathVariable("mobile") String mobile) {
+        Long channelId = SecurityUtils.getLoginUser().getChannelId();
+        if (channelId == null) {
+            return AjaxResult.error("非法调用");
+        }
+        if (StringUtils.isBlank(mobile)) {
+            return AjaxResult.success();
+        }
+        Channel channel = channelService.getOne(new LambdaQueryWrapper<Channel>()
+                .eq(Channel::getMobile, mobile)
+                .eq(Channel::getLevel, 0));
+
+        return AjaxResult.success(channel);
+    }
+
+
+
+
+    @PostMapping("/transfer/save")
+    @ApiOperation("盲票转让")
+    public AjaxResult transfer(@RequestBody ChannelTicketTransferParam channelTicketTransferParam) {
+        // 自己为转让人
+        Long transferChannelId = SecurityUtils.getLoginUser().getChannelId();
+        if (transferChannelId == null) {
+            return AjaxResult.error("非法调用");
+        }
+        if (StringUtils.isBlank(channelTicketTransferParam.getBoxId()) ||
+                StringUtils.isBlank(channelTicketTransferParam.getPkgId()) ||
+                Objects.isNull(channelTicketTransferParam.getChannelId()) ||
+                StringUtils.isBlank(channelTicketTransferParam.getMobile())) {
+            return AjaxResult.error("转让参数不能为空");
+        }
+
+        // 校验受让人信息
+        Channel channel = channelService.getOne(new LambdaQueryWrapper<Channel>()
+                .eq(Channel::getChannelId, channelTicketTransferParam.getChannelId())
+                .eq(Channel::getLevel, 0));
+        if (Objects.isNull(channel)) {
+            return AjaxResult.error("受让人信息不存在");
+        }
+        if (ChannelCertifyStatusEnum.NOT_CERTIFIED.equals(channel.getCertifyStatus())) {
+            return AjaxResult.error("受让人未认证");
+        }
+
+        // 校验当前操作的盲票是否为自己的盲票
+        int count = channelOrderDetailService.count(new LambdaQueryWrapper<ChannelOrderDetail>()
+                .eq(ChannelOrderDetail::getChannelId, transferChannelId)
+                .eq(ChannelOrderDetail::getPkgId, channelTicketTransferParam.getPkgId()));
+        if (count == 0) {
+            return AjaxResult.error("非法操作他人盲票");
+        }
+        // 校验票包是否为待售状态
+        count = ticketPackageService.count(new LambdaQueryWrapper<TicketPackage>().eq(TicketPackage::getPkgId, channelTicketTransferParam.getPkgId())
+                .eq(TicketPackage::getSaleStatus, TicketPkgSaleStatusEnum.WAIT_SALE));
+        if (count == 0) {
+            return AjaxResult.error("票包不为待售状态");
+        }
+
+        // 转让盲票
+        boolean flag  = channelTicketTransferService.transferTicket(transferChannelId, channelTicketTransferParam);
+
+        return AjaxResult.success(flag);
+
+    }
+
+
+
+    @PostMapping("/transfer/list")
+    @ApiOperation("已转让盲票列表")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelMyTicketVO.class)
+    )
+    public TableDataInfo transferList(){
+        Long transferChannelId = SecurityUtils.getLoginUser().getChannelId();
+        if (transferChannelId == null) {
+            throw new RuntimeException("非法调用");
+        }
+
+        // 开启分页
+        startPage();
+
+        // 获取我的已转让的盲票列表
+        List<ChannelMyTicketVO> list = channelTicketTransferService.listTransferTicketList(transferChannelId);
+        return getDataTable(list);
+    }
+
+
+    @PostMapping("/transfer/detail/{id}")
+    @ApiOperation("转让盲票详情")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "id", value = "转让详情id", required = true, dataType = "Long", paramType = "query")
+    )
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = ChannelTicketTransferDetailVO.class)
+    )
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        Long transferChannelId = SecurityUtils.getLoginUser().getChannelId();
+
+        if (transferChannelId == null) {
+            return AjaxResult.error("非法调用");
+        }
+
+        ChannelTicketTransferDetailVO channelTicketTransferDetailVO =  channelTicketTransferService.getTicketTransferDetailById(id, transferChannelId);
+
+        return AjaxResult.success(channelTicketTransferDetailVO);
+    }
+
+}

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

@@ -13,6 +13,9 @@ import com.qs.mp.common.enums.SiteTypeEnum;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -22,6 +25,7 @@ import lombok.Data;
  */
 @TableName("mp_channel")
 @Data
+@ApiModel("渠道经销商实体类")
 public class Channel implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -30,30 +34,35 @@ public class Channel implements Serializable {
    * 主键
    */
   @TableId(value = "channel_id" , type = IdType.AUTO)
+  @ApiModelProperty("渠道经销商id")
   private Long channelId;
 
   /**
    * 渠道编码
    */
   @TableField("channel_no")
+  @ApiModelProperty("渠道编码")
   private String channelNo;
 
   /**
    * 渠道名称
    */
   @TableField("name")
+  @ApiModelProperty("渠道名称")
   private String name;
 
   /**
    * 父渠道ID
    */
   @TableField("parent_id")
+  @ApiModelProperty("父渠道ID")
   private Long parentId;
 
   /**
    * 渠道级别,0:经销商;1:一级渠道;2:二级渠道
    */
   @TableField("level")
+  @ApiModelProperty("渠道级别,0:经销商;1:一级渠道;2:二级渠道")
   private Integer level;
 
   /**
@@ -61,6 +70,7 @@ public class Channel implements Serializable {
    */
   @TableField("site_type")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("经销商类型")
   private SiteTypeEnum siteType;
   
   
@@ -68,84 +78,98 @@ public class Channel implements Serializable {
    * 门店名称(用于用户端优惠券的详情页,说明优惠券的适用门店)
    */
   @TableField("site_name")
+  @ApiModelProperty("门店名称(用于用户端优惠券的详情页,说明优惠券的适用门店)")
   private String siteName;
 
   /**
    * 分佣百分比
    */
   @TableField("comm_rate")
+  @ApiModelProperty("分佣百分比")
   private BigDecimal commRate;
 
   /**
    * 省ID
    */
   @TableField("province_id")
+  @ApiModelProperty("省ID")
   private Long provinceId;
 
   /**
    * 省
    */
   @TableField("province")
+  @ApiModelProperty("省")
   private String province;
 
   /**
    * 城市
    */
   @TableField("city")
+  @ApiModelProperty("城市")
   private String city;
 
   /**
    * 城市ID
    */
   @TableField("city_id")
+  @ApiModelProperty("城市ID")
   private Long cityId;
 
   /**
    * 区
    */
   @TableField("area")
+  @ApiModelProperty("区")
   private String area;
 
   /**
    * 区ID
    */
   @TableField("area_id")
+  @ApiModelProperty("区ID")
   private Long areaId;
 
   /**
    * 详细地址
    */
   @TableField("address")
+  @ApiModelProperty("详细地址")
   private String address;
 
   /**
    * 联系人
    */
   @TableField("contact")
+  @ApiModelProperty("联系人")
   private String contact;
 
   /**
    * 手机号
    */
   @TableField("mobile")
+  @ApiModelProperty("手机号")
   private String mobile;
 
   /**
    * 用户ID
    */
   @TableField("user_id")
+  @ApiModelProperty("用户ID")
   private Long userId;
 
   /**
    * 账户余额
    */
   @TableField("money")
+  @ApiModelProperty("账户余额")
   private Integer money;
 
   /**
    * 账户冻结金额
    */
   @TableField("frozen_money")
+  @ApiModelProperty("账户冻结金额")
   private Integer frozenMoney;
 
   /**
@@ -153,6 +177,7 @@ public class Channel implements Serializable {
    */
   @TableField("certify_status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("认证状态,未认证n,已认证y")
   private ChannelCertifyStatusEnum certifyStatus;
 
   /**
@@ -160,30 +185,35 @@ public class Channel implements Serializable {
    */
   @TableField("verify_status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("审核状态")
   private ChannelVerifyStatusEnum verifyStatus;
 
   /**
    * 营业执照
    */
   @TableField("biz_license_pic")
+  @ApiModelProperty("营业执照")
   private String bizLicensePic;
 
   /**
    * 门头照片
    */
   @TableField("door_pic")
+  @ApiModelProperty("门头照片")
   private String doorPic;
 
   /**
    * 备注信息
    */
   @TableField("memo")
+  @ApiModelProperty("备注信息")
   private String memo;
 
   /**
    * 邀请码图片
    */
   @TableField("invite_pic")
+  @ApiModelProperty("邀请码图片")
   private String invitePic;
 
   /**
@@ -191,18 +221,21 @@ public class Channel implements Serializable {
    */
   @TableField("status")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  @ApiModelProperty("状态,启用.停用")
   private ChannelStatusEnum status;
 
   /**
    * 创建时间
    */
   @TableField("created_time")
+  @ApiModelProperty("创建时间")
   private Date createdTime;
 
   /**
    * 更新时间
    */
   @TableField("updated_time")
+  @ApiModelProperty("更新时间")
   private Date updatedTime;
 
 

+ 79 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelTicketTransfer.java

@@ -0,0 +1,79 @@
+package com.qs.mp.channel.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.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-04-21 10:47:03
+ */
+@TableName("mp_channel_ticket_transfer")
+@Data
+@ApiModel("经销商盲票转让信息表实体类")
+public class ChannelTicketTransfer implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty("主键")
+    private Long id;
+
+    /**
+     * 转让人ID
+     */
+    @TableField("transfer_channel_id")
+    @ApiModelProperty("转让人ID")
+    private Long transferChannelId;
+
+    /**
+     * 拥有人ID
+     */
+    @TableField("channel_id")
+    @ApiModelProperty("拥有人ID")
+    private Long channelId;
+
+    /**
+     * 盲票组ID
+     */
+    @TableField("box_id")
+    @ApiModelProperty("盲票组ID")
+    private String boxId;
+
+    /**
+     * 盲票包ID
+     */
+    @TableField("pkg_id")
+    @ApiModelProperty("盲票包ID")
+    private String pkgId;
+
+    /**
+     * 创建时间
+     */
+    @TableField("created_time")
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("updated_time")
+    @ApiModelProperty("更新时间")
+    private Date updatedTime;
+
+
+}

+ 27 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelMyTicketQueryParam.java

@@ -0,0 +1,27 @@
+package com.qs.mp.channel.domain.param;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 经销商我的盲票查询入参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel(value= "经销商我的盲票查询入参类")
+@Data
+public class ChannelMyTicketQueryParam {
+
+    @ApiModelProperty("销售状态 1待售,2销售中,3已售罄")
+    public TicketPkgSaleStatusEnum saleStatus;
+
+
+    @ApiModelProperty("搜索名称")
+    public String searchTitle;
+
+
+}

+ 29 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelTicketTransferParam.java

@@ -0,0 +1,29 @@
+package com.qs.mp.channel.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 经销商盲票转让入参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel("经销商盲票转让入参类")
+@Data
+public class ChannelTicketTransferParam {
+
+
+    @ApiModelProperty("盲票组id")
+    private String boxId;
+
+    @ApiModelProperty("盲票包id")
+    private String pkgId;
+
+    @ApiModelProperty("受让人id")
+    private Long channelId;
+
+    @ApiModelProperty("受让人手机号")
+    private String mobile;
+
+}

+ 60 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelMyTicketVO.java

@@ -0,0 +1,60 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 经销商我的盲票出参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel("经销商我的盲票出参类")
+@Data
+public class ChannelMyTicketVO {
+
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("盲票组ID")
+    private String boxId;
+
+    @ApiModelProperty("盲票包ID")
+    private String pkgId;
+
+
+    @ApiModelProperty("票包编号")
+    public String pkgNo;
+
+    @ApiModelProperty("主图")
+    private String picUrl;
+
+    @ApiModelProperty("票包名称")
+    private String title;
+
+    @ApiModelProperty("票的规格")
+    private Integer pkgUnit;
+
+    @ApiModelProperty("销售状态 1待售,2销售中,3已售罄")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketPkgSaleStatusEnum saleStatus;
+
+    @ApiModelProperty("销售数量")
+    private Integer saleQty;
+
+    @ApiModelProperty("面值")
+    private Integer facePrice;
+
+
+    @ApiModelProperty("创建时间")
+    private Date createdTime;
+
+
+
+
+}

+ 32 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelTicketTransferDetailVO.java

@@ -0,0 +1,32 @@
+package com.qs.mp.channel.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 盲票转让详情出参类
+ * @author Cup
+ * @date 2022/4/21
+ */
+@ApiModel("盲票转让详情出参类")
+@Data
+public class ChannelTicketTransferDetailVO {
+
+    @ApiModelProperty("盲票名称")
+    private String title;
+
+    @ApiModelProperty("票包编号")
+    private String pkgNo;
+
+    @ApiModelProperty("门店名称")
+    private String siteName;
+
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    @ApiModelProperty("转让时间")
+    private Date createdTime;
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelOrderDetailMapper.java

@@ -1,7 +1,15 @@
 package com.qs.mp.channel.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @auther quanshu
@@ -10,4 +18,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ChannelOrderDetailMapper extends BaseMapper<ChannelOrderDetail> {
 
+
+    /**
+     * 查询我的盲票列表
+     * @param wrapper
+     * @return
+     */
+    List<ChannelMyTicketVO> selectListMyTicketByChannelIdAndchannelMyTicketQueryParam(@Param(Constants.WRAPPER) Wrapper<ChannelOrderDetail> wrapper);
+
 }

+ 34 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelTicketTransferMapper.java

@@ -0,0 +1,34 @@
+package com.qs.mp.channel.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @auther quanshu
+ * @create 2022-04-21 10:47:03
+ * @describe 经销商盲票转让信息表mapper类
+ */
+public interface ChannelTicketTransferMapper extends BaseMapper<ChannelTicketTransfer> {
+
+    /**
+     * 获取已转让盲票列表
+     * @param queryWrapper
+     * @return
+     */
+    List<ChannelMyTicketVO> listTransferTicketList(@Param(Constants.WRAPPER) QueryWrapper<ChannelMyTicketVO> queryWrapper);
+
+    /**
+     * 获取已转让盲票详情
+     * @param queryWrapper
+     * @return
+     */
+    ChannelTicketTransferDetailVO getTicketTransferDetail(@Param(Constants.WRAPPER) QueryWrapper<ChannelTicketTransferDetailVO> queryWrapper);
+
+}

+ 11 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderDetailService.java

@@ -2,6 +2,10 @@ package com.qs.mp.channel.service;
 
 import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IChannelOrderDetailService extends IService<ChannelOrderDetail> {
 
+    /**
+     * 获取我的盲票列表
+     * @param channelId 经销商id
+     * @param channelMyTicketQueryParam 查询参数
+     * @return
+     */
+    List<ChannelMyTicketVO> listMyTicket(Long channelId, ChannelMyTicketQueryParam channelMyTicketQueryParam);
 }

+ 44 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelTicketTransferService.java

@@ -0,0 +1,44 @@
+package com.qs.mp.channel.service;
+
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.param.ChannelTicketTransferParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 经销商盲票转让信息表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-21
+ */
+public interface IChannelTicketTransferService extends IService<ChannelTicketTransfer> {
+
+
+    /**
+     * 转让盲票
+     * @param transferChannelId     转让人id
+     * @param channelTicketTransferParam        转让参数
+     * @return
+     */
+    boolean transferTicket(Long transferChannelId, ChannelTicketTransferParam channelTicketTransferParam);
+
+    /**
+     * 获取已转让盲票列表
+     * @param transferChannelId     转让人id
+     * @return
+     */
+    List<ChannelMyTicketVO> listTransferTicketList(Long transferChannelId);
+
+    /**
+     * 根据id和转让人id查询盲票转让详情
+     * @param id
+     * @param transferChannelId
+     * @return
+     */
+    ChannelTicketTransferDetailVO getTicketTransferDetailById(Long id, Long transferChannelId);
+}

+ 26 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderDetailServiceImpl.java

@@ -1,11 +1,18 @@
 package com.qs.mp.channel.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
+import com.qs.mp.channel.domain.param.ChannelMyTicketQueryParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
 import com.qs.mp.channel.mapper.ChannelOrderDetailMapper;
 import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Objects;
+
 /**
  * <p>
  * 经销商采购订单盲票包明细 服务实现类
@@ -17,4 +24,23 @@ import org.springframework.stereotype.Service;
 @Service
 public class ChannelOrderDetailServiceImpl extends ServiceImpl<ChannelOrderDetailMapper, ChannelOrderDetail> implements IChannelOrderDetailService {
 
+
+    @Override
+    public List<ChannelMyTicketVO> listMyTicket(Long channelId, ChannelMyTicketQueryParam channelMyTicketQueryParam) {
+        QueryWrapper<ChannelOrderDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.channel_id", channelId);
+        if (Objects.nonNull(channelMyTicketQueryParam.getSaleStatus())) {
+            queryWrapper.eq("t2.sale_status", channelMyTicketQueryParam.getSaleStatus());
+        }
+        if (StringUtils.isNotBlank(channelMyTicketQueryParam.getSearchTitle())) {
+            queryWrapper.nested(wrapper -> {
+                wrapper.likeRight("t2.pkg_no", channelMyTicketQueryParam.getSearchTitle())
+                        .or()
+                        .likeRight("t3.title", channelMyTicketQueryParam.getSearchTitle());
+            });
+
+        }
+        queryWrapper.orderByDesc("t1.created_time");
+        return this.baseMapper.selectListMyTicketByChannelIdAndchannelMyTicketQueryParam(queryWrapper);
+    }
 }

+ 76 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelTicketTransferServiceImpl.java

@@ -0,0 +1,76 @@
+package com.qs.mp.channel.service.impl;
+
+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.channel.domain.ChannelOrderDetail;
+import com.qs.mp.channel.domain.ChannelTicketTransfer;
+import com.qs.mp.channel.domain.param.ChannelTicketTransferParam;
+import com.qs.mp.channel.domain.vo.ChannelMyTicketVO;
+import com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO;
+import com.qs.mp.channel.mapper.ChannelTicketTransferMapper;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
+import com.qs.mp.channel.service.IChannelTicketTransferService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 经销商盲票转让信息表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-04-21
+ */
+@Service
+public class ChannelTicketTransferServiceImpl extends ServiceImpl<ChannelTicketTransferMapper, ChannelTicketTransfer> implements IChannelTicketTransferService {
+
+
+    @Autowired
+    private IChannelOrderDetailService channelOrderDetailService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean transferTicket(Long transferChannelId, ChannelTicketTransferParam channelTicketTransferParam) {
+
+        // 转让盲票
+        ChannelTicketTransfer channelTicketTransfer = new ChannelTicketTransfer();
+        channelTicketTransfer.setTransferChannelId(transferChannelId);
+        channelTicketTransfer.setChannelId(channelTicketTransferParam.getChannelId());
+        channelTicketTransfer.setBoxId(channelTicketTransferParam.getBoxId());
+        channelTicketTransfer.setPkgId(channelTicketTransferParam.getPkgId());
+
+
+        // 记录盲票转让信息
+        this.save(channelTicketTransfer);
+
+        // 更新盲票拥有人
+        channelOrderDetailService.update(new LambdaUpdateWrapper<ChannelOrderDetail>()
+                .set(ChannelOrderDetail::getChannelId, channelTicketTransferParam.getChannelId())
+                .eq(ChannelOrderDetail::getPkgId, channelTicketTransferParam.getPkgId())
+                .eq(ChannelOrderDetail::getChannelId, transferChannelId));
+
+        return true;
+    }
+
+    @Override
+    public List<ChannelMyTicketVO> listTransferTicketList(Long transferChannelId) {
+        QueryWrapper<ChannelMyTicketVO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t.transfer_channel_id", transferChannelId);
+        queryWrapper.orderByDesc("t.created_time");
+        return this.baseMapper.listTransferTicketList(queryWrapper);
+    }
+
+    @Override
+    public ChannelTicketTransferDetailVO getTicketTransferDetailById(Long id, Long transferChannelId) {
+        QueryWrapper<ChannelTicketTransferDetailVO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("t1.id", id);
+        queryWrapper.eq("t1.transfer_channel_id", transferChannelId);
+        return this.baseMapper.getTicketTransferDetail(queryWrapper);
+    }
+}

+ 19 - 0
mp-service/src/main/resources/mapper/channel/ChannelOrderDetailMapper.xml

@@ -20,4 +20,23 @@
         id, order_id, channel_id, box_id, pkg_id, start_sn, end_sn, created_time, updated_time
     </sql>
 
+    <select id="selectListMyTicketByChannelIdAndchannelMyTicketQueryParam"
+            resultType="com.qs.mp.channel.domain.vo.ChannelMyTicketVO">
+        SELECT t1.id,
+               t1.channel_id,
+               t1.box_id,
+               t1.pkg_id,
+               t1.created_time,
+               t2.pkg_no,
+               t2.sale_status,
+               t2.sale_qty,
+               t2.pkg_unit,
+               t3.title,
+               t3.pic_url,
+               t3.face_price
+        FROM mp_channel_order_detail t1
+         LEFT JOIN mp_ticket_package t2 ON t1.pkg_id = t2.pkg_id
+         LEFT JOIN mp_ticket_box t3 ON t2.box_id = t3.box_id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 53 - 0
mp-service/src/main/resources/mapper/channel/ChannelTicketTransferMapper.xml

@@ -0,0 +1,53 @@
+<?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.channel.mapper.ChannelTicketTransferMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelTicketTransfer">
+        <id column="id" property="id" />
+        <result column="transfer_channel_id" property="transferChannelId" />
+        <result column="channel_id" property="channelId" />
+        <result column="box_id" property="boxId" />
+        <result column="pkg_id" property="pkgId" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, transfer_channel_id, channel_id, box_id, pkg_id, created_time, updated_time
+    </sql>
+
+    <select id="listTransferTicketList" resultType="com.qs.mp.channel.domain.vo.ChannelMyTicketVO">
+        SELECT t.id,
+               t1.channel_id,
+               t1.box_id,
+               t1.pkg_id,
+               t1.created_time,
+               t2.pkg_no,
+               t2.sale_status,
+               t2.sale_qty,
+               t2.pkg_unit,
+               t3.title,
+               t3.pic_url,
+               t3.face_price
+        FROM mp_channel_ticket_transfer t
+         Left JOIN mp_channel_order_detail t1 ON t.pkg_id = t1.pkg_id
+         LEFT JOIN mp_ticket_package t2 ON t1.pkg_id = t2.pkg_id
+         LEFT JOIN mp_ticket_box t3 ON t2.box_id = t3.box_id
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="getTicketTransferDetail" resultType="com.qs.mp.channel.domain.vo.ChannelTicketTransferDetailVO">
+        SELECT t4.title,
+               t3.pkg_no,
+               t2.site_name,
+               t2.mobile,
+               t1.created_time
+        FROM mp_channel_ticket_transfer t1
+         LEFT JOIN mp_channel t2 ON t1.channel_id = t2.channel_id
+         LEFT JOIN mp_ticket_package t3 ON t1.pkg_id = t3.pkg_id
+         LEFT JOIN mp_ticket_box t4 ON t1.box_id = t4.box_id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>