You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

570 lines
16 KiB
Vue

1 year ago
<template>
<div class="reportBox">
<div class="commandBox">
<div class="commandRunLeft commandClass">
<div class="headTitle">
<span class="title">待下发终端</span>
<el-select
v-model="operateL"
placeholder="筛选运操维作"
@change="selectLeftChanged"
>
<el-option
v-for="item in operateOptions"
1 year ago
:key="item.key"
:label="item.desc"
:value="item.key"
1 year ago
></el-option>
</el-select>
<el-input
class="cmdidClass"
v-model="leftcmdVal"
placeholder="请输入设备ID查询"
@blur="leftInputChange"
></el-input>
<span class="mlspan">命令:{{ leftCommand.length }}</span>
<span class="time"
>更新时间{{
$moment(updateTime).format("YYYY-MM-DD HH:mm:ss")
}}</span
>
<el-button
v-if="leftCommand.length > 0"
class="deletebtn"
type="danger"
icon="el-icon-delete"
@click="deleteml"
></el-button>
</div>
1 year ago
<div class="mlbpox" v-loading="leftComLoading">
1 year ago
<div
class="commandList"
1 year ago
1 year ago
v-if="leftCommand.length != 0"
1 year ago
1 year ago
>
<p
class="comLi"
v-for="(item, index) in leftCommand"
:key="index"
@dblclick="handleShowCommand(item)"
>
<span class="indexClass">{{ index + 1 }}</span>
<span class="comMsg"
><b>时间{{ item.createTime }}</b>
1 year ago
<b v-if="item.terminal && item.terminal.cmdid">ID{{ item.terminal.cmdid }}</b>
<b v-if="item.cmdMap &&item.cmdMap.fileName">apk{{ item.cmdMap.fileName }}</b>
<b>命令{{ cmdCn[item.name] }}</b
>
1 year ago
<b v-if="item.estimatedPublishTime * 1000 - newupdatatime > 0"
>命令预计拿走时间
{{
$moment(item.estimatedPublishTime * 1000).format(
"MM-DD HH:mm:ss"
)
}}
{{ remainingTime(item) }}
</b>
</span>
</p>
</div>
<div class="commandList" v-else>
<p>暂无下发命令</p>
</div>
</div>
1 year ago
</div>
1 year ago
<div class="commandRunRight commandClass">
<div class="headTitle">
<span class="title">已下发终端</span>
<el-select
v-model="operateR"
placeholder="筛选运操维作"
@change="selectRightChanged"
>
<el-option
v-for="item in operateOptions"
1 year ago
:key="item.key"
:label="item.desc"
:value="item.key"
1 year ago
></el-option>
</el-select>
<el-input
class="cmdidClass"
v-model="rightcmdVal"
placeholder="请输入设备ID查询"
@blur="rightInputChange"
></el-input>
<span class="mlspan">命令:{{ rightCommand.length }}</span>
<span class="time"
>更新时间{{
$moment(updateTime).format("YYYY-MM-DD HH:mm:ss")
}}</span
>
<el-button
v-if="rightCommand.length > 0"
class="deletebtn"
type="danger"
icon="el-icon-delete"
@click="deletehis"
></el-button>
</div>
1 year ago
<div class="mlbpox" v-loading="rightComLoading">
<div class="commandList" v-if="rightCommand.length != 0" >
1 year ago
<p class="comLi" v-for="(item, index) in rightCommand" :key="index">
<el-tooltip
class="item"
effect="dark"
:open-delay="600"
:content="item.status == '1' ? '已下发' : '已取消'"
placement="top"
>
<span
class="indexClass"
:class="item.status == '1' ? 'normalClass' : 'cancelClass'"
>{{ index + 1 }}</span
>
</el-tooltip>
1 year ago
<span class="comMsg"
1 year ago
><b>下发时间{{ item.publishTime }}</b>
1 year ago
<b v-if="item.terminal && item.terminal.cmdid">ID{{ item.terminal.cmdid }}</b>
<b>命令{{ cmdCn[item.name] }}</b>
<b v-if="item.cmdMap &&item.cmdMap.fileName">apk{{ item.cmdMap.fileName }}</b>
<b v-else>cmd{{ item.cmdMap }}</b>
1 year ago
</span>
</p>
</div>
<div class="commandList" v-else>
<p>暂无已下发命令</p>
</div>
</div>
1 year ago
</div>
1 year ago
</div>
<el-dialog
class="MsgDialog"
title="命令信息"
:visible.sync="commandShow"
:close-on-click-modal="false"
width="680px"
>
<div class="cmdMain">
<!-- {{ deveceMsg }} -->
1 year ago
<p>设备ID:{{ devCmdid }}</p>
1 year ago
<p>操作时间{{ deveceMsg.createTime }}</p>
1 year ago
<p>待执行操作{{cmdCn[deveceMsg.name]}} {{ deveceMsg.name }}</p>
1 year ago
<p>cmd{{ deveceMsg.cmd }}</p>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="handleCancel(deveceMsg.id)"></el-button>
</div>
</el-dialog>
</div>
</template>
<script>
1 year ago
import { cmdSendApi,getCmdActionApi,cmdActlistApi,cmdActHislistApi } from "@/utils/api/index";
1 year ago
export default {
name: "report",
components: {},
data() {
return {
leftComLoading: false, //左侧loading
1 year ago
rightComLoading:false,//右侧loiading
// runCommand: [],
// endCommand: [],
1 year ago
leftCommand: [],
rightCommand: [],
commandShow: false,
1 year ago
deveceMsg: {},
devCmdid:'',
1 year ago
cmdCn: {
yw_cmd_android_reboot: "重启设备",
yw_cmd_mcu_reboot: "MCU单片机重启",
i1_cmd_set_i1_server_ip_port: "设置I1服务器",
i1_cmd_set_xy_yw_ip_port: "设置运维服务器",
i1_cmd_set_i1_heart_beat_time: "设置心跳周期",
yw_cmd_upload_i1_zip_log: "上传日志",
upgrade: "升级",
1 year ago
yw_upd_ota: "Ota升级",
1 year ago
yw_cmd_start_frpc: "开启frpc",
yw_cmd_stop_frpc: "停止frpc",
i1_cmd_stop_aging_test: "停止老化测试",
del_file: "删除文件",
upload_file: "上传文件",
download_file: "下发文件",
1 year ago
},
cmdtimer: null,
endtimer: null,
updateTime: null,
newupdatatime: null,
//运维操作列表
operateOptions: [
1 year ago
{id: 0, key: "all", desc: "全部"}
1 year ago
],
1 year ago
operateL: 'all',
operateR: 'all',
1 year ago
leftcmdVal: "",
rightcmdVal: "",
intervalId: null, // 用于存储setInterval返回的ID
};
},
computed: {},
created() {
this.cmdtimer = setInterval(this.getCmdList, 60000); // 每60秒刷新数据
this.endtimer = setInterval(this.getEndList, 60000); // 每60秒刷新数据
},
mounted() {
this.getCmdList();
this.getEndList();
1 year ago
this.getCmdOptionsFun()
1 year ago
this.startCountdown(); // 在组件挂载后开始倒计时
},
methods: {
1 year ago
getCmdOptionsFun(){
getCmdActionApi()
.then((res) => {
console.log(res);
this.operateOptions = this.operateOptions.concat(res.data);
// this.operateL = this.operateOptions[0].desc;
})
.catch((err) => {});
},
1 year ago
startCountdown() {
this.newupdatatime = new Date().getTime(); // 更新当前时间
// 清空之前可能存在的定时器
if (this.intervalId) {
clearInterval(this.intervalId);
}
// 开始倒计时每秒执行一次remainingTime方法
this.intervalId = setInterval(() => {
this.newupdatatime = new Date().getTime(); // 更新当前时间
this.leftCommand.forEach((item) => {
this.remainingTime(item); // 重新计算每个项目的剩余时间
});
}, 1000); // 每秒执行一次
},
remainingTime(item) {
if (!this.newupdatatime) {
// 更新时间尚未设置,返回默认的倒计时时间或者不执行任何操作
return "计算中...";
}
const estimatedPublishTime = item.estimatedPublishTime * 1000;
const difference = estimatedPublishTime - this.newupdatatime;
const minutes = Math.floor(difference / 60000);
const seconds = Math.floor((difference % 60000) / 1000);
if (minutes == 0 && seconds == 0) {
this.getCmdList();
this.getEndList();
return `命令已下发`;
} else {
return ` 预估剩余:${minutes} 分钟 ${seconds}`;
}
},
getCmdList() {
1 year ago
this.leftComLoading = true;
let params = {
pageNum:1,
pageSize:300,
};
console.log(this.operateL)
// 根据条件添加参数
if (this.operateL!=='all') {
params.action = this.operateL;
}
if (this.leftcmdVal !== "") {
params.cmdid = this.leftcmdVal;
}
cmdActlistApi(params)
1 year ago
.then((res) => {
console.log(res);
1 year ago
//this.runCommand = res.data.list;
this.leftCommand = res.data.list;
1 year ago
this.leftComLoading = false;
1 year ago
1 year ago
this.updateTime = new Date();
})
.catch((err) => {});
},
handleShowCommand(val) {
console.log(val);
this.commandShow = true;
console.log(this.commandShow);
this.deveceMsg = val;
1 year ago
this.devCmdid = val.terminal.cmdid
},
//获取已取走列表
getEndList() {
this.rightComLoading = true;
let params = {
pageNum:1,
pageSize:300,
};
// 根据条件添加参数
if (this.operateR!== 'all') {
params.action = this.operateR;
}
if (this.rightcmdVal!== "") {
params.cmdid = this.rightcmdVal;
}
cmdActHislistApi(params)
.then((res) => {
console.log(res);
//this.endCommand = res.data;
//this.endCommand = res.data.list
this.rightCommand = res.data.list;
this.rightComLoading = false;
this.updateTime = new Date();
})
.catch((err) => {});
},
//左侧筛选
selectLeftChanged() {
this.getCmdList()
},
leftInputChange() {
console.log(this.leftcmdVal);
this.getCmdList()
},
//右侧筛选
selectRightChanged() {
this.getEndList()
},
rightInputChange() {
this.getEndList()
1 year ago
},
1 year ago
//取消操作
handleCancel(val) {
console.log(val)
cmdSendApi({
action: "cancel",
1 year ago
id: val,
})
.then((res) => {
console.log(res);
this.$confirm("确定取消该命令?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$message({
duration: 1500,
showClose: true,
message: "命令已取消",
type: "success",
});
this.commandShow = false;
this.getCmdList();
this.getEndList();
})
.catch(() => {
this.commandShow = false;
});
})
.catch((err) => {});
},
deleteml() {
1 year ago
cmdSendApi({
action: "clear",
1 year ago
})
.then((res) => {
console.log(res);
this.$confirm("确定清除所有命令?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$message({
duration: 1500,
showClose: true,
message: "命令已清除",
type: "success",
});
this.commandShow = false;
this.getCmdList();
this.getEndList();
})
.catch(() => {
this.commandShow = false;
});
})
.catch((err) => {});
},
deletehis() {
1 year ago
cmdSendApi({
action: "clearHis",
1 year ago
})
.then((res) => {
console.log(res);
this.$confirm("确定清除所有命令?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$message({
duration: 1500,
showClose: true,
message: "命令已清除",
type: "success",
});
this.getCmdList();
this.getEndList();
})
.catch(() => {});
})
.catch((err) => {});
},
},
beforeDestroy() {
//清除定时器
clearInterval(this.cmdtimer);
clearInterval(this.endtimer);
this.cmdtimer = null;
this.endtimer = null;
if (this.intervalId) {
clearInterval(this.intervalId);
}
},
};
</script>
<style lang="less">
.reportBox {
height: calc(100% - 24px);
width: calc(100% - 24px);
padding: 12px;
.commandBox {
display: flex;
1 year ago
height: calc(100% - 18px);
1 year ago
.commandClass {
width: 50%;
padding: 12px;
height: calc(100% - 24px);
border: 1px solid #dcdfe6;
margin-right: 12px;
border-radius: 4px;
.headTitle {
height: 40px;
line-height: 40px;
display: flex;
align-items: center;
.title {
font-size: 16px;
font-weight: normal;
}
.el-select {
margin: 0px 12px;
width: 150px;
}
.cmdidClass {
width: 180px;
}
.mlspan {
font-size: 14px;
margin-left: 8px;
}
.time {
font-size: 12px;
margin-left: 8px;
}
.deletebtn {
margin-left: auto;
padding: 4px;
}
}
1 year ago
.mlbpox{
height: calc(100% - 40px);
}
1 year ago
.commandList {
width: 100%;
1 year ago
height: calc(100% - 0px);
1 year ago
//background: #fcc;
overflow: auto;
p {
background: #fdf6ec;
margin-bottom: 8px;
line-height: 24px;
color: #333;
font-size: 14px;
padding: 6px;
cursor: pointer;
display: flex;
align-items: center;
&:hover {
background: #faecd8;
}
.indexClass {
padding: 4px;
font-size: 14px;
color: #000;
background: #d3d3d3;
min-width: 18px;
text-align: center;
margin-right: 8px;
}
.normalClass {
background: #d3d3d3;
}
.cancelClass {
background: #fde2e2;
}
.comMsg {
display: flex;
flex-wrap: wrap;
b {
font-weight: normal;
margin-right: 12px;
}
}
}
}
}
.commandRunLeft {
}
.commandRunRight {
.commandList {
p {
cursor: default;
background: #e1f3d8;
&:hover {
background: #e1f3d8;
}
}
}
}
}
.MsgDialog {
.cmdMain {
p {
font-size: 16px;
line-height: 32px;
}
}
.dialog-footer {
display: flex;
align-items: center;
justify-content: center;
}
}
}
.el-dialog__headerbtn {
top: 18px;
.el-dialog__close {
font-size: 26px;
&:hover {
background: #e2e2e2;
}
}
}
</style>