From f301b32d0203c6df35bd5075e20d2bc847dc36ed Mon Sep 17 00:00:00 2001 From: zhengzhou Date: Thu, 25 Feb 2021 22:41:51 +0800 Subject: [PATCH] update --- src/components/people-item/index.vue | 132 ++ .../project/components/members-picker.vue | 305 +++ .../main_web/project/components/members.vue | 33 - .../project/components/plain-folder-list.vue | 387 ++++ .../components/temp-selected-user-list.vue | 130 ++ src/views/main_web/project/index.vue | 1832 ++++++++++++++++- src/views/main_web/project/newProject.vue | 0 src/views/main_web/project/service.js | 102 + 8 files changed, 2876 insertions(+), 45 deletions(-) create mode 100644 src/components/people-item/index.vue create mode 100644 src/views/main_web/project/components/members-picker.vue delete mode 100644 src/views/main_web/project/components/members.vue create mode 100644 src/views/main_web/project/components/plain-folder-list.vue create mode 100644 src/views/main_web/project/components/temp-selected-user-list.vue delete mode 100644 src/views/main_web/project/newProject.vue create mode 100644 src/views/main_web/project/service.js diff --git a/src/components/people-item/index.vue b/src/components/people-item/index.vue new file mode 100644 index 00000000..676b1edd --- /dev/null +++ b/src/components/people-item/index.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/views/main_web/project/components/members-picker.vue b/src/views/main_web/project/components/members-picker.vue new file mode 100644 index 00000000..e9bfc6ac --- /dev/null +++ b/src/views/main_web/project/components/members-picker.vue @@ -0,0 +1,305 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/main_web/project/components/members.vue b/src/views/main_web/project/components/members.vue deleted file mode 100644 index 971f009c..00000000 --- a/src/views/main_web/project/components/members.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/views/main_web/project/components/plain-folder-list.vue b/src/views/main_web/project/components/plain-folder-list.vue new file mode 100644 index 00000000..f45d96f7 --- /dev/null +++ b/src/views/main_web/project/components/plain-folder-list.vue @@ -0,0 +1,387 @@ + + + + + + \ No newline at end of file diff --git a/src/views/main_web/project/components/temp-selected-user-list.vue b/src/views/main_web/project/components/temp-selected-user-list.vue new file mode 100644 index 00000000..1a1ce923 --- /dev/null +++ b/src/views/main_web/project/components/temp-selected-user-list.vue @@ -0,0 +1,130 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/main_web/project/index.vue b/src/views/main_web/project/index.vue index 7d2f3ca0..22f0a2f8 100644 --- a/src/views/main_web/project/index.vue +++ b/src/views/main_web/project/index.vue @@ -1,21 +1,1829 @@ + + + + + + \ No newline at end of file diff --git a/src/views/main_web/project/newProject.vue b/src/views/main_web/project/newProject.vue deleted file mode 100644 index e69de29b..00000000 diff --git a/src/views/main_web/project/service.js b/src/views/main_web/project/service.js new file mode 100644 index 00000000..954b6ce1 --- /dev/null +++ b/src/views/main_web/project/service.js @@ -0,0 +1,102 @@ +import { fetchApi, wrapErrorHint } from '@/utils/request'; +import { firstCharToLowerCase } from '@/utils/tool'; +import { fetchDeptList, getUserListByNode } from '@/services/user.js'; + +export async function fetchMemberTree(companyId) { + const [{ list: mainMemberList }, deptList, otherCompanyMemberListRes] = await Promise.all([ + getUserListByNode({ id: companyId, nodeType: 'company' }, 1, 10000), + fetchDeptList(companyId), + fetchApi('user/queryAllLinkCompanyRoleUserByCompanyId', { companyId }), + ]); + + const mainCompanyNode = new Node(companyId, '我的企业', null, 'company', {}); + const emptyDeptNode = new Node('emptyDeptNode', sessionStorage.CompanyName || '', companyId, 'dept', {}); + const nodeMap = { [emptyDeptNode.id]: emptyDeptNode }; + const memberMap = {}; + + deptList.forEach(dept => { + const deptNode = new Node(dept.id, dept.label, companyId, 'dept', dept.data); + nodeMap[deptNode.id] = deptNode; + mainCompanyNode.append(deptNode); + }); + mainMemberList.forEach((member) => { + const parentNode = nodeMap[member.deptId] || emptyDeptNode; + const memberNode = new Node(member.id, member.cnName, parentNode.id, 'user', member); + memberMap[memberNode.id] = memberNode; + parentNode.append(memberNode); + }); + + if(emptyDeptNode.hasChildren) { mainCompanyNode.append(emptyDeptNode); } + + const linkCompanyParentNode = new Node('linkCompanyParentNode', '互链企业', null, 'empty', {}); + const linkCompanyList = otherCompanyMemberListRes.Data || []; + linkCompanyList.forEach((data) => { + const { CompanyId, CompanyName, Users } = data; + const linkCompanyNode = new Node(CompanyId, CompanyName, linkCompanyParentNode.id, 'company', { companyId: CompanyId, companyName: CompanyName }); + Users.forEach(upperMember => { + const member = firstCharToLowerCase(upperMember); + const memberNode = new Node(member.id, member.cnName, linkCompanyNode.id, 'user', member); + memberMap[memberNode.id] = memberNode; + linkCompanyNode.append(memberNode); + }); + linkCompanyNode.sortChildren(); + nodeMap[linkCompanyNode.id] = linkCompanyNode; + linkCompanyParentNode.append(linkCompanyNode); + + }); + + const outputList = [mainCompanyNode]; + if(linkCompanyParentNode.hasChildren) { outputList.push(linkCompanyParentNode); } + // 排序 + mainCompanyNode.children?.forEach(deptNode=>{ + deptNode.sortChildren(); + }); + + return { + treeList: outputList, + memberMap, + } +} + + +// function plainTreeNodes(nodesList, userList, outputList = []) { +// (nodesList || []).forEach(node => { +// // node.id +// const data = node.data; +// data.listUser = userList.filter(user => user.deptId === node.id); +// outputList.push(data); +// if(node.children && node.children.length) { +// plainTreeNodes(node.children, userList, outputList); +// } +// }); +// return outputList; +// } + +const sortFunc = (nodeA, nodeB) => nodeA.label.localeCompare(nodeB.label); + +class Node { + // type: 'company' | 'dept' | 'user' | 'empty' + constructor(id, label, parentId, type, data) { + Object.assign(this, { id, label, parentId, type, data }); + } + append(childNode) { + if(!this.children) { this.children = []; } + this.children.push(childNode); + } + sortChildren(f = sortFunc) { + if(!this.hasChildren) { return this; } + this.children.sort(f); + return this; + } + mapChildren(f) { + if(!this.hasChildren) { return []; } + return this.children.map(f); + } + everyChildren(f) { + if(!this.hasChildren) { return false; } + return this.children.every(f); + } + get hasChildren() { + return this.children && !!this.children.length; + } +} \ No newline at end of file