Jelajahi Sumber

更新Fund模块文档和功能;删除FUND_STATUS枚举;改进日志显示;更新Test文档;调整字体配置

Your Name 8 bulan lalu
induk
melakukan
f77133a5ff

+ 68 - 0
app/Module/Fund/Docs/DEV-管理员资金操作.md

@@ -0,0 +1,68 @@
+# 开发计划
+
+## 1. 数据库修改 ⏳
+
+- [ ] 创建 admin_user_map 表
+- [ ] 修改 fund_admin_operation 表,只保留一个 fund_id 字段
+
+## 2. 实现管理员虚拟用户关联功能 ⏳
+
+- [ ] 创建 AdminUserMapModel 模型类
+- [ ] 实现创建虚拟用户的方法
+- [ ] 实现管理员与虚拟用户的关联方法
+- [ ] 实现查询管理员关联虚拟用户的方法
+
+## 3. 修改资金操作相关代码 ⏳
+
+- [ ] 更新 FundService 类中的 admin_operate 方法
+- [ ] 更新转账给用户的方法,使用单一的 fund_id
+- [ ] 更新从用户回收资金的方法,使用单一的 fund_id
+- [ ] 更新管理员账户充值的方法,使用单一的 fund_id
+
+## 4. 修改后台界面 ⏳
+
+- [ ] 更新管理员账户管理界面
+- [ ] 更新用户资金操作界面
+- [ ] 更新操作记录查询界面
+
+## 5. 数据迁移 ⏳
+
+- [ ] 为现有管理员创建虚拟用户
+- [ ] 将现有的管理员资金操作记录迁移到新的表结构
+
+## 6. 测试 ⏳
+
+- [ ] 编写单元测试
+- [ ] 进行集成测试
+- [ ] 进行界面测试
+
+## 开发进度
+
+- ✅ 已完成
+- 🔄 进行中
+- ⏳ 待开始
+
+### 当前进度
+
+- 已完成需求分析和设计文档
+
+### 下一步计划
+
+1. 创建 admin_user_map 表
+2. 修改 fund_admin_operation 表结构
+3. 实现管理员虚拟用户关联功能
+
+### 修改原因
+
+原设计中,`fund_admin_operation` 表包含 `admin_fund_id` 和 `user_fund_id` 两个字段,这可能导致以下问题:
+
+1. **数据一致性风险**:如果两个字段的值不一致(即不同类型的资金账户之间尝试转账),会导致系统行为不一致
+2. **业务规则复杂化**:需要额外的验证逻辑确保两个字段的值一致
+3. **数据冗余**:由于不同类型的资金账户之间不允许转账,这两个字段实际上应该始终保持一致
+
+通过只保留一个 `fund_id` 字段,我们可以:
+
+1. **强制业务规则**:在数据库层面确保只能在相同类型的资金账户之间转账
+2. **简化验证逻辑**:不需要额外验证两个字段是否一致
+3. **减少数据冗余**:只存储一次资金类型信息
+4. **提高代码可维护性**:简化相关代码逻辑

+ 326 - 0
app/Module/Fund/Docs/管理员资金操作-严谨版.md

