Browse Source

feat(fund): 添加资金模块快捷操作并优化资金日志显示- 新增多个快捷操作类,用于资金账户和日志的快速导航
- 优化资金日志的显示格式,增加金额的正负值颜色区分
- 重构部分代码,提高可复用性和可维护性

Your Name 8 months ago
parent
commit
21d65f9a8a

+ 43 - 0
app/Module/Fund/Admin/Actions/BackToFundAction.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Module\Fund\Admin\Actions;
+
+use App\Module\Fund\Models\FundLogModel;
+use Illuminate\Http\Request;
+use UCore\DcatAdmin\RowActionHandler;
+
+/**
+ * 返回到资金账户
+ *
+ * 在资金日志列表中添加返回到对应资金账户的快捷操作
+ */
+class BackToFundAction extends RowActionHandler
+{
+    /**
+     * 操作按钮标题
+     *
+     * @var string
+     */
+    public $title = '查看账户';
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function handle(Request $request)
+    {
+        $id = $this->getKey();
+        $log = FundLogModel::find($id);
+
+        if (!$log) {
+            return $this->response()->error('资金日志不存在');
+        }
+
+        // 跳转到资金账户页面,并带上用户ID和资金账户ID作为筛选条件
+        return $this->response()->redirect(
+            admin_url("fund-accounts?user_id={$log->user_id}&fund_id={$log->fund_id->value}")
+        );
+    }
+}

+ 1 - 1
app/Module/Fund/Admin/Actions/Circulation.php

@@ -25,7 +25,7 @@ class Circulation extends RowAction
         $id = $this->getKey();
 
 //        dump($id);
-        return "/admin/fund/circulation?id=" . $id;
+        return "/admin/fund-circulation-action?id=" . $id;
     }
 
 

+ 12 - 10
app/Module/Fund/Admin/Actions/CirculationForm.php

@@ -4,11 +4,14 @@ namespace App\Module\Fund\Admin\Actions;
 
 
 
+use App\Module\Fund\AdminControllers\Helper\FormHelper;
+use App\Module\Fund\Enums\FUND_TYPE;
+use App\Module\Fund\Models\FundModel;
+use App\Module\Fund\Services\AccountService;
 use App\Module\Fund\Services\FundService;
 use Dcat\Admin\Contracts\LazyRenderable;
 use Dcat\Admin\Traits\LazyWidget;
 
-
 use UCore\DcatAdmin\Widgets\Form;
 use function request;
 use Illuminate\Support\Facades\DB;
@@ -37,8 +40,8 @@ class CirculationForm extends Form implements LazyRenderable
         $acc = $input['acc'];
         $remark = $input['remark'];
         DB::beginTransaction();
