Browse Source

add:运营活动,活动规则

lyx 2 weeks ago
parent
commit
4939a9a3d2

+ 75 - 0
alien-entity/src/main/java/shop/alien/entity/store/UserActionRewardRule.java

@@ -0,0 +1,75 @@
+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;
+
+/**
+ * 用户行为奖励规则配置表
+ * 
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@TableName("user_action_reward_rule")
+@ApiModel(value = "UserActionRewardRule", description = "用户行为奖励规则配置表")
+public class UserActionRewardRule {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "角色(如:当用户)")
+    @TableField("role")
+    private String role;
+
+    @ApiModelProperty(value = "行为(如:核销并评论、核销、打卡)")
+    @TableField("action")
+    private String action;
+
+    @ApiModelProperty(value = "奖励(如:优惠券、红包)")
+    @TableField("reward")
+    private String reward;
+
+    @ApiModelProperty(value = "状态:0-禁用,1-启用")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "排序")
+    @TableField("sort_order")
+    private Integer sortOrder;
+
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    private String remark;
+
+    @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")
+    @TableField("created_user_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")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+}
+

+ 43 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/RewardRuleTreeNodeVo.java

@@ -0,0 +1,43 @@
+package shop.alien.entity.store.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用户行为奖励规则树形节点VO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "RewardRuleTreeNodeVo", description = "用户行为奖励规则树形节点")
+public class RewardRuleTreeNodeVo {
+
+    @ApiModelProperty(value = "节点值")
+    private String value;
+
+    @ApiModelProperty(value = "节点标签")
+    private String label;
+
+    @ApiModelProperty(value = "是否禁用")
+    private Boolean disabled;
+
+    @ApiModelProperty(value = "子节点列表")
+    private List<RewardRuleTreeNodeVo> children;
+
+    public RewardRuleTreeNodeVo() {
+        this.children = new ArrayList<>();
+    }
+
+    public RewardRuleTreeNodeVo(String value, String label, Boolean disabled) {
+        this.value = value;
+        this.label = label;
+        this.disabled = disabled;
+        this.children = new ArrayList<>();
+    }
+}
+

+ 17 - 0
alien-entity/src/main/java/shop/alien/mapper/UserActionRewardRuleMapper.java

@@ -0,0 +1,17 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.store.UserActionRewardRule;
+
+/**
+ * 用户行为奖励规则配置表 Mapper 接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Mapper
+public interface UserActionRewardRuleMapper extends BaseMapper<UserActionRewardRule> {
+
+}
+

+ 101 - 0
alien-store/src/main/java/shop/alien/store/controller/UserActionRewardRuleController.java

@@ -0,0 +1,101 @@
+package shop.alien.store.controller;
+
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.UserActionRewardRule;
+import shop.alien.entity.store.vo.RewardRuleTreeNodeVo;
+import shop.alien.store.service.UserActionRewardRuleService;
+
+import java.util.List;
+
+/**
+ * 用户行为奖励规则配置表 前端控制器
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Api(tags = {"用户行为奖励规则管理"})
+@CrossOrigin
+@RestController
+@RequestMapping("/userActionRewardRule")
+@RequiredArgsConstructor
+public class UserActionRewardRuleController {
+
+    private final UserActionRewardRuleService userActionRewardRuleService;
+
+    @ApiOperation("分页查询奖励规则列表")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "页码", dataType = "int", paramType = "query", required = true, defaultValue = "1"),
+            @ApiImplicitParam(name = "size", value = "每页大小", dataType = "int", paramType = "query", required = true, defaultValue = "10"),
+            @ApiImplicitParam(name = "role", value = "角色", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "action", value = "行为", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "reward", value = "奖励", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "status", value = "状态:0-禁用,1-启用", dataType = "int", paramType = "query", required = false)
+    })
+    @GetMapping("/getRewardRuleList")
+    public R<List<RewardRuleTreeNodeVo>> getRewardRuleList(
+            @RequestParam(value = "page", defaultValue = "1") int page,
+            @RequestParam(value = "size", defaultValue = "10") int size,
+            @RequestParam(value = "role", required = false) String role,
+            @RequestParam(value = "action", required = false) String action,
+            @RequestParam(value = "reward", required = false) String reward,
+            @RequestParam(value = "status", required = false) Integer status) {
+        log.info("UserActionRewardRuleController.getRewardRuleList?page={}, size={}, role={}, action={}, reward={}, status={}", 
+                page, size, role, action, reward, status);
+        return R.data(userActionRewardRuleService.getRewardRuleList(page, size, role, action, reward, status));
+    }
+
+    @ApiOperation("根据ID获取奖励规则详情")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "int", paramType = "query", required = true)
+    })
+    @GetMapping("/getRewardRuleById")
+    public R<UserActionRewardRule> getRewardRuleById(@RequestParam("id") Integer id) {
+        log.info("UserActionRewardRuleController.getRewardRuleById?id={}", id);
+        UserActionRewardRule rewardRule = userActionRewardRuleService.getRewardRuleById(id);
+        if (rewardRule == null) {
+            return R.fail("奖励规则不存在或已删除");
+        }
+        return R.data(rewardRule);
+    }
+
+    @ApiOperation("新增或更新奖励规则")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/addOrUpdateRewardRule")
+    public R<String> addOrUpdateRewardRule(@RequestBody UserActionRewardRule rewardRule) {
+        log.info("UserActionRewardRuleController.addOrUpdateRewardRule?rewardRule={}", rewardRule);
+        return userActionRewardRuleService.addOrUpdateRewardRule(rewardRule);
+    }
+
+    @ApiOperation("删除奖励规则")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "int", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteRewardRuleById")
+    public R<String> deleteRewardRuleById(@RequestParam("id") Integer id) {
+        log.info("UserActionRewardRuleController.deleteRewardRuleById?id={}", id);
+        return userActionRewardRuleService.deleteRewardRuleById(id);
+    }
+
+    @ApiOperation("修改奖励规则状态")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "status", value = "状态:0-禁用,1-启用", dataType = "int", paramType = "query", required = true)
+    })
+    @GetMapping("/updateRewardRuleStatus")
+    public R<String> updateRewardRuleStatus(
+            @RequestParam("id") Integer id,
+            @RequestParam("status") Integer status) {
+        log.info("UserActionRewardRuleController.updateRewardRuleStatus?id={}, status={}", id, status);
+        return userActionRewardRuleService.updateRewardRuleStatus(id, status);
+    }
+}
+

+ 64 - 0
alien-store/src/main/java/shop/alien/store/service/UserActionRewardRuleService.java

@@ -0,0 +1,64 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.UserActionRewardRule;
+import shop.alien.entity.store.vo.RewardRuleTreeNodeVo;
+
+import java.util.List;
+
+/**
+ * 用户行为奖励规则配置表 服务接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface UserActionRewardRuleService extends IService<UserActionRewardRule> {
+
+    /**
+     * 分页查询奖励规则列表(树形结构)
+     *
+     * @param page     页码
+     * @param size     每页大小
+     * @param role     角色(可选)
+     * @param action   行为(可选)
+     * @param reward   奖励(可选)
+     * @param status   状态(可选)
+     * @return 树形结构列表
+     */
+    List<RewardRuleTreeNodeVo> getRewardRuleList(int page, int size, String role, String action, String reward, Integer status);
+
+    /**
+     * 根据ID获取奖励规则详情
+     *
+     * @param id 主键ID
+     * @return 奖励规则详情
+     */
+    UserActionRewardRule getRewardRuleById(Integer id);
+
+    /**
+     * 新增或更新奖励规则
+     *
+     * @param rewardRule 奖励规则对象
+     * @return 操作结果
+     */
+    R<String> addOrUpdateRewardRule(UserActionRewardRule rewardRule);
+
+    /**
+     * 删除奖励规则(逻辑删除)
+     *
+     * @param id 主键ID
+     * @return 操作结果
+     */
+    R<String> deleteRewardRuleById(Integer id);
+
+    /**
+     * 修改奖励规则状态
+     *
+     * @param id     主键ID
+     * @param status 状态:0-禁用,1-启用
+     * @return 操作结果
+     */
+    R<String> updateRewardRuleStatus(Integer id, Integer status);
+}
+

