Эх сурвалжийг харах

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

chunping 2 жил өмнө
parent
commit
804104e38d

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

@@ -12,20 +12,25 @@ import com.qs.mp.admin.service.IMarketingService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.MarketingStatusEnum;
+import com.qs.mp.common.enums.UserTypeEnum;
 import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.user.domain.MarketingHitPrize;
 import com.qs.mp.user.domain.MarketingUserCode;
+import com.qs.mp.user.domain.param.MarketingHelpParam;
 import com.qs.mp.user.domain.param.UserMarketingQueryParam;
 import com.qs.mp.user.domain.vo.UserMarketingDetailVO;
 import com.qs.mp.user.domain.vo.UserMarketingListVO;
 import com.qs.mp.user.service.IMarketingHitPrizeService;
 import com.qs.mp.user.service.IMarketingUserCodeService;
+import com.qs.mp.utils.MarketingUtils;
 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 io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -61,6 +66,88 @@ public class MarketingController extends BaseApiController {
     @Autowired
     private IMarketingUserCodeService marketingUserCodeService;
 
+    @PostMapping("/help")
+    @ApiOperation("活动助力")
+    public AjaxResult help(@RequestBody MarketingHelpParam marketingHelpParam) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        if (Objects.isNull(userId)) {
+            return AjaxResult.error("用户未登录");
+        }
+
+
+        String inviteCode = marketingHelpParam.getInviteCode();
+        if (StringUtils.isBlank(inviteCode)) {
+            return AjaxResult.error("邀请码不能为空");
+        }
+
+        Marketing marketing = marketingService.getById(marketingHelpParam.getMarketingId());
+        if (Objects.isNull(marketing)) {
+            return AjaxResult.error("活动不存在");
+        }
+        // 未开启的活动不能助力
+        if (MarketingStatusEnum.ON.getValue().equals(marketing.getIsOn())) {
+            return AjaxResult.error("活动未开启~");
+        }
+        Date now = DateUtils.getNowDate();
+        // 结束的活动不支持助力
+        if (marketing.getTriggerStatus() == 1 || marketing.getEndTime().before(now)) {
+            return AjaxResult.error("活动已过期~");
+        }
+        // 未开始的活动不能助力
+        if (marketing.getStartTime().after(now)) {
+            return AjaxResult.error("活动未开始~");
+        }
+
+
+        // 判断是否已经助力过
+        int count = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                .eq(MarketingUserCode::getUserId, userId)
+                .eq(MarketingUserCode::getMarketingId, marketingHelpParam.getMarketingId()));
+        if (count > 0) {
+            return AjaxResult.error("您已经助力过了");
+        }
+
+        // 邀请码解码,被助力人id
+        Long helpedUserId = MarketingUtils.decodeInviteCode(inviteCode);
+
+        // 生成抽奖码
+        String code = "";
+        while (true) {
+            code = MarketingUtils.generatePrizeCode();
+            // 判断抽奖码是否已经存在
+            int codeCount = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                    .eq(MarketingUserCode::getCode, code));
+            if (codeCount > 0) {
+                continue;
+            }
+            break;
+        }
+
+        MarketingUserCode marketingUserCode = new MarketingUserCode();
+        marketingUserCode.setMarketingId(marketingHelpParam.getMarketingId());
+        marketingUserCode.setCode(code);
+        // 设置被助力人
+        marketingUserCode.setUserId(helpedUserId);
+        // 设置助力人
+        marketingUserCode.setHelpUserId(userId);
+        marketingUserCode.setUserType(UserTypeEnum.ORDINARY.getValue());
+
+        marketingUserCodeService.save(marketingUserCode);
+        return AjaxResult.success("助力成功");
+    }
+
+
+    @PostMapping("/inviteCode")
+    @ApiOperation(value = "邀请码生成", notes = "邀请码生成")
+    public AjaxResult inviteCode() {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        if (Objects.isNull(userId)) {
+            return AjaxResult.error("用户未登录");
+        }
+        return AjaxResult.success(MarketingUtils.generateInviteCode(userId));
+    }
+
+
     @PostMapping("list")
     @ApiOperation("获取营销活动列表")
     @ApiResponses(

+ 23 - 0
mp-common/src/main/java/com/qs/mp/common/enums/MarketingStatusEnum.java

@@ -2,8 +2,11 @@ package com.qs.mp.common.enums;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.utils.DateUtils;
 import io.swagger.annotations.ApiModel;
 
+import java.util.Date;
+
 /**
  * 活动状态枚举类
  * @author Cup
@@ -62,4 +65,24 @@ public enum MarketingStatusEnum implements IEnum<Integer> {
         }
         return null;
     }
+
+    public static String getStatus(Date startTime, Date endTime, Integer isOn) {
+        if (MarketingStatusEnum.OFF.getValue().equals(isOn)) {
+            return MarketingStatusEnum.OFF.toString();
+        }
+        if (MarketingStatusEnum.CLOSE.getValue().equals(isOn)) {
+            return MarketingStatusEnum.CLOSE.toString();
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (now.before(startTime)) {
+            return MarketingStatusEnum.UNSTART.toString();
+        }
+
+        if (now.after(endTime)) {
+            return MarketingStatusEnum.END.toString();
+        }
+
+        return MarketingStatusEnum.START.toString();
+    }
 }

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

@@ -12,7 +12,8 @@ import com.baomidou.mybatisplus.annotation.IEnum;
 public enum PrizeStorageInTypeEnum implements IEnum<Integer> {
 
   TICKET_CASHED(1, "奖品兑奖"),
-  COIN_EXCHANGE(2, "盲豆兑换");
+  COIN_EXCHANGE(2, "盲豆兑换"),
+  MARKETING(3, "营销活动");
 
 
   private final int value;

+ 1 - 18
mp-service/src/main/java/com/qs/mp/admin/domain/vo/MarketingListVO.java

@@ -45,24 +45,7 @@ public class MarketingListVO {
     private String status;
 
     public String getStatus() {
-
-        if (MarketingStatusEnum.OFF.getValue().equals(this.isOn)) {
-            return MarketingStatusEnum.OFF.toString();
-        }
-        if (MarketingStatusEnum.CLOSE.getValue().equals(this.isOn)) {
-            return MarketingStatusEnum.CLOSE.toString();
-        }
-
-        Date now = DateUtils.getNowDate();
-        if (now.before(this.startTime)) {
-            return MarketingStatusEnum.UNSTART.toString();
-        }
-
-        if (now.after(this.endTime)) {
-            return MarketingStatusEnum.END.toString();
-        }
-
-        return MarketingStatusEnum.START.toString();
+        return MarketingStatusEnum.getStatus(this.startTime, this.endTime, this.isOn);
     }
 
 }

+ 1 - 1
mp-service/src/main/java/com/qs/mp/user/domain/UserPrizeStorage.java

@@ -88,7 +88,7 @@ public class UserPrizeStorage implements Serializable {
    */
   @TableField("in_type")
   @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
-  @ApiModelProperty("入库类型;1盲票兑奖、2盲豆兑换")
+  @ApiModelProperty("入库类型;1盲票兑奖、2盲豆兑换,3营销活动")
   private PrizeStorageInTypeEnum inType;
 
   /**

+ 24 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/MarketingHelpParam.java

@@ -0,0 +1,24 @@
+package com.qs.mp.user.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 活动助力入参类
+ * @author Cup
+ * @date 2022/5/18
+ */
+@ApiModel("活动助力入参类")
+@Data
+public class MarketingHelpParam {
+
+    @NotNull(message = "活动id不能为空")
+    @ApiModelProperty("活动ID")
+    private Long marketingId;
+
+    @ApiModelProperty("邀请码")
+    private String inviteCode;
+}

+ 1 - 18
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserMarketingDetailVO.java

@@ -51,23 +51,6 @@ public class UserMarketingDetailVO {
     List<MarketingAwardsVO> awardsList;
 
     public String getStatus() {
-
-        if (MarketingStatusEnum.OFF.getValue().equals(this.isOn)) {
-            return MarketingStatusEnum.OFF.toString();
-        }
-        if (MarketingStatusEnum.CLOSE.getValue().equals(this.isOn)) {
-            return MarketingStatusEnum.CLOSE.toString();
-        }
-
-        Date now = DateUtils.getNowDate();
-        if (now.before(this.startTime)) {
-            return MarketingStatusEnum.UNSTART.toString();
-        }
-
-        if (now.after(this.endTime)) {
-            return MarketingStatusEnum.END.toString();
-        }
-
-        return MarketingStatusEnum.START.toString();
+        return MarketingStatusEnum.getStatus(this.startTime, this.endTime, this.isOn);
     }
 }

+ 1 - 18
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserMarketingListVO.java

@@ -42,24 +42,7 @@ public class UserMarketingListVO {
     private String status;
 
     public String getStatus() {
-
-        if (MarketingStatusEnum.OFF.getValue().equals(this.isOn)) {
-            return MarketingStatusEnum.OFF.toString();
-        }
-        if (MarketingStatusEnum.CLOSE.getValue().equals(this.isOn)) {
-            return MarketingStatusEnum.CLOSE.toString();
-        }
-
-        Date now = DateUtils.getNowDate();
-        if (now.before(this.startTime)) {
-            return MarketingStatusEnum.UNSTART.toString();
-        }
-
-        if (now.after(this.endTime)) {
-            return MarketingStatusEnum.END.toString();
-        }
-
-        return MarketingStatusEnum.START.toString();
+        return MarketingStatusEnum.getStatus(this.startTime,this.endTime,this.isOn);
     }
 
 }

+ 13 - 27
mp-service/src/main/java/com/qs/mp/user/service/impl/UserExchangeOrderServiceImpl.java

@@ -111,33 +111,19 @@ public class UserExchangeOrderServiceImpl extends ServiceImpl<UserExchangeOrderM
     userCoinService.consume(userId, orderAmt, exchangeOrder.getOrderId());
 
     // 放入奖品库
-    List<UserPrizeStorage> userPrizeStorageList = userPrizeStorageService.list(new LambdaQueryWrapper<UserPrizeStorage>()
-        .eq(UserPrizeStorage::getUserId, userId)
-        .eq(UserPrizeStorage::getGoodsId, goodsId)
-        .eq(null != skuId, UserPrizeStorage::getSkuId, skuId)
-        .isNull(null == skuId, UserPrizeStorage::getSkuId)
-        .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED));
-    if (CollectionUtils.isEmpty(userPrizeStorageList)) {
-      UserPrizeStorage userPrizeStorage = new UserPrizeStorage();
-      userPrizeStorage.setStorageId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
-      userPrizeStorage.setUserId(userId);
-      userPrizeStorage.setGoodsId(goodsId);
-      userPrizeStorage.setSkuId(skuId);
-      userPrizeStorage.setProperties(goodsSku.getProperties());
-      userPrizeStorage.setTitle(goods.getTitle());
-      userPrizeStorage.setPicUrl(goods.getPicUrl());
-      userPrizeStorage.setGoodsNum(orderNum);
-      userPrizeStorage.setInType(PrizeStorageInTypeEnum.COIN_EXCHANGE);
-      userPrizeStorage.setRefId(exchangeOrder.getOrderId());
-      userPrizeStorage.setStatus(PrizeStorageStatusEnum.NOT_DISTRIBUTED);
-      userPrizeStorageService.save(userPrizeStorage);
-    } else {
-      UserPrizeStorage userPrizeStorage = userPrizeStorageList.get(0);
-      boolean rtn = userPrizeStorageService.update(new LambdaUpdateWrapper<UserPrizeStorage>()
-          .set(UserPrizeStorage::getGoodsNum, userPrizeStorage.getGoodsNum() + orderNum)
-          .eq(UserPrizeStorage::getStorageId, userPrizeStorage.getStorageId()));
-      Assert.isTrue(rtn, "兑换商品成功,放入奖品库失败。userId:" + userId + ",goodsId:" + goodsId + ",skuId:" + skuId + ",orderNum:" + orderNum);
-    }
+    UserPrizeStorage userPrizeStorage = new UserPrizeStorage();
+    userPrizeStorage.setStorageId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
+    userPrizeStorage.setUserId(userId);
+    userPrizeStorage.setGoodsId(goodsId);
+    userPrizeStorage.setSkuId(skuId);
+    userPrizeStorage.setProperties(goodsSku.getProperties());
+    userPrizeStorage.setTitle(goods.getTitle());
+    userPrizeStorage.setPicUrl(goods.getPicUrl());
+    userPrizeStorage.setGoodsNum(orderNum);
+    userPrizeStorage.setInType(PrizeStorageInTypeEnum.COIN_EXCHANGE);
+    userPrizeStorage.setRefId(exchangeOrder.getOrderId());
+    userPrizeStorage.setStatus(PrizeStorageStatusEnum.NOT_DISTRIBUTED);
+    userPrizeStorageService.save(userPrizeStorage);
 
     // 修改商品库存
     if (null != skuId && 0 != skuId) {

+ 1 - 10
mp-service/src/main/java/com/qs/mp/user/service/impl/UserPrizeStorageServiceImpl.java

@@ -28,12 +28,7 @@ public class UserPrizeStorageServiceImpl extends ServiceImpl<UserPrizeStorageMap
 
   @Override
   public void takeInStorage(Long userId, TicketAwardsPrize ticketAwardsPrize, PrizeStorageInTypeEnum inTypeEnum, String refId) {
-    UserPrizeStorage userPrizeStorage = getOne(new LambdaQueryWrapper<UserPrizeStorage>()
-        .eq(UserPrizeStorage::getGoodsId, ticketAwardsPrize.getRefId()).eq(UserPrizeStorage::getUserId,
-            userId)
-        .eq(UserPrizeStorage::getStatus, PrizeStorageStatusEnum.NOT_DISTRIBUTED));
-    if (null == userPrizeStorage) {
-      userPrizeStorage = new UserPrizeStorage();
+      UserPrizeStorage userPrizeStorage = new UserPrizeStorage();
       userPrizeStorage.setStorageId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
       userPrizeStorage.setUserId(userId);
       userPrizeStorage.setGoodsId(Long.valueOf(ticketAwardsPrize.getRefId()));
@@ -46,9 +41,5 @@ public class UserPrizeStorageServiceImpl extends ServiceImpl<UserPrizeStorageMap
       userPrizeStorage.setRefId(refId);
       userPrizeStorage.setStatus(PrizeStorageStatusEnum.NOT_DISTRIBUTED);
       save(userPrizeStorage);
-    } else {
-      update(new LambdaUpdateWrapper<UserPrizeStorage>().set(UserPrizeStorage::getGoodsNum, userPrizeStorage.getGoodsNum() + 1)
-          .eq(UserPrizeStorage::getStorageId, userPrizeStorage.getStorageId()).eq(UserPrizeStorage::getGoodsNum, userPrizeStorage.getGoodsNum()));
-    }
   }
 }

+ 33 - 0
mp-service/src/main/java/com/qs/mp/utils/MarketingUtils.java

@@ -0,0 +1,33 @@
+package com.qs.mp.utils;
+
+
+import org.apache.commons.lang3.RandomStringUtils;
+
+/**
+ * 营销活动通用工具类
+ * @author Cup
+ * @date 2022/5/17
+ */
+public class MarketingUtils {
+
+    public static final long CODE_THRESHOLD = 100000;
+
+    // 生成邀请码
+    public static String generateInviteCode(Long userId) {
+        return Long.toHexString(CODE_THRESHOLD + userId);
+    }
+
+    // 邀请码解码
+    public static Long decodeInviteCode(String inviteCode) {
+        return Long.parseLong(inviteCode,16) - CODE_THRESHOLD;
+    }
+
+    // 生成抽奖码
+    public static String generatePrizeCode() {
+        return RandomStringUtils.randomAlphanumeric(12);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(generateInviteCode(1L));
+    }
+}