From e950c38ba82e5e6bc8b0c50c35e5dbb6a180165a Mon Sep 17 00:00:00 2001 From: 13404089107 <puwei@sinata.cn> Date: 星期二, 20 五月 2025 16:43:06 +0800 Subject: [PATCH] Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory --- culture/src/views/projectList/editProject.vue | 285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 285 insertions(+), 0 deletions(-) diff --git a/culture/src/views/projectList/editProject.vue b/culture/src/views/projectList/editProject.vue new file mode 100644 index 0000000..1ac2bd5 --- /dev/null +++ b/culture/src/views/projectList/editProject.vue @@ -0,0 +1,285 @@ +<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 3" :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 { getProjectDetail, editProject } from './service' +export default { + name: 'EddProject', + 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: '菌种工程师' }, + }, + ROLE_NAME_TO_TYPE: { + '菌种审批人': 1, + '菌种工程师': 2, + '菌种实验员': 3, + } + } + }, + created() { + getProjectDetail({ id: this.$route.query.id }).then(res => { + this.form = { + teamName: res.teamName, + personCharge: res.personCharge + } + this.selectMemberData = res.staffs.map(item => ({ + userId: Number(item.userId), + roleName: ['菌种审批人', '菌种工程师', '菌种实验员'][item.roleType - 1], + nickName: item.nickName + })) + }) + }, + methods: { + submitForm() { + this.$refs.form.validate((valid) => { + if (valid) { + if (this.selectMemberData.length == 0) { + this.$message.error('请选择项目组成员') + return + } + const data = { + id: this.$route.query.id, + teamName: this.form.teamName, + personCharge: this.form.personCharge, + staffs: this.selectMemberData.map(member => ({ + userId: member.userId, + roleType: this.ROLE_NAME_TO_TYPE[member.roleName] + })) + } + editProject(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 == '菌种实验员') + 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> \ No newline at end of file -- Gitblit v1.7.1