|
@@ -0,0 +1,274 @@
|
|
|
|
+<template>
|
|
|
|
+ <el-form
|
|
|
|
+ ref="formRef"
|
|
|
|
+ :model="formModel"
|
|
|
|
+ :rules="formRules"
|
|
|
|
+ label-width="120px"
|
|
|
|
+ >
|
|
|
|
+ <el-form-item label="分组序号" prop="groupNo">
|
|
|
|
+ <el-input-number
|
|
|
|
+ v-model="formModel.groupNo"
|
|
|
|
+ :min="1"
|
|
|
|
+ :max="99"
|
|
|
|
+ :step="1"
|
|
|
|
+ :precision="0"
|
|
|
|
+ :controls="false"
|
|
|
|
+ step-strictly
|
|
|
|
+ placeholder="请输入"
|
|
|
|
+ :readonly="isEdit || isReset"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <el-form-item v-if="isEdit" label="名称">
|
|
|
|
+ <el-input v-model="formModel.name" :readonly="isEdit"></el-input>
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <el-form-item label="图片显示">
|
|
|
|
+ <el-button type="primary" link @click="onSetMarkingArea">设置</el-button>
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <template v-if="isReset || isAdd">
|
|
|
|
+ <el-form-item label="双评">
|
|
|
|
+ <el-checkbox
|
|
|
|
+ v-model="formModel.doubleMarking"
|
|
|
|
+ @change="onDoubleMarkingChange"
|
|
|
|
+ ></el-checkbox>
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <template v-if="formModel.doubleMarking">
|
|
|
|
+ <el-form-item label="仲裁方式" prop="arbitrationType">
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="formModel.arbitrationType"
|
|
|
|
+ placeholder="请选择"
|
|
|
|
+ clearable
|
|
|
|
+ style="width: 200px"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="(val, key) in ARBITRATION_TYPE"
|
|
|
|
+ :key="key"
|
|
|
|
+ :label="val"
|
|
|
|
+ :value="key"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <el-form-item label="双评比例" prop="doubleMarkingRatio">
|
|
|
|
+ <el-input-number
|
|
|
|
+ v-model="formModel.doubleMarkingRatio"
|
|
|
|
+ :min="0"
|
|
|
|
+ :max="1"
|
|
|
|
+ :step="0.01"
|
|
|
|
+ :precision="2"
|
|
|
|
+ :controls="false"
|
|
|
|
+ step-strictly
|
|
|
|
+ placeholder="请输入"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <!-- 按组仲裁 阀值 -->
|
|
|
|
+ <el-form-item
|
|
|
|
+ v-if="formModel.arbitrationType === 'GROUP'"
|
|
|
|
+ label="仲裁阀值"
|
|
|
|
+ prop="arbitrationThreshold"
|
|
|
|
+ >
|
|
|
|
+ <el-input-number
|
|
|
|
+ v-model="formModel.arbitrationThreshold"
|
|
|
|
+ :min="0"
|
|
|
|
+ :max="9999"
|
|
|
|
+ :step="0.1"
|
|
|
|
+ :precision="1"
|
|
|
|
+ :controls="false"
|
|
|
|
+ step-strictly
|
|
|
|
+ placeholder="请输入"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <!-- 小题仲裁 阀值 -->
|
|
|
|
+ <template v-if="formModel.arbitrationType === 'QUESTION'">
|
|
|
|
+ <template
|
|
|
|
+ v-for="(question, qindex) in formModel.questions"
|
|
|
|
+ :key="`a${qindex}`"
|
|
|
|
+ >
|
|
|
|
+ <el-form-item
|
|
|
|
+ :label="`${question.bigQuestionNo}-${question.smallQuestionNo}仲裁阀值`"
|
|
|
|
+ :prop="'questions.' + qindex + '.arbitrationThreshold'"
|
|
|
|
+ :rules="{
|
|
|
|
+ required: true,
|
|
|
|
+ message: '请输入仲裁阀值',
|
|
|
|
+ trigger: 'change',
|
|
|
|
+ }"
|
|
|
|
+ >
|
|
|
|
+ <el-input-number
|
|
|
|
+ v-model="question.arbitrationThreshold"
|
|
|
|
+ :min="1"
|
|
|
|
+ :max="999"
|
|
|
|
+ :step="0.1"
|
|
|
|
+ :precision="1"
|
|
|
|
+ :controls="false"
|
|
|
|
+ step-strictly
|
|
|
|
+ placeholder="请输入"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
+ </template>
|
|
|
|
+
|
|
|
|
+ <el-form-item label="合分策略" prop="combinationStrategy">
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="formModel.combinationStrategy"
|
|
|
|
+ placeholder="请选择"
|
|
|
|
+ clearable
|
|
|
|
+ style="width: 200px"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="(val, key) in COMBINE_SCORE_STRATEGY"
|
|
|
|
+ :key="key"
|
|
|
|
+ :label="val"
|
|
|
|
+ :value="key"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <el-form-item label="三评规则" prop="threeMarkingRule">
|
|
|
|
+ <el-select
|
|
|
|
+ v-model="formModel.threeMarkingRule"
|
|
|
|
+ placeholder="请选择"
|
|
|
|
+ clearable
|
|
|
|
+ style="width: 200px"
|
|
|
|
+ >
|
|
|
|
+ <el-option
|
|
|
|
+ v-for="(val, key) in THREE_EVALUATION_RULE"
|
|
|
|
+ :key="key"
|
|
|
|
+ :label="val"
|
|
|
|
+ :value="key"
|
|
|
|
+ />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
+
|
|
|
|
+ <el-form-item v-if="isReset" label="重要提示">
|
|
|
|
+ <el-alert
|
|
|
|
+ title="保存后分组关联所有评卷任务都将删除,并生成新的分组任务"
|
|
|
|
+ type="error"
|
|
|
|
+ effect="dark"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
+
|
|
|
|
+ <template v-if="isEdit && formModel.questions">
|
|
|
|
+ <template
|
|
|
|
+ v-for="(question, qindex) in formModel.questions"
|
|
|
|
+ :key="`i${qindex}`"
|
|
|
|
+ >
|
|
|
|
+ <el-form-item
|
|
|
|
+ :label="`${question.bigQuestionNo}-${question.smallQuestionNo}间隔分`"
|
|
|
|
+ :prop="'questions.' + qindex + '.intervalScore'"
|
|
|
|
+ :rules="{
|
|
|
|
+ required: true,
|
|
|
|
+ message: '请输入间隔分',
|
|
|
|
+ trigger: 'change',
|
|
|
|
+ }"
|
|
|
|
+ >
|
|
|
|
+ <el-input-number
|
|
|
|
+ v-model="question.intervalScore"
|
|
|
|
+ :min="1"
|
|
|
|
+ :max="999"
|
|
|
|
+ :step="0.1"
|
|
|
|
+ :precision="1"
|
|
|
|
+ :controls="false"
|
|
|
|
+ step-strictly
|
|
|
|
+ placeholder="请输入"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
+ </template>
|
|
|
|
+ </el-form>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script setup lang="ts">
|
|
|
|
+ import { ref, watch, onMounted, computed } from 'vue';
|
|
|
|
+ import type { FormInstance, FormRules } from 'element-plus';
|
|
|
|
+ import type { MarkGroupUpdateParams } from '@/api/types/mark';
|
|
|
|
+ import {
|
|
|
|
+ COMBINE_SCORE_STRATEGY,
|
|
|
|
+ ARBITRATION_TYPE,
|
|
|
|
+ THREE_EVALUATION_RULE,
|
|
|
|
+ } from '@/constants/enumerate';
|
|
|
|
+ import { deepCopy } from '@/utils/utils';
|
|
|
|
+
|
|
|
|
+ defineOptions({
|
|
|
|
+ name: 'GroupParamEdit',
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ interface Props {
|
|
|
|
+ modelValue: MarkGroupUpdateParams;
|
|
|
|
+ editType: 'add' | 'edit' | 'reset';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const props = defineProps<Props>();
|
|
|
|
+ const emit = defineEmits<{
|
|
|
|
+ 'update:modelValue': [value: MarkGroupUpdateParams];
|
|
|
|
+ }>();
|
|
|
|
+
|
|
|
|
+ const isEdit = computed(() => props.editType === 'edit');
|
|
|
|
+ const isReset = computed(() => props.editType === 'reset');
|
|
|
|
+ const isAdd = computed(() => props.editType === 'add');
|
|
|
|
+
|
|
|
|
+ const formRef = ref<FormInstance>();
|
|
|
|
+ const formModel = ref<MarkGroupUpdateParams>({ ...props.modelValue });
|
|
|
|
+
|
|
|
|
+ const formRules: FormRules<keyof MarkGroupUpdateParams> = {
|
|
|
|
+ groupNo: [{ required: true, message: '请输入分组序号', trigger: 'change' }],
|
|
|
|
+ name: [{ required: true, message: '请输入分组名称', trigger: 'change' }],
|
|
|
|
+ arbitrationType: [{ required: true, message: '请选择', trigger: 'change' }],
|
|
|
|
+ combinationStrategy: [
|
|
|
|
+ { required: true, message: '请选择', trigger: 'change' },
|
|
|
|
+ ],
|
|
|
|
+ threeMarkingRule: [
|
|
|
|
+ { required: true, message: '请选择', trigger: 'change' },
|
|
|
|
+ ],
|
|
|
|
+ doubleMarkingRatio: [
|
|
|
|
+ { required: true, message: '请输入', trigger: 'change' },
|
|
|
|
+ ],
|
|
|
|
+ arbitrationThreshold: [
|
|
|
|
+ { required: true, message: '请输入', trigger: 'change' },
|
|
|
|
+ ],
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ function onDoubleMarkingChange(val: boolean) {
|
|
|
|
+ if (!val) {
|
|
|
|
+ formModel.value.arbitrationType = 'GROUP';
|
|
|
|
+ formModel.value.combinationStrategy = 'AVG_SCORE';
|
|
|
|
+ formModel.value.threeMarkingRule = 'CLOSE';
|
|
|
|
+ formModel.value.doubleMarkingRatio = undefined;
|
|
|
|
+ formModel.value.arbitrationThreshold = undefined;
|
|
|
|
+ formModel.value.questions.forEach((item) => {
|
|
|
|
+ item.arbitrationThreshold = undefined;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function onSetMarkingArea() {
|
|
|
|
+ // TODO: 实现图片显示设置
|
|
|
|
+ console.log('onSetMarkingArea');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 监听表单数据变化,同步到父组件
|
|
|
|
+ watch(
|
|
|
|
+ formModel,
|
|
|
|
+ (newVal) => {
|
|
|
|
+ emit('update:modelValue', newVal);
|
|
|
|
+ },
|
|
|
|
+ { deep: true }
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ // 暴露验证方法
|
|
|
|
+ const validate = () => {
|
|
|
|
+ return formRef.value?.validate();
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ defineExpose({
|
|
|
|
+ validate,
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ onMounted(() => {
|
|
|
|
+ formModel.value = deepCopy(props.modelValue);
|
|
|
|
+ });
|
|
|
|
+</script>
|