|
|
@@ -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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|