lm 1 месяц назад
Родитель
Сommit
5ef729d5c3

+ 420 - 9
src/baseComponents/FormDialog.vue

@@ -9,6 +9,9 @@
       :close-on-click-modal="false"
       class="el_button"
     >
+
+    <slot name="form_pre"></slot>
+  
     <el-form 
         v-loading="formLoading"
         :inline="true"
@@ -24,7 +27,9 @@
         :prop="item.key"
         :rules="item.rules"
         :style="item.style"
-        :class="[item.className,{'top_label':(item.type=='textarea'||item.type=='checkbox'||item.type=='file' || item.custom === true || item.type=='noDragFile')}]"
+        :class="[item.className,{'top_label':(item.type=='textarea'||item.type=='checkbox'||item.type=='file' || 
+                                              item.custom === true || item.type=='noDragFile' || item.type=='imgFile' || 
+                                              item.type == 'fileShowList' || item.type=='radio')}]"
       >
         <template v-if="item.custom">
           <slot :name="item.key" :formItem="item"></slot>
@@ -77,6 +82,40 @@
                 />
             </el-select>
 
+            <el-select
+              class="multipleSelect"
+              v-else-if="item.type=='multipleSelectSearch'"
+              v-model="formData[item.key]"
+              filterable
+              multiple
+              @change="(val)=>handleSelectChange(item.key,val)"
+              :disabled="item.disabled" :placeholder="item.placeholder"
+            >
+              <el-option
+                v-for="selectItem in item.selectList"
+                :key="selectItem.value"
+                :label="selectItem.label"
+                :value="selectItem.value"
+                />
+            </el-select>
+
+             <el-select
+              class="multipleSelect"
+              v-else-if="item.type=='singleSelectSearch'"
+              v-model="formData[item.key]"
+              filterable
+              @change="(val)=>handleSelectChange(item.key,val)"
+              :disabled="item.disabled" :placeholder="item.placeholder"
+            >
+              <el-option
+                v-for="selectItem in item.selectList"
+                :key="selectItem.value"
+                :label="selectItem.label"
+                :value="selectItem.value"
+                />
+            </el-select>
+
+
             <template v-else-if="item.type == 'unionSelect'">
               <span style="display: flex;width: 100%;gap:20px">
                 <el-select v-for="unionSubItem in item.unionSelectList"
@@ -142,6 +181,20 @@
               size="default"
               :disabled="item.disabled"
             />
+
+            <el-date-picker
+              v-else-if="item.type=='datePickerNoRange'"
+              v-model="formData[item.key] "
+              type="date"
+              :range-separator="item.placeholder.rangeSeparator"
+              :start-placeholder="item.placeholder.startPlaceholder"
+              :end-placeholder="item.placeholder.endPlaceholder"
+              size="default"
+              :disabled="item.disabled"
+              :disabled-date="item.disabledDate"
+
+            />
+
             
             <el-date-picker
               v-else-if="item.type=='dateTimePicker'"
@@ -159,6 +212,16 @@
               :disabled-date="item.disabledDate"
             />
 
+            <el-date-picker
+              v-else-if="item.type=='dateTimePickerNoRange'"
+              v-model="formData[item.key]"
+              type="datetime"
+              :placeholder="item.placeholder"
+              :disabled="item.disabled"
+              style="width: 100%;"
+              @change="(val)=>handleSelectChange(item.key,val,item.type)"
+            />
+
             <el-upload
               v-else-if="item.type=='file'"
               class="upload-demo"
@@ -237,9 +300,22 @@
                 </template>
             </el-upload>
  
-            <template  v-else-if="item.type=='imgFile'" >
+            <!-- imgFile 原先的组件 -->
+            <template  v-else-if="0" >
               <div class="img_file_area">
