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.

317 line
11KB

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