VM暫存
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

Cars_model.php 59KB

8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
7 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
8 anos atrás
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, false);
  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. }