Преглед на файлове

修复Mex模块物品注入表单问题

- 学习并应用Dcat Admin工具表单的正确使用方法
- 创建独立的工具表单类:InjectItemForm、RecycleItemForm、InitializeWarehouseForm
- 修改MexAdminToolController使用新的工具表单类
- 使用正确的响应方法:->response()->success()->refresh()
- 移除旧的表单构建方法和POST处理方法
- 测试验证:表单提交成功,显示正确成功消息,数据库记录正确创建

问题根源:之前使用了错误的表单构建方式,导致表单提交显示错误但实际成功执行
解决方案:按照Dcat Admin文档正确实现工具表单,现在功能完全正常工作
AI Assistant преди 6 месеца
родител
ревизия
1d10e4c754

+ 6 - 229
app/Module/Mex/AdminControllers/MexAdminToolController.php

@@ -2,16 +2,13 @@
 
 namespace App\Module\Mex\AdminControllers;
 
-use App\Module\Mex\Services\MexAdminService;
-use App\Module\Mex\Logic\MexAdminLogic;
+use App\Module\Mex\Forms\InjectItemForm;
+use App\Module\Mex\Forms\RecycleItemForm;
+use App\Module\Mex\Forms\InitializeWarehouseForm;
 use Spatie\RouteAttributes\Attributes\Get;
-use Spatie\RouteAttributes\Attributes\Post;
 use UCore\DcatAdmin\AdminController;
-use Dcat\Admin\Form;
 use Dcat\Admin\Layout\Content;
 use Dcat\Admin\Widgets\Card;
-use Dcat\Admin\Admin;
-use Illuminate\Http\Request;
 
 /**
  * 农贸市场管理员工具
@@ -50,7 +47,7 @@ class MexAdminToolController extends AdminController
         return $content
             ->title('物品注入')
             ->description('向市场注入物品,增加供应量')
-            ->body($this->buildInjectForm());
+            ->body(new Card(new InjectItemForm()));
     }
 
     /**
@@ -62,7 +59,7 @@ class MexAdminToolController extends AdminController
         return $content
             ->title('物品回收')
             ->description('从市场回收物品,减少供应量')
-            ->body($this->buildRecycleForm());
+            ->body(new Card(new RecycleItemForm()));
     }
 
     /**
@@ -74,122 +71,14 @@ class MexAdminToolController extends AdminController
         return $content
             ->title('初始化库存')
             ->description('为所有已定价的商品创建库存记录')
-            ->body($this->buildInitializeForm());
+            ->body(new Card(new InitializeWarehouseForm()));
     }
 
-    /**
-     * 处理物品注入
-     */
-    #[Post('mex-admin-tools/inject', name: 'dcat.admin.mex-admin-tools.inject.store')]
-    public function storeInject(Request $request)
-    {
-        $request->validate([
-            'item_id' => 'required|integer|min:1',
-            'quantity' => 'required|integer|min:1',
-            'price' => 'required|numeric|min:0',
-            'remark' => 'nullable|string|max:255',
-        ], [
-            'item_id.required' => '商品ID不能为空',
-            'item_id.integer' => '商品ID必须是整数',
-            'item_id.min' => '商品ID必须大于0',
-            'quantity.required' => '数量不能为空',
-            'quantity.integer' => '数量必须是整数',
-            'quantity.min' => '数量必须大于0',
-            'price.required' => '价格不能为空',
-            'price.numeric' => '价格必须是数字',
-            'price.min' => '价格不能为负数',
-            'remark.max' => '备注不能超过255个字符',
-        ]);
 
-        try {
-            $result = MexAdminService::injectItem(
-                adminUserId: Admin::user()->id,
-                itemId: $request->item_id,
-                quantity: $request->quantity,
-                price: $request->price,
-                remark: $request->remark ?? '后台管理员注入'
-            );
 
-            if ($result['success']) {
-                admin_success('注入成功!', '操作ID: ' . $result['operation_id'] . ', 成交ID: ' . $result['transaction_id']);
-                return redirect()->route('dcat.admin.mex-admin-tools.inject');
-            } else {
-                admin_error('注入失败', $result['message']);
-                return back()->withInput();
-            }
-        } catch (\Exception $e) {
-            admin_error('注入失败', $e->getMessage());
-            return back()->withInput();
-        }
-    }
 
