吉安感知网项目-前端
张含笑
2026-01-30 b248152cc5d600d41e3b0be287a3c43415e46ed1
Merge remote-tracking branch 'origin/master'
15 files modified
357 ■■■■ changed files
applications/drone-command/src/views/api.txt 6 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue 208 ●●●●● patch | view | raw | blame | history
applications/drone-command/src/views/permissionManage/permissionDept/ShareDiaLog.vue 4 ●●● patch | view | raw | blame | history
applications/task-work-order/src/styles/common/cockpit.scss 22 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/flyingHand/FlyingHandDialog.vue 12 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/flyingHand/index.vue 10 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue 11 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue 8 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionReport/index.vue 10 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue 2 ●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue 4 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue 7 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue 48 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue 2 ●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue 3 ●●●● patch | view | raw | blame | history
applications/drone-command/src/views/api.txt
@@ -3,7 +3,7 @@
## 列表-不带分页
**接口地址**:`/drone-fw/area/fwAreaDivide/list`
**接口地址**:`/area/fwAreaDivide/list`
**请求方式**:`GET`
@@ -15,7 +15,7 @@
**响应数据类型**:`*/*`
**接口描述**:<p>传入filterSelected或sceneId或areaTypeKeys</p>
**接口描述**:<p>传入filterSelected或sceneId或areaTypeKeys或isSetSceneManage或flyTime</p>
@@ -29,6 +29,8 @@
| -------- | -------- | ----- | -------- | -------- | ------ |
|areaTypeKeys|区域类型key集合(逗号分隔)|query|false|string||
|filterSelected|是否过滤已被选择的数据(1过滤 0不过滤)|query|false|integer(int32)||
|flyTime|时间筛选(yyyy-MM-dd HH:mm:ss)|query|false|string(date-time)||
|isSetSceneManage|是否按场景管理过滤(1是 0或空否)|query|false|integer(int32)||
|sceneId|场景id|query|false|integer(int64)||
applications/drone-command/src/views/areaManage/sceneManage/FormDiaLog.vue
@@ -146,6 +146,9 @@
import commandPost from '@/assets/images/dataCockpit/legend/command-post.png'
import { saveOperationLog } from '@ztzf/apis'
import { useRoute } from 'vue-router'
import { fwAreaDivideDetailApi, fwAreaDivideListApi } from '../partition/partitionApi'
import { buildEllipsePositions } from '@/utils/cesium/shapeTools'
import { AREA_TYPE_STYLE_MAP, BUFFER_LEVEL_STYLES, DEFAULT_AREA_STYLE } from '@ztzf/constants'
// 初始化表单数据
const initForm = () => ({
@@ -169,10 +172,12 @@
const titleEnum = ref({ edit: '编辑', view: '查看', add: '新增' })
const effectiveDateRange = ref([]) // 有效时间范围
const sceneConfigList = ref([]) // 场景配置列表
const areaList = ref([]) // ????
const mapRef = ref(null)
const route = useRoute()
let viewer
let redPointEntity
let areaDisplaySource
let leftClickBound = false
// 表单验证规则
@@ -229,6 +234,189 @@
}
// 获取场景配置列表
// ?????
function ensureAreaDisplaySource() {
    if (!viewer) return null
    if (!areaDisplaySource) {
        areaDisplaySource = new Cesium.CustomDataSource('scene-manage-area-display')
        viewer.dataSources.add(areaDisplaySource)
    }
    return areaDisplaySource
}
function clearAreaDisplay() {
    if (!areaDisplaySource) return
    areaDisplaySource.entities.removeAll()
}
function normalizeShapePoint(point) {
    if (!point) return null
    const lng = point?.lng ?? point?.longitude
    const lat = point?.lat ?? point?.latitude
    const height = Number.isFinite(Number(point?.height)) ? Number(point.height) : 0
    if (!Number.isFinite(Number(lng)) || !Number.isFinite(Number(lat))) return null
    return { lng: Number(lng), lat: Number(lat), height }
}
function buildShapePositions(points = []) {
    const normalized = points.map(normalizeShapePoint).filter(Boolean)
    return normalized.map(point => Cesium.Cartesian3.fromDegrees(point.lng, point.lat, point.height))
}
function getShapeDisplayPoints(shape) {
    if (Array.isArray(shape?.displayPoints) && shape.displayPoints.length) {
        return shape.displayPoints
    }
    return shape?.points || []
}
function getAreaTypeStyle(areaType) {
    return AREA_TYPE_STYLE_MAP?.[String(areaType)] || DEFAULT_AREA_STYLE
}
function parseGeomJson(geomJson) {
    if (!geomJson) return null
    if (typeof geomJson === 'object') return geomJson
    if (typeof geomJson !== 'string') return null
    const trimmed = geomJson.trim()
    if (!trimmed) return null
    try {
        return JSON.parse(trimmed)
    } catch (error) {
        return null
    }
}
function resolveAreaShapes(area) {
    const extList = Array.isArray(area?.fwAreaDivideExtList) ? area.fwAreaDivideExtList : []
    if (!extList.length) return []
    return extList
        .map((item, index) => {
            const isShapePayload = item?.drawType || item?.points
            if (isShapePayload) {
                return {
                    id: item?.id || `shape_${Date.now()}_${index}_${Math.random().toString(16).slice(2, 6)}`,
                    drawType: item?.drawType ?? 'polygon',
                    areaType: item?.areaType ?? item?.areaTypeKey ?? '',
                    points: Array.isArray(item?.points) ? item.points : [],
                    displayPoints: Array.isArray(item?.displayPoints) ? item.displayPoints : null,
                    meta: item?.meta ?? null,
                }
            }
            const parsed = parseGeomJson(item?.geomJson)
            if (!parsed) return null
            return {
                id: parsed?.id || `shape_${Date.now()}_${index}_${Math.random().toString(16).slice(2, 6)}`,
                drawType: parsed?.drawType ?? 'polygon',
                areaType: item?.areaTypeKey ?? parsed?.areaType ?? '',
                points: Array.isArray(parsed?.points) ? parsed.points : [],
                displayPoints: Array.isArray(parsed?.displayPoints) ? parsed.displayPoints : null,
                meta: parsed?.meta ?? null,
            }
        })
        .filter(Boolean)
}
function renderSceneAreas() {
    if (!visible.value) {
        clearAreaDisplay()
        return
    }
    if (!viewer) initMap()
    const dataSource = ensureAreaDisplaySource()
    if (!dataSource) return
    dataSource.entities.removeAll()
    areaList.value.forEach(area => {
        const shapes = resolveAreaShapes(area)
        shapes.forEach(shape => {
            if (shape.drawType === 'buffer' && shape.meta?.bufferRadii?.length && shape.meta?.center) {
                const center = shape.meta.center
                const centerCartesian = Cesium.Cartesian3.fromDegrees(center.lng, center.lat, center.height || 0)
                const radii = shape.meta.bufferRadii
                    .map(radius => Number(radius))
                    .filter(radius => Number.isFinite(radius) && radius > 0)
                radii.forEach((radius, index) => {
                    const style = BUFFER_LEVEL_STYLES[index] || BUFFER_LEVEL_STYLES[BUFFER_LEVEL_STYLES.length - 1]
                    dataSource.entities.add({
                        name: 'scene-manage-area-display',
                        customData: { drawType: shape.drawType, level: index + 1 },
                        position: centerCartesian,
                        ellipse: {
                            semiMajorAxis: radius,
                            semiMinorAxis: radius,
                            material: style.fill,
                            outline: false,
                            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
                        },
                    })
                    const positions = buildEllipsePositions(centerCartesian, radius, radius)
                    dataSource.entities.add({
                        name: 'scene-manage-area-display',
                        customData: { drawType: shape.drawType, level: index + 1, outline: true },
                        polyline: {
                            positions: positions.length ? [...positions, positions[0]] : positions,
                            clampToGround: true,
                            width: 2,
                            material: style.outline,
                        },
                    })
                })
                return
            }
            const positions = buildShapePositions(getShapeDisplayPoints(shape))
            if (positions.length < 3) return
            const style = getAreaTypeStyle(shape.areaType)
            dataSource.entities.add({
                name: 'scene-manage-area-display',
                customData: { drawType: shape.drawType },
                polygon: {
                    hierarchy: new Cesium.PolygonHierarchy(positions),
                    material: style.fill,
                    outline: false,
                    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
                },
                polyline: {
                    positions: positions.length ? [...positions, positions[0]] : positions,
                    clampToGround: true,
                    width: 2,
                    material: style.outline,
                },
            })
        })
    })
}
async function ensureAreaExtList(rows) {
    const missingRows = rows.filter(row => row?.id && !Array.isArray(row?.fwAreaDivideExtList))
    if (!missingRows.length) return rows
    const detailList = await Promise.all(
        missingRows.map(row =>
            fwAreaDivideDetailApi({ id: row.id })
                .then(res => res?.data?.data)
                .catch(() => null)
        )
    )
    const detailMap = new Map(detailList.filter(Boolean).map(item => [String(item.id), item]))
    if (!detailMap.size) return rows
    return rows.map(item => {
        const detail = detailMap.get(String(item.id))
        return detail ? { ...item, ...detail } : item
    })
}
// ??????????
async function loadAreaList(sceneId) {
    if (!sceneId) {
        areaList.value = []
        clearAreaDisplay()
        return
    }
    const res = await fwAreaDivideListApi({ sceneId })
    const list = res?.data?.data ?? []
    areaList.value = await ensureAreaExtList(list)
    renderSceneAreas()
}
async function getSceneConfigList() {
    if (sceneConfigList.value.length) return
    const res = await fwDefenseSceneListApi({unbound: 1})
@@ -267,7 +455,7 @@
}
// 地图左键点击事件
function LeftClickEvent(click) {
async function LeftClickEvent(click) {
    const pos = click.position
    // 优先使用 pickPosition 获取贴地坐标(包含地形高度)
    let cartesian3 = viewer.scene.pickPosition(pos)
@@ -333,12 +521,28 @@
    }
    await nextTick()
    setMapPoint(formData.value.longitude, formData.value.latitude)
    await loadAreaList(formData.value.defenseSceneId)
}
onMounted(() => {
    getSceneConfigList()
})
watch(
    () => formData.value.defenseSceneId,
    sceneId => {
        if (!visible.value) return
        loadAreaList(sceneId)
    }
)
watch(
    () => visible.value,
    val => {
        if (!val) clearAreaDisplay()
    }
)
defineExpose({
    open,
})
applications/drone-command/src/views/permissionManage/permissionDept/ShareDiaLog.vue
@@ -61,6 +61,7 @@
const originalSharedIds = ref([]) // 原始已共享的设备ID集合
const originalSharedMap = ref({}) // 原始已共享的设备ID与shareId的映射
const currentDeptId = ref(null) // 当前操作的部门ID
const regionCode = ref(null) // 当前操作的部门code
const dictObj = ref({
    deviceType: [], // 设备类型
})
@@ -86,7 +87,7 @@
async function getDeviceList() {
    loading.value = true
    try {
        const res = await nonDeptAreaDevicesApi({ loanToDeptId: currentDeptId.value })
        const res = await nonDeptAreaDevicesApi({ deptId: currentDeptId.value,regionCode: regionCode.value })
        deviceList.value = res?.data?.data ?? []
        // 记录原始已共享的设备ID和shareId映射
        const sharedDevices = deviceList.value.filter(item => item.isShared)
@@ -158,6 +159,7 @@
// 打开弹框
async function open({ row } = {}) {
    currentDeptId.value = row?.id
    regionCode.value = row?.areaCode
    selectedRows.value = []
    getDictList()
    await getDeviceList()
applications/task-work-order/src/styles/common/cockpit.scss
@@ -31,6 +31,7 @@
    &::placeholder {
      color: var(--tips);
    }
    color: #383874;
  }
  &.is-disabled {
@@ -122,6 +123,7 @@
    &::placeholder {
      color: var(--tips);
    }
    color: #383874;
  }
  .el-range-separator {
@@ -1188,4 +1190,24 @@
      }
    }
  }
}
.gd-dialog-form {
  // 最后一排不需要设置 margin-bottom
  // border: 1px solid red;
  // 倒数第二个也设置为0
  // .el-col:nth-last-child(2) {
  //   margin-bottom: 0;
  // }
  // .el-col:nth-last-child(1) {
  //   margin-bottom: 0;
  // }
  // .el-form-item:nth-last-child(2) {
  //   margin-bottom: 0;
  // }
  //  .el-form-item:nth-last-child(1) {
  //   margin-bottom: 0;
  // }
}
applications/task-work-order/src/views/orderView/flyingHand/FlyingHandDialog.vue
@@ -30,7 +30,7 @@
      </el-col>
      <el-col :span="12">
        <div class="label">擅长任务类型</div>
        <div class="val">{{ getDictLabel(formData.skilledTaskType, dictObj.patrolTaskType) }}</div>
        <div class="val">{{ getDictLabel(formData.skilledTaskType, dictObj.workOrderType) }}</div>
      </el-col>
      <el-col :span="12">
        <div class="label">项目经验</div>