@@ -0,0 +1,326 @@
+# 管理员资金操作系统(严谨版)
+
+## 1. 概述
+
+管理员资金操作系统是 Fund 模块的重要组成部分,允许管理员对用户的资金账户进行操作,包括增加或减少资金、资金流转等。为了实现更严谨的内部管理和资金追踪,本系统采用"管理员专用账户"的设计理念,确保每笔资金操作都有明确的来源和去向。
+
+### 1.1 资金来源与管理员账户
+
+在严谨版的管理员资金操作系统中,我们采用以下原则:
+
+1. **管理员虚拟用户**:每个管理员都关联一个虚拟用户,该用户拥有正常的资金账户
+2. **资金转移原则**:管理员增加用户资金时,资金必须从管理员的虚拟用户账户转出;管理员减少用户资金时,资金会转入管理员的虚拟用户账户
+3. **资金平衡**:系统中的资金总量保持平衡,除超级管理员外,普通管理员不能凭空创建或销毁资金
+4. **超级管理员特权**:只有超级管理员可以凭空创建资金(系统初始化或特殊情况下使用)
+
+这种设计确保了资金操作的可追踪性和责任明确性,有效防止了资金滥用和操作错误。
+
+## 2. 功能列表
+
+管理员资金操作系统主要包含以下功能:
+
+1. **管理员虚拟用户管理**:创建、查询和管理管理员关联的虚拟用户
+2. **资金转账操作**:从管理员的虚拟用户账户向用户账户转账(增加用户资金)
+3. **资金回收操作**:从用户账户向管理员的虚拟用户账户转账(减少用户资金)
+4. **管理员账户充值**:超级管理员向普通管理员的虚拟用户账户充值
+5. **资金流转操作**:在用户的不同资金账户之间进行资金流转
+6. **操作记录查询**:查询所有资金操作的历史记录
+
+## 3. 数据结构
+
+### 3.1 数据库表
+
+#### 3.1.1 admin_user_map 表(新增)
+
+管理员与虚拟用户映射表,记录管理员与虚拟用户的关联关系。
+
+| 字段名 | 类型 | 说明 |
+|-------|------|------|
+| id | int | 自增主键 |
+| admin_id | int | 管理员ID |
+| user_id | int | 虚拟用户ID |
+| is_super | tinyint | 是否超级管理员(1:是,0:否) |
+| status | int | 状态 |
+| create_time | int | 创建时间(时间戳) |
+| update_time | int | 更新时间(时间戳) |
+
+注意:虚拟用户的资金账户使用现有的 fund_account 表存储,不需要创建新的表结构。
+
+#### 3.1.2 fund_admin_operation 表(修改原 fund_admin 表)
+
+管理员资金操作记录表,记录管理员对用户资金的操作历史。
+
+| 字段名 | 类型 | 说明 |
+|-------|------|------|
+| id | int | 自增主键 |
+| admin_id | int | 管理员ID |
+| admin_user_id | int | 管理员关联的虚拟用户ID |
+| admin_fund_id | int | 管理员虚拟用户的资金账户ID |
+| user_id | int | 目标用户ID |
+| user_fund_id | int | 目标用户资金账户ID |
+| amount | bigint | 操作金额(毫为单位,正数为增加用户资金,负数为减少用户资金) |
+| operation_type | int | 操作类型(1:转账给用户, 2:从用户回收, 3:管理员账户充值) |
+| status | int | 状态 |
+| create_time | int | 创建时间(时间戳) |
+| remark | varchar(1000) | 备注信息 |
+
+#### 3.1.3 fund_circulation 表(保持不变)
+
+资金流转记录表,记录用户资金在不同账户间的流转历史。
+
+| 字段名 | 类型 | 说明 |
+|-------|------|------|
+| id | int | 自增主键 |
+| user_id | int | 用户ID |
+| fund_id | int | 源资金账户ID |
+| to_fund_id | int | 目标资金账户ID |
+| re_type | string | 关联类型 |
+| re_id | int | 关联ID |
+| total_fee | int | 流转金额(毫为单位) |
+| create_time | int | 创建时间(时间戳) |
+| ok_time | int | 处理时间(时间戳) |
+| remark | string | 备注信息 |
+
+### 3.2 枚举类型
+
+#### 3.2.1 ADMIN_OPERATION_TYPE 枚举(新增)
+
+定义了管理员资金操作的类型:
+
+1. **TRANSFER_TO_USER (1)**:转账给用户
+2. **RECOVER_FROM_USER (2)**:从用户回收
+3. **ADMIN_ACCOUNT_RECHARGE (3)**:管理员账户充值
+
+#### 3.2.2 ADMIN_ACCOUNT_STATUS 枚举(新增)
+
+定义了管理员账户的状态:
+
+1. **NORMAL (1)**:正常
+2. **FROZEN (2)**:冻结
+3. **DISABLED (3)**:禁用
+
+## 4. 业务流程
+
+### 4.1 管理员虚拟用户创建流程
+
+1. 系统管理员在后台创建新的管理员
+2. 系统自动为该管理员创建一个虚拟用户,并在 admin_user_map 表中建立关联
+3. 系统为虚拟用户创建各种类型的资金账户(使用现有的 fund_account 表)
+4. 超级管理员向新管理员的虚拟用户账户充值初始资金
+5. 新管理员账户激活,可以开始操作用户资金
+
+### 4.2 增加用户资金流程
+
+1. 管理员在后台选择用户的资金账户
+2. 管理员输入要增加的金额和备注信息
+3. 系统查询管理员关联的虚拟用户账户,验证账户余额是否充足
+4. 如果余额充足,系统执行资金转移:从管理员的虚拟用户账户扣除资金,增加目标用户账户余额
+5. 系统记录操作日志到 fund_admin_operation 表和 fund_logs 表
+6. 如果余额不足,系统提示管理员余额不足,操作失败
+
+### 4.3 减少用户资金流程
+
+1. 管理员在后台选择用户的资金账户
+2. 管理员输入要减少的金额和备注信息
+3. 系统验证用户账户余额是否充足
+4. 如果余额充足,系统执行资金转移:从用户账户扣除资金,增加管理员的虚拟用户账户余额
+5. 系统记录操作日志到 fund_admin_operation 表和 fund_logs 表
+6. 如果用户余额不足,系统提示用户余额不足,操作失败
+
+### 4.4 管理员账户充值流程
+
+1. 超级管理员在后台选择要充值的管理员
+2. 超级管理员输入充值金额和备注信息
+3. 系统查询管理员关联的虚拟用户账户
+4. 系统执行充值操作,增加管理员的虚拟用户账户余额
+5. 系统记录操作日志到 fund_admin_operation 表和 fund_logs 表
+6. 系统通知被充值的管理员
+
+### 4.5 资金流转操作流程(保持不变)
+
+1. 管理员在后台选择用户的源资金账户
+2. 管理员选择同一用户的目标资金账户
+3. 管理员输入流转金额和备注信息
+4. 系统验证操作合法性(包括账户余额是否充足)
+5. 系统执行资金流转,减少源账户余额,增加目标账户余额
+6. 系统记录流转日志到 fund_circulation 表和 fund_logs 表
+
+## 5. 实现逻辑
+
+### 5.1 管理员虚拟用户管理实现
+
+管理员虚拟用户管理实现主要包含以下逻辑:
+
+1. **创建管理员虚拟用户**
+   - 首先检查该管理员是否已有虚拟用户
+   - 如果不存在,创建新的虚拟用户记录
+   - 在 admin_user_map 表中建立管理员与虚拟用户的关联
+   - 为虚拟用户创建各种类型的资金账户
+   - 设置虚拟用户状态为正常
+   - 如果有初始余额,记录一笔充值操作
+   - 返回创建结果
+
+2. **查询管理员虚拟用户**
+   - 根据管理员ID查询关联的虚拟用户信息
+   - 查询虚拟用户的资金账户信息
+   - 返回虚拟用户详细信息,包括账户余额、状态等
+
+3. **更新管理员虚拟用户状态**
+   - 可以将虚拟用户状态更新为正常、冻结或禁用
+   - 记录状态变更日志
+   - 返回更新结果
+
+### 5.2 增加用户资金实现
+
+管理员向用户转账(增加用户资金)的实现逻辑如下:
+
+1. **参数验证**
+   - 验证转账金额是否大于0
+   - 验证管理员是否存在
+   - 查询管理员关联的虚拟用户
+   - 验证虚拟用户状态是否正常
+   - 验证虚拟用户资金账户余额是否足够
+
+2. **事务处理**
+   - 开始数据库事务,确保操作原子性
+   - 减少管理员虚拟用户账户余额
+   - 查询并验证目标用户账户是否存在
+   - 增加目标用户账户余额
+   - 记录管理员操作日志
+   - 记录用户资金变动日志
+   - 提交事务
+
+3. **异常处理**
+   - 如果过程中出现任何错误,回滚事务
+   - 返回错误信息
+
+4. **成功处理**
+   - 操作成功后返回成功标志
+
+### 5.3 减少用户资金实现
+
+从用户账户回收资金(减少用户资金)的实现逻辑如下:
+
+1. **参数验证**
+   - 验证回收金额是否大于0
+   - 验证管理员是否存在
+   - 查询管理员关联的虚拟用户
+   - 验证虚拟用户状态是否正常
+   - 验证目标用户账户是否存在
+   - 验证目标用户账户余额是否足够
+
+2. **事务处理**
+   - 开始数据库事务,确保操作原子性
+   - 减少目标用户账户余额
+   - 增加管理员虚拟用户账户余额
+   - 记录管理员操作日志(使用负数金额表示减少用户资金)
+   - 记录用户资金变动日志(使用负数金额表示减少)
+   - 提交事务
+
+3. **异常处理**
+   - 如果过程中出现任何错误,回滚事务
+   - 返回错误信息
+
+4. **成功处理**
+   - 操作成功后返回成功标志
+
+### 5.4 管理员账户充值实现
+
+超级管理员向普通管理员的虚拟用户账户充值的实现逻辑如下:
+
+1. **参数验证**
+   - 验证充值金额是否大于0
+   - 验证操作者是否拥有超级管理员权限
+   - 验证目标管理员是否存在
+   - 查询目标管理员关联的虚拟用户
+   - 验证虚拟用户状态是否正常
+
+2. **事务处理**
+   - 开始数据库事务,确保操作原子性
+   - 增加目标管理员虚拟用户账户余额
+   - 记录充值操作日志
+   - 提交事务
+
+3. **异常处理**
+   - 如果过程中出现任何错误,回滚事务
+   - 返回错误信息
+
+4. **成功处理**
+   - 操作成功后返回成功标志
+
+这个功能是系统中唯一可以凭空创造资金的操作,只有超级管理员可以执行。这个设计确保了系统中的资金创造权限受到严格控制。
+
+## 6. 后台界面实现
+
+### 6.1 管理员虚拟用户管理界面
+
+管理员虚拟用户管理界面包括以下功能:
+
+1. **虚拟用户列表**:显示所有管理员关联的虚拟用户,包括管理员ID、管理员名称、虚拟用户ID、资金账户信息、余额、状态等
+2. **虚拟用户创建**:超级管理员可以为普通管理员创建虚拟用户
+3. **账户充值**:超级管理员可以向普通管理员的虚拟用户账户充值
+4. **状态管理**:超级管理员可以冻结或解冻管理员的虚拟用户
+5. **操作记录**:查看虚拟用户账户的操作历史记录
+
+### 6.2 用户资金操作界面
+
+用户资金操作界面包括以下功能:
+
+1. **转账给用户**:管理员从自己的虚拟用户账户向目标用户账户转账(增加用户资金)
+2. **从用户回收**:从目标用户账户回收资金到管理员的虚拟用户账户(减少用户资金)
+3. **资金流转**:在用户的不同资金账户之间进行资金流转
+4. **操作记录**:查看对用户账户的操作历史记录
+
+### 6.3 操作记录查询界面
+
+操作记录查询界面包括以下功能:
+
+1. **管理员操作记录**:查询所有管理员的资金操作记录
+2. **用户资金变动记录**:查询用户资金的变动记录
+3. **管理员账户变动记录**:查询管理员账户的变动记录
+4. **高级筛选**:支持多种条件组合筛选,如时间范围、操作类型、金额范围等
+
+## 7. 权限控制
+
+### 7.1 超级管理员权限
+
+超级管理员拥有以下特殊权限:
+
+1. 创建和管理管理员的虚拟用户
+2. 向管理员的虚拟用户账户充值(凭空创建资金)
+3. 冻结和解冻管理员的虚拟用户
+4. 查看所有管理员的操作记录
+
+### 7.2 普通管理员权限
+
+普通管理员拥有以下权限:
+
+1. 查看自己的虚拟用户账户信息和余额
+2. 从自己的虚拟用户账户向用户账户转账(前提是自己账户有足够余额)
+3. 从用户账户回收资金到自己的虚拟用户账户
+4. 执行用户账户之间的资金流转
+5. 查看自己的操作记录
+
+## 8. 安全与审计
+
+为确保资金操作的安全性和可追溯性,系统实现了以下机制:
+
+1. **资金平衡**:除超级管理员外,普通管理员不能凭空创建或销毁资金,确保系统资金总量可控
+2. **虚拟用户账户**:每个管理员都有专属的虚拟用户账户,确保资金操作可追踪
+3. **事务处理**:所有资金操作都在数据库事务中执行,确保操作的原子性
+4. **操作日志**:所有操作都会记录详细的日志,包括操作人、操作时间、操作金额等信息
+5. **权限控制**:严格的权限控制确保只有授权人员才能执行相应操作
+6. **余额验证**:系统会验证账户余额是否充足,防止透支操作
+7. **定期审计**:系统支持定期审计功能,可以生成审计报表
+
+## 9. 注意事项
+
+1. 管理员的虚拟用户账户余额不足时,无法向用户转账,需要先向超级管理员申请充值
+2. 用户账户余额不足时,无法执行减少操作
+3. 操作金额使用毫为单位,但在界面上显示和输入时使用元为单位,系统会自动进行单位转换
+4. 所有操作都会记录详细的日志,便于后续审计和问题排查
+5. 资金流转只能在同一用户的不同资金账户之间进行,且币种必须一致
+6. 管理员的虚拟用户账户的资金不能直接用于业务操作,只能用于向用户转账
+7. 应定期审计管理员资金操作记录,确保操作的合法性和合理性
+8. 超级管理员应谨慎使用充值功能,避免过度增加系统中的资金总量
+9. 每个管理员都应该有自己的虚拟用户账户,不应共享账户,以确保操作的责任可追溯

