Ver Fonte

创建问卷页添加题型选项空值校验

lm há 1 mês atrás
pai
commit
cc5170a7d2

+ 15 - 0
src/assets/icon/AddIcon.vue

@@ -0,0 +1,15 @@
+<template>
+    <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+        <rect x="7" y="1" width="1.8" height="14" rx="0.9" 
+            fill="var(--icon-color)"/>
+        <rect x="15" y="7" width="1.8" height="14" rx="0.9" transform="rotate(90 15 7)"
+            fill="var(--icon-color)"/>
+    </svg>
+</template>
+
+
+<style lang="scss" scoped>
+svg{
+    --icon-color : #2E64FA;   
+}
+</style>

+ 24 - 0
src/components/questionConfig/QuestionConfig.vue

@@ -138,6 +138,7 @@ import { questionFormItemList } from './form'
 import {
     statisticQuestionType, scoredQuestionType
 } from './questionTypeList'
+import { ElMessage } from 'element-plus'
 
 type DisplayMode = 'scored' | 'statistic'
 
@@ -261,6 +262,29 @@ const HandleAddConfirm = async (params:any)=>{
     if (!formRef) return
     await formRef.validate(async(valid) => {
         if (valid) {
+            // 要判断添加的选项是否有没有填写完的
+            console.log('传递的表单数据---',formData)
+            if(formData?.options?.length > 0){
+                // 有选项
+                let isOptNameFinished = true
+                let isScoreFinished = true
+                formData?.options.map(opt=>{
+                    if(!opt.content){
+                        isOptNameFinished = false
+                    }
+                    if(props.displayMode === 'scored' && !(opt.score || opt.score === 0)){
+                        isScoreFinished = false
+                    }
+                })
+                if(!isOptNameFinished){
+                    ElMessage.warning('请确保选项内容不为空')
+                    return
+                }
+                if(!isScoreFinished){
+                     ElMessage.warning('请确保选项分值不为空')
+                    return
+                }
+            }
             emit('confirm', {formData:formData,formRef})
         }
     }).catch(err=>{

+ 2 - 1
src/components/questionnaireCard/QuestionnaireCard.vue

@@ -35,7 +35,8 @@
                     {{ typeNumToName(questionnaire.evaluationType).title }}
                 </span>
                 <!-- 状态文本:根据 cardStatus 动态变色 -->
-                <span :class="['status_text','icon_text', statusNumToName(questionnaire.cardStatus)?.themeClass ,'']">
+                <span :class="['status_text','icon_text', statusNumToName(questionnaire.cardStatus)?.themeClass ,'']"
+                    :style="{color:statusNumToName(questionnaire.cardStatus)?.iconColor}">
                     <RightCircle :style="{'--icon-color':statusNumToName(questionnaire.cardStatus)?.iconColor }" />
                     {{ statusNumToName(questionnaire.cardStatus)?.title  }}
                 </span>

+ 3 - 3
src/views/reviewManagement/stepComponent/evaluationDataComponent/EvaluationDataComponent.vue

@@ -76,7 +76,7 @@
                 <div class="tag_list">
                   <div class="tag_itm" v-for="tag in gradeOpt.subjectData" :key="tag">
                     {{ tag.name }}
-                    <component @click="HandleDeleteOpen(tag,'subject')" :is="deleteIcon" 
+                    <component @click="HandleDeleteOpen(tag,'subject')" :is="DeleteIcon" 
                         :style="{'--icon-color':'#2E64FA'}"></component>
                   </div>
 
@@ -99,7 +99,7 @@
                 <div class="tag_list">
                   <div class="tag_itm" v-for="tag in gradeOpt.selectSubjectData" :key="tag">
                     {{ tag.name }}
-                    <component @click="HandleDeleteOpen(tag,'selectedSubject')" :is="deleteIcon" 
+                    <component @click="HandleDeleteOpen(tag,'selectedSubject')" :is="DeleteIcon" 
                           :style="{'--icon-color':'#2E64FA'}"></component>
                   </div>
                   
@@ -263,7 +263,7 @@ import { ElMessage } from 'element-plus';
 import router from '@/router';
 
 import addIcon from '@/assets/icon/add.svg'
-import deleteIcon from '@/assets/icon/deleteIcon.vue'
+import DeleteIcon from '@/assets/icon/DeleteIcon.vue'
 
 interface subjectOrClassDataItm {
    id:string, 

+ 13 - 9
src/views/reviewManagement/stepComponent/numberMappingComponent/NumberMappingComponent.vue

@@ -259,6 +259,7 @@ const GetTeachingRelationshipData = async ()=>{
         })
         return {
           classCode:item.classCode,
+          detailType:item.detailType,
           ...classOpt
         }
       })
@@ -268,7 +269,12 @@ const GetTeachingRelationshipData = async ()=>{
 // 添加班级绑定编号
 const HandleAddClassBindCode = async (row, cell) => {
   if (!isConfigMode.value) return;
-  if (!selectedClassItm.value) return;
+  if (!selectedClassItm.value.id) return;
+  if (!row[cell]) {
+    row[cell] = [];
+  // 有数据则不再允许添加
+  }else if(row[cell]?.length > 0){ return }  
+
 
   let teacherMsg = { 
     id: selectedClassItm.value?.id, 
@@ -276,21 +282,19 @@ const HandleAddClassBindCode = async (row, cell) => {
     gradeName:selectedClassItm.value?.gradeName 
   }
 
-  // 行政班
-  if (!row[cell]) {
-    row[cell] = [];
-  }
-
   let params = {
     id: selectedClassItm.value?.id,   //班级id
     classCode: row.classCode,
     evaluationGradeId: cell,
     subjectId:searchParmams.value.subjectId,
-    type:searchParmams.value.type
+    type:searchParmams.value.type,
+    detailType:row.detailType,    //  0-个人中心班级编号,1-自定义的班级编号
   }
 
   let res = await setClassNumberMappingDataApi(params)
   if(res?.code == 200){
+    selectedClassItm.value = {}  //完成添加后,清空选中的班级
+
     ElMessage.success(res?.msg)
     row[cell].push({...teacherMsg,id:res?.data});
     await GetClassTableData()
@@ -310,14 +314,14 @@ const HandleRemoveCodeMappinClass = async (row, cell, index) => {
     await GetClassTableData()
   }
 };
-
 // 删除一行班级编号 及对应数据
 const HandleDeleteRowClassCode =async (row)=>{
   let params = {
     subjectId:searchParmams.value.subjectId,
     evaluationId: route.query.id,
     classCode: row.classCode,
-    type:searchParmams.value.type
+    type:searchParmams.value.type, 
+    detailType: row.detailType,   //  0-个人中心班级编号,1-自定义的班级编号
   }
 
   let res = await deleteRowClassNumberMappingDataApi(params)

+ 27 - 11
src/views/surveyManagement/CreateQuestionnaire.vue

@@ -41,7 +41,7 @@
                         <template v-for="typeItm in scoredQuestionType" :key="typeItm.value">
                             <el-button class="button_refresh"
                                      @click="CheckedQuestionType(typeItm.value)">
-                                <component :is="typeItm.icon" ></component>
+                                <component :is="typeItm.icon" class="img_icon" ></component>
                                  {{ typeItm.label }}
                             </el-button>
                         </template>
@@ -49,7 +49,7 @@
                 </div>
             </div>
 
-            <!-- 中间面板:编辑区域 -->
+            <!-- 中间面板:预览/操作区域 -->
             <div class="center_panel">
                 <div class="page_item questionnaire_base">
                     <QuestionnaireBaseForm 
@@ -89,7 +89,9 @@
                 <!-- 题目添加区域 -->
                  <div class=" add_question_area">
                     <div v-if="!selectedQuestionType" class="add_question">
-                        <div class="add_action">+ 点击左侧添加题型</div>
+                        <div class="add_action">
+                            <AddIcon :style="{'--icon-color':'#CCCCCC'}"></AddIcon>
+                            点击左侧添加题型</div>
                     </div>
                     <div   v-else class="question_itm_edit">
                         <QuestionConfig  
@@ -159,7 +161,7 @@ import { useHandleMoveUpAndDown } from '@/baseComponents/useHandleMoveUpAndDown'
 
 import QuestionTypeShow from '@/components/QuestionTypeShow.vue';
 import moveUpDownIcon from '@/assets/icon/move_up_down.png'
-
+import AddIcon from '@/assets/icon/AddIcon.vue'
 
 import {addQuestionnaireApi,editQuestionnaireApi, getQuestionnaireDetailApi} from '@/api/surveyManagement'
 
@@ -181,11 +183,11 @@ interface QuestionItm {
 }
 
 interface QuestionnaireInfo {
-    assessmentTitle:String,
-    assessmentIllustrate:String,
-    createdAt?:String,
-    teacherName?:String,
-    useStatus?:String | Number,
+    assessmentTitle:String, //问卷标题
+    assessmentIllustrate:String,  //问卷说明
+    createdAt?:String,   //创建时间
+    teacherName?:String,  //创建人
+    useStatus?:String | Number,  //使用状态
 
 }
 
@@ -404,6 +406,17 @@ const SaveQuestionnaire = async ()=>{
     await formRef.validate(async(valid) => {
         if (valid) {
             if(addedQuestionList.value.length > 0){
+                // 限40字
+                if(questionnaireInfo.value?.assessmentTitle?.length > 40){
+                    ElMessage.warning('问卷标题不得超过40字')
+                    return
+                }
+                // 限100字
+                if(questionnaireInfo.value?.assessmentIllustrate?.length > 100){
+                    ElMessage.warning('问卷说明不得超过100字')
+                    return
+                }
+
                 let questionData = addedQuestionList.value.map((item,index)=>{
                     return {
                         ...item, 
@@ -577,7 +590,7 @@ onMounted(async ()=>{
         if(route.query.id){
             await GetQuestionnaireDetail()
         }else{
-            // 创建问卷 状态
+            // 创建问卷 状态 ——  不执行操作
         }
     }
 })
@@ -735,9 +748,12 @@ onMounted(async ()=>{
                 align-items: center;
                 height: 240px;
                 .add_action {
-                    color: #c0c4cc;
+                    color: #cccccc;
                     font-size: 16px;
                     cursor: pointer;
+                    display: flex;
+                    align-items: center;
+                    gap:4px;
                 }
             }
             .question_itm_edit {