@@ -149,7 +149,7 @@
                            :disabled="dialogType === 'view'"
                        >
                            <el-option
                                v-for="item in dictObj.patrolTaskType"
                                v-for="item in dictObj.workOrderType"
                                :key="item.dictKey"
                                :label="item.dictValue"
                                :value="item.dictKey"
@@ -191,7 +191,7 @@
                color="#4C34FF"
                @click="handleSubmit"
            >
                确定
                保存
            </el-button>
        </template>
    </el-dialog>
@@ -234,7 +234,7 @@
const dialogTitle = computed(() => {
    switch (props.dialogType) {
        case 'add':
            return '新增'
            return '飞手建档'
        case 'edit':
            return '编辑'
        case 'view':
@@ -309,7 +309,7 @@
        if (newData) {
            Object.assign(formData.value, newData)
            formData.value.flightHours = Number(newData.flightHours)
        }
        }
    },
    { deep: true, immediate: true }
)
@@ -374,4 +374,4 @@
        margin-bottom: 20px;
    }
}
</style>
</style>
applications/task-work-order/src/views/orderView/flyingHand/index.vue
@@ -49,7 +49,7 @@
        </el-form>
        <div class="gd-table-toolbar">
            <el-button :icon="Plus" color="#4C34FF" type="primary" @click="addFlyingHand">新增</el-button>
            <el-button :icon="Plus" color="#4C34FF" type="primary" @click="addFlyingHand">飞手建档</el-button>
        </div>
        <div class="gd-table-container" v-loading="loading">
