VM暫存
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

Pks_model.php 15KB

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