Преглед изворни кода

wesmiler 报恩寺项目提交

wesmiler пре 4 година
родитељ
комит
36e1559a6c

+ 51 - 0
app/Http/Controllers/Api/TaskController.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+/**
+ * 计划任务调度控制器
+ * @author wesmiler
+ * @since 2020/11/10
+ * Class TaskController
+ * @package App\Http\Controllers
+ */
+class TaskController extends BaseController
+{
+    /**
+     * 构造函数
+     * @author wesmiler
+     * @since 2020/11/11
+     * TaskController constructor.
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+
+
+    /**
+     * 商城支付失败订单处理
+     * @return array
+     */
+    public function catchOrder(){
+
+        return message(MESSAGE_OK, true);
+    }
+
+    /**
+     * 会员奖励
+     * @return array
+     */
+    public function memberAward(){
+        return message(MESSAGE_OK, true);
+    }
+
+    /**
+     * 屏幕控制队列
+     * @return array
+     */
+    public function screenQueen(){
+        return message(MESSAGE_OK, true);
+    }
+}

+ 8 - 216
app/Http/Controllers/Api/TestController.php

@@ -2,20 +2,9 @@
 
 namespace App\Http\Controllers\Api;
 
-use App\Helpers\Jwt;
-use App\Http\Controllers\Api\v1\NotifyController;
-use App\Models\AwardModel;
-use App\Models\LotteryModel;
-use App\Models\MemberModel;
-use App\Models\UserModel;
-use App\Services\CityService;
-use App\Services\ConfigService;
-use App\Services\DevicesService;
-use App\Services\NotifyService;
-use App\Services\RedisService;
-use App\Services\SnapshotService;
-use App\Services\WechatService;
-use Illuminate\Support\Facades\Session;
+use App\Jobs\CatchLedScreen;
+use App\Models\GongdengOrderModel;
+use Illuminate\Http\Request;
 
 /**
  * 测试控制器类
@@ -38,209 +27,12 @@ class TestController extends BaseController
     }
 
     public function index(){
-        $dd = WechatService::makeNormalQrcode(1);
-        var_dump($dd);
-        //return message(1005,'true',['ddd'=> []]);
-
-    }
-
-    public function lamp(){
-        $orderSn = request()->get('order_sn');
-        return DevicesService::make()->catchLamp($orderSn);
-    }
-
-    public function lamp1(){
-        $colors = ['黄色','红色','绿色','白色'];
-        shuffle($colors);
-        $data = [
-            'CommandType'=> 'OpenLed', // 执行命令方式:OpenLed-开灯,CloseLed-关灯,QuitStatus-查询状态
-            'MD'=> 1, // 机器号设备号
-            'MDPORT'=> 1, // 设备端口:暂与设备号一致
-            'LEDID'=> 4, // 亮灯灯号1-498对应1号设备,498后为设备2
-            'Color'=> urlencode($colors[0]), // 颜色
-            'OrderNo'=> 'G202107152132315', // 订单号
+        $params = [
+            'device_code'=> rand(1, 5),
+            'order_sn'=> get_order_num('G')
         ];
-        $dataStr = [];
-        foreach($data as $k => $v){
-            $dataStr[] = $k.'='.$v;
-        }
-
-        // 调用亮灯接口处理
-        $dataStr = implode('&', $dataStr);
-        var_dump($dataStr);
-        $headers = ["Content-Type: application/x-www-form-urlencoded; charset=UTF-8"];
-        $apiUrl = ConfigService::make()->getConfigByCode('gd_api_url').'/LEDControl.ashx';
-        $result = httpHeaderRequest($apiUrl, $dataStr,'post',$headers,'text');
-        var_dump($result);
-        return $result;
-    }
-
-    /**
-     * 支付回调
-     */
-    public function pay($scene){
-        $postData = request()->all();
-        $sign = request()->headers->get('Wechatpay-Signature');
-        $nonce = request()->headers->get('Wechatpay-Nonce');
-        $timestamp = request()->headers->get('Wechatpay-Timestamp');
-        $body = file_get_contents('php://input');
-        $id = isset($postData['id'])? '_'.$postData['id'] : '';
-        RedisService::set('caches:payments:'.$scene.':result'.$id.'_'.date('YmdHis'), ['result'=> $postData,'sign'=> $sign,'date'=> date('Y-m-d H:i:s')], 7200);
-        $postData = isset($postData['resource'])? $postData['resource'] : [];
-        if(empty($scene) || empty($postData)){
-            return NotifyService::make()->rebackMsg('回调参数错误');
-        }
-
-        // 解密
-        $signStr = "{$timestamp}\n{$nonce}\n{$body}\n";
-        $ciphertext = isset($postData['ciphertext'])? $postData['ciphertext'] : '';
-        RedisService::set('caches:payments:'.$scene.':result'.$id.'_ciphertext', ['result'=> $postData,'date'=> date('Y-m-d H:i:s')], 7200);
-        if(empty($ciphertext)){
-            return NotifyService::make()->rebackMsg('解密数据不存在');
-        }
-
-        $postData = WechatService::decryptNotifyData($postData);
-        $postData = $postData? json_decode($postData, true) : [];
-        // var_dump($postData);
-        $outTradeNo = isset($postData['out_trade_no']) ? $postData['out_trade_no'] : '';
-        if(empty($postData) || empty($outTradeNo)){
-            return NotifyService::make()->rebackMsg('获取解密数据失败');
-        }
-
-        RedisService::set('caches:payments:'.$scene.':result'.$id.'_'.$outTradeNo, ['result'=> $postData], 7200);
-        RedisService::set('caches:payments:'.$scene.':check'.$id.'_'.$outTradeNo, ['data'=> $postData,'signStr'=> $signStr,'sign'=> $sign], 3600);
-        if (WechatService::checkJsapiNotifyV3($signStr, $sign, $postData)) {
-            switch($scene){
-                case 'index': // 供灯订单
-                    return NotifyService::make()->notifyGongdeng($postData, $outTradeNo);
-                case 'recharge': // 充值
-
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        return 'fail';
-    }
-
-    public function baward(){
-        $id = request('id', '');
-        $api = request('code','');
-        $apiUrl = 'http://18.166.54.98';
-        $webApiUrl = 'http://18.166.54.98:5666';
-        $sdate = request('sdate', '2021-07-14');
-        if(empty($id) || empty($api) || empty($sdate)){
-            return false;
-        }
-        $url = $webApiUrl.'/home/get_history?fdate='.$sdate.'&id='.$api;
-        $results = file_get_contents($url);
-        $datas = $results? json_decode($results, true) : [];
-        $datas = isset($datas[0]['data'])? $datas[0]['data'] : [];
-        $awards = [];
-        //var_dump($datas);
-        if($datas){
-            foreach ($datas as $v) {
-                $cycleid = isset($v['qihao'])? $v['qihao'] : '';
-                $balls = isset($v['jg'])? $v['jg'] : '';
-                $stime = isset($v['time'])? $v['time'] : '';
-
-                //if(!AwardModel::where(['Number'=> $cycleid])->value('id')){
-                $awards[$cycleid] = [
-                    'Sid'=> $id,
-                    'DateTIme'=> $stime,
-                    'Number'=> $cycleid,
-                    'Data'=> $balls,
-                ];
-                // }
-            }
-        }
-
-        ksort($awards);
-        $awards = array_values($awards);
-        //AwardModel::insert($awards);
-        echo '<pre>';
-        var_dump($awards);
-    }
-
-    public function award(){
-       /*$lotterys = LotteryModel::where(['State'=> 1])
-           ->where('Pid','>', 0)
-           ->select(['id','title','api','model'])
-           ->get()
-           ->toArray();*/
-
-        $id = request('id', '');
-        $api = request('code','');
-        $type = request('type',0);
-        $apiUrl = 'http://18.166.54.98';
-        $webApiUrl = 'http://18.166.54.98:5666';
-        $sdate = request('sdate', '2021-07-14');
-        if(empty($id) || empty($api) || empty($sdate)){
-            return false;
-        }
-        
-        $baseUrl = "https://168api.vip/index.php?controller=Apiac_Lotrs&action=findLotRs&uid=61258&mkey=96396ae0d51ef0740236fb7256e4e8f7&code=".$api.'&pt=nav';
-        /*if($id==76){
-            $url = $baseUrl.'&sdate='.$sdate;
-        }else if($id==91) {
-            $url = $baseUrl.'&sdate='.$sdate;
-        }else if($id==75) {
-            $url = $baseUrl.'&sdate=' . $sdate;
-        }else if($id==104) {
-            $url = $baseUrl.'&sdate='. $sdate;
-        }else if($id==105) {
-            $url = $baseUrl.'&sdate=' . $sdate;
-        }else if($id==92){
-            $url = $apiUrl.'/api/award/index.php?mkey=DfhHGF7USHGVFDKJNX3454AHDc&code='.$api;
-        }else if($id>=78 && $id<=120){
-            $url = $baseUrl;
-        }else if($id == 48 || $id == 75 || $id == 76 || $id == 78){
-            $url = $baseUrl.'?date='.date('Y', time());
-        }else if ($id == 8){
-            $url = $baseUrl.'&sdate='.$sdate;
-        }else if ($id == 77){
-            $Date = date('Y',time());
-            $url = "{$webApiUrl}/home/six_history?year=".$Date.'&gtype=1';
-        }else{
-            $url = $webApiUrl.'/home/get_today?id='.$id;
-        }*/
-
-        $url = $baseUrl.'&sdate='.$sdate;
-
-       // echo $url."<br>";
-        $results = httpRequest($url,'','get');
-        $datas = isset($results['data'])?$results['data'] : [];
-        $awards = [];
-        if($datas){
-            foreach ($datas as $v) {
-                $cycleid = isset($v['cycleid'])? $v['cycleid'] : '';
-                $balls = isset($v['balls'])? $v['balls'] : '';
-                $stime = isset($v['stime'])? $v['stime'] : '';
-                if($type == 1){
-                    $d = explode('-', $cycleid);
-                    $cycleid = isset($d[1])? $d[1] : $cycleid;
-                }else if($type == 2){
-                    $cycleid = str_replace('-','', $cycleid);
-                }
-                //if(!AwardModel::where(['Number'=> $cycleid])->value('id')){
-                    $awards[$cycleid] = [
-                        'Sid'=> $id,
-                        'DateTIme'=> $stime,
-                        'Number'=> $cycleid,
-                        'Data'=> $balls,
-                    ];
-               // }
-            }
-        }
-
-        ksort($awards);
-        $awards = array_values($awards);
-        //AwardModel::insert($awards);
-        echo '<pre>';
-        var_dump($awards);
-
-
+        CatchLedScreen::dispatch($params)->delay(rand(1, 3));
+        return message(MESSAGE_OK, true,['date'=> date('Y-m-d H:i:s')]);
     }
 
 }

+ 1 - 1
app/Http/Middleware/AuthLogin.php

@@ -27,7 +27,7 @@ class AuthLogin extends Middleware
         $action = app('request')->route()->getAction();
         $controller = class_basename($action['controller']);
         list($controller, $action) = explode('@', $controller);
-        $noLoginActs = ['LoginController','TestController','AuthController','NotifyController','IndexController'];
+        $noLoginActs = ['LoginController','TestController','AuthController','NotifyController','IndexController','TaskController'];
         $token = $request->headers->get('Authorization');
         if (strpos($token, 'Bearer ') !== false) {
             $token = str_replace("Bearer ", null, $token);

+ 61 - 0
app/Jobs/CatchLedScreen.php

@@ -0,0 +1,61 @@
+<?php
+/**
+ * LED 屏幕控制队列服务
+ */
+
+namespace App\Jobs;
+
+use App\Models\GongdengOrderModel;
+use App\Services\DevicesService;
+use App\Services\RedisService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\Log;
+
+class CatchLedScreen implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    public $tries = 5;
+
+    protected $params;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct($params)
+    {
+        $this->params = $params;
+    }
+
+    /**
+     * 任务处理
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $dateime = date('Y-m-d H:i:s');
+        if (DevicesService::make()->catchLedScreen($this->params)) {
+            Log::info("[{$dateime}] 处理成功: " . json_encode($this->params, 256));
+        } else {
+            Log::error("[{$dateime}] 处理失败:" . json_encode($this->params, 256));
+        }
+    }
+
+    /**
+     * 处理失败任务
+     *
+     * @return void
+     */
+    public function failed()
+    {
+        $dateime = date('Y-m-d H:i:s');
+        Log::error("[{$dateime}] 处理错误:" . json_encode($this->params, 256));
+    }
+}

+ 51 - 4
app/Services/DevicesService.php

@@ -11,6 +11,7 @@
 
 namespace App\Services;
 
+use App\Jobs\CatchLedScreen;
 use App\Models\DevicesModel;
 use App\Models\GongdengOrderModel;
 use Illuminate\Support\Facades\DB;
@@ -139,7 +140,7 @@ class DevicesService extends BaseService
      * @param $orderSn 订单号
      * @return bool
      */
-    public function catchLamp($orderSn){
+    public function catchLamp($orderSn, $info=[]){
         if(empty($orderSn)){
             return false;
         }
@@ -186,14 +187,14 @@ class DevicesService extends BaseService
         }
 
         // 屏幕控制队列数据
-        $screenData = [
+        $params = [
             'order_sn'=> $orderSn,
             'device_code'=> $deviceCode,
             'port'=> $port,
+            'text'=> isset($info['qf_content'])? $info['qf_content'] : '',
         ];
 
-        RedisService::rPush('push:screens', $screenData);
-        RedisService::expire('push:screens', 3600);
+        CatchLedScreen::dispatch($params)->delay(rand(2, 5));
 
         // 调用亮灯接口处理
         $dataStr = implode('&', $dataStr);
@@ -219,6 +220,52 @@ class DevicesService extends BaseService
     }
 
     /**
+     * 调度处理LED屏幕队列
+     * @param $params
+     */
+    public function catchLedScreen($params){
+        $orderSn = isset($params['order_sn'])? $params['order_sn'] : '';
+        $port = isset($params['port'])? $params['port'] : '';
+        $deviceCode = isset($params['device_code'])? $params['device_code'] : '';
+        if(empty($orderSn) || empty($deviceCode) || empty($port)){
+            RedisService::set("catch:queue:screen:error_".date('YmdHis'), $params, 3600);
+            return false;
+        }
+
+        $cacheKey = "queue:catch:screen:{$orderSn}";
+        RedisService::set($cacheKey.':params', $params, 600);
+        $data = [
+            'CommandType'=> 'OpenLed', // 执行命令方式:OpenLed-开灯,CloseLed-关灯,QuitStatus-查询状态
+            'MD'=> $deviceCode, // 机器号设备号
+            'MDPORT'=> $port, // 设备端口:暂与设备号一致
+            'OrderNo'=> $orderSn, // 订单号
+            'text'=> isset($params['text']) && $params['text']? $params['text'] : '供灯祈福',
+        ];
+        $dataStr = [];
+        foreach($data as $k => $v){
+            $dataStr[] = $k.'='.$v;
+        }
+
+        // 调用亮灯接口处理
+        $dataStr = implode('&', $dataStr);
+        $headers = ["Content-Type:application/x-www-form-urlencoded; charset=UTF-8"];
+        $apiUrl = ConfigService::make()->getConfigByCode('gd_api_url').'/LEDControl.ashx';
+        RedisService::set($cacheKey.':request', ['url'=> $apiUrl,'data'=> $data], 3600);
+        $result = httpHeaderRequest($apiUrl, $dataStr,'post',$headers,'text');
+        RedisService::set($cacheKey.':result', $result, 3600);
+        // 更新灯状态
+        $updateData = ['screen_status'=> 1];
+        if($result && trim($result) == 'True'){
+            GongdengOrderModel::where(['order_sn'=>$orderSn])->update($updateData);
+            return true;
+        }else{
+            $updateData['screen_status'] = 2;
+            GongdengOrderModel::where(['order_sn'=>$orderSn])->update($updateData);
+            return false;
+        }
+    }
+
+    /**
      * 获取拍照图片
      * @return array
      */

+ 2 - 3
app/Services/NotifyService.php

@@ -66,7 +66,7 @@ class NotifyService extends BaseService
         $errorKey = "caches:orders:gongdeng:{$outTradeNo}";
         // 验证订单是否存在
         $orderInfo = $this->model::where(['order_sn'=> $outTradeNo])
-            ->select(['id','source_id','buy_type','user_id','num','total','status'])
+            ->select(['id','source_id','buy_type','user_id','sf_name','qf_content','num','total','status'])
             ->first();
 
         // 验证参数
@@ -179,12 +179,11 @@ class NotifyService extends BaseService
         // 开灯处理,续费不处理
         $buyType = isset($orderInfo['buy_type'])? $orderInfo['buy_type'] : 0;
         if($buyType == 1){
-            DevicesService::make()->catchLamp($outTradeNo);
+            DevicesService::make()->catchLamp($outTradeNo, $orderInfo);
 
         }
 
 
-
         // 消息处理
         return NotifyService::rebackMsg('支付处理成功','success');
     }

+ 22 - 0
队列调度说明.md

@@ -0,0 +1,22 @@
+### 队列调度说明
+
+1. 监听队列
+```
+php artisan queue:work --timeout=60 --tries=3  生产使用
+php artisan queue:listen --timeout=60 --tries=3
+
+nohup php artisan queue:listen --timeout=60 --tries=3  后台执行
+
+```
+
+2.队列监控
+```
+php artisan queue:work connection --daemon
+php artisan queue:work connection --daemon --sleep=3
+php artisan queue:work connection --daemon --sleep=3 --tries=3
+
+```
+3.队列重启
+```
+php artisan queue:restart
+```