Commit 9b65affff1eacf75100429cecbc29eaf9fc75de8

Authored by liujun001
1 parent a3bda7e2

查看车辆视频

Showing 22 changed files with 444 additions and 1049 deletions
src/main/java/com/bsth/controller/video/VideoController.java
@@ -101,15 +101,35 @@ public class VideoController { @@ -101,15 +101,35 @@ public class VideoController {
101 public Map<String, Object> queryChannels(@PathVariable String carNo) { 101 public Map<String, Object> queryChannels(@PathVariable String carNo) {
102 Map<String, Object> result = new HashMap<>(); 102 Map<String, Object> result = new HashMap<>();
103 try { 103 try {
  104 +
  105 +
104 List<Map<String, Object>> videoChannels = videoService.getVideoChannel(carNo); 106 List<Map<String, Object>> videoChannels = videoService.getVideoChannel(carNo);
105 result.put("status", ResponseCode.SUCCESS); 107 result.put("status", ResponseCode.SUCCESS);
106 result.put("data", videoChannels); 108 result.put("data", videoChannels);
107 - result.put("channelImageURL",wvpConfig.getChannelListOfImgURL());  
108 - result.put("wvpPlayURL",wvpConfig.getWvpPlayURL()); 109 + result.put("channelImageURL", wvpConfig.getChannelListOfImgURL());
  110 + result.put("wvpPlayURL", wvpConfig.getWvpPlayURL());
  111 +
109 } catch (Exception e) { 112 } catch (Exception e) {
110 log.error("查询车辆通道异常:[{}]", carNo, e); 113 log.error("查询车辆通道异常:[{}]", carNo, e);
111 result.put("status", ResponseCode.ERROR); 114 result.put("status", ResponseCode.ERROR);
112 } 115 }
113 return result; 116 return result;
114 } 117 }
  118 +
  119 + @GetMapping("/car/channel/history/{device}/{channel}/{dateStr}")
  120 + public Map<String, Object> queryChannelHistoryList(@PathVariable("device") String device, @PathVariable("channel") String channel, @PathVariable("dateStr") String dateStr) {
  121 + Map<String, Object> result = new HashMap<>();
  122 + try {
  123 + String token = videoService.getToken();
  124 +
  125 + List<Map<String, Object>> videoChannels = videoService.getVideoChannelHistoryList(device, channel, dateStr,token);
  126 + result.put("status", ResponseCode.SUCCESS);
  127 + result.put("data", videoChannels);
  128 + result.put("wvpPlayURL",wvpConfig.getWvpPlayURL());
  129 + } catch (Exception e) {
  130 + log.error("查询通道历史数据异常:[{}],[{}],[{}]", device, channel, dateStr, e);
  131 + result.put("status", ResponseCode.ERROR);
  132 + }
  133 + return result;
  134 + }
115 } 135 }
src/main/java/com/bsth/service/impl/videoimpl/VideoServiceImpl.java
@@ -22,6 +22,7 @@ import org.apache.http.client.methods.HttpGet; @@ -22,6 +22,7 @@ import org.apache.http.client.methods.HttpGet;
22 import org.apache.http.client.methods.HttpPost; 22 import org.apache.http.client.methods.HttpPost;
23 import org.apache.http.entity.StringEntity; 23 import org.apache.http.entity.StringEntity;
24 import org.apache.http.impl.client.CloseableHttpClient; 24 import org.apache.http.impl.client.CloseableHttpClient;
  25 +import org.geolatte.geom.M;
25 import org.springframework.beans.BeanUtils; 26 import org.springframework.beans.BeanUtils;
26 import org.springframework.beans.factory.annotation.Autowired; 27 import org.springframework.beans.factory.annotation.Autowired;
27 import org.springframework.stereotype.Service; 28 import org.springframework.stereotype.Service;
@@ -69,6 +70,17 @@ public class VideoServiceImpl implements VideoService { @@ -69,6 +70,17 @@ public class VideoServiceImpl implements VideoService {
69 return getWvpVideoChannelByCarNo(carNo); 70 return getWvpVideoChannelByCarNo(carNo);
70 } 71 }
71 72
  73 + @Override
  74 + public List<Map<String, Object>> getVideoChannelHistoryList(String device, String channel, String dateStr,String token) throws Exception {
  75 + return getVideoChannelHistoryListReq(device, channel, dateStr,token);
  76 + }
  77 +
  78 + @Override
  79 + public String getToken() throws Exception {
  80 + return getWvpLoginToken();
  81 + }
  82 +
  83 +
72 /*** 84 /***
73 *查询公交公司的数据。 85 *查询公交公司的数据。
74 * @author liujun 86 * @author liujun
@@ -215,7 +227,7 @@ public class VideoServiceImpl implements VideoService { @@ -215,7 +227,7 @@ public class VideoServiceImpl implements VideoService {
215 String url = StringUtils.replace(wvpConfig.getChannelListOfCarNoURL(), "{carNo}", carNo); 227 String url = StringUtils.replace(wvpConfig.getChannelListOfCarNoURL(), "{carNo}", carNo);
216 try { 228 try {
217 StringBuilder result = get(url, headers); 229 StringBuilder result = get(url, headers);
218 - return (List<Map<String, Object>>) switchWVPResult(result, url); 230 + return (List<Map<String, Object>>) switchWVPResult(result, url);
219 231
220 } catch (Exception e) { 232 } catch (Exception e) {
221 log.error("get wvp of channel list error[{}];", url, e); 233 log.error("get wvp of channel list error[{}];", url, e);
@@ -223,6 +235,36 @@ public class VideoServiceImpl implements VideoService { @@ -223,6 +235,36 @@ public class VideoServiceImpl implements VideoService {
223 } 235 }
224 } 236 }
225 237
  238 + private List<Map<String, Object>> getVideoChannelHistoryListReq(String device, String channel, String dateStr,String token) throws Exception {
  239 + if (StringUtils.isEmpty(token)) {
  240 + log.error("wvp login token is null");
  241 + return Collections.emptyList();
  242 + }
  243 + Map<String, Object> headers = new HashMap<>();
  244 + headers.put("Access-Token", token);
  245 +
  246 +
  247 + String url = StringUtils.replace(wvpConfig.getWvpChannelHistoryUrl(), "{device}", device);
  248 + url = StringUtils.replace(url, "{channel}", channel);
  249 + url = StringUtils.replace(url, "{startTimeStr}", dateStr + "%2000:00:00");
  250 + url = StringUtils.replace(url, "{endTimeStr}", dateStr + "%2023:59:59");
  251 +
  252 + try {
  253 + StringBuilder result = get(url, headers);
  254 + Map<String, Object> resulMap = (Map<String, Object>) switchWVPResult(result, url);
  255 + if (MapUtils.isEmpty(resulMap)) {
  256 + return Collections.emptyList();
  257 + }
  258 +
  259 + List<Map<String, Object>> recordList = (List<Map<String, Object>>) resulMap.get("recordList");
  260 +
  261 + return CollectionUtils.isEmpty(recordList) ? Collections.emptyList() : recordList;
  262 + } catch (Exception e) {
  263 + log.error("get wvp of channel history list error[{}];", url, e);
  264 + throw e;
  265 + }
  266 + }
  267 +
226 public static StringBuilder get(String url, Map<String, Object> headers) throws Exception { 268 public static StringBuilder get(String url, Map<String, Object> headers) throws Exception {
227 CloseableHttpClient httpClient = null; 269 CloseableHttpClient httpClient = null;
228 CloseableHttpResponse response = null; 270 CloseableHttpResponse response = null;
@@ -284,7 +326,7 @@ public class VideoServiceImpl implements VideoService { @@ -284,7 +326,7 @@ public class VideoServiceImpl implements VideoService {
284 Map<String, Object> resultMap = (Map<String, Object>) JSON.parse(resultStr); 326 Map<String, Object> resultMap = (Map<String, Object>) JSON.parse(resultStr);
285 Integer code = (Integer) resultMap.get("code"); 327 Integer code = (Integer) resultMap.get("code");
286 if (Objects.equals(0, code)) { 328 if (Objects.equals(0, code)) {
287 - return resultMap.get("data"); 329 + return resultMap.get("data");
288 } 330 }
289 } 331 }
290 332
src/main/java/com/bsth/service/impl/videoimpl/WvpConfig.java
@@ -8,8 +8,8 @@ import org.springframework.stereotype.Component; @@ -8,8 +8,8 @@ import org.springframework.stereotype.Component;
8 * @author liujun 8 * @author liujun
9 * @date 2024年07月02日 14:30 9 * @date 2024年07月02日 14:30
10 */ 10 */
11 -@Component  
12 @Data 11 @Data
  12 +@Component
