VM暫存
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

400 líneas
15KB

  1. <?php
  2. /*
  3. file: pks_model.php 車位在席資料庫處理模組
  4. */
  5. require_once(MQ_CLASS_FILE);
  6. class Pks_model extends CI_Model
  7. {
  8. var $vars = array();
  9. function __construct()
  10. {
  11. parent::__construct();
  12. $this->load->database();
  13. }
  14. public function init($vars)
  15. {
  16. $this->vars = $vars;
  17. if(isset($this->vars['mqtt_ip']) && isset($this->vars['mqtt_port']))
  18. {
  19. // 一般
  20. $this->vars['mqtt'] = new phpMQTT($this->vars['mqtt_ip'], $this->vars['mqtt_port'], uniqid(). 'mqtt');
  21. $this->vars['mqtt']->connect();
  22. }
  23. }
  24. // 結束
  25. public function stop()
  26. {
  27. if(isset($this->vars['mqtt']))
  28. {
  29. $this->vars['mqtt']->close();
  30. }
  31. }
  32. // 車輛進出傳入車牌號碼
  33. public function pksio($parms)
  34. {
  35. switch($parms['io'])
  36. {
  37. case 'KL': // 車輛入席車辨(lpr)及圖檔
  38. if ($parms['lpr'] == 'NONE') // 在席車辨失敗, 不處理
  39. {
  40. trigger_error('在席車辨失敗' . print_r($parms, true));
  41. return false;
  42. }
  43. // 讀取在席資料(pks)
  44. $rows_pks = $this->db
  45. ->select('cario_no, lpr, status, confirms')
  46. ->from('pks')
  47. ->where(array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']))
  48. ->limit(1)
  49. ->get()
  50. ->row_array();
  51. trigger_error('KL read pks:'.print_r($rows_pks, true));
  52. // 如果已經人工確認或之前已比對有入場資料者, 則重覆再送來的車辨不予理會
  53. if ($rows_pks['confirms'] == 1 || $rows_pks['lpr'] == $parms['lpr'])
  54. {
  55. trigger_error('KL ignored:'.$rows_pks['lpr']);
  56. return false;
  57. }
  58. /*
  59. if ($rows_pks['cario_no'] != 0 || $rows_pks['confirms'] == 1 || $rows_pks['lpr'] == $parms['lpr'])
  60. {
  61. trigger_error('人工已確認或車號相同不更新pks:'.$rows_pks['lpr']);
  62. return false;
  63. }
  64. */
  65. // 讀取進場時間, 如讀不到資料, 以目前時間取代(add by TZUSS 2016-02-23)
  66. $rows_cario = $this->db
  67. ->select('cario_no, in_time')
  68. ->from('cario')
  69. ->where(array('in_out' => 'CI', 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0, 'station_no' => $parms['sno']))
  70. ->order_by('cario_no', 'desc')
  71. ->limit(1)
  72. ->get()
  73. ->row_array();
  74. if (!empty($rows_cario['cario_no'])) // 有入場資料
  75. {
  76. $cario_no = $rows_cario['cario_no']; // 入場序號
  77. $in_time = $rows_cario['in_time'];
  78. // 在席與入場資料相符, 分別在cario與pks記錄之
  79. $data_cario = array
  80. (
  81. 'pksno' => $parms['pksno'],
  82. 'pks_time' => date('Y-m-d H:i:s')
  83. );
  84. $this->db->update('cario', $data_cario, array('cario_no' => $cario_no, 'station_no' => $parms['sno']));
  85. }
  86. else // 查無入場資料, 即時通知
  87. {
  88. $cario_no = 0;
  89. $in_time = date('Y-m-d H:i:s');
  90. /*
  91. $jdata = json_encode(array
  92. (
  93. 'pksno' => $parms['pksno'],
  94. 'lpr' => $parms['lpr'],
  95. 'in_time' => $in_time
  96. ,'pic_name' => $parms['pic_name']
  97. ), JSON_UNESCAPED_UNICODE);
  98. */
  99. // $this->vars['mqtt']-lish('PKS_WITHOUT_IN', "{$jdata}", 0); // 待web完成 ???
  100. trigger_error('在席無進場資料:'. print_r($parms, true));
  101. }
  102. // upd 2017/11/11避免圖檔拿不到
  103. $new_file_name = "pks-{$parms['pksno']}-{$parms['lpr']}-{$parms['ivsno']}-" . date('Ymd') .".jpg";
  104. $test_check_str = file_exists(PKS_PIC . $new_file_name) ? 'exists' : 'not_exists';
  105. trigger_error(__FUNCTION__ . '..' . PKS_PIC . $new_file_name . '..' . $test_check_str);
  106. // 車入格後的車牌辨識(lpr), 傅送圖檔
  107. //array_map('unlink', glob(PKS_PIC."pks-{$parms['pksno']}-*.jpg")); // 刪除舊照片
  108. // 清除舊照片
  109. foreach(glob(PKS_PIC."pks-{$parms['pksno']}-*.jpg") as $old_file_path)
  110. {
  111. if($old_file_path != PKS_PIC . $new_file_name)
  112. {
  113. unlink($old_file_path);
  114. trigger_error('remove old image:'. $old_file_path. ', replace by: ' . $new_file_name);
  115. }
  116. }
  117. $parms['pic_name'] = $new_file_name;
  118. if(!file_exists(PKS_PIC . $new_file_name))
  119. {
  120. $config['upload_path'] = PKS_PIC;
  121. $config['allowed_types'] = 'gif|jpg|png';
  122. // ex. pks-2016-1625AB-1-2015080526.jpg -> pks-車位編號-車號-設備編號-時間.jpg
  123. //$config['file_name'] = "pks-{$parms['pksno']}-{$parms['lpr']}-{$parms['ivsno']}-{$this->vars['time_num']}.jpg";
  124. $config['file_name'] = $new_file_name;
  125. $this->load->library('upload', $config);
  126. if($this->upload->do_upload('cars'))
  127. {
  128. // 若無錯誤,則上傳檔案
  129. $file = $this->upload->data('cars');
  130. }
  131. else
  132. {
  133. trigger_error('入席傳檔錯誤:'. print_r($parms, true));
  134. }
  135. }
  136. $data = array
  137. (
  138. 'cario_no' => $cario_no,
  139. 'lpr' => $parms['lpr'],
  140. 'status' => 'LR', // 車格佔用並有車號
  141. 'confirms' => 0, // 預設人工未確認
  142. 'pic_name' => $parms['pic_name'],
  143. 'in_time' => $in_time
  144. );
  145. // 車號及照片檔名填入資料庫內
  146. $this->db->update('pks', $data, array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']));
  147. break;
  148. case 'KI': // 車輛入席, 各區空車位與佔位各加減1
  149. $rows = $this->db->select('status')
  150. ->from('pks')
  151. ->where(array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']))
  152. ->get()
  153. ->row_array();
  154. // if (!empty($rows['status']) && $rows['status'] == 'LR') break; // 仍有車在席, 不應再有KI, ignore
  155. if (!empty($rows['status']) && $rows['status'] == 'LR') return true; // 仍有車在席, 不應再有KI, ignore
  156. $data = array
  157. (
  158. 'cario_no' => 0,
  159. 'lpr' => '',
  160. 'status' => 'OC', // 車格佔用但尚無車號
  161. 'confirms' => 0,
  162. 'pic_name' => '',
  163. 'in_time' => null
  164. );
  165. $this->db->update('pks', $data, array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']));
  166. break;
  167. case 'KO': // 車輛離席, 各區空車位與佔位各加減1
  168. $data = array
  169. (
  170. 'cario_no' => 0,
  171. 'lpr' => '',
  172. 'status' => 'VA', // 車格佔用但尚無車號
  173. 'confirms' => 0,
  174. 'pic_name' => '',
  175. 'in_time' => null
  176. );
  177. $this->db->update('pks', $data, array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']));
  178. break;
  179. }
  180. /*
  181. // 找出與與此車位相關的群組
  182. $sql = "select group_id, tot, renum
  183. from pks_groups
  184. where group_id in
  185. (select group_id from pks_group_member where station_no = {$this->vars['station_no']} and pksno = {$parms['pksno']})";
  186. $retults = $this->db->query($sql)->result_array();
  187. foreach ($retults as $rows)
  188. {
  189. // 計算群組異動後的空車位數, 先讀出已停車位數
  190. $sql = "select count(*) as parked from pks where status != 'VA' and pksno in (select pksno from pks_group_member where group_id = '{$rows['group_id']}')";
  191. $row_group = $this->db->query($sql)->row_array();
  192. $group_va = $rows['tot'] + $rows['renum'] - $row_group['parked']; // 群組空車位數
  193. $this->db->update('pks_groups', array('parked' => $row_group['parked'], 'availables' => $group_va), array('group_id' => $rows['group_id']));
  194. get_headers("http://192.168.51.15/set_num.php?group_id={$rows['group_id']}&num={$group_va}");
  195. // $this->vars['mqtt']->publish("VA-{$rows['group_id']}", "{$group_va}", 0); // 送出剩餘車位數給字幕機
  196. // 總車位數暫無需處理
  197. }
  198. */
  199. // 找出與與此車位相關的群組
  200. $sql = "select group_id, tot, renum, availables
  201. from pks_groups
  202. where group_id in
  203. (select group_id from pks_group_member where station_no = {$parms['sno']} and pksno = {$parms['pksno']})";
  204. $retults = $this->db->query($sql)->result_array();
  205. foreach ($retults as $rows)
  206. {
  207. // 計算群組異動後的空車位數, 先讀出已停車位數
  208. $sql = "select count(*) as parked from pks where status != 'VA' and pksno in (select pksno from pks_group_member where group_id = '{$rows['group_id']}')";
  209. $row_group = $this->db->query($sql)->row_array();
  210. $group_va = $rows['tot'] + $rows['renum'] - $row_group['parked']; // 群組空車位數
  211. // 有變動才處理更新
  212. if($rows['availables'] != $group_va)
  213. {
  214. // 防止負值
  215. if($group_va < 0){
  216. $group_va = 0;
  217. }
  218. $group_va_pad = str_pad($group_va, 3, '0', STR_PAD_LEFT); // 補零
  219. $this->db->update('pks_groups', array('parked' => $row_group['parked'], 'availables' => $group_va), array('group_id' => $rows['group_id']));
  220. $this->vars['mqtt']->publish(MQ_TOPIC_SUBLEVEL, "{$rows['group_id']},{$group_va_pad}", 0); // 送出剩餘車位數給字幕機
  221. // 總車位數暫無需處理
  222. // 七樓無在席, 手動或用猜的
  223. /*
  224. $f7_total = 74;
  225. $sql = "select renum from pks_groups where group_id = 'F7'";
  226. $row_group = $this->db->query($sql)->row_array();
  227. $f7_renum = $row_group['renum'];
  228. $total_parked_sql = "select count(cario_no) as parked
  229. from cario where
  230. cario.in_time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 DAY)
  231. and cario.finished = 0
  232. and cario.err = 0
  233. and cario.in_out = 'CI'
  234. and cario.out_time is null";
  235. $total_parked_row_group = $this->db->query($total_parked_sql)->row_array();
  236. $sql = "select count(pksno) as parked from pks where status != 'VA'";
  237. $row_group = $this->db->query($sql)->row_array();
  238. $f7_mqtt = $total_parked_row_group['parked'] - $row_group['parked'];
  239. if($f7_mqtt > $f7_total){
  240. $f7_mqtt = $f7_total;
  241. }else if($f7_mqtt <= 0){
  242. $f7_mqtt = 0;
  243. }
  244. $this->db->update('pks_groups', array('parked' => $f7_mqtt, 'availables' => $f7_total - $f7_mqtt + $f7_renum), array('group_id' => 'F7'));
  245. $f7_mqtt_pad = str_pad($f7_total - $f7_mqtt + $f7_renum, 3, '0', STR_PAD_LEFT);
  246. $this->vars['mqtt']->publish(MQ_TOPIC_SUBLEVEL, "F7,{$f7_mqtt_pad}", 0); // F7 MQTT
  247. */
  248. }
  249. }
  250. }
  251. // 重新計算
  252. public function reculc()
  253. {
  254. // 找出與與此車位相關的群組
  255. $sql = "select group_id, tot, renum
  256. from pks_groups";
  257. $retults = $this->db->query($sql)->result_array();
  258. foreach ($retults as $rows)
  259. {
  260. // 計算群組異動後的空車位數, 先讀出已停車位數
  261. $sql = "select count(*) as parked from pks where status != 'VA' and pksno in (select pksno from pks_group_member where group_id = '{$rows['group_id']}')";
  262. $row_group = $this->db->query($sql)->row_array();
  263. $group_va = $rows['tot'] + $rows['renum'] - $row_group['parked']; // 群組空車位數
  264. $this->db->update('pks_groups', array('parked' => $row_group['parked'], 'availables' => $group_va), array('group_id' => $rows['group_id']));
  265. // $this->vars['mqtt']->publish("VA-{$rows['group_id']}", "{$group_va}", 0); // 送出剩餘車位數給字幕機
  266. get_headers("http://192.168.51.15/set_num.php?group_id={$rows['group_id']}&num={$group_va}");
  267. echo "group_id:{$rows['group_id']}, tot:{$rows['tot']}, availables:{$group_va}, parked:{$row_group['parked']}, renum:{$rows['renum']}<br />";
  268. }
  269. }
  270. // 取得所有車位使用狀態
  271. public function query_station_status($station_no)
  272. {
  273. /* 沒有group_id, pks不能直接用, 要多撈兩張表
  274. $sql = "select pksno, posx, posy, in_time
  275. FROM pks
  276. WHERE station_no = '".$station_no."' and lpr != ''";
  277. */
  278. $sql = "SELECT pks.pksno AS pksno, pks.posx AS posx, pks.posy AS posy, pks.in_time AS in_time,
  279. pks_groups.group_id AS group_id
  280. FROM pks
  281. LEFT JOIN pks_group_member ON pks.pksno = pks_group_member.pksno AND pks.station_no = pks_group_member.station_no
  282. LEFT JOIN pks_groups ON pks_group_member.group_id = pks_groups.group_id
  283. WHERE pks.lpr != '' AND pks.station_no = '".$station_no."' AND pks_groups.group_type = '1' ";
  284. $retults = $this->db->query($sql)->result_array();
  285. $currentTime = new DateTime("now");
  286. foreach ($retults as $idx => $rows)
  287. {
  288. $startTime = new DateTime($rows['in_time']); // 進場時間
  289. $interval = $startTime->diff($currentTime);
  290. $status = $this->gen_pks_s($interval); // 一般:0, 隔日:1, 超過3日:3, 隔週:7, 隔20日:20
  291. $data['result'][$idx] = array
  292. (
  293. 'g'=> $rows['group_id'],
  294. 'id'=> $rows['pksno'],
  295. 'x' => $rows['posx'],
  296. 'y' => $rows['posy'],
  297. 's' => $status
  298. );
  299. }
  300. return $data;
  301. }
  302. // 取得車位狀態
  303. private function gen_pks_s($interval)
  304. {
  305. $status = 0; // 一般:0, 隔日:1, 超過3日:3, 隔週:7, 隔20日:20
  306. if($interval->y > 0 || $interval->m > 0 || $interval->d >= 20){
  307. $status = 20;
  308. }else if($interval->d >= 7){
  309. $status = 7;
  310. }else if($interval->d >= 3){
  311. $status = 3;
  312. }else if($interval->d >= 1){
  313. $status = 1;
  314. }
  315. return $status;
  316. }
  317. // 取得指定車位使用狀態
  318. public function query_station_pks($station_no, $pksno)
  319. {
  320. $sql = "SELECT pks.pksno AS pksno, pks.lpr AS lpr, pks.in_time AS in_time, pks.station_no AS station_no,
  321. pks_groups.group_id AS group_id, pks_groups.group_name AS group_name, pks_groups.group_type AS type
  322. FROM pks
  323. LEFT JOIN pks_group_member ON pks.pksno = pks_group_member.pksno AND pks.station_no = pks_group_member.station_no
  324. LEFT JOIN pks_groups ON pks_group_member.group_id = pks_groups.group_id
  325. WHERE pks.pksno = '".$pksno."' AND pks.station_no = '".$station_no."' AND pks_groups.group_type = '1' ";
  326. $retults = $this->db->query($sql)->result_array();
  327. $currentTime = new DateTime("now");
  328. foreach ($retults as $idx => $rows)
  329. {
  330. $startTime = new DateTime($rows['in_time']); // 進場時間
  331. $interval = $startTime->diff($currentTime);
  332. $status = $this->gen_pks_s($interval); // 一般:0, 隔日:1, 超過3日:3, 隔週:7, 隔20日:20
  333. $data['result'][$idx] = array
  334. (
  335. 'pksno'=> $rows['pksno'],
  336. 'lpr' => $rows['lpr'],
  337. 'time' => $rows['in_time'],
  338. 'station_no' => $rows['station_no'],
  339. 'group_id' => $rows['group_id'],
  340. 'group_name' => $rows['group_name'],
  341. 'status' => $status
  342. );
  343. }
  344. return $data;
  345. }
  346. }