CardDevice.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. <?php
  2. namespace catchAdmin\device\controller;
  3. use catcher\base\CatchRequest as Request;
  4. use catcher\CatchResponse;
  5. use catcher\base\CatchController;
  6. use catchAdmin\device\model\Device as deviceModel;
  7. use catcher\Utils;
  8. use catcher\library\excel\Excel;
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  10. use catchAdmin\device\excel\BadgesExport;
  11. use catchAdmin\device\excel\CardsExport;
  12. use catchAdmin\permissions\model\Roles;
  13. use catchAdmin\permissions\model\Users;
  14. use catcher\generate\build\types\Arr;
  15. use \think\facade\Db;
  16. use think\facade\Cache;
  17. class CardDevice extends CatchController
  18. {
  19. protected $deviceModel;
  20. public function __construct(DeviceModel $deviceModel)
  21. {
  22. $this->deviceModel = $deviceModel;
  23. }
  24. /**
  25. * 列表
  26. * @time 2021年08月28日 16:57
  27. * @param Request $request
  28. */
  29. public function index(Request $request): \think\Response
  30. {
  31. $device_type = $request->get('device_type');
  32. $field = $request->get('field') ?: 'id';
  33. $order = $request->get('order') ?: 'desc';
  34. $list = $this->deviceModel->getDeviceList($device_type, $field, $order);
  35. foreach ($list as &$item) {
  36. if ($item['online_time'] < $item['wifi_online_time']) {
  37. $item['last_online_time'] = $item['wifi_online_time'];
  38. $item['longitude'] = $item['wifi_longitude'];
  39. $item['latitude'] = $item['wifi_latitude'];
  40. } else {
  41. $item['last_online_time'] = $item['online_time'];
  42. }
  43. }
  44. return CatchResponse::paginate($list);
  45. }
  46. /**
  47. * 根据用户id获取设备
  48. * @time 2021年08月28日 16:57
  49. * @param Request $request
  50. */
  51. public function getDeviceByUserId(Request $request): \think\Response
  52. {
  53. return CatchResponse::paginate($this->deviceModel->getList());
  54. }
  55. /**
  56. * 保存信息
  57. * @time 2021年08月28日 16:57
  58. * @param Request $request
  59. */
  60. public function save(Request $request): \think\Response
  61. {
  62. $depart_id = $request->post('department_id');
  63. if (!$depart_id) {
  64. return CatchResponse::fail('请选择所属部门');
  65. }
  66. $imei = $request->post('imei');
  67. if (!$imei) {
  68. return CatchResponse::fail('请输入设备imei号');
  69. }
  70. if (mb_strlen($imei) != 15) {
  71. return CatchResponse::fail('imei号格式不正确');
  72. }
  73. if ($this->deviceModel->where('imei', $imei)->find()) {
  74. return CatchResponse::fail('imei号已存在');
  75. }
  76. $creator_id = $request->post('creator_id');
  77. $type = $request->post('type');
  78. if ($type == 1) { //个人卡牌导入
  79. $data = array(
  80. 'department_id' => $depart_id,
  81. 'imei' => $imei,
  82. 'rfid' => substr($imei, -8),
  83. 'device_name' => '设备' . substr($imei, -4),
  84. 'alarm_state' => 0,
  85. 'device_type' => 0,
  86. 'use_state' => 0,
  87. 'net_state' => 2,
  88. 'creator_id' => $creator_id,
  89. 'created_at' => time(),
  90. 'updated_at' => time()
  91. );
  92. if (!$this->deviceModel->storeBy($data)) {
  93. return CatchResponse::fail('添加设备失败');
  94. }
  95. $redis=Cache::store('redis')->handler();
  96. $redis->rpush('c61_voice_cneter_add_list', $imei);
  97. return CatchResponse::success();
  98. } else {
  99. $realname = $request->post('realname');
  100. $user_no = $request->post('user_no');
  101. $phone = $request->post('phone');
  102. //realname user_no phone 有一个存在,其他也应该必填
  103. if (!$realname) {
  104. return CatchResponse::fail('请输入用户姓名');
  105. }
  106. if (!$user_no) {
  107. return CatchResponse::fail('请输入用户编号');
  108. }
  109. if (!$phone) {
  110. return CatchResponse::fail('请输入手机号码');
  111. }
  112. //添加用户
  113. $role_id_card_group = (new Roles())->where('identify', 'group_card_user')->value('id');
  114. $user_info = (new Users())
  115. ->alias('u')
  116. ->where('u.username', $phone)
  117. ->join('user_has_roles r', 'u.id = r.uid and r.role_id=' . $role_id_card_group)
  118. ->find();
  119. if ($user_info) {
  120. $uid = $user_info['uid'];
  121. (new Users())->where('id', $uid)->update(['realname' => $realname, 'user_no' => $user_no]);
  122. } else { //添加用户
  123. $user = array(
  124. 'username' => $phone,
  125. 'password' => substr($imei, -8),
  126. 'realname' => $realname,
  127. 'user_no' => $user_no,
  128. 'phone' => $phone,
  129. 'department_id' => $depart_id,
  130. 'creator_id' => $creator_id,
  131. 'created_at' => time(),
  132. 'updated_at' => time()
  133. );
  134. // var_dump($user);
  135. $uid = (new Users())->createBy($user);
  136. Db::table('user_has_roles')->insert(['uid' => $uid, 'role_id' => $role_id_card_group]);
  137. }
  138. //保存设备信息
  139. $data = array(
  140. 'department_id' => $depart_id,
  141. 'imei' => $imei,
  142. 'rfid' => substr($imei, -8),
  143. 'device_name' => '设备' . substr($imei, -4),
  144. 'user_id' => $uid,
  145. 'alarm_state' => 0,
  146. 'device_type' => 0,
  147. 'use_state' => 1,
  148. 'net_state' => 2,
  149. 'creator_id' => $creator_id,
  150. 'created_at' => time(),
  151. 'updated_at' => time()
  152. );
  153. //添加设备
  154. if ($this->deviceModel->storeBy($data)) {
  155. $redis=Cache::store('redis')->handler();
  156. $redis->rpush('c61_voice_cneter_add_list', $imei);
  157. return CatchResponse::success();
  158. }
  159. return CatchResponse::fail('添加设备失败');
  160. }
  161. }
  162. /**
  163. * 读取
  164. * @time 2021年08月28日 16:57
  165. * @param $id
  166. */
  167. public function read($id): \think\Response
  168. {
  169. return CatchResponse::success($this->deviceModel->findBy($id));
  170. }
  171. /**
  172. * 更新
  173. * @time 2021年08月28日 16:57
  174. * @param Request $request
  175. * @param $id
  176. */
  177. public function update(Request $request, $id): \think\Response
  178. {
  179. $depart_id = $request->post('department_id');
  180. if (!$depart_id) {
  181. return CatchResponse::fail('请选择所属部门');
  182. }
  183. $imei = $request->post('imei');
  184. if (count(explode(',', $imei)) > 1) {
  185. return CatchResponse::fail('imei格式不正确');
  186. }
  187. $check_id = $this->deviceModel->where('imei', $imei)->value('id');
  188. if ($check_id && $check_id != $id) {
  189. return CatchResponse::fail('imei号已存在');
  190. }
  191. //更新设备信息
  192. $data = array(
  193. 'department_id' => $depart_id,
  194. 'imei' => $imei,
  195. 'rfid' => substr($imei, -8),
  196. 'updated_at' => time()
  197. );
  198. if (isset(($request->post())['creator'])) {
  199. $data['creator_id'] = $request->post('creator');
  200. }
  201. if ($this->deviceModel->where('id', $id)->update($data)) {
  202. return CatchResponse::success();
  203. }
  204. return CatchResponse::fail('更新设备失败');
  205. // return CatchResponse::success($this->deviceModel->updateBy($id, $request->post()));
  206. }
  207. /**
  208. * 删除
  209. * @time 2021年08月28日 16:57
  210. * @param $id
  211. */
  212. public function delete($id): \think\Response
  213. {
  214. return CatchResponse::success($this->deviceModel->deleteBy($id, true));
  215. }
  216. /**
  217. * 查询告警列表
  218. * @time 2021年05月24日
  219. * @return \think\response\Json
  220. */
  221. public function queryAlarmList(Request $request): \think\Response
  222. {
  223. return CatchResponse::paginate($this->deviceModel->queryAlarmList());
  224. }
  225. /**
  226. * 导出
  227. *
  228. * @time 2020年09月08日
  229. * @param Excel $excel
  230. * @param DeviceExport $deviceExport
  231. * @throws \PhpOffice\PhpSpreadsheet\Exception
  232. * @return \think\response\Json
  233. */
  234. public function export_card(Excel $excel, CardsExport $CardsExport)
  235. {
  236. // var_dump(Utils::publicPath('export/users'));//导出路径
  237. return CatchResponse::success($excel->save($CardsExport, Utils::publicPath('export/cards'), 'local', '卡牌设备列表'));
  238. }
  239. /**
  240. * 导入卡牌设备
  241. *
  242. * @time 2020年09月08日
  243. * @param Excel $excel
  244. * @param DeviceExport $deviceExport
  245. * @throws \PhpOffice\PhpSpreadsheet\Exception
  246. * @return \think\response\Json
  247. */
  248. public function importCards(Request $request)
  249. {
  250. $url = $request->post('url');
  251. if (!$url) {
  252. return CatchResponse::fail('请上传文件');
  253. }
  254. $depart_id = $request->post('depart_id');
  255. if (!$depart_id) {
  256. return CatchResponse::fail('请选择部门');
  257. }
  258. $creator_id = $request->post('creator_id');
  259. //解析地址
  260. $parse_url = parse_url($url)['path'];
  261. //载入excel表格
  262. $objPHPExcel = IOFactory::load(public_path() . $parse_url);
  263. // var_dump($objPHPExcel);
  264. //获取表名,一维数组,值是表名。如:array('sheet1', 'sheet2', 'sheet3')
  265. // $nameArr = $objPHPExcel->getSheetNames();
  266. // var_dump($nameArr);
  267. //获取表的数量
  268. $sheetCount = $objPHPExcel->getSheetCount();
  269. $fail = 0; //失败条数
  270. $success = 0; //成功条数
  271. $total = 0; //总共学生数
  272. $personal_data = []; //个人卡牌
  273. $group_data = []; //团体卡牌
  274. //循环读取每一张表
  275. for ($index = 0; $index < $sheetCount; $index++) {
  276. //设置当前要读取的表
  277. $sheet = $objPHPExcel->getSheet($index); //excel中的第一张sheet
  278. // var_dump($sheet);exit;
  279. $highestRow = $sheet->getHighestRow(); // 取得总行数
  280. // var_dump($highestRow);
  281. if ($highestRow <= 2) {
  282. continue;
  283. }
  284. $total += $highestRow - 2;
  285. for ($j = 3; $j <= $highestRow; $j++) {
  286. $data = array(); //每条学生信息
  287. $imei = trim($sheet->getCell("A" . $j)->getFormattedValue()); //imei
  288. // var_dump($imei);
  289. if (mb_strlen($imei) != 15) {
  290. $fail++;
  291. $msg = '导入设备:' . $imei . '失败:imei编号格式不正确';
  292. $this->importFailLog($msg);
  293. continue;
  294. }
  295. $realname = trim($sheet->getCell("B" . $j)->getFormattedValue()); //姓名
  296. $user_no = trim($sheet->getCell("C" . $j)->getFormattedValue()); //用户编号
  297. $phone = trim($sheet->getCell("D" . $j)->getFormattedValue()); //手机号
  298. if (!$realname && !$user_no && !$phone) { //导入个人用户设备
  299. $data = array(
  300. 'department_id' => $depart_id,
  301. 'imei' => $imei,
  302. 'rfid' => substr($imei, -8),
  303. 'device_name' => '设备' . substr($imei, -4),
  304. 'alarm_state' => 0,
  305. 'device_type' => 0,
  306. 'use_state' => 0,
  307. 'net_state' => 2,
  308. 'creator_id' => $creator_id,
  309. 'created_at' => time(),
  310. 'updated_at' => time()
  311. );
  312. //查询设备
  313. $info = $this->deviceModel->where('imei', $imei)->find();
  314. if ($info) {
  315. $fail++;
  316. $msg = '导入设备:' . $imei . '失败:imei编号已存在';
  317. $this->importFailLog($msg);
  318. continue;
  319. }
  320. //添加设备
  321. // if ($this->deviceModel->createBy($data)) {
  322. // $success++;
  323. // } else {
  324. // $fail++;
  325. // $msg = '导入设备:' . $imei . '失败:添加设备失败';
  326. // $this->importFailLog($msg);
  327. // continue;
  328. // }
  329. array_push($personal_data, $data);
  330. } else { //团体用户设备
  331. if (!$realname) {
  332. $fail++;
  333. $msg = '导入设备:' . $imei . '失败:用户姓名不存在';
  334. $this->importFailLog($msg);
  335. continue;
  336. }
  337. if (!$user_no) {
  338. $fail++;
  339. $msg = '导入设备:' . $imei . '失败:用户编号不存在';
  340. $this->importFailLog($msg);
  341. continue;
  342. }
  343. if (!$phone) {
  344. $fail++;
  345. $msg = '导入设备:' . $imei . '失败:用户手机号不存在';
  346. $this->importFailLog($msg);
  347. continue;
  348. }
  349. //保存用户信息
  350. $role_id_card_group = (new Roles())->where('identify', 'group_card_user')->value('id');
  351. $user_info = (new Users())
  352. ->alias('u')
  353. ->where('u.phone', $phone)
  354. ->join('user_has_roles r', 'u.id = r.uid and r.role_id=' . $role_id_card_group)
  355. ->find();
  356. if ($user_info) {
  357. $uid = $user_info['uid'];
  358. (new Users())->where('id', $uid)->update(['realname' => $realname, 'user_no' => $user_no]);
  359. } else { //添加用户
  360. $user = array(
  361. 'username' => $phone,
  362. 'password' => substr($imei, -8),
  363. 'realname' => $realname,
  364. 'user_no' => $user_no,
  365. 'phone' => $phone,
  366. 'department_id' => $depart_id,
  367. 'creator_id' => $creator_id,
  368. 'created_at' => time(),
  369. 'updated_at' => time()
  370. );
  371. // var_dump($user);
  372. $uid = (new Users())->createBy($user);
  373. Db::table('user_has_roles')->insert(['uid' => $uid, 'role_id' => $role_id_card_group]);
  374. }
  375. //保存设备信息
  376. $data = array(
  377. 'department_id' => $depart_id,
  378. 'imei' => $imei,
  379. 'rfid' => substr($imei, -8),
  380. 'device_name' => '设备' . substr($imei, -4),
  381. 'user_id' => $uid,
  382. 'alarm_state' => 0,
  383. 'device_type' => 0,
  384. 'use_state' => 1,
  385. 'net_state' => 2,
  386. 'creator_id' => $creator_id,
  387. 'created_at' => time(),
  388. 'updated_at' => time()
  389. );
  390. //查询设备
  391. $info = $this->deviceModel->where('imei', $imei)->find();
  392. if ($info) {
  393. $fail++;
  394. $msg = '导入设备:' . $imei . '失败:imei编号已存在';
  395. $this->importFailLog($msg);
  396. continue;
  397. }
  398. //添加设备
  399. // if ($this->deviceModel->createBy($data)) {
  400. // $success++;
  401. // } else {
  402. // $fail++;
  403. // $msg = '导入设备:' . $imei . '失败:添加设备失败';
  404. // $this->importFailLog($msg);
  405. // continue;
  406. // }
  407. array_push($group_data, $data);
  408. }
  409. }
  410. }
  411. array_unique($personal_data, SORT_REGULAR);
  412. array_unique($group_data, SORT_REGULAR);
  413. $count1 = $this->deviceModel->limit(100)->insertAll($personal_data);
  414. $count2 = $this->deviceModel->limit(100)->insertAll($group_data);
  415. $redis=Cache::store('redis')->handler();
  416. foreach($personal_data as $value){
  417. $redis->rpush('c61_voice_cneter_add_list', $value['imei']);
  418. }
  419. foreach($group_data as $value){
  420. $redis->rpush('c61_voice_cneter_add_list', $value['imei']);
  421. }
  422. if ($success = $count1 + $count2) {
  423. return CatchResponse::success('共' . $total . '条数据,成功' . $success . '条,失败' . $fail . '条');
  424. }
  425. return CatchResponse::success(['error' => true, 'msg' => '导入失败']);
  426. // return CatchResponse::success('共' . $total . '条数据,成功' . $success . '条,失败' . $fail . '条');
  427. }
  428. /**
  429. * 导入设备失败日志
  430. */
  431. public function importFailLog($msg)
  432. {
  433. $file = runtime_path() . '/log/' . date("Ymd", time()) . "/import_devices_fail.log";
  434. $folder = dirname($file);
  435. if (!is_dir($folder)) {
  436. mkdir($folder, 0777, true);
  437. }
  438. file_put_contents($file, '[' . date('Y-m-d H:i:s') . ']' . $msg . PHP_EOL, FILE_APPEND);
  439. }
  440. /**
  441. * 检测下发配置选项
  442. */
  443. public function checkConfig(Request $request): \think\Response
  444. {
  445. // var_dump($request->post('ids'));
  446. $ids = $request->post('ids');
  447. if (empty($ids)) {
  448. return CatchResponse::fail('未选中设备');
  449. }
  450. $has_use_num = 0;
  451. foreach ($ids as $v) {
  452. if ($this->deviceModel->where('id', $v)->value('use_state')) {
  453. $has_use_num++;
  454. }
  455. }
  456. if (count($ids) != $has_use_num) {
  457. // return CatchResponse::fail('所选项含有未注册设备');
  458. }
  459. return CatchResponse::success();
  460. }
  461. /**
  462. * 下发录音配置
  463. */
  464. public function sendVoiceConfig(Request $request): \think\Response
  465. {
  466. $ids = $request->post('ids');
  467. $config = $request->post('config');
  468. if (empty($ids)) {
  469. return CatchResponse::fail('未选择设备');
  470. }
  471. if (empty($config)) {
  472. return CatchResponse::fail('至少配置一项');
  473. }
  474. // $config['is_enabled'] = $config['is_enabled'] ? 1 : 0;
  475. if (!$config['srv_addr']) {
  476. unset($config['srv_addr']);
  477. }
  478. if (!$config['srv_port']) {
  479. unset($config['srv_port']);
  480. } else {
  481. $config['srv_port'] = intval($config['srv_port']);
  482. }
  483. // if (!$config['max_ppt_duration_ms']) {
  484. // unset($config['max_ppt_duration_ms']);
  485. // } else {
  486. // $config['max_ppt_duration_ms'] = intval($config['max_ppt_duration_ms']);
  487. // }
  488. $config['msg_id'] = 0xAAAA0008;
  489. Db::startTrans();
  490. $fail_imei = '';
  491. foreach ($ids as $id) {
  492. $imei = $this->deviceModel->where('id', $id)->value('imei');
  493. if (!$imei) {
  494. continue;
  495. }
  496. //下发日志
  497. $log_data = array(
  498. 'send_contents' => json_encode($config),
  499. 'imei' => $imei,
  500. 'type' => 'voice',
  501. 'created_at' => time(),
  502. 'device_id' => $id
  503. );
  504. $id = Db::table('send_config_log')->insertGetId($log_data);
  505. if (!$id) {
  506. $fail_imei += $imei . ' ';
  507. Db::rollback();
  508. }
  509. $config['id'] = $id;
  510. $redis = Cache::store('redis')->handler();
  511. $res = $redis->rpush('c61_gps_device_configs_' . $imei, json_encode($config));
  512. if (!$res) {
  513. $fail_imei += $imei . ' ';
  514. Db::rollback();
  515. }
  516. }
  517. if ($fail_imei != '') {
  518. return CatchResponse::fail('下发失败');
  519. }
  520. Db::commit();
  521. return CatchResponse::success('下发成功');
  522. }
  523. /**
  524. * 下发传感器配置
  525. */
  526. public function sendSensorConfig(Request $request): \think\Response
  527. {
  528. $ids = $request->post('ids');
  529. $config = $request->post('config');
  530. if (empty($ids)) {
  531. return CatchResponse::fail('未选择设备');
  532. }
  533. if (empty($config)) {
  534. return CatchResponse::fail('至少配置一项');
  535. }
  536. if (!$config['stopped_rtc_invl']) {
  537. unset($config['stopped_rtc_invl']);
  538. } else {
  539. $config['stopped_rtc_invl'] = intval($config['stopped_rtc_invl']);
  540. }
  541. if (!$config['stopped_rpt_invl']) {
  542. unset($config['stopped_rpt_invl']);
  543. } else {
  544. $config['stopped_rpt_invl'] = intval($config['stopped_rpt_invl']);
  545. }
  546. if (!$config['not_moving_threshold']) {
  547. unset($config['not_moving_threshold']);
  548. } else {
  549. $config['not_moving_threshold'] = intval($config['not_moving_threshold']);
  550. }
  551. if (!$config['stopped_rtc_invl']) {
  552. unset($config['stopped_rtc_invl']);
  553. } else {
  554. $config['stopped_rtc_invl'] = intval($config['stopped_rtc_invl']);
  555. }
  556. if (!$config['stopped_rpt_invl']) {
  557. unset($config['stopped_rpt_invl']);
  558. } else {
  559. $config['stopped_rpt_invl'] = intval($config['stopped_rpt_invl']);
  560. }
  561. if (!$config['tbd_cnt_max']) {
  562. unset($config['tbd_cnt_max']);
  563. } else {
  564. $config['tbd_cnt_max'] = intval($config['tbd_cnt_max']);
  565. }
  566. if (empty($config)) {
  567. return CatchResponse::fail('您还没有配置任何一项');
  568. }
  569. $config['msg_id'] = 0xAAAA0007;
  570. Db::startTrans();
  571. $fail_imei = '';
  572. foreach ($ids as $id) {
  573. $imei = $this->deviceModel->where('id', $id)->value('imei');
  574. if (!$imei) {
  575. continue;
  576. }
  577. //下发日志
  578. $log_data = array(
  579. 'send_contents' => json_encode($config),
  580. 'imei' => $imei,
  581. 'created_at' => time(),
  582. 'type' => 'sensor',
  583. 'device_id' => $id
  584. );
  585. $id = Db::table('send_config_log')->insertGetId($log_data);
  586. if (!$id) {
  587. $fail_imei += $imei . ' ';
  588. Db::rollback();
  589. }
  590. $config['id'] = $id;
  591. $redis = Cache::store('redis')->handler();
  592. $res = $redis->rpush('c61_gps_device_configs_' . $imei, json_encode($config));
  593. if (!$res) {
  594. $fail_imei += $imei . ' ';
  595. Db::rollback();
  596. }
  597. }
  598. if ($fail_imei != '') {
  599. return CatchResponse::fail('下发失败');
  600. }
  601. Db::commit();
  602. return CatchResponse::success('下发成功');
  603. }
  604. /**
  605. * 下发gps配置
  606. */
  607. public function sendGpsConfig(Request $request): \think\Response
  608. {
  609. $ids = $request->post('ids');
  610. $config = $request->post('config');
  611. if (empty($ids)) {
  612. return CatchResponse::fail('未选择设备');
  613. }
  614. if (empty($config)) {
  615. return CatchResponse::fail('至少配置一项');
  616. }
  617. $config['pos_mode'] = intval($config['pos_mode']);
  618. // $config['msg_id'] = 0xAAAA0001;
  619. $config['msg_id'] = 0xAAAA0010;
  620. Db::startTrans();
  621. $fail_imei = '';
  622. foreach ($ids as $id) {
  623. $imei = $this->deviceModel->where('id', $id)->value('imei');
  624. if (!$imei) {
  625. continue;
  626. }
  627. //判断是不是定时模式
  628. if ($config['pos_mode'] == 2) {
  629. $config_arr = array(
  630. 'stopped_rtc_invl' => intval($config['stopped_rtc_invl']),
  631. 'stopped_rpt_invl' => intval($config['stopped_rpt_invl']),
  632. 'msg_id' => 0xAAAA0007
  633. );
  634. //下发日志
  635. $log_data = array(
  636. 'send_contents' => json_encode($config_arr),
  637. 'imei' => $imei,
  638. 'type' => 'sensor',
  639. 'created_at' => time(),
  640. 'device_id' => $id
  641. );
  642. $lg_id = Db::table('send_config_log')->insertGetId($log_data);
  643. if (!$lg_id) {
  644. $fail_imei += $imei . ' ';
  645. Db::rollback();
  646. }
  647. $config_arr['id'] = $lg_id;
  648. $redis = Cache::store('redis')->handler();
  649. $res = $redis->rpush('c61_gps_device_configs_' . $imei, json_encode($config_arr));
  650. if (!$res) {
  651. $fail_imei += $imei . ' ';
  652. Db::rollback();
  653. }
  654. }else{
  655. $config_arr = array(
  656. 'stopped_rtc_invl' => 3000,
  657. 'stopped_rpt_invl' => 3600,
  658. 'msg_id' => 0xAAAA0007
  659. );
  660. //下发日志
  661. $log_data = array(
  662. 'send_contents' => json_encode($config_arr),
  663. 'imei' => $imei,
  664. 'type' => 'sensor',
  665. 'created_at' => time(),
  666. 'device_id' => $id
  667. );
  668. $lg_id = Db::table('send_config_log')->insertGetId($log_data);
  669. if (!$lg_id) {
  670. $fail_imei += $imei . ' ';
  671. Db::rollback();
  672. }
  673. $config_arr['id'] = $lg_id;
  674. $redis = Cache::store('redis')->handler();
  675. $res = $redis->rpush('c61_gps_device_configs_' . $imei, json_encode($config_arr));
  676. if (!$res) {
  677. $fail_imei += $imei . ' ';
  678. Db::rollback();
  679. }
  680. }
  681. //重新赋值 删除多余参数
  682. $mode_config=$config;
  683. unset($mode_config['stopped_rpt_invl'],$mode_config['stopped_rtc_invl']);
  684. //下发日志
  685. $log_data = array(
  686. 'send_contents' => json_encode($mode_config),
  687. 'imei' => $imei,
  688. 'type' => 'pos_mode',
  689. 'created_at' => time(),
  690. 'device_id' => $id
  691. );
  692. $id = Db::table('send_config_log')->insertGetId($log_data);
  693. if (!$id) {
  694. $fail_imei += $imei . ' ';
  695. Db::rollback();
  696. }
  697. $mode_config['id'] = $id;
  698. $redis = Cache::store('redis')->handler();
  699. $res = $redis->rpush('c61_gps_device_configs_' . $imei, json_encode($mode_config));
  700. if (!$res) {
  701. $fail_imei += $imei . ' ';
  702. Db::rollback();
  703. }
  704. }
  705. if ($fail_imei != '') {
  706. return CatchResponse::fail('下发失败');
  707. }
  708. Db::commit();
  709. return CatchResponse::success('下发成功');
  710. }
  711. /**
  712. * 设备终端操作命令
  713. */
  714. public function sendcmd(Request $request): \think\Response
  715. {
  716. $ids = $request->post('ids');
  717. if (empty($ids)) {
  718. return CatchResponse::fail('未选择设备');
  719. }
  720. $config['msg_id'] = 0xAAAA0011;
  721. $config['cmd'] = intval($request->post('cmd'));
  722. Db::startTrans();
  723. $fail_imei = '';
  724. foreach ($ids as $id) {
  725. $imei = $this->deviceModel->where('id', $id)->value('imei');
  726. if (!$imei) {
  727. continue;
  728. }
  729. //下发日志
  730. $log_data = array(
  731. 'send_contents' => json_encode($config),
  732. 'imei' => $imei,
  733. 'type' => 'cmd',
  734. 'created_at' => time(),
  735. 'device_id' => $id
  736. );
  737. $id = Db::table('send_config_log')->insertGetId($log_data);
  738. if (!$id) {
  739. $fail_imei += $imei . ' ';
  740. Db::rollback();
  741. }
  742. $config['id'] = $id;
  743. $redis = Cache::store('redis')->handler();
  744. $res = $redis->rpush('c61_gps_device_configs_' . $imei, json_encode($config));
  745. if (!$res) {
  746. $fail_imei += $imei . ' ';
  747. Db::rollback();
  748. }
  749. }
  750. if ($fail_imei != '') {
  751. return CatchResponse::fail('操作失败');
  752. }
  753. Db::commit();
  754. return CatchResponse::success('操作成功');
  755. }
  756. /*
  757. 默认配置
  758. */
  759. public function getDefaultConfig()
  760. {
  761. $type_id = Db::table('sys_dict_type')->where('code', 'DeviceConfigDefault')->value('id');
  762. $list = Db::table('sys_dict_data')->where('type_id', $type_id)->field('code,value,sort')->select();
  763. $cnf1 = [];
  764. $cnf2 = [];
  765. $cnf3 = [];
  766. foreach ($list as $value) {
  767. if ($value['sort'] == 1) {
  768. // array_push($cnf1,[$value['code']=>$value['value']]);
  769. if ($value['value'] == 'true') {
  770. $value['value'] = true;
  771. }
  772. $cnf1[$value['code']] = $value['value'];
  773. }
  774. if ($value['sort'] == 2) {
  775. $cnf2[$value['code']] = $value['value'];
  776. }
  777. if ($value['sort'] == 3) {
  778. $cnf3[$value['code']] = $value['value'];
  779. $cnf3['stopped_rtc_invl'] = '50';
  780. $cnf3['stopped_rpt_invl'] = '300';
  781. }
  782. }
  783. $config = array(
  784. 'voice_config' => $cnf1,
  785. 'sensor_config' => $cnf2,
  786. 'gps_config' => $cnf3,
  787. );
  788. return CatchResponse::success($config);
  789. }
  790. }