-                 <span v-if="props.fileLoading" class="cover"  style="gap: 3px;line-height: 1.5;color:#2e64fa">
+                <el-upload 
+                  v-model:file-list="fileList"
+                  action="#" 
+                  :auto-upload="false"
+                  @change="(file)=>handleFileChange(file,item)"
+                  :on-preview="handlePictureCardPreview"
+                  :on-remove="handleRemove"
+                >
+                  <div class="operation_area">
+                    <i class="iconfont hjx-a-Folder-uploadwenjianjia-shangchuan"></i>
+                  </div>
+                </el-upload>
+                <span v-if="props.fileLoading" class="cover"  style="gap: 3px;line-height: 1.5;color:#2e64fa">
                   上传中
                   <el-icon class="is-loading">
                     <Loading />
@@ -249,6 +325,11 @@
                   <img class="cover"   :src="formData[item.key]?.url" alt="">
                   <img   class="close" @click="HandleRemove(item.key)" :src="closeFillImg">
                 </span>
+              </div>
+            </template>
+
+            <template  v-else-if="item.type=='imgFile'" >
+              <div class="img_file_area1">
                 <el-upload 
                   v-model:file-list="fileList"
                   action="#" 
@@ -258,15 +339,111 @@
                   :on-remove="handleRemove"
                 >
                   <div class="operation_area">
-                    <i class="iconfont hjx-a-Folder-uploadwenjianjia-shangchuan"></i>
+                    <el-icon class="icon"><Plus /></el-icon>
+                    <span>{{item.uploadTips ? item.uploadTips : '上传文件'}}</span>
                   </div>
                 </el-upload>
-              </div>
 
+                <span v-if="props.fileLoading" class="cover"  style="gap: 3px;line-height: 1.5;color:#2e64fa">
+                  上传中
+                  <el-icon class="is-loading">
+                    <Loading />
+                  </el-icon>
+                </span>
+
+                <!-- 单张 -->
+                <template  v-if="item.limit == 1 && !props.fileLoading">
+                  <span  class="img_file" v-if="formData[item.key]?.url">
+                    <img class="cover"   :src="formData[item.key]?.url" alt="">
+                    <img   class="close" @click="HandleRemove(item.key)" :src="closeFillImg">
+                  </span>
+                </template>
 
+                  <!-- 多张 -->
+                  <template v-else-if="item.limit > 1">
+                    <span  class="img_file" v-for="fileItm in formData[item.key]" :key="fileItm">
+                      <img class="cover"   :src="fileItm?.url" alt="">
+                      <div class="operation_btn">
+                        <span class="delete" @click="HandleRemoveSingleImg(item.key,fileItm)">删除</span>
+                        <span class="preview" @click="HandleImgPreview(fileItm?.url)">查看</span>
+                      </div>
+                    </span>
+                  </template>
+                  <el-image-viewer
+                    v-if="imgVisible"
+                    :url-list="[dialogImageUrl]"
+                    show-progress
+                    @close="imgVisible = false"
+                  />
+              </div>
             </template>
 