@@ -72,7 +72,7 @@
                    </el-table-column>
                    <el-table-column prop="skilledTaskType" show-overflow-tooltip label="擅长任务类型">
                        <template v-slot="{ row }">
                            {{ getDictLabel(row.skilledTaskType, dictObj.patrolTaskType) }}
                            {{ getDictLabel(row.skilledTaskType, dictObj.workOrderType) }}
                        </template>
                    </el-table-column>
                    <el-table-column label="操作" class-name="operation-btns" width="180">
@@ -136,7 +136,7 @@
const flyingHandData = ref({})
const dictObj = ref({
    patrolTaskType: [], // 擅长任务类型
    workOrderType: [], // 擅长任务类型
    skilledUavType: [], // 擅长机型
    technicalStrength: [] // 技术特长
})
@@ -212,7 +212,7 @@
// 获取字典
function getDictList() {
    getDictionaryByCode('patrolTaskType,skilledUavType,technicalStrength').then(res => {
    getDictionaryByCode('workOrderType,skilledUavType,technicalStrength').then(res => {
        dictObj.value = res.data.data
    })
}
@@ -233,4 +233,4 @@
    getFlyingHandList()
})
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss"></style>
applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue
@@ -31,12 +31,10 @@
                <el-table-column prop="distributeUserName" show-overflow-tooltip label="分发人员" />
                <el-table-column label="操作" class-name="operation-btns" width="140">
                    <template v-slot="{ row }">
                        <el-link  type="primary"
                                            @click="openDistributeDialog(row)"
                                            :disabled="!requester || (row.distributeStatus === 1 || currentRow.taskStatus !== '8')"
                        >
                        <el-link type="primary" @click="openDistributeDialog(row)" v-if="permission.clueEvents_distribute && (row.distributeStatus === 0 || row.distributeStatus === 2)">
                            转为事件并分发
                        </el-link>
                        <el-button disabled type="text" v-else>转为事件并分发</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -64,6 +62,9 @@