-        $fund=  new FundService($user_id,$fund_id);
-        $res = $fund->circulation(\Fund\Enums\Fund::tryFrom((int)$to_fund_id), $acc * 1000,0,'admin', $remark);
+        $fund=  new FundService($user_id,(int)$fund_id);
+        $res = $fund->circulation(FUND_TYPE::tryFrom($to_fund_id), $acc ,0,'admin', $remark);
         if($res){
             DB::commit();
             return $this->_success('ok');
@@ -50,12 +53,11 @@ class CirculationForm extends Form implements LazyRenderable
 
     public function form()
     {
-        $help = new FormHelper($this, $this);
+
         $id = request('id');
-        /**
-         * @var \Fund\ModelLaravel\Fund $funddata
-         */
-        $funddata  = \Fund\ModelLaravel\Fund::query()->find($id);
+
+
+        $funddata  = FundModel::query()->find($id);
 //        dump($funddata);
         // 备注, 目标账户,钱数
         $help = new FormHelper($this, $this);
@@ -66,8 +68,8 @@ class CirculationForm extends Form implements LazyRenderable
         $help->text('remark')->value("流转原因:");
 
         $help->display("balance")->value($funddata->balance/1000);
-        $index = Account::getFundsDesc();
-        unset($index[$funddata->fund_id]);
+        $index = AccountService::getFundsDesc();
+        unset($index[$funddata->fund_id->value()]);
         $help->radio('to_fund_id',$index)->required();
         $help->number("acc")->value(1)->max($funddata->balance/1000);
 

+ 43 - 0
app/Module/Fund/Admin/Actions/FundLogViewAction.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Module\Fund\Admin\Actions;
+
+use App\Module\Fund\Models\FundModel;
+use Illuminate\Http\Request;
+use UCore\DcatAdmin\RowActionHandler;
+
+/**
+ * 查看资金日志
+ *
+ * 在资金账户列表中添加查看该账户日志的快捷操作
+ */
+class FundLogViewAction extends RowActionHandler
+{
+    /**
+     * 操作按钮标题
+     *
+     * @var string
+     */
+    public $title = '查看日志';
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function handle(Request $request)
+    {
+        $id = $this->getKey();
+        $fund = FundModel::find($id);
+
+        if (!$fund) {
+            return $this->response()->error('资金账户不存在');
+        }
+
+        // 跳转到资金日志页面,并带上用户ID和资金账户ID作为筛选条件
+        return $this->response()->redirect(
+            admin_url("fund-logs?user_id={$fund->user_id}&fund_id={$fund->fund_id->value}")
+        );
+    }
+}

+ 44 - 0
app/Module/Fund/Admin/Actions/FundStatisticsAction.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Module\Fund\Admin\Actions;
+
+use App\Module\Fund\Models\FundModel;
+use Illuminate\Http\Request;
+use UCore\DcatAdmin\RowActionHandler;
+
+/**
+ * 资金统计操作
+ * 
+ * 在资金账户列表中添加查看该用户所有资金账户统计的快捷操作
+ */
+class FundStatisticsAction extends RowActionHandler
+{
+    /**
+     * 操作按钮标题
+     *
+     * @var string
+     */
+    public $title = '账户统计';
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function handle(Request $request)
+    {
+        $id = $this->getKey();
+        $fund = FundModel::find($id);
+        
+        if (!$fund) {
+            return $this->response()->error('资金账户不存在');
+        }
+        
+        // 跳转到资金账户列表页面,并带上用户ID作为筛选条件
+        // 这样可以查看该用户的所有资金账户
+        return $this->response()->redirect(
+            admin_url("fund-accounts?user_id={$fund->user_id}")
+        );
+    }
+}

+ 43 - 0
app/Module/Fund/Admin/Actions/FundTransferAction.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Module\Fund\Admin\Actions;
+
+use App\Module\Fund\Models\FundModel;
+use Illuminate\Http\Request;
+use UCore\DcatAdmin\RowActionHandler;
+
+/**
+ * 转账操作
+ * 
+ * 在资金账户列表中添加转账的快捷操作
+ */
+class FundTransferAction extends RowActionHandler
+{
+    /**
+     * 操作按钮标题
+     *
+     * @var string
+     */
+    public $title = '转账';
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function handle(Request $request)
+    {
+        $id = $this->getKey();
+        $fund = FundModel::find($id);
+        
+        if (!$fund) {
+            return $this->response()->error('资金账户不存在');
+        }
+        
+        // 跳转到转账页面,并带上用户ID和资金账户ID作为初始参数
+        return $this->response()->redirect(
+            admin_url("fund_transfer/create?user_id={$fund->user_id}&fund_id={$fund->fund_id}")
+        );
+    }
+}

+ 43 - 0
app/Module/Fund/Admin/Actions/UserCirculationsAction.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Module\Fund\Admin\Actions;
+
+use App\Module\Fund\Models\FundCirculationModel;
+use Illuminate\Http\Request;
+use UCore\DcatAdmin\RowActionHandler;
+
+/**
+ * 查看用户所有流转记录
+ * 
+ * 在资金流转列表中添加查看该用户所有流转记录的快捷操作
+ */
+class UserCirculationsAction extends RowActionHandler
+{
+    /**
+     * 操作按钮标题
+     *
+     * @var string
+     */
+    public $title = '用户流转';
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function handle(Request $request)
+    {
+        $id = $this->getKey();
+        $circulation = FundCirculationModel::find($id);
+        
+        if (!$circulation) {
+            return $this->response()->error('流转记录不存在');
+        }
+        
+        // 跳转到资金流转页面,并带上用户ID作为筛选条件
+        return $this->response()->redirect(
+            admin_url("fund-circulation?user_id={$circulation->user_id}")
+        );
+    }
+}

+ 43 - 0
app/Module/Fund/Admin/Actions/UserTransfersAction.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Module\Fund\Admin\Actions;
+
+use App\Module\Fund\Models\FundTransferModel;
+use Illuminate\Http\Request;
+use UCore\DcatAdmin\RowActionHandler;
+
+/**
+ * 查看用户所有转账记录
+ * 
+ * 在资金转账列表中添加查看该用户所有转账记录的快捷操作
+ */
+class UserTransfersAction extends RowActionHandler
+{
+    /**
+     * 操作按钮标题
+     *
+     * @var string
+     */
+    public $title = '用户转账';
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function handle(Request $request)
+    {
+        $id = $this->getKey();
+        $transfer = FundTransferModel::find($id);
+        
+        if (!$transfer) {
+            return $this->response()->error('转账记录不存在');
+        }
+        
+        // 跳转到资金转账页面,并带上用户ID作为筛选条件
+        return $this->response()->redirect(
+            admin_url("fund_transfer?user_id={$transfer->user_id}")
+        );
+    }
+}

+ 46 - 0
app/Module/Fund/AdminControllers/Fund2Controller.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Module\Fund\AdminControllers;
+
+use App\Module\Fund\Admin\Actions\Circulation;
+use App\Module\Fund\Admin\Actions\CirculationForm;
+use App\Module\Fund\Admin\Actions\FundAdminAction;
+use App\Module\Fund\Admin\Actions\FundLogViewAction;
+use App\Module\Fund\Admin\Actions\FundStatisticsAction;
+use App\Module\Fund\Admin\Actions\FundTransferAction;
+use App\Module\Fund\AdminControllers\Helper\FilterHelper;
+use App\Module\Fund\AdminControllers\Helper\FormHelper;
+use App\Module\Fund\AdminControllers\Helper\GridHelper;
+use App\Module\Fund\AdminControllers\Helper\ShowHelper;
+use App\Module\Fund\Repositorys\FundLogRepository;
+use App\Module\Fund\Repositorys\FundRepository;
+use App\Module\Fund\Services\AccountService;
+use Spatie\RouteAttributes\Attributes\Get;
+use Spatie\RouteAttributes\Attributes\Resource;
+use UCore\DcatAdmin\AdminController;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Show;
+use App\Module\Fund\Models\FundModel;
+use App\Module\Fund\Repositorys\FundRepository as Fund;
+
+/**
+ * 资金账户
+ */
+class Fund2Controller extends AdminController
+{
+
+
+
+
+    #[Get('fund-circulation-action')]
+    public function circulation(Content $content)
+    {
+        return $content
+            ->title('流转')
+            ->body(new CirculationForm());
+
+    }
+
+}

+ 2 - 1
app/Module/Fund/AdminControllers/FundCirculationController.php

@@ -2,6 +2,7 @@
 
 namespace App\Module\Fund\AdminControllers;
 
+use App\Module\Fund\Admin\Actions\UserCirculationsAction;
 use App\Module\Fund\Services\AccountService;
 use Spatie\RouteAttributes\Attributes\Resource;
 use UCore\DcatAdmin\AdminController;
@@ -78,7 +79,7 @@ class FundCirculationController extends AdminController
             $grid->actions(function (Grid\Displayers\Actions $actions) {
 //                $actions->disableDelete();
                 $actions->disableView();
-
+                $actions->append(new UserCirculationsAction());
             });
 
         });