13 public class WvpConfig { 13 public class WvpConfig {
14 @Value("${wvp.login.user}") 14 @Value("${wvp.login.user}")
15 private String userName; 15 private String userName;
@@ -25,4 +25,7 @@ public class WvpConfig { @@ -25,4 +25,7 @@ public class WvpConfig {
25 25
26 @Value("${wvp.channel.play.url}") 26 @Value("${wvp.channel.play.url}")
27 private String wvpPlayURL; 27 private String wvpPlayURL;
  28 +
  29 + @Value("${wvp.channel.history.list.url}")
  30 + private String wvpChannelHistoryUrl;
28 } 31 }
src/main/java/com/bsth/service/video/VideoService.java
@@ -19,4 +19,8 @@ public interface VideoService { @@ -19,4 +19,8 @@ public interface VideoService {
19 List<VideoTree> combinationTree(); 19 List<VideoTree> combinationTree();
20 20
21 List<Map<String, Object>> getVideoChannel(String carNo)throws Exception; 21 List<Map<String, Object>> getVideoChannel(String carNo)throws Exception;
  22 +
  23 + List<Map<String,Object>> getVideoChannelHistoryList(String device,String channel,String dateStr,String token) throws Exception;
  24 +
  25 + String getToken() throws Exception;
22 } 26 }
src/main/resources/application-test.properties
@@ -14,7 +14,7 @@ spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MyS @@ -14,7 +14,7 @@ spring.jpa.properties.hibernate.dialect= org.hibernate.spatial.dialect.mysql.MyS
14 14
15 #DATABASE 15 #DATABASE
16 spring.datasource.driver-class-name= com.mysql.jdbc.Driver 16 spring.datasource.driver-class-name= com.mysql.jdbc.Driver
17 -spring.datasource.url= jdbc:mysql://192.170.100.114/control?useUnicode=true&characterEncoding=utf-8&useSSL=false 17 +spring.datasource.url= jdbc:mysql://192.168.168.242/control_pd?useUnicode=true&characterEncoding=utf-8&useSSL=false
18 spring.datasource.username= root 18 spring.datasource.username= root
19 spring.datasource.password= root2jsp 19 spring.datasource.password= root2jsp
20 spring.datasource.type= com.zaxxer.hikari.HikariDataSource 20 spring.datasource.type= com.zaxxer.hikari.HikariDataSource
@@ -31,7 +31,7 @@ spring.datasource.hikari.connection-test-query= SELECT 1 @@ -31,7 +31,7 @@ spring.datasource.hikari.connection-test-query= SELECT 1
31 spring.datasource.hikari.validation-timeout= 3000 31 spring.datasource.hikari.validation-timeout= 3000
32 spring.datasource.hikari.register-mbeans=true 32 spring.datasource.hikari.register-mbeans=true
33 33
34 -kafka.use= true 34 +kafka.use= false
35 spring.kafka.consumer.bootstrap-servers= 192.170.100.114:9092,192.170.100.114:9093,192.170.100.114:9094 35 spring.kafka.consumer.bootstrap-servers= 192.170.100.114:9092,192.170.100.114:9093,192.170.100.114:9094
36 spring.kafka.consumer.group-id= schedule-system-test 36 spring.kafka.consumer.group-id= schedule-system-test
37 spring.kafka.consumer.auto-offset-reset= latest 37 spring.kafka.consumer.auto-offset-reset= latest
@@ -66,8 +66,16 @@ admin.mail= 3090342880@qq.com @@ -66,8 +66,16 @@ admin.mail= 3090342880@qq.com
66 enabled.whiteip= false 66 enabled.whiteip= false
67 enabled.authority= false 67 enabled.authority= false
68 68
69 -sso.enabled= true 69 +sso.enabled= false
70 sso.systemcode = SYS0023 70 sso.systemcode = SYS0023
71 sso.http.url.login= https://112.64.45.51/portal/index.html#/login 71 sso.http.url.login= https://112.64.45.51/portal/index.html#/login
72 sso.http.url.logout= https://112.64.45.51/information/api/v1/logout 72 sso.http.url.logout= https://112.64.45.51/information/api/v1/logout
73 -sso.http.url.auth= https://112.64.45.51/information/authenticate/authorityAuthentication  
74 \ No newline at end of file 73 \ No newline at end of file
  74 +sso.http.url.auth= https://112.64.45.51/information/authenticate/authorityAuthentication
  75 +
  76 +wvp.login.user=admin
  77 +wvo.login.pwd=e9bc0e13a8a16cbb07b175d92a113126
  78 +wvp.login.url=http://127.0.0.1:18080/api/user/login
  79 +wvp.channel.list.url=http://127.0.0.1:18080/api/device/query/query/channel/carNo/{carNo}
  80 +wvp.channel.list.img.url=http://127.0.0.1:18080/api/device/query/snap/
  81 +wvp.channel.play.url =http://192.168.169.100:1091/rtp/
  82 +wvp.channel.history.list.url=http://127.0.0.1:18080/api/gb_record/query/{device}/{channel}?startTime={startTimeStr}&endTime={endTimeStr}
75 \ No newline at end of file 83 \ No newline at end of file
src/main/resources/static/index.html
@@ -85,6 +85,7 @@ @@ -85,6 +85,7 @@
85 <link 85 <link
86 href="/metronic_v4.5.4/plugins/tipso/css/tipso.css" 86 href="/metronic_v4.5.4/plugins/tipso/css/tipso.css"
87 rel="stylesheet" type="text/css" /> 87 rel="stylesheet" type="text/css" />
  88 + <link href="/metronic_v4.5.4/layui/css/layui.css" rel="stylesheet">
88 89
89 <style type="text/css"> 90 <style type="text/css">
90 .searchForm { 91 .searchForm {
@@ -681,5 +682,6 @@ @@ -681,5 +682,6 @@
681 <!-- RSA加密 --> 682 <!-- RSA加密 -->
682 <script src="/assets/plugins/jsencrypt.min.js"></script> 683 <script src="/assets/plugins/jsencrypt.min.js"></script>
683 <script src="/assets/js/eventproxy.js"></script> 684 <script src="/assets/js/eventproxy.js"></script>
  685 +<script src="/metronic_v4.5.4/layui/layui.js" ></script>
684 </body> 686 </body>
685 </html> 687 </html>
686 \ No newline at end of file 688 \ No newline at end of file
src/main/resources/static/pages/video/css/layui.css renamed to src/main/resources/static/metronic_v4.5.4/layui/css/layui.css
src/main/resources/static/pages/video/font/iconfont.eot renamed to src/main/resources/static/metronic_v4.5.4/layui/font/iconfont.eot
No preview for this file type
src/main/resources/static/pages/video/font/iconfont.svg renamed to src/main/resources/static/metronic_v4.5.4/layui/font/iconfont.svg
src/main/resources/static/pages/video/font/iconfont.ttf renamed to src/main/resources/static/metronic_v4.5.4/layui/font/iconfont.ttf
No preview for this file type
src/main/resources/static/pages/video/font/iconfont.woff renamed to src/main/resources/static/metronic_v4.5.4/layui/font/iconfont.woff
No preview for this file type
src/main/resources/static/pages/video/font/iconfont.woff2 renamed to src/main/resources/static/metronic_v4.5.4/layui/font/iconfont.woff2
No preview for this file type
src/main/resources/static/pages/video/layui.js renamed to src/main/resources/static/metronic_v4.5.4/layui/layui.js
src/main/resources/static/pages/video/bus_info.html deleted 100644 → 0
1 -<div class="page-head">  
2 - <div class="page-title">  
3 - <h1>车辆信息管理</h1>  
4 - </div>  
5 -</div>  
6 -  
7 -<ul class="page-breadcrumb breadcrumb">  
8 - <li>  
9 - <a href="/pages/home.html" data-pjax>首页</a>  
10 - <i class="fa fa-circle"></i>  
11 - </li>  
12 - <li>  
13 - <span class="active">基础信息</span>  
14 - <i class="fa fa-circle"></i>  
15 - </li>  
16 - <li>  
17 - <span class="active">车辆信息管理</span>  
18 - </li>  
19 -</ul>  
20 -  
21 -<div class="row">  
22 - <div class="col-md-12" ng-controller="BusInfoManageCtrl as ctrl">  
23 - <style>  
24 - .dropdown-menu {  
25 - border-color: #32c5d2;  
26 - }  
27 - .btn-group > .dropdown-menu:before {  
28 - border-bottom-color: #32c5d2;  
29 - }  
30 - </style>  
31 -  
32 - <div class="portlet light bordered">  
33 - <div class="portlet-title">  
34 - <div class="caption font-dark">  
35 - <i class="fa fa-database font-dark"></i>  
36 - <span class="caption-subject bold uppercase">车辆信息表</span>  
37 - </div>  
38 - <div class="actions">  
39 - <!--<a href="javascript:" class="btn blue" ng-click="ctrl.goForm()">-->  
40 - <!--<i class="fa fa-plus"></i>-->  
41 - <!--添加车辆信息-->  
42 - <!--</a>-->  
43 - </div>  
44 - </div>  
45 -  
46 - <div class="portlet-body">  
47 - <div ui-view="busInfoManage_list"></div>  
48 - </div>  
49 - </div>  
50 - </div>  
51 -</div>  
52 -  
src/main/resources/static/pages/video/bus_info_list.html deleted 100644 → 0
1 -<!-- ui-route busInfoManage.list -->  
2 -<div ng-controller="BusInfoManageListCtrl as ctrl">  
3 - <div class="fixDiv">  
4 - <table class="table fixTable table-striped table-bordered table-hover table-checkable order-column">  
5 - <thead>  
6 - <tr role="row" class="heading">  
7 - <th style="width:70px;">序号</th>  
8 - <th style="width: 120px;">车辆编号</th>  
9 - <th style="width: 120px;">内部编号</th>  
10 - <th style="width: 120px;">设备编号</th>  
11 - <th style="width: 120px;">车牌号</th>  
12 - <th >所在公司</th>  
13 - <th >所在分公司</th>  
14 - <th style="width: 60px">电车</th>  
15 - <th style="width: 80px;" >状态</th>  
16 - <th >操作</th>  
17 - </tr>  
18 - <tr role="row" class="filter">  
19 - <td></td>  
20 - <td>  
21 - <input type="text" class="form-control form-filter input-sm" ng-model="ctrl.searchCondition().carCode_like" placeholder="输入车辆编号..."/>  
22 - </td>  
23 - <td>  
24 - <input type="text" class="form-control form-filter input-sm" ng-model="ctrl.searchCondition().insideCode_like" placeholder="输入内部编号..."/>  
25 - </td>  
26 - <td>  
27 - <input type="text" class="form-control form-filter input-sm" ng-model="ctrl.searchCondition().equipmentCode_like" placeholder="输入设备编号..."/>  
28 - </td>  
29 - <td>  
30 - <input type="text" class="form-control form-filter input-sm" ng-model="ctrl.searchCondition().carPlate_like" placeholder="输入车牌号..."/>  
31 - </td>  
32 - <td>  
33 - <sa-Select5 name="gs"  
34 - model="ctrl.searchCondition()"  
35 - cmaps="{'businessCode_eq': 'businessCode'}"  
36 - dcname="businessCode_eq"  
37 - icname="businessCode"  
38 - dsparams="{{ {type: 'ajax', param:{'upCode_eq': '88' }, atype:'gs' } | json }}"  
39 - iterobjname="item"  
40 - iterobjexp="item.businessName"  
41 - searchph="请输拼音..."  
42 - searchexp="this.businessName"  
43 - required  
44 - >  
45 - </sa-Select5>  
46 - </td>  
47 - <td>  
48 - <sa-Select5 name="fgs"  
49 - model="ctrl.searchCondition()"  
50 - cmaps="{'brancheCompanyCode_eq': 'businessCode'}"  
51 - dcname="brancheCompanyCode_eq"  
52 - icname="businessCode"  
53 - dsparams="{{ {type: 'ajax', param:{'upCode_eq': ctrl.searchCondition().businessCode_eq }, atype:'gs' } | json }}"  
54 - iterobjname="item"  
55 - iterobjexp="item.businessName"  
56 - searchph="请输拼音..."  
57 - searchexp="this.businessName"  
58 - required  
59 - >  
60 - </sa-Select5>  
61 - </td>  
62 - <td>  
63 -  
64 - </td>  
65 - <td>  
66 - <label class="checkbox-inline input">  
67 - <input type="checkbox" ng-model="ctrl.searchCondition()['scrapState_eq']" />报废  
68 - </label>  
69 - </td>  
70 - <td>  
71 - <div class="btn-group">  
72 - <button class="btn btn-sm green btn-outline filter-submit margin-bottom" style="margin-right: 0;"  
73 - ng-click="ctrl.doPage()">  
74 - <i class="fa fa-search"></i> 搜索</button>  
75 - <button class="btn btn-sm green btn-outline filter-submit margin-bottom dropdown-toggle"  
76 - data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">  
77 - <span class="caret"></span>  
78 - <span class="sr-only">dropdown</span>  
79 - </button>  
80 - <ul class="dropdown-menu pull-right">  
81 - <li>  
82 - <a href="javascript:" class="tool-action" ng-click="ctrl.customOrder()">  
83 - <i class="fa fa-sort-amount-asc" aria-hidden="true"></i>  
84 - 排序选项  
85 - </a>  
86 - </li>  
87 - </ul>  
88 - </div>  
89 -  
90 - <button class="btn btn-sm red btn-outline filter-cancel"  
91 - ng-click="ctrl.reset()">  
92 - <i class="fa fa-times"></i> 重置</button>  
93 - </td>  
94 -  
95 - </tr>  
96 - </thead>  
97 - <tbody>  
98 - <tr ng-repeat="info in ctrl.page()['content']" class="odd gradeX">  
99 - <td>  
100 - <div>  
101 - <a href="#"  
102 - tooltip-animation="false"  
103 - tooltip-placement="top"  
104 - uib-tooltip="{{'公司/编号:' + info.company + '/' + info.insideCode}}"  
105 - tooltip-class="headClass">  
106 -  
107 - <i class="fa fa-list-ol" aria-hidden="true"></i>  
108 - {{$index + ctrl.page().number * 10 + 1}}  
109 - </a>  
110 - </div>  
111 - </td>  
112 - <td>  
113 - <span ng-bind="info.carCode"></span>  
114 - </td>  
115 - <td>  
116 - <span ng-bind="info.insideCode"></span>  
117 - </td>  
118 - <td>  
119 - <span ng-bind="info.equipmentCode"></span>  
120 - </td>  
121 - <td>  
122 - <span ng-bind="info.carPlate"></span>  
123 - </td>  
124 - <td>  
125 - <span ng-bind="info.company"></span>  
126 - </td>  
127 - <td>  
128 - <span ng-bind="info.brancheCompany"></span>  
129 - </td>  
130 - <td>  
131 - <span ng-bind="info.sfdc | dict:'truefalseType':'未知' "></span>  
132 - </td>  
133 - <td>  
134 - <span ng-bind="info.scrapState | dict:'truefalseType':'未知' "></span>  
135 - </td>  
136 - <td>  
137 - <!--<a href="details.html?lineId={{obj.id}}" class="btn default blue-stripe btn-sm"> 详细 </a>-->  
138 - <!--<a href="edit.html?lineId={{obj.id}}" class="btn default blue-stripe btn-sm"> 修改 </a>-->  
139 - <a ui-sref="busInfoManage_detail({id: info.id})" class="btn btn-info btn-sm"> 详细 </a>  
140 - <!--<a ui-sref="busInfoManage_edit({id: info.id})" class="btn btn-info btn-sm"> 修改 </a>-->  
141 - <!--<a sweetalert-->  
142 - <!--sweet-options="{title: '是否删除车辆信息?',text: '内部编码:' + info.insideCode + '</br>如果有车辆配置信息关联,会报错,建议不要随便删除!', html: true,type: 'warning',showCancelButton: true,confirmButtonColor: '#DD6B55',confirmButtonText: '是',cancelButtonText: '取消'}"-->  
143 - <!--sweet-on-confirm="ctrl.deleteCar(info.id)"-->  
144 - <!--class="btn btn-danger btn-sm">删除</a>-->  
145 - </td>  
146 - </tr>  
147 - </tbody>  
148 - </table>  
149 - </div>  
150 -  
151 - <div class="pageBar">  
152 - <div class="pageBarLeft">  
153 - {{'显示从' + ctrl.page()['uiFromRecord'] + '到' + ctrl.page()['uiToRecord'] + ' 共' + ctrl.page()['totalElements'] + '条' + ' 每页显示10条'}}  
154 - </div>  
155 -  
156 - <div class="pageBarRight">  
157 - <uib-pagination total-items="ctrl.page()['totalElements']"  
158 - ng-model="ctrl.page()['uiNumber']"  
159 - ng-change="ctrl.doPage()"  
160 - rotate="false"  
161 - max-size="10"  
162 - boundary-links="true"  
163 - first-text="首页"  
164 - previous-text="上一页"  
165 - next-text="下一页"  
166 - last-text="尾页">  
167 - </uib-pagination>  
168 - </div>  
169 - </div>  
170 -  
171 -</div>  
src/main/resources/static/pages/video/bus_info_module.js deleted 100644 → 0
1 -// 车辆基础信息维护 service controller等写在一起  
2 -  
3 -angular.module('ScheduleApp').factory(  
4 - 'BusInfoManageService',  
5 - [  
6 - 'BusInfoManageService_g',  
7 - 'UserPrincipal',  
8 - function(service, UserPrincipal) {  
9 -  
10 - /** 当前的查询条件信息 */  
11 - var currentSearchCondition = {  
12 - page: 0,  
13 - "carCode_like" : "",  
14 - "insideCode_like" : "",  
15 - "equipmentCode_like" : "",  
16 - "carPlate_like" : ""  
17 - };  
18 - // 当前查询返回的信息  
19 - var currentPage = { // 后台spring data返回的格式  
20 - totalElements: 0,  
21 - number: 0, // 后台返回的页码,spring返回从0开始  
22 - content: [],  
23 -  
24 - uiNumber: 1, // 页面绑定的页码  
25 - uiFromRecord: 0, // 页面绑定,当前页第几条记录  
26 - uiToRecord: 0 // 页面绑定,当前页到第几条记录  
27 - };  
28 -  
29 - // 字段描述  
30 - var columns = [  
31 - {name: "carCode", desc: "车辆编号"},  
32 - {name: "insideCode", desc: "自编号"},  
33 - {name: "equipmentCode", desc: "设备编号"},  
34 - {name: "carPlate", desc: "车牌号"},  
35 - {name: "company", desc: "所在公司"},  
36 - {name: "brancheCompany", desc: "所在分公司"},  
37 - {name: "sfdc", desc: "是否电车"},  
38 - {name: "scrapState", desc: "是否报废"},  
39 - {name: "updateDate", desc: "更新时间"}  
40 - ];  
41 - // 排序字段  
42 - var orderColumns = {  
43 - order: "carCode",  
44 - direction: "ASC"  
45 - };  
46 -  
47 - // 查询对象  
48 - var queryClass = service.rest;  
49 -  
50 - return {  
51 - getQueryClass: function() {  
52 - return queryClass;  
53 - },  
54 - getColumns: function() {  
55 - return columns;  
56 - },  
57 - getOrderColumns: function() {  
58 - return orderColumns;  
59 - },  
60 - /**  
61 - * 获取查询条件信息,  
62 - * 用于给controller用来和页面数据绑定。  
63 - */  
64 - getSearchCondition: function() {  
65 - currentSearchCondition.page = currentPage.uiNumber - 1;  
66 -  
67 - if (UserPrincipal.getGsStrs().length > 0) {  
68 - currentSearchCondition["cgsbm_in"] = UserPrincipal.getGsStrs().join(",");  
69 - }  
70 -  
71 - // 重置排序字段条件  
72 - currentSearchCondition.order = orderColumns.order;  
73 - currentSearchCondition.direction = orderColumns.direction;  
74 -  
75 - return currentSearchCondition;  
76 - },  
77 - /**  
78 - * 组装查询参数,返回一个promise查询结果。  
79 - * @param params 查询参数  
80 - * @return 返回一个 promise  
81 - */  
82 - getPage: function(page) {  
83 - if (page) {  
84 - currentPage.totalElements = page.totalElements;  
85 - currentPage.number = page.number;  
86 - currentPage.content = page.content;  
87 -  
88 - // 计算当前页开始记录,结束记录  
89 - if (page.numberOfElements && page.numberOfElements > 0) {  
90 - currentPage.uiFromRecord = page.number * 10 + 1;  
91 - currentPage.uiToRecord = page.number * 10 + page.numberOfElements;  
92 - }  
93 - }  
94 - return currentPage;  
95 - },  
96 - resetStatus: function() {  
97 - currentSearchCondition = {page: 0};  
98 - currentPage = {  
99 - totalElements: 0,  
100 - number: 0,  
101 - content: [],  
102 - uiNumber: 1,  
103 - uiFromRecord: 0,  
104 - uiToRecord: 0  
105 - };  
106 - },  
107 -  
108 - /**  
109 - * 数据导出。  
110 - * @returns {*|Function|promise|n}  
111 - */  
112 - dataExport: function(query) {  
113 - if (UserPrincipal.getGsStrsQuery().length > 0) {  
114 - return service.dataTools.dataExport(  
115 - {'QUERY': query}  
116 - ).$promise;  
117 - } else {  
118 - return null;  
119 - }  
120 - }  
121 - };  
122 -  
123 - }  
124 - ]  
125 -);  
126 -  
127 -// index.html控制器  
128 -angular.module('ScheduleApp').controller(  
129 - 'BusInfoManageCtrl',  
130 - [  
131 - 'BusInfoManageService',  
132 - '$state',  
133 - '$uibModal',  
134 - 'FileDownload_g',  
135 - 'UserPrincipal',  
136 - function(busInfoManageService, $state, $uibModal, fileDownload, UserPrincipal) {  
137 - var self = this;  
138 -  
139 - // 切换到form状态  
140 - self.goForm = function() {  
141 - //alert("切换");  
142 - $state.go("busInfoManage_form");  
143 - };  
144 -  
145 - // 导入excel  
146 - self.importData = function() {  
147 - // large方式弹出模态对话框  
148 - var modalInstance = $uibModal.open({  
149 - templateUrl: '/pages/scheduleApp/module/basicInfo/busInfoManage/dataImport.html',  
150 - size: "lg",  
151 - animation: true,  
152 - backdrop: 'static',  
153 - resolve: {  
154 - // 可以传值给controller  
155 - },  
156 - windowClass: 'center-modal',  
157 - controller: "BusInfoManageToolsCtrl",  
158 - controllerAs: "ctrl",  
159 - bindToController: true  
160 - });  
161 - modalInstance.result.then(  
162 - function() {  
163 - console.log("dataImport.html打开");  
164 - },  
165 - function() {  
166 - console.log("dataImport.html消失");  
167 - }  
168 - );  
169 - };  
170 -  
171 - // 导出excel  
172 - self.exportData = function() {  
173 - // 组装查询条件  
174 - var QUERY = [];  
175 - var fgs_query = [];  
176 - var i;  
177 - for (i in UserPrincipal.getGsStrs()) {  
178 - fgs_query.push("'" + UserPrincipal.getGsStrs()[i] + "'");  
179 - }  
180 - QUERY.push(" concat(business_code, '_', branche_company_code) in " + "(" + fgs_query.join(",") + ")");  
181 - var key_map = {  
182 - "car_code": "carCode_like",  
183 - "inside_code": "insideCode_like",  
184 - "equipment_code": "equipmentCode_like",  
185 - "car_plate": "carPlate_like"  
186 - };  
187 -  
188 - var key;  
189 - var value;  
190 - var field;  
191 - var condition = busInfoManageService.getSearchCondition();  
192 - for (key in key_map) {  
193 - value = condition[key_map[key]];  
194 - if (value !== undefined && value !== "") {  
195 - field = key;  
196 - QUERY.push(field + " = " + "'" + value + "'");  
197 - }  
198 - }  
199 -  
200 - var p = busInfoManageService.dataExport(QUERY.join(" and "));  
201 - if (p) {  
202 - p.then(  
203 - function(result) {  
204 - fileDownload.downloadFile(result.data, "application/octet-stream", "车辆基础信息.xls");  
205 - },  
206 - function(result) {  
207 - console.log("exportData failed:" + result);  
208 - }  
209 - );  
210 - }  
211 -  
212 - };  
213 - }  
214 - ]  
215 -);  
216 -  
217 -angular.module('ScheduleApp').controller('BusInfoManageToolsCtrl', ['$modalInstance', 'FileUploader', function($modalInstance, FileUploader) {  
218 - var self = this;  
219 - self.data = "TODO";  
220 -  
221 - // 关闭窗口  
222 - self.close = function() {  
223 - $modalInstance.dismiss("cancel");  
224 - };  
225 -  
226 - self.clearInputFile = function() {  
227 - angular.element("input[type='file']").val(null);  
228 - };  
229 -  
230 - // 上传文件组件  
231 - self.uploader = new FileUploader({  
232 - url: "/cars_sc/uploadAndImportFile",  
233 - filters: [] // 用于过滤文件,比如只允许导入excel  
234 - });  
235 - self.uploader.onAfterAddingFile = function(fileItem)  
236 - {  
237 - console.info('onAfterAddingFile', fileItem);  
238 - console.log(self.uploader.queue.length);  
239 - if (self.uploader.queue.length > 1)  
240 - self.uploader.removeFromQueue(0);  
241 - };  
242 - self.uploader.onSuccessItem = function(fileItem, response, status, headers)  
243 - {  
244 - if (response.status == "SUCCESS") {  
245 - console.info('onSuccessItem', fileItem, response, status, headers);  
246 - } else {  
247 - fileItem.isSuccess = false;  
248 - fileItem.isCancel = false;  
249 - fileItem.isError = true;  
250 -  
251 - alert(response.msg);  
252 - }  
253 -  
254 - };  
255 - self.uploader.onErrorItem = function(fileItem, response, status, headers)  
256 - {  
257 - console.info('onErrorItem', fileItem, response, status, headers);  
258 - };  
259 -  
260 -}]);  
261 -  
262 -// list.html控制器  
263 -angular.module('ScheduleApp').controller(  
264 - 'BusInfoManageListCtrl',  
265 - [  
266 - 'BusInfoManageService',  
267 - '$uibModal',  
268 - function(service, $uibModal) {  
269 - var self = this;  
270 - var Cars = service.getQueryClass();  
271 -  
272 - self.page = function() {  
273 - return service.getPage();  
274 - };  
275 -  
276 - self.searchCondition = function() {  
277 - return service.getSearchCondition();  
278 - };  
279 -  
280 - self.doPage = function() {  
281 - var result = Cars.list(self.searchCondition(), function() {  
282 - if (!result.status) {  
283 - service.getPage(result);  
284 - }  
285 - });  
286 - };  
287 - self.reset = function() {  
288 - service.resetStatus();  
289 - var result = Cars.list(self.searchCondition(), function() {  
290 - if (!result.status) {  
291 - service.getPage(result);  
292 - }  
293 - });  
294 - };  
295 -  
296 - self.deleteCar = function(id) {  
297 - Cars.delete({id: id}, function(result) {  
298 - if (result.msg) { // 暂时这样做,之后全局拦截  
299 - alert("失败:" + result.msg);  
300 - } else {  
301 - self.doPage();  
302 - }  
303 - });  
304 - };  
305 -  
306 - self.doPage();  
307 -  
308 - self.customOrder = function() {  
309 - // large方式弹出模态对话框  
310 - var modalInstance = $uibModal.open({  
311 - templateUrl: '/pages/scheduleApp/module/basicInfo/busInfoManage/orderOptionOpen.html',  
312 - // size: "sm",  
313 - animation: true,  
314 - backdrop: 'static',  
315 - resolve: {  
316 - },  
317 - windowClass: 'order-option-modal',  
318 - controller: "BusInfoManageListOrderOptionModalInstanceCtrl",  
319 - controllerAs: "$ctrl",  
320 - bindToController: true  
321 - });  
322 - modalInstance.result.then(  
323 - function(result) {  
324 - console.log("dataImport.html打开");  
325 - },  
326 - function() {  
327 - console.log("dataImport.html消失");  
328 - }  
329 - );  
330 - };  
331 - }  
332 - ]  
333 -);  
334 -  
335 -angular.module('ScheduleApp').controller(  
336 - "BusInfoManageListOrderOptionModalInstanceCtrl",  
337 - [  
338 - "BusInfoManageService",  
339 - "$modalInstance",  
340 - function(service, $modalInstance) {  
341 - var self = this;  
342 -  
343 - self.columns = service.getColumns();  
344 - self.orderColumns = service.getOrderColumns();  
345 -  
346 - self.confirm = function(result) {  
347 - // console.log(result);  
348 - // console.log(service.getOrderColumns());  
349 - $modalInstance.dismiss("cancel");  
350 -  
351 - }  
352 - }  
353 - ]  
354 -);  
355 -  
356 -// form.html控制器  
357 -angular.module('ScheduleApp').controller(  
358 - 'BusInfoManageFormCtrl',  
359 - [  
360 - 'BusInfoManageService',  
361 - '$stateParams',  
362 - '$state',  
363 - 'DataStore',  
364 - function(service, $stateParams, $state, DataStore) {  
365 - var self = this;  
366 - var Cars = service.getQueryClass();  
367 -  
368 - // 报废日期 日期控件开关  
369 - self.scrapDateOpen = false;  
370 - self.scrapDate_open = function() {  
371 - self.scrapDateOpen = true;  
372 - };  
373 -  
374 - // 启用日期 日期控件开关  
375 - self.openDateOpen = false;  
376 - self.openDate_open = function() {  
377 - self.openDateOpen = true;  
378 - };  
379 - // 取消日期 日期控件开关  
380 - self.closeDateOpen = false;  
381 - self.closeDate_open = function() {  
382 - self.closeDateOpen = true;  
383 - };  
384 -  
385 - // 欲保存的busInfo信息,绑定  
386 - self.busInfoForSave = new Cars;  
387 -  
388 - // 获取传过来的id,有的话就是修改,获取一遍数据  
389 - var id = $stateParams.id;  
390 - if (id) {  
391 - self.busInfoForSave = Cars.get({id: id}, function() {});  
392 - }  
393 -  
394 - // 提交方法  
395 - self.submit = function() {  
396 - console.log(self.busInfoForSave);  
397 -  
398 - // // 报废的车辆,修改原来的车辆终端号  
399 - // if (self.busInfoForSave.scrapState == true) {  
400 - // self.busInfoForSave.equipmentCode = "BF-" + self.busInfoForSave.equipmentCode;  
401 - // self.busInfoForSave.scrapCode = "BF-" + self.busInfoForSave.equipmentCode;  
402 - // }  
403 -  
404 -  
405 - // 保存或者更新  
406 - self.busInfoForSave.$save(function() {  
407 - DataStore.refreshData("cl");  
408 - $state.go("busInfoManage");  
409 - });  
410 - };  
411 - }  
412 - ]  
413 -);  
414 -  
415 -// detail.html控制器  
416 -angular.module('ScheduleApp').controller(  
417 - 'BusInfoManageDetailCtrl',  
418 - [  
419 - 'BusInfoManageService',  
420 - '$stateParams',  
421 - function(service, $stateParams) {  
422 - var self = this;  
423 - var Cars = service.getQueryClass();  
424 - var id = $stateParams.id;  
425 -  
426 - self.title = "";  
427 - self.busInfoForDetail = {};  
428 -  
429 - // 当转向到此页面时,就获取明细信息并绑定  
430 - self.busInfoForDetail = Cars.get({id: id}, function() {  
431 - self.title = "车辆 " + self.busInfoForDetail.insideCode + " 详细信息";  
432 - });  
433 - }  
434 - ]  
435 -);  
src/main/resources/static/pages/video/bus_info_route.js deleted 100644 → 0
1 -// ui route 配置  
2 -  
3 -/** 车辆基础信息模块配置route */  
4 -ScheduleApp.config([  
5 - '$stateProvider',  
6 - '$urlRouterProvider',  
7 - function($stateProvider, $urlRouterProvider) {  
8 - // 默认路由  
9 - //$urlRouterProvider.otherwise('/busConfig.html');  
10 -  
11 - $stateProvider  
12 - .state("busInfoManage", { // index页面  
13 - url: '/busInfoManage',  
14 - views: {  
15 - "": {  
16 - templateUrl: 'pages/scheduleApp/module/basicInfo/busInfoManage/index.html'  
17 - },  
18 - "busInfoManage_list@busInfoManage": {  
19 - templateUrl: 'pages/scheduleApp/module/basicInfo/busInfoManage/list.html'  
20 - }  
21 - },  
22 -  
23 - resolve: {  
24 - deps: ['$ocLazyLoad', function($ocLazyLoad) {  
25 - return $ocLazyLoad.load({  
26 - name: 'busInfoManage_module',  
27 - insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置  
28 - files: [  
29 - "assets/bower_components/angular-ui-select/dist/select.min.css",  
30 - "assets/bower_components/angular-ui-select/dist/select.min.js",  
31 - "assets/bower_components/angular-file-upload/dist/angular-file-upload.min.js",  
32 - "pages/scheduleApp/module/basicInfo/busInfoManage/module.js"  
33 - ]  
34 - });  
35 - }]  
36 - }  
37 - })  
38 - .state("busInfoManage_form", { // 添加车辆form  
39 - url: '/busInfoManage_form',  
40 - views: {  
41 - "": {templateUrl: 'pages/scheduleApp/module/basicInfo/busInfoManage/form.html'}  
42 - },  
43 - resolve: {  
44 - deps: ['$ocLazyLoad', function($ocLazyLoad) {  
45 - return $ocLazyLoad.load({  
46 - name: 'busInfoManage_form_module',  
47 - insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置  
48 - files: [  
49 - "assets/bower_components/angular-ui-select/dist/select.min.css",  
50 - "assets/bower_components/angular-ui-select/dist/select.min.js",  
51 - "pages/scheduleApp/module/basicInfo/busInfoManage/module.js"  
52 - ]  
53 - });  
54 - }]  
55 - }  
56 - })  
57 - .state("busInfoManage_edit", { // 修改车辆form  
58 - url: '/busInfoManage_edit/:id',  
59 - views: {  
60 - "": {templateUrl: 'pages/scheduleApp/module/basicInfo/busInfoManage/edit.html'}  
61 - },  
62 - resolve: {  
63 - deps: ['$ocLazyLoad', function($ocLazyLoad) {  
64 - return $ocLazyLoad.load({  
65 - name: 'busInfoManage_edit_module',  
66 - insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置  
67 - files: [  
68 - "assets/bower_components/angular-ui-select/dist/select.min.css",  
69 - "assets/bower_components/angular-ui-select/dist/select.min.js",  
70 - "pages/scheduleApp/module/basicInfo/busInfoManage/module.js"  
71 - ]  
72 - });  
73 - }]  
74 - }  
75 - })  
76 - .state("busInfoManage_detail", { // 车辆详细信息  
77 - url: '/busInfoManage_detail/:id',  
78 - views: {  
79 - "": {templateUrl: 'pages/scheduleApp/module/basicInfo/busInfoManage/detail.html'}  
80 - },  
81 - resolve: {  
82 - deps: ['$ocLazyLoad', function($ocLazyLoad) {  
83 - return $ocLazyLoad.load({  
84 - name: 'busInfoManage_detail_module',  
85 - insertBefore: '#ng_load_plugins_before', // 动态载入模块时放置的位置  
86 - files: [  
87 - "pages/scheduleApp/module/basicInfo/busInfoManage/module.js"  
88 - ]  
89 - });  
90 - }]  
91 - }  
92 - })  
93 - }  
94 -]);  
95 \ No newline at end of file 0 \ No newline at end of file
src/main/resources/static/pages/video/test.html deleted 100644 → 0
src/main/resources/static/pages/video/test.json deleted 100644 → 0
1 -{  
2 - "code": 0,  
3 - "count": 1000,  
4 - "data": [  
5 - {  
6 - "carCode": 1,  
7 - "name": "User-1",  
8 - "isParent": true  
9 - },  
10 - {  
11 - "carCode": 9,  
12 - "name": "User-9",  
13 - "type": 6,  
14 - "status": 2,  
15 - "score": 58,  
16 - "experience": 2414,  
17 - "sex": "女",  
18 - "city": "宿州市",  
19 - "description": "-",  
20 - "createTime": "2015-05-06 00:39:19",  
21 -  
22 - "isParent": true  
23 - },  
24 - {  
25 - "carCode": 10,  
26 - "name": "User-10",  
27 - "type": 4,  
28 - "status": 2,  
29 - "score": 89,  
30 - "experience": 97592,  
31 - "sex": "女",  
32 - "city": "钦州市",  
33 - "description": "-",  
34 - "createTime": "1985-05-26 03:50:09",  
35 -  
36 - "isParent": true  
37 - },  
38 - {  
39 - "carCode": 70,  
40 - "name": "User-70",  
41 - "type": 3,  
42 - "status": 3,  
43 - "score": 19,  
44 - "experience": 66961,  
45 - "sex": "女",  
46 - "city": "固原市",  
47 - "description": "-",  
48 - "createTime": "1992-04-11 09:13:05",  
49 -  
50 - "children": [],  
51 - "isParent": false  
52 - },  
53 - {  
54 - "carCode": 71,  
55 - "name": "User-71",  
56 - "type": 1,  
57 - "status": 3,  
58 - "score": 4,  
59 - "experience": 95553,  
60 - "sex": "女",  
61 - "city": "那曲地区",  
62 - "description": "-",  
63 - "createTime": "2019-07-31 00:30:49",  
64 -  
65 -  
66 - "isParent": true  
67 - },  
68 - {  
69 - "carCode": 91,  
70 - "name": "User-91",  
71 - "type": 3,  
72 - "status": 3,  
73 - "score": 61,  
74 - "experience": 26129,  
75 - "sex": "女",  
76 - "city": "白山市",  
77 - "description": "-",  
78 - "createTime": "2002-01-04 16:12:16",  
79 -  
80 - "isParent": true  
81 - },  
82 - {  
83 - "carCode": 138,  
84 - "name": "User-138",  
85 - "type": 1,  
86 - "status": 2,  
87 - "score": 99,  
88 - "experience": 71832,  
89 - "sex": "男",  
90 - "city": "阿里地区",  
91 - "description": "-",  
92 - "createTime": "1988-03-10 13:17:59",  
93 -  
94 - "isParent": true  
95 - }  
96 - ]  
97 -}  
98 \ No newline at end of file 0 \ No newline at end of file
src/main/resources/static/pages/video/treeview.min.js deleted 100644 → 0
1 -/**  
2 - * Minified by jsDelivr using Terser v5.19.2.  
3 - * Original file: /npm/jquery-treeview@1.4.2/jquery.treeview.js  
4 - *  
5 - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files  
6 - */  
7 -!function(a){a.extend(a.fn,{swapClass:function(a,e){var l=this.filter("."+a);return this.filter("."+e).removeClass(e).addClass(a),l.removeClass(a).addClass(e),this},replaceClass:function(a,e){return this.filter("."+a).removeClass(a).addClass(e).end()},hoverClass:function(e){return e=e||"hover",this.hover((function(){a(this).addClass(e)}),(function(){a(this).removeClass(e)}))},heightToggle:function(a,e){a?this.animate({height:"toggle"},a,e):this.each((function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"](),e&&e.apply(this,arguments)}))},heightHide:function(a,e){a?this.animate({height:"hide"},a,e):(this.hide(),e&&this.each(e))},prepareBranches:function(a){return a.prerendered||(this.filter(":last-child:not(ul)").addClass(e.last),this.filter((a.collapsed?"":"."+e.closed)+":not(."+e.open+")").find(">ul").hide()),this.filter(":has(>ul)")},applyClasses:function(l,s){if(this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview",(function(e){this==e.target&&s.apply(a(this).next())})).add(a("a",this)).hoverClass(),!l.prerendered){this.filter(":has(>ul:hidden)").addClass(e.expandable).replaceClass(e.last,e.lastExpandable),this.not(":has(>ul:hidden)").addClass(e.collapsable).replaceClass(e.last,e.lastCollapsable);var t=this.find("div."+e.hitarea);t.length||(t=this.prepend('<div class="'+e.hitarea+'"/>').find("div."+e.hitarea)),t.removeClass().addClass(e.hitarea).each((function(){var e="";a.each(a(this).parent().attr("class").split(" "),(function(){e+=this+"-hitarea "})),a(this).addClass(e)}))}this.find("div."+e.hitarea).click(s)},treeview:function(l){if((l=a.extend({cookieId:"treeview"},l)).toggle){var s=l.toggle;l.toggle=function(){return s.apply(a(this).parent()[0],arguments)}}function t(){a(this).parent().find(">.hitarea").swapClass(e.collapsableHitarea,e.expandableHitarea).swapClass(e.lastCollapsableHitarea,e.lastExpandableHitarea).end().swapClass(e.collapsable,e.expandable).swapClass(e.lastCollapsable,e.lastExpandable).find(">ul").heightToggle(l.animated,l.toggle),l.unique&&a(this).parent().siblings().find(">.hitarea").replaceClass(e.collapsableHitarea,e.expandableHitarea).replaceClass(e.lastCollapsableHitarea,e.lastExpandableHitarea).end().replaceClass(e.collapsable,e.expandable).replaceClass(e.lastCollapsable,e.lastExpandable).find(">ul").heightHide(l.animated,l.toggle)}this.data("toggler",t),this.addClass("treeview");var i=this.find("li").prepareBranches(l);switch(l.persist){case"cookie":var n=l.toggle;l.toggle=function(){var e;e=[],i.each((function(l,s){e[l]=a(s).is(":has(>ul:visible)")?1:0})),a.cookie(l.cookieId,e.join(""),l.cookieOptions),n&&n.apply(this,arguments)},function(){var e=a.cookie(l.cookieId);if(e){var s=e.split("");i.each((function(e,l){a(l).find(">ul")[parseInt(s[e])?"show":"hide"]()}))}}();break;case"location":var r=this.find("a").filter((function(){return 0==location.href.toLowerCase().indexOf(this.href.toLowerCase())}));if(r.length){var o=r.addClass("selected").parents("ul, li").add(r.next()).show();l.prerendered&&o.filter("li").swapClass(e.collapsable,e.expandable).swapClass(e.lastCollapsable,e.lastExpandable).find(">.hitarea").swapClass(e.collapsableHitarea,e.expandableHitarea).swapClass(e.lastCollapsableHitarea,e.lastExpandableHitarea)}}return i.applyClasses(l,t),l.control&&(!function(l,s){function i(s){return function(){return t.apply(a("div."+e.hitarea,l).filter((function(){return!s||a(this).parent("."+s).length}))),!1}}a("a:eq(0)",s).click(i(e.collapsable)),a("a:eq(1)",s).click(i(e.expandable)),a("a:eq(2)",s).click(i())}(this,l.control),a(l.control).show()),this}}),a.treeview={};var e=a.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"}}(jQuery);  
8 -//# sourceMappingURL=/sm/fda41ce3f0a0e628b6a53a2967b92988cf1a199419d5a03633eecec1d1c8f2d1.map  
9 \ No newline at end of file 0 \ No newline at end of file
src/main/resources/static/pages/video/video.html
1 -<script type="text/javascript" src="layui.js"></script>  
2 -<script type="text/javascript" src="https://www.helloweba.net/demo/2018/hls/hls.js" />  
3 -<script src="static/SkeyeWebPlayer/SkeyeWebPlayer.js"></script>  
4 -  
5 -<link href="css/layui.css" rel="stylesheet">  
6 -  
7 -<script type="text/javascript">  
8 - $(document).ready(function () {  
9 - $.getJSON("/video/tree", null, function (rep) {  
10 - if(rep.status=="SUCCESS"){  
11 - initTree(rep.data);  
12 - }  
13 - initTable();  
14 - });  
15 -  
16 - });  
17 -  
18 - function initTree(data) {  
19 - layui.use(function () {  
20 - var tree = layui.tree;  
21 - // 渲染  
22 - tree.render({  
23 - elem: '#video_tree',  
24 - data: data,  
25 - onlyIconControl: true, // 是否仅允许节点左侧图标控制展开收缩  
26 - showLine: true, // 是否开启连接线  
27 - click: function (node) {  
28 - initTable(node);  
29 - }  
30 - });  
31 - });  
32 - }  
33 -  
34 -  
35 - function initTable(treeNode) {  
36 - var queryURL = "/video/tree/table?size=5";  
37 - if(treeNode){  
38 - if(treeNode.data.type ===1){  
39 - queryURL = queryURL+"&businessCode_eq="+treeNode.data.code;  
40 - }  
41 -  
42 - if(treeNode.data.type===2){  
43 - queryURL = queryURL+"&brancheCompanyCode_eq="+treeNode.data.code;  
44 - }  
45 - }  
46 - layui.use(function () {  
47 - var treeTable = layui.treeTable;  
48 - // 渲染  
49 - treeTable.render({  
50 - elem: '#treeTable',  
51 - url: queryURL,  
52 - treeColIndex:1,  
53 - treeSpid:0,  
54 - maxHeight: '701px',  
55 - cols: [[  
56 - {field: 'name', title: '车辆编号', width: 160},  
57 - {field: 'insideCode', title: '内部编号', width: 160},  
58 - {field: 'equipmentCode', title: '设备编号', width: 160},  
59 - {field: 'carPlate', title: '车牌号', width: 160},  
60 - {field: 'company', title: '所在公司', width: 160},  
61 - {field: 'brancheCompany', title: '所在分公司', width: 160},  
62 - {field: 'sfdc', title: '电车', width: 80,templet:function (obj){if(obj.sfdc=='true' || obj.sfdc== true){return "是"}else if(obj.sfdc=='false' || obj.sfdc== false){return "否";} return "未知";}},  
63 - {field: 'scrapState', title: '状态', width: 80,templet:function (obj){if(obj.scrapState=='true' || obj.scrapState== true){return "是"}else if(obj.scrapState=='false' || obj.scrapState== false){return "否";} return "未知";}}  
64 - ]],  
65 - page: true  
66 - });  
67 - treeTable.on('rowDouble(treeTable)', function (obj){  
68 - var targetDataIndex =obj.dataIndex+"-0";  
69 - $("div[lay-table-id='treeTable']").find("tr").each(function (index,node){  
70 - var sourceDataIndex = $(node).attr("data-index");  
71 - if(sourceDataIndex===targetDataIndex){  
72 - queryChannelByCarNo(node,obj);  
73 - return;  
74 - }  
75 - });  
76 - });  
77 - });  
78 - }  
79 -  
80 - function queryChannelByCarNo(treeNode,obj){  
81 - var url="/video/car/channel/"+obj.data.name;  
82 - $.getJSON(url,function (rep){  
83 - if(rep.status==="SUCCESS"){  
84 - var html ="<td data-field=\"name\" colspan='8' data-key=\"1-"+obj.dataIndex+"-0\" class=\"\" >";  
85 - html+="<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\" class=\"layui-table\" style='padding-left: 15px;boder:1px solid #000;margin-bottom: 15px;'><thead><tr>";  
86 - html += "<th data-field=\"name\" data-key=\"1-"+obj.dataIndex+"-0\" class=\"\" title=\"通道编号\"><div class=\"layui-table-cell \" style='width: 200px;'><span>通道编号</span></div></th>";  
87 - html += "<th data-field=\"name\" data-key=\"2-"+obj.dataIndex+"-0\" class=\"\" title=\"设备编号\"><div class=\"layui-table-cell \" style='width: 200px;'><span>设备编号</span></div></th>";  
88 - html += "<th data-field=\"name\" data-key=\"3-"+obj.dataIndex+"-0\" class=\"\" title=\"通道名称\"><div class=\"layui-table-cell\" style='width: 100px;'><span>通道名称</span></div></th>";  
89 - html += "<th data-field=\"name\" data-key=\"4-"+obj.dataIndex+"-0\" class=\"\" title=\"快照\"><div class=\"layui-table-cell \"><span>快照</span></div></th>";  
90 - html += "<th data-field=\"name\" data-key=\"5-"+obj.dataIndex+"-0\" class=\"\" title=\"厂家\"><div class=\"layui-table-cell \" style='width: 100px;'><span>厂家</span></div></th>";  
91 - html += "<th data-field=\"name\" data-key=\"6-"+obj.dataIndex+"-0\" class=\"\" title=\"开启音频\"><div class=\"layui-table-cell \"><span>开启音频</span></div></th>";  
92 - html += "<th data-field=\"name\" data-key=\"7-"+obj.dataIndex+"-0\" class=\"\" title=\"状态\"><div class=\"layui-table-cell \"><span>状态</span></div></th>";  
93 - html += "<th data-field=\"name\" data-key=\"8-"+obj.dataIndex+"-0\" class=\"\" title=\"操作\"><div class=\"layui-table-cell \" style='width: 100px;'><span>操作</span></div></th>";  
94 - html +="</tr>";  
95 - if(rep.data){  
96 - $.each(rep.data,function (index,node){  
97 - html+="<tr><td>"+node.channelId+"</td><td>"+node.deviceId+"</td><td>"+node.name+"</td><td>"+getBigSnap(rep.channelImageURL,node.deviceId,node.channelId)+"</td><td>"+node.manufacture;  
98 - html +="</td><td>"+hasAudioText(node.hasAudio)+"</td><td>"+wvpStatusText(node.status)+"</td><td><button class=\"layui-btn layui-btn-primary layui-border\" onclick=\"playWvpVideo('";  
99 - html += rep.wvpPlayURL+"','"+node.deviceId+"','"+node.channelId+"')\">播放</button><button</button></td></tr>";  
100 - });  
101 - }  
102 -  
103 - html +="</thead></table></td>";  
104 -  
105 - $(treeNode).html(html);  
106 - }  
107 - })  
108 - }  
109 -  
110 - function hasAudioText(hasAudio){  
111 - return "true" == hasAudio || true== hasAudio?"开启":"关闭";  
112 - }  
113 -  
114 - function wvpStatusText(status){  
115 - return "true" == status || true== status?"在线":"离线";  
116 - }  
117 -  
118 - function getBigSnap(imageURL,deviceId,channelId){  
119 - return "<image src="+imageURL+deviceId+"/"+channelId+" />"  
120 - }  
121 -  
122 - function playWvpVideo(playURL,deviceId,channelId){  
123 - var idDiv = "video_"+(Date.now());  
124 - var html="'<div id='"+idDiv+"' style='padding-top: 0;'></div>'";  
125 -  
126 - let player = null;  
127 - var myVar= null;  
128 - var playURL1 = playURL+deviceId+"_"+channelId+".live.mp4";  
129 - console.log(playURL1);  
130 -  
131 - var index = layer.open({  
132 - type:1,  
133 - title:"视频播放",  
134 - area:['1000px','650px'],  
135 - height:'800px',  
136 - content:html,  
137 - success: function(layero, index, that){  
138 - player = playVideo(playURL1,idDiv);  
139 - player.play();  
140 -  
141 - myVar=setInterval(function(){  
142 - if(player){  
143 - player.destroy();  
144 - player = null;  
145 - }  
146 - player = playVideo(playURL1,idDiv);  
147 - player.play();  
148 - },300000);  
149 -  
150 -  
151 - },  
152 - beforeEnd: function(layero, index, that){  
153 - if(player){  
154 - player.destroy();  
155 - player = null;  
156 - }  
157 -  
158 - if(myVar){  
159 - window.clearInterval(myVar);  
160 - myVar = null;  
161 - }  
162 -  
163 - $("#"+idDiv).html("");  
164 - }  
165 - });  
166 - }  
167 -  
168 - function playVideo(url,ID){  
169 - return new WebMediaPlayer( url, ID, function (){  
170 - console.log("ddddddddddddd");  
171 - }, {  
172 - cbUserPtr: this,  
173 - decodeType: 'auto',  
174 - openAudio: true,  
175 - autoplay:true,  
176 - bigPlay: false,  
177 - showMode: false  
178 - });  
179 - }  
180 -  
181 -  
182 -</script>  
183 1
184 <div class="page-head"> 2 <div class="page-head">
185 <div class="page-title"> 3 <div class="page-title">
@@ -191,7 +9,9 @@ @@ -191,7 +9,9 @@
191 <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> 9 <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
192 <li><span class="active">视频管理</span> <i class="fa fa-circle"></i></li> 10 <li><span class="active">视频管理</span> <i class="fa fa-circle"></i></li>
193 </ul> 11 </ul>
194 - 12 +<div id="deviceVedioDiv" style="display: none">
  13 + <div>时间:<input type="input" id="dateTimeStr" /></div>
  14 +</div>
195 15
196 <div class="row"> 16 <div class="row">
197 <div class="col-md-4" style="padding-right: 0px;width: 20%"> 17 <div class="col-md-4" style="padding-right: 0px;width: 20%">
@@ -210,5 +30,52 @@ @@ -210,5 +30,52 @@
210 </div> 30 </div>
211 </div> 31 </div>
212 </div> 32 </div>
  33 +
  34 + <div id="deviceVideoDiv" style="display: none">
  35 +
  36 + <div class="layui-form-item" style="width: 37%; float: left">
  37 + <div class="layui-inline">
  38 + <label class="layui-form-label">时间</label>
  39 + <div class="layui-input-inline layui-input-wrap">
  40 + <input type="text" placeholder="请选择需要查看的时间" autocomplete="off" class="layui-input" id="deviceVideoDate"/>
  41 + </div>
  42 + <div class="layui-form-mid" style="padding: 0!important;">
  43 + <button type="button" class="layui-btn layui-btn-primary" lay-on="get-vercode" id="queryDeviecChannel">查询</button>
  44 + </div>
  45 + </div>
  46 + <div class="layui-table-fixed-l" >
  47 + <div class="layui-table-body" style="height: 500px;overflow:auto;">
  48 + <table cellspacing="0" cellpadding="0" border="0" class="layui-table"><tbody id="deviceVideoTbody"></tbody></table>
  49 + </div>
  50 + </div>
  51 + </div>
  52 + <div id="videoPlay" style=" width: 62%;float: right">
  53 + <div style="height:550px;width:99%;background-color: #0d1318"></div>
  54 + </div>
  55 + </div>
  56 +
  57 + <div id="skeyewebplayerDiv" style="display: none">
  58 + <div style="float: left;width: 20%;">
  59 + <div>通道列表</div>
  60 + <div id="channelList"></div>
  61 + </div>
  62 +
  63 + <div style="width: 79%" id="skeyewebplayerDiv_main">
  64 + <div>分屏:
  65 + <a href="#">□</a>
  66 + <a href="#">▤</a>
  67 + <a href="#">▦</a>
  68 + </div>
  69 + </div>
  70 + </div>
213 </div> 71 </div>
214 72
  73 +<script type="text/html" id="treeTable-tools">
  74 + <div class="layui-btn-container">
  75 + <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="SkeyeWebPlayerEvent">分屏显示</a>
  76 + </div>
  77 +</script>
  78 +
  79 +<script src="static/SkeyeWebPlayer/SkeyeWebPlayer.js"></script>
  80 +<script src="video.js"></script>
  81 +
src/main/resources/static/pages/video/video.js 0 → 100644
  1 +var loading = loadingFunction();
  2 +var player = null;
  3 +$(document).ready(function () {
  4 + $.getJSON("/video/tree", null, function (rep) {
  5 + if (rep.status == "SUCCESS") {
  6 + initTree(rep.data);
  7 + }
  8 + initTable();
  9 + });
  10 +
  11 +});
  12 +
  13 +function initTree(data) {
  14 + layui.use(function () {
  15 + var tree = layui.tree;
  16 + // 渲染
  17 + tree.render({
  18 + elem: '#video_tree',
  19 + data: data,
  20 + onlyIconControl: true, // 是否仅允许节点左侧图标控制展开收缩
  21 + showLine: true, // 是否开启连接线
  22 + click: function (node) {
  23 + initTable(node);
  24 + }
  25 + });
  26 + closeLoading();
  27 + });
  28 +}
  29 +
  30 +
  31 +function initTable(treeNode) {
  32 + var queryURL = "/video/tree/table?size=5";
  33 + if (treeNode) {
  34 + if (treeNode.data.type === 1) {
  35 + queryURL = queryURL + "&businessCode_eq=" + treeNode.data.code;
  36 + }
  37 +
  38 + if (treeNode.data.type === 2) {
  39 + queryURL = queryURL + "&brancheCompanyCode_eq=" + treeNode.data.code;
  40 + }
  41 + }
  42 + layui.use(function () {
  43 + var treeTable = layui.treeTable;
  44 + // 渲染
  45 + treeTable.render({
  46 + elem: '#treeTable',
  47 + url: queryURL,
  48 + loading: true,
  49 + treeColIndex: 1,
  50 + treeSpid: 0,
  51 + maxHeight: '701px',
  52 + cols: [[
  53 + {field: 'name', title: '车辆编号', width: 140},
  54 + {field: 'insideCode', title: '内部编号', width: 120},
  55 + {field: 'equipmentCode', title: '设备编号', width: 160},
  56 + {field: 'carPlate', title: '车牌号', width: 160},
  57 + {field: 'company', title: '所在公司', width: 160},
  58 + {field: 'brancheCompany', title: '所在分公司', width: 160},
  59 + {
  60 + field: 'sfdc', title: '电车', width: 80, templet: function (obj) {
  61 + if (obj.sfdc == 'true' || obj.sfdc == true) {
  62 + return "是"
  63 + } else if (obj.sfdc == 'false' || obj.sfdc == false) {
  64 + return "否";
  65 + }
  66 + return "未知";
  67 + }
  68 + },
  69 + {
  70 + field: 'scrapState', title: '状态', width: 80, templet: function (obj) {
  71 + if (obj.scrapState == 'true' || obj.scrapState == true) {
  72 + return "是"
  73 + } else if (obj.scrapState == 'false' || obj.scrapState == false) {
  74 + return "否";
  75 + }
  76 + return "未知";
  77 + }
  78 + },
  79 + { title:'操作', width: 80, toolbar: '#treeTable-tools'}
  80 + ]],
  81 + page: true
  82 + });
  83 + treeTable.on('rowDouble(treeTable)', function (obj) {
  84 + console.log("cccccccccccc");
  85 + var targetDataIndex = obj.dataIndex + "-0";
  86 + $("div[lay-table-id='treeTable']").find("tr").each(function (index, node) {
  87 + var sourceDataIndex = $(node).attr("data-index");
  88 + if (sourceDataIndex === targetDataIndex) {
  89 + queryChannelByCarNo(node, obj);
  90 + return;
  91 + }
  92 + });
  93 +
  94 +
  95 + });
  96 +
  97 + treeTable.on('tool(treeTable)', function(obj){
  98 + switch(obj.event){
  99 + case 'SkeyeWebPlayerEvent':
  100 + skeyewebplayerOpen();
  101 + break;
  102 + }
  103 + });
  104 + });
  105 +}
  106 +
  107 +function queryChannelByCarNo(treeNode, obj) {
  108 + loading = loadingFunction();
  109 + var url = "/video/car/channel/" + obj.data.name;
  110 + $.getJSON(url, function (rep) {
  111 + if (rep.status === "SUCCESS") {
  112 + var html = "<td data-field=\"name\" colspan='8' data-key=\"1-" + obj.dataIndex + "-0\" class=\"\" >";
  113 + html += "<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\" class=\"layui-table\" style='padding-left: 15px;boder:1px solid #000;margin-bottom: 15px;'><thead><tr>";
  114 + html += "<th data-field=\"name\" data-key=\"1-" + obj.dataIndex + "-0\" class=\"\" title=\"通道编号\"><div class=\"layui-table-cell \" style='width: 200px;'><span>通道编号</span></div></th>";
  115 + html += "<th data-field=\"name\" data-key=\"2-" + obj.dataIndex + "-0\" class=\"\" title=\"设备编号\"><div class=\"layui-table-cell \" style='width: 200px;'><span>设备编号</span></div></th>";
  116 + html += "<th data-field=\"name\" data-key=\"3-" + obj.dataIndex + "-0\" class=\"\" title=\"通道名称\"><div class=\"layui-table-cell\" style='width: 100px;'><span>通道名称</span></div></th>";
  117 + html += "<th data-field=\"name\" data-key=\"4-" + obj.dataIndex + "-0\" class=\"\" title=\"快照\"><div class=\"layui-table-cell \"><span>快照</span></div></th>";
  118 + html += "<th data-field=\"name\" data-key=\"5-" + obj.dataIndex + "-0\" class=\"\" title=\"厂家\"><div class=\"layui-table-cell \" style='width: 100px;'><span>厂家</span></div></th>";
  119 + html += "<th data-field=\"name\" data-key=\"6-" + obj.dataIndex + "-0\" class=\"\" title=\"开启音频\"><div class=\"layui-table-cell \"><span>开启音频</span></div></th>";
  120 + html += "<th data-field=\"name\" data-key=\"7-" + obj.dataIndex + "-0\" class=\"\" title=\"状态\"><div class=\"layui-table-cell \"><span>状态</span></div></th>";
  121 + html += "<th data-field=\"name\" data-key=\"8-" + obj.dataIndex + "-0\" class=\"\" title=\"操作\"><div class=\"layui-table-cell \" style='width: 100px;'><span>操作</span></div></th>";
  122 + html += "</tr>";
  123 + if (rep.data) {
  124 + $.each(rep.data, function (index, node) {
  125 + html += "<tr><td>" + node.channelId + "</td><td>" + node.deviceId + "</td><td>" + node.name + "</td><td>" + getBigSnap(rep.channelImageURL, node.deviceId, node.channelId) + "</td><td>" + node.manufacture;
  126 + html += "</td><td>" + hasAudioText(node.hasAudio) + "</td><td>" + wvpStatusText(node.status) + "</td><td><button class=\"layui-btn layui-btn-primary layui-border\" onclick=\"playWvpVideo('";
  127 + html += rep.wvpPlayURL + "','" + node.deviceId + "','" + node.channelId + "')\">播放</button><button class=\"layui-btn layui-btn-primary layui-border\" onclick=\"deviceVedioPage('" + node.deviceId + "','" + node.channelId + "')\">设备录像</button></td></tr>";
  128 + });
  129 + }
  130 +
  131 + html += "</thead></table></td>";
  132 +
  133 + $(treeNode).html(html);
  134 +
  135 + closeLoading();
  136 + }
  137 + })
  138 +}
  139 +
  140 +function hasAudioText(hasAudio) {
  141 + return "true" == hasAudio || true == hasAudio ? "开启" : "关闭";
  142 +}
  143 +
  144 +function wvpStatusText(status) {
  145 + return "true" == status || true == status ? "在线" : "离线";
  146 +}
  147 +
  148 +function getBigSnap(imageURL, deviceId, channelId) {
  149 + return "<image src=" + imageURL + deviceId + "/" + channelId + " />"
  150 +}
  151 +
  152 +function playWvpVideo(playURL, deviceId, channelId) {
  153 + var idDiv = "video_" + (Date.now());
  154 + var html = "'<div id='" + idDiv + "' style='padding-top: 0;'></div>'";
  155 +
  156 + let player = null;
  157 + var myVar = null;
  158 + var playURL1 = playURL + deviceId + "_" + channelId + ".live.mp4";
  159 +
  160 + var index = layer.open({
  161 + type: 1,
  162 + title: "视频播放",
  163 + area: ['1000px', '650px'],
  164 + height: '800px',
  165 + content: html,
  166 + success: function (layero, index, that) {
  167 + player = playVideo(playURL1, idDiv);
  168 + player.play();
  169 +
  170 + myVar = setInterval(function () {
  171 + if (player) {
  172 + player.destroy();
  173 + player = null;
  174 + }
  175 + player = playVideo(playURL1, idDiv);
  176 + player.play();
  177 + }, 300000);
  178 +
  179 +
  180 + },
  181 + beforeEnd: function (layero, index, that) {
  182 + if (player) {
  183 + player.destroy();
  184 + player = null;
  185 + }
  186 +
  187 + if (myVar) {
  188 + window.clearInterval(myVar);
  189 + myVar = null;
  190 + }
  191 +
  192 + $("#" + idDiv).html("");
  193 + }
  194 + });
  195 +}
  196 +
  197 +function playVideo(url, ID) {
  198 + return new WebMediaPlayer(url, ID, function () {
  199 +
  200 + }, {
  201 + cbUserPtr: this,
  202 + decodeType: 'auto',
  203 + openAudio: true,
  204 + autoplay: true,
  205 + bigPlay: false,
  206 + showMode: false
  207 + });
  208 +}
  209 +
  210 +function loadingFunction() {
  211 + closeLoading();
  212 + var loading = layer.load(0, {
  213 + shade: true
  214 + });
  215 + return loading;
  216 +}
  217 +
  218 +function closeLoading() {
  219 + console.log("===============?" + loading);
  220 + if (loading) {
  221 + layer.close(loading);
  222 + loading = null;
  223 + }
  224 +}
  225 +
  226 +function deviceVedioPage(device, channel) {
  227 + var idDiv = "device_video_" + (Date.now());
  228 + var html = "<div id='" + idDiv + "'></div>";
  229 +
  230 + var index = layer.open({
  231 + type: 1,
  232 + title: "设备录像",
  233 + area: ['1300px', '650px'],
  234 + content: html,
  235 + success: function (layero, index, that) {
  236 + $("#" + idDiv).html($("#deviceVideoDiv").html());
  237 + var $deviceVideoDiv = $("#" + idDiv);
  238 + $("#deviceVideoDate", $deviceVideoDiv).datetimepicker({
  239 + format: 'YYYY-MM-DD',
  240 + locale: 'zh-cn'
  241 + });
  242 +
  243 + $("#queryDeviecChannel", $deviceVideoDiv).click(function () {
  244 + deviceVidemoQueryHistory(device, channel, $deviceVideoDiv, idDiv);
  245 + })
  246 + }, beforeEnd: function (layero, index, that) {
  247 + if (player) {
  248 + player.destroy();
  249 + player = null;
  250 + }
  251 + }
  252 + });
  253 +}
  254 +
  255 +function deviceVidemoQueryHistory(device, channel, $deviceVideoDiv, idDiv) {
  256 + var dateStr = $("#deviceVideoDate", $deviceVideoDiv).val();
  257 + if (null === dateStr || undefined === dateStr || "" === dateStr) {
  258 + layer.alert('请选择需要查看的时间');
  259 + return;
  260 + }
  261 + loading = loadingFunction();
  262 + var url = "/video/car/channel/history/" + device + "/" + channel + "/" + dateStr;
  263 + $.getJSON(url, function (resp) {
  264 + if (resp.status === "SUCCESS") {
  265 + var html = "<tr>";
  266 + $.each(resp.data, function (index, node) {
  267 + html += "<td><button class=\"layui-btn layui-btn-primary layui-border\" onclick=\"playDeviceVidemoQueryHistory('" + idDiv + "','" + resp.wvpPlayURL + "','" + device + "','" + channel + "','" + node.startTime + "','" + node.endTime + "','" + resp.token + "')\">" + node.filePath + "</button></td>";
  268 +
  269 + if (index % 2 === 1) {
  270 + html += "</tr><tr>";
  271 + }
  272 + });
  273 +
  274 + $("#deviceVideoTbody", $deviceVideoDiv).html(html);
  275 + closeLoading();
  276 + }
  277 + });
  278 +}
  279 +
  280 +function playDeviceVidemoQueryHistory(idDiv, url, device, channel, startTime, endTime, token) {
  281 + if (player) {
  282 + player.destroy();
  283 + player = null;
  284 + }
  285 + startTime = startTime.replace("-", "").replace("-", "").replace(":", "").replace(":", "").replace(" ", "");
  286 + endTime = endTime.replace("-", "").replace("-", "").replace(":", "").replace(":", "").replace(" ", "");
  287 + console.log(startTime);
  288 + url = url + device + "_" + channel + "_" + startTime + "_" + endTime + ".live.mp4";
  289 + console.log(url);
  290 + var idDiv1 = "device_video_play_" + (Date.now());
  291 + $("#videoPlay", $("#" + idDiv)).html("<div id='" + idDiv1 + "' style='height:550px;width:99%'></div>")
  292 + player = playVideo(url, idDiv1);
  293 + player.play();
  294 +}
  295 +
  296 +function skeyewebplayerOpen(){
  297 + layer.open({
  298 + type: 1,
  299 + content: '<div style="padding: 16px;" id="skeyewebplayer"></div>',
  300 + area: ['320px', '195px'], // 初始宽高
  301 + success: function(layero, index){
  302 + layer.full(index); // 最大化
  303 + $("#skeyewebplayer").html($("#skeyewebplayerDiv").html());
  304 + }
  305 + });
  306 +}
0 \ No newline at end of file 307 \ No newline at end of file