|
|
@@ -14,7 +14,7 @@ |
|
|
|
<div class="content-wrap" :class="{'set-content-wrap': isEnterEdit}"> |
|
|
|
<div class="graph-left-part" v-if="!isEnterEdit"></div> |
|
|
|
|
|
|
|
<div class="right-part" :class="{'set-right-part-width': isEnterEdit}" key="0"> |
|
|
|
<div class="right-part" :class="{'set-right-part-width': isEnterEdit}"> |
|
|
|
<!-- 开始页面 --> |
|
|
|
<div class="proj-desc" v-if="!isShowDistWorkPage"> |
|
|
|
<app-header class="set-header-position header-wrap" |
|
|
@@ -27,15 +27,15 @@ |
|
|
|
</app-header> |
|
|
|
<div class="proj-desc-wrap"> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">项目名称项目名称项目名称项目名称项目名称项目名称项目名称项目名称项目名称</div> |
|
|
|
<div class="item-value">项目名称项目名称项目名称项目名称项目名称项目名称项目名称项目名称项目名称</div> |
|
|
|
<div class="item-title">项目名称</div> |
|
|
|
<div class="item-value">{{nowProject.ProjName}}</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">项目负责:</div> |
|
|
|
<div class="item-value">11111</div> |
|
|
|
<div class="item-title">项目负责</div> |
|
|
|
<div class="item-value">{{nowProject.ProjCreateUserName}}</div> |
|
|
|
</div> |
|
|
|
<div class="item cover-container"> |
|
|
|
<div class="item-title">封面:</div> |
|
|
|
<div class="item-title">封面</div> |
|
|
|
<div class="item-value cover-img-wrap use-relative"> |
|
|
|
<div class=""> |
|
|
|
<img :src="coverSrc | resolveAvator" alt="" class="cover-img"/> |
|
|
@@ -48,28 +48,20 @@ |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">模板负责:</div> |
|
|
|
<div class="item-value"></div> |
|
|
|
<div class="item-title proj-main-template">项目主要模板</div> |
|
|
|
<div class="item-value">{{nowProject.TempName}}</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">创建时间:</div> |
|
|
|
<div class="item-value"></div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">工程名称:</div> |
|
|
|
<div class="item-value">11111</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">工程号:</div> |
|
|
|
<div class="item-value">11111</div> |
|
|
|
<div class="item-title">模板负责</div> |
|
|
|
<div class="item-value">{{nowProject.TempCreateUserName}}</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">规模:</div> |
|
|
|
<div class="item-value">11111</div> |
|
|
|
<div class="item-title">创建时间</div> |
|
|
|
<div class="item-value">{{nowProject.ProjCreateTime}}</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">地址:</div> |
|
|
|
<div class="item-value">11111</div> |
|
|
|
<div class="item" v-for="prop in listProjProp" :key="prop.TempPropId"> |
|
|
|
<div class="item-title">{{prop.PropertyName ? prop.PropertyName : '自定义字段'}}</div> |
|
|
|
<div class="item-value">{{prop.PropValue}}</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
@@ -79,7 +71,7 @@ |
|
|
|
class="set-header-position header-wrap" |
|
|
|
backBtnTitle="项目概况" theme="white" |
|
|
|
:onBackBtnClick="showProjDetailClick" |
|
|
|
title="templateDetail.TempName" :showUserCenter="false" :showBackBtn="true" |
|
|
|
:title="nowProject.TempName" :showUserCenter="false" :showBackBtn="true" |
|
|
|
/> |
|
|
|
<app-header v-else |
|
|
|
class="set-header-position header-wrap" |
|
|
@@ -111,7 +103,8 @@ |
|
|
|
|
|
|
|
<!-- 编辑状态下 可以切换负责人 --> |
|
|
|
<div class="use-relative ml-4 use-flex" v-if="isEnterEdit && isEditProjManager"> |
|
|
|
<temp-selected-user-list :selectedUserList="selectedUser" |
|
|
|
<temp-selected-user-list |
|
|
|
:selectedUserList="selectedUser" |
|
|
|
@changeManagerClick="changeManagerClick" |
|
|
|
@setFirstPeopleToManager="setFirstPeopleToManager"/> |
|
|
|
</div> |
|
|
@@ -138,31 +131,32 @@ |
|
|
|
<app-header class="set-header-position header-wrap" |
|
|
|
backBtnTitle="返回" theme="basis" |
|
|
|
:onBackBtnClick="returnToDistWorkClick" |
|
|
|
title="模板名称" :showUserCenter="false" :showBackBtn="true" |
|
|
|
:title="nowProject.TempName" :showUserCenter="false" :showBackBtn="true" |
|
|
|
/> |
|
|
|
<div class="summary-wrap"> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">模板负责</div> |
|
|
|
<div class="item-value"></div> |
|
|
|
<div class="item-value">{{nowProject.TempCreateUserName}}</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">创建时间</div> |
|
|
|
<div class="item-value">{{templateDetail.template.CreateTime}}</div> |
|
|
|
<div class="item-value">{{nowProject.ProjCreateTime}}</div> |
|
|
|
</div> |
|
|
|
<div class="item"> |
|
|
|
<div class="item-title">工程名称</div> |
|
|
|
<div class="item-value">1111</div> |
|
|
|
<div class="item-value">{{nowProject.ProjName}}</div> |
|
|
|
</div> |
|
|
|
<div v-for="pro in templateDetail.propertys" class="item" :key="pro.id"> |
|
|
|
<div class="item-title">{{pro.propertyName}}</div> |
|
|
|
<div class="item-value">1111</div> |
|
|
|
<div class="item" v-for="prop in listProjProp" :key="prop.TempPropId"> |
|
|
|
<div class="item-title">{{prop.PropertyName ? prop.PropertyName : '自定义字段'}}</div> |
|
|
|
<div class="item-value">{{prop.PropValue}}</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="personnel-list-part" v-if="isEnterEdit" |
|
|
|
:class="{'set-personnel-list-width': isEnterEdit}"> |
|
|
|
<personnel-list :listDept="[...listDept]" |
|
|
|
<personnel-list |
|
|
|
:listDept="[...listDept]" |
|
|
|
:handleCheckItemAll="handleCheckItemAll" |
|
|
|
:handleCheckedOne="handleCheckedOne"/> |
|
|
|
</div> |
|
|
@@ -183,11 +177,15 @@ |
|
|
|
import { fetchApi } from '@/utils/request'; |
|
|
|
import { firstCharToLowerCase, firstCharToUpperCase } from '@/utils/tool'; |
|
|
|
import { AssignedWork } from '@/services/project.js'; |
|
|
|
import { queryTemplateById } from '@/services/template.js'; |
|
|
|
import * as prjService from '@/services/project'; |
|
|
|
import dayjs from 'dayjs'; |
|
|
|
|
|
|
|
export default { |
|
|
|
data() { |
|
|
|
return { |
|
|
|
// 原先distwork的data数据 |
|
|
|
nowProject:{}, |
|
|
|
listProjProp: [], |
|
|
|
cnName: "", |
|
|
|
selectedUser: [], // 当前文件夹的已选协作人 |
|
|
|
selectedManageUser: [], // 当前文件夹的已选负责人 |
|
|
@@ -201,7 +199,6 @@ |
|
|
|
isShowStaffList: false, //显示项目负责人 |
|
|
|
opentree: true, //工作树三角 |
|
|
|
ischeckAll: false, //是否是全部选中 |
|
|
|
nowProject: {}, |
|
|
|
isShowPrjDesc: false, //分配项目--项目概况 |
|
|
|
isSlectPal: true, //分配项目--项目概况 |
|
|
|
|
|
|
@@ -212,7 +209,6 @@ |
|
|
|
isShowThreePage: false, |
|
|
|
InitData: {}, |
|
|
|
listNewFolder: [], |
|
|
|
listProjProp: [], |
|
|
|
listDept: [], |
|
|
|
curProjCreatePeop: [], |
|
|
|
currWorkName: "", |
|
|
@@ -232,7 +228,6 @@ |
|
|
|
userId:sessionStorage.userId, |
|
|
|
allChildrenLists:[], |
|
|
|
|
|
|
|
templateDetail: {},//模板详情信息 |
|
|
|
activeFolderEl: null, |
|
|
|
isShowTemplateSummary: false,//是否显示模板概况页面 |
|
|
|
isShowDistWorkPage: false,//是显示开始的项目概况还是进行工作指派 |
|
|
@@ -242,6 +237,7 @@ |
|
|
|
isEditProjManager: false,//是在编辑具有项目管理权限的负责人 还是在编辑节点的人员 |
|
|
|
activeFolderId: '',//点击进入编辑的节点id |
|
|
|
coverSrc:'/static/img/faceImg/face01.png', |
|
|
|
|
|
|
|
} |
|
|
|
}, |
|
|
|
components: { |
|
|
@@ -254,15 +250,12 @@ |
|
|
|
}, |
|
|
|
mounted() { |
|
|
|
this._getUserInfo(sessionStorage.userId); |
|
|
|
|
|
|
|
this.projInfo(sessionStorage.projId); |
|
|
|
this.cnName = JSON.parse(sessionStorage.user).cnName; |
|
|
|
|
|
|
|
// 加载项目详情 |
|
|
|
this.fetchProjectDetail(); |
|
|
|
|
|
|
|
// 加载模板详情 |
|
|
|
const res = queryTemplateById(sessionStorage.templateID); |
|
|
|
this.templateDetail = res.Data; |
|
|
|
// this.distWorkPartScrollEl = this.$refs.distworkpart; |
|
|
|
// if(this.distWorkPartScrollEl) { |
|
|
|
// this.distWorkPartScrollEl.addEventListener('scroll', this.watchDistWorkPartScroll); |
|
|
@@ -291,6 +284,19 @@ |
|
|
|
this.$bus.$off('setFirstPeopleToManager', this.setFirstPeopleToManager); |
|
|
|
}, |
|
|
|
methods: { |
|
|
|
//接收右边人员选中的人员 |
|
|
|
/** |
|
|
|
* 加载项目信息 |
|
|
|
*/ |
|
|
|
async projInfo(id){ |
|
|
|
const projectInfoRes= await prjService.QueryProjectInfoByProjId(id); |
|
|
|
this.nowProject=projectInfoRes.Data; |
|
|
|
this.nowProject.ProjCreateTime=dayjs(this.nowProject.ProjCreateTime).format('YYYY/MM/DD'); |
|
|
|
this.nowProject = {...this.nowProject}; |
|
|
|
this.listProjProp=projectInfoRes.Data.CustomProps; |
|
|
|
this.listProjProp = [...this.listProjProp]; |
|
|
|
this.coverSrc=projectInfoRes.Data.ShowImgUrl; |
|
|
|
}, |
|
|
|
coverUploadSuccess() { |
|
|
|
|
|
|
|
}, |
|
|
@@ -306,7 +312,7 @@ |
|
|
|
}, |
|
|
|
// 只有一个人的时候设置第一个人为负责人 |
|
|
|
setFirstPeopleToManager(user) { |
|
|
|
if(this.selectedManageUser.length == 0) { |
|
|
|
if(this.selectedManageUser.length == 0 && this.selectedUser.length !== 0) { |
|
|
|
this.selectedManageUser.push(user); |
|
|
|
} |
|
|
|
}, |
|
|
@@ -384,7 +390,7 @@ |
|
|
|
* 是否有权限可以删除自己 |
|
|
|
*/ |
|
|
|
isAllowedDelete(item) { |
|
|
|
return (!this.listManagerUser.includes(item) && this.currUser.id !== item.id && this.InitData.manageUser && this.InitData.manageUser.length > 0 && this.InitData.manageUser[0].id == sessionStorage.userId && !this.allChildrenLists.includes(this.InitData) && item.id == this.InitData.manageUser[0].id) |
|
|
|
return !(!this.listManagerUser.includes(item) && this.currUser.id !== item.id && this.InitData.manageUser && this.InitData.manageUser.length > 0 && this.InitData.manageUser[0].id == sessionStorage.userId && !this.allChildrenLists.includes(this.InitData) && item.id == this.InitData.manageUser[0].id) |
|
|
|
}, |
|
|
|
/** |
|
|
|
* 点击切换项目负责人 同一个用户点击两次可以切换状态 |
|
|
@@ -531,12 +537,11 @@ |
|
|
|
/** |
|
|
|
* 进入时,重置权限 |
|
|
|
*/ |
|
|
|
setFolderPerm: function (data) { |
|
|
|
setFolderPerm(data) { |
|
|
|
this.listDept=JSON.parse(JSON.stringify(this.currListDeptUserData)); |
|
|
|
for (var j = 0; j < this.listDept.length; j++) { |
|
|
|
for (var k = 0; k < this.listDept[j].listUser.length; k++) { |
|
|
|
// this.listDept[j].listUser[k].selected = false; |
|
|
|
this.$set(this.listDept[j].listUser[k], 'selected', false); |
|
|
|
this.listDept[j].listUser[k].selected = false; |
|
|
|
for (var i = 0; i < data.listUser.length; i++) { |
|
|
|
if ( |
|
|
|
this.listDept[j].listUser[k].id == data.listUser[i].id |
|
|
@@ -559,6 +564,7 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
this.getIsCheckAll(); |
|
|
|
console.log(111111111111111111111,this.listDept); |
|
|
|
}, |
|
|
|
|
|
|
|
/* |
|
|
@@ -623,20 +629,20 @@ |
|
|
|
/* |
|
|
|
*二级条目全选 |
|
|
|
* index: 是所在的部门的index |
|
|
|
* e:点击触发的事件 这里传递的e是个bool变量 |
|
|
|
* prevChecked 未更新前的选中状态 |
|
|
|
*/ |
|
|
|
handleCheckItemAll(index, e) { |
|
|
|
handleCheckItemAll(index, prevChecked) { |
|
|
|
for (var i = 0; i < this.listDept[index].listUser.length; i++) { |
|
|
|
if (e) { |
|
|
|
if (!prevChecked) {//修改为全选 |
|
|
|
if(this.listDept[index].listUser[i].id == this.currUser.id) { |
|
|
|
// 最后一个true是表示是通过全选按钮操作的 这样不输出不能删除项目创建者的提示语句 |
|
|
|
this.handleCheckedOne(index, this.listDept[index].listUser[i], false, true); |
|
|
|
} else { |
|
|
|
this.handleCheckedOne(index, this.listDept[index].listUser[i], false); |
|
|
|
} |
|
|
|
this.handleCheckedOne(index, this.listDept[index].listUser[i], e); |
|
|
|
} else { |
|
|
|
this.handleCheckedOne(index, this.listDept[index].listUser[i], e); |
|
|
|
this.handleCheckedOne(index, this.listDept[index].listUser[i], !prevChecked); |
|
|
|
} else {//修改为全不选 |
|
|
|
this.handleCheckedOne(index, this.listDept[index].listUser[i], !prevChecked); |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
@@ -644,10 +650,12 @@ |
|
|
|
*子项单选 |
|
|
|
* topIndex:当前所选条目的上级 部门的index |
|
|
|
*index:当前所选条目 |
|
|
|
* e:点击触发的事件 |
|
|
|
* prevChecked: 为更新前的选中状态 |
|
|
|
*/ |
|
|
|
handleCheckedOne(topIndex, user, e, flagThroughCheckAll = false) { |
|
|
|
if(this.isAllowedDelete(user)) |
|
|
|
handleCheckedOne(topIndex, user, prevChecked, flagThroughCheckAll = false) { |
|
|
|
debugger; |
|
|
|
|
|
|
|
if(!this.isAllowedDelete(user) && prevChecked) |
|
|
|
{ |
|
|
|
this.$notify.info({ |
|
|
|
message: "不能移除自己。", |
|
|
@@ -657,9 +665,9 @@ |
|
|
|
user.selected=true; |
|
|
|
return; |
|
|
|
} |
|
|
|
if(this.isEditProjManager) |
|
|
|
if(this.isEditProjManager) |
|
|
|
{ |
|
|
|
if(user.id == this.currUser.id && !e)//取消选中项目创建者 |
|
|
|
if(user.id == this.currUser.id && prevChecked)//取消选中项目创建者 |
|
|
|
{ |
|
|
|
if(flagThroughCheckAll) { |
|
|
|
// 如果是通过全选全不选触发的 如果是全选 就不输出下面语句 如果是全不选就输出下面语句 |
|
|
@@ -674,18 +682,30 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
//点击人员列表删除 |
|
|
|
if(user.folderPerm == 2 && !user.selected) |
|
|
|
if(user.folderPerm == 2 && prevChecked) |
|
|
|
{ |
|
|
|
this.removeManageUser(user); |
|
|
|
this.getIsCheckSecondLevel(topIndex); |
|
|
|
this.getIsCheckAll(); |
|
|
|
return; |
|
|
|
} |
|
|
|
// if(!prevChecked && !this.selectedUser.find(f => f.folderPerm == 2)) { |
|
|
|
// // 将第一个选中的人的权限修改为2 |
|
|
|
// } |
|
|
|
//三级change事件 |
|
|
|
if (e) { |
|
|
|
this.checkDeptUserName(e, user); //将选中的人员返回给添加合作人页面 |
|
|
|
user.folderPerm = 1; |
|
|
|
} else { |
|
|
|
this.checkDeptUserName(e, user); //将选中的人员返回给添加合作人页面 |
|
|
|
user.folderPerm = 0; |
|
|
|
} |
|
|
|
// if (e) { |
|
|
|
// this.checkDeptUserName(user); //将选中的人员返回给添加合作人页面 |
|
|
|
// user.folderPerm = 1; |
|
|
|
// } else { |
|
|
|
// this.checkDeptUserName(user); //将选中的人员返回给添加合作人页面 |
|
|
|
// user.folderPerm = 0; |
|
|
|
// } |
|
|
|
this.checkDeptUserName(user); |
|
|
|
user.folderPerm = 1; |
|
|
|
if(this.selectedUser.length == 1 && !prevChecked) { |
|
|
|
// 选中为负责人 |
|
|
|
user.folderPerm = 2; |
|
|
|
} |
|
|
|
this.getIsCheckSecondLevel(topIndex); |
|
|
|
this.getIsCheckAll(); |
|
|
|
}, |
|
|
@@ -740,6 +760,7 @@ |
|
|
|
* 移除选中人员 |
|
|
|
*/ |
|
|
|
removeSelectUser(item) { |
|
|
|
// debugger; |
|
|
|
if(item.id == this.currUser.id && !this.isShowManager) |
|
|
|
{ |
|
|
|
this.$notify.info({ |
|
|
@@ -760,7 +781,7 @@ |
|
|
|
} |
|
|
|
// 如果当前登录者是项目负责人分配的某个节点的负责人(不是项目负责人) 那么不能删除自己 |
|
|
|
// 自己指派自己是可以移除的 |
|
|
|
if(this.isAllowedDelete(item)) |
|
|
|
if(!this.isAllowedDelete(item)) |
|
|
|
{ |
|
|
|
this.$notify.info({ |
|
|
|
title: "温馨提示", |
|
|
@@ -783,7 +804,8 @@ |
|
|
|
/** |
|
|
|
* 移除负责人 |
|
|
|
*/ |
|
|
|
removeManageUser: function (user) { |
|
|
|
removeManageUser(user) { |
|
|
|
debugger; |
|
|
|
user.folderPerm = 0; |
|
|
|
// user.roleName = "查看编辑"; |
|
|
|
for (var k = 0; k < this.selectedUser.length; k++) { |
|
|
@@ -816,13 +838,25 @@ |
|
|
|
/** |
|
|
|
* 对已选协作人添加和删除 |
|
|
|
*/ |
|
|
|
checkDeptUserName(checked, item) { |
|
|
|
item.selected = checked; |
|
|
|
if (checked) { |
|
|
|
checkDeptUserName(item) { |
|
|
|
// debugger; |
|
|
|
item.selected = !item.selected; |
|
|
|
if (item.selected) { |
|
|
|
item.folderPerm = 1; // 默认角色为:查看和编辑 |
|
|
|
var valueUser = JSON.parse(JSON.stringify(item)); |
|
|
|
if(!this.selectedUser.find(user => user.id == item.id)) { |
|
|
|
this.selectedUser.push(valueUser); |
|
|
|
// if(this.selectedUser.length == 1) { |
|
|
|
// // 将刚才选中的人员在职员列表中的folderPerm设置为2 |
|
|
|
// for (var j = 0; j < this.listDept.length; j++) { |
|
|
|
// for (var k = 0; k < this.listDept[j].listUser.length; k++) { |
|
|
|
// if(this.listDept[j].listUser[k].id == valueUser.id) { |
|
|
|
// this.listDept[j].listUser[k].folderPerm = 2; |
|
|
|
// return; |
|
|
|
// } |
|
|
|
// } |
|
|
|
// } |
|
|
|
// } |
|
|
|
} |
|
|
|
} else { |
|
|
|
for (var i = 0; i < this.selectedUser.length; i++) { |
|
|
@@ -864,6 +898,7 @@ |
|
|
|
// console.log(item.listUser) |
|
|
|
item.listUser=item.listUser.sort((a, b) => a.cnName.localeCompare(b.cnName)) |
|
|
|
}) |
|
|
|
|
|
|
|
this.listDept = oList; |
|
|
|
this.currListDeptUserData = oList; |
|
|
|
|
|
|
@@ -1081,6 +1116,7 @@ |
|
|
|
/* 项目概况页面 */ |
|
|
|
background-color: rgba(252, 252, 252, 1); |
|
|
|
box-shadow: 0px 4px 10px 1px rgba(0, 0, 0, 0.1), 0px 1px 3px 0px rgba(0, 0, 0, 0.1); |
|
|
|
min-height: calc(100vh - 50px); |
|
|
|
|
|
|
|
.title { |
|
|
|
position: relative; |
|
|
@@ -1268,10 +1304,12 @@ |
|
|
|
.header-wrap .app-header-content { |
|
|
|
padding: 0 48px !important; |
|
|
|
} |
|
|
|
.proj-summary { |
|
|
|
.proj-detail { |
|
|
|
.app-header-center { |
|
|
|
font-size: 20px; |
|
|
|
} |
|
|
|
} |
|
|
|
.proj-summary { |
|
|
|
.back_title { |
|
|
|
color: rgba(12, 13, 16, 100); |
|
|
|
font-size: 15px; |
|
|
|