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

Carpayment_model.php 27KB

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年前
7年前
8年前
8年前
7年前
8年前
7年前
7年前
7年前
8年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. <?php
  2. /*
  3. file: carpayment_model.php
  4. */
  5. require_once(ALTOB_SYNC_FILE) ;
  6. class Carpayment_model extends CI_Model
  7. {
  8. var $vars = array();
  9. var $io_name = array('I' => '車入', 'O' => '車出', 'MI' => '機入', 'MO' => '機出', 'FI' => '樓入', 'FO' => '樓出');
  10. var $now_str;
  11. function __construct()
  12. {
  13. parent::__construct();
  14. $this->load->database();
  15. $this->now_str = date('Y-m-d H:i:s');
  16. }
  17. public function init($vars)
  18. {
  19. $this->vars = $vars;
  20. }
  21. ////////////////////////////////////////
  22. //
  23. // 付款後, 付款資訊建檔
  24. //
  25. ////////////////////////////////////////
  26. // [付款完成] 付款後續流程
  27. function payed_finished($cario_no, $lpr, $etag, $in_time)
  28. {
  29. $LOG_TAG = 'set_payed://';
  30. $LOG_TAG_FATAL = 'set_payed_fatal://';
  31. trigger_error(__FUNCTION__ . "|$cario_no 付款完成|$lpr, $etag, $in_time|");
  32. $trim_finished_cario_no_arr = array(); // 需處理的進場索引
  33. $in_time_value = strtotime($in_time);
  34. $in_time_1 = date('Y-m-d H:i:s', $in_time_value + 1); // +1 sec
  35. $in_time_2 = date('Y-m-d H:i:s', $in_time_value - 1); // -1 sec
  36. $in_time_3 = date('Y-m-d H:i:s', $in_time_value + 2); // +2 sec
  37. $in_time_4 = date('Y-m-d H:i:s', $in_time_value - 2); // -2 sec
  38. // 挑出已付款入場記錄, 入場時間附近 2 秒內, 但尚未結清之入場記錄
  39. $sql = "SELECT cario_no, obj_id as lpr, etag, in_time
  40. FROM cario
  41. WHERE in_time in ('$in_time', '$in_time_1', '$in_time_2', '$in_time_3', '$in_time_4')
  42. AND cario_no != $cario_no
  43. AND finished = 0
  44. AND payed = 0
  45. AND err = 0
  46. ";
  47. $in_time_retults = $this->db->query($sql)->result_array();
  48. if(!empty($in_time_retults) && count($in_time_retults) > 0)
  49. {
  50. $data = array();
  51. foreach ($in_time_retults as $idx => $rows)
  52. {
  53. $result_cario_no = $rows['cario_no'];
  54. $result_lpr = $rows['lpr'];
  55. $result_etag = $rows['etag'];
  56. $result_in_time = $rows['in_time'];
  57. if(empty($result_lpr) || $result_lpr == 'NONE')
  58. {
  59. if(strlen($result_etag) > 20 && $result_etag == $etag)
  60. {
  61. trigger_error($LOG_TAG . "$cario_no, $lpr, $etag, $in_time|無車牌|ETAG吻合|$result_cario_no, $result_lpr, $result_etag, $result_in_time|待註銷|skip");
  62. //array_push($trim_finished_cario_no_arr, $result_cario_no);
  63. }
  64. }
  65. else
  66. {
  67. $levenshtein_value = levenshtein($result_lpr, $lpr);
  68. if( $levenshtein_value == 0 || $levenshtein_value == 1)
  69. {
  70. trigger_error($LOG_TAG . "$cario_no, $lpr, $etag, $in_time|車牌 差0-1碼|$result_cario_no, $result_lpr, $result_etag, $result_in_time|待註銷");
  71. array_push($trim_finished_cario_no_arr, $result_cario_no);
  72. }
  73. else if($levenshtein_value == 2)
  74. {
  75. if(strlen($result_etag) > 20 && $result_etag == $etag)
  76. {
  77. trigger_error($LOG_TAG . "$cario_no, $lpr, $etag, $in_time|車牌 差2碼|ETAG吻合|$result_cario_no, $result_lpr, $result_etag, $result_in_time|待註銷|skip");
  78. //array_push($trim_finished_cario_no_arr, $result_cario_no);
  79. }
  80. }
  81. else
  82. {
  83. if(strlen($result_etag) > 20 && $result_etag == $etag)
  84. {
  85. trigger_error($LOG_TAG . "$cario_no, $lpr, $etag, $in_time|車牌不合|ETAG吻合|$result_cario_no, $result_lpr, $result_etag, $result_in_time|??");
  86. trigger_error($LOG_TAG_FATAL . "$cario_no, $lpr, $etag, $in_time|車牌不合|ETAG吻合|$result_cario_no, $result_lpr, $result_etag, $result_in_time|??");
  87. }
  88. }
  89. }
  90. }
  91. }
  92. // 執行註銷
  93. if(!empty($trim_finished_cario_no_arr))
  94. {
  95. $this->db->where_in('cario_no', $trim_finished_cario_no_arr)->update('cario', array('err' => 2))->limit(5);
  96. if (!$this->db->affected_rows())
  97. {
  98. trigger_error($LOG_TAG . "註銷失敗|" . $this->db->last_query());
  99. return 'fail';
  100. }
  101. trigger_error($LOG_TAG . "註銷成功|" . $this->db->last_query());
  102. trigger_error(__FUNCTION__ . '..trim_finished_cario_no_arr..' . print_r($trim_finished_cario_no_arr, true));
  103. }
  104. return 'ok';
  105. }
  106. // 通知付款完成
  107. public function p2payed($parms, $opay=false, $finished=false)
  108. {
  109. $result = $this->db->select("in_time, cario_no, station_no, etag")
  110. ->from('cario')
  111. ->where(array('obj_type' => 1, 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0))
  112. ->order_by('cario_no', 'desc')
  113. ->limit(1)
  114. ->get()
  115. ->row_array();
  116. // 找不到記錄
  117. if(!isset($result['cario_no']))
  118. {
  119. trigger_error(__FUNCTION__ . '..not found..' . print_r($parms, true));
  120. return false;
  121. }
  122. if($opay)
  123. {
  124. $pay_time = $this->now_str;
  125. $out_before_time = date('Y-m-d H:i:s', strtotime(" + 15 minutes"));
  126. $pay_type = 4;
  127. $data = array
  128. (
  129. 'out_before_time' => $out_before_time,
  130. 'pay_time' => $pay_time,
  131. 'pay_type' => 4, // 歐付寶行動支付
  132. 'payed' => 1
  133. );
  134. // 是否註記完結
  135. if($finished)
  136. $data['finished'] = 1;
  137. $this->db->where(array('cario_no' => $result['cario_no']))->update('cario', $data);
  138. if (!$this->db->affected_rows())
  139. {
  140. trigger_error("歐付寶行動支付失敗,{$parms['lpr']}金額:{$parms['amt']},序號:{$parms['seqno']}");
  141. return 'fail';
  142. }
  143. trigger_error("歐付寶行動支付成功,{$parms['lpr']}金額:{$parms['amt']},序號:{$parms['seqno']}");
  144. }
  145. else
  146. {
  147. // 若間隔小於 15 分鐘, 拿現在時間來當付款時間
  148. $pay_time = ((strtotime($parms['pay_time']) - strtotime($result['in_time'])) / 60 < 15) ? $this->now_str : $parms['pay_time'];
  149. // 限時離場時間
  150. $out_before_time = date('Y-m-d H:i:s', strtotime("{$pay_time} + 15 minutes"));
  151. // 付款方式
  152. $pay_type = $parms['pay_type'];
  153. // B. 一般繳費機
  154. $data = array
  155. (
  156. 'out_before_time' => $out_before_time,
  157. 'pay_time' => $pay_time,
  158. 'pay_type' => $pay_type,
  159. 'payed' => 1
  160. );
  161. // 是否註記完結
  162. if($finished)
  163. $data['finished'] = 1;
  164. $this->db->where(array('cario_no' => $result['cario_no']))->update('cario', $data);
  165. if (!$this->db->affected_rows())
  166. {
  167. trigger_error("付款失敗:{$parms['lpr']}|{$data['out_before_time']}");
  168. return 'fail';
  169. }
  170. trigger_error("付款後更新時間:{$parms['lpr']}|{$data['out_before_time']}|". print_r($data, true));
  171. }
  172. // 付款後續流程
  173. $this->payed_finished($result['cario_no'], $parms['lpr'], $result['etag'], $result['in_time']);
  174. // 傳送付款更新記錄
  175. $sync_agent = new AltobSyncAgent();
  176. $sync_agent->init($result['station_no'], $result['in_time']);
  177. $sync_agent->cario_no = $result['cario_no']; // 進出編號
  178. $sync_result = $sync_agent->sync_st_pay($parms['lpr'], $pay_time, $pay_type, $out_before_time, $finished);
  179. trigger_error( "..sync_st_pay.." . $sync_result);
  180. return 'ok';
  181. }
  182. // 行動支付, 手機告知已付款
  183. // http://203.75.167.89/carpayment.html/m2payed/ABC1234/120/12112/12345/1f3870be274f6c49b3e31a0c6728957f
  184. // http://203.75.167.89/carpayment.html/m2payed/車牌/金額/場站編號/序號/MD5
  185. // md5(車牌.金額.場站編號.序號)
  186. public function m2payed($parms, $finished=false)
  187. {
  188. $data = array
  189. (
  190. 'out_before_time' => date('Y-m-d H:i:s', strtotime(" + 15 minutes")),
  191. 'pay_time' => date('Y-m-d H:i:s'),
  192. 'pay_type' => 4, // 歐付寶行動支付
  193. 'payed' => 1
  194. );
  195. // 是否註記完結
  196. if($finished)
  197. $data['finished'] = 1;
  198. $this->db->where(array('cario_no' => $parms['seqno']))->update('cario', $data);
  199. if ($this->db->affected_rows())
  200. {
  201. trigger_error("歐付寶行動支付成功,{$parms['lpr']}金額:{$parms['amt']},序號:{$parms['seqno']}");
  202. return 'ok';
  203. }
  204. else
  205. {
  206. trigger_error("歐付寶行動支付失敗,{$parms['lpr']}金額:{$parms['amt']},序號:{$parms['seqno']}");
  207. return 'fail';
  208. }
  209. }
  210. ////////////////////////////////////////
  211. //
  212. // 付款前, 入場資訊查找
  213. //
  214. ////////////////////////////////////////
  215. // 模糊比對
  216. function getLevenshteinSQLStatement($word, $target)
  217. {
  218. $words = array();
  219. if(strlen($word) >= 5)
  220. {
  221. for ($i = 0; $i < strlen($word); $i++) {
  222. // insertions
  223. $words[] = substr($word, 0, $i) . '_' . substr($word, $i);
  224. // deletions
  225. $words[] = substr($word, 0, $i) . substr($word, $i + 1);
  226. // substitutions
  227. //$words[] = substr($word, 0, $i) . '_' . substr($word, $i + 1);
  228. }
  229. }
  230. else
  231. {
  232. for ($i = 0; $i < strlen($word); $i++) {
  233. // insertions
  234. $words[] = substr($word, 0, $i) . '_' . substr($word, $i);
  235. }
  236. }
  237. // last insertion
  238. $words[] = $word . '_';
  239. //return $words;
  240. $fuzzy_statement = ' (';
  241. foreach ($words as $idx => $word)
  242. {
  243. $fuzzy_statement .= " {$target} LIKE '%{$word}%' OR ";
  244. }
  245. $last_or_pos = strrpos($fuzzy_statement, 'OR');
  246. if($last_or_pos !== false)
  247. {
  248. $fuzzy_statement = substr_replace($fuzzy_statement, ')', $last_or_pos, strlen('OR'));
  249. }
  250. return $fuzzy_statement;
  251. }
  252. // 取得進場資訊 (模糊比對)
  253. function q_fuzzy_pks($word)
  254. {
  255. if(empty($word) || strlen($word) < 3 || strlen($word) > 8)
  256. {
  257. return null;
  258. }
  259. /*
  260. // 備援數字使用
  261. else if(is_numeric($word) && strlen($word) == 6)
  262. {
  263. trigger_error(__FUNCTION__ . '..備援查詢: ' . $word);
  264. $sql = "SELECT obj_id as lpr, ticket_no
  265. FROM cario
  266. WHERE finished = 0 AND err = 0
  267. AND out_before_time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 DAY)
  268. AND ticket_no = {$word}
  269. ORDER BY out_before_time DESC";
  270. $retults = $this->db->query($sql)->result_array();
  271. return $retults;
  272. }
  273. */
  274. $fuzzy_statement = $this->getLevenshteinSQLStatement($word, 'obj_id');
  275. //trigger_error("模糊比對 {$word} where: {$fuzzy_statement}");
  276. $sql = "SELECT obj_id as lpr, ticket_no
  277. FROM cario
  278. WHERE {$fuzzy_statement} AND finished = 0 AND err = 0
  279. AND out_before_time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 DAY)
  280. GROUP BY obj_id
  281. ORDER BY out_before_time DESC";
  282. $retults = $this->db->query($sql)->result_array();
  283. return $retults;
  284. }
  285. // 建立博辰查詢入場時間資料 (by ticket_no)
  286. function gen_query_data_type4($ticket_no)
  287. {
  288. $data = array();
  289. // s2. 完整車牌號碼: 右邊補空格補滿7碼
  290. $data['lpr'] = $ticket_no;
  291. // s3. 塔號_車格號碼: 該車牌相關車輛所停車的停車塔號或樓層號碼,
  292. // 地下室部分為負值例如B1為-1,平面停車場為1,二樓為2 (左邊補 ‘0’ 補滿2碼),
  293. // 停車格號4碼(左邊補 ‘0’ 補滿4碼),
  294. // 樓層和停車格號中間以 ‘_’ 分隔,例如:”01_0101”
  295. $data['seat_no'] = 'XX_XXXX';
  296. $data['ticket'] = 0;
  297. $data['start_date'] = '2000/01/01';
  298. $data['end_date'] = '2000/01/01';
  299. $data['start_time'] = '00:00';
  300. $data['end_time'] = '00:00';
  301. $result = $this->db->select("in_time, date_format(pay_time, '%Y/%m/%d %T') as pay_time, in_pic_name, member_no, in_lane, in_out, station_no")
  302. ->from('cario')
  303. ->where(array('obj_type' => 1, 'ticket_no' => $ticket_no, 'finished' => 0, 'err' => 0))
  304. ->order_by('cario_no', 'desc')
  305. ->limit(1)
  306. ->get()
  307. ->row_array();
  308. if (!empty($result['in_time']))
  309. {
  310. // s5. 入場時間: 格式為"yyyy/MM/dd HH:mm:ss",時間為24小時制,若無紀錄秒數秒數部分可填”00”
  311. $data['in_time'] = $result['in_time'];
  312. // s6. 入場車牌圖片路徑: 貴公司的絕對路徑,我方使用網路芳鄰或FTP下載
  313. $data['in_pic_name'] = $this->gen_in_pic_path($result);
  314. // s7. 繳費時間: 無繳費時間時為"2000/01/01 00:00:00",格式為"yyyy/MM/dd HH:mm:ss",時間為24小時制,若無紀錄秒數秒數部分可填”00”
  315. $data['pay_time'] = !empty($result['pay_time']) ? $result['pay_time'] : '2000/01/01 00:00:00';
  316. // s12. 停車位置區域代碼: 從 1 開始
  317. $data['area_code'] = $this->gen_area_code($result);
  318. }
  319. else
  320. {
  321. $data['in_time'] = '';
  322. $data['in_pic_name'] = '';
  323. $data['pay_time'] = '2000/01/01 00:00:00';
  324. $data['area_code'] = 1;
  325. }
  326. return $data;
  327. }
  328. // 取得圖檔路徑
  329. function gen_in_pic_path($cario)
  330. {
  331. //北車西上特例
  332. if($cario['station_no'] == 12304)
  333. {
  334. $station_local_ip = '192.168.10.203';
  335. }//科博西屯特例
  336. else if($cario['station_no'] == 40709)
  337. {
  338. $station_local_ip = '192.168.9.201';
  339. }//科博西屯特例
  340. else if($cario['station_no'] == 40703)
  341. {
  342. $station_local_ip = '192.168.10.205';
  343. }
  344. else if($cario['station_no'] == 12117)
  345. {
  346. $station_local_ip = '192.168.0.201';
  347. }
  348. else
  349. {
  350. $station_local_ip = STATION_LOCAL_IP;
  351. }
  352. if(!empty($cario['in_pic_name']))
  353. {
  354. $pic_name_arr = explode('-', $cario['in_pic_name']);
  355. $date_num = substr($pic_name_arr[7], 0, 8);
  356. return "\\\\" . $station_local_ip . "\\pics\\{$date_num}\\{$cario['in_pic_name']}";
  357. }
  358. else if(file_exists(CAR_PIC . 'lpr-404.jpg'))
  359. {
  360. return "\\\\" . $station_local_ip . "\\pics\\lpr-404.jpg"; // 預設圖片
  361. }
  362. return '';
  363. }
  364. // 產生區域代碼 (判斷 in_out, in_lane, station_no)
  365. function gen_area_code($cario)
  366. {
  367. // 1: 北車西上 (一般車)
  368. // 2: 北車西上 (機車)
  369. // 3: 北車西下 (一般車)
  370. // 4: 北車西下 (計程車)
  371. // 北車西下
  372. if($cario['station_no'] == 12303)
  373. {
  374. if($cario['in_lane'] == 0)
  375. {
  376. return 4; // 4: 北車西下 (計程車)
  377. }
  378. else
  379. {
  380. return 3; // 3: 北車西下 (一般車)
  381. }
  382. }
  383. // 北車西上
  384. else if($cario['station_no'] == 12304)
  385. {
  386. if(substr($cario['in_out'], 0, 1) === 'C')
  387. {
  388. return 1; // 1: 北車西上 (一般車)
  389. }
  390. else
  391. {
  392. return 2; // 2: 北車西上 (機車)
  393. }
  394. }
  395. else if($cario['station_no'] == 40712)
  396. {
  397. return 2;
  398. }
  399. else if($cario['station_no'] == 40704)
  400. {
  401. if(substr($cario['in_out'], 0, 1) === 'C')
  402. {
  403. return 1; // 1: 植物園 (一般車)
  404. }
  405. else
  406. {
  407. return 2; // 2: 植物園平面 (大客車)
  408. }
  409. }
  410. return 1; // 預設值
  411. }
  412. // 建立博辰查詢入場時間資料
  413. function gen_query_data($lpr,$station_no)
  414. {
  415. $data = array();
  416. // s2. 完整車牌號碼: 右邊補空格補滿7碼
  417. $data['lpr'] = $lpr; //str_pad($lpr, 7, ' ', STR_PAD_RIGHT);
  418. // s3. 塔號_車格號碼: 該車牌相關車輛所停車的停車塔號或樓層號碼,
  419. // 地下室部分為負值例如B1為-1,平面停車場為1,二樓為2 (左邊補 ‘0’ 補滿2碼),
  420. // 停車格號4碼(左邊補 ‘0’ 補滿4碼),
  421. // 樓層和停車格號中間以 ‘_’ 分隔,例如:”01_0101”
  422. $sql = "select p.pksno, m.group_id
  423. from pks p, pks_group_member m, pks_groups g
  424. where p.pksno = m.pksno
  425. and m.group_id = g.group_id
  426. and g.group_type = 1
  427. and p.lpr = '{$lpr}'
  428. limit 1";
  429. $rows = $this->db->query($sql)->row_array();
  430. if (!empty($rows['pksno']))
  431. {
  432. //$data['seat_no'] = ($rows['group_id'] == 'B1' ? '-1' : '0' . substr($rows['group_id'], -1)) . '_0' . substr($rows['pksno'], -3);
  433. $group_floor_type = preg_replace( '/[^A-Z]/', '', $rows['group_id']);
  434. $group_floor_num = preg_replace( '/[^1-9]/', '', $rows['group_id']);
  435. if($group_floor_type == 'B')
  436. {
  437. $data['seat_no'] = '-' . $group_floor_num . '_0' . substr($rows['pksno'], -3);
  438. }
  439. else
  440. {
  441. $group_floor_num = str_pad($group_floor_num, 2, '0', STR_PAD_LEFT);
  442. $data['seat_no'] = $group_floor_num . '_0' . substr($rows['pksno'], -3);
  443. }
  444. }
  445. else
  446. {
  447. $data['seat_no'] = 'XX_XXXX'; // '-1_0028';
  448. }
  449. // 查詢是否月租會員
  450. $result = $this->db->select("date_format(start_date, '%Y/%m/%d') as start_date, date_format(end_date,'%Y/%m/%d') as end_date")
  451. ->from('members')
  452. ->where(array(
  453. 'lpr' => $lpr,
  454. 'station_no' => $station_no,
  455. 'start_date <' => $this->vars['date_time'],
  456. 'end_date >=' => $this->vars['date_time'])
  457. , false)
  458. ->limit(1)
  459. ->get()
  460. ->row_array();
  461. if (!empty($result['start_date'])) // 月租會員
  462. {
  463. $data['ticket'] = 1; // s4. 是否為月票: 0:非月票, 1:月票
  464. $data['start_date'] = $result['start_date'];// s8. 有效起始時間: 非月票時為"2000/01/01", 格式為"yyyy/MM/dd"
  465. $data['end_date'] = $result['end_date']; // s9. 有效截止日期: 非月票時為"2000/01/01", 格式為"yyyy/MM/dd"
  466. $data['start_time'] = '00:00'; // s10. 使用起始時段: 非月票時為"00:00", 格式為"HH:mm"
  467. $data['end_time'] = '23:59'; // s11. 使用結束時段: 非月票時為"00:00", 格式為"HH:mm"
  468. }
  469. else // 臨停車
  470. {
  471. $data['ticket'] = 0;
  472. $data['start_date'] = '2000/01/01';
  473. $data['end_date'] = '2000/01/01';
  474. $data['start_time'] = '00:00';
  475. $data['end_time'] = '00:00';
  476. }
  477. $result = $this->db->select("in_time, date_format(pay_time, '%Y/%m/%d %T') as pay_time, in_pic_name, member_no, station_no, ticket_type")
  478. ->from('cario')
  479. ->where(array('obj_type' => 1, 'obj_id' => $lpr, 'finished' => 0, 'err' => 0))
  480. ->order_by('cario_no', 'desc')
  481. ->limit(1)
  482. ->get()
  483. ->row_array();
  484. if (!empty($result['in_time']) && $result['ticket_type'] != 3)
  485. {
  486. // s5. 入場時間: 格式為"yyyy/MM/dd HH:mm:ss",時間為24小時制,若無紀錄秒數秒數部分可填”00”
  487. $data['in_time'] = $result['in_time'];
  488. // s6. 入場車牌圖片路徑: 貴公司的絕對路徑,我方使用網路芳鄰或FTP下載
  489. $data['in_pic_name'] = $this->gen_in_pic_path($result);
  490. // s7. 繳費時間: 無繳費時間時為"2000/01/01 00:00:00",格式為"yyyy/MM/dd HH:mm:ss",時間為24小時制,若無紀錄秒數秒數部分可填”00”
  491. $data['pay_time'] = !empty($result['pay_time']) ? $result['pay_time'] : '2000/01/01 00:00:00';
  492. // s12. 停車位置區域代碼: 從 1 開始
  493. $data['area_code'] = $this->gen_area_code($result);
  494. }
  495. else
  496. {
  497. $data['in_time'] = '';
  498. $data['in_pic_name'] = '';
  499. $data['pay_time'] = '2000/01/01 00:00:00';
  500. $data['area_code'] = 1;
  501. }
  502. return $data;
  503. }
  504. // 博辰查詢入場時間 (fuzzy)
  505. public function query_in_fuzzy($lpr)
  506. {
  507. $fuzzy_result = $this->q_fuzzy_pks($lpr);
  508. $data_count = 0;
  509. if(!empty($fuzzy_result) && count($fuzzy_result) > 0)
  510. {
  511. $data = array();
  512. // s2 ~ s11 的資料會因模糊比對筆數增加或減少而增減
  513. foreach ($fuzzy_result as $idx => $rows)
  514. {
  515. $result_lpr = $rows['lpr'];
  516. $ticket_no = $rows['ticket_no'];
  517. $station_no = $rows['station_no'];
  518. if($result_lpr == 'NONE')
  519. {
  520. $tmp_data = $this->gen_query_data_type4($ticket_no); // 備緩搜尋
  521. }
  522. else
  523. {
  524. $tmp_data = $this->gen_query_data($result_lpr,$station_no); // 模糊搜尋
  525. }
  526. if($tmp_data['ticket'] == 1)
  527. {
  528. trigger_error("月租車, 直接乎略這筆[{$result_lpr}]:".print_r($rows, true));
  529. }
  530. else if($tmp_data['in_time'] == '')
  531. {
  532. // 若查無入場時間, 直接乎略這筆
  533. trigger_error("查無入場時間, 直接乎略這筆[{$result_lpr}]:".print_r($rows, true));
  534. }
  535. else
  536. {
  537. $data['results'][$idx] = $tmp_data;
  538. $data_count++;
  539. }
  540. }
  541. $data['count'] = $data_count;
  542. }
  543. // 查無資料
  544. if($data_count == 0)
  545. {
  546. $data_0 = array();
  547. $data_0['lpr'] = str_pad($lpr, 7, ' ', STR_PAD_RIGHT);
  548. $data_0['seat_no'] = 'XX_XXXX';
  549. $data_0['ticket'] = 0;
  550. $data_0['start_date'] = '2000/01/01';
  551. $data_0['end_date'] = '2000/01/01';
  552. $data_0['start_time'] = '00:00';
  553. $data_0['end_time'] = '00:00';
  554. $data_0['in_time'] = '';
  555. $data_0['pay_time'] = '2000/01/01 00:00:00';
  556. $data_0['in_pic_name'] = '';
  557. $data_0['area_code'] = 1;
  558. $data = array();
  559. $data['results'][0] = $data_0;
  560. $data['count'] = 0;
  561. }
  562. trigger_error("fuzzy aps查詢入場時間[{$lpr}]:".print_r($data, true));
  563. return $data;
  564. }
  565. // 博辰查詢入場時間
  566. public function query_in($lpr)
  567. {
  568. $data = array();
  569. // 讀取樓層數, group_type = 2為樓層
  570. $sql = "select p.pksno, m.group_id
  571. from pks p, pks_group_member m, pks_groups g
  572. where p.pksno = m.pksno
  573. and m.group_id = g.group_id
  574. and g.group_type = 1
  575. and p.lpr = '{$lpr}'
  576. limit 1";
  577. $rows = $this->db->query($sql)->row_array();
  578. if (!empty($rows['pksno']))
  579. {
  580. //$data['seat_no'] = ($rows['group_id'] == 'B1' ? '-1' : '0' . substr($rows['group_id'], -1)) . '_' . substr($rows['pksno'], -3);
  581. $group_floor_type = preg_replace( '/[^A-Z]/', '', $rows['group_id']);
  582. $group_floor_num = preg_replace( '/[^1-9]/', '', $rows['group_id']);
  583. if($group_floor_type == 'B')
  584. {
  585. $data['seat_no'] = '-' . $group_floor_num . '_0' . substr($rows['pksno'], -3);
  586. }
  587. else
  588. {
  589. $group_floor_num = str_pad($group_floor_num, 2, '0', STR_PAD_LEFT);
  590. $data['seat_no'] = $group_floor_num . '_0' . substr($rows['pksno'], -3);
  591. }
  592. }
  593. else
  594. {
  595. $data['seat_no'] = 'XX_XXXX';
  596. }
  597. // 查詢是否月租會員
  598. $result = $this->db->select("date_format(start_date, '%Y/%m/%d') as start_date, date_format(end_date,'%Y/%m/%d') as end_date")
  599. ->from('members')
  600. ->where(array('lpr' => $lpr, 'end_date >=' => $this->vars['date_time']), false)
  601. ->limit(1)
  602. ->get()
  603. ->row_array();
  604. if (!empty($result['start_date'])) // 月租會員
  605. {
  606. $data['ticket'] = 1;
  607. $data['start_date'] = $result['start_date'];
  608. $data['end_date'] = $result['end_date'];
  609. $data['start_time'] = '00:00';
  610. $data['end_time'] = '23:59';
  611. }
  612. else // 臨停車
  613. {
  614. $data['ticket'] = 0;
  615. $data['start_date'] = '2000/01/01';
  616. $data['end_date'] = '2000/01/01';
  617. $data['start_time'] = '00:00';
  618. $data['end_time'] = '00:00';
  619. }
  620. $result = $this->db->select("in_time, date_format(pay_time, '%Y/%m/%d %T') as pay_time, in_pic_name, member_no, station_no")
  621. ->from('cario')
  622. ->where(array('obj_type' => 1, 'obj_id' => $lpr, 'finished' => 0, 'err' => 0, 'ticket_type != ' => 3))
  623. ->order_by('cario_no', 'desc')
  624. ->limit(1)
  625. ->get()
  626. ->row_array();
  627. if (!empty($result['in_time']))
  628. {
  629. trigger_error("aps查詢入場時間|{$lpr}|{$result['in_time']}|{$result['in_pic_name']}");
  630. $data['in_time'] = $result['in_time'];
  631. $data['pay_time'] = !empty($result['pay_time']) ? $result['pay_time'] : '2000/01/01 00:00:00';
  632. $data['in_pic_name'] = $this->gen_in_pic_path($result);
  633. $data['records'] = 1;
  634. }
  635. else
  636. {
  637. $data['in_time'] = '';
  638. $data['pay_time'] = '2000/01/01 00:00:00';
  639. $data['in_pic_name'] = '';
  640. $data['records'] = 0;
  641. }
  642. trigger_error("aps查詢入場時間[{$lpr}]:".print_r($data, true));
  643. // return array('in_time' => '', 'in_pic_name' => '', 'records' => 0, 'ticket' => 0, 'seat_no' => 'XX_XXXX');
  644. return $data;
  645. }
  646. // 行動設備查詢入場時間
  647. // http://203.75.167.89/carpayment.html/m2query_in/ABC1234/12112/1f3870be274f6c49b3e31a0c6728957f
  648. // http://203.75.167.89/carpayment.html/m2query_in/車牌/場站編號/MD5
  649. // 回傳0: 失敗, 成功: 12345,60(第一欄位非0數字代表成功, 第二欄位為金額), 此值在付款時必需傳回, 否則視為非法
  650. public function m2query_in($parms)
  651. {
  652. $result = $this->db->select('cario_no, out_before_time')
  653. ->from('cario')
  654. ->where(array('obj_type' => 1, 'obj_id' => $parms['lpr'], 'station_no' => $parms['station_no'], 'finished' => 0, 'err' => 0))
  655. ->order_by('cario_no', 'desc')
  656. ->limit(1)
  657. ->get()
  658. ->row_array();
  659. if (!empty($result['cario_no']))
  660. {
  661. trigger_error("行動設備查詢入場時間成功|{$lpr}|{$result['cario_no']}|{$result['in_time']}");
  662. // call計費模組
  663. $amt = 10;
  664. }
  665. else
  666. {
  667. $result['cario_no'] = 0;
  668. $amt = 0;
  669. trigger_error('行動設備查詢入場時間失敗'.print_r($parms, true));
  670. }
  671. return "{$result['cario_no']},{$amt}";
  672. }
  673. // 臨停未結清單
  674. public function cario_temp_not_finished_query_all($station_no, $q_item, $q_str)
  675. {
  676. $where_station = $station_no == 0 ? '' : " station_no = {$station_no} and "; // 如為0, 則全部場站讀取
  677. switch($q_item)
  678. {
  679. case 'in_time':
  680. $items = "{$q_item} >=";
  681. $q_str .= ' 23:59:59';
  682. break;
  683. case 'lpr':
  684. $items = "{$q_item} like ";
  685. $q_str = strtoupper($q_str).'%';
  686. break;
  687. default:
  688. $items = "{$q_item} like ";
  689. $q_str .= '%';
  690. break;
  691. }
  692. $sql = "
  693. SELECT
  694. cario_no,
  695. station_no,
  696. obj_id as lpr,
  697. in_time,
  698. out_before_time,
  699. pay_time
  700. FROM cario
  701. WHERE
  702. {$where_station} {$items} '{$q_str}'
  703. and obj_type = 1 and finished = 0 and err = 0 and confirms = 0
  704. and member_no = 0
  705. and out_time is null
  706. ORDER BY cario.cario_no asc
  707. ";
  708. //trigger_error(__FUNCTION__ . "test sql: {$sql}");
  709. $results = $this->db->query($sql)->result_array();
  710. return $results;
  711. }
  712. }