ソースを参照

完全移除Transfer模块的外部应用ID字段

- 将现有out_id数据迁移到out_id2(开放接口ID)
- 从数据库表kku_transfer_apps中删除out_id字段
- 更新所有模型、DTO、Helper、Logic、Service中的相关代码
- 修改后台管理界面,移除外部应用ID字段
- 更新字段注释和文档说明
- 修改业务逻辑使用out_id2作为开放接口ID
- 更新数据库优化SQL和文档
- 保持向后兼容,订单表的out_id字段现在存储开放接口ID
- 完全移除外部应用ID概念,统一使用开放接口ID
AI Assistant 6 ヶ月 前
コミット
9611ecdfc2

+ 110 - 0
AiWork/202506/181846-修复Transfer应用创建页面并成功创建测试应用.md

@@ -0,0 +1,110 @@
+# 修复Transfer应用创建页面并成功创建测试应用
+
+## 任务概述
+修复Transfer模块后台应用创建页面的错误,并成功创建一个测试应用验证功能。
+
+## 完成时间
+2025-06-18 18:46
+
+## 问题分析
+
+### 错误详情
+访问 `/admin/transfer/apps/create` 页面时出现错误:
+```
+TypeError: "Dcat\Admin\Form\Field\Display::with(): Argument #1 ($callback) must be of type Closure, string given, called in /var/www/html/app/Module/Transfer/AdminControllers/Helper/TransferAppHelper.php on line 244"
+```
+
+### 错误原因
+在`TransferAppHelper.php`第244行,`Display`字段的`with()`方法被错误地传入了字符串参数,而该方法期望接收一个闭包函数。
+
+## 解决方案
+
+### 代码修复
+修改`app/Module/Transfer/AdminControllers/Helper/TransferAppHelper.php`:
+
+**修复前:**
+```php
+$form->display('api_note', '说明')
+    ->with('如果所有API地址都为空,系统将运行在农场内部模式');
+```
+
+**修复后:**
+```php
+$form->display('api_note', '说明')
+    ->with(function () {
+        return '如果所有API地址都为空,系统将运行在农场内部模式';
+    });
+```
+
+## 测试验证
+
+### 创建测试应用
+成功创建了一个测试应用,配置如下:
+
+| 字段 | 值 |
+|------|-----|
+| 应用标识 | test_app |
+| 应用名称 | 测试应用 |
+| 应用描述 | 这是一个用于测试的Transfer应用 |
+| 货币类型 | 金币 |
+| 资金账户类型 | 1 |
+| 转入目标账户 | 1001 |
+| 转入来源账户 | 1002 |
+| 汇率 | 1.0000 |
+| 启用状态 | 启用 |
+
+### 验证结果
+- ✅ 创建页面正常访问:http://kku_laravel.local.gd/admin/transfer/apps/create
+- ✅ 表单提交成功,显示"保存成功!"提示
+- ✅ 应用列表正常显示新创建的应用
+- ✅ 应用详情页面可正常访问
+- ✅ 应用编辑页面可正常访问
+- ✅ 运行模式显示为"农场内部"
+- ✅ 支持功能显示为"转入, 转出"
+
+## 功能特性
+
+### 表单结构
+创建表单采用标签页设计,包含以下部分:
+1. **基本信息** - 应用标识、名称、描述
+2. **外部应用配置** - 外部应用ID、接口ID、平台ID
+3. **资金配置** - 货币类型、账户配置、汇率设置
+4. **API配置** - 回调URL、转入/转出/查询API地址
+5. **状态设置** - 启用/禁用状态
+
+### 数据验证
+- 应用标识格式验证(字母、数字、下划线)
+- 汇率必须大于0
+- 必填字段验证
+
+### 运行模式
+- **农场内部模式**:所有API地址为空时自动启用
+- **外部API模式**:配置了外部API地址时启用
+
+## 数据库记录
+新创建的应用在数据库中的记录:
+```sql
+SELECT * FROM kku_transfer_apps WHERE id = 1;
+```
+
+应用ID为1,所有配置信息已正确保存到数据库。
+
+## 后续建议
+1. 可以为应用添加更多的配置验证规则
+2. 考虑添加应用配置的导入/导出功能
+3. 可以增加应用配置的模板功能
+4. 建议添加应用配置的版本管理
+5. 可以考虑添加应用配置的测试连接功能
+
+## 技术要点
+- Dcat Admin的`Display`字段`with()`方法必须传入闭包函数
+- 表单验证在`saving`回调中进行
+- 运行模式根据API配置自动判断
+- 支持功能根据配置自动生成
+
+## 文件变更
+- 修改:`app/Module/Transfer/AdminControllers/Helper/TransferAppHelper.php`
+- 新增:任务记录文档
+
+## 验证状态
+✅ 问题已修复,功能正常工作,测试应用创建成功