const requester = computed(() => store.state.user.userInfo?.role_id === '2014158512610869250')
const activeName = ref('all')
const permission = computed(() => store.state.user.permission)
console.log(permission.value.clueEvents_distribute, 'permission')
const visible = defineModel()
const loading = ref(false)
const list = ref([])
@@ -75,7 +76,7 @@
const distributeStatusOptions = [
    { label: '未分发', value: 0 },
    { label: '已分发', value: 1 },
    { label: '已驳回', value: 2 },
    { label: '已退回', value: 2 },
    { label: '已确认', value: 3 },
]
applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue
@@ -22,7 +22,7 @@
                    @change="handleSearch"
                >
                    <el-option
                        v-for="item in dictObj.patrolTaskType"
                        v-for="item in dictObj.workOrderType"
                        :key="item.dictKey"
                        :label="item.dictValue"
                        :value="item.dictKey"
@@ -76,7 +76,7 @@
                    <el-table-column prop="taskNo" show-overflow-tooltip label="巡查任务编号" />
                    <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型">
                        <template v-slot="{ row }">
                            {{ getDictLabel(row.patrolTaskType, dictObj.patrolTaskType) }}
                            {{ getDictLabel(row.patrolTaskType, dictObj.workOrderType) }}
                        </template>
                    </el-table-column>
                    <el-table-column prop="taskStatus" show-overflow-tooltip label="巡查任务状态">
