VM暫存
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

357 行
15KB

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