applications/drone-command/src/views/dataCockpit/components/templateComponents/RealTemplate.vue
@@ -2,13 +2,8 @@ <div class="drone-card"> <div class="header"> <div class="title"> <el-tooltip class="title-tooltip" :content="data.droneName || '-'" placement="top" effect="dark" :show-after="200" > <el-tooltip class="title-tooltip" :content="data.droneName || '-'" placement="top" effect="dark" :show-after="200"> <span class="name">{{ data.droneName }}</span> </el-tooltip> <span class="status"> @@ -65,13 +60,16 @@ </div> <div class="footer"> <el-button class="general" color="#2B2B4C" @click="emit('signal')">信号干扰</el-button> <el-button color="#284FE3" type="primary" @click="emit('counter')">诱导驱离</el-button> <el-button class="general" color="#2B2B4C" @click="handleSignal">信号干扰</el-button> <el-button color="#284FE3" type="primary" @click="handleCounter">诱导驱离</el-button> </div> </div> </template> <script setup> import { saveOperationLog } from '@ztzf/apis' import { useRoute } from 'vue-router' const props = defineProps({ data: { type: Object, @@ -80,7 +78,27 @@ } }) const route = useRoute() const emit = defineEmits(['signal', 'counter', 'favorite']) // 信号干扰操作 const handleSignal = () => { saveOperationLog({ requestUri: route.path, title: `${route.name || '数据驾驶舱'}-信号干扰`, type: 1 }) emit('signal') } const handleCounter = () => { saveOperationLog({ requestUri: route.path, title: `${route.name || '数据驾驶舱'}-诱导驱离`, type: 1 }) emit('counter') } const getStatusText = (item) => { const status = item?.flightStatus @@ -278,4 +296,4 @@ } } } </style> </style> applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
@@ -160,6 +160,8 @@ } from '@/api/detectionCountermeasure/detectionRange' import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue' import * as Cesium from 'cesium' import { saveOperationLog } from '@ztzf/apis' import { useRoute } from 'vue-router' import equipment from '@/assets/images/dataCockpit/legend/equipment.png' @@ -183,6 +185,7 @@ const deviceOptions = ref([]) const dialogReadonly = computed(() => dialogMode.value === 'view') const mapRef = ref(null) const route = useRoute() let viewer let redPointEntity let rangeCircleEntity @@ -249,6 +252,14 @@ } delete payload.deviceId await detectionRangeSubmitApi(payload) const actionText = dialogMode.value === 'add' ? '新增' : '修改' saveOperationLog({ requestUri: route.path, title: `${route.name || '侦测范围管理'}-${actionText}`, type: 1 }) ElMessage.success(dialogMode.value === 'add' ? '新增成功' : '更新成功') visible.value = false emit('success') applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
@@ -98,6 +98,8 @@ import { getDictLabel } from '@ztzf/utils' import { detectionRangePageApi, detectionRangeSubmitApi } from '@/api/detectionCountermeasure/detectionRange' import DetectionRangeDialog from './DetectionRangeDialog.vue' import { saveOperationLog } from '@ztzf/apis' import { useRoute } from 'vue-router' const initSearchParams = () => ({ deviceName: '', // 设备名称 @@ -116,6 +118,7 @@ deviceType: [], // 设备类型 }) const visible = ref(false) const route = useRoute() provide('dictObj', dictObj) // 获取列表 @@ -176,6 +179,13 @@ cancelButtonClass: 'command-message-box-cancel', }) await detectionRangeSubmitApi({ id: row.id, effectiveRangeKm: 0 }) saveOperationLog({ requestUri: route.path, title: `${route.name || '侦测范围管理'}-删除`, type: 1 }) ElMessage.success('删除成功') getList() } applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/FormDiaLog.vue
@@ -172,6 +172,8 @@ import { ElMessage } from 'element-plus' import { fwDeviceConfigDetailApi, fwDeviceConfigSubmitApi } from './deviceAppConfigApi' import { fieldRules } from '@ztzf/utils' import { saveOperationLog } from '@ztzf/apis' import { useRoute } from 'vue-router' const configKeys = [ 'startSector', @@ -206,6 +208,7 @@ const submitting = ref(false) // 提交中 const readonly = computed(() => dialogMode.value === 'view') const titleEnum = ref({ edit: '配置接口', view: '查看' }) const route = useRoute() const searchModeOptions = [ { label: '0', value: '0' }, @@ -260,6 +263,13 @@ delete payload[key] }) await fwDeviceConfigSubmitApi(payload) saveOperationLog({ requestUri: route.path, title: `${route.name || '设备应用配置'}-配置接口保存`, type: 1 }) ElMessage.success('更新成功') visible.value = false emit('success') applications/drone-command/src/views/permissionManage/operationLog/index.vue
@@ -102,8 +102,8 @@ const dateRange = ref([]) const queryParamsRef = ref(null) const typeOptions = [ { label: '菜单', value: '1' }, { label: '按钮', value: '2' }, { label: '菜单', value: '0' }, { label: '按钮', value: '1' }, ] async function getList() { applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -11,7 +11,7 @@ <div class="gd-dialog-form"> <!-- 关联工单选择 --> <div class="work-order-section"> <div class="detail-title" :style="{marginBottom: 0,marginRight: pxToRem(10)}">选择工单</div> <div class="detail-title" :style="{ marginBottom: 0, marginRight: pxToRem(10) }">选择工单</div> <el-select class="gd-select" style="width: 150px" @@ -29,7 +29,7 @@ <!-- 工单信息展示 --> <div class="work-order-info" v-if="selectedWorkOrder"> <el-row class="detail-row-view" > <el-row class="detail-row-view"> <el-col :span="12"> <div class="info-item"> <span class="label">工单类型</span> @@ -59,7 +59,7 @@ <!-- 子任务表格表单 --> <div class="task-table-section" v-if="selectedWorkOrderId"> <div class="detail-title" :style="{marginTop: pxToRem(10)}">添加子任务</div> <div class="detail-title" :style="{ marginTop: pxToRem(10) }">添加子任务</div> <div class="task-table-container"> <el-table :data="taskList"> <el-table-column width="50" label=""> @@ -76,13 +76,14 @@ </template> </el-table-column> <el-table-column prop="patrolTaskType" label="巡查任务类型" min-width="140"> <template v-slot="{ row }"> <template v-slot="{ row, $index }"> <el-select class="gd-select" popper-class="gd-select-popper" v-model="row.patrolTaskType" placeholder="请选择" :disabled="dialogReadonly" @change="handlePatrolTaskTypeChange($index, $event)" > <el-option v-for="item in dictObj.patrolTaskType" @@ -120,16 +121,21 @@ </template> </el-table-column> <el-table-column prop="recommendFlyerName" label="推荐飞手" min-width="120"> <template v-slot="{ row }"> <template v-slot="{ row, $index }"> <el-select class="gd-select" popper-class="gd-select-popper" v-model="row.recommendFlyerName" placeholder="请选择" filterable :disabled="dialogReadonly" :disabled="dialogReadonly || !taskList[$index].patrolTaskType" > <el-option v-for="item in flyerList" :key="item.id" :label="item.flyerName" :value="item.flyerName" /> <el-option v-for="item in flyerListMap[$index] || []" :key="item.id" :label="item.flyerName" :value="item.flyerName" /> </el-select> </template> </el-table-column> @@ -222,7 +228,7 @@ const selectedWorkOrder = ref(null) // 选中的工单信息 // 下拉选项 const flyerList = ref([]) // 飞手列表 const flyerListMap = ref({}) // 飞手列表,按行索引存储 const deviceList = ref([]) // 设备列表 const routeOptions = ref([ { name: '航线1', id: '1' }, @@ -251,36 +257,57 @@ function removeTaskRow(index) { if (taskList.value.length > 1) { taskList.value.splice(index, 1) // 重新整理 flyerListMap 的索引 const newFlyerListMap = {} Object.keys(flyerListMap.value).forEach(key => { const keyIndex = parseInt(key) if (keyIndex < index) { newFlyerListMap[keyIndex] = flyerListMap.value[keyIndex] } else if (keyIndex > index) { newFlyerListMap[keyIndex - 1] = flyerListMap.value[keyIndex] } }) flyerListMap.value = newFlyerListMap } } // 获取工单列表 async function getWorkOrderList() { const res = await gdWorkOrderPageApi({ size: 999,workOrderStatus: '20' }) const res = await gdWorkOrderPageApi({ size: 999, workOrderStatus: '20' }) workOrderList.value = res?.data?.data?.records ?? [] } // 处理巡查任务类型变化 async function handlePatrolTaskTypeChange(index, skilledTaskType) { // 清空该行已选择的飞手 taskList.value[index].recommendFlyerName = '' // 获取对应的飞手列表 await getFlyerList(index, skilledTaskType) } // 获取飞手列表 async function getFlyerList() { async function getFlyerList(index, skilledTaskType) { const res = await gdFlyerPageApi({ size: 999, // todo 需要传入前面的巡查类型 // patrolTaskType: '1', skilledTaskType, }) flyerList.value = res?.data?.data?.records ?? [] flyerListMap.value[index] = res?.data?.data?.records ?? [] } // 获取设备列表 async function getDeviceList() { const res = await gdManageDeviceListApi({ deviceIds: selectedWorkOrder.value.recommendDeviceIds deviceIds: selectedWorkOrder.value.recommendDeviceIds, }) deviceList.value = res?.data?.data ?? [] } watch(()=>selectedWorkOrderId.value,()=>{ getDeviceList() }) watch( () => selectedWorkOrderId.value, () => { getDeviceList() } ) // 提交新增 async function handleSubmit() { @@ -330,7 +357,7 @@ })) await gdPatrolTaskSaveApi(dataList) dialogMode.value === 'add' ? ElMessage.success('新增成功') : ElMessage.success('修改成功') dialogMode.value === 'edit' && await gdPatrolTaskAuditApi({ auditStatus: 7, id: preID }) dialogMode.value === 'edit' && (await gdPatrolTaskAuditApi({ auditStatus: 7, id: preID })) visible.value = false emit('success') } finally { @@ -340,33 +367,38 @@ // 打开弹框 async function open({ mode = 'add', row } = {}) { console.log(row,'rowrow') console.log(row, 'rowrow') dialogMode.value = mode if (mode === 'add') { selectedWorkOrderId.value = null selectedWorkOrder.value = null taskList.value = [initTaskRow()] flyerListMap.value = {} } else { // 编辑/查看模式 - 加载已有数据 selectedWorkOrderId.value = row?.workOrderId handleWorkOrderChange(row?.workOrderId) taskList.value = [{ ...row }] flyerListMap.value = {} // 如果有巡查类型,加载对应的飞手列表 if (row?.patrolTaskType) { getFlyerList(0, row.patrolTaskType) } } } onMounted(() => { getWorkOrderList() getFlyerList() }) defineExpose({ open }) </script> <style scoped lang="scss"> .detail-row-view{ .detail-row-view { margin-top: 10px; } .work-order-section{ .work-order-section { display: flex; align-items: center; } applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
@@ -170,17 +170,16 @@ </div> <template #footer> <template v-if="requester"> <el-button v-if="!dialogReadonly || ['1','4'].includes(taskStatus)" v-if="!dialogReadonly || ['1', '4'].includes(taskStatus)" :loading="submitting" :disabled="submitting" @click="handleSubmit" > 提交 </el-button> <el-button v-if="['1','4'].includes(taskStatus)" @click="viewDescription"> <el-button v-if="['1', '4'].includes(taskStatus)" @click="viewDescription"> {{ gdStatusObj[taskStatus].reason }} </el-button> <el-button @click="statusChange(3)" v-if="taskStatus === '3'">撤回任务</el-button> @@ -192,9 +191,9 @@ {{ gdStatusObj[taskStatus].reason }} </el-button> <el-button v-if="taskStatus === '0'" @click="addDescription">拒绝签收</el-button> <el-button v-if="taskStatus === '0'" @click="statusChange(1)" >签收</el-button> <el-button v-if="taskStatus === '3'" @click="addDescription" >驳回</el-button> <el-button v-if="taskStatus === '3'" @click="statusChange(4)" >同意</el-button> <el-button v-if="taskStatus === '0'" @click="statusChange(1)">签收</el-button> <el-button v-if="taskStatus === '3'" @click="addDescription">驳回</el-button> <el-button v-if="taskStatus === '3'" @click="statusChange(4)">同意</el-button> </template> </template> @@ -258,19 +257,17 @@ { name: '航线3', id: '3' }, ]) const gdStatusObj = { '0': { reason: '拒绝原因',operationType: '2' }, '0': { reason: '拒绝原因', operationType: '2' }, '1': { reason: '拒绝原因' }, '2': { reason: '' }, '3': { reason: '驳回原因',operationType: '5' }, '3': { reason: '驳回原因', operationType: '5' }, '4': { reason: '驳回原因' }, '5': { reason: '' }, '6': { reason: '拒绝原因' }, '7': { reason: '拒绝原因' }, '8': { reason: '' }, } let viewer @@ -288,7 +285,6 @@ visible.value = false emit('success') } // 填写说明 function addDescription() { applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -10,9 +10,22 @@ > <div class="content" style="display: flex"> <div class="processBox" v-if="dialogMode !== 'add' && processList.length"> <el-steps direction="vertical" :active="processList.length"> <el-step v-for="item in processList" :title="item.flowName" :description="item.flowDesc" /> </el-steps> <el-timeline> <el-timeline-item v-for="(activity, index) in processList" :key="index" :icon="Check" :type="index === processList.length - 1 ? 'success' : 'info'" :color="activity.color" :hollow="activity.hollow" :timestamp="activity.flowDesc.split(' ')[1]" > <div class="item-content"> <div>{{ activity.flowDesc.split(' ')[0] }}</div> <div class="flowName">{{ activity.flowName }}</div> </div> </el-timeline-item> </el-timeline> </div> <div class="leftBox"> <div v-if="dialogReadonly"> @@ -239,7 +252,7 @@ import RefuseOrderDialog from '@/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue' import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue' import { gdPatrolTaskPageApi } from '@/views/orderView/orderManage/inspectionRequest/inspectionRequestApi' import { Check } from '@element-plus/icons-vue' // 初始化表单数据 const initForm = () => ({ workOrderName: '', @@ -596,6 +609,18 @@ .processBox { width: 312px; .el-timeline{ padding-left: 100px; } .item-content{ position: relative; .flowName{ position: absolute; left: -100px; top: 0; } } } } uniapps/work-wx/src/api/index.js
@@ -167,6 +167,14 @@ }) } // 审批状态 export const flyActivityStatusApi = () => { return request({ url: `/system/dict/data/type/fly_activity_status`, method: 'get' }) } // 无人机厂商 export const manufacturerInfoApi = data => { return request({ @@ -176,3 +184,4 @@ }) } uniapps/work-wx/src/pages/page/index.vue
@@ -11,6 +11,9 @@ indicatorInactiveColor="#fff" indicatorPosition="center" ></u-swiper> <view class="lb-bottom"> <image :src="lbBottomPng" /> </view> <u-grid :col="4" :border="false" class="grid" @click="gridClick"> <u-grid-item v-for="(baseListItem,baseListIndex) in baseList" :key="baseListIndex"> <u-image :src="baseListItem.src" :width="26" :height="26"></u-image> @@ -75,12 +78,13 @@ <script setup> import { onMounted, reactive, ref } from 'vue' import lbPng from '@/static/images/lb.png' import lbPng from '@/static/images/lbt.png' import kyxxPng from '@/static/images/kyxx.png' import fxsqPng from '@/static/images/fxsq.png' import flfgPng from '@/static/images/flfg.png' import zczdPng from '@/static/images/zczd.png' import docSvg from '@/static/images/doc.png' import lbBottomPng from '@/static/images/lb_bottom.png' import { sysNoticePageInfoApi, droneFlightTaskApi } from '@/api/index' const lbList = reactive([]); // lbPng 轮播图 5次 @@ -230,8 +234,17 @@ height: 100%; display: flex; flex-direction: column; :deep(.u-swiper) { border-radius: 0 0 100px 100px; position: relative; .lb-bottom { position: absolute; top: 370rpx; left: 0; width: 100%; image { width: 100%; height: 32rpx; } } :deep(.u-grid) { margin-top: 40rpx; @@ -268,9 +281,9 @@ .title { padding: 40rpx 40rpx 0rpx 0rpx; font-family: Source Han Sans CN, Source Han Sans CN; font-weight: 500; font-size: 16px; color: #222324; font-weight: bolder; font-size: 32rpx; color: #1D2129; } } .card { uniapps/work-wx/src/subPackages/flightApplication/add.vue
@@ -787,12 +787,15 @@ border-radius: 8rpx 8rpx 8rpx 8rpx; // margin-bottom: 20rpx; } .label-tip { font-family: Source Han Sans CN, Source Han Sans CN; font-weight: 400; font-size: 10px; color: #3A3A3A; .custom-label { .label-tip { font-family: Source Han Sans CN, Source Han Sans CN; font-weight: 400; font-size: 18rpx; color: #3A3A3A; } } .attention { font-family: Source Han Sans CN, Source Han Sans CN; font-weight: 400;