Răsfoiți Sursa

微信红包

zhangkaikai 1 an în urmă
părinte
comite
f9fbcdadfa

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

@@ -17,23 +17,13 @@ import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
-import com.qs.mp.user.domain.UserCoin;
-import com.qs.mp.user.domain.UserCoinLog;
-import com.qs.mp.user.domain.UserCoupon;
-import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.*;
 import com.qs.mp.user.domain.dto.CoinTransferParamDTO;
-import com.qs.mp.user.domain.param.CdKeyExchangeParam;
-import com.qs.mp.user.domain.param.CoinTransferParam;
-import com.qs.mp.user.domain.param.CouponChannelQueryParam;
-import com.qs.mp.user.domain.param.UserPrizeStorageUpdateParam;
+import com.qs.mp.user.domain.param.*;
 import com.qs.mp.user.domain.vo.UserCouponVO;
 import com.qs.mp.user.domain.vo.UserExchangeCdKeyVO;
 import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
-import com.qs.mp.user.service.IUserCoinLogService;
-import com.qs.mp.user.service.IUserCoinService;
-import com.qs.mp.user.service.IUserCouponService;
-import com.qs.mp.user.service.IUserPrizeStorageService;
-import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.user.service.*;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.*;
@@ -98,6 +88,9 @@ public class UserMineController extends BaseApiController {
     @Autowired
     private ICdKeyGroupService cdKeyGroupService;
 
+    @Autowired
+    private IUserRedPkgService redPkgService;
+
     @Log(title = "昵称和头像修改", businessType = BusinessType.UPDATE)
     @PostMapping("/updateUserInfo")
     public AjaxResult updateUserInfo(@RequestBody SysUser user) {
@@ -173,6 +166,35 @@ public class UserMineController extends BaseApiController {
         return getDataTable(userCouponVOList);
     }
 
+    /**
+     * 我的红包
+     */
+    @PostMapping("/red/pkg/list")
+    @ApiOperation("我的红包")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "成功", response = UserRedPkg.class)
+    )
+    public TableDataInfo redPkgList(@RequestBody UserRedPkg redPkg) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        startPage();
+        List<UserRedPkg> redPkgList = redPkgService.list(new QueryWrapper<UserRedPkg>().eq("user_id", userId)
+                .eq("status", redPkg.getStatus())
+                .orderByDesc(UserRedPkgStatusEnum.UN_DRAW.equals(redPkg.getStatus()), "created_time")
+                .orderByDesc(UserRedPkgStatusEnum.DRAW.equals(redPkg.getStatus()), "draw_time"));
+        return getDataTable(redPkgList);
+    }
+
+    /**
+     * 红包领取
+     */
+    @PostMapping("red/pkg/draw")
+    @ApiOperation("红包领取")
+    public AjaxResult redPkgDraw(@RequestBody RedPkgDrawParam param) {
+
+        boolean rst = redPkgService.draw(param);
+        return AjaxResult.success("红包领取成功,请查看微信钱包零钱余额");
+    }
+
     /**
      * 优惠券详情
      */

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