+ 8 - 7
app/Module/Fund/AdminControllers/FundController.php

@@ -3,7 +3,11 @@
 namespace App\Module\Fund\AdminControllers;
 
 use App\Module\Fund\Admin\Actions\Circulation;
+use App\Module\Fund\Admin\Actions\CirculationForm;
 use App\Module\Fund\Admin\Actions\FundAdminAction;
+use App\Module\Fund\Admin\Actions\FundLogViewAction;
+use App\Module\Fund\Admin\Actions\FundStatisticsAction;
+use App\Module\Fund\Admin\Actions\FundTransferAction;
 use App\Module\Fund\AdminControllers\Helper\FilterHelper;
 use App\Module\Fund\AdminControllers\Helper\FormHelper;
 use App\Module\Fund\AdminControllers\Helper\GridHelper;
@@ -11,6 +15,7 @@ use App\Module\Fund\AdminControllers\Helper\ShowHelper;
 use App\Module\Fund\Repositorys\FundLogRepository;
 use App\Module\Fund\Repositorys\FundRepository;
 use App\Module\Fund\Services\AccountService;
+use Spatie\RouteAttributes\Attributes\Get;
 use Spatie\RouteAttributes\Attributes\Resource;
 use UCore\DcatAdmin\AdminController;
 use Dcat\Admin\Form;
