Kaynağa Gözat

奖品回收

cup 2 yıl önce
ebeveyn
işleme
ca2af9592f

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

@@ -156,6 +156,9 @@ public class UserMineController extends BaseApiController {
    */
   @PostMapping("/prize/list")
   @ApiOperation(value = "我的实物奖品库", notes = "获取我的实物奖品库")
+  @ApiResponses(
+          @ApiResponse(code = 200, message = "成功", response = UserPrizeStorageVO.class)
+  )
   public TableDataInfo listPrize(@RequestBody UserPrizeStorageQueryParam userPrizeStorageQueryParam) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
     startPage();

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

@@ -0,0 +1,38 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.qs.mp.admin.service.IPrizeRecoveryService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.user.domain.param.UserPrizeRecoveryCreateParam;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+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;
+
+/**
+ * @author Cup
+ * @date 2022/5/25
+ */
+@RestController
+@RequestMapping("/api/v1/mp/user/prize/recovery")
+@Api(tags = "用户奖品回收相关接口")
+public class UserPrizeRecoveryController extends BaseApiController {
+
+    @Autowired
+    private IPrizeRecoveryService prizeRecoveryService;
+
+    @PostMapping("/convert")
+    @ApiOperation("回收奖品")
+    public AjaxResult convert(@RequestBody UserPrizeRecoveryCreateParam userPrizeRecoveryCreateParam) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        prizeRecoveryService.convert(userId, userPrizeRecoveryCreateParam);
+
+        return AjaxResult.success();
+    }
+
+}

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

@@ -12,7 +12,8 @@ public enum CoinLogTypeEnum implements IEnum<Integer> {
 
   PRIZE(1, "盲票奖品"),
   EXCHANGE(2, "商品兑换"),
-  MARKETING(3,"营销活动");
+  MARKETING(3,"营销活动"),
+  RECOVERY(4,"奖品回收");
 
 
   private final int value;

+ 3 - 1
mp-service/src/main/java/com/qs/mp/admin/domain/PrizeRecovery.java

@@ -16,6 +16,8 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -86,7 +88,7 @@ public class PrizeRecovery implements Serializable {
     @ApiModelProperty("奖品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包")
     @TableField("prize_type")
     @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-    private String prizeType;
+    private TicketPrizeTypeEnum prizeType;
 
     /**
      * 回收折扣比例

+ 9 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IPrizeRecoveryService.java

@@ -2,6 +2,7 @@ package com.qs.mp.admin.service;
 
 import com.qs.mp.admin.domain.PrizeRecovery;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.param.UserPrizeRecoveryCreateParam;
 
 /**
  * <p>
@@ -13,4 +14,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IPrizeRecoveryService extends IService<PrizeRecovery> {
 
+    /**
+     * 回收奖品
+     * @param userId
+     * @param userPrizeRecoveryCreateParam
+     */
+    void convert(Long userId, UserPrizeRecoveryCreateParam userPrizeRecoveryCreateParam);
+
+
 }

+ 80 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/PrizeRecoveryServiceImpl.java

@@ -1,10 +1,31 @@
 package com.qs.mp.admin.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.PrizeRecovery;
 import com.qs.mp.admin.mapper.PrizeRecoveryMapper;
+import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IPrizeRecoveryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.common.enums.CoinLogTypeEnum;
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.param.UserPrizeRecoveryCreateParam;
+import com.qs.mp.user.service.IUserCoinService;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
 
 /**
  * <p>
@@ -17,4 +38,63 @@ import org.springframework.stereotype.Service;
 @Service
 public class PrizeRecoveryServiceImpl extends ServiceImpl<PrizeRecoveryMapper, PrizeRecovery> implements IPrizeRecoveryService {
 
+    @Autowired
+    private IUserPrizeStorageService userPrizeStorageService;
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private IUserCoinService userCoinService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void convert(Long userId, UserPrizeRecoveryCreateParam userPrizeRecoveryCreateParam) {
+        UserPrizeStorage userPrizeStorage = userPrizeStorageService.getOne(new LambdaQueryWrapper<UserPrizeStorage>()
+                .eq(UserPrizeStorage::getUserId, userId)
+                .eq(UserPrizeStorage::getStorageId, userPrizeRecoveryCreateParam.getStorageId()));
+        if (Objects.isNull(userPrizeStorage)) {
+            throw new ServiceException("奖品不存在");
+        }
+        if (!PrizeStorageStatusEnum.NOT_DISTRIBUTED.equals(userPrizeStorage.getStatus())) {
+            throw new ServiceException("仅待提货的奖品才可未收回");
+        }
+        if (!PrizeStorageInTypeEnum.TICKET_CASHED.equals(userPrizeStorage.getInType())) {
+            throw new ServiceException("仅盲票兑奖的奖品才可未收回");
+        }
+        if (!TicketPrizeTypeEnum.GOODS.equals(userPrizeRecoveryCreateParam.getPrizeType())) {
+            throw new ServiceException("仅实物奖品才可未收回");
+        }
+
+        Goods goods = goodsService.getById(userPrizeRecoveryCreateParam.getRefId());
+        if (Objects.isNull(goods)) {
+            throw new ServiceException("商品信息不存在");
+        }
+
+        PrizeRecovery prizeRecovery = new PrizeRecovery();
+        BeanUtils.copyProperties(userPrizeRecoveryCreateParam, prizeRecovery);
+        prizeRecovery.setUserId(userId);
+        prizeRecovery.setDiscountRate(goods.getDiscountRate());
+        int refundNum = BigDecimal.valueOf(goods.getExchangePrice()).multiply(goods.getDiscountRate()).divide(BigDecimal.valueOf(100), 1, RoundingMode.HALF_UP).intValue();
+        prizeRecovery.setReturnCoin(refundNum);
+
+
+        // 更新用户奖品状态
+        boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
+                .set(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.RECOVERY)
+                .eq(UserPrizeStorage::getUserId, userId)
+                .eq(UserPrizeStorage::getStorageId, userPrizeRecoveryCreateParam.getStorageId())
+                .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED));
+
+        Assert.isTrue(rtn, "更新奖品状态失败。storageId:" + userPrizeRecoveryCreateParam.getStorageId());
+
+
+        // 发放盲豆
+        userCoinService.produce(userId, refundNum, prizeRecovery.getId().toString(), CoinLogTypeEnum.RECOVERY);
+
+
+        this.save(prizeRecovery);
+
+
+    }
 }

+ 41 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/UserPrizeRecoveryCreateParam.java

@@ -0,0 +1,41 @@
+package com.qs.mp.user.domain.param;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.admin.domain.PrizeRecovery;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 用户奖品回收入参类
+ * @author Cup
+ * @date 2022/5/25
+ */
+@ApiModel("用户奖品回收入参类")
+@Data
+public class UserPrizeRecoveryCreateParam {
+
+    @ApiModelProperty("关联奖品库id")
+    private String storageId;
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("图片")
+    private String picUrl;
+
+    @ApiModelProperty("数量")
+    private Integer num;
+
+    @ApiModelProperty("奖品ID(GOODS_ID或TEMPL_ID)")
+    private String refId;
+
+    @ApiModelProperty("奖品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包")
+    private TicketPrizeTypeEnum prizeType;
+
+
+
+}