@@ -146,7 +146,7 @@
    children: 'children',
}
const dictObj = ref({
    patrolTaskType: [], // 巡查任务类型
    workOrderType: [], // 巡查任务类型
    taskStatus: [], // 巡查任务状态
})
@@ -196,7 +196,7 @@
// 获取字典
function getDictList() {
    getDictionaryByCode('patrolTaskType,taskStatus').then(res => {
    getDictionaryByCode('workOrderType,taskStatus').then(res => {
        dictObj.value = res.data.data
    })
}
applications/task-work-order/src/views/orderView/orderManage/inspectionReport/index.vue
@@ -22,7 +22,7 @@
                    @change="handleSearch"
                >
                    <el-option
                        v-for="item in dictObj.patrolTaskType"
                        v-for="item in dictObj.workOrderType"
                        :key="item.dictKey"
                        :label="item.dictValue"
                        :value="item.dictKey"
@@ -56,7 +56,7 @@
                    <!-- <el-table-column prop="resultType" show-overflow-tooltip label="文档类型" /> -->
                    <el-table-column prop="resultType" show-overflow-tooltip label="文档类型">
                        <template v-slot="{ row }">
                            {{ getDictLabel(row.resultType, dictObj.patrolTaskType) }}
                            {{ getDictLabel(row.resultType, dictObj.workOrderType) }}
                        </template>
                    </el-table-column>
                    <el-table-column label="操作" class-name="operation-btns">
@@ -102,7 +102,7 @@
                        clearable
                    >
                        <el-option
                            v-for="item in dictObj.patrolTaskType"
                            v-for="item in dictObj.workOrderType"
                            :key="item.dictKey"
                            :label="item.dictValue"
                            :value="item.dictKey"
@@ -174,7 +174,7 @@
const uploadName = ref('')
const dictObj = ref({
    patrolTaskType: [], // 巡查任务类型
    workOrderType: [], // 巡查任务类型
})
const searchParams = ref(initSearchParams()) // 查询参数
@@ -203,7 +203,7 @@
// 获取字典
function getDictList() {
    getDictionaryByCode('patrolTaskType').then(res => {
    getDictionaryByCode('workOrderType').then(res => {
        dictObj.value = res.data.data
    })
}
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -86,7 +86,7 @@
                                    @change="handlePatrolTaskTypeChange($index, $event)"
                                >
                                    <el-option
                                        v-for="item in dictObj.patrolTaskType"
                                        v-for="item in dictObj.workOrderType"
                                        :key="item.dictKey"
                                        :label="item.dictValue"
                                        :value="item.dictKey"
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
@@ -39,7 +39,7 @@
                        </el-col>
                        <el-col :span="12">
                            <div class="label">巡查任务类型</div>
                            <div class="val">{{ getDictLabel(formData.patrolTaskType, dictObj.patrolTaskType) }}</div>
                            <div class="val">{{ getDictLabel(formData.patrolTaskType, dictObj.workOrderType) }}</div>
                        </el-col>
                        <el-col :span="12">
                            <div class="label">任务执行时间</div>
@@ -106,7 +106,7 @@
                                    clearable
                                >
                                    <el-option
                                        v-for="item in dictObj.patrolTaskType"
                                        v-for="item in dictObj.workOrderType"
                                        :key="item.dictKey"
                                        :label="item.dictValue"
                                        :value="item.dictKey"
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -25,7 +25,7 @@
                    @change="handleSearch"
                >
                    <el-option
                        v-for="item in dictObj.patrolTaskType"
                        v-for="item in dictObj.workOrderType"
                        :key="item.dictKey"
                        :label="item.dictValue"
                        :value="item.dictKey"
@@ -84,7 +84,7 @@
                    <el-table-column prop="taskNo" show-overflow-tooltip label="巡查任务编号" />
                    <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型">
                        <template v-slot="{ row }">
                            {{ getDictLabel(row.patrolTaskType, dictObj.patrolTaskType) }}
                            {{ getDictLabel(row.patrolTaskType, dictObj.workOrderType) }}
                        </template>
                    </el-table-column>
                    <el-table-column prop="taskStatus" show-overflow-tooltip label="巡查任务状态">
@@ -163,7 +163,6 @@
const dialogVisible = ref(false)
const viewDiaLogVisible = ref(false)
const dictObj = ref({
    patrolTaskType: [], // 巡查任务类型
    workOrderType: [], // 工单类型
    deviceLoadDemand: [], // 设备负载需求
    taskStatus: [], // 巡查任务状态
@@ -247,7 +246,7 @@
// 获取字典
function getDictList() {
    getDictionaryByCode('patrolTaskType,workOrderType,deviceLoadDemand,taskStatus').then(res => {
    getDictionaryByCode('workOrderType,deviceLoadDemand,taskStatus').then(res => {
        dictObj.value = res.data.data
    })
}
applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue
@@ -10,10 +10,11 @@
        <el-table class="gd-table" :data="tableList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="46" />
          <el-table-column label="序号" type="index" width="60"></el-table-column>
          <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="financialIrr" label="财务内部收益率" align="center"></el-table-column>
          <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="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>
          <el-table-column prop="nickName" label="创建人" align="center"></el-table-column>
@@ -31,36 +32,35 @@
          v-model:page-size="params.size" layout="total, prev, pager, next, sizes" :total="total" @change="getList" />
      </div>
    </div>
    <el-dialog class="gd-dialog" append-to-body v-model="isShowEditView" :title="titleTxt" :width="pxToRem(800)"
    <el-dialog class="gd-dialog" append-to-body v-model="isShowEditView" :title="titleTxt"
      :close-on-click-modal="false" :destroy-on-close="true" @close="handleClose">
      <el-form class="gd-dialog-form" ref="ruleFormRef" :model="editParams" :rules="rules" label-width="140px">
      <el-form class="gd-dialog-form" ref="ruleFormRef" :model="editParams" :rules="rules" label-width="160px">
        <el-row>
                <el-col :span="12">
            <el-form-item label="营业收入" prop="operatingIncome">
            <el-form-item label="营业收入(元)" prop="operatingIncome">
              <el-input class="gd-input" v-model="editParams.operatingIncome" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="综合总成本费用" prop="totalCost">
            <el-form-item label="综合总成本费用(元)" prop="totalCost">
              <el-input class="gd-input" v-model="editParams.totalCost" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="净利润" prop="netProfit">
            <el-form-item label="净利润(元)" prop="netProfit">
              <el-input class="gd-input" v-model="editParams.netProfit" />
            </el-form-item>
          </el-col>
         <el-col :span="12">
            <el-form-item label="财务内部收益率" prop="financialIrr">
          <el-col :span="12">
            <el-form-item label="收益预测(元)" prop="evenueForecast">
              <el-input class="gd-input" v-model="editParams.evenueForecast" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="财务内部收益率(%)" prop="financialIrr">
              <el-input class="gd-input" v-model="editParams.financialIrr" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="市场空间" prop="marketSpace">
              <el-input class="gd-input" v-model="editParams.marketSpace" />
@@ -103,6 +103,7 @@
  operatingIncome: '',
  totalCost: '',
  netProfit: '',
  evenueForecast: '',
  financialIrr: '',
  marketSpace: '',
})
@@ -147,6 +148,19 @@
      trigger: 'blur'
    }
  ],
  evenueForecast: [
    { required: true, message: '请输入', trigger: 'blur' },
    {
      validator: (rule, value, callback) => {
        if (!/^\d+(\.\d+)?$/.test(value)) {
          callback(new Error('请输入有效的数字(整数或小数)'))
        } else {
          callback()
        }
      },
      trigger: 'blur'
    }
  ],
  financialIrr: [
    { required: true, message: '请输入', trigger: 'blur' },
    {
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -67,7 +67,7 @@
                            <el-table-column prop="patrolTaskName" show-overflow-tooltip label="巡查任务名称" />
                            <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型">
                                <template v-slot="{ row }">
                                    {{ getDictLabel(row.patrolTaskType, dictObj.patrolTaskType) }}
                                    {{ getDictLabel(row.patrolTaskType, dictObj.workOrderType) }}
                                </template>
                            </el-table-column>
                            <el-table-column prop="taskStatus" show-overflow-tooltip label="任务状态">
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -96,7 +96,6 @@
        <div class="gd-table-container" v-loading="loading">
            <div class="gd-table-content gd-table-content-bg">
                <el-table class="gd-table" :data="list" @selection-change="handleSelectionChange">
                    <el-table-column type="selection" width="46" v-if="permission.order_delete" />
                    <el-table-column type="index" width="64" label="序号" />
                    <el-table-column prop="workOrderName" show-overflow-tooltip label="工单名称" />
                    <el-table-column prop="workOrderCode" show-overflow-tooltip label="工单编号" />
@@ -277,7 +276,7 @@
// 获取字典
function getDictList() {
    getDictionaryByCode('deviceLoadDemand,workOrderType,workOrderStatus,patrolTaskType,taskStatus').then(res => {
    getDictionaryByCode('deviceLoadDemand,workOrderType,workOrderStatus,taskStatus').then(res => {
        dictObj.value = res.data.data
    })
}