董国庆
2025-04-10 7ce7f36f2c74cd62b9d30e0756d455f276a2ee8f
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory
2个文件已修改
1个文件已添加
401 ■■■■ 已修改文件
src/router/index.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/deliveryAssessment/taskList/components/AssessmentDialog.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/deliveryAssessment/taskList/index.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js
@@ -327,6 +327,13 @@
                },
                component: () => import("../views/deliveryAssessment/projectTeamIntegral/detail.vue"),
            },
            {
                path: "taskList",
                meta: {
                    title: "课题列表",
                },
                component: () => import("../views/deliveryAssessment/taskList"),
            },
        ]
    }
];
src/views/deliveryAssessment/taskList/components/AssessmentDialog.vue
New file
@@ -0,0 +1,234 @@
<template>
    <el-dialog :visible.sync="dialogVisible" title="课题评定" width="70%" @close="handleClose">
        <el-form :model="form" inline label-position="top" :rules="rules" ref="formRef">
            <el-row :gutter="20">
                <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
                    <el-form-item label="报告编号" prop="reportNo" required>
                        <el-input v-model="form.reportNo" disabled placeholder="自动生成" />
                    </el-form-item>
                </el-col>
                <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
                    <el-form-item label="报告名称" prop="reportName">
                        <el-input v-model="form.reportName" placeholder="请输入" />
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
        <div class="content-box">
            <el-row :gutter="16">
                <el-col :xs="24" :sm="24" :md="6" :lg="6" :xl="6">
                    <div class="content-box-left">
                        <div class="content-box-left-th">设立课题规则</div>
                        <div class="content-box-left-body">
                            1、根据可研报告、产品构思设计的工艺研究路线,一条工艺路线设立一个课题。如果一个课题中有多个化合物需要开发研究,则每个化合物作为一个分题;分题归集到该课题中,最终形成课题报告。不同课题报告中的分题不能重复使用。
                            2、在可行研究阶段,工艺开发升级,重新规划工艺研究路线,则以新规划的工艺路线方案来设定课题</div>
                    </div>
                </el-col>
                <el-col style="margin-top: 5px;" :xs="24" :sm="24" :md="18" :lg="18" :xl="18">
                    <Table :total="0" :data="criteriaList" show-summary :summary-method="getSummaries"
                        :span-method="arraySpanMethod">
                        <el-table-column type="index" label="序号" width="80" />
                        <el-table-column prop="criteria" label="创新型课题标准" />
                        <el-table-column prop="fullScore" label="满分值" width="100" />
                        <el-table-column label="评定分值" prop="score" width="200">
                            <template #default="{ row }">
                                <el-input-number v-model="row.score" :min="0" :max="row.fullScore" :precision="1"
                                    :step="1" />
                            </template>
                        </el-table-column>
                        <el-table-column prop="rule" label="创新型课题报告评分规则">
                            <template>
                                <div>
                                    <div>1、各分项评满分,应满足以下四项要求:</div>
                                    <div>①分项内容:清晰、系统、完整,结构逻辑清晰,无缺项;</div>
                                    <div>②团队工作运行顺畅、计划时间高效。</div>
                                    <div>③工作结果完成度高。</div>
                                    <div>④课题文档报告完成度高。</div>
                                    <div>2、某分项工作完成,但出现以下三种错误中的1种,则减1分:</div>
                                    <div>①有缺项、漏项;</div>
                                    <div>②或不完整清晰;</div>
                                    <div>③或工作效率人为拖延。</div>
                                    <div>3、某分项工作基本完成,但出现三种错误中的2-3种,则减2分:</div>
                                    <div> ①有缺项、漏项;</div>
                                    <div>②或不完整清晰;</div>
                                    <div>③或工作效率人为拖延。</div>
                                    <div>4、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。</div>
                                </div>
                            </template>
                        </el-table-column>
                    </Table>
                </el-col>
            </el-row>
        </div>
        <template #footer>
            <span class="dialog-footer select-member-footer">
                <el-button type="primary" @click="handleSubmit">提交评定结果</el-button>
            </span>
        </template>
    </el-dialog>
