Kaynağa Gözat

添加创建问卷时候的分值限制;修改临时添加数据时候的唯一id

lm 1 ay önce
ebeveyn
işleme
93f22e37d6

+ 36 - 3
src/components/questionConfig/QuestionConfig.vue

@@ -95,6 +95,8 @@
                         <div v-if="displayMode === 'scored'" class="score_option">
                             <span class="row_label">选项分值:</span>
                             <el-input 
+                                @change="(val)=>HandleInputNumberChange(val,option)"
+                                :step="0.01"
                                 type="number"
                                 v-model="option.score" 
                                 placeholder="请输入分值" 
@@ -145,7 +147,7 @@ type DisplayMode = 'scored' | 'statistic'
 interface Option {
     content: String
     score?: String
-    id?: Number
+    id?: Number | String
 }
 
 interface FormData {
@@ -201,6 +203,25 @@ const finalFormItemList = computed(() => {
         // 题目分值仅在 scored 模式显示
         if (item.key === 'questionScore') {
             newItem.hidden = props.displayMode !== 'scored'
+            newItem.rules = Number(questionFormData.value?.questionType)  === 3 ?
+            [
+                {required:true,message:'请填写信息', trigger:'blur' },
+                {
+                    // 允许整数或最多两位小数的数字
+                    pattern: /^\d+(\.\d{1,2})?$/,
+                    message: '请输入有效的数值,且最多保留两位小数',
+                    trigger: 'blur'
+                }
+            ] : (Number(questionFormData.value?.questionType)  === 5  ? [
+                    {required:true,message:'请填写信息', trigger:'blur' },
+                    {
+                        // 允许整数数字
+                        pattern: /^\d+$/,
+                        message: '请输入整数',
+                        trigger: 'blur'
+                    }
+                ] : [])
+
         }else if(item.key == 'options'){
             // 评价题  和 问答题 不展示 题目子选项配置
             newItem.hidden = [2,5].includes(Number(questionFormData.value.questionType))  
@@ -236,7 +257,14 @@ const scoreReviewTypeList = ref([
 
 
 
-
+//最多保留两位小数 
+const HandleInputNumberChange = (val,option)=>{
+    console.log('输入的值---',val)
+    if(String(val).split('.')[1]?.length > 2){
+        let splitArray =  String(val).split('.')
+        option.score = Number(splitArray[0] +'.' + splitArray[1].slice(0,2))
+    }
+}
 
 // 表单内部某些变化 触发 的操作
 const HandleFormItemChange = (params: any) => {
@@ -247,7 +275,12 @@ const HandleFormItemChange = (params: any) => {
 
 // 添加题目选项配置
 const addOption = () => {
-    questionFormData.value.options.push({ content: '', score: '',id:(Number(questionFormData.value.options[questionFormData.value.options.length - 1]?.id || 0) + 1) })
+    questionFormData.value.options.push({ 
+        content: '', score: '',
+        // 这个会有重复的可能 ——绑定时间 确保唯一
+         // 绑定时间戳,保证临时id唯一
+        id:`tmp_${new Date().getTime()}_${questionFormData.value.options.length + 1}`
+    })
 }
 // 删除题目选项配置
 const removeOption = (id: number) => {

+ 9 - 6
src/components/questionConfig/form.ts

@@ -26,11 +26,13 @@ export const questionFormItemList = ref([
         type: 'number',
         placeholder: '请输入分值',
         rules: [
-            {
-                required:true,
-                message:'请填写信息',
-                trigger:'blur'
-            }
+            {required:true,message:'请填写信息', trigger:'blur' },
+            // {
+            //     // 核心校验逻辑:允许整数或最多两位小数的数字
+            //     pattern: /^\d+(\.\d{1,2})?$/,
+            //     message: '请输入有效的数值,且最多保留两位小数',
+            //     trigger: 'blur'
+            // }
         ],
         style: {marginRight:'40px'},
         className: 'percent_30'
@@ -54,8 +56,9 @@ export const questionFormItemList = ref([
     },
 
     {
+        // 评价题字段(分制,0-数字制,1-星标制)
         key: 'evaluationType',
-        label: '分',
+        label: '分',
         type: 'radio',
         selectList: [],
         rules: [

+ 1 - 1
src/views/reviewManagement/stepComponent/parameterSettingComponent/ParameterSettingComponent.vue

@@ -197,7 +197,7 @@ const HandleInputNumberChange = (val)=>{
         defaultParamsConfigFormData.value.customLowScoreDeleteRatio = 100
     }else if(Number(val) < 0){
         defaultParamsConfigFormData.value.customLowScoreDeleteRatio = 0
-    }else if(String(val).split('.')[1].length > 2){
+    }else if(String(val).split('.')[1]?.length > 2){
         let splitArray =  String(val).split('.')
         defaultParamsConfigFormData.value.customLowScoreDeleteRatio = Number(splitArray[0] +'.' + splitArray[1].slice(0,2))
     }

+ 18 - 9
src/views/surveyManagement/CreateQuestionnaire.vue

@@ -236,9 +236,6 @@ const currentEditQuestionId = ref()
 const isSaveQuestionnaire = ref(true)
 
 
-// 单选/多选选项 临时唯一id索引从 4开始 _默认添加了四个选项
-const addedIndex = ref(4)
-
 // 选中题型时的处理  
 const CheckedQuestionType = (type:any) => {
     console.log('触发操作了',type)
@@ -366,9 +363,8 @@ const AddQuesiton = (params)=>{
         currentEditQuestionId.value = ''
     }else{
         // 新增试题
-        // 不能用最后一个id来添加
-        let id = addedIndex.value + 1
-        addedIndex.value += 1
+        // 绑定时间戳,保证临时id唯一
+        let id =`tmp_${new Date().getTime()}_${addedQuestionList.value.length + 1}`
         addedQuestionList.value.push({id ,...formData,options})
     }
     formRef.resetFields()
@@ -390,14 +386,21 @@ const EditQuestion = (row)=>{
     currentEditQuestionId.value = row.id  
     // 先后顺序不要反
     CheckedQuestionType(row.questionType)
+
     defaultQuestionData.value = {
-        ...row,
+        // 格式化一下,防止 obj值 修改过程中的错误引用,
+        ...(JSON.parse(JSON.stringify(row))),  
         questionType:String(row.questionType)
     }
 }
 
 // 保存试卷
 const SaveQuestionnaire = async ()=>{
+    if(selectedQuestionType.value){
+        ElMessage.warning('请先保存当前正在编辑的内容')
+        return
+    }
+
     let saveSuccess =  false
     // 试卷总表单
     let formRef = questionnaireBaseFormRef.value
@@ -419,7 +422,11 @@ const SaveQuestionnaire = async ()=>{
 
                 let questionData = addedQuestionList.value.map((item,index)=>{
                     return {
-                        ...item, 
+                        questionTitleName: item.questionTitleName,
+                        questionType: item.questionType,
+                        questionScore: item.questionScore,
+                        evaluationType: item.evaluationType,
+
                         questionAnswerType:item.extraConfig.includes('required') ? 1 : 0,  // 是否必答,0-否,1-是
                         questionSortRole:item.extraConfig.includes('isHorizontal') ? 1 : 0, // 0-竖排,1-横排
                         questionSortCode:index + 1,
@@ -434,7 +441,9 @@ const SaveQuestionnaire = async ()=>{
                 })
                  // 不带id的基础信息
                 let params = {
-                    ...(questionnaireInfo.value),
+                    assessmentTitle: questionnaireInfo.value.assessmentTitle,
+                    assessmentIllustrate: questionnaireInfo.value.assessmentIllustrate,
+
                     questionData:questionData,
                     assessmentScore:questionTotalScore.value
                 }