吉安感知网项目-前端
shuishen
2026-02-03 89380e6260a75d1d3b94de687ebcc2f50d50659d
applications/drone-command/src/views/permissionManage/permissionDept/FormDiaLog.vue
@@ -1,7 +1,7 @@
<template>
   <el-dialog class="ztzf-page-view-dialog" v-model="visible" :title="dialogTitle" @closed="handleClosed" destroy-on-close>
   <el-dialog class="command-page-view-dialog" v-model="visible" :title="dialogTitle" @closed="handleClosed" destroy-on-close
      :close-on-click-modal="false">
      <div class="detail-container" v-if="dialogReadonly">
         <div class="detail-title">机构详情</div>
         <el-row>
            <el-col :span="12">
               <div class="label">部门名称</div>
@@ -28,10 +28,6 @@
               <div class="val">{{ formData.areaName || '-' }}</div>
            </el-col>
            <el-col :span="12">
               <div class="label">部署模式</div>
               <div class="val">{{ deploymentModeLabel(formData.deploymentMode) }}</div>
            </el-col>
            <el-col :span="12">
               <div class="label">排序</div>
               <div class="val">{{ formData.sort }}</div>
            </el-col>
@@ -46,19 +42,19 @@
         <el-row>
            <el-col :span="12">
               <el-form-item label="部门名称" prop="deptName">
                  <el-input class="ztzf-data-cockpit-search-input" v-model="formData.deptName" maxlength="50" placeholder="请输入" clearable />
                  <el-input class="command-input" v-model="formData.deptName" maxlength="50" placeholder="请输入" clearable />
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="部门全称" prop="fullName">
                  <el-input class="ztzf-data-cockpit-search-input" v-model="formData.fullName" maxlength="50" placeholder="请输入" clearable />
                  <el-input class="command-input" v-model="formData.fullName" maxlength="50" placeholder="请输入" clearable />
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="上级部门" prop="parentId">
                  <el-tree-select
                     class="ztzf-data-cockpit-select"
                     popper-class="ztzf-data-cockpit-tree-select-popper"
                     class="command-select"
                     popper-class="command-tree-select-popper"
                     v-model="formData.parentId"
                     :data="deptTree"
                     :props="treeProps"
@@ -70,52 +66,44 @@
            </el-col>
            <el-col :span="12">
               <el-form-item label="部门类型" prop="deptCategory">
                  <el-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-select-popper" v-model="formData.deptCategory" placeholder="请选择" clearable>
                     <el-option v-for="item in dictObj.org_category" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
                  <el-select class="command-select" popper-class="command-select-popper" v-model="formData.deptCategory" placeholder="请选择" clearable>
                     <el-option v-for="item in dictObj.org_category" :key="item.dictKey" :label="item.dictValue" :value="Number(item.dictKey)" />
                  </el-select>
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="部门性质" prop="deptNature">
                  <el-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-select-popper" v-model="formData.deptNature" placeholder="请选择" clearable>
                     <el-option v-for="item in dictObj.org_nature" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
                  <el-select class="command-select" popper-class="command-select-popper" v-model="formData.deptNature" placeholder="请选择" clearable>
                     <el-option v-for="item in dictObj.org_nature" :key="item.dictKey" :label="item.dictValue" :value="Number(item.dictKey)" />
                  </el-select>
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="排序" prop="sort">
                  <el-input-number v-model="formData.sort" :min="0" :controls="false" placeholder="请输入" />
                  <el-input-number class="command-input" v-model="formData.sort" :min="0" :controls="false" placeholder="请输入" />
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="行政区划" prop="areaCode">
                  <el-cascader
                     class="ztzf-data-cockpit-select"
                     popper-class="ztzf-data-cockpit-select-popper"
                     class="command-cascader"
                     popper-class="command-cascader-popper"
                     v-model="formData.areaCode"
                     :props="areaProps"
                     clearable
                  />
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="部署模式" prop="deploymentMode">
                  <el-radio-group v-model="formData.deploymentMode">
                     <el-radio :label="0">统一部署</el-radio>
                     <el-radio :label="1">独立部署</el-radio>
                  </el-radio-group>
               </el-form-item>
            </el-col>
            <el-col :span="24">
               <el-form-item label="备注" prop="remark">
                  <el-input class="ztzf-data-cockpit-search-input" v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入" clearable />
                  <el-input class="command-input" v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入" clearable />
               </el-form-item>
            </el-col>
         </el-row>
      </el-form>
      <template #footer>
         <el-button color="#2B2B4C" @click="handleCancel">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
         <el-button v-if="dialogMode != 'view'" color="#2B2B4C" @click="handleCancel">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
         <el-button color="#284FE3" v-if="!dialogReadonly" type="primary" :loading="submitting" :disabled="submitting" @click="handleSubmit">
            保存
         </el-button>