@@ -153,7 +153,8 @@ public class UserTicketController extends BaseApiController {
     @PostMapping("/mall/ticket/list")
     @ApiOperation(value = "盲票组列表", notes = "获取所有盲票信息")
     public TableDataInfo list(@RequestBody TicketBoxParam param) {
-
+        // 支付宝小程序仅展示无红包奖项的票组
+        boolean b = !"1" .equals(param.getAppSource());
         startPage();
         List<TicketBox> ticketBoxes = ticketBoxService.list(
             new LambdaQueryWrapper<TicketBox>().eq(TicketBox::getType, param.getType())
@@ -161,6 +162,7 @@ public class UserTicketController extends BaseApiController {
                     TicketBox::getCategoryId, param.getCategoryId())
                 .in(CollectionUtils.isNotEmpty(param.getBoxIds()), TicketBox::getBoxId, param.getBoxIds())
                 .eq(TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+                    .eq(b,TicketBox::getIsHaveRedPkg,0)
                 .orderByDesc(TicketBox::getSortWeight)
         );
         List<TicketBoxListVO> ticketBoxListVOList = mapperFacade.mapAsList(ticketBoxes,
@@ -431,6 +433,14 @@ public class UserTicketController extends BaseApiController {
         if (TicketBoxStatusEnum.STOP.getValue().equals(ticketBox.getStatus().getValue())) {
             return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1027);
         }
+        boolean b = !"1" .equals(param.getAppSource());
+        if (b) {
+            // 支付宝扫码
+            if (ticketBox.getIsHaveRedPkg() == 1) {
+                // 奖项中存在红包的票组只能使用微信扫码
+                throw new ServiceException("请使用微信扫码");
+            }
+        }
     /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
     }*/

+ 5 - 0
mp-common/src/main/java/com/qs/mp/common/constant/Constants.java

@@ -168,4 +168,9 @@ public class Constants
      * 盲豆默认图片
      */
     public static final String MANGDOU_PIC = "md.png";
+
+    /**
+     * 红包默认图片
+     */
+    public static final String HONGBAO_PIC = "redPkg.png";
 }

+ 1 - 0
mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.java

@@ -17,6 +17,7 @@ public enum TicketPrizeTypeEnum implements IEnum<String> {
   COUPON("coupon", "优惠券"),
   COUPON_PKG("coupon_pkg", "优惠券包"),
   COIN("coin", "盲豆"),
+  RED_PKG("red_pkg", "红包"),
   ;
 
   private final String value;

+ 44 - 0
mp-common/src/main/java/com/qs/mp/common/enums/UserRedPkgStatusEnum.java

@@ -0,0 +1,44 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-12 3:10 PM
+ **/
+
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum UserRedPkgStatusEnum implements IEnum<Integer> {
+    UN_DRAW(0,"未领取"),
+    DRAW(1, "已领取"),
+    ;
+
+    private final Integer value;
+    private final String desc;
+
+    UserRedPkgStatusEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     *
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value", value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+}

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

@@ -239,6 +239,10 @@ public class TicketBox implements Serializable {
   @TableField(exist = false)
   private Integer finalGrossProfit;
 
+  @ApiModelProperty("奖项有无红包 0无 1有")
+  @TableField("is_have_red_pkg")
+  private Integer isHaveRedPkg;
+
 
   @ApiModelProperty("预付票包价格")
   public Integer getPkgPrePrice() {

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

@@ -67,4 +67,7 @@ public class TicketBoxCreateParam {
 
 	@ApiModelProperty("关联商品列表")
 	private List<TicketBoxGoods> goodsList;
+
+	@ApiModelProperty("奖项有无红包 0无 1有")
+	private Integer isHaveRedPkg;
 }

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

@@ -35,4 +35,7 @@ public class TicketBoxParam {
 
 	@ApiModelProperty("价格排序,1正序,2倒序")
 	private Integer salePriceSort;
+
+	@ApiModelProperty("小程序,1微信,2支付宝")
+	private String appSource;
 }

+ 2 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketParam.java

@@ -25,5 +25,6 @@ public class TicketParam {
 	@ApiModelProperty(value = "奖品ID",required=false)
 	private String prizeId;
 
-
+	@ApiModelProperty("小程序,1微信,2支付宝")
+	private String appSource;
 }

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

@@ -285,6 +285,9 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
                         awardsPrize.setTitle(couponPkg.getTitle());
                         awardsPrize.setValue(couponPkg.getFacePrice());
                         awardsPrize.setPicUrl(couponPkg.getPicUrl());
+                    }  else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.RED_PKG) {
+                        awardsPrize.setTitle("微信红包");
+                        awardsPrize.setPicUrl(Constants.HONGBAO_PIC);
                     }  else {
                         awardsPrize.setTitle("盲豆");
                         awardsPrize.setPicUrl(Constants.MANGDOU_PIC);
@@ -536,7 +539,10 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
                     awardsPrize.setTitle(couponPkg.getTitle());
                     awardsPrize.setValue(couponPkg.getFacePrice());
                     awardsPrize.setPicUrl(couponPkg.getPicUrl());
-                }  else {
+                } else if (prizeParam.getPrizeType() == TicketPrizeTypeEnum.RED_PKG) {
+                    awardsPrize.setTitle("微信红包");
+                    awardsPrize.setPicUrl(Constants.HONGBAO_PIC);
+                } else {
                     awardsPrize.setTitle("盲豆");
                     awardsPrize.setPicUrl(Constants.MANGDOU_PIC);
                 }

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

@@ -0,0 +1,100 @@
+package com.qs.mp.user.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.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import com.qs.mp.common.enums.UserRedPkgStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 用户的红包实体类
+ * @auther quanshu
+ * @create 2023-06-12 15:03:20
+ */
+@ApiModel("用户的红包实体类")
+@TableName("mp_user_red_pkg")
+@Data
+public class UserRedPkg implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.INPUT)
+    private String id;
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户id")
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 入库关联业务id
+     */
+    @ApiModelProperty("入库关联业务id")
+    @TableField("ref_id")
+    private String refId;
+
+    /**
+     * 标题
+     */
+    @ApiModelProperty("标题")
+    @TableField("title")
+    private String title;
+
+    /**
+     * 图片
+     */
+    @ApiModelProperty("图片")
+    @TableField("pic_url")
+    private String picUrl;
+
+    /**
+     * 金额
+     */
+    @ApiModelProperty("金额")
+    @TableField("value")
+    private Integer value;
+
+    /**
+     * 领取时间
+     */
+    @TableField("draw_time")
+    @ApiModelProperty("领取时间")
+    private Date drawTime;
+
+    /**
+     * 状态;0未领取 1已领取
+     */
+    @ApiModelProperty("0未领取 1已领取")
+    @TableField("status")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private UserRedPkgStatusEnum status;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+
+}

+ 21 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/RedPkgDrawParam.java

@@ -0,0 +1,21 @@
+package com.qs.mp.user.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-06-12 4:25 PM
+ **/
+
+@ApiModel("红包领取参数")
+@Data
+public class RedPkgDrawParam {
+
+    @ApiModelProperty("用户openid")
+    private String openId;
+
+    @ApiModelProperty("红包id")
+    private String id;
+}

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

@@ -0,0 +1,13 @@
+package com.qs.mp.user.mapper;
+
+import com.qs.mp.user.domain.UserRedPkg;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-12 15:03:20
+ * @describe 用户的红包mapper类
+ */
+public interface UserRedPkgMapper extends BaseMapper<UserRedPkg> {
+
+}

+ 31 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserRedPkgService.java

@@ -0,0 +1,31 @@
+package com.qs.mp.user.service;
+
+import com.qs.mp.user.domain.UserRedPkg;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.param.RedPkgDrawParam;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-12 15:03:20
+ * @describe 用户的红包服务类
+ */
+public interface IUserRedPkgService extends IService<UserRedPkg> {
+
+    /**
+     * 发放红包
+     *
+     * @param userId
+     * @param value
+     * @param title
+     * @param picUrl
+     * @param refId
+     */
+    void distribute(Long userId, Integer value, String title, String picUrl, String refId);
+
+    /**
+     * 领取红包到微信零钱
+     * @param param
+     * @return
+     */
+    boolean draw(RedPkgDrawParam param);
+}

+ 9 - 6
mp-service/src/main/java/com/qs/mp/user/service/impl/UserHitPrizeServiceImpl.java

@@ -24,11 +24,8 @@ import com.qs.mp.user.domain.param.TicketAutoCashPrizeParam;
 import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
 import com.qs.mp.user.domain.vo.UserHitPrizeDetailVO;
 import com.qs.mp.user.mapper.UserHitPrizeMapper;
-import com.qs.mp.user.service.IUserCoinService;
-import com.qs.mp.user.service.IUserHitPrizeService;
+import com.qs.mp.user.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qs.mp.user.service.IUserPrizeStorageService;
-import com.qs.mp.user.service.IUserTicketOrderItemService;
 
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -94,6 +91,10 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
     @Autowired
     private DistributedLocker distributedLocker;
 
+    @Autowired
+    private IUserRedPkgService redPkgService;
+
+
     @Override
     public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
         UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
@@ -308,8 +309,10 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
             couponService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
         } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON_PKG) {
             couponPkgService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
-        }else {
-            userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize.getTitle(),ticketAwardsPrize.getPicUrl(),ticketAwardsPrize.getRefId(), PrizeStorageInTypeEnum.TICKET_CASHED, userHitPrize.getId());
+        } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.RED_PKG) {
+            redPkgService.distribute(userId, ticketAwardsPrize.getValue(),ticketAwardsPrize.getTitle(), ticketAwardsPrize.getPicUrl(), userHitPrize.getId());
+        } else {
+            userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize.getTitle(), ticketAwardsPrize.getPicUrl(), ticketAwardsPrize.getRefId(), PrizeStorageInTypeEnum.TICKET_CASHED, userHitPrize.getId());
         }
 
         boolean rtn = ticketService.update(new LambdaUpdateWrapper<Ticket>().set(Ticket::getStatus, TicketStatusEnum.CASHED)

+ 43 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserRedPkgServiceImpl.java

@@ -0,0 +1,43 @@
+package com.qs.mp.user.service.impl;
+import java.util.Date;
+
+import com.qs.mp.common.enums.UserRedPkgStatusEnum;
+import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.UserRedPkg;
+import com.qs.mp.user.domain.param.RedPkgDrawParam;
+import com.qs.mp.user.mapper.UserRedPkgMapper;
+import com.qs.mp.user.service.IUserRedPkgService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @auther quanshu
+ * @create 2023-06-12 15:03:20
+ * @describe 用户的红包服务实现类
+ */
+@Service
+public class UserRedPkgServiceImpl extends ServiceImpl<UserRedPkgMapper, UserRedPkg> implements IUserRedPkgService {
+
+    @Autowired
+    private BizIdGenerator bizIdGenerator;
+
+    @Override
+    public void distribute(Long userId, Integer value, String title, String picUrl, String refId) {
+        UserRedPkg userRedPkg = new UserRedPkg();
+        userRedPkg.setId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+        userRedPkg.setUserId(userId);
+        userRedPkg.setRefId(refId);
+        userRedPkg.setTitle(title);
+        userRedPkg.setPicUrl(picUrl);
+        userRedPkg.setValue(value);
+        userRedPkg.setStatus(UserRedPkgStatusEnum.UN_DRAW);
+        save(userRedPkg);
+    }
+
+    @Override
+    public boolean draw(RedPkgDrawParam param) {
+
+        return false;
+    }
+}

+ 24 - 0
mp-service/src/main/resources/mapper/user/UserRedPkgMapper.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.user.mapper.UserRedPkgMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.user.domain.UserRedPkg">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="ref_id" property="refId" />
+        <result column="title" property="title" />
+        <result column="pic_url" property="picUrl" />
+        <result column="value" property="value" />
+        <result column="draw_time" property="drawTime" />
+        <result column="status" property="status" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_id, ref_id, title, pic_url, value, draw_time, status, created_time, updated_time
+    </sql>
+
+</mapper>