-            
+
+            <template  v-else-if="item.type=='fileShowList'" >
+              <div class="file_show_list">
+                <el-upload 
+                  v-model:file-list="fileList"
+                  action="#" 
+                  :auto-upload="false"
+                  @change="(file)=>handleFileChange(file,item)"
+                  :on-preview="handlePictureCardPreview"
+                  :on-remove="handleRemove"
+                >
+                  <div class="operation_area">
+                    <el-icon class="icon"><Plus /></el-icon>
+                    <span>{{item.uploadTips ? item.uploadTips : '上传文件'}}</span>
+                  </div>
+                </el-upload>
+
+                <span v-if="props.fileLoading" class="cover"  style="gap: 3px;line-height: 1.5;color:#2e64fa">
+                  上传中
+                  <el-icon class="is-loading">
+                    <Loading />
+                  </el-icon>
+                </span>
+
+                <div class="file_list">
+                  <!-- 单张 -->
+                  <template  v-if="item.limit == 1 && !props.fileLoading">
+                    <div  class="file_desc" v-if="formData[item.key]?.url">
+                      <img class="icon" :src="fileIcon" alt="">
+                      <div class="file_msg">
+                        <span class="name" :title="formData[item.key]?.name">{{ formData[item.key]?.name }}</span>
+                        
+                        <span class="size"> 
+                          <span>{{ formData[item.key]?.fileSize }}</span>
+                          <span>{{ formData[item.key]?.time }}</span>
+                        </span>
+                      </div>
+                      <div class="table_row_option">
+                          <span class="el_button_delete" @click="HandleRemove(item.key)">删除</span>
+                          <span class="el_button_editor" @click="HandleFilePreview(formData[item.key])">预览</span>
+                          <span class="el_button_editor" @click="HandleFileDownload(formData[item.key]?.url)">下载</span>
+                        </div>
+                    </div>
+                  </template>
+
+                  <!-- 多张 -->
+                  <template v-else-if="item.limit > 1">
+                    <div  class="file_desc" v-for="fileItm in formData[item.key]" :key="fileItm">
+                      <img class="icon" :src="fileIcon" alt="">
+                      <div class="file_msg">
+                        <span class="name" :title="fileItm?.name">{{ fileItm?.name }}</span>
+                        <span class="size"> 
+                          <span>{{ fileItm?.fileSize }}</span>
+                          <span>{{ fileItm?.time }}</span>
+                        </span>
+                      </div>
+                      <div class="table_row_option">
+                        <span class="el_button_delete" @click="HandleRemoveSingleImg(item.key,fileItm)">删除</span>
+                        <span class="el_button_editor" @click="HandleFilePreview(fileItm)"> 预览</span>
+                        <span class="el_button_editor" @click="HandleFileDownload(fileItm?.url)">下载</span>
+                      </div>
+                    </div>
+                  </template>
+                </div>
+              </div>
+            </template>
 
             <a v-else-if="item.type=='url'"  @click="HandlePreviewFile(formData[item.key])" >{{ formData[item.key]?.name }}</a>
           </template>
@@ -340,6 +517,8 @@ import closeFillImg from '@/assets/icon/close_fill.svg'
 
 import { ElMessage } from 'element-plus'
 
