提交 87c3707c authored 作者: 王鹏飞's avatar 王鹏飞

chore: 新增理论考试规则在实验成绩规则

上级 7b162517
......@@ -167,3 +167,7 @@ export function updateExam(data: { experiment_id: string; exam_id: string }) {
export function deleteExam(data: { id: string }) {
return httpRequest.post('/api/resource/v1/backend/experiment/exam-delete', data)
}
// 获取实验下的所有理论考试
export function getScoreExamList(params: { experiment_id: string }) {
return httpRequest.get('/api/resource/v1/backend/experiment-score-rule/exams', { params })
}
......@@ -4,7 +4,7 @@ import type { ExperimentItem } from '../types'
import { Plus } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import { gradeRule, gradeRuleList } from '@/utils/dictionary'
import { getExperimentGradeRule, updateExperimentGradeRule } from '../api'
import { getExperimentGradeRule, updateExperimentGradeRule, getScoreExamList } from '../api'
interface Props {
data: ExperimentItem
......@@ -21,7 +21,9 @@ const formRef = $ref<FormInstance>()
const form = reactive<any>({
experiment_id: props.data.id,
is_show: '1',
rule_list: [{ name: '实验报告', type: 1, percent: 100, rule_mode: 1 }]
// rule_list: [{ name: '实验报告', type: 1, percent: 100, rule_mode: 1 }],
rule_list: [],
exam_rules: []
})
function fetchInfo() {
......@@ -39,15 +41,31 @@ function fetchInfo() {
Object.assign(form, detail, { rule_list: ruleList })
})
}
const examList = ref<any>([])
async function fetchExamList() {
const res = await getScoreExamList({ experiment_id: props.data.id })
const items = res.data.items || []
examList.value = items.map((item: any) => {
return { ...item, ...item.exam_info }
})
}
onMounted(() => {
fetchInfo()
fetchExamList()
})
// 合计
const total = $computed(() => {
return form.rule_list.reduce((result: number, item: any) => {
const examTotal = form.exam_rules.reduce((result: number, item: any) => {
return result + (item.percent || 0)
}, 0)
return (
form.rule_list.reduce((result: number, item: any) => {
return result + (item.percent || 0)
}, 0) + examTotal
)
})
// 添加
......@@ -60,10 +78,21 @@ function handleRemove(index: number) {
}
// 提交
function handleSubmit(call?: any) {
for (let i = 0; i < form.exam_rules.length; i++) {
const item = form.exam_rules[i]
if (!item.exam_id) {
ElMessage.error(`理论考试第${i + 1}行规则配置错误,请检查后重试`)
return
}
if (!item.percent) {
ElMessage.error(`理论考试权重不能为0!`)
return
}
}
for (let i = 0; i < form.rule_list.length; i++) {
const item = form.rule_list[i]
if (!item.name || !item.type) {
ElMessage.error(`第${i + 1}行规则配置错误,请检查后重试`)
ElMessage.error(`实操考试${i + 1}行规则配置错误,请检查后重试`)
return
}
if (!item.percent) {
......@@ -116,16 +145,22 @@ function handleTypeChange(row: any) {
row.name = gradeRule[row.type]
}
// 占比改变
function handlePercentChange(row: any, index: number) {
function handlePercentChange(row: any, index: number, type: number) {
const examTotal = form.exam_rules.reduce((result: number, item: any, i: number) => {
if (index !== i || type !== 2) {
result += item.percent || 0
}
return result
}, 0)
const otherTotal = form.rule_list.reduce((result: number, item: any, i: number) => {
if (index !== i) {
if (index !== i || type !== 1) {
result += item.percent || 0
}
return result
}, 0)
// 最大可输入占比
nextTick(() => {
row.percent = Math.min(100 - otherTotal, row.percent)
row.percent = Math.min(100 - otherTotal - examTotal, row.percent)
})
}
......@@ -142,15 +177,27 @@ const handleEdit = function (type: number) {
)
})
}
// 添加
function handleAddExamRule() {
form.exam_rules.push({ id: '', exam_id: '', percent: undefined, is_auto_scoring: 1 })
}
// 删除
function handleRemoveExamRule(index: number) {
form.exam_rules.splice(index, 1)
}
function handleExamChange(id: string, row: any) {
const exam = examList.value.find((item: any) => item.id === id)
if (!exam) return
row.id = exam.id
row.exam_id = exam.exam_id
}
</script>
<template>
<el-dialog
title="编辑实验成绩规则"
:close-on-click-modal="false"
width="800px"
@update:modelValue="$emit('update:modelValue')"
>
<el-dialog title="编辑实验成绩规则" :close-on-click-modal="false" width="800px" @update:modelValue="value => $emit('update:modelValue', value)">
<el-form ref="formRef" :model="form" label-suffix=":">
<el-form-item label="实验名称">{{ data?.name }}</el-form-item>
<el-row>
......@@ -166,30 +213,58 @@ const handleEdit = function (type: number) {
<el-form-item label="实验总成绩">{{ data?.score }}</el-form-item>
</el-col>
</el-row>
<el-form-item label="实验成绩规则"></el-form-item>
<el-divider></el-divider>
<el-form-item>
<el-row justify="space-between" style="width: 100%">
<p>实验成绩规则:</p>
<p>理论考试:</p>
<el-button type="primary" :icon="Plus" @click="handleAddExamRule" :disabled="form.exam_rules.length >= 1"> </el-button>
</el-row>
<el-table :data="form.exam_rules" row-key="id">
<el-table-column prop="name" width="170">
<template #default="{ row }">
<el-select :modelValue="row.id" style="width: 100%" @change="data => handleExamChange(data, row)">
<el-option v-for="item in examList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="percent" align="center" width="200">
<template #default="{ row, $index }"> <el-input-number v-model="row.percent" :min="0" @change="handlePercentChange(row, $index, 2)" /> % </template>
</el-table-column>
<el-table-column prop="is_auto_scoring" width="200">
<template #default="{ row }">
<el-radio-group v-model="row.is_auto_scoring" size="small">
<el-radio :label="1">自动评分</el-radio>
<!-- <el-radio :label="2">人工评分</el-radio> -->
</el-radio-group>
</template>
</el-table-column>
<el-table-column width="90">
<template #default="{ row }">满分:{{ 100 || rowScore(row.percent) }} </template>
</el-table-column>
<el-table-column align="right">
<template #default="{ $index, row }">
<el-button style="padding: 0" text type="primary" @click="handleRemoveExamRule($index)" v-if="row.type !== 1">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item>
<el-row justify="space-between" style="width: 100%">
<p>实操考试:</p>
<el-button type="primary" :icon="Plus" @click="handleAdd"></el-button>
</el-row>
<el-table :data="form.rule_list" row-key="id">
<el-table-column prop="name" width="170">
<template #default="{ row }">
<el-input v-model="row.name" :maxlength="20" style="width: 100%" v-if="row.type === 5" />
<el-select
v-model="row.type"
:disabled="row.type === 1"
style="width: 100%"
@change="handleTypeChange(row)"
v-else
>
<el-select v-model="row.type" :disabled="row.type === 1" style="width: 100%" @change="handleTypeChange(row)" v-else>
<el-option v-for="item in currentRuleNames(row.type)" :key="item.value" v-bind="item"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="percent" align="center" width="200">
<template #default="{ row, $index }">
<el-input-number v-model="row.percent" :min="0" @change="handlePercentChange(row, $index)" /> %
</template>
<template #default="{ row, $index }"> <el-input-number v-model="row.percent" :min="0" @change="handlePercentChange(row, $index, 1)" /> % </template>
</el-table-column>
<el-table-column prop="rule_mode" width="200">
<template #default="{ row }">
......@@ -207,18 +282,10 @@ const handleEdit = function (type: number) {
<template #default="{ $index, row }">
<div class="btn-box">
<!-- || row.type === 8 -->
<el-button
:disabled="row.type === 1"
style="padding: 0"
text
type="primary"
@click="handleEdit(row.type)"
v-if="row.type !== 1"
<el-button :disabled="row.type === 1" style="padding: 0" text type="primary" @click="handleEdit(row.type)" v-if="row.type !== 1"
>编辑</el-button
>
<el-button style="padding: 0" text type="primary" @click="handleRemove($index)" v-if="row.type !== 1"
>删除</el-button
>
<el-button style="padding: 0" text type="primary" @click="handleRemove($index)">删除</el-button>
</div>
</template>
</el-table-column>
......@@ -238,7 +305,7 @@ const handleEdit = function (type: number) {
<style lang="scss" scoped>
.total {
width: 100%;
padding: 10px 200px;
padding: 10px 170px;
box-sizing: border-box;
p {
margin-left: 16px;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论