<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 style="margin-top: 5px;" :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
<Table :total="0" :height="null" :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" :step="1" />
|
</template>
|
</el-table-column>
|
<el-table-column label="创新型课题报告评分规则">
|
<template>
|
<div>
|
<div>1、规程型课题评定总分的满分为5分。</div>
|
<div>2、某分项工作完成,但出现以下三种错误中的1种,则减1分:</div>
|
<div>①有缺项、漏项;</div>
|
<div>②或不完整清晰;</div>
|
<div>③或工作效率人为拖延。</div>
|
<div>3、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。</div>
|
</div>
|
</template>
|
</el-table-column>
|
</Table>
|
</el-col>
|
</el-row>
|
</div>
|
<template #footer>
|
<span class="select-member-footer">
|
<el-button type="primary">提交评定结果</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: 1,
|
score: 0,
|
},
|
{
|
criteria: '专业/技术路线与方法:合理性、可行性;实验设计科学、能实现研究目标,方法先进、完整、可靠;',
|
fullScore: 2,
|
score: 0,
|
},
|
{
|
criteria: '课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。',
|
fullScore: 3,
|
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 {
|
padding: 0 10px;
|
line-height: 23px;
|
}
|
}
|
}
|
</style>
|