Browse Source

信鸽服务接口联调

release_1.1.2
deartibers 2 years ago
parent
commit
622b7ec40f
  1. 42
      code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/fluoriteCamera.jsx
  2. 43
      code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/ipcCamera.jsx
  3. 21
      code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrCamera.jsx
  4. 94
      code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx
  5. 44
      code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.less
  6. 17
      code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx
  7. 2
      code/VideoAccess-VCMP/web/client/src/utils/webapi.js
  8. 2
      code/VideoAccess-VCMP/web/package.json

42
code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/fluoriteCamera.jsx

@ -83,7 +83,8 @@ function fluoriteCamera ({ cRef, CameraKind, CameraAbility, cameraData, ashTrue,
labelWidth="115px"
onValueChange={(values) => {
console.log(values);
let setting = ["abilityId", "cloudControl", "highDefinition", "kindId", "name", "position", "rtmp", "serialNo",]
// let setting = ["abilityId", "cloudControl", "highDefinition", "kindId", "name", "position", "rtmp", "serialNo",]
let setting = ["abilityId", "cloudControl", "highDefinition", "kindId", "name", "position", "serialNo",]
let b = {}
setting.map((item) => {
if (values.hasOwnProperty(item)) {
@ -109,7 +110,8 @@ function fluoriteCamera ({ cRef, CameraKind, CameraAbility, cameraData, ashTrue,
cloudControl: cameraData.cloudControl || "",
voice: cameraData.voice || "",
serialNo: cameraData.serialNo || "",
rtmp: cameraData.rtmp || "",
// rtmp: cameraData.rtmp || "",
rtmp: '此处无效 自动生成',
}}
getFormApi={(formApi) => (form.current = formApi)}
>
@ -264,7 +266,7 @@ function fluoriteCamera ({ cRef, CameraKind, CameraAbility, cameraData, ashTrue,
label="设备类型:"
field="kindId"
placeholder="请选择摄像头类型"
style={{ width: 180 }}
style={{ width: 307 }}
rules={[{ required: true, message: "请选择摄像头类型" }]}
>
{CameraKind.map((item, index) => (
@ -274,21 +276,6 @@ function fluoriteCamera ({ cRef, CameraKind, CameraAbility, cameraData, ashTrue,
))}
</Form.Select>
<Form.Select
label="设备能力:"
multiple
maxTagCount={1}
field="abilityId"
placeholder="请选择能力"
style={{ width: 180 }}
rules={[{ required: true, message: "请选择能力" }]}
>
{CameraAbility.map((item, index) => (
<Form.Select.Option key={index} value={item.id}>
{item.ability}
</Form.Select.Option>
))}
</Form.Select>
</Col>
<Col span={12}>
{/* 云台支持 */}
@ -473,7 +460,7 @@ function fluoriteCamera ({ cRef, CameraKind, CameraAbility, cameraData, ashTrue,
rules={[{ required: true, message: "请输入设备序列号" }]}
/>
{/* RTMP地址接入 */}
<TextArea
{/* <TextArea
style={{ width: 320, height: 90 }}
field="rtmp"
label="RTMP地址接入:"
@ -481,7 +468,22 @@ function fluoriteCamera ({ cRef, CameraKind, CameraAbility, cameraData, ashTrue,
disabled={cameraData.id ? true : false}
placeholder="请输入RTMP地址接入"
rules={[{ required: true, message: "请输入RTMP地址接入" }]}
/>
/> */}
<Form.Select
label="设备能力:"
multiple
maxTagCount={1}
field="abilityId"
placeholder="请选择能力"
style={{ width: 307 }}
rules={[{ required: true, message: "请选择能力" }]}
>
{CameraAbility.map((item, index) => (
<Form.Select.Option key={index} value={item.id}>
{item.ability}
</Form.Select.Option>
))}
</Form.Select>
</Col>
</Row>
</Form>

43
code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/ipcCamera.jsx

@ -88,7 +88,8 @@ function ipcCamera ({
labelWidth="115px"
onValueChange={(values) => {
console.log(values);
let setting = ["abilityId", "cloudControl", "kindId", "name", "position", "rtmp", "serialNo"]
let setting = ["abilityId", "cloudControl", "kindId", "name", "position", "serialNo"]
// let setting = ["abilityId", "cloudControl", "kindId", "name", "position", "rtmp", "serialNo"]
let b = {}
setting.map((item) => {
if (values.hasOwnProperty(item)) {
@ -113,7 +114,8 @@ function ipcCamera ({
cloudControl: cameraData.cloudControl || "",
voice: cameraData.voice || "",
serialNo: cameraData.serialNo || "",
rtmp: cameraData.rtmp || "",
rtmp: "此处无效 自动生成",
// rtmp: cameraData.rtmp || "",
}}
getFormApi={(formApi) => (form.current = formApi)}
>
@ -190,7 +192,7 @@ function ipcCamera ({
label="设备类型:"
field="kindId"
placeholder="请选择摄像头类型"
style={{ width: 180 }}
style={{ width: 307 }}
rules={[{ required: true, message: "请选择摄像头类型" }]}
>
{CameraKind.map((item, index) => (
@ -199,22 +201,6 @@ function ipcCamera ({
</Form.Select.Option>
))}
</Form.Select>
<Form.Select
label="设备能力:"
multiple
maxTagCount={1}
field="abilityId"
placeholder="请选择能力"
style={{ width: 180 }}
rules={[{ required: true, message: "请选择能力" }]}
>
{CameraAbility.map((item, index) => (
<Form.Select.Option key={index} value={item.id}>
{item.ability}
</Form.Select.Option>
))}
</Form.Select>
</Col>
<Col span={12}>
<Form.RadioGroup
@ -398,14 +384,29 @@ function ipcCamera ({
rules={[{ required: true, message: "请输入设备编号" }]}
/>
</div>
<TextArea
<Form.Select
label="设备能力:"
multiple
maxTagCount={1}
field="abilityId"
placeholder="请选择能力"
style={{ width: 307 }}
rules={[{ required: true, message: "请选择能力" }]}
>
{CameraAbility.map((item, index) => (
<Form.Select.Option key={index} value={item.id}>
{item.ability}
</Form.Select.Option>
))}
</Form.Select>
{/* <TextArea
style={{ width: 320, height: 90 }}
field="rtmp"
label="RTMP地址接入:"
disabled={cameraData.id ? true : false}
placeholder="请输入RTMP地址接入"
rules={[{ required: true, message: "请输入RTMP地址" }]}
/>
/> */}
</Col>
{/* <Col span={18}>

21
code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrCamera.jsx

@ -54,6 +54,13 @@ function nvrCamera ({ dispatch, actions, nvrRef, cameraData, addNvr, nvrNumber,
streamId: cameraDataNvr.serialNo,
})
).then((res) => {
if(res.success==false){
setstep("none");
setloading(false);
setstepp("none");
setloadingTip("获取中...");
return
}
let oneData = res.payload.data[0];
let modifyData = res.payload.data.find(
(item) => item.id == cameraData.gbId);
@ -92,6 +99,13 @@ function nvrCamera ({ dispatch, actions, nvrRef, cameraData, addNvr, nvrNumber,
setloading(true);
setstep("block");
dispatch(equipmentWarehouse.getVideoStreaming({ streamId: nvrNumber })).then((res) => {
if(res.success==false){
setstep("none");
setloading(false);
setstepp("none");
setloadingTip("获取中...");
return
}
let chooseList = [];
let data = res.payload.data.map((item) => {
item.change = false;
@ -159,6 +173,13 @@ function nvrCamera ({ dispatch, actions, nvrRef, cameraData, addNvr, nvrNumber,
setloading(true);
setstep("block");
dispatch(equipmentWarehouse.getVideoStreaming(valuess)).then((res) => {
if(res.success==false){
setstep("none");
setloading(false);
setstepp("none");
setloadingTip("获取中...");
return
}
let data = res.payload.data.map((item) => {
item.change = false;
item.support = false;

94
code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx

@ -1,8 +1,9 @@
import React, { useState, useRef, useEffect } from "react";
import { connect } from "react-redux";
import { Modal, Spin,Input,Collapse ,SideSheet,Tabs, TabPane} from "@douyinfe/semi-ui";
import { Modal, Spin,Input,Collapse ,SideSheet,Tabs, TabPane,Popover} from "@douyinfe/semi-ui";
import moment from "moment";
import './pushSideSheet.less'
import { push } from "react-router-redux";
function pushSideSheet (props) {
const {
close,
@ -11,20 +12,67 @@ function pushSideSheet (props) {
journal//
} = props;
const { offline } = actions;
const [notesValue, setNotesValue] = useState('');//
const [logList, setLogList] = useState([]);//
const [noticeTest, setNoticeTest] = useState('');//
const [equipmentTest, setEquipmentTest] = useState();//
//
useEffect(() => {
let timeList = []
for (let index = 0; index < journal.length; index++) {
let receiverTest=journal[index].receiver.join(';');
let camerTest=''
for (let j = 0; j < journal[index].camera.length; j++) {
camerTest=camerTest+journal[index].camera[j].name+';'
}
timeList.push(
{
title:getTimeTitle(journal[index].time),
time:getTimeData(journal[index].time)
time:getTimeData(journal[index].time),
cameraList:camerTest,
receiverList:receiverTest
}
)
}
console.log('timeList',timeList);
let yearList=[]
for (let index = 0; index < journal.length; index++) {
yearList.push(
{
title:getTimeTitle(journal[index].time),
}
)
}
let showList=[]
let obj = {};
for (let i = 0; i < yearList.length; i++) {
if (!obj[yearList[i].title]) {
showList.push(yearList[i]);
obj[yearList[i].title] = true;
}
}
for (let index = 0; index < showList.length; index++) {
showList[index].timeList=[]
}
for (let j = 0; j < showList.length; j++) {
for (let i = 0; i < timeList.length; i++) {
if(timeList[i].title==showList[j].title){
showList[j].timeList.push({time:timeList[i].time,cameraList:timeList[i].cameraList,receiverList:timeList[i].receiverList})
}
}
}
setLogList(showList)
let noticeList =''
for (let i = 0; i < pushData.cameraStatusPushReceivers.length; i++) {
noticeList=noticeList+pushData.cameraStatusPushReceivers[i].receiver+';'
}
setNoticeTest(noticeList)
let equipmentList=''
for (let i = 0; i < pushData.cameraStatusPushMonitors.length; i++) {
noticeList=noticeList+pushData.cameraStatusPushMonitors[i].camera.name+';'
}
setEquipmentTest(equipmentList)
console.log('pushData',pushData);
}, []);
function getTimeTitle(date){
let year = moment(date).year()+'年'
@ -47,16 +95,46 @@ function pushSideSheet (props) {
<Tabs type="line">
<TabPane tab="推送日志" itemKey="1">
<Collapse>
<Collapse.Panel header={<div style={{width:'100%',textAlign:'center'}}>11111111</div>} itemKey="1">
<p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
{logList.map((item, index) => {
return (
<Collapse.Panel header={<div style={{width:'100%',textAlign:'center'}}>{item.title}</div>} itemKey={String(index)} key={index} >
{item.timeList.map((itm,idx)=>{
return(
<div style={{display:'flex',alignItems:'center',height:46,borderBottom: '1px solid #E8E8E8',fontSize:12,color:'rgba(0,0,0,0.6500)'}} key={idx}>
<div style={{margin:'0px 24px',width:74}}>{itm.time}</div>
<Popover content={
<div style={{ padding: 12,width:300,wordBreak:'break-all' }}>
{itm.receiverList}
</div>
}>
<div style={{marginRight:24,width:262,textOverflow:'ellipsis',whiteSpace:'nowrap',overflow:'hidden'}}>{itm.receiverList}</div>
</Popover>
<Popover content={
<div style={{ padding: 12,width:200,wordBreak:'break-all' }}>
{itm.cameraList}
</div>
}>
<div style={{marginRight:24,width:133,textOverflow:'ellipsis',whiteSpace:'nowrap',overflow:'hidden'}}>{itm.cameraList}</div>
</Popover>
<div style={{marginRight:25,width:83}} className='online' >上线及时通知</div>
</div>
)
})}
</Collapse.Panel>
)})}
</Collapse>
</TabPane>
<TabPane tab="监听范围" itemKey="2">
22
<div style={{margin:'12px 36px',fontSize:12,color:'rgba(0,0,0,0.6500)'}}>
<div style={{marginBottom:8}}>摄像头名称</div>
<div>{equipmentTest}</div>
</div>
</TabPane>
<TabPane tab="接收信息" itemKey="3">
33
<div style={{margin:'12px 36px',fontSize:12,color:'rgba(0,0,0,0.6500)'}}>
<div style={{marginBottom:8}}>{pushData.pushWay=='email'?'邮件通知':'短信通知'}</div>
<div>{noticeTest}</div>
</div>
</TabPane>
</Tabs>
</SideSheet>

44
code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.less

@ -5,4 +5,48 @@
.semi-tabs-tab-active{
color: #1859C1;
}
.semi-sidesheet-body{
padding:0px;
}
.semi-tabs-bar{
margin: 0px 24px;
border-bottom:none;
}
.semi-collapse-header{
background: #F7F8FA;
margin:0px;
}
.semi-tabs-content{
padding:0px;
}
.semi-collapse-content{
padding: 0px;
}
.online{
background: #E7F6EB;
color: #007B22;
display: flex;
align-items: center;
height: 22px;
justify-content: center;
border-radius: 3px;
}
.offline{
background:#FFF6D8;
color: #E8B500;
display: flex;
align-items: center;
height: 22px;
justify-content: center;
border-radius: 3px;
}
.timing{
background: #F0F6FF;
color: #1859C1;
display: flex;
align-items: center;
height: 22px;
justify-content: center;
border-radius: 3px;
}
}

17
code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx

@ -198,13 +198,12 @@ const Carrierpigeon = (props) => {
</Button>
<Button onClick={()=>{
dispatch(offline.getPushLog(row.id)).then((res) => {
// equipmentGetStatusPush();
setJournal(res.payload.data);
setSideSheetVisible(true);
setPushData(row);
setSideSheetVisible(true);
});
}} theme="borderless">
日志
查看
</Button>
</div>
);
@ -376,7 +375,7 @@ const Carrierpigeon = (props) => {
>
<Form.Select.Option value="">全部</Form.Select.Option>
<Form.Select.Option value="phone">短信通知</Form.Select.Option>
<Form.Select.Option value="email ">邮件通知</Form.Select.Option>
<Form.Select.Option value="email">邮件通知</Form.Select.Option>
</Form.Select>
</Form>
<div
@ -479,8 +478,7 @@ const Carrierpigeon = (props) => {
>
<Table
columns={setupp.filter((s) => s)}
// dataSource={StatusPushList.data}
dataSource={StatusPushList}
dataSource={StatusPushList.rows}
bordered={false}
empty="暂无数据"
style={{
@ -498,10 +496,10 @@ const Carrierpigeon = (props) => {
}}
>
<span style={{ lineHeight: "30px" }}>
{StatusPushList.total}条策略
{StatusPushList.count}条策略
</span>
<Pagination
total={StatusPushList.total}
total={StatusPushList.count}
showSizeChanger
currentPage={query.page + 1}
pageSizeOpts={[10, 20, 30, 40]}
@ -556,8 +554,7 @@ function mapStateToProps (state) {
user: auth.user,
actions: global.actions,
members: members.data,
StatusPushList: StatusPushList.data || [],
// StatusPushList: StatusPushList.data || {},
StatusPushList: StatusPushList.data || {},
};
}

2
code/VideoAccess-VCMP/web/client/src/utils/webapi.js

@ -47,7 +47,7 @@ export const ApiTable = {
getStatusSimpleAll:'status/simple_all',//获取全部状态码简略信息
getCameraListAll:'camera/listAll',//获取所有摄像头信息
getStatusPush:'status/push',//获取推送配置
putSasdtatusPush:'sasdtatus/push',//编辑推送配置
putSasdtatusPush:'status/push',//编辑推送配置
delPush:'status/push/{configId}',//删除推送配置
putPushBanned:'status/push/banned',//禁用推送配置
getPushCopy:'status/push/{configId}/copy',//复制推送配置

2
code/VideoAccess-VCMP/web/package.json

@ -7,7 +7,7 @@
"test": "mocha",
"start-vite": "cross-env NODE_ENV=developmentVite npm run start-params",
"start": "cross-env NODE_ENV=development npm run start-params",
"start-params": "node server -p 5000 -u http://10.8.30.24:4000 --apiVcmpUrl http://localhost:4000 --apiAuthUrl http://10.8.30.24:4200 --apiAnxinyunUrl http://10.8.30.24:4100 --iotAuthWeb http://localhost:5200 --iotVideoServer ws://221.230.55.27:8081",
"start-params": "node server -p 5000 -u http://10.8.30.34:4000 --apiVcmpUrl http://localhost:4000 --apiAuthUrl http://10.8.30.34:4200 --apiAnxinyunUrl http://10.8.30.34:4100 --iotAuthWeb http://localhost:5200 --iotVideoServer ws://221.230.55.27:8081",
"deploy": "export NODE_ENV=production&& npm run build && node server",
"build-dev": "cross-env NODE_ENV=development&&webpack --config webpack.config.js",
"build": "export NODE_ENV=production&&webpack --config webpack.config.prod.js"

Loading…
Cancel
Save