1258 lines
38 KiB
Vue
1258 lines
38 KiB
Vue
<template>
|
||
<div class="cont">
|
||
<el-tabs v-model="activeName" class="demo-tabs" @tab-change="tabChange">
|
||
<el-tab-pane label="布控对象" name="second">
|
||
<a-button type="primary" style="margin-left: 20px" @click="sendBk()">新增对象</a-button>
|
||
<a-button type="primary" style="margin-left: 20px" @click="openGroupDialog()">分组管理</a-button>
|
||
<div style="padding: 10px; height: calc(100% - 85px); overflow: auto">
|
||
<el-table :data="tableData2" border style="width: 100%">
|
||
<el-table-column type="index" width="60" label="序号" align="center" :index="indexMethod1" />
|
||
<el-table-column label="布控对象属性类型" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.targetType == 'face' ? '人脸' : '车牌号' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="targetName" label="布控对象名称" align="center" />
|
||
<el-table-column prop="targetValue" label="布控对象属性值" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="groupName" label="布控对象分组" align="center" />
|
||
<!-- <el-table-column prop="groupLevel" label="分组等级" align="center" /> -->
|
||
<el-table-column prop="targetLevel" label="布控对象等级" align="center" />
|
||
<el-table-column prop="imageData" label="布控对象数据" align="center" />
|
||
<el-table-column prop="controlstatus" label="布控状态" align="center" />
|
||
<el-table-column label="布控对象照片" align="center">
|
||
<template #default="scope">
|
||
<!-- <a-image :width="100" :height="100" :src="scope.row.imageUrl" /> -->
|
||
<el-button @click="handleClick(scope.row.imageUrl)" type="primary" primary size="small">查看</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column align="center">
|
||
<template #default="scope">
|
||
<a-button type="primary" @click="handleTableChange(scope.row)" size="small">修改</a-button>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column align="center">
|
||
<template #default="scope">
|
||
<el-popconfirm @confirm="handleTableDelete(scope.row.targetId)" title="确定要删除该布控对象么?">
|
||
<template #reference>
|
||
<a-button type="primary" danger size="small">删除</a-button>
|
||
</template>
|
||
</el-popconfirm>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
<el-pagination style="position: absolute; right: 60px" @current-change="handleCurrentChange2" :page-size="15" layout="total, prev, pager, next" :total="total2"> </el-pagination>
|
||
</div>
|
||
</el-tab-pane>
|
||
<el-tab-pane label="布控任务" name="first">
|
||
<a-button type="primary" style="margin-left: 20px" @click="sendbkrw">申请布控任务</a-button>
|
||
<div style="padding: 10px; height: calc(100% - 52px); overflow: auto">
|
||
<el-table :data="tableData" border style="width: 100%">
|
||
<el-table-column type="index" width="60" label="序号" align="center" :index="indexMethod2" />
|
||
<el-table-column prop="targetValue" label="布控对象号码" align="center" show-overflow-tooltip />
|
||
<el-table-column label="布控对象类型" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.targetType == 'face' ? '人脸' : '车牌号' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="searchCity" label="比对城市" align="center" />
|
||
<el-table-column prop="searchDistrict" label="比对区县" align="center" />
|
||
<el-table-column prop="level" label="任务等级" align="center" />
|
||
<el-table-column prop="alarmType" label="预警类型" align="center" />
|
||
<el-table-column prop="state" label="状态" align="center" />
|
||
<el-table-column prop="timestamp" label="申请时间" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="startTime" label="开始时间" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="endTime" label="结束时间" align="center" show-overflow-tooltip />
|
||
<el-table-column label="操作" align="center">
|
||
<template #default="scope">
|
||
<!-- <a-button type="link" @click="chekong(scope.row)">撤控</a-button> -->
|
||
<a-button style="margin-right: 10px" type="primary" @click="xkong(scope.row)" size="small">续控</a-button>
|
||
<el-popconfirm title="确定撤控吗?" @confirm="chekong(scope.row)">
|
||
<template #reference>
|
||
<!-- <el-button>撤控</el-button> -->
|
||
<a-button type="primary" danger size="small">撤控</a-button>
|
||
</template>
|
||
</el-popconfirm>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
<el-pagination style="position: absolute; right: 60px" @current-change="handleCurrentChange1" :page-size="15" layout="total, prev, pager, next" :total="total1"> </el-pagination>
|
||
</div>
|
||
</el-tab-pane>
|
||
</el-tabs>
|
||
<el-dialog title="分组管理" v-model="groupVisible" width="50%" :before-close="handleClose">
|
||
<a-button type="primary" style="margin-left: 20px; margin-bottom: 10px" @click="addGroup()">新增分组</a-button>
|
||
<div style="overflow-y: auto; height: 500px">
|
||
<el-table :data="tableGroupData" border style="width: 100%">
|
||
<el-table-column class="el_table_column" prop="groupName" label="分组名称" align="center" />
|
||
<el-table-column prop="groupLevel" label="分组等级" align="center" />
|
||
<el-table-column prop="comment" label="分组说明" align="center" />
|
||
<el-table-column align="center">
|
||
<template #default="scope">
|
||
<a-button type="primary" @click="handleTableGroupChange(scope.row)" size="small">修改分组</a-button>
|
||
<el-popconfirm @confirm="handleTableGroupDelete(scope.row.groupId)" title="确定要删除该分组么?">
|
||
<template #reference>
|
||
<a-button style="margin-left: 10px" type="primary" danger size="small">删除分组</a-button>
|
||
</template>
|
||
</el-popconfirm>
|
||
<!-- <a-button style="margin-left: 10px" type="primary" danger @click="handleTableGroupChange(scope.row)" size="small">删除分组</a-button> -->
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-dialog>
|
||
<!-- 新增分组弹窗 -->
|
||
<el-dialog :title="dialogTitle" v-model="addGroupVisible" width="40%" :before-close="closeAddGroup">
|
||
<el-form ref="ruleFormRef_Group" :rules="rulesGroup" :model="formGroup" label-width="120px" style="max-height: 500px; overflow-y: scroll; padding: 10px">
|
||
<el-form-item label="分组名称" prop="groupName">
|
||
<el-input required v-model="formGroup.groupName"></el-input>
|
||
</el-form-item>
|
||
<el-form-item label="分组等级" prop="groupLevel">
|
||
<el-input required v-model="formGroup.groupLevel"></el-input>
|
||
</el-form-item>
|
||
<el-form-item label="分组说明">
|
||
<el-input v-model="formGroup.comment"></el-input>
|
||
</el-form-item>
|
||
</el-form>
|
||
<template #footer>
|
||
<span class="dialog-footer">
|
||
<el-button @click="addGroupVisible = false" style="color: #0cd6fe">取 消</el-button>
|
||
<el-button type="primary" @click="addGroupFn(ruleFormRef_Group)" style="color: #0cd6fe">确 定</el-button>
|
||
</span>
|
||
</template>
|
||
</el-dialog>
|
||
<el-dialog opened="openDialog" :title="dialogTargrtTitle" v-model="dialogVisible" width="40%" :before-close="handleClose">
|
||
<!-- 不能加这个ref,否则就不是响应式 ref="form" -->
|
||
<el-form ref="ruleFormRef" :rules="rules" :model="form" label-width="120px" style="max-height: 500px; overflow-y: scroll; padding: 10px">
|
||
<el-form-item label="选择地区">
|
||
<el-cascader placeholder="请选择地区" size="default" :options="cascaderOptions" v-model="selectedOptions" @change="handleChange"> </el-cascader>
|
||
</el-form-item>
|
||
<el-form-item label="布控对象名称" prop="targetName">
|
||
<el-input required v-model="form.targetName"></el-input>
|
||
</el-form-item>
|
||
<el-form-item label="布控对象类型">
|
||
<el-select v-model="form.targetType" placeholder="请选择类型" style="width: 100%">
|
||
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item label="布控对象分组">
|
||
<el-select v-model="form.groupName" placeholder="请选择分组" style="width: 100%" @change="selectChange">
|
||
<el-option v-for="item in tableGroupData" :key="item.groupId" :label="item.groupName" :value="item.groupId"> </el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item label="布控对象属性值">
|
||
<el-input v-model="form.targetValue"></el-input>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="布控对象等级">
|
||
<el-input v-model="form.targetLevel"></el-input>
|
||
</el-form-item>
|
||
<el-form-item label="布控对象数据">
|
||
<el-input v-model="form.imageData"></el-input>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="人脸">
|
||
<el-upload
|
||
ref="uploadrefss"
|
||
method="put"
|
||
:before-upload="beforeAvatarUpload"
|
||
:on-error="handleError"
|
||
:on-preview="handlePictureCardPreview"
|
||
:on-remove="handleRemove"
|
||
on-success="handlePictureCardSuccess"
|
||
action="#"
|
||
list-type="picture-card"
|
||
:http-request="handleUpload"
|
||
:file-list="fileList"
|
||
>
|
||
<el-icon>
|
||
<plus />
|
||
</el-icon>
|
||
</el-upload>
|
||
<!-- <el-progress :percentage="uploadPercentage" /> -->
|
||
</el-form-item>
|
||
</el-form>
|
||
<template #footer>
|
||
<span class="dialog-footer">
|
||
<el-button @click="dialogVisible = false" style="color: #0cd6fe">取 消</el-button>
|
||
<el-button type="primary" @click="RTCSender(ruleFormRef)" style="color: #0cd6fe">确 定</el-button>
|
||
</span>
|
||
</template>
|
||
</el-dialog>
|
||
<el-dialog title="申请布控任务" v-model="dialogVisiblea1" width="450" :before-close="handleClose">
|
||
<el-form :model="form2" label-width="120px">
|
||
<el-form-item label="布控对象">
|
||
<!-- {{tableData2}} -->
|
||
<el-select v-model="form2.target" :disabled="isxKOng" placeholder="请选择" style="width: 100%" @change="setyd">
|
||
<el-option v-for="item in tableData2" :key="item.targetValue + '&' + item.targetId" :label="item.targetName" :value="item.targetValue + '&' + item.targetId"> </el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item label="布控对象类型">
|
||
<el-select v-model="form2.targetType" :disabled="isxKOng" placeholder="请选择" style="width: 100%">
|
||
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item label="布控地区">
|
||
<el-cascader placeholder="请选择地区" :disabled="isxKOng" size="default" :options="cascaderOptions1" v-model="selectedOptions1" @change="handleChange1" style="width: 100%"> </el-cascader>
|
||
</el-form-item>
|
||
<el-form-item label="任务等级">
|
||
<el-input v-model="form2.level" :disabled="isxKOng"></el-input>
|
||
</el-form-item>
|
||
<el-form-item label="预警类型">
|
||
<el-input v-model="form2.alarmType" :disabled="isxKOng"></el-input>
|
||
</el-form-item>
|
||
<el-form-item label="开始时间">
|
||
<el-date-picker v-model="form2.startTime" type="datetime" placeholder="选择日期时间" style="width: 100%" value-format="YYYY-MM-DD HH:mm:ss" />
|
||
</el-form-item>
|
||
<el-form-item label="结束时间">
|
||
<el-date-picker v-model="form2.endTime" type="datetime" placeholder="选择日期时间" style="width: 100%" value-format="YYYY-MM-DD HH:mm:ss" />
|
||
</el-form-item>
|
||
</el-form>
|
||
<template #footer>
|
||
<span class="dialog-footer">
|
||
<el-button @click="dialogVisiblea1 = false" style="color: #0cd6fe">取 消</el-button>
|
||
<el-button v-if="isxKOng" type="primary" @click="sendxk" style="color: #0cd6fe">确 定</el-button>
|
||
<el-button v-else type="primary" @click="RTCRtpSender" style="color: #0cd6fe">确 定</el-button>
|
||
</span>
|
||
</template>
|
||
</el-dialog>
|
||
|
||
<el-dialog title="布控对象照片" v-model="dialogVisiblea" width="30%" :before-close="handleClose1">
|
||
<!-- <img style="width: 100%; height: 100%" :src="opkierimg" alt="" /> -->
|
||
<div class="dialog-img-container">
|
||
<img :src="opkierimg" alt="" />
|
||
</div>
|
||
</el-dialog>
|
||
</div>
|
||
</template>
|
||
|
||
<script lang="ts" setup>
|
||
import { ref, reactive, onMounted, watch } from 'vue'
|
||
import api from '@/axios'
|
||
import axios from 'axios'
|
||
import { ElMessage } from 'element-plus'
|
||
import type { UploadProps, FormRules, FormInstance } from 'element-plus'
|
||
|
||
const ruleFormRef_Group = ref<FormInstance>()
|
||
const ruleFormRef = ref<FormInstance>()
|
||
const uploadUrl = ref('')
|
||
const isUpdate = ref(false)
|
||
const isTargetUpdate = ref(false)
|
||
const cascaderOptions = ref([])
|
||
const cascaderOptions1 = ref([])
|
||
const selectedOptions = ref([])
|
||
const selectedOptions1 = ref([])
|
||
let uploadrefss = ref()
|
||
const uploadPercentage = ref(0)
|
||
const fileList = ref([])
|
||
const dialogVisiblea = ref(false)
|
||
const dialogVisiblea1 = ref(false)
|
||
const isxKOng = ref(false)
|
||
const opkierimg = ref('')
|
||
const activeName = ref('second')
|
||
const dialogVisible = ref(false)
|
||
const groupVisible = ref(false)
|
||
const addGroupVisible = ref(false)
|
||
|
||
const value1 = ref('')
|
||
|
||
const tableData = ref<any[]>([])
|
||
const tableData2 = ref<any[]>([])
|
||
const tableGroupData = ref<any[]>([])
|
||
const total1 = ref()
|
||
const pageNum2 = ref(1)
|
||
const value2 = ref('')
|
||
|
||
const currentPageIndex = ref(0)
|
||
const tabChange = (e: any) => {
|
||
console.log('🚀 ~ tabChange ~ e:', e)
|
||
currentPageIndex.value = 0
|
||
}
|
||
const total2 = ref()
|
||
const pageNum1 = ref(1)
|
||
const dialogTitle = ref('新增分组')
|
||
const dialogTargrtTitle = ref('新增对象')
|
||
|
||
interface anyObject {
|
||
[key: string]: string
|
||
}
|
||
interface formGroupFace {
|
||
groupName: string
|
||
groupId: string
|
||
groupLevel: string
|
||
parentId: string
|
||
comment: string
|
||
}
|
||
|
||
let formGroup = reactive<formGroupFace>({
|
||
groupName: '',
|
||
groupId: '',
|
||
groupLevel: '',
|
||
parentId: '',
|
||
comment: '',
|
||
})
|
||
const form2 = reactive<anyObject>({
|
||
target: '',
|
||
targetType: '',
|
||
searchCity: '',
|
||
searchDistrict: '',
|
||
level: '',
|
||
alarmType: '',
|
||
startTime: '',
|
||
endTime: '',
|
||
})
|
||
|
||
interface formFace {
|
||
targetType: string
|
||
targetName: string
|
||
targetLevel: string
|
||
imageUrl: string
|
||
imageData: string
|
||
targetId: string
|
||
targetValue: string
|
||
groupId: string
|
||
groupName: string
|
||
controlStatus: string
|
||
district: string
|
||
city: string
|
||
town: string
|
||
imageName: string
|
||
path: string
|
||
}
|
||
let form = reactive<formFace>({
|
||
targetType: '', //类型
|
||
targetName: '', //对象名字
|
||
targetLevel: '', //布控对象等级
|
||
imageUrl: '', //人脸图片地址
|
||
imageData: '', //布控对象数据
|
||
targetId: '',
|
||
targetValue: '', //属性值
|
||
groupId: '',
|
||
groupName: '',
|
||
controlStatus: '',
|
||
district: '',
|
||
city: '',
|
||
town: '',
|
||
imageName: '',
|
||
path: '',
|
||
})
|
||
|
||
const resetData = () => {
|
||
const keys = Object.keys(form)
|
||
let obj: { [name: string]: string } = {}
|
||
keys.forEach((item) => {
|
||
obj[item] = ''
|
||
})
|
||
Object.assign(form, obj)
|
||
}
|
||
const options = reactive([
|
||
{
|
||
value: 'face',
|
||
label: '人脸',
|
||
},
|
||
{
|
||
value: 'vehicle',
|
||
label: '车牌',
|
||
},
|
||
])
|
||
watch(addGroupVisible, (newValue, oldValue) => {
|
||
console.log(`addGroupVisible ${oldValue} to ${newValue}`)
|
||
if (!newValue) {
|
||
isUpdate.value = false
|
||
}
|
||
})
|
||
|
||
const validateTargetName = (rule: any, value: any, callback: any) => {
|
||
console.log('🚀 ~ validateTargetName ~ value:', value)
|
||
if (value.trim().length === 0) {
|
||
callback(new Error('请输入布控对象名称'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
const validateGroupName = (rule: any, value: any, callback: any) => {
|
||
if (value.trim().length === 0) {
|
||
callback(new Error('请输入分组名称'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
const validateGroupLevel = (rule: any, value: any, callback: any) => {
|
||
if (value.trim().length === 0) {
|
||
callback(new Error('请输入分组等级'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
const validateTown = (rule: any, value: any, callback: any) => {
|
||
if (value.trim().length === 0) {
|
||
callback(new Error('请输入街道'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
const validateTargetType = (rule: any, value: any, callback: any) => {
|
||
if (value.trim().length === 0) {
|
||
callback(new Error('请选择布控对象类型'))
|
||
} else {
|
||
callback()
|
||
}
|
||
}
|
||
|
||
const rules = reactive<FormRules<typeof form>>({
|
||
targetName: [{ validator: validateTargetName, trigger: 'blur' }],
|
||
// town: [{ validator: validateTown, trigger: 'blur' }],
|
||
// targetType: [{ validator: validateTargetType, trigger: 'change' }],
|
||
})
|
||
|
||
const rulesGroup = reactive<FormRules<typeof formGroup>>({
|
||
groupName: [{ validator: validateGroupName, trigger: 'blur' }],
|
||
groupLevel: [{ validator: validateGroupLevel, trigger: 'blur' }],
|
||
})
|
||
|
||
const addGroupFn = (formEl: FormInstance | undefined) => {
|
||
if (!formEl) return
|
||
formEl.validate((valid) => {
|
||
if (valid) {
|
||
console.log('submit!')
|
||
if (isUpdate.value) {
|
||
api.post('/multialarm/ai/target/group/update', { ...formGroup }).then((res) => {
|
||
if (res.code == 0) {
|
||
ElMessage.success({
|
||
message: '修改成功',
|
||
type: 'success',
|
||
})
|
||
getGroupList()
|
||
addGroupVisible.value = false
|
||
} else {
|
||
ElMessage.error(`${res.msg}`)
|
||
}
|
||
})
|
||
} else {
|
||
api.post('/multialarm/ai/target/group/add', { ...formGroup }).then((res) => {
|
||
if (res.code == 0) {
|
||
ElMessage.success({
|
||
message: '新增成功',
|
||
type: 'success',
|
||
})
|
||
getGroupList()
|
||
addGroupVisible.value = false
|
||
} else {
|
||
ElMessage.error(`${res.msg}`)
|
||
}
|
||
})
|
||
}
|
||
} else {
|
||
console.log('error submit!')
|
||
}
|
||
})
|
||
}
|
||
|
||
//取消上传,清空上传文件
|
||
function doClear() {
|
||
uploadrefss.value.clearFiles()
|
||
}
|
||
|
||
onMounted(() => {
|
||
seachA()
|
||
seachB()
|
||
getGroupList()
|
||
gettree()
|
||
})
|
||
|
||
const gettree = () => {
|
||
api.post('/common/client/user/org/tree').then((res) => {
|
||
console.log('🚀 tree:', res)
|
||
if (res.code == 0) {
|
||
const rawData = res.data as any[]
|
||
interface DataItem {
|
||
label: string
|
||
title: string
|
||
children?: DataItem[]
|
||
}
|
||
function convertDataToOptions(data: DataItem[]): { label: string; value: string; children: any[] }[] {
|
||
return data.map((item) => ({
|
||
label: item.title,
|
||
value: item.title,
|
||
children: item.children ? convertDataToOptions(item.children) : [],
|
||
}))
|
||
}
|
||
|
||
function filterCascadeData(data: any, filterFn: any) {
|
||
return data.filter((item: any) => {
|
||
;(item.label = item.title),
|
||
(item.value = item.title),
|
||
// 递归过滤子项
|
||
(item.children = item.children ? filterCascadeData(item.children, filterFn) : [])
|
||
// 如果当前项或子项通过过滤条件,则保留
|
||
return filterFn(item) || item.children.length > 0
|
||
})
|
||
}
|
||
const filterFn = (item: any) => item.level == '1' || item.level == '2'
|
||
const options = convertDataToOptions(rawData)
|
||
const options1 = filterCascadeData(res.data, filterFn)
|
||
console.log('options', options, options1)
|
||
cascaderOptions.value = options
|
||
cascaderOptions1.value = options1
|
||
} else {
|
||
}
|
||
})
|
||
}
|
||
const setyd = (e: any) => {}
|
||
const chekong = (e: any) => {
|
||
console.log('e', e.taskId)
|
||
// return ;
|
||
api.post('multialarm/ai/task/delete', { taskId: e.taskId }).then((res) => {
|
||
if (res.code == 0) {
|
||
// console.log('新增', res)
|
||
ElMessage.success({
|
||
message: '撤控成功',
|
||
type: 'success',
|
||
})
|
||
dialogVisiblea1.value = false
|
||
api
|
||
.post('/multialarm/ai/task/getlist', {
|
||
pagesize: 15,
|
||
pageindex: 0,
|
||
})
|
||
.then((res) => {
|
||
if (res.code == 0) {
|
||
tableData.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
}
|
||
|
||
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
|
||
if (form.targetName.trim().length === 0) {
|
||
ElMessage.error('上传图片必须输入布控对象名称')
|
||
return false
|
||
}
|
||
console.log(11111)
|
||
}
|
||
|
||
const handleUpload = async ({ file, onProgress, onSuccess, onError }: { file: File; onProgress: Function; onSuccess: Function; onError: Function }) => {
|
||
console.log('🚀 ~ handleUpload ~ file:', file)
|
||
form.imageName = file.name
|
||
try {
|
||
if (form.targetName.trim().length === 0) {
|
||
ElMessage.error('上传图片必须输入布控对象名称')
|
||
return
|
||
}
|
||
console.log(22222)
|
||
|
||
// 1. 获取上传地址
|
||
const uploadUrlResponse = await api.post('/multialarm/ai/target/image/geturl', { ...form })
|
||
const uploadUrl = uploadUrlResponse.data as string
|
||
// 2. 创建 FormData 对象并添加文件
|
||
const formData = new FormData()
|
||
formData.append('file', file)
|
||
// 3. 使用 axios 上传文件
|
||
const response = await axios.put(uploadUrl, file, {
|
||
})
|
||
console.log('🚀 ~ handleUpload ~ response:', response)
|
||
if (response.status === 200) {
|
||
console.log('form.path,form.imageUrl', form.path, form.imageUrl)
|
||
|
||
if (form.path.length > 0) {
|
||
let lastSlashIndex = form.path.lastIndexOf('/')
|
||
if (lastSlashIndex !== -1) {
|
||
// 获取斜杠之前的所有字符串
|
||
let prefix = form.path.substring(0, lastSlashIndex)
|
||
console.log('获取斜杠之前的所有字符串', prefix)
|
||
let newPath = `${prefix}/${file.name}`
|
||
form.path = newPath
|
||
} else {
|
||
console.log('未检索到/')
|
||
}
|
||
}
|
||
if (form.imageUrl.length > 0) {
|
||
let lastSlashIndex = form.imageUrl.lastIndexOf('/')
|
||
if (lastSlashIndex !== -1) {
|
||
// 获取斜杠之前的所有字符串
|
||
let prefix = form.imageUrl.substring(0, lastSlashIndex)
|
||
console.log('获取斜杠之前的所有字符串', prefix)
|
||
let newPath = `${prefix}/${file.name}`
|
||
form.imageUrl = newPath
|
||
} else {
|
||
console.log('未检索到/')
|
||
}
|
||
}
|
||
ElMessage.success({
|
||
message: '上传成功',
|
||
type: 'success',
|
||
})
|
||
// 添加文件到 fileList 以便预览
|
||
fileList.value.push({
|
||
name: file.name,
|
||
url: URL.createObjectURL(file),
|
||
})
|
||
console.log('最后检查form', form)
|
||
|
||
// if (onSuccess) {
|
||
// onSuccess(response.data) // 上传成功时的回调
|
||
// }
|
||
} else {
|
||
ElMessage.error('上传失败')
|
||
}
|
||
} catch (error) {
|
||
// 上传失败后的回调
|
||
// if (onError) {
|
||
// onError(error)
|
||
// }
|
||
}
|
||
}
|
||
|
||
const handleChange = (value: string[]) => {
|
||
console.log('🚀 ~ handleChange ~ value:', value)
|
||
if (value[0]) {
|
||
form.city = value[0]
|
||
} else {
|
||
form.city = ''
|
||
}
|
||
if (value[1]) {
|
||
form.district = value[1]
|
||
} else {
|
||
form.district = ''
|
||
}
|
||
if (value[2]) {
|
||
form.town = value[2]
|
||
} else {
|
||
form.town = ''
|
||
}
|
||
// console.log('🚀 ~ handleChange ~ form:', form)
|
||
}
|
||
const selectChange = (value: any) => {
|
||
console.log('🚀 ~ selectChange ~ value:', value)
|
||
form.groupId = value
|
||
}
|
||
const RTCSender = (formEl: FormInstance | undefined) => {
|
||
if (selectedOptions.value.length === 0) {
|
||
ElMessage.error('请选择地区')
|
||
return
|
||
}
|
||
if (form.targetType.length === 0) {
|
||
ElMessage.error('请选择布控对象类型')
|
||
return
|
||
}
|
||
if (!formEl) return
|
||
formEl.validate((valid) => {
|
||
if (valid) {
|
||
console.log('submit!')
|
||
if (isTargetUpdate.value) {
|
||
console.log(form.imageName)
|
||
api.post('/multialarm/ai/target/update', { ...form }).then((res) => {
|
||
if (res.code == 0) {
|
||
ElMessage.success({
|
||
message: '修改成功',
|
||
type: 'success',
|
||
})
|
||
dialogVisible.value = false
|
||
seachB() //刷新总条数和列表
|
||
|
||
Object.keys(form).forEach((key) => (form[key as keyof formFace] = ''))
|
||
doClear()
|
||
selectedOptions.value = []
|
||
} else {
|
||
ElMessage.error(res.msg)
|
||
}
|
||
})
|
||
} else {
|
||
api.post('/multialarm/ai/target/add', { ...form }).then((res) => {
|
||
if (res.code == 0) {
|
||
ElMessage.success({
|
||
message: '新增成功',
|
||
type: 'success',
|
||
})
|
||
dialogVisible.value = false
|
||
seachB() //刷新总条数和列表
|
||
Object.keys(form).forEach((key) => (form[key as keyof formFace] = ''))
|
||
doClear()
|
||
selectedOptions.value = []
|
||
} else {
|
||
ElMessage.error(res.msg)
|
||
}
|
||
})
|
||
}
|
||
} else {
|
||
console.log('error submit!')
|
||
}
|
||
})
|
||
}
|
||
|
||
const handleTableGroupChange = (row: any) => {
|
||
dialogTitle.value = '修改分组'
|
||
console.log('🚀 ~ handleTableGroupChange ~ row:', row)
|
||
isUpdate.value = true
|
||
addGroupVisible.value = true
|
||
const clonedData = JSON.parse(JSON.stringify(row))
|
||
formGroup = reactive(clonedData)
|
||
}
|
||
const sendBk = () => {
|
||
isTargetUpdate.value = false
|
||
selectedOptions.value = []
|
||
fileList.value = []
|
||
dialogTargrtTitle.value = '新增对象'
|
||
// Object.keys(form).forEach((key) => (form[key] = ''))
|
||
resetData()
|
||
dialogVisible.value = true
|
||
}
|
||
|
||
const handleTableChange = (row: any) => {
|
||
fileList.value = []
|
||
isTargetUpdate.value = true
|
||
console.log('🚀 ~ handleTableChange ~ row:', row)
|
||
dialogTargrtTitle.value = '修改布控对象'
|
||
dialogVisible.value = true
|
||
|
||
// selectedOptions.value.push(row.city, row.district, row.town)
|
||
if (row.city.length > 0 && row.district.length > 0 && row.town.length > 0) {
|
||
selectedOptions.value = [row.city, row.district, row.town]
|
||
}
|
||
if (row.city.length > 0 && row.district.length > 0 && row.town.length === 0) {
|
||
selectedOptions.value = [row.city, row.district]
|
||
}
|
||
if (row.city.length > 0 && row.district.length === 0 && row.town.length === 0) {
|
||
selectedOptions.value = [row.city]
|
||
}
|
||
const clonedData = JSON.parse(JSON.stringify(row))
|
||
form = reactive(clonedData)
|
||
|
||
fileList.value.push({
|
||
url: form.imageUrl,
|
||
})
|
||
}
|
||
|
||
const handleTableGroupDelete = (id: string) => {
|
||
console.log('🚀 ~ handleTableGroupDelete ~ id:', id)
|
||
api.post('/multialarm/ai/target/group/delete', { groupId: id }).then((res) => {
|
||
if (res.code == 0) {
|
||
ElMessage.success({
|
||
message: '删除成功',
|
||
type: 'success',
|
||
})
|
||
getGroupList()
|
||
} else {
|
||
ElMessage.error(res.msg)
|
||
}
|
||
})
|
||
}
|
||
const handleTableDelete = (id: string) => {
|
||
console.log('🚀 ~ handleTableDelete ~ id:', id)
|
||
api.post('/multialarm/ai/target/delete', { targetId: id }).then((res) => {
|
||
if (res.code == 0) {
|
||
ElMessage.success({
|
||
message: '删除成功',
|
||
type: 'success',
|
||
})
|
||
seachB()
|
||
} else {
|
||
ElMessage.error(res.msg)
|
||
}
|
||
})
|
||
}
|
||
|
||
const openDialog = (e: any) => {
|
||
console.log('🚀 ~ openDialog ~ e:', e)
|
||
}
|
||
//续控
|
||
const taskId = ref('')
|
||
const xkong = (row: any) => {
|
||
if (row.searchCity != '' && row.searchDistrict != '') {
|
||
selectedOptions1.value = [row.searchCity, row.searchDistrict]
|
||
}
|
||
console.log('row', row, tableData2)
|
||
taskId.value = row.taskId
|
||
dialogVisiblea1.value = true
|
||
isxKOng.value = true
|
||
form2.target = row.targetValue + '&' + row.targetId
|
||
form2.targetType = row.targetType
|
||
form2.searchCity = row.searchCity
|
||
form2.searchDistrict = row.searchDistrict
|
||
form2.level = row.level
|
||
form2.alarmType = row.alarmType
|
||
form2.startTime = row.startTime
|
||
form2.endTime = row.endTime
|
||
}
|
||
//提交续控
|
||
const sendxk = () => {
|
||
let data = {
|
||
targetId: '',
|
||
targetValue: '',
|
||
targetType: form2.targetType,
|
||
searchCity: form2.searchCity,
|
||
searchDistrict: form2.searchDistrict,
|
||
level: form2.level,
|
||
alarmType: form2.alarmType,
|
||
startTime: form2.startTime,
|
||
endTime: form2.endTime,
|
||
taskId: taskId.value,
|
||
}
|
||
if (form2.target != '') {
|
||
data.targetId = form2.target.split('&')[1]
|
||
data.targetValue = form2.target.split('&')[0]
|
||
}
|
||
api.post('multialarm/ai/task/update', data).then((res) => {
|
||
if (res.code == 0) {
|
||
// console.log('新增', res)
|
||
ElMessage.success({
|
||
message: '续控成功',
|
||
type: 'success',
|
||
})
|
||
dialogVisiblea1.value = false
|
||
api
|
||
.post('/multialarm/ai/task/getlist', {
|
||
pagesize: 15,
|
||
pageindex: 0,
|
||
})
|
||
.then((res) => {
|
||
if (res.code == 0) {
|
||
tableData.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
}
|
||
const handleChange1 = (value: string[]) => {
|
||
console.log('🚀 ~ handleChange1 ~ value:', value)
|
||
if (value[0]) {
|
||
form2.searchCity = value[0]
|
||
} else {
|
||
form2.searchCity = ''
|
||
}
|
||
if (value[1]) {
|
||
form2.searchDistrict = value[1]
|
||
} else {
|
||
form2.searchDistrict = ''
|
||
}
|
||
if (value[2]) {
|
||
form2.searchTown = value[2]
|
||
} else {
|
||
form2.searchTown = ''
|
||
}
|
||
}
|
||
const RTCRtpSender = () => {
|
||
console.log('form2', form2)
|
||
if (form2.target === '') {
|
||
ElMessage.error('请选择布控对象')
|
||
return
|
||
}
|
||
if (form2.targetType === '') {
|
||
ElMessage.error('请选择布控对象类型')
|
||
return
|
||
}
|
||
if (form2.searchCity === '') {
|
||
ElMessage.error('请选择布控城市')
|
||
return
|
||
}
|
||
if (form2.searchDistrict === '') {
|
||
ElMessage.error('请选择布控区县')
|
||
return
|
||
}
|
||
if (form2.startTime === '') {
|
||
ElMessage.error('请选择开始时间')
|
||
return
|
||
}
|
||
if (form2.endTime === '') {
|
||
ElMessage.error('请选择结束时间')
|
||
return
|
||
}
|
||
let data = {
|
||
targetId: '',
|
||
targetValue: '',
|
||
targetType: form2.targetType,
|
||
searchCity: form2.searchCity,
|
||
searchDistrict: form2.searchDistrict,
|
||
level: form2.level,
|
||
alarmType: form2.alarmType,
|
||
startTime: form2.startTime,
|
||
endTime: form2.endTime,
|
||
}
|
||
if (form2.target != '') {
|
||
data.targetId = form2.target.split('&')[1]
|
||
data.targetValue = form2.target.split('&')[0]
|
||
}
|
||
api.post('/multialarm/ai/task/add', data).then((res) => {
|
||
if (res.code == 0) {
|
||
// console.log('新增', res)
|
||
ElMessage.success({
|
||
message: '新增成功',
|
||
type: 'success',
|
||
})
|
||
dialogVisiblea1.value = false
|
||
api
|
||
.post('/multialarm/ai/task/getlist', {
|
||
pagesize: 15,
|
||
pageindex: 0,
|
||
})
|
||
.then((res) => {
|
||
if (res.code == 0) {
|
||
tableData.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
}
|
||
|
||
const sendbkrw = () => {
|
||
selectedOptions1.value = []
|
||
isxKOng.value = false
|
||
form2.target = ''
|
||
form2.targetType = ''
|
||
form2.searchCity = ''
|
||
form2.searchDistrict = ''
|
||
form2.level = ''
|
||
form2.alarmType = ''
|
||
form2.startTime = ''
|
||
form2.endTime = ''
|
||
dialogVisiblea1.value = true
|
||
}
|
||
|
||
const handleClick = (data: any) => {
|
||
opkierimg.value = data
|
||
dialogVisiblea.value = true
|
||
}
|
||
const handleClose1 = () => {
|
||
dialogVisiblea.value = false
|
||
}
|
||
|
||
const handlePictureCardPreview = (file: any) => {
|
||
console.log('🚀 ~ handlePictureCardPreview ~ file:', file)
|
||
}
|
||
const handleError = (response: any) => {
|
||
console.log('🚀 ~ handleError ~ response:', response)
|
||
return ElMessage({
|
||
message: '文件上传失败',
|
||
type: 'error',
|
||
offset: 60,
|
||
})
|
||
}
|
||
|
||
const handleRemove = () => {
|
||
console.log('🚀 ~ handleRemove ~ handleRemove:')
|
||
}
|
||
|
||
const handleClose = () => {
|
||
dialogVisible.value = false
|
||
dialogVisiblea1.value = false
|
||
groupVisible.value = false
|
||
}
|
||
//布控任务
|
||
|
||
const seachA = () => {
|
||
api.post('/multialarm/ai/task/count', {}).then((res) => {
|
||
if (res.code == 0) {
|
||
total1.value = res.data as { count: number }
|
||
}
|
||
})
|
||
api
|
||
.post('/multialarm/ai/task/getlist', {
|
||
pagesize: 15,
|
||
pageindex: 0,
|
||
})
|
||
.then((res) => {
|
||
if (res.code == 0) {
|
||
tableData.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
}
|
||
|
||
const handleCurrentChange1 = (data: any) => {
|
||
console.log('🚀 ~ handleCurrentChange1 ~ data:', data)
|
||
pageNum2.value = data
|
||
api
|
||
.post('/multialarm/ai/task/getlist', {
|
||
pagesize: 15,
|
||
pageindex: data - 1,
|
||
})
|
||
.then((res) => {
|
||
if (res.code == 0) {
|
||
tableData2.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
}
|
||
const indexMethod2 = (index: number) => {
|
||
return (pageNum2.value - 1) * 15 + index + 1
|
||
}
|
||
//布控对象
|
||
|
||
//刷新总条数和列表
|
||
const getGroupList = () => {
|
||
api.post('/multialarm/ai/target/group/getlist', {}).then((res) => {
|
||
console.log('🚀 ~ api.post ~ res:', res)
|
||
if (res.code == 0) {
|
||
tableGroupData.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error(res.msg)
|
||
}
|
||
})
|
||
}
|
||
|
||
const seachB = () => {
|
||
api.post('/multialarm/ai/target/count', {}).then((res) => {
|
||
console.log('🚀 ~ seachB ~ res:', res)
|
||
if (res.code == 0) {
|
||
total2.value = res.data as { count: number }
|
||
}
|
||
})
|
||
api
|
||
.post('/multialarm/ai/target/getlist', {
|
||
pagesize: 15,
|
||
pageindex: currentPageIndex.value,
|
||
})
|
||
.then((res) => {
|
||
if (res.code == 0) {
|
||
tableData2.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
}
|
||
|
||
// 布控对象的分页
|
||
const handleCurrentChange2 = (data: number) => {
|
||
console.log('🚀 ~ handleCurrentChange2 ~ data:', data)
|
||
currentPageIndex.value = data - 1
|
||
pageNum1.value = data
|
||
api
|
||
.post('/multialarm/ai/target/getlist', {
|
||
pagesize: 15,
|
||
// pageindex: data - 1,
|
||
pageindex: currentPageIndex.value,
|
||
})
|
||
.then((res) => {
|
||
if (res.code == 0) {
|
||
tableData2.value = res.data as any[]
|
||
} else {
|
||
ElMessage.error('请求失败')
|
||
}
|
||
})
|
||
}
|
||
const indexMethod1 = (index: number) => {
|
||
return (pageNum1.value - 1) * 15 + index + 1
|
||
}
|
||
const openGroupDialog = () => {
|
||
groupVisible.value = true
|
||
}
|
||
const addGroup = () => {
|
||
dialogTitle.value = '新增分组'
|
||
Object.keys(formGroup).forEach((key) => (formGroup[key as keyof formGroupFace] = ''))
|
||
addGroupVisible.value = true
|
||
}
|
||
const closeAddGroup = () => {
|
||
addGroupVisible.value = false
|
||
}
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.dialog-img-container {
|
||
overflow: visible; //让图片放大到外面,内容不能被裁减并且可能渲染到边距盒(padding)的外部。
|
||
}
|
||
|
||
.dialog-img-container img {
|
||
transition: transform 0.3s ease;
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
|
||
.dialog-img-container img:hover {
|
||
transform: scale(2.3);
|
||
}
|
||
|
||
.cont {
|
||
width: 100%;
|
||
height: 100%;
|
||
background-color: #fff;
|
||
// background:rgba(9, 45, 84, 1)
|
||
}
|
||
|
||
.demo-tabs > .el-tabs__content {
|
||
padding: 32px;
|
||
color: #6b778c;
|
||
font-size: 32px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
:deep(.el-upload--picture-card) {
|
||
background-color: transparent;
|
||
}
|
||
|
||
:deep(.el-select__wrapper) {
|
||
background-color: transparent;
|
||
box-shadow: 0 0 0 1px #1f9bd9;
|
||
}
|
||
|
||
:deep(.el-input.is-disabled .el-input__wrapper) {
|
||
background-color: transparent;
|
||
box-shadow: 0 0 0 1px #1f9bd9;
|
||
}
|
||
|
||
:deep(.el-textarea) {
|
||
--el-input-bg-color: #071d4d;
|
||
// --el-input-border-color: #071D4D;
|
||
}
|
||
|
||
:deep(.el-dialog__body) {
|
||
position: relative;
|
||
padding: 10px;
|
||
color: #fff;
|
||
}
|
||
|
||
:deep(.el-dialog) {
|
||
--el-dialog-bg-color: #071d4d;
|
||
border: 3px solid #387dbf;
|
||
}
|
||
|
||
:deep(.el-dialog__header) {
|
||
padding: 13px;
|
||
border-bottom: 1px solid #3374b4 !important;
|
||
margin-right: 0px;
|
||
}
|
||
|
||
:deep(.el-dialog__title) {
|
||
color: #067bc1 !important;
|
||
font-weight: 500;
|
||
}
|
||
|
||
:deep(.el-dialog__headerbtn .el-dialog__close) {
|
||
color: #fff;
|
||
font-weight: 500;
|
||
font-size: 18px;
|
||
}
|
||
|
||
:deep(.el-tabs__nav-wrap::after) {
|
||
background-color: #d9d9d95e;
|
||
height: 4px;
|
||
}
|
||
|
||
:deep(.el-tabs__item) {
|
||
color: #00000070;
|
||
font-weight: 700;
|
||
}
|
||
|
||
:deep(.el-tabs) {
|
||
--el-tabs-header-height: 50px;
|
||
}
|
||
|
||
:deep(.el-tabs__item.is-active) {
|
||
color: #000;
|
||
}
|
||
|
||
:deep(.el-tabs__active-bar) {
|
||
height: 4px;
|
||
background-color: #000;
|
||
}
|
||
|
||
:deep(.el-tabs__nav-wrap) {
|
||
padding-left: 23px;
|
||
}
|
||
|
||
:deep(.el-input__wrapper) {
|
||
background-color: transparent;
|
||
box-shadow: 0 0 0 1px #1f9bd9;
|
||
}
|
||
|
||
:deep(.el-select__wrapper) {
|
||
background-color: transparent;
|
||
box-shadow: 0 0 0 1px #1f9bd9;
|
||
}
|
||
|
||
:deep(.el-input__inner) {
|
||
color: #fff;
|
||
}
|
||
|
||
:deep(.el-input__prefix) {
|
||
color: #fff;
|
||
}
|
||
|
||
.el_button_ {
|
||
|
||
}
|
||
|
||
:deep(.el-button) {
|
||
background-color: transparent;
|
||
border-color: #0cd6fe;
|
||
color: #000;
|
||
}
|
||
|
||
:deep(.el-table) {
|
||
--el-table-border-color: #1677ff40;
|
||
}
|
||
|
||
:deep(.el-select__placeholder) {
|
||
color: #fff;
|
||
}
|
||
|
||
:deep(.el-table th.el-table__cell) {
|
||
// background-color: #5C9AD5;
|
||
}
|
||
|
||
:deep(.el-table thead) {
|
||
// color: #fff;
|
||
}
|
||
|
||
:deep(.el-table tr) {
|
||
// background-color: #E9F0F8;
|
||
}
|
||
|
||
:deep(.el-table__body tr.current-row > td) {
|
||
// background: #2cabff !important;
|
||
}
|
||
|
||
:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
|
||
// background-color: #13306A !important;
|
||
}
|
||
|
||
:deep(.el-table th.el-table__cell) {
|
||
// background-color:#13306A;
|
||
}
|
||
|
||
:deep(.el-date-editor .el-range-input) {
|
||
color: #fff;
|
||
}
|
||
|
||
:deep(.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell) {
|
||
// background: #D1DEEE !important;
|
||
}
|
||
|
||
:deep(.el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell) {
|
||
// background-color: transparent;
|
||
}
|
||
|
||
:deep(.el-tabs) {
|
||
height: 100%;
|
||
}
|
||
|
||
:deep(.el-table th.el-table__cell) {
|
||
background-color: #f5f7fa;
|
||
}
|
||
|
||
:deep(.el-tabs__content) {
|
||
height: calc(100% - 53px);
|
||
}
|
||
|
||
:deep(.el-tab-pane) {
|
||
height: 100%;
|
||
}
|
||
|
||
::-webkit-scrollbar {
|
||
background-color: #071d4d;
|
||
}
|
||
</style>
|