VM暫存
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

8 роки тому
8 роки тому
8 роки тому
8 роки тому
8 роки тому
8 роки тому
7 роки тому
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 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
8 роки тому
7 роки тому
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 роки тому
7 роки тому
7 роки тому
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 роки тому
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 роки тому
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670
  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']);
  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']);
  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. if ($rows['member_no'] == 0)
  260. {
  261. $ck = md5($parms['lpr']);
  262. $jdata = file_get_contents("http://localhost/allpa_service.html/get_allpa_valid_user/{$parms['lpr']}/{$ck}");
  263. $results = json_decode($jdata, true);
  264. if($results['result_code'] == 0)
  265. {
  266. // [msg] 3: 歐pa卡, 開門
  267. $msg_id = 3;
  268. // 會員開門
  269. $this->member_opendoors($parms);
  270. }
  271. else
  272. {
  273. // [msg] 11: 臨停車, 開門
  274. $msg_id = 11;
  275. // 臨停開門
  276. $this->temp_opendoors($parms);
  277. }
  278. }
  279. else
  280. {
  281. // [msg] 4: 會員, 開門
  282. $msg_id = 4;
  283. // 會員開門
  284. $this->member_opendoors($parms);
  285. }
  286. // 字幕
  287. $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);
  288. // 產生回傳
  289. return $this->gen_return_msg($msg_id, true);
  290. }
  291. else
  292. // 資料流
  293. {
  294. if ($parms['lpr'] != 'NONE')
  295. {
  296. $data = array
  297. (
  298. 'err' => 1,
  299. 'finished' => 1
  300. );
  301. // 原有歷史記錄, 設定錯誤碼為1(入場不應該有歷史記錄)
  302. $this->db->update('cario', $data, array('obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0, 'obj_type' => 1));
  303. $affect_rows = $this->db->affected_rows();
  304. if ($affect_rows > 0)
  305. {
  306. trigger_error("err://入場郤已有歷史進場記錄[{$affect_rows}]筆,已設成錯誤並結清記錄".print_r($parms, true));
  307. }
  308. }
  309. //20190113新增手動入場
  310. // 15分鐘內, 可直接離場 (刷進刷出需過卡修正)
  311. //if(isset($parms['free_time']) && $parms['free_time'] > 0)
  312. // $out_before_time_value = date('Y-m-d H:i:s', strtotime(" + {$parms['free_time']} minutes"));
  313. //else
  314. // $out_before_time_value = date("Y-m-d H:i:s");
  315. $data = array
  316. (
  317. 'station_no' => $parms['sno'],
  318. 'obj_type' => 1,
  319. 'obj_id' => $parms['lpr'],
  320. 'etag' => $parms['etag'] == 'NONE' ? '' : $parms['etag'],
  321. 'in_out' => $parms['io'],
  322. 'member_no' => $rows['member_no'],
  323. 'finished' => 0,
  324. 'in_time' => $this->now_str,
  325. 'in_lane' => $parms['ivsno'],
  326. 'in_pic_name' => empty($parms['pic_name']) ? '' : $parms['pic_name'],
  327. 'out_before_time' => $this->now_str,
  328. 'ticket_no' => $this->gen_pass_code()
  329. );
  330. $data['in_time'] = isset($parms['in_time']) ? $parms['in_time'] : $this->now_str;
  331. if(isset($parms['free_time']) && $parms['free_time'] > 0)
  332. {
  333. $data['out_before_time'] = date('Y-m-d H:i:s', strtotime(" + {$parms['free_time']} minutes",strtotime($parms['in_time'])));
  334. }
  335. else
  336. {
  337. $data['out_before_time'] = $data['in_time'];
  338. }
  339. $this->db->insert('cario', $data);
  340. trigger_error("新增入場資料:".print_r($parms, true));
  341. // 傳送進場記錄
  342. $sync_agent = new AltobSyncAgent();
  343. $sync_agent->init($parms['sno'], $this->now_str);
  344. $sync_agent->cario_no = $this->db->insert_id(); // 進出編號
  345. $sync_agent->member_no = $rows['member_no']; // 會員編號
  346. $sync_result = $sync_agent->sync_st_in($parms);
  347. trigger_error( "..sync_st_in.." . $sync_result);
  348. }
  349. return true;
  350. break;
  351. // 出場
  352. case 'CO':
  353. case 'MO':
  354. // 讀取最近一筆入場資料
  355. $rows_cario = $this->db
  356. ->select('cario_no, payed, in_time, pay_time, out_before_time')
  357. ->from('cario')
  358. //->where(array('in_out' => 'CI', 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0))
  359. ->where(array('obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0))
  360. ->order_by('cario_no', 'desc')
  361. ->limit(1)
  362. ->get()
  363. ->row_array();
  364. trigger_error("opendoor={$opendoor}| 出場讀到資料:{$rows['member_no']}|".time().'|'.print_r($rows_cario, true));
  365. if (!empty($rows_cario['cario_no'])) // 在限時內可出場
  366. {
  367. $co_time_minutes = floor((strtotime($this->now_str) - strtotime($rows_cario['in_time'])) / 60); // 停車時數 (分鐘)
  368. // 合規定者開門放行
  369. switch(true)
  370. {
  371. case $rows['member_no'] != 0:
  372. // CO.A.1 會員車
  373. // 判斷時段租是否超時 (超過 12 小時)
  374. if($rows['park_time'] != 'RE' && $co_time_minutes > 720)
  375. {
  376. if($opendoor)
  377. {
  378. // [msg] 16: 時段租超時字幕
  379. $msg_id = 16;
  380. // 字幕
  381. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  382. // 產生回傳
  383. return $this->gen_return_msg($msg_id);
  384. }
  385. else
  386. {
  387. $data = array
  388. (
  389. 'out_time' => $this->now_str,
  390. 'out_lane' => $parms['ivsno'],
  391. 'minutes' => $co_time_minutes,
  392. 'out_pic_name' => $parms['pic_name']
  393. );
  394. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  395. trigger_error("{$parms['lpr']}|時段租超時" . print_r($rows_cario, true));
  396. // 傳送離場記錄
  397. $sync_agent = new AltobSyncAgent();
  398. $sync_agent->init($parms['sno'], $this->now_str);
  399. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  400. $sync_agent->member_no = $rows['member_no']; // 會員編號
  401. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  402. $sync_result = $sync_agent->sync_st_out($parms);
  403. trigger_error( "..sync_st_out.." . $sync_result);
  404. }
  405. return true;
  406. }
  407. if($opendoor)
  408. {
  409. // [msg] 5: 會員離場開門
  410. $msg_id = 5;
  411. // 會員開門
  412. $this->member_opendoors($parms);
  413. // 字幕
  414. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  415. // 產生回傳
  416. return $this->gen_return_msg($msg_id, true);
  417. }
  418. else
  419. {
  420. $data = array
  421. (
  422. 'in_out' => $parms['io'],
  423. 'finished' => 1,
  424. 'out_time' => $this->now_str,
  425. 'out_lane' => $parms['ivsno'],
  426. 'minutes' => $co_time_minutes,
  427. 'out_pic_name' => $parms['pic_name']
  428. );
  429. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no']));
  430. trigger_error('會員車離場:' . print_r($rows, true));
  431. // 傳送離場記錄
  432. $sync_agent = new AltobSyncAgent();
  433. $sync_agent->init($parms['sno'], $this->now_str);
  434. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  435. $sync_agent->member_no = $rows['member_no']; // 會員編號
  436. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  437. $sync_agent->finished = 1; // 已離場
  438. $sync_result = $sync_agent->sync_st_out($parms);
  439. trigger_error( "..sync_st_out.." . $sync_result);
  440. }
  441. return true;
  442. break;
  443. case strtotime($rows_cario['out_before_time']) >= time():
  444. if ($rows_cario['payed'])
  445. {
  446. // CO.B.1 臨停車已付款
  447. if($opendoor)
  448. {
  449. // [msg] 6: 臨停車已付款
  450. $msg_id = 6;
  451. // 臨停開門
  452. $this->temp_opendoors($parms);
  453. // 字幕
  454. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  455. // 產生回傳
  456. return $this->gen_return_msg($msg_id, true);
  457. }
  458. else
  459. {
  460. $data = array
  461. (
  462. 'in_out' => $parms['io'],
  463. 'finished' => 1,
  464. 'out_time' => $this->now_str,
  465. 'out_lane' => $parms['ivsno'],
  466. 'minutes' => $co_time_minutes,
  467. 'out_pic_name' => $parms['pic_name']
  468. );
  469. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no']));
  470. trigger_error('臨停車已付款:' . print_r($rows, true));
  471. // 傳送離場記錄
  472. $sync_agent = new AltobSyncAgent();
  473. $sync_agent->init($parms['sno'], $this->now_str);
  474. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  475. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  476. $sync_agent->finished = 1; // 已離場
  477. $sync_result = $sync_agent->sync_st_out($parms);
  478. trigger_error( "..sync_st_out.." . $sync_result);
  479. }
  480. return true;
  481. }
  482. else
  483. {
  484. // CO.B.2 臨停車未付款
  485. if($opendoor)
  486. {
  487. // [msg] 8: 臨停車未付款
  488. $msg_id = 8;
  489. // 字幕
  490. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  491. // 產生回傳
  492. return $this->gen_return_msg($msg_id);
  493. }
  494. else
  495. {
  496. // TODO: 歐pa卡離場記錄和臨停未付款一樣, 待更正
  497. $data = array
  498. (
  499. 'out_time' => $this->now_str,
  500. 'out_lane' => $parms['ivsno'],
  501. 'minutes' => $co_time_minutes,
  502. 'out_pic_name' => $parms['pic_name']
  503. );
  504. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  505. trigger_error('臨停未付款:' . print_r($rows, true));
  506. // 傳送離場記錄
  507. $sync_agent = new AltobSyncAgent();
  508. $sync_agent->init($parms['sno'], $this->now_str);
  509. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  510. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  511. $sync_result = $sync_agent->sync_st_out($parms);
  512. trigger_error( "..sync_st_out.." . $sync_result);
  513. // [mitac] 要求 mitac 扣款 START
  514. $this->call_mitac_pay($parms['lpr'], $parms['ivsno'], $rows_cario);
  515. // [mitac] 要求 mitac 扣款 END
  516. }
  517. return true;
  518. }
  519. break;
  520. default:
  521. // CO.C.1 其它付款方式
  522. if($opendoor)
  523. {
  524. $in_time = strtotime($rows_cario['out_before_time']);
  525. $ck = md5($in_time. $parms['lpr'] . $parms['sno']);
  526. //$jdata = file_get_contents("http://localhost/allpa_service.html/allpa_go/{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  527. $jdata = file_get_contents("http://localhost/allpa_service.html/allpa_go_remote/{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  528. trigger_error("allpa回傳:{$jdata}|{$in_time}/{$parms['lpr']}/{$parms['sno']}/{$ck}");
  529. $results = json_decode($jdata, true);
  530. if (isset($results['result_code'])) // 歐pa卡, 點數足夠扣
  531. {
  532. if($results['result_code'] == 0)
  533. {
  534. // [msg] 7: 歐pa卡付款
  535. $msg_id = 7;
  536. // 臨停開門
  537. $this->temp_opendoors($parms);
  538. // 歐pa卡, 字幕
  539. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']},{$results['amt']}".MQ_ALTOB_MSG_END_TAG);
  540. $data = array(
  541. 'out_before_time' => date('Y-m-d H:i:s', strtotime(" + 15 minutes")),
  542. 'pay_time' => $this->now_str,
  543. 'pay_type' => 9, // 歐pa卡
  544. 'payed' => 1
  545. );
  546. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  547. // 產生回傳
  548. return $this->gen_return_msg($msg_id, true);
  549. }
  550. else if ($results['result_code'] == 12) // 歐pa卡, 餘額不足
  551. {
  552. // [msg] 12: 歐pa卡, 餘額不足
  553. $msg_id = 12;
  554. }
  555. else if ($results['result_code'] == 11) // 歐pa卡, 查無會員
  556. {
  557. // [msg] 9: 其它付款方式
  558. $msg_id = 9;
  559. }
  560. else
  561. {
  562. // [msg] 9: 其它付款方式
  563. $msg_id = 9;
  564. }
  565. }
  566. else
  567. {
  568. // [msg] 9: 其它付款方式
  569. $msg_id = 9;
  570. }
  571. // 字幕
  572. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  573. // 產生回傳
  574. return $this->gen_return_msg($msg_id);
  575. }
  576. else
  577. {
  578. $data = array
  579. (
  580. 'out_time' => $this->now_str,
  581. 'out_lane' => $parms['ivsno'],
  582. 'minutes' => $co_time_minutes,
  583. 'out_pic_name' => $parms['pic_name']
  584. );
  585. $this->db->update('cario', $data, array('cario_no' => $rows_cario['cario_no'])); // 記錄出場
  586. trigger_error("{$parms['lpr']}|其它付款方式:" . print_r($rows_cario, true));
  587. // 傳送離場記錄
  588. $sync_agent = new AltobSyncAgent();
  589. $sync_agent->init($parms['sno'], $this->now_str);
  590. $sync_agent->cario_no = $rows_cario['cario_no']; // 進出編號
  591. $sync_agent->in_time = $rows_cario['in_time']; // 入場時間
  592. $sync_result = $sync_agent->sync_st_out($parms);
  593. trigger_error( "..sync_st_out.." . $sync_result);
  594. // [mitac] 要求 mitac 扣款 START
  595. $this->call_mitac_pay($parms['lpr'], $parms['ivsno'], $rows_cario);
  596. // [mitac] 要求 mitac 扣款 END
  597. }
  598. return true;
  599. break;
  600. }
  601. }
  602. else if ($rows['member_no'] != 0)
  603. {
  604. // CO.Z.1 月租車無入場資料
  605. if($opendoor)
  606. {
  607. // [msg] 10: 月租車無入場資料
  608. $msg_id = 10;
  609. // 會員開門
  610. $this->member_opendoors($parms);
  611. // 會員字幕
  612. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  613. // 產生回傳
  614. return $this->gen_return_msg($msg_id, true);
  615. }
  616. else
  617. {
  618. trigger_error('月租車無入場資料:' . print_r($rows, true));
  619. // 傳送離場記錄
  620. $sync_agent = new AltobSyncAgent();
  621. $sync_agent->init($parms['sno'], $this->now_str);
  622. $sync_agent->member_no = $rows['member_no']; // 會員編號
  623. $sync_agent->finished = 1; // 已離場
  624. $sync_result = $sync_agent->sync_st_out($parms);
  625. trigger_error( "..sync_st_out.." . $sync_result);
  626. }
  627. return true;
  628. }
  629. else
  630. {
  631. // CO.Z.Z 無入場資料
  632. if($opendoor)
  633. {
  634. // [msg] 13: 無入場資料
  635. $msg_id = 13;
  636. $this->mq_send(MQ_TOPIC_ALTOB, MQ_ALTOB_MSG.",{$msg_id},{$parms['ivsno']},{$parms['lpr']}".MQ_ALTOB_MSG_END_TAG);
  637. // 產生回傳
  638. return $this->gen_return_msg($msg_id);
  639. }
  640. else
  641. {
  642. trigger_error('無入場資料:' . print_r($rows, true));
  643. // 傳送離場記錄
  644. $sync_agent = new AltobSyncAgent();
  645. $sync_agent->init($parms['sno'], $this->now_str);
  646. $sync_result = $sync_agent->sync_st_out($parms);
  647. trigger_error( "..sync_st_out.." . $sync_result);
  648. }
  649. return true;
  650. }
  651. break;
  652. }
  653. }
  654. // 檢查是否合法會員或VIP資料
  655. public function get_member($lpr)
  656. {
  657. $where_arr = array
  658. (
  659. 'c.lpr' => $lpr,
  660. 'c.start_time <=' => $this->now_str,
  661. 'c.end_time >=' => $this->now_str
  662. );
  663. $sql = "select
  664. c.lpr_correct,
  665. c.member_no,
  666. m.member_name,
  667. m.member_type,
  668. m.locked,
  669. m.remarks,
  670. m.park_time,
  671. m.suspended,
  672. m.valid_time,
  673. c.etag,
  674. c.start_time,
  675. c.end_time
  676. from member_car c, members m
  677. where c.member_no = m.member_no
  678. and c.start_time <= '{$this->now_str}'
  679. and c.end_time >= '{$this->now_str}'
  680. and c.lpr = '{$lpr}'
  681. limit 1";
  682. $rows = $this->db->query($sql)->row_array();
  683. // 新增 park_time_check 2016/11/11
  684. $park_time_check = 0;
  685. if (!empty($rows['lpr_correct']))
  686. {
  687. $park_time = $rows['park_time'];
  688. $pt_arr = $this->vars['mcache']->get('pt');
  689. if(empty($pt_arr) || empty($park_time))
  690. {
  691. // ERROR: 無法驗証時段, 跳過時段限制判斷
  692. trigger_error("[ERROR] mcache.pt is empty !!");
  693. $park_time_check = 1;
  694. }
  695. else
  696. {
  697. $now_time = substr($this->now_str, 11); // 日期字串只取最後時間字串(13:25:32)
  698. $week_no = date('w',strtotime($this->now_str)); // 取星期幾
  699. $park_time_array = explode(',', $park_time); // 用 , 格開
  700. foreach($park_time_array as $idx => $park_time_value)
  701. {
  702. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  703. {
  704. if ($week_no >= $pt_rows['w_start'] &&
  705. $week_no <= $pt_rows['w_end'] &&
  706. $now_time >= $pt_rows['time_start'] &&
  707. $now_time <= $pt_rows['time_end'])
  708. {
  709. $park_time_check = 2;
  710. trigger_error("時段代碼:{$park_time_value} 星期:{$week_no}");
  711. break;
  712. }
  713. }
  714. }
  715. }
  716. }
  717. if (empty($rows['lpr_correct'])) // A. 非月租車
  718. {
  719. $rows = array
  720. (
  721. 'lpr_correct' => '',
  722. 'member_no' => 0,
  723. 'member_name' => '',
  724. 'member_type' => 9,
  725. 'etag' => '',
  726. 'start_time' => '',
  727. 'end_time' => '',
  728. );
  729. }
  730. else if(empty($park_time_check)) // B. 月租車, 時段無效
  731. {
  732. trigger_error("無效的時段!! " . print_r($rows, true));
  733. $rows = array
  734. (
  735. 'lpr_correct' => '',
  736. 'member_no' => 0,
  737. 'member_name' => '',
  738. 'member_type' => 9,
  739. 'etag' => '',
  740. 'start_time' => '',
  741. 'end_time' => '',
  742. );
  743. }
  744. else if(!empty($rows['suspended'])) // C. 月租車, 停權中
  745. {
  746. trigger_error("停權中!! " . print_r($rows, true));
  747. $rows = array
  748. (
  749. 'lpr_correct' => '',
  750. 'member_no' => 0,
  751. 'member_name' => '',
  752. 'member_type' => 9,
  753. 'etag' => '',
  754. 'start_time' => '',
  755. 'end_time' => '',
  756. );
  757. }
  758. else if(!empty($rows['valid_time']) && $rows['valid_time'] < $this->now_str) // D. 月租車, 已無效 (審核未通過)
  759. {
  760. trigger_error("已無效!! " . print_r($rows, true));
  761. $rows = array
  762. (
  763. 'lpr_correct' => '',
  764. 'member_no' => 0,
  765. 'member_name' => '',
  766. 'member_type' => 9,
  767. 'etag' => '',
  768. 'start_time' => '',
  769. 'end_time' => '',
  770. );
  771. }
  772. trigger_error('讀取會員:' . print_r($rows, true) . ", park_time_check: {$park_time_check}");
  773. /*
  774. // 20171025 強制先不導入會員
  775. $rows = array
  776. (
  777. 'lpr_correct' => '',
  778. 'member_no' => 0,
  779. 'member_name' => '',
  780. 'member_type' => 9,
  781. 'etag' => '',
  782. 'start_time' => '',
  783. 'end_time' => '',
  784. );
  785. trigger_error(__FUNCTION__ . '..force not found..');
  786. */
  787. return $rows;
  788. }
  789. /*
  790. // 開門 (月租)
  791. public function member_opendoors($parms)
  792. {
  793. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  794. return true;
  795. }
  796. // 開門 (臨停)
  797. public function temp_opendoors($parms)
  798. {
  799. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  800. return true;
  801. }
  802. */
  803. // 用eTag讀出車號
  804. public function etag2lpr_2($etag)
  805. {
  806. // 用讀取eTag記錄(有double驗證過)
  807. $rows = $this->db->select('lpr')
  808. ->from('etag_lpr')
  809. ->where(array('etag' => $etag, 'confirms >' => 0))
  810. ->limit(1)
  811. ->get()
  812. ->row_array();
  813. // 讀出eTag資料
  814. if (!empty($rows['lpr']))
  815. {
  816. trigger_error("+++車牌NONE,以eTag讀入車牌:{$etag}|{$rows['lpr']}");
  817. return $rows['lpr'];
  818. }
  819. return 'NONE';
  820. }
  821. // 有車牌與eTag, 檢查資料庫 (2017/03/22 new)
  822. public function check_lpr_etag($lpr, $etag)
  823. {
  824. $ETAG_LOG_TITLE = 'etag://';
  825. $ETAG_WARMIN_TITLE = 'etag-warning://';
  826. trigger_error($ETAG_LOG_TITLE. "輸入: {$lpr},{$etag}");
  827. // 手動值上下限
  828. $max_admin_confirms_value = 99;
  829. $min_admin_confirms_value = 50;
  830. // 自動值上下限
  831. $max_system_confirms_value = 33;
  832. $min_system_confirms_value = 0;
  833. // 判斷對應加權
  834. $etag_confirms_bias_plus = 11; // etag 找 車牌, 對上一次可扺 11次
  835. $etag_confirms_bias_minus = -1;
  836. $lpr_confirms_bias_plus = 3; // 車牌 找 etag, 對上一次可扺 3次
  837. $lpr_confirms_bias_minus = -1;
  838. // eTag 找 車牌
  839. $lpr_info_from_etag = $this->db->select('lpr, confirms')
  840. ->from('etag_lpr')
  841. ->where(array('etag' => $etag))
  842. ->limit(1)
  843. ->get()
  844. ->row_array();
  845. if (!empty($lpr_info_from_etag['lpr']))
  846. {
  847. // B. etag 有找到 車牌
  848. if ($lpr_info_from_etag['lpr'] == $lpr)
  849. {
  850. // B.1. etag 有找到 車牌, 且 車牌 相符, confirms 上升
  851. $confirms_bias = $etag_confirms_bias_plus;
  852. }
  853. else
  854. {
  855. // B.2. etag 有找到 車牌, 但 車牌 不符, confirms 下降
  856. $confirms_bias = $etag_confirms_bias_minus;
  857. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | lpr error : {$lpr},{$etag} | query:" . print_r($lpr_info_from_etag, true));
  858. }
  859. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  860. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  861. // 更新 confirms 資訊
  862. if($next_confirms_value > $max_admin_confirms_value)
  863. {
  864. // B.3.0 confirms 超過 max_admin_confirms_value, skip
  865. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  866. }
  867. else if ($next_confirms_value >= $min_admin_confirms_value)
  868. {
  869. // B.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  870. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  871. }
  872. else if ($next_confirms_value > $max_system_confirms_value)
  873. {
  874. // B.3.2 confirms 超過 max_system_confirms_value, skip
  875. //trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  876. }
  877. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  878. {
  879. // B.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  880. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => $next_confirms_value));
  881. }
  882. else
  883. {
  884. // B.3.4 若低於 min_system_confirms_value,刪除
  885. $this->db->delete('etag_lpr', array('etag' => $etag));
  886. trigger_error($ETAG_LOG_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  887. trigger_error($ETAG_WARMIN_TITLE . "etag 找 lpr | etag confirms fail and removed : {$lpr_info_from_etag['lpr']}, {$etag}");
  888. }
  889. }
  890. else
  891. {
  892. // 車牌 找 etag
  893. $etag_info_form_lpr = $this->db->select('etag, confirms, member_no')
  894. ->from('etag_lpr')
  895. ->where(array('lpr' => $lpr))
  896. ->limit(1)
  897. ->get()
  898. ->row_array();
  899. if (!empty($etag_info_form_lpr['etag']))
  900. {
  901. // A. 車牌 有找到 etag
  902. if ($etag_info_form_lpr['etag'] == $etag)
  903. {
  904. // A.1. 車牌 有找到 etag, 且 etag 相符, confirms 上升
  905. $confirms_bias = $lpr_confirms_bias_plus;
  906. // 若尚未登記為會員
  907. if(empty($etag_info_form_lpr['member_no']))
  908. {
  909. // 檢查是否會員
  910. $member_info_from_lpr = $this->db->select('member_no, member_name')
  911. ->from('members')
  912. ->where(array('lpr' => $lpr))
  913. ->limit(1)
  914. ->get()
  915. ->row_array();
  916. // 確認為會員, 建立 eTag 資訊
  917. if (!empty($member_info_from_lpr['member_no']))
  918. {
  919. $data['member_no'] = $member_info_from_lpr['member_no'];
  920. $data['member_name'] = $member_info_from_lpr['member_name'];
  921. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  922. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  923. // 更新 etag_lpr
  924. $this->db->where('etag', $etag)->update('etag_lpr', $data);
  925. }
  926. }
  927. }
  928. else
  929. {
  930. // A.2. 車牌 有找到 etag, 但 etag 不符, confirms 下降
  931. $confirms_bias = $lpr_confirms_bias_minus;
  932. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | etag error : {$lpr},{$etag} | query:" . print_r($etag_info_form_lpr, true));
  933. }
  934. $next_confirms_value = $lpr_info_from_etag['confirms'] + $confirms_bias;
  935. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag}, next_confirms: {$next_confirms_value}, bias:{$confirms_bias}");
  936. // 更新 confirms 資訊
  937. if($next_confirms_value > $max_admin_confirms_value)
  938. {
  939. // A.3.0 confirms 超過 max_admin_confirms_value, skip
  940. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_admin_confirms_value : {$max_admin_confirms_value}");
  941. }
  942. else if ($next_confirms_value >= $min_admin_confirms_value)
  943. {
  944. // A.3.1 人工確認過的記錄, 誤判多次後會停留在 min_admin_confirms_value, 或加到 max_admin_confirms_value
  945. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  946. }
  947. else if ($next_confirms_value > $max_system_confirms_value)
  948. {
  949. // A.3.2 confirms 超過 max_system_confirms_value, skip
  950. //trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | {$lpr},{$etag} next_confirms_value > max_system_confirms_value : {$max_system_confirms_value}");
  951. }
  952. else if ($next_confirms_value <= $max_system_confirms_value && $next_confirms_value >= $min_system_confirms_value)
  953. {
  954. // A.3.3 confirms 不到 max_system_confirms_value 為系統生成記錄, 誤判多次後 confirms 會扣到 min_system_confirms_value
  955. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => $next_confirms_value));
  956. }
  957. else
  958. {
  959. // A.3.4 若低於 min_system_confirms_value,刪除
  960. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  961. trigger_error($ETAG_LOG_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  962. trigger_error($ETAG_WARMIN_TITLE . "lpr 找 etag | lpr confirms fail and removed : {$lpr}, {$etag_info_form_lpr['etag']}");
  963. }
  964. }
  965. else
  966. {
  967. // C. 車牌 與 etag 都找不到記錄
  968. $data = array
  969. (
  970. 'lpr' => $lpr,
  971. 'lpr_correct' => $lpr,
  972. 'etag' => $etag
  973. );
  974. // 檢查是否會員
  975. $member_info_from_lpr = $this->db->select('member_no, member_name')
  976. ->from('members')
  977. ->where(array('lpr' => $lpr))
  978. ->limit(1)
  979. ->get()
  980. ->row_array();
  981. // 會員者, 將eTag update回去
  982. if (!empty($member_info_from_lpr['member_no']))
  983. {
  984. $data['member_no'] = $member_info_from_lpr['member_no'];
  985. $data['member_name'] = $member_info_from_lpr['member_name'];
  986. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('member_car', array('etag' => $etag));
  987. $this->db->where('member_no', $member_info_from_lpr['member_no'])->update('members', array('etag' => $etag));
  988. }
  989. // 建立第一筆記錄
  990. $this->db->insert('etag_lpr', $data);
  991. $etag_lpr_seqno = $this->db->insert_id();
  992. trigger_error($ETAG_LOG_TITLE . "create | insert seqno = {$etag_lpr_seqno}". print_r($data, true));
  993. }
  994. }
  995. }
  996. /*
  997. // 有車牌與eTag, 檢查資料庫
  998. public function check_lpr_etag($lpr, $etag)
  999. {
  1000. // 用讀取eTag記錄(有double驗證過)
  1001. $rows = $this->db->select('etag, confirms')
  1002. ->from('etag_lpr')
  1003. ->where(array('lpr' => $lpr))
  1004. ->limit(1)
  1005. ->get()
  1006. ->row_array();
  1007. // 讀出eTag資料
  1008. if (!empty($rows['etag']))
  1009. {
  1010. // 車牌與eTag皆相符, 檢查是否confirms欄位若為0, 設成1(double驗證)
  1011. if ($rows['etag'] == $etag)
  1012. {
  1013. if ($rows['confirms'] == 0) $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 1));
  1014. }
  1015. else // eTag不相符
  1016. {
  1017. if ($rows['confirms'] == 1)
  1018. {
  1019. $this->db->where('lpr', $lpr)->update('etag_lpr', array('confirms' => 0));
  1020. }
  1021. else // 原confirms為0者, 刪除之
  1022. {
  1023. $this->db->delete('etag_lpr', array('lpr' => $lpr));
  1024. }
  1025. }
  1026. }
  1027. else // 無資料, 新增一筆
  1028. {
  1029. // 再檢查一次是否有eTag ?
  1030. $rows_etag = $this->db->select('lpr, confirms')
  1031. ->from('etag_lpr')
  1032. ->where(array('etag' => $etag))
  1033. ->limit(1)
  1034. ->get()
  1035. ->row_array();
  1036. if (empty($rows_etag['lpr'])) // 無資料
  1037. {
  1038. $data = array
  1039. (
  1040. 'lpr' => $lpr,
  1041. 'lpr_correct' => $lpr,
  1042. 'etag' => $etag
  1043. );
  1044. // 檢查是否會員
  1045. $rows_members = $this->db->select('member_no, member_name')
  1046. ->from('members')
  1047. ->where(array('lpr' => $lpr))
  1048. ->limit(1)
  1049. ->get()
  1050. ->row_array();
  1051. // 會員者, 將eTag update回去
  1052. if (!empty($rows_members['member_no']))
  1053. {
  1054. $data['member_no'] = $rows_members['member_no'];
  1055. $data['member_name'] = $rows_members['member_name'];
  1056. $this->db->where('member_no', $rows_members['member_no'])->update('member_car', array('etag' => $etag));
  1057. $this->db->where('member_no', $rows_members['member_no'])->update('members', array('etag' => $etag));
  1058. }
  1059. $this->db->insert('etag_lpr', $data);
  1060. }
  1061. else
  1062. {
  1063. if ($rows_etag['confirms'] == 1)
  1064. {
  1065. $this->db->where('etag', $etag)->update('etag_lpr', array('confirms' => 0));
  1066. }
  1067. else // 原confirms為0者, 刪除之
  1068. {
  1069. $this->db->delete('etag_lpr', array('etag' => $etag));
  1070. }
  1071. }
  1072. }
  1073. }
  1074. */
  1075. // 送出至message queue(目前用mqtt)
  1076. public function mq_send($topic, $msg)
  1077. {
  1078. $this->vars['mqtt']->publish($topic, $msg, 0);
  1079. trigger_error("mqtt:{$topic}|{$msg}");
  1080. usleep(100000); // delay 0.1 sec (避免漏訊號)
  1081. }
  1082. // 產生 CK
  1083. public function gen_opendoor_ck($parms, $function_name)
  1084. {
  1085. return md5($parms['ivsno']. 'alt' . date('dmh') . 'o' . $parms['lpr'] . 'b' . $function_name);
  1086. }
  1087. // 開門 (月租)
  1088. public function member_opendoors($parms)
  1089. {
  1090. //$this->mq_send_opendoor(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  1091. $ck = $this->gen_opendoor_ck($parms, __FUNCTION__);
  1092. get_headers("http://localhost/cars.html/" . __FUNCTION__ . "/{$parms['ivsno']}/{$parms['lpr']}/{$ck}");
  1093. return true;
  1094. }
  1095. // 開門 (臨停)
  1096. public function temp_opendoors($parms)
  1097. {
  1098. //$this->mq_send_opendoor(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  1099. $ck = $this->gen_opendoor_ck($parms, __FUNCTION__);
  1100. get_headers("http://localhost/cars.html/" . __FUNCTION__ ."/{$parms['ivsno']}/{$parms['lpr']}/{$ck}");
  1101. return true;
  1102. }
  1103. // 開門 (月租)
  1104. public function do_member_opendoor($parms)
  1105. {
  1106. if($parms['ck'] != $this->gen_opendoor_ck($parms, 'member_opendoors'))
  1107. {
  1108. return 'ck_error'; // 中斷
  1109. }
  1110. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}");
  1111. return 'ok';
  1112. }
  1113. // 開門 (臨停)
  1114. public function do_temp_opendoor($parms)
  1115. {
  1116. if($parms['ck'] != $this->gen_opendoor_ck($parms, 'temp_opendoors'))
  1117. {
  1118. return 'ck_error'; // 中斷
  1119. }
  1120. $this->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}");
  1121. return 'ok';
  1122. }
  1123. // 指派車位
  1124. // http://203.75.167.89/parkingquery.html/get_valid_seat
  1125. // 註記現在時間, 並保留10分鐘
  1126. public function get_valid_seat()
  1127. {
  1128. $data = array();
  1129. //$data['result']['location_no'] = '0';
  1130. //$data['result_code'] = 'FAIL';
  1131. //return $data;
  1132. // 撈 roger db
  1133. /*
  1134. $sql = "
  1135. SELECT ParkingNum AS pksno FROM table_carpark
  1136. WHERE LPR = '' AND DisableSeat = 0 AND
  1137. (SELECT COUNT(*) FROM table_carpark WHERE LPR = '' AND DisableSeat = 0) <= 10
  1138. ORDER BY RAND() LIMIT 1 FOR UPDATE;
  1139. ";
  1140. $dsn_old_db = $this->load->database('old_db', true);
  1141. // 2016/12/14 roger_db 掛了的可能
  1142. if ($dsn_old_db->initialize())
  1143. {
  1144. $retults = $dsn_old_db->query($sql)->result_array();
  1145. }
  1146. if(!empty($retults[0]))
  1147. {
  1148. $data['result']['location_no'] = substr($retults[0]['pksno'], 1);
  1149. $data['result_code'] = 'OK';
  1150. $data['loc_name'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1151. $data['floors'] = 'B'.substr($retults[0]['pksno'], 0, 1);
  1152. }
  1153. else
  1154. {
  1155. $data['result']['location_no'] = '0';
  1156. $data['result_code'] = 'FAIL';
  1157. }
  1158. */
  1159. $this->db->trans_start();
  1160. $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;";
  1161. $rows = $this->db->query($sql)->row_array();
  1162. if (!empty($rows['pksno']))
  1163. {
  1164. $data['result']['location_no'] = substr($rows['pksno'], -3);
  1165. $data['result_code'] = 'OK';
  1166. $sql = "update pks set book_time = addtime(now(), '00:10:00') where pksno = {$rows['pksno']};";
  1167. $this->db->query($sql);
  1168. $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";
  1169. $rows = $this->db->query($sql)->row_array();
  1170. $data['loc_name'] = $rows['group_name'];
  1171. $data['floors'] = $rows['floors'];
  1172. }
  1173. else
  1174. {
  1175. $data['result']['location_no'] = '0';
  1176. $data['result_code'] = 'FAIL';
  1177. }
  1178. $this->db->trans_complete();
  1179. return $data;
  1180. }
  1181. // 取得出入口 888 資訊
  1182. public function get_888_info($parms)
  1183. {
  1184. $data = array();
  1185. $sql = "select availables as availables, tot as tot from pks_groups where group_id = 'C888' and station_no = {$parms['sno']}";
  1186. $rows = $this->db->query($sql)->row_array();
  1187. if (!empty($rows) && array_key_exists('availables', $rows))
  1188. {
  1189. $data['result_code'] = 'OK';
  1190. $data['availables'] = $rows['availables'];
  1191. $data['tot'] = $rows['tot'];
  1192. }
  1193. else
  1194. {
  1195. trigger_error(__FUNCTION__ . "..not found..".print_r($parms, true));
  1196. $data['result_code'] = 'FAIL';
  1197. $data['availables'] = 9999; // 如果拿不到就忽略這個流程
  1198. $data['tot'] = 0;
  1199. }
  1200. return $data;
  1201. }
  1202. // ===============================================
  1203. // acer cmd
  1204. // ===============================================
  1205. // 產生通行碼
  1206. function gen_pass_code()
  1207. {
  1208. return rand(100000,999999);
  1209. }
  1210. // 呼叫acer
  1211. function call_acer($cmd, $parms)
  1212. {
  1213. return false; // 尚未啟用
  1214. try{
  1215. $ch = curl_init();
  1216. curl_setopt($ch, CURLOPT_URL, 'http://localhost/acer_service.html/cmd_'. $cmd);
  1217. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  1218. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1219. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  1220. curl_setopt($ch, CURLOPT_POST, TRUE);
  1221. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,3);
  1222. curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
  1223. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parms));
  1224. $data = curl_exec($ch);
  1225. if(curl_errno($ch))
  1226. {
  1227. trigger_error(__FUNCTION__ . ', curl error: '. curl_error($ch));
  1228. }
  1229. curl_close($ch);
  1230. trigger_error(__FUNCTION__ . '..'. $data);
  1231. }catch (Exception $e){
  1232. trigger_error(__FUNCTION__ . 'error:'.$e->getMessage());
  1233. }
  1234. }
  1235. // ===============================================
  1236. // mitac cmd
  1237. // ===============================================
  1238. // 檢查指定時間是否介於停車時段區間
  1239. function check_park_time($park_time, $target_time)
  1240. {
  1241. $pt_arr = $this->vars['mcache']->get('pt');
  1242. $now_time = substr($target_time, 11); // 日期字串只取最後時間字串(13:25:32)
  1243. $week_no = date('w',strtotime($target_time)); // 取星期幾
  1244. $park_time_array = explode(',', $park_time); // 用 , 格開
  1245. foreach($park_time_array as $idx => $park_time_value)
  1246. {
  1247. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  1248. {
  1249. if ($week_no >= $pt_rows['w_start'] &&
  1250. $week_no <= $pt_rows['w_end'] &&
  1251. $now_time >= $pt_rows['time_start'] &&
  1252. $now_time <= $pt_rows['time_end'])
  1253. {
  1254. return true;
  1255. }
  1256. }
  1257. }
  1258. return false;
  1259. }
  1260. // 取得會員時段區間起點
  1261. function gen_park_time_first($park_time, $target_time)
  1262. {
  1263. $pt_arr = $this->vars['mcache']->get('pt');
  1264. $now_time = substr($target_time, 11); // 日期字串只取最後時間字串(13:25:32)
  1265. $week_no = date('w',strtotime($target_time)); // 取星期幾
  1266. $park_time_array = explode(',', $park_time); // 用 , 格開
  1267. $week_no_first = 0;
  1268. $time_end_first = '';
  1269. foreach($park_time_array as $idx => $park_time_value)
  1270. {
  1271. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  1272. {
  1273. if ($week_no >= $pt_rows['w_start'] &&
  1274. $week_no <= $pt_rows['w_end'] &&
  1275. $now_time >= $pt_rows['time_start'] &&
  1276. $now_time <= $pt_rows['time_end'])
  1277. {
  1278. $week_no_first = $pt_rows['w_start'];
  1279. $time_end_first = $pt_rows['time_start'];
  1280. trigger_error(__FUNCTION__ . "|$park_time, $target_time | $week_no_first, $time_end_first");
  1281. break;
  1282. }
  1283. }
  1284. }
  1285. $day_offset = $week_no - $week_no_first;
  1286. if($day_offset < 0)
  1287. {
  1288. trigger_error(__FUNCTION__ . '..error..offset..' . $day_offset);
  1289. $day_offset = 0;
  1290. }
  1291. return date('Y-m-d', strtotime("-$day_offset day", strtotime($target_time))). " $time_end_first";
  1292. }
  1293. // 取得會員時段區間終點
  1294. function gen_park_time_last($park_time, $target_time)
  1295. {
  1296. $pt_arr = $this->vars['mcache']->get('pt');
  1297. $now_time = substr($target_time, 11); // 日期字串只取最後時間字串(13:25:32)
  1298. $week_no = date('w',strtotime($target_time)); // 取星期幾
  1299. $park_time_array = explode(',', $park_time); // 用 , 格開
  1300. $week_no_last = 0;
  1301. $time_end_last = '';
  1302. foreach($park_time_array as $idx => $park_time_value)
  1303. {
  1304. foreach($pt_arr[$park_time_value]['timex'] as $idx => $pt_rows)
  1305. {
  1306. if ($week_no >= $pt_rows['w_start'] &&
  1307. $week_no <= $pt_rows['w_end'] &&
  1308. $now_time >= $pt_rows['time_start'] &&
  1309. $now_time <= $pt_rows['time_end'])
  1310. {
  1311. $week_no_last = $pt_rows['w_end'];
  1312. $time_end_last = $pt_rows['time_end'];
  1313. trigger_error(__FUNCTION__ . "|$park_time, $target_time | $week_no_last, $time_end_last");
  1314. break;
  1315. }
  1316. }
  1317. }
  1318. $day_offset = $week_no_last - $week_no;
  1319. if($day_offset < 0)
  1320. {
  1321. trigger_error(__FUNCTION__ . '..error..offset..' . $day_offset);
  1322. $day_offset = 0;
  1323. }
  1324. return date('Y-m-d', strtotime("+$day_offset day", strtotime($target_time))). " $time_end_last";
  1325. }
  1326. // 取得會員身份減免後的費用起算時間
  1327. function check_member_state($lpr, $in_time, $out_time)
  1328. {
  1329. // 檢查月租身份修正
  1330. $member_info = $this->get_member($lpr, false);
  1331. if ($member_info['member_no'] == 0)
  1332. {
  1333. // 查無會員身份
  1334. $member_state = 0;
  1335. $new_in_time = $in_time;
  1336. $new_out_time = $out_time;
  1337. }
  1338. else
  1339. {
  1340. $park_time = $member_info['park_time'];
  1341. $pt_arr = $this->vars['mcache']->get('pt');
  1342. if(empty($pt_arr) || empty($park_time))
  1343. {
  1344. // ERROR: 無法驗証時段, 跳過時段限制判斷
  1345. $member_state = 1;
  1346. $new_in_time = $in_time;
  1347. $new_out_time = $out_time;
  1348. }
  1349. else
  1350. {
  1351. $in_time_in_park_time = $this->check_park_time($park_time, $in_time);
  1352. $out_time_in_park_time = $this->check_park_time($park_time, $out_time);
  1353. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|..check_park_time: {$in_time_in_park_time}, {$out_time_in_park_time}..");
  1354. if($in_time_in_park_time && $out_time_in_park_time)
  1355. {
  1356. // 進出時間都在會員區間內: 費用起算時間改為出場時間
  1357. $member_state = 2;
  1358. $new_in_time = $out_time;
  1359. $new_out_time = $out_time;
  1360. }
  1361. else if($in_time_in_park_time)
  1362. {
  1363. // 入場時間在會員區間內: 費用起算時間改為, 會員時段區間終點
  1364. $member_state = 3;
  1365. $new_in_time = $this->gen_park_time_last($park_time, $in_time);
  1366. $new_out_time = $out_time;
  1367. if(strtotime($new_in_time) > strtotime($out_time))
  1368. {
  1369. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|new_in_time error >> out_time..");
  1370. $new_in_time = $out_time;
  1371. }
  1372. }
  1373. else if($out_time_in_park_time)
  1374. {
  1375. // 出場時間在會員區間內: 費用起算時間改為, 會員時段區間起點
  1376. $member_state = 4;
  1377. $new_in_time = $in_time;
  1378. $new_out_time = $this->gen_park_time_first($park_time, $out_time);
  1379. if(strtotime($in_time) > strtotime($new_out_time))
  1380. {
  1381. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|new_in_time error >> out_time..");
  1382. $new_out_time = $out_time;
  1383. }
  1384. }
  1385. }
  1386. }
  1387. $member_result = array('state' => $member_state, 'in_time' => $new_in_time, 'out_time' => $new_out_time);
  1388. trigger_error(__FUNCTION__ . "|$lpr, $in_time, $out_time|..". print_r($member_result, true));
  1389. return $member_result;
  1390. }
  1391. // 要求 mitac 扣款
  1392. function call_mitac_pay($lpr, $ivsno, $rows_cario)
  1393. {
  1394. $function_name = 'parking_fee_altob';
  1395. $seqno = $rows_cario['cario_no'];
  1396. $in_time = $rows_cario['out_before_time'];
  1397. $out_time = $this->now_str;
  1398. $gate_id = 1; // 20171124 改為強制 1//$ivsno;
  1399. // 確認會員身份
  1400. $member_result = $this->check_member_state($lpr, $in_time, $out_time);
  1401. switch($member_result['state'])
  1402. {
  1403. case 0:
  1404. trigger_error(__FUNCTION__ . '|非會員|');
  1405. break;
  1406. case 1:
  1407. trigger_error(__FUNCTION__ . '|無法驗証時段|skip MITAC|'. print_r($member_result, true));
  1408. return false; // 跳過 mitac
  1409. break;
  1410. case 2:
  1411. trigger_error(__FUNCTION__ . '|進出時間都在會員區間內|skip MITAC|'. print_r($member_result, true));
  1412. return false; // 跳過 mitac
  1413. break;
  1414. case 3:
  1415. trigger_error(__FUNCTION__ . '|入場時間在會員區間內|'. print_r($member_result, true));
  1416. $in_time = $member_result['in_time'];
  1417. break;
  1418. case 4:
  1419. trigger_error(__FUNCTION__ . '|出場時間在會員區間內|'. print_r($member_result, true));
  1420. $out_time = $member_result['out_time'];
  1421. break;
  1422. default:
  1423. trigger_error(__FUNCTION__ . '|未定義|'. print_r($member_result, true));
  1424. break;
  1425. }
  1426. // 通訊內容
  1427. $parms = array(
  1428. 'seqno' => $seqno,
  1429. 'lpr' => $lpr,
  1430. 'in_time' => $in_time,
  1431. 'out_time' => $out_time,
  1432. 'gate_id' => $gate_id);
  1433. // 超過一天就擋掉
  1434. if(strtotime($parms['out_time']) - strtotime($parms['in_time']) > 86400)
  1435. {
  1436. trigger_error(__FUNCTION__ . '|超過計費時限|skip MITAC|'. print_r($parms, true));
  1437. return false; // 跳過 mitac
  1438. }
  1439. // 驗証碼
  1440. $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);
  1441. // 呼叫
  1442. try{
  1443. $ch = curl_init();
  1444. curl_setopt($ch, CURLOPT_URL, "http://localhost/mitac_service.html/{$function_name}");
  1445. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  1446. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  1447. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  1448. curl_setopt($ch, CURLOPT_POST, TRUE);
  1449. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,3);
  1450. curl_setopt($ch, CURLOPT_TIMEOUT, 3); //timeout in seconds
  1451. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parms));
  1452. $data = curl_exec($ch);
  1453. if(curl_errno($ch))
  1454. {
  1455. trigger_error(__FUNCTION__ . ', curl error: '. curl_error($ch));
  1456. }
  1457. curl_close($ch);
  1458. trigger_error(__FUNCTION__ . '..'. $data);
  1459. }catch (Exception $e){
  1460. trigger_error(__FUNCTION__ . 'error:'.$e->getMessage());
  1461. }
  1462. }
  1463. }