wesmiler 2 mēneši atpakaļ
vecāks
revīzija
c41b5faaa7

+ 8 - 0
app/Http/Controllers/Admin/OrderController.php

@@ -60,6 +60,14 @@ class OrderController extends Backend
     }
 
     /**
+     * 发货公司列表
+     */
+    public function deliverList()
+    {
+        return $this->service->getDeliveryList();
+    }
+
+    /**
      * 订单发货
      */
     public function deliver()

+ 92 - 11
app/Services/Common/OrderService.php

@@ -11,12 +11,10 @@
 
 namespace App\Services\Common;
 
-use App\Models\AccountLogModel;
 use App\Models\ActionLogModel;
-use App\Models\GoodsModel;
-use App\Models\MemberModel;
 use App\Models\OrderModel;
 use App\Services\BaseService;
+use App\Services\MpService;
 use App\Services\RedisService;
 use Illuminate\Support\Facades\DB;
 
@@ -64,11 +62,16 @@ class OrderService extends BaseService
     {
         $query = $this->model->where('mark', 1);
 
-        // 店铺筛选
+        // 企业筛选
         if (isset($params['store_id']) && $params['store_id'] > 0) {
             $query->where('store_id', $params['store_id']);
         }
 
+        // 会议
+        if (isset($params['meeting_id']) && $params['meeting_id'] > 0) {
+            $query->where('meeting_id', $params['meeting_id']);
+        }
+
         // 用户筛选
         if (isset($params['user_id']) && $params['user_id'] > 0) {
             $query->where('user_id', $params['user_id']);
@@ -89,13 +92,24 @@ class OrderService extends BaseService
             $query->where('refund_status', $params['refund_status']);
         }
 
+        // 单号
+        if (isset($params['order_no']) && $params['order_no']) {
+            $keyword = $params['order_no'];
+            $query->where(function ($q) use ($keyword) {
+                $q->where('order_no', 'like', '%' . $keyword . '%')
+                    ->orWhere('transaction_id', 'like', '%' . $keyword . '%');
+            });
+        }
+
         // 关键词搜索(订单号、商品名称、收货人手机)
         if (isset($params['keyword']) && $params['keyword']) {
             $keyword = $params['keyword'];
             $query->where(function ($q) use ($keyword) {
-                $q->where('order_no', 'like', '%' . $keyword . '%')
-                    ->orWhere('receiver_name', 'like', '%' . $keyword . '%')
+                $q->where('receiver_name', 'like', '%' . $keyword . '%')
                     ->orWhere('receiver_mobile', 'like', '%' . $keyword . '%')
+                    ->orWhereHas('user', function ($q1) use ($keyword) {
+                        $q1->where('mobile', 'like', '%' . $keyword . '%');
+                    })
                     ->orWhereHas('orderGoods', function ($q2) use ($keyword) {
                         $q2->where('goods_name', 'like', '%' . $keyword . '%');
                     });
@@ -118,7 +132,7 @@ class OrderService extends BaseService
                 $item['goods'] = isset($item['order_goods'][0]) ? $item['order_goods'][0] : null;
 
                 $item['real_total'] = $item['pay_total'];
-                $item['pay_total'] = moneyFormat($item['pay_total'] + $item['delivery_fee'],2);
+                $item['pay_total'] = moneyFormat($item['pay_total'] + $item['delivery_fee'], 2);
                 //$item['refund_amount'] = $item['refund_amount']?$item['refund_amount']:$item['pay_total'];
             }
         }
@@ -149,7 +163,7 @@ class OrderService extends BaseService
         $info['create_time'] = $info['create_time'] ? date('Y-m-d H:i:s', strtotime($info['create_time'])) : '';
         $info['update_time'] = $info['update_time'] ? date('Y-m-d H:i:s', strtotime($info['update_time'])) : '';
         $info['real_total'] = $info['pay_total'];
-        $info['pay_total'] = moneyFormat($info['pay_total'] + $info['delivery_fee'],2);
+        $info['pay_total'] = moneyFormat($info['pay_total'] + $info['delivery_fee'], 2);
         if (isset($info['order_goods'])) {
             foreach ($info['order_goods'] as &$goods) {
                 $goods['thumb'] = $goods['thumb'] ? get_image_url($goods['thumb']) : '';
@@ -407,8 +421,8 @@ class OrderService extends BaseService
         $updateData = [
             'status' => 2, // 已付款
             'transaction_id' => $transactionId ?: 'PAY' . time() . rand(1000, 9999),
-            'pay_at'=> date('Y-m-d H:i:s'),
-            'remark'=> '人工审核支付',
+            'pay_at' => date('Y-m-d H:i:s'),
+            'remark' => '人工审核支付',
             'update_time' => time()
         ];
 
@@ -425,6 +439,43 @@ class OrderService extends BaseService
     }
 
     /**
+     * 获取小程序快递公司列表
+     * @return array
+     */
+    public function getDeliveryList()
+    {
+        $deliveryType = \App\Services\ConfigService::make()->getConfigByCode('delivery_type',1);
+        $cacheKey = "caches:orders:deliveryList_{$deliveryType}";
+        $datas = RedisService::get($cacheKey);
+        if($datas){
+            return ['code' => 0, 'msg' =>'获取成功', 'data'=>$datas];
+        }
+
+        if($deliveryType==1){
+            $result = MpService::make()->requestApi('getDelivery');
+            $errcode = isset($result['errcode'])?$result['errcode'] : -1;
+            $errmsg = isset($result['errmsg']) && $result['errmsg']?$result['errmsg'] : '请求失败';
+            $list = isset($result['delivery_list'])?$result['delivery_list'] : [];
+            if($errcode==-1){
+                return ['code' => -1, 'msg' =>$errmsg, 'data'=>[]];
+            }
+
+            $deliveryList = [];
+            if($list){
+                foreach ($list as $item){
+                    $deliveryList[$item['delivery_id']] = $item;
+                }
+            }
+
+            RedisService::set($cacheKey, $deliveryList, rand(3600, 7200));
+        }else{
+            $deliveryList = config('platform.deliveryList');
+        }
+
+        return ['code' => 0, 'msg' =>'获取成功', 'data'=>$deliveryList];
+    }
+
+    /**
      * 订单发货
      */
     public function deliverOrder()
@@ -451,6 +502,7 @@ class OrderService extends BaseService
             return ['code' => 1, 'msg' => '请填写快递单号'];
         }
 
+        DB::beginTransaction();
         $updateData = [
             'status' => 3, // 已发货
             'delivery_company' => $deliveryCompany,
@@ -459,7 +511,36 @@ class OrderService extends BaseService
             'update_time' => time()
         ];
 
-        $result = $this->model->where('id', $id)->update($updateData);
+        if (!$result = $this->model->where('id', $id)->update($updateData)) {
+            DB::rollBack();
+            return ['code' => 1, 'msg' => '操作失败'];
+        }
+
+        // 调用小程序发货信息同步接口
+        $sendData = [
+            'order_key' => [
+                "order_number_type" => 2,
+                "transaction_id" => isset($order['transaction_id']) ? $order['transaction_id'] : '',
+                "out_trade_no" => isset($order['out_trade_no']) ? $order['out_trade_no'] : ''
+            ],
+            "delivery_mode" => 1,
+            "logistics_type" => 1,
+            "shipping_list" => [
+                [
+                    "tracking_no" => $deliveryNo,
+                    "express_company" => "STO",
+                    "item_desc" => "微信气泡狗集线器*1",
+                    "contact" => [
+                        "consignor_contact" => "+86-177****1234"
+                    ]
+                ]
+            ],
+            "upload_time" => "2022-12-15T13:29:35.120+08:00",
+            "payer" => [
+                "openid" => "ogqztkPsejM9MQAFfwCQSCi4oNg3"
+            ]
+        ];
+
 
         if ($result) {
             ActionLogModel::setTitle("订单发货");

+ 33 - 1
app/Services/MpService.php

@@ -364,6 +364,39 @@ class MpService extends BaseService
     }
 
     /**
+     * 只带 access_token API  请求
+     * @param string $apiName 接口名称
+     * @param $data 接口数据
+     * @param $requestType 请求方式:post或get
+     * @return false|mixed|string
+     */
+    public function requestApi(string $apiName, $data=[], $requestType = 'post')
+    {
+        try {
+            if(empty($this->mpAppid) || empty($this->mpAppSecret)){
+                $this->error = '小程序参数未配置';
+                return false;
+            }
+
+            if(!$token = $this->getAccessToken())
+            {
+                $this->error = '获取token失败';
+                return false;
+            }
+
+            $cacheKey = "caches:mpApp:mp_{$this->mpAppid}:";
+            $url = sprintf($this->apiUrls[$apiName], $this->mpAppid, $this->mpAppSecret);
+            $result = httpRequest($url,$data?json_encode($data,256):'', $requestType,'',5);
+            $this->saveLog($cacheKey."{$apiName}:request", ['url'=>$url,'result'=>$result,'date'=>date('Y-m-d H:i:s')]);
+            return $result;
+        }catch (\Exception $e){
+            $this->error = $e->getMessage();
+            $this->saveLog($cacheKey."{$apiName}:error", ['error'=>$this->error,'trace'=>$e->getTrace(),'date'=>date('Y-m-d H:i:s')]);
+            return false;
+        }
+    }
+
+    /**
      * 获取 客服接口 access_token
      * @param false $refresh
      * @return false|mixed|string
@@ -477,7 +510,6 @@ class MpService extends BaseService
         return $dataObj;
     }
 
-
     /**
      * 保存日志
      * @param $cackekey

+ 17 - 0
config/platform.php

@@ -0,0 +1,17 @@
+<?php
+// 平台配置
+return [
+    // 快递100公司列表
+    'deliveryList'=>[
+        'shunfeng'=>['delivery_id'=>'shunfeng','delivery_name'=>'顺丰速运'],
+        'yuantong'=>['delivery_id'=>'yuantong','delivery_name'=>'圆通速递'],
+        'zhongtong'=>['delivery_id'=>'zhongtong','delivery_name'=>'中通快递'],
+        'yunda'=>['delivery_id'=>'yunda','delivery_name'=>'韵达快递'],
+        'shentong'=>['delivery_id'=>'shentong','delivery_name'=>'申通快递'],
+        'baishiwuliu'=>['delivery_id'=>'baishiwuliu','delivery_name'=>'百世快递'],
+        'jd'=>['delivery_id'=>'jd','delivery_name'=>'京东物流'],
+        'ems'=>['delivery_id'=>'ems','delivery_name'=>'邮政EMS'],
+        'debangkuaidi'=>['delivery_id'=>'debangkuaidi','delivery_name'=>'德邦快递'],
+        'jtexpress'=>['delivery_id'=>'jtexpress','delivery_name'=>'极兔速递']
+    ]
+];

+ 1 - 0
routes/web.php

@@ -129,6 +129,7 @@ Route::get('/order/statistics', [\App\Http\Controllers\Admin\OrderController::cl
 Route::post('/order/delete', [\App\Http\Controllers\Admin\OrderController::class, 'delete']);
 Route::post('/order/status', [\App\Http\Controllers\Admin\OrderController::class, 'status']);
 Route::post('/order/completePay', [\App\Http\Controllers\Admin\OrderController::class, 'completePay']);
+Route::post('/order/deliverList', [\App\Http\Controllers\Admin\OrderController::class, 'deliverList']);
 Route::post('/order/deliver', [\App\Http\Controllers\Admin\OrderController::class, 'deliver']);
 Route::post('/order/complete', [\App\Http\Controllers\Admin\OrderController::class, 'complete']);
 Route::post('/order/cancel', [\App\Http\Controllers\Admin\OrderController::class, 'cancel']);