chunping 3 anni fa
parent
commit
97ed139f00

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

@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
+ *
+ * https://www.mall4j.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.qs.mp.web.controller.api.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.param.TicketParam;
+import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.domain.vo.TicketListVO;
+import com.qs.mp.admin.domain.vo.TicketVO;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.UserCoin;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserCoinService;
+import com.qs.mp.user.service.IUserHitPrizeService;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+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.List;
+import java.util.Map;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/user")
+@Api(tags = "我的接口")
+@AllArgsConstructor
+public class UserMineController extends BaseApiController {
+
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+  @Autowired
+  private ITicketService ticketService;
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private IUserHitPrizeService userHitPrizeService;
+
+  @Autowired
+  private IUserPrizeStorageService userPrizeStorageService;
+
+  @Autowired
+  private IUserCoinService userCoinService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 我的票包
+   */
+  @PostMapping("/mine/ticket/list")
+  @ApiOperation(value = "我的盲票列表" , notes = "获取我的盲票列表")
+  public TableDataInfo listTicket(@RequestBody Ticket param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    startPage();
+    List<TicketListVO> ticketListVOS = userTicketOrderItemService.listMyTicketVO(userId, param.getStatus());
+    return getDataTable(ticketListVOS);
+  }
+
+  /**
+   * 我的优惠券
+   */
+  @PostMapping("/mine/coupon/list")
+  @ApiOperation(value = "我的优惠券列表" , notes = "获取我的优惠券列表")
+  public TableDataInfo listCoupon(@RequestBody UserCoupon param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    startPage();
+//    List<TicketListVO> ticketListVOS = userTicketOrderItemService.listMyTicketVO(userId, param.getStatus());
+    return getDataTable(null);
+  }
+
+
+  /**
+   * 我的
+   */
+  @PostMapping("/mine/init")
+  @ApiOperation(value = "查看我的" , notes = "查看我的")
+  public AjaxResult getInfo(@RequestBody JSONObject param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    Map<String, Object> storageMap = userPrizeStorageService.getMap(new QueryWrapper<UserPrizeStorage>()
+        .select("IFNULL(goods_num,0) as total")
+        .eq("userId", userId).eq("status", PrizeStorageStatusEnum.NOT_DISTRIBUTED));
+    JSONObject result = new JSONObject();
+    result.put("prizeNum", Integer.valueOf(String.valueOf(storageMap.get("total"))));
+
+    int ticketNum = userTicketOrderItemService.countMyTicket(userId, TicketStatusEnum.ACTIVATED);
+    result.put("ticketNum", ticketNum);
+
+    UserCoin userCoin = userCoinService.getById(userId);
+    result.put("coinNum", null != userCoin ? userCoin.getCoin() : 0);
+    return AjaxResult.success(result);
+  }
+
+  /**
+   * 扫码查看盲票幸运数字
+   */
+  @PostMapping("/ticket/queryLuckyNum")
+  @ApiOperation(value = "查看盲票幸运数字" , notes = "根据盲票组ID,获取盲票幸运数字")
+  public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId())) {
+      return AjaxResult.error("参数异常,盲票ID缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+
+    // 已付款的盲票,需要校验当前用户是否有权限查看
+    if (ticket.getStatus() == TicketStatusEnum.ACTIVATED) {
+      UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, param.getTicketId());
+      if (null == orderItem) {
+        return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
+      }
+    }
+
+    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+
+    TicketVO ticketVO = new TicketVO();
+    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    ticketVO.setTicketId(ticket.getTicketId());
+    ticketVO.setBoxId(ticket.getBoxId());
+    ticketVO.setTitle(ticketBox.getTitle());
+    ticketVO.setSerialNo(ticket.getSerialNo());
+    ticketVO.setFacePrice(ticket.getFacePrice());
+    ticketVO.setSalePrice(ticketBox.getSalePrice());
+    ticketVO.setPlainLuckyNum(ticket.getPlainLuckyNum());
+    ticketVO.setStatus(ticket.getStatus().getValue());
+
+    return AjaxResult.success(ticketVO);
+  }
+
+  /**
+   * 查看能兑奖的奖品
+   */
+  @PostMapping("/ticket/queryHitPrizeList")
+  @ApiOperation(value = "查看兑奖奖品" , notes = "根据盲票ID,查看兑奖奖品")
+  public AjaxResult queryHitPrizeList(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId())) {
+      return AjaxResult.error("参数异常,盲票ID缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+
+    List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
+    return AjaxResult.success(ticketAwardsPrizes);
+  }
+
+  /**
+   * 兑奖
+   */
+  @PostMapping("/ticket/cashPrize")
+  @ApiOperation(value = "兑奖" , notes = "选择奖品兑奖")
+  public AjaxResult cashPrize(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId()) || StringUtils.isBlank(param.getAwardsId())
+    || StringUtils.isBlank(param.getPrizeId())) {
+      return AjaxResult.error("参数缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+
+    userHitPrizeService.cashPrize(ticket, userId, param.getAwardsId(), param.getPrizeId());
+    return AjaxResult.success();
+  }
+
+}

