From 2ca94de8ede18ac07ccfd8dec7b6f6a707adde9b Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Mon, 01 Sep 2025 11:20:24 +0800
Subject: [PATCH] Merge branch 'refs/heads/feature/v5.0/5.0.5' into patch_management
---
src/api/device-setting/index.js | 4
src/views/job/components/SearchBox.vue | 51 ++-
src/views/tickets/ticket.vue | 49 ++
src/views/tickets/orderLog.vue | 9
src/views/device/components/DockControlPanel.vue | 4
src/views/device/index.vue | 5
yarn.lock | 24
src/views/device/components/DeviceSettingBox.vue | 72 ++-
src/views/device/addDevice.vue | 45 +-
src/views/device/components/use-device-setting.js | 15
src/views/device/airport.vue | 631 +++++++++++++++++++++++++++++----------
src/views/device/components/DeviceSettingPopover.vue | 23
12 files changed, 649 insertions(+), 283 deletions(-)
diff --git a/src/api/device-setting/index.js b/src/api/device-setting/index.js
index 84fba89..3ccc262 100644
--- a/src/api/device-setting/index.js
+++ b/src/api/device-setting/index.js
@@ -15,12 +15,14 @@
const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
export const putDeviceProps = (deviceSn, body) => {
+ console.log(deviceSn, body, workspaceId, '8888')
return request({
url: `/drone-device-core/manage/api/v1/devices/${workspaceId}/devices/${deviceSn}/property`,
method: 'put',
- body,
+ data: body,
})
}
+
/**
* 设置调色盘
* @param {机场编码} deviceSn
diff --git a/src/views/device/addDevice.vue b/src/views/device/addDevice.vue
index f55d3af..f556b04 100644
--- a/src/views/device/addDevice.vue
+++ b/src/views/device/addDevice.vue
@@ -81,7 +81,7 @@
calcHeight: 20,
column: [
{
- label: '工作空间名称',
+ label: '设备名称',// '工作空间名称',
prop: 'workspace_name',
editDisabled: true,
searchLabelWidth: 130,
@@ -91,40 +91,24 @@
rules: [
{
required: true,
- message: '请输入工作空间名称',
+ message: '请输入设备名称',
trigger: 'blur',
},
],
},
{
- label: '工作空间描述',
- prop: 'workspace_desc',
- labelWidth: 130,
- // search: true,
- searchSpan: 4,
- // editDisabled: true,
- rules: [
- {
- required: true,
- message: '请输入工作空间描述',
- trigger: 'blur',
- },
- ],
- },
- {
- label: '平台名称',
+ label: '系统名称',// '平台名称',
prop: 'platform_name',
labelWidth: 130,
editDisabled: true,
rules: [
{
required: false,
- message: '请输入平台名称',
+ message: '请输入系统名称',
trigger: 'blur',
},
],
},
-
{
label: '所属单位',
prop: 'dept_id',
@@ -182,10 +166,27 @@
],
},
{
+ label: '设备描述',// '工作空间描述',
+ prop: 'workspace_desc',
+ labelWidth: 130,
+ // search: true,
+ searchSpan: 4,
+ // editDisabled: true,
+ rules: [
+ {
+ required: true,
+ message: '请输入设备描述',
+ trigger: 'blur',
+ },
+ ],
+ },
+
+ {
label: '创建时间',
prop: 'create_time',
addDisplay: false,
editDisplay: false,
+ overHidden: true,
type: 'date',
labelWidth: 130,
width: 160,
@@ -193,7 +194,7 @@
},
{
- label: '行政区划',
+ label: '设备位置',// '行政区划',
prop: 'area_code',
type: 'cascader',
labelWidth: 130,
@@ -212,7 +213,7 @@
rules: [
{
required: true,
- message: '请选择行政区划',
+ message: '请选择设备位置',
trigger: 'change',
},
],
diff --git a/src/views/device/airport.vue b/src/views/device/airport.vue
index ac96407..8ff0905 100644
--- a/src/views/device/airport.vue
+++ b/src/views/device/airport.vue
@@ -45,33 +45,79 @@
:percentage="row.firmware_progress"></el-progress>
</div>
</template>
+ <template #domain="{ row }">
+ <span class="text">
+ {{ row.domain == 3 ? '机巢' : row.domain == 0 ? '无人机' : '其他' }}
+ </span>
+ </template>
<template #mode_code="{ row }">
- <span class="text" v-if="row.domain == 3" :style="row.mode_code != '-1' ? 'color: #00ee8b' : 'color: #de5e5e'">
- {{ getDockModeText(row.mode_code) }}
+ <span class="text" v-if="row.domain == 3 || row.domain == 0" :style="row.mode_code != '-1' ? 'color: #00ee8b' : 'color: #de5e5e'">
+ {{ getModelText(row.mode_code) }}
</span>
</template>
<template #menu="scope">
- <el-button type="primary" text icon="el-icon-paperclip" v-if="permission.oss_set"
- @click.stop="handleOpenOssSet(scope.row, scope.index)">存储配置
- </el-button>
- <el-button type="primary" text icon="el-icon-share" v-if="permission.per_share && scope.row.domain == 3"
- @click.stop="handleOpenDevicePerShare(scope.row, scope.index)">机场授权
- </el-button>
-
- <el-button type="primary" text icon="el-icon-position" :disabled="!scope.row.status"
- v-if="permission.rang_con && scope.row.domain == 3"
- @click.stop="handleOpenRemoteDebugging(scope.row, scope.index)">远程调试
- </el-button>
-
- <el-button type="primary" text icon="el-icon-setting" v-if="permission.fly_device_offline"
- @click.stop="handleDeviceOffline(scope.row)">设备下线
- </el-button>
+ <el-dropdown>
+ <el-button type="primary" text icon="el-icon-more" v-if="permission.oss_set">更 多</el-button>
+ <template #dropdown v-if="scope.row.domain == 3">
+ <el-dropdown-menu teleported>
+ <el-dropdown-item command="a">
+ <el-button type="primary" text icon="el-icon-paperclip" v-if="permission.oss_set" @click.stop="handleOpenOssSet(scope.row, scope.index)">存储配置</el-button>
+ </el-dropdown-item>
+ <el-dropdown-item command="b">
+ <el-button type="primary" text icon="el-icon-share" v-if="permission.per_share && scope.row.domain == 3"
+ @click.stop="handleOpenDevicePerShare(scope.row, scope.index)">机场授权</el-button>
+ </el-dropdown-item>
+ <el-dropdown-item command="c"> <el-button type="primary" text icon="el-icon-position" :disabled="!scope.row.status"
+ v-if="permission.rang_con && scope.row.domain == 3"
+ @click.stop="handleOpenRemoteDebugging(scope.row, scope.index)">远程调试</el-button>
+ </el-dropdown-item>
+ <el-dropdown-item command="d"><el-button type="primary" text icon="el-icon-collection" v-if="permission.fly_device_offline"
+ @click.stop="rollFirmware(scope.row)">固件版本管理</el-button>
+ </el-dropdown-item>
+ <el-dropdown-item command="e"><el-button type="primary" text icon="el-icon-document-delete" v-if="permission.fly_device_offline"
+ @click.stop="handleDeviceOffline(scope.row)">注销</el-button>
+ </el-dropdown-item>
+ </el-dropdown-menu>
+ </template>
+ <template #dropdown v-else>
+ <el-dropdown-menu teleported>
+ <el-dropdown-item command="a">
+ <el-button type="primary" text icon="el-icon-circle-close" @click.stop="rowDel(scope.row, scope.index)">删除</el-button>
+ </el-dropdown-item>
+ <el-dropdown-item command="a">
+ <el-button type="primary" text icon="el-icon-key" v-if="permission.operate_password_set" @click.stop="handleOperatePassword(scope.row, scope.index)">操控密码设置</el-button>
+ </el-dropdown-item>
+ </el-dropdown-menu>
+ </template>
+ </el-dropdown>
</template>
+
<!-- 添加行政区划显示模板 -->
<template #area_code="{ row }">
<span>{{ row.area_name }}</span>
</template>
</avue-crud>
+
+ <el-dialog title="操控密码设置" append-to-body v-model="operatePasswordSetBox" width="450px">
+ <el-form :model="passwordForm" ref="passwordForm" label-width="80px" :rules="rules" v-loading="loadingForm">
+ <el-form-item label="密码" prop="password">
+ <el-input type="password" v-model="passwordForm.password" placeholder="请输入密码" show-password></el-input>
+ </el-form-item>
+ <el-form-item label="确认密码" prop="password2">
+ <el-input type="password" v-model="passwordForm.password2" placeholder="请输入确认密码" show-password></el-input>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="operatePasswordSetBox = false">取 消</el-button>
+ <el-button type="primary" @click="setOperatePasswordConfirm">确 定</el-button>
+ </span>
+ </template>
+ </el-dialog>
+
+ <el-dialog title="操控密码查看" append-to-body v-model="operatePasswordViewBox" width="455px">
+ <el-input v-model="operate_password" disabled></el-input>
+ </el-dialog>
<el-dialog title="固件升级" append-to-body v-model="firmwareBox" width="455px">
<div>升级固件版本:{{ firmwareVersion }}</div>
@@ -133,7 +179,7 @@
<script>
import { ElMessage, ElMessageBox } from 'element-plus'
-
+import { pxToRem } from '@/utils/rem'
import {
getList,
remove,
@@ -163,7 +209,35 @@
DockControlPanel,
},
data () {
+ const validatePass = (rule, value, callback) => {
+ if (value === '') {
+ callback(new Error('请输入密码'))
+ } else {
+ callback()
+ }
+ }
+ const validatePass2 = (rule, value, callback) => {
+ if (value === '') {
+ callback(new Error('请再次输入密码'))
+ } else if (value !== this.passwordForm.password) {
+ callback(new Error('两次输入密码不一致!'))
+ } else {
+ callback()
+ }
+ }
return {
+ rules: {
+ password: [{ required: true, validator: validatePass, trigger: 'blur' }],
+ password2: [{ required: true, validator: validatePass2, trigger: 'blur' }],
+ },
+ passwordForm: {
+ id: '',
+ password: '',
+ password2: '',
+ },
+ operatePasswordSetBox: false,
+ operatePasswordViewBox: false,
+ operate_password: '',
bindOssId: null,
deviceSn: '',
ossSetBox: false,
@@ -207,6 +281,7 @@
border: true,
index: true,
viewBtn: true,
+ delBtn: false,
selection: true,
excelBtn: false,
addBtn: false,
@@ -218,162 +293,108 @@
column: [
{
+ label: '设备类型',
+ prop: 'domain',
+ editDisabled: true,
+ editDisplay: false, //编辑显示
+ viewDisplay: true, //查看显示
+ search: false,
+ slot: true,
+ searchSpan: 4,
+ labelWidth: 130,
+ width: 120,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入设备类型',
+ // trigger: 'blur',
+ // },
+ // ],
+ },
+ {
label: '设备型号',
prop: 'device_name',
editDisabled: true,
- search: true,
+ viewDisplay: true, //查看显示
+ search: false,
searchSpan: 4,
labelWidth: 130,
- rules: [
- {
- required: true,
- message: '请输入设备型号',
- trigger: 'blur',
- },
- ],
+ width: 120,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入设备型号',
+ // trigger: 'blur',
+ // },
+ // ],
},
{
label: '设备SN',
prop: 'device_sn',
labelWidth: 130,
- search: true,
+ width: 120,
+ overHidden: true,
searchSpan: 4,
editDisabled: true,
- rules: [
- {
- required: true,
- message: '请输入设备SN',
- trigger: 'blur',
- },
- ],
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入设备SN',
+ // trigger: 'blur',
+ // },
+ // ],
},
+ // {
+ // label: '机巢编号',
+ // prop: 'machine_nest_sn',
+ // labelWidth: 130,
+ // editDisabled: true,
+ // rules: [
+ // {
+ // required: false,
+ // message: '请输入机巢编号',
+ // trigger: 'blur',
+ // },
+ // ],
+ // },
{
- label: '机巢编号',
- prop: 'machine_nest_sn',
- labelWidth: 130,
- editDisabled: true,
- rules: [
- {
- required: false,
- message: '请输入机巢编号',
- trigger: 'blur',
- },
- ],
- },
- {
- label: '设备组织名称',
+ label: '设备名称',
prop: 'nickname',
labelWidth: 130,
- rules: [
- {
- required: true,
- message: '请输入设备组织名称',
- trigger: 'blur',
- },
- ],
- },
- {
- label: '固件版本',
- prop: 'firmware_version',
- labelWidth: 130,
width: 100,
- editDisabled: true,
+ searchSpan: 4,
+ search: true,
+ overHidden: true,
+ editDisplay: true, //编辑显示
rules: [
{
required: true,
- message: '请输入固件版本',
+ message: '请输入设备名称',
trigger: 'blur',
},
],
},
{
- label: '固件升级',
- prop: 'firmware_status',
- labelWidth: 130,
- width: 100,
- viewDisabled: true,
- addDisabled: true,
- editDisabled: true,
- addDisplay: false,
- editDisplay: false,
- viewDisplay: false,
- rules: [
- {
- required: true,
- message: '请输入固件升级',
- trigger: 'blur',
- },
- ],
- },
- {
- label: '所属单位',
- prop: 'dept_name',
- addDisplay: false,
- editDisplay: false,
- viewDisplay: false,
- labelWidth: 130,
- rules: [
- {
- required: true,
- message: '请输入所属单位',
- trigger: 'blur',
- },
- ],
- },
- {
- label: '所属单位',
- prop: 'dept_id',
- hide: true,
- type: 'tree',
- defaultExpandAll: true,
- labelWidth: 130,
- dicUrl: '/blade-system/dept/getTree',
- props: {
- label: 'name',
- value: 'id',
- },
- rules: [
- {
- required: true,
- message: '请输入所属单位',
- trigger: 'blur',
- },
- ],
- },
- {
- label: '加入组织时间',
- prop: 'bound_time',
- addDisplay: false,
- editDisplay: false,
- type: 'date',
- labelWidth: 130,
- width: 160,
- format: 'YYYY-MM-DD HH:mm:ss',
- // valueFormat: 'YYYY-MM-DD HH:mm:ss',
- rules: [
- {
- required: true,
- message: '请输入在线状态',
- trigger: 'blur',
- },
- ],
- },
- {
- label: '行政区划',
+ label: '设备位置',// '行政区划',
prop: 'area_name',
- hide: true,
+ // hide: true,
+ overHidden: true,
editDisplay: false, //编辑显示
- viewDisplay: true, //查看显示
+ viewDisplay: false, //查看显示
labelWidth: 130,
+ width: 100,
},
{
- label: '行政区划',
+ label: '设备位置',
prop: 'area_code',
type: 'cascader',
labelWidth: 130,
+ searchSpan: 4,
hide: true,
+ search: true,
+ // overHidden: true,
editDisplay: true,
- viewDisplay: false,
+ viewDisplay: true,
props: {
label: 'title',
value: 'value',
@@ -386,7 +407,7 @@
rules: [
{
required: true,
- message: '请选择行政区划',
+ message: '请选择设备位置',
trigger: 'change',
},
],
@@ -424,6 +445,170 @@
}
},
},
+ // {
+ // label: '设备位置',
+ // prop: 'address',
+ // labelWidth: 130,
+ // width: 100,
+ // overHidden: true,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入设备位置',
+ // trigger: 'blur',
+ // },
+ // ],
+ // },
+
+ {
+ label: '负载设备',
+ prop: 'payload_str',
+ labelWidth: 130,
+ width: 100,
+ overHidden: true,
+ editDisabled: true,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入负载设备',
+ // trigger: 'blur',
+ // },
+ // ],
+ },
+ // {
+ // label: '保险有效期',
+ // prop: 'insureExpiredTime',
+ // labelWidth: 130,
+ // width: 110,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入保险有效期',
+ // trigger: 'blur',
+ // },
+ // ],
+ // },
+ {
+ label: '流量剩余',
+ prop: 'traffic_remaining',
+ labelWidth: 130,
+ width: 100,
+ editDisabled: true,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入流量剩余',
+ // trigger: 'blur',
+ // },
+ // ],
+ },
+ {
+ label: '流量到期时间',
+ prop: 'traffic_expire_time',
+ labelWidth: 130,
+ width: 120,
+ type: 'date',
+ format: 'YYYY-MM-DD',
+ editDisabled: true,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入流量到期时间',
+ // trigger: 'blur',
+ // },
+ // ],
+ },
+ {
+ label: '固件版本',
+ prop: 'firmware_version',
+ labelWidth: 130,
+ width: 110,
+ editDisabled: true,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入固件版本',
+ // trigger: 'blur',
+ // },
+ // ],
+ },
+ {
+ label: '固件升级',
+ prop: 'firmware_status',
+ labelWidth: 130,
+ width: 100,
+ hide: true,
+ viewDisabled: true,
+ addDisabled: true,
+ editDisabled: true,
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: false,
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入固件升级',
+ // trigger: 'blur',
+ // },
+ // ],
+ },
+ {
+ label: '所属单位',
+ prop: 'dept_name',
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: false,
+ labelWidth: 130,
+ width: 180,
+ rules: [
+ {
+ required: true,
+ message: '请输入所属单位',
+ trigger: 'blur',
+ },
+ ],
+ },
+ {
+ label: '所属单位',
+ prop: 'dept_id',
+ hide: true,
+ type: 'tree',
+ defaultExpandAll: true,
+ search: true,
+ searchSpan: 4,
+ labelWidth: 130,
+ dicUrl: '/blade-system/dept/getTree',
+ props: {
+ label: 'name',
+ value: 'id',
+ },
+ rules: [
+ {
+ required: true,
+ message: '请输入所属单位',
+ trigger: 'blur',
+ },
+ ],
+ },
+ // {
+ // label: '加入组织时间',
+ // prop: 'bound_time',
+ // addDisplay: false,
+ // editDisplay: false,
+ // type: 'date',
+ // labelWidth: 130,
+ // width: 160,
+ // format: 'YYYY-MM-DD HH:mm:ss',
+ // // valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入在线状态',
+ // trigger: 'blur',
+ // },
+ // ],
+ // },
+
{
hide: true,
@@ -448,37 +633,65 @@
label: '在线时间',
prop: 'login_time',
type: 'date',
- addDisplay: false,
- editDisplay: false,
+ editDisplay: true, //编辑显示
+ editDisabled: true,
+ viewDisplay: true, //查看显示
+ addDisplay: true,
+ labelWidth: 130,
+ width: 160,
+ overHidden: true,
+ format: 'YYYY-MM-DD HH:mm:ss',
+ // valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ startPlaceholder: '任务开始时间',
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入在线时间',
+ // trigger: 'blur',
+ // },
+ // ],
+ },
+ {
+ label: '注册时间',
+ prop: 'create_time',
+ type: 'date',
+ editDisplay: true, //编辑显示
+ editDisabled: true,
+ viewDisplay: true, //查看显示
+ addDisplay: true,
+ overHidden: true,
labelWidth: 130,
width: 160,
format: 'YYYY-MM-DD HH:mm:ss',
// valueFormat: 'YYYY-MM-DD HH:mm:ss',
- startPlaceholder: '任务开始时间',
- rules: [
- {
- required: true,
- message: '请输入在线时间',
- trigger: 'blur',
- },
- ],
+ startPlaceholder: '创建时间',
+ // rules: [
+ // {
+ // required: true,
+ // message: '请输入创建时间',
+ // trigger: 'blur',
+ // },
+ // ],
},
{
- label: '在线状态',
+ label: '设备状态',
prop: 'cnstatus',
hide: true,
addDisplay: false,
editDisplay: false,
- viewDisplay: true,
+ viewDisplay: false,
labelWidth: 130,
},
{
- label: '在线状态',
+ label: '设备状态',
prop: 'status',
addDisplay: false,
editDisplay: false,
viewDisplay: false,
- labelWidth: 130,
+ labelWidth: 100,
+ hide: true,
+ // searchSpan: 4,
+ // search: true,
slot: true,
width: 100,
@@ -491,24 +704,34 @@
],
},
{
- label: '机场状态',
+ label: '设备状态',
prop: 'cnmode_code',
hide: true,
addDisplay: false,
editDisplay: false,
viewDisplay: true,
labelWidth: 130,
+ width: 110,
},
{
- label: '机场状态',
+ label: '设备状态',
prop: 'mode_code',
-
addDisplay: false,
editDisplay: false,
viewDisplay: false,
labelWidth: 130,
+ searchSpan: 4,
+ search: true,
+ type: 'select',
+ dicData: [
+ { label: '在线', value: 0 },
+ { label: '离线', value: -1 },
+ { label: '远程调试', value: 2 },
+ { label: '现场调试', value: 1 },
+ { label: '固件升级中', value: 3 }
+ ],
slot: true,
- width: 100,
+ width: 110,
rules: [
{
@@ -562,9 +785,25 @@
}
})
},
+ mounted() {
+
+ },
methods: {
getDockModeText (value) {
return EDockModeText[value] || ''
+ },
+ getModelText (value) {
+ let txt = '离线'
+ if (value === 0 || value === 4) {
+ txt = '在线'
+ } else if(value === 1) {
+ txt = '现场调试'
+ } else if(value === 2) {
+ txt = '远程调试'
+ } else if(value === 3) {
+ txt = '固件升级中'
+ }
+ return txt
},
// 关闭所有的webscoket
closeAllWebsoket () {
@@ -644,7 +883,7 @@
// 设备下线
handleDeviceOffline (row) {
- ElMessageBox.confirm('确定下线该设备吗?', '提示', {
+ ElMessageBox.confirm('确定注销该设备吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
@@ -652,12 +891,12 @@
.then(() => {
deviceOffline(row.device_sn)
.then(res => {
- ElMessage.success('下线成功')
+ ElMessage.success('注销成功')
this.init()
})
.catch(error => {
- ElMessage.error('下线失败')
+ ElMessage.error('注销失败')
})
})
.catch(() => { })
@@ -1067,6 +1306,7 @@
area_code: await this.getFullAreaCode(data.area_code),
area_name: this.form.area_name,
cnmode_code: this.getDockModeText(this.form.mode_code),
+ domain: data.domain === 0 ? '无人机' : data.domain === 3 ? '机巢' : '未知',
cnstatus: this.form.status === false ? '离线' : '在线',
duration_of_insurance: [data?.insure_start_time || '', data?.insure_expired_time || ''],
}
@@ -1123,6 +1363,55 @@
const data = res.data.data.records
resolve(data)
})
+ },
+ rowDel (row) {
+ this.$confirm('确定将选择数据删除?', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning',
+ })
+ .then(() => {
+ return remove(row.id)
+ })
+ .then(() => {
+ this.onLoad(this.page)
+ this.$message({
+ type: 'success',
+ message: '操作成功!',
+ })
+ })
+ },
+ // 设置无人机操作密码
+ setOperatePasswordConfirm () {
+ var that = this
+ this.$refs.passwordForm.validate(valid => {
+ if (valid) {
+ this.loadingForm = true
+ const data = {
+ id: this.passwordForm.id,
+ operate_password: this.passwordForm.password,
+ }
+ // 提交
+ operatePasswordUpdate(data).then(res => {
+ this.loadingForm = false
+ this.operatePasswordSetBox = false
+ that.passwordForm = {}
+ this.onLoad(this.page)
+ this.$message({
+ type: 'success',
+ message: '操作成功!',
+ })
+ })
+ } else {
+ console.log('error submit!!')
+ return false
+ }
+ })
+ },
+ // 操作密码设置
+ handleOperatePassword (row) {
+ this.operatePasswordSetBox = true
+ this.passwordForm.id = row.id
},
},
}
@@ -1189,4 +1478,24 @@
border-color: #409eff;
}
}
+:deep(.avue-crud__menu) {
+ display: flex;
+}
+.more-container {
+ position: relative;
+}
+.show-more-do {
+ position: absolute;
+ background-color: #ffffff;
+ // border: 1px solid #409eff;
+ z-index: 9999;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+ width: 140px;
+ font-size: 12px;
+ // height: 140px;
+ height: 190px;
+ right: 0;
+}
+
+
</style>
diff --git a/src/views/device/components/DeviceSettingBox.vue b/src/views/device/components/DeviceSettingBox.vue
index 2491c76..92a4b44 100644
--- a/src/views/device/components/DeviceSettingBox.vue
+++ b/src/views/device/components/DeviceSettingBox.vue
@@ -57,15 +57,15 @@
<span class="form-label"
>{{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].label }}:</span
>
- <a-switch
- checked-children="开"
- un-checked-children="关"
- v-model:checked="deviceSettingFormModel.nightLightsState"
+ <el-switch
+ active-text="开"
+ inactive-text="关"
+ v-model="deviceSettingFormModel.nightLightsState"
/>
</div>
</template>
<a
- @click="
+ @click.stop="
onShowPopConfirm(
deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey
)
@@ -95,14 +95,15 @@
<template #formContent>
<div class="form-content">
<span class="form-label"
- >{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}:</span
+ >{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}:(m)</span
>
- <a-input-number
- v-model:value="deviceSettingFormModel.heightLimit"
+ <el-input-number
+ size="small"
+ v-model="deviceSettingFormModel.heightLimit"
:min="20"
:max="1500"
/>
- m
+
</div>
</template>
<a
@@ -136,14 +137,15 @@
<span class="form-label"
>{{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].label }}:</span
>
- <a-switch
+ <el-switch
style="margin-right: 10px"
- checked-children="开"
- un-checked-children="关"
- v-model:checked="deviceSettingFormModel.distanceLimitStatus.state"
+ active-text="开"
+ inactive-text="关"
+ v-model="deviceSettingFormModel.distanceLimitStatus.state"
/>
- <a-input-number
- v-model:value="deviceSettingFormModel.distanceLimitStatus.distanceLimit"
+ <el-input-number
+ size="small"
+ v-model="deviceSettingFormModel.distanceLimitStatus.distanceLimit"
:min="15"
:max="8000"
/>
@@ -189,10 +191,10 @@
<span class="form-label"
>{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].label }}:</span
>
- <a-switch
- checked-children="开"
- un-checked-children="关"
- v-model:checked="deviceSettingFormModel.obstacleAvoidanceHorizon"
+ <el-switch
+ active-text="开"
+ inactive-text="关"
+ v-model="deviceSettingFormModel.obstacleAvoidanceHorizon"
/>
</div>
</template>
@@ -237,10 +239,10 @@
<span class="form-label"
>{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].label }}:</span
>
- <a-switch
- checked-children="开"
- un-checked-children="关"
- v-model:checked="deviceSettingFormModel.obstacleAvoidanceUpside"
+ <el-switch
+ active-text="开"
+ inactive-text="关"
+ v-model="deviceSettingFormModel.obstacleAvoidanceUpside"
/>
</div>
</template>
@@ -287,10 +289,10 @@
deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].label
}}:</span
>
- <a-switch
- checked-children="开"
- un-checked-children="关"
- v-model:checked="deviceSettingFormModel.obstacleAvoidanceDownside"
+ <el-switch
+ active-text="开"
+ inactive-text="关"
+ v-model="deviceSettingFormModel.obstacleAvoidanceDownside"
/>
</div>
</template>
@@ -311,15 +313,18 @@
<script setup>
import { defineProps, ref, watch } from 'vue';
+import { ELocalStorageKey } from '@/types'
import { cloneDeep } from 'lodash';
-import { initDeviceSetting, initDeviceSettingFormModel } from '@/types/device-setting';
+import { initDeviceSetting, initDeviceSettingFormModel, DeviceSettingKeyEnum } from '@/types/device-setting';
import {
updateDeviceSettingInfoByOsd,
updateDeviceSettingFormModelByOsd,
} from '@/utils/device-setting';
import { useDeviceSetting } from './use-device-setting';
+import DeviceSettingPopover from './DeviceSettingPopover.vue'
-const props = defineProps();
+// const props = defineProps();
+const props = defineProps(['sn', 'deviceInfo'])
const deviceSetting = ref(cloneDeep(initDeviceSetting));
const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
@@ -351,6 +356,7 @@
async function onConfirm(settingKey) {
deviceSetting.value[settingKey].popConfirm.loading = true;
const body = genDevicePropsBySettingKey(settingKey, deviceSettingFormModel.value);
+ localStorage.setItem(ELocalStorageKey.WorkspaceId, props.deviceInfo.workspace_id)
await setDeviceProps(props.sn, body);
deviceSetting.value[settingKey].popConfirm.loading = false;
deviceSetting.value[settingKey].popConfirm.visible = false;
@@ -362,7 +368,7 @@
<style lang="scss" scoped>
.device-setting-wrapper {
- border-bottom: 1px solid #515151;
+ //border-bottom: 1px solid #515151;
.device-setting-header {
font-size: 14px;
@@ -408,6 +414,12 @@
font-weight: 700;
}
}
+ .control-setting-item-right {
+ .el-tooltip__trigger {
+ color: #1C5CFF;
+ cursor: pointer;
+ }
+ }
}
}
}
diff --git a/src/views/device/components/DeviceSettingPopover.vue b/src/views/device/components/DeviceSettingPopover.vue
index 224a689..fb90a89 100644
--- a/src/views/device/components/DeviceSettingPopover.vue
+++ b/src/views/device/components/DeviceSettingPopover.vue
@@ -1,41 +1,38 @@
<template>
- <a-popover
+ <el-popover
:visible="state.sVisible"
trigger="click"
- v-bind="$attrs"
:overlay-class-name="overlayClassName"
placement="bottom"
- @visibleChange=""
- v-on="$attrs"
+ width="200"
>
- <template #content>
+ <template #default>
<div class="title-content"></div>
<slot name="formContent" />
<div class="uranus-popconfirm-btns">
- <a-button size="sm" @click="onCancel">
+ <el-button @click="onCancel">
{{ cancelText || '取消' }}
- </a-button>
- <a-button
- size="sm"
+ </el-button>
+ <el-button
:loading="loading"
type="primary"
class="confirm-btn"
@click="onConfirm"
>
{{ okText || '确定' }}
- </a-button>
+ </el-button>
</div>
</template>
- <template v-if="$slots.default">
+ <template #reference>
<slot></slot>
</template>
- </a-popover>
+ </el-popover>
</template>
<script setup>
import { defineProps, defineEmits, reactive, watch, computed } from 'vue';
-const props = defineProps();
+const props = defineProps(['visible', 'loading', 'disabled', 'title', 'cancelText', 'okText', 'width']);
const emit = defineEmits(['cancel', 'confirm']);
diff --git a/src/views/device/components/DockControlPanel.vue b/src/views/device/components/DockControlPanel.vue
index af1a16e..cf2eb78 100644
--- a/src/views/device/components/DockControlPanel.vue
+++ b/src/views/device/components/DockControlPanel.vue
@@ -3,7 +3,7 @@
<!-- title -->
<!-- setting -->
- <!-- <DeviceSettingBox :sn="props.sn" :deviceInfo="props.deviceInfo"></DeviceSettingBox> -->
+ <DeviceSettingBox :sn="props.sn" :deviceInfo="props.deviceInfo"></DeviceSettingBox>
<!-- cmd -->
<div class="control-cmd-wrapper">
<div class="control-cmd-header">
@@ -84,7 +84,7 @@
import { EDockModeCode } from '@/types/device'
import { updateDeviceCmdInfoByOsd, updateDeviceCmdInfoByExecuteInfo } from '@/utils/device-cmd'
import { setThermalCurrentPaletteStyle, setPhotoStorageSet, setVideoStorageSet, getLiveStatus, setStreamsSwitch, photoAndVideoCmd } from '@/api/device-setting'
-
+import DeviceSettingBox from './DeviceSettingBox.vue'
import Store from '@/store'
import { useConnectWebSocket } from '@/utils/websocket/connect-websocket';
import { getWebsocketUrl } from '@/utils/websocket/config';
diff --git a/src/views/device/components/use-device-setting.js b/src/views/device/components/use-device-setting.js
index ede8603..c1d803f 100644
--- a/src/views/device/components/use-device-setting.js
+++ b/src/views/device/components/use-device-setting.js
@@ -7,6 +7,7 @@
NightLightsStateEnum,
DistanceLimitStatusEnum,
} from '@/types/device-setting';
+import { messages } from '@/lang';
export function useDeviceSetting() {
// 生成参数
@@ -52,15 +53,19 @@
async function setDeviceProps(sn, body) {
try {
const { code, message: msg } = await putDeviceProps(sn, body);
+ console.log(code,messages)
if (code === 0) {
- return true;
+ ElMessage({
+ message: '设备属性设置成功!',
+ type: 'success',
+ });
}
throw msg;
} catch (e) {
- ElMessage({
- message: '设备属性设置失败',
- type: 'error',
- });
+ // ElMessage({
+ // message: '设备属性设置失败',
+ // type: 'error',
+ // });
return false;
}
}
diff --git a/src/views/device/index.vue b/src/views/device/index.vue
index d9ef307..b502309 100644
--- a/src/views/device/index.vue
+++ b/src/views/device/index.vue
@@ -10,14 +10,15 @@
-->
<template>
<basic-container>
- <el-tabs v-model="activeName" @tab-click="handleClick">
+ <airport ref="airport" />
+ <!-- <el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="机场" name="1">
<airport ref="airport" />
</el-tab-pane>
<el-tab-pane label="飞行器" name="2">
<fly ref="fly" />
</el-tab-pane>
- </el-tabs>
+ </el-tabs> -->
</basic-container>
</template>
diff --git a/src/views/job/components/SearchBox.vue b/src/views/job/components/SearchBox.vue
index b8b1fbe..2752438 100644
--- a/src/views/job/components/SearchBox.vue
+++ b/src/views/job/components/SearchBox.vue
@@ -61,13 +61,9 @@
<div class="more" v-if="isExpand" @click="toggleExpand">收起</div>
<div class="more" v-else @click="toggleExpand">更多</div>
<div class="search-btn" :style="{ bottom: isExpand ? '5px' : '-3px' }">
- <div class="btn clear" @click="handleReset">
- <img src="@/assets/images/task/clear.png" />重置
- </div>
- <div class="btn search" @click="handleSearch">
- <img src="@/assets/images/task/search.png" />搜索
- </div>
- <!-- <div class="btn add" @click="addTask"><img src="@/assets/images/task/add.png"/>新增</div> -->
+
+ <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
+ <el-button icon="el-icon-refresh" @click="handleReset">清空</el-button>
</div>
<el-form-item label="任务算法:" v-if="isExpand" class="taskAlgorithm">
<!-- <TaskAlgorithmBusiness
@@ -77,17 +73,25 @@
@algorithmChange="algorithmChange"
/> -->
<el-tree-select
- popper-class="custom-tree-select"
- :style="{ width: pxToRem(186) }"
- v-model="dictKey"
- :data="dataList"
- :default-expanded-keys="[dictKey]"
- check-strictly
- node-key="id"
- :props="treePropsSF"
- @node-click="handleSFNodeClick"
- clearable
- @clear="handleClear"
+ style="z-index: 1000"
+ :teleported="false"
+ class="custom-tree-select"
+ :style="{ width: pxToRem(186) }"
+ v-model="dictKey"
+ :data="dataList"
+ :default-expanded-keys="[dictKey]"
+ :props="treePropsSF"
+ :render-after-expand="false"
+ :default-checked-keys="checkedKeys"
+ node-key="id"
+ multiple
+ show-checkbox
+ collapse-tags
+ collapse-tags-tooltip
+ clearable
+ @node-click="handleNodeClick"
+ @check="handleCheck"
+ @clear="handleClear"
/>
</el-form-item>
<!-- <el-form-item label="所属部门:" v-if="isExpand">
@@ -107,6 +111,7 @@
</el-form-item> -->
<el-form-item label="任务状态:" v-if="isExpand">
<el-select
+ style="z-index: 1000"
:teleported="false"
v-model="searchForm.status"
placeholder="请选择"
@@ -394,6 +399,16 @@
// { immediate: true, deep: true }
// );
+const checkedKeys = ref([])
+
+const handleCheck = (data, { checkedKeys, checkedNodes }) => {
+ dictKey.value = checkedKeys
+ // 获取所有选中节点的 dictKey
+ const selectedDictKeys = checkedNodes.map(node => node.dictKey).filter(Boolean)
+ searchForm.ai_types = selectedDictKeys
+ handleSearch()
+}
+
onBeforeUnmount(() => {
checked.value = 'today';
searchForm.date_enum = 'TODAY';
diff --git a/src/views/tickets/orderLog.vue b/src/views/tickets/orderLog.vue
index d2b8c70..3c030c9 100644
--- a/src/views/tickets/orderLog.vue
+++ b/src/views/tickets/orderLog.vue
@@ -159,7 +159,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="关联航线" prop="file_id">
- <el-select v-model="form.file_id" placeholder="请选择航线" @change="getFlyingNestBy">
+ <el-select v-model="form.file_id" placeholder="请选择航线" filterable @change="getFlyingNestBy">
<el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
:value="item.wayline_id" />
</el-select>
@@ -169,7 +169,7 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="关联机巢" prop="device_sns">
- <el-select v-model="form.device_sns" placeholder="请选择机巢" multiple>
+ <el-select v-model="form.device_sns" placeholder="请选择机巢" multiple :disabled="!device_sns.length">
<el-option v-for="item in device_sns" :key="item.device_sn" :label="item.nickname"
:value="item.device_sn" />
</el-select>
@@ -271,7 +271,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="关联航线" prop="file_id">
- <el-select v-model="form.file_id" placeholder="请选择航线" @change="getFlyingNestBy" :disabled="detailTitle === '工单详情'">
+ <el-select v-model="form.file_id" placeholder="请选择航线" @change="getFlyingNestBy" filterable :disabled="detailTitle === '工单详情'">
<el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
:value="item.wayline_id" />
</el-select>
@@ -663,7 +663,6 @@
],
file_id: [{ required: true, message: '需要选择航线', trigger: 'change' }],
device_sns: [{ required: true, message: '请选择机巢', trigger: 'change' }],
- ai_types: [{ required: true, message: '请选择算法', trigger: 'change' }],
content: [
{ required: true, message: '请输入工单内容', trigger: 'blur' },
{ max: 255, message: '工单内容不能超过255个字', trigger: 'blur' },
@@ -888,8 +887,8 @@
const submitData = {
...this.form,
-
status: status,
+ ai_types: this.form.ai_types?.length ? this.form.ai_types : [],
}
// 判断该值this.form.date_range[0] 周几 和rep_fre_type 是不是相等
// if (this.form.deal_time) {
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index f05cb69..486563c 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -83,7 +83,7 @@
:value="item.dict_key"
/>
</el-select> -->
- <el-tree-select
+ <!-- <el-tree-select
popper-class="custom-tree-select"
:style="{ width: pxToRem(186) }"
placeholder="请选择关联算法"
@@ -96,7 +96,28 @@
@node-click="handleSFNodeClick"
clearable
@clear="handleClear"
- />
+ /> -->
+ <el-tree-select
+ style="z-index: 1000"
+ :teleported="false"
+ class="custom-tree-select"
+ :style="{ width: pxToRem(186) }"
+ v-model="dictKey"
+ :data="dataList"
+ :default-expanded-keys="[dictKey]"
+ :props="treePropsSF"
+ :render-after-expand="false"
+ :default-checked-keys="checkedKeys"
+ node-key="id"
+ multiple
+ show-checkbox
+ collapse-tags
+ collapse-tags-tooltip
+ clearable
+ @check="handleCheck"
+ @node-click="handleSFNodeClick"
+ @clear="handleClear"
+ />
<el-select
v-model="filters.isReview"
placeholder="请选择复核状态"
@@ -1133,6 +1154,7 @@
},
dictKey: '',
dataList: [],
+ checkedKeys: [],
};
},
created() {
@@ -1416,6 +1438,13 @@
},
methods: {
+ handleCheck(data, { checkedKeys, checkedNodes }) {
+ this.checkedKeys = checkedKeys
+ // 获取所有选中节点的 dictKey
+ const selectedDictKeys = checkedNodes.map(node => node.dictKey).filter(Boolean)
+ this.filters.type = selectedDictKeys
+ this.fetchTableData();
+ },
// 算法
getAlgorithmList() {
getSFDictionaryTree({code:'SF'}).then((res) => {
@@ -1439,16 +1468,12 @@
},
handleSFNodeClick(data) {
+ console.log(data.dictKey, '666666666')
this.filters.type = ''
this.filters.algorithm = ''
- if (data.children && data.children.length) {
- // 获取子节点dictKey
- this.filters.type = data.dictKey
- } else {
- this.filters.algorithm = data.dictKey
- }
- // 更新列表请求
- this.fetchTableData();
+ this.filters.type = data.dictKey
+ // 更新列表请求
+ this.fetchTableData();
},
handleClear() {
this.dictKey = ''
@@ -1677,7 +1702,7 @@
try {
const currentTab = this.tabs.find(tab => tab.name === this.activeTab);
const params = {
- word_order_type: this.filters.type || undefined,
+ word_order_types: this.filters.type || undefined,
status:
currentTab?.name === 'myTickets'
? undefined
@@ -3106,7 +3131,7 @@
}
.date-picker {
- width: 240px; // 日期选择器宽度适当调整
+ // width: 240px; // 日期选择器宽度适当调整
}
.el-button {
diff --git a/yarn.lock b/yarn.lock
index 1cd0ee0..31910d4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2038,20 +2038,20 @@
dependencies:
ms "2.0.0"
-"decimal.js@^10.4.3":
- "integrity" "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
- "resolved" "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz"
- "version" "10.4.3"
+decimal.js@^10.4.3:
+ version "10.4.3"
+ resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
-"decimal@^0.0.2":
- "integrity" "sha512-puX1+D5GlpXYH0kDejnu8F2jsGLKRePc7eOznNjqMbA2otl7AzvubrvvZVmOvRCHhsqeAPKNcAxHHbevsH/1qg=="
- "resolved" "https://registry.npmmirror.com/decimal/-/decimal-0.0.2.tgz"
- "version" "0.0.2"
+decimal@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.npmmirror.com/decimal/-/decimal-0.0.2.tgz"
+ integrity sha512-puX1+D5GlpXYH0kDejnu8F2jsGLKRePc7eOznNjqMbA2otl7AzvubrvvZVmOvRCHhsqeAPKNcAxHHbevsH/1qg==
-"deep-equal@^1.0.0", "deep-equal@1.x":
- "integrity" "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg=="
- "resolved" "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz"
- "version" "1.1.2"
+deep-equal@^1.0.0, deep-equal@1.x:
+ version "1.1.2"
+ resolved "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz"
+ integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==
dependencies:
is-arguments "^1.1.1"
is-date-object "^1.0.5"
--
Gitblit v1.9.3