Bladeren bron

回收结算接口

cup 2 jaren geleden
bovenliggende
commit
9f64768035

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

@@ -176,10 +176,6 @@ public class UserMineController extends BaseApiController {
       for (UserPrizeStorage userPrizeStorage : userPrizeStorageList) {
         UserPrizeStorageVO userPrizeStorageVO = new UserPrizeStorageVO();
         BeanUtils.copyProperties(userPrizeStorage,userPrizeStorageVO);
-        Goods goods = goodsService.getById(userPrizeStorage.getGoodsId());
-        userPrizeStorageVO.setDiscountRate(goods.getDiscountRate());
-        int refundNum = BigDecimal.valueOf(goods.getExchangePrice()).multiply(goods.getDiscountRate()).divide(BigDecimal.valueOf(100),1, RoundingMode.HALF_UP).intValue();
-        userPrizeStorageVO.setReturnCoin(refundNum);
         userPrizeStorageVOS.add(userPrizeStorageVO);
       }
     }

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

@@ -1,19 +1,36 @@
 package com.qs.mp.web.controller.api.user;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.Goods;
+import com.qs.mp.admin.domain.GoodsSku;
+import com.qs.mp.admin.service.IGoodsService;
+import com.qs.mp.admin.service.IGoodsSkuService;
 import com.qs.mp.admin.service.IPrizeRecoveryService;
 import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.user.domain.UserPrizeStorage;
 import com.qs.mp.user.domain.param.UserPrizeRecoveryCreateParam;
+import com.qs.mp.user.domain.vo.PrizeRecoverySettleVO;
+import com.qs.mp.user.service.IUserPrizeStorageService;
 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 io.swagger.annotations.*;
+import org.aspectj.weaver.loadtime.Aj;
 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;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
 /**
  * @author Cup
  * @date 2022/5/25
@@ -26,6 +43,91 @@ public class UserPrizeRecoveryController extends BaseApiController {
     @Autowired
     private IPrizeRecoveryService prizeRecoveryService;
 
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private IGoodsSkuService goodsSkuService;
+
+    @Autowired
+    private IUserPrizeStorageService userPrizeStorageService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @PostMapping("/settle")
+    @ApiOperation("回收奖品结算页面")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "success", response = PrizeRecoverySettleVO.class)
+    )
+    public AjaxResult settle(@RequestBody UserPrizeRecoveryCreateParam param) {
+        if (StringUtils.isBlank(param.getStorageId()) || Objects.isNull(param.getGoodsId())) {
+            return AjaxResult.error("参数错误");
+        }
+
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        PrizeRecoverySettleVO settleVO = new PrizeRecoverySettleVO();
+
+        UserPrizeStorage userPrizeStorage = userPrizeStorageService.getOne(new LambdaQueryWrapper<UserPrizeStorage>()
+                .eq(UserPrizeStorage::getStorageId, param.getStorageId())
+                .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED)
+                .eq(UserPrizeStorage::getUserId, userId));
+        if (Objects.isNull(userPrizeStorage)) {
+            return AjaxResult.error("奖品不存在");
+        }
+
+        if (userPrizeStorage.getGoodsNum() < param.getNum() || param.getNum() <= 0) {
+            return AjaxResult.error("奖品数量非法");
+        }
+
+        if (!PrizeStorageInTypeEnum.TICKET_CASHED.equals(userPrizeStorage.getInType()) && !PrizeStorageInTypeEnum.COIN_EXCHANGE.equals(userPrizeStorage.getInType())) {
+            return AjaxResult.error("当前奖品类型不支持回收");
+        }
+
+        // 回收折扣
+        BigDecimal discountRate = new BigDecimal(70);
+        // 兑换价格
+        Integer exchangePrice = 0;
+
+        if (Objects.isNull(userPrizeStorage.getSkuId())) {
+            GoodsSku goodsSku = goodsSkuService.getById(userPrizeStorage.getSkuId());
+            if (Objects.isNull(goodsSku)) {
+                return AjaxResult.error("sku信息有误");
+            }
+            if (!BigDecimal.ZERO.equals(goodsSku.getDiscountRate())) {
+                discountRate = goodsSku.getDiscountRate();
+            }
+            exchangePrice = goodsSku.getExchangePrice();
+
+        } else {
+            Goods goods = goodsService.getById(userPrizeStorage.getGoodsId());
+            if (Objects.isNull(goods)) {
+                return AjaxResult.error("商品信息有误");
+            }
+            if (!BigDecimal.ZERO.equals(goods.getDiscountRate())) {
+                discountRate = goods.getDiscountRate();
+            }
+            exchangePrice = goods.getExchangePrice();
+        }
+
+        int refundNum = BigDecimal.valueOf((long) exchangePrice * param.getNum()).multiply(discountRate).divide(BigDecimal.valueOf(100),0, RoundingMode.HALF_UP).intValue();
+
+        settleVO.setRefundCoin(refundNum);
+        // 封装结算对象
+        settleVO.setStorageId(userPrizeStorage.getStorageId());
+        settleVO.setGoodsId(userPrizeStorage.getGoodsId());
+        settleVO.setTitle(userPrizeStorage.getTitle());
+        settleVO.setPicUrl(userPrizeStorage.getPicUrl());
+        settleVO.setSkuId(param.getSkuId());
+        settleVO.setProperties(param.getProperties());
+        settleVO.setNum(param.getNum());
+
+        // 缓存回收结算对象
+        redisCache.setCacheObject(RedisKey.build(RedisKey.USER_PRIZE_RECOVERY_KEY, userId), settleVO, 10, TimeUnit.MINUTES);
+        return AjaxResult.success(settleVO);
+    }
+
     @PostMapping("/convert")
     @ApiOperation("回收奖品")
     public AjaxResult convert(@RequestBody UserPrizeRecoveryCreateParam userPrizeRecoveryCreateParam) {

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

@@ -76,19 +76,19 @@ public class PrizeRecovery implements Serializable {
     private Integer num;
 
     /**
-     * 奖品ID(GOODS_ID或TEMPL_ID)
+     * 商品id
      */
