From dd2bdb18a8394d2f2a13534a98bcadb8020e3668 Mon Sep 17 00:00:00 2001
From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com>
Date: 星期三, 23 七月 2025 16:09:33 +0800
Subject: [PATCH] 修改新增

---
 src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue |  196 +++++++++++++++++++++++++++++++++----------------
 1 files changed, 132 insertions(+), 64 deletions(-)

diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue
index 7963c91..abb24d7 100644
--- a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue
+++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue
@@ -19,58 +19,85 @@
           <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
           <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
           <el-button type="primary" @click="initDistribute">生成职能分配表</el-button>
+          <el-button type="primary" @click="generateMap">生成组织机构图</el-button>
         </el-form-item>
       </el-form>
     </div>
     <!-- 表格数据 -->
-    <el-table v-loading="loading" :data="dataList" border>
-      <el-table-column label="序号" type="index" align="center" width="80" />
-      <el-table-column label="部门名称" prop="deptName" align="center"  />
-      <el-table-column label="负责人" prop="leaderName" align="center" />
-      <el-table-column label="主要负责部门" prop="parentName" align="center">
+    <el-table v-loading="loading" :data="dataList" border row-key="deptId" :default-expand-all="true" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
+      <el-table-column label="组织机构名称" prop="deptName" align="center" width="220"/>
+      <el-table-column label="排序" prop="orderNum" align="center" width="60"/>
+      <el-table-column label="负责人" prop="leaderName" align="center" width="80"/>
+<!--      <el-table-column label="主要负责部门" prop="parentName" align="center">-->
+<!--        <template #default="scope">-->
+<!--            <span>-->
+<!--              {{scope.row.sysDeptManageVoList?.map(i=>i.subDeptName).join('、')}}-->
+<!--            </span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+      <el-table-column label="部门涉及条款" prop="userTypeName" align="center">
         <template #default="scope">
-            <span>
-              {{scope.row.sysDeptManageVoList?.map(i=>i.subDeptName).join('、')}}
-            </span>
+              {{sortVersionNumbers(scope.row.caluseVO1List?.map(i=>i.clauseNum)).join('、')}}
         </template>
       </el-table-column>
-      <el-table-column label="部门涉及条款" prop="userTypeName" align="center" width="150">
-        <template #default="scope">
-            <span>
-              {{scope.row.caluseVO1List?.map(i=>i.clauseNum).join('、')}}
-            </span>
-        </template>
-      </el-table-column>
-      <el-table-column label="部门职责表" prop="userTypeName" align="center" width="150">
+      <el-table-column label="部门职责表" prop="userTypeName" align="center" width="140">
         <template #default="scope">
           <el-button link type="primary" @click="openDutyDialog(scope.row)">编辑</el-button>
           <el-button link type="danger" @click="download(scope.row)">导出</el-button>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+      <el-table-column label="操作" align="center" width="160">
         <template #default="scope">
           <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
+          <el-button link type="primary" @click="openDialog('add',scope.row)">新增</el-button>
           <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
 
-    <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-    />
+<!--    <pagination-->
+<!--        v-show="total > 0"-->
+<!--        :total="total"-->
+<!--        v-model:page="queryParams.pageNum"-->
+<!--        v-model:limit="queryParams.pageSize"-->
+<!--        @pagination="getList"-->
+<!--    />-->
     <depart-dialog ref="dialogRef" @getList=getList></depart-dialog>
     <duty-dialog ref="dutyDialogRef" @getList=getList></duty-dialog>
+    <el-dialog
+        v-model="dialogVisible"
+        title="组织机构图"
+        width="75%"
+        center
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <div class="deptTreeBox">
+        <vue3-tree-org
+            :data="deptList"
+            :horizontal="false"
+            :props="treeProps"
+            :toolBar="tools"
+            :label-style="labelStyle"
+            center
+        />
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
 import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
 import {ElMessage, ElMessageBox} from "element-plus";
-import {getDepart, delDepart, getCompany, getDeptInfo, initDistribution} from "@/api/orgStructure/depart";
+import {
+  getDepart,
+  delDepart,
+  getCompany,
+  getDeptInfo,
+  initDistribution,
+  getDepartByPage
+} from "@/api/orgStructure/depart";
 import departDialog from './components/departDialog.vue'
 import dutyDialog from './components/dutyDialog.vue'
 import {generateWordDocument} from "./components/exportWord.js";
@@ -82,27 +109,31 @@
 const dutyDialogRef = ref()
 const data = reactive({
   queryParams: {
-    pageNum: 1,
-    pageSize: 10,
     companyId: null
   },
   total: 0,
   dataList: [],
+  deptList: {
+    id: 0,
+    deptName: "",
+    children:[]
+  },
   companyList: [],
+  companyName: '',
   isAdmin: false,
-  firstFive: [
-    {clauseNum: '5.3',content: '组织的岗位、职责和权限'},
-    {clauseNum: '4.1',content: '理解组织及其环境'},
-    {clauseNum: '4.2',content: '理解相关方的需求和期望'},
-    {clauseNum: '6.1',content: '应对风险和机遇的措施'},
-    {clauseNum: '6.2',content: '质量目标及其实现的策划'}
-  ],
-  lastTwo: [
-    {clauseNum: '9.1',content: '监视、测量、分析和评价'},
-    {clauseNum: '10',content: '改进'}
-  ]
+  dialogVisible: false,
+  treeProps: {
+    label: 'deptName'
+  },
+  tools: {
+    scale: true, restore: true, expand: false, zoom: false, fullscreen: false
+  },
+  labelStyle: {
+    border: '1px solid #ccc',
+    background: 'rgba(0,0,0,0)'
+  }
 });
