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

chore: final fixes - DatabaseInitializer merge conflict resolution, frontend API config, admin API updates

Xiaogang Liao 2 месяцев назад
Родитель
Сommit
f23e00d7be

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

@@ -5261,6 +5261,7 @@ try {
         runMigration81();
         runMigration81();
         runMigration82();
         runMigration82();
         runMigration86();
         runMigration86();
+        runMigration88();
     }
     }
 
 
     private void runMigration81() {
     private void runMigration81() {
@@ -5582,4 +5583,66 @@ try {
             log.warn("创建 butler_assignments 表失败:{}", e.getMessage());
             log.warn("创建 butler_assignments 表失败:{}", e.getMessage());
         }
         }
     }
     }
+
+    private void runMigration88() {
+        // 迁移 88: 创建家庭公共账户体系(family_earnings / family_earnings_member / family_earnings_record)
+        // 表 1: family_earnings(家庭总账)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_earnings (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL UNIQUE COMMENT '家庭 ID', " +
+                    "total_earned BIGINT NOT NULL DEFAULT 0 COMMENT '累计推荐收入(分)', " +
+                    "available_amount BIGINT NOT NULL DEFAULT 0 COMMENT '当前可支配余额(分)', " +
+                    "withdrawn_amount BIGINT NOT NULL DEFAULT 0 COMMENT '已提现金额(分)', " +
+                    "distributed_amount BIGINT NOT NULL DEFAULT 0 COMMENT '已颁发给成员的金额(分)', " +
+                    "updated_at DATETIME, " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_family_id (family_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭公共账户'");
+            log.info("已创建 family_earnings 表");
+        } catch (Exception e) {
+            log.warn("创建 family_earnings 表失败:{}", e.getMessage());
+        }
+
+        // 表 2: family_earnings_member(成员已分配余额)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_earnings_member (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL, " +
+                    "user_id BIGINT NOT NULL, " +
+                    "allocated_amount BIGINT NOT NULL DEFAULT 0 COMMENT '管理员累计分配(分)', " +
+                    "consumed_amount BIGINT NOT NULL DEFAULT 0 COMMENT '已消费金额(分)', " +
+                    "available_amount BIGINT NOT NULL DEFAULT 0 COMMENT '可消费余额=allocated-consumed(分)', " +
+                    "can_use_family_balance TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否允许使用家庭公共池', " +
+                    "updated_at DATETIME, " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "UNIQUE KEY idx_family_user (family_id, user_id)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭成员已分配余额'");
+            log.info("已创建 family_earnings_member 表");
+        } catch (Exception e) {
+            log.warn("创建 family_earnings_member 表失败:{}", e.getMessage());
+        }
+
+        // 表 3: family_earnings_record(收支流水)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_earnings_record (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "family_id BIGINT NOT NULL, " +
+                    "type VARCHAR(20) NOT NULL COMMENT 'earn 收入/withdraw 提现/distribute 颁发/consume 消费', " +
+                    "amount BIGINT NOT NULL COMMENT '金额(分)', " +
+                    "from_user_id BIGINT COMMENT '操作人', " +
+                    "to_user_id BIGINT COMMENT '受益人(颁发/消费时填写)', " +
+                    "note VARCHAR(255) COMMENT '备注', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_family_id (family_id), " +
+                    "INDEX idx_type (type)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭收益收支流水'");
+            log.info("已创建 family_earnings_record 表");
+        } catch (Exception e) {
+            log.warn("创建 family_earnings_record 表失败:{}", e.getMessage());
+        }
+
+        // commission_records 加 family_id 列
+        ensureColumn("commission_records", "family_id", "BIGINT COMMENT '归属家庭 ID'");
+    }
 }
 }

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

@@ -2890,3 +2890,45 @@ CREATE TABLE IF NOT EXISTS butler_commission_settlements (
     INDEX idx_status (status),
     INDEX idx_status (status),
     INDEX idx_year_month (year_month)
     INDEX idx_year_month (year_month)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管家月度佣金结算单';
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管家月度佣金结算单';
+
+-- 家庭公共账户体系
+
+CREATE TABLE family_earnings (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_id BIGINT NOT NULL UNIQUE COMMENT '家庭ID',
+    total_earned BIGINT NOT NULL DEFAULT 0 COMMENT '累计推荐收入(分)',
+    available_amount BIGINT NOT NULL DEFAULT 0 COMMENT '当前可支配余额(分)',
+    withdrawn_amount BIGINT NOT NULL DEFAULT 0 COMMENT '已提现金额(分)',
+    distributed_amount BIGINT NOT NULL DEFAULT 0 COMMENT '已颁发给成员的金额(分)',
+    updated_at DATETIME,
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_family_id (family_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭公共账户';
+
+CREATE TABLE family_earnings_member (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_id BIGINT NOT NULL,
+    user_id BIGINT NOT NULL,
+    allocated_amount BIGINT NOT NULL DEFAULT 0 COMMENT '管理员累计分配(分)',
+    consumed_amount BIGINT NOT NULL DEFAULT 0 COMMENT '已消费金额(分)',
+    available_amount BIGINT NOT NULL DEFAULT 0 COMMENT '可消费余额=allocated-consumed(分)',
+    can_use_family_balance TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否允许使用家庭公共池',
+    updated_at DATETIME,
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    UNIQUE KEY idx_family_user (family_id, user_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭成员已分配余额';
+
+CREATE TABLE family_earnings_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    family_id BIGINT NOT NULL,
+    type VARCHAR(20) NOT NULL COMMENT '类型: earn收入/withdraw提现/distribute颁发/consume消费',
+    amount BIGINT NOT NULL COMMENT '金额(分)',
+    from_user_id BIGINT COMMENT '操作人',
+    to_user_id BIGINT COMMENT '受益人(颁发/消费时填写)',
+    note VARCHAR(255) COMMENT '备注',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_family_id (family_id),
+    INDEX idx_type (type)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家庭收益收支流水';
+
+ALTER TABLE commission_records ADD COLUMN family_id BIGINT COMMENT '归属家庭ID';

+ 10 - 1
cfc-frontend/utils/api.js

@@ -21,7 +21,16 @@ function _clearAuthAndRedirect() {
   }, 1500)
   }, 1500)
 }
 }
 
 
