Просмотр исходного кода

Merge branch 'master' into liuzj-permission-dev

liuzejian 1 год назад
Родитель
Сommit
8f75779204
29 измененных файлов с 1332 добавлено и 115 удалено
  1. 0 24
      .gitee/ISSUE_TEMPLATE.zh-CN.md
  2. 0 25
      .github/issue_template.md
  3. 20 0
      app/Libs/Helpers.php
  4. 184 0
      app/Libs/Pay/Palmpay.php
  5. 35 0
      app/Libs/Pay/PayMerchantInterface.php
  6. 55 3
      modules/Channel/Http/Controllers/OrdersController.php
  7. 15 3
      modules/Channel/Http/Controllers/WechatMinprogramUserController.php
  8. 77 25
      modules/Channel/Services/Order/OrderService.php
  9. 30 9
      modules/Channel/Services/WechatMinprogram/WechatMinprogramUserService.php
  10. 2 1
      modules/Channel/routes/route.php
  11. 65 0
      modules/Jiesuan/Http/Controllers/VerifyBankInfoController.php
  12. 42 0
      modules/Jiesuan/Http/Requests/VerifyCheckRequest.php
  13. 8 8
      modules/Jiesuan/Installer.php
  14. 18 0
      modules/Jiesuan/Models/BankCards.php
  15. 0 1
      modules/Jiesuan/Providers/JiesuanServiceProvider.php
  16. 22 0
      modules/Jiesuan/Services/BaseService.php
  17. 17 3
      modules/Jiesuan/Services/BusinessmanService.php
  18. 108 0
      modules/Jiesuan/Services/VerifyService.php
  19. 8 0
      modules/Jiesuan/routes/route.php
  20. 140 0
      modules/OrderRefund/Http/Controllers/RefundOrderController.php
  21. 59 0
      modules/OrderRefund/Http/Requests/OrderRefundRequest.php
  22. 43 0
      modules/OrderRefund/Http/Requests/RefundVerIiyRequest.php
  23. 33 0
      modules/OrderRefund/Installer.php
  24. 17 0
      modules/OrderRefund/Models/OrdersRefundVerify.php
  25. 20 0
      modules/OrderRefund/Providers/OrderRefundServiceProvider.php
  26. 22 0
      modules/OrderRefund/Services/BaseServices.php
  27. 273 0
      modules/OrderRefund/Services/RefundOrderService.php
  28. 16 0
      modules/OrderRefund/routes/route.php
  29. 3 13
      modules/User/Models/User.php

+ 0 - 24
.gitee/ISSUE_TEMPLATE.zh-CN.md

@@ -1,24 +0,0 @@
-# 环境
-- 操作系统:
-- php 版本:
-- Laravel 版本:
-- Mysql 版本:
-- web 服务器:
-
-# 问题
-- 问题描述:
-- 问题截图:
-
-# 结果
-- 实际结果:
-- 预期结果:
-
-# 分析
-- 所做的尝试:
-    -
-    -
-
-# 方案:
-- 解决方案:
-
-> 请在问题解决后关闭 issue

+ 0 - 25
.github/issue_template.md

@@ -1,25 +0,0 @@
-# 环境
-- 操作系统:
-- php 版本:
-- Laravel 版本:
-- Mysql 版本:
-- web 服务器:
-
-# 问题
-- 问题描述:
-
-- 问题截图:
-
-# 结果
-- 实际结果:
-- 预期结果:
-
-# 分析
-- 所做的尝试:
-    -
-    -
-
-# 方案:
-- 解决方案:
-
-> 请在问题解决后关闭 issue

+ 20 - 0
app/Libs/Helpers.php

@@ -2,6 +2,7 @@
 
 
 
 
 use Illuminate\Http\UploadedFile;
 use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Facades\DB;
 use Modules\Common\Support\Upload\Uploader;
 use Modules\Common\Support\Upload\Uploader;
 use PhpOffice\PhpSpreadsheet\IOFactory;
 use PhpOffice\PhpSpreadsheet\IOFactory;
 use PhpOffice\PhpSpreadsheet\Spreadsheet;
 use PhpOffice\PhpSpreadsheet\Spreadsheet;
@@ -384,3 +385,22 @@ if (!function_exists('getProp')){
         return $result;
         return $result;
     }
     }
 }
 }
+
+/**
+ * 打印sql
+ */
+if (!function_exists('print_sql')) {
+    function print_sql ()
+    {
+        DB::listen(function ($sql) {
+            $singleSql = $sql->sql;
+            if ($sql->bindings) {
+                foreach ($sql->bindings as $replace) {
+                    $value = is_numeric($replace) ? $replace : "'" . $replace . "'";
+                    $singleSql = preg_replace('/\?/', $value, $singleSql, 1);
+                }
+            }
+            myLog('sql-query')->info($singleSql);
+        });
+    }
+}

+ 184 - 0
app/Libs/Pay/Palmpay.php

