|
|
@@ -12,6 +12,7 @@
|
|
|
namespace App\Services;
|
|
|
|
|
|
use App\Models\DevicesModel;
|
|
|
+use App\Models\GongdengOrderModel;
|
|
|
|
|
|
/**
|
|
|
* 供灯设备管理-服务类
|
|
|
@@ -22,6 +23,7 @@ use App\Models\DevicesModel;
|
|
|
*/
|
|
|
class DevicesService extends BaseService
|
|
|
{
|
|
|
+ protected static $instance=null;
|
|
|
/**
|
|
|
* 构造函数
|
|
|
* @author wesmiler
|
|
|
@@ -34,6 +36,18 @@ class DevicesService extends BaseService
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 静态入口
|
|
|
+ * @return DevicesService|null
|
|
|
+ */
|
|
|
+ public static function make(){
|
|
|
+ if(!self::$instance){
|
|
|
+ self::$instance = new DevicesService();
|
|
|
+ }
|
|
|
+
|
|
|
+ return self::$instance;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 获取友链列表
|
|
|
* @return array
|
|
|
* @since 2020/11/11
|
|
|
@@ -72,4 +86,96 @@ class DevicesService extends BaseService
|
|
|
return parent::edit($data); // TODO: Change the autogenerated stub
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取设备端口
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ public function getDevice(){
|
|
|
+ $datas = $this->model::where(['status'=> 1])->orderRaw("rand()")->first();
|
|
|
+ $datas = $datas? $datas->toArray() : [];
|
|
|
+ return $datas;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取可用设备号
|
|
|
+ * @return array|false|mixed
|
|
|
+ */
|
|
|
+ public function getDeviceNums($deviceInfo){
|
|
|
+ $deviceCode = isset($deviceInfo['code'])? $deviceInfo['code'] : '';
|
|
|
+ if(empty($deviceCode)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!$deviceInfo || $deviceInfo['start_num'] >= $deviceInfo['end_num']){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $cacheKey = "caches:devices:nums_{$deviceCode}";
|
|
|
+ $datas = RedisService::get($cacheKey);
|
|
|
+ if($datas){
|
|
|
+ shuffle($datas);
|
|
|
+ $datas = array_values($datas);
|
|
|
+ return $datas;
|
|
|
+ }
|
|
|
+
|
|
|
+ $deviceNums = range($deviceInfo->start_num, $deviceInfo->end_num);
|
|
|
+ $datas = GongdengOrderModel::where(['status'=> 2, 'lamp_status'=> 2])->pluck('device_num');
|
|
|
+ $datas = $datas? $datas->toArray() : [];
|
|
|
+ if($datas && $deviceNums){
|
|
|
+ $datas = array_diff($deviceNums, $datas);
|
|
|
+ if($datas){
|
|
|
+ RedisService::set($cacheKey, $datas, rand(3,5));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $datas;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function catchLamp($orderSn){
|
|
|
+ if(empty($orderSn)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取可用设备
|
|
|
+ $errorKey = "caches:lamps:{$orderSn}";
|
|
|
+ $deviceInfo = $this->getDevice();
|
|
|
+ $deviceCode = isset($deviceInfo['code'])? $deviceInfo['code'] : '';
|
|
|
+ $startNum = isset($deviceInfo['start_num'])? $deviceInfo['start_num'] : 0;
|
|
|
+ $endNum = isset($deviceInfo['end_num'])? $deviceInfo['end_num'] : 0;
|
|
|
+ $port = isset($deviceInfo['port'])? $deviceInfo['port'] : 0;
|
|
|
+ if(empty($deviceInfo) || empty($deviceCode) || ($startNum >= $endNum) || !$port){
|
|
|
+ RedisService::set("{$errorKey}:error_check", ['info'=> $deviceInfo], 3600);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取可用设备号
|
|
|
+ $deviceNums = DevicesService::make()->getDeviceNums($deviceInfo);
|
|
|
+ $deviceLampNo = $deviceNums? $deviceNums[0] : 0;
|
|
|
+ if(empty($deviceLampNo)){
|
|
|
+ RedisService::set("{$errorKey}:error_device", ['info'=> $deviceInfo,'nums'=> $deviceNums], 3600);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 亮灯处理
|
|
|
+ unset($deviceNums[0]);
|
|
|
+ RedisService::set("caches:devices:nums_{$deviceCode}", $deviceNums, rand(3,5));
|
|
|
+ $colors = ['黄','红','绿','白'];
|
|
|
+ shuffle($colors);
|
|
|
+ $data = [
|
|
|
+ 'CommandType'=> '', // 执行命令方式:
|
|
|
+ 'MD'=> $deviceCode, // 机器号设备号
|
|
|
+ 'MDPORT'=> $port,
|
|
|
+ 'LEDID'=> $deviceLampNo,
|
|
|
+ 'Color'=> $colors[0],
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 调用亮灯接口处理
|
|
|
+ $apiUrl = ConfigService::make()->getConfigByCode('gd_api_url');
|
|
|
+ RedisService::set($errorKey.':request', ['url'=> $apiUrl,'data'=> $data], 3600);
|
|
|
+ $result = httpRequest($apiUrl, $data);
|
|
|
+ RedisService::set($errorKey.':result', $result, 3600);
|
|
|
+
|
|
|
+ // 更新灯状态
|
|
|
+
|
|
|
+ }
|
|
|
}
|