| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="bottom" :style="{'height':strethTable?'calc(100% - 30px)':'calc(100% - 220px)'}"> |
| | | <div style="width: 100%;height: 10px;background-color: #E9EBF2;"></div> |
| | | <div |
| | | class="bottom" |
| | | :style="{ |
| | | height: strethTable ? 'calc(100% - 30px)' : 'calc(100% - 220px)', |
| | | }" |
| | | > |
| | | <div style="width: 100%; height: 10px; background-color: #e9ebf2"></div> |
| | | <div class="content"> |
| | | <div class="toolBar"> |
| | | <el-input |
| | | size="small" |
| | | style="width: 180px;" |
| | | style="width: 180px" |
| | | placeholder="请输入搜索内容" |
| | | prefix-icon="el-icon-search" |
| | | clearable |
| | |
| | | <el-button |
| | | size="small" |
| | | type="primary" |
| | | style="margin-left: 20px; margin-right: 50px;" |
| | | style="margin-left: 20px; margin-right: 50px" |
| | | @click="pollSeach" |
| | | >搜索</el-button> |
| | | >搜索</el-button |
| | | > |
| | | <div class="tip"> |
| | | <span> |
| | | 轮询时间 : |
| | | <b>{{PollData.Config.poll_period}}</b>分钟 |
| | | <b>{{ PollData.Config.poll_period }}</b |
| | | >分钟 |
| | | </span> |
| | | <span> |
| | | 轮询周期 : |
| | | <b>{{pollCycle}}</b>分钟 |
| | | <b>{{ pollCycle }}</b |
| | | >分钟 |
| | | </span> |
| | | <span> |
| | | 轮询开关 : |
| | | <b>{{PollData.Enabled | switchText}}</b> |
| | | <b>{{ PollData.Enabled | switchText }}</b> |
| | | </span> |
| | | </div> |
| | | <span :class="stretchStyle" @click="strethTable = !strethTable"></span> |
| | | <span |
| | | :class="stretchStyle" |
| | | @click="strethTable = !strethTable" |
| | | ></span> |
| | | |
| | | <el-button |
| | | size="small" |
| | | type="primary" |
| | | style="float:right" |
| | | style="float: right" |
| | | @click="openDrawer" |
| | | v-if="showSetting" |
| | | >设置</el-button> |
| | | >设置</el-button |
| | | > |
| | | </div> |
| | | |
| | | <el-table |
| | | :header-cell-style="{background:'#F8F8F8', color: '#222222'}" |
| | | :header-cell-style="{ background: '#F8F8F8', color: '#222222' }" |
| | | height="93%" |
| | | :data="PollData.CameraList" |
| | | border |
| | | :cell-style="cellStyle" |
| | | > |
| | | <el-table-column label="序号" type="index" align="center" width="60px"></el-table-column> |
| | | <el-table-column label="摄像机名称" align="center" show-overflow-tooltip> |
| | | <el-table-column |
| | | label="序号" |
| | | type="index" |
| | | align="center" |
| | | width="60px" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="摄像机名称" |
| | | align="center" |
| | | show-overflow-tooltip |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span |
| | | :style="scope.row.is_running ? `color:#3d68e1` : '' " |
| | | >{{scope.row.alias !== '' ? scope.row.alias: scope.row.name}}</span> |
| | | <span :style="scope.row.is_running ? `color:#3d68e1` : ''">{{ |
| | | scope.row.alias !== "" ? scope.row.alias : scope.row.name |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="摄像机地址" prop="addr" align="center" show-overflow-tooltip sortable></el-table-column> |
| | | <el-table-column |
| | | label="摄像机地址" |
| | | prop="addr" |
| | | align="center" |
| | | show-overflow-tooltip |
| | | sortable |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="摄像机IP" |
| | | prop="ip" |
| | |
| | | ></el-table-column> |
| | | <el-table-column label="摄像机类型" align="center" width="120px"> |
| | | <template slot-scope="scope"> |
| | | <span>{{scope.row.run_type | cameraType}}</span> |
| | | <span>{{ scope.row.run_type | cameraType }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="执行算法" align="center" show-overflow-tooltip> |
| | | <el-table-column |
| | | label="执行算法" |
| | | align="center" |
| | | show-overflow-tooltip |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.run_type === -1 ">-</span> |
| | | <span v-else-if="scope.row.tasks != null ">{{scope.row.tasks | taskList}}</span> |
| | | <span v-if="scope.row.run_type === -1">-</span> |
| | | <span v-else-if="scope.row.tasks != null">{{ |
| | | scope.row.tasks | taskList |
| | | }}</span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="运行设备" align="center" width="160px" sortable> |
| | | <el-table-column |
| | | label="运行设备" |
| | | align="center" |
| | | width="160px" |
| | | sortable |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.run_type === -1 ">-</span> |
| | | <span v-else>{{scope.row.runServerName}}</span> |
| | | <span v-if="scope.row.run_type === -1">-</span> |
| | | <span v-else>{{ scope.row.runServerName }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="状态" align="center" show-overflow-tooltip width="100px"> |
| | | <el-table-column |
| | | label="状态" |
| | | align="center" |
| | | show-overflow-tooltip |
| | | width="100px" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.status === -1 ">-</span> |
| | | <span v-else-if="scope.row.status === 2">{{"处理中"}}</span> |
| | | <span v-else-if="scope.row.status === 1">{{"等待处理"}}</span> |
| | | <span v-else-if="scope.row.status === 0">{{"规则不全"}}</span> |
| | | <span v-if="scope.row.status === -1">-</span> |
| | | <span v-else-if="scope.row.status === 2">{{ "处理中" }}</span> |
| | | <span v-else-if="scope.row.status === 1">{{ "等待处理" }}</span> |
| | | <span v-else-if="scope.row.status === 0">{{ "规则不全" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="实时/轮询" align="center" width="100px"> |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.run_type === -1 ">-</span> |
| | | <span v-if="scope.row.run_type === -1">-</span> |
| | | <toggle-button |
| | | v-else |
| | | :value="scope.row.run_type === 1" |
| | | :width="60" |
| | | :labels="{checked: '实时', unchecked: '轮询'}" |
| | | :color="{checked: '#4D88FF', unchecked: '#FF7733', disabled: '#CCCCCC'}" |
| | | :labels="{ checked: '实时', unchecked: '轮询' }" |
| | | :color="{ |
| | | checked: '#4D88FF', |
| | | unchecked: '#FF7733', |
| | | disabled: '#CCCCCC', |
| | | }" |
| | | :sync="true" |
| | | @change="pollSwitch(scope.row)" |
| | | /> |
| | |
| | | :before-close="closeDrawer" |
| | | > |
| | | <div class="dawer_details"> |
| | | <span>总算力 {{formData.totalChanle}} 通道</span> |
| | | <span style="margin-left:20px">实时算力 {{formData.realTime}} 通道</span> |
| | | <span>总算力 {{ formData.totalChanle }} 通道</span> |
| | | <span style="margin-left: 20px" |
| | | >实时算力 {{ formData.realTime }} 通道</span |
| | | > |
| | | </div> |
| | | <div class="e-drawer_rate"> |
| | | <div class="rate"> |
| | | <label>轮询时间</label> |
| | | <el-input-number |
| | | size="small" |
| | | style="width: 60px;margin-left:25px" |
| | | style="width: 60px; margin-left: 25px" |
| | | v-model.number="formData.pollPeriod" |
| | | :controls="false" |
| | | :min="0" |
| | | :min="1" |
| | | :max="60 * 24 * 1" |
| | | ></el-input-number> |
| | | <span>分钟</span> |
| | | |
| | | <label>轮询开关</label> |
| | | <el-switch style="margin-left: 10px;" v-model="formData.pollEnable"></el-switch> |
| | | <el-switch |
| | | style="margin-left: 10px" |
| | | v-model="formData.pollEnable" |
| | | ></el-switch> |
| | | </div> |
| | | <div class="rate"> |
| | | <label>轮询算力</label> |
| | | <el-input-number |
| | | style="margin-left:25px;width:90px" |
| | | style="margin-left: 25px; width: 90px" |
| | | size="small" |
| | | v-model="formData.polling" |
| | | @change="changePoll" |
| | |
| | | <div class="rate"> |
| | | <label>数据栈算力</label> |
| | | <el-input-number |
| | | style="margin-left:11px;width:90px" |
| | | style="margin-left: 11px; width: 90px" |
| | | size="small" |
| | | v-model="formData.dataStack" |
| | | @change="changeStack" |
| | |
| | | <el-button |
| | | size="small" |
| | | type="primary" |
| | | style="margin:10px 10px 0px 200px" |
| | | style="margin: 10px 10px 0px 200px" |
| | | @click="saveSetting" |
| | | >保存</el-button> |
| | | <el-button size="small" type="info" style="color:black" @click="closeDrawer">取消</el-button> |
| | | >保存</el-button |
| | | > |
| | | <el-button |
| | | size="small" |
| | | type="info" |
| | | style="color: black" |
| | | @click="closeDrawer" |
| | | >取消</el-button |
| | | > |
| | | </div> |
| | | </el-drawer> |
| | | </div> |
| | |
| | | |
| | | <script> |
| | | import echarts from "echarts"; |
| | | import { changeRunType, updatePollEnable, updatePollPeriod, updateChannelCount } from "@/api/pollConfig"; |
| | | import { |
| | | changeRunType, |
| | | updatePollEnable, |
| | | updatePollPeriod, |
| | | updateChannelCount, |
| | | } from "@/api/pollConfig"; |
| | | |
| | | import Sysinfo from "@/components/subComponents/SystemInfo" |
| | | import Sysinfo from "@/components/subComponents/SystemInfo"; |
| | | export default { |
| | | name: "PollSeting", |
| | | components: { |
| | |
| | | return type === -1 ? "监控摄像机" : "AI摄像机"; |
| | | }, |
| | | taskList(tasks) { |
| | | return tasks.filter(task => { |
| | | return task.hasRule; |
| | | }).map(task => { |
| | | return task.taskname |
| | | }).join(',') |
| | | return tasks |
| | | .filter((task) => { |
| | | return task.hasRule; |
| | | }) |
| | | .map((task) => { |
| | | return task.taskname; |
| | | }) |
| | | .join(","); |
| | | }, |
| | | switchText(type) { |
| | | return type ? "已开启" : "未开启"; |
| | | } |
| | | }, |
| | | }, |
| | | computed: { |
| | | maxPoll() { |
| | |
| | | }, |
| | | stretchStyle() { |
| | | let arry = ["iconfont", "stretch-btn"]; |
| | | arry.push(this.strethTable ? "iconzhankai" : "iconshouqi") |
| | | arry.push(this.strethTable ? "iconzhankai" : "iconshouqi"); |
| | | return arry; |
| | | }, |
| | | pollCycle() { |
| | | if (this.PollData.PollValidCount===0||!this.PollData.PollValidCount) { |
| | | return 0 |
| | | if (this.PollData.PollValidCount === 0 || !this.PollData.PollValidCount) { |
| | | return 0; |
| | | } |
| | | let sumPollingCamera = 0; |
| | | this.PollData.CameraList.forEach(cam => { |
| | | this.PollData.CameraList.forEach((cam) => { |
| | | if (cam.run_type === 0) { |
| | | sumPollingCamera++ |
| | | sumPollingCamera++; |
| | | } |
| | | }) |
| | | }); |
| | | // 所有轮询的摄像机总数 * 轮询时间 / 轮询算力 - 1 |
| | | let ret = (sumPollingCamera * this.PollData.Config.poll_period) / this.PollData.PollValidCount - 1 |
| | | let ret = |
| | | (sumPollingCamera * this.PollData.Config.poll_period) / |
| | | this.PollData.PollValidCount - |
| | | 1; |
| | | if (String(ret).indexOf(".") > 0) { |
| | | ret = ret.toFixed(1) |
| | | ret = ret.toFixed(1); |
| | | } |
| | | |
| | | return ret < 0 ? 0 : ret |
| | | return ret < 0 ? 0 : ret; |
| | | }, |
| | | isAdmin() { |
| | | if ( |
| | |
| | | return false; |
| | | }, |
| | | showSetting() { |
| | | return this.isAdmin || this.buttonAuthority.indexOf("analysisPower:set") > -1 |
| | | } |
| | | return ( |
| | | this.isAdmin || this.buttonAuthority.indexOf("analysisPower:set") > -1 |
| | | ); |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | |
| | | }, |
| | | methods: { |
| | | ipSortMethod(a, b) { |
| | | if (Number(a.ip.substr(a.ip.lastIndexOf('.') + 1)) < Number(b.ip.substr(b.ip.lastIndexOf('.') + 1))) { |
| | | if ( |
| | | Number(a.ip.substr(a.ip.lastIndexOf(".") + 1)) < |
| | | Number(b.ip.substr(b.ip.lastIndexOf(".") + 1)) |
| | | ) { |
| | | return -1; |
| | | } |
| | | if (Number(a.ip.substr(a.ip.lastIndexOf('.') + 1)) > Number(b.ip.substr(b.ip.lastIndexOf('.') + 1))) { |
| | | if ( |
| | | Number(a.ip.substr(a.ip.lastIndexOf(".") + 1)) > |
| | | Number(b.ip.substr(b.ip.lastIndexOf(".") + 1)) |
| | | ) { |
| | | return 1; |
| | | } |
| | | return 0; |
| | |
| | | pollPeriod: this.PollData.Config.poll_period, |
| | | polling: this.PollData.PollChannelTotal, |
| | | dataStack: this.PollData.localVideo, |
| | | } |
| | | }; |
| | | }, |
| | | pollSeach() { |
| | | this.PollData.fetchPollList(); |
| | | }, |
| | | pollEnable() { |
| | | updatePollEnable({ enable: this.PollData.Enabled }).then(rsp => { |
| | | updatePollEnable({ enable: this.PollData.Enabled }).then((rsp) => { |
| | | this.$notify({ |
| | | type: "success", |
| | | message: "修改成功" |
| | | message: "修改成功", |
| | | }); |
| | | // this.PollData.fetchPollConfig() |
| | | }) |
| | | }); |
| | | }, |
| | | updateDelayTime() { |
| | | updatePollPeriod({ period: this.PollData.Config.poll_period }).then(rsp => { |
| | | if (rsp && rsp.success) { |
| | | this.$notify({ |
| | | type: 'success', |
| | | message: '轮询时间修改成功!' |
| | | }) |
| | | } else { |
| | | this.$notify({ |
| | | type: 'error', |
| | | message: '轮询时间修改失败!' |
| | | }) |
| | | updatePollPeriod({ period: this.PollData.Config.poll_period }).then( |
| | | (rsp) => { |
| | | if (rsp && rsp.success) { |
| | | this.$notify({ |
| | | type: "success", |
| | | message: "轮询时间修改成功!", |
| | | }); |
| | | } else { |
| | | this.$notify({ |
| | | type: "error", |
| | | message: "轮询时间修改失败!", |
| | | }); |
| | | } |
| | | } |
| | | }) |
| | | ); |
| | | }, |
| | | statistic() { |
| | | this.PollData.statistics(); |
| | |
| | | }, |
| | | pollSwitch(row) { |
| | | changeRunType({ camera_ids: [row.id], run_type: row.run_type ^ 1 }).then( |
| | | rsp => { |
| | | (rsp) => { |
| | | if (rsp && rsp.success) { |
| | | this.$notify({ |
| | | type: "success", |
| | | message: "配置成功" |
| | | message: "配置成功", |
| | | }); |
| | | |
| | | row.run_type = row.run_type ^ 1 |
| | | |
| | | row.run_type = row.run_type ^ 1; |
| | | } else { |
| | | this.$notify({ |
| | | type: "error", |
| | | message: "配置失败" |
| | | message: "配置失败", |
| | | }); |
| | | } |
| | | |
| | |
| | | trigger: "axis", |
| | | axisPointer: { |
| | | // 坐标轴指示器,坐标轴触发有效 |
| | | type: "shadow" // 默认为直线,可选为:'line' | 'shadow' |
| | | } |
| | | type: "shadow", // 默认为直线,可选为:'line' | 'shadow' |
| | | }, |
| | | }, |
| | | grid: { |
| | | top: 40, |
| | | // bottom: '45%', |
| | | left: 0, |
| | | containLabel: true |
| | | containLabel: true, |
| | | }, |
| | | |
| | | xAxis: [ |
| | |
| | | // alignWithLabel: true |
| | | }, |
| | | axisLine: { |
| | | show: false |
| | | show: false, |
| | | }, |
| | | nameLocation: 'start', |
| | | nameLocation: "start", |
| | | axisTick: { |
| | | show: false |
| | | show: false, |
| | | }, |
| | | axisLabel: { |
| | | rotate: 45, |
| | | formatter: function (value, index) { |
| | | let name = "" |
| | | let name = ""; |
| | | if (value.length > 2) { |
| | | name = value.substring(0, 2) + '...' |
| | | name = value.substring(0, 2) + "..."; |
| | | } else { |
| | | name = value |
| | | name = value; |
| | | } |
| | | let text = [`{a|${name}}`] |
| | | return text |
| | | let text = [`{a|${name}}`]; |
| | | return text; |
| | | }, |
| | | rich: { |
| | | a: { |
| | | fontSize: 10, |
| | | with: 30 |
| | | } |
| | | } |
| | | } |
| | | } |
| | | with: 30, |
| | | }, |
| | | }, |
| | | }, |
| | | }, |
| | | ], |
| | | yAxis: [ |
| | | { |
| | | type: "value", |
| | | show: true, |
| | | axisLine: { |
| | | show: false |
| | | show: false, |
| | | }, |
| | | splitLine: { |
| | | lineStyle: { |
| | | type: "dotted", |
| | | color: ['#f1f1f1'] |
| | | } |
| | | color: ["#f1f1f1"], |
| | | }, |
| | | }, |
| | | axisTick: { |
| | | show: false |
| | | } |
| | | } |
| | | show: false, |
| | | }, |
| | | }, |
| | | ], |
| | | series: [ |
| | | { |
| | | name: "数量", |
| | | type: "bar", |
| | | barWidth: "30%", |
| | | data: this.dataList |
| | | } |
| | | ] |
| | | data: this.dataList, |
| | | }, |
| | | ], |
| | | }; |
| | | this.showSysInfo = true |
| | | this.showSysInfo = true; |
| | | this.barChart.setOption(optionBar); |
| | | this.barChart.resize() |
| | | this.barChart.resize(); |
| | | this.$nextTick(() => { |
| | | this.barChart.resize() |
| | | }) |
| | | this.barChart.resize(); |
| | | }); |
| | | }, |
| | | |
| | | //滑块数据更新回调 |
| | | changeSlider(val) { |
| | | // console.log(val, '滑块值变动') |
| | | let fileChannelCount = val[val.length - 1] - val[val.length - 2] |
| | | let pollChannelCount = val[val.length - 2] - val[val.length - 3] |
| | | this.PollData.updateChannelCount(fileChannelCount, pollChannelCount) |
| | | let fileChannelCount = val[val.length - 1] - val[val.length - 2]; |
| | | let pollChannelCount = val[val.length - 2] - val[val.length - 3]; |
| | | this.PollData.updateChannelCount(fileChannelCount, pollChannelCount); |
| | | }, |
| | | |
| | | async saveSetting() { |
| | | let rsp = await updatePollEnable({ enable: this.formData.pollEnable }) |
| | | let rsp = await updatePollEnable({ enable: this.formData.pollEnable }); |
| | | if (!rsp || !rsp.success) { |
| | | this.formData.pollEnable = !this.formData.pollEnable |
| | | this.formData.pollEnable = !this.formData.pollEnable; |
| | | this.$notify({ |
| | | type: "error", |
| | | message: "轮询开关切换失败!" |
| | | message: "轮询开关切换失败!", |
| | | }); |
| | | return |
| | | return; |
| | | } |
| | | |
| | | rsp = await updatePollPeriod({ period: this.formData.pollPeriod }) |
| | | rsp = await updatePollPeriod({ period: this.formData.pollPeriod }); |
| | | if (!rsp || !rsp.success) { |
| | | this.$notify({ |
| | | type: "error", |
| | | message: "轮询时间修改失败!" |
| | | message: "轮询时间修改失败!", |
| | | }); |
| | | return |
| | | return; |
| | | } |
| | | rsp = await updateChannelCount({ videoChannelCount: this.formData.dataStack, pollChannelCount: this.formData.polling }) |
| | | rsp = await updateChannelCount({ |
| | | videoChannelCount: this.formData.dataStack, |
| | | pollChannelCount: this.formData.polling, |
| | | }); |
| | | if (!rsp || !rsp.success) { |
| | | this.$notify({ |
| | | type: "error", |
| | | message: "算力配置失败!" |
| | | message: "算力配置失败!", |
| | | }); |
| | | return |
| | | return; |
| | | } else { |
| | | this.$notify({ |
| | | type: "success", |
| | | message: "配置保存成功" |
| | | message: "配置保存成功", |
| | | }); |
| | | } |
| | | this.PollData.statisticTaskInfo() |
| | | this.PollData.fetchPollConfig() |
| | | this.PollData.statisticTaskInfo(); |
| | | this.PollData.fetchPollConfig(); |
| | | }, |
| | | |
| | | //监听轮询算力 |
| | | changePoll(newVal, oldVal) { |
| | | if (newVal > oldVal) { |
| | | this.formData.dataStack-- |
| | | this.formData.dataStack--; |
| | | } |
| | | if (newVal < oldVal) { |
| | | this.formData.dataStack++ |
| | | this.formData.dataStack++; |
| | | } |
| | | // console.log("this.formData.dataStack:"+this.formData.dataStack) |
| | | }, |
| | | //监听数据栈算力 |
| | | changeStack(newVal, oldVal) { |
| | | if (newVal > oldVal) { |
| | | this.formData.polling-- |
| | | this.formData.polling--; |
| | | } |
| | | if (newVal < oldVal) { |
| | | this.formData.polling++ |
| | | this.formData.polling++; |
| | | } |
| | | // console.log("this.formData.polling:"+this.formData.polling) |
| | | }, |
| | | cellStyle(obj) { |
| | | if (obj.column.label == '摄像机名称' || obj.column.label == '摄像机地址') { |
| | | return 'text-align:left;padding-left:8px;' |
| | | if ( |
| | | obj.column.label == "摄像机名称" || |
| | | obj.column.label == "摄像机地址" |
| | | ) { |
| | | return "text-align:left;padding-left:8px;"; |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | <style lang="scss"> |