+ 229 - 0
alien-store/src/main/java/shop/alien/store/service/impl/UserActionRewardRuleServiceImpl.java

@@ -0,0 +1,229 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.UserActionRewardRule;
+import shop.alien.entity.store.vo.RewardRuleTreeNodeVo;
+import shop.alien.mapper.UserActionRewardRuleMapper;
+import shop.alien.store.service.UserActionRewardRuleService;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户行为奖励规则配置表 服务实现类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class UserActionRewardRuleServiceImpl extends ServiceImpl<UserActionRewardRuleMapper, UserActionRewardRule> implements UserActionRewardRuleService {
+
+    private final UserActionRewardRuleMapper userActionRewardRuleMapper;
+
+
+    // TODO 垃圾代码,运营活动
+    @Override
+    public List<RewardRuleTreeNodeVo> getRewardRuleList(int page, int size, String role, String action, String reward, Integer status) {
+        LambdaQueryWrapper<UserActionRewardRule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotEmpty(role), UserActionRewardRule::getRole, role);
+        queryWrapper.like(StringUtils.isNotEmpty(action), UserActionRewardRule::getAction, action);
+        queryWrapper.like(StringUtils.isNotEmpty(reward), UserActionRewardRule::getReward, reward);
+        queryWrapper.eq(status != null, UserActionRewardRule::getStatus, status);
+        queryWrapper.eq(UserActionRewardRule::getDeleteFlag, 0);
+        queryWrapper.orderByAsc(UserActionRewardRule::getSortOrder);
+        queryWrapper.orderByDesc(UserActionRewardRule::getCreatedTime);
+        IPage<UserActionRewardRule> userActionRewardRuleIPage = userActionRewardRuleMapper.selectPage(new Page<>(page, size), queryWrapper);
+
+        // 将平铺的数据构造成树形结构(role -> action -> reward)
+        // 第一级:按role分组
+        Map<String, Map<String, List<UserActionRewardRule>>> roleMap = new LinkedHashMap<>();
+        for (UserActionRewardRule record : userActionRewardRuleIPage.getRecords()) {
+            String r = record.getRole();
+            String a = record.getAction();
+
+            // role 层
+            Map<String, List<UserActionRewardRule>> actionMap = roleMap.computeIfAbsent(r, k -> new LinkedHashMap<>());
+            // action 层
+            List<UserActionRewardRule> ruleList = actionMap.computeIfAbsent(a, k -> new ArrayList<>());
+            // 叶子节点:具体规则
+            ruleList.add(record);
+        }
+
+        // 构造成前端需要的树形结构
+        List<RewardRuleTreeNodeVo> result = new ArrayList<>();
+        for (Map.Entry<String, Map<String, List<UserActionRewardRule>>> roleEntry : roleMap.entrySet()) {
+            String roleValue = roleEntry.getKey();
+            Map<String, List<UserActionRewardRule>> actionMap = roleEntry.getValue();
+
+            // 第一级节点:role
+            RewardRuleTreeNodeVo roleNode = new RewardRuleTreeNodeVo();
+            roleNode.setValue(roleValue);
+            roleNode.setLabel(roleValue);
+            // role的disabled:如果该role下所有action都是禁用的,则role也禁用
+            boolean roleDisabled = true;
+            for (List<UserActionRewardRule> rules : actionMap.values()) {
+                for (UserActionRewardRule rule : rules) {
+                    if (rule.getStatus() != null && rule.getStatus() == 0) {
+                        roleDisabled = false;
+                        break;
+                    }
+                }
+                if (!roleDisabled) {
+                    break;
+                }
+            }
+            roleNode.setDisabled(roleDisabled);
+
+            // 第二级节点:action
+            List<RewardRuleTreeNodeVo> actionNodes = new ArrayList<>();
+            for (Map.Entry<String, List<UserActionRewardRule>> actionEntry : actionMap.entrySet()) {
+                String actionValue = actionEntry.getKey();
+                List<UserActionRewardRule> rules = actionEntry.getValue();
+
+                RewardRuleTreeNodeVo actionNode = new RewardRuleTreeNodeVo();
+                actionNode.setValue(actionValue);
+                actionNode.setLabel(actionValue);
+                // action的disabled:如果该action下所有reward都是禁用的,则action也禁用
+                boolean actionDisabled = true;
+                for (UserActionRewardRule rule : rules) {
+                    if (rule.getStatus() != null && rule.getStatus() == 0) {
+                        actionDisabled = false;
+                        break;
+                    }
+                }
+                actionNode.setDisabled(actionDisabled);
+
+                // 第三级节点:reward
+                List<RewardRuleTreeNodeVo> rewardNodes = new ArrayList<>();
+                for (UserActionRewardRule rule : rules) {
+                    String rewardValue = rule.getReward();
+                    RewardRuleTreeNodeVo rewardNode = new RewardRuleTreeNodeVo();
+                    rewardNode.setValue(rewardValue);
+                    rewardNode.setLabel(rewardValue);
+                    // reward的disabled:根据status判断,0-禁用,1-启用
+                    rewardNode.setDisabled(rule.getStatus() == 1);
+                    rewardNodes.add(rewardNode);
+                }
+                actionNode.setChildren(rewardNodes);
+                actionNodes.add(actionNode);
+            }
+            roleNode.setChildren(actionNodes);
+            result.add(roleNode);
+        }
+
+        return result;
+    }
+
+    @Override
+    public UserActionRewardRule getRewardRuleById(Integer id) {
+        if (id == null) {
+            return null;
+        }
+        LambdaQueryWrapper<UserActionRewardRule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(UserActionRewardRule::getId, id);
+        queryWrapper.eq(UserActionRewardRule::getDeleteFlag, 0);
+        return userActionRewardRuleMapper.selectOne(queryWrapper);
+    }
+
+    @Override
+    public R<String> addOrUpdateRewardRule(UserActionRewardRule rewardRule) {
+        if (rewardRule == null) {
+            return R.fail("奖励规则信息不能为空");
+        }
+
+        // 校验必填字段
+        if (StringUtils.isEmpty(rewardRule.getAction())) {
+            return R.fail("行为不能为空");
+        }
+
+        try {
+            if (rewardRule.getId() == null) {
+                // 新增
+                if (rewardRule.getStatus() == null) {
+                    rewardRule.setStatus(1); // 默认启用
+                }
+                if (rewardRule.getSortOrder() == null) {
+                    rewardRule.setSortOrder(0); // 默认排序为0
+                }
+                int result = userActionRewardRuleMapper.insert(rewardRule);
+                if (result > 0) {
+                    return R.data("新增成功");
+                } else {
+                    return R.fail("新增失败");
+                }
+            } else {
+                // 更新
+                int result = userActionRewardRuleMapper.updateById(rewardRule);
+                if (result > 0) {
+                    return R.data("更新成功");
+                } else {
+                    return R.fail("更新失败");
+                }
+            }
+        } catch (Exception e) {
+            log.error("保存奖励规则失败", e);
+            return R.fail("保存失败:" + e.getMessage());
+        }
+    }
+
+    @Override
+    public R<String> deleteRewardRuleById(Integer id) {
+        if (id == null) {
+            return R.fail("ID不能为空");
+        }
+
+        try {
+            LambdaUpdateWrapper<UserActionRewardRule> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(UserActionRewardRule::getId, id)
+                    .set(UserActionRewardRule::getDeleteFlag, 1);
+            int result = userActionRewardRuleMapper.update(null, updateWrapper);
+            if (result > 0) {
+                return R.data("删除成功");
+            } else {
+                return R.fail("删除失败,记录不存在或已删除");
+            }
+        } catch (Exception e) {
+            log.error("删除奖励规则失败", e);
+            return R.fail("删除失败:" + e.getMessage());
+        }
+    }
+
+    @Override
+    public R<String> updateRewardRuleStatus(Integer id, Integer status) {
+        if (id == null) {
+            return R.fail("ID不能为空");
+        }
+        if (status == null || (status != 0 && status != 1)) {
+            return R.fail("状态值无效,只能为0(禁用)或1(启用)");
+        }
+
+        try {
+            LambdaUpdateWrapper<UserActionRewardRule> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(UserActionRewardRule::getId, id)
+                    .set(UserActionRewardRule::getStatus, status);
+            int result = userActionRewardRuleMapper.update(null, updateWrapper);
+            if (result > 0) {
+                return R.data(status == 1 ? "启用成功" : "禁用成功");
+            } else {
+                return R.fail("更新失败,记录不存在或已删除");
+            }
+        } catch (Exception e) {
+            log.error("更新奖励规则状态失败", e);
+            return R.fail("更新失败:" + e.getMessage());
+        }
+    }
+}
+