- project view
-
+
+
+
+
+
+
+
+
+
+
+
+
项目名称
+
{{nowProject.ProjName}}
+
+
+
项目负责
+
{{nowProject.ProjCreateUserName}}
+
+
+
+
项目主要模板
+
{{nowProject.TempName}}
+
+
+
模板负责
+
{{nowProject.TempCreateUserName}}
+
+
+
创建时间
+
{{nowProject.ProjCreateTime}}
+
+
+
{{prop.PropertyName ? prop.PropertyName : '自定义字段'}}
+
{{prop.PropValue}}
+
+
+
+
+
+
+
+
+
+
工作负责人将有权管理“负责工作中的成员”,点击用户头像变更工作负责人。
+
+
+
+
+
+
+
+
+
模板负责
+
{{nowProject.TempCreateUserName}}
+
+
+
创建时间
+
{{nowProject.ProjCreateTime}}
+
+
+
工程名称
+
{{nowProject.ProjName}}
+
+
+
{{prop.PropertyName ? prop.PropertyName : '自定义字段'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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