wesmiler пре 5 дана
родитељ
комит
9eacd964b4

+ 45 - 0
app/Console/Commands/SwooleTask.php

@@ -5,6 +5,7 @@ namespace App\Console\Commands;
 use App\Services\Api\MemberService;
 use App\Services\Api\OrderService;
 use App\Services\Api\PriceService;
+use App\Services\Api\SettleService;
 use App\Services\ConfigService;
 use App\Services\RedisService;
 use Illuminate\Console\Command;
@@ -253,6 +254,32 @@ class SwooleTask extends Command
             }
         });
 
+        // 订单收益补充结算
+        \swoole_timer_tick(20000, function ($timer) use ($serv, &$time) { // 启用定时器,每20秒执行一次
+            $date = date('Y-m-d H:i:s');
+            $orders = OrderService::make()->getSettleOrders();
+            if($orders){
+                foreach ($orders as $k => $item){
+                    $orderNo = isset($item['order_no'])?$item['order_no'] : '';
+                    if(!RedisService::get('caches:task:lock:order_settle_loaded_'.$orderNo)){
+                        $taskData = [
+                            'taskName' => 'settleOrder',
+                            'name' => "订单【{$orderNo}】收益自动结算处理",
+                            'date' => date('Y-m-d'),
+                            'params'=> $item,
+                        ];
+                        $res = $serv->task($taskData);
+                        RedisService::set('caches:task:lock:order_settle_loaded_'.$orderNo, true, rand(3,5));
+                        echo "[Task settleOrder {$date}] 订单【{$orderNo}】收益自动结算处理结果:{$res}\n";
+                    }else{
+                        echo "[Task settleOrder {$date}] 订单【{$orderNo}】收益自动结算处理间隔时间调用\n";
+                    }
+                }
+            }else{
+                echo "[Task settleOrder {$date}] 暂无可结算收益的订单\n";
+            }
+        });
+
         // 用户自动复购
         \swoole_timer_tick(120000, function ($timer) use ($serv, &$time) { // 启用定时器,每2分钟执行一次
             $date = date('Y-m-d H:i:s');
@@ -352,6 +379,24 @@ class SwooleTask extends Command
                         echo "[Task {$taskName} {$date}][{$task_id}] 购物订单【{$orderNo}】自动收货处理结果:{$error}\n";
                     }
                     break;
+                case 'settleOrder': // 补充结算订单
+                    $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 = SettleService::make()->commissionSettle($orderId)){
+                        $res = is_array($res) && $res? json_encode($res, 256) : 'success';
+                        echo "[Task {$taskName} {$date}][{$task_id}] 礼包订单【{$orderNo}】结算处理结果:{$res}\n";
+                    }else{
+                        $error = SettleService::make()->getError();
+                        $error = $error? lang($error) : 'failed';
+                        echo "[Task {$taskName} {$date}][{$task_id}] 礼包订单【{$orderNo}】结算处理结果:{$error}\n";
+                    }
+                    break;
                 case 'rebuyOrder': // 自动复购
                     $userId = isset($params['id'])? $params['id'] : 0;
                     $nickname = isset($params['nickname'])? $params['nickname'] : '';

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

@@ -1382,6 +1382,34 @@ class OrderService extends BaseService
     }
 
     /**
+     * 待结算订单
+     * @return array|mixed
+     */
+    public function getSettleOrders()
+    {
+        $cacheKey = "caches:orders:settleList";
+        $datas = RedisService::get($cacheKey);
+        if ($datas) {
+            return $datas;
+        }
+
+        $limitNum = ConfigService::make()->getConfigByCode('order_settle_batch_num', 500);
+        $limitNum = $limitNum > 10 && $limitNum < 2000 ? $limitNum : 300;
+        $datas = $this->model->from('orders as a')
+            ->leftJoin('orders_commissions as b','b.order_id','=','a.id')
+            ->where(['a.status' => 2, 'b.status'=>2, 'a.mark' => 1])
+            ->select(['a.id', 'a.user_id', 'a.order_no', 'a.status'])
+            ->limit($limitNum)
+            ->get();
+        $datas = $datas ? $datas->toArray() : [];
+        if ($datas) {
+            RedisService::set($cacheKey, $datas, rand(300, 600));
+        }
+
+        return $datas;
+    }
+
+    /**
      * 已完成,待分账订单
      * @return array|mixed
      */

+ 2 - 1
app/Services/Api/SettleService.php

@@ -623,9 +623,10 @@ class SettleService extends BaseService
                $this->error = '订单结算状态更新失败';
                return false;
            }
-           
+
            $this->error = '订单结算完成';
            RedisService::clear("{$cacheKey}lock");
+           RedisService::clear("caches:orders:settleList");
            RedisService::set("{$cacheKey}result", $info, 3600);
            $result =  ['id' => $orderId, 'user_id' => $orderUserId, 'logs' => $logs, 'commission' => $commission];
            RedisService::set("caches:settles:{$orderId}_success", $result, 7200);