@@ -0,0 +1,184 @@
+<?php
+
+namespace App\Libs\Pay;
+
+use GuzzleHttp\Client;
+use Exception;
+use Log;
+
+class Palmpay  implements PayMerchantInterface {
+
+    /**
+     * @var mixed
+     */
+    private $appId = '6196';
+    /**
+     * @var mixed
+     */
+    private $mchId = '2132225001';
+    /**
+     * @var mixed
+     */
+    private $appkey = 'a17465d30ad74105a38948b8ce14237e';
+    /**
+     * @var mixed
+     */
+    private $subAppid;
+    /**
+     * @var Client
+     */
+    private $payClient;
+
+    private $log;
+
+    function __construct($config)
+    {
+        $this->subAppid = $config['subAppid'];
+        $this->payClient = new client(['base_uri'=>'https://pay.palmpay.cn/','timeout'=>5]);
+        $this->log = myLog('Palmpay');
+    }
+
+    //生成订单
+    function send(array $data)
+    {
+        $data = [
+            'mchId'=>$this->mchId,
+            'appid'=>$this->appId,
+            'version'=>'3.0',
+            'productName'=>$data['body'],
+            'productDesc'=>$data['body'],
+            'openid'=>$data['openid'],
+            'subAppid'=>$this->subAppid,
+            'ip' => $data['create_ip'],
+            'money'=>$data['price'],
+            'outTradeNo'=>$data['trade_no'],
+            'notifyUrl'=>$data['notify_url']
+        ];
+        $data['sign'] = $this->makeSign($data);
+        $pay_url = "sdkServer/thirdpays/pay/WECHAT_MNPROGRAM?".http_build_query($data);
+        $response = '';
+        try{
+            $response = $this->payClient->request('GET',$pay_url)->getBody()->getContents();
+            $response_object = json_decode($response,1);
+            if(!$response_object['errcode']){
+                $this->log->info('pay-result',$response_object['result']);
+                return $response_object['result'];
+            }
+
+            $this->log->error('palmpay-error',[
+                'data'=>$data,
+                'response'=>$response_object
+            ]);
+            return [];
+        }catch (Exception $e)
+        {
+            $this->log->error('palmpay-exception',[
+                'msg'=>$e->getMessage(),
+                'data'=>$data
+            ]);
+        }
+        return [];
+    }
+
+    function makeSign(array $params)
+    {
+        return md5($params['appid'].'WECHAT_MNPROGRAM'.$params['money'].($params['outTradeNo'] ??"").$this->appkey);
+    }
+
+
+
+    /**
+     * 支付回调
+     * @param array $data
+     */
+    public function notify(array $data)
+    {
+        $this->log->info('pay-notify',$data);
+        $sign = $data['sign'];
+        $my_sign = $this->signCheck($data,$this->appkey);
+        $this->log->info('pay-notify',[
+            'sign'=>$sign,
+            'my_sign'
+        ]);
+        return $sign == $my_sign;
+    }
+
+    /**
+     * 订单查询
+     * @param string $trade_no 商户订单号
+     * @return bool
+     */
+    public function query(string $trade_no)
+    {
+
+    }
+
+    /**
+     * 退款申请
+     * @param array $data
+     * $data = [
+     *  'third_orderid' => "", // 商户订单号
+     * 'price' =>  "", // 总金额,以元为单位
+     * 'refund_no' =>  '' , // 商户系统内部的退款单号,确保在商户系统下唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
+     * 'refund_price' =》 '', //退款总金额,单位为元,可部分退款
+     * 'remark' =>  '' // 备注
+     * ]
+     */
+    public function refund( $data)
+    {
+        $data = [
+            'mchId'=>$this->mchId,
+            'appid'=>$this->appId,
+            'version'=>'3.0',
+            'pdorderid' => $data['third_orderid'],
+            'money' =>  bcmul($data['price'] ,100,0),
+            'outRefundNo' => $data['refund_no'],
+            'refundMoney' => bcmul($data['refund_price'],100,0) ,
+            "refundReason" => $data['remark'] ?? "用户要求退款",
+        ];
+        $data['sign'] = $this->makeRefundSign($data);
+        $pay_url = "sdkServer/thirdpays/refund?".http_build_query($data);
+        $response = '';
+        try{
+            $response = $this->payClient->request('GET',$pay_url)->getBody()->getContents();
+            $response_object = json_decode($response,1);
+
+            if(!$response_object['resultCode']){
+                $this->log->info('refund-result',$response_object['result']);
+                return ['status' => 1,"退款成功"];
+            }
+
+            $this->log->error('refund-error',[
+                'data'=>$data,
+                'response'=>$response_object
+            ]);
+            return ['status' => 0,'msg' => $response_object['message'] ??"接口退款失败" ];
+        }catch (Exception $e)
+        {
+            $this->log->error('refund-exception',[
+                'msg'=>$e->getMessage(),
+                'data'=>$data
+            ]);
+        }
+        return ['status' => 0,'msg' => "退款失败"];
+    }
+
+
+
+    private function signCheck($params, $key) {
+        $signPars = "";
+        ksort($params);
+        foreach($params as $k => $v) {
+            if("" != $v && "sign" != $k) {
+                $signPars .= $k . "=" . $v . "&";
+            }
+        }
+        $signPars .= "key=".$key;
+        return md5($signPars);
+    }
+
+    private function makeRefundSign(array $data)
+    {
+       return md5($data['mchId'].$data['appid'].$data['pdorderid'].$data['money'].$data['version'].$data['outRefundNo'].$data['refundMoney'].$this->appkey);
+    }
+}

+ 35 - 0
app/Libs/Pay/PayMerchantInterface.php

@@ -0,0 +1,35 @@
+<?php
+namespace App\Libs\Pay;
+
+
+interface PayMerchantInterface
+{
+    /**
+     * 支付下单
+     * @param array $data 
+     */
+    public function send(array $data);
+    /**
+     * 支付回调
+     * @param array $data 
+     */
+    public function notify(array $data);
+    /**
+     * 订单查询
+     * @param string $trade_no 商户订单号
+     * @return bool 
+     */
+    public function query(string $trade_no);
+
+    /**
+     * 退款申请
+     * @param array $data 
+     */
+    public function refund(array $data);
+
+    /**
+     * 生成签名
+     * @param array $data 
+     */
+    public function makeSign(array $data);
+}

+ 55 - 3
modules/Channel/Http/Controllers/OrdersController.php

