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

Carpayment_model.php 26KB

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