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 101 public Map<String, Object> queryChannels(@PathVariable String carNo) {
102 102 Map<String, Object> result = new HashMap<>();
103 103 try {
  104 +
  105 +
104 106 List<Map<String, Object>> videoChannels = videoService.getVideoChannel(carNo);
105 107 result.put("status", ResponseCode.SUCCESS);
106 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 112 } catch (Exception e) {
110 113 log.error("查询车辆通道异常:[{}]", carNo, e);
111 114 result.put("status", ResponseCode.ERROR);
112 115 }
113 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 22 import org.apache.http.client.methods.HttpPost;
23 23 import org.apache.http.entity.StringEntity;
24 24 import org.apache.http.impl.client.CloseableHttpClient;
  25 +import org.geolatte.geom.M;
25 26 import org.springframework.beans.BeanUtils;
26 27 import org.springframework.beans.factory.annotation.Autowired;
27 28 import org.springframework.stereotype.Service;
... ... @@ -69,6 +70,17 @@ public class VideoServiceImpl implements VideoService {
69 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 86 * @author liujun
... ... @@ -215,7 +227,7 @@ public class VideoServiceImpl implements VideoService {
215 227 String url = StringUtils.replace(wvpConfig.getChannelListOfCarNoURL(), "{carNo}", carNo);
216 228 try {
217 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 232 } catch (Exception e) {
221 233 log.error("get wvp of channel list error[{}];", url, e);
... ... @@ -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 268 public static StringBuilder get(String url, Map<String, Object> headers) throws Exception {
227 269 CloseableHttpClient httpClient = null;
228 270 CloseableHttpResponse response = null;
... ... @@ -284,7 +326,7 @@ public class VideoServiceImpl implements VideoService {
284 326 Map<String, Object> resultMap = (Map<String, Object>) JSON.parse(resultStr);
285 327 Integer code = (Integer) resultMap.get("code");
286 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 * @author liujun
9 9 * @date 2024年07月02日 14:30
10 10 */
11   -@Component
12 11 @Data
  12 +@Component
13 13 public class WvpConfig {
14 14 @Value("${wvp.login.user}")
15 15 private String userName;
... ... @@ -25,4 +25,7 @@ public class WvpConfig {
25 25  
26 26 @Value("${wvp.channel.play.url}")
27 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 19 List<VideoTree> combinationTree();
20 20  
21 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 14  
15 15 #DATABASE
16 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 18 spring.datasource.username= root
19 19 spring.datasource.password= root2jsp
20 20 spring.datasource.type= com.zaxxer.hikari.HikariDataSource
... ... @@ -31,7 +31,7 @@ spring.datasource.hikari.connection-test-query= SELECT 1
31 31 spring.datasource.hikari.validation-timeout= 3000
32 32 spring.datasource.hikari.register-mbeans=true
33 33  
34   -kafka.use= true
  34 +kafka.use= false
35 35 spring.kafka.consumer.bootstrap-servers= 192.170.100.114:9092,192.170.100.114:9093,192.170.100.114:9094
36 36 spring.kafka.consumer.group-id= schedule-system-test
37 37 spring.kafka.consumer.auto-offset-reset= latest
... ... @@ -66,8 +66,16 @@ admin.mail= 3090342880@qq.com
66 66 enabled.whiteip= false
67 67 enabled.authority= false
68 68  
69   -sso.enabled= true
  69 +sso.enabled= false
70 70 sso.systemcode = SYS0023
71 71 sso.http.url.login= https://112.64.45.51/portal/index.html#/login
72 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 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 83 \ No newline at end of file
... ...
src/main/resources/static/index.html
... ... @@ -85,6 +85,7 @@
85 85 <link
86 86 href="/metronic_v4.5.4/plugins/tipso/css/tipso.css"
87 87 rel="stylesheet" type="text/css" />
  88 + <link href="/metronic_v4.5.4/layui/css/layui.css" rel="stylesheet">
88 89  
89 90 <style type="text/css">
90 91 .searchForm {
... ... @@ -681,5 +682,6 @@
681 682 <!-- RSA加密 -->
682 683 <script src="/assets/plugins/jsencrypt.min.js"></script>
683 684 <script src="/assets/js/eventproxy.js"></script>
  685 +<script src="/metronic_v4.5.4/layui/layui.js" ></script>
684 686 </body>
685 687 </html>
686 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 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 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 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 2 <div class="page-head">
185 3 <div class="page-title">
... ... @@ -191,7 +9,9 @@
191 9 <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
192 10 <li><span class="active">视频管理</span> <i class="fa fa-circle"></i></li>
193 11 </ul>
194   -
  12 +<div id="deviceVedioDiv" style="display: none">
  13 + <div>时间:<input type="input" id="dateTimeStr" /></div>
  14 +</div>
195 15  
196 16 <div class="row">
197 17 <div class="col-md-4" style="padding-right: 0px;width: 20%">
... ... @@ -210,5 +30,52 @@
210 30 </div>
211 31 </div>
212 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 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 307 \ No newline at end of file
... ...