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

Cars_model.php 48KB

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