+// import fileIcon from '@/assets/icon/file.png'
+
 
 const previewVisible = ref(false)
 const fileList = ref([
@@ -359,14 +538,16 @@ const handleRemove = ()=>{
 }
 type  ItemType = 
   |'input'|'password'|'textarea'|'number'|'radio'
-  |'select'|'multipleSelect'| 'unionSelect' |'checkbox'|'datePicker'
-  |'dateTimePicker'|'url'|'file' | 'switch' | 'imgFile' | 'noDragFile'
+  |'select'|'multipleSelect' | 'singleSelectSearch' | 'multipleSelectSearch' | 'unionSelect' |'checkbox'|'datePicker'
+  |'dateTimePicker'| 'dateTimePickerNoRange' |'datePickerNoRange' |'url'|'file' | 'switch' | 'imgFile' | 'noDragFile' | 'fileShowList'
 
 
 interface formItemProperty {
   key: String,
   label: String,
   type?:ItemType,
+  limit:Number, // 文件上传限制的数量
+  uploadTips:String,
   acceptType?:[],
   checkAll?:Boolean,
   placeholder?:|String 
@@ -423,7 +604,8 @@ const props = defineProps({
     },
     defaultFormData:{
       type:Object,
-      default:()=>{}
+      required:true,
+      // default:()=>{}
     },
     formDisabled:{
       type:Boolean,
@@ -529,6 +711,33 @@ const HandleRemove = (formKey)=>{
   formData.value[formKey] = null
 }
 
+const HandleRemoveSingleImg = (formKey,aimFile) =>{
+  formData.value[formKey] = formData.value[formKey].filter(item=>{
+    return item !== aimFile
+  })
+
+}
+
+const imgVisible = ref(false)
+const dialogImageUrl = ref('')
+const HandleImgPreview = (url)=>{
+  imgVisible.value = true
+  dialogImageUrl.value = url
+}
+const HandleFileDownload = (url)=>{
+  let link = document.createElement('a')
+  link.href = url
+  link.download = url
+  link.style.display = 'none';
+  document.body.appendChild(link)
+  link.click();
+  document.body.removeChild(link)
+}
+
+const HandleFilePreview = (params)=>{
+  previewVisible.value = true
+  fileMessage.value = params
+}
 </script>  
 <style lang="scss" scoped>
 .img_file_area{
@@ -560,12 +769,210 @@ const HandleRemove = (formKey)=>{
     justify-content: center;
   }
 
+  .operation_area1{
+    width: 200px;
+    height: 117px;
+    color:#CCCED4;
+    font-size: 14px;
+
+    border-radius: 6px;
+    background-color: #f0f4f8;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+  }
+
   .operation_area{
     background-color: #F0F4F8;
     font-size: 24px;
   }
 }
 
+.img_file_area1{
+  width: 100%;
+  display: flex;
+  gap:10px;
+  align-items: center;
+  flex-wrap: wrap;
+
+  >span{
+    position: relative;
+    .close{
+      width: 14px;
+      height: 14px;
+      color: #F56C6C;
+      position:absolute;
+      top:-5px;
+      right: -2px;
+    }
+  }
+  .cover,
+  .operation_area{
+    width: 200px;
+    height: 117px;
+    color:#CCCED4;
+    font-size: 14px;
+    border-radius: 6px;
+    background-color: #f0f4f8;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+  .cover{
+    border:solid #CED1D8 1px
+  }
+
+  .operation_area{
+    background-color: #FAFBFF;
+    display: flex;
+    flex-direction: column;
+    border:dashed #CCCED4 1px;
+    gap:8px;
+    .icon{
+      font-size: 40px;
+    }
+  }
+
+  .img_file{
+    position: relative;
+
+    .operation_btn{
+      display: none;
+      justify-content: center;
+      align-items: center;
+      gap:10px;
+
+      background-color:rgba(0, 0, 0,0.1);
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      top:0px;
+      left:0px;
+
+      .delete,
+      .preview{
+        line-height: 1;
+        padding:8px 20px;
+        background-color: white;
+        border-radius: 4px;
+        cursor: pointer;
+      }
+      
+      .delete{
+        color:#F56C6C;
+      }
+      .preview{
+        color:#2E64FA;
+      }
+    }
+
+    &:hover{
+      .operation_btn{
+        display:flex;
+      }
+    }
+  }
+}
+
+.file_show_list{
+  width: 100%;
+  display: flex;
+  gap:10px;
+  align-items: flex-start;
+  flex-wrap: now-wrap;
+  >span{
+    position: relative;
+    .close{
+      width: 14px;
+      height: 14px;
+      color: #F56C6C;
+      position:absolute;
+      top:-5px;
+      right: -2px;
+    }
+  }
+  .operation_area{
+    width: 200px;
+    height: 80px;
+    color:#CCCED4;
+    font-size: 14px;
+    border-radius: 6px;
+    background-color: #f0f4f8;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background-color: #FAFBFF;
+    display: flex;
+    flex-direction: column;
+    border:dashed #CCCED4 1px;
+    gap:8px;
+    .icon{
+      font-size: 24px;
+    }
+  }
+  .img_file{
+    position: relative;
+   
+  }
+  .file_list{
+    max-width: calc(100% -  200px - 10px);
+    flex:1 1;
+    display: flex;
+    flex-direction: column;
+    gap:20px;
+
+    .file_desc{
+      display: flex;
+      align-items: center;
+      gap:10px;
+      height: 80px;
+      width: 100%;
+      
+      border:solid #EBEEF5 1px;
+      border-radius: 10px;
+      padding:20px;
+      line-height: 1.5;
+      .icon{
+        width: 40px;
+        height: 40px;
+        vertical-align: middle;
+      }
+
+      .file_msg{
+        max-width: calc(100% - 40px - 20px - 117px);
+        flex-grow: auto;
+        flex-shrink: 0;
+        display: flex;
+        flex-direction: column;
+        gap:4px;
+        .name{
+          font-weight: 600;
+          font-size: 14px;
+          color: #333333;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+          cursor: pointer;
+        }
+        .size{
+          font-size: 12px;
+          color: #999999;
+          display: flex;
+          gap:10px;
+        }
+      }
+      .table_row_option{
+        justify-content: flex-end;
+      }
+    }
+  }
+}
+
+
+
+
 .multipleSelect{
   :deep(.el-select__wrapper){
      height: auto;
@@ -687,6 +1094,10 @@ const HandleRemove = (formKey)=>{
     flex-direction: column;
     justify-content: flex-start;
     overflow: auto;
+    .el-date-editor--date.el-input{
+      width: 100%;
+      border:none;
+    }
   }
 
   a{

+ 16 - 1
src/components/statusDict.ts

@@ -1,3 +1,4 @@
+// 问卷使用状态
 export const useStatusConvert = [
     {
         statusFlag:1,
@@ -11,7 +12,7 @@ export const useStatusConvert = [
     },
 ]
 
-
+// 问卷类型
 export const cardTypeMsg = [
     {
         type:0,
@@ -26,3 +27,17 @@ export const cardTypeMsg = [
         title:'线上导入'
     },
 ]
+
+// 问卷任务状态
+export const questionnaireTaskStatusMsg = [
+    {
+        statusFlag:0,
+        title:'进行中',
+        themeClass:'ongoing'
+    },
+    {
+        statusFlag:1,
+        title:'已结束',
+        themeClass:'end'
+    },
+]

+ 115 - 37
src/views/reviewManagement/ReviewManagement.vue

@@ -14,7 +14,7 @@
                             @searchChange="HandleSearchChange"></FormSearchGroup>
                     </div>
                     <div class="conent_right">
-                        <el-button class="button_background" @click="GoToCreateQuestionnaire">创建评价</el-button>
+                        <el-button class="button_background" @click="OpenQuestionnaireDialog">创建评价</el-button>
                     </div>
                 </div>
             </div>
@@ -31,7 +31,7 @@
             <!-- 视图展示数据 -->
             <QuestionnaireCard 
                 v-if="defaultViewMode == 'view'"
-                :cardStatusMsg="cardStatusMsg" 
+                :cardStatusMsg="questionnaireTaskStatusMsg" 
                 :cardTypeMsg="cardTypeMsg"
                 :questionnaireList="questionnaireList" 
                 cardType="reviewManage"
@@ -43,7 +43,7 @@
                     <el-button class="button_background">查看详情</el-button>
                     <el-button 
                         :class="[Number(row.useStatus) === 1 ? 'is-disabled' : 'button_border']"
-                        @click="Number(row.useStatus) === 1 ?  '' : GoToCreateQuestionnaire(row)"    
+                        @click="Number(row.useStatus) === 1 ?  '' : OpenQuestionnaireDialog(row)"    
                     >编辑</el-button>
 
                     <el-button 
@@ -87,7 +87,7 @@
                     <div class="table_row_option">
                         <span  
                             :class="[Number(row.useStatus) === 1 ? 'editor_disable' : 'el_button_editor']"
-                            @click="Number(row.useStatus) === 1 ?  '' : GoToCreateQuestionnaire(row)"    
+                            @click="Number(row.useStatus) === 1 ?  '' : OpenQuestionnaireDialog(row)"    
                         >编辑</span>
                         <span 
                             :class="[Number(row.useStatus) === 1 ? 'editor_disable' : 'el_button_delete']"
@@ -98,6 +98,22 @@
             </Table>
         </div>
 
+
+        <!-- 创建评价弹窗 -->
+         <FormDialog   
+            width="590px"
+            :visible="formDialogVisible"
+            :submitLoading="formSubmitLoading" 
+            :title="formDialogTitle" 
+            :formItemList="formDialogItmList" 
+            :defaultFormData="defaultFormData" 
+            @formItemChange="HandleFormItmChange"
+            @close="CloseFormDialog" 
+            @confirm="AddQuestionnaireTask">
+        </FormDialog>
+
+
+        <!-- 删除确认弹窗 -->
         <Dialog 
             :visible="dialogVisible" 
             :submitLoading="dialogSubmitLoading"
@@ -120,17 +136,20 @@ import Table from '@/baseComponents/Table.vue';
 import TabSearch from '@/baseComponents/TabSearch.vue';
 import TableRowStatus from '@/baseComponents/TableRowStatus.vue';
 import Dialog from '@/baseComponents/Dialog.vue';
+import FormDialog from '@/baseComponents/FormDialog.vue';
+import FormSearchGroup from '@/baseComponents/FormSearchGroup.vue';
+import SearchBlock from '@/baseComponents/SearchBlock.vue';
 
 import QuestionnaireCard from '@/components/questionnaireCard/QuestionnaireCard.vue';
 
 
+import {useStatusConvert, cardTypeMsg, questionnaireTaskStatusMsg} from '@/components/statusDict'
+
+
 import {searchList, viewModeTabList, statusSearchList} from './searchListConfig'
 import { questionnaireTableColumns } from './table';
-import {useStatusConvert, cardTypeMsg} from '@/components/statusDict'
-
-import FormSearchGroup from '@/baseComponents/FormSearchGroup.vue';
-import SearchBlock from '@/baseComponents/SearchBlock.vue';
 
+import { formDialogItmList } from './formDialog'
 
 interface QuestionnaireItm {
     id:Number | String,
@@ -176,19 +195,13 @@ const pageSize = ref(20)
 const questionnaireList = ref<QuestionnaireItm[]>([
     {
         "id": '655355453521268736',
-        // "createdAt": "2026-06-29 10:28",
         startTime:'2026-06-29 16:00',
         endTime:'2026-06-29 16:00',
          time:'2026-06-29 16:00 至 2026-06-29 16:00',
-
-        // "teacherId": "510448965049651259",
         "teacherName": "李敏",
         "assessmentTitle": "f制",
-        // "assessmentIllustrate": "fdsf",
-        // "assessmentScore": "30.00",
-        // "assessmentSortCode": 111,
+     
         "useStatus": 0,
-        // "questionData": null,
         isOpen:true,
         'cardOnOff':true,
         cardStatus:0,
@@ -196,19 +209,12 @@ const questionnaireList = ref<QuestionnaireItm[]>([
     },
     {
         "id": '6553554535212687236',
-        // "createdAt": "2026-06-29 10:28",
-
         startTime:'2026-06-29 16:00',
         endTime:'2026-06-29 16:00',
         time:'2026-06-29 16:00 至 2026-06-29 16:00',
-        // "teacherId": "510448965049651259",
         "teacherName": "李敏",
         "assessmentTitle": "fd-复制",
-        // "assessmentIllustrate": "fdsf",
-        // "assessmentScore": "30.00",
-        // "assessmentSortCode": 111,
         "useStatus": 1,
-        // "questionData": null,
         isOpen:true,
         'cardOnOff':false,
         cardStatus:0,
@@ -216,19 +222,9 @@ const questionnaireList = ref<QuestionnaireItm[]>([
     },
 ]);
 
-// 问卷状态展示
-const cardStatusMsg = ref([
-    {
-        statusFlag:0,
-        title:'进行中',
-        themeClass:'ongoing'
-    },
-    {
-        statusFlag:1,
-        title:'已结束',
-        themeClass:'end'
-    },
-])
+
+
+
 
 
 // 问卷开关切换
@@ -266,10 +262,92 @@ const GetQuestionnaireList = async ()=>{
 }
 
 
-// 2. 跳转创建问卷 /修改文件 
-const GoToCreateQuestionnaire = (row?:any)=>{
+// 新增/修改问卷任务
+const formDialogTitle = ref('创建评价')
+const formSubmitLoading = ref(false)
+const formDialogVisible = ref(false)
+const defaultFormData = ref({})
+
+
+// 切换问卷评价表单内容 _需要根据条件清空开始时间和结束时间
+const HandleFormItmChange = (params)=>{
+    const {key,val,formData} = params
+    if(key == 'evaluationMethod'){
+        console.log('当前参数内容',val)
+        switch(val){
+            case 'online_anonymous':
+            case 'online_import':{
+                formDialogItmList.value = formDialogItmList.value.map(item=>{
+                    if(item.key == 'startTime' ||  item.key == 'endTime' ){
+                        return {
+                            ...item,
+                            hidden:false
+                        }
+                    }else{
+                        return item
+                    }
+                })
+                break
+            }
+            case 'offline_paper':{
+                defaultFormData.value.startTime = ''
+                defaultFormData.value.endTime = ''
+                formDialogItmList.value = formDialogItmList.value.map(item=>{
+                    if(item.key == 'startTime' ||  item.key == 'endTime' ){
+                        return {
+                            ...item,
+                            hidden:true
+                        }
+                    }else{
+                        return item
+                    }
+                })
+                break
+            }
+        }
+    }
 }
+// 打开创建问卷弹窗
+const OpenQuestionnaireDialog = (row?:any)=>{
+    formDialogVisible.value = true
+
+    // 获取评价年级列表
+    const gradeListOption = [
+        { label: '七年级', value: 'grade_7' },
+        { label: '八年级', value: 'grade_8' },
+        { label: '九年级', value: 'grade_9' },
+        { label: '高一', value: 'grade_10' },
+        { label: '高二', value: 'grade_11' },
+        { label: '高三', value: 'grade_12' }
+    ]
 
+    formDialogItmList.value = formDialogItmList.value.map(item=>{
+        if(item.key == 'evaluationGrade'){
+            return {
+                ...item,
+                selectList:gradeListOption
+            }
+        }else {
+            return item
+        }
+    })
+
+}
+
+// 创建问卷
+const AddQuestionnaireTask = (params?:any)=>{
+    const {formData,formRef} = params
+
+    console.log('表单信息',formData)
+    // formDialogVisible.value = false
+
+}
+
+// 关闭问卷弹窗
+const CloseFormDialog = ()=>{
+    formDialogVisible.value = false
+
+}
 
 
 

+ 55 - 0
src/views/reviewManagement/formDialog.ts

@@ -0,0 +1,55 @@
+import { ref } from "vue"
+
+export const formDialogItmList = ref([
+    {
+        key: 'evaluationName',
+        label: '评价名称',
+        type: 'input',
+        placeholder: '请输入评价名称',
+        rules: [
+            { required: true, message: '请输入评价名称', trigger: 'blur' }
+        ],
+        style: { }
+    },
+    {
+        key: 'evaluationMethod',
+        label: '评价方式',
+        type: 'radio',
+        selectList: [
+            { label: '线上匿名', value: 'online_anonymous' },
+            { label: '线下答卷', value: 'offline_paper' },
+            { label: '线上导入', value: 'online_import' }
+        ],
+        rules: [
+            { required: true, message: '请选择评价方式', trigger: 'change' }
+        ]
+    },
+    {
+        key: 'startTime',
+        label: '开始时间',
+        type: 'dateTimePickerNoRange',
+        placeholder: '请选择日期',
+        rules: [
+            { required: true, message: '请选择开始时间', trigger: 'change' }
+        ]
+    },
+    {
+        key: 'endTime',
+        label: '结束时间',
+        type: 'dateTimePickerNoRange',
+        placeholder: '请选择日期',
+        rules: [
+            { required: true, message: '请选择结束时间', trigger: 'change' }
+        ]
+    },
+    {
+        key: 'evaluationGrade',
+        label: '评价年级',
+        type: 'checkbox',
+        selectList: [],
+        style: { }, 
+        rules: [
+            { required: true, message: '请至少选择一个年级', trigger: 'change' }
+        ]
+    }
+])