VM暫存
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Carpark.php 33KB

8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. <?php
  2. /*
  3. file: carpark.php 停車管理
  4. */
  5. if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  6. require_once(MQ_CLASS_FILE);
  7. // ----- 定義常數(路徑, cache秒數) -----
  8. define('APP_VERSION', '100'); // 版本號
  9. define('MAX_AGE', 604800); // cache秒數, 此定義1個月
  10. define('APP_NAME', 'carpark'); // 應用系統名稱
  11. define('PAGE_PATH', APP_BASE.'ci_application/views/'.APP_NAME.'/'); // path of views
  12. //define('SERVER_URL', 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost').'/'); // URL
  13. define('SERVER_URL', 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost') . ($_SERVER['SERVER_PORT'] != 60123 ? ':' . $_SERVER['SERVER_PORT'] : '') .'/'); // URL
  14. define('APP_URL', SERVER_URL.APP_NAME.'.html/'); // controller路徑
  15. define('WEB_URL', SERVER_URL.APP_NAME.'/'); // 網頁路徑
  16. define('WEB_LIB', SERVER_URL.'libs/'); // 網頁lib
  17. define('BOOTSTRAPS', WEB_LIB.'bootstrap_sb/'); // bootstrap lib
  18. define('LOG_PATH', FILE_BASE.APP_NAME.'/logs/'); // log path
  19. class Carpark extends CI_Controller
  20. {
  21. var $vars = array(); // 共用變數
  22. function __construct()
  23. {
  24. parent::__construct();
  25. // ----- 程式開發階段log設定 -----
  26. if (@ENVIRONMENT == 'development')
  27. {
  28. ini_set('display_errors', '1');
  29. //error_reporting(E_ALL ^ E_NOTICE);
  30. error_reporting(E_ALL);
  31. }
  32. set_error_handler(array($this, 'error_handler'), E_ALL); // 資料庫異動需做log
  33. // 共用記憶體
  34. $this->vars['mcache'] = new Memcache;
  35. $this->vars['mcache']->connect(MEMCACHE_HOST, MEMCACHE_PORT) or die ('Could not connect memcache');
  36. /*
  37. // mqtt subscribe
  38. $this->vars['mqtt'] = new phpMQTT(MQ_HOST, MQ_PORT, uniqid());
  39. //if(!$this->vars['mqtt']->connect()){ die ('Could not connect mqtt'); }
  40. $this->vars['mqtt']->connect();
  41. */
  42. $this->load->model('carpark_model');
  43. $this->carpark_model->init($this->vars);
  44. // 資料介接模組
  45. $this->load->model('sync_data_model');
  46. $this->sync_data_model->init($this->vars); // for memcache
  47. // mqtt subscribe
  48. $station_setting = $this->sync_data_model->station_setting_query();
  49. $mqtt_ip = isset($station_setting['mqtt_ip']) ? $station_setting['mqtt_ip'] : MQ_HOST;
  50. $mqtt_port = isset($station_setting['mqtt_port']) ? $station_setting['mqtt_port'] : MQ_PORT;
  51. $this->vars['mqtt'] = new phpMQTT($mqtt_ip, $mqtt_port, uniqid());
  52. $this->vars['mqtt']->connect();
  53. // init again
  54. $this->sync_data_model->init($this->vars); // for mqtt
  55. // 產生 excel 報表
  56. $this->load->model('excel_model');
  57. $this->excel_model->init($this->vars);
  58. // [START] 2016/06/03 登入
  59. $this->load->model('user_model');
  60. // load library
  61. $this->load->library(array('form_validation','session'));
  62. // load helpers
  63. $this->load->helper(array('form'));
  64. // ajax code
  65. define('RESULT_SUCCESS', 'ok');
  66. define('RESULT_FORM_VALIDATION_FAIL', '-1');
  67. define('RESULE_FAIL', 'gg');
  68. // [START] 2016/06/03 登入
  69. }
  70. // 發生錯誤時集中在此處理
  71. public function error_handler($errno, $errstr, $errfile, $errline, $errcontext)
  72. {
  73. // ex: car_err://message....
  74. $log_msg = explode('://', $errstr);
  75. if (count($log_msg) > 1)
  76. {
  77. $log_file = LOG_PATH.$log_msg[0];
  78. $str = date('H:i:s')."|{$log_msg[1]}|{$errfile}|{$errline}|{$errno}\n";
  79. }
  80. else
  81. {
  82. $log_file = LOG_PATH.APP_NAME;
  83. $str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n";
  84. }
  85. //$str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n";
  86. error_log($str, 3, $log_file . '.' . date('Ymd').'.log.txt'); // 3代表參考後面的檔名
  87. }
  88. // 顯示靜態網頁(html檔)
  89. protected function show_page($page_name, &$data = null)
  90. {
  91. $page_file = PAGE_PATH.$page_name.'.php';
  92. $last_modified_time = filemtime($page_file);
  93. // 若檔案修改時間沒有異動, 或版本無異動, 通知瀏覽器使用cache, 不再下傳網頁
  94. // header('Cache-Control:max-age='.MAX_AGE); // cache 1個月
  95. header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_modified_time).' GMT');
  96. header('Etag: '. APP_VERSION);
  97. header('Cache-Control: public');
  98. // 20170921
  99. header("cache-Control: no-store, no-cache, must-revalidate");
  100. header("cache-Control: post-check=0, pre-check=0", false);
  101. header("Pragma: no-cache");
  102. header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
  103. if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == APP_VERSION && @strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time)
  104. {
  105. header('HTTP/1.1 304 Not Modified');
  106. }
  107. else
  108. {
  109. $this->load->view(APP_NAME.'/'.$page_name, $data);
  110. }
  111. }
  112. // ------------------------------------------------
  113. //
  114. // CRM (START)
  115. //
  116. // ------------------------------------------------
  117. // [test] zzz
  118. public function gen_test_case()
  119. {
  120. $sno = '12302';
  121. $ivsno = 0;
  122. $io = 'CI';
  123. $lpr = 'TEST1109A';
  124. $ts = date('YmdHis');
  125. $parms = array();
  126. $parms['sno'] = $sno;
  127. $parms['ivsno'] = $ivsno;
  128. $parms['io'] = $io;
  129. $parms['lpr'] = $lpr;
  130. $parms['ts'] = $ts;
  131. $function_name = 'remote_lprio';
  132. $ck = $this->gen_cms_ck($parms, $function_name);
  133. echo "http://localhost/carpark.html/{$function_name}/sno/{$sno}/ivsno/{$ivsno}/io/{$io}/type/C/lpr/{$lpr}/color/NONE/sq/0/ts/{$ts}/sq2/0/etag/NONE/ant/1/ck/{$ck}";
  134. echo "\n\n";
  135. $function_name = 'remote_opendoor_lprio';
  136. $ck = $this->gen_cms_ck($parms, $function_name);
  137. echo "http://localhost/carpark.html/{$function_name}/sno/{$sno}/ivsno/{$ivsno}/io/{$io}/type/C/lpr/{$lpr}/color/NONE/sq/0/ts/{$ts}/sq2/0/etag/NONE/ant/1/ck/{$ck}";
  138. echo "\n\n";
  139. $function_name = 'remote_opendoor_anyway';
  140. $ck = $this->gen_cms_ck($parms, $function_name);
  141. echo "http://localhost/carpark.html/{$function_name}/sno/{$sno}/ivsno/{$ivsno}/io/{$io}/lpr/{$lpr}/ts/{$ts}/ck/{$ck}";
  142. echo "\n\n";
  143. exit;
  144. }
  145. // 產生 CK
  146. function gen_cms_ck($parms, $function_name)
  147. {
  148. return md5($parms['sno']. 'a' . date('dmh') . 'l' . $parms['ts'] . 't'. $parms['lpr']. 'o'. $parms['ivsno'] . 'b'. $parms['io'] . $function_name);
  149. }
  150. // [remote] 新增車辨記錄
  151. public function remote_lprio()
  152. {
  153. $LOG_FLAG = 'cms://';
  154. $parms = $this->uri->uri_to_assoc(3);
  155. // ck
  156. if($parms['ck'] != $this->gen_cms_ck($parms, __FUNCTION__))
  157. {
  158. echo 'ck_error'; // 中斷
  159. exit;
  160. }
  161. $parms['lpr'] = urldecode($parms['lpr']);
  162. $parms['obj_type'] = 1;
  163. $parms['curr_time_str'] = date('Y-m-d H:i:s');
  164. $parms['pic_name'] = '';
  165. trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true));
  166. // 載入模組
  167. $this->load->model('cars_model');
  168. $this->cars_model->init($this->vars);
  169. $this->cars_model->lprio($parms);
  170. echo 'ok';
  171. exit;
  172. }
  173. // [remote] 車辨開門
  174. public function remote_opendoor_lprio()
  175. {
  176. $LOG_FLAG = 'cms://';
  177. $parms = $this->uri->uri_to_assoc(3);
  178. // ck
  179. if($parms['ck'] != $this->gen_cms_ck($parms, __FUNCTION__))
  180. {
  181. echo 'ck_error'; // 中斷
  182. exit;
  183. }
  184. $parms['lpr'] = urldecode($parms['lpr']);
  185. trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true));
  186. // 載入模組
  187. $this->load->model('cars_model');
  188. $this->cars_model->init($this->vars);
  189. $this->cars_model->opendoor_lprio($parms);
  190. echo 'ok';
  191. exit;
  192. }
  193. // [remote] 直接開門
  194. public function remote_opendoor_anyway()
  195. {
  196. $LOG_FLAG = 'cms://';
  197. $parms = $this->uri->uri_to_assoc(3);
  198. // ck
  199. if($parms['ck'] != $this->gen_cms_ck($parms, __FUNCTION__))
  200. {
  201. echo 'ck_error'; // 中斷
  202. exit;
  203. }
  204. $parms['lpr'] = urldecode($parms['lpr']);
  205. trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true));
  206. // 載入模組
  207. $this->load->model('cars_model');
  208. $this->cars_model->init($this->vars);
  209. // 判斷會員身份
  210. $rows = $this->cars_model->get_member($lpr);
  211. if ($rows['member_no'] == 0)
  212. {
  213. $this->cars_model->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},TICKET,{$parms['lpr']}"); // 臨停訊號
  214. }
  215. else
  216. {
  217. $this->cars_model->mq_send(MQ_TOPIC_OPEN_DOOR, "DO{$parms['ivsno']},OPEN,{$parms['lpr']}"); // 月租訊號
  218. }
  219. echo 'ok';
  220. exit;
  221. }
  222. // ------------------------------------------------
  223. //
  224. // 接收端 (START)
  225. //
  226. // ------------------------------------------------
  227. // [mqtt] 接收端
  228. public function mqtt_service()
  229. {
  230. $LOG_FLAG = 'mqtt://';
  231. $topic = $this->input->post('topic', true);
  232. $msg = $this->input->post('msg', true);
  233. $ck = $this->input->post('ck', true);
  234. if(md5($topic.'altob'.$msg) != $ck)
  235. {
  236. echo 'ck_error';
  237. exit;
  238. }
  239. trigger_error($LOG_FLAG . __FUNCTION__ . "|{$topic}|{$msg}");
  240. if($topic == 'altob.888.mqtt')
  241. {
  242. // 第一個場站編號 先不管場站
  243. $station_setting = $this->sync_data_model->station_setting_query();
  244. $station_no_arr = explode(SYNC_DELIMITER_ST_NO, $station_setting['station_no']);
  245. $first_station_no = $station_no_arr[0];
  246. $msg_arr = explode(',', $msg);
  247. if(sizeof($msg_arr) != 4)
  248. {
  249. trigger_error($LOG_FLAG . __FUNCTION__ . "..error_size.." . print_r($msg_arr, true));
  250. echo 'error_size';
  251. exit;
  252. }
  253. if($msg_arr[0] != 'N888' || $msg_arr[3] != 'altob')
  254. {
  255. trigger_error($LOG_FLAG . __FUNCTION__ . "..unknown_msg.." . print_r($msg_arr, true));
  256. echo 'unknown_msg';
  257. exit;
  258. }
  259. $msg_arr = explode(',', $msg);
  260. $group_id = isset($msg_arr[1]) && $msg_arr[1] == 2 ? 'M888' : 'C888';
  261. $value = isset($msg_arr[2]) ? $msg_arr[2] : 0;
  262. $result = $this->sync_data_model->force_sync_888($first_station_no, $group_id, $value);
  263. trigger_error($LOG_FLAG . __FUNCTION__ . "..{$first_station_no}|{$group_id}|{$value}..result..{$result}..");
  264. }
  265. echo 'ok';
  266. exit;
  267. }
  268. // [設定檔] 取得設定
  269. public function station_setting_query()
  270. {
  271. $reload = $this->input->post('reload', true);
  272. if(isset($reload) && $reload > 0)
  273. {
  274. $station_setting = $this->sync_data_model->station_setting_query(true); // 強制重新載入
  275. trigger_error(__FUNCTION__ . '..station_setting: '. print_r($station_setting, true));
  276. if(!$station_setting)
  277. {
  278. echo json_encode('fail', JSON_UNESCAPED_UNICODE);
  279. exit; // 中斷
  280. }
  281. $info = array('station_no_arr' => $station_setting['station_no']);
  282. usleep(300000); // 0.3 sec delay
  283. // 費率資料同步
  284. $result = $this->sync_data_model->sync_price_plan($info);
  285. trigger_error(__FUNCTION__ . '..sync_price_plan: '. $result);
  286. usleep(300000); // 0.3 sec delay
  287. // 會員資料同步
  288. $result = $this->sync_data_model->sync_members($info);
  289. trigger_error(__FUNCTION__ . '..sync_members: '. $result);
  290. usleep(300000); // 0.3 sec delay
  291. // 在席資料同步
  292. $result = $this->sync_data_model->sync_pks_groups_reload($station_setting);
  293. trigger_error(__FUNCTION__ . '..sync_pks_groups_reload: '. $result);
  294. }
  295. else
  296. {
  297. $station_setting = $this->sync_data_model->station_setting_query(false);
  298. if(!$station_setting)
  299. {
  300. echo json_encode('fail', JSON_UNESCAPED_UNICODE);
  301. exit; // 中斷
  302. }
  303. }
  304. echo json_encode($station_setting, JSON_UNESCAPED_UNICODE);
  305. }
  306. // [排程 or 強制] 同步場站資訊
  307. public function sync_station_data()
  308. {
  309. trigger_error(__FUNCTION__ . '..from..'. $this->my_ip() .'..network..'); // IP 會浮動?
  310. $switch_lpr_arr = array(); // 換車牌
  311. $meta = $this->input->post('meta', true);
  312. if(!empty($meta))
  313. {
  314. trigger_error( __FUNCTION__ . '..meta_arr..' . $meta);
  315. $meta_arr = explode('@@@', $meta);
  316. foreach($meta_arr as $raw)
  317. {
  318. if(empty($raw))
  319. continue;
  320. $data = json_decode($raw, true);
  321. if($data['key'] == 'switch_lpr')
  322. {
  323. array_push($switch_lpr_arr, $data['value']);
  324. }
  325. }
  326. }
  327. // 0. 取得場站設定
  328. $station_setting = $this->sync_data_model->station_setting_query(false);
  329. trigger_error(__FUNCTION__ . '..station_setting: '. print_r($station_setting, true));
  330. $station_no_arr = array('station_no_arr' => $station_setting['station_no']);
  331. // 1. 月租系統
  332. $result = $this->sync_data_model->sync_members($station_no_arr);
  333. trigger_error(__FUNCTION__ . '..sync_members: '. $result);
  334. // 2. 同步車牌更換
  335. if(!empty($switch_lpr_arr))
  336. {
  337. $this->sync_data_model->sync_switch_lpr($switch_lpr_arr);
  338. }
  339. }
  340. // [API] 取得最新未結清
  341. public function get_last_unbalanced_cario()
  342. {
  343. trigger_error(__FUNCTION__ . '..from..'. $this->my_ip() .'..network..'); // IP 會浮動?
  344. $lpr = $this->input->post('lpr', true);
  345. $station_no = $this->input->post('station_no', true);
  346. $c_s = $this->input->post('c_s', true);
  347. // 確認正確性
  348. if(empty($c_s) || $c_s != md5('altob'.$lpr.'botla'.$station_no))
  349. {
  350. trigger_error(__FUNCTION__ . "..{$lpr}|".$station_no."|{$c_s}..check fail..");
  351. echo 'fail';
  352. exit;
  353. }
  354. $data = $this->sync_data_model->get_last_unbalanced_cario($lpr, $station_no);
  355. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  356. }
  357. // [API] 更新未結清 (行動支付)
  358. public function sync_m2payed()
  359. {
  360. trigger_error(__FUNCTION__ . '..from..'. $this->my_ip() .'..network..'); // IP 會浮動?
  361. $lpr = $this->input->post('lpr', true);
  362. $amt = $this->input->post('amt', true);
  363. $station_no = $this->input->post('station_no', true);
  364. $cario_no = $this->input->post('cario_no', true);
  365. $c_s = $this->input->post('c_s', true);
  366. // 確認正確性
  367. if(empty($c_s) || $c_s != md5($lpr.$amt.'altob'.$station_no.'botla'.$cario_no))
  368. {
  369. trigger_error(__FUNCTION__ . "..{$lpr}|{$amt}|{$station_no}|{$cario_no}|{$c_s}..check fail..");
  370. echo 'fail';
  371. exit;
  372. }
  373. // 臨停繳費
  374. $this->load->model('carpayment_model');
  375. echo $this->carpayment_model->p2payed(array('seqno' => $cario_no, 'lpr' => $lpr, 'amt' => $amt), true);
  376. exit;
  377. //echo 'ok';
  378. }
  379. // 驗証 IP
  380. function is_ip_valid()
  381. {
  382. $client_ip = $this->my_ip();
  383. if(!in_array($client_ip, array('61.219.172.11', '61.219.172.82')))
  384. {
  385. trigger_error('..block..from:'.$client_ip.'..unknown network..');
  386. return false;
  387. }
  388. return true;
  389. }
  390. // 取得 IP
  391. function my_ip()
  392. {
  393. if (getenv('HTTP_X_FORWARDED_FOR'))
  394. {
  395. $ip = getenv('HTTP_X_FORWARDED_FOR');
  396. }
  397. elseif (getenv('HTTP_X_REAL_IP'))
  398. {
  399. $ip = getenv('HTTP_X_REAL_IP');
  400. }
  401. else {
  402. $ip = $_SERVER['REMOTE_ADDR'];
  403. }
  404. return $ip;
  405. }
  406. // 同步 (由排程呼叫)
  407. public function sync_minutely()
  408. {
  409. $this->sync_data_model->sync_pks_groups(); // 同步在席現況
  410. }
  411. // 20170816 手動新增入場資料
  412. public function gen_carin()
  413. {
  414. trigger_error(__FUNCTION__ . '..from..'. $this->my_ip() .'..network..'); // IP 會浮動?
  415. $lpr = $this->input->post('lpr', true);
  416. $station_no = $this->input->post('station_no', true);
  417. $c_s = $this->input->post('c_s', true);
  418. // 確認正確性
  419. if(empty($c_s) || $c_s != md5($lpr.'altob'.$station_no.'botla'. __FUNCTION__ ))
  420. {
  421. trigger_error(__FUNCTION__ . "..{$lpr}|{$station_no}|{$c_s}..check fail..");
  422. echo 'fail';
  423. exit;
  424. }
  425. $parms = array(
  426. 'sno' => $station_no,
  427. 'lpr' => $lpr,
  428. 'etag' => 'NONE',
  429. 'io' => 'CI',
  430. 'ivsno' => 0
  431. );
  432. $this->carpark_model->gen_carin($parms);
  433. echo 'ok';
  434. }
  435. // ------------------------------------------------
  436. //
  437. // 接收端 (END)
  438. //
  439. // ------------------------------------------------
  440. // [START] 2016/06/03 登入
  441. public function index()
  442. {
  443. if($this->session->userdata('logged_in'))
  444. {
  445. $session_data = $this->session->userdata('logged_in');
  446. $data['username'] = $session_data['username'];
  447. $data['type'] = $session_data['type'];
  448. if($data['type'] == 'admin')
  449. {
  450. $this->show_page('admin_page', $data); // 進階管理者介面
  451. }
  452. else
  453. {
  454. $this->show_page('main_page', $data); // 一般
  455. }
  456. }
  457. else
  458. {
  459. //If no session, redirect to login page
  460. //redirect('login', 'refresh');
  461. $this->show_page('login_page');
  462. }
  463. }
  464. // 登入
  465. public function user_login()
  466. {
  467. // form_validation
  468. $this->form_validation->set_rules('login_name', 'login_name', 'trim|required');
  469. $this->form_validation->set_rules('pswd', 'pswd', 'trim|required');
  470. if($this->form_validation->run() == FALSE)
  471. {
  472. return RESULT_FORM_VALIDATION_FAIL;
  473. }
  474. // go model
  475. $data = array
  476. (
  477. 'login_name' => $this->input->post('login_name', true),
  478. 'pswd' => $this->input->post('pswd', true)
  479. );
  480. $result = $this->user_model->user_login($data);
  481. if($result)
  482. {
  483. $sess_array = array();
  484. foreach($result as $row)
  485. {
  486. $sess_array = array
  487. (
  488. 'username' => $row->login_name ,
  489. 'type' => $row->user_type
  490. );
  491. $this->session->set_userdata('logged_in', $sess_array);
  492. }
  493. echo RESULT_SUCCESS;
  494. }
  495. else
  496. {
  497. return RESULE_FAIL;
  498. }
  499. }
  500. // 登出
  501. public function user_logout()
  502. {
  503. $this->session->unset_userdata('logged_in');
  504. session_destroy();
  505. return RESULT_SUCCESS;
  506. }
  507. // [END] 2016/06/03 登入
  508. // response http
  509. protected function http_return($return_code, $type)
  510. {
  511. if ($type == 'text') echo $return_code;
  512. else echo json_encode($return_code, JSON_UNESCAPED_UNICODE);
  513. }
  514. // 送出html code
  515. public function get_html()
  516. {
  517. /*
  518. $data = array
  519. (
  520. 'company_no' => $this->input->post('company_no', true), // 場站統編
  521. 'hq_company_no' => '80682490'
  522. );
  523. $this->load->view(APP_NAME.'/'.$this->input->post('tag_name', true), $data);
  524. */
  525. $this->load->view(APP_NAME.'/'.$this->input->post('tag_name', true), array());
  526. }
  527. // 讀取cookie內容
  528. protected function get_cookie($cookie_name)
  529. {
  530. if (empty($_COOKIE[$cookie_name])) return array();
  531. return(json_decode($_COOKIE[$cookie_name], true));
  532. }
  533. // 儲存cookie內容
  534. protected function save_cookie($cookie_name, $cookie_info)
  535. {
  536. return setcookie($cookie_name, json_encode($cookie_info, JSON_UNESCAPED_UNICODE), 0, '/');
  537. }
  538. // 月租資料同步
  539. public function rent_sync()
  540. {
  541. $station_no = $this->input->post('station_no', true);
  542. $start_date = $this->input->post('start_date', true);
  543. $end_date = $this->input->post('end_date', true);
  544. // $data = $this->carpark_model->rent_sync($station_no, $start_date, $end_date);
  545. // print_r($data);
  546. }
  547. // 重設剩餘車位數
  548. public function available_set()
  549. {
  550. $data = $this->carpark_model->available_set();
  551. $this->http_return($data, 'json');
  552. }
  553. // 剩餘車位數更新
  554. public function available_update()
  555. {
  556. $station_no = $this->input->get_post('station_no', true);
  557. $data['name'] = $this->input->get_post('st_name', true);
  558. $data['tot_pkg'] = $this->input->get_post('tot_pkg', true);
  559. $data['ava_pkg'] = $this->input->get_post('ava_pkg', true);
  560. $this->http_return($this->carpark_model->available_update($station_no, $data), 'json');
  561. }
  562. // 剩餘車位數查核
  563. public function available_check()
  564. {
  565. $time_point = $this->input->get_post('time_point', true);
  566. $this->http_return($this->carpark_model->available_check($time_point), 'json');
  567. }
  568. // 顯示logs
  569. public function show_logs()
  570. {
  571. $lines = $this->uri->segment(3); // 顯示行數
  572. if (empty($lines)) $lines = 140; // 無行數參數, 預設為40行
  573. if($lines > 1000) $lines = 1000; // 最多 1000行
  574. // echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><pre style="white-space: pre-wrap;">';
  575. echo '<html lang="zh-TW"><body><pre style="white-space: pre-wrap;">';
  576. passthru('/usr/bin/tail -n ' . $lines . ' ' . LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt'); // 利用linux指令顯示倒數幾行的logs內容
  577. echo "\n----- " . LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt' . ' -----';
  578. echo '</pre></body></html>';
  579. }
  580. // 顯示logs (cars grep 888)
  581. public function show_888_logs()
  582. {
  583. $lines = $this->uri->segment(3); // 顯示行數
  584. if (empty($lines)) $lines = 1000; // 無行數參數, 預設為1000行
  585. if($lines > 20000) $lines = 20000; // 最多 20000行
  586. $grep_str = ' |grep 888';
  587. $target_str = LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt'. $grep_str;
  588. // echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><pre style="white-space: pre-wrap;">';
  589. echo '<html lang="zh-TW"><body><pre style="white-space: pre-wrap;">';
  590. passthru('/usr/bin/tail -n ' . $lines . ' ' . $target_str); // 利用linux指令顯示倒數幾行的logs內容
  591. echo "\n----- " . $target_str . ' -----';
  592. echo '</pre></body></html>';
  593. }
  594. // 新增月租資料
  595. public function member_add()
  596. {
  597. $data = array
  598. (
  599. 'member_no' => $this->input->post('member_no', true),
  600. 'station_no' => $this->input->post('station_no', true),
  601. 'lpr' => strtoupper($this->input->post('lpr', true)),
  602. 'old_lpr' => strtoupper($this->input->post('old_lpr', true)),
  603. 'etag' => strtoupper($this->input->post('etag', true)),
  604. 'start_date' => $this->input->post('start_date', true),
  605. 'end_date' => $this->input->post('end_date', true),
  606. 'member_name' => $this->input->post('member_name', true),
  607. 'member_nick_name' => $this->input->post('member_name', true),
  608. 'mobile_no' => $this->input->post('mobile_no', true),
  609. 'member_id' => $this->input->post('member_id', true),
  610. 'contract_no' => $this->input->post('contract_no', true),
  611. 'amt' => $this->input->post('amt', true),
  612. 'tel_h' => $this->input->post('tel_h', true),
  613. 'tel_o' => $this->input->post('tel_o', true),
  614. 'addr' => $this->input->post('addr', true)
  615. );
  616. trigger_error("add:".print_r($data, true));
  617. if ($data['member_no'] == 0 || $data['old_lpr'] != $data['lpr'])
  618. {
  619. if ($this->carpark_model->check_lpr($data['lpr']) > 0)
  620. {
  621. echo '車牌重複, 請查明再輸入';
  622. exit;
  623. }
  624. }
  625. $this->carpark_model->member_add($data);
  626. echo 'ok';
  627. }
  628. // 查詢月租資料
  629. public function member_query()
  630. {
  631. $data = $this->carpark_model->member_query();
  632. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  633. }
  634. // 刪除月租資料
  635. public function member_delete()
  636. {
  637. $member_no = $this->input->post('member_no', true);
  638. $this->carpark_model->member_delete($member_no);
  639. echo 'ok';
  640. }
  641. // 進出場現況表
  642. public function cario_list()
  643. {
  644. $data = $this->carpark_model->cario_list();
  645. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  646. }
  647. // 進出場事件即時顯示
  648. public function cario_event()
  649. {
  650. set_time_limit(0);
  651. while(true)
  652. {
  653. }
  654. }
  655. // 顯示圖檔(http://url/carpark.html/pics/lpr_ABY8873_O_0_0_C_20150919210022)
  656. public function pics()
  657. {
  658. // ???
  659. readfile(CAR_PIC.$this->uri->segment(3).'/'.str_replace('/', '', $this->uri->segment(4)).'.jpg');
  660. }
  661. // 汽車開門
  662. public function opendoors()
  663. {
  664. $ivsno = $this->uri->segment(3);
  665. $lanes = array
  666. (
  667. 0 => array ('devno' => 0, 'temp' => 0, 'member' => 1), // 1號入口, temp:臨停, member:月租
  668. // 1 => array ('devno' => 0, 'temp' => 2, 'member' => 3), // 2號調撥入口
  669. 1 => array ('devno' => 1, 'temp' => 0, 'member' => 1), // 3號調撥出口
  670. 2 => array ('devno' => 1, 'temp' => 0, 'member' => 1), // 3號調撥出口
  671. 3 => array ('devno' => 1, 'temp' => 2, 'member' => 3) // 4號出口
  672. );
  673. $url = 'http://admin:99999999@192.168.10.53/cgi-bin/basic_setting.cgi?ID=1&';
  674. $member_tag = 'member'; // member:月租會員
  675. // 短路開柵欄
  676. @get_headers("{$url}OUTDEV={$lanes[$ivsno]['devno']}&OUTCH={$lanes[$ivsno][$member_tag]}&OUTSTATUS=1");
  677. usleep(400000); // 暫停0.4秒
  678. // 斷路, 車過關柵欄
  679. @get_headers("{$url}OUTDEV={$lanes[$ivsno]['devno']}&OUTCH={$lanes[$ivsno][$member_tag]}&OUTSTATUS=0");
  680. }
  681. // 調撥車道查詢
  682. public function reversible_lane_query()
  683. {
  684. $max_lane = 4; // 共幾個車道數
  685. for ($idx = 0; $idx < $max_lane; ++$idx)
  686. {
  687. $data[$idx] = file_get_contents("http://192.168.10.51:8090/cgi-bin/switcher.cgi?id={$idx}&action=9");
  688. }
  689. // $data = array(1, 1, 0, 1);
  690. echo json_encode($data);
  691. }
  692. // 車號入場查詢
  693. public function carin_lpr_query()
  694. {
  695. $lpr = $this->uri->segment(3);
  696. $data = $this->carpark_model->carin_lpr_query($lpr);
  697. echo json_encode($data);
  698. }
  699. // 以時間查詢入場資訊
  700. public function carin_time_query()
  701. {
  702. $time_query = $this->input->post('time_query', true);
  703. $minutes_range = $this->input->post('minutes_range', true);
  704. $data = $this->carpark_model->carin_time_query($time_query, $minutes_range);
  705. echo json_encode($data);
  706. }
  707. // 調撥車道設定
  708. public function reversible_lane_set()
  709. {
  710. $lane_no = $this->input->post('lane_no', true);
  711. $actions = $this->input->post('actions', true);
  712. $data = file_get_contents("http://192.168.10.51:8090/cgi-bin/switcher.cgi?id={$lane_no}&action={$actions}");
  713. echo "{$lane_no}|{$actions}|{$data}";
  714. }
  715. // 在席車位檢查未有入場資料清單
  716. public function pks_check_list()
  717. {
  718. $max_rows = $this->uri->segment(3, 100); // 一次讀取筆數, 預設為100筆
  719. $data = $this->carpark_model->pks_check_list($max_rows);
  720. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  721. }
  722. // 重設在席查核
  723. public function reset_pks_check()
  724. {
  725. $data = $this->carpark_model->reset_pks_check();
  726. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  727. }
  728. // 更正在席車號
  729. public function correct_pks_lpr()
  730. {
  731. $pksno = $this->uri->segment(3, 0); // 車格號碼
  732. $lpr = $this->uri->segment(4, 'NONE'); // 車號
  733. if ($pksno == 0 || $lpr == 'NONE')
  734. {
  735. echo json_encode(array('err' => 1, 'cario_no' => 0), JSON_UNESCAPED_UNICODE);
  736. }
  737. else
  738. {
  739. $data = $this->carpark_model->correct_pks_lpr($pksno, $lpr);
  740. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  741. }
  742. }
  743. // 入場車號查核在席無資料清單
  744. public function carin_check_list()
  745. {
  746. $max_rows = $this->uri->segment(3, 20); // 一次讀取筆數, 預設為100筆
  747. $data = $this->carpark_model->carin_check_list($max_rows);
  748. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  749. }
  750. // 更正入場車號
  751. public function correct_carin_lpr()
  752. {
  753. $cario_no = $this->uri->segment(3, 0); // 車格號碼
  754. $lpr = $this->uri->segment(4, 'NONE'); // 車號
  755. $in_time = urldecode($this->uri->segment(5, '')); // 入場時間
  756. $data = $this->carpark_model->correct_carin_lpr($cario_no, $lpr, $in_time);
  757. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  758. }
  759. // 查詢行動支付記錄
  760. public function tx_bill_query()
  761. {
  762. $data = $this->carpark_model->tx_bill_query();
  763. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  764. }
  765. // 查詢月租繳款機記錄
  766. public function tx_bill_ats_query()
  767. {
  768. $data = $this->carpark_model->tx_bill_ats_query();
  769. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  770. }
  771. // 查詢樓層在席群組
  772. public function pks_group_query()
  773. {
  774. $data = $this->carpark_model->pks_group_query();
  775. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  776. }
  777. // 微調剩餘車位數
  778. public function pks_availables_update()
  779. {
  780. $group_id = $this->uri->segment(3); // id
  781. $value = $this->uri->segment(4, 0); // value
  782. $station_no = $this->uri->segment(5); // station_no
  783. $data = $this->sync_data_model->pks_availables_update($group_id, $value, true, $station_no);
  784. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  785. }
  786. // 進出場觸發 888 呼叫
  787. /*
  788. public function sync_888()
  789. {
  790. $io = $this->uri->segment(3); // CI, CO, MI, MO
  791. if(empty($io))
  792. {
  793. echo 'io_not_found';
  794. exit;
  795. }
  796. $parms = array('io' => $io, 'etag' => __FUNCTION__, 'lpr' => __FUNCTION__);
  797. echo $this->sync_data_model->sync_888($parms);
  798. exit;
  799. }
  800. */
  801. public function test()
  802. {
  803. //echo `whoami`;
  804. //echo phpinfo();
  805. }
  806. // 博辰測試用
  807. // http://localhost/carpark.html/test_8068_002/APK7310
  808. public function test_8068_002()
  809. {
  810. $lpr_in = $this->uri->segment(3);
  811. $seqno = '00001';
  812. $cmd = '002';
  813. $token = '000000000';
  814. $lpr = str_pad($lpr_in, 7, '%', STR_PAD_LEFT);
  815. $in_time = '2000/01/01 00:00:00';
  816. $error_str = '';
  817. $service_port = 8068;
  818. $address = "192.168.10.201";
  819. /* Create a TCP/IP socket. */
  820. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  821. if ($socket === false) {
  822. echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
  823. $error_str .= "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
  824. } else {
  825. echo "OK.\n";
  826. }
  827. echo "Attempting to connect to '{$address}' on port '{$service_port}'...";
  828. $result = socket_connect($socket, $address, $service_port);
  829. if ($result === false) {
  830. echo "socket_connect() failed.\nReason: ({$result}) " . socket_strerror(socket_last_error($socket)) . "\n";
  831. $error_str .= "socket_connect() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
  832. } else {
  833. echo "OK.\n";
  834. }
  835. $in = pack('Ca5Ca3Ca9Ca7Ca19', 0x1c, $seqno, 0x1c, $cmd, 0x1c,
  836. $token, 0x1f, $lpr, 0x1f, $in_time
  837. );
  838. $out = '';
  839. echo "socket_write:";
  840. echo "{$in}<br/><br/>";
  841. if(!socket_write($socket, $in, strlen($in)))
  842. {
  843. echo('<p>Write failed</p>');
  844. $error_str .= "socket_write() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
  845. }
  846. echo "socket_write..OK..";
  847. echo "<br/><br/>socket_read:";
  848. $out = socket_read($socket, 2048) or die("Could not read server responsen");
  849. //while ($out = socket_read($socket, 2048)) {
  850. // echo $out;
  851. //}
  852. echo "{$out}<br/><br/>";
  853. echo "Closing socket...";
  854. socket_close($socket);
  855. echo "OK.\n\n";
  856. trigger_error($error_str);
  857. exit;
  858. }
  859. // test
  860. public function test_phpexcel()
  861. {
  862. $query_year = 2017;
  863. $query_month = 3;
  864. //$this->excel_model->export_cario_data($query_year, $query_month);
  865. $this->excel_model->export_members();
  866. }
  867. }