+ 1 - 1
mp-admin/src/test/java/com/qs/mp/service/ServiceImplTest.java

@@ -38,7 +38,7 @@ public class ServiceImplTest {
 
   @Test
   public void testGenerateUrlSchema() {
-    System.out.println(wxUrlLinkService.generateUrlSchema("/pages/deposit/index", "", "wxb86cb7f459fc3675"));
+    System.out.println(wxUrlLinkService.generateUrlSchema("/pages/login/invitation", "", "wxc3a684f1196f6e15"));
 
   }
 

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

@@ -13,7 +13,7 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 @JSONType(deserializer = EnumValueDeserializer.class)
 public enum TicketStatusEnum implements IEnum<Integer> {
   NOT_PAY(1, "未付款"),
-  ACTIVATED(2, "已激活"),
+  ACTIVATED(2, "待兑奖"),
   CASHED(3, "已兑奖"),;
 
   private final int value;

+ 52 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/UserCouponVO.java

@@ -0,0 +1,52 @@
+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.admin.domain.Coupon;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.common.enums.CouponDiscountTypeEnum;
+import com.qs.mp.common.enums.CouponDistributeTypeEnum;
+import com.qs.mp.common.enums.CouponStatusEnum;
+import com.qs.mp.common.enums.CouponTypeEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import java.util.Date;
+import java.util.List;
+import lombok.Data;
+
+/**
+ * @describe 用户优惠券实体类
+ * @auther quanshu
+ * @create 2022-03-07 20:43:44
+ */
+@Data
+public class UserCouponVO extends Coupon {
+
+  /**
+   * 主键
+   */
+  @TableId(value = "id", type = IdType.INPUT)
+  private String id;
+
+  /**
+   * 核销码
+   */
+  @TableField("verify_code")
+  private String verifyCode;
+
+  /**
+   * 使用订单ID
+   */
+  private String orderId;
+
+  /**
+   * 核销时间
+   */
+  private Date verifyTime;
+
+
+
+}

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 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.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import java.util.List;
@@ -16,4 +17,8 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface UserTicketOrderItemMapper extends BaseMapper<UserTicketOrderItem> {
   List<UserTicketOrderItem> listTicketOrderItemVO(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
+
+  List<TicketListVO> listMyTicketVO(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
+
+  int countMyTicket(@Param(Constants.WRAPPER) Wrapper<UserTicketOrderItem> queryWrapper);
 }

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

@@ -1,7 +1,13 @@
 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.common.enums.TicketStatusEnum;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -20,4 +26,18 @@ public interface IUserTicketOrderItemService extends IService<UserTicketOrderIte
    * @return
    */
   UserTicketOrderItem queryFinishedOrderItem(Long userId, String ticketId);
+
+  /**
+   * 查询我的票包
+   * @param status
+   * @return
+   */
+  List<TicketListVO> listMyTicketVO(Long userId, TicketStatusEnum status);
+
+  /**
+   * 查询盲票数
+   * @param status
+   * @return
+   */
+  int countMyTicket(Long userId, TicketStatusEnum status);
 }

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

@@ -1,6 +1,8 @@
 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.common.enums.TicketStatusEnum;
 import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.mapper.UserTicketOrderItemMapper;
@@ -30,4 +32,19 @@ public class UserTicketOrderItemServiceImpl extends ServiceImpl<UserTicketOrderI
     }
     return itemList.get(0);
   }
+
+  @Override
+  public List<TicketListVO> listMyTicketVO(Long userId, TicketStatusEnum status) {
+
+    return getBaseMapper().listMyTicketVO(new QueryWrapper<UserTicketOrderItem>()
+        .eq("t1.userId", userId).eq("t2.status", UserTicketOrderStatusEnum.FINISHED)
+        .eq("t3.status", status));
+  }
+
+  @Override
+  public int countMyTicket(Long userId, TicketStatusEnum status) {
+    return getBaseMapper().countMyTicket(new QueryWrapper<UserTicketOrderItem>()
+        .eq("t1.userId", userId).eq("t2.status", UserTicketOrderStatusEnum.FINISHED)
+        .eq("t3.status", status));
+  }
 }

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

@@ -26,4 +26,21 @@
             ${ew.customSqlSegment}
     </select>
 
+    <select id="listMyTicketVO" resultType="com.qs.mp.admin.domain.vo.TicketListVO">
+        select t1.item_id, t3.*, t4.pic_url
+        from mp_ticket_order_item t1
+         left join mp_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_ticket_box t4 on t3.box_id = t4.box_id
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="countMyTicket" resultType="Integer">
+        select count(*)
+        from mp_ticket_order_item t1
+         left join mp_ticket_order t2 on t1.order_id = t2.order_id
+         left join mp_ticket t3 on t1.ticket_id = t3.ticket_id
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>