| index.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/layout/MainLayout.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/router/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/data/Excel.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/system/Department.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
index.html
@@ -4,7 +4,7 @@ <meta charset="UTF-8"> <link rel="icon" type="image/svg+xml" href="/vite.svg"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>数据管理系统</title> <title>数据录入系统</title> </head> <body> <div id="app"></div> src/layout/MainLayout.vue
@@ -39,10 +39,26 @@ <el-icon><Upload /></el-icon> <span>数据管理</span> </template> <el-menu-item index="/data/unit-task"> <el-icon><List /></el-icon> <template #title>单位上传任务</template> </el-menu-item> <el-menu-item index="/data/excel"> <el-icon><Document /></el-icon> <template #title>单位数据上传</template> </el-menu-item> </el-sub-menu> <el-sub-menu index="statistics"> <template #title> <el-icon><DataAnalysis /></el-icon> <span>数据统计</span> </template> <el-menu-item index="/statistics/unit"> <el-icon><DataLine /></el-icon> <template #title>各单位数据统计</template> </el-menu-item> </el-sub-menu> </el-menu> </el-aside> src/router/index.js
@@ -36,6 +36,18 @@ name: 'Excel', component: () => import('@/views/data/Excel.vue'), meta: { title: 'Excel上传' } }, { path: 'data/unit-task', name: 'UnitTask', component: () => import('@/views/data/UnitTask.vue'), meta: { title: '单位上传任务' } }, { path: 'statistics/unit', name: 'UnitStatistics', component: () => import('@/views/statistics/UnitStatistics.vue'), meta: { title: '各单位数据统计' } } ] } src/views/data/Excel.vue
@@ -21,8 +21,21 @@ </template> <el-form :inline="true" :model="searchForm" class="search-form"> <el-form-item label="单位名称"> <el-input v-model="searchForm.unitName" placeholder="请输入单位名称" clearable /> <el-form-item label="单位"> <el-select v-model="searchForm.unitCode" placeholder="请选择单位" clearable filterable style="width: 250px" > <el-option v-for="dept in flatDepartmentList" :key="dept.deptCode" :label="`${dept.deptCode} - ${dept.deptName}`" :value="dept.deptCode" /> </el-select> </el-form-item> <el-form-item label="交易流水号"> <el-input v-model="searchForm.transactionNo" placeholder="请输入交易流水号" clearable /> @@ -195,8 +208,9 @@ </template> <script setup> import { ref, reactive, onMounted } from 'vue' import {ref, reactive, onMounted, computed} from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { getDepartmentTree } from '@/api/department' import { Plus, Edit, Delete, Search, Refresh, Upload, Download } from '@element-plus/icons-vue' import { getExcelPage, createExcel, updateExcel, deleteExcel, importExcel, downloadTemplate } from '@/api/excel' @@ -206,9 +220,11 @@ const dialogTitle = ref('') const formRef = ref(null) const uploadRef = ref(null) const departmentList = ref([]) const searchForm = reactive({ unitName: '', unitCode: '', transactionNo: '', accountingPeriod: '' }) @@ -243,6 +259,60 @@ const rules = { unitName: [{ required: true, message: '请输入单位名称', trigger: 'blur' }], transactionNo: [{ required: true, message: '请输入交易流水号', trigger: 'blur' }] } const flatDepartmentList = computed(() => { const flatten = (list) => { let result = [] list.forEach(item => { result.push(item) if (item.children && item.children.length > 0) { result = result.concat(flatten(item.children)) } }) return result } return flatten(departmentList.value) }) const fetchDepartmentList = async () => { try { const res = await getDepartmentTree() departmentList.value = buildTree(res.data) } catch (error) { console.error('获取部门列表失败:', error) } } const buildTree = (list) => { const map = {} const roots = [] list.forEach(item => { map[item.deptCode] = { ...item, children: [] } }) list.forEach(item => { const parent = map[item.parentCode] if (parent) { parent.children.push(map[item.deptCode]) } else { roots.push(map[item.deptCode]) } }) const cleanEmptyChildren = (nodes) => { nodes.forEach(node => { if (node.children && node.children.length === 0) { delete node.children } else { cleanEmptyChildren(node.children) } }) } cleanEmptyChildren(roots) return roots } const formatAmount = (amount) => { @@ -409,6 +479,7 @@ } onMounted(() => { fetchDepartmentList() fetchData() }) </script> src/views/system/Department.vue
@@ -51,9 +51,8 @@ <el-form-item label="部门名称" prop="deptName"> <el-input v-model="form.deptName" placeholder="请输入部门名称" /> </el-form-item> <el-form-item label="父级部门" prop="parentCode"> <el-select v-model="form.parentCode" placeholder="请选择父级部门" style="width: 100%"> <el-option label="顶级部门" value="0" /> <el-form-item label="上级部门" prop="parentCode"> <el-select v-model="form.parentCode" placeholder="请选择上级部门" style="width: 100%"> <el-option v-for="dept in flatDepartmentList" :key="dept.deptCode" @@ -84,7 +83,7 @@ </template> <script setup> import { ref, reactive, computed, onMounted } from 'vue' import {ref, reactive, computed, onMounted, nextTick} from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { Plus, Edit, Delete } from '@element-plus/icons-vue' import { getDepartmentTree, createDepartment, updateDepartment, deleteDepartment } from '@/api/department' @@ -121,7 +120,16 @@ }) return result } return flatten(tableData.value) const list = flatten(tableData.value) // 数据扁平化后,默认选中第一个部门的 deptCode nextTick(() => { if (list.length > 0) { form.parentCode = list[0].deptCode } }) return list }) const buildTree = (list) => { @@ -197,7 +205,7 @@ const handleSubmit = async () => { if (!formRef.value) return await formRef.value.validate(async (valid) => { if (valid) { try {