瀏覽代碼

邀请活动中台接口

zc 3 月之前
父節點
當前提交
f5b0759db9

+ 84 - 0
alien-entity/src/main/java/shop/alien/entity/store/ActivityInviteConfig.java

@@ -0,0 +1,84 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+@Data
+@JsonInclude
+@TableName("activity_invite_config")
+@ApiModel(value = "ActivitySignInConfig", description = "邀请活动配置表")
+public class ActivityInviteConfig {
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "活动名称")
+    private String activityName;
+
+    @ApiModelProperty(value = "活动类型:1,邀请好友,2.其他")
+    private Integer activityType;
+
+    @ApiModelProperty(value = "活动时限:1,永久有效,2.限时活动")
+    private Integer activityTimeType;
+
+    @ApiModelProperty(value = "活动开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date activityStartTime;
+
+    @ApiModelProperty(value = "活动结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date activityEndTime;
+
+    @ApiModelProperty(value = "活动规则")
+    private String activityRule;
+
+    @ApiModelProperty(value = "活动状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "邀请成功条件:1,注册即算,2.实名认证,3,首单支付并成功核销")
+    private Integer inviteCondition;
+
+    @ApiModelProperty(value = "邀请人数")
+    private Integer invitePersonNum;
+
+    @ApiModelProperty(value = "邀请奖励类型:1.积分,2.其他")
+    private Integer inviteRewardType;
+
+    @ApiModelProperty(value = "邀请奖励")
+    private String inviteRewardContent;
+
+    @ApiModelProperty(value = "被邀请奖励类型:1.优惠券,2.其他")
+    private Integer invitedRewardType;
+
+    @ApiModelProperty(value = "被邀请奖励")
+    private String invitedRewardContent;
+
+    @ApiModelProperty(value = "每天最大邀请人数")
+    private Integer maxInviteNum;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+}

+ 22 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/ActivityInviteConfigVo.java

@@ -0,0 +1,22 @@
+package shop.alien.entity.store.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import shop.alien.entity.store.ActivityInviteConfig;
+
+/**
+ * @author zhangchen
+ * @version 1.0
+ * @date 2025/9/8 10:00
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonInclude
+public class ActivityInviteConfigVo extends ActivityInviteConfig {
+    @ApiModelProperty(value = "返回错误信息")
+    @TableField(exist = false)
+    private String errorMessage;
+}

+ 13 - 0
alien-entity/src/main/java/shop/alien/mapper/ActivityInviteConfigMapper.java

@@ -0,0 +1,13 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.store.ActivityInviteConfig;
+
+/**
+ * 邀请活动配置mapper
+ */
+@Mapper
+public interface ActivityInviteConfigMapper extends BaseMapper<ActivityInviteConfig> {
+
+}

+ 104 - 0
alien-store/src/main/java/shop/alien/store/controller/ActivityInviteConfigController.java

@@ -0,0 +1,104 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.ActivityInviteConfig;
+import shop.alien.entity.store.ActivitySignInConfig;
+import shop.alien.entity.store.vo.ActivityConfigVo;
+import shop.alien.entity.store.vo.ActivityInviteConfigVo;
+import shop.alien.entity.store.vo.ActivityPeriodVo;
+import shop.alien.store.service.ActivityConfigService;
+import shop.alien.store.service.ActivityInviteConfigService;
+
+import java.util.List;
+
+@Api(tags = {"二期-邀请活动"})
+@Slf4j
+@CrossOrigin
+@RestController
+@RequestMapping("/activityInvite")
+@RequiredArgsConstructor
+public class ActivityInviteConfigController {
+
+    private final ActivityInviteConfigService activityInviteConfigService;
+
+    /**
+     * 创建签到活动
+     */
+    @ApiOperation("创建/更新邀请活动")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("createOrUpdateInviteActivity")
+    public R<ActivityInviteConfigVo> createOrUpdateInviteActivity(@RequestBody ActivityInviteConfigVo configVO) {
+        ActivityInviteConfigVo activity = activityInviteConfigService.createOrUpdateInviteActivity(configVO);
+        if(activity == null) {
+            return R.fail("插入/更新失败");
+        }
+        if(StringUtils.isNotBlank(activity.getErrorMessage())){
+            return R.fail(activity.getErrorMessage());
+        }
+        return R.data(activity);
+    }
+
+    /**
+     * web-分页查询邀请活动
+     */
+    @ApiOperation("分页查询邀请活动列表")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "页容", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "createdTime", value = "创建时间", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "activityType", value = "活动类型", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "状态", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/getInviteActivityConfigList")
+    public R<IPage<ActivityInviteConfig>> getInviteActivityConfigList(@RequestParam(defaultValue = "1") int pageNum,
+                                                                      @RequestParam(defaultValue = "10") int pageSize,
+                                                                      @RequestParam(required = false) String createdTime,
+                                                                      @RequestParam(required = false) Integer activityType,
+                                                                      @RequestParam(required = false) Integer status){
+        IPage<ActivityInviteConfig> activitySignInConfigList = activityInviteConfigService.getInviteActivityConfigList(pageNum, pageSize,createdTime, activityType, status);
+        return R.data(activitySignInConfigList);
+    }
+
+    @ApiOperation("获取邀请活动详情")
+    @ApiOperationSupport(order = 3)
+    @GetMapping("/getInviteActivitySignInConfigById")
+    public R<ActivityInviteConfigVo> getInviteActivitySignInConfigById(@RequestParam(required = true) Long activityId) {
+        log.info("ActivityConfigController.getActivitySignInConfigById={}", activityId);
+        ActivityInviteConfigVo activityConfigVO = activityInviteConfigService.getInviteActivitySignInConfigById(activityId);
+        return R.data(activityConfigVO);
+    }
+
+    /**
+     * 修改邀请活动状态
+     *
+     * @param id     主键
+     * @param status 状态
+     * @return boolean
+     */
+    @ApiOperation("更新签到活动状态")
+    @ApiOperationSupport(order = 4)
+    @GetMapping("/updateActivityStatus")
+    public R<Boolean> updateInviteActivityStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status) {
+        log.info("ActivityConfigController.updateActivityStatus?id={}&status={}", id, status);
+        if (activityInviteConfigService.updateInviteActivityStatus(id, status)) {
+            return R.success("成功");
+        }
+        return R.fail("失败");
+    }
+
+    @ApiOperation("删除邀请活动")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "活动ID", dataType = "Integer", paramType = "query", required = true)})
+    @GetMapping("/deleteInviteActivity")
+    public R<Boolean> deleteInviteActivity(Integer id) {
+        return R.data(activityInviteConfigService.deleteInviteActivity(id));
+    }
+
+}