@@ -31,7 +31,12 @@ class OrdersController extends CatchController
     {
     {
         $param = $request->all();
         $param = $request->all();
         $userContext = $this->getUserContext(null);
         $userContext = $this->getUserContext(null);
-
+        if (getProp($param, 'puser_id')) {
+            $param['puser_id'] = $param['puser_id'];
+        }
+        if (getProp($param, 'user_id')) {
+            $param['user_id'] = $param['user_id'];
+        }
         // 公司账户处理
         // 公司账户处理
         if ($userContext['loginUserRoles']->contains('company')) {
         if ($userContext['loginUserRoles']->contains('company')) {
             $param['puser_id'] = $userContext['operateUser']->id;
             $param['puser_id'] = $userContext['operateUser']->id;
@@ -71,25 +76,72 @@ class OrdersController extends CatchController
         if (!$uid) {
         if (!$uid) {
             $uid = $this->getCurrentUser()->id;
             $uid = $this->getCurrentUser()->id;
         }
         }
+        $name = $request->input("name", "");
+        $limit =  $request->input("limit", 20);
+        return OrderService::userUseProgramsList($uid,$name,$limit);
+    }
+
+    /**
+     *  订单优化师列选择项
+     * name: promotionsUsers
+     * @param Request $request
+     * date 2023/05/26 09:12
+     */
+    public function promotionsUsers(Request $request){
 
 
-        return OrderService::userUseProgramsList($uid);
+        $name = $request->input('name');
+        $pid = $request->input('user_id');
+        $limit = $request->input('limit',20);
+        $miniprogram_id = $request->input('miniprogram_id',0);
+        $userContext = $this->getUserContext(null);
+        // 公司账户处理
+        if ($userContext['loginUserRoles']->contains('company')) {
+            $pid = $userContext['operateUser']->id;
+        }
+
+        // 投手处理
+        if ($userContext['loginUserRoles']->contains('optimizer')) {
+            return [['user_id' => $userContext['operateUser']->id,'name' => $userContext['operateUser']->username]];
+        }
+        return  OrderService::promotionsUsers($pid,$name,$miniprogram_id,$limit);
     }
     }
 
 
+    /**
+     *  订单列表推广选择项
+     * name: promotionsOptions
+     * @param Request $request
+     * @return \Illuminate\Support\Collection
+     * date 2023/05/26 15:42
+     */
     public function promotionsOptions(Request $request)
     public function promotionsOptions(Request $request)
     {
     {
         $title = $request->input('name');
         $title = $request->input('name');
         $uid = $request->input("user_id", 0);
         $uid = $request->input("user_id", 0);
+        $miniprogram_id = $request->input('miniprogram_id',0);
         if (!$uid) {
         if (!$uid) {
             $uid = $this->getCurrentUser()->id;
             $uid = $this->getCurrentUser()->id;
         }
         }
-        return OrderService::promotionsOptions($uid, $title);
+        $limit =  $request->input("limit", 20);
+        return OrderService::promotionsOptions($uid, $title,$miniprogram_id,$limit);
     }
     }
 
 
+    /**
+     *  订单充值类型选择项
+     * name: orderTypes
+     * @return \string[][]
+     * date 2023/05/26 15:43
+     */
     public function orderTypes()
     public function orderTypes()
     {
     {
         return OrderService::getOrderType();
         return OrderService::getOrderType();
     }
     }
 
 
+    /**
+     *  订单支付状态现在项
+     * name: orderStatus
+     * @return \string[][]
+     * date 2023/05/26 15:43
+     */
     public function orderStatus()
     public function orderStatus()
     {
     {
         return OrderService::getOrderPayType();
         return OrderService::getOrderPayType();

+ 15 - 3
modules/Channel/Http/Controllers/WechatMinprogramUserController.php

@@ -13,10 +13,11 @@ use Catch\Base\CatchController;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
 use Catch\Exceptions\FailedException;
 use Catch\Exceptions\FailedException;
 use Modules\Channel\Services\WechatMinprogram\WechatMinprogramUserService;
 use Modules\Channel\Services\WechatMinprogram\WechatMinprogramUserService;
+use Modules\User\Http\Controllers\UserTrait;
 
 
 class WechatMinprogramUserController extends CatchController
 class WechatMinprogramUserController extends CatchController
 {
 {
-
+    use UserTrait;
     /***
     /***
      *  获取用户信息
      *  获取用户信息
      * name: userInfoDetail
      * name: userInfoDetail
@@ -45,12 +46,23 @@ class WechatMinprogramUserController extends CatchController
      */
      */
     public function orderList(Request $request)
     public function orderList(Request $request)
     {
     {
+        $param = $request->all();
         $uid = $request->input('uid');
         $uid = $request->input('uid');
         if ($uid <  1){
         if ($uid <  1){
             $this->errorMsg("用户参数必填");
             $this->errorMsg("用户参数必填");
         }
         }
+        $userContext = $this->getUserContext(null);
+        // 公司账户处理
+        if ($userContext['loginUserRoles']->contains('company')) {
+            $param['puser_id'] = $userContext['operateUser']->id;
+        }
+
+        // 投手处理
+        if ($userContext['loginUserRoles']->contains('optimizer')) {
+            $param['user_id'] = $userContext['operateUser']->id;
+        }
 
 
-        return WechatMinprogramUserService::getUserOrderList($uid);
+        return WechatMinprogramUserService::getUserOrderList($uid,$param);
 
 
     }
     }
 
 
@@ -83,7 +95,7 @@ class WechatMinprogramUserController extends CatchController
         if ($uid <  1){
         if ($uid <  1){
             $this->errorMsg("用户参数必填");
             $this->errorMsg("用户参数必填");
         }
         }
-        return  WechatMinprogramUserService::getUserConsumeRecord($uid);
+        return  WechatMinprogramUserService::getUserConsumeRecord($uid,$request->input('limit',15));
     }
     }
 
 
     protected function errorMsg($msg,$code = 10005){
     protected function errorMsg($msg,$code = 10005){

+ 77 - 25
modules/Channel/Services/Order/OrderService.php

@@ -35,16 +35,17 @@ class OrderService
         }
         }
 
 
         if (!$list->isEmpty()) {
         if (!$list->isEmpty()) {
-            $status = array_column(self::getOrderPayType(),null,'value');
-            $types = array_column(self::getOrderType(),null,'value');
+            $status = array_column(self::getOrderPayType(), null, 'value');
+            $types = array_column(self::getOrderType(), null, 'value');
             foreach ($list as $val) {
             foreach ($list as $val) {
                 $val->username = $val->user_id > 0 ? User::where('id', $val->user_id)->value('username') : "";
                 $val->username = $val->user_id > 0 ? User::where('id', $val->user_id)->value('username') : "";
                 $val->company_name = "-";
                 $val->company_name = "-";
                 $val->play_name = '-';
                 $val->play_name = '-';
                 $company = Miniprogram::where('id', $val->miniprogram_id)->first();
                 $company = Miniprogram::where('id', $val->miniprogram_id)->first();
                 if ($company) {
                 if ($company) {
-                    $val->company_name = $company->company();
+                    $val->company_name = $val->puser_id >  0 ? $company->company() : "-";
                     $val->play_name = $company->play_name;
                     $val->play_name = $company->play_name;
+                    $val->xcx_name = $company->name;
                 }
                 }
                 $val->promotion_title = $val->promotion_id > 0 ? DB::table('promotions')->where('id', $val->promotion_id)->value('name') : "";
                 $val->promotion_title = $val->promotion_id > 0 ? DB::table('promotions')->where('id', $val->promotion_id)->value('name') : "";
                 $val->total_count = Order::where('uid', $val->uid)->where('id', "<=", $val->id)->count();
                 $val->total_count = Order::where('uid', $val->uid)->where('id', "<=", $val->id)->count();
@@ -55,7 +56,7 @@ class OrderService
                     $val->caompany_count = Order::where('uid', $val->uid)->where('puser_id', '>', 0)->count();
                     $val->caompany_count = Order::where('uid', $val->uid)->where('puser_id', '>', 0)->count();
                     $val->promotion_count = Order::where('uid', $val->uid)->where('user_id', '>', 0)->count();
                     $val->promotion_count = Order::where('uid', $val->uid)->where('user_id', '>', 0)->count();
                 }
                 }
-                $val->tip_text =  $types[$val->order_type]['name']?? "-";
+                $val->tip_text = $types[$val->order_type]['name'] ?? "-";
                 $val->status_txt = $status[$val->status]['name'] ?? "-";
                 $val->status_txt = $status[$val->status]['name'] ?? "-";
                 $val->pay_name = '微信支付';
                 $val->pay_name = '微信支付';
             }
             }
@@ -67,20 +68,20 @@ class OrderService
     public static function getOrderType()
     public static function getOrderType()
     {
     {
         return [
         return [
-            ["value" => "COIN","name" => "普通充值"],
-            ["value" => 'MONTH',"name" => '包月'],
-            ["value" => 'QUARTER' ,"name"=> '包季'],
-            ["value" => 'YEAR' ,"name"=> '包年'],
-            ["value" => "FIRST_COIN" ,"name" => "首充"]
+            ["value" => "COIN", "name" => "普通充值"],
+            ["value" => 'MONTH', "name" => '包月'],
+            ["value" => 'QUARTER', "name" => '包季'],
+            ["value" => 'YEAR', "name" => '包年'],
+            ["value" => "FIRST_COIN", "name" => "首充"]
         ];
         ];
     }
     }
 
 
     public static function getOrderPayType()
     public static function getOrderPayType()
     {
     {
         return [
         return [
-            ["value" => "PAID","name" => "已支付"],
-            ["value" =>'REFUND',"name" => '已退款'],
-            ["value" =>'UNPAID' ,"name"=> '未支付'],
+            ["value" => "PAID", "name" => "已支付"],
+            ["value" => 'REFUND', "name" => '已退款'],
+            ["value" => 'UNPAID', "name" => '未支付'],
         ];
         ];
     }
     }
 
 
@@ -151,20 +152,26 @@ class OrderService
      * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection
      * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection
      * date 2023/05/23 17:51
      * date 2023/05/23 17:51
      */
      */
-    public static function userUseProgramsList(mixed $uid)
+    public static function userUseProgramsList(mixed $uid, $name = "", $limit = 20)
     {
     {
 
 
         $operateUser = User::find($uid);
         $operateUser = User::find($uid);
         $operateUserRoles = $operateUser->roles->pluck('identify');
         $operateUserRoles = $operateUser->roles->pluck('identify');
-
         if ($operateUserRoles->contains('company') || $operateUserRoles->contains('optimizer')) {
         if ($operateUserRoles->contains('company') || $operateUserRoles->contains('optimizer')) {
-            return UserHasMiniprograms::query()->join('miniprogram', 'miniprogram.id', '=', 'user_has_miniprograms.miniprogram_id')
+            $list = UserHasMiniprograms::query()->join('miniprogram', 'miniprogram.id', '=', 'user_has_miniprograms.miniprogram_id')
                 ->where('uid', $uid)
                 ->where('uid', $uid)
                 ->groupBy("user_has_miniprograms.miniprogram_id")
                 ->groupBy("user_has_miniprograms.miniprogram_id")
-                ->select('user_has_miniprograms.miniprogram_id', 'miniprogram.name', 'miniprogram.play_name')
-                ->get();
+                ->select('user_has_miniprograms.miniprogram_id', 'miniprogram.name', 'miniprogram.play_name');
+            if ($name) {
+                $list->where('name', "like", "%" . $name . "%");
+            }
+            return $list->orderBy('miniprogram.id', 'desc')->limit($limit)->get();
         } else {
         } else {
-            return DB::table('miniprogram')->select("id as miniprogram_id", "name", "play_name")->get();
+            if ($name) {
+                return DB::table('miniprogram')->where('name', "like", "%" . $name . "%")->select("id as miniprogram_id", "name", "play_name")->limit($limit)->get();
+            }
+            return DB::table('miniprogram')->select("id as miniprogram_id", "name", "play_name")->orderBy('id', 'desc')->limit($limit)->get();
+
         }
         }
 
 
     }
     }
@@ -177,29 +184,74 @@ class OrderService
      * @return \Illuminate\Support\Collection
      * @return \Illuminate\Support\Collection
      * date 2023/05/23 18:13
      * date 2023/05/23 18:13
      */
      */
-    public static function promotionsOptions(mixed $uid, mixed $title)
+    public static function promotionsOptions(mixed $uid, mixed $title,mixed $miniprogram_id,mixed $limit = 10)
     {
     {
         $operateUser = User::find($uid);
         $operateUser = User::find($uid);
         $operateUserRoles = $operateUser->roles->pluck('identify');
         $operateUserRoles = $operateUser->roles->pluck('identify');
-        $list = DB::table('promotions')->select('id as promotion_id ', 'name');
+        $list = DB::table('promotions')->select('id as promotion_id', 'name');
         if ($operateUserRoles->contains('optimizer')) {
         if ($operateUserRoles->contains('optimizer')) {
+            if ($miniprogram_id){
+                $list->where('miniprogram_id',$miniprogram_id);
+            }
             if ($title) {
             if ($title) {
                 $list->where('name', 'like', "%" . $title . "%");
                 $list->where('name', 'like', "%" . $title . "%");
             }
             }
-            return $list->where('uid', $uid)->get();
+
+            return $list->where('uid', $uid)->orderBy('id', 'desc')->limit($limit)->get();
         } else if ($operateUserRoles->contains('company')) {
         } else if ($operateUserRoles->contains('company')) {
-            $list  =  DB::table('promotions')->join('users','users.id',"promotions.uid")
-                ->where('users.pid',$uid)->orWhere("promotions.uid",$uid)->select("promotions.id as promotion_id ", 'promotions.name');
+            $list = DB::table('promotions')->join('users', 'users.id', "promotions.uid")
+                ->where('users.pid', $uid)->orWhere("promotions.uid", $uid)->select('promotions.id as promotion_id', 'promotions.name');
             if ($title) {
             if ($title) {
                 $list->where('promotions.name', 'like', "%" . $title . "%");
                 $list->where('promotions.name', 'like', "%" . $title . "%");
             }
             }
-            return $list->get();
+            if ($miniprogram_id){
+                $list->where('promotions.miniprogram_id',$miniprogram_id);
+            }
+            return $list->orderBy('promotions.id','desc')->limit($limit)->get();
 
 
         } else {
         } else {
+            if ($miniprogram_id){
+                $list->where('miniprogram_id',$miniprogram_id);
+            }
             if ($title) {
             if ($title) {
                 $list->where('name', 'like', "%" . $title . "%");
                 $list->where('name', 'like', "%" . $title . "%");
             }
             }
-            return $list->get();
+            return $list->orderBy('id', 'desc')->limit($limit)->get();
+        }
+    }
+
+    /***
+     * 订单列表优化师选择项
+     * name: promotionsUsers
+     * @param mixed $pid
+     * @param mixed $name
+     * @param mixed $limit
+     * date 2023/05/26 09:22
+     */
+    public static function promotionsUsers(mixed $pid, mixed $name,mixed $miniprogram_id, mixed $limit = 10)
+    {
+        if ($pid > 0) {
+            $list = DB::table('users')->where('pid', $pid)->select('users.id as user_id', 'users.username as  name');
+            if ($name) {
+                $list->where('username', 'like', "%" . $name . "%");
+            }
+            if ($miniprogram_id >  0){
+                $list->join('user_has_miniprograms','user_has_miniprograms.uid','users.id')
+                    ->where('user_has_miniprograms.miniprogram_id',$miniprogram_id);
+            }
+
+            return $list->orderBy('users.id', 'desc')->limit($limit)->get();
+        }
+
+        $list = DB::table('users')->join('user_has_roles','users.id',"user_has_roles.user_id")->join('roles','roles.id','user_has_roles.role_id')
+            ->select('users.id as user_id', 'users.username as  name')->where('roles.identify','optimizer');
+        if ($miniprogram_id >  0){
+            $list->join('user_has_miniprograms','user_has_miniprograms.uid','users.id')
+                ->where('user_has_miniprograms.miniprogram_id',$miniprogram_id);
+        }
+        if ($name){
+            $list->where('users.username', 'like', "%" . $name . "%");
         }
         }
+        return $list->orderBy('users.id', 'desc')->limit($limit)->get();
     }
     }
 }
 }

+ 30 - 9
modules/Channel/Services/WechatMinprogram/WechatMinprogramUserService.php

@@ -10,13 +10,11 @@
 namespace Modules\Channel\Services\WechatMinprogram;
 namespace Modules\Channel\Services\WechatMinprogram;
 
 
 use Carbon\Carbon;
 use Carbon\Carbon;
-use Illuminate\Pagination\LengthAwarePaginator;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Redis;
 use Illuminate\Support\Facades\Redis;
 use Illuminate\Support\Str;
 use Illuminate\Support\Str;
 use Modules\Channel\Models\MiniprogramUserVip;
 use Modules\Channel\Models\MiniprogramUserVip;
 use Modules\Channel\Models\Order;
 use Modules\Channel\Models\Order;
-use Modules\Channel\Models\UidLogs;
 use Modules\Channel\Models\Videos;
 use Modules\Channel\Models\Videos;
 use Modules\Channel\Models\VideoSeries;
 use Modules\Channel\Models\VideoSeries;
 use Modules\Manage\Models\Miniprogram;
 use Modules\Manage\Models\Miniprogram;
@@ -53,6 +51,13 @@ class WechatMinprogramUserService
 
 
     }
     }
 
 
