Quellcode durchsuchen

添加TransferOld模块和任务记录

notfff vor 6 Monaten
Ursprung
Commit
2dff763760

+ 215 - 0
AiWork/202506/15145300-Transfer模块设计文档创建.md

@@ -0,0 +1,215 @@
+# Transfer模块设计文档创建
+
+> 任务时间: 2025-06-15 14:53  
+> 任务类型: 模块设计  
+> 基于模块: TransferOld  
+
+## 任务概述
+
+基于 TransferOld 模块,设计并创建新的 Transfer 模块的完整设计文档体系。新模块采用现代化架构设计,遵循用户偏好的代码规范和命名约定。
+
+## 任务执行过程
+
+### 1. 信息收集阶段
+- 获取当前时间:2025-06-15 14:53
+- 分析 TransferOld 模块结构和功能
+- 查看模块目录结构、枚举类型、数据模型
+- 了解业务逻辑和验证机制
+- 加载用户记忆习惯和偏好设置
+
+### 2. 设计分析阶段
+**TransferOld 模块核心组件分析:**
+- **枚举类型**: TStatus(订单状态)、TType(订单类型)
+- **数据模型**: TransferApp(应用配置)、TransferOrder(订单信息)
+- **业务逻辑**: App.php、AutoCall.php、AutoCallOut.php、Info.php、OutBudan.php
+- **验证系统**: INCreate、OutCreate验证类,多个Validator验证器
+- **数据仓库**: App、Order仓库类
+
+**设计改进点:**
+- 采用现代化分层架构(Service/Logic/Handler)
+- 使用DTO对象进行数据传输
+- 独立的Cast转换器
+- 完善的文档体系
+- 遵循用户偏好的命名规范
+
+### 3. 文档创建阶段
+
+#### 3.1 模块设计文档 (README.md)
+**内容包含:**
+- 模块概述和主要功能
+- 设计原则和技术要求
+- 完整的目录结构设计
+- 核心组件设计说明
+- 数据库表结构预览
+- 业务流程设计
+- 接口设计概述
+- 开发计划安排
+
+**特色设计:**
+- 基于TransferOld的成熟业务逻辑
+- 采用Service/Logic/Handler分层架构
+- 使用枚举避免魔法数字
+- 完善的验证和错误处理机制
+
+#### 3.2 API接口文档 (API.md)
+**接口分类:**
+- **用户端接口**: 转出订单创建、订单状态查询、应用列表获取
+- **外部应用接口**: 转入订单创建、订单状态查询、回调通知
+- **管理端接口**: 订单列表、重试处理、手动补单
+
+**文档特点:**
+- 详细的请求参数和响应格式
+- 完整的错误码说明
+- 签名验证机制说明
+- 接口限流和安全措施
+
+#### 3.3 数据库设计文档 (DATABASE.md)
+**表结构设计:**
+- **kku_transfer_apps**: 划转应用配置表
+- **kku_transfer_orders**: 划转订单表
+
+**设计特点:**
+- 使用DECIMAL(30,10)存储金额,支持10位小数精度
+- 完善的索引和外键约束设计
+- 枚举值定义和说明
+- 数据初始化和维护策略
+
+#### 3.4 开发进度文档 (DEV.md)
+**开发阶段规划:**
+1. **基础架构搭建** (2天)
+2. **核心业务逻辑** (3天)
+3. **验证和处理器** (3天)
+4. **自动化任务** (2天)
+5. **后台管理** (2天)
+6. **测试和优化** (2天)
+
+**质量标准:**
+- 代码覆盖率 > 80%
+- 订单创建响应时间 < 500ms
+- 支持并发处理 > 100 TPS
+
+### 4. 文档完善阶段
+- 创建自动生成声明文档 (README_AUTO.md)
+- 添加文档目录说明
+- 设置文档更新时间和版本信息
+
+## 创建的文件列表
+
+```
+app/Module/Transfer/Docs/
+├── README.md           # 模块设计文档 (主文档)
+├── API.md              # API接口文档
+├── DATABASE.md         # 数据库设计文档
+├── DEV.md              # 开发进度文档
+└── README_AUTO.md      # 自动生成声明文档
+```
+
+## 设计亮点
+
+### 1. 现代化架构设计
+- **分层架构**: Service(对外接口) → Logic(业务逻辑) → Model(数据模型)
+- **DTO模式**: 使用数据传输对象,避免直接暴露Model
+- **Handler模式**: 统一的请求处理器,先验证再执行
+- **Task模式**: 独立的自动化任务处理
+
+### 2. 遵循用户偏好
+- **中文注释**: 所有代码和文档使用中文注释
+- **命名规范**: 类名以功能结尾,遵循PSR-4标准
+- **枚举使用**: 避免魔法数字,使用PHP enum语法
+- **模型设计**: 继承UCore\ModelCore,添加field注释块
+- **验证机制**: 使用Validation/Validator模式
+
+### 3. 完善的文档体系
+- **设计文档**: 完整的模块设计说明
+- **API文档**: 详细的接口规范和示例
+- **数据库文档**: 完整的表结构和字段说明
+- **开发文档**: 详细的开发计划和进度跟踪
+
+### 4. 业务逻辑继承
+- 基于TransferOld模块的成熟业务逻辑
+- 保持核心功能不变,优化架构设计
+- 支持资金转入转出、订单管理、自动化处理
+- 完善的状态流转和回调机制
+
+## 技术特点
+
+### 1. 数据库设计
+- 使用DECIMAL(30,10)精确存储金额
+- 完善的索引策略提升查询性能
+- 外键约束保证数据完整性
+- 支持软删除和时间戳
+
+### 2. 安全机制
+- 签名验证防止数据篡改
+- 接口限流防止恶意调用
+- 权限控制保护敏感操作
+- 完整的日志记录
+
+### 3. 性能优化
+- 异步处理提升响应速度
+- 队列任务处理大量订单
+- 缓存策略减少数据库压力
+- 批量操作优化性能
+
+## 后续开发建议
+
+### 1. 开发顺序
+1. 先创建基础架构(枚举、模型、数据库)
+2. 再实现核心业务逻辑(Service、Logic)
+3. 然后开发验证和处理器
+4. 最后完善自动化任务和后台管理
+
+### 2. 测试策略
+- 单元测试覆盖核心业务逻辑
+- 集成测试验证完整流程
+- 压力测试确保性能指标
+- 安全测试验证防护机制
+
+### 3. 部署注意事项
+- 数据库表创建和索引优化
+- 定时任务配置和监控
+- 日志轮转和存储策略
+- 监控告警和故障处理
+
+## 任务成果
+
+### 1. 文档完整性
+- ✅ 模块设计文档完整
+- ✅ API接口文档详细
+- ✅ 数据库设计规范
+- ✅ 开发进度清晰
+
+### 2. 设计质量
+- ✅ 架构设计现代化
+- ✅ 遵循用户偏好
+- ✅ 业务逻辑完整
+- ✅ 技术方案可行
+
+### 3. 可执行性
+- ✅ 开发计划详细
+- ✅ 技术要求明确
+- ✅ 质量标准清晰
+- ✅ 风险评估完整
+
+## Git提交记录
+
+```bash
+git add app/Module/Transfer/
+git commit -m "创建Transfer模块设计文档
+
+- 基于TransferOld模块重新设计Transfer模块
+- 创建完整的设计文档体系
+- 包含模块概述、API接口、数据库设计和开发进度文档
+- 采用现代化架构设计,遵循用户偏好的代码规范
+- 支持资金转入转出、订单管理、自动化处理等功能"
+```
+
+## 总结
+
+成功基于 TransferOld 模块创建了新的 Transfer 模块完整设计文档体系。新设计采用现代化架构,遵循用户偏好的代码规范,保持了原有业务逻辑的完整性,同时提升了代码质量和可维护性。文档体系完整,为后续开发提供了清晰的指导。
+
+---
+
+> 任务完成时间: 2025-06-15 14:53  
+> 文档创建: 5个文件  
+> 代码提交: 已推送到远程仓库

+ 12 - 9
AiWork/WORK.md

