Files
SIPAIIS_WMS_JSSW/WebRoot/jsp/work/cameraList.jsp

646 lines
28 KiB
Plaintext
Raw Permalink Normal View History

2026-01-16 14:13:44 +08:00
<%@page import="com.sipai.entity.maintenance.Maintenance" %>
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page import="com.sipai.entity.base.ServerObject" %>
<%@ taglib uri="http://www.springsecurity.org/jsp" prefix="security" %>
<!DOCTYPE html>
<!-- <html lang="zh-CN"> -->
<!-- BEGIN HEAD -->
<head>
<title><%= ServerObject.atttable.get("TOPTITLE")%>
</title>
<!-- 引用页头及CSS页-->
<%-- <jsp:include page="/jsp/inc.jsp"></jsp:include>--%>
<jsp:include page="/jsp/incProVisual.jsp"></jsp:include>
<%@ page import="com.sipai.tools.Mqtt" %>
<%@ page import="org.springframework.context.ApplicationContext" %>
<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
<%-- mqtt依赖--%>
<script src="<%=request.getContextPath()%>/JS/mqtt/mqtt.min.js" type="text/javascript"></script>
<script type="text/javascript">
var addFun = function () {
$.post(ext.contextPath + '/work/camera/add.do', {companyId: unitId}, function (data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
var editFun = function (id) {
$.post(ext.contextPath + '/work/camera/edit.do', {id: id}, function (data) {
$("#subDiv").html(data);
openModal('subModal');
});
};
var viewFun = function (id, type) {
$.post(ext.contextPath + '/work/camera/showCameraDetail.do', {id: id, type: type}, function (data) {
$("#subDiv").html(data);
openModal('subModal');
});
}
var viewVideoFun = function (id, channel) {
$.post(ext.contextPath + '/work/camera/showCameraVideo.do', {
id: id,
nowUrl: window.location.host
}, function (data) {
$("#subDiv").html(data);
openModal('subCameraModal');
});
}
Date.prototype.format = function (format) {
var args = {
"M+": this.getMonth() + 1,
"d+": this.getDate(),
"h+": this.getHours(),
"m+": this.getMinutes(),
"s+": this.getSeconds(),
"q+": Math.floor((this.getMonth() + 3) / 3), //quarter
"S": this.getMilliseconds()
};
if (/(y+)/.test(format))
format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var i in args) {
var n = args[i];
if (new RegExp("(" + i + ")").test(format))
format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? n : ("00" + n).substr(("" + n).length));
}
return format;
};
var hisCameraViewWindow = null;
var definitionSt = 'standard';
function showHisCamera(id) {
var time = new Date(new Date().getTime() - 60 * 60 * 1000).format("yyyy-MM-dd hh:mm:ss")
hisCameraViewWindow = window.open(ext.contextPath + "/work/camera/hisCameraView.do?id=" + id + "&definitionSt=" + definitionSt + "&time=" + time, 'hisCameraViewWindow', 'width=720,height=480,top=200,left=300,toolbar=0,menubar=0,scrollbars=0,resizable=0,location=0,status=0')
// console.log(ext.contextPath + "/work/camera/hisCameraView.do?id=" + id + "&definitionSt=" + definitionSt + "&time=" + time, 'hisCameraViewWindow', 'width=720,height=480,top=200,left=300,toolbar=0,menubar=0,scrollbars=0,resizable=0,location=0,status=0')
hisCameraViewWindow.focus();
}
// var viewVideoHFFun = function(id,channel){
// $.post(ext.contextPath + '/work/camera/showVideo.do', {id:id,time:$('#datetimepicker').val()} , function(data) {
// $("#subDiv").html(data);
// openModal('subModal');
// });
// }
var deletesFun = function () {
var checkedItems = $("#table").bootstrapTable('getSelections');
var datas = "";
$.each(checkedItems, function (index, item) {
datas += item.id + ",";
});
if (datas == "") {
showAlert('d', '请先选择记录', 'mainAlertdiv');
} else {
swal({
text: "您确定要删除此记录?",
dangerMode: true,
buttons: {
cancel: {
text: "取消",
value: null,
visible: true,
className: "btn btn-default btn-sm",
closeModal: true,
},
confirm: {
text: "确定",
value: true,
visible: true,
className: "btn btn-danger btn-sm",
closeModal: true
}
}
})
.then(function (willDelete) {
if (willDelete) {
$.post(ext.contextPath + '/work/camera/deletes.do', {ids: datas}, function (data) {
if (data > 0) {
$("#table").bootstrapTable('refresh');
} else {
showAlert('d', '删除失败', 'mainAlertdiv');
}
});
}
});
}
};
var deleteFun = function(id) {
swal({
text: "您确定要删除此记录?",
dangerMode: true,
buttons: {
cancel: {
text: "取消",
value: null,
visible: true,
className: "btn btn-default btn-sm",
closeModal: true,
},
confirm: {
text: "确定",
value: true,
visible: true,
className: "btn btn-danger btn-sm",
closeModal: true
}
}
}).then(function(willDelete){
if (willDelete) {
$.post(ext.contextPath + '/work/camera/deletes.do', {ids: id}, function (data) {
if (data > 0) {
$("#table").bootstrapTable('refresh');
} else {
showAlert('d', '删除失败', 'mainAlertdiv');
}
});
}
});
}
var dosearch = function () {
$("#table").bootstrapTable('refresh');
};
var refreshSelect = function () {
var selelct_ = $("#processsection").select2({
data: null,
placeholder: '请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) {
return markup;
}, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
});
$("#processsection").empty();
// $("#table").bootstrapTable('refresh', {data:null});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
};
$(function () {
if ('${param.unitId}' != "") {
unitId = '${param.unitId}'
}
$.post(ext.contextPath + "/user/processSection/getProcessSection4Select.do", {companyId: unitId}, function (data) {
$("#processsection").empty();
var selelct_ = $("#processsection").select2({
data: data,
cache: false,
placeholder: '请选择',//默认文字提示
allowClear: true,//允许清空
escapeMarkup: function (markup) {
return markup;
}, // 自定义格式化防止xss注入
language: "zh-CN",
minimumInputLength: 0,
minimumResultsForSearch: 10,//数据超过十个启用搜索框
formatResult: function formatRepo(repo) {
return repo.text;
}, // 函数用来渲染结果
formatSelection: function formatRepoSelection(repo) {
return repo.text;
} // 函数用于呈现当前的选择
});
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
selelct_.on("change", function (e) {
dosearch();
});
if ('${param.selectId}' != '') {
selelct_.val('${param.selectId}').trigger("change");
dosearch();
} else {
selelct_.val('').trigger("change");
}
}, 'json');
//init();
$(".select2-selection--single").css({'height': '30px', 'paddingTop': '4px'})
$("#table").bootstrapTable({ // 对应table标签的id
url: ext.contextPath + '/work/camera/getList.do', // 获取表格数据的url
cache: false, // 设置为 false 禁用 AJAX 数据缓存, 默认为true
striped: true, //表格显示条纹默认为false
pagination: true, // 在表格底部显示分页组件默认false
pageList: [10, 20, 50], // 设置页面可以显示的数据条数
pageSize: 10, // 页面数据条数
pageNumber: 1, // 首页页码
sidePagination: 'server', // 设置为服务器端分页
queryParams: function (params) { // 请求服务器数据时发送的参数可以在这里添加额外的查询参数返回false则终止请求
return {
rows: params.limit, // 每页要显示的数据条数
page: params.offset / params.limit + 1, // 每页显示数据的开始页码
sort: params.sort, // 要排序的字段
order: params.order,
search_name: $('#search_name').val(),
search_channel: $('#search_channel').val(),
unitId: unitId,
processsectionid: $("#processsection").val(),
}
},
sortName: 'url,channel', // 要排序的字段
sortOrder: 'desc', // 排序规则
columns: [
{
checkbox: true, // 显示一个勾选框
}, {
field: 'name', // 返回json数据中的number
title: '名称', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
}, {
field: 'url', // 返回json数据中的model
title: '地址', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
}, {
field: 'channel', // 返回json数据中的libraryid
title: '通道号', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle' // 上下居中
}, {
field: 'type', // 返回json数据中的state
title: '摄像机类型', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle', // 上下居中
}, {
field: 'style', // 返回json数据中的state
title: '摄像机外形', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle', // 上下居中
formatter: function (value, row, index) {
switch (value) {
case '1':
return '球机';
case '0':
return '枪机';
default:
return '';
}
}
},
{
field: 'viewscopes', // 返回json数据中的state
title: '用途分类', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle', // 上下居中
formatter:function(value,row,index){
switch (value) {
case '1':
return '生产';
case '0':
return '安防';
default:
return '——';
}
}
},
{
field: 'active', // 返回json数据中的state
title: '启用状态', // 表格表头显示文字
align: 'center', // 左右居中
valign: 'middle', // 上下居中
formatter:function(value,row,index){
switch (value) {
case '1':
return '启用';
case '0':
return '禁用';
default:
return '';
}
}
},
{
title: "操作",
align: 'center',
valign: 'middle',
width: 160, // 定义列的宽度单位为像素px
formatter: function (value, row, index) {
var str = "";
str += '<button class="btn btn-default btn-sm" onclick="viewVideoFun(\'' + row.id + '\',\'' + row.channel + '\')"><i class="fa fa-video-camera"></i></button>';
str += '<button class="btn btn-default btn-sm" onclick="showHisCamera(\'' + row.id + '\')"><i class="fa fa-play-circle-o"></i></button>';
// str += '<button class="btn btn-default btn-sm" onclick="showHisCamera(\'' + row.id + '\')">回放</button>';
/*str+='<button class="btn btn-default btn-sm" onclick="viewFun(\'' + row.id + '\',\'' + row.type + '\')"><i class="fa fa-eye"></i></button>';*/
str += '<button class="btn btn-default btn-sm" onclick="editFun(\'' + row.id + '\')"><i class="fa fa-edit"></i></button>';
str += '<button class="btn btn-default btn-sm" onclick="deleteFun(\'' + row.id + '\')"><i class="fa fa fa-trash-o"></i></i></button>';
str = '<div class="btn-group" >' + str + '</div>';
return str;
}
}
],
onLoadSuccess: function () { //加载成功时执行
adjustBootstrapTableView("table");
},
onLoadError: function () { //加载失败时执行
console.info("加载数据失败");
}
})
});
var hisCameraViewWindow = null;
var definitionSt = 'standard';
// 视频回放
// function showHisCamera(id) {
// $(".red").each(function (i, n) {
// id = map2.get($(this).attr("id"));
// })
// if (id != '') {
// hisCameraViewWindow = window.open(ext.contextPath + "/work/camera/hisCameraView.do?id=" + id + "&definitionSt=" + definitionSt, 'hisCameraViewWindow', 'width=720,height=480,top=200,left=300,toolbar=0,menubar=0,scrollbars=0,resizable=0,location=0,status=0')
// hisCameraViewWindow.focus();
// } else {
// alert("未识别到当前选择的摄像头!");
// }
//
// }
$(function () {
$('#datetimepicker').prop("readonly", true).datetimepicker({
language: 'zh-CN',
autoclose: true,
todayHighlight: true,
minuteStep: 1,
dataFormat: 'yyyy-mm-dd',
timeFormat: 'HH:mm:ss',
showSecond: true,
//format: "yyyy-mm-dd hh:ii:ss",
endDate: new Date(),
});
getMqtt(mqttStatus, mqttHostWeb);
})
// 重启模型
var restart = function(id) {
// stopBubbleDefaultEvent();
if(confirm("是否重启模型?")){
$.post(ext.contextPath + '/work/pythonModel/restart.do',{}, function(data) {
if(data==1){
showAlert('s','重启成功','mainAlertDetaildiv');
}
});
}
};
// 识别区域
var identifyAreasDiv = function(id) {
$.post(ext.contextPath + '/work/camera/showCameraVideo4identifyAreas.do', {
id: id,
nowUrl: window.location.host
}, function (data) {
$("#identifyAreasDiv").html(data);
openModal('identifyAreasModal');
});
};
// 视野区域
var visionAreasDiv = function(id) {
$.post(ext.contextPath + '/work/camera/showCameraVideo4visionAreas.do', {
id: id,
}, function (data) {
$("#visionAreasDiv").html(data);
openModal('visionAreasModal');
});
};
var client;
function getMqtt(mqttStatus, mqttHostWeb) {
try {
//初始化mqtt
if (mqttStatus == '0') {
let mqttId = "camera_model" + "_" + Math.random();
initialMqtt(mqttId, mqttHostWeb);
// setTimeout(function () {
//
// }, 10000);
} else {
console.log('mq已关闭')
}
} catch (err) {
//处理错误
}
}
function initialMqtt(mqttId, mqttHostWeb) {
// console.log(personnelPositioning_auto_mq_theme)
//动态拿取mq定制化数据
// $.ajax({
// type: 'POST',
// url: ext.contextPath + "/mqtt/addTopic.do",
// async: false,
// globle: false,
// data: {
// topic: 'topic_dataVisual_' + nowUnitId + '_' + frameId,
// mpointIds: mqttMpcode
// },
// dataType: 'json',
// error: function () {
// return false;
// },
// success: function (data) {
// }
// });
// console.log(mqttMpcode);
const options = {
clean: true,
// cleanSession : false,
// reconnect : true,
connectTimeout: 10000,
clientId: mqttId,
username: "admin",
password: 'public'
}
console.log(mqttHostWeb)
const connectUrl = mqttHostWeb;
client = mqtt.connect(connectUrl, options);
//当重新连接启动触发回调
client.on('reconnect', function () {
// console.log('正在重连.....');
});
//连接断开后触发的回调
client.on("close", function () {
console.log('客户端已断开连接.....');
});
//从broker接收到断开连接的数据包后发出。MQTT 5.0特性
client.on("disconnect", function (packet) {
console.log('从broker接收到断开连接的数据包.....' + packet);
});
//客户端脱机下线触发回调
client.on("offline", function () {
console.log('客户端脱机下线.....');
});
//当客户端无法连接或出现错误时触发回调
client.on("error", (error) => {
console.log('客户端出现错误.....' + error);
});
//当客户端发送任何数据包时发出。这包括published()包以及MQTT用于管理订阅和连接的包
client.on("packetsend", (packet) => {
// console.log('客户端已发出数据包:' + packet);
});
//当客户端接收到任何数据包时发出。这包括来自订阅主题的信息包以及MQTT用于管理订阅和连接的信息包
client.on("packetreceive", (packet) => {
// console.log('收到:' + packet);
});
//成功连接后触发的回调
client.on("connect", function (connack) {
// layer.msg('成功连接上mq服务器');
console.log('成功连接上mq服务器');
//订阅某主题
/**
* client.subscribe(topic/topic array/topic object, [options], [callback])
* topic:一个string类型的topic或者一个topic数组,也可以是一个对象
* options
*/
let auto_mq_theme_in = ['cameraModel'];
client.subscribe(auto_mq_theme_in, {qos: 1});
//每隔2秒发布一次数据
// setInterval(publish, 2000)
});
function publish() {
//发布数据
/**
* client.publish(topic,message,[options], [callback])
*
* message: Buffer or String
* options:{
* qos:0, //默认0
* retain:false, //默认false
* dup:false, //默认false
* properties:{}
* }
* callback:function (err){}
*/
const message = "h5 message " + Math.random() + new Date();
client.publish("testtopic/123", message, {qos: 2});
}
//当客户端接收到发布消息时触发回调
/**
* topic:收到的数据包的topic
* message:收到的数据包的负载playload
* packet:收到的数据包
*/
client.on('message', (topic, message, packet) => {
var json = JSON.parse(message.toString());
if (json.result == "1") {
showAlert('s', '模型重启成功', 'mainAlertdiv');
}
});
//页面离开自动断开连接
$(window).bind("beforeunload", () => {
// console.log("客户端窗口关闭,断开连接");
client.disconnect();
})
}
</script>
</head>
<body onload="initMenu()" class="hold-transition ${cu.themeclass} sidebar-mini">
<div class="wrapper">
<!-- 引用top -->
<%-- <jsp:include page="/jsp/top.jsp"></jsp:include> --%>
<!-- 菜单栏 -->
<%-- <jsp:include page="/jsp/left.jsp"></jsp:include> --%>
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<%-- <section class="content-header">--%>
<%-- <h1 id="head_title"></h1>--%>
<%-- <ol class="breadcrumb">--%>
<%-- <li><a id='head_firstlevel' href="#"><i class="fa fa-dashboard"></i> </a></li>--%>
<%-- <!-- <li class="active">Here</li> -->--%>
<%-- </ol>--%>
<%-- </section>--%>
<!-- Main content -->
<section class="content container-fluid">
<div id="mainAlertdiv"></div>
<div id="subDiv"></div>
<div id="fileInputDiv"></div>
<div id="fault4SelectDiv"></div>
<div id="subDetailDiv"></div>
<div id="subNVRDiv"></div>
<div id="mpSubDiv"></div>
<div id="fault4SelectNVRDiv"></div>
<div id="identifyAreasDiv"></div>
<div id="visionAreasDiv"></div>
<div>
<div class="form-group form-inline" style="padding:0;">
<div class="form-group pull-right">
<div class="form-group ">
<label class="form-label" style="line-height: 34px;">工艺段:</label>
<select class="form-control select2-selection--single" id="processsection"
name="processsection" style="width: 220px;"></select>
<!-- select2 select2-container select2-selection--single -->
</div>
<div class="form-group ">
<label class="form-label" style="line-height: 34px;">通道号:</label>
<input type="text" id="search_channel" name="search_channel" class="form-control pull-right"
placeholder="通道号">
</div>
<div class="form-group ">
<label class="form-label" style="line-height: 34px;">名称/地址:</label>
<input type="text" id="search_name" name="search_name" class="form-control pull-right"
placeholder="名称/地址">
</div>
<div class="form-group " style="vertical-align: top;">
<button class="btn btn-default" onclick="dosearch();"><i class="fa fa-search"></i>
</button>
</div>
<%-- <div class="input-group input-group-sm" style="width: 300px;">--%>
<%-- <label class="form-label">回放开始时间</label>--%>
<%-- <input type="text" style="width:200px" id="datetimepicker" name="datetimepicker" class="form-control pull-right" >--%>
<%-- </div>--%>
</div>
</div>
<div class="btn-group" style="width: 220px;padding-bottom:10px;">
<button type="button" class="btn btn-default btn-sm" onclick="addFun();"><i class="fa fa-plus"></i>
新增
</button>
<button type="button" class="btn btn-default btn-sm" onclick="deletesFun();"><i
class="fa fa-trash-o"></i> 删除
</button>
<security:authorize buttonUrl="work/pythonModel/restart.do">
<button type="button" class="btn btn-danger btn-sm" onclick="restart();"><i
class="fa fa-refresh"></i> 重启模型
</button>
</security:authorize>
</div>
<br>
<table id="table"></table>
</div>
</section>
<!-- /.content -->
</div>
<%-- <jsp:include page="/jsp/bottom.jsp"></jsp:include> --%>
<%-- <jsp:include page="/jsp/side.jsp"></jsp:include> --%>
</div>
</body>
</html>