+ 3 - 10
app/Module/Transfer/AdminControllers/Helper/TransferAppHelper.php

@@ -23,7 +23,6 @@ class TransferAppHelper
         $grid->column('title', '应用名称')->limit(20);
         $grid->column('description', '描述')->limit(30);
         
-        $grid->column('out_id', '外部应用ID');
         $grid->column('out_id2', '开放接口ID');
         $grid->column('out_id3', '三方平台ID');
         
@@ -115,7 +114,6 @@ class TransferAppHelper
         $show->field('description', '描述');
         
         $show->divider('外部应用配置');
-        $show->field('out_id', '外部应用ID');
         $show->field('out_id2', '开放接口ID');
         $show->field('out_id3', '三方平台ID');
         
@@ -183,18 +181,13 @@ class TransferAppHelper
         });
 
         $form->tab('外部应用配置', function (Form $form) {
-            $form->number('out_id', '外部应用ID')
-                ->required()
-                ->min(1)
-                ->help('主要外部应用ID,必填');
-                
             $form->number('out_id2', '开放接口ID')
                 ->min(1)
-                ->help('开放接口应用ID,可选');
-                
+                ->help('开放接口应用ID,用于API对接');
+
             $form->number('out_id3', '三方平台ID')
                 ->min(1)
-                ->help('第三方平台应用ID,可选');
+                ->help('第三方平台应用ID,用于平台集成');
         });
 
         $form->tab('资金配置', function (Form $form) {

+ 2 - 2
app/Module/Transfer/Database/optimization.sql

@@ -30,8 +30,8 @@ WHERE status = 100; -- 已完成状态
 -- 应用标识符唯一索引
 CREATE UNIQUE INDEX idx_transfer_apps_keyname ON kku_transfer_apps(keyname);
 
--- 外部应用ID索引
-CREATE INDEX idx_transfer_apps_out_id ON kku_transfer_apps(out_id);
+-- 开放接口ID索引
+CREATE INDEX idx_transfer_apps_out_id2 ON kku_transfer_apps(out_id2);
 
 -- 启用状态索引
 CREATE INDEX idx_transfer_apps_enabled ON kku_transfer_apps(is_enabled, created_at DESC);

+ 5 - 7
app/Module/Transfer/Docs/DATABASE.md

@@ -22,9 +22,8 @@ CREATE TABLE `kku_transfer_apps` (
   `keyname` varchar(50) NOT NULL COMMENT '应用标识符',
   `title` varchar(100) NOT NULL COMMENT '应用显示名称',
   `description` text COMMENT '应用描述信息',
-  `out_id` int NOT NULL COMMENT '外部应用ID',
-  `out_id2` int DEFAULT NULL COMMENT '外部应用ID2-开放接口',
-  `out_id3` int DEFAULT NULL COMMENT '外部应用ID3-三方平台ID',
+  `out_id2` int DEFAULT NULL COMMENT '开放接口ID',
+  `out_id3` int DEFAULT NULL COMMENT '三方平台ID',
   `currency_id` int NOT NULL COMMENT '货币类型ID',
   `fund_id` int NOT NULL COMMENT '资金账户类型ID',
   `fund_to_uid` int DEFAULT NULL COMMENT '转入目标账户UID',
@@ -71,7 +70,7 @@ CREATE TABLE `kku_transfer_apps` (
 #### 索引说明
 - `PRIMARY`: 主键索引
 - `uk_keyname`: 应用标识符唯一索引
-- `idx_out_id`: 外部应用ID索引
+- `idx_out_id2`: 开放接口ID索引
 - `idx_currency_id`: 货币类型索引
 - `idx_enabled`: 启用状态索引
 
@@ -84,9 +83,8 @@ CREATE TABLE `kku_transfer_apps` (
 - `order_out_info_url` 为空:不查询外部转出状态,仅依赖内部逻辑判断
 
 **应用ID字段说明:**
-- `out_id`: 主要外部应用ID,必填字段
-- `out_id2`: 开放接口应用ID,可选字段,用于开放API对接
-- `out_id3`: 三方平台应用ID,可选字段,用于第三方平台集成
+- `out_id2`: 开放接口ID,用于开放API对接
+- `out_id3`: 三方平台ID,用于第三方平台集成
 
 ### 2. kku_transfer_orders - 划转订单表
 

+ 0 - 3
app/Module/Transfer/Dtos/TransferAppDto.php

@@ -12,7 +12,6 @@ class TransferAppDto
         public readonly string $keyname,
         public readonly string $title,
         public readonly ?string $description,
-        public readonly int $out_id,
         public readonly ?int $out_id2,
         public readonly ?int $out_id3,
         public readonly int $currency_id,
@@ -39,7 +38,6 @@ class TransferAppDto
             keyname: $model->keyname,
             title: $model->title,
             description: $model->description,
-            out_id: $model->out_id,
             out_id2: $model->out_id2,
             out_id3: $model->out_id3,
             currency_id: $model->currency_id,
@@ -67,7 +65,6 @@ class TransferAppDto
             'keyname' => $this->keyname,
             'title' => $this->title,
             'description' => $this->description,
-            'out_id' => $this->out_id,
             'out_id2' => $this->out_id2,
             'out_id3' => $this->out_id3,
             'currency_id' => $this->currency_id,

+ 3 - 3
app/Module/Transfer/Logics/TransferLogic.php

@@ -45,7 +45,7 @@ class TransferLogic
         // 创建订单
         $order = TransferOrder::create([
             'transfer_app_id' => $app->id,
-            'out_id' => $app->out_id,
+            'out_id' => $app->out_id2 ?? 0,
             'out_order_id' => $outOrderId,
             'out_user_id' => $data['out_user_id'] ?? null,
             'user_id' => $data['user_id'],
@@ -107,7 +107,7 @@ class TransferLogic
 
         // 检查外部订单ID是否已存在
         $existingOrder = TransferOrder::where('out_order_id', $data['business_id'])
-            ->where('out_id', $app->out_id)
+            ->where('out_id', $app->out_id2 ?? 0)
             ->first();
 
         if ($existingOrder) {
@@ -121,7 +121,7 @@ class TransferLogic
         // 创建订单
         $order = TransferOrder::create([
             'transfer_app_id' => $app->id,
-            'out_id' => $app->out_id,
+            'out_id' => $app->out_id2 ?? 0,
             'out_order_id' => $data['business_id'],
             'out_user_id' => $data['out_user_id'] ?? null,
             'user_id' => $data['user_id'],

+ 2 - 5
app/Module/Transfer/Models/TransferApp.php

@@ -13,9 +13,8 @@ use UCore\ModelCore;
  * @property  string  $keyname  应用标识符
  * @property  string  $title  应用显示名称
  * @property  string  $description  应用描述信息
- * @property  int  $out_id  外部应用ID
- * @property  int  $out_id2  外部应用ID2-开放接口
- * @property  int  $out_id3  外部应用ID3-三方平台ID
+ * @property  int  $out_id2  开放接口ID
+ * @property  int  $out_id3  三方平台ID
  * @property  int  $currency_id  货币类型ID
  * @property  int  $fund_id  资金账户类型ID
  * @property  int  $fund_to_uid  转入目标账户UID
@@ -44,7 +43,6 @@ class TransferApp extends ModelCore
         'keyname',
         'title',
         'description',
-        'out_id',
         'out_id2',
         'out_id3',
         'currency_id',
@@ -65,7 +63,6 @@ class TransferApp extends ModelCore
      */
     protected $casts = [
         'id' => 'integer',
-        'out_id' => 'integer',
         'out_id2' => 'integer',
         'out_id3' => 'integer',
         'currency_id' => 'integer',

+ 1 - 1
app/Module/Transfer/Models/TransferOrder.php

@@ -14,7 +14,7 @@ use UCore\ModelCore;
  * field start 
  * @property  int  $id  主键ID
  * @property  int  $transfer_app_id  划转应用ID
- * @property  int  $out_id  外部应用ID
+ * @property  int  $out_id  开放接口ID
  * @property  string  $out_order_id  外部订单ID
  * @property  string  $out_user_id  外部用户ID
  * @property  int  $user_id  内部用户ID

+ 3 - 3
app/Module/Transfer/Services/TransferService.php

@@ -68,9 +68,9 @@ class TransferService
 
     /**
      * 根据外部订单ID查询订单信息
-     * 
+     *
      * @param string $outOrderId 外部订单ID
-     * @param int $outId 外部应用ID
+     * @param int $outId 开放接口ID
      * @return TransferOrderDto|null
      */
     public static function getOrderByOutId(string $outOrderId, int $outId): ?TransferOrderDto
@@ -78,7 +78,7 @@ class TransferService
         $order = TransferOrder::where('out_order_id', $outOrderId)
             ->where('out_id', $outId)
             ->first();
-            
+
         return $order ? TransferOrderDto::fromModel($order) : null;
     }
 

+ 1 - 1
app/Module/Transfer/Validators/BusinessIdValidator.php

@@ -89,7 +89,7 @@ class BusinessIdValidator extends ValidatorCore
 
         // 检查是否已存在相同的业务ID
         $existingOrder = TransferOrder::where('out_order_id', $this->businessId)
-            ->where('out_id', $app->out_id)
+            ->where('out_id', $app->out_id2 ?? 0)
             ->first();
 
         if ($existingOrder) {