</template>
<script>
export default {
    name: 'AssessmentDialog',
    props: {
        modelValue: {
            type: Boolean,
            default: false
        },
        reportData: {
            type: Object,
            default: () => ({})
        }
    },
    data() {
        return {
            dialogVisible: false,
            form: {
                reportNo: '',
                reportName: '',
            },
            rules: {
                reportName: [
                    { required: true, message: '请输入报告名称', trigger: 'blur' }
                ],
            },
            criteriaList: [
                {
                    criteria: '课题名称依准确性、报告内容完整性:研究目标是否完整、是否研究工作内容合理性、是否围绕目标展开开、是否具有逻辑性和条理性',
                    fullScore: 3,
                    score: 0,
                },
                {
                    criteria: '文献资料调查:全面性、系统性编辑逻辑顺畅,表达规范',
                    fullScore: 2,
                    score: 0,
                },
                {
                    criteria: '专业/技术路线与方法:合理性、可行性;实验设计科学、能完成研究目标、方法完整、完整、可靠;',
                    fullScore: 3,
                    score: 0,
                },
                {
                    criteria: '实验验证工作可行性强,团队工作调度支持实验设备、材料等条件的准备良好,时间计划合理,能效按时完成',
                    fullScore: 2,
                    score: 0,
                },
                {
                    criteria: '实验设计合理性:①对照设置,重复次数,样本量足够。②变量控制:自变量控制,因变量测量,干扰因素分析识别;确保结果的准确性③验证结果解释分析:符合科学原理、逻辑严密、不存在漏洞。具有实际应用价值,解决了实际问题或实现了研究目的。',
                    fullScore: 3,
                    score: 0,
                },
                {
                    criteria: '课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。',
                    fullScore: 2,
                    score: 0,
                }
            ]
        }
    },
    watch: {
        modelValue: {
            handler(val) {
                this.dialogVisible = val;
            },
            immediate: true
        },
        reportData: {
            handler(val) {
                if (val) {
                    this.form.reportNo = val.reportNo || '';
                    this.form.reportName = val.reportName || '';
                }
            },
            immediate: true
        }
    },
    methods: {
        handleClose() {
            this.$emit('update:modelValue', false);
        },
        async handleSubmit() {
            try {
                await this.$refs.formRef.validate();
                const totalScore = this.criteriaList.reduce((sum, item) => sum + (item.score || 0), 0);
                const assessmentData = {
                    ...this.form,
                    totalScore,
                    criteriaScores: this.criteriaList.map(item => ({
                        criteria: item.criteria,
                        score: item.score || 0
                    }))
                };
                this.$emit('submit', assessmentData);
                this.handleClose();
            } catch (error) {
                // 表单验证失败
            }
        },
        getSummaries(param) {
            const { columns, data } = param;
            const sums = [];
            columns.forEach((column, index) => {
                if (index === 0) {
                    sums[index] = '合计';
                    return;
                }
                const values = data.map(item => Number(item[column.property]));
                if (!values.every(value => isNaN(value))) {
                    sums[index] = values.reduce((prev, curr) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + curr;
                        } else {
                            return prev;
                        }
                    }, 0);
                    sums[index] += ' 分';
                } else {
                    sums[index] = '';
                }
            });
            return sums;
        },
        arraySpanMethod({ row, column, rowIndex, columnIndex }) {
            if (columnIndex === 4 && rowIndex == 0) {
                return {
                    rowspan: 6,
                    colspan: 1
                }
            } else if (rowIndex !== 0 && columnIndex === 4) {
                return [0, 0]
            }
        }
    }
}
</script>
<style lang="less" scoped>
.content-box {
    &-left {
        margin-top: 5px;
        display: flex;
        flex-direction: column;
        border: 1px solid #EBEEF5;
        border-radius: 8px 8px 0px 0px;
        font-size: 12px;
        &-th {
            line-height: 40px;
            background: #FAFAFA !important;
            color: #909399;
            padding: 0 10px;
            font-weight: bold;
        }
        &-body {
            flex: 1;
            padding: 0 10px;
            line-height: 23px;
        }
    }
}
</style>
src/views/deliveryAssessment/taskList/index.vue
@@ -5,15 +5,19 @@
            <template #search>
                <el-form :model="form" label-width="140px" inline>
                    <el-form-item label="项目组名称:">
                        <el-input v-model="form.name" placeholder="请输入"></el-input>
                        <el-input v-model="form.name" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="项目负责人:">
                        <el-input v-model="form.name" placeholder="请输入"></el-input>
                    <el-form-item label="课题类型:">
                        <el-input v-model="form.name" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="创建日期:">
                        <el-date-picker v-model="value1" type="daterange" range-separator="至" start-placeholder="开始日期"
                            end-placeholder="结束日期">
                        </el-date-picker>
                    <el-form-item label="课题名称:">
                        <el-input v-model="form.name" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="提交人:">
                        <el-input v-model="form.name" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="状态:">
                        <el-select v-model="form.name" placeholder="请选择" />
                    </el-form-item>
                    <el-form-item class="search-btn-box">
                        <el-button>重置</el-button>
