| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <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" |
| | |
| | | </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> |
| | |
| | | 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: '', |
| | | }) |
| | |
| | | const areaProps = { |
| | | label: 'title', |
| | | value: 'value', |
| | | emitPath: false, |
| | | emitPath: true, |
| | | checkStrictly: true, |
| | | lazy: true, |
| | | lazyLoad(node, resolve) { |
| | |
| | | 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 '查看' |
| | |
| | | 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) { |
| | |
| | | } |
| | | |
| | | 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() { |
| | |
| | | } 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 |
| | | } |
| | |
| | | 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 ?? [] |