-const request = (url, method = 'POST', data = {}) => {
+const request = (url, method = 'POST', data = {}, options = {}) => {
+  // Append query params from options to URL if provided (e.g., { guideId } for GET requests)
+  if (options && Object.keys(options).length > 0) {
+    const separator = url.includes('?') ? '&' : '?'
+    const query = Object.entries(options)
+      .filter(([_, v]) => v !== undefined && v !== null && v !== '')
+      .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
+      .join('&')
+    if (query) url = url + separator + query
+  }
   const token = uni.getStorageSync('token')
   const token = uni.getStorageSync('token')
   
   
   return new Promise((resolve, reject) => {
   return new Promise((resolve, reject) => {

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-0eac7c7c4dc324bd34ccf1a6a09e391c305efcb4
+fd4fc493b82e0a2a4f8e40197b4883a010dcaf18

+ 8 - 8
cfc-web/src/api/admin.js

@@ -1038,7 +1038,7 @@ export function getSupplySystemList(params) {
   return request({
   return request({
     url: '/api/admin/supply-system/list',
     url: '/api/admin/supply-system/list',
     method: 'post',
     method: 'post',
-    params: params || {}
+    data: params || {}
   })
   })
 }
 }
 
 
@@ -1046,7 +1046,7 @@ export function getSupplySystemDetail(id) {
   return request({
   return request({
     url: '/api/admin/supply-system/detail',
     url: '/api/admin/supply-system/detail',
     method: 'post',
     method: 'post',
-    params: { id }
+    data: { id }
   })
   })
 }
 }
 
 
@@ -1070,7 +1070,7 @@ export function toggleSupplySystemStatus(id) {
   return request({
   return request({
     url: '/api/admin/supply-system/toggle-status',
     url: '/api/admin/supply-system/toggle-status',
     method: 'post',
     method: 'post',
-    params: { id }
+    data: { id }
   })
   })
 }
 }
 
 
@@ -1085,7 +1085,7 @@ export function getSupplySystemMembers(systemId) {
   return request({
   return request({
     url: '/api/admin/supply-system/member/list',
     url: '/api/admin/supply-system/member/list',
     method: 'post',
     method: 'post',
-    params: { systemId }
+    data: { systemId }
   })
   })
 }
 }
 
 
@@ -1093,7 +1093,7 @@ export function addSupplySystemMember(systemId, userId) {
   return request({
   return request({
     url: '/api/admin/supply-system/member/add',
     url: '/api/admin/supply-system/member/add',
     method: 'post',
     method: 'post',
-    params: { systemId, userId }
+    data: { systemId, userId }
   })
   })
 }
 }
 
 
@@ -1101,7 +1101,7 @@ export function removeSupplySystemMember(memberId) {
   return request({
   return request({
     url: '/api/admin/supply-system/member/remove',
     url: '/api/admin/supply-system/member/remove',
     method: 'post',
     method: 'post',
-    params: { memberId }
+    data: { memberId }
   })
   })
 }
 }
 
 
@@ -1109,7 +1109,7 @@ export function changeSupplySystemMemberRole(memberId, role) {
   return request({
   return request({
     url: '/api/admin/supply-system/member/change-role',
     url: '/api/admin/supply-system/member/change-role',
     method: 'post',
     method: 'post',
-    params: { memberId, role }
+    data: { memberId, role }
   })
   })
 }
 }
 
 
@@ -1225,7 +1225,7 @@ export function getSupplyHierarchyTree(systemId) {
     return request({
     return request({
         url: '/api/admin/supply-hierarchy/tree',
         url: '/api/admin/supply-hierarchy/tree',
         method: 'post',
         method: 'post',
-        params: { systemId }
+        data: { systemId }
     })
     })
 }
 }