VM暫存
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

Cars_model.php 48KB

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