@@ -129,17 +117,18 @@
import { add, getDept, getDeptTree, update } from '@/api/system/dept'
import { getLazyTree } from '@/api/base/region'
import { fieldRules, getDictLabel } from '@ztzf/utils'
import { saveOperationLog } from '@ztzf/apis'
import { useRoute } from 'vue-router'
const initForm = () => ({
   deptName: '',
   fullName: '',
   parentId: '',
   parentName: '',
   deptCategory: '',
   deptNature: '',
   areaCode: '',
   deptCategory: null,
   deptNature: null,
   areaCode: [],
   areaName: '',
   deploymentMode: 0,
   sort: 0,
   remark: '',
})
@@ -152,7 +141,7 @@
const areaProps = {
   label: 'title',
   value: 'value',
   emitPath: false,
   emitPath: true,
   checkStrictly: true,
   lazy: true,
   lazyLoad(node, resolve) {
@@ -186,10 +175,12 @@
const emit = defineEmits(['success'])
const formRef = ref(null)
const formData = ref(initForm())
const visible = ref(false)
const visible = defineModel()
const dialogMode = ref('add')
const submitting = ref(false)
const isAddChild = ref(false)
const dialogReadonly = computed(() => dialogMode.value === 'view')
const route = useRoute()
const dialogTitle = computed(() => {
   if (dialogMode.value === 'edit') return '编辑'
   if (dialogMode.value === 'view') return '查看'
@@ -203,14 +194,7 @@
   deptCategory: fieldRules(true),
   deptNature: fieldRules(true),
   areaCode: fieldRules(true),
   deploymentMode: fieldRules(true),
   sort: fieldRules(true),
}
function deploymentModeLabel(value) {
   if (value === 1) return '独立部署'
   if (value === 0) return '统一部署'
   return value ?? '-'
}
function normalizeAreaCode(value) {
@@ -226,19 +210,26 @@
}
function getFullAreaCode(areaCode) {
   if (!areaCode) return ''
   if (!areaCode) return []
   if (Array.isArray(areaCode)) return areaCode
   const code = areaCode.toString()
   if (code.includes(',')) return code
   if (code.includes(',')) return code.split(',')
   if (code.endsWith('0000000000')) {
      return code
      return [code]
   } else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
      const provinceCode = code.substring(0, 2) + '0000000000'
      return `${provinceCode},${code}`
      return [provinceCode, code]
   } else {
      const provinceCode = code.substring(0, 2) + '0000000000'
      const cityCode = code.substring(0, 4) + '00000000'
      return `${provinceCode},${cityCode},${code}`
      return [provinceCode, cityCode, code]
   }
}
function normalizeNumber(value) {
   if (value === '' || value === null || value === undefined) return null
   const num = Number(value)
   return Number.isNaN(num) ? null : num
}
function handleCancel() {
@@ -259,9 +250,15 @@
      } else {
         await add(payload)
      }
      const actionText = dialogMode.value === 'add' ? (isAddChild.value ? '新增子项' : '新增') : '编辑'
      saveOperationLog({
         requestUri: route.path,
         title: `${route.name || '部门管理'}-${actionText}`,
         type: 1
      })
      ElMessage.success(dialogMode.value === 'add' ? '新增成功' : '更新成功')
      visible.value = false
      emit('success')
      emit('success', { parentId: formData.value.parentId || null, mode: dialogMode.value, isAddChild: isAddChild.value })
   } finally {
      submitting.value = false
   }
@@ -273,17 +270,20 @@
   const data = res?.data?.data ?? {}
   formData.value = {
      ...data,
      deptCategory: normalizeNumber(data.deptCategory),
      deptNature: normalizeNumber(data.deptNature),
      areaCode: getFullAreaCode(data.areaCode),
   }
}
function handleClosed() {
   formData.value = initForm()
   isAddChild.value = false
}
async function open({ mode, row, parent } = {}) {
   dialogMode.value = mode || 'add'
   visible.value = true
   isAddChild.value = mode === 'add' && !!parent?.id
   await getDeptTree().then(res => {
      if (deptTree) {
         deptTree.value = res?.data?.data ?? []