-const { queryParams, total, dataList, companyList, isAdmin } = toRefs(data);
+const { queryParams, total, dataList, companyList, isAdmin, dialogVisible, deptList, treeProps, tools, labelStyle } = toRefs(data);
 const userInfo = ref()
 onMounted(async ()=>{
   if(userStore.roles.includes('admin')){
@@ -119,12 +150,38 @@
 
 })
 
+const generateMap = async ()=>{
+  if(!data.queryParams.companyId){
+    ElMessage.warning('请先选择企业')
+  }else{
+    data.deptList.deptName = data.companyList?.find(i=>i.id == data.queryParams.companyId)?.name || userStore.companyName
+    const res = await getDepart(data.queryParams)
+    if(res.code == 200){
+      const list = proxy.handleTree(res.data, "deptId")
+      data.deptList.children = list
+    }else{
+      ElMessage.warning(res.message)
+    }
+    data.dialogVisible = true
+  }
+}
+
+const handleClose = ()=>{
+  data.deptList = {
+    id: 0,
+    deptName: "",
+    children:[]
+  }
+  data.dialogVisible = false
+}
+
 const getList = async () => {
   loading.value = true
   const res = await getDepart(data.queryParams)
   if(res.code == 200){
-    data.dataList = res.data || []
-    data.total = res.data.total
+    data.dataList = proxy.handleTree(res.data, "deptId")
+    data.deptList.children = data.dataList
+    // data.total = res.data.total
   }else{
     ElMessage.warning(res.message)
   }
@@ -132,6 +189,9 @@
 }
 
 const initDistribute = async ()=>{
+  if(!data.queryParams.companyId){
+    ElMessage.warning('请先选择要生成的企业')
+  }
   ElMessageBox.confirm(
       '重新生成将重置原有分配信息,是否继续?',
       '提示',
@@ -219,29 +279,16 @@
   if (res.code == 200) {
     if(res.data){
       tableData = res.data
-      if(res.data.sysDeptResponsibilitys && Array.isArray(res.data.sysDeptResponsibilitys) && res.data.sysDeptResponsibilitys.find(i=>i.clauseNum == '5.3')){
-        tableData.tableData = sortResponsibilities(res.data.sysDeptResponsibilitys.map(i=>{
-          return {
-            ...i,
-            leader: i.leader || '',
-            evidenceMaterials: i.evidenceMaterials || '',
-            managementDocuments: i.managementDocuments || '',
-            technicalDocuments: i.technicalDocuments || '',
-            existingRecords: i.existingRecords || '',
-          }
-        }))
-      }else{
-        tableData.tableData = [...data.firstFive,...res.data.sysDeptResponsibilitys,...data.lastTwo].map(i=>{
-          return {
-            ...i,
-            leader: i.leader || '',
-            evidenceMaterials: i.evidenceMaterials || '',
-            managementDocuments: i.managementDocuments || '',
-            technicalDocuments: i.technicalDocuments || '',
-            existingRecords: i.existingRecords || '',
-          }
-        })
-      }
+      tableData.tableData = res.data.sysDeptResponsibilitys.map(i=>{
+        return {
+          ...i,
+          leader: i.leader || '',
+          evidenceMaterials: i.evidenceMaterials || '',
+          managementDocuments: i.managementDocuments || '',
+          technicalDocuments: i.technicalDocuments || '',
+          existingRecords: i.existingRecords || '',
+        }
+      })
       return tableData
     }else{
       ElMessage.warning('暂无部门信息')
@@ -250,7 +297,22 @@
     ElMessage.warning(res.message)
   }
 }
+const sortVersionNumbers = (versions) => {
+  return versions.sort((a, b) => {
+    const partsA = a.split('.').map(Number);
+    const partsB = b.split('.').map(Number);
+    const maxLength = Math.max(partsA.length, partsB.length)
+    for (let i = 0; i < maxLength; i++) {
+      const numA = partsA[i] || 0
+      const numB = partsB[i] || 0
 
+      if (numA !== numB) {
+        return numA - numB
+      }
+    }
+    return 0
+  });
+}
 const sortResponsibilities = (list) => {
   // 提取firstFive和lastTwo的clauseNum作为排序依据
   const firstFiveClauses = data.firstFive.map(item => item.clauseNum)
@@ -289,3 +351,9 @@
 }
 
 </script>
+<style scoped lang="scss">
+.deptTreeBox{
+  width: 100%;
+  height: 800px;
+}
+</style>

--
Gitblit v1.9.2