Jelajahi Sumber

Merge branch 'order' into test

zqwang 1 tahun lalu
induk
melakukan
d1ddaae132

+ 20 - 0
app/Libs/Helpers.php

@@ -2,6 +2,7 @@
 
 
 use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Facades\DB;
 use Modules\Common\Support\Upload\Uploader;
 use PhpOffice\PhpSpreadsheet\IOFactory;
 use PhpOffice\PhpSpreadsheet\Spreadsheet;
@@ -384,3 +385,22 @@ if (!function_exists('getProp')){
         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);
+}

+ 2 - 1
modules/Channel/Services/Order/OrderService.php

@@ -43,8 +43,9 @@ class OrderService
                 $val->play_name = '-';
                 $company = Miniprogram::where('id', $val->miniprogram_id)->first();
                 if ($company) {
-                    $val->company_name = $company->company();
+                    $val->company_name = $val->puser_id >  0 ? $company->company() : "-";
                     $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->total_count = Order::where('uid', $val->uid)->where('id', "<=", $val->id)->count();

+ 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);
+   }
+}

File diff ditekan karena terlalu besar
+ 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"]);
+});