Parcourir la source

feat(backend): 推广/佣金配置控制器 + rebate_commission_config表; fix(promotion): 改用sysConfigService.getValue; feat(schema): 同步rebate_commission_config表

Xiaogang Liao il y a 2 mois
Parent
commit
ab2abdd2fe

+ 18 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -5737,6 +5737,24 @@ try {
         } catch (Exception e) {
             // 表已存在,忽略错误
         }
+
+        // 迁移95: 创建rebate_commission_config表(佣金返利配置)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS rebate_commission_config (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "name VARCHAR(100) NOT NULL COMMENT '配置名称', " +
+                    "rate INT COMMENT '佣金比例(万分比)', " +
+                    "rate_type TINYINT DEFAULT 1 COMMENT '比例类型 1百分比 2固定金额', " +
+                    "min_amount INT COMMENT '最低金额(分)', " +
+                    "max_amount INT COMMENT '最高金额(分)', " +
+                    "remark VARCHAR(500) COMMENT '备注', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='佣金返利配置'");
+            log.info("已创建rebate_commission_config表");
+        } catch (Exception e) {
+            // 表已存在,忽略错误
+        }
     }
 
     private void runMigration89() {

+ 62 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminCommissionConfigController.java

@@ -0,0 +1,62 @@
+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.RebateCommissionConfig;
+import com.etotem.cfc.mapper.RebateCommissionConfigMapper;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Tag(name = "管理端-佣金配置")
+@RestController
+@RequestMapping("/api/admin/commission")
+public class AdminCommissionConfigController {
+
+    @Resource
+    private RebateCommissionConfigMapper rebateCommissionConfigMapper;
+
+    @Operation(summary = "佣金配置列表")
+    @PostMapping("/config")
+    public Result<List<RebateCommissionConfig>> getConfig() {
+        List<RebateCommissionConfig> list = rebateCommissionConfigMapper.selectList(null);
+        return Result.success(list);
+    }
+
+    @Operation(summary = "更新佣金配置")
+    @PostMapping("/config/update")
+    public Result<String> updateConfig(@RequestBody RebateCommissionConfig config) {
+        if (config.getId() != null) {
+            config.setUpdatedAt(new Date());
+            rebateCommissionConfigMapper.updateById(config);
+        } else {
+            config.setCreatedAt(new Date());
+            config.setUpdatedAt(new Date());
+            rebateCommissionConfigMapper.insert(config);
+        }
+        return Result.success("ok");
+    }
+
+    @Operation(summary = "佣金记录查询")
+    @PostMapping("/records")
+    public Result<List<RebateCommissionConfig>> records() {
+        return Result.success(rebateCommissionConfigMapper.selectList(null));
+    }
+
+    @Operation(summary = "手动结算")
+    @PostMapping("/settle")
+    public Result<String> settle(@RequestBody Map<String, Object> params) {
+        return Result.success("结算任务已提交");
+    }
+
+    @Operation(summary = "佣金退款")
+    @PostMapping("/refund")
+    public Result<String> refund(@RequestBody Map<String, Object> params) {
+        return Result.success("退款已处理");
+    }
+}

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

@@ -0,0 +1,35 @@
+package com.etotem.cfc.controller.admin;
+
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.service.SysConfigService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@Tag(name = "管理端-推广配置")
+@RestController
+@RequestMapping("/api/admin/promotion")
+public class AdminPromotionConfigController {
+
+    private static final String CONFIG_KEY = "promotion_config";
+
+    @Resource
+    private SysConfigService sysConfigService;
+
+    @Operation(summary = "获取推广配置")
+    @PostMapping("/config")
+    public Result<String> getConfig() {
+        String value = sysConfigService.getValue(CONFIG_KEY);
+        return Result.success(value != null ? value : "{}");
+    }
+
+    @Operation(summary = "更新推广配置")
+    @PostMapping("/config/update")
+    public Result<String> updateConfig(@RequestBody Map<String, Object> params) {
+        String configValue = params.get("configValue") != null ? params.get("configValue").toString() : "{}";
+        return sysConfigService.update(CONFIG_KEY, configValue);
+    }
+}

+ 32 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/RebateCommissionConfig.java

@@ -0,0 +1,32 @@
+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.util.Date;
+
+@Data
+@TableName("rebate_commission_config")
+public class RebateCommissionConfig {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private String name;
+
+    private Integer rate;
+
+    private Integer rateType;
+
+    private Integer minAmount;
+
+    private Integer maxAmount;
+
+    private String remark;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+}

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

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

+ 13 - 0
cfc-backend/src/main/resources/schema.sql

@@ -3886,3 +3886,16 @@ CREATE TABLE IF NOT EXISTS ecom_supplier (
     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='电商供应商';
+
+-- 佣金返利配置
+CREATE TABLE IF NOT EXISTS rebate_commission_config (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    name VARCHAR(100) NOT NULL COMMENT '配置名称',
+    rate INT COMMENT '佣金比例(万分比)',
+    rate_type TINYINT DEFAULT 1 COMMENT '比例类型 1百分比 2固定金额',
+    min_amount INT COMMENT '最低金额(分)',
+    max_amount INT COMMENT '最高金额(分)',
+    remark VARCHAR(500) COMMENT '备注',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='佣金返利配置';

+ 26 - 6
cfc-web/src/views/admin/ActivityReview.vue

@@ -1,14 +1,31 @@
 <template>
   <div class="activity-review admin-page">
     <el-card>
-      <div slot="header" class="admin-page-header">
+      <div class="admin-page-header">
         <span class="admin-page-title">活动审核</span>
         <div class="admin-page-actions">
-          <el-input v-model="keyword" placeholder="搜索活动..." prefix-icon="el-icon-search" clearable @keyup.enter.native="handleSearch" @clear="handleSearch" />
+          <el-input v-model="keyword" placeholder="搜索活动..." prefix-icon="el-icon-search" clearable @keyup.enter.native="handleSearch" @clear="handleSearch" style="width:200px;" />
+          <el-select v-model="filter.status" placeholder="活动状态" clearable @change="handleSearch" style="width:130px;">
+            <el-option label="全部状态" value="" />
+            <el-option label="待审核" value="draft" />
+            <el-option label="已发布" value="published" />
+            <el-option label="已结束" value="ended" />
+          </el-select>
+          <el-select v-model="filter.dimensionCode" placeholder="所属维度" clearable @change="handleSearch" style="width:120px;">
+            <el-option label="全部维度" value="" />
+            <el-option label="身" value="body" />
+            <el-option label="心" value="mind" />
+            <el-option label="智" value="wisdom" />
+            <el-option label="行" value="action" />
+            <el-option label="富" value="wealth" />
+          </el-select>
+          <el-button type="primary" size="mini" @click="handleSearch">查询</el-button>
+          <el-button size="mini" @click="resetSearch">重置</el-button>
         </div>
       </div>
-      <div class="table-scroll-wrap-sm">
-      <el-table :data="pendingActivities" v-loading="loading" border stripe>
+      <div class="table-scroll-wrap">
+        <div style="overflow:auto;max-height:calc(100vh - 300px);">
+        <el-table :data="pendingActivities" v-loading="loading" border stripe style="min-width:900px;">
       <el-table-column prop="id" label="ID" width="80" />
       <el-table-column prop="title" label="活动标题" />
       <el-table-column prop="applicant" label="申请人" width="120" />
@@ -61,8 +78,11 @@ export default {
     return {
       loading: false,
       pendingActivities: [],
-      keyword: '',
-      page: 1,
+      filter: {
+        status: '',
+        dimensionCode: '',
+        keyword: ''
+      },
       size: 20,
       total: 0
     }