@@ -89,6 +94,9 @@ class FundController extends AdminController
             $grid->actions(function (Grid\Displayers\Actions $actions) {
                 $actions->append(new FundAdminAction());
                 $actions->append(new Circulation());
+                $actions->append(new FundLogViewAction());
+                $actions->append(new FundTransferAction());
+                $actions->append(new FundStatisticsAction());
             });
         });
     }
@@ -167,12 +175,5 @@ class FundController extends AdminController
 
 
 
-    public function circulation(Content $content)
-    {
-        return $content
-            ->title('流转')
-            ->body(new CirculationForm());
-
-    }
 
 }

+ 14 - 15
app/Module/Fund/AdminControllers/FundLogController.php

@@ -2,10 +2,13 @@
 
 namespace App\Module\Fund\AdminControllers;
 
+use App\Module\Fund\Admin\Actions\BackToFundAction;
 use App\Module\Fund\AdminControllers\Helper\FilterHelper;
 use App\Module\Fund\AdminControllers\Helper\FormHelper;
 use App\Module\Fund\AdminControllers\Helper\GridHelper;
 use App\Module\Fund\AdminControllers\Helper\ShowHelper;
+use App\Module\Fund\Enums\LOG_TYPE;
+use App\Module\Fund\Enums\OPERATE_TYPE;
 use App\Module\Fund\Models\FundModel;
 use App\Module\Fund\Services\AccountService;
 use App\Module\Fund\Services\LogService;
@@ -66,25 +69,20 @@ class FundLogController extends AdminController
             $helper->columnTimestamp('create_time', '操作时间'); // 格式化时间戳
 
             // 关联操作列
