VM暫存
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

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