VM暫存
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1416 line
50KB

  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. // [mitac] 要求 mitac 扣款 START
  481. $this->call_mitac_pay($parms['lpr'], $parms['ivsno'], $rows_cario);
  482. // [mitac] 要求 mitac 扣款 END
  483. }
  484. }
  485. break;
  486. default:
  487. // CO.C.1 其它付款方式
  488. if($opendoor)
  489. {
  490. $in_time = strtotime($rows_cario['out_before_time']);
  491. $ck = md5($in_time. $parms['lpr'] . $parms['sno']);
  492. //$jdata = file_get_contents("http://localhost/allpa_service.html/allpa_go/{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  493. $jdata = file_get_contents("http://localhost/allpa_service.html/allpa_go_remote/{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  494. trigger_error("allpa回傳:{$jdata}|{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  495. $results = json_decode($jdata, true);
  496. if (isset($results['result_code'])) // 歐pa卡, 點數足夠扣
  497. {
  498. if($results['result_code'] == 0)
  499. {
  500. // 臨停開門
  501. $this->temp_opendoors($parms);
  502. // 歐pa卡, 字幕
  503. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",7,{$parms['ivsno']},{$parms['lpr']},{$results['amt']}".MQ_ALTOB_MSG_END_TAG);
  504. // // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}扣{$results['amt']}點請離場");
  505. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}請離場歐pa卡扣:{$results['amt']}點謝謝光臨");
  506. // updated 2016/09/01
  507. $data = array(
  508. 'out_before_time' => date('Y-m-d H:i:s', strtotime(" + 15 minutes")),
  509. 'pay_time' => $this->now_str,
  510. 'pay_type' => 9, // 歐pa卡
  511. 'payed' => 1
  512. );
  513. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  514. // [acer] cmd:102 離場車辨成功流程 START
  515. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 7));
  516. // [acer] cmd:102 離場車辨成功流程 END
  517. }
  518. else if ($results['result_code'] == 12) // 歐pa卡, 餘額不足
  519. {
  520. // 臨停字幕
  521. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",12,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  522. // [acer] cmd:102 離場車辨成功流程 START
  523. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 12));
  524. // [acer] cmd:102 離場車辨成功流程 END
  525. }
  526. else if ($results['result_code'] == 11) // 歐pa卡, 查無會員
  527. {
  528. // 臨停字幕
  529. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",9,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  530. //// $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}其它付款方式");
  531. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}臨時車請投票卡或刷卡出場");
  532. // [acer] cmd:102 離場車辨成功流程 START
  533. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 9));
  534. // [acer] cmd:102 離場車辨成功流程 END
  535. }
  536. else
  537. {
  538. // 臨停字幕
  539. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",9,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  540. // [acer] cmd:102 離場車辨成功流程 START
  541. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 9));
  542. // [acer] cmd:102 離場車辨成功流程 END
  543. }
  544. }
  545. else
  546. {
  547. // 臨停字幕
  548. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",9,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  549. // [acer] cmd:102 離場車辨成功流程 START
  550. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 9));
  551. // [acer] cmd:102 離場車辨成功流程 END
  552. }
  553. }
  554. else
  555. {
  556. $data = array
  557. (
  558. 'out_time' => $this->now_str,
  559. 'out_lane' => $parms['ivsno'],
  560. 'minutes' => $co_time_minutes,
  561. 'out_pic_name' => $parms['pic_name']
  562. );
  563. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  564. trigger_error("{$parms['lpr']}|其它付款方式:" . print_r($rows_cario, true));
  565. // 傳送離場記錄
  566. $sync_agent = new AltobSyncAgent();
  567. $sync_agent->init($parms['sno'], $this->now_str);
  568. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  569. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  570. $sync_result = $sync_agent->sync_st_out($parms);
  571. trigger_error( "..sync_st_out.." . $sync_result);
  572. // [mitac] 要求 mitac 扣款 START
  573. $this->call_mitac_pay($parms['lpr'], $parms['ivsno'], $rows_cario);
  574. // [mitac] 要求 mitac 扣款 END
  575. }
  576. break;
  577. }
  578. }
  579. else if ($rows['member_no'] != 0)
  580. {
  581. // CO.Z.1 月租車無入場資料
  582. if($opendoor)
  583. {
  584. // 會員開門
  585. $this->member_opendoors($parms);
  586. // 會員字幕
  587. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",10,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  588. // $this->mq_send(MQ_TOPIC_SUBTEXT, "{$parms['ivsno']},{$msg}月租戶請離場謝謝光臨");
  589. // [acer] cmd:102 離場車辨成功流程 START
  590. $this->call_acer('102', array('cario_no' => $rows_cario['cario_no'], 'ivs_no' => $parms['ivsno'], 'msg_code' => 10));
  591. // [acer] cmd:102 離場車辨成功流程 END
  592. }
  593. else
  594. {
  595. trigger_error('月租車無入場資料:' . print_r($rows, true));
  596. // 傳送離場記錄
  597. $sync_agent = new AltobSyncAgent();
  598. $sync_agent->init($parms['sno'], $this->now_str);
  599. $sync_agent->member_no = $rows['member_no']; // 會員編號
  600. $sync_agent->finished = 1; // 已離場
  601. $sync_result = $sync_agent->sync_st_out($parms);
  602. trigger_error( "..sync_st_out.." . $sync_result);
  603. }
  604. }
  605. else
  606. {
  607. // CO.Z.Z 無入場資料
  608. if($opendoor)
  609. {
  610. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",13,{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  611. // [acer] cmd:102 離場車辨成功流程 START
  612. $this->call_acer('102', array('cario_no' => 0, 'ivs_no' => $parms['ivsno'], 'msg_code' => 13));
  613. // [acer] cmd:102 離場車辨成功流程 END
  614. }
  615. else
  616. {
  617. trigger_error('無入場資料:' . print_r($rows, true));
  618. // 傳送離場記錄
  619. $sync_agent = new AltobSyncAgent();
  620. $sync_agent->init($parms['sno'], $this->now_str);
  621. $sync_result = $sync_agent->sync_st_out($parms);
  622. trigger_error( "..sync_st_out.." . $sync_result);
  623. }
  624. }
  625. break;
  626. }
  627. }
  628. // 檢查是否合法會員或VIP資料
  629. public function get_member($lpr)
  630. {
  631. $where_arr = array
  632. (
  633. 'c.lpr' => $lpr,
  634. 'c.start_time <=' => $this->now_str,
  635. 'c.end_time >=' => $this->now_str
  636. );
  637. $sql = "select
  638. c.lpr_correct,
  639. c.member_no,
  640. m.member_name,
  641. m.member_type,
  642. m.locked,
  643. m.remarks,
  644. m.park_time,
  645. m.suspended,
  646. m.valid_time,
  647. c.etag,
  648. c.start_time,
  649. c.end_time
  650. from member_car c, members m
  651. where c.member_no = m.member_no
  652. and c.start_time <= '{$this->now_str}'
  653. and c.end_time >= '{$this->now_str}'
  654. and c.lpr = '{$lpr}'
  655. limit 1";
  656. $rows = $this->db->query($sql)->row_array();
  657. // 新增 park_time_check 2016/11/11
  658. $park_time_check = 0;
  659. if (!empty($rows['lpr_correct']))
  660. {
  661. $park_time = $rows['park_time'];
  662. $pt_arr = $this->vars['mcache']->get('pt');
  663. if(empty($pt_arr) || empty($park_time))
  664. {
  665. // ERROR: 無法驗証時段, 跳過時段限制判斷
  666. trigger_error("[ERROR] mcache.pt is empty !!");
  667. $park_time_check = 1;
  668. }
  669. else
  670. {
  671. $now_time = substr($this->now_str, 11); // 日期字串只取最後時間字串(13:25:32)
  672. $week_no = date('w',strtotime($this->now_str)); // 取星期幾
  673. $park_time_array = explode(',', $park_time); // 用 , 格開
  674. foreach($park_time_array as $idx => $park_time_value)
  675. {
  676. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  677. {
  678. if ($week_no >= $pt_rows['w_start'] &&
  679. $week_no <= $pt_rows['w_end'] &&
  680. $now_time >= $pt_rows['time_start'] &&
  681. $now_time <= $pt_rows['time_end'])
  682. {
  683. $park_time_check = 2;
  684. trigger_error("時段代碼:{$park_time_value} 星期:{$week_no}");
  685. break;
  686. }
  687. }
  688. }
  689. }
  690. }
  691. if (empty($rows['lpr_correct'])) // A. 非月租車
  692. {
  693. $rows = array
  694. (
  695. 'lpr_correct' => '',
  696. 'member_no' => 0,
  697. 'member_name' => '',
  698. 'member_type' => 9,
  699. 'etag' => '',
  700. 'start_time' => '',
  701. 'end_time' => '',
  702. );
  703. }
  704. else if(empty($park_time_check)) // B. 月租車, 時段無效
  705. {
  706. trigger_error("無效的時段!! " . print_r($rows, true));
  707. $rows = array
  708. (
  709. 'lpr_correct' => '',
  710. 'member_no' => 0,
  711. 'member_name' => '',
  712. 'member_type' => 9,
  713. 'etag' => '',
  714. 'start_time' => '',
  715. 'end_time' => '',
  716. );
  717. }
  718. else if(!empty($rows['suspended'])) // C. 月租車, 停權中
  719. {
  720. trigger_error("停權中!! " . print_r($rows, true));
  721. $rows = array
  722. (
  723. 'lpr_correct' => '',
  724. 'member_no' => 0,
  725. 'member_name' => '',
  726. 'member_type' => 9,
  727. 'etag' => '',
  728. 'start_time' => '',
  729. 'end_time' => '',
  730. );
  731. }
  732. else if(!empty($rows['valid_time']) && $rows['valid_time'] < $this->now_str) // D. 月租車, 已無效 (審核未通過)
  733. {
  734. trigger_error("已無效!! " . print_r($rows, true));
  735. $rows = array
  736. (
  737. 'lpr_correct' => '',
  738. 'member_no' => 0,
  739. 'member_name' => '',
  740. 'member_type' => 9,
  741. 'etag' => '',
  742. 'start_time' => '',
  743. 'end_time' => '',
  744. );
  745. }
  746. trigger_error('讀取會員:' . print_r($rows, true) . ", park_time_check: {$park_time_check}");
  747. // 20171025 強制先不導入會員
  748. $rows = array
  749. (
  750. 'lpr_correct' => '',
  751. 'member_no' => 0,
  752. 'member_name' => '',
  753. 'member_type' => 9,
  754. 'etag' => '',
  755. 'start_time' => '',
  756. 'end_time' => '',
  757. );
  758. trigger_error(__FUNCTION__ . '..force not found..');
  759. return $rows;
  760. }
  761. /*
  762. // 開門 (月租)
  763. public function member_opendoors($parms)
  764. {
  765. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  766. return true;
  767. }
  768. // 開門 (臨停)
  769. public function temp_opendoors($parms)
  770. {
  771. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  772. return true;
  773. }
  774. */
  775. // 用eTag讀出車號
  776. public function etag2lpr_2($etag)
  777. {
  778. // 用讀取eTag記錄(有double驗證過)
  779. $rows = $this->db->select('lpr')
  780. ->from('etag_lpr')
  781. ->where(array('etag' => $etag, 'confirms >' => 0))
  782. ->limit(1)
  783. ->get()
  784. ->row_array();
  785. // 讀出eTag資料
  786. if (!empty($rows['lpr']))
  787. {
  788. trigger_error("+++車牌NONE,以eTag讀入車牌:{$etag}|{$rows['lpr']}");
  789. return $rows['lpr'];
  790. }
  791. return 'NONE';
  792. }
  793. // 有車牌與eTag, 檢查資料庫 (2017/03/22 new)
  794. public function check_lpr_etag($lpr, $etag)
  795. {
  796. $ETAG_LOG_TITLE = 'etag://';
  797. $ETAG_WARMIN_TITLE = 'etag-warning://';
  798. trigger_error($ETAG_LOG_TITLE. "輸入: {$lpr},{$etag}");
  799. // 手動值上下限
  800. $max_admin_confirms_value = 99;
  801. $min_admin_confirms_value = 50;
  802. // 自動值上下限
  803. $max_system_confirms_value = 33;
  804. $min_system_confirms_value = 0;
  805. // 判斷對應加權
  806. $etag_confirms_bias_plus = 11; // etag 找 車牌, 對上一次可扺 11次
  807. $etag_confirms_bias_minus = -1;
  808. $lpr_confirms_bias_plus = 3; // 車牌 找 etag, 對上一次可扺 3次
  809. $lpr_confirms_bias_minus = -1;
  810. // eTag 找 車牌
  811. $lpr_info_from_etag = $this->db->select('lpr, confirms')
  812. ->from('etag_lpr')
  813. ->where(array('etag' => $etag))
  814. ->limit(1)
  815. ->get()
  816. ->row_array();
  817. if (!empty($lpr_info_from_etag['lpr']))
  818. {
  819. // B. etag 有找到 車牌
  820. if ($lpr_info_from_etag['lpr'] == $lpr)
  821. {
  822. // B.1. etag 有找到 車牌, 且 車牌 相符, confirms 上升
  823. $confirms_bias = $etag_confirms_bias_plus;
  824. }
  825. else
  826. {
  827. // B.2. etag 有找到 車牌, 但 車牌 不符, confirms 下降
  828. $confirms_bias = $etag_confirms_bias_minus;
  829. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | lpr error : {$lpr},{$etag} | query:" . print_r($lpr_info_from_etag, true));
  830. }
  831. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  832. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  833. // 更新 confirms 資訊
  834. if($next_confirms_value > $max_admin_confirms_value)
  835. {
  836. // B.3.0 confirms 超過 max_admin_confirms_value, skip
  837. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  838. }
  839. else if ($next_confirms_value >= $min_admin_confirms_value)
  840. {
  841. // B.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  842. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  843. }
  844. else if ($next_confirms_value > $max_system_confirms_value)
  845. {
  846. // B.3.2 confirms 超過 max_system_confirms_value, skip
  847. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  848. }
  849. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  850. {
  851. // B.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  852. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  853. }
  854. else
  855. {
  856. // B.3.4 若低於 min_system_confirms_value,刪除
  857. $this->db->delete('etag_lpr', array('etag' => $etag));
  858. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  859. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  860. }
  861. }
  862. else
  863. {
  864. // 車牌 找 etag
  865. $etag_info_form_lpr = $this->db->select('etag, confirms, member_no')
  866. ->from('etag_lpr')
  867. ->where(array('lpr' => $lpr))
  868. ->limit(1)
  869. ->get()
  870. ->row_array();
  871. if (!empty($etag_info_form_lpr['etag']))
  872. {
  873. // A. 車牌 有找到 etag
  874. if ($etag_info_form_lpr['etag'] == $etag)
  875. {
  876. // A.1. 車牌 有找到 etag, 且 etag 相符, confirms 上升
  877. $confirms_bias = $lpr_confirms_bias_plus;
  878. // 若尚未登記為會員
  879. if(empty($etag_info_form_lpr['member_no']))
  880. {
  881. // 檢查是否會員
  882. $member_info_from_lpr = $this->db->select('member_no, member_name')
  883. ->from('members')
  884. ->where(array('lpr' => $lpr))
  885. ->limit(1)
  886. ->get()
  887. ->row_array();
  888. // 確認為會員, 建立 eTag 資訊
  889. if (!empty($member_info_from_lpr['member_no']))
  890. {
  891. $data['member_no'] = $member_info_from_lpr['member_no'];
  892. $data['member_name'] = $member_info_from_lpr['member_name'];
  893. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  894. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  895. // 更新 etag_lpr
  896. $this->db->where('etag', $etag)->update('etag_lpr', $data);
  897. }
  898. }
  899. }
  900. else
  901. {
  902. // A.2. 車牌 有找到 etag, 但 etag 不符, confirms 下降
  903. $confirms_bias = $lpr_confirms_bias_minus;
  904. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | etag error : {$lpr},{$etag} | query:" . print_r($etag_info_form_lpr, true));
  905. }
  906. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  907. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  908. // 更新 confirms 資訊
  909. if($next_confirms_value > $max_admin_confirms_value)
  910. {
  911. // A.3.0 confirms 超過 max_admin_confirms_value, skip
  912. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  913. }
  914. else if ($next_confirms_value >= $min_admin_confirms_value)
  915. {
  916. // A.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  917. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  918. }
  919. else if ($next_confirms_value > $max_system_confirms_value)
  920. {
  921. // A.3.2 confirms 超過 max_system_confirms_value, skip
  922. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  923. }
  924. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  925. {
  926. // A.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  927. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  928. }
  929. else
  930. {
  931. // A.3.4 若低於 min_system_confirms_value,刪除
  932. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  933. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  934. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  935. }
  936. }
  937. else
  938. {
  939. // C. 車牌 與 etag 都找不到記錄
  940. $data = array
  941. (
  942. 'lpr' => $lpr,
  943. 'lpr_correct' => $lpr,
  944. 'etag' => $etag
  945. );
  946. // 檢查是否會員
  947. $member_info_from_lpr = $this->db->select('member_no, member_name')
  948. ->from('members')
  949. ->where(array('lpr' => $lpr))
  950. ->limit(1)
  951. ->get()
  952. ->row_array();
  953. // 會員者, 將eTag update回去
  954. if (!empty($member_info_from_lpr['member_no']))
  955. {
  956. $data['member_no'] = $member_info_from_lpr['member_no'];
  957. $data['member_name'] = $member_info_from_lpr['member_name'];
  958. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  959. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  960. }
  961. // 建立第一筆記錄
  962. $this->db->insert('etag_lpr', $data);
  963. $etag_lpr_seqno = $this->db->insert_id();
  964. trigger_error($ETAG_LOG_TITLE . "create | insert seqno = {$etag_lpr_seqno}". print_r($data, true));
  965. }
  966. }
  967. }
  968. /*
  969. // 有車牌與eTag, 檢查資料庫
  970. public function check_lpr_etag($lpr, $etag)
  971. {
  972. // 用讀取eTag記錄(有double驗證過)
  973. $rows = $this->db->select('etag, confirms')
  974. ->from('etag_lpr')
  975. ->where(array('lpr' => $lpr))
  976. ->limit(1)
  977. ->get()
  978. ->row_array();
  979. // 讀出eTag資料
  980. if (!empty($rows['etag']))
  981. {
  982. // 車牌與eTag皆相符, 檢查是否confirms欄位若為0, 設成1(double驗證)
  983. if ($rows['etag'] == $etag)
  984. {
  985. if ($rows['confirms'] == 0) $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 1));
  986. }
  987. else // eTag不相符
  988. {
  989. if ($rows['confirms'] == 1)
  990. {
  991. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 0));
  992. }
  993. else // 原confirms為0者, 刪除之
  994. {
  995. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  996. }
  997. }
  998. }
  999. else // 無資料, 新增一筆
  1000. {
  1001. // 再檢查一次是否有eTag ?
  1002. $rows_etag = $this->db->select('lpr, confirms')
  1003. ->from('etag_lpr')
  1004. ->where(array('etag' => $etag))
  1005. ->limit(1)
  1006. ->get()
  1007. ->row_array();
  1008. if (empty($rows_etag['lpr'])) // 無資料
  1009. {
  1010. $data = array
  1011. (
  1012. 'lpr' => $lpr,
  1013. 'lpr_correct' => $lpr,
  1014. 'etag' => $etag
  1015. );
  1016. // 檢查是否會員
  1017. $rows_members = $this->db->select('member_no, member_name')
  1018. ->from('members')
  1019. ->where(array('lpr' => $lpr))
  1020. ->limit(1)
  1021. ->get()
  1022. ->row_array();
  1023. // 會員者, 將eTag update回去
  1024. if (!empty($rows_members['member_no']))
  1025. {
  1026. $data['member_no'] = $rows_members['member_no'];
  1027. $data['member_name'] = $rows_members['member_name'];
  1028. $this->db->where('member_no', $rows_members['member_no'])->update('member_car', array('etag' => $etag));
  1029. $this->db->where('member_no', $rows_members['member_no'])->update('members', array('etag' => $etag));
  1030. }
  1031. $this->db->insert('etag_lpr', $data);
  1032. }
  1033. else
  1034. {
  1035. if ($rows_etag['confirms'] == 1)
  1036. {
  1037. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => 0));
  1038. }
  1039. else // 原confirms為0者, 刪除之
  1040. {
  1041. $this->db->delete('etag_lpr', array('etag' => $etag));
  1042. }
  1043. }
  1044. }
  1045. }
  1046. */
  1047. // 送出至message queue(目前用mqtt)
  1048. public function mq_send($topic, $msg)
  1049. {
  1050. $this->vars['mqtt']->publish($topic, $msg, 0);
  1051. trigger_error("mqtt:{$topic}|{$msg}");
  1052. }
  1053. // 產生 CK
  1054. public function gen_opendoor_ck($parms, $function_name)
  1055. {
  1056. return md5($parms['ivsno']. 'alt' . date('dmh') . 'o' . $parms['lpr'] . 'b' . $function_name);
  1057. }
  1058. // 開門 (月租)
  1059. public function member_opendoors($parms)
  1060. {
  1061. //$this->mq_send_opendoor(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  1062. $ck = $this->gen_opendoor_ck($parms, __FUNCTION__);
  1063. get_headers("http://localhost/cars.html/" . __FUNCTION__ . "/{$parms['ivsno']}/{$parms['lpr']}/{$ck}");
  1064. return true;
  1065. }
  1066. // 開門 (臨停)
  1067. public function temp_opendoors($parms)
  1068. {
  1069. //$this->mq_send_opendoor(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  1070. $ck = $this->gen_opendoor_ck($parms, __FUNCTION__);
  1071. get_headers("http://localhost/cars.html/" . __FUNCTION__ ."/{$parms['ivsno']}/{$parms['lpr']}/{$ck}");
  1072. return true;
  1073. }
  1074. // 開門 (月租)
  1075. public function do_member_opendoor($parms)
  1076. {
  1077. if($parms['ck'] != $this->gen_opendoor_ck($parms, 'member_opendoors'))
  1078. {
  1079. return 'ck_error'; // 中斷
  1080. }
  1081. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  1082. return 'ok';
  1083. }
  1084. // 開門 (臨停)
  1085. public function do_temp_opendoor($parms)
  1086. {
  1087. if($parms['ck'] != $this->gen_opendoor_ck($parms, 'temp_opendoors'))
  1088. {
  1089. return 'ck_error'; // 中斷
  1090. }
  1091. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  1092. return 'ok';
  1093. }
  1094. // 指派車位
  1095. // http://203.75.167.89/parkingquery.html/get_valid_seat
  1096. // 註記現在時間, 並保留10分鐘
  1097. public function get_valid_seat()
  1098. {
  1099. $data = array();
  1100. //$data['result']['location_no'] = '0';
  1101. //$data['result_code'] = 'FAIL';
  1102. //return $data;
  1103. // 撈 roger db
  1104. /*
  1105. $sql = "
  1106. SELECT ParkingNum AS pksno FROM table_carpark
  1107. WHERE LPR = '' AND DisableSeat = 0 AND
  1108. (SELECT COUNT(*) FROM table_carpark WHERE LPR = '' AND DisableSeat = 0) <= 10
  1109. ORDER BY RAND() LIMIT 1 FOR UPDATE;
  1110. ";
  1111. $dsn_old_db = $this->load->database('old_db', true);
  1112. // 2016/12/14 roger_db 掛了的可能
  1113. if ($dsn_old_db->initialize())
  1114. {
  1115. $retults = $dsn_old_db->query($sql)->result_array();
  1116. }
  1117. if(!empty($retults[0]))
  1118. {
  1119. $data['result']['location_no'] = substr($retults[0]['pksno'], 1);
  1120. $data['result_code'] = 'OK';
  1121. $data['loc_name'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1122. $data['floors'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1123. }
  1124. else
  1125. {
  1126. $data['result']['location_no'] = '0';
  1127. $data['result_code'] = 'FAIL';
  1128. }
  1129. */
  1130. $this->db->trans_start();
  1131. $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;";
  1132. $rows = $this->db->query($sql)->row_array();
  1133. if (!empty($rows['pksno']))
  1134. {
  1135. $data['result']['location_no'] = substr($rows['pksno'], -3);
  1136. $data['result_code'] = 'OK';
  1137. $sql = "update pks set book_time = addtime(now(), '00:10:00') where pksno = {$rows['pksno']};";
  1138. $this->db->query($sql);
  1139. $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";
  1140. $rows = $this->db->query($sql)->row_array();
  1141. $data['loc_name'] = $rows['group_name'];
  1142. $data['floors'] = $rows['floors'];
  1143. }
  1144. else
  1145. {
  1146. $data['result']['location_no'] = '0';
  1147. $data['result_code'] = 'FAIL';
  1148. }
  1149. $this->db->trans_complete();
  1150. return $data;
  1151. }
  1152. // 取得出入口 888 資訊
  1153. public function get_888_info($parms)
  1154. {
  1155. $data = array();
  1156. $sql = "select availables as availables, tot as tot from pks_groups where group_id = 'C888' and station_no = {$parms['sno']}";
  1157. $rows = $this->db->query($sql)->row_array();
  1158. if (!empty($rows) && array_key_exists('availables', $rows))
  1159. {
  1160. $data['result_code'] = 'OK';
  1161. $data['availables'] = $rows['availables'];
  1162. $data['tot'] = $rows['tot'];
  1163. }
  1164. else
  1165. {
  1166. trigger_error(__FUNCTION__ . "..not found..".print_r($parms, true));
  1167. $data['result_code'] = 'FAIL';
  1168. $data['availables'] = 9999; // 如果拿不到就忽略這個流程
  1169. $data['tot'] = 0;
  1170. }
  1171. return $data;
  1172. }
  1173. // ===============================================
  1174. // acer cmd
  1175. // ===============================================
  1176. // 產生通行碼
  1177. function gen_pass_code()
  1178. {
  1179. return rand(100000,999999);
  1180. }
  1181. // 呼叫acer
  1182. function call_acer($cmd, $parms)
  1183. {
  1184. return false; // 尚未啟用
  1185. try{
  1186. $ch = curl_init();
  1187. curl_setopt($ch, CURLOPT_URL, 'http://localhost/acer_service.html/cmd_'. $cmd);
  1188. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  1189. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1190. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  1191. curl_setopt($ch, CURLOPT_POST, TRUE);
  1192. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,3);
  1193. curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
  1194. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parms));
  1195. $data = curl_exec($ch);
  1196. if(curl_errno($ch))
  1197. {
  1198. trigger_error(__FUNCTION__ . ', curl error: '. curl_error($ch));
  1199. }
  1200. curl_close($ch);
  1201. trigger_error(__FUNCTION__ . '..'. $data);
  1202. }catch (Exception $e){
  1203. trigger_error(__FUNCTION__ . 'error:'.$e->getMessage());
  1204. }
  1205. }
  1206. // ===============================================
  1207. // mitac cmd
  1208. // ===============================================
  1209. // 要求 mitac 扣款
  1210. function call_mitac_pay($lpr, $ivsno, $rows_cario)
  1211. {
  1212. $function_name = 'parking_fee_altob';
  1213. $seqno = $rows_cario['cario_no'];
  1214. $lpr = $lpr;
  1215. $in_time = $rows_cario['out_before_time'];
  1216. $out_time = $this->now_str;
  1217. $gate_id = $ivsno;
  1218. // 通訊內容
  1219. $parms = array(
  1220. 'seqno' => $seqno,
  1221. 'lpr' => $lpr,
  1222. 'in_time' => $in_time,
  1223. 'out_time' => $out_time,
  1224. 'gate_id' => $gate_id);
  1225. // 驗証碼
  1226. $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);
  1227. // 呼叫
  1228. try{
  1229. $ch = curl_init();
  1230. curl_setopt($ch, CURLOPT_URL, "http://localhost/mitac_service.html/{$function_name}");
  1231. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  1232. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1233. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  1234. curl_setopt($ch, CURLOPT_POST, TRUE);
  1235. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,3);
  1236. curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
  1237. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parms));
  1238. $data = curl_exec($ch);
  1239. if(curl_errno($ch))
  1240. {
  1241. trigger_error(__FUNCTION__ . ', curl error: '. curl_error($ch));
  1242. }
  1243. curl_close($ch);
  1244. trigger_error(__FUNCTION__ . '..'. $data);
  1245. }catch (Exception $e){
  1246. trigger_error(__FUNCTION__ . 'error:'.$e->getMessage());
  1247. }
  1248. }
  1249. }