wesmiler 1 month ago
parent
commit
e5eef2f9d6

+ 37 - 29
app/Console/Commands/SwooleTask.php

@@ -224,55 +224,55 @@ class SwooleTask extends Command
             $time++;
         });
 
-
-        // 充值订单状态检查
-        \swoole_timer_tick(20000, function ($timer) use ($serv, &$time) { // 启用定时器,每20秒执行一次
+        // 订单自动收货
+        \swoole_timer_tick(10000, function ($timer) use ($serv, &$time) { // 启用定时器,每10秒执行一次
             $date = date('Y-m-d H:i:s');
-            $orders = PayOrdersService::make()->getCheckOrderList();
+            $orders = OrderService::make()->getCompleteOrders();
             if($orders){
                 foreach ($orders as $k => $item){
-                    if(!RedisService::get('caches:task:lock:order_check_loaded_'.$k)){
+                    $orderNo = isset($item['order_no'])?$item['order_no'] : '';
+                    if(!RedisService::get('caches:task:lock:order_complete_loaded_'.$orderNo)){
                         $taskData = [
-                            'taskName' => 'checkOrder',
-                            'name' => "充值订单状态更新",
+                            'taskName' => 'completeOrder',
+                            'name' => "购物订单自动收货处理",
                             'date' => date('Y-m-d'),
                             'params'=> $item,
                         ];
                         $res = $serv->task($taskData);
-                        RedisService::set('caches:task:lock:order_check_loaded_'.$k, true, rand(3,5));
-                        echo "[Task checkOrder {$date}] 充值订单状态更新结果:{$res}\n";
+                        RedisService::set('caches:task:lock:order_complete_loaded_'.$k, true, rand(3,5));
+                        echo "[Task completeOrder {$date}] 购物订单【{$orderNo}】自动收货处理结果:{$res}\n";
                     }else{
-                        echo "[Task checkOrder {$date}] 充值订单状态更新间隔时间调用\n";
+                        echo "[Task completeOrder {$date}] 购物订单【{$orderNo}】自动收货处理间隔时间调用\n";
                     }
                 }
             }else{
-                echo "[Task checkOrder {$date}] 暂无可验证状态的充值订单\n";
+                echo "[Task completeOrder {$date}] 暂无可自动收货的购物订单\n";
             }
         });
 
-        // 订单自动收货
-        \swoole_timer_tick(10000, function ($timer) use ($serv, &$time) { // 启用定时器,每10秒执行一次
+        // 订单自动分账处理
+        \swoole_timer_tick(20000, function ($timer) use ($serv, &$time) { // 启用定时器,每20秒执行一次
             $date = date('Y-m-d H:i:s');
-            $orders = OrderService::make()->getCompleteOrders();
+            $orders = OrderService::make()->getRevenueOrderList();
             if($orders){
                 foreach ($orders as $k => $item){
                     $orderNo = isset($item['order_no'])?$item['order_no'] : '';
-                    if(!RedisService::get('caches:task:lock:order_complete_loaded_'.$orderNo)){
+                    if(!RedisService::get('caches:task:lock:order_revenue_loaded_'.$orderNo)){
                         $taskData = [
-                            'taskName' => 'completeOrder',
-                            'name' => "购物订单自动收货处理",
+                            'taskName' => 'revenueOrder',
+                            'name' => "购物订单自动分账处理",
                             'date' => date('Y-m-d'),
                             'params'=> $item,
                         ];
                         $res = $serv->task($taskData);
                         RedisService::set('caches:task:lock:order_complete_loaded_'.$k, true, rand(3,5));
-                        echo "[Task completeOrder {$date}] 购物订单【{$orderNo}】自动收货处理结果:{$res}\n";
+                        echo "[Task revenueOrder {$date}] 购物订单【{$orderNo}】自动分账处理结果:{$res}\n";
                     }else{
-                        echo "[Task completeOrder {$date}] 购物订单【{$orderNo}】自动收货处理间隔时间调用\n";
+                        echo "[Task revenueOrder {$date}] 购物订单【{$orderNo}】自动分账处理间隔时间调用\n";
                     }
                 }
             }else{
-                echo "[Task completeOrder {$date}] 暂无可自动收货的购物订单\n";
+                echo "[Task revenueOrder {$date}] 暂无可自动分账的购物订单\n";
             }
         });
 
@@ -308,18 +308,25 @@ class SwooleTask extends Command
         $params = isset($data['params']) ? $data['params'] : [];
         try {
             switch ($taskName) {
-                case 'checkOrder': // 更新状态
+                case 'completeOrder': // 自动收货
+                    $orderId = isset($params['id'])? $params['id'] : 0;
+                    $orderNo = isset($params['order_no'])? $params['order_no'] : '';
+                    $userId = isset($params['user_id'])? $params['user_id'] : 0;
+                    if($orderId<=0 || $userId<=0){
+                        echo "[Task {$taskName} {$date}][{$task_id}] 该购物订单参数错误\n";
+                        return false;
+                    }
                     // 调用处理
-                    if($res = PayOrdersService::make()->checkOrder($params)){
+                    if($res = OrderService::make()->complete($userId, $orderId, false)){
                         $res = is_array($res) && $res? json_encode($res, 256) : 'success';
-                        echo "[Task {$taskName} {$date}][{$task_id}] 充值订单状态更新处理结果:{$res}\n";
+                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动收货处理结果:{$res}\n";
                     }else{
-                        $error = PayOrdersService::make()->getError();
+                        $error = OrderService::make()->getError();
                         $error = $error? lang($error) : 'failed';
-                        echo "[Task {$taskName} {$date}][{$task_id}] 充值订单状态更新处理结果:{$error}\n";
+                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动收货处理结果:{$error}\n";
                     }
                     break;
-                case 'completeOrder': // 自动收货
+                case 'revenueOrder': // 自动分账
                     $orderId = isset($params['id'])? $params['id'] : 0;
                     $orderNo = isset($params['order_no'])? $params['order_no'] : '';
                     $userId = isset($params['user_id'])? $params['user_id'] : 0;
@@ -327,14 +334,15 @@ class SwooleTask extends Command
                         echo "[Task {$taskName} {$date}][{$task_id}] 该购物订单参数错误\n";
                         return false;
                     }
+
                     // 调用处理
-                    if($res = OrderService::make()->complete($userId, $orderId, false)){
+                    if($res = OrderService::make()->revenue($orderId)){
                         $res = is_array($res) && $res? json_encode($res, 256) : 'success';
-                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动收货处理结果:{$res}\n";
+                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动分账处理结果:{$res}\n";
                     }else{
                         $error = OrderService::make()->getError();
                         $error = $error? lang($error) : 'failed';
-                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动收货处理结果:{$error}\n";
+                        echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动分账处理结果:{$error}\n";
                     }
                     break;
             }

+ 6 - 2
app/Http/Controllers/Api/v1/TestController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers\Api\v1;
 
 use App\Http\Controllers\Api\webApp;
+use App\Services\Api\OrderService;
 use App\Services\MpService;
 
 /**
@@ -16,8 +17,11 @@ class TestController extends webApp
 
     public function check()
     {
-        $result =  MpService::make()->getMiniShareLink('pagesSub/pages/meeting/books?id=1','邀请您参加会议');
-        dump(MpService::make()->getError());
+//        $result =  MpService::make()->getMiniShareLink('pagesSub/pages/meeting/books?id=1','邀请您参加会议');
+//        dump(MpService::make()->getError());
+        $id = request()->post('id');
+        $result = OrderService::make()->revenue($id);
+        dump(OrderService::make()->getError());
         dump($result);
 
         return showJson('操作成功', true, $result);

+ 98 - 0
app/Services/Api/OrderService.php

@@ -746,6 +746,7 @@ class OrderService extends BaseService
         DB::commit();
         $this->error = '确认收货成功';
         RedisService::clear("caches:orders:completeList");
+        RedisService::clear("caches:orders:revenueList");
         return ['id' => $id, 'msg' => $this->error];
     }
 
@@ -921,4 +922,101 @@ class OrderService extends BaseService
 
         return $datas;
     }
+
+    /**
+     * 已完成,待分账订单
+     * @return array|mixed
+     */
+    public function getRevenueOrderList()
+    {
+        $cacheKey = "caches:orders:revenueList";
+        $datas = RedisService::get($cacheKey);
+        if ($datas) {
+            return $datas;
+        }
+
+        $limitNum = ConfigService::make()->getConfigByCode('order_revenue_batch_num', 300);
+        $limitNum = $limitNum > 10 && $limitNum < 2000 ? $limitNum : 300;
+        $datas = $this->model->where(['status' => 4, 'is_revenue' => 2, 'mark' => 1])
+            ->whereNotNull('delivery_no')
+            ->select(['id', 'user_id','pay_total', 'order_no','transaction_id', 'status'])
+            ->limit($limitNum)
+            ->get();
+        $datas = $datas ? $datas->toArray() : [];
+        if ($datas) {
+            RedisService::set($cacheKey, $datas, rand(300, 600));
+        }
+
+        return $datas;
+    }
+
+    /**
+     * 订单分账处理
+     * @param $id
+     * @return false
+     * @throws \Yansongda\Pay\Exception\ContainerException
+     * @throws \Yansongda\Pay\Exception\InvalidParamsException
+     */
+    public function revenue($id)
+    {
+        if ($id <= 0) {
+            $this->error = '订单参数错误';
+            return false;
+        }
+
+        // 缓存锁
+        $cacheLockKey = "caches:orders:revenue_lock:{$id}";
+        if (RedisService::get($cacheLockKey)) {
+            $this->error = '订单分账处理中~';
+            return false;
+        }
+
+        // 是否设置分账账户
+        $revenueOpenid = ConfigService::make()->getConfigByCode('order_revenue_openid', '');
+        $revenueRate = ConfigService::make()->getConfigByCode('order_revenue_rate', 0);
+        if(empty($revenueOpenid)){
+            $this->error = '订单分账账户未配置';
+            return false;
+        }
+
+        $revenueRate = $revenueRate>0 && $revenueRate<100? $revenueRate: 0;
+        if($revenueRate<=0){
+            $this->error = '订单分账比例未配置';
+            return false;
+        }
+
+        // 订单信息
+        $info = $this->model->where(['id' => $id, 'mark' => 1])
+            ->select(['id', 'order_no','user_id', 'store_id','meeting_id', 'pay_total', 'bonus', 'delivery_no', 'delivery_company', 'delivery_code', 'status'])
+            ->first();
+        $orderNo = isset($info['order_no']) ? $info['order_no'] : '';
+        $payTotal = isset($info['pay_total']) ? $info['pay_total'] : 0;
+        $status = isset($info['status']) ? $info['status'] : 0;
+        if($payTotal<=0){
+            $this->error = '订单支付金额参数错误';
+            return false;
+        }
+
+        if($status != 4){
+            $this->error = '订单状态错误,未完成收货的订单无法分账';
+            return false;
+        }
+
+        $outOrderNo = str_replace('RE','JK', $orderNo);
+        $revenueAmount = moneyFormat($payTotal * $revenueRate/100,2);
+        $order = [
+            'transaction_id'=> $info['transaction_id'],
+            'out_order_no'=> $outOrderNo,
+            'body'=> '订单分账',
+            'amount'=> $revenueAmount,
+            'unsplit'=> true, // 只分一次
+        ];
+        if(!$this->model->where(['id'=>$id])->update(['revenue_no'=>$outOrderNo,'revenue_amount'=>$revenueAmount,'update_time'=>time()])){
+            $this->error = '订单分账数据更新失败';
+            return false;
+        }
+
+        $result = PaymentService::make()->profitsharing($revenueOpenid, $order);
+
+    }
 }

+ 0 - 1
app/Services/PaymentService.php

@@ -14,7 +14,6 @@ namespace App\Services;
 use App\Models\AccountLogModel;
 use App\Models\OrderModel;
 use App\Models\PaymentModel;
-use App\Services\Api\SettleService;
 use Illuminate\Support\Facades\DB;
 use Yansongda\Pay\Pay;
 use Yansongda\Pay\Plugin\Wechat\Fund\Profitsharing\AddReceiverPlugin;