吉安感知网项目-前端
张含笑
2026-01-30 c67c65b01d5a275cd86b70596f2fa11cb10fe15d
Merge remote-tracking branch 'origin/master'
7 files modified
167 ■■■■ changed files
applications/drone-command/src/views/areaManage/sceneConfig/FormDiaLog.vue 6 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/areaManage/sceneConfig/index.vue 8 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue 7 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue 131 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue 10 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue 3 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue 2 ●●● patch | view | raw | blame | history
applications/drone-command/src/views/areaManage/sceneConfig/FormDiaLog.vue
@@ -23,7 +23,7 @@
                    <div class="detail-title">场景详情</div>
                    <el-row>
                        <el-col :span="24">
                            <div class="label">场景配置名称</div>
                            <div class="label">配置名称</div>
                            <div class="val">{{ formData.sceneName }}</div>
                        </el-col>
                        <el-col :span="24">
@@ -60,7 +60,7 @@
                    :disabled="readonly"
                    label-width="96px"
                >
                    <el-form-item label="场景配置名称" prop="sceneName">
                    <el-form-item label="配置名称" prop="sceneName">
                        <el-input
                            class="command-input"
                            v-model="formData.sceneName"
@@ -165,7 +165,7 @@
import { AREA_TYPE_STYLE_MAP, BUFFER_LEVEL_STYLES, DEFAULT_AREA_STYLE } from '@ztzf/constants'
const initForm = () => ({
    sceneName: '', // 场景配置名称
    sceneName: '', // 配置名称
    sceneType: '', // 场景类型
    deviceMode: '', // 设备模式
    areaDivideIds: '', // 关联区域ID
applications/drone-command/src/views/areaManage/sceneConfig/index.vue
@@ -1,7 +1,7 @@
<template>
    <basic-container>
        <el-form ref="queryParamsRef" :model="searchParams" class="command-page-history-search">
            <el-form-item label="场景配置名称" prop="sceneName">
            <el-form-item label="配置名称" prop="sceneName">
                <el-input
                    class="command-input"
                    v-model="searchParams.sceneName"
@@ -36,7 +36,7 @@
        </el-form>
        <div class="command-table-toolbar">
            <el-button :icon="Plus" color="#284FE3" type="primary" @click="openForm('add')">新增</el-button>
            <el-button :icon="Plus" color="#284FE3" type="primary" @click="openForm('add')">新增配置</el-button>
            <el-button :icon="Delete" color="#1A2652" :disabled="!selectedIds.length" @click="handleDelete()">删除</el-button>
        </div>
@@ -46,7 +46,7 @@
                    <el-table-column type="selection" width="46" />
                    <el-table-column type="index" show-overflow-tooltip width="64" label="序号" />
                    <el-table-column prop="sceneName" show-overflow-tooltip label="场景配置名称" />
                    <el-table-column prop="sceneName" show-overflow-tooltip label="配置名称" />
                    <el-table-column prop="sceneType" show-overflow-tooltip label="场景类型">
                        <template v-slot="{ row }">
                            {{ getDictLabel(row.sceneType, dictObj.CommandSceneType) }}
@@ -93,7 +93,7 @@
import { useRoute } from 'vue-router'
const initSearchParams = () => ({
    sceneName: '', // 场景配置名称
    sceneName: '', // 配置名称
    sceneType: '', // 场景类型
    current: 1, // 当前页
    size: 10, // 每页大小
applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue
@@ -419,10 +419,15 @@
async function getSceneConfigList() {
    if (sceneConfigList.value.length) return
    const res = await fwDefenseSceneListApi({unbound: 1})
    const params = { unbound: 1 }
    if (dialogMode.value !== 'add' && formData.value?.id) {
        params.sceneManageId = formData.value.id
    }
    const res = await fwDefenseSceneListApi(params)
    sceneConfigList.value = res?.data?.data ?? []
}
// 获取场景配置名称
function getSceneConfigName(id) {
    if (!id) return ''
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -28,30 +28,40 @@
            </div>
            <!-- 工单信息展示 -->
            <div class="work-order-info" v-if="selectedWorkOrder">
            <div class="work-order-info">
                <el-row class="detail-row-view">
                    <el-col :span="12">
                        <div class="info-item">
                            <span class="label">工单类型</span>
                            <span class="val">{{ getDictLabel(selectedWorkOrder.workOrderType, dictObj.workOrderType) }}</span>
                            <span class="val" v-if="selectedWorkOrder">
                                {{ getDictLabel(selectedWorkOrder.workOrderType, dictObj.workOrderType) }}
                            </span>
                            <span class="val grayText" v-else>选择工单后自动带出</span>
                        </div>
                    </el-col>
                    <el-col :span="12">
                        <div class="info-item">
                            <span class="label">执行时间范围</span>
                            <span class="val">{{ selectedWorkOrder.executeStartTime }} ~ {{ selectedWorkOrder.executeEndTime }}</span>
                            <span class="val" v-if="selectedWorkOrder">
                                {{ selectedWorkOrder.executeStartTime }} ~ {{ selectedWorkOrder.executeEndTime }}
                            </span>
                            <span class="val grayText" v-else>选择工单后自动带出</span>
                        </div>
                    </el-col>
                    <el-col :span="12">
                        <div class="info-item">
                            <span class="label">设备需求</span>
                            <span class="val">{{ getDictLabel(selectedWorkOrder.deviceLoadDemand, dictObj.deviceLoadDemand) }}</span>
                            <span class="val" v-if="selectedWorkOrder">
                                {{ getDictLabel(selectedWorkOrder.deviceLoadDemand, dictObj.deviceLoadDemand) }}
                            </span>
                            <span class="val grayText" v-else>选择工单后自动带出</span>
                        </div>
                    </el-col>
                    <el-col :span="12">
                        <div class="info-item">
                            <span class="label">工单备注</span>
                            <span class="val">{{ selectedWorkOrder.remark }}</span>
                            <span class="val" v-if="selectedWorkOrder">{{ selectedWorkOrder.remark }}</span>
                            <span class="val grayText" v-else>选择工单后自动带出</span>
                        </div>
                    </el-col>
                </el-row>
@@ -65,7 +75,11 @@
                        <el-table-column width="50" label="">
                            <template v-slot="{ $index }">{{ $index + 1 }}</template>
                        </el-table-column>
                        <el-table-column prop="patrolTaskName" label="巡查任务名称" min-width="120">
                        <el-table-column prop="patrolTaskName" min-width="120">
                            <template #header>
                                <span class="required-star">*</span>
                                巡查任务名称
                            </template>
                            <template v-slot="{ row }">
                                <el-input
                                    class="gd-input"
@@ -75,15 +89,18 @@
                                />
                            </template>
                        </el-table-column>
                        <el-table-column prop="patrolTaskType" label="巡查任务类型" min-width="140">
                            <template v-slot="{ row, $index }">
                        <el-table-column prop="patrolTaskType" min-width="140">
                            <template #header>
                                <span class="required-star">*</span>
                                巡查任务类型
                            </template>
                            <template v-slot="{ row }">
                                <el-select
                                    class="gd-select"
                                    popper-class="gd-select-popper"
                                    v-model="row.patrolTaskType"
                                    placeholder="请选择"
                                    :disabled="dialogReadonly"
                                    @change="handlePatrolTaskTypeChange($index, $event)"
                                    disabled
                                >
                                    <el-option
                                        v-for="item in dictObj.workOrderType"
@@ -94,7 +111,11 @@
                                </el-select>
                            </template>
                        </el-table-column>
                        <el-table-column prop="executeTime" label="任务执行时间" min-width="180">
                        <el-table-column prop="executeTime" min-width="180">
                            <template #header>
                                <span class="required-star">*</span>
                                任务执行时间
                            </template>
                            <template v-slot="{ row }">
                                <el-date-picker
                                    class="gd-date-picker"
@@ -107,7 +128,11 @@
                                />
                            </template>
                        </el-table-column>
                        <el-table-column prop="patrolRouteUrl" label="巡查任务航线" min-width="120">
                        <el-table-column prop="patrolRouteUrl" min-width="120">
                            <template #header>
                                <span class="required-star">*</span>
                                巡查任务航线
                            </template>
                            <template v-slot="{ row }">
                                <el-select
                                    class="gd-select"
@@ -120,7 +145,11 @@
                                </el-select>
                            </template>
                        </el-table-column>
                        <el-table-column prop="recommendFlyerName" label="推荐飞手" min-width="120">
                        <el-table-column prop="recommendFlyerName" min-width="120">
                            <template #header>
                                <span class="required-star">*</span>
                                推荐飞手
                            </template>
                            <template v-slot="{ row, $index }">
                                <el-select
                                    class="gd-select"
@@ -139,7 +168,11 @@
                                </el-select>
                            </template>
                        </el-table-column>
                        <el-table-column prop="deviceId" label="选择设备" min-width="120">
                        <el-table-column prop="deviceId" min-width="120">
                            <template #header>
                                <span class="required-star">*</span>
                                选择设备
                            </template>
                            <template v-slot="{ row }">
                                <el-select
                                    class="gd-select"
@@ -234,12 +267,21 @@
const routeOptions = inject('routeOptions')
// 子任务列表
const taskList = ref([initTaskRow()])
const taskList = ref([initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow()])
// 处理工单选择变化
function handleWorkOrderChange(val) {
    if (val) {
        selectedWorkOrder.value = workOrderList.value.find(item => item.id === val)
        // 将工单类型赋值给所有子任务行
        const workOrderType = selectedWorkOrder.value?.workOrderType
        if (workOrderType) {
            taskList.value.forEach((task, index) => {
                task.patrolTaskType = workOrderType
                // 获取对应的飞手列表
                getFlyerList(index, workOrderType)
            })
        }
    } else {
        selectedWorkOrder.value = null
    }
@@ -247,7 +289,17 @@
// 添加任务行
function addTaskRow() {
    taskList.value.push(initTaskRow())
    const newTask = initTaskRow()
    // 如果已选择工单,自动填充工单类型
    if (selectedWorkOrder.value?.workOrderType) {
        newTask.patrolTaskType = selectedWorkOrder.value.workOrderType
    }
    const newIndex = taskList.value.length
    taskList.value.push(newTask)
    // 获取对应的飞手列表
    if (newTask.patrolTaskType) {
        getFlyerList(newIndex, newTask.patrolTaskType)
    }
}
// 删除任务行
@@ -308,19 +360,41 @@
    }
)
// 判断一行是否已填写(至少填写了任务名称)
function isTaskRowFilled(task) {
    return !!(task.patrolTaskName || task.executeTime || task.patrolRouteUrl || task.recommendFlyerName || task.deviceId)
}
// 判断一行是否完整填写(所有必填项都有值)
function isTaskRowComplete(task) {
    return !!(
        task.patrolTaskName &&
        task.patrolTaskType &&
        task.executeTime &&
        task.patrolRouteUrl &&
        task.recommendFlyerName &&
        task.deviceId
    )
}
// 提交新增
async function handleSubmit() {
    if (!selectedWorkOrderId.value) {
        ElMessage.warning('请选择关联工单')
        return
    }
    if (!taskList.value.length) {
        ElMessage.warning('请添加至少一个子任务')
    // 过滤出已填写的任务行
    const filledTasks = taskList.value.filter(task => isTaskRowFilled(task))
    if (!filledTasks.length) {
        ElMessage.warning('请至少填写一个子任务')
        return
    }
    // 校验子任务
    // 只校验已填写的子任务
    for (let i = 0; i < taskList.value.length; i++) {
        const task = taskList.value[i]
        // 跳过未填写的行
        if (!isTaskRowFilled(task)) continue
        // 已填写的行需要校验完整性
        if (!task.patrolTaskName) {
            ElMessage.warning(`第${i + 1}行: 请输入巡查任务名称`)
            return
@@ -348,8 +422,9 @@
    }
    submitting.value = true
    try {
        const preID = taskList.value[0].id
        const dataList = taskList.value.map(item => ({
        const preID = filledTasks[0]?.id
        // 只提交已填写的任务行
        const dataList = filledTasks.map(item => ({
            ...item,
            workOrderId: selectedWorkOrderId.value,
            id: undefined,
@@ -371,7 +446,7 @@
    if (dialogMode.value === 'add') {
        selectedWorkOrderId.value = null
        selectedWorkOrder.value = null
        taskList.value = [initTaskRow()]
        taskList.value = [initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow()]
        flyerListMap.value = {}
    } else {
        // 编辑/查看模式 - 加载已有数据
@@ -386,9 +461,7 @@
    }
}
onMounted(() => {
})
onMounted(() => {})
defineExpose({ open })
</script>
@@ -401,4 +474,12 @@
    display: flex;
    align-items: center;
}
.required-star {
    color: #f56c6c;
    margin-right: 4px;
}
.grayText {
    color: #9f9f9f;
}
</style>
applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue
@@ -13,7 +13,7 @@
          <el-table-column prop="operatingIncome" label="营业收入(元)" align="center"></el-table-column>
          <el-table-column prop="totalCost" label="综合总成本费用(元)" align="center"></el-table-column>
          <el-table-column prop="netProfit" label="净利润(元)" align="center"></el-table-column>
          <el-table-column prop="evenueForecast" label="收益预测(元)" align="center"></el-table-column>
          <el-table-column prop="earnForecast" label="收益预测(元)" align="center"></el-table-column>
          <el-table-column prop="financialIrr" label="财务内部收益率(%)" align="center"></el-table-column>
          <el-table-column prop="marketSpace" label="市场空间" align="center" show-overflow-tooltip></el-table-column>
          <el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
@@ -52,8 +52,8 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="收益预测(元)" prop="evenueForecast">
              <el-input class="gd-input" v-model="editParams.evenueForecast" />
            <el-form-item label="收益预测(元)" prop="earnForecast">
              <el-input class="gd-input" v-model="editParams.earnForecast" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -103,7 +103,7 @@
  operatingIncome: '',
  totalCost: '',
  netProfit: '',
  evenueForecast: '',
  earnForecast: '',
  financialIrr: '',
  marketSpace: '',
})
@@ -148,7 +148,7 @@
      trigger: 'blur'
    }
  ],
  evenueForecast: [
  earnForecast: [
    { required: true, message: '请输入', trigger: 'blur' },
    {
      validator: (rule, value, callback) => {
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -177,6 +177,7 @@
            <div class="rightBox" v-if="!dialogReadonly">
                <div class="detail-title">推荐设备</div>
                <el-table
                    class="separateTable"
                    :empty-text="(formData.deviceLoadDemand && pointList.length) ? '暂无数据' : '请先选择设备需求并在地图上绘制工单范围'"
                    ref="deviceTableRef"
                    :data="(formData.deviceLoadDemand && pointList.length) ? deviceList : []"
@@ -635,7 +636,7 @@
</script>
<style lang="scss" scoped>
.el-table{
.separateTable{
    height: 0;
    flex: 1;
    :deep(){
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -80,7 +80,7 @@
                type="primary"
                @click="openForm('add')"
            >
                新增
                新增工单
            </el-button>
<!--            <el-button
                :icon="Delete"