+    /**
+     *  用户等级文字
+     * name: getLevelText
+     * @param $uid
+     * @return array
+     * date 2023/05/26 15:41
+     */
     private static function getLevelText($uid)
     private static function getLevelText($uid)
     {
     {
         $record = self::userVipRecord($uid);
         $record = self::userVipRecord($uid);
@@ -83,7 +88,7 @@ class WechatMinprogramUserService
      * @param int $uid
      * @param int $uid
      * date 2023/05/19 14:57
      * date 2023/05/19 14:57
      */
      */
-    public static function getUserOrderList(int $uid)
+    public static function getUserOrderList(int $uid, $param)
     {
     {
         $pool = [
         $pool = [
             'MONTH' => '包月',
             'MONTH' => '包月',
@@ -93,16 +98,23 @@ class WechatMinprogramUserService
         $list = Order::join('pay_products', 'pay_products.id', '=', 'orders.pay_product_id')
         $list = Order::join('pay_products', 'pay_products.id', '=', 'orders.pay_product_id')
             ->select('orders.price', 'orders.trade_no', "orders.video_id", 'orders.pay_end_at', 'pay_products.type', 'pay_products.price as product_price', 'pay_products.given')
             ->select('orders.price', 'orders.trade_no', "orders.video_id", 'orders.pay_end_at', 'pay_products.type', 'pay_products.price as product_price', 'pay_products.given')
             ->where('orders.status', 'PAID')
             ->where('orders.status', 'PAID')
-            ->where('orders.uid', $uid)
-            ->orderBy('orders.id', 'desc')
-            ->paginate(15);
+            ->where('orders.uid', $uid);
+        if (getProp($param, 'puser_id', 0) > 0) {
+            $list->where('orders.puser_id', $param['puser_id']);
+        }
+        if (getProp($param, 'user_id', 0) > 0) {
+            $list->where('orders.user_id', $param['user_id']);
+        }
+
+        $list = $list->orderBy('orders.id', 'desc')
+            ->paginate(getProp($param,'limit',15));
 
 
         foreach ($list as $item) {
         foreach ($list as $item) {
             $item->pay_name = '微信支付';
             $item->pay_name = '微信支付';
             $item->status = '已完成';
             $item->status = '已完成';
             if ($item->type == 'COIN') {
             if ($item->type == 'COIN') {
                 $item->rechare_coin = $item->product_price * 100;
                 $item->rechare_coin = $item->product_price * 100;
-                $item->pay_result = $item->product_price * 100 + $item->given;
+                $item->pay_result =- $item->product_price * 100 + $item->given;
             } elseif (isset($pool[$item->type])) {
             } elseif (isset($pool[$item->type])) {
                 $item->rechare_coin = "-";
                 $item->rechare_coin = "-";
                 $item->pay_result = $pool[$item->type];
                 $item->pay_result = $pool[$item->type];
@@ -136,6 +148,7 @@ class WechatMinprogramUserService
             $info = explode('_', $watch_info);
             $info = explode('_', $watch_info);
             $result[] = [
             $result[] = [
                 'video_id' => $video_id,
                 'video_id' => $video_id,
+                "video_name" =>  Videos::where('id',$video_id)->value('name'),
                 'video_series_sequence' => $info[0],
                 'video_series_sequence' => $info[0],
                 'watch_at' => get_date($info[1]),
                 'watch_at' => get_date($info[1]),
                 'watch_time' => $info[1]
                 'watch_time' => $info[1]
@@ -148,10 +161,18 @@ class WechatMinprogramUserService
         return $result;
         return $result;
     }
     }
 
 
-    public static function getUserConsumeRecord(mixed $uid)
+    /***
+     *  用户消费记录
+     * name: getUserConsumeRecord
+     * @param mixed $uid
+     * @param int $limit
+     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
+     * date 2023/05/26 15:40
+     */
+    public static function getUserConsumeRecord(mixed $uid,$limit = 15)
     {
     {
         $tableName = 'coin_cost_record_' . ($uid % 8);
         $tableName = 'coin_cost_record_' . ($uid % 8);
-        $result = DB::table($tableName)->where('uid', $uid)->orderBy('id', 'desc')->paginate();
+        $result = DB::table($tableName)->where('uid', $uid)->orderBy('id', 'desc')->paginate($limit);
         foreach ($result as $item) {
         foreach ($result as $item) {
             $item->series_name = VideoSeries::where('video_id', $item->video_id)->where('series_sequence', $item->sequence)->select('series_name')->first()->series_name;
             $item->series_name = VideoSeries::where('video_id', $item->video_id)->where('series_sequence', $item->sequence)->select('series_name')->first()->series_name;
             $item->video_name = Videos::where('id', $item->video_id)->value('name');
             $item->video_name = Videos::where('id', $item->video_id)->value('name');

+ 2 - 1
modules/Channel/routes/route.php

@@ -42,6 +42,7 @@ Route::prefix('channel')->group(function () {
     Route::any("order_types",[\Modules\Channel\Http\Controllers\OrdersController::class,'orderTypes']);
     Route::any("order_types",[\Modules\Channel\Http\Controllers\OrdersController::class,'orderTypes']);
     Route::any("order_status",[\Modules\Channel\Http\Controllers\OrdersController::class,'orderStatus']);
     Route::any("order_status",[\Modules\Channel\Http\Controllers\OrdersController::class,'orderStatus']);
     Route::any('promotions/options', [\Modules\Channel\Http\Controllers\OrdersController::class, 'promotionsOptions']);
     Route::any('promotions/options', [\Modules\Channel\Http\Controllers\OrdersController::class, 'promotionsOptions']);
-
+    Route::any('miniprogram/use_list', [\Modules\Channel\Http\Controllers\OrdersController::class, 'userUseList']);
+    Route::any('promotions/users', [\Modules\Channel\Http\Controllers\OrdersController::class, 'promotionsUsers']);
 });
 });
 
 

+ 65 - 0
modules/Jiesuan/Http/Controllers/VerifyBankInfoController.php

@@ -0,0 +1,65 @@
+<?php
+/**
+ *
+ * @file:VerifyBankInfoController.php
+ * @Date: 2023/5/25
+ * @Time: 18:14
+ */
+
+
+namespace Modules\Jiesuan\Http\Controllers;
+
+use Catch\Base\CatchController;
+
+use Catch\Exceptions\FailedException;
+use Illuminate\Http\Request;
+use Modules\Jiesuan\Http\Requests\VerifyCheckRequest;
+use Modules\Jiesuan\Services\BusinessmanService;
+use Modules\Jiesuan\Services\VerifyService;
+use Modules\User\Http\Controllers\UserTrait;
+
+class VerifyBankInfoController extends CatchController
+{
+    use UserTrait;
+
+    public function list(Request $request)
+    {
+        $isAll = $request->input('is_all', false);
+        $param = $request->all();
+
+        return VerifyService::verifyList($param, $isAll);
+    }
+
+    /**
+     *  商务列表选择项
+     * name: businessOption
+     * @param Request $request
+     * @return \Illuminate\Support\Collection
+     * date 2023/05/30 09:54
+     */
+    public function businessOption(Request $request)
+    {
+        return BusinessmanService::list($request->all());
+    }
+
+    public function check(VerifyCheckRequest $request)
+    {
+        $userContext = $this->getUserContext(null);
+        if (!$userContext['loginUserRoles']->contains('administrator')) {
+            throw  new  FailedException("没有操作权限");
+        }
+        $param = [
+            'status' => $request->input('status'),
+            'checked_user' => [
+                "id"=> $userContext['loginUser']->id,
+                "user_name"=> $userContext['loginUser']->username,
+                "email"=> $userContext['loginUser']->email,
+            ],
+            'checked_at' => get_date(),
+            'remark' => $request->input('remark',"")
+        ];
+
+        return VerifyService::checkBankInfo($request->input("id"),$param);
+    }
+
+}

+ 42 - 0
modules/Jiesuan/Http/Requests/VerifyCheckRequest.php

@@ -0,0 +1,42 @@
+<?php
+/**
+ *
+ * @file:VerifyCheckRequest.php
+ * @Date: 2023/5/30
+ * @Time: 14:02
+ */
+
+
+namespace Modules\Jiesuan\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class VerifyCheckRequest extends FormRequest
+{
+    /**
+     * rules
+     *
+     * @return array
+     */
+    public function rules(): array
+    {
+        return [
+            'id' => [ 'required', 'Integer', "gt:0", ],
+            'status' => [ 'required','Integer', "in:2,3"]
+        ];
+    }
+
+    /**
+     * messages
+     *
+     * @return string[]
+     */
+    public function messages(): array
+    {
+        return [
+            'refund_id.required' => '审核信息id必填',
+            'refund_id' => '审核信息id',
+            'status' => '审核状态不正确',
+        ];
+    }
+}

+ 8 - 8
modules/Jiesuan/Installer.php

@@ -1,9 +1,9 @@
 <?php
 <?php
 
 
-namespace Modules\ContentManage;
+namespace Modules\Jiesuan;
 
 
 use Catch\Support\Module\Installer as ModuleInstaller;
 use Catch\Support\Module\Installer as ModuleInstaller;
-use Modules\ContentManage\Providers\ContentManageServiceProvider;
+use Modules\Jiesuan\Providers\JiesuanServiceProvider;
 
 
 class Installer extends ModuleInstaller
 class Installer extends ModuleInstaller
 {
 {
@@ -11,12 +11,12 @@ class Installer extends ModuleInstaller
     {
     {
         // TODO: Implement info() method.
         // TODO: Implement info() method.
         return [
         return [
-            'title' => '内容中台',
-            'name' => 'contentManage',
-            'path' => 'contentManage',
-            'keywords' => '内容中台',
-            'description' => '内容中台管理模块',
-            'provider' => ContentManageServiceProvider::class
+            'title' => '结算管理',
+            'name' => 'jiesuan',
+            'path' => 'jiesuan',
+            'keywords' => '结算管理',
+            'description' => '结算管理模块',
+            'provider' => JiesuanServiceProvider::class
         ];
         ];
     }
     }
 
 

+ 18 - 0
modules/Jiesuan/Models/BankCards.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace Modules\Jiesuan\Models;
+
+use Modules\Common\Models\BaseModel;
+
+
+class BankCards extends BaseModel
+{
+    protected $table = 'bank_cards';
+
+    protected $fillable = [
+        'id', 'owner_name', 'name_of_payee', 'card_no', 'bank_name', 'sub_bank_name', 'phone_of_payee', 'business_id', 'status', 'remark', 'checked_at', 'created_at', 'updated_at', 'company_uid','checked_user'
+
+    ];
+
+    protected $casts = ['checked_user'=> 'array'];
+}

+ 0 - 1
modules/Jiesuan/Providers/JiesuanServiceProvider.php

@@ -4,7 +4,6 @@ namespace Modules\Jiesuan\Providers;
 
 
 use Catch\CatchAdmin;
 use Catch\CatchAdmin;
 use Catch\Providers\CatchModuleServiceProvider;
 use Catch\Providers\CatchModuleServiceProvider;
-use Modules\ContentManage\Middlewares\ContentManageGate;
 
 
 class JiesuanServiceProvider extends CatchModuleServiceProvider
 class JiesuanServiceProvider extends CatchModuleServiceProvider
 {
 {

+ 22 - 0
modules/Jiesuan/Services/BaseService.php

@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * @file:BaseService.php
+ * @Date: 2023/5/30
+ * @Time: 10:13
+ */
+
+
+namespace Modules\Jiesuan\Services;
+
+use Catch\Exceptions\FailedException;
+
+class BaseService
+{
+    protected static  function  throwErrMsg($msg,$code = ""){
+        if ($code){
+            throw  new FailedException($msg,$code);
+        }
+        throw  new FailedException($msg);
+    }
+}

+ 17 - 3
modules/Jiesuan/Services/BusinessmanService.php

@@ -6,14 +6,28 @@ use Illuminate\Support\Facades\DB;
 
 
 class BusinessmanService
 class BusinessmanService
 {
 {
-    public static function list() {
-        return DB::table('users')
+    /**
+     *  商务列表
+     * name: list
+     * @param array $param
+     * @return \Illuminate\Support\Collection
+     * date 2023/05/30 10:01
+     */
+    public static function list($param = []) {
+        $list = DB::table('users')
             ->join('user_has_roles', 'users.id', 'user_has_roles.user_id')
             ->join('user_has_roles', 'users.id', 'user_has_roles.user_id')
             ->join('roles', 'user_has_roles.role_id', 'roles.id')
             ->join('roles', 'user_has_roles.role_id', 'roles.id')
             ->where([
             ->where([
                 'roles.identify' => 'business',
                 'roles.identify' => 'business',
                 'users.status' => 1,
                 'users.status' => 1,
-            ])->select('users.id', 'users.username', 'users.email')
+            ]);
+        if (getProp($param,'name','')){
+            $list->where('users.username','like',"%".$param['name']."%");
+        }
+        if (getProp($param,'id',0)){
+            $list->where('users.id',$param['id']);
+        }
+        return $list->select('users.id', 'users.username', 'users.email')
             ->get();
             ->get();
     }
     }
 }
 }

+ 108 - 0
modules/Jiesuan/Services/VerifyService.php

@@ -0,0 +1,108 @@
+<?php
+/**
+ *
+ * @file:VerifyService.php
+ * @Date: 2023/5/30
+ * @Time: 10:12
+ */
+
+
+namespace Modules\Jiesuan\Services;
+
+use Modules\Jiesuan\Models\BankCards;
+
+class VerifyService extends BaseService
+{
+
+    /**
+     *  审核列表
+     * name: verifyList
+     * @param array $param
+     * date 2023/05/30 10:15
+     */
+    public static function verifyList(array $param = [], $isAll = false)
+    {
+        $list = self::QuerySql($param);
+        $list->select('bank_cards.id', 'bank_cards.owner_name', 'bank_cards.name_of_payee', 'bank_cards.status', 'bank_cards.card_no', 'bank_cards.bank_name', 'bank_cards.phone_of_payee', 'bank_cards.bank_name', 'bank_cards.remark', 'bank_cards.created_at', 'bank_cards.checked_at', 'bank_cards.company_uid', 'users.username as business_name');
+        if ($isAll) {
+            $list = $list->get();
+        } else {
+            $list = $list->paginate(getProp($param, 'limit', 10));
+        }
+        if (!$list->isEmpty()) {
+            foreach ($list as $val) {
+                $val->status_text = ConstService::BANK_CARD_CHECK_STATUS[$val->status] ?? "-";
+            }
+        }
+        return $list;
+    }
+
+
+    private static function QuerySql(array $param)
+    {
+        $sql = BankCards::query()->leftJoin('users', 'users.id', '=', 'bank_cards.business_id');
+        if (getProp($param, 'status', 1) == 1) {
+            $sql->where('bank_cards.status', '=', 1);
+        } else {
+            $sql->where('bank_cards.status', '>', 1);
+        }
+
+        // 商户名称
+        if (getProp($param, 'owner_name', '')) {
+            $sql->where('bank_cards.owner_name', "like", "%{$param['owner_name']}%");
+        }
+        // 商务
+        if (getProp($param, 'bank_cards.business_id', 0)) {
+            $sql->where('bank_cards.business_id', $param['business_id']);
+        }
+        // 创建时间
+        if (getProp($param, 'created_at_start')) {
+            $sql->where('bank_cards.created_at', '>=', $param['created_at_start']);
+        }
+        if (getProp($param, 'created_at_end')) {
+            $sql->where('bank_cards.created_at', "<=", $param['created_at_end']);
+        }
+        // 审核时间
+        if (getProp($param, 'checked_at_start')) {
+            $sql->where('bank_cards.checked_at', '>=', $param['checked_at_start']);
+        }
+        if (getProp($param, 'checked_at_end')) {
+            $sql->where('bank_cards.checked_at', "<=", $param['checked_at_end']);
+        }
+        return $sql;
+    }
+
+    /**
+     *  更新银行卡审核信息
+     * name: checkBankInfo
+     * @param mixed $id
+     * @param array $param
+     * $param = [
+     * 'status' => 2,
+     * 'checked_user' => [ // 审核人信息
+     *      "id"=>1,
+     *      "user_name"=>, //
+     *      "email"=>
+     *      ];
+     *     'checked_at' => '2023-02-02 09:28:56' // 审核时间
+     *     'remark' =>  '' // 备注
+     *
+     * ];
+     * date 2023/05/30 14:19
+     */
+    public static function checkBankInfo(mixed $id, array $param)
+    {
+        $info = BankCards::where('id', $id)->where('status', '>', 0)->first();
+        if (empty($info)) {
+            self::throwErrMsg("银行卡信息不存在或已删除,请刷新重试!");
+        }
+        if ($info['status'] != 1) {
+            self::throwErrMsg("改收款信息已审核,无需再次审核");
+        }
+        $res = BankCards::where('id', $id)->update($param);
+        if ($res) {
+            return "操作成功";
+        }
+        self::throwErrMsg('操作失败');
+    }
+}

+ 8 - 0
modules/Jiesuan/routes/route.php

@@ -30,5 +30,13 @@ Route::prefix('jiesuanManage')->group(function () {
        Route::post('remit', [FinanceCheckController::class, 'remit'])->middleware(['roleCheck:financer']);
        Route::post('remit', [FinanceCheckController::class, 'remit'])->middleware(['roleCheck:financer']);
        Route::get('getShanghuAccountInfo', [FinanceCheckController::class, 'getShanghuAccountInfo'])->middleware(['roleCheck:financer']);
        Route::get('getShanghuAccountInfo', [FinanceCheckController::class, 'getShanghuAccountInfo'])->middleware(['roleCheck:financer']);
     });
     });
+
+    // 结算账户审核
+    Route::prefix('verify')->group(function (){
+        Route::any('list',[\Modules\Jiesuan\Http\Controllers\VerifyBankInfoController::class,"list"]);
+        // 商户选择项
+        Route::any('business/option',[\Modules\Jiesuan\Http\Controllers\VerifyBankInfoController::class,"businessOption"]);
+        Route::any('check',[\Modules\Jiesuan\Http\Controllers\VerifyBankInfoController::class,"check"]);
+    });
 });
 });
 
 

+ 140 - 0
modules/OrderRefund/Http/Controllers/RefundOrderController.php

@@ -0,0 +1,140 @@
+<?php
+/**
+ * 退款控制器
+ * @file:RefundOrderController.php
+ * @Date: 2023/5/26
+ * @Time: 18:33
+ */
+
+
+namespace Modules\OrderRefund\Http\Controllers;
+
+use Catch\Base\CatchController;
+use Catch\Exceptions\FailedException;
+use Illuminate\Http\Request;
+use Modules\OrderRefund\Http\Requests\OrderRefundRequest;
+use Modules\OrderRefund\Http\Requests\RefundVerIiyRequest;
+use Modules\OrderRefund\Services\RefundOrderService;
+use Modules\User\Http\Controllers\UserTrait;
+
+class RefundOrderController extends CatchController
+{
+
+    use  UserTrait;
+
+    /**
+     *  退款列表
+     * name: orderList
+     * @param Request $request
+     * date 2023/05/29 14:09
+     */
+    public function orderList(Request $request){
+        $param = $request->all();
+        $userContext = $this->getUserContext(null);
+        if (getProp($param, 'puser_id')) {
+            $param['puser_id'] = $param['puser_id'];
+        }
+        if (getProp($param, 'user_id')) {
+            $param['user_id'] = $param['user_id'];
+        }
+        // 公司账户处理
+        if ($userContext['loginUserRoles']->contains('company')) {
+            $param['puser_id'] = $userContext['operateUser']->id;
+        }
+
+        // 投手处理
+        if ($userContext['loginUserRoles']->contains('optimizer')) {
+            $param['user_id'] = $userContext['operateUser']->id;
+        }
+
+        return RefundOrderService::orderList($param);
+    }
+
+    /**
+     *  申请退款
+     * name: applyRefund
+     * @param OrderRefundRequest $request
+     * @return string
+     * date 2023/05/29 14:09
+     */
+    public function applyRefund(OrderRefundRequest $request)
+    {
+        $param = $request->all();
+        $param['create_user_id'] =  $this->getCurrentUser()->id;
+        return RefundOrderService::applyRefund($param);
+    }
+
+    /**
+     * 平台审核
+     * name: platformVerify
+     * @param RefundVerIiyRequest $request
+     * @return string
+     * date 2023/05/29 16:38
+     */
+    public function platformVerify(RefundVerIiyRequest $request){
+        $userContext = $this->getUserContext(null);
+        if (!$userContext['loginUserRoles']->contains('administrator')) {
+            throw  new  FailedException("没有操作权限");
+        }
+        $param = [
+            'pt_verify_status' => $request->input('status'),
+            'pt_verifty_user' => [
+               "id"=> $userContext['loginUser']->id,
+               "user_name"=> $userContext['loginUser']->username,
+               "email"=> $userContext['loginUser']->email,
+            ],
+            'pt_verify_at' => get_date(),
+            'pt_verify_remark' => $request->input('remark',"")
+        ];
+       return RefundOrderService::updateRefundVerify($request->input('refund_id'),$param,1);
+    }
+
+    /**
+     * 商户审核
+     * name: companyVerify
+     * @param RefundVerIiyRequest $request
+     * @return string
+     * date 2023/05/29 16:39
+     */
+    public function  companyVerify(RefundVerIiyRequest $request){
+        $userContext = $this->getUserContext(null);
+        if (!($userContext['loginUserRoles']->contains('optimizer') || $userContext['loginUserRoles']->contains('company'))) {
+            throw  new  FailedException("没有操作权限");
+        }
+        $param = [
+            'sh_verify_status' => $request->input('status'),
+            'sh_verifty_user' => [
+                "id"=> $userContext['loginUser']->id,
+                "user_name"=> $userContext['loginUser']->username,
+                "email"=> $userContext['loginUser']->email,
+            ],
+            'sh_verify_at' => get_date(),
+            'sh_verify_remark' => $request->input('remark',"")
+        ];
+        return RefundOrderService::updateRefundVerify($request->input('refund_id'),$param,0);
+    }
+
+    /**
+     *  操作退款
+     * name: payToUser
+     * @param Request $request
+     * @return string|void
+     * date 2023/05/29 17:32
+     */
+    public function payToUser(Request $request){
+        $refundId = $request->input('refund_id',0);
+        if($refundId <  1){
+            throw  new FailedException("退款申请单号不能为空");
+        }
+        $userContext = $this->getUserContext(null);
+        if (!$userContext['loginUserRoles']->contains('administrator')) {
+            throw  new  FailedException("没有操作权限");
+        }
+        $option = [
+            "id"=> $userContext['loginUser']->id,
+            "user_name"=> $userContext['loginUser']->username,
+            "email"=> $userContext['loginUser']->email,
+        ];
+        return RefundOrderService::payToUser($refundId,$option);
+    }
+}

+ 59 - 0
modules/OrderRefund/Http/Requests/OrderRefundRequest.php

@@ -0,0 +1,59 @@
+<?php
+/**
+ * 退款申请请求
+ * @file:OrderRefundRequest.php
+ * @Date: 2023/5/29
+ * @Time: 10:52
+ */
+
+
+namespace Modules\OrderRefund\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+use Modules\OrderRefund\Models\OrdersRefundVerify;
+
+class OrderRefundRequest extends FormRequest
+{
+    /**
+     * rules
+     *
+     * @return array
+     */
+    public function rules(): array
+    {
+        return [
+            'order_id' => [
+                'required',
+                'Integer',
+                "gt:0",
+                function ($attribute, $value, $fail) {
+                    $has = OrdersRefundVerify::where('order_id', $value)->value('id');
+                    if (!empty($has)) {
+                        $fail("此订单已申请退款!");
+                    }
+                }
+            ],
+            'price'=>[
+                'required',
+                "gt:0"
+            ]
+        ];
+    }
+
+    /**
+     * messages
+     *
+     * @return string[]
+     */
+    public function messages(): array
+    {
+        return [
+            'order_id.required' => '申请退款订单必填',
+            'order_id.Integer' => '申请退款订单不正确',
+            'order_id.gt' => '申请退款订单不正确',
+            'price.gt' => '退款金额必须大于0',
+            'price.required' => '退款金额必填',
+        ];
+    }
+
+}

+ 43 - 0
modules/OrderRefund/Http/Requests/RefundVerIiyRequest.php

@@ -0,0 +1,43 @@
+<?php
+/**
+ *
+ * @file:RefundVerIiyReques.php
+ * @Date: 2023/5/29
+ * @Time: 16:12
+ */
+
+
+namespace Modules\OrderRefund\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class RefundVerIiyRequest extends FormRequest
+{
+    /**
+     * rules
+     *
+     * @return array
+     */
+    public function rules(): array
+    {
+        return [
+            'refund_id' => [ 'required', 'Integer', "gt:0", ],
+            'status' => [ 'required','Integer', "in:1,2"]
+        ];
+    }
+
+    /**
+     * messages
+     *
+     * @return string[]
+     */
+    public function messages(): array
+    {
+        return [
+            'refund_id.required' => '退款订单号必填',
+            'refund_id' => '退款订单号不正确',
+            'status' => '审核状态不正确',
+        ];
+    }
+
+}

+ 33 - 0
modules/OrderRefund/Installer.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace Modules\OrderRefund;
+
+use Catch\Support\Module\Installer as ModuleInstaller;
+use Modules\OrderRefund\Providers\OrderRefundServiceProvider;
+
+
+class Installer extends ModuleInstaller
+{
+    protected function info(): array
+    {
+        // TODO: Implement info() method.
+        return [
+            'title' => '退款管理',
+            'name' => 'orderRefund',
+            'path' => 'orderRefund',
+            'keywords' => '退款管理',
+            'description' => '退款管理模块',
+            'provider' =>OrderRefundServiceProvider::class,
+        ];
+    }
+
+    protected function requirePackages(): void
+    {
+        // TODO: Implement requirePackages() method.
+    }
+
+    protected function removePackages(): void
+    {
+        // TODO: Implement removePackages() method.
+    }
+}

+ 17 - 0
modules/OrderRefund/Models/OrdersRefundVerify.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace Modules\OrderRefund\Models;
+
+use Modules\Common\Models\BaseModel;
+
+
+class OrdersRefundVerify extends BaseModel
+{
+    protected $table = 'orders_refund_verify';
+
+    protected $fillable = [
+        'id', 'create_user_id', 'order_id', 'puser_id', 'user_id', 'uid', 'order_price', 'refund_price', 'trade_no', 'refund_no', 'refund_status', 'pay_at', 'pay_op_user', 'pt_verify_status', 'pt_verifty_user', 'pt_verify_at', 'pt_verify_remark', 'sh_verify_status', 'sh_verifty_user', 'sh_verify_remark', 'sh_verify_at', 'created_at', 'updated_at',
+    ];
+    protected $casts = ['sh_verifty_user' => 'array','pt_verifty_user' => 'array','pay_op_user' => 'array'];
+
+}

+ 20 - 0
modules/OrderRefund/Providers/OrderRefundServiceProvider.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace Modules\OrderRefund\Providers;
+
+use Catch\CatchAdmin;
+use Catch\Providers\CatchModuleServiceProvider;
+
+class OrderRefundServiceProvider extends CatchModuleServiceProvider
+{
+    /**
+     * route path
+     *
+     * @return string
+     */
+    public function moduleName(): string
+    {
+        // TODO: Implement path() method.
+        return 'orderRefund';
+    }
+}

+ 22 - 0
modules/OrderRefund/Services/BaseServices.php

@@ -0,0 +1,22 @@
+<?php
+/**
+ *
+ * @file:BaseServices.php
+ * @Date: 2023/5/29
+ * @Time: 11:50
+ */
+
+
+namespace Modules\OrderRefund\Services;
+
+use Catch\Exceptions\FailedException;
+
+class BaseServices
+{
+   protected static  function  throwErrMsg($msg,$code = ""){
+       if ($code){
+           throw  new FailedException($msg,$code);
+       }
+       throw  new FailedException($msg);
+   }
+}

Разница между файлами не показана из-за своего большого размера
+ 273 - 0
modules/OrderRefund/Services/RefundOrderService.php


+ 16 - 0
modules/OrderRefund/routes/route.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+
+Route::prefix('orderRefund')->group(function(){
+    // 退款订单列表
+    Route::get('order_list',[\Modules\OrderRefund\Http\Controllers\RefundOrderController::class,'orderList']);
+    // 申请退款
+    Route::post('apply',[\Modules\OrderRefund\Http\Controllers\RefundOrderController::class,'applyRefund']);
+    // 平台审核
+    Route::post('verify/pt',[\Modules\OrderRefund\Http\Controllers\RefundOrderController::class,"platformVerify"]);
+    // 商户审核
+    Route::post('verify/sh',[\Modules\OrderRefund\Http\Controllers\RefundOrderController::class,"companyVerify"]);
+    // 打款给用户
+    Route::post("payToUser",[\Modules\OrderRefund\Http\Controllers\RefundOrderController::class,"payToUser"]);
+});

+ 3 - 13
modules/User/Models/User.php

@@ -93,20 +93,10 @@ class User extends Model implements AuthenticatableContract
      */
      */
     public function updateBy($id, array $data): mixed
     public function updateBy($id, array $data): mixed
     {
     {
-        if (isset($data['password'])) {
-            if (empty($data['password'])) {
-                if (isset($data['password'])) {
-                    unset($data['password']);
-                }
-            } else {
-                $data['password'] = bcrypt($data['password']);
-            }
-        } else{
-            if (isset($data['password'])){
-                unset($data['password']);
-            }
+        if(getProp($data,'password')){
+            User::query()->where('id',$id)->update(['password' => bcrypt($data['password'])]);
+            unset($data['password']);
         }
         }
-
         return parent::updateBy($id, $data);
         return parent::updateBy($id, $data);
     }
     }