|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- <?php
- /*
- file: pks_model.php 車位在席資料庫處理模組
- */
-
- require_once(MQ_CLASS_FILE);
-
- class Pks_model extends CI_Model
- {
- var $vars = array();
-
- function __construct()
- {
- parent::__construct();
- $this->load->database();
- }
-
- public function init($vars)
- {
- $this->vars = $vars;
-
- if(isset($this->vars['mqtt_ip']) && isset($this->vars['mqtt_port']))
- {
- // 一般
- $this->vars['mqtt'] = new phpMQTT($this->vars['mqtt_ip'], $this->vars['mqtt_port'], uniqid(). 'mqtt');
- $this->vars['mqtt']->connect();
- }
- }
-
- // 結束
- public function stop()
- {
- if(isset($this->vars['mqtt']))
- {
- $this->vars['mqtt']->close();
- }
- }
-
-
- // 車輛進出傳入車牌號碼
- public function pksio($parms)
- {
- switch($parms['io'])
- {
- case 'KL': // 車輛入席車辨(lpr)及圖檔
- if ($parms['lpr'] == 'NONE') // 在席車辨失敗, 不處理
- {
- trigger_error('在席車辨失敗' . print_r($parms, true));
- return false;
- }
-
- // 讀取在席資料(pks)
- $rows_pks = $this->db
- ->select('cario_no, lpr, status, confirms')
- ->from('pks')
- ->where(array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']))
- ->limit(1)
- ->get()
- ->row_array();
-
- trigger_error('KL read pks:'.print_r($rows_pks, true));
-
- // 如果已經人工確認或之前已比對有入場資料者, 則重覆再送來的車辨不予理會
- if ($rows_pks['confirms'] == 1 || $rows_pks['lpr'] == $parms['lpr'])
- {
- trigger_error('KL ignored:'.$rows_pks['lpr']);
- return false;
- }
- /*
- if ($rows_pks['cario_no'] != 0 || $rows_pks['confirms'] == 1 || $rows_pks['lpr'] == $parms['lpr'])
- {
- trigger_error('人工已確認或車號相同不更新pks:'.$rows_pks['lpr']);
- return false;
- }
- */
-
- // 讀取進場時間, 如讀不到資料, 以目前時間取代(add by TZUSS 2016-02-23)
- $rows_cario = $this->db
- ->select('cario_no, in_time')
- ->from('cario')
- ->where(array('in_out' => 'CI', 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0, 'station_no' => $parms['sno']))
- ->order_by('cario_no', 'desc')
- ->limit(1)
- ->get()
- ->row_array();
- if (!empty($rows_cario['cario_no'])) // 有入場資料
- {
- $cario_no = $rows_cario['cario_no']; // 入場序號
- $in_time = $rows_cario['in_time'];
- // 在席與入場資料相符, 分別在cario與pks記錄之
- $data_cario = array
- (
- 'pksno' => $parms['pksno'],
- 'pks_time' => date('Y-m-d H:i:s')
- );
- $this->db->update('cario', $data_cario, array('cario_no' => $cario_no, 'station_no' => $parms['sno']));
- }
- else // 查無入場資料, 即時通知
- {
- $cario_no = 0;
- $in_time = date('Y-m-d H:i:s');
-
- /*
- $jdata = json_encode(array
- (
- 'pksno' => $parms['pksno'],
- 'lpr' => $parms['lpr'],
- 'in_time' => $in_time
- ,'pic_name' => $parms['pic_name']
- ), JSON_UNESCAPED_UNICODE);
- */
- // $this->vars['mqtt']-lish('PKS_WITHOUT_IN', "{$jdata}", 0); // 待web完成 ???
- trigger_error('在席無進場資料:'. print_r($parms, true));
- }
-
- // upd 2017/11/11避免圖檔拿不到
- $new_file_name = "pks-{$parms['pksno']}-{$parms['lpr']}-{$parms['ivsno']}-" . date('Ymd') .".jpg";
- $test_check_str = file_exists(PKS_PIC . $new_file_name) ? 'exists' : 'not_exists';
- trigger_error(__FUNCTION__ . '..' . PKS_PIC . $new_file_name . '..' . $test_check_str);
-
- // 車入格後的車牌辨識(lpr), 傅送圖檔
- //array_map('unlink', glob(PKS_PIC."pks-{$parms['pksno']}-*.jpg")); // 刪除舊照片
-
- // 清除舊照片
- foreach(glob(PKS_PIC."pks-{$parms['pksno']}-*.jpg") as $old_file_path)
- {
- if($old_file_path != PKS_PIC . $new_file_name)
- {
- unlink($old_file_path);
- trigger_error('remove old image:'. $old_file_path. ', replace by: ' . $new_file_name);
- }
- }
-
- $parms['pic_name'] = $new_file_name;
-
- if(!file_exists(PKS_PIC . $new_file_name))
- {
- $config['upload_path'] = PKS_PIC;
- $config['allowed_types'] = 'gif|jpg|png';
- // ex. pks-2016-1625AB-1-2015080526.jpg -> pks-車位編號-車號-設備編號-時間.jpg
- //$config['file_name'] = "pks-{$parms['pksno']}-{$parms['lpr']}-{$parms['ivsno']}-{$this->vars['time_num']}.jpg";
- $config['file_name'] = $new_file_name;
-
- $this->load->library('upload', $config);
-
- if($this->upload->do_upload('cars'))
- {
- // 若無錯誤,則上傳檔案
- $file = $this->upload->data('cars');
- }
- else
- {
- trigger_error('入席傳檔錯誤:'. print_r($parms, true));
- }
- }
-
- $data = array
- (
- 'cario_no' => $cario_no,
- 'lpr' => $parms['lpr'],
- 'status' => 'LR', // 車格佔用並有車號
- 'confirms' => 0, // 預設人工未確認
- 'pic_name' => $parms['pic_name'],
- 'in_time' => $in_time
- );
- // 車號及照片檔名填入資料庫內
- $this->db->update('pks', $data, array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']));
- break;
-
- case 'KI': // 車輛入席, 各區空車位與佔位各加減1
- $rows = $this->db->select('status')
- ->from('pks')
- ->where(array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']))
- ->get()
- ->row_array();
- // if (!empty($rows['status']) && $rows['status'] == 'LR') break; // 仍有車在席, 不應再有KI, ignore
- if (!empty($rows['status']) && $rows['status'] == 'LR') return true; // 仍有車在席, 不應再有KI, ignore
-
- $data = array
- (
- 'cario_no' => 0,
- 'lpr' => '',
- 'status' => 'OC', // 車格佔用但尚無車號
- 'confirms' => 0,
- 'pic_name' => '',
- 'in_time' => null
- );
- $this->db->update('pks', $data, array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']));
- break;
-
- case 'KO': // 車輛離席, 各區空車位與佔位各加減1
- $data = array
- (
- 'cario_no' => 0,
- 'lpr' => '',
- 'status' => 'VA', // 車格佔用但尚無車號
- 'confirms' => 0,
- 'pic_name' => '',
- 'in_time' => null
- );
- $this->db->update('pks', $data, array('pksno' => $parms['pksno'], 'station_no' => $parms['sno']));
- break;
- }
-
- /*
- // 找出與與此車位相關的群組
- $sql = "select group_id, tot, renum
- from pks_groups
- where group_id in
- (select group_id from pks_group_member where station_no = {$this->vars['station_no']} and pksno = {$parms['pksno']})";
-
- $retults = $this->db->query($sql)->result_array();
-
- foreach ($retults as $rows)
- {
- // 計算群組異動後的空車位數, 先讀出已停車位數
- $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']}')";
- $row_group = $this->db->query($sql)->row_array();
- $group_va = $rows['tot'] + $rows['renum'] - $row_group['parked']; // 群組空車位數
- $this->db->update('pks_groups', array('parked' => $row_group['parked'], 'availables' => $group_va), array('group_id' => $rows['group_id']));
-
- get_headers("http://192.168.51.15/set_num.php?group_id={$rows['group_id']}&num={$group_va}");
- // $this->vars['mqtt']->publish("VA-{$rows['group_id']}", "{$group_va}", 0); // 送出剩餘車位數給字幕機
- // 總車位數暫無需處理
- }
- */
- // 找出與與此車位相關的群組
- $sql = "select group_id, tot, renum, availables
- from pks_groups
- where group_id in
- (select group_id from pks_group_member where station_no = {$parms['sno']} and pksno = {$parms['pksno']})";
-
- $retults = $this->db->query($sql)->result_array();
-
- foreach ($retults as $rows)
- {
- // 計算群組異動後的空車位數, 先讀出已停車位數
- $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']}')";
- $row_group = $this->db->query($sql)->row_array();
- $group_va = $rows['tot'] + $rows['renum'] - $row_group['parked']; // 群組空車位數
-
- // 有變動才處理更新
- if($rows['availables'] != $group_va)
- {
- // 防止負值
- if($group_va < 0){
- $group_va = 0;
- }
-
- $group_va_pad = str_pad($group_va, 3, '0', STR_PAD_LEFT); // 補零
- $this->db->update('pks_groups', array('parked' => $row_group['parked'], 'availables' => $group_va), array('group_id' => $rows['group_id']));
-
- $this->vars['mqtt']->publish(MQ_TOPIC_SUBLEVEL, "{$rows['group_id']},{$group_va_pad}", 0); // 送出剩餘車位數給字幕機
- // 總車位數暫無需處理
-
- // 七樓無在席, 手動或用猜的
- /*
- $f7_total = 74;
- $sql = "select renum from pks_groups where group_id = 'F7'";
- $row_group = $this->db->query($sql)->row_array();
- $f7_renum = $row_group['renum'];
- $total_parked_sql = "select count(cario_no) as parked
- from cario where
- cario.in_time > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 DAY)
- and cario.finished = 0
- and cario.err = 0
- and cario.in_out = 'CI'
- and cario.out_time is null";
- $total_parked_row_group = $this->db->query($total_parked_sql)->row_array();
- $sql = "select count(pksno) as parked from pks where status != 'VA'";
- $row_group = $this->db->query($sql)->row_array();
- $f7_mqtt = $total_parked_row_group['parked'] - $row_group['parked'];
- if($f7_mqtt > $f7_total){
- $f7_mqtt = $f7_total;
- }else if($f7_mqtt <= 0){
- $f7_mqtt = 0;
- }
- $this->db->update('pks_groups', array('parked' => $f7_mqtt, 'availables' => $f7_total - $f7_mqtt + $f7_renum), array('group_id' => 'F7'));
- $f7_mqtt_pad = str_pad($f7_total - $f7_mqtt + $f7_renum, 3, '0', STR_PAD_LEFT);
-
- $this->vars['mqtt']->publish(MQ_TOPIC_SUBLEVEL, "F7,{$f7_mqtt_pad}", 0); // F7 MQTT
- */
- }
- }
- }
-
-
- // 重新計算
- public function reculc()
- {
- // 找出與與此車位相關的群組
- $sql = "select group_id, tot, renum
- from pks_groups";
-
- $retults = $this->db->query($sql)->result_array();
-
- foreach ($retults as $rows)
- {
- // 計算群組異動後的空車位數, 先讀出已停車位數
- $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']}')";
- $row_group = $this->db->query($sql)->row_array();
- $group_va = $rows['tot'] + $rows['renum'] - $row_group['parked']; // 群組空車位數
- $this->db->update('pks_groups', array('parked' => $row_group['parked'], 'availables' => $group_va), array('group_id' => $rows['group_id']));
-
- // $this->vars['mqtt']->publish("VA-{$rows['group_id']}", "{$group_va}", 0); // 送出剩餘車位數給字幕機
-
- get_headers("http://192.168.51.15/set_num.php?group_id={$rows['group_id']}&num={$group_va}");
-
- echo "group_id:{$rows['group_id']}, tot:{$rows['tot']}, availables:{$group_va}, parked:{$row_group['parked']}, renum:{$rows['renum']}<br />";
- }
- }
-
- // 取得所有車位使用狀態
- public function query_station_status($station_no)
- {
- /* 沒有group_id, pks不能直接用, 要多撈兩張表
-
- $sql = "select pksno, posx, posy, in_time
- FROM pks
- WHERE station_no = '".$station_no."' and lpr != ''";
- */
- $sql = "SELECT pks.pksno AS pksno, pks.posx AS posx, pks.posy AS posy, pks.in_time AS in_time,
- pks_groups.group_id AS group_id
- FROM pks
- LEFT JOIN pks_group_member ON pks.pksno = pks_group_member.pksno AND pks.station_no = pks_group_member.station_no
- LEFT JOIN pks_groups ON pks_group_member.group_id = pks_groups.group_id
- WHERE pks.lpr != '' AND pks.station_no = '".$station_no."' AND pks_groups.group_type = '1' ";
-
- $retults = $this->db->query($sql)->result_array();
-
- $currentTime = new DateTime("now");
- foreach ($retults as $idx => $rows)
- {
- $startTime = new DateTime($rows['in_time']); // 進場時間
- $interval = $startTime->diff($currentTime);
- $status = $this->gen_pks_s($interval); // 一般:0, 隔日:1, 超過3日:3, 隔週:7, 隔20日:20
-
- $data['result'][$idx] = array
- (
- 'g'=> $rows['group_id'],
- 'id'=> $rows['pksno'],
- 'x' => $rows['posx'],
- 'y' => $rows['posy'],
- 's' => $status
- );
- }
- return $data;
- }
-
- // 取得車位狀態
- private function gen_pks_s($interval)
- {
- $status = 0; // 一般:0, 隔日:1, 超過3日:3, 隔週:7, 隔20日:20
- if($interval->y > 0 || $interval->m > 0 || $interval->d >= 20){
- $status = 20;
- }else if($interval->d >= 7){
- $status = 7;
- }else if($interval->d >= 3){
- $status = 3;
- }else if($interval->d >= 1){
- $status = 1;
- }
- return $status;
- }
-
- // 取得指定車位使用狀態
- public function query_station_pks($station_no, $pksno)
- {
- $sql = "SELECT pks.pksno AS pksno, pks.lpr AS lpr, pks.in_time AS in_time, pks.station_no AS station_no,
- pks_groups.group_id AS group_id, pks_groups.group_name AS group_name, pks_groups.group_type AS type
- FROM pks
- LEFT JOIN pks_group_member ON pks.pksno = pks_group_member.pksno AND pks.station_no = pks_group_member.station_no
- LEFT JOIN pks_groups ON pks_group_member.group_id = pks_groups.group_id
- WHERE pks.pksno = '".$pksno."' AND pks.station_no = '".$station_no."' AND pks_groups.group_type = '1' ";
-
- $retults = $this->db->query($sql)->result_array();
-
- $currentTime = new DateTime("now");
- foreach ($retults as $idx => $rows)
- {
- $startTime = new DateTime($rows['in_time']); // 進場時間
- $interval = $startTime->diff($currentTime);
- $status = $this->gen_pks_s($interval); // 一般:0, 隔日:1, 超過3日:3, 隔週:7, 隔20日:20
-
- $data['result'][$idx] = array
- (
- 'pksno'=> $rows['pksno'],
- 'lpr' => $rows['lpr'],
- 'time' => $rows['in_time'],
- 'station_no' => $rows['station_no'],
- 'group_id' => $rows['group_id'],
- 'group_name' => $rows['group_name'],
- 'status' => $status
- );
- }
- return $data;
- }
-
- }
|