-            $grid->column('operate_type', '关联')->expand(function() {
+            $helper->columnModelCats('operate_type', '关联')->expand(function() {
                 $url = admin_url('404');
                 $title = '未知';
-                if($this->operate_type == 'Circulation'){
-                    $url = admin_route('fund_circulation.index',['id'=>$this->operate_id]);
+
+                if($this->operate_type === LOG_TYPE::CIRCULATION){
+                    $url = admin_route('fund-circulation.index',['id'=>$this->operate_id]);
                     $title = '流转';
                 }
-                if($this->operate_type == 'Trade'){
-                    if(substr($this->operate_id,0,5) == 'order'){
-                        // 订单
-                        $url = admin_route('order.index',['id'=>substr($this->operate_id,6) ]);
-                        $title = '订单';
-                    }
-                    if(substr($this->operate_id,0,8) == 'Transfer'){
-                        // 订单
-                        $url = admin_route('transfer.index',['id'=>substr($this->operate_id,9) ]);
-                        $title = '划转';
-                    }
+                if($this->operate_type === LOG_TYPE::ADMIN){
+                    $url = admin_route('fund-admin.index',['id'=>$this->operate_id]);
+                    $title = '管理员操作';
                 }
+//                dump($this->operate_type);
+
                 $link = new Link($title,$url);
                 return $link;
             });
@@ -101,7 +99,7 @@ class FundLogController extends AdminController
                 // 直接实现资金日志筛选组
                 $filter->equal('user_id', '用户ID');
                 $helper->equalFundId();
-                $helper->equalOperateType();
+
                 $helper->betweenAmount();
                 $filter->like('remark', '备注');
                 $helper->betweenTimestamp('create_time', '创建时间');
@@ -111,6 +109,7 @@ class FundLogController extends AdminController
             $grid->actions(function (Grid\Displayers\Actions $actions) {
                 $actions->disableEdit();
                 $actions->disableDelete();
+                $actions->append(new BackToFundAction());
             });
         });
     }

+ 2 - 1
app/Module/Fund/AdminControllers/FundTransferController.php

@@ -2,6 +2,7 @@
 
 namespace App\Module\Fund\AdminControllers;
 
+use App\Module\Fund\Admin\Actions\UserTransfersAction;
 use App\Module\Fund\Repositorys\FundTransferRepository;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
@@ -50,7 +51,7 @@ class FundTransferController extends AdminController
             $grid->actions(function (Grid\Displayers\Actions $actions) {
 //                $actions->disableDelete();
                 $actions->disableView();
-
+                $actions->append(new UserTransfersAction());
             });
 
         });

+ 1 - 1
app/Module/Fund/AdminControllers/Helper/FilterHelperTrait.php

@@ -45,7 +45,7 @@ trait FilterHelperTrait
      */
     public function equalOperateType(string $field = 'operate_type', string $label = '操作类型'): Presenter
     {
-        return $this->filter->equal($field, $label)->select(OPERATE_TYPE::getValueDescription());
+        return $this->filter->equal($field, $label)->select(LOG_TYPE::getValueDescription());
     }
 
 

+ 41 - 3
app/Module/Fund/AdminControllers/Helper/GridHelperTrait.php

@@ -42,7 +42,7 @@ trait GridHelperTrait
     public function columnBalance(string $field = 'balance', string $label = '余额'): Column
     {
         return $this->grid->column($field, $label)->display(function ($value) {
-            return number_format($value , 3,',');
+            return number_format($value , 0,',');
         })->sortable();
     }
     public function columnBalance1000(string $field = 'balance', string $label = '余额'): Column
@@ -53,6 +53,28 @@ trait GridHelperTrait
     }
 
 
+    /**
+     * 添加操作金额列
+     *
+     * 复用价值:高 - 统一处理操作金额的格式化显示,包括正负值的颜色区分
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Column
+     */
+    public function columnAmount(string $field = 'amount', string $label = '操作金额'): Column
+    {
+        return $this->grid->column($field, $label)->display(function ($value) {
+            $formattedValue = number_format($value , 0,',');
+            if ($value > 0) {
+                return "<span class='text-success'>+{$formattedValue}</span>";
+            } elseif ($value < 0) {
+                return "<span class='text-danger'>{$formattedValue}</span>";
+            } else {
+                return "<span>{$formattedValue}</span>";
+            }
+        })->sortable();
+    }
 
 
     /**
@@ -64,7 +86,7 @@ trait GridHelperTrait
      * @param string $label 标签名
      * @return Column
      */
-    public function columnAmount(string $field = 'amount', string $label = '操作金额'): Column
+    public function columnAmount1000(string $field = 'amount', string $label = '操作金额'): Column
     {
         return $this->grid->column($field, $label)->display(function ($value) {
             $formattedValue = number_format($value / 1000, 3);
@@ -111,6 +133,22 @@ trait GridHelperTrait
         })->sortable();
     }
 
