| <template> | 
|     <div v-loading="state.loading"> | 
|         <div style="text-align: right"> | 
|             <div style="margin-right: 10px"><el-switch v-model="state.horizontal"></el-switch> 横向/纵向</div> | 
|         </div> | 
|         <div style="height: 500px"> | 
|             <vue3-tree-org | 
|                 :data="state.orgData" | 
|                 :props="{ id: 'id', pid: 'pid', label: 'name', expand: 'expand', children: 'children' }" | 
|                 :label-style="state.style" | 
|                 :default-expand-level="100" | 
|                 :horizontal="state.horizontal" | 
|                 :collapsable="state.collapsable" | 
|                 :only-one-node="state.onlyOneNode" | 
|                 :clone-node-drag="state.cloneNodeDrag" | 
|                 :node-draggable="state.nodeDraggable" | 
|                 style="background-color: var(--el-bg-color)" | 
|             > | 
|                 <template v-slot="{ node }"> | 
|                     <div class="tree-org-node__text node-label"> | 
|                         <div class="node-title">{{ node.label }}</div> | 
|                         <div class="node-id">编码:{{ node.id }}</div> | 
|                     </div> | 
|                 </template> | 
|                 <template v-slot:expand="{ node }"> | 
|                     <div>{{ node.children.length }}</div> | 
|                 </template> | 
|             </vue3-tree-org> | 
|         </div> | 
|     </div> | 
| </template> | 
|   | 
| <script lang="ts" setup name="orgTree"> | 
| import { onMounted, reactive } from 'vue'; | 
| import { storeToRefs } from 'pinia'; | 
| import { useUserInfo } from '/@/stores/userInfo'; | 
|   | 
| import { getAPI } from '/@/utils/axios-utils'; | 
| import { SysOrgApi } from '/@/api-services/api'; | 
|   | 
| const stores = useUserInfo(); | 
| const { userInfos } = storeToRefs(stores); | 
| const currentNodeStyle = { color: '#FFFFFF', background: '#3B3B3B' }; | 
| const state = reactive({ | 
|     loading: false, | 
|     orgData: [] as any, | 
|     horizontal: false, | 
|     collapsable: true, | 
|     onlyOneNode: false, | 
|     cloneNodeDrag: false, | 
|     nodeDraggable: false, | 
|     style: { | 
|         background: 'var(--el-color-primary)', //'#FF5C00', | 
|         color: '#FFFFFF', | 
|     }, | 
| }); | 
|   | 
| onMounted(async () => { | 
|     state.loading = true; | 
|     var res = await getAPI(SysOrgApi).apiSysOrgListGet(0); | 
|     var d = res.data.result ?? []; | 
|     state.orgData = d[0] ?? []; // 默认第一个树分支 | 
|     if (state.orgData.id == userInfos.value.orgId) state.orgData.style = currentNodeStyle; | 
|     else InitOrg(state.orgData.children, userInfos.value.orgId); | 
|     state.loading = false; | 
| }); | 
|   | 
| // 递归遍历 | 
| const InitOrg = (orgData: any, id: any) => { | 
|     if (orgData && orgData.length > 0) { | 
|         orgData.forEach(function (u: any) { | 
|             if (u.id == id) { | 
|                 u.style = currentNodeStyle; | 
|                 return; | 
|             } else { | 
|                 InitOrg(u.children, id); | 
|             } | 
|         }); | 
|     } | 
| }; | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| .tree-org-node__text { | 
|     // text-align: left; | 
|     font-size: 14px; | 
|     .node-title { | 
|         padding-bottom: 8px; | 
|         margin-bottom: 8px; | 
|         border-bottom: 1px solid currentColor; | 
|     } | 
|     .node-id { | 
|         font-size: 10px; | 
|     } | 
| } | 
| </style> |