@@ -9,6 +9,17 @@
 
 ## 已完成任务(保留最新的10条,多余的删除)
 
+**2025-06-15 14:53** - Transfer模块设计文档创建 - 基于TransferOld模块设计新的Transfer模块
+- 任务:参考TransferOld模块,设计新的Transfer模块,先输出设计文档到Transfer模块Docs下
+- 分析:深入分析TransferOld模块结构,包含枚举类型、数据模型、业务逻辑、验证系统等核心组件
+- 设计:采用现代化分层架构(Service/Logic/Handler),遵循用户偏好的代码规范和命名约定
+- 文档:创建完整的设计文档体系,包含README.md、API.md、DATABASE.md、DEV.md四个核心文档
+- 架构:Service层对外接口、Logic层业务逻辑、Handler层请求处理、Task层自动化任务、Repository层数据访问
+- 数据库:设计kku_transfer_apps和kku_transfer_orders两个核心表,使用DECIMAL(30,10)存储金额
+- 功能:支持资金转入转出、订单管理、自动化处理、状态跟踪、回调机制、补单功能等完整业务流程
+- 规划:详细的6阶段开发计划,预计14天完成,包含基础架构、业务逻辑、验证处理、自动化任务、后台管理、测试优化
+- 文件:./AiWork/202506/15145300-Transfer模块设计文档创建.md
+
 **2025-06-15 12:26** - 修复ThirdParty模块路由注册问题 - 参考物品模块修复路由注册方式
 - 任务:修复ThirdParty模块的路由注册问题,参考物品模块的实现方式,统一使用路由注解
 - 问题:ThirdParty模块控制器缺少路由注解,使用传统路由文件注册,ServiceProvider中存在不存在的命令类引用
@@ -177,15 +188,7 @@
 - 架构:建立完整的事件驱动架构,支持队列异步处理、多渠道通知、智能告警冷却等高级功能
 - 文件:./AiWork/202506/141309-ThirdParty模块开发完善.md
 
-**2025-06-13 21:39** - 创建ThirdParty模块 - 专门处理接入第三方服务的需求
-- 任务:创建ThirdParty模块,专门处理接入第三方服务的需求,与OpenAPI模块形成互补
-- 架构:完整的模块化设计,包含5个枚举、5个模型、核心服务、服务提供者等18个核心文件
-- 功能:服务配置管理、认证凭证管理、服务状态监控、调用日志记录、错误处理重试、配额限流管理
-- 枚举:SERVICE_TYPE(12种服务类型)、AUTH_TYPE(8种认证方式)、SERVICE_STATUS(7种状态)、LOG_LEVEL(5个级别)、QUOTA_TYPE(7种配额类型)
-- 数据库:5个表(services、credentials、logs、quotas、monitors),完整索引设计和10条默认服务数据
-- 特点:与OpenAPI互补(OpenAPI提供API给别人,ThirdParty使用别人的API)、支持12种服务类型、8种认证方式、安全加密存储、完整监控告警
-- 集成:更新模块目录文档,模块总数33→34个,基础服务模块9→10个,已完成模块27→28个
-- 文件:./AiWork/202506/132139-创建ThirdParty模块.md
+
 
 
 

+ 377 - 0
app/Module/Transfer/Docs/DEV.md

