|
|
@@ -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>
|