-    @ApiModelProperty("奖品ID(GOODS_ID或TEMPL_ID)")
-    @TableField("ref_id")
-    private String refId;
+    @ApiModelProperty("商品id")
+    @TableField("goods_id")
+    private Long goodsId;
 
-    /**
-     * 奖品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包
-     */
-    @ApiModelProperty("奖品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包")
-    @TableField("prize_type")
-    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-    private TicketPrizeTypeEnum prizeType;
+    @ApiModelProperty("商品id")
+    @TableField("sku_id")
+    private Long skuId;
+
+    @ApiModelProperty("属性组合字符串 格式是p1:v1;p2:v2")
+    @TableField("properties")
+    private String properties;
 
     /**
      * 回收折扣比例

+ 21 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/PrizeRecoveryListVO.java

@@ -0,0 +1,21 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.admin.domain.PrizeRecovery;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 商品回收列表出参类
+ * @author Cup
+ * @date 2022/5/25
+ */
+@ApiModel("商品回收列表出参类")
+@Data
+public class PrizeRecoveryListVO extends PrizeRecovery {
+
+    private String nickName;
+
+    private String userPhone;
+
+}

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

@@ -50,50 +50,50 @@ public class PrizeRecoveryServiceImpl extends ServiceImpl<PrizeRecoveryMapper, P
     @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);
+//        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);
 
 
     }

+ 2 - 1
mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java

@@ -13,7 +13,8 @@ public enum RedisKey {
     CHANNEL_ORDER_KEY("channel_order_{0}", "经销商下的盲票采购单"),
     USER_TICKET_ORDER_KEY("user_ticket_order_key_{0}", "用户购票订单"),
     USER_DELIVER_ORDER_KEY("user_deliver_order_key_{0}", "用户提货订单"),
-    OFFLINE_TICKET_ID_KEY("offline_ticket_id_key_{0}", "线下盲票ID"),;
+    OFFLINE_TICKET_ID_KEY("offline_ticket_id_key_{0}", "线下盲票ID"),
+    USER_PRIZE_RECOVERY_KEY("user_prize_recovery_key_{0}", "用户奖品回收");
 
     public String keyTemplate;
     public String desc;

+ 7 - 10
mp-service/src/main/java/com/qs/mp/user/domain/param/UserPrizeRecoveryCreateParam.java

@@ -21,20 +21,17 @@ 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("商品Id")
+    private Long goodsId;
+
+    @ApiModelProperty("sku Id")
+    private Long skuId;
 
-    @ApiModelProperty("奖品类型 goods 实物商品 coupon优惠券 coin平台代币 coupon_pkg券包")
-    private TicketPrizeTypeEnum prizeType;
+    @ApiModelProperty("属性组合字符串 格式是p1:v1;p2:v2")
+    private String properties;
 
 
 

+ 42 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/PrizeRecoverySettleVO.java

@@ -0,0 +1,42 @@
+package com.qs.mp.user.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 奖品回收结算出参类
+ * @author Cup
+ * @date 2022/5/25
+ */
+@Data
+@ApiModel("奖品回收结算出参类")
+public class PrizeRecoverySettleVO {
+
+    @ApiModelProperty("关联奖品库id")
+    private String storageId;
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("图片")
+    private String picUrl;
+
+    @ApiModelProperty("商品id")
+    private Long goodsId;
+
+    @ApiModelProperty("skuId")
+    private Long skuId;
+
+    @ApiModelProperty("属性组合字符串 格式是p1:v1;p2:v2")
+    private String properties;
+
+    @ApiModelProperty("商品数量")
+    private Integer num;
+
+    @ApiModelProperty("返还盲豆数")
+    private Integer refundCoin;
+
+
+}