@@ -0,0 +1,377 @@
+# Transfer 模块开发进度
+
+> 更新时间: 2025-06-15 14:53  
+> 模块: Transfer  
+> 基于: TransferOld  
+
+## 开发概述
+
+Transfer 模块是基于 TransferOld 模块重新设计的现代化资金划转系统。采用分层架构设计,遵循用户偏好的代码规范,提供完整的资金转入转出功能。
+
+## 开发阶段规划
+
+### 🔄 第一阶段:基础架构搭建
+**目标**: 建立模块基础架构和核心组件  
+**预计工期**: 2天  
+
+#### 任务清单
+- [ ] **目录结构创建**
+  - [ ] 创建完整的目录结构(参考物品模块)
+  - [ ] AdminControllers/ - 后台管理控制器和辅助类
+  - [ ] Casts/ - 模型转换器
+  - [ ] Commands/ - 命令行工具
+  - [ ] Config/ - 配置文件
+
+  - [ ] Databases/ - 数据库相关文件
+  - [ ] Dtos/ - 数据传输对象
+  - [ ] Enums/ - 枚举类
+  - [ ] Events/ - 事件类
+  - [ ] Exceptions/ - 异常类
+
+  - [ ] Jobs/ - 队列任务
+  - [ ] Listeners/ - 事件监听器
+  - [ ] Logics/ - 逻辑层
+  - [ ] Models/ - 数据模型
+  - [ ] Providers/ - 服务提供者
+  - [ ] Repositories/ - 数据仓库
+  - [ ] Routes/ - 路由文件
+  - [ ] Services/ - 服务层
+  - [ ] Tests/ - 测试文件
+  - [ ] Validations/ - 验证类
+  - [ ] Validators/ - 验证器
+  - [ ] 添加各目录的 README.md 说明文件
+  - [ ] 设置命名空间和自动加载
+
+- [ ] **枚举类型定义**
+  - [ ] TransferStatus.php - 订单状态枚举
+  - [ ] TransferType.php - 订单类型枚举
+  - [ ] 遵循 PSR-4 命名标准
+  - [ ] 使用 PHP enum 语法
+
+- [ ] **数据模型创建**
+  - [ ] TransferApp.php - 划转应用模型
+  - [ ] TransferOrder.php - 划转订单模型
+  - [ ] 继承自 \UCore\ModelCore
+  - [ ] 添加 field start/end 注释块
+  - [ ] 定义模型关联关系
+
+- [ ] **数据库表设计**
+  - [ ] 创建 kku_transfer_apps 表
+  - [ ] 创建 kku_transfer_orders 表
+  - [ ] 设置索引和外键约束
+  - [ ] 初始化示例数据
+
+#### 完成标准
+- 所有基础文件创建完成
+- 数据库表结构正确
+- 模型类可正常使用
+- 枚举类型定义完整
+
+---
+
+### 🔄 第二阶段:核心业务逻辑
+**目标**: 实现核心业务逻辑和服务层  
+**预计工期**: 3天  
+
+#### 任务清单
+- [ ] **服务层实现**
+  - [ ] TransferService.php - 对外服务接口
+  - [ ] ExternalApiService.php - 外部API服务
+  - [ ] StatisticsService.php - 统计服务
+  - [ ] 提供静态方法供其他模块调用
+  - [ ] 返回 DTO 对象而非 Model
+  - [ ] 实现模块间交互接口
+
+- [ ] **逻辑层开发**
+  - [ ] TransferLogic.php - 核心业务逻辑
+  - [ ] OrderLogic.php - 订单处理逻辑
+  - [ ] CallbackLogic.php - 回调处理逻辑
+  - [ ] ExternalApiLogic.php - 外部API调用逻辑
+  - [ ] 不在逻辑层开启事务
+  - [ ] 使用 Fund 模块进行资金操作
+
+- [ ] **DTO 对象创建**
+  - [ ] TransferAppDto.php - 应用数据传输对象
+  - [ ] TransferOrderDto.php - 订单数据传输对象
+  - [ ] CallbackResultDto.php - 回调结果DTO
+  - [ ] 定义完整的属性和类型
+
+- [ ] **Cast 转换器**
+  - [ ] TransferAppCast.php - 应用转换器
+  - [ ] TransferOrderCast.php - 订单转换器
+  - [ ] CallbackDataCast.php - 回调数据转换器
+  - [ ] 独立的 Cast 类,不共用
+
+- [ ] **事件和监听器**
+  - [ ] TransferOrderCreated.php - 订单创建事件
+  - [ ] TransferOrderCompleted.php - 订单完成事件
+  - [ ] TransferCallbackReceived.php - 回调接收事件
+  - [ ] TransferOrderListener.php - 订单事件监听器
+  - [ ] TransferCallbackListener.php - 回调事件监听器
+
+- [ ] **异常类创建**
+  - [ ] TransferException.php - 划转异常基类
+  - [ ] InsufficientBalanceException.php - 余额不足异常
+  - [ ] ExternalApiException.php - 外部API异常
+
+#### 完成标准
+- 服务层接口完整
+- 业务逻辑正确实现
+- DTO 对象定义完整
+- Cast 转换器正常工作
+
+---
+
+### 🔄 第三阶段:验证和处理器
+**目标**: 实现验证系统和请求处理器  
+**预计工期**: 3天  
+
+#### 任务清单
+- [ ] **验证类开发**
+  - [ ] TransferInValidation.php - 转入验证
+  - [ ] TransferOutValidation.php - 转出验证
+  - [ ] 参考 GodActivationValidation 模式
+  - [ ] 禁止动态属性赋值
+
+- [ ] **验证器实现**
+  - [ ] TransferAppValidator.php - 应用验证器
+  - [ ] BusinessIdValidator.php - 业务ID验证器
+  - [ ] TransferOpenValidator.php - 划转开放验证器
+  - [ ] 使用 addError 方法处理错误
+  - [ ] 字段Key使用 $arg 参数传入
+
+- [ ] **OpenAPI模块集成**
+  - [ ] 在OpenAPI模块中创建Transfer相关Handler
+  - [ ] TransferInHandler.php - 转入处理器
+  - [ ] TransferOutHandler.php - 转出处理器
+  - [ ] TransferQueryHandler.php - 查询处理器
+  - [ ] 在SCOPE_TYPE枚举中添加Transfer权限
+  - [ ] 注册Handler到OpenAPI路由系统
+  - [ ] 配置权限和认证机制
+
+#### 完成标准
+- 验证系统完整
+- 处理器逻辑正确
+- 错误处理完善
+- 响应格式统一
+
+---
+
+### 🔄 第四阶段:自动化任务
+**目标**: 实现自动化处理和定时任务  
+**预计工期**: 2天  
+
+#### 任务清单
+- [ ] **队列任务开发**
+  - [ ] ProcessTransferOrderJob.php - 处理订单任务
+  - [ ] SendCallbackJob.php - 发送回调任务
+  - [ ] RetryFailedOrderJob.php - 重试失败订单任务
+  - [ ] 实现队列任务支持
+
+- [ ] **命令行工具**
+  - [ ] TransferProcessCommand.php - 订单处理命令
+  - [ ] TransferCallbackCommand.php - 回调处理命令
+  - [ ] TransferStatsCommand.php - 统计命令
+  - [ ] TransferCleanCommand.php - 数据清理命令
+
+- [ ] **定时任务配置**
+  - [ ] 创建 Console Command
+  - [ ] 配置任务调度
+  - [ ] 设置执行频率
+  - [ ] 添加错误处理
+
+- [ ] **回调机制**
+  - [ ] 实现回调发送
+  - [ ] 处理回调响应
+  - [ ] 支持重试机制
+  - [ ] 记录回调日志
+
+#### 完成标准
+- 自动化任务正常运行
+- 定时任务配置正确
+- 回调机制完善
+- 错误处理完整
+
+---
+
+### 🔄 第五阶段:后台管理
+**目标**: 实现后台管理功能  
+**预计工期**: 2天  
+
+#### 任务清单
+- [ ] **数据仓库层**
+  - [ ] TransferAppRepository.php - 应用仓库
+  - [ ] TransferOrderRepository.php - 订单仓库
+  - [ ] 参考 Fund 模块 Repository 实现
+  - [ ] 仅供后台控制器使用
+
+- [ ] **后台控制器**
+  - [ ] TransferAppController.php - 应用管理
+  - [ ] TransferOrderController.php - 订单管理
+  - [ ] 继承自 UCore\DcatAdmin\AdminController
+  - [ ] 使用 Grid/Show/Form 的 make 方法
+  - [ ] 使用 Helper 辅助类
+  - [ ] 不提供API接口,仅后台管理界面
+
+- [ ] **后台辅助类**
+  - [ ] TransferAppHelper.php - 应用管理辅助类
+  - [ ] TransferOrderHelper.php - 订单管理辅助类
+  - [ ] FilterHelper.php - 筛选辅助类
+  - [ ] GridHelper.php - 表格辅助类
+  - [ ] ShowHelper.php - 详情辅助类
+  - [ ] FormHelper.php - 表单辅助类
+
+- [ ] **后台工具**
+  - [ ] RetryOrderTool.php - 重试订单工具
+  - [ ] ManualCompleteTool.php - 手动补单工具
+  - [ ] ExportOrderTool.php - 订单导出工具
+
+- [ ] **后台界面**
+  - [ ] 应用配置管理界面
+  - [ ] 订单列表和详情界面
+  - [ ] 订单重试和补单功能
+  - [ ] 监控统计界面
+  - [ ] 添加路由注释
+  - [ ] 加入后台菜单
+
+- [ ] **路由配置**
+  - [ ] admin.php - 后台路由
+  - [ ] OpenAPI模块中配置外部API路由
+
+#### 完成标准
+- 后台管理界面完整
+- 数据操作正常
+- 权限控制正确
+- 菜单配置完成
+
+---
+
+### 🔄 第六阶段:测试和优化
+**目标**: 完善测试和性能优化  
+**预计工期**: 2天  
+
+#### 任务清单
+- [ ] **单元测试**
+  - [ ] TransferServiceTest.php - 服务层测试
+  - [ ] TransferLogicTest.php - 逻辑层测试
+  - [ ] TransferValidationTest.php - 验证测试
+  - [ ] 使用 phpunit 运行测试
+
+- [ ] **功能测试**
+  - [ ] TransferApiTest.php - API测试
+  - [ ] TransferFlowTest.php - 流程测试
+  - [ ] 测试完整业务流程
+  - [ ] 测试异常情况处理
+  - [ ] 测试并发场景
+  - [ ] 验证数据一致性
+
+- [ ] **配置和服务提供者**
+  - [ ] transfer.php - 模块配置文件
+  - [ ] TransferServiceProvider.php - 服务提供者
+  - [ ] 注册服务绑定和事件监听
+
+- [ ] **性能优化**
+  - [ ] 数据库查询优化
+  - [ ] 缓存策略实现
+  - [ ] 批量操作优化
+  - [ ] 内存使用优化
+
+- [ ] **文档完善**
+  - [ ] 更新 API 文档
+  - [ ] 完善使用说明
+  - [ ] 添加故障排除指南
+  - [ ] 更新开发进度
+
+#### 完成标准
+- 测试覆盖率达标
+- 性能指标合格
+- 文档内容完整
+- 代码质量达标
+
+---
+
+## 技术要求
+
+### 代码规范
+- [x] 使用中文注释
+- [x] 遵循 PSR-4 命名标准
+- [x] 避免魔法数字,使用枚举
+- [x] 类名以功能结尾 (Validator, Repository)
+- [x] 功能拆分为独立简单静态类
+
+### 架构设计
+- [x] 模型继承自 \UCore\ModelCore
+- [x] 服务层返回 DTO 对象
+- [x] 逻辑层不开启事务
+- [x] 模块间通过 Service 层交互
+- [x] 使用独立的 Cast 类
+
+### 数据库设计
+- [x] 表前缀 kku_transfer_
+- [x] 使用 DECIMAL(30,10) 存储金额
+- [x] 不使用迁移类,直接提供 SQL
+- [x] 设置合适的索引和约束
+
+## 风险评估
+
+### 高风险项
+- **资金安全**: 涉及资金操作,需确保事务完整性
+- **数据一致性**: 多表操作需保证数据一致
+- **外部API**: 依赖外部接口,需处理网络异常
+
+### 中风险项
+- **性能问题**: 大量订单处理可能影响性能
+- **并发处理**: 同时处理多个订单需考虑锁机制
+- **回调重试**: 回调失败重试机制需完善
+
+### 低风险项
+- **界面展示**: 后台管理界面相对简单
+- **日志记录**: 标准的日志记录功能
+- **配置管理**: 应用配置管理功能
+
+## 质量标准
+
+### 代码质量
+- 代码覆盖率 > 80%
+- 无严重安全漏洞
+- 符合 PSR 标准
+- 通过静态分析
+
+### 性能指标
+- 订单创建响应时间 < 500ms
+- 查询接口响应时间 < 200ms
+- 支持并发处理 > 100 TPS
+- 内存使用 < 128MB
+
+### 功能完整性
+- 所有 API 接口正常
+- 业务流程完整
+- 异常处理完善
+- 日志记录完整
+
+---
+
+## 当前状态
+
+**阶段**: 📋 设计阶段  
+**进度**: 0% (0/6 阶段完成)  
+**状态**: 设计文档已完成,等待开发启动  
+
+### 已完成项目
+- [x] 需求分析和设计
+- [x] 技术方案确定
+- [x] 文档结构设计
+- [x] 数据库表设计
+- [x] API 接口设计
+
+### 下一步计划
+1. 创建目录结构
+2. 定义枚举类型
+3. 创建数据模型
+4. 建立数据库表
+
+---
+
+> 文档更新时间: 2025-06-15 14:53  
+> 负责人: AI Assistant  
+> 预计完成时间: 2025-06-29