+ 45 - 0
alien-store/src/main/java/shop/alien/store/service/ActivityInviteConfigService.java

@@ -0,0 +1,45 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.store.ActivityInviteConfig;
+import shop.alien.entity.store.ActivitySignInConfig;
+import shop.alien.entity.store.ActivitySignInReward;
+import shop.alien.entity.store.vo.ActivityConfigVo;
+import shop.alien.entity.store.vo.ActivityInviteConfigVo;
+import shop.alien.entity.store.vo.ActivityPeriodVo;
+
+import java.util.List;
+
+/**
+ * @author zhangchen
+ * @version 1.0
+ * @date 2025/09/05 10:00
+ */
+public interface ActivityInviteConfigService extends IService<ActivityInviteConfig> {
+    /**
+     * 创建签到活动
+     */
+    ActivityInviteConfigVo createOrUpdateInviteActivity(ActivityInviteConfigVo configVO);
+
+    /**
+     * 获取活动详情
+     */
+    ActivityInviteConfigVo getInviteActivitySignInConfigById(Long id);
+
+    /**
+     * 获取活动列表
+     */
+    IPage<ActivityInviteConfig> getInviteActivityConfigList(int pageNum, int pageSize, String createdTime, Integer activityType, Integer status);
+
+    /**
+     * 更新活动状态
+     */
+    boolean updateInviteActivityStatus(Integer id, Integer status);
+
+
+    /**
+     * 删除活动
+     */
+    boolean deleteInviteActivity(Integer id);
+}

