DevicesService.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Laravel框架 [ Laravel ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 Laravel研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: wesmiler <12345678@qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services;
  12. use App\Models\DevicesModel;
  13. use App\Models\GongdengOrderModel;
  14. use Illuminate\Support\Facades\DB;
  15. /**
  16. * 供灯设备管理-服务类
  17. * @author wesmiler
  18. * @since 2020/11/11
  19. * Class DevicesService
  20. * @package App\Services
  21. */
  22. class DevicesService extends BaseService
  23. {
  24. protected static $instance=null;
  25. /**
  26. * 构造函数
  27. * @author wesmiler
  28. * @since 2020/11/11
  29. * DevicesService constructor.
  30. */
  31. public function __construct()
  32. {
  33. $this->model = new DevicesModel();
  34. }
  35. /**
  36. * 静态入口
  37. * @return DevicesService|null
  38. */
  39. public static function make(){
  40. if(!self::$instance){
  41. self::$instance = new DevicesService();
  42. }
  43. return self::$instance;
  44. }
  45. /**
  46. * 获取友链列表
  47. * @return array
  48. * @since 2020/11/11
  49. * @author wesmiler
  50. */
  51. public function getList()
  52. {
  53. $params = request()->all();
  54. return parent::getList();
  55. }
  56. /**
  57. * 添加或编辑
  58. * @return array
  59. * @since 2020/11/11
  60. * @author wesmiler
  61. */
  62. public function edit()
  63. {
  64. $data = request()->all();
  65. $code = isset($data['code'])? $data['code'] : '';
  66. $id = isset($data['id'])? $data['id'] : 0;
  67. if($code && $checkId = $this->model->where('code', $code)->value('id')){
  68. if(($checkId && !$id) || ($id && $checkId != $id) ){
  69. return message("设备编号[{$code}]已存在",false);
  70. }
  71. }
  72. $startNum = isset($data['start_num'])? $data['start_num'] : 0;
  73. $endNum = isset($data['end_num'])? $data['end_num'] : 0;
  74. if($endNum<=$startNum){
  75. return message("截止可选灯号必须大于开始可选灯号",false);
  76. }
  77. $data['update_time'] = time();
  78. return parent::edit($data); // TODO: Change the autogenerated stub
  79. }
  80. /**
  81. * 获取设备端口
  82. * @return array
  83. */
  84. public function getDevice(){
  85. $datas = $this->model::where(['status'=> 1])->orderBy(DB::raw('RAND()'))->first();
  86. $datas = $datas? $datas->toArray() : [];
  87. return $datas;
  88. }
  89. /**
  90. * 获取可用设备号
  91. * @return array|false|mixed
  92. */
  93. public function getDeviceNums($deviceInfo){
  94. $deviceCode = isset($deviceInfo['code'])? $deviceInfo['code'] : '';
  95. if(empty($deviceCode)){
  96. return false;
  97. }
  98. if(!$deviceInfo || $deviceInfo['start_num'] >= $deviceInfo['end_num']){
  99. return false;
  100. }
  101. $cacheKey = "caches:devices:nums_{$deviceCode}";
  102. $datas = RedisService::get($cacheKey);
  103. if($datas){
  104. $datas = array_values($datas);
  105. shuffle($datas);
  106. return $datas;
  107. }
  108. $deviceNums = range($deviceInfo['start_num'], $deviceInfo['end_num']);
  109. $datas = GongdengOrderModel::where(['status'=> 2, 'lamp_status'=> 2])->pluck('device_num');
  110. $datas = $datas? $datas->toArray() : [];
  111. if($deviceNums){
  112. $datas = $datas? array_diff($deviceNums, $datas) : $deviceNums;
  113. if($datas){
  114. $datas = array_values($datas);
  115. shuffle($datas);
  116. RedisService::set($cacheKey, $datas, rand(3,5));
  117. }
  118. }
  119. return $datas;
  120. }
  121. /**
  122. * 亮灯处理
  123. * @param $orderSn 订单号
  124. * @return bool
  125. */
  126. public function catchLamp($orderSn){
  127. if(empty($orderSn)){
  128. return false;
  129. }
  130. // 验证是否已处理
  131. // 获取可用设备
  132. $errorKey = "caches:lamps:{$orderSn}";
  133. $deviceInfo = $this->getDevice();
  134. $deviceCode = isset($deviceInfo['code'])? $deviceInfo['code'] : '';
  135. $startNum = isset($deviceInfo['start_num'])? $deviceInfo['start_num'] : 0;
  136. $endNum = isset($deviceInfo['end_num'])? $deviceInfo['end_num'] : 0;
  137. $port = isset($deviceInfo['port'])? $deviceInfo['port'] : 0;
  138. if(empty($deviceInfo) || empty($deviceCode) || ($startNum >= $endNum) || !$port){
  139. RedisService::set("{$errorKey}:error_check", ['info'=> $deviceInfo], 3600);
  140. return false;
  141. }
  142. // 获取可用设备号
  143. $deviceNums = DevicesService::make()->getDeviceNums($deviceInfo);
  144. $deviceLampNo = $deviceNums? $deviceNums[0] : 0;
  145. if(empty($deviceLampNo)){
  146. RedisService::set("{$errorKey}:error_device", ['info'=> $deviceInfo,'nums'=> $deviceNums], 3600);
  147. return false;
  148. }
  149. // 亮灯处理
  150. unset($deviceNums[0]);
  151. RedisService::set("caches:devices:nums_{$deviceCode}", $deviceNums, rand(10,30));
  152. $colors = ['黄色','红色','绿色','白色'];
  153. shuffle($colors);
  154. $data = [
  155. 'CommandType'=> 'OpenLed', // 执行命令方式:OpenLed-开灯,CloseLed-关灯,QuitStatus-查询状态
  156. 'MD'=> $deviceCode, // 机器号设备号
  157. 'MDPORT'=> $port, // 设备端口:暂与设备号一致
  158. 'LEDID'=> $deviceLampNo, // 亮灯灯号1-498对应1号设备,498后为设备2
  159. 'Color'=> $colors[0], // 颜色
  160. 'OrderNo'=> $orderSn, // 订单号
  161. ];
  162. $dataStr = [];
  163. foreach($data as $k => $v){
  164. $dataStr[] = $k.'='.$v;
  165. }
  166. // 调用亮灯接口处理
  167. $dataStr = implode('&', $dataStr);
  168. $headers = ["Content-Type:application/x-www-form-urlencoded; charset=UTF-8"];
  169. $apiUrl = ConfigService::make()->getConfigByCode('gd_api_url').'/LEDControl.ashx';
  170. RedisService::set($errorKey.':request', ['url'=> $apiUrl,'data'=> $data], 3600);
  171. $result = httpHeaderRequest($apiUrl, $dataStr,'post',$headers,'text');
  172. RedisService::set($errorKey.':result', $result, 3600);
  173. // 更新灯状态
  174. if($result == 'True'){
  175. GongdengOrderModel::where('order_sn', $orderSn)->update(['lamp_status'=> 2,'device_num'=> $deviceLampNo,'params'=> json_encode($data, 256)]);
  176. return true;
  177. }else{
  178. return false;
  179. }
  180. }
  181. }