+ 337 - 0
app/Module/Fund/Docs/管理员资金操作.md

@@ -0,0 +1,337 @@
+# 管理员资金操作系统
+
+## 1. 概述
+
+管理员资金操作系统是 Fund 模块的重要组成部分,允许管理员对用户的资金账户进行操作,包括增加或减少资金、资金流转等。本文档详细描述了管理员资金操作的业务流程、数据结构和实现逻辑。
+
+### 1.1 资金来源
+
+管理员操作的资金是系统中的“虚拟资金”,不需要实际的资金来源。当管理员增加用户账户余额时,这些资金是凭空创建的;当管理员减少用户账户余额时,这些资金会直接从系统中消失。这是因为在游戏或虚拟经济系统中,管理员有权限直接修改系统数据,包括用户的资金余额。
+
+这种操作通常用于以下场景:
+
+1. **系统奖励**:管理员可以给用户发放奖励或补偿
+2. **数据修正**:当系统出现问题导致用户资金错误时,管理员可以进行修正
+3. **账户调整**:根据运营需求调整用户账户余额
+4. **测试目的**:在测试环境中模拟不同的资金状态
+
+系统会记录所有管理员资金操作,以便于审计和追踪。
+
+## 2. 功能列表
+
+管理员资金操作系统主要包含以下功能:
+
+1. **资金直接操作**:管理员可以直接增加或减少用户账户的资金
+2. **资金流转操作**:管理员可以在用户的不同资金账户之间进行资金流转
+3. **操作记录查询**:管理员可以查询所有资金操作的历史记录
+
+## 3. 数据结构
+
+### 3.1 数据库表
+
+#### 3.1.1 fund_admin 表
+
+管理员资金操作记录表,记录管理员对用户资金的操作历史。
+
+| 字段名 | 类型 | 说明 |
+|-------|------|------|
+| id | int | 自增主键 |
+| total_fee | bigint | 操作金额(毫为单位) |
+| status | int | 状态 |
+| fund_id | int | 资金账户ID |
+| user_id | int | 用户ID |
+| admin_id | int | 管理员ID |
+| create_time | int | 创建时间(时间戳) |
+| remark | varchar(1000) | 备注信息 |
+
+#### 3.1.2 fund_circulation 表
+
+资金流转记录表,记录用户资金在不同账户间的流转历史。
+
+| 字段名 | 类型 | 说明 |
+|-------|------|------|
+| id | int | 自增主键 |
+| user_id | int | 用户ID |
+| fund_id | int | 源资金账户ID |
+| to_fund_id | int | 目标资金账户ID |
+| re_type | string | 关联类型 |
+| re_id | int | 关联ID |
+| total_fee | int | 流转金额(毫为单位) |
+| create_time | int | 创建时间(时间戳) |
+| ok_time | int | 处理时间(时间戳) |
+| remark | string | 备注信息 |
+
+### 3.2 枚举类型
+
+#### 3.2.1 FUND_TYPE 枚举
+
+定义了系统支持的资金类型。
+
+```php
+enum FUND_TYPE: int
+{
+    /**
+     * 代币1
+     */
+    case FUND1 = 1;
+    /**
+     * 代币2
+     */
+    case FUND2 = 2;
+}
+```
+
+#### 3.2.2 LOG_TYPE 枚举
+
+定义了资金日志的类型。
+
+```php
+enum LOG_TYPE: int
+{
+    /**
+     * 管理员操作
+     */
+    case ADMIN = 3;
+
+    /**
+     * 流转
+     */
+    case CIRCULATION = 4;
+
+    /**
+     * 贸易(业务)
+     */
+    case TRADE = 5;
+
+    /**
+     * 转账
+     */
+    case TRANSFER = 8;
+
+    /**
+     * 冻结
+     */
+    case FREEZE = 10;
+
+    /**
+     * 解冻
+     */
+    case UNFREEZE = 11;
+}
+```
+
+## 4. 业务流程
+
+### 4.1 资金直接操作流程
+
+1. 管理员在后台选择用户的资金账户
+2. 管理员输入操作金额(正数为增加,负数为减少)和备注信息
+3. 系统验证操作合法性
+4. 系统执行资金操作,更新用户账户余额
+5. 系统记录操作日志到 fund_admin 表和 fund_logs 表
+
+### 4.2 资金流转操作流程
+
+1. 管理员在后台选择用户的源资金账户
+2. 管理员选择同一用户的目标资金账户
+3. 管理员输入流转金额和备注信息
+4. 系统验证操作合法性(包括账户余额是否充足)
+5. 系统执行资金流转,减少源账户余额,增加目标账户余额
+6. 系统记录流转日志到 fund_circulation 表和 fund_logs 表
+
+## 5. 实现逻辑
+
+### 5.1 资金直接操作实现
+
+资金直接操作通过 `FundService` 类的 `admin_operate` 方法实现:
+
+```php
+/**
+ * Admin 资金操作
+ *
+ * @param  int  $admin_id  管理员ID
+ * @param  FUND_TYPE  $fund_id  资金类型
+ * @param  int  $fund_fee  操作金额(毫为单位)
+ * @param  string  $remark  备注信息
+ * @return bool|string  成功返回true,失败返回错误信息
+ */
+public function admin_operate(int $admin_id, FUND_TYPE $fund_id, int $fund_fee, string $remark)
+{
+    // 准备数据
+    $data = [
+        'total_fee' => $fund_fee,
+        'status' => 1,
+        'user_id' => $this->userId,
+        'fund_id' => $fund_id->valueInt(),
+        'admin_id' => $admin_id,
+        'create_time' => time(),
+        'remark' => $remark
+    ];
+
+    // 启动事务
+    DB::beginTransaction();
+
+    // 写日志
+    $fund_admin = new FundAdminModel();
+    $fund_admin->setData($data);
+    if ($fund_admin->save() === false) {
+        DB::rollBack();
+        return '_Model-error';
+    }
+
+    // 进行资金操作
+    $re = \App\Module\Fund\Service\User::handle(
+        $this->userId,
+        $fund_id->value,
+        $fund_fee,
+        \App\Module\Fund\Enums\LOG_TYPE::ADMIN,
+        $fund_admin->id,
+        $remark
+    );
+
+    if (is_string($re)) {
+        DB::rollBack();
+        return $re;
+    }
+
+    DB::commit();
+    return $re;
+}
+```
+
+### 5.2 资金流转操作实现
+
+资金流转操作通过 `FundService` 类的 `circulation` 方法实现:
+
+```php
+/**
+ * 资金流转(同用户,同币种,不同账户)
+ *
+ * @param  FUND_TYPE  $to_fund_id  目标资金账户
+ * @param  int  $amount  流转金额(毫为单位)
+ * @param  int  $re_id  关联ID
+ * @param  string  $re_type  关联类型
+ * @param  string  $remark  备注信息
+ * @return bool|string  成功返回true,失败返回错误信息
+ */
+public function circulation(FUND_TYPE $to_fund_id, int $amount, int $re_id, string $re_type, string $remark)
+{
+    // 确认货币种类一致
+    if (!CurrencyService::check($this->fundId, $to_fund_id->valueInt())) {
+        return '币种不一致,禁止划转';
+    }
+
+    Helper::check_tr();
+
+    // 先进行转账记录
+    $re_id = Circulation::handle(
+        $this->userId,
+        $this->fundId,
+        $to_fund_id->valueInt(),
+        $amount,
+        $re_id,
+        $re_type,
+        $remark
+    );
+
+    if (is_string($re_id)) {
+        return $re_id;
+    }
+
+    // 进行双方的资金修改
+    // 先减少自己的
+    $re46 = User::handle(
+        $this->userId,
+        $this->fundId,
+        -$amount,
+        LOG_TYPE::CIRCULATION,
+        $re_id,
+        $remark
+    );
+
+    if (is_string($re46)) {
+        return $re46;
+    }
+
+    // 再增加自己另一个账户
+    $re51 = User::handle(
+        $this->userId,
+        $to_fund_id->valueInt(),
+        $amount,
+        LOG_TYPE::CIRCULATION,
+        $re_id,
+        $remark
+    );
+
+    if (is_string($re51)) {
+        return $re51;
+    }
+
+    return true;
+}
+```
+
+## 6. 后台界面实现
+
+### 6.1 资金直接操作界面
+
+资金直接操作通过 `FundAdminAction` 和 `FundAdminForm` 类实现:
+
+1. `FundAdminAction` 类定义了操作按钮和弹窗
+2. `FundAdminForm` 类定义了操作表单和处理逻辑
+
+表单包含以下字段:
+- `add`:操作金额(正数为增加,负数为减少)
+- `remark`:操作备注
+
+### 6.2 资金流转操作界面
+
+资金流转操作通过 `Circulation` 和 `CirculationForm` 类实现:
+
+1. `Circulation` 类定义了操作按钮和链接
+2. `CirculationForm` 类定义了操作表单和处理逻辑
+
+表单包含以下字段:
+- `user_id`:用户ID(隐藏字段)
+- `fund_id`:源资金账户ID(隐藏字段)
+- `to_fund_id`:目标资金账户ID(单选框)
+- `acc`:流转金额
+- `remark`:操作备注
+
+## 7. 查询与统计
+
+### 7.1 管理员操作记录查询
+
+管理员操作记录通过 `FundAdminController` 实现查询功能,支持以下筛选条件:
+- 用户ID
+- 管理员ID
+- 资金类型
+- 操作金额
+- 操作时间
+
+### 7.2 资金流转记录查询
+
+资金流转记录通过 `FundCirculationController` 实现查询功能,支持以下筛选条件:
+- 用户ID
+- 源资金账户
+- 目标资金账户
+- 流转金额
+- 流转时间
+
+## 8. 安全与审计
+
+为确保资金操作的安全性和可追溯性,系统实现了以下机制:
+
+1. **事务处理**:所有资金操作都在数据库事务中执行,确保操作的原子性
+2. **操作日志**:所有操作都会记录详细的日志,包括操作人、操作时间、操作金额等信息
+3. **权限控制**:只有具有特定权限的管理员才能执行资金操作
+4. **数据验证**:系统会验证操作的合法性,如账户余额是否充足等
+
+## 9. 注意事项
+
+1. 管理员资金操作会直接影响用户账户余额,应谨慎使用
+2. 操作金额使用毫为单位,但在界面上显示和输入时使用元为单位,系统会自动进行单位转换
+3. 所有操作都会记录详细的日志,便于后续审计和问题排查
+4. 资金流转只能在同一用户的不同资金账户之间进行,且币种必须一致
+5. 管理员操作的资金是系统中的虚拟资金,不需要实际的资金来源,但会影响系统的虚拟经济平衡
+6. 应定期审计管理员资金操作记录,确保操作的合法性和合理性

+ 0 - 46
app/Module/Fund/Enums/FUND_STATUS.php

@@ -1,46 +0,0 @@
-<?php
-
-namespace App\Module\Fund\Enums;
-
-use UCore\Enum\EnumCore;
-use UCore\Enum\EnumToInt;
-
-enum FUND_STATUS: int
-{
-    use EnumToInt, EnumCore;
-
-    /**
-     * 正常
-     */
-    case NORMAL = 1;
-
-    /**
-     * 冻结
-     */
-    case FROZEN = 2;
-
-    /**
-     * 禁用
-     */
-    case DISABLED = 3;
-
-    /**
-     * 获取所有状态
-     */
-    public static function getAll(): array
-    {
-        return [
-            self::NORMAL->value => '正常',
-            self::FROZEN->value => '冻结',
-            self::DISABLED->value => '禁用'
-        ];
-    }
-
-    /**
-     * 获取状态名称
-     */
-    public static function getName(int $status): string
-    {
-        return self::getAll()[$status] ?? '未知';
-    }
-}