VM暫存
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

Cars_model.php 59KB

8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
8年前
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777
  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. // 產生回傳訊息
  23. function gen_return_msg($msg_id, $open_or_not=false)
  24. {
  25. $open_id = $open_or_not ? 1 : 0;
  26. return $open_id . ',' . str_pad($msg_id, 5, '0', STR_PAD_LEFT);
  27. }
  28. // 修改車辨記錄
  29. public function upd_cario($parms)
  30. {
  31. trigger_error(__FUNCTION__ . '|修改車辨記錄:' . print_r($parms, true));
  32. // 更新入場記錄
  33. $data = array('obj_id' => $parms['lpr']);
  34. $this->db->update('cario', $data, array('station_no' => $parms['sno'], 'cario_no' => $parms['cno'], 'obj_id' => $parms['old_lpr'], 'err' => 0, 'finished' => 0));
  35. if ($this->db->affected_rows() <= 0)
  36. {
  37. trigger_error(__FUNCTION__ . '|fail|' . $this->db->last_query());
  38. return 'fail';
  39. }
  40. /* 20171226 車辨失敗暫不同步
  41. // 傳送更新記錄
  42. $sync_agent = new AltobSyncAgent();
  43. $sync_agent->init($parms['sno'], $this->now_str);
  44. $sync_agent->cario_no = $parms['cno']; // 進出編號
  45. $sync_result = $sync_agent->sync_st_io_meta($data);
  46. trigger_error( __FUNCTION__ . "..sync_st_io_meta|{$sync_agent->cario_no}|$sync_result|..". print_r($data, true));
  47. */
  48. return 'ok';
  49. }
  50. // 特殊方式進出註記
  51. public function ipcam_meta($parms)
  52. {
  53. trigger_error(__FUNCTION__ . '|特殊註記:' . print_r($parms, true));
  54. if($parms['token'] != 1)
  55. {
  56. trigger_error(__FUNCTION__ . '|未定義|' . print_r($parms, true));
  57. return false;
  58. }
  59. // 讀取最近一筆入場資料
  60. $rows_cario = $this->db->select('cario_no, obj_id, in_time, out_before_time')
  61. ->from('cario')
  62. ->where(array(
  63. 'station_no' => $parms['sno'],
  64. 'obj_id' => $parms['lpr'],
  65. 'err' => 0
  66. ))
  67. ->order_by('cario_no', 'desc')
  68. ->limit(1)
  69. ->get()
  70. ->row_array();
  71. if (!isset($rows_cario['cario_no']))
  72. {
  73. trigger_error(__FUNCTION__ . '|查無入場記錄|' . print_r($parms, true));
  74. return false;
  75. }
  76. // 更新入場記錄
  77. if(strtotime($rows_cario['out_before_time']) - strtotime($rows_cario['in_time']) > 600)
  78. $data = array('ticket_type' => 3, 'out_before_time' => $rows_cario['in_time']); // 刷進刷出需過卡
  79. else
  80. $data = array('ticket_type' => 3);
  81. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no']));
  82. trigger_error(__FUNCTION__ . '|悠遊卡,更新入場記錄|');
  83. $affect_rows = $this->db->affected_rows();
  84. if ($affect_rows > 0)
  85. {
  86. // 傳送更新記錄
  87. $sync_agent = new AltobSyncAgent();
  88. $sync_agent->init($parms['sno'], $this->now_str);
  89. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  90. $sync_result = $sync_agent->sync_st_io_meta($data);
  91. trigger_error( __FUNCTION__ . "..sync_st_io_meta|{$sync_agent->cario_no}|$sync_result|..". print_r($data, true));
  92. }
  93. }
  94. // 車輛進出傳入車牌號碼 (2016/07/27)
  95. public function opendoor_lprio($parms)
  96. {
  97. $parms['lpr'] = urldecode($parms['lpr']);
  98. $rows = array();
  99. // $parms['ts'] = date('Y-m-d H:i:s', $parms['ts']);
  100. trigger_error(__FUNCTION__ . '|車牌傳入:' . print_r($parms, true));
  101. if ($parms['etag'] != 'NONE')
  102. {
  103. if ($parms['lpr'] != 'NONE')
  104. {
  105. // do nothing
  106. }
  107. else // 車辨失敗但有eTag, 查詢是否有車號
  108. {
  109. //$parms['lpr'] = $this->etag2lpr_2($parms['etag']); // 2017/01/10 預設都不用 ETAG 找車牌
  110. }
  111. }
  112. $rows = $this->get_member($parms['lpr'],$parms['sno']);
  113. return $this->save_db_io($parms, $rows, true);
  114. }
  115. // 車輛進出傳入車牌號碼
  116. public function lprio($parms)
  117. {
  118. //$parms['lpr'] = urldecode($parms['lpr']);
  119. $rows = array();
  120. // $parms['ts'] = date('Y-m-d H:i:s', $parms['ts']);
  121. trigger_error('車牌傳入:' . print_r($parms, true));
  122. if ($parms['etag'] != 'NONE')
  123. {
  124. if ($parms['lpr'] != 'NONE')
  125. {
  126. // 有車牌有eTag, 檢查資料庫是否double驗證
  127. //get_headers("http://192.168.10.201/cars.html/check_lpr_etag/{$parms['lpr']}/{$parms['etag']}");
  128. get_headers("http://localhost/cars.html/check_lpr_etag/{$parms['lpr']}/{$parms['etag']}"); // update 2016/07/26
  129. }
  130. else // 車辨失敗但有eTag, 查詢是否有車號
  131. {
  132. // $parms['lpr'] = $this->etag2lpr_2($parms['etag']); // 2017/01/10 預設都不用 ETAG 找車牌
  133. }
  134. }
  135. $rows = $this->get_member($parms['lpr'],$parms['sno']);
  136. return $this->save_db_io($parms, $rows);
  137. }
  138. // 入出口異動cario
  139. public function save_db_io($parms, $rows, $opendoor=false)
  140. {
  141. $msg_id = 0; // 訊息代碼
  142. if (!empty($rows['lpr_correct'])) $parms['lpr'] = $rows['lpr_correct'];
  143. // [START] 擋重覆
  144. $skip_or_not = false;
  145. $new_cars_tmp = array
  146. (
  147. 'timestamp' => time(),
  148. 'sno_io' => $parms['sno'] . $parms['io'],
  149. 'lpr' => $parms['lpr'],
  150. 'opendoor' => $opendoor // 20180118 開門與否訊號都過濾
  151. );
  152. $cars_tmp_arr = array();
  153. $cars_tmp_log_arr = $this->vars['mcache']->get(CARS_TMP_LOG);
  154. if(!empty($cars_tmp_log_arr))
  155. {
  156. foreach($cars_tmp_log_arr as $tmp)
  157. {
  158. if(isset($tmp['timestamp']) && $tmp['timestamp'] > time() - 3) // 時限內才判斷 (3 sec)
  159. {
  160. array_push($cars_tmp_arr, $tmp);
  161. }
  162. }
  163. }
  164. // 判斷是否繼續
  165. foreach($cars_tmp_arr as $tmp)
  166. {
  167. if( $new_cars_tmp['lpr'] == $tmp['lpr'] &&
  168. $new_cars_tmp['sno_io'] == $tmp['sno_io'] &&
  169. $new_cars_tmp['opendoor'] == $tmp['opendoor'] // 20180118 開門與否訊號都過濾
  170. )
  171. {
  172. $skip_or_not = true;
  173. }
  174. }
  175. // 更新 CARS_TMP_LOG
  176. array_push($cars_tmp_arr, $new_cars_tmp);
  177. $this->vars['mcache']->set(CARS_TMP_LOG, $cars_tmp_arr);
  178. trigger_error(__FUNCTION__ . '..new ' . CARS_TMP_LOG . " |s:{$skip_or_not}|" . print_r($cars_tmp_arr, true));
  179. // 跳過
  180. if($skip_or_not)
  181. {
  182. trigger_error(__FUNCTION__ . '..skip..');
  183. // [msg] 0: 不處理
  184. $msg_id = 0;
  185. return $this->gen_return_msg($msg_id);
  186. }
  187. // [END] 擋重覆
  188. // 車辨失敗, 結束
  189. if ($parms['lpr'] == 'NONE')
  190. {
  191. if($opendoor)
  192. {
  193. // [msg] 1: 車辨失敗
  194. $msg_id = 1;
  195. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']}".MQ_ALTOB_MSG_END_TAG);
  196. return $this->gen_return_msg($msg_id);
  197. }
  198. else
  199. {
  200. if(substr($parms['io'], -strlen('I')) === 'I')
  201. {
  202. $data = array
  203. (
  204. 'station_no' => $parms['sno'],
  205. 'obj_type' => 1,
  206. 'obj_id' => $parms['lpr'],
  207. 'etag' => $parms['etag'] == 'NONE' ? '' : $parms['etag'],
  208. 'in_out' => $parms['io'],
  209. 'member_no' => 0,
  210. 'finished' => 0,
  211. 'in_time' => $this->now_str,
  212. 'in_lane' => $parms['ivsno'],
  213. 'in_pic_name' => empty($parms['pic_name']) ? '' : $parms['pic_name'],
  214. 'out_before_time' => date("Y-m-d H:i:s"),
  215. 'ticket_no' => $this->gen_pass_code()
  216. );
  217. $this->db->insert('cario', $data);
  218. trigger_error("[車辨失敗] 新增入場資料:".print_r($parms, true));
  219. }
  220. }
  221. return false;
  222. }
  223. $msg = $rows['member_no'] != 0 ? "{$parms['lpr']}." : $parms['lpr']; // 月租車號加.符號
  224. // 月租鎖車, 結束
  225. if ((substr($parms['io'], -strlen('O')) === 'O') && $rows['member_no'] != 0 && !empty($rows['locked']) && $rows['locked'] == 1)
  226. {
  227. if($opendoor)
  228. {
  229. // [msg] 2: 已鎖車
  230. $msg_id = 2;
  231. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  232. return $this->gen_return_msg($msg_id);
  233. }
  234. return false;
  235. }
  236. // 取得會員資訊
  237. $parms['member_no'] = $rows['member_no'];
  238. switch($parms['io'])
  239. {
  240. case 'CI':
  241. case 'MI':
  242. if($opendoor)
  243. {
  244. // 空車位導引
  245. $pks_arr = $this->get_valid_seat();
  246. if ($pks_arr['result']['location_no'] != 0)
  247. {
  248. $pks_loc_name = $pks_arr['loc_name'];
  249. $pks_loc_no = $pks_arr['result']['location_no'];
  250. $pks_floors = $pks_arr['floors'];
  251. }
  252. else
  253. {
  254. $pks_loc_name = 0;
  255. $pks_loc_no = 0;
  256. $pks_floors = 0;
  257. }
  258. // 訊息
  259. // 訊息
  260. if ($rows['member_no'] > 0)
  261. {
  262. // [msg] 4: 會員, 開門
  263. $msg_id = 4;
  264. // 會員開門
  265. $this->member_opendoors($parms);
  266. }
  267. else
  268. {
  269. /*$ck = md5($parms['lpr']);
  270. $jdata = file_get_contents("http://localhost/allpa_service.html/get_allpa_valid_user/{$parms['lpr']}/{$ck}");
  271. $results = json_decode($jdata, true);
  272. if($results['result_code'] == 0)
  273. {
  274. // [msg] 3: 歐pa卡, 開門
  275. $msg_id = 3;
  276. // 會員開門
  277. $this->member_opendoors($parms);
  278. }
  279. else
  280. {*/
  281. // [msg] 11: 臨停車, 開門
  282. $msg_id = 11;
  283. // 臨停開門
  284. $this->temp_opendoors($parms);
  285. //}
  286. }
  287. // 字幕
  288. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']},{$pks_floors},{$pks_loc_no}".MQ_ALTOB_MSG_END_TAG);
  289. // 產生回傳
  290. return $this->gen_return_msg($msg_id, true);
  291. }
  292. else
  293. // 資料流
  294. {
  295. if ($parms['lpr'] != 'NONE')
  296. {
  297. $data = array
  298. (
  299. 'err' => 1,
  300. 'finished' => 1
  301. );
  302. // 原有歷史記錄, 設定錯誤碼為1(入場不應該有歷史記錄)
  303. $this->db->update('cario', $data, array('obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0, 'obj_type' => 1));
  304. $affect_rows = $this->db->affected_rows();
  305. if ($affect_rows > 0)
  306. {
  307. trigger_error("err://入場郤已有歷史進場記錄[{$affect_rows}]筆,已設成錯誤並結清記錄".print_r($parms, true));
  308. }
  309. }
  310. //20190113新增手動入場
  311. // 15分鐘內, 可直接離場 (刷進刷出需過卡修正)
  312. //if(isset($parms['free_time']) && $parms['free_time'] > 0)
  313. // $out_before_time_value = date('Y-m-d H:i:s', strtotime(" + {$parms['free_time']} minutes"));
  314. //else
  315. // $out_before_time_value = date("Y-m-d H:i:s");
  316. $data = array
  317. (
  318. 'station_no' => $parms['sno'],
  319. 'obj_type' => 1,
  320. 'obj_id' => $parms['lpr'],
  321. 'etag' => $parms['etag'] == 'NONE' ? '' : $parms['etag'],
  322. 'in_out' => $parms['io'],
  323. 'member_no' => $rows['member_no'],
  324. 'finished' => 0,
  325. 'in_time' => $this->now_str,
  326. 'in_lane' => $parms['ivsno'],
  327. 'in_pic_name' => empty($parms['pic_name']) ? '' : $parms['pic_name'],
  328. 'out_before_time' => $this->now_str,
  329. 'ticket_no' => $this->gen_pass_code()
  330. );
  331. $data['in_time'] = isset($parms['in_time']) ? $parms['in_time'] : $this->now_str;
  332. if(isset($parms['free_time']) && $parms['free_time'] > 0)
  333. {
  334. $data['out_before_time'] = date('Y-m-d H:i:s', strtotime(" + {$parms['free_time']} minutes",strtotime($parms['in_time'])));
  335. if($data['out_before_time'] < $data['in_time'])
  336. {
  337. $data['out_before_time']=$data['in_time'];
  338. }
  339. }
  340. else
  341. {
  342. $data['out_before_time'] = $data['in_time'];
  343. }
  344. $this->db->insert('cario', $data);
  345. trigger_error("新增入場資料:".print_r($parms, true));
  346. // 傳送進場記錄
  347. $sync_agent = new AltobSyncAgent();
  348. $sync_agent->init($parms['sno'], $this->now_str);
  349. $sync_agent->cario_no = $this->db->insert_id(); // 進出編號
  350. $sync_agent->member_no = $rows['member_no']; // 會員編號
  351. $sync_result = $sync_agent->sync_st_in($parms);
  352. trigger_error( "..sync_st_in.." . $sync_result);
  353. }
  354. return true;
  355. break;
  356. // 出場
  357. case 'CO':
  358. case 'MO':
  359. // 讀取最近一筆入場資料
  360. $rows_cario = $this->db
  361. ->select('cario_no, payed, in_time, pay_time, out_before_time')
  362. ->from('cario')
  363. //->where(array('in_out' => 'CI', 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0))
  364. ->where(array('obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0))
  365. ->order_by('cario_no', 'desc')
  366. ->limit(1)
  367. ->get()
  368. ->row_array();
  369. trigger_error("opendoor={$opendoor}| 出場讀到資料:{$rows['member_no']}|".time().'|'.print_r($rows_cario, true));
  370. if (!empty($rows_cario['cario_no'])) // 在限時內可出場
  371. {
  372. $co_time_minutes = floor((strtotime($this->now_str) - strtotime($rows_cario['in_time'])) / 60); // 停車時數 (分鐘)
  373. // 合規定者開門放行
  374. switch(true)
  375. {
  376. case $rows['member_no'] != 0:
  377. // CO.A.1 會員車
  378. // 判斷時段租是否超時 (超過 12 小時)
  379. if($rows['park_time'] != 'RE' && $co_time_minutes > 720)
  380. {
  381. if($opendoor)
  382. {
  383. // [msg] 16: 時段租超時字幕
  384. $msg_id = 16;
  385. // 字幕
  386. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  387. // 產生回傳
  388. return $this->gen_return_msg($msg_id);
  389. }
  390. else
  391. {
  392. $data = array
  393. (
  394. 'out_time' => $this->now_str,
  395. 'out_lane' => $parms['ivsno'],
  396. 'minutes' => $co_time_minutes,
  397. 'out_pic_name' => $parms['pic_name']
  398. );
  399. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  400. trigger_error("{$parms['lpr']}|時段租超時" . print_r($rows_cario, true));
  401. // 傳送離場記錄
  402. $sync_agent = new AltobSyncAgent();
  403. $sync_agent->init($parms['sno'], $this->now_str);
  404. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  405. $sync_agent->member_no = $rows['member_no']; // 會員編號
  406. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  407. $sync_result = $sync_agent->sync_st_out($parms);
  408. trigger_error( "..sync_st_out.." . $sync_result);
  409. }
  410. return true;
  411. }
  412. if($opendoor)
  413. {
  414. // [msg] 5: 會員離場開門
  415. $msg_id = 5;
  416. // 會員開門
  417. $this->member_opendoors($parms);
  418. // 字幕
  419. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  420. // 產生回傳
  421. return $this->gen_return_msg($msg_id, true);
  422. }
  423. else
  424. {
  425. $data = array
  426. (
  427. 'in_out' => $parms['io'],
  428. 'finished' => 1,
  429. 'out_time' => $this->now_str,
  430. 'out_lane' => $parms['ivsno'],
  431. 'minutes' => $co_time_minutes,
  432. 'out_pic_name' => $parms['pic_name']
  433. );
  434. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no']));
  435. trigger_error('會員車離場:' . print_r($rows, true));
  436. // 傳送離場記錄
  437. $sync_agent = new AltobSyncAgent();
  438. $sync_agent->init($parms['sno'], $this->now_str);
  439. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  440. $sync_agent->member_no = $rows['member_no']; // 會員編號
  441. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  442. $sync_agent->finished = 1; // 已離場
  443. $sync_result = $sync_agent->sync_st_out($parms);
  444. trigger_error( "..sync_st_out.." . $sync_result);
  445. }
  446. return true;
  447. break;
  448. case strtotime($rows_cario['out_before_time']) >= time():
  449. if ($rows_cario['payed'])
  450. {
  451. // CO.B.1 臨停車已付款
  452. if($opendoor)
  453. {
  454. // [msg] 6: 臨停車已付款
  455. $msg_id = 6;
  456. // 臨停開門
  457. $this->temp_opendoors($parms);
  458. // 字幕
  459. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  460. // 產生回傳
  461. return $this->gen_return_msg($msg_id, true);
  462. }
  463. else
  464. {
  465. $data = array
  466. (
  467. 'in_out' => $parms['io'],
  468. 'finished' => 1,
  469. 'out_time' => $this->now_str,
  470. 'out_lane' => $parms['ivsno'],
  471. 'minutes' => $co_time_minutes,
  472. 'out_pic_name' => $parms['pic_name']
  473. );
  474. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no']));
  475. trigger_error('臨停車已付款:' . print_r($rows, true));
  476. // 傳送離場記錄
  477. $sync_agent = new AltobSyncAgent();
  478. $sync_agent->init($parms['sno'], $this->now_str);
  479. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  480. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  481. $sync_agent->finished = 1; // 已離場
  482. $sync_result = $sync_agent->sync_st_out($parms);
  483. trigger_error( "..sync_st_out.." . $sync_result);
  484. }
  485. return true;
  486. }
  487. else
  488. {
  489. // CO.B.2 臨停車未付款
  490. if($opendoor)
  491. {
  492. // [msg] 8: 臨停車未付款
  493. $msg_id = 8;
  494. // 字幕
  495. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  496. // 產生回傳
  497. return $this->gen_return_msg($msg_id);
  498. }
  499. else
  500. {
  501. // TODO: 歐pa卡離場記錄和臨停未付款一樣, 待更正
  502. $data = array
  503. (
  504. 'out_time' => $this->now_str,
  505. 'out_lane' => $parms['ivsno'],
  506. 'minutes' => $co_time_minutes,
  507. 'out_pic_name' => $parms['pic_name']
  508. );
  509. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  510. trigger_error('臨停未付款:' . print_r($rows, true));
  511. // 傳送離場記錄
  512. $sync_agent = new AltobSyncAgent();
  513. $sync_agent->init($parms['sno'], $this->now_str);
  514. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  515. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  516. $sync_result = $sync_agent->sync_st_out($parms);
  517. trigger_error( "..sync_st_out.." . $sync_result);
  518. // [mitac] 要求 mitac 扣款 START
  519. $this->call_mitac_pay($parms['lpr'], $parms['ivsno'], $rows_cario);
  520. // [mitac] 要求 mitac 扣款 END
  521. // [宏奇系統] 離場車辨成功流程 START
  522. if($parms['sno'] == 40671 || $parms['sno'] == 40672 || $parms['sno'] == 40673)
  523. {
  524. $this->acarps($parms['lpr']);
  525. }
  526. // [宏奇系統] 離場車辨成功流程 END
  527. }
  528. return true;
  529. }
  530. break;
  531. default:
  532. // CO.C.1 其它付款方式
  533. if($opendoor)
  534. {
  535. $in_time = strtotime($rows_cario['out_before_time']);
  536. $ck = md5($in_time. $parms['lpr'] . $parms['sno']);
  537. //$jdata = file_get_contents("http://localhost/allpa_service.html/allpa_go/{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  538. $jdata = file_get_contents("http://localhost/allpa_service.html/allpa_go_remote/{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  539. trigger_error("allpa回傳:{$jdata}|{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  540. $results = json_decode($jdata, true);
  541. if (isset($results['result_code'])) // 歐pa卡, 點數足夠扣
  542. {
  543. if($results['result_code'] == 0)
  544. {
  545. // [msg] 7: 歐pa卡付款
  546. $msg_id = 7;
  547. // 臨停開門
  548. $this->temp_opendoors($parms);
  549. // 歐pa卡, 字幕
  550. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']},{$results['amt']}".MQ_ALTOB_MSG_END_TAG);
  551. $data = array(
  552. 'out_before_time' => date('Y-m-d H:i:s', strtotime(" + 15 minutes")),
  553. 'pay_time' => $this->now_str,
  554. 'pay_type' => 9, // 歐pa卡
  555. 'payed' => 1
  556. );
  557. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  558. // 產生回傳
  559. return $this->gen_return_msg($msg_id, true);
  560. }
  561. else if ($results['result_code'] == 12) // 歐pa卡, 餘額不足
  562. {
  563. // [msg] 12: 歐pa卡, 餘額不足
  564. $msg_id = 12;
  565. }
  566. else if ($results['result_code'] == 11) // 歐pa卡, 查無會員
  567. {
  568. // [msg] 9: 其它付款方式
  569. $msg_id = 9;
  570. }
  571. else
  572. {
  573. // [msg] 9: 其它付款方式
  574. $msg_id = 9;
  575. }
  576. }
  577. else
  578. {
  579. // [msg] 9: 其它付款方式
  580. $msg_id = 9;
  581. }
  582. // 字幕
  583. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  584. // 產生回傳
  585. return $this->gen_return_msg($msg_id);
  586. }
  587. else
  588. {
  589. $data = array
  590. (
  591. 'out_time' => $this->now_str,
  592. 'out_lane' => $parms['ivsno'],
  593. 'minutes' => $co_time_minutes,
  594. 'out_pic_name' => $parms['pic_name']
  595. );
  596. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  597. trigger_error("{$parms['lpr']}|其它付款方式:" . print_r($rows_cario, true));
  598. // 傳送離場記錄
  599. $sync_agent = new AltobSyncAgent();
  600. $sync_agent->init($parms['sno'], $this->now_str);
  601. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  602. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  603. $sync_result = $sync_agent->sync_st_out($parms);
  604. trigger_error( "..sync_st_out.." . $sync_result);
  605. // [mitac] 要求 mitac 扣款 START
  606. $this->call_mitac_pay($parms['lpr'], $parms['ivsno'], $rows_cario);
  607. // [mitac] 要求 mitac 扣款 END
  608. // [宏奇系統] 離場車辨成功流程 START
  609. if($parms['sno'] == 40671 || $parms['sno'] == 40672 || $parms['sno'] == 40673)
  610. {
  611. $this->acarps($parms['lpr']);
  612. }
  613. // [宏奇系統] 離場車辨成功流程 END
  614. }
  615. return true;
  616. break;
  617. }
  618. }
  619. else if ($rows['member_no'] != 0)
  620. {
  621. // CO.Z.1 月租車無入場資料
  622. if($opendoor)
  623. {
  624. // [msg] 10: 月租車無入場資料
  625. $msg_id = 10;
  626. // 會員開門
  627. $this->member_opendoors($parms);
  628. // 會員字幕
  629. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  630. // 產生回傳
  631. return $this->gen_return_msg($msg_id, true);
  632. }
  633. else
  634. {
  635. trigger_error('月租車無入場資料:' . print_r($rows, true));
  636. // 傳送離場記錄
  637. $sync_agent = new AltobSyncAgent();
  638. $sync_agent->init($parms['sno'], $this->now_str);
  639. $sync_agent->member_no = $rows['member_no']; // 會員編號
  640. $sync_agent->finished = 1; // 已離場
  641. $sync_result = $sync_agent->sync_st_out($parms);
  642. trigger_error( "..sync_st_out.." . $sync_result);
  643. }
  644. return true;
  645. }
  646. else
  647. {
  648. // CO.Z.Z 無入場資料
  649. if($opendoor)
  650. {
  651. // [msg] 13: 無入場資料
  652. $msg_id = 13;
  653. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  654. // 產生回傳
  655. return $this->gen_return_msg($msg_id);
  656. }
  657. else
  658. {
  659. trigger_error('無入場資料:' . print_r($rows, true));
  660. // 傳送離場記錄
  661. $sync_agent = new AltobSyncAgent();
  662. $sync_agent->init($parms['sno'], $this->now_str);
  663. $sync_result = $sync_agent->sync_st_out($parms);
  664. trigger_error( "..sync_st_out.." . $sync_result);
  665. }
  666. return true;
  667. }
  668. break;
  669. }
  670. }
  671. // 檢查是否合法會員或VIP資料
  672. public function get_member($lpr,$sno)
  673. {
  674. $where_arr = array
  675. (
  676. 'c.lpr' => $lpr,
  677. 'c.start_time <=' => $this->now_str,
  678. 'c.end_time >=' => $this->now_str
  679. );
  680. $sql = "select
  681. c.lpr_correct,
  682. c.member_no,
  683. m.member_name,
  684. m.member_type,
  685. m.locked,
  686. m.remarks,
  687. m.park_time,
  688. m.suspended,
  689. m.valid_time,
  690. c.etag,
  691. c.start_time,
  692. c.end_time
  693. from member_car c, members m
  694. where c.member_no = m.member_no
  695. and c.start_time <= '{$this->now_str}'
  696. and c.end_time >= '{$this->now_str}'
  697. and c.lpr = '{$lpr}' ";
  698. if(!empty($sno) && $sno > 0)
  699. {
  700. $sql = "{$sql}and c.station_no = {$sno} ";
  701. }
  702. $sql = "{$sql}limit 1";
  703. $rows = $this->db->query($sql)->row_array();
  704. // 新增 park_time_check 2016/11/11
  705. $park_time_check = 0;
  706. if (!empty($rows['lpr_correct']))
  707. {
  708. $park_time = $rows['park_time'];
  709. $pt_arr = $this->vars['mcache']->get('pt');
  710. if(empty($pt_arr) || empty($park_time))
  711. {
  712. // ERROR: 無法驗証時段, 跳過時段限制判斷
  713. trigger_error("[ERROR] mcache.pt is empty !!");
  714. $park_time_check = 1;
  715. }
  716. else
  717. {
  718. $now_time = substr($this->now_str, 11); // 日期字串只取最後時間字串(13:25:32)
  719. $week_no = date('w',strtotime($this->now_str)); // 取星期幾
  720. $park_time_array = explode(',', $park_time); // 用 , 格開
  721. foreach($park_time_array as $idx => $park_time_value)
  722. {
  723. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  724. {
  725. if ($week_no >= $pt_rows['w_start'] &&
  726. $week_no <= $pt_rows['w_end'] &&
  727. $now_time >= $pt_rows['time_start'] &&
  728. $now_time <= $pt_rows['time_end'])
  729. {
  730. $park_time_check = 2;
  731. trigger_error("時段代碼:{$park_time_value} 星期:{$week_no}");
  732. break;
  733. }
  734. }
  735. }
  736. }
  737. }
  738. if (empty($rows['lpr_correct'])) // A. 非月租車
  739. {
  740. $rows = array
  741. (
  742. 'lpr_correct' => '',
  743. 'member_no' => 0,
  744. 'member_name' => '',
  745. 'member_type' => 9,
  746. 'etag' => '',
  747. 'start_time' => '',
  748. 'end_time' => '',
  749. );
  750. }
  751. else if(empty($park_time_check)) // B. 月租車, 時段無效
  752. {
  753. trigger_error("無效的時段!! " . print_r($rows, true));
  754. $rows = array
  755. (
  756. 'lpr_correct' => '',
  757. 'member_no' => 0,
  758. 'member_name' => '',
  759. 'member_type' => 9,
  760. 'etag' => '',
  761. 'start_time' => '',
  762. 'end_time' => '',
  763. );
  764. }
  765. else if(!empty($rows['suspended'])) // C. 月租車, 停權中
  766. {
  767. trigger_error("停權中!! " . print_r($rows, true));
  768. $rows = array
  769. (
  770. 'lpr_correct' => '',
  771. 'member_no' => 0,
  772. 'member_name' => '',
  773. 'member_type' => 9,
  774. 'etag' => '',
  775. 'start_time' => '',
  776. 'end_time' => '',
  777. );
  778. }
  779. else if(!empty($rows['valid_time']) && $rows['valid_time'] < $this->now_str) // D. 月租車, 已無效 (審核未通過)
  780. {
  781. trigger_error("已無效!! " . print_r($rows, true));
  782. $rows = array
  783. (
  784. 'lpr_correct' => '',
  785. 'member_no' => 0,
  786. 'member_name' => '',
  787. 'member_type' => 9,
  788. 'etag' => '',
  789. 'start_time' => '',
  790. 'end_time' => '',
  791. );
  792. }
  793. trigger_error('讀取會員:' . print_r($rows, true) . ", park_time_check: {$park_time_check}");
  794. /*
  795. // 20171025 強制先不導入會員
  796. $rows = array
  797. (
  798. 'lpr_correct' => '',
  799. 'member_no' => 0,
  800. 'member_name' => '',
  801. 'member_type' => 9,
  802. 'etag' => '',
  803. 'start_time' => '',
  804. 'end_time' => '',
  805. );
  806. trigger_error(__FUNCTION__ . '..force not found..');
  807. */
  808. return $rows;
  809. }
  810. /*
  811. // 開門 (月租)
  812. public function member_opendoors($parms)
  813. {
  814. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  815. return true;
  816. }
  817. // 開門 (臨停)
  818. public function temp_opendoors($parms)
  819. {
  820. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  821. return true;
  822. }
  823. */
  824. // 用eTag讀出車號
  825. public function etag2lpr_2($etag)
  826. {
  827. // 用讀取eTag記錄(有double驗證過)
  828. $rows = $this->db->select('lpr')
  829. ->from('etag_lpr')
  830. ->where(array('etag' => $etag, 'confirms >' => 0))
  831. ->limit(1)
  832. ->get()
  833. ->row_array();
  834. // 讀出eTag資料
  835. if (!empty($rows['lpr']))
  836. {
  837. trigger_error("+++車牌NONE,以eTag讀入車牌:{$etag}|{$rows['lpr']}");
  838. return $rows['lpr'];
  839. }
  840. return 'NONE';
  841. }
  842. // 有車牌與eTag, 檢查資料庫 (2017/03/22 new)
  843. public function check_lpr_etag($lpr, $etag)
  844. {
  845. $ETAG_LOG_TITLE = 'etag://';
  846. $ETAG_WARMIN_TITLE = 'etag-warning://';
  847. trigger_error($ETAG_LOG_TITLE. "輸入: {$lpr},{$etag}");
  848. // 手動值上下限
  849. $max_admin_confirms_value = 99;
  850. $min_admin_confirms_value = 50;
  851. // 自動值上下限
  852. $max_system_confirms_value = 33;
  853. $min_system_confirms_value = 0;
  854. // 判斷對應加權
  855. $etag_confirms_bias_plus = 11; // etag 找 車牌, 對上一次可扺 11次
  856. $etag_confirms_bias_minus = -1;
  857. $lpr_confirms_bias_plus = 3; // 車牌 找 etag, 對上一次可扺 3次
  858. $lpr_confirms_bias_minus = -1;
  859. // eTag 找 車牌
  860. $lpr_info_from_etag = $this->db->select('lpr, confirms')
  861. ->from('etag_lpr')
  862. ->where(array('etag' => $etag))
  863. ->limit(1)
  864. ->get()
  865. ->row_array();
  866. if (!empty($lpr_info_from_etag['lpr']))
  867. {
  868. // B. etag 有找到 車牌
  869. if ($lpr_info_from_etag['lpr'] == $lpr)
  870. {
  871. // B.1. etag 有找到 車牌, 且 車牌 相符, confirms 上升
  872. $confirms_bias = $etag_confirms_bias_plus;
  873. }
  874. else
  875. {
  876. // B.2. etag 有找到 車牌, 但 車牌 不符, confirms 下降
  877. $confirms_bias = $etag_confirms_bias_minus;
  878. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | lpr error : {$lpr},{$etag} | query:" . print_r($lpr_info_from_etag, true));
  879. }
  880. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  881. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  882. // 更新 confirms 資訊
  883. if($next_confirms_value > $max_admin_confirms_value)
  884. {
  885. // B.3.0 confirms 超過 max_admin_confirms_value, skip
  886. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  887. }
  888. else if ($next_confirms_value >= $min_admin_confirms_value)
  889. {
  890. // B.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  891. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  892. }
  893. else if ($next_confirms_value > $max_system_confirms_value)
  894. {
  895. // B.3.2 confirms 超過 max_system_confirms_value, skip
  896. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  897. }
  898. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  899. {
  900. // B.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  901. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  902. }
  903. else
  904. {
  905. // B.3.4 若低於 min_system_confirms_value,刪除
  906. $this->db->delete('etag_lpr', array('etag' => $etag));
  907. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  908. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  909. }
  910. }
  911. else
  912. {
  913. // 車牌 找 etag
  914. $etag_info_form_lpr = $this->db->select('etag, confirms, member_no')
  915. ->from('etag_lpr')
  916. ->where(array('lpr' => $lpr))
  917. ->limit(1)
  918. ->get()
  919. ->row_array();
  920. if (!empty($etag_info_form_lpr['etag']))
  921. {
  922. // A. 車牌 有找到 etag
  923. if ($etag_info_form_lpr['etag'] == $etag)
  924. {
  925. // A.1. 車牌 有找到 etag, 且 etag 相符, confirms 上升
  926. $confirms_bias = $lpr_confirms_bias_plus;
  927. // 若尚未登記為會員
  928. if(empty($etag_info_form_lpr['member_no']))
  929. {
  930. // 檢查是否會員
  931. $member_info_from_lpr = $this->db->select('member_no, member_name')
  932. ->from('members')
  933. ->where(array('lpr' => $lpr))
  934. ->limit(1)
  935. ->get()
  936. ->row_array();
  937. // 確認為會員, 建立 eTag 資訊
  938. if (!empty($member_info_from_lpr['member_no']))
  939. {
  940. $data['member_no'] = $member_info_from_lpr['member_no'];
  941. $data['member_name'] = $member_info_from_lpr['member_name'];
  942. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  943. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  944. // 更新 etag_lpr
  945. $this->db->where('etag', $etag)->update('etag_lpr', $data);
  946. }
  947. }
  948. }
  949. else
  950. {
  951. // A.2. 車牌 有找到 etag, 但 etag 不符, confirms 下降
  952. $confirms_bias = $lpr_confirms_bias_minus;
  953. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | etag error : {$lpr},{$etag} | query:" . print_r($etag_info_form_lpr, true));
  954. }
  955. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  956. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  957. // 更新 confirms 資訊
  958. if($next_confirms_value > $max_admin_confirms_value)
  959. {
  960. // A.3.0 confirms 超過 max_admin_confirms_value, skip
  961. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  962. }
  963. else if ($next_confirms_value >= $min_admin_confirms_value)
  964. {
  965. // A.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  966. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  967. }
  968. else if ($next_confirms_value > $max_system_confirms_value)
  969. {
  970. // A.3.2 confirms 超過 max_system_confirms_value, skip
  971. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  972. }
  973. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  974. {
  975. // A.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  976. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  977. }
  978. else
  979. {
  980. // A.3.4 若低於 min_system_confirms_value,刪除
  981. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  982. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  983. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  984. }
  985. }
  986. else
  987. {
  988. // C. 車牌 與 etag 都找不到記錄
  989. $data = array
  990. (
  991. 'lpr' => $lpr,
  992. 'lpr_correct' => $lpr,
  993. 'etag' => $etag
  994. );
  995. // 檢查是否會員
  996. $member_info_from_lpr = $this->db->select('member_no, member_name')
  997. ->from('members')
  998. ->where(array('lpr' => $lpr))
  999. ->limit(1)
  1000. ->get()
  1001. ->row_array();
  1002. // 會員者, 將eTag update回去
  1003. if (!empty($member_info_from_lpr['member_no']))
  1004. {
  1005. $data['member_no'] = $member_info_from_lpr['member_no'];
  1006. $data['member_name'] = $member_info_from_lpr['member_name'];
  1007. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  1008. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  1009. }
  1010. // 建立第一筆記錄
  1011. $this->db->insert('etag_lpr', $data);
  1012. $etag_lpr_seqno = $this->db->insert_id();
  1013. trigger_error($ETAG_LOG_TITLE . "create | insert seqno = {$etag_lpr_seqno}". print_r($data, true));
  1014. }
  1015. }
  1016. }
  1017. /*
  1018. // 有車牌與eTag, 檢查資料庫
  1019. public function check_lpr_etag($lpr, $etag)
  1020. {
  1021. // 用讀取eTag記錄(有double驗證過)
  1022. $rows = $this->db->select('etag, confirms')
  1023. ->from('etag_lpr')
  1024. ->where(array('lpr' => $lpr))
  1025. ->limit(1)
  1026. ->get()
  1027. ->row_array();
  1028. // 讀出eTag資料
  1029. if (!empty($rows['etag']))
  1030. {
  1031. // 車牌與eTag皆相符, 檢查是否confirms欄位若為0, 設成1(double驗證)
  1032. if ($rows['etag'] == $etag)
  1033. {
  1034. if ($rows['confirms'] == 0) $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 1));
  1035. }
  1036. else // eTag不相符
  1037. {
  1038. if ($rows['confirms'] == 1)
  1039. {
  1040. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 0));
  1041. }
  1042. else // 原confirms為0者, 刪除之
  1043. {
  1044. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  1045. }
  1046. }
  1047. }
  1048. else // 無資料, 新增一筆
  1049. {
  1050. // 再檢查一次是否有eTag ?
  1051. $rows_etag = $this->db->select('lpr, confirms')
  1052. ->from('etag_lpr')
  1053. ->where(array('etag' => $etag))
  1054. ->limit(1)
  1055. ->get()
  1056. ->row_array();
  1057. if (empty($rows_etag['lpr'])) // 無資料
  1058. {
  1059. $data = array
  1060. (
  1061. 'lpr' => $lpr,
  1062. 'lpr_correct' => $lpr,
  1063. 'etag' => $etag
  1064. );
  1065. // 檢查是否會員
  1066. $rows_members = $this->db->select('member_no, member_name')
  1067. ->from('members')
  1068. ->where(array('lpr' => $lpr))
  1069. ->limit(1)
  1070. ->get()
  1071. ->row_array();
  1072. // 會員者, 將eTag update回去
  1073. if (!empty($rows_members['member_no']))
  1074. {
  1075. $data['member_no'] = $rows_members['member_no'];
  1076. $data['member_name'] = $rows_members['member_name'];
  1077. $this->db->where('member_no', $rows_members['member_no'])->update('member_car', array('etag' => $etag));
  1078. $this->db->where('member_no', $rows_members['member_no'])->update('members', array('etag' => $etag));
  1079. }
  1080. $this->db->insert('etag_lpr', $data);
  1081. }
  1082. else
  1083. {
  1084. if ($rows_etag['confirms'] == 1)
  1085. {
  1086. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => 0));
  1087. }
  1088. else // 原confirms為0者, 刪除之
  1089. {
  1090. $this->db->delete('etag_lpr', array('etag' => $etag));
  1091. }
  1092. }
  1093. }
  1094. }
  1095. */
  1096. // 送出至message queue(目前用mqtt)
  1097. public function mq_send($topic, $msg)
  1098. {
  1099. $this->vars['mqtt']->publish($topic, $msg, 0);
  1100. trigger_error("mqtt:{$topic}|{$msg}");
  1101. usleep(100000); // delay 0.1 sec (避免漏訊號)
  1102. }
  1103. // 產生 CK
  1104. public function gen_opendoor_ck($parms, $function_name)
  1105. {
  1106. return md5($parms['ivsno']. 'alt' . date('dmh') . 'o' . $parms['lpr'] . 'b' . $function_name);
  1107. }
  1108. // 開門 (月租)
  1109. public function member_opendoors($parms)
  1110. {
  1111. //$this->mq_send_opendoor(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  1112. $ck = $this->gen_opendoor_ck($parms, __FUNCTION__);
  1113. get_headers("http://localhost/cars.html/" . __FUNCTION__ . "/{$parms['ivsno']}/{$parms['lpr']}/{$ck}");
  1114. return true;
  1115. }
  1116. // 開門 (臨停)
  1117. public function temp_opendoors($parms)
  1118. {
  1119. //$this->mq_send_opendoor(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  1120. $ck = $this->gen_opendoor_ck($parms, __FUNCTION__);
  1121. get_headers("http://localhost/cars.html/" . __FUNCTION__ ."/{$parms['ivsno']}/{$parms['lpr']}/{$ck}");
  1122. return true;
  1123. }
  1124. // 開門 (月租)
  1125. public function do_member_opendoor($parms)
  1126. {
  1127. if($parms['ck'] != $this->gen_opendoor_ck($parms, 'member_opendoors'))
  1128. {
  1129. return 'ck_error'; // 中斷
  1130. }
  1131. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  1132. return 'ok';
  1133. }
  1134. // 開門 (臨停)
  1135. public function do_temp_opendoor($parms)
  1136. {
  1137. if($parms['ck'] != $this->gen_opendoor_ck($parms, 'temp_opendoors'))
  1138. {
  1139. return 'ck_error'; // 中斷
  1140. }
  1141. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  1142. return 'ok';
  1143. }
  1144. // 指派車位
  1145. // http://203.75.167.89/parkingquery.html/get_valid_seat
  1146. // 註記現在時間, 並保留10分鐘
  1147. public function get_valid_seat()
  1148. {
  1149. $data = array();
  1150. //$data['result']['location_no'] = '0';
  1151. //$data['result_code'] = 'FAIL';
  1152. //return $data;
  1153. // 撈 roger db
  1154. /*
  1155. $sql = "
  1156. SELECT ParkingNum AS pksno FROM table_carpark
  1157. WHERE LPR = '' AND DisableSeat = 0 AND
  1158. (SELECT COUNT(*) FROM table_carpark WHERE LPR = '' AND DisableSeat = 0) <= 10
  1159. ORDER BY RAND() LIMIT 1 FOR UPDATE;
  1160. ";
  1161. $dsn_old_db = $this->load->database('old_db', true);
  1162. // 2016/12/14 roger_db 掛了的可能
  1163. if ($dsn_old_db->initialize())
  1164. {
  1165. $retults = $dsn_old_db->query($sql)->result_array();
  1166. }
  1167. if(!empty($retults[0]))
  1168. {
  1169. $data['result']['location_no'] = substr($retults[0]['pksno'], 1);
  1170. $data['result_code'] = 'OK';
  1171. $data['loc_name'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1172. $data['floors'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1173. }
  1174. else
  1175. {
  1176. $data['result']['location_no'] = '0';
  1177. $data['result_code'] = 'FAIL';
  1178. }
  1179. */
  1180. $this->db->trans_start();
  1181. $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;";
  1182. $rows = $this->db->query($sql)->row_array();
  1183. if (!empty($rows['pksno']))
  1184. {
  1185. $data['result']['location_no'] = substr($rows['pksno'], -3);
  1186. $data['result_code'] = 'OK';
  1187. $sql = "update pks set book_time = addtime(now(), '00:10:00') where pksno = {$rows['pksno']};";
  1188. $this->db->query($sql);
  1189. $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";
  1190. $rows = $this->db->query($sql)->row_array();
  1191. $data['loc_name'] = $rows['group_name'];
  1192. $data['floors'] = $rows['floors'];
  1193. }
  1194. else
  1195. {
  1196. $data['result']['location_no'] = '0';
  1197. $data['result_code'] = 'FAIL';
  1198. }
  1199. $this->db->trans_complete();
  1200. return $data;
  1201. }
  1202. // 取得出入口 888 資訊
  1203. public function get_888_info($parms)
  1204. {
  1205. $data = array();
  1206. $sql = "select availables as availables, tot as tot from pks_groups where group_id = 'C888' and station_no = {$parms['sno']}";
  1207. $rows = $this->db->query($sql)->row_array();
  1208. if (!empty($rows) && array_key_exists('availables', $rows))
  1209. {
  1210. $data['result_code'] = 'OK';
  1211. $data['availables'] = $rows['availables'];
  1212. $data['tot'] = $rows['tot'];
  1213. }
  1214. else
  1215. {
  1216. trigger_error(__FUNCTION__ . "..not found..".print_r($parms, true));
  1217. $data['result_code'] = 'FAIL';
  1218. $data['availables'] = 9999; // 如果拿不到就忽略這個流程
  1219. $data['tot'] = 0;
  1220. }
  1221. return $data;
  1222. }
  1223. // ===============================================
  1224. // acer cmd
  1225. // ===============================================
  1226. // 產生通行碼
  1227. function gen_pass_code()
  1228. {
  1229. return rand(100000,999999);
  1230. }
  1231. // 呼叫acer
  1232. function call_acer($cmd, $parms)
  1233. {
  1234. return false; // 尚未啟用
  1235. try{
  1236. $ch = curl_init();
  1237. curl_setopt($ch, CURLOPT_URL, 'http://localhost/acer_service.html/cmd_'. $cmd);
  1238. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  1239. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1240. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  1241. curl_setopt($ch, CURLOPT_POST, TRUE);
  1242. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,3);
  1243. curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
  1244. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parms));
  1245. $data = curl_exec($ch);
  1246. if(curl_errno($ch))
  1247. {
  1248. trigger_error(__FUNCTION__ . ', curl error: '. curl_error($ch));
  1249. }
  1250. curl_close($ch);
  1251. trigger_error(__FUNCTION__ . '..'. $data);
  1252. }catch (Exception $e){
  1253. trigger_error(__FUNCTION__ . 'error:'.$e->getMessage());
  1254. }
  1255. }
  1256. // ===============================================
  1257. // mitac cmd
  1258. // ===============================================
  1259. // 檢查指定時間是否介於停車時段區間
  1260. function check_park_time($park_time, $target_time)
  1261. {
  1262. $pt_arr = $this->vars['mcache']->get('pt');
  1263. $now_time = substr($target_time, 11); // 日期字串只取最後時間字串(13:25:32)
  1264. $week_no = date('w',strtotime($target_time)); // 取星期幾
  1265. $park_time_array = explode(',', $park_time); // 用 , 格開
  1266. foreach($park_time_array as $idx => $park_time_value)
  1267. {
  1268. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  1269. {
  1270. if ($week_no >= $pt_rows['w_start'] &&
  1271. $week_no <= $pt_rows['w_end'] &&
  1272. $now_time >= $pt_rows['time_start'] &&
  1273. $now_time <= $pt_rows['time_end'])
  1274. {
  1275. return true;
  1276. }
  1277. }
  1278. }
  1279. return false;
  1280. }
  1281. // 取得會員時段區間起點
  1282. function gen_park_time_first($park_time, $target_time)
  1283. {
  1284. $pt_arr = $this->vars['mcache']->get('pt');
  1285. $now_time = substr($target_time, 11); // 日期字串只取最後時間字串(13:25:32)
  1286. $week_no = date('w',strtotime($target_time)); // 取星期幾
  1287. $park_time_array = explode(',', $park_time); // 用 , 格開
  1288. $week_no_first = 0;
  1289. $time_end_first = '';
  1290. foreach($park_time_array as $idx => $park_time_value)
  1291. {
  1292. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  1293. {
  1294. if ($week_no >= $pt_rows['w_start'] &&
  1295. $week_no <= $pt_rows['w_end'] &&
  1296. $now_time >= $pt_rows['time_start'] &&
  1297. $now_time <= $pt_rows['time_end'])
  1298. {
  1299. $week_no_first = $pt_rows['w_start'];
  1300. $time_end_first = $pt_rows['time_start'];
  1301. trigger_error(__FUNCTION__ . "|$park_time, $target_time | $week_no_first, $time_end_first");
  1302. break;
  1303. }
  1304. }
  1305. }
  1306. $day_offset = $week_no - $week_no_first;
  1307. if($day_offset < 0)
  1308. {
  1309. trigger_error(__FUNCTION__ . '..error..offset..' . $day_offset);
  1310. $day_offset = 0;
  1311. }
  1312. return date('Y-m-d', strtotime("-$day_offset day", strtotime($target_time))). " $time_end_first";
  1313. }
  1314. // 取得會員時段區間終點
  1315. function gen_park_time_last($park_time, $target_time)
  1316. {
  1317. $pt_arr = $this->vars['mcache']->get('pt');
  1318. $now_time = substr($target_time, 11); // 日期字串只取最後時間字串(13:25:32)
  1319. $week_no = date('w',strtotime($target_time)); // 取星期幾
  1320. $park_time_array = explode(',', $park_time); // 用 , 格開
  1321. $week_no_last = 0;
  1322. $time_end_last = '';
  1323. foreach($park_time_array as $idx => $park_time_value)
  1324. {
  1325. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  1326. {
  1327. if ($week_no >= $pt_rows['w_start'] &&
  1328. $week_no <= $pt_rows['w_end'] &&
  1329. $now_time >= $pt_rows['time_start'] &&
  1330. $now_time <= $pt_rows['time_end'])
  1331. {
  1332. $week_no_last = $pt_rows['w_end'];
  1333. $time_end_last = $pt_rows['time_end'];
  1334. trigger_error(__FUNCTION__ . "|$park_time, $target_time | $week_no_last, $time_end_last");
  1335. break;
  1336. }
  1337. }
  1338. }
  1339. $day_offset = $week_no_last - $week_no;
  1340. if($day_offset < 0)
  1341. {
  1342. trigger_error(__FUNCTION__ . '..error..offset..' . $day_offset);
  1343. $day_offset = 0;
  1344. }
  1345. return date('Y-m-d', strtotime("+$day_offset day", strtotime($target_time))). " $time_end_last";
  1346. }
  1347. // 取得會員身份減免後的費用起算時間
  1348. function check_member_state($lpr, $in_time, $out_time)
  1349. {
  1350. // 檢查月租身份修正
  1351. $member_info = $this->get_member($lpr, false);
  1352. if ($member_info['member_no'] == 0)
  1353. {
  1354. // 查無會員身份
  1355. $member_state = 0;
  1356. $new_in_time = $in_time;
  1357. $new_out_time = $out_time;
  1358. }
  1359. else
  1360. {
  1361. $park_time = $member_info['park_time'];
  1362. $pt_arr = $this->vars['mcache']->get('pt');
  1363. if(empty($pt_arr) || empty($park_time))
  1364. {
  1365. // ERROR: 無法驗証時段, 跳過時段限制判斷
  1366. $member_state = 1;
  1367. $new_in_time = $in_time;
  1368. $new_out_time = $out_time;
  1369. }
  1370. else
  1371. {
  1372. $in_time_in_park_time = $this->check_park_time($park_time, $in_time);
  1373. $out_time_in_park_time = $this->check_park_time($park_time, $out_time);
  1374. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|..check_park_time: {$in_time_in_park_time}, {$out_time_in_park_time}..");
  1375. if($in_time_in_park_time && $out_time_in_park_time)
  1376. {
  1377. // 進出時間都在會員區間內: 費用起算時間改為出場時間
  1378. $member_state = 2;
  1379. $new_in_time = $out_time;
  1380. $new_out_time = $out_time;
  1381. }
  1382. else if($in_time_in_park_time)
  1383. {
  1384. // 入場時間在會員區間內: 費用起算時間改為, 會員時段區間終點
  1385. $member_state = 3;
  1386. $new_in_time = $this->gen_park_time_last($park_time, $in_time);
  1387. $new_out_time = $out_time;
  1388. if(strtotime($new_in_time) > strtotime($out_time))
  1389. {
  1390. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|new_in_time error >> out_time..");
  1391. $new_in_time = $out_time;
  1392. }
  1393. }
  1394. else if($out_time_in_park_time)
  1395. {
  1396. // 出場時間在會員區間內: 費用起算時間改為, 會員時段區間起點
  1397. $member_state = 4;
  1398. $new_in_time = $in_time;
  1399. $new_out_time = $this->gen_park_time_first($park_time, $out_time);
  1400. if(strtotime($in_time) > strtotime($new_out_time))
  1401. {
  1402. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|new_in_time error >> out_time..");
  1403. $new_out_time = $out_time;
  1404. }
  1405. }
  1406. }
  1407. }
  1408. $member_result = array('state' => $member_state, 'in_time' => $new_in_time, 'out_time' => $new_out_time);
  1409. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|..". print_r($member_result, true));
  1410. return $member_result;
  1411. }
  1412. // 要求 mitac 扣款
  1413. function call_mitac_pay($lpr, $ivsno, $rows_cario)
  1414. {
  1415. $function_name = 'parking_fee_altob';
  1416. $seqno = $rows_cario['cario_no'];
  1417. $in_time = $rows_cario['out_before_time'];
  1418. $out_time = $this->now_str;
  1419. $gate_id = 1; // 20171124 改為強制 1//$ivsno;
  1420. // 確認會員身份
  1421. $member_result = $this->check_member_state($lpr, $in_time, $out_time);
  1422. switch($member_result['state'])
  1423. {
  1424. case 0:
  1425. trigger_error(__FUNCTION__ . '|非會員|');
  1426. break;
  1427. case 1:
  1428. trigger_error(__FUNCTION__ . '|無法驗証時段|skip MITAC|'. print_r($member_result, true));
  1429. return false; // 跳過 mitac
  1430. break;
  1431. case 2:
  1432. trigger_error(__FUNCTION__ . '|進出時間都在會員區間內|skip MITAC|'. print_r($member_result, true));
  1433. return false; // 跳過 mitac
  1434. break;
  1435. case 3:
  1436. trigger_error(__FUNCTION__ . '|入場時間在會員區間內|'. print_r($member_result, true));
  1437. $in_time = $member_result['in_time'];
  1438. break;
  1439. case 4:
  1440. trigger_error(__FUNCTION__ . '|出場時間在會員區間內|'. print_r($member_result, true));
  1441. $out_time = $member_result['out_time'];
  1442. break;
  1443. default:
  1444. trigger_error(__FUNCTION__ . '|未定義|'. print_r($member_result, true));
  1445. break;
  1446. }
  1447. // 通訊內容
  1448. $parms = array(
  1449. 'seqno' => $seqno,
  1450. 'lpr' => $lpr,
  1451. 'in_time' => $in_time,
  1452. 'out_time' => $out_time,
  1453. 'gate_id' => $gate_id);
  1454. // 超過一天就擋掉
  1455. if(strtotime($parms['out_time']) - strtotime($parms['in_time']) > 86400)
  1456. {
  1457. trigger_error(__FUNCTION__ . '|超過計費時限|skip MITAC|'. print_r($parms, true));
  1458. return false; // 跳過 mitac
  1459. }
  1460. // 驗証碼
  1461. $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);
  1462. // 呼叫
  1463. try{
  1464. $ch = curl_init();
  1465. curl_setopt($ch, CURLOPT_URL, "http://localhost/mitac_service.html/{$function_name}");
  1466. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  1467. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1468. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  1469. curl_setopt($ch, CURLOPT_POST, TRUE);
  1470. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,3);
  1471. curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
  1472. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parms));
  1473. $data = curl_exec($ch);
  1474. if(curl_errno($ch))
  1475. {
  1476. trigger_error(__FUNCTION__ . ', curl error: '. curl_error($ch));
  1477. }
  1478. curl_close($ch);
  1479. trigger_error(__FUNCTION__ . '..'. $data);
  1480. }catch (Exception $e){
  1481. trigger_error(__FUNCTION__ . 'error:'.$e->getMessage());
  1482. }
  1483. }
  1484. public function acarps($lpr) //出場車辨 送 API 至宏奇
  1485. {
  1486. $this->load->model('api/Master_db_model','master_db');
  1487. $sel_cario=$this->master_db->sel_cario($lpr);
  1488. if(count($sel_cario)>0)
  1489. {
  1490. $cario_no=$sel_cario[0]['cario_no']; //入場流水號
  1491. $station_no=$sel_cario[0]['station_no']; //場站代碼
  1492. $member_no=$sel_cario[0]['member_no']; //會員代碼
  1493. $obj_id=$sel_cario[0]['obj_id']; //會員代碼
  1494. $in_out=$sel_cario[0]['in_out'];
  1495. $in_time=$sel_cario[0]['in_time']; //入場時間
  1496. $Get_billing_fee= "http://altapi.altob.com.tw/fee_api/Get_billing_fee"; //檢查現場入場時間
  1497. $start_time=$in_time;
  1498. $end_time=date('Y-m-d H:i:s');
  1499. $ch0 = curl_init();
  1500. curl_setopt($ch0, CURLOPT_HEADER, 0);
  1501. curl_setopt($ch0, CURLOPT_RETURNTRANSFER, 1);
  1502. curl_setopt($ch0, CURLOPT_URL, $Get_billing_fee);
  1503. curl_setopt($ch0, CURLOPT_POST, true);
  1504. curl_setopt($ch0, CURLOPT_POSTFIELDS, http_build_query(array("station_no"=>$station_no, "start_time"=>$start_time, "end_time"=>$end_time)));
  1505. $totalfee0 = curl_exec($ch0);
  1506. curl_close($ch0);
  1507. $totalfee=isset($totalfee0) ? $totalfee0:0 ;
  1508. //注意ip有轉port需確認SELINUX要=disabled,位於/etc/selinux/config
  1509. $acarps_ip="192.168.10.82";
  1510. $acarps_port="8081";
  1511. $apijson= "http://".$acarps_ip.":".$acarps_port."/lprpayout"; //送宏奇API
  1512. //print_r($apijson);exit;
  1513. $i=1;
  1514. $jsonarray=array("lpr"=>$obj_id, "start_time"=>$start_time, "end_time"=>$end_time, "totalfee"=>$totalfee);
  1515. $json=json_encode($jsonarray,true);
  1516. trigger_error("sendurl:".$apijson);
  1517. trigger_error( "sendacarps:".$json);
  1518. while(true){
  1519. try{
  1520. $ch = curl_init();
  1521. curl_setopt($ch, CURLOPT_URL, $apijson);
  1522. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1523. curl_setopt($ch, CURLOPT_POST, TRUE);
  1524. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,5);
  1525. curl_setopt($ch, CURLOPT_TIMEOUT, 5); //timeout in seconds
  1526. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array("data"=>$json)));
  1527. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
  1528. $result = curl_exec($ch);
  1529. trigger_error(curl_error($ch));
  1530. curl_close($ch);
  1531. if($result != false)
  1532. {
  1533. if($result=="OK")
  1534. {
  1535. trigger_error( "sendacarps:ok");
  1536. break;
  1537. }
  1538. }
  1539. else{trigger_error( "sendacarps_error");}
  1540. if($i==4)
  1541. break;
  1542. }catch (Exception $e)
  1543. {
  1544. trigger_error( "sendacarps_try_error".$e);
  1545. break;
  1546. }
  1547. $i++;
  1548. }
  1549. }
  1550. }
  1551. public function save_setting($data){
  1552. $myfile = fopen("/home/data/alt_acarps_log.json", "a+") or die("Unable to open file!");
  1553. fwrite($myfile, $data);
  1554. fclose($myfile);
  1555. }
  1556. }