zlwu 1 рік тому
батько
коміт
7dbfde3e50

+ 8 - 4
web/src/api/xskh/assessmentIndicator/types.ts

@@ -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;
 }
 
 /**

+ 3 - 3
web/src/views/xskh/assessmentApplication/AssessmentApplicationForm.vue

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

+ 92 - 61
web/src/views/xskh/assessmentIndicator/AssessmentIndicatorForm.vue

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

+ 1 - 1
web/src/views/xskh/assessmentIndicator/index.vue

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

+ 10 - 5
web/src/views/xskh/assessmentPlan/AssessmentPlanForm.vue

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

+ 2 - 0
web/src/views/xskh/assessmentSchedule/index.vue

@@ -182,6 +182,8 @@ const data = reactive<PageData<AssessmentScheduleFormType, XskhAssessmentSchedul
     academicYear: undefined,
     semester: undefined,
     status: undefined,
+    orderByColumn: 'createTime',
+    isAsc: 'desc',
     params: {}
   }
 });