+ 170 - 0
alien-store/src/main/java/shop/alien/store/service/impl/ActivityInviteConfigServiceImpl.java

@@ -0,0 +1,170 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.store.ActivityPeriod;
+import shop.alien.entity.store.ActivitySignInConfig;
+import shop.alien.entity.store.vo.ActivityConfigVo;
+import shop.alien.entity.store.vo.ActivityInviteConfigVo;
+import shop.alien.entity.store.ActivityInviteConfig;
+import shop.alien.mapper.ActivityInviteConfigMapper;
+import shop.alien.store.service.ActivityInviteConfigService;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ActivityInviteConfigServiceImpl extends ServiceImpl<ActivityInviteConfigMapper, ActivityInviteConfig> implements ActivityInviteConfigService {
+
+   private final ActivityInviteConfigMapper activityInviteConfigMapper;
+
+    @Override
+    public ActivityInviteConfigVo createOrUpdateInviteActivity(ActivityInviteConfigVo activityInviteConfigVo) {
+
+        log.info("创建邀请活动开始执行,请求参数: {}", activityInviteConfigVo);
+        if(activityInviteConfigVo == null) {
+            log.error("创建邀请活动activityInviteConfigVo为空。");
+            activityInviteConfigVo = new ActivityInviteConfigVo();
+            activityInviteConfigVo.setErrorMessage("参数为空");
+            return activityInviteConfigVo;
+        }
+
+        ActivityInviteConfig activityInviteConfig = new ActivityInviteConfig();
+        if(activityInviteConfigVo.getId() == null) {
+            if(activityInviteConfigVo.getActivityTimeType()!=null && activityInviteConfigVo.getActivityTimeType() == 1){
+                //永久邀请活动,不重复
+                LambdaQueryWrapper<ActivityInviteConfig> activityInviteConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                activityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getDeleteFlag, 0);
+                activityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getActivityTimeType,1);
+                int count = activityInviteConfigMapper.selectCount(activityInviteConfigLambdaQueryWrapper);
+                if(count > 0){
+                    log.error("存在永久邀请活动,请修改。");
+                    activityInviteConfigVo = new ActivityInviteConfigVo();
+                    activityInviteConfigVo.setErrorMessage("存在永久邀请活动");
+                    return activityInviteConfigVo;
+                }
+            } else {
+                // 限时活动,校验时间段不重复
+                LambdaQueryWrapper<ActivityInviteConfig> limitedTimeActivityInviteConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                limitedTimeActivityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getDeleteFlag, 0);
+                limitedTimeActivityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getActivityTimeType,2);
+                List<ActivityInviteConfig> activityInviteConfigList = activityInviteConfigMapper.selectList(limitedTimeActivityInviteConfigLambdaQueryWrapper);
+                boolean checkResult = checkTime(activityInviteConfigList);
+                if(!checkResult){
+                    activityInviteConfigVo.setErrorMessage("方案时间重叠");
+                    return activityInviteConfigVo;
+                }
+            }
+            BeanUtils.copyProperties(activityInviteConfigVo, activityInviteConfig);
+            int insertCount = activityInviteConfigMapper.insert(activityInviteConfig);
+            if(insertCount == 0){
+                //插入活动配置数据失败,返回
+                log.error("插入邀请活动配置数据失败, {}", activityInviteConfigVo);
+                activityInviteConfigVo.setErrorMessage("插入邀请活动配置数据失败");
+                return activityInviteConfigVo;
+            }
+        } else {
+            BeanUtils.copyProperties(activityInviteConfigVo, activityInviteConfig);
+            if(activityInviteConfigVo.getActivityTimeType()!=null && activityInviteConfigVo.getActivityTimeType() == 2) {
+                LambdaQueryWrapper<ActivityInviteConfig> limitedTimeUpdateActivityInviteConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                limitedTimeUpdateActivityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getDeleteFlag, 0);
+                limitedTimeUpdateActivityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getActivityTimeType,2);
+                limitedTimeUpdateActivityInviteConfigLambdaQueryWrapper.ne(ActivityInviteConfig::getId,activityInviteConfig.getId());
+                List<ActivityInviteConfig> activityInviteConfigList = activityInviteConfigMapper.selectList(limitedTimeUpdateActivityInviteConfigLambdaQueryWrapper);
+                boolean checkResult = checkTime(activityInviteConfigList);
+                if(!checkResult){
+                    activityInviteConfigVo.setErrorMessage("方案时间重叠");
+                    return activityInviteConfigVo;
+                }
+            }
+            int updateCount = activityInviteConfigMapper.updateById(activityInviteConfig);
+            if(updateCount == 0){
+                //更新活动配置数据失败,返回
+                log.error("更新邀请活动配置数据失败, {}", activityInviteConfigVo);
+                activityInviteConfigVo.setErrorMessage("更新邀请活动配置数据失败");
+                return activityInviteConfigVo;
+            }
+        }
+
+        return activityInviteConfigVo;
+    }
+
+    @Override
+    public ActivityInviteConfigVo getInviteActivitySignInConfigById(Long id) {
+        ActivityInviteConfigVo activityInviteConfigVo = new ActivityInviteConfigVo();
+        ActivityInviteConfig activityInviteConfig = activityInviteConfigMapper.selectById(id);
+        BeanUtils.copyProperties(activityInviteConfig, activityInviteConfigVo);
+        return activityInviteConfigVo;
+    }
+
+    @Override
+    public IPage<ActivityInviteConfig> getInviteActivityConfigList(int pageNum, int pageSize, String createdTime, Integer activityType, Integer status) {
+        IPage<ActivityInviteConfig> iPage = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<ActivityInviteConfig> activityInviteConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if(StringUtils.isNotBlank(createdTime)){
+            activityInviteConfigLambdaQueryWrapper.between(ActivityInviteConfig::getCreatedTime,createdTime + " 00:00:00", createdTime + " 23:59:59");
+        }
+        if(activityType != null) {
+            activityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getActivityType, activityType);
+        }
+
+        if(status != null) {
+            activityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getStatus, status);
+        }
+        activityInviteConfigLambdaQueryWrapper.eq(ActivityInviteConfig::getDeleteFlag, 0 );
+        return activityInviteConfigMapper.selectPage(iPage, activityInviteConfigLambdaQueryWrapper);
+    }
+
+    @Override
+    public boolean updateInviteActivityStatus(Integer id, Integer status) {
+        if(id == null || status == null){
+            return false;
+        }
+        ActivityInviteConfig activityInviteConfig = new ActivityInviteConfig();
+        activityInviteConfig.setId(id);
+        activityInviteConfig.setStatus(status);
+        int updateResult = activityInviteConfigMapper.updateById(activityInviteConfig);
+        return updateResult > 0;
+    }
+
+    @Override
+    public boolean deleteInviteActivity(Integer id) {
+        if(id != null){
+            int deleteResult =  activityInviteConfigMapper.deleteById(id);
+            if(deleteResult == 0){
+                return false;
+            }
+        }
+        return false;
+    }
+
+    private boolean checkTime(List<ActivityInviteConfig> activityInviteConfigList){
+        if (activityInviteConfigList == null || activityInviteConfigList.size() <= 1) {
+            return true;
+        }
+
+        // 按开始时间排序
+        List<ActivityInviteConfig> sorted = new ArrayList<>(activityInviteConfigList);
+        sorted.sort(Comparator.comparing(ActivityInviteConfig::getActivityStartTime));
+        for (int i = 0; i < sorted.size() - 1; i++) {
+            ActivityInviteConfig current = sorted.get(i);
+            ActivityInviteConfig next = sorted.get(i + 1);
+
+            // 检查重叠条件:当前结束时间 > 下一个开始时间
+            if (current.getActivityEndTime().compareTo(next.getActivityStartTime()) > 0) {
+                return false; // 存在重叠
+            }
+        }
+        return true;
+    }
+}