@@ -22,88 +26,82 @@
                </el-form>
            </template>
            <template #setting>
                <el-button @click="handleAddProject" class="el-icon-plus" type="primary">
                    新增项目组</el-button>
                <div class="top-box-integral">
                    <div style="background-color:rgba(232, 250, 246, 1)" v-for="item in 3" :key="item"
                        class="top-box-integral-card">
                        <div class="top-box-integral-card-title">{{ ['课题合计数量', '待评定', '已评定'][item - 1] }}</div>
                        <div style="color:rgba(4, 156, 154, 1)" class="top-box-integral-card-num">99.9</div>
                    </div>
                </div>
                <div class="tip-warring">
                    <div>
                        【注意】每个课题交付评分标准:
                    </div>
                    <div>
                        1、课题由工程师/化验师设定,并清晰完整完成课题目标,评优秀3分;
                    </div>
                    <div>
                        2、课题由工程师/化验师设定,并清晰完整完成课题目标,评优秀3分;
                    </div>
                    <div>
                        3、课题由上级设定,工程师/化验师清晰完整完成课题目标,评正常2分;
                    </div>
                    <div>
                        4、课题由上级设定,工程师/化验师只能阐述课题内容,无法延伸工作思路,无开发思维的运行能力、创新能力,无法实现专题目标,评失误0分;
                    </div>
                </div>
            </template>
            <template #table>
                <el-table-column prop="name" label="项目组名称" />
                <el-table-column prop="age" label="项目负责人" />
                <el-table-column prop="age" label="项目组成员" />
                <el-table-column prop="age" label="项目创建时间" />
                <el-table-column prop="name" label="所属项目组" />
                <el-table-column prop="age" label="课题类型" />
                <el-table-column prop="age" label="报告编号" />
                <el-table-column prop="age" label="报告名称" />
                <el-table-column prop="age" label="提交人" />
                <el-table-column prop="age" label="评定结果" />
                <el-table-column prop="age" label="累积分值" />
                <el-table-column prop="age" label="评定时间" />
                <el-table-column prop="age" label="状态">
                    <template #default="{ row }">
                        <el-tag v-if="row.status == 1" type="success">正常运作</el-tag>
                        <el-tag v-else type="danger">已封存</el-tag>
                        <el-tag v-if="row.status == 1" type="success">已评定</el-tag>
                        <el-tag v-else type="danger">待评定</el-tag>
                    </template>
                </el-table-column>
                <el-table-column prop="age" label="操作">
                    <template #default="{ row }">
                        <el-button type="text" @click="handleChangeStatus(row, 1)">封存</el-button>
                        <el-button type="text" @click="handleChangeStatus(row, 0)">解封</el-button>
                        <el-button type="text">编辑</el-button>
                        <el-button type="text">详情</el-button>
                        <el-button type="text" @click="handleDel(row)">删除</el-button>
                        <el-button type="text">评定</el-button>
                    </template>
                </el-table-column>
            </template>
        </TableCustom>
        <ShowDelConfirm :show="showDelConfirm" @close="showDelConfirm = false" @confirm="handleDelConfirm" />
        <ShowDelConfirm :title="changeStatusTitle" :tip="changeStatusTip" :show="changeStatus"
            @close="changeStatus = false" @confirm="handleChangeStatusConfirm" />
        <AssessmentDialog :modelValue="assessmentVisible" :reportData="currentReport" @submit="handleAssessmentSubmit" />
    </div>
</template>
<script>
import AssessmentDialog from './components/AssessmentDialog.vue'
export default {
    name: 'ProjectList',
    components: {
        AssessmentDialog
    },
    data() {
        return {
            form: {
                name: ''
            },
            showDelConfirm: false,
            rowId: '',
            changeStatus: false,
            changeStatusTitle: '',
            changeStatusTip: '',
            tableData: [],
            queryForm: {
                pageSize: 10,
                pageNum: 1
            },
            total: 0
            total: 0,
            assessmentVisible: true,
            currentReport: null
        }
    },
    methods: {
        handleAddProject() {
            this.$router.push({
                path: '/projectList/addProject'
            })
        },
        handleDel(row) {
            this.rowId = row.id
            this.showDelConfirm = true
        },
        handleDelConfirm() {
            this.showDelConfirm = false
            this.msgsuccess('删除成功')
            this.rowId = ''
            this.getList()
        },
        handleChangeStatus(row, status) {
            this.rowId = row.id
            this.changeStatusTitle = status == 1 ? '确认要封存这个项目组吗?' : '确认要解封该项目组吗?'
            this.changeStatusTip = status == 1 ? '封存后项目组内人员看不到数据,审批人仍然可见数据。' : '解封后项目组内人员数据恢复。'
            this.changeStatus = true
        },
        handleChangeStatusConfirm() {
            this.changeStatus = false
            this.msgsuccess('操作成功')
            this.rowId = ''
            this.changeStatusTitle = ''
            this.changeStatusTip = ''
            this.getList()
        },
        handleCurrentChange(page) {
            this.queryForm.pageNum = page
            this.getList()
@@ -114,6 +112,17 @@
        },
        getList() {
        },
        handleDetail(row) {
            // 处理详情
        },
        handleAssessment(row) {
            this.currentReport = row;
            this.assessmentVisible = true;
        },
        handleAssessmentSubmit(data) {
            console.log('评定提交数据:', data);
            // 处理评定提交
        }
    }
}
@@ -123,4 +132,39 @@
.list {
    height: 100%;
}
.top-box-integral {
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 28px;
    &-card {
        flex: 1;
        background: #E8FAF6;
        box-shadow: 0px 10px 10px 0px rgba(0, 0, 0, 0.06);
        border-radius: 10px;
        padding: 21px 20px;
        &-title {
            font-family: 'SourceHanSansCN-Medium';
            font-size: 14px;
            color: rgba(0, 0, 0, 0.8);
        }
        &-num {
            font-family: 'SF Compact Display Black';
            text-align: center;
            font-weight: 900;
            font-size: 50px;
            color: #049C9A;
            line-height: 60px;
        }
    }
}
.tip-warring {
    margin-top: 20px;
    color: rgba(255, 73, 85, 1);
}
</style>