2025-08-13 09:50:51 +08:00
|
|
|
|
<template>
|
|
|
|
|
<a-col v-for="(item,index) in tableData" :key="index" :xs="24" :sm="24" :md="12" :lg="12" :xl="8" :xxl="6" style="padding: 8px;">
|
|
|
|
|
<a-card style="width: 100%;border-radius: 8px;" :headStyle="{ height: '60px', padding: '0 24px' }" :bodyStyle="{ padding: '24px 24px 4px 24px' }">
|
|
|
|
|
<template #title>
|
|
|
|
|
<a-row style="font-weight: normal;">
|
|
|
|
|
<a-col :span="18" style="font-size: 14px;">
|
|
|
|
|
<div style="font-size: 12px;">SN:<span style="font-weight: bold;">{{item.sn}}</span></div>
|
|
|
|
|
<div style="font-size: 12px;">设备类型:摄像头</div>
|
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :span="6" style="text-align: center;padding-top: 4px;">
|
|
|
|
|
<div :class="item.deviceStatus=='1'?'zxClass':'lxClass'">{{item.deviceStatus =='1'?'在线':'离线'}}</div>
|
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
|
|
|
|
</template>
|
|
|
|
|
<a-row>
|
|
|
|
|
<a-col :span="24" style="margin-top: -10px;">
|
2025-08-14 08:33:30 +08:00
|
|
|
|
NUID: {{item.nuId?item.nuId:'未配置'}}
|
2025-08-13 09:50:51 +08:00
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :span="12" style="text-align: left;margin-top: 10px;">
|
|
|
|
|
同步状态:{{item.syncType =='1'?'已同步':'未同步'}}
|
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :span="12" style="text-align: left;margin-top: 10px;">
|
|
|
|
|
维修状态:
|
|
|
|
|
<span v-if="item.maintainStatus=='0'">正常</span>
|
|
|
|
|
<span v-if="item.maintainStatus=='1'" style="color: red;">维修中</span>
|
|
|
|
|
<span v-if="item.maintainStatus=='2'">报废</span>
|
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :span="24" style="text-align: center;margin-top: 20px;">
|
|
|
|
|
<span style="display:inline-block;cursor: pointer;" @click="handlePreview(item)">
|
|
|
|
|
<span class="tbClass"><img src="../../../assets/iot/a14.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">预览</span>
|
|
|
|
|
</span>
|
|
|
|
|
<span style="display:inline-block;cursor: pointer;margin-left:10px;" @click="handleDel(item)" v-if="item.syncType=='0'">
|
|
|
|
|
<span class="tbClass"><img src="../../../assets/iot/a15.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">移除</span>
|
|
|
|
|
</span>
|
|
|
|
|
<span style="display:inline-block;cursor: pointer;margin-left:10px;" @click="handleWeixiu(item)" v-if="item.maintainStatus=='1'" >
|
|
|
|
|
<span class="tbClass"><img src="../../../assets/iot/a6.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">维修</span>
|
|
|
|
|
</span>
|
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
|
|
|
|
</a-card>
|
|
|
|
|
</a-col>
|
|
|
|
|
|
|
|
|
|
<CameraPreviewModal ref="previewModal"></CameraPreviewModal>
|
|
|
|
|
<a-modal v-model:visible="wxvisible" title="维修" @ok="handleWxOk">
|
|
|
|
|
<div style="padding: 10px;text-align: center;">
|
|
|
|
|
<div style="line-height: 60px;">
|
|
|
|
|
维修状态:<a-radio-group v-model:value="maintainStatus" :options="plainOptions" />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</a-modal>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script lang="ts" name="iot-nuIotCameraInfo" setup>
|
|
|
|
|
import {ref} from 'vue';
|
|
|
|
|
import {Modal} from 'ant-design-vue';
|
|
|
|
|
import { useMessage } from '/@/hooks/web/useMessage';
|
|
|
|
|
import CameraPreviewModal from '/@/views/iot/tplink/camera/components/CameraPreviewModal.vue'
|
|
|
|
|
import { c } from 'node_modules/vite/dist/node/moduleRunnerTransport.d-DJ_mE5sf';
|
|
|
|
|
import { defHttp } from '/@/utils/http/axios';
|
|
|
|
|
|
|
|
|
|
const wxvisible = ref<boolean>(false);
|
|
|
|
|
const bxInfo = ref<any>({});
|
|
|
|
|
const maintainStatus = ref<string>('');
|
|
|
|
|
const previewModal = ref();
|
|
|
|
|
const { createMessage } = useMessage();
|
|
|
|
|
const emit = defineEmits(['register', 'ok']);
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
tableData: { type: Object, default: () => ([]) },
|
|
|
|
|
});
|
|
|
|
|
const plainOptions = [
|
|
|
|
|
{ label: '正常', value: '0' },
|
|
|
|
|
{ label: '报废', value: '2' },
|
|
|
|
|
];
|
|
|
|
|
function handleWxOk() {
|
|
|
|
|
if(!maintainStatus.value){
|
|
|
|
|
createMessage.error('请选择报修状态!');
|
|
|
|
|
}else{
|
|
|
|
|
wxvisible.value = false;
|
|
|
|
|
var params = {
|
|
|
|
|
id: bxInfo.value.id,
|
2025-08-14 13:52:58 +08:00
|
|
|
|
departServerUrl: bxInfo.value.departServerUrl,
|
2025-08-13 09:50:51 +08:00
|
|
|
|
maintainStatus: maintainStatus.value,
|
|
|
|
|
}
|
2025-08-14 13:52:58 +08:00
|
|
|
|
defHttp.post({ url: '/iot/tplink/cameraInfo/weixiu', params }).then(() => {
|
2025-08-13 09:50:51 +08:00
|
|
|
|
emit("ok");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 维修
|
|
|
|
|
*/
|
|
|
|
|
function handleWeixiu(record){
|
|
|
|
|
bxInfo.value = record;
|
|
|
|
|
wxvisible.value = true;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 预览
|
|
|
|
|
*/
|
|
|
|
|
function handlePreview(record) {
|
|
|
|
|
previewModal.value.disableSubmit = true;
|
|
|
|
|
previewModal.value.edit(record);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 删除
|
|
|
|
|
*/
|
|
|
|
|
function handleDel(record) {
|
|
|
|
|
console.log("🚀 ~ handleDel ~ record:", record)
|
|
|
|
|
const list = props.tableData;
|
|
|
|
|
if(list.length==1){
|
|
|
|
|
createMessage.error('请至少保留一个摄像头!');
|
|
|
|
|
}else{
|
|
|
|
|
Modal.confirm({
|
|
|
|
|
title: '移除摄像头',
|
|
|
|
|
content: '是否要移除此摄像头?',
|
|
|
|
|
okText: '确认',
|
|
|
|
|
cancelText: '取消',
|
|
|
|
|
onOk: async () => {
|
|
|
|
|
// todo 删除
|
|
|
|
|
defHttp.post({ url: '/iot/tplink/cameraInfo/updateDepartById', params: { id: record.id } }).then(() => {
|
|
|
|
|
emit("ok");
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.zxClass{
|
|
|
|
|
font-size:14px;
|
|
|
|
|
background: linear-gradient(to right, #1ea0fa, #017de9);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
height: 35px;
|
|
|
|
|
color: white;
|
|
|
|
|
line-height: 35px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.lxClass{
|
|
|
|
|
font-size:14px;
|
|
|
|
|
background: linear-gradient(to right, #cccccc, #cccccc);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
height: 35px;
|
|
|
|
|
color: white;
|
|
|
|
|
line-height: 35px;
|
|
|
|
|
}
|
|
|
|
|
.tbClass{
|
|
|
|
|
background: #f6f6f6;
|
|
|
|
|
padding: 8px;
|
|
|
|
|
border-radius: 5px;
|
|
|
|
|
}
|
|
|
|
|
.antTitle{
|
|
|
|
|
margin-top: 10px;
|
|
|
|
|
display: block;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.ytbClass{
|
|
|
|
|
font-size:12px;
|
|
|
|
|
background: linear-gradient(to right, #1ea0fa, #017de9);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
height: 20px;
|
|
|
|
|
color: white;
|
|
|
|
|
line-height: 20px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.wtbClass{
|
|
|
|
|
font-size:12px;
|
|
|
|
|
background: linear-gradient(to right, #cccccc, #cccccc);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
height: 20px;
|
|
|
|
|
color: white;
|
|
|
|
|
line-height: 20px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</style>
|