+    /**
+     * 添加金额格式化
+     *
+     * 复用价值:高 - 统一处理金额的格式化显示,包括单位转换
+     *
+     * @param string $field 字段名
+     * @param string $label 标签名
+     * @return Column
+     */
+    public function columnMoney(string $field, string $label, ): Column
+    {
+        return $this->grid->column($field, $label)->display(function ($value)  {
+            return number_format($value , 0,',');
+        });
+    }
+
     /**
      * 添加金额格式化列(毫转元)
      *
@@ -121,7 +159,7 @@ trait GridHelperTrait
      * @param int $decimals 小数位数
      * @return Column
      */
-    public function columnMoney(string $field, string $label, int $decimals = 3): Column
+    public function columnMoney1000(string $field, string $label, int $decimals = 3): Column
     {
         return $this->grid->column($field, $label)->display(function ($value) use ($decimals) {
             return number_format($value / 1000, $decimals);

+ 26 - 19
app/Module/Fund/Models/FundLogModel.php

@@ -2,6 +2,9 @@
 
 namespace App\Module\Fund\Models;
 
+use App\Module\Fund\Enums\FUND_TYPE;
+use App\Module\Fund\Enums\LOG_TYPE;
+use App\Module\Fund\Enums\OPERATE_TYPE;
 use App\Module\User\Models\User;
 use App\Module\User\Models\UserInfo;
 use UCore\ModelCore;
@@ -11,26 +14,27 @@ use UCore\ModelCore;
  * App\Module\Fund\Models\FundLogModel
  * 资金日志表
  * field start
- * @property   int  $id
- * @property   int  $user_id  用户ID
- * @property   int  $fund_id  资金id
- * @property   int  $amount  操作金额,正值为收入,负值为支出
- * @property   string  $operate_id  上游操作id
- * @property   string  $operate_type  上游操作类型
- * @property   string  $remark  备注
- * @property   int  $create_time  最后更新时间
- * @property   string  $create_ip  最后更新ip
- * @property   int  $later_balance  在此之后的余额
- * @property   int  $before_balance  在此之前的月
- * @property   int  $date_key  月份key
- * @property   string  $hash  防篡改哈希值
- * @property   string  $prev_hash  上一条记录的哈希值
+ *
+ * @property   int $id
+ * @property   int $user_id  用户ID
+ * @property   int $fund_id  资金id
+ * @property   int $amount  操作金额,正值为收入,负值为支出
+ * @property   string $operate_id  上游操作id
+ * @property   string $operate_type  上游操作类型
+ * @property   string $remark  备注
+ * @property   int $create_time  最后更新时间
+ * @property   string $create_ip  最后更新ip
+ * @property   int $later_balance  在此之后的余额
+ * @property   int $before_balance  在此之前的月
+ * @property   int $date_key  月份key
+ * @property   string $hash  防篡改哈希值
+ * @property   string $prev_hash  上一条记录的哈希值
  * field end
  */
 class FundLogModel extends ModelCore
 {
 
-    protected $table      = 'fund_logs';
+    protected $table = 'fund_logs';
 
     // attrlist start
     protected $fillable = [
@@ -50,10 +54,13 @@ class FundLogModel extends ModelCore
         'prev_hash',
     ];
     // attrlist end
-    public    $timestamps = false;
-
+    public $timestamps = false;
 
 
+    protected $casts = [
+        'fund_id'      => FUND_TYPE::class,
+        'operate_type' => LOG_TYPE::class
+    ];
 
     public function user()
     {
@@ -61,7 +68,6 @@ class FundLogModel extends ModelCore
     }
 
 
-
     /**
      * 生成记录的哈希值
      * SHA-256 输出为 64 位十六进制字符串
@@ -103,8 +109,9 @@ class FundLogModel extends ModelCore
                                     ])->orderBy('id', 'desc')->first();
     }
 
-    public static function addLog($userId,$fundId,$amount,)
+    public static function addLog($userId, $fundId, $amount)
     {
 
     }
+
 }