提交代码

This commit is contained in:
zlwu committed 2025-09-09 13:11:40 +08:00
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: {}
}
});