优化backend端相关功能

This commit is contained in:
2026-09-05 17:28:40 +08:00
parent 3d53f03246
commit 0f74abc5d4
25 changed files with 781 additions and 440 deletions
@@ -1,8 +1,8 @@
<template>
<div class="organization-container">
<el-row :gutter="16">
<!-- 左侧:组织架构树 -->
<el-col :span="8">
<!-- 组织架构树(仅展示结构,增/改/删在节点悬浮按钮上操作) -->
<el-col :span="24">
<el-card shadow="hover" class="tree-card" v-loading="loading">
<template #header>
<div class="card-header">
@@ -20,7 +20,6 @@
node-key="id"
default-expand-all
:expand-on-click-node="false"
@node-click="handleNodeClick"
>
<template #default="{ node, data }">
<div class="tree-node">
@@ -41,60 +40,6 @@
</el-tree>
</el-card>
</el-col>
<!-- 右侧:详情面板 -->
<el-col :span="16">
<el-card shadow="hover" class="detail-card">
<template #header>
<div class="card-header">
<span>{{ detailTitle }}</span>
</div>
</template>
<div v-if="selectedNode" class="detail-content">
<el-descriptions :column="2" border>
<el-descriptions-item label="组织名称">
{{ selectedNode.org_name }}
</el-descriptions-item>
<el-descriptions-item label="组织编码">
{{ selectedNode.org_code || '-' }}
</el-descriptions-item>
<el-descriptions-item label="上级组织">
{{ selectedNode.parent_name || '顶级组织' }}
</el-descriptions-item>
<el-descriptions-item label="负责人">
{{ selectedNode.leader_name || '-' }}
</el-descriptions-item>
<el-descriptions-item label="是否是公司">
<el-tag :type="selectedNode.is_company === 1 ? 'primary' : 'info'">
{{ selectedNode.is_company === 1 ? '是' : '否' }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="状态">
<el-tag :type="selectedNode.status === 1 ? 'success' : 'danger'">
{{ selectedNode.status === 1 ? '启用' : '禁用' }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">
{{ selectedNode.remark || '-' }}
</el-descriptions-item>
</el-descriptions>
<div class="detail-actions">
<el-button type="primary" @click="handleEdit(selectedNode)">
<el-icon><Edit /></el-icon>
编辑
</el-button>
<el-button type="danger" @click="handleDelete(selectedNode)">
<el-icon><Delete /></el-icon>
删除
</el-button>
</div>
</div>
<el-empty v-else description="请选择左侧组织节点查看详情" />
</el-card>
</el-col>
</el-row>
<!-- 添加/编辑对话框 -->
@@ -108,11 +53,11 @@
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import { ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus, Edit, Delete } from '@element-plus/icons-vue'
import OrganizationEdit from './components/edit.vue'
import { getOrganizationList, getOrganizationDetail, deleteOrganization } from '@/api/erp'
import { getOrganizationList, deleteOrganization } from '@/api/erp'
// 树形结构数据(与后台字段对应)
interface TreeNode {
@@ -142,7 +87,6 @@ const treeProps = {
const treeRef = ref()
const editRef = ref()
const selectedNode = ref<TreeNode | null>(null)
const loading = ref(false)
// 将扁平列表构建为树形结构
@@ -184,40 +128,6 @@ const buildTree = (list: any[]): TreeNode[] => {
return roots
}
// 获取组织机构详情
const loadOrganizationDetail = async (id: number) => {
try {
const res = await getOrganizationDetail(id)
if (res.code === 200) {
const data = res.data || null
if (data) {
selectedNode.value = {
id: data.id,
tid: data.tid,
org_name: data.org_name,
org_code: data.org_code,
parent_id: data.parent_id,
parent_name: data.parent_name,
leader_id: data.leader_id,
leader_name: data.leader_name,
is_company: data.is_company,
sort: data.sort,
status: data.status,
remark: data.remark,
children: []
}
} else {
selectedNode.value = null
}
} else {
ElMessage.error(res.msg || '获取组织机构详情失败')
}
} catch (error) {
console.error('获取组织机构详情失败:', error)
ElMessage.error('获取组织机构详情失败')
}
}
// 获取组织机构列表
const fetchOrganizationList = async () => {
loading.value = true
@@ -226,11 +136,6 @@ const fetchOrganizationList = async () => {
if (res.code === 200) {
const list = res.data || []
treeData.value = buildTree(list)
// 如果当前没有选中的节点且有数据,默认加载第一个节点详情
if (!selectedNode.value && list.length) {
await loadOrganizationDetail(list[0].id)
}
} else {
ElMessage.error(res.msg || '获取组织机构列表失败')
}
@@ -242,16 +147,6 @@ const fetchOrganizationList = async () => {
}
}
// 详情标题
const detailTitle = computed(() => {
return selectedNode.value ? `部门详情 - ${selectedNode.value.org_name}` : '部门详情'
})
// 点击节点,加载详情
const handleNodeClick = (data: TreeNode) => {
loadOrganizationDetail(data.id)
}
// 添加根节点
const handleAddRoot = () => {
editRef.value?.open(undefined, undefined)
@@ -336,23 +231,4 @@ onMounted(() => {
}
}
.detail-card {
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.detail-content {
.el-descriptions {
margin-bottom: 20px;
}
.detail-actions {
display: flex;
gap: 12px;
justify-content: flex-end;
}
}
}
</style>