|
|
@@ -0,0 +1,236 @@
|
|
|
+package com.etotem.cfc.controller.admin;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.etotem.cfc.common.Result;
|
|
|
+import com.etotem.cfc.entity.EnergySourceConfig;
|
|
|
+import com.etotem.cfc.mapper.EnergySourceConfigMapper;
|
|
|
+import io.swagger.v3.oas.annotations.Operation;
|
|
|
+import io.swagger.v3.oas.annotations.tags.Tag;
|
|
|
+import org.springframework.web.bind.annotation.PostMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestBody;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Tag(name = "管理端 - 五行能量配置")
|
|
|
+@RestController
|
|
|
+@RequestMapping("/api/admin/energy-config")
|
|
|
+public class AdminEnergyConfigController {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private EnergySourceConfigMapper energySourceConfigMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 能量来源配置列表
|
|
|
+ */
|
|
|
+ @Operation(summary = "能量来源配置列表")
|
|
|
+ @PostMapping("/source-list")
|
|
|
+ public Result<List<Map<String, Object>>> sourceList(@RequestBody Map<String, Object> params) {
|
|
|
+ List<EnergySourceConfig> configs = energySourceConfigMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<EnergySourceConfig>()
|
|
|
+ .orderByAsc(EnergySourceConfig::getSourceType)
|
|
|
+ .orderByAsc(EnergySourceConfig::getSourceId)
|
|
|
+ );
|
|
|
+
|
|
|
+ List<Map<String, Object>> result = new ArrayList<>();
|
|
|
+ for (EnergySourceConfig config : configs) {
|
|
|
+ Map<String, Object> item = new HashMap<>();
|
|
|
+ item.put("id", config.getId());
|
|
|
+ item.put("sourceType", config.getSourceType());
|
|
|
+ item.put("sourceId", config.getSourceId());
|
|
|
+ item.put("sourceName", config.getSourceName());
|
|
|
+ item.put("dimensionId", config.getDimensionId());
|
|
|
+ item.put("ratio", config.getRatio());
|
|
|
+ item.put("createdAt", config.getCreatedAt());
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ return Result.success(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存能量来源配置(新增/更新)
|
|
|
+ * 注意:EnergySourceConfig 表中每条记录对应一个来源与一个维度的映射关系
|
|
|
+ * 前端传入的 ratios 数组会被拆分为多条记录
|
|
|
+ */
|
|
|
+ @Operation(summary = "保存能量来源配置")
|
|
|
+ @PostMapping("/source-save")
|
|
|
+ public Result<String> sourceSave(@RequestBody EnergySourceConfigSaveRequest request) {
|
|
|
+ // 删除该来源的所有旧配置
|
|
|
+ if (request.getSourceId() != null && request.getSourceId() > 0) {
|
|
|
+ energySourceConfigMapper.delete(
|
|
|
+ new LambdaQueryWrapper<EnergySourceConfig>()
|
|
|
+ .eq(EnergySourceConfig::getSourceType, request.getSourceType())
|
|
|
+ .eq(EnergySourceConfig::getSourceId, request.getSourceId())
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 插入新的维度比例配置
|
|
|
+ Date now = new Date();
|
|
|
+ for (DimensionRatio ratio : request.getRatios()) {
|
|
|
+ EnergySourceConfig config = new EnergySourceConfig();
|
|
|
+ config.setSourceType(request.getSourceType());
|
|
|
+ config.setSourceId(request.getSourceId());
|
|
|
+ config.setSourceName(request.getSourceName());
|
|
|
+ config.setDimensionId(ratio.getDimensionId());
|
|
|
+ config.setRatio(ratio.getRatio());
|
|
|
+ config.setCreatedAt(now);
|
|
|
+ energySourceConfigMapper.insert(config);
|
|
|
+ }
|
|
|
+
|
|
|
+ return Result.success("保存成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除能量来源配置
|
|
|
+ */
|
|
|
+ @Operation(summary = "删除能量来源配置")
|
|
|
+ @PostMapping("/source-delete")
|
|
|
+ public Result<String> sourceDelete(@RequestBody Map<String, Object> params) {
|
|
|
+ Long id = Long.valueOf(params.get("id").toString());
|
|
|
+ energySourceConfigMapper.deleteById(id);
|
|
|
+ return Result.success("删除成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取每日能量限制(V1 返回硬编码值)
|
|
|
+ */
|
|
|
+ @Operation(summary = "获取每日能量限制")
|
|
|
+ @PostMapping("/daily-limits")
|
|
|
+ public Result<List<DimensionDailyLimit>> dailyLimits(@RequestBody Map<String, Object> params) {
|
|
|
+ List<DimensionDailyLimit> limits = new ArrayList<>();
|
|
|
+ limits.add(new DimensionDailyLimit("body", 50));
|
|
|
+ limits.add(new DimensionDailyLimit("mind", 50));
|
|
|
+ limits.add(new DimensionDailyLimit("wisdom", 80));
|
|
|
+ limits.add(new DimensionDailyLimit("action", 60));
|
|
|
+ limits.add(new DimensionDailyLimit("wealth", 50));
|
|
|
+ return Result.success(limits);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存每日能量限制(V1 仅返回成功,实际存储待后续迁移)
|
|
|
+ */
|
|
|
+ @Operation(summary = "保存每日能量限制")
|
|
|
+ @PostMapping("/daily-limit-save")
|
|
|
+ public Result<String> dailyLimitSave(@RequestBody DailyLimitSaveRequest request) {
|
|
|
+ // V1: 仅返回成功,实际存储待后续迁移到数据库
|
|
|
+ return Result.success("保存成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 能量配置总览:所有来源类型及其维度比例
|
|
|
+ */
|
|
|
+ @Operation(summary = "能量配置总览")
|
|
|
+ @PostMapping("/overview")
|
|
|
+ public Result<Map<String, Object>> overview(@RequestBody Map<String, Object> params) {
|
|
|
+ // 获取所有来源类型分组
|
|
|
+ List<EnergySourceConfig> allConfigs = energySourceConfigMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<EnergySourceConfig>()
|
|
|
+ .orderByAsc(EnergySourceConfig::getSourceType)
|
|
|
+ .orderByAsc(EnergySourceConfig::getSourceId)
|
|
|
+ );
|
|
|
+
|
|
|
+ // 按 sourceType + sourceId 分组
|
|
|
+ Map<String, List<EnergySourceConfig>> grouped = new LinkedHashMap<>();
|
|
|
+ for (EnergySourceConfig config : allConfigs) {
|
|
|
+ String key = config.getSourceType() + ":" + config.getSourceId();
|
|
|
+ grouped.computeIfAbsent(key, k -> new ArrayList<>()).add(config);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Map<String, Object>> sources = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<EnergySourceConfig>> entry : grouped.entrySet()) {
|
|
|
+ List<EnergySourceConfig> list = entry.getValue();
|
|
|
+ Map<String, Object> source = new HashMap<>();
|
|
|
+ source.put("sourceType", list.get(0).getSourceType());
|
|
|
+ source.put("sourceId", list.get(0).getSourceId());
|
|
|
+ source.put("sourceName", list.get(0).getSourceName());
|
|
|
+
|
|
|
+ // 维度比例数组
|
|
|
+ List<Map<String, Object>> ratios = new ArrayList<>();
|
|
|
+ for (EnergySourceConfig config : list) {
|
|
|
+ Map<String, Object> ratio = new HashMap<>();
|
|
|
+ ratio.put("dimensionId", config.getDimensionId());
|
|
|
+ ratio.put("ratio", config.getRatio());
|
|
|
+ ratios.add(ratio);
|
|
|
+ }
|
|
|
+ source.put("ratios", ratios);
|
|
|
+ sources.add(source);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
+ data.put("sources", sources);
|
|
|
+
|
|
|
+ // 每日限制
|
|
|
+ List<Map<String, Object>> dailyLimits = new ArrayList<>();
|
|
|
+ dailyLimits.add(limitMap("body", 50));
|
|
|
+ dailyLimits.add(limitMap("mind", 50));
|
|
|
+ dailyLimits.add(limitMap("wisdom", 80));
|
|
|
+ dailyLimits.add(limitMap("action", 60));
|
|
|
+ dailyLimits.add(limitMap("wealth", 50));
|
|
|
+ data.put("dailyLimits", dailyLimits);
|
|
|
+
|
|
|
+ return Result.success(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> limitMap(String code, int value) {
|
|
|
+ Map<String, Object> m = new HashMap<>();
|
|
|
+ m.put("dimensionCode", code);
|
|
|
+ m.put("dailyLimit", value);
|
|
|
+ return m;
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== DTOs ====================
|
|
|
+
|
|
|
+ public static class EnergySourceConfigSaveRequest {
|
|
|
+ private Long id;
|
|
|
+ private String sourceType;
|
|
|
+ private Long sourceId;
|
|
|
+ private String sourceName;
|
|
|
+ private List<DimensionRatio> ratios;
|
|
|
+
|
|
|
+ public Long getId() { return id; }
|
|
|
+ public void setId(Long id) { this.id = id; }
|
|
|
+ public String getSourceType() { return sourceType; }
|
|
|
+ public void setSourceType(String sourceType) { this.sourceType = sourceType; }
|
|
|
+ public Long getSourceId() { return sourceId; }
|
|
|
+ public void setSourceId(Long sourceId) { this.sourceId = sourceId; }
|
|
|
+ public String getSourceName() { return sourceName; }
|
|
|
+ public void setSourceName(String sourceName) { this.sourceName = sourceName; }
|
|
|
+ public List<DimensionRatio> getRatios() { return ratios; }
|
|
|
+ public void setRatios(List<DimensionRatio> ratios) { this.ratios = ratios; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class DimensionRatio {
|
|
|
+ private Long dimensionId;
|
|
|
+ private Integer ratio;
|
|
|
+
|
|
|
+ public Long getDimensionId() { return dimensionId; }
|
|
|
+ public void setDimensionId(Long dimensionId) { this.dimensionId = dimensionId; }
|
|
|
+ public Integer getRatio() { return ratio; }
|
|
|
+ public void setRatio(Integer ratio) { this.ratio = ratio; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class DimensionDailyLimit {
|
|
|
+ private String dimensionCode;
|
|
|
+ private Integer dailyLimit;
|
|
|
+
|
|
|
+ public DimensionDailyLimit() {}
|
|
|
+ public DimensionDailyLimit(String dimensionCode, Integer dailyLimit) {
|
|
|
+ this.dimensionCode = dimensionCode;
|
|
|
+ this.dailyLimit = dailyLimit;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getDimensionCode() { return dimensionCode; }
|
|
|
+ public void setDimensionCode(String dimensionCode) { this.dimensionCode = dimensionCode; }
|
|
|
+ public Integer getDailyLimit() { return dailyLimit; }
|
|
|
+ public void setDailyLimit(Integer dailyLimit) { this.dailyLimit = dailyLimit; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class DailyLimitSaveRequest {
|
|
|
+ private List<DimensionDailyLimit> limits;
|
|
|
+
|
|
|
+ public List<DimensionDailyLimit> getLimits() { return limits; }
|
|
|
+ public void setLimits(List<DimensionDailyLimit> limits) { this.limits = limits; }
|
|
|
+ }
|
|
|
+}
|