+ 30 - 0
app/Module/TransferOld/App.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Module\Transfer;
+
+use App\Module\Transfer\Model\TransferApp;
+
+class App
+{
+
+    static public function getByOid2($id):TransferApp
+    {
+        $model = TransferApp::query()->where('out_id2',$id)->first();
+
+        return $model;
+    }
+
+    /**
+     * 获取划转配置信息
+     * @param int $trapp_id
+     * @return TransferApp
+     */
+    static public function get($trapp_id):TransferApp
+    {
+        $model = TransferApp::find($trapp_id);
+
+        return $model;
+
+    }
+
+}

+ 173 - 0
app/Module/TransferOld/AutoCall.php

@@ -0,0 +1,173 @@
+<?php
+
+namespace App\Module\Transfer;
+
+use App\Jobs\TransferOrderInCall;
+use App\Jobs\TransferOrderInCallback;
+use App\Module\Outside\Http;
+use App\Module\Transfer\Enums\TStatus;
+use App\Module\Transfer\Enums\TType;
+use App\Module\Transfer\Model\TransferOrder;
+use Carbon\Carbon;
+use Dcore\Exception\LogicException;
+use Dcore\Helper\Logger;
+use Fund\Account;
+use Fund\Fund;
+use Illuminate\Support\Facades\DB;
+
+class AutoCall
+{
+
+
+    /**
+     * 入包 的 处理
+     *
+     * @return void
+     */
+    static public function in_call()
+    {
+        $models = TransferOrder::query()->where([
+                                                    'status' => TStatus::CREATED,
+                                                    'type'   => TType::In
+                                                ])->get();
+        foreach ($models as $model) {
+
+            TransferOrderInCall::dispatch($model->id)->delay(2);
+        }
+    }
+
+    static public function in_call1(TransferOrder $model)
+    {
+        $run = false;
+        DB::beginTransaction();
+        try {
+            $model = TransferOrder::query()->lockForUpdate()->find($model->id);
+//                dump($model->status);
+            if ($model->status === TStatus::CREATED) {
+                $run = self::in_call2($model);
+            }
+            DB::commit();
+
+        } catch (\Exception $e) {
+            DB::rollBack();
+            dump($e);
+            Logger::exception('', $e);
+        }
+        if ($run) {
+            TransferOrderInCallback::dispatch($model->id)->delay(1);
+        }
+    }
+
+    /**
+     * 入包的处理
+     *
+     * @param TransferOrder $order
+     * @return void
+     */
+    static private function in_call2(TransferOrder $order)
+    {
+//        dump($order);
+        $user_id  = $order->user_id;
+        $out_id   = $order->out_id;
+        $trapp_id = $order->trapp_id;
+        $app      = App::get($trapp_id);
+        $fundE    = \Fund\Enums\Fund::from($app->fund_id);
+
+        $fund = new Fund($app->fund_in_uid, $app->fund_id);
+        $res  = $fund->trade($user_id, $fundE, $order->amount, 'Transfer', $order->id, '划转 - 转入');
+        if (is_string($res)) {
+            throw new \Exception($res);
+        }
+        $order->status = TStatus::CALL;
+        if (!$order->save()) {
+            throw new \Exception('保存失败');
+        }
+
+        return true;
+    }
+
+    static public function in_callback()
+    {
+
+        $models = TransferOrder::query()
+            ->where([
+                        'status' => TStatus::CALL,
+                        'type'   => TType::In
+                    ])
+            ->where('created_at', '>', Carbon::now()->subMinutes(2))
+            ->limit(10)
+            ->orderBy('id', 'desc')
+            ->get();
+        foreach ($models as $model) {
+            TransferOrderInCallback::dispatch($model->id)->delay(5);
+        }
+    }
+
+    static public function in_callback_all()
+    {
+        $models = TransferOrder::query()
+            ->where([
+                        'status' => TStatus::CALL,
+                        'type'   => TType::In
+                    ])
+            ->orderBy('id', 'desc')
+            ->get();
+        foreach ($models as $model) {
+            TransferOrderInCallback::dispatch($model->id)->delay(5);
+        }
+    }
+
+    /**
+     * 入包,回调处理
+     *
+     * @param $model
+     * @return void
+     */
+    static public function in_callback1(TransferOrder $model)
+    {
+
+        if ($model->type === TType::In) {
+            //                dump($model->status);
+            if ($model->status === TStatus::CALL) {
+                self::in_callback2($model);
+            }
+        }
+
+    }
+
+    /**
+     * 回调处理
+     *
+     * @param TransferOrder $order
+     * @return true
+     */
+    static private function in_callback2(TransferOrder $order)
+    {
+//        dump($order);
+//        $user_id = $order->user_id;
+        $out_id   = $order->out_id;
+        $trapp_id = $order->trapp_id;
+        $app      = App::get($trapp_id);
+
+        $http = Http::getById($app->out_id);
+        $res  = $http->postJson($app->order_callback, [
+            'business_id' => $order->out_order_id,
+            'wallet_id'   => $order->id,
+            'status'      => $order->status->value(),
+        ]);
+        if ($res['code'] != 0) {
+            throw new \Exception('回调失败');
+        }
+
+//        dd($res);
+        $order->status = TStatus::CALLBACK;
+        if (!$order->save()) {
+            throw new \Exception('保存失败');
+        }
+
+        return true;
+
+
+    }
+
+}

+ 110 - 0
app/Module/TransferOld/AutoCallOut.php

@@ -0,0 +1,110 @@
+<?php
+
+namespace App\Module\Transfer;
+
+use App\Jobs\TransferOrderOutCallback;
+use App\Module\Outside\Http;
+use App\Module\Transfer\Enums\TStatus;
+use App\Module\Transfer\Enums\TType;
+use App\Module\Transfer\Model\TransferOrder;
+use Carbon\Carbon;
+use Dcore\Exception\LogicException;
+use Dcore\Helper\Logger;
+use Fund\Account;
+use Fund\Fund;
+use Illuminate\Support\Facades\DB;
+
+class AutoCallOut
+{
+
+
+    /**
+     * 出包 的 处理
+     *
+     * @return void
+     */
+    static public function out_call()
+    {
+        $models = TransferOrder::query()
+            ->where([
+                        'status' => TStatus::CREATED,
+                        'type'   => TType::Out
+                    ])
+            ->where('created_at', '>', Carbon::now()->subMinutes(2))
+            ->orderBy('id', 'desc')->limit(10)->get();
+        foreach ($models as $model) {
+            TransferOrderOutCallback::dispatch($model->id)->delay(5);
+        }
+    }
+
+    static public function out_call_all()
+    {
+        $models = TransferOrder::query()
+            ->where([
+                        'status' => TStatus::CREATED,
+                        'type'   => TType::Out
+                    ])
+            ->orderBy('id', 'desc')->get();
+        foreach ($models as $model) {
+            TransferOrderOutCallback::dispatch($model->id)->delay(5);
+        }
+    }
+
+    /**
+     * 出包 的 处理
+     * @param TransferOrder $model
+     * @return void
+     * @throws \Exception
+     */
+    static public function out_call1(TransferOrder $model)
+    {
+        if($model->type === TType::Out){
+            if ($model->status === TStatus::CREATED) {
+                self::out_call2($model);
+            }
+        }
+    }
+
+    /**
+     * 出包 的处理
+     *
+     * @param TransferOrder $order
+     * @return void
+     */
+    static private function out_call2(TransferOrder $order)
+    {
+//        dump($order);
+        $user_id  = $order->user_id;
+        $trapp_id = $order->trapp_id;
+        $app      = App::get($trapp_id);
+        // 出包,进行下单
+        $app = App::get($trapp_id);
+
+        $http = Http::getById($app->out_id);
+        $data = [
+            'wallet_id'      => $order->id,
+            'wallet_user_id' => $order->user_id,
+            'amount'         => (int)$order->oamount,
+        ];
+        // index.php?s=/api/linkup.order/recharge
+        $res  = $http->postJson($app->order_out_create, $data);
+//        dd($res,$data);
+        if ($res['code'] != 0) {
+            Logger::error('out_call2',$res);
+            throw new \Exception('回调失败'.($res['message']??''));
+        }
+        $order->out_order_id = $res['data']['business_id'];
+        $order->ouser_id     = $res['data']['business_user_id'];
+
+
+        Logger::info('out_call2',$res);
+        $order->status = TStatus::CALL;
+        if (!$order->save()) {
+            throw new \Exception('保存失败');
+        }
+
+        return true;
+    }
+
+
+}

