VM暫存
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

1386 satır
49KB

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