-    /**
-     * 处理物品回收
-     */
-    #[Post('mex-admin-tools/recycle', name: 'dcat.admin.mex-admin-tools.recycle.store')]
-    public function storeRecycle(Request $request)
-    {
-        $request->validate([
-            'item_id' => 'required|integer|min:1',
-            'quantity' => 'required|integer|min:1',
-            'price' => 'required|numeric|min:0',
-            'remark' => 'nullable|string|max:255',
-        ], [
-            'item_id.required' => '商品ID不能为空',
-            'item_id.integer' => '商品ID必须是整数',
-            'item_id.min' => '商品ID必须大于0',
-            'quantity.required' => '数量不能为空',
-            'quantity.integer' => '数量必须是整数',
-            'quantity.min' => '数量必须大于0',
-            'price.required' => '价格不能为空',
-            'price.numeric' => '价格必须是数字',
-            'price.min' => '价格不能为负数',
-            'remark.max' => '备注不能超过255个字符',
-        ]);
 
-        try {
-            $result = MexAdminService::recycleItem(
-                adminUserId: Admin::user()->id,
-                itemId: $request->item_id,
-                quantity: $request->quantity,
-                price: $request->price,
-                remark: $request->remark ?? '后台管理员回收'
-            );
 
-            if ($result['success']) {
-                admin_success('回收成功!', '操作ID: ' . $result['operation_id'] . ', 成交ID: ' . $result['transaction_id']);
-                return redirect()->route('dcat.admin.mex-admin-tools.recycle');
-            } else {
-                admin_error('回收失败', $result['message']);
-                return back()->withInput();
-            }
-        } catch (\Exception $e) {
-            admin_error('回收失败', $e->getMessage());
-            return back()->withInput();
-        }
-    }
-
-    /**
-     * 处理初始化库存请求
-     */
-    #[Post('mex-admin-tools/initialize', name: 'dcat.admin.mex-admin-tools.initialize.store')]
-    public function storeInitialize(Request $request)
-    {
-        try {
-            $result = MexAdminLogic::initializeWarehouse(Admin::user()->id);
-
-            if ($result['success']) {
-                admin_success('初始化成功!', $result['message'] . ',共初始化了 ' . $result['initialized_count'] . ' 个商品的库存记录。');
-                return redirect()->route('dcat.admin.mex-admin-tools.initialize');
-            } else {
-                admin_error('初始化失败', $result['message']);
-                return back()->withInput();
-            }
-        } catch (\Exception $e) {
-            admin_error('初始化失败', $e->getMessage());
-            return back()->withInput();
-        }
-    }
 
     /**
      * 构建工具页面
@@ -254,119 +143,7 @@ class MexAdminToolController extends AdminController
         return $card;
     }
 
-    /**
-     * 构建注入表单
-     */
-    private function buildInjectForm()
-    {
-        $form = new Form();
-
-        $form->action(route('dcat.admin.mex-admin-tools.inject.store'));
-        
-        $form->number('item_id', '商品ID')
-            ->required()
-            ->min(1)
-            ->help('请输入要注入的商品ID');
-            
-        $form->number('quantity', '注入数量')
-            ->required()
-            ->min(1)
-            ->help('请输入要注入的数量');
-            
-        $form->decimal('price', '注入价格')
-            ->required()
-            ->help('请输入注入价格(每个商品的价格)');
-            
-        $form->textarea('remark', '操作备注')
-            ->rows(3)
-            ->help('可选,记录本次操作的原因或说明');
-
-        $form->html('<div class="alert alert-warning">
-            <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
-            <ul class="mb-0">
-                <li>注入操作相当于系统向仓库"卖出"物品</li>
-                <li>会增加仓库的库存数量</li>
-                <li>系统会获得相应的资金收入</li>
-                <li>操作不可撤销,请谨慎操作</li>
-            </ul>
-        </div>');
-
-        return $form;
-    }
-
-    /**
-     * 构建回收表单
-     */
-    private function buildRecycleForm()
-    {
-        $form = new Form();
 
-        $form->action(route('dcat.admin.mex-admin-tools.recycle.store'));
-        
-        $form->number('item_id', '商品ID')
-            ->required()
-            ->min(1)
-            ->help('请输入要回收的商品ID');
-            
-        $form->number('quantity', '回收数量')
-            ->required()
-            ->min(1)
-            ->help('请输入要回收的数量');
-            
-        $form->decimal('price', '回收价格')
-            ->required()
-            ->help('请输入回收价格(每个商品的价格)');
-            
-        $form->textarea('remark', '操作备注')
-            ->rows(3)
-            ->help('可选,记录本次操作的原因或说明');
 
-        $form->html('<div class="alert alert-warning">
-            <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
-            <ul class="mb-0">
-                <li>回收操作相当于系统从仓库"买入"物品</li>
-                <li>会减少仓库的库存数量</li>
-                <li>系统会支出相应的资金</li>
-                <li>回收数量不能超过当前库存</li>
-                <li>操作不可撤销,请谨慎操作</li>
-            </ul>
-        </div>');
 
-        return $form;
-    }
-
-    /**
-     * 构建初始化库存表单
-     */
-    private function buildInitializeForm()
-    {
-        $form = new Form();
-
-        $form->action(route('dcat.admin.mex-admin-tools.initialize.store'));
-
-        $form->html('<div class="alert alert-info">
-            <h6><i class="fa fa-info-circle"></i> 初始化说明</h6>
-            <ul class="mb-0">
-                <li>此操作将为所有已启用定价的商品创建库存记录</li>
-                <li>初始库存数量为0,可通过注入操作增加库存</li>
-                <li>只有当库存表为空时才能执行初始化</li>
-                <li>初始化后可以正常进行注入、回收和用户交易</li>
-            </ul>
-        </div>');
-
-        $form->html('<div class="alert alert-warning">
-            <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
-            <ul class="mb-0">
-                <li>初始化操作只能在库存表为空时执行</li>
-                <li>如果已有库存记录,将无法执行初始化</li>
-                <li>初始化完成后,所有已定价商品的库存都为0</li>
-                <li>操作不可撤销,请确认后再执行</li>
-            </ul>
-        </div>');
-
-        // 添加一个隐藏字段,确保表单可以提交
-        $form->hidden('action')->value('initialize');
-
-        return $form;
-    }
 }

+ 72 - 0
app/Module/Mex/Forms/InitializeWarehouseForm.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Module\Mex\Forms;
+
+use App\Module\Mex\Logic\MexAdminLogic;
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Form;
+
+/**
+ * Mex模块初始化仓库表单
+ */
+class InitializeWarehouseForm extends Form
+{
+    /**
+     * 处理表单提交请求
+     */
+    public function handle(array $input)
+    {
+        try {
+            $result = MexAdminLogic::initializeWarehouse(Admin::user()->id);
+
+            if ($result['success']) {
+                return $this->response()
+                    ->success('初始化成功!' . $result['message'] . ',共初始化了 ' . $result['initialized_count'] . ' 个商品的库存记录。')
+                    ->refresh(); // 刷新当前页面
+            } else {
+                return $this->response()->error('初始化失败: ' . $result['message']);
+            }
+        } catch (\Exception $e) {
+            return $this->response()->error('初始化失败: ' . $e->getMessage());
+        }
+    }
+
+    /**
+     * 构建表单
+     */
+    public function form()
+    {
+        $this->html('<div class="alert alert-info">
+            <h6><i class="fa fa-info-circle"></i> 初始化说明</h6>
+            <ul class="mb-0">
+                <li>此操作将为所有已启用定价的商品创建库存记录</li>
+                <li>初始库存数量为0,可通过注入操作增加库存</li>
+                <li>只有当库存表为空时才能执行初始化</li>
+                <li>初始化后可以正常进行注入、回收和用户交易</li>
+            </ul>
+        </div>');
+
+        $this->html('<div class="alert alert-warning">
+            <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
+            <ul class="mb-0">
+                <li>初始化操作只能在库存表为空时执行</li>
+                <li>如果已有库存记录,将无法执行初始化</li>
+                <li>初始化完成后,所有已定价商品的库存都为0</li>
+                <li>操作不可撤销,请确认后再执行</li>
+            </ul>
+        </div>');
+
+        // 添加一个隐藏字段,确保表单可以提交
+        $this->hidden('action')->value('initialize');
+    }
+
+    /**
+     * 返回表单默认数据
+     */
+    public function default()
+    {
+        return [
+            'action' => 'initialize',
+        ];
+    }
+}

+ 99 - 0
app/Module/Mex/Forms/InjectItemForm.php

@@ -0,0 +1,99 @@
+<?php
+
+namespace App\Module\Mex\Forms;
+
+use App\Module\Mex\Services\MexAdminService;
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Form;
+
+/**
+ * Mex模块物品注入表单
+ */
+class InjectItemForm extends Form
+{
+    /**
+     * 处理表单提交请求
+     */
+    public function handle(array $input)
+    {
+        // 验证输入数据
+        if (empty($input['item_id']) || $input['item_id'] <= 0) {
+            return $this->response()->error('商品ID不能为空且必须大于0');
+        }
+        
+        if (empty($input['quantity']) || $input['quantity'] <= 0) {
+            return $this->response()->error('注入数量不能为空且必须大于0');
+        }
+        
+        if (!isset($input['price']) || $input['price'] < 0) {
+            return $this->response()->error('注入价格不能为空且不能为负数');
+        }
+
+        try {
+            $result = MexAdminService::injectItem(
+                adminUserId: Admin::user()->id,
+                itemId: (int)$input['item_id'],
+                quantity: (int)$input['quantity'],
+                price: (float)$input['price'],
+                remark: $input['remark'] ?? '后台管理员注入'
+            );
+
+            if ($result['success']) {
+                return $this->response()
+                    ->success('注入成功!操作ID: ' . $result['operation_id'] . ', 成交ID: ' . $result['transaction_id'])
+                    ->refresh(); // 刷新当前页面
+            } else {
+                return $this->response()->error('注入失败: ' . $result['message']);
+            }
+        } catch (\Exception $e) {
+            return $this->response()->error('注入失败: ' . $e->getMessage());
+        }
+    }
+
+    /**
+     * 构建表单
+     */
+    public function form()
+    {
+        $this->number('item_id', '商品ID')
+            ->required()
+            ->min(1)
+            ->help('请输入要注入的商品ID');
+            
+        $this->number('quantity', '注入数量')
+            ->required()
+            ->min(1)
+            ->help('请输入要注入的数量');
+            
+        $this->decimal('price', '注入价格')
+            ->required()
+            ->help('请输入注入价格(每个商品的价格)');
+            
+        $this->textarea('remark', '操作备注')
+            ->rows(3)
+            ->help('可选,记录本次操作的原因或说明');
+
+        $this->html('<div class="alert alert-warning">
+            <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
+            <ul class="mb-0">
+                <li>注入操作相当于系统向仓库"卖出"物品</li>
+                <li>会增加仓库的库存数量</li>
+                <li>系统会获得相应的资金收入</li>
+                <li>操作不可撤销,请谨慎操作</li>
+            </ul>
+        </div>');
+    }
+
+    /**
+     * 返回表单默认数据
+     */
+    public function default()
+    {
+        return [
+            'item_id' => '',
+            'quantity' => '',
+            'price' => '',
+            'remark' => '',
+        ];
+    }
+}

+ 100 - 0
app/Module/Mex/Forms/RecycleItemForm.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Module\Mex\Forms;
+
+use App\Module\Mex\Services\MexAdminService;
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Form;
+
+/**
+ * Mex模块物品回收表单
+ */
+class RecycleItemForm extends Form
+{
+    /**
+     * 处理表单提交请求
+     */
+    public function handle(array $input)
+    {
+        // 验证输入数据
+        if (empty($input['item_id']) || $input['item_id'] <= 0) {
+            return $this->response()->error('商品ID不能为空且必须大于0');
+        }
+        
+        if (empty($input['quantity']) || $input['quantity'] <= 0) {
+            return $this->response()->error('回收数量不能为空且必须大于0');
+        }
+        
+        if (!isset($input['price']) || $input['price'] < 0) {
+            return $this->response()->error('回收价格不能为空且不能为负数');
+        }
+
+        try {
+            $result = MexAdminService::recycleItem(
+                adminUserId: Admin::user()->id,
+                itemId: (int)$input['item_id'],
+                quantity: (int)$input['quantity'],
+                price: (float)$input['price'],
+                remark: $input['remark'] ?? '后台管理员回收'
+            );
+
+            if ($result['success']) {
+                return $this->response()
+                    ->success('回收成功!操作ID: ' . $result['operation_id'] . ', 成交ID: ' . $result['transaction_id'])
+                    ->refresh(); // 刷新当前页面
+            } else {
+                return $this->response()->error('回收失败: ' . $result['message']);
+            }
+        } catch (\Exception $e) {
+            return $this->response()->error('回收失败: ' . $e->getMessage());
+        }
+    }
+
+    /**
+     * 构建表单
+     */
+    public function form()
+    {
+        $this->number('item_id', '商品ID')
+            ->required()
+            ->min(1)
+            ->help('请输入要回收的商品ID');
+            
+        $this->number('quantity', '回收数量')
+            ->required()
+            ->min(1)
+            ->help('请输入要回收的数量');
+            
+        $this->decimal('price', '回收价格')
+            ->required()
+            ->help('请输入回收价格(每个商品的价格)');
+            
+        $this->textarea('remark', '操作备注')
+            ->rows(3)
+            ->help('可选,记录本次操作的原因或说明');
+
+        $this->html('<div class="alert alert-warning">
+            <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
+            <ul class="mb-0">
+                <li>回收操作相当于系统从仓库"买入"物品</li>
+                <li>会减少仓库的库存数量</li>
+                <li>系统会支出相应的资金</li>
+                <li>回收数量不能超过当前库存</li>
+                <li>操作不可撤销,请谨慎操作</li>
+            </ul>
+        </div>');
+    }
+
+    /**
+     * 返回表单默认数据
+     */
+    public function default()
+    {
+        return [
+            'item_id' => '',
+            'quantity' => '',
+            'price' => '',
+            'remark' => '',
+        ];
+    }
+}