提交 5fee6261 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 dba3278d
......@@ -141,7 +141,9 @@ function handleRatioChange(row: any, index: number) {
return result
}, 0)
// 最大可输入占比
row.ratio = Math.min(100 - otherTotal, row.ratio)
nextTick(() => {
row.ratio = Math.min(100 - otherTotal, row.ratio)
})
}
</script>
......@@ -259,7 +261,7 @@ function handleRatioChange(row: any, index: number) {
}
.total {
width: 100%;
padding: 10px 60px;
padding: 10px 90px;
text-align: right;
box-sizing: border-box;
p {
......
......@@ -71,3 +71,25 @@ export function experimentGroupAddStudent(data: { team_id: string; students_id:
export function getExperimentGroupStudentList(params: { team_id: string; page?: number; 'per-page'?: number }) {
return httpRequest.get('/api/resource/v1/backend/experiment/team-add-student', { params })
}
// 获取实验成绩规则
export function getExperimentGradeRule(params: { experiment_id: string }) {
return httpRequest.get('/api/resource/v1/backend/experiment-score-rule/detail', { params })
}
// 更新实验成绩规则
export function updateExperimentGradeRule(data: { experiment_id: string; is_show: string; rule_list: string }) {
return httpRequest.post('/api/resource/v1/backend/experiment-score-rule/save', data)
}
// 获取实验报告规则
export function getExperimentReportRule(params: { experiment_id: string }) {
return httpRequest.get('/api/resource/v1/backend/experiment-report/detail', { params })
}
// 更新实验报告规则
export function updateExperimentReportRule(data: {
experiment_id: string
report_upload_way: number
detail_list: string
}) {
return httpRequest.post('/api/resource/v1/backend/experiment-report/save', data)
}
......@@ -2,47 +2,86 @@
import type { FormInstance } from 'element-plus'
import type { ExperimentItem } from '../types'
import { Plus } from '@element-plus/icons-vue'
import { gradeRuleList } from '@/utils/dictionary'
import { ElMessage } from 'element-plus'
import { gradeRule, gradeRuleList } from '@/utils/dictionary'
import { getExperimentGradeRule, updateExperimentGradeRule } from '../api'
interface Props {
data: ExperimentItem
}
defineProps<Props>()
const props = defineProps<Props>()
defineEmits<{
const emit = defineEmits<{
(e: 'update'): void
(e: 'update:modelValue', visible: boolean): void
}>()
const formRef = $ref<FormInstance>()
const form = reactive<any>({
is_show: 1,
rule_list: [
{
id: '232',
name: '实验报告',
type: 1,
percent: 100,
rule_mode: 1
is_show: '1',
rule_list: [{ name: '实验报告', type: 1, percent: 100, rule_mode: 1 }]
})
function fetchInfo() {
getExperimentGradeRule({ experiment_id: props.data.id }).then(res => {
const { detail } = res.data
if (!detail.id) return
let ruleList = []
try {
ruleList = JSON.parse(detail.rule_list).map((item: any) => {
return { ...item, percent: parseFloat(item.percent) }
})
} catch (error) {
console.log(error)
}
]
Object.assign(form, detail, { rule_list: ruleList })
})
}
onMounted(() => {
fetchInfo()
})
// 合计
const total = $computed(() => {
return form.rule_list.reduce((result: number, item: any) => {
return result + (item.percent || 0)
}, 0)
})
// 添加
function handleAdd() {
form.rule_list.push({ id: '0', name: '', type: undefined, percent: 100, rule_mode: 1 })
form.rule_list.push({ name: '', type: undefined, percent: undefined, rule_mode: 1 })
}
// 删除
function handleRemove(index: number) {
form.rule_list.splice(index, 1)
}
// 提交
function handleSubmit() {
for (let i = 0; i < form.rule_list.length; i++) {
const item = form.rule_list[i]
if (!item.name || !item.type || !item.percent) {
ElMessage.error(`第${i + 1}行规则配置错误,请检查后重试`)
return
}
if (item.type === 5 && /实验报告|实验准备|实验结果|课堂活跃度/.test(item.name)) {
ElMessage.error(`第${i + 1}行规则配置错误,自定义的名称不能包含“实验报告”、“实验准备”、“实验结果”和“课堂活跃度”`)
return
}
}
if (total < 100) {
ElMessage.error('实验成绩规则项权重之和必须为100%!')
return
}
formRef?.validate().then(() => {
console.log(1)
const params = { experiment_id: props.data.id, ...form, rule_list: JSON.stringify(form.rule_list) }
updateExperimentGradeRule(params).then(() => {
ElMessage({ message: '保存成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
})
})
}
......@@ -53,6 +92,24 @@ function currentRuleNames(value: number) {
return item.value === value || item.value === 5 || !typeList.includes(item.value)
})
}
function handleTypeChange(row: any) {
if (row.type === 5) return
row.name = gradeRule[row.type]
}
// 占比改变
function handlePercentChange(row: any, index: number) {
const otherTotal = form.rule_list.reduce((result: number, item: any, i: number) => {
if (index !== i) {
result += item.percent || 0
}
return result
}, 0)
// 最大可输入占比
nextTick(() => {
row.percent = Math.min(100 - otherTotal, row.percent)
})
}
</script>
<template>
......@@ -65,8 +122,8 @@ function currentRuleNames(value: number) {
<el-form-item label="实验名称">{{ data?.name }}</el-form-item>
<el-form-item label="是否允许查看成绩明细" prop="is_show">
<el-radio-group v-model="form.is_show">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
<el-radio label="1"></el-radio>
<el-radio label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
......@@ -75,16 +132,23 @@ function currentRuleNames(value: number) {
<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">
<el-table-column prop="name" width="250">
<template #default="{ row }">
<el-input v-model="row.name" style="width: 100%" v-if="row.type === 5" />
<el-select v-model="row.type" :disabled="row.type === 1" style="width: 100%" v-else>
<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-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 }"><el-input-number v-model="row.percent" /> %</template>
<template #default="{ row, $index }">
<el-input-number v-model="row.percent" :min="0" @change="handlePercentChange(row, $index)" /> %
</template>
</el-table-column>
<el-table-column prop="rule_mode">
<template #default="{ row }">
......@@ -94,12 +158,15 @@ function currentRuleNames(value: number) {
</el-radio-group>
</template>
</el-table-column>
<el-table-column prop="rule_mode" align="center" width="90">
<template #default="{ $index }">
<el-button text type="primary" @click="handleRemove($index)">删除</el-button>
<el-table-column align="right" width="70">
<template #default="{ $index, row }">
<el-button text type="primary" @click="handleRemove($index)" v-if="row.type !== 1">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="total" v-if="form.rule_list.length">
<p>合计:{{ total }}%</p>
</div>
</el-form-item>
</el-form>
<el-row justify="center">
......@@ -108,3 +175,19 @@ function currentRuleNames(value: number) {
</el-row>
</el-dialog>
</template>
<style lang="scss" scoped>
.total {
width: 100%;
padding: 10px 250px;
box-sizing: border-box;
p {
margin-left: 16px;
display: inline-block;
min-width: 150px;
text-align: center;
color: #016fa0;
background-color: #ededed;
}
}
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论