VM暫存
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

317 wiersze
10KB

  1. <?php
  2. /*
  3. file: Parkingquery_model.php 停車管理系統(提供資策會使用)
  4. */
  5. class Parkingquery_model extends CI_Model
  6. {
  7. function __construct()
  8. {
  9. parent::__construct();
  10. $this->load->database();
  11. }
  12. public function init($vars)
  13. {
  14. // do nothing
  15. }
  16. // 取得所有在席資訊
  17. public function q_local_pks($group_id)
  18. {
  19. $sql = "SELECT
  20. SUBSTR(pks.pksno, -3) as l_no,
  21. if(pks.lpr <> '', 1, 0) as s
  22. FROM pks
  23. LEFT JOIN pks_group_member ON (pks.pksno = pks_group_member.pksno AND pks.station_no = pks_group_member.station_no)
  24. WHERE pks_group_member.group_id = '{$group_id}'
  25. ";
  26. $retults = $this->db->query($sql)->result_array();
  27. foreach ($retults as $idx => $rows)
  28. {
  29. $key = $rows['l_no'];
  30. unset($rows['l_no']);
  31. $data['result'][$key] = $rows;
  32. }
  33. return $data;
  34. }
  35. // 查詢各樓層剩餘車位 (不分類)
  36. public function check_space_all($seqno)
  37. {
  38. $data = array();
  39. $results = $this->db->select('group_id, availables, tot')
  40. ->from('pks_groups')
  41. ->get()
  42. ->result_array();
  43. foreach($results as $idx => $rows)
  44. {
  45. $data['result']['floor'][$idx] = array
  46. (
  47. 'floor_name' => $rows['group_id'],
  48. 'valid_count' => $rows['availables'],
  49. 'total_count' => $rows['tot']
  50. );
  51. }
  52. return $data;
  53. }
  54. // 查詢各樓層剩餘車位
  55. public function check_space($seqno, $group_type=1)
  56. {
  57. $data = array();
  58. $results = $this->db->select('group_id, availables, tot')
  59. ->from('pks_groups')
  60. ->where('group_type', $group_type)
  61. ->order_by('cast(group_name as unsigned)', 'desc')
  62. ->get()
  63. ->result_array();
  64. //$sql = "SELECT group_id, availables, tot FROM `pks_groups` WHERE pks_groups.group_type = $group_type order by cast(group_name as unsigned) desc";
  65. //$results = $this->db->query($sql)->row_array();
  66. foreach($results as $idx => $rows)
  67. {
  68. $data['result']['floor'][$idx] = array
  69. (
  70. 'floor_name' => $rows['group_id'],
  71. 'valid_count' => $rows['availables'],
  72. 'total_count' => $rows['tot']
  73. );
  74. }
  75. return $data;
  76. }
  77. // 停車位置查詢
  78. public function check_location($lpr)
  79. {
  80. $lpr = strtoupper($lpr); // 一律轉大寫
  81. $data = array();
  82. $rows = $this->db->select('pksno, pic_name, in_time')
  83. ->from('pks')
  84. ->where('lpr', $lpr)
  85. ->limit(1)
  86. ->get()
  87. ->row_array();
  88. if (!empty($rows['pksno']))
  89. {
  90. $data['result']['num'] = $lpr;
  91. $data['result']['location_no'] = "{$rows['pksno']}";
  92. $data['result']['pic_name'] = $rows['pic_name'];
  93. $data['result']['in_time'] = $rows['in_time'];
  94. $data['result_code'] = 'OK';
  95. }
  96. else // 查無資料, 啟用模糊比對
  97. {
  98. /*
  99. // 讀取最近一筆入場資料
  100. $rows_cario = $this->db
  101. ->select('cario_no, in_time')
  102. ->from('cario')
  103. ->where(array('in_out' => 'CI', 'obj_id' => $lpr, 'finished' => 0, 'err' => 0, 'out_time IS NULL' => null))
  104. ->order_by('cario_no', 'desc')
  105. ->limit(1)
  106. ->get()
  107. ->row_array();
  108. // 有入場記錄, 直接猜在頂樓
  109. if (!empty($rows_cario['cario_no']))
  110. {
  111. $data['result']['num'] = $lpr;
  112. $data['result']['location_no'] = "7000";
  113. $data['result']['in_time'] = $rows_cario['in_time'];
  114. $data['result_code'] = 'OK';
  115. }
  116. else
  117. {
  118. $data['result']['num'] = $lpr;
  119. $data['result']['location_no'] = '0';
  120. $data['result_code'] = 'FAIL';
  121. }
  122. */
  123. $data['result']['num'] = $lpr;
  124. $data['result']['location_no'] = '0';
  125. $data['result_code'] = 'FAIL';
  126. }
  127. return $data;
  128. }
  129. // 停車位置查詢 (2)
  130. public function check_location2($lpr)
  131. {
  132. $lpr = strtoupper($lpr); // 一律轉大寫
  133. $data = array();
  134. $rows = $this->db->select('pksno, pic_name, in_time, station_no')
  135. ->from('pks')
  136. ->where('lpr', $lpr)
  137. ->limit(1)
  138. ->get()
  139. ->row_array();
  140. $sql = "SELECT pks.pksno, pks.pic_name, pks.in_time, pks.station_no,
  141. pks_groups.group_name
  142. FROM pks
  143. LEFT JOIN pks_group_member ON (pks_group_member.pksno = pks.pksno)
  144. LEFT JOIN pks_groups ON (pks_groups.group_id = pks_group_member.group_id)
  145. WHERE pks.lpr = '{$lpr}'
  146. AND pks_groups.group_type = 1
  147. LIMIT 1";
  148. $rows = $this->db->query($sql)->row_array();
  149. if (!empty($rows['pksno']))
  150. {
  151. $data['num'] = $lpr;
  152. $data['location_no'] = "{$rows['pksno']}";
  153. $data['station_no'] = "{$rows['station_no']}";
  154. $data['station_name'] = $rows['group_name'];
  155. $data['image_url2'] = "http://{$rows['station_no']}.altob.com.tw/pkspic/{$rows['pic_name']}";
  156. $data['in_time'] = $rows['in_time'];
  157. $data['result_code'] = 'OK';
  158. }
  159. else // 查無資料, 啟用模糊比對
  160. {
  161. $data['num'] = $lpr;
  162. $data['location_no'] = '0';
  163. $data['result_code'] = 'FAIL';
  164. }
  165. return $data;
  166. }
  167. // 空車位導引
  168. public function get_valid_seat($pksno, $group_type=1, $group_id='')
  169. {
  170. $data = array();
  171. $this->db->trans_start();
  172. $where_group_id = empty($group_id) ? '' : " and pks_group_member.group_id = '{$group_id}' "; // 指定車位群組
  173. $sql = '';
  174. if ($pksno > 0) // 限制從某一個車位開始指派車位
  175. {
  176. // 取得指定車格座標
  177. $sql_xy = " SELECT pks.posx, pks.posy, LEFT(pks.pksno, 2) as pksno_idx
  178. FROM pks
  179. WHERE pks.pksno = {$pksno}
  180. ";
  181. $rows_xy = $this->db->query($sql_xy)->row_array();
  182. if(!empty($rows_xy['posx']) && !empty($rows_xy['posy']))
  183. {
  184. // 找最近
  185. $sql = "
  186. select pks.pksno, pks.posx, pks.posy, pks_group_member.group_id,
  187. (
  188. ABS(cast(pks.pksno as signed) - {$pksno}) +
  189. ABS(cast(pks.posx as signed) - {$rows_xy['posx']}) +
  190. ABS(cast(pks.posy as signed) - {$rows_xy['posy']}) +
  191. ABS(LEFT(pks.pksno, 2) - {$rows_xy['pksno_idx']}) * 1000
  192. ) AS v
  193. from pks
  194. left join pks_group_member on (pks_group_member.pksno = pks.pksno)
  195. left join pks_groups on (pks_groups.group_id = pks_group_member.group_id)
  196. where
  197. pks.status = 'VA' and prioritys != 0 and (pks.book_time is null or pks.book_time <= now())
  198. and pks_groups.group_type = {$group_type}
  199. {$where_group_id}
  200. order by v asc limit 1 for update;
  201. ";
  202. }
  203. }
  204. // 依順序
  205. if(empty($sql))
  206. $sql = "SELECT pks.pksno
  207. FROM pks
  208. LEFT JOIN pks_group_member ON (pks_group_member.pksno = pks.pksno)
  209. LEFT JOIN pks_groups ON (pks_groups.group_id = pks_group_member.group_id)
  210. WHERE pks.status = 'VA'
  211. AND pks.prioritys != 0
  212. AND (pks.book_time IS NULL OR pks.book_time <= now())
  213. AND pks_groups.group_type = {$group_type}
  214. {$where_group_id}
  215. ORDER BY pks.prioritys ASC LIMIT 1 FOR UPDATE;";
  216. trigger_error(__FUNCTION__ . "..sql: {$sql}..");
  217. $rows = $this->db->query($sql)->row_array();
  218. if (!empty($rows['pksno']))
  219. {
  220. $data['result']['location_no'] = "{$rows['pksno']}";
  221. $data['result_code'] = 'OK';
  222. $sql = "update pks set book_time = addtime(now(), '00:10:00') where pksno = {$rows['pksno']};";
  223. $this->db->query($sql);
  224. trigger_error(__FUNCTION__ . "[{$pksno}]:" . print_r($data, true). print_r($rows, true));
  225. }
  226. else
  227. {
  228. $data['result']['location_no'] = '0';
  229. $data['result_code'] = 'FAIL';
  230. trigger_error(__FUNCTION__ . "[{$pksno}]:" . print_r($data, true));
  231. }
  232. $this->db->trans_complete();
  233. return $data;
  234. }
  235. // 緊急求救
  236. // http://xxxxxxxxxx/parkingquery.html/send_sos/B2/111/123
  237. public function send_sos($floor, $x, $y)
  238. {
  239. $data = array
  240. (
  241. 'result' => array('send_from' => array('floor' => $floor, 'x' => $x, 'y' => $y)),
  242. 'result_code' => 'OK'
  243. );
  244. return $data;
  245. }
  246. // 防盜鎖車
  247. // http://xxxxxxxxxx/parkingquery.html/security_action/ABC1234/pswd/2
  248. public function security_action($lpr, $pswd, $action)
  249. {
  250. $data = array();
  251. $rows = $this->db->select('member_no, passwd, locked')
  252. ->from('members')
  253. ->where(array('lpr' => $lpr))
  254. ->limit(1)
  255. ->get()
  256. ->row_array();
  257. trigger_error('防盜鎖車:'.$this->db->last_query());
  258. // 無資料或密碼錯誤
  259. if (empty($rows['member_no']) || md5($rows['passwd']) != $pswd)
  260. {
  261. $data['result_code'] = 'FAIL';
  262. return($data);
  263. }
  264. $data['result_code'] = 'OK';
  265. // 查詢防盜狀態
  266. if ($action == 2)
  267. {
  268. $data['result']['action'] = 'CHECK_SECURITY';
  269. $data['result'][0]['num'] = $lpr;
  270. $data['result'][0]['result'] = $rows['locked'] ? 'ON' : 'OFF';
  271. return $data;
  272. }
  273. $this->db
  274. ->where('member_no', $rows['member_no'])
  275. ->update('members', array('locked' => $action));
  276. $data['result']['action'] = $action == 1 ? 'ON' : 'OFF';
  277. return $data;
  278. }
  279. }