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ů.

Cars_model.php 48KB

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