+ 1 - 0
app/Module/TransferOld/Entity/readme.md

@@ -0,0 +1 @@
+# entity 实体

+ 38 - 0
app/Module/TransferOld/Enums/TStatus.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Module\Transfer\Enums;
+
+use Dcore\Enum\EnumCore;
+use Dcore\Enum\EnumExpression;
+use Dcore\Enum\EnumToInt;
+
+enum TStatus: int
+{
+
+    use EnumToInt,EnumCore,EnumExpression;
+
+    /**
+     * 创建
+     */
+    case CREATED = 1;
+
+    /**
+     * 已处理,等待回调
+     */
+    case CALL = 20;
+
+
+
+    /**
+     * 回调成功
+     */
+    case CALLBACK = 30;
+
+
+
+    /**
+     * 已完成
+     */
+    case END = 100;
+
+}

+ 25 - 0
app/Module/TransferOld/Enums/TType.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Module\Transfer\Enums;
+
+use Dcore\Enum\EnumCore;
+use Dcore\Enum\EnumExpression;
+use Dcore\Enum\EnumToInt;
+
+enum TType:int
+{
+    use EnumToInt,EnumCore,EnumExpression;
+
+    /**
+     * 转入
+     */
+    case In = 1;
+
+
+    /**
+     * 转出
+     */
+    case Out = 2;
+
+
+}

+ 1 - 0
app/Module/TransferOld/Enums/readme.md

@@ -0,0 +1 @@
+# 枚举

+ 30 - 0
app/Module/TransferOld/Info.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Module\Transfer;
+
+use App\Module\Transfer\Model\TransferOrder;
+
+class Info
+{
+
+
+    /**
+     * 订单信息
+     * @param TransferOrder $order
+     * @return array
+     */
+    public function order_info(TransferOrder $order)
+    {
+
+        return [
+            'business_id'      => $order->out_order_id,
+            'business_amount'  => $order->oamount,
+            'business_user_id' => $order->ouser_id,
+            'wallet_id'        => $order->id,
+            'wallet_amount'    => $order->amount,
+            'wallet_status'    => $order->status,
+            'wallet_type'      => $order->type,
+        ];
+    }
+
+}

+ 35 - 0
app/Module/TransferOld/Model/TransferApp.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Module\Transfer\Model;
+
+use App\Models\ModelCore;
+
+
+/**
+ * 划转APP
+ * field start 
+ * @property   int  $id  
+ * @property   string  $keyname  标识
+ * @property   string  $title  应用名字
+ * @property   string  $desc  描述
+ * @property   int  $out_id  对应 外部APP
+ * @property   int  $out_id2  对应 外部APP - 开放
+ * @property   int  $crrency_id  对应 货币
+ * @property   int  $fund_id  对应 账户
+ * @property   int  $fund_to_uid  对应 划转账户uid
+ * @property   int  $fund_in_uid  对应 划转账户uid
+ * @property   int  $rate  比例 钱包 : 业务
+ * @property   string  $order_callback  结果通知API
+ * @property   string  $order_in_info  入金 - 交易查询
+ * @property   string  $order_out_create  出单创建
+ * @property   string  $order_out_info  出金 - 交易查询
+ * @property   \Carbon\Carbon  $created_at  
+ * @property   \Carbon\Carbon  $updated_at  
+ * @property   \Carbon\Carbon  $deleted_at  删除时间
+ * field end
+ *
+ */
+class TransferApp extends ModelCore
+{
+
+}

+ 40 - 0
app/Module/TransferOld/Model/TransferOrder.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Module\Transfer\Model;
+
+use App\Models\ModelCore;
+use App\Module\Transfer\Enums\TStatus;
+use App\Module\Transfer\Enums\TType;
+
+
+/**
+ * 划转订单
+ *
+ * field start 
+ * @property   int  $id  
+ * @property   int  $trapp_id  划转 app_id
+ * @property   int  $out_id  对应 外部APP
+ * @property   string  $out_order_id  外部 订单ID
+ * @property   int  $crrency_id  对应 货币
+ * @property   int  $fund_id  对应 账户
+ * @property   string  $ouser_id  外部 - 用户ID
+ * @property   int  $user_id  用户ID
+ * @property   int  $status  状态
+ * @property   int  $type  类型,方向
+ * @property   float  $oamount  外部钱数
+ * @property   int  $amount  我们钱数
+ * @property   \Carbon\Carbon  $created_at  
+ * @property   \Carbon\Carbon  $updated_at  
+ * @property   \Carbon\Carbon  $deleted_at  删除时间
+ * field end
+ *
+ */
+class TransferOrder extends ModelCore
+{
+
+    protected $casts=[
+        'status'=>TStatus::class,
+        'type'=>TType::class
+    ];
+
+}

+ 1 - 0
app/Module/TransferOld/Model/readme.md

@@ -0,0 +1 @@
+# 数据库模型

+ 64 - 0
app/Module/TransferOld/OutBudan.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace App\Module\Transfer;
+
+use App\Module\Outside\Http;
+use App\Module\Transfer\Enums\TStatus;
+use App\Module\Transfer\Model\TransferOrder;
+use Dcore\Helper\Logger;
+
+class OutBudan
+{
+
+
+    /**
+     * 出包 的处理
+     *
+     * @param TransferOrder $order
+     * @return void
+     */
+    static public function  run(TransferOrder $order,bool $validation )
+    {
+//        dump($order);
+        $user_id  = $order->user_id;
+        $trapp_id = $order->trapp_id;
+        $app      = App::get($trapp_id);
+        // 出包,进行下单
+        $app = App::get($trapp_id);
+
+        $http = Http::getById($app->out_id);
+        $data = [
+            'wallet_id'      => $order->id
+        ];
+        $res  = $http->postJson($app->order_out_info, $data);
+//        dd($res,$data);
+        // "business_id":2010,"business_status":20,"business_amount":"1.000","wallet_id":29,"wallet_amount":"1.000"
+        Logger::info('out_call2-res',$res);
+        if ($res['code'] != 0) {
+            Logger::error('out_call2',$res);
+            throw new \Exception('回调失败');
+        }
+        if($validation){
+
+            if( $order->oamount != $res['data']['business_amount']){
+                return "业务订单 - 钱数不一致 ";
+            }
+            if( $order->out_order_id != $res['data']['business_id']){
+                return "业务订单ID不一致";
+            }
+            if( $order->id != $res['data']['wallet_id']){
+                return "订单ID - 不一致";
+            }
+        }
+
+        $order->out_order_id = $res['data']['business_id'];
+        $order->oamount= $res['data']['business_amount'];
+
+        $order->status = TStatus::CALL;
+        if (!$order->save()) {
+            throw new \Exception('保存失败');
+        }
+
+        return true;
+    }
+}

+ 12 - 0
app/Module/TransferOld/Repository/App.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Module\Transfer\Repository;
+
+use App\Admin\Core\Repositories\EloquentRepository;
+
+class App extends EloquentRepository
+{
+
+    protected $eloquentClass = \App\Module\Transfer\Model\TransferApp::class;
+
+}

+ 11 - 0
app/Module/TransferOld/Repository/Order.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Module\Transfer\Repository;
+
+use App\Admin\Core\Repositories\EloquentRepository;
+
+class Order extends EloquentRepository
+{
+    protected $eloquentClass= \App\Module\Transfer\Model\TransferOrder::class;
+
+}

+ 1 - 0
app/Module/TransferOld/Repository/readme.md

@@ -0,0 +1 @@
+# 仓库

+ 53 - 0
app/Module/TransferOld/Validation/INCreate.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Module\Transfer\Validation;
+
+use App\Module\App\Validation\ValidationCore;
+use App\Module\Outside\Validator\Ouid;
+use App\Module\Transfer\Model\TransferApp;
+use App\Module\Transfer\Validator\BusinessId;
+use App\Module\Transfer\Validator\OutApp;
+use App\Module\User\Validator\AuthPassword;
+use App\Module\User\Validator\Google2FA;
+use App\Module\User\Validator\UserIdInfo2;
+use Fund\Validator\UserFund1Check;
+
+class INCreate extends ValidationCore
+{
+
+    /**
+     * 用户ID
+     * @var int $user_id
+     */
+    public $user_id;
+
+
+    /**
+     * @var TransferApp $transferApp
+     */
+    public $transferApp;
+
+    public function rules($rules = []): array
+    {
+        $rules[]= [
+            'ouser_id,money,business_id,out_id','required'
+        ];
+
+        $rules[] = [
+            'ouser_id', new Ouid($this,['out_id','user_id']),
+            'msg' => '账户未绑定'
+        ];
+        $rules[] = [
+            'business_id', new BusinessId($this, [ 'out_id' ]),
+            'msg' => '重复的业务订单号'
+        ];
+        $rules[] = [
+            'out_id',new OutApp($this,['transferApp'])
+        ];
+
+
+        return parent::rules($rules);
+
+    }
+
+}

+ 85 - 0
app/Module/TransferOld/Validation/OutCreate.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Module\Transfer\Validation;
+
+use App\Module\App\Validation\ValidationCore;
+use App\Module\App\Validator\UserBind2Validator;
+use App\Module\App\Validator\UserBindValidator;
+use App\Module\Transfer\Model\TransferApp;
+use App\Module\Transfer\Validator\TrApp;
+use App\Module\Transfer\Validator\TrOpen;
+use App\Module\User\Model\UserInfo;
+use App\Module\User\Validation\SPasswordCheck;
+use App\Module\User\Validator\AuthPassword;
+use App\Module\User\Validator\Google2FA;
+use App\Module\User\Validator\UserIdInfo2;
+use Fund\Fund;
+use Fund\Validator\FundR1000Check;
+use Fund\Validator\UserFund1Check;
+
+class OutCreate extends ValidationCore
+{
+
+    protected string $name = 'transfer';
+
+    /**
+     * @var Fund
+     */
+    public $fund;
+
+    /**
+     * @var UserInfo
+     */
+    public $info;
+
+
+    /**
+     * @var TransferApp $transferApp
+     */
+    public $transferApp;
+
+    public function rules($rules = []): array
+    {
+        $rules[]= [
+            'user_id,amount,trapp_id','required'
+        ];
+
+        $rules[] = [
+            'amount','number',
+            'msg'=>'数额错误'
+        ];
+
+        $rules[] = [
+            'user_id', new UserIdInfo2($this),
+            'msg' => '账户错误'
+        ];
+        $rules[] = [
+            'user_id', new TrOpen($this),
+            'msg' => '划转功能关闭中.'
+        ];
+        $rules[] = [
+            'user_id', new UserBind2Validator($this,['trapp_id']),
+            'msg' => '账户未绑定过游戏'
+        ];
+        $rules[] = [
+            'amount', new FundR1000Check($this),
+            'msg' => '数额错误'
+        ];
+        $rules[] = [
+            'amount', new UserFund1Check($this, [ 'user_id' ,'fund']),
+            'msg' => '余额不足'
+        ];
+
+
+        $rules[] = [
+            'trapp_id',new TrApp($this,['transferApp'])
+        ];
+
+
+        $rules = SPasswordCheck::validationRules($rules,$this);
+
+        return parent::rules($rules);
+
+    }
+
+}

+ 1 - 0
app/Module/TransferOld/Validation/readme.md

@@ -0,0 +1 @@
+# 验证

+ 28 - 0
app/Module/TransferOld/Validator/BusinessId.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Module\Transfer\Validator;
+
+use App\Module\Transfer\Model\TransferOrder;
+use Dcore\Validator;
+
+/**
+ * 业务系统,业务ID
+ *
+ */
+class BusinessId extends Validator
+{
+
+
+    public function validate(mixed $value, array $data): bool
+    {
+        $out_field = $this->args[0]??"";
+        $out_id=$data[$out_field];
+        $old = TransferOrder::query()->where('out_id', $out_id)->where('out_order_id',$value)->first();
+        if($old){
+            return false;
+        }
+
+        return true;
+    }
+
+}

+ 22 - 0
app/Module/TransferOld/Validator/OutApp.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Module\Transfer\Validator;
+
+use App\Module\Transfer\Model\TransferApp;
+use Dcore\Validator;
+
+class OutApp extends Validator
+{
+
+    public function validate(mixed $value, array $data): bool
+    {
+        $field = $this->args[0]??"transferApp";
+        $app = TransferApp::query()->where('out_id2', $value)->first();
+        if($app){
+            $this->validationSet($field,$app);
+            return true;
+        }
+        return false;
+    }
+
+}

+ 26 - 0
app/Module/TransferOld/Validator/TrApp.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Module\Transfer\Validator;
+
+use App\Module\Transfer\Model\TransferApp;
+use Dcore\Validator;
+
+
+/**
+ *
+ */
+class TrApp extends Validator
+{
+
+    public function validate(mixed $value, array $data): bool
+    {
+        $field = $this->args[0]??"transferApp";
+        $app = TransferApp::query()->where('id', $value)->first();
+        if($app){
+            $this->validationSet($field,$app);
+            return true;
+        }
+        return false;
+    }
+
+}

+ 26 - 0
app/Module/TransferOld/Validator/TrOpen.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Module\Transfer\Validator;
+
+use App\Module\Sys\Config;
+use App\Module\Transfer\Model\TransferApp;
+use Dcore\Validator;
+
+
+/**
+ *
+ */
+class TrOpen extends Validator
+{
+
+    public function validate(mixed $value, array $data): bool
+    {
+        $open = Config::getValueDefaultCache('app_transfer_isopen');
+
+        if(!$open){
+            return false;
+        }
+        return true;
+    }
+
+}

+ 1 - 0
app/Module/TransferOld/Validator/readme.md

@@ -0,0 +1 @@
+# 验证器

+ 540 - 0
app/Module/TransferOld/readme.md

@@ -0,0 +1,540 @@
+# Transfer 模块 - 划转/流转系统
+
+> 更新时间: 2025-06-15
+> 模块路径: `app/Module/Transfer/`
+
+## 模块概述
+
+Transfer 模块是一个完整的资金划转/流转系统,主要用于处理用户与外部应用之间的资金转入转出操作。该模块支持多种货币、多个外部应用的资金流转,并提供完整的订单管理、状态跟踪和自动化处理功能。
+
+### 主要功能
+- **资金转入(In)**: 从外部应用向用户账户转入资金
+- **资金转出(Out)**: 从用户账户向外部应用转出资金
+- **订单管理**: 完整的订单生命周期管理
+- **自动化处理**: 定时任务自动处理订单和回调
+- **多应用支持**: 支持多个外部应用的资金流转
+- **汇率转换**: 支持不同汇率的资金转换
+
+## 目录结构
+
+```
+app/Module/Transfer/
+├── App.php                 # 应用配置管理类
+├── AutoCall.php           # 转入自动处理类
+├── AutoCallOut.php        # 转出自动处理类
+├── Info.php               # 订单信息处理类
+├── OutBudan.php           # 转出补单处理类
+├── Docs/                  # 文档目录
+├── Entity/                # 实体类目录
+├── Enums/                 # 枚举类目录
+│   ├── TStatus.php        # 订单状态枚举
+│   └── TType.php          # 订单类型枚举
+├── Model/                 # 数据模型目录
+│   ├── TransferApp.php    # 划转应用模型
+│   └── TransferOrder.php  # 划转订单模型
+├── Repository/            # 数据仓库目录
+│   ├── App.php            # 应用仓库
+│   └── Order.php          # 订单仓库
+├── Validation/            # 验证类目录
+│   ├── INCreate.php       # 转入创建验证
+│   └── OutCreate.php      # 转出创建验证
+└── Validator/             # 验证器目录
+    ├── BusinessId.php     # 业务ID验证器
+    ├── OutApp.php         # 外部应用验证器
+    ├── TrApp.php          # 划转应用验证器
+    └── TrOpen.php         # 划转开放验证器
+```
+
+## 核心类说明
+
+### 1. App.php - 应用配置管理
+负责管理划转应用的配置信息获取。
+
+<augment_code_snippet path="app/Module/Transfer/App.php" mode="EXCERPT">
+````php
+class App
+{
+    // 根据ID获取划转配置信息
+    static public function get($trapp_id):TransferApp
+
+    // 根据外部ID获取配置
+    static public function getByOid2($id):TransferApp
+}
+````
+</augment_code_snippet>
+
+### 2. AutoCall.php - 转入自动处理
+处理转入订单的自动化流程,包括订单处理和回调。
+
+<augment_code_snippet path="app/Module/Transfer/AutoCall.php" mode="EXCERPT">
+````php
+class AutoCall
+{
+    // 转入订单处理
+    static public function in_call()
+
+    // 转入回调处理
+    static public function in_callback()
+
+    // 具体的转入处理逻辑
+    static private function in_call2(TransferOrder $order)
+}
+````
+</augment_code_snippet>
+
+### 3. AutoCallOut.php - 转出自动处理
+处理转出订单的自动化流程。
+
+<augment_code_snippet path="app/Module/Transfer/AutoCallOut.php" mode="EXCERPT">
+````php
+class AutoCallOut
+{
+    // 转出订单处理
+    static public function out_call()
+
+    // 具体的转出处理逻辑
+    static private function out_call2(TransferOrder $order)
+}
+````
+</augment_code_snippet>
+
+### 4. Info.php - 订单信息处理
+提供订单信息的格式化输出。
+
+<augment_code_snippet path="app/Module/Transfer/Info.php" mode="EXCERPT">
+````php
+class Info
+{
+    // 格式化订单信息输出
+    public function order_info(TransferOrder $order)
+}
+````
+</augment_code_snippet>
+
+### 5. OutBudan.php - 转出补单处理
+处理转出订单的补单操作。
+
+<augment_code_snippet path="app/Module/Transfer/OutBudan.php" mode="EXCERPT">
+````php
+class OutBudan
+{
+    // 执行转出补单操作
+    static public function run(TransferOrder $order, bool $validation)
+}
+````
+</augment_code_snippet>
+
+## 数据模型
+
+### TransferApp - 划转应用配置
+存储外部应用的划转配置信息。
+
+<augment_code_snippet path="app/Module/Transfer/Model/TransferApp.php" mode="EXCERPT">
+````php
+/**
+ * 划转APP配置模型
+ * @property int $id
+ * @property string $keyname 标识
+ * @property string $title 应用名字
+ * @property int $out_id 对应外部APP
+ * @property int $crrency_id 对应货币
+ * @property int $fund_id 对应账户
+ * @property int $rate 比例 钱包:业务
+ */
+class TransferApp extends ModelCore
+````
+</augment_code_snippet>
+
+**主要字段说明:**
+- `keyname`: 应用标识符
+- `title`: 应用显示名称
+- `out_id`: 关联的外部应用ID
+- `crrency_id`: 使用的货币类型
+- `fund_id`: 关联的资金账户
+- `rate`: 汇率比例(钱包金额:业务金额)
+- `order_callback`: 结果通知API地址
+- `order_in_info`: 转入交易查询API
+- `order_out_create`: 转出订单创建API
+- `order_out_info`: 转出交易查询API
+
+### TransferOrder - 划转订单
+存储具体的划转订单信息。
+
+<augment_code_snippet path="app/Module/Transfer/Model/TransferOrder.php" mode="EXCERPT">
+````php
+/**
+ * 划转订单模型
+ * @property int $id
+ * @property int $trapp_id 划转app_id
+ * @property string $out_order_id 外部订单ID
+ * @property int $user_id 用户ID
+ * @property int $status 状态
+ * @property int $type 类型,方向
+ * @property float $oamount 外部金额
+ * @property int $amount 内部金额
+ */
+class TransferOrder extends ModelCore
+````
+</augment_code_snippet>
+
+**主要字段说明:**
+- `trapp_id`: 关联的划转应用ID
+- `out_order_id`: 外部系统的订单ID
+- `ouser_id`: 外部系统的用户ID
+- `user_id`: 内部系统的用户ID
+- `status`: 订单状态(使用TStatus枚举)
+- `type`: 订单类型(使用TType枚举)
+- `oamount`: 外部系统金额
+- `amount`: 内部系统金额(经过汇率转换)
+
+## 枚举类型
+
+### TStatus - 订单状态
+定义订单的各种状态。
+
+<augment_code_snippet path="app/Module/Transfer/Enums/TStatus.php" mode="EXCERPT">
+````php
+enum TStatus: int
+{
+    case CREATED = 1;    // 创建
+    case CALL = 20;      // 已处理,等待回调
+    case CALLBACK = 30;  // 回调成功
+    case END = 100;      // 已完成
+}
+````
+</augment_code_snippet>
+
+**状态流转:**
+1. `CREATED` → `CALL` → `CALLBACK` → `END`
+
+### TType - 订单类型
+定义订单的转账方向。
+
+<augment_code_snippet path="app/Module/Transfer/Enums/TType.php" mode="EXCERPT">
+````php
+enum TType: int
+{
+    case In = 1;   // 转入
+    case Out = 2;  // 转出
+}
+````
+</augment_code_snippet>
+
+## 业务流程
+
+### 转出流程 (Out)
+用户从内部账户向外部应用转出资金的完整流程。
+
+```mermaid
+sequenceDiagram
+    participant User as 用户
+    participant App as 应用端
+    participant Transfer as Transfer模块
+    participant Fund as 资金系统
+    participant External as 外部应用
+
+    User->>App: 发起转出请求
+    App->>Transfer: 创建转出订单
+    Transfer->>Transfer: 验证用户信息
+    Transfer->>Fund: 扣除用户资金
+    Transfer->>Transfer: 订单状态: CREATED
+    Transfer->>External: 调用外部API创建订单
+    External-->>Transfer: 返回外部订单ID
+    Transfer->>Transfer: 订单状态: CALL
+    Transfer->>External: 查询订单状态
+    External-->>Transfer: 返回处理结果
+    Transfer->>Transfer: 订单状态: CALLBACK
+    Transfer->>User: 通知转出完成
+```
+
+**详细步骤:**
+1. **订单创建**: 用户发起转出请求,系统创建TransferOrder
+2. **资金扣除**: 从用户账户扣除相应金额
+3. **外部下单**: 调用外部应用API创建转出订单
+4. **状态更新**: 订单状态从CREATED更新为CALL
+5. **结果查询**: 定时查询外部订单处理结果
+6. **完成处理**: 订单状态更新为CALLBACK/END
+
+### 转入流程 (In)
+从外部应用向用户内部账户转入资金的完整流程。
+
+```mermaid
+sequenceDiagram
+    participant External as 外部应用
+    participant Transfer as Transfer模块
+    participant Fund as 资金系统
+    participant User as 用户
+
+    External->>Transfer: 发起转入请求
+    Transfer->>Transfer: 验证外部应用
+    Transfer->>Transfer: 创建转入订单(CREATED)
+    Transfer->>Fund: 向用户账户转入资金
+    Transfer->>Transfer: 订单状态: CALL
+    Transfer->>External: 回调通知处理结果
+    External-->>Transfer: 确认收到回调
+    Transfer->>Transfer: 订单状态: CALLBACK
+    Transfer->>User: 通知转入完成
+```
+
+**详细步骤:**
+1. **外部请求**: 外部应用发起转入请求
+2. **订单创建**: 系统创建TransferOrder,状态为CREATED
+3. **资金转入**: 向用户账户增加相应金额
+4. **状态更新**: 订单状态更新为CALL
+5. **回调通知**: 向外部应用发送处理结果
+6. **完成处理**: 订单状态更新为CALLBACK/END
+
+## API接口
+
+### 用户端接口
+
+#### POST /transfer/create - 创建转出订单
+用户发起资金转出请求。
+
+<augment_code_snippet path="app/App/Controllers/TransferController.php" mode="EXCERPT">
+````php
+#[Post('/create')]
+public function create(Request $request)
+{
+    $se = \App\Module\App\Transfer::newBySession();
+    $res = $se->create($request->post());
+    return $this->resData($res);
+}
+````
+</augment_code_snippet>
+
+**请求参数:**
+- `trapp_id`: 划转应用ID
+- `amount`: 转出金额
+- 其他验证参数(密码、2FA等)
+
+**响应数据:**
+```json
+{
+    "code": 0,
+    "data": {
+        "id": 123  // 订单ID
+    }
+}
+```
+
+### 外部应用接口
+
+#### POST /oapi/transfer/in_create - 创建转入订单
+外部应用发起资金转入请求。
+
+<augment_code_snippet path="app/Module/AppOapi/Transfer.php" mode="EXCERPT">
+````php
+public function in_create($data)
+{
+    $data['out_id'] = $this->out_id;
+    $validation = new INCreate($data);
+    $validation->validated();
+    // 创建转入订单...
+}
+````
+</augment_code_snippet>
+
+**请求参数:**
+- `business_id`: 外部订单ID
+- `ouser_id`: 外部用户ID
+- `money`: 转入金额
+- 其他验证参数
+
+## 自动化处理
+
+### 定时任务
+系统通过定时任务自动处理订单和回调。
+
+<augment_code_snippet path="app/Console/Commands/TransferCall.php" mode="EXCERPT">
+````php
+/**
+ * 流转系统 - 自动处理,每分钟自动执行
+ */
+class TransferCall extends Command
+{
+    public function handleRun()
+    {
+        // 处理转入订单
+        AutoCall::in_call();
+        // 转入回调处理
+        AutoCall::in_callback();
+        // 处理转出订单
+        AutoCallOut::out_call();
+    }
+}
+````
+</augment_code_snippet>
+
+**执行频率:** 每分钟执行一次
+
+**处理内容:**
+1. **转入处理**: 处理状态为CREATED的转入订单
+2. **转入回调**: 处理状态为CALL的转入订单回调
+3. **转出处理**: 处理状态为CREATED的转出订单
+
+### 队列任务
+使用Laravel队列处理异步任务。
+
+**主要队列任务:**
+- `TransferOrderInCall`: 转入订单处理
+- `TransferOrderInCallback`: 转入订单回调
+- `TransferOrderOutCallback`: 转出订单回调
+
+### 补单机制
+支持手动补单操作,用于处理异常订单。
+
+<augment_code_snippet path="app/Module/AppAdmin/Transfer.php" mode="EXCERPT">
+````php
+public function budan($data, $validation = true)
+{
+    $id = $data['id'];
+    $model = TransferOrder::find($id);
+    if ($model->type != TType::Out) {
+        return "补单类型错误,出金可以补单";
+    }
+    return OutBudan::run($model, $validation);
+}
+````
+</augment_code_snippet>
+
+## 验证和校验
+
+### 验证类 (Validation)
+
+#### OutCreate - 转出创建验证
+验证用户转出请求的合法性。
+
+<augment_code_snippet path="app/Module/Transfer/Validation/OutCreate.php" mode="EXCERPT">
+````php
+class OutCreate extends ValidationCore
+{
+    // 验证用户绑定、资金余额、应用配置等
+    // 包含密码验证、2FA验证等安全检查
+}
+````
+</augment_code_snippet>
+
+**验证项目:**
+- 用户身份验证
+- 资金余额检查
+- 划转应用配置验证
+- 安全密码验证
+- Google 2FA验证
+
+#### INCreate - 转入创建验证
+验证外部应用转入请求的合法性。
+
+<augment_code_snippet path="app/Module/Transfer/Validation/INCreate.php" mode="EXCERPT">
+````php
+class INCreate extends ValidationCore
+{
+    // 验证外部应用、业务ID、用户信息等
+}
+````
+</augment_code_snippet>
+
+**验证项目:**
+- 外部应用合法性
+- 业务ID唯一性
+- 用户信息验证
+- 金额格式验证
+
+### 验证器 (Validator)
+
+#### TrApp - 划转应用验证器
+验证划转应用配置的有效性。
+
+<augment_code_snippet path="app/Module/Transfer/Validator/TrApp.php" mode="EXCERPT">
+````php
+class TrApp extends Validator
+{
+    public function validate(mixed $value, array $data): bool
+    {
+        $app = TransferApp::query()->where('id', $value)->first();
+        if($app){
+            $this->validationSet($field,$app);
+            return true;
+        }
+        return false;
+    }
+}
+````
+</augment_code_snippet>
+
+#### BusinessId - 业务ID验证器
+验证外部业务ID的唯一性。
+
+#### OutApp - 外部应用验证器
+验证外部应用的合法性和权限。
+
+## 使用示例
+
+### 1. 用户转出资金
+
+```php
+// 用户端调用
+$transfer = new \App\Module\App\Transfer();
+$transfer->setUserId($userId);
+
+$result = $transfer->create([
+    'trapp_id' => 1,        // 划转应用ID
+    'amount' => 100.00,     // 转出金额
+    'password' => 'xxx',    // 安全密码
+    'google_code' => '123456' // 2FA验证码
+]);
+
+if (is_array($result)) {
+    echo "转出成功,订单ID: " . $result['id'];
+} else {
+    echo "转出失败: " . $result;
+}
+```
+
+### 2. 外部应用转入资金
+
+```php
+// 外部应用调用
+$transfer = new \App\Module\AppOapi\Transfer();
+$transfer->setOutId($outId);
+
+$result = $transfer->in_create([
+    'business_id' => 'EXT_ORDER_123', // 外部订单ID
+    'ouser_id' => 'EXT_USER_456',     // 外部用户ID
+    'money' => 50.00,                 // 转入金额
+    'user_id' => 789                  // 内部用户ID
+]);
+```
+
+### 3. 管理员补单操作
+
+```php
+// 管理员补单
+$admin = new \App\Module\AppAdmin\Transfer();
+$result = $admin->budan([
+    'id' => 123  // 订单ID
+], true);  // 是否验证
+
+echo $result; // 返回处理结果
+```
+
+## 注意事项
+
+1. **资金安全**: 所有资金操作都使用数据库事务,确保数据一致性
+2. **状态管理**: 订单状态严格按照流程流转,避免状态混乱
+3. **汇率处理**: 内外部金额通过配置的汇率进行转换
+4. **异常处理**: 完善的异常处理和日志记录机制
+5. **幂等性**: 外部订单ID保证操作的幂等性
+6. **定时处理**: 依赖定时任务进行自动化处理,需确保任务正常运行
+
+## 相关模块
+
+- **Fund模块**: 资金账户管理
+- **User模块**: 用户信息管理
+- **Outside模块**: 外部应用管理
+- **Admin模块**: 管理员功能
+
+---
+
+> 文档最后更新: 2025-06-15
+> 如有疑问请联系开发团队