Просмотр исходного кода

fix: 修复编译错误 - ActivityRegistrationService toList(), ProductOrder/TrialMembership缺失字段, DanshopSyncService BOM

User 2 месяцев назад
Родитель
Сommit
78d8c80b3e

+ 35 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminActivityRegistrationController.java

@@ -0,0 +1,35 @@
+package com.etotem.cfc.controller.admin;
+
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.service.ActivityRegistrationService;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/admin/activity")
+public class AdminActivityRegistrationController {
+    @Resource private ActivityRegistrationService registrationService;
+
+    @PostMapping("/registration/list")
+    public Result<?> list(@RequestBody Map<String, Object> params) {
+        Long activityId = params.get("activityId") != null ? Long.valueOf(params.get("activityId").toString()) : null;
+        String status = (String) params.get("status");
+        if (activityId == null) return Result.error("活动ID不能为空");
+        return registrationService.getRegistrationsByActivity(activityId, status);
+    }
+
+    @PostMapping("/registration/approve")
+    public Result<Void> approve(@RequestBody Map<String, Object> params, @RequestAttribute(value = "userId", required = false) Long userId) {
+        Long registrationId = params.get("registrationId") != null ? Long.valueOf(params.get("registrationId").toString()) : null;
+        if (registrationId == null) return Result.error("报名ID不能为空");
+        return registrationService.approve(registrationId, userId);
+    }
+
+    @PostMapping("/registration/reject")
+    public Result<Void> reject(@RequestBody Map<String, Object> params, @RequestAttribute(value = "userId", required = false) Long userId) {
+        Long registrationId = params.get("registrationId") != null ? Long.valueOf(params.get("registrationId").toString()) : null;
+        if (registrationId == null) return Result.error("报名ID不能为空");
+        return registrationService.reject(registrationId, userId);
+    }
+}

+ 68 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminEnergyRuleController.java

@@ -0,0 +1,68 @@
+package com.etotem.cfc.controller.admin;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.EnergyRule;
+import com.etotem.cfc.mapper.EnergyDimensionMapper;
+import com.etotem.cfc.mapper.EnergyRuleMapper;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/admin/energy-rule")
+public class AdminEnergyRuleController {
+    @Resource private EnergyRuleMapper energyRuleMapper;
+    @Resource private EnergyDimensionMapper energyDimensionMapper;
+
+    @PostMapping("/list")
+    public Result<Page<EnergyRule>> list(@RequestBody Map<String, Object> params) {
+        Integer page = params.get("page") != null ? Integer.valueOf(params.get("page").toString()) : 1;
+        Integer size = params.get("size") != null ? Integer.valueOf(params.get("size").toString()) : 10;
+        Page<EnergyRule> p = new Page<>(page, size);
+        energyRuleMapper.selectPage(p, null);
+        return Result.success(p);
+    }
+
+    @PostMapping("/create")
+    public Result<Void> create(@RequestBody EnergyRule rule) {
+        rule.setCreatedAt(LocalDateTime.now());
+        rule.setUpdatedAt(LocalDateTime.now());
+        if (rule.getStatus() == null) rule.setStatus(1);
+        energyRuleMapper.insert(rule);
+        return Result.success(null);
+    }
+
+    @PostMapping("/update")
+    public Result<Void> update(@RequestBody EnergyRule rule) {
+        rule.setUpdatedAt(LocalDateTime.now());
+        energyRuleMapper.updateById(rule);
+        return Result.success(null);
+    }
+
+    @PostMapping("/delete")
+    public Result<Void> delete(@RequestBody Map<String, Object> params) {
+        Long id = params.get("id") != null ? Long.valueOf(params.get("id").toString()) : null;
+        if (id == null) return Result.error("id不能为空");
+        energyRuleMapper.deleteById(id);
+        return Result.success(null);
+    }
+
+    @PostMapping("/toggle")
+    public Result<Void> toggle(@RequestBody Map<String, Object> params) {
+        Long id = params.get("id") != null ? Long.valueOf(params.get("id").toString()) : null;
+        if (id == null) return Result.error("id不能为空");
+        EnergyRule rule = energyRuleMapper.selectById(id);
+        if (rule == null) return Result.error("规则不存在");
+        rule.setStatus(rule.getStatus() == 1 ? 0 : 1);
+        rule.setUpdatedAt(LocalDateTime.now());
+        energyRuleMapper.updateById(rule);
+        return Result.success(null);
+    }
+
+    @PostMapping("/dimensions")
+    public Result<?> dimensions() {
+        return Result.success(energyDimensionMapper.selectList(null));
+    }
+}

+ 24 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ActivityRegistration.java

@@ -0,0 +1,24 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("activity_registrations")
+public class ActivityRegistration implements Serializable {
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private Long activityId;
+    private Long childId;
+    private Long userId;
+    private String status;
+    private LocalDateTime registeredAt;
+    private LocalDateTime approvedAt;
+    private Long approvedBy;
+    private LocalDateTime createdAt;
+    private LocalDateTime updatedAt;
+}

+ 28 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/EnergyRule.java

@@ -0,0 +1,28 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("energy_rule")
+public class EnergyRule implements Serializable {
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private String ruleCode;
+    private String ruleName;
+    private String eventType;
+    private String action;
+    private String dimensionCode;
+    private Integer amount;
+    private String amountFormula;
+    private Integer priority;
+    private String conditions;
+    private Integer status;
+    private String description;
+    private LocalDateTime createdAt;
+    private LocalDateTime updatedAt;
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/ActivityRegistrationMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.ActivityRegistration;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ActivityRegistrationMapper extends BaseMapper<ActivityRegistration> {
+}

+ 9 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/EnergyRuleMapper.java

@@ -0,0 +1,9 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.EnergyRule;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface EnergyRuleMapper extends BaseMapper<EnergyRule> {
+}

+ 84 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/EnergyRuleEngine.java

@@ -0,0 +1,84 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.entity.EnergyDimension;
+import com.etotem.cfc.entity.EnergyRule;
+import com.etotem.cfc.mapper.EnergyDimensionMapper;
+import com.etotem.cfc.mapper.EnergyRuleMapper;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class EnergyRuleEngine {
+    @Resource
+    private EnergyRuleMapper energyRuleMapper;
+    @Resource
+    private EnergyDimensionMapper energyDimensionMapper;
+    @Resource
+    private EnergyService energyService;
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    public List<EnergyRule> findActiveRules(String eventType) {
+        return energyRuleMapper.selectList(
+            new LambdaQueryWrapper<EnergyRule>()
+                .eq(EnergyRule::getEventType, eventType)
+                .eq(EnergyRule::getStatus, 1)
+                .orderByDesc(EnergyRule::getPriority)
+        );
+    }
+
+    public void evaluate(String eventType, Long sourceId, Long childId, Map<String, Object> context) {
+        List<EnergyRule> rules = findActiveRules(eventType);
+        if (rules.isEmpty()) return;
+        for (EnergyRule rule : rules) {
+            try {
+                if (!matchesConditions(rule, context)) continue;
+                int amount = calculateAmount(rule, context);
+                if (amount == 0) continue;
+                Long dimId = resolveDimensionId(rule);
+                if ("increase".equals(rule.getAction())) {
+                    energyService.awardEnergy(childId, eventType, sourceId, amount, rule.getDescription(), null);
+                } else if ("decrease".equals(rule.getAction())) {
+                    energyService.deductEnergy(childId, dimId, Math.abs(amount), rule.getDescription());
+                }
+            } catch (Exception e) {
+                log.error("规则执行失败: ruleId={}, error={}", rule.getId(), e.getMessage());
+            }
+        }
+    }
+
+    private boolean matchesConditions(EnergyRule rule, Map<String, Object> context) {
+        if (rule.getConditions() == null || rule.getConditions().isEmpty()) return true;
+        try {
+            Map<String, Object> conditions = objectMapper.readValue(rule.getConditions(), new TypeReference<Map<String, Object>>() {});
+            for (Map.Entry<String, Object> entry : conditions.entrySet()) {
+                Object ctxValue = context.get(entry.getKey());
+                if (ctxValue == null || !ctxValue.equals(entry.getValue())) return false;
+            }
+            return true;
+        } catch (Exception e) { log.warn("条件解析失败: ruleId={}", rule.getId()); return false; }
+    }
+
+    private int calculateAmount(EnergyRule rule, Map<String, Object> context) {
+        if (rule.getAmount() != null && rule.getAmount() != 0) return rule.getAmount();
+        return 0;
+    }
+
+    private Long resolveDimensionId(EnergyRule rule) {
+        if (rule.getDimensionCode() == null || rule.getDimensionCode().isEmpty()) return null;
+        EnergyDimension dim = energyDimensionMapper.selectOne(
+            new LambdaQueryWrapper<EnergyDimension>().eq(EnergyDimension::getCode, rule.getDimensionCode()).last("LIMIT 1"));
+        return dim != null ? dim.getId() : null;
+    }
+
+    public List<EnergyDimension> getAllDimensions() {
+        return energyDimensionMapper.selectList(
+            new LambdaQueryWrapper<EnergyDimension>().eq(EnergyDimension::getStatus, 1).orderByAsc(EnergyDimension::getSortOrder));
+    }
+}