VM暫存
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

740 linhas
23KB

  1. <?php
  2. /*
  3. file: Sync_data_model.php 資料同步相關
  4. */
  5. define('SYNC_DATA_LOG_TITLE', 'sync://'); // LOG (sync)
  6. define('SYNC_PKS_GROUP_ID_CI', 'C888'); // 汽車 888
  7. define('SYNC_PKS_GROUP_ID_MI', 'M888'); // 機車 888
  8. define('SYNC_API_URL', 'http://61.219.172.11:60123/admins_station.html/');
  9. define('SYNC_DELIMITER_ST_NAME', ' & '); // (拆分) 場站名稱
  10. define('SYNC_DELIMITER_ST_NO', ','); // (拆分) 場站編號
  11. define('SYNC_DELIMITER_ST_INFO', '|'); // (拆分) 其它
  12. define('MCACHE_STATION_NO_STR', 'station_no_str');
  13. define('MCACHE_STATION_NAME_STR', 'station_name_str');
  14. define('MCACHE_STATION_IP_STR', 'station_ip_str');
  15. define('MCACHE_STATION_888_STR', 'station_888_str');
  16. define('MCACHE_MQTT_IP_STR', 'mqtt_ip_str');
  17. define('MCACHE_SYNC_888_TMP_LOG', 'sync_888_tmp_log'); // 暫存 888 進出
  18. class Sync_data_model extends CI_Model
  19. {
  20. var $vars = array();
  21. function __construct()
  22. {
  23. parent::__construct();
  24. $this->load->database();
  25. }
  26. public function init($vars)
  27. {
  28. $this->vars = $vars;
  29. }
  30. // 送出至message queue(目前用mqtt)
  31. public function mq_send($topic, $msg)
  32. {
  33. $this->vars['mqtt']->publish($topic, $msg, 0);
  34. trigger_error("mqtt:{$topic}|{$msg}");
  35. }
  36. // ------------------------------------------------
  37. //
  38. // 在席系統同步 (START)
  39. //
  40. // ------------------------------------------------
  41. // 同步 888
  42. public function sync_888($parms)
  43. {
  44. $result = -888;
  45. if(!isset($parms['lpr']) || !isset($parms['etag']) || !isset($parms['io']) ||
  46. ($parms['lpr'] == 'NONE' && $parms['etag'] == 'NONE')
  47. )
  48. {
  49. trigger_error(__FUNCTION__ . '..NONE..'. print_r($parms, true));
  50. return $result;
  51. }
  52. trigger_error(__FUNCTION__ . "..{$parms['sno']}|{$parms['io']}|{$parms['lpr']}|{$parms['etag']}..");
  53. // [START] 擋相同車號進出
  54. $skip_or_not = false;
  55. $new_cars_tmp = array
  56. (
  57. 'timestamp' => time(),
  58. 'sno_io' => $parms['sno'] . $parms['io'],
  59. 'lpr' => $parms['lpr'],
  60. 'etag' => $parms['etag']
  61. );
  62. $cars_tmp_log_arr = $this->vars['mcache']->get(MCACHE_SYNC_888_TMP_LOG);
  63. if(empty($cars_tmp_log_arr))
  64. {
  65. $cars_tmp_log_arr = array();
  66. }
  67. if(isset($cars_tmp_log_arr[$new_cars_tmp['sno_io']]))
  68. {
  69. $last_cars_tmp = $cars_tmp_log_arr[$new_cars_tmp['sno_io']];
  70. // 判斷是否跳過 (記錄於一小時內, 相同場站進出 lpr 或 etag)
  71. if( ( ($last_cars_tmp['lpr'] == $new_cars_tmp['lpr'] && $last_cars_tmp['lpr'] != 'NONE') ||
  72. ($last_cars_tmp['etag'] == $new_cars_tmp['etag'] && $last_cars_tmp['etag'] != 'NONE') ) && $last_cars_tmp['timestamp'] > $new_cars_tmp['timestamp'] - 3600
  73. )
  74. $skip_or_not = true;
  75. }
  76. // 更新
  77. $cars_tmp_log_arr[$new_cars_tmp['sno_io']] = $new_cars_tmp;
  78. $this->vars['mcache']->set(MCACHE_SYNC_888_TMP_LOG, $cars_tmp_log_arr);
  79. trigger_error(__FUNCTION__ . '..upd ' . MCACHE_SYNC_888_TMP_LOG . " |s:{$skip_or_not}|" . print_r($cars_tmp_log_arr, true));
  80. // 跳過
  81. if($skip_or_not)
  82. {
  83. trigger_error(__FUNCTION__ . '..skip..');
  84. return false;
  85. }
  86. // [END] 擋相同車號進出
  87. switch($parms['io'])
  88. {
  89. // 入場
  90. case 'CI':
  91. $result = $this->pks_availables_update(SYNC_PKS_GROUP_ID_CI, -1, false, $parms['sno']);
  92. break;
  93. case 'MI':
  94. $result = $this->pks_availables_update(SYNC_PKS_GROUP_ID_MI, -1, false, $parms['sno']);
  95. break;
  96. // 出場
  97. case 'CO':
  98. $result = $this->pks_availables_update(SYNC_PKS_GROUP_ID_CI, 1, false, $parms['sno']);
  99. break;
  100. case 'MO':
  101. $result = $this->pks_availables_update(SYNC_PKS_GROUP_ID_MI, 1, false, $parms['sno']);
  102. break;
  103. }
  104. return $result;
  105. }
  106. // 微調剩餘車位數
  107. public function pks_availables_update($group_id, $value, $is_renum=true, $station_no=STATION_NO)
  108. {
  109. $where_group_arr = array('group_id' => $group_id, 'station_no' => $station_no);
  110. $rows = $this->db->select('renum, parked, tot')
  111. ->from('pks_groups')
  112. ->where($where_group_arr)
  113. ->limit(1)
  114. ->get()
  115. ->row_array();
  116. $renum = $rows['renum'];
  117. $parked = $rows['parked'];
  118. $tot = $rows['tot'];
  119. trigger_error("更新車位數|{$group_id}|{$value}|{$is_renum}|".print_r($rows, true));
  120. if($is_renum)
  121. {
  122. // 一般微調
  123. if($value == 0)
  124. {
  125. $this->db->where($where_group_arr)
  126. ->update('pks_groups', array('renum' => 0, 'parked' => 0, 'availables' => $tot));
  127. trigger_error(__FUNCTION__ . '..reset everything and exit..');
  128. return true; // 中斷
  129. }
  130. else if($value >= 1)
  131. {
  132. // 增加
  133. $renum = $renum + 1;
  134. }
  135. else
  136. {
  137. // 減少
  138. $renum = $renum - 1;
  139. }
  140. $availables = $tot - $parked + $renum;
  141. // 防止負值
  142. if($availables <= 0)
  143. {
  144. $availables = 0;
  145. $parked = $tot;
  146. $renum = 0;
  147. trigger_error(__FUNCTION__ . '..ava < 0..auto set (ava = 0, parked = tot, renum = 0)..');
  148. }
  149. else if($availables >= $tot)
  150. {
  151. $availables = $tot;
  152. $parked = 0;
  153. $renum = 0;
  154. trigger_error(__FUNCTION__ . '..ava > tot..auto set (ava = tot, parked = 0, renum = 0)..');
  155. }
  156. // 更新 db
  157. $this->db->where($where_group_arr)
  158. ->update('pks_groups', array('parked' => $parked, 'availables' => $availables, 'renum' => $renum));
  159. }
  160. else
  161. {
  162. // 進出場
  163. if($value == 0)
  164. {
  165. trigger_error(__FUNCTION__ . '..??? exit..');
  166. return true; // 中斷
  167. }
  168. else if($value >= 1)
  169. {
  170. // 已停車位數減少, 空車位數增加
  171. $parked = $parked - 1;
  172. }
  173. else
  174. {
  175. // 已停車位數增加, 空車位數減少
  176. $parked = $parked + 1;
  177. }
  178. /*
  179. // 防止負值
  180. if($parked < 0)
  181. {
  182. $parked = 0;
  183. $renum = 0; // 自動重設 renum
  184. trigger_error(__FUNCTION__ . '..parked < 0..set (parked = 0, renum = 0)..');
  185. }
  186. else if($parked >= $tot)
  187. {
  188. $parked = $tot;
  189. $renum = 0; // 自動重設 renum
  190. trigger_error(__FUNCTION__ . '..parked > tot.. = tot..set (parked = tot, renum = 0)..');
  191. }
  192. */
  193. $availables = $tot - $parked + $renum;
  194. // 防止負值
  195. if($availables <= 0)
  196. {
  197. $availables = 0;
  198. $parked = $tot;
  199. $renum = 0;
  200. trigger_error(__FUNCTION__ . '..ava < 0..auto set (ava = 0, parked = tot, renum = 0)..');
  201. }
  202. else if($availables >= $tot)
  203. {
  204. $availables = $tot;
  205. $parked = 0;
  206. $renum = 0;
  207. trigger_error(__FUNCTION__ . '..ava > tot..auto set (ava = tot, parked = 0, renum = 0)..');
  208. }
  209. // 更新 db
  210. $this->db->where($where_group_arr)
  211. ->update('pks_groups', array('parked' => $parked, 'availables' => $availables, 'renum' => $renum));
  212. }
  213. // 送出即時訊號
  214. if($group_id == SYNC_PKS_GROUP_ID_CI)
  215. {
  216. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_888 . ",1,{$availables}" . MQ_ALTOB_888_END_TAG); // 送出 888 (汽車)
  217. }
  218. else if($group_id == SYNC_PKS_GROUP_ID_MI)
  219. {
  220. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_888 . ",2,{$availables}" . MQ_ALTOB_888_END_TAG); // 送出 888 (機車)
  221. }
  222. else
  223. {
  224. $availables_pad = str_pad($availables, 3, '0', STR_PAD_LEFT); // 補零
  225. $this->mq_send(MQ_TOPIC_SUBLEVEL, "{$group_id},{$availables_pad}"); // 送出剩餘車位數給字幕機
  226. }
  227. return $this->db->affected_rows();
  228. }
  229. // ------------------------------------------------
  230. //
  231. // 在席系統同步 (END)
  232. //
  233. // ------------------------------------------------
  234. // ------------------------------------------------
  235. //
  236. // 中控接收端 (START)
  237. //
  238. // ------------------------------------------------
  239. // 同步場站會員 (功能: 會員同步)
  240. public function sync_members($info_arr=array('station_no_arr' => STATION_NO))
  241. {
  242. $data_member_arr = array();
  243. $data_car_arr = array();
  244. try{
  245. // 查現況
  246. $ch = curl_init();
  247. curl_setopt($ch, CURLOPT_URL, SYNC_API_URL . 'member_query_all_in_one');
  248. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  249. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  250. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  251. curl_setopt($ch, CURLOPT_POST, TRUE);
  252. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,10);
  253. curl_setopt($ch, CURLOPT_TIMEOUT, 10); //timeout in seconds
  254. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($info_arr));
  255. $data = curl_exec($ch);
  256. curl_close($ch);
  257. }catch (Exception $e){
  258. trigger_error('error msg:'.$e->getMessage());
  259. trigger_error(SYNC_DATA_LOG_TITLE . $e->getMessage());
  260. }
  261. $data_member_arr = json_decode($data, true);
  262. if (sizeof($data_member_arr) <= 0)
  263. {
  264. trigger_error(SYNC_DATA_LOG_TITLE . '.. empty ..'); // 忽略完全沒會員的情況
  265. return 'empty';
  266. }
  267. else
  268. {
  269. foreach($data_member_arr as $data)
  270. {
  271. // create member_car
  272. $data_car = array
  273. (
  274. 'station_no' => $data['station_no'],
  275. 'member_no' => $data['member_no'],
  276. 'lpr' => $data['lpr'],
  277. 'lpr_correct' => $data['lpr'],
  278. 'etag' => $data['etag'],
  279. 'start_time' => $data['start_date'],
  280. 'end_time' => $data['end_date']
  281. );
  282. array_push($data_car_arr, $data_car);
  283. }
  284. }
  285. //trigger_error(SYNC_DATA_LOG_TITLE . '.. test ..' . print_r($data_member_arr, true));
  286. $this->db->trans_start();
  287. // 清空
  288. $this->db->empty_table('members');
  289. $this->db->empty_table('member_car');
  290. // 建立 members
  291. $this->db->insert_batch('members', $data_member_arr);
  292. // 建立 member_car
  293. $this->db->insert_batch('member_car', $data_car_arr);
  294. $this->db->trans_complete();
  295. if ($this->db->trans_status() === FALSE)
  296. {
  297. trigger_error(SYNC_DATA_LOG_TITLE . '.. sync fail ..'. '| last_query: ' . $this->db->last_query());
  298. return 'fail';
  299. }
  300. trigger_error(SYNC_DATA_LOG_TITLE . '.. sync completed ..');
  301. return 'ok';
  302. }
  303. // 同步車牌更換 (功能: 換車牌同步)
  304. public function sync_switch_lpr($switch_lpr_arr)
  305. {
  306. trigger_error( __FUNCTION__ . '..' . print_r($switch_lpr_arr, true));
  307. $this->db->trans_start();
  308. foreach($switch_lpr_arr as $data)
  309. {
  310. $station_no = $data['station_no'];
  311. $member_no = $data['member_no'];
  312. $old_lpr = $data['old_lpr'];
  313. $new_lpr = $data['new_lpr'];
  314. $new_data = array('lpr' => $new_lpr, 'lpr_correct' => $new_lpr, 'member_no' => $member_no);
  315. $this->db->update('etag_lpr', $new_data, array('lpr_correct' => $old_lpr));
  316. $affect_rows = $this->db->affected_rows();
  317. trigger_error(SYNC_DATA_LOG_TITLE . "換車牌更新 etag_lpr 共[{$affect_rows}]筆..".print_r($data, true));
  318. /*
  319. if($station_no == STATION_NO)
  320. {
  321. $new_data = array('lpr' => $new_lpr, 'lpr_correct' => $new_lpr, 'member_no' => $member_no);
  322. $this->db->update('etag_lpr', $new_data, array('lpr_correct' => $old_lpr));
  323. $affect_rows = $this->db->affected_rows();
  324. trigger_error(SYNC_DATA_LOG_TITLE . "換車牌更新 etag_lpr 共[{$affect_rows}]筆..".print_r($data, true));
  325. }
  326. else
  327. {
  328. trigger_error(SYNC_DATA_LOG_TITLE . __FUNCTION__ . "..資料異常..".print_r($data, true));
  329. }
  330. */
  331. }
  332. $this->db->trans_complete();
  333. if ($this->db->trans_status() === FALSE)
  334. {
  335. trigger_error(SYNC_DATA_LOG_TITLE . '.. sync fail ..'. '| last_query: ' . $this->db->last_query());
  336. return 'fail';
  337. }
  338. trigger_error(SYNC_DATA_LOG_TITLE . '.. sync completed ..');
  339. return 'ok';
  340. }
  341. // 同步場站費率
  342. public function sync_price_plan($info_arr=array('station_no_arr' => STATION_NO))
  343. {
  344. try{
  345. // 查另一台主機
  346. $ch = curl_init();
  347. curl_setopt($ch, CURLOPT_URL, SYNC_API_URL . 'price_plan_query_all_in_one');
  348. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  349. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  350. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  351. curl_setopt($ch, CURLOPT_POST, TRUE);
  352. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,5);
  353. curl_setopt($ch, CURLOPT_TIMEOUT, 5); //timeout in seconds
  354. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($info_arr));
  355. $data = curl_exec($ch);
  356. curl_close($ch);
  357. }catch (Exception $e){
  358. trigger_error('error msg:'.$e->getMessage());
  359. }
  360. $decode_result = json_decode($data, true);
  361. if (sizeof($decode_result) <= 0) return "empty";
  362. $this->db->trans_start();
  363. foreach ($decode_result as $key => $value)
  364. {
  365. $station_no = $value["station_no"];
  366. $tx_price_plan_id = $value["txid"];
  367. $tx_type = $value["tx_type"];
  368. $price_plan_data = array
  369. (
  370. 'station_no' => $station_no,
  371. 'tx_type' => $tx_type,
  372. 'remarks' => $value['remarks'],
  373. 'price_plan' => $value['price_plan'],
  374. 'start_time' => $value['start_time'],
  375. 'valid_time' => $value['valid_time']
  376. );
  377. // 刪除
  378. $this->db->delete('tx_price_plan', array('station_no' => $station_no, 'tx_type' => $tx_type));
  379. // 新增
  380. $this->db->insert('tx_price_plan', $price_plan_data);
  381. }
  382. $this->db->trans_complete();
  383. return "ok";
  384. }
  385. // 取得最新未結清 (功能: 行動支付)
  386. public function get_last_unbalanced_cario($lpr, $station_no)
  387. {
  388. $sql = "SELECT station_no, cario_no, in_time, pay_time, out_time, out_before_time, member_no
  389. FROM cario
  390. WHERE
  391. station_no = '{$station_no}' AND obj_id = '{$lpr}' AND finished = 0 AND err = 0
  392. ORDER BY cario_no DESC
  393. LIMIT 1
  394. ";
  395. $results = $this->db->query($sql)->result_array();
  396. if(isset($results[0]))
  397. return $results[0];
  398. return false;
  399. }
  400. // 同步車位現況 (功能: 888 同步, 在席同步)
  401. public function sync_pks_groups_reload($station_setting)
  402. {
  403. $info = array();
  404. $station_no_arr = explode(SYNC_DELIMITER_ST_NO, $station_setting['station_no']);
  405. $station_name_arr = explode(SYNC_DELIMITER_ST_NAME, $station_setting['station_name']);
  406. $station_888_arr = explode(SYNC_DELIMITER_ST_INFO, $station_setting['station_888']);
  407. foreach($station_no_arr as $key => $station_no)
  408. {
  409. if($station_888_arr[$key] == 1) // 啟用
  410. array_push($info, array('station_no' => $station_no_arr[$key], 'station_name' => $station_name_arr[$key]));
  411. else if($station_888_arr[$key] == 4) // 關閉
  412. {
  413. // 清除 888
  414. $this->db->delete('pks_groups', array('station_no' => $station_no_arr[$key]));
  415. }
  416. else
  417. {
  418. trigger_error(__FUNCTION__ . '..unknown station_888:' . $station_888_arr[$key]);
  419. }
  420. }
  421. if(empty($info))
  422. return 'none';
  423. return $this->sync_pks_groups($info, true);
  424. }
  425. // 同步車位現況 (功能: 888 同步, 在席同步)
  426. public function sync_pks_groups($info_arr=array(array('station_no' => STATION_NO, 'station_name' => STATION_NAME)), $reload=false)
  427. {
  428. if($reload)
  429. {
  430. // 確認應該要有的 pks_groups
  431. $pks_groups_arr = array();
  432. $pks_groups_name_arr = array();
  433. foreach($info_arr as $data)
  434. {
  435. $pks_key = $data['station_no'] . SYNC_DELIMITER_ST_INFO . SYNC_PKS_GROUP_ID_CI;
  436. array_push($pks_groups_arr, $pks_key); // 汽車 888
  437. $pks_key = $data['station_no'] . SYNC_DELIMITER_ST_INFO . SYNC_PKS_GROUP_ID_MI;
  438. array_push($pks_groups_arr, $pks_key); // 機車 888
  439. $pks_groups_name_arr[$data['station_no']] = $data['station_name']. '(888)'; // 群組名稱
  440. }
  441. // 過濾已存在的部份
  442. $sql = "SELECT station_no, group_id FROM pks_groups";
  443. $current_pks_group = $this->db->query($sql)->result_array();
  444. foreach($current_pks_group as $data)
  445. {
  446. $pks_key = $data['station_no'] . SYNC_DELIMITER_ST_INFO . $data['group_id'];
  447. $key = array_search($pks_key, $pks_groups_arr);
  448. if($key !== false)
  449. unset($pks_groups_arr[$key]);
  450. }
  451. // 建立缺少的部份
  452. if(!empty($pks_groups_arr))
  453. {
  454. // [A.開始]
  455. $this->db->trans_start();
  456. foreach($pks_groups_arr as $new_data)
  457. {
  458. $pks_info = explode(SYNC_DELIMITER_ST_INFO, $new_data);
  459. $new_pks_groups_data = array(
  460. 'station_no' => $pks_info[0],
  461. 'group_id' => $pks_info[1],
  462. 'tot' => 100, // 預設車位數
  463. 'availables' => 100, // 預設車位數
  464. 'floors' => 'TOT',
  465. 'group_name' => $pks_groups_name_arr[$pks_info[0]]
  466. );
  467. $this->db->insert('pks_groups', $new_pks_groups_data);
  468. trigger_error(__FUNCTION__ . '..insert pks_groups..'. print_r($new_pks_groups_data, true));
  469. }
  470. // [C.完成]
  471. $this->db->trans_complete();
  472. if ($this->db->trans_status() === FALSE)
  473. {
  474. trigger_error(__FUNCTION__ . '..trans_error..' . '| last_query: ' . $this->db->last_query());
  475. return 'fail'; // 中斷
  476. }
  477. }
  478. }
  479. $sql = "SELECT pks_groups.station_no,
  480. pks_groups.group_name as group_name, pks_groups.tot as tot, pks_groups.parked as parked, pks_groups.availables as availables, pks_groups.group_id as group_id, pks_groups.renum as renum
  481. FROM pks_groups
  482. ORDER BY pks_groups.group_id DESC";
  483. $pks_group_query_data = $this->db->query($sql)->result_array();
  484. //trigger_error(__FUNCTION__ . '..sync..' . print_r($pks_group_query_data, true));
  485. // 同步
  486. require_once(ALTOB_SYNC_FILE);
  487. $sync_agent = new AltobSyncAgent();
  488. $sync_agent->init(STATION_NO); // 已帶上的資料場站編號為主
  489. $sync_result = $sync_agent->upd_pks_groups(json_encode($pks_group_query_data, JSON_UNESCAPED_UNICODE));
  490. trigger_error( SYNC_DATA_LOG_TITLE . '..'. __FUNCTION__ . "..upd_pks_groups.." . $sync_result);
  491. }
  492. // 重新載入場站設定
  493. public function reload_station_setting()
  494. {
  495. $port_info = (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 60123) ? '/' . $_SERVER['SERVER_PORT'] : '';
  496. try{
  497. // 查現況
  498. $ch = curl_init();
  499. curl_setopt($ch, CURLOPT_URL, SYNC_API_URL . 'station_setting_query' . $port_info);
  500. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  501. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  502. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  503. curl_setopt($ch, CURLOPT_POST, TRUE);
  504. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,10);
  505. curl_setopt($ch, CURLOPT_TIMEOUT, 10); //timeout in seconds
  506. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array()));
  507. $return_result = curl_exec($ch);
  508. curl_close($ch);
  509. }catch (Exception $e){
  510. trigger_error('error msg:'.$e->getMessage());
  511. }
  512. $station_setting_result = json_decode($return_result, true);
  513. if(!isset($station_setting_result['results']) || sizeof($station_setting_result['results']) <= 0)
  514. {
  515. trigger_error(__FUNCTION__ . '..fail..' . print_r($return_result, true));
  516. return 'fail';
  517. }
  518. $station_ip_str = $station_setting_result['station_ip']; // 場站目前對外IP
  519. $station_setting_arr = $station_setting_result['results'];
  520. $station_no_arr = array();
  521. $station_name_arr = array();
  522. $station_888_arr = array();
  523. $mqtt_ip_arr = array();
  524. $mqtt_port_arr = array();
  525. foreach($station_setting_arr as $data)
  526. {
  527. array_push($station_no_arr, $data['station_no']);
  528. array_push($station_name_arr, $data['short_name']);
  529. array_push($station_888_arr, $data['station_888']);
  530. array_push($mqtt_ip_arr, empty($data['mqtt_ip']) ? MQ_HOST : $data['mqtt_ip']);
  531. array_push($mqtt_port_arr, empty($data['mqtt_port']) ? MQ_PORT : $data['mqtt_port']);
  532. }
  533. $station_no_str = implode(SYNC_DELIMITER_ST_NO, $station_no_arr); // 取值時會用到
  534. $station_name_str = implode(SYNC_DELIMITER_ST_NAME, $station_name_arr); // 純顯示
  535. $station_888_str = implode(SYNC_DELIMITER_ST_INFO, $station_888_arr); // 場站 888 設定
  536. $mqtt_ip_str = implode(SYNC_DELIMITER_ST_INFO, $mqtt_ip_arr); // 場站 MQTT ip
  537. $mqtt_port_str = implode(SYNC_DELIMITER_ST_INFO, $mqtt_port_arr); // 場站 MQTT port
  538. // 設定到 mcache
  539. $this->vars['mcache']->set(MCACHE_STATION_NO_STR, $station_no_str);
  540. $this->vars['mcache']->set(MCACHE_STATION_NAME_STR, $station_name_str);
  541. $this->vars['mcache']->set(MCACHE_STATION_IP_STR, $station_ip_str);
  542. $this->vars['mcache']->set(MCACHE_STATION_888_STR, $station_888_str);
  543. $this->vars['mcache']->set(MCACHE_MQTT_IP_STR, $mqtt_ip_str);
  544. $this->vars['mcache']->set(MCACHE_MQTT_PORT_STR, $mqtt_port_str);
  545. return 'ok';
  546. }
  547. // 取得目前場站設定
  548. public function station_setting_query($reload=false)
  549. {
  550. $station_no_str = $this->vars['mcache']->get(MCACHE_STATION_NO_STR);
  551. $station_name_str = $this->vars['mcache']->get(MCACHE_STATION_NAME_STR);
  552. $station_ip_str = $this->vars['mcache']->get(MCACHE_STATION_IP_STR);
  553. $station_888_str = $this->vars['mcache']->get(MCACHE_STATION_888_STR);
  554. $mqtt_ip_str = $this->vars['mcache']->get(MCACHE_MQTT_IP_STR);
  555. $mqtt_port_str = $this->vars['mcache']->get(MCACHE_MQTT_PORT_STR);
  556. if( $reload ||
  557. empty($station_no_str) ||
  558. empty($station_name_str) ||
  559. empty($station_ip_str) ||
  560. empty($mqtt_ip_str) ||
  561. empty($mqtt_port_str) ||
  562. empty($station_888_str)
  563. )
  564. {
  565. $result = $this->reload_station_setting();
  566. if($result == 'ok')
  567. {
  568. $station_no_str = $this->vars['mcache']->get(MCACHE_STATION_NO_STR);
  569. $station_name_str = $this->vars['mcache']->get(MCACHE_STATION_NAME_STR);
  570. $station_ip_str = $this->vars['mcache']->get(MCACHE_STATION_IP_STR);
  571. $station_888_str = $this->vars['mcache']->get(MCACHE_STATION_888_STR);
  572. $mqtt_ip_str = $this->vars['mcache']->get(MCACHE_MQTT_IP_STR);
  573. $mqtt_port_str = $this->vars['mcache']->get(MCACHE_MQTT_PORT_STR);
  574. }
  575. else
  576. {
  577. /*
  578. $station_setting = array();
  579. $station_setting['station_no'] = STATION_NO;
  580. $station_setting['station_name'] = STATION_NAME;
  581. $station_setting['station_ip'] = STATION_IP;
  582. return $station_setting;
  583. */
  584. return false;
  585. }
  586. }
  587. $station_setting = array();
  588. $station_setting['station_no'] = $station_no_str;
  589. $station_setting['station_name'] = $station_name_str;
  590. $station_setting['station_ip'] = $station_ip_str;
  591. $station_setting['station_888'] = $station_888_str;
  592. $station_setting['mqtt_ip'] = $mqtt_ip_str;
  593. $station_setting['mqtt_port'] = $mqtt_port_str;
  594. return $station_setting;
  595. }
  596. // ------------------------------------------------
  597. //
  598. // 中控接收端 (END)
  599. //
  600. // ------------------------------------------------
  601. // ------------------------------------------------
  602. //
  603. // 其它 (START)
  604. //
  605. // ------------------------------------------------
  606. // 手動新增入場資料
  607. public function gen_carin($parms)
  608. {
  609. $in_time = date('Y-m-d H:i:s');
  610. $data = array(
  611. 'station_no' => $parms['sno'],
  612. 'obj_type' => 1,
  613. 'obj_id' => $parms['lpr'],
  614. 'etag' => '',
  615. 'in_out' => $parms['io'],
  616. 'finished' => 0,
  617. 'in_time' => $in_time,
  618. 'in_lane' => $parms['ivsno'],
  619. 'out_before_time' => $in_time
  620. );
  621. $this->db->insert('cario', $data);
  622. trigger_error("新增入場資料:".print_r($parms, true));
  623. require_once(ALTOB_SYNC_FILE);
  624. // 傳送進場記錄
  625. $sync_agent = new AltobSyncAgent();
  626. $sync_agent->init($parms['sno'], $in_time);
  627. $sync_agent->cario_no = $this->db->insert_id(); // 進出編號
  628. $sync_result = $sync_agent->sync_st_in($parms);
  629. trigger_error( SYNC_DATA_LOG_TITLE . '..'. __FUNCTION__ . "..sync_st_in.." . $sync_result);
  630. }
  631. // ------------------------------------------------
  632. //
  633. // 其它 (END)
  634. //
  635. // ------------------------------------------------
  636. }