From 0b269c539f53fda21dd786deb26e45882edeadd4 Mon Sep 17 00:00:00 2001
From: kongdeqiang <123456>
Date: 星期一, 23 三月 2026 11:39:18 +0800
Subject: [PATCH] fix: 更新系统

---
 src/layout/MainLayout.vue       |   16 +++++
 index.html                      |    2 
 src/router/index.js             |   12 ++++
 src/views/data/Excel.vue        |   77 ++++++++++++++++++++++++-
 src/views/system/Department.vue |   20 ++++--
 5 files changed, 117 insertions(+), 10 deletions(-)

diff --git a/index.html b/index.html
index 1d8dda7..d761b04 100644
--- a/index.html
+++ b/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>
diff --git a/src/layout/MainLayout.vue b/src/layout/MainLayout.vue
index db13252..4fc85ac 100644
--- a/src/layout/MainLayout.vue
+++ b/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>
diff --git a/src/router/index.js b/src/router/index.js
index 3086e3c..79639bf 100644
--- a/src/router/index.js
+++ b/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: '鍚勫崟浣嶆暟鎹粺璁�' }
       }
     ]
   }
diff --git a/src/views/data/Excel.vue b/src/views/data/Excel.vue
index d56d5fe..93cd808 100644
--- a/src/views/data/Excel.vue
+++ b/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>
diff --git a/src/views/system/Department.vue b/src/views/system/Department.vue
index d284ea4..a96e269 100644
--- a/src/views/system/Department.vue
+++ b/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 {

--
Gitblit v1.9.1