VM暫存
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

1282 řádky
45KB

  1. <?php
  2. /*
  3. file: cars_model.php
  4. */
  5. require_once(ALTOB_SYNC_FILE) ;
  6. define('CARS_TMP_LOG', 'cars_tmp_log'); // 暫存進出車號
  7. class Cars_model extends CI_Model
  8. {
  9. var $vars = array();
  10. var $io_name = array('I' => '車入', 'O' => '車出', 'MI' => '機入', 'MO' => '機出', 'FI' => '樓入', 'FO' => '樓出');
  11. var $now_str;
  12. function __construct()
  13. {
  14. parent::__construct();
  15. $this->load->database();
  16. $this->now_str = date('Y-m-d H:i:s');
  17. }
  18. public function init($vars)
  19. {
  20. $this->vars = $vars;
  21. }
  22. // 車輛進出傳入車牌號碼 (2016/07/27)
  23. public function opendoor_lprio($parms)
  24. {
  25. $parms['lpr'] = urldecode($parms['lpr']);
  26. $rows = array();
  27. // $parms['ts'] = date('Y-m-d H:i:s', $parms['ts']);
  28. trigger_error(__FUNCTION__ . '|車牌傳入:' . print_r($parms, true));
  29. if ($parms['etag'] != 'NONE')
  30. {
  31. if ($parms['lpr'] != 'NONE')
  32. {
  33. // do nothing
  34. }
  35. else // 車辨失敗但有eTag, 查詢是否有車號
  36. {
  37. //$parms['lpr'] = $this->etag2lpr_2($parms['etag']); // 2017/01/10 預設都不用 ETAG 找車牌
  38. }
  39. }
  40. $rows = $this->get_member($parms['lpr']);
  41. $this->save_db_io($parms, $rows, true);
  42. return true;
  43. }
  44. // 車輛進出傳入車牌號碼
  45. public function lprio($parms)
  46. {
  47. //$parms['lpr'] = urldecode($parms['lpr']);
  48. $rows = array();
  49. // $parms['ts'] = date('Y-m-d H:i:s', $parms['ts']);
  50. trigger_error('車牌傳入:' . print_r($parms, true));
  51. if ($parms['etag'] != 'NONE')
  52. {
  53. if ($parms['lpr'] != 'NONE')
  54. {
  55. // 有車牌有eTag, 檢查資料庫是否double驗證
  56. //get_headers("http://192.168.10.201/cars.html/check_lpr_etag/{$parms['lpr']}/{$parms['etag']}");
  57. get_headers("http://localhost/cars.html/check_lpr_etag/{$parms['lpr']}/{$parms['etag']}"); // update 2016/07/26
  58. }
  59. else // 車辨失敗但有eTag, 查詢是否有車號
  60. {
  61. // $parms['lpr'] = $this->etag2lpr_2($parms['etag']); // 2017/01/10 預設都不用 ETAG 找車牌
  62. }
  63. }
  64. $rows = $this->get_member($parms['lpr']);
  65. $this->save_db_io($parms, $rows);
  66. return true;
  67. }
  68. // 入出口異動cario
  69. public function save_db_io($parms, $rows, $opendoor=false)
  70. {
  71. if (!empty($rows['lpr_correct'])) $parms['lpr'] = $rows['lpr_correct'];
  72. // [START] 擋重覆 20170912 前端不止一筆 opendoor 送來時, 只處理第一個 (限 2 sec 內)
  73. if($opendoor)
  74. {
  75. $skip_or_not = false;
  76. $new_cars_tmp = array
  77. (
  78. 'timestamp' => time(),
  79. 'sno_io' => $parms['sno'] . $parms['io'],
  80. 'lpr' => $parms['lpr']
  81. );
  82. $cars_tmp_arr = array();
  83. $cars_tmp_log_arr = $this->vars['mcache']->get(CARS_TMP_LOG);
  84. if(!empty($cars_tmp_log_arr))
  85. {
  86. foreach($cars_tmp_log_arr as $tmp)
  87. {
  88. if(isset($tmp['timestamp']) && $tmp['timestamp'] > time() - 2) // 時限內才判斷
  89. {
  90. array_push($cars_tmp_arr, $tmp);
  91. }
  92. }
  93. }
  94. // 判斷是否繼續
  95. foreach($cars_tmp_arr as $tmp)
  96. {
  97. if( $new_cars_tmp['lpr'] == $tmp['lpr'] &&
  98. $new_cars_tmp['sno_io'] == $tmp['sno_io'])
  99. {
  100. $skip_or_not = true;
  101. }
  102. }
  103. // 更新
  104. array_push($cars_tmp_arr, $new_cars_tmp);
  105. $this->vars['mcache']->set(CARS_TMP_LOG, $cars_tmp_arr);
  106. trigger_error(__FUNCTION__ . '..new ' . CARS_TMP_LOG . " |s:{$skip_or_not}|" . print_r($cars_tmp_arr, true));
  107. // 跳過
  108. if($skip_or_not)
  109. {
  110. trigger_error(__FUNCTION__ . '..skip..');
  111. return false;
  112. }
  113. }
  114. // [END] 擋重覆
  115. // 車辨失敗, 結束
  116. if ($parms['lpr'] == 'NONE')
  117. {
  118. if($opendoor)
  119. {
  120. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",1,{$parms['ivsno']}".MQ_ALTOB_MSG_END_TAG);
  121. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},車辨失敗");
  122. if(substr($parms['io'], -strlen('O')) === 'O')
  123. {
  124. // [acer] cmd:102 離場車辨失敗流程 START
  125. $this->call_acer('102', array('cario_no' => 0, 'ivs_no' => $parms['ivsno'], 'msg_code' => 1));
  126. // [acer] cmd:102 離場車辨失敗流程 END
  127. }
  128. }
  129. else
  130. {
  131. if(substr($parms['io'], -strlen('I')) === 'I')
  132. {
  133. // [acer] cmd:101 入場車辨失敗流程 START
  134. $ticket_no = $this->gen_pass_code();
  135. $data = array
  136. (
  137. 'station_no' => $parms['sno'],
  138. 'obj_type' => 1,
  139. 'obj_id' => $parms['lpr'],
  140. 'etag' => $parms['etag'] == 'NONE' ? '' : $parms['etag'],
  141. 'in_out' => $parms['io'],
  142. 'member_no' => 0,
  143. 'finished' => 0,
  144. 'in_time' => $this->now_str,
  145. 'in_lane' => $parms['ivsno'],
  146. 'in_pic_name' => empty($parms['pic_name']) ? '' : $parms['pic_name'],
  147. 'out_before_time' => date("Y-m-d H:i:s"),
  148. 'ticket_no' => $ticket_no
  149. );
  150. $this->db->insert('cario', $data);
  151. trigger_error("[車辨失敗] 新增入場資料:".print_r($parms, true));
  152. $acer_parms = array
  153. (
  154. 'cario_no' => $this->db->insert_id(),
  155. 'in_time' => $this->now_str,
  156. 'ticket_no' => $ticket_no,
  157. 'lpr' => '',
  158. 'ivs_no' => $parms['ivsno']
  159. );
  160. $this->call_acer('101', $acer_parms);
  161. // [acer] cmd:101 入場車辨失敗流程 END
  162. }
  163. }
  164. return false;
  165. }
  166. $msg = $rows['member_no'] != 0 ? "{$parms['lpr']}." : $parms['lpr']; // 月租車號加.符號
  167. // 月租鎖車, 結束
  168. //if (($parms['io'] == 'CO' || $parms['io'] == 'MO') && $rows['member_no'] != 0 && !empty($rows['locked']) && $rows['locked'] == 1)
  169. if ((substr($parms['io'], -strlen('O')) === 'O') && $rows['member_no'] != 0 && !empty($rows['locked']) && $rows['locked'] == 1)
  170. {
  171. if($opendoor){
  172. //// $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}已鎖車!");
  173. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",2,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  174. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}禁止離場請後退");
  175. // [acer] cmd:102 離場車辨已鎖車 START
  176. $this->call_acer('102', array('cario_no' => 0, 'ivs_no' => $parms['ivsno'], 'msg_code' => 2));
  177. // [acer] cmd:102 離場車辨已鎖車 END
  178. }
  179. return false;
  180. }
  181. // 取得會員資訊
  182. $parms['member_no'] = $rows['member_no'];
  183. switch($parms['io'])
  184. {
  185. case 'CI':
  186. case 'MI':
  187. if($opendoor){
  188. // 開門
  189. /*
  190. if ($rows['member_no'] != 0)
  191. {
  192. $this->member_opendoors($parms);
  193. }
  194. else
  195. {
  196. $this->temp_opendoors($parms);
  197. }
  198. */
  199. // 取得出入口 888 資訊
  200. $pks_888_arr = $this->get_888_info($parms);
  201. if ($pks_888_arr['availables'] == 0)
  202. {
  203. if ($rows['member_no'] == 0)
  204. {
  205. // 滿車訊號 (臨停)
  206. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",14,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  207. // 開門訊號 (臨停)
  208. $this->temp_opendoors($parms);
  209. return false;
  210. }
  211. else
  212. {
  213. // 滿車訊號 (會員)
  214. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",15,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  215. }
  216. }
  217. // 空車位導引
  218. $pks_arr = $this->get_valid_seat();
  219. if ($pks_arr['result']['location_no'] != 0)
  220. {
  221. $pks_loc_name = $pks_arr['loc_name'];
  222. $pks_loc_no = $pks_arr['result']['location_no'];
  223. $pks_floors = $pks_arr['floors'];
  224. }
  225. else
  226. {
  227. $pks_loc_name = 0;
  228. $pks_loc_no = 0;
  229. $pks_floors = 0;
  230. }
  231. // 訊息
  232. if ($rows['member_no'] == 0)
  233. {
  234. $ck = md5($parms['lpr']);
  235. $jdata = file_get_contents("http://localhost/allpa_service.html/get_allpa_valid_user/{$parms['lpr']}/{$ck}");
  236. $results = json_decode($jdata, true);
  237. if($results['result_code'] == 0)
  238. {
  239. // 歐pa, 開門
  240. $this->member_opendoors($parms);
  241. // 歐pa, 進場
  242. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",3,{$parms['ivsno']},{$parms['lpr']},{$pks_floors},{$pks_loc_no}".MQ_ALTOB_MSG_END_TAG);
  243. // old msg
  244. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg},歐pa卡用戶您好:請停{$pks_loc_name}{$pks_loc_no}車位");
  245. }
  246. else
  247. {
  248. // 臨停車, 開門 (同會員)
  249. $this->temp_opendoors($parms);
  250. // 臨停車, 進場
  251. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",11,{$parms['ivsno']},{$parms['lpr']},{$pks_floors},{$pks_loc_no}".MQ_ALTOB_MSG_END_TAG);
  252. // old msg
  253. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}請停{$pks_loc_name}{$pks_loc_no}車位");
  254. }
  255. }
  256. else
  257. {
  258. // 會員, 開門
  259. $this->member_opendoors($parms);
  260. // 會員, 進場
  261. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",4,{$parms['ivsno']},{$parms['lpr']},{$pks_floors},{$pks_loc_no}".MQ_ALTOB_MSG_END_TAG);
  262. // old msg
  263. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg},月租戶請進場:請停{$pks_loc_name}{$pks_loc_no}車位");
  264. }
  265. }else{
  266. // 資料流
  267. if ($parms['lpr'] != 'NONE')
  268. {
  269. $data = array
  270. (
  271. 'err' => 1,
  272. 'finished' => 1
  273. );
  274. // 原有歷史記錄, 設定錯誤碼為1(入場不應該有歷史記錄)
  275. $this->db->update('cario', $data, array('obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0, 'obj_type' => 1));
  276. $affect_rows = $this->db->affected_rows();
  277. if ($affect_rows > 0)
  278. {
  279. trigger_error("err://入場郤已有歷史進場記錄[{$affect_rows}]筆,已設成錯誤並結清記錄".print_r($parms, true));
  280. }
  281. }
  282. // [acer] cmd:101 入場車辨成功流程 START
  283. $ticket_no = $this->gen_pass_code();
  284. $data = array
  285. (
  286. 'station_no' => $parms['sno'],
  287. 'obj_type' => 1,
  288. 'obj_id' => $parms['lpr'],
  289. 'etag' => $parms['etag'] == 'NONE' ? '' : $parms['etag'],
  290. 'in_out' => $parms['io'],
  291. 'member_no' => $rows['member_no'],
  292. 'finished' => 0,
  293. 'in_time' => $this->now_str,
  294. 'in_lane' => $parms['ivsno'],
  295. 'in_pic_name' => empty($parms['pic_name']) ? '' : $parms['pic_name'],
  296. 'out_before_time' => date("Y-m-d H:i:s"),
  297. 'ticket_no' => $ticket_no
  298. );
  299. $this->db->insert('cario', $data);
  300. trigger_error("新增入場資料:".print_r($parms, true));
  301. $acer_parms = array
  302. (
  303. 'cario_no' => $this->db->insert_id(),
  304. 'in_time' => $this->now_str,
  305. 'ticket_no' => $ticket_no,
  306. 'lpr' => $parms['lpr'],
  307. 'ivs_no' => $parms['ivsno']
  308. );
  309. $this->call_acer('101', $acer_parms);
  310. // [acer] cmd:101 入場車辨成功流程 END
  311. // 傳送進場記錄
  312. $sync_agent = new AltobSyncAgent();
  313. $sync_agent->init($parms['sno'], $this->now_str);
  314. $sync_agent->cario_no = $this->db->insert_id(); // 進出編號
  315. $sync_agent->member_no = $rows['member_no']; // 會員編號
  316. $sync_result = $sync_agent->sync_st_in($parms);
  317. trigger_error( "..sync_st_in.." . $sync_result);
  318. }
  319. break;
  320. // 出場
  321. case 'CO':
  322. case 'MO':
  323. // 讀取最近一筆入場資料
  324. $rows_cario = $this->db
  325. ->select('cario_no, payed, in_time, pay_time, out_before_time')
  326. ->from('cario')
  327. //->where(array('in_out' => 'CI', 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0))
  328. ->where(array('obj_id' => $parms['lpr'], 'err' => 0))
  329. ->order_by('cario_no', 'desc')
  330. ->limit(1)
  331. ->get()
  332. ->row_array();
  333. trigger_error("opendoor={$opendoor}| 出場讀到資料:{$rows['member_no']}|".time().'|'.print_r($rows_cario, true));
  334. if (!empty($rows_cario['cario_no'])) // 在限時內可出場
  335. {
  336. $co_time_minutes = floor((strtotime($this->now_str) - strtotime($rows_cario['in_time'])) / 60); // 停車時數 (分鐘)
  337. // 合規定者開門放行
  338. switch(true)
  339. {
  340. case $rows['member_no'] != 0:
  341. // CO.A.1 會員車
  342. // 判斷時段租是否超時 (超過 12 小時)
  343. if($rows['park_time'] != 'RE' && $co_time_minutes > 720)
  344. {
  345. if($opendoor)
  346. {
  347. // 時段租超時字幕
  348. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",16,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  349. // [acer] cmd:102 離場車辨成功流程 START
  350. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 16));
  351. // [acer] cmd:102 離場車辨成功流程 END
  352. }
  353. else
  354. {
  355. $data = array
  356. (
  357. 'out_time' => $this->now_str,
  358. 'out_lane' => $parms['ivsno'],
  359. 'minutes' => $co_time_minutes,
  360. 'out_pic_name' => $parms['pic_name']
  361. );
  362. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  363. trigger_error("{$parms['lpr']}|時段租超時" . print_r($rows_cario, true));
  364. // 傳送離場記錄
  365. $sync_agent = new AltobSyncAgent();
  366. $sync_agent->init($parms['sno'], $this->now_str);
  367. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  368. $sync_agent->member_no = $rows['member_no']; // 會員編號
  369. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  370. $sync_result = $sync_agent->sync_st_out($parms);
  371. trigger_error( "..sync_st_out.." . $sync_result);
  372. }
  373. return false;
  374. }
  375. if($opendoor)
  376. {
  377. // 會員開門
  378. $this->member_opendoors($parms);
  379. // 會員字幕
  380. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",5,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  381. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}謝謝光臨");
  382. // [acer] cmd:102 離場車辨成功流程 START
  383. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 5));
  384. // [acer] cmd:102 離場車辨成功流程 END
  385. }
  386. else
  387. {
  388. $data = array
  389. (
  390. 'in_out' => $parms['io'],
  391. 'finished' => 1,
  392. 'out_time' => $this->now_str,
  393. 'out_lane' => $parms['ivsno'],
  394. 'minutes' => $co_time_minutes,
  395. 'out_pic_name' => $parms['pic_name']
  396. );
  397. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no']));
  398. trigger_error('會員車離場:' . print_r($rows, true));
  399. // 傳送離場記錄
  400. $sync_agent = new AltobSyncAgent();
  401. $sync_agent->init($parms['sno'], $this->now_str);
  402. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  403. $sync_agent->member_no = $rows['member_no']; // 會員編號
  404. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  405. $sync_agent->finished = 1; // 已離場
  406. $sync_result = $sync_agent->sync_st_out($parms);
  407. trigger_error( "..sync_st_out.." . $sync_result);
  408. }
  409. break;
  410. case strtotime($rows_cario['out_before_time']) >= time():
  411. if ($rows_cario['payed'])
  412. {
  413. // CO.B.1 臨停車已付款
  414. if($opendoor)
  415. {
  416. // 臨停開門
  417. $this->temp_opendoors($parms);
  418. // 臨停字幕
  419. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",6,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  420. //// $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}付款確認請 離 場謝謝光臨");
  421. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}謝謝光臨");
  422. // [acer] cmd:102 離場車辨成功流程 START
  423. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 6));
  424. // [acer] cmd:102 離場車辨成功流程 END
  425. }
  426. else
  427. {
  428. $data = array
  429. (
  430. 'in_out' => $parms['io'],
  431. 'finished' => 1,
  432. 'out_time' => $this->now_str,
  433. 'out_lane' => $parms['ivsno'],
  434. 'minutes' => $co_time_minutes,
  435. 'out_pic_name' => $parms['pic_name']
  436. );
  437. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no']));
  438. trigger_error('臨停車已付款:' . print_r($rows, true));
  439. // 傳送離場記錄
  440. $sync_agent = new AltobSyncAgent();
  441. $sync_agent->init($parms['sno'], $this->now_str);
  442. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  443. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  444. $sync_agent->finished = 1; // 已離場
  445. $sync_result = $sync_agent->sync_st_out($parms);
  446. trigger_error( "..sync_st_out.." . $sync_result);
  447. }
  448. }
  449. else
  450. {
  451. // CO.B.2 臨停車未付款
  452. if($opendoor)
  453. {
  454. // 臨停字幕
  455. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",8,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  456. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}臨時車請投票卡或刷卡出場");
  457. // [acer] cmd:102 離場車辨成功流程 START
  458. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 8));
  459. // [acer] cmd:102 離場車辨成功流程 END
  460. }
  461. else
  462. {
  463. // TODO: 歐pa卡離場記錄和臨停未付款一樣, 待更正
  464. $data = array
  465. (
  466. 'out_time' => $this->now_str,
  467. 'out_lane' => $parms['ivsno'],
  468. 'minutes' => $co_time_minutes,
  469. 'out_pic_name' => $parms['pic_name']
  470. );
  471. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  472. trigger_error('臨停未付款:' . print_r($rows, true));
  473. // 傳送離場記錄
  474. $sync_agent = new AltobSyncAgent();
  475. $sync_agent->init($parms['sno'], $this->now_str);
  476. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  477. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  478. $sync_result = $sync_agent->sync_st_out($parms);
  479. trigger_error( "..sync_st_out.." . $sync_result);
  480. }
  481. }
  482. break;
  483. default:
  484. // CO.C.1 其它付款方式
  485. if($opendoor)
  486. {
  487. $in_time = strtotime($rows_cario['out_before_time']);
  488. $ck = md5($in_time. $parms['lpr'] . $parms['sno']);
  489. $jdata = file_get_contents("http://localhost/allpa_service.html/allpa_go/{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  490. trigger_error("allpa回傳:{$jdata}|{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  491. $results = json_decode($jdata, true);
  492. trigger_error("+++".print_r($results, true));
  493. if ($results['result_code'] == 0) // 歐pa卡, 點數足夠扣
  494. {
  495. // 臨停開門
  496. $this->temp_opendoors($parms);
  497. // 歐pa卡, 字幕
  498. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",7,{$parms['ivsno']},{$parms['lpr']},{$results['amt']}".MQ_ALTOB_MSG_END_TAG);
  499. // // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}扣{$results['amt']}點請離場");
  500. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}請離場歐pa卡扣:{$results['amt']}點謝謝光臨");
  501. // updated 2016/09/01
  502. $data = array(
  503. 'out_before_time' => date('Y-m-d H:i:s', strtotime(" + 15 minutes")),
  504. 'pay_time' => $this->now_str,
  505. 'pay_type' => 9, // 歐pa卡
  506. 'payed' => 1
  507. );
  508. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  509. // [acer] cmd:102 離場車辨成功流程 START
  510. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 7));
  511. // [acer] cmd:102 離場車辨成功流程 END
  512. }
  513. else if ($results['result_code'] == 12) // 歐pa卡, 餘額不足
  514. {
  515. // 臨停字幕
  516. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",12,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  517. // [acer] cmd:102 離場車辨成功流程 START
  518. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 12));
  519. // [acer] cmd:102 離場車辨成功流程 END
  520. }
  521. else if ($results['result_code'] == 11) // 歐pa卡, 查無會員
  522. {
  523. // 臨停字幕
  524. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",9,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  525. //// $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}其它付款方式");
  526. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}臨時車請投票卡或刷卡出場");
  527. // [acer] cmd:102 離場車辨成功流程 START
  528. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 9));
  529. // [acer] cmd:102 離場車辨成功流程 END
  530. }
  531. else
  532. {
  533. // 臨停字幕
  534. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",9,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  535. // [acer] cmd:102 離場車辨成功流程 START
  536. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 9));
  537. // [acer] cmd:102 離場車辨成功流程 END
  538. }
  539. }
  540. else
  541. {
  542. $data = array
  543. (
  544. 'out_time' => $this->now_str,
  545. 'out_lane' => $parms['ivsno'],
  546. 'minutes' => $co_time_minutes,
  547. 'out_pic_name' => $parms['pic_name']
  548. );
  549. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  550. trigger_error("{$parms['lpr']}|其它付款方式:" . print_r($rows_cario, true));
  551. // 傳送離場記錄
  552. $sync_agent = new AltobSyncAgent();
  553. $sync_agent->init($parms['sno'], $this->now_str);
  554. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  555. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  556. $sync_result = $sync_agent->sync_st_out($parms);
  557. trigger_error( "..sync_st_out.." . $sync_result);
  558. }
  559. break;
  560. }
  561. }
  562. else if ($rows['member_no'] != 0)
  563. {
  564. // CO.Z.1 月租車無入場資料
  565. if($opendoor)
  566. {
  567. // 會員開門
  568. $this->member_opendoors($parms);
  569. // 會員字幕
  570. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",10,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  571. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}月租戶請離場謝謝光臨");
  572. // [acer] cmd:102 離場車辨成功流程 START
  573. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 10));
  574. // [acer] cmd:102 離場車辨成功流程 END
  575. }
  576. else
  577. {
  578. trigger_error('月租車無入場資料:' . print_r($rows, true));
  579. // 傳送離場記錄
  580. $sync_agent = new AltobSyncAgent();
  581. $sync_agent->init($parms['sno'], $this->now_str);
  582. $sync_agent->member_no = $rows['member_no']; // 會員編號
  583. $sync_agent->finished = 1; // 已離場
  584. $sync_result = $sync_agent->sync_st_out($parms);
  585. trigger_error( "..sync_st_out.." . $sync_result);
  586. }
  587. }
  588. else
  589. {
  590. // CO.Z.Z 無入場資料
  591. if($opendoor)
  592. {
  593. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",13,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  594. // [acer] cmd:102 離場車辨成功流程 START
  595. $this->call_acer('102', array('cario_no' => 0, 'ivs_no' => $parms['ivsno'], 'msg_code' => 13));
  596. // [acer] cmd:102 離場車辨成功流程 END
  597. }
  598. else
  599. {
  600. trigger_error('無入場資料:' . print_r($rows, true));
  601. // 傳送離場記錄
  602. $sync_agent = new AltobSyncAgent();
  603. $sync_agent->init($parms['sno'], $this->now_str);
  604. $sync_result = $sync_agent->sync_st_out($parms);
  605. trigger_error( "..sync_st_out.." . $sync_result);
  606. }
  607. }
  608. break;
  609. }
  610. }
  611. // 檢查是否合法會員或VIP資料
  612. public function get_member($lpr)
  613. {
  614. $where_arr = array
  615. (
  616. 'c.lpr' => $lpr,
  617. 'c.start_time <=' => $this->now_str,
  618. 'c.end_time >=' => $this->now_str
  619. );
  620. $sql = "select
  621. c.lpr_correct,
  622. c.member_no,
  623. m.member_name,
  624. m.member_type,
  625. m.locked,
  626. m.remarks,
  627. m.park_time,
  628. m.suspended,
  629. m.valid_time,
  630. c.etag,
  631. c.start_time,
  632. c.end_time
  633. from member_car c, members m
  634. where c.member_no = m.member_no
  635. and c.start_time <= '{$this->now_str}'
  636. and c.end_time >= '{$this->now_str}'
  637. and c.lpr = '{$lpr}'
  638. limit 1";
  639. $rows = $this->db->query($sql)->row_array();
  640. // 新增 park_time_check 2016/11/11
  641. $park_time_check = 0;
  642. if (!empty($rows['lpr_correct']))
  643. {
  644. $park_time = $rows['park_time'];
  645. $pt_arr = $this->vars['mcache']->get('pt');
  646. if(empty($pt_arr) || empty($park_time))
  647. {
  648. // ERROR: 無法驗証時段, 跳過時段限制判斷
  649. trigger_error("[ERROR] mcache.pt is empty !!");
  650. $park_time_check = 1;
  651. }
  652. else
  653. {
  654. $now_time = substr($this->now_str, 11); // 日期字串只取最後時間字串(13:25:32)
  655. $week_no = date('w',strtotime($this->now_str)); // 取星期幾
  656. $park_time_array = explode(',', $park_time); // 用 , 格開
  657. foreach($park_time_array as $idx => $park_time_value)
  658. {
  659. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  660. {
  661. if ($week_no >= $pt_rows['w_start'] &&
  662. $week_no <= $pt_rows['w_end'] &&
  663. $now_time >= $pt_rows['time_start'] &&
  664. $now_time <= $pt_rows['time_end'])
  665. {
  666. $park_time_check = 2;
  667. trigger_error("時段代碼:{$park_time_value} 星期:{$week_no}");
  668. break;
  669. }
  670. }
  671. }
  672. }
  673. }
  674. if (empty($rows['lpr_correct'])) // A. 非月租車
  675. {
  676. $rows = array
  677. (
  678. 'lpr_correct' => '',
  679. 'member_no' => 0,
  680. 'member_name' => '',
  681. 'member_type' => 9,
  682. 'etag' => '',
  683. 'start_time' => '',
  684. 'end_time' => '',
  685. );
  686. }
  687. else if(empty($park_time_check)) // B. 月租車, 時段無效
  688. {
  689. trigger_error("無效的時段!! " . print_r($rows, true));
  690. $rows = array
  691. (
  692. 'lpr_correct' => '',
  693. 'member_no' => 0,
  694. 'member_name' => '',
  695. 'member_type' => 9,
  696. 'etag' => '',
  697. 'start_time' => '',
  698. 'end_time' => '',
  699. );
  700. }
  701. else if(!empty($rows['suspended'])) // C. 月租車, 停權中
  702. {
  703. trigger_error("停權中!! " . print_r($rows, true));
  704. $rows = array
  705. (
  706. 'lpr_correct' => '',
  707. 'member_no' => 0,
  708. 'member_name' => '',
  709. 'member_type' => 9,
  710. 'etag' => '',
  711. 'start_time' => '',
  712. 'end_time' => '',
  713. );
  714. }
  715. else if(!empty($rows['valid_time']) && $rows['valid_time'] < $this->now_str) // D. 月租車, 已無效 (審核未通過)
  716. {
  717. trigger_error("已無效!! " . print_r($rows, true));
  718. $rows = array
  719. (
  720. 'lpr_correct' => '',
  721. 'member_no' => 0,
  722. 'member_name' => '',
  723. 'member_type' => 9,
  724. 'etag' => '',
  725. 'start_time' => '',
  726. 'end_time' => '',
  727. );
  728. }
  729. trigger_error('讀取會員:' . print_r($rows, true) . ", park_time_check: {$park_time_check}");
  730. return $rows;
  731. }
  732. // 開門 (月租)
  733. public function member_opendoors($parms)
  734. {
  735. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  736. return true;
  737. }
  738. // 開門 (臨停)
  739. public function temp_opendoors($parms)
  740. {
  741. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  742. return true;
  743. }
  744. // 用eTag讀出車號
  745. public function etag2lpr_2($etag)
  746. {
  747. // 用讀取eTag記錄(有double驗證過)
  748. $rows = $this->db->select('lpr')
  749. ->from('etag_lpr')
  750. ->where(array('etag' => $etag, 'confirms >' => 0))
  751. ->limit(1)
  752. ->get()
  753. ->row_array();
  754. // 讀出eTag資料
  755. if (!empty($rows['lpr']))
  756. {
  757. trigger_error("+++車牌NONE,以eTag讀入車牌:{$etag}|{$rows['lpr']}");
  758. return $rows['lpr'];
  759. }
  760. return 'NONE';
  761. }
  762. // 有車牌與eTag, 檢查資料庫 (2017/03/22 new)
  763. public function check_lpr_etag($lpr, $etag)
  764. {
  765. $ETAG_LOG_TITLE = 'etag://';
  766. $ETAG_WARMIN_TITLE = 'etag-warning://';
  767. trigger_error($ETAG_LOG_TITLE. "輸入: {$lpr},{$etag}");
  768. // 手動值上下限
  769. $max_admin_confirms_value = 99;
  770. $min_admin_confirms_value = 50;
  771. // 自動值上下限
  772. $max_system_confirms_value = 33;
  773. $min_system_confirms_value = 0;
  774. // 判斷對應加權
  775. $etag_confirms_bias_plus = 11; // etag 找 車牌, 對上一次可扺 11次
  776. $etag_confirms_bias_minus = -1;
  777. $lpr_confirms_bias_plus = 3; // 車牌 找 etag, 對上一次可扺 3次
  778. $lpr_confirms_bias_minus = -1;
  779. // eTag 找 車牌
  780. $lpr_info_from_etag = $this->db->select('lpr, confirms')
  781. ->from('etag_lpr')
  782. ->where(array('etag' => $etag))
  783. ->limit(1)
  784. ->get()
  785. ->row_array();
  786. if (!empty($lpr_info_from_etag['lpr']))
  787. {
  788. // B. etag 有找到 車牌
  789. if ($lpr_info_from_etag['lpr'] == $lpr)
  790. {
  791. // B.1. etag 有找到 車牌, 且 車牌 相符, confirms 上升
  792. $confirms_bias = $etag_confirms_bias_plus;
  793. }
  794. else
  795. {
  796. // B.2. etag 有找到 車牌, 但 車牌 不符, confirms 下降
  797. $confirms_bias = $etag_confirms_bias_minus;
  798. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | lpr error : {$lpr},{$etag} | query:" . print_r($lpr_info_from_etag, true));
  799. }
  800. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  801. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  802. // 更新 confirms 資訊
  803. if($next_confirms_value > $max_admin_confirms_value)
  804. {
  805. // B.3.0 confirms 超過 max_admin_confirms_value, skip
  806. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  807. }
  808. else if ($next_confirms_value >= $min_admin_confirms_value)
  809. {
  810. // B.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  811. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  812. }
  813. else if ($next_confirms_value > $max_system_confirms_value)
  814. {
  815. // B.3.2 confirms 超過 max_system_confirms_value, skip
  816. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  817. }
  818. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  819. {
  820. // B.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  821. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  822. }
  823. else
  824. {
  825. // B.3.4 若低於 min_system_confirms_value,刪除
  826. $this->db->delete('etag_lpr', array('etag' => $etag));
  827. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  828. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  829. }
  830. }
  831. else
  832. {
  833. // 車牌 找 etag
  834. $etag_info_form_lpr = $this->db->select('etag, confirms, member_no')
  835. ->from('etag_lpr')
  836. ->where(array('lpr' => $lpr))
  837. ->limit(1)
  838. ->get()
  839. ->row_array();
  840. if (!empty($etag_info_form_lpr['etag']))
  841. {
  842. // A. 車牌 有找到 etag
  843. if ($etag_info_form_lpr['etag'] == $etag)
  844. {
  845. // A.1. 車牌 有找到 etag, 且 etag 相符, confirms 上升
  846. $confirms_bias = $lpr_confirms_bias_plus;
  847. // 若尚未登記為會員
  848. if(empty($etag_info_form_lpr['member_no']))
  849. {
  850. // 檢查是否會員
  851. $member_info_from_lpr = $this->db->select('member_no, member_name')
  852. ->from('members')
  853. ->where(array('lpr' => $lpr))
  854. ->limit(1)
  855. ->get()
  856. ->row_array();
  857. // 確認為會員, 建立 eTag 資訊
  858. if (!empty($member_info_from_lpr['member_no']))
  859. {
  860. $data['member_no'] = $member_info_from_lpr['member_no'];
  861. $data['member_name'] = $member_info_from_lpr['member_name'];
  862. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  863. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  864. // 更新 etag_lpr
  865. $this->db->where('etag', $etag)->update('etag_lpr', $data);
  866. }
  867. }
  868. }
  869. else
  870. {
  871. // A.2. 車牌 有找到 etag, 但 etag 不符, confirms 下降
  872. $confirms_bias = $lpr_confirms_bias_minus;
  873. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | etag error : {$lpr},{$etag} | query:" . print_r($etag_info_form_lpr, true));
  874. }
  875. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  876. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  877. // 更新 confirms 資訊
  878. if($next_confirms_value > $max_admin_confirms_value)
  879. {
  880. // A.3.0 confirms 超過 max_admin_confirms_value, skip
  881. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  882. }
  883. else if ($next_confirms_value >= $min_admin_confirms_value)
  884. {
  885. // A.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  886. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  887. }
  888. else if ($next_confirms_value > $max_system_confirms_value)
  889. {
  890. // A.3.2 confirms 超過 max_system_confirms_value, skip
  891. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  892. }
  893. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  894. {
  895. // A.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  896. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  897. }
  898. else
  899. {
  900. // A.3.4 若低於 min_system_confirms_value,刪除
  901. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  902. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  903. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  904. }
  905. }
  906. else
  907. {
  908. // C. 車牌 與 etag 都找不到記錄
  909. $data = array
  910. (
  911. 'lpr' => $lpr,
  912. 'lpr_correct' => $lpr,
  913. 'etag' => $etag
  914. );
  915. // 檢查是否會員
  916. $member_info_from_lpr = $this->db->select('member_no, member_name')
  917. ->from('members')
  918. ->where(array('lpr' => $lpr))
  919. ->limit(1)
  920. ->get()
  921. ->row_array();
  922. // 會員者, 將eTag update回去
  923. if (!empty($member_info_from_lpr['member_no']))
  924. {
  925. $data['member_no'] = $member_info_from_lpr['member_no'];
  926. $data['member_name'] = $member_info_from_lpr['member_name'];
  927. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  928. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  929. }
  930. // 建立第一筆記錄
  931. $this->db->insert('etag_lpr', $data);
  932. $etag_lpr_seqno = $this->db->insert_id();
  933. trigger_error($ETAG_LOG_TITLE . "create | insert seqno = {$etag_lpr_seqno}". print_r($data, true));
  934. }
  935. }
  936. }
  937. /*
  938. // 有車牌與eTag, 檢查資料庫
  939. public function check_lpr_etag($lpr, $etag)
  940. {
  941. // 用讀取eTag記錄(有double驗證過)
  942. $rows = $this->db->select('etag, confirms')
  943. ->from('etag_lpr')
  944. ->where(array('lpr' => $lpr))
  945. ->limit(1)
  946. ->get()
  947. ->row_array();
  948. // 讀出eTag資料
  949. if (!empty($rows['etag']))
  950. {
  951. // 車牌與eTag皆相符, 檢查是否confirms欄位若為0, 設成1(double驗證)
  952. if ($rows['etag'] == $etag)
  953. {
  954. if ($rows['confirms'] == 0) $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 1));
  955. }
  956. else // eTag不相符
  957. {
  958. if ($rows['confirms'] == 1)
  959. {
  960. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 0));
  961. }
  962. else // 原confirms為0者, 刪除之
  963. {
  964. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  965. }
  966. }
  967. }
  968. else // 無資料, 新增一筆
  969. {
  970. // 再檢查一次是否有eTag ?
  971. $rows_etag = $this->db->select('lpr, confirms')
  972. ->from('etag_lpr')
  973. ->where(array('etag' => $etag))
  974. ->limit(1)
  975. ->get()
  976. ->row_array();
  977. if (empty($rows_etag['lpr'])) // 無資料
  978. {
  979. $data = array
  980. (
  981. 'lpr' => $lpr,
  982. 'lpr_correct' => $lpr,
  983. 'etag' => $etag
  984. );
  985. // 檢查是否會員
  986. $rows_members = $this->db->select('member_no, member_name')
  987. ->from('members')
  988. ->where(array('lpr' => $lpr))
  989. ->limit(1)
  990. ->get()
  991. ->row_array();
  992. // 會員者, 將eTag update回去
  993. if (!empty($rows_members['member_no']))
  994. {
  995. $data['member_no'] = $rows_members['member_no'];
  996. $data['member_name'] = $rows_members['member_name'];
  997. $this->db->where('member_no', $rows_members['member_no'])->update('member_car', array('etag' => $etag));
  998. $this->db->where('member_no', $rows_members['member_no'])->update('members', array('etag' => $etag));
  999. }
  1000. $this->db->insert('etag_lpr', $data);
  1001. }
  1002. else
  1003. {
  1004. if ($rows_etag['confirms'] == 1)
  1005. {
  1006. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => 0));
  1007. }
  1008. else // 原confirms為0者, 刪除之
  1009. {
  1010. $this->db->delete('etag_lpr', array('etag' => $etag));
  1011. }
  1012. }
  1013. }
  1014. }
  1015. */
  1016. // 送出至message queue(目前用mqtt)
  1017. public function mq_send($topic, $msg)
  1018. {
  1019. $this->vars['mqtt']->publish($topic, $msg, 0);
  1020. trigger_error("mqtt:{$topic}|{$msg}");
  1021. }
  1022. // 指派車位
  1023. // http://203.75.167.89/parkingquery.html/get_valid_seat
  1024. // 註記現在時間, 並保留10分鐘
  1025. public function get_valid_seat()
  1026. {
  1027. $data = array();
  1028. //$data['result']['location_no'] = '0';
  1029. //$data['result_code'] = 'FAIL';
  1030. //return $data;
  1031. // 撈 roger db
  1032. /*
  1033. $sql = "
  1034. SELECT ParkingNum AS pksno FROM table_carpark
  1035. WHERE LPR = '' AND DisableSeat = 0 AND
  1036. (SELECT COUNT(*) FROM table_carpark WHERE LPR = '' AND DisableSeat = 0) <= 10
  1037. ORDER BY RAND() LIMIT 1 FOR UPDATE;
  1038. ";
  1039. $dsn_old_db = $this->load->database('old_db', true);
  1040. // 2016/12/14 roger_db 掛了的可能
  1041. if ($dsn_old_db->initialize())
  1042. {
  1043. $retults = $dsn_old_db->query($sql)->result_array();
  1044. }
  1045. if(!empty($retults[0]))
  1046. {
  1047. $data['result']['location_no'] = substr($retults[0]['pksno'], 1);
  1048. $data['result_code'] = 'OK';
  1049. $data['loc_name'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1050. $data['floors'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1051. }
  1052. else
  1053. {
  1054. $data['result']['location_no'] = '0';
  1055. $data['result_code'] = 'FAIL';
  1056. }
  1057. */
  1058. $this->db->trans_start();
  1059. $sql = "select pksno from pks where status = 'VA' and prioritys != 0 and (book_time is null or book_time <= now()) order by prioritys asc limit 1 for update;";
  1060. $rows = $this->db->query($sql)->row_array();
  1061. if (!empty($rows['pksno']))
  1062. {
  1063. $data['result']['location_no'] = substr($rows['pksno'], -3);
  1064. $data['result_code'] = 'OK';
  1065. $sql = "update pks set book_time = addtime(now(), '00:10:00') where pksno = {$rows['pksno']};";
  1066. $this->db->query($sql);
  1067. $sql = "select g.group_name, g.floors from pks_groups g, pks_group_member m where m.pksno = {$rows['pksno']} and g.group_id = m.group_id and g.group_type = 1 limit 1";
  1068. $rows = $this->db->query($sql)->row_array();
  1069. $data['loc_name'] = $rows['group_name'];
  1070. $data['floors'] = $rows['floors'];
  1071. }
  1072. else
  1073. {
  1074. $data['result']['location_no'] = '0';
  1075. $data['result_code'] = 'FAIL';
  1076. }
  1077. $this->db->trans_complete();
  1078. return $data;
  1079. }
  1080. // 取得出入口 888 資訊
  1081. public function get_888_info($parms)
  1082. {
  1083. $data = array();
  1084. $sql = "select availables as availables, tot as tot from pks_groups where group_id = 'C888' and station_no = {$parms['sno']}";
  1085. $rows = $this->db->query($sql)->row_array();
  1086. if (!empty($rows) && array_key_exists('availables', $rows))
  1087. {
  1088. $data['result_code'] = 'OK';
  1089. $data['availables'] = $rows['availables'];
  1090. $data['tot'] = $rows['tot'];
  1091. }
  1092. else
  1093. {
  1094. trigger_error(__FUNCTION__ . "..not found..".print_r($parms, true));
  1095. $data['result_code'] = 'FAIL';
  1096. $data['availables'] = 9999; // 如果拿不到就忽略這個流程
  1097. $data['tot'] = 0;
  1098. }
  1099. return $data;
  1100. }
  1101. // ===============================================
  1102. // acer cmd
  1103. // ===============================================
  1104. // 產生通行碼
  1105. function gen_pass_code()
  1106. {
  1107. return rand(100000,999999);
  1108. }
  1109. // 呼叫acer
  1110. function call_acer($cmd, $parms)
  1111. {
  1112. //return false; // 尚未啟用
  1113. try{
  1114. $ch = curl_init();
  1115. curl_setopt($ch, CURLOPT_URL, 'http://localhost/acer_service.html/cmd_'. $cmd);
  1116. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  1117. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1118. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  1119. curl_setopt($ch, CURLOPT_POST, TRUE);
  1120. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,3);
  1121. curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
  1122. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parms));
  1123. $data = curl_exec($ch);
  1124. if(curl_errno($ch))
  1125. {
  1126. trigger_error(__FUNCTION__ . ', curl error: '. curl_error($ch));
  1127. }
  1128. curl_close($ch);
  1129. trigger_error(__FUNCTION__ . '..'. $data);
  1130. }catch (Exception $e){
  1131. trigger_error(__FUNCTION__ . 'error:'.$e->getMessage());
  1132. }
  1133. }
  1134. }