提交代码
This commit is contained in:
1 parent
16559ba62f
commit
7dbfde3e50
6 files changed
+116
-74
No files matched your search
@@ -80,6 +80,10 @@ export interface XskhAssessmentIndicatorVo extends BaseEntity {
|
||||
disciplineTypeIds?: string[];
|
||||
/** 关联的奖励类型ID列表 */
|
||||
rewardTypeIds?: string[];
|
||||
/** 关联的违纪处分类型ID(单个值,用于前端表单) */
|
||||
disciplineTypeId?: string | number;
|
||||
/** 关联的奖励类型ID(单个值,用于前端表单) */
|
||||
rewardTypeId?: string | number;
|
||||
/** 创建者 */
|
||||
createBy?: string | number;
|
||||
/** 创建时间 */
|
||||
@@ -110,10 +114,10 @@ export interface XskhAssessmentIndicatorForm extends BaseEntity {
|
||||
status?: string;
|
||||
/** 排序号 */
|
||||
sortOrder?: number;
|
||||
/** 关联的违纪处分类型ID列表 */
|
||||
disciplineTypeIds?: string[];
|
||||
/** 关联的奖励类型ID列表 */
|
||||
rewardTypeIds?: string[];
|
||||
/** 关联的违纪处分类型ID */
|
||||
disciplineTypeId?: string | number;
|
||||
/** 关联的奖励类型ID */
|
||||
rewardTypeId?: string | number;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -85,14 +85,14 @@
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="指标编码" prop="indicatorCode" min-width="100" />
|
||||
<!-- <el-table-column label="指标编码" prop="indicatorCode" min-width="100" /> -->
|
||||
<el-table-column label="指标说明" prop="indicatorDescription" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column label="最高分值" prop="planMaxScore" min-width="80" />
|
||||
<!-- <el-table-column label="最高分值" prop="planMaxScore" min-width="80" /> -->
|
||||
<el-table-column label="自评得分" width="120">
|
||||
<template #header>
|
||||
<div class="column-header">
|
||||
<span>自评得分</span>
|
||||
<el-tooltip content="自评得分不能超过最高分值,且不能为负数" placement="top">
|
||||
<el-tooltip content="自评得分为学生在统计周期内的违纪和奖励分值,不包含附加分" placement="top">
|
||||
<el-icon class="header-icon"><QuestionFilled /></el-icon>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<!-- 隐藏最高分值字段 -->
|
||||
<el-col :span="12" v-show="false">
|
||||
<el-form-item label="最高分值" prop="maxScore">
|
||||
<el-input-number
|
||||
v-model="form.maxScore"
|
||||
@@ -68,52 +69,46 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 关联的违纪处分类型和奖励类型 -->
|
||||
<!-- 关联的违纪处分类型和奖励类型(改为单选且互斥) -->
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="违纪处分类型" prop="disciplineTypeIds">
|
||||
<el-form-item label="违纪处分类型" prop="disciplineTypeId">
|
||||
<el-select
|
||||
v-model="form.disciplineTypeIds"
|
||||
v-model="form.disciplineTypeId"
|
||||
placeholder="请选择违纪处分类型"
|
||||
multiple
|
||||
filterable
|
||||
clearable
|
||||
style="width: 100%"
|
||||
:disabled="dialog.title === '查看'"
|
||||
class="fixed-height-select"
|
||||
collapse-tags
|
||||
collapse-tags-tooltip
|
||||
@change="onDisciplineTypeChange"
|
||||
>
|
||||
<el-option v-for="type in disciplineTypeOptions" :key="type.id" :label="`${type.typeCode} - ${type.typeName}`" :value="type.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 显示选择的违纪处分类型 -->
|
||||
<div v-if="selectedDisciplineTypes.length > 0" class="selected-items">
|
||||
<div v-if="selectedDisciplineType" class="selected-items">
|
||||
<div class="selected-title">已选择的违纪处分类型:</div>
|
||||
<div v-for="type in selectedDisciplineTypes" :key="type.id" class="selected-item">{{ type.typeCode }} - {{ type.typeName }}</div>
|
||||
<div class="selected-item">{{ selectedDisciplineType.typeCode }} - {{ selectedDisciplineType.typeName }}</div>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="奖励类型" prop="rewardTypeIds">
|
||||
<el-form-item label="奖励类型" prop="rewardTypeId">
|
||||
<el-select
|
||||
v-model="form.rewardTypeIds"
|
||||
v-model="form.rewardTypeId"
|
||||
placeholder="请选择奖励类型"
|
||||
multiple
|
||||
filterable
|
||||
clearable
|
||||
style="width: 100%"
|
||||
:disabled="dialog.title === '查看'"
|
||||
class="fixed-height-select"
|
||||
collapse-tags
|
||||
collapse-tags-tooltip
|
||||
@change="onRewardTypeChange"
|
||||
>
|
||||
<el-option v-for="type in rewardTypeOptions" :key="type.id" :label="`${type.typeCode} - ${type.typeName}`" :value="type.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 显示选择的奖励类型 -->
|
||||
<div v-if="selectedRewardTypes.length > 0" class="selected-items">
|
||||
<div v-if="selectedRewardType" class="selected-items">
|
||||
<div class="selected-title">已选择的奖励类型:</div>
|
||||
<div v-for="type in selectedRewardTypes" :key="type.id" class="selected-item">{{ type.typeCode }} - {{ type.typeName }}</div>
|
||||
<div class="selected-item">{{ selectedRewardType.typeCode }} - {{ selectedRewardType.typeName }}</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@@ -158,11 +153,11 @@ const initFormData: XskhAssessmentIndicatorForm = {
|
||||
indicatorName: undefined,
|
||||
description: undefined,
|
||||
indicatorTypeId: undefined,
|
||||
maxScore: undefined,
|
||||
maxScore: 100, // 默认值设为100
|
||||
status: '0',
|
||||
sortOrder: 0,
|
||||
disciplineTypeIds: [],
|
||||
rewardTypeIds: []
|
||||
disciplineTypeId: undefined, // 改为单个值
|
||||
rewardTypeId: undefined // 改为单个值
|
||||
};
|
||||
|
||||
const data = reactive({
|
||||
@@ -181,22 +176,38 @@ const rules = reactive({
|
||||
{ min: 1, max: 100, message: '指标名称长度必须介于 1 和 100 之间', trigger: 'blur' }
|
||||
],
|
||||
indicatorTypeId: [{ required: true, message: '指标类型不能为空', trigger: 'change' }],
|
||||
maxScore: [{ required: true, message: '最高分值不能为空', trigger: 'blur' }],
|
||||
// maxScore: [{ required: true, message: '最高分值不能为空', trigger: 'blur' }],
|
||||
status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
|
||||
sortOrder: [{ required: true, message: '排序号不能为空', trigger: 'blur' }],
|
||||
description: [{ max: 500, message: '指标说明长度不能超过 500 个字符', trigger: 'blur' }]
|
||||
} as any);
|
||||
|
||||
// 计算属性:已选择的违纪处分类型
|
||||
const selectedDisciplineTypes = computed(() => {
|
||||
return disciplineTypeOptions.value.filter((type) => form.value.disciplineTypeIds?.includes(type.id.toString()));
|
||||
// 计算属性:已选择的违纪处分类型(改为单个)
|
||||
const selectedDisciplineType = computed(() => {
|
||||
return disciplineTypeOptions.value.find((type) => type.id.toString() === form.value.disciplineTypeId?.toString());
|
||||
});
|
||||
|
||||
// 计算属性:已选择的奖励类型
|
||||
const selectedRewardTypes = computed(() => {
|
||||
return rewardTypeOptions.value.filter((type) => form.value.rewardTypeIds?.includes(type.id.toString()));
|
||||
// 计算属性:已选择的奖励类型(改为单个)
|
||||
const selectedRewardType = computed(() => {
|
||||
return rewardTypeOptions.value.find((type) => type.id.toString() === form.value.rewardTypeId?.toString());
|
||||
});
|
||||
|
||||
// 违纪处分类型选择变化时的处理(实现互斥逻辑)
|
||||
const onDisciplineTypeChange = (value: any) => {
|
||||
if (value) {
|
||||
// 如果选择了违纪处分类型,清空奖励类型
|
||||
form.value.rewardTypeId = undefined;
|
||||
}
|
||||
};
|
||||
|
||||
// 奖励类型选择变化时的处理(实现互斥逻辑)
|
||||
const onRewardTypeChange = (value: any) => {
|
||||
if (value) {
|
||||
// 如果选择了奖励类型,清空违纪处分类型
|
||||
form.value.disciplineTypeId = undefined;
|
||||
}
|
||||
};
|
||||
|
||||
/** 获取指标类型选项 */
|
||||
const getIndicatorTypeOptions = async () => {
|
||||
try {
|
||||
@@ -270,7 +281,41 @@ const openDialog = async (id?: string | number, title?: string) => {
|
||||
if (id) {
|
||||
try {
|
||||
const res = await getAssessmentIndicator(id);
|
||||
Object.assign(form.value, res.data);
|
||||
console.log('API响应数据:', res);
|
||||
console.log('res.data:', res.data);
|
||||
|
||||
// 处理后端返回的数据,将数组格式转换为单个值格式
|
||||
const responseData = res.data;
|
||||
console.log('处理后的数据:', responseData);
|
||||
|
||||
// 创建表单数据对象,只包含表单需要的字段
|
||||
const formData: any = {
|
||||
id: responseData.id,
|
||||
indicatorCode: responseData.indicatorCode,
|
||||
indicatorName: responseData.indicatorName,
|
||||
description: responseData.description,
|
||||
indicatorTypeId: responseData.indicatorTypeId,
|
||||
maxScore: responseData.maxScore,
|
||||
status: responseData.status,
|
||||
sortOrder: responseData.sortOrder
|
||||
};
|
||||
|
||||
// 转换违纪处分类型ID(取第一个,因为前端现在只支持单选)
|
||||
if (responseData.disciplineTypeIds && responseData.disciplineTypeIds.length > 0) {
|
||||
formData.disciplineTypeId = responseData.disciplineTypeIds[0];
|
||||
}
|
||||
|
||||
// 转换奖励类型ID(取第一个,因为前端现在只支持单选)
|
||||
if (responseData.rewardTypeIds && responseData.rewardTypeIds.length > 0) {
|
||||
formData.rewardTypeId = responseData.rewardTypeIds[0];
|
||||
}
|
||||
|
||||
console.log('表单数据:', formData);
|
||||
console.log('赋值前的form.value:', form.value);
|
||||
|
||||
Object.assign(form.value, formData);
|
||||
|
||||
console.log('赋值后的form.value:', form.value);
|
||||
} catch (error) {
|
||||
console.error('获取数据失败:', error);
|
||||
}
|
||||
@@ -282,11 +327,27 @@ const submitForm = async () => {
|
||||
assessmentIndicatorFormRef.value?.validate(async (valid) => {
|
||||
if (valid) {
|
||||
try {
|
||||
// 按照XskhAssessmentIndicatorForm接口定义,只提取需要的字段
|
||||
const submitData: any = {
|
||||
indicatorCode: form.value.indicatorCode,
|
||||
indicatorName: form.value.indicatorName,
|
||||
description: form.value.description,
|
||||
indicatorTypeId: form.value.indicatorTypeId,
|
||||
maxScore: Number(form.value.maxScore) || 100,
|
||||
status: form.value.status,
|
||||
sortOrder: form.value.sortOrder,
|
||||
// 将单个ID转换为数组格式以兼容后端
|
||||
disciplineTypeIds: form.value.disciplineTypeId ? [form.value.disciplineTypeId] : [],
|
||||
rewardTypeIds: form.value.rewardTypeId ? [form.value.rewardTypeId] : []
|
||||
};
|
||||
|
||||
// 如果是编辑,添加ID字段
|
||||
if (form.value.id) {
|
||||
await updateAssessmentIndicator(form.value);
|
||||
submitData.id = form.value.id;
|
||||
await updateAssessmentIndicator(submitData);
|
||||
proxy?.$modal.msgSuccess('修改成功');
|
||||
} else {
|
||||
await addAssessmentIndicator(form.value);
|
||||
await addAssessmentIndicator(submitData);
|
||||
proxy?.$modal.msgSuccess('新增成功');
|
||||
}
|
||||
dialog.visible = false;
|
||||
@@ -331,34 +392,4 @@ defineExpose({
|
||||
color: #409eff;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* 固定多选框高度,防止动态变化 */
|
||||
.fixed-height-select :deep(.el-select__tags) {
|
||||
max-height: 32px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.fixed-height-select :deep(.el-select__tags-text) {
|
||||
max-width: 120px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.fixed-height-select :deep(.el-select__collapse-tags) {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* 确保多选框输入框高度固定 */
|
||||
.fixed-height-select :deep(.el-input__wrapper) {
|
||||
min-height: 32px;
|
||||
max-height: 32px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* 多选框下拉选项的最大高度 */
|
||||
.fixed-height-select :deep(.el-select-dropdown__list) {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
</style>
|
||||
@@ -62,7 +62,7 @@
|
||||
<el-table-column label="指标名称" align="center" prop="indicatorName" min-width="140" show-overflow-tooltip />
|
||||
<el-table-column label="指标类型" align="center" prop="indicatorTypeName" min-width="120" show-overflow-tooltip />
|
||||
<el-table-column label="指标说明" align="center" prop="description" min-width="200" show-overflow-tooltip />
|
||||
<el-table-column label="最高分值" align="center" prop="maxScore" min-width="100">
|
||||
<el-table-column label="最高分值" align="center" prop="maxScore" min-width="100" v-if="false">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.maxScore ? parseFloat(scope.row.maxScore).toFixed(2) : '0.00' }}</span>
|
||||
</template>
|
||||
|
||||
@@ -69,12 +69,12 @@
|
||||
<el-input v-model="scope.row.indicatorDescription" readonly />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="指标默认最高分值" min-width="150">
|
||||
<el-table-column label="指标默认最高分值" min-width="150" v-if="false">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.indicatorMaxScore" readonly />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="该方案中该指标最高分值" min-width="180">
|
||||
<el-table-column label="该方案中该指标最高分值" min-width="180" v-if="false">
|
||||
<template #default="scope">
|
||||
<el-input-number
|
||||
v-model="scope.row.maxScore"
|
||||
@@ -252,8 +252,8 @@ const openDialog = async (id?: string | number, title?: string) => {
|
||||
dialog.visible = true;
|
||||
dialog.title = title || '新增';
|
||||
|
||||
// 重置表单
|
||||
Object.assign(form.value, initFormData);
|
||||
// 重置表单数据
|
||||
form.value = { ...initFormData };
|
||||
indicatorList.value = [];
|
||||
|
||||
// 获取选项数据
|
||||
@@ -304,8 +304,13 @@ const submitForm = async () => {
|
||||
}
|
||||
|
||||
try {
|
||||
// 准备提交数据,排除自动填充字段
|
||||
const submitData = {
|
||||
...form.value,
|
||||
id: form.value.id,
|
||||
planCode: form.value.planCode,
|
||||
planName: form.value.planName,
|
||||
description: form.value.description,
|
||||
status: form.value.status,
|
||||
indicatorList: indicatorList.value
|
||||
};
|
||||
|
||||
|
||||
@@ -182,6 +182,8 @@ const data = reactive<PageData<AssessmentScheduleFormType, XskhAssessmentSchedul
|
||||
academicYear: undefined,
|
||||
semester: undefined,
|
||||
status: undefined,
|
||||
orderByColumn: 'createTime',
|
||||
isAsc: 'desc',
|
||||
params: {}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user