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