<template>
|
<Card>
|
<template>
|
<el-form ref="form" :model="form" :rules="rules" inline label-position="top">
|
<el-form-item prop="teamName" label="项目组名称">
|
<el-input v-model="form.teamName" placeholder="请输入" />
|
</el-form-item>
|
<el-form-item prop="personCharge" label="项目组负责人">
|
<el-input v-model="form.personCharge" placeholder="请输入" />
|
</el-form-item>
|
</el-form>
|
<div class="header-title">
|
<div class="header-title-left">
|
<img src="@/assets/public/headercard.png" />
|
<div>项目组成员</div>
|
</div>
|
<el-button class="el-icon-plus" type="primary" @click="addMember"> 添加项目组成员</el-button>
|
</div>
|
<div class="member-list">
|
<div v-for="item in 4" :key="item" class="member-list-card">
|
<div class="member-item">
|
<div class="member-title">{{ ['审批人', '工艺工程师', '实验员', '化验师'][item - 1] }}</div>
|
<div :class="item == 1 || item == 2 ? 'member-name-box' : 'member-name-box-2'">
|
<el-tooltip v-for="i in memberList(item)" :key="i.userId" class="member-name" effect="dark"
|
:content="i.nickName" placement="top">
|
<span>{{ i.nickName }}</span>
|
</el-tooltip>
|
</div>
|
<div class="member-edit" v-if="memberList(item).length != 0" @click="editUserList">修改</div>
|
</div>
|
</div>
|
</div>
|
<div class="add-project-footer">
|
<el-button @click="submitForm" type="primary">保存</el-button>
|
</div>
|
</template>
|
<SelectMember ref="selectMember" @submit="selectUser" />
|
</Card>
|
</template>
|
|
<script>
|
import { addProject } from './service'
|
export default {
|
name: 'AddProject',
|
data() {
|
return {
|
form: {},
|
rules: {
|
teamName: [{ required: true, message: '请输入项目组名称', trigger: 'blur' }],
|
personCharge: [{ required: true, message: '请输入项目组描述', trigger: 'blur' }]
|
},
|
selectMemberData: [],
|
// 角色配置常量
|
ROLE_CONFIG: {
|
1: { key: 'approver', limit: 1, label: '审批人' },
|
2: { key: 'engineer', limit: 1, label: '工艺工程师' },
|
},
|
}
|
},
|
methods: {
|
submitForm() {
|
this.$refs.form.validate((valid) => {
|
if (valid) {
|
if (this.selectMemberData.length == 0) {
|
this.$message.error('请选择项目组成员')
|
return
|
}
|
const ROLE_NAME_TO_TYPE = {
|
'审批人': 2,
|
'工艺工程师': 3,
|
'实验员': 4,
|
'化验师': 5
|
};
|
const data = {
|
teamName: this.form.teamName,
|
personCharge: this.form.personCharge,
|
staffs: this.selectMemberData.map(member => ({
|
userId: member.userId,
|
roleType: ROLE_NAME_TO_TYPE[member.roleName]
|
}))
|
}
|
addProject(data).then(res => {
|
if (res.code == 200) {
|
this.$message.success('添加成功')
|
this.$router.push({ name: 'ProjectList' })
|
}
|
})
|
}
|
})
|
},
|
addMember() {
|
this.$refs.selectMember.open()
|
},
|
memberList(i) {
|
switch (i) {
|
case 1:
|
return this.selectMemberData.filter(item => item.roleName == '审批人')
|
case 2:
|
return this.selectMemberData.filter(item => item.roleName == '工艺工程师')
|
case 3:
|
return this.selectMemberData.filter(item => item.roleName == '实验员')
|
case 4:
|
return this.selectMemberData.filter(item => item.roleName == '化验师')
|
default:
|
break;
|
}
|
},
|
selectUser(data) {
|
for (const [roleId, config] of Object.entries(this.ROLE_CONFIG)) {
|
const members = data.filter(item => item.roleName === config.label);
|
if (members.length > config.limit) {
|
this.$message.error(`${config.label}最多只能选择${config.limit}个`);
|
return
|
}
|
}
|
this.selectMemberData = data;
|
this.$refs.selectMember.close();
|
},
|
editUserList() {
|
this.$refs.selectMember.open();
|
this.$nextTick(() => {
|
this.$refs.selectMember.setSelection(this.selectMemberData);
|
});
|
}
|
}
|
}
|
</script>
|
|
<style scoped lang="less">
|
.el-form--inline .el-form-item {
|
margin-right: 83px;
|
}
|
|
.header-title {
|
display: flex;
|
align-items: center;
|
flex-wrap: wrap;
|
gap: 13px;
|
|
.header-title-left {
|
display: flex;
|
align-items: center;
|
gap: 13px;
|
|
img {
|
width: 12px;
|
height: 19px;
|
}
|
|
div {
|
flex-shrink: 0;
|
font-weight: bold;
|
font-size: 18px;
|
color: #222222;
|
line-height: 27px;
|
font-family: 'Source Han Sans CN Bold Bold';
|
|
&:before {
|
content: '*';
|
color: #F56C6C;
|
margin-right: 4px;
|
}
|
}
|
}
|
}
|
|
.member-list {
|
margin-top: 18px;
|
display: flex;
|
flex-wrap: wrap;
|
gap: 28px;
|
|
.member-list-card {
|
position: relative;
|
width: 340px;
|
height: 400px;
|
border-radius: 8px;
|
border: 1px solid #DCDFE6;
|
|
&:nth-child(1) {
|
background: linear-gradient(to bottom, rgba(4, 156, 154, 0.2) 0%, rgba(5, 242, 194, 0) 70%);
|
}
|
|
&:nth-child(2) {
|
background: linear-gradient(to bottom, rgba(5, 160, 193, 0.2) 0%, rgba(5, 242, 194, 0) 70%);
|
}
|
|
&:nth-child(3) {
|
background: linear-gradient(to bottom, rgba(255, 77, 79, 0.20) 0%, rgba(255, 242, 194, 0) 70%);
|
}
|
|
&:nth-child(4) {
|
background: linear-gradient(to bottom, rgba(250, 199, 20, 0.21) 0%, rgba(255, 242, 194, 0) 70%);
|
}
|
|
.member-item {
|
height: 100%;
|
display: flex;
|
flex-direction: column;
|
|
.member-title {
|
margin-top: 20px;
|
width: 100%;
|
font-family: 'Source Han Sans CN Bold Bold';
|
font-weight: bold;
|
font-size: 16px;
|
color: rgba(0, 0, 0, 0.8);
|
line-height: 16px;
|
text-align: center;
|
}
|
|
.member-name-box {
|
flex: 1;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
|
}
|
|
.member-name-box-2 {
|
padding: 0 20px;
|
padding-top: 40px;
|
display: grid;
|
grid-template-columns: repeat(4, 1fr);
|
align-items: flex-start;
|
flex-wrap: wrap;
|
gap: 20px;
|
justify-content: center;
|
}
|
|
.member-name {
|
width: 60px;
|
height: 60px;
|
background: #7D8B79;
|
border-radius: 50%;
|
text-align: center;
|
line-height: 60px;
|
font-weight: 500;
|
font-size: 16px;
|
color: #FFFFFF;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
white-space: nowrap;
|
box-sizing: border-box;
|
}
|
|
.member-edit {
|
cursor: pointer;
|
position: absolute;
|
bottom: 10px;
|
left: 50%;
|
transform: translateX(-50%);
|
font-weight: 400;
|
font-size: 12px;
|
color: #FF4D4F;
|
line-height: 22px;
|
width: 40px;
|
background: #FFF1F0;
|
border-radius: 4px;
|
border: 1px solid #FFCCC7;
|
text-align: center;
|
}
|
}
|
}
|
}
|
|
.add-project-footer {
|
margin-top: 43px;
|
|
button {
|
width: 220px;
|
}
|
}
|
</style>
|