Browse Source

新建项目时协办人员不必填,主办人员可以多选,附件新增execl上传

hzj18279462576@163.com 1 year ago
parent
commit
2777242480
4 changed files with 4322 additions and 114 deletions
  1. 21 4
      package-lock.json
  2. 2 1
      package.json
  3. 3962 0
      src/views/project/project copy.vue
  4. 337 109
      src/views/project/project.vue

+ 21 - 4
package-lock.json

@@ -12,6 +12,7 @@
         "@element-plus/icons-vue": "^2.0.10",
         "@liveqing/liveplayer-v3": "^3.7.10",
         "@vue-office/docx": "^1.6.2",
+        "@vue-office/excel": "^1.7.14",
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^5.1.12",
         "axios": "^1.3.2",
@@ -32,7 +33,7 @@
         "v-viewer": "^3.0.11",
         "vite-plugin-svg-icons": "^2.0.1",
         "vue": "^3.2.45",
-        "vue-demi": "^0.14.7",
+        "vue-demi": "^0.14.10",
         "vue-router": "^4.0.10",
         "vue3-pdf-app": "^1.0.3",
         "vue3-seamless-scroll": "^2.0.1",
@@ -701,6 +702,22 @@
         }
       }
     },
+    "node_modules/@vue-office/excel": {
+      "version": "1.7.14",
+      "resolved": "https://registry.npmmirror.com/@vue-office/excel/-/excel-1.7.14.tgz",
+      "integrity": "sha512-pVUgt+emDQUnW7q22CfnQ+jl43mM/7IFwYzOg7lwOwPEbiVB4K4qEQf+y/bc4xGXz75w1/e3Kz3G6wAafmFBFg==",
+      "hasInstallScript": true,
+      "peerDependencies": {
+        "@vue/composition-api": "^1.7.1",
+        "vue": "^2.0.0 || >=3.0.0",
+        "vue-demi": "^0.14.6"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@vue/compiler-core": {
       "version": "3.2.47",
       "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
@@ -5665,9 +5682,9 @@
       }
     },
     "node_modules/vue-demi": {
-      "version": "0.14.7",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz",
-      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
       "hasInstallScript": true,
       "bin": {
         "vue-demi-fix": "bin/vue-demi-fix.js",

+ 2 - 1
package.json

@@ -13,6 +13,7 @@
     "@element-plus/icons-vue": "^2.0.10",
     "@liveqing/liveplayer-v3": "^3.7.10",
     "@vue-office/docx": "^1.6.2",
+    "@vue-office/excel": "^1.7.14",
     "@wangeditor/editor": "^5.1.23",
     "@wangeditor/editor-for-vue": "^5.1.12",
     "axios": "^1.3.2",
@@ -33,7 +34,7 @@
     "v-viewer": "^3.0.11",
     "vite-plugin-svg-icons": "^2.0.1",
     "vue": "^3.2.45",
-    "vue-demi": "^0.14.7",
+    "vue-demi": "^0.14.10",
     "vue-router": "^4.0.10",
     "vue3-pdf-app": "^1.0.3",
     "vue3-seamless-scroll": "^2.0.1",

File diff suppressed because it is too large
+ 3962 - 0
src/views/project/project copy.vue


+ 337 - 109
src/views/project/project.vue

@@ -526,11 +526,11 @@
               :http-request="handleUpload"
             >
               <el-button type="primary">上传附件</el-button>
-              <!-- <template #tip>
-              <div class="el-upload__tip">
-                jpg/png files with a size less than 500KB.
-              </div>
-            </template> -->
+              <template #tip>
+                <div class="el-upload__tip" style="color: darkorange;">
+                  附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'、'.xlsx'、'.xls'格式
+                </div>
+              </template>
             </el-upload>
             <div v-if="fileList" class="fileList">
               <div class="files" v-for="i in fileList">
@@ -550,6 +550,9 @@
             :props="organizeProps"
             @change="organizeChange"
             v-model="sposonerVal"
+            collapse-tags
+            collapse-tags-tooltip
+            :max-collapse-tags="3"
             filterable
             clearable
           >
@@ -559,17 +562,17 @@
             </template>
           </el-cascader>
         </el-form-item>
-        <el-form-item label="协办人员" prop="coSposoner">
+        <el-form-item label="协办人员">
           <!-- <el-cascader :props="props" :options="options" /> -->
           <el-cascader
             :options="organizeData"
             :props="coOrganizeProps"
+            @change="coOrganizeChange"
+            v-model="coSposonerVal"
             collapse-tags
             collapse-tags-tooltip
             :max-collapse-tags="3"
             clearable
-            @change="coOrganizeChange"
-            v-model="coSposonerVal"
             filterable
           >
             <template #default="{ node, data }">
@@ -673,14 +676,17 @@
           </el-select>
         </el-form-item>
         <el-form-item label="评分人" prop="scorer">
-          <el-select
+          <!-- <el-select
             v-model="projectRuleForm.scorer"
             placeholder="请选择评分人"
             clearable
             multiple
             collapse-tags
             collapse-tags-tooltip
+            filterable
             :max-collapse-tags="6"
+            :remote-method="scorerChange"
+            remote
           >
             <el-option
               v-for="item in scorerData"
@@ -688,6 +694,45 @@
               :label="item.userName"
               :value="item.id.toString()"
             />
+          </el-select> -->
+          <el-select
+            v-model="projectRuleForm.scorer"
+            popper-class="more-tag-data"
+            multiple
+            filterable
+            remote
+            :remote-method="scorerChange"
+            :loading="conteactLoading"
+            placeholder="请选择评分人"
+          >
+            <el-option
+            v-for="item in scorerData"
+            :key="item.id"
+            :label="item.userName"
+            :value="item.id.toString()"
+            >
+              <span style="float: left">{{ item.userName }}</span>
+              <!-- <span
+                style="
+                  float: right;
+                  color: var(--el-text-color-secondary);
+                  font-size: 13px;
+                "
+                >{{ item.department }}</span
+              > -->
+            </el-option>
+            <template #footer>
+              <div class="addStudentMore">
+                <el-button
+                  v-if="
+                    scorePage < scoreTotalPage &&
+                    scoreTotalPage != 0
+                  "
+                  @click="addStudentListMore"
+                  >加载更多+</el-button
+                >
+              </div>
+            </template>
           </el-select>
         </el-form-item>
         <el-form-item class="options">
@@ -771,7 +816,7 @@
         <div class="unit">
           <div class="unit_i">
             <span class="key">主办单位 :</span>
-            <span class="value">{{ cardInfo.organize }}</span>
+            <span class="value">{{ cardInfo.organizeCopy }}</span>
           </div>
           <div class="unit_i">
             <span class="key">主办人 :</span>
@@ -1114,11 +1159,11 @@
               :http-request="handleUploadTask"
             >
               <el-button type="primary">上传附件</el-button>
-              <!-- <template #tip>
-              <div class="el-upload__tip">
-                jpg/png files with a size less than 500KB.
-              </div>
-            </template> -->
+              <template #tip>
+                <div class="el-upload__tip" style="color: darkorange;">
+                  附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'、'.xlsx'、'.xls'格式
+                </div>
+              </template>
             </el-upload>
             <div v-if="fileListTask" class="fileList">
               <div class="files" v-for="i in fileListTask">
@@ -1260,11 +1305,11 @@
             :http-request="handleAttachment"
           >
             <el-button type="primary">上传附件</el-button>
-            <!-- <template #tip>
-              <div class="el-upload__tip">
-                jpg/png files with a size less than 500KB.
-              </div>
-            </template> -->
+            <template #tip>
+                <div class="el-upload__tip" style="color: darkorange;">
+                  附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'、'.xlsx'、'.xls'格式
+                </div>
+              </template>
           </el-upload>
           <div v-if="fileListAttachment" class="fileList">
             <div class="files" v-for="i in fileListAttachment">
@@ -1324,6 +1369,14 @@
           <div class="continer" v-if="pdfFlag == 3">
             <img :src="previewPdfUrl" />
           </div>
+          <div class="continer" v-if="pdfFlag == 4">
+            <vue-office-excel
+              :src="previewPdfUrl"
+              style="height: 100vh;"
+              @rendered="renderedHandler"
+              @error="errorHandler"
+            />
+          </div>
         </div>
       </div>
     </el-dialog>
@@ -1357,6 +1410,11 @@ import VueOfficeDocx from "@vue-office/docx";
 // 导入样式文件
 import "@vue-office/docx/lib/index.css";
 
+//引入VueOfficeExcel组件
+import VueOfficeExcel from '@vue-office/excel'
+//引入相关样式
+import '@vue-office/excel/lib/index.css'
+
 const store = useStore();
 const router = useRouter();
 const btnFlag = inject("$btnFlag");
@@ -1426,9 +1484,16 @@ const projectRef = ref();
 
 const searchOrganizeData = ref(); // 搜索框用主办协办人员
 const organizeData = ref(); // 添加项目用主办协办人员
+
+ // 评分人下拉
+const scorePage=ref(1);
+const scoreCurrent=ref(20);
+const scoreTotalPage=ref();
+const scoreNameSea=ref();
 const scorerData = ref(); // 评分人
 
 const organizeProps = {
+  multiple: true,
   children: "userList",
   label: "userName",
   value: "id",
@@ -1551,6 +1616,7 @@ const cardInfo = reactive({
   projectContent: "", // 描述
   fileUrl: "", // 附件
   organize: "", // 主办单位
+  organizeCopy:"",// 主办单位去重
   sposonerName: "", // 主办人
   coOrganizeCopy: "", // 协办单位去重展示用
   coOrganize: "", // 协办单位
@@ -1719,7 +1785,38 @@ const getList = async () => {
     }
   }
 };
-
+// 评分人数据
+const scorerList=async ()=>{
+  let params={
+    page:scorePage.value,
+    rows:scoreCurrent.value
+  }
+  let data={
+    "userName": scoreNameSea.value, // 姓名
+  }
+  let res = await axios({
+    method: "post",
+    url: api.value + "/api/sysUser/queryPage",
+    headers: {
+      tokenP: sessionStorage.getItem("tokenP"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data,
+    params
+  });
+  console.log(res, "评分人数据列表");
+  if (res.data.code == 200) {
+    scorerData.value = res.data.data.rows;
+    scoreTotalPage.value=res.data.data.totalPage
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+}
 // 部门数据
 const departmentList = async () => {
   // let res = await axios({
@@ -1947,6 +2044,18 @@ const projectCard = async (row) => {
   cardInfo.organize = row.organize;
   cardInfo.sposonerName = row.sposonerName;
   cardInfo.coSposonerName = row.coSposonerName;
+  // 主办单位去重展示用
+  let arr1 = [];
+  console.log(row.organize.split(","));
+  row.organize.split(",").forEach((item) => {
+    let flag = arr1.some((i) => {
+      return i == item;
+    });
+    if (!flag) {
+      arr1.push(item);
+    }
+  });
+  cardInfo.organizeCopy = arr1.join(",");
 
   // 协办单位去重展示用
   let arrs = [];
@@ -2274,78 +2383,71 @@ const addProjectbtn = () => {
 // 勾选主办人
 const organizeChange = async (val) => {
   console.log(val);
-  return new Promise(async (resolve) => {
-    projectRuleForm.scorer = [];
-    if (val) {
-      projectRuleForm.organize = val[0];
-      projectRuleForm.sposoner = val[1];
-
-      let formData = new FormData();
-      formData.append("organizes", projectRuleForm.organize);
-
-      let res = await axios({
-        method: "post",
-        url: api.value + "/api/sysUser/queryScorer",
-        headers: {
-          tokenP: sessionStorage.getItem("tokenP"),
-          user_head: sessionStorage.getItem("userhead"),
-        },
-        data: formData,
-      });
-      console.log(res, "评分人列表");
-      if (res.data.code == 200) {
-        scorerData.value = res.data.data;
-        resolve("success");
-      } else {
-        if (res.data.message.indexOf("Handler dispatch failed") != -1) {
-          window.location.href =
-            "https://chtech.ncjti.edu.cn/kpi/template/api/sysUser/authorize";
-          ElMessage({
-            type: "error",
-            showClose: true,
-            message: "token已过期,请重新登录",
-            center: true,
-          });
-        } else {
-          ElMessage({
-            type: "error",
-            showClose: true,
-            message: res.data.message,
-            center: true,
-          });
-        }
-      }
-      // let params = {
-      //   page: 1, // 当前页
-      //   rows: 1000, // 一页数据条数
-      // };
-      // let data = {
-      //   manageDepartment: projectRuleForm.organize, // 部门
-      // };
-      // let res = await axios({
-      //   method: "post",
-      //   url: api.value + "/api/sysUser/queryPage",
-      //   headers: {
-      //     tokenP: sessionStorage.getItem("tokenP"),
-      //     user_head: sessionStorage.getItem("userhead"),
-      //   },
-      //   params: params,
-      //   data: data,
-      // });
-      // console.log(res, "评分人列表");
-      // if (res.data.code == 200) {
-      //   scorerData.value = res.data.data.rows;
-      //   resolve("success");
-      // } else {
-      //   ElMessage({
-      //     type: "error",
-      //     showClose: true,
-      //     message: res.data.message,
-      //     center: true,
-      //   });
-      // }
-    }
+  let arr = [];
+  let jrr = [];
+  val.forEach((i) => {
+    arr.push(i[0]);
+    jrr.push(i[1]);
   });
+  projectRuleForm.organize = arr.join(",");
+  projectRuleForm.sposoner = jrr.join(",");
+  console.log(arr,'//////', jrr);
+  // return new Promise(async (resolve) => {
+  //   // projectRuleForm.scorer = [];
+  //   if (val) {
+  //     let arr = [];
+  //     let jrr = [];
+  //     val.forEach((i) => {
+  //       arr.push(i[0]);
+  //       jrr.push(i[1]);
+  //     });
+  //     projectRuleForm.organize = arr.join(",");
+  //     projectRuleForm.sposoner = jrr.join(",");
+  //     console.log(arr.join(","), jrr.join(","));
+
+  //     // projectRuleForm.organize = val[0];
+  //     // projectRuleForm.sposoner = val[1];
+  //     // let formData = new FormData();
+  //     // formData.append("organizes", projectRuleForm.organize);
+  //     // let res = "";
+  //     // if (projectRuleForm.organize) {
+  //     //   console.log(res, "评分人列表");
+  //     //   res = await axios({
+  //     //     method: "post",
+  //     //     url: api.value + "/api/sysUser/queryScorer",
+  //     //     headers: {
+  //     //       tokenP: sessionStorage.getItem("tokenP"),
+  //     //       user_head: sessionStorage.getItem("userhead"),
+  //     //     },
+  //     //     data: formData,
+  //     //   });
+  //     //   if (res.data.code == 200) {
+  //     //     scorerData.value = res.data.data;
+  //     //     resolve("success");
+  //     //   } else {
+  //     //     if (res.data.message.indexOf("Handler dispatch failed") != -1) {
+  //     //       window.location.href =
+  //     //         "https://chtech.ncjti.edu.cn/kpi/template/api/sysUser/authorize";
+  //     //       ElMessage({
+  //     //         type: "error",
+  //     //         showClose: true,
+  //     //         message: "token已过期,请重新登录",
+  //     //         center: true,
+  //     //       });
+  //     //     } else {
+  //     //       ElMessage({
+  //     //         type: "error",
+  //     //         showClose: true,
+  //     //         message: res.data.message,
+  //     //         center: true,
+  //     //       });
+  //     //     }
+  //     //   }
+  //     // }else{
+  //     //   scorerData.value=[]
+  //     // }
+  //   }
+  // });
 };
 // 勾选协办人
 const coOrganizeChange = (val) => {
@@ -2379,23 +2481,56 @@ const editProject = async (row) => {
 
   projectRuleForm.organize = row.organize;
   projectRuleForm.sposoner = row.sposoner;
-  console.log([row.organize, row.sposoner.toString()]);
-  sposonerVal.value = [row.organize, Number(row.sposoner)];
+  // console.log(row.organize,'主办人员',row.sposoner);
+  // sposonerVal.value = [row.organize, Number(row.sposoner)];
+  let arrs = [];
+  row.organize.split(",").forEach((item, ind) => {
+    console.log(item, ind);
+    arrs.push([item, Number(row.sposoner.split(",")[ind])]);
+  });
+  sposonerVal.value =arrs
+  console.log(sposonerVal.value,'主办人员');
+  
 
   projectRuleForm.coSposoner = row.coSposoner;
   projectRuleForm.coOrganize = row.coOrganize;
   let arr = [];
-  row.coOrganize.split(",").forEach((item, ind) => {
-    console.log(item, ind);
-    arr.push([item, Number(row.coSposoner.split(",")[ind])]);
-  });
-  coSposonerVal.value = arr;
+  if(row.coOrganize){
+      row.coOrganize.split(",").forEach((item, ind) => {
+       console.log(item, ind);
+       arr.push([item, Number(row.coSposoner.split(",")[ind])]);
+     });
+     coSposonerVal.value = arr;
+  }else{
+    coSposonerVal.value=''
+  }
 
   projectRuleForm.projectFrom = row.projectFrom;
   projectRuleForm.projectLevel = row.projectLevel;
   projectRuleForm.id = row.id;
-  await organizeChange([projectRuleForm.organize, projectRuleForm.sposoner]);
+  // await organizeChange([projectRuleForm.organize, projectRuleForm.sposoner]);
   projectRuleForm.scorer = row.scorer.split(",");
+  if (row.scorer) {
+    row.scorer.split(",").forEach((item,ind) => {
+      // scorerData.value.unshift(item);
+      let flag= scorerData.value.some(j=>{
+        return item==j.id
+      })
+      if(!flag){
+        let arr={
+          userName:row.scorerName.split(',')[ind],
+          id:`${item}`
+        };
+        scorerData.value.unshift(arr)
+        console.log(arr);
+      }
+    });
+    // projectRuleForm.scorer= arr; // 联系人
+  } else {
+    // projectRuleForm.scorer = [];
+  }
+  console.log(projectRuleForm.scorer);
+  
   // organizeChange([projectRuleForm.organize, projectRuleForm.sposoner]).then(
   //   (res) => {
   //     console.log(scorerData.value,res);
@@ -2405,6 +2540,58 @@ const editProject = async (row) => {
   //   }
   // );
 };
+// 评分人下拉加载数据
+const scorerChange=(query)=>{
+  console.log(query);
+  scorePage.value=1
+  scoreNameSea.value=query
+    scorerList()
+  // if (query) {
+  //   scoreNameSea.value=query
+  //   scorerList()
+  // } else {
+  //   scorerData.value = []
+  // }
+}
+const addStudentListMore = async () => {
+  if (scorePage.value < scoreTotalPage.value) {
+    scorePage.value++;
+    console.log(scorePage.value, "滚动里面");
+    let params={
+      page:scorePage.value,
+      rows:scoreCurrent.value
+    }
+    let data={
+      "userName": scoreNameSea.value, // 姓名
+    }
+    let res = await axios({
+      method: "post",
+      url: api.value + "/api/sysUser/queryPage",
+      headers: {
+        tokenP: sessionStorage.getItem("tokenP"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      params,
+      data
+    });
+    console.log(res, "评分人列表数据");
+    // let arr=[]
+    // if(res.data.data.rows){
+    //   arr=res.data.data.rows.filter(i=>{
+    //     let flag= scorerData.value.some(j=>{
+    //       return i.id==j.id
+    //     })
+    //     return !flag
+    //   })
+    // }
+    scorerData.value = [
+      ...scorerData.value,
+      ...res.data.data.rows,
+    ];
+  } else {
+    console.log("数据全部加载完成");
+  }
+};
 // 确定新建项目
 const confirmProject = (formEl) => {
   if (!formEl) return;
@@ -2419,8 +2606,8 @@ const confirmProject = (formEl) => {
         fileUrl: projectRuleForm.fileUrl.join(","),
         organize: projectRuleForm.organize,
         sposoner: projectRuleForm.sposoner,
-        coOrganize: projectRuleForm.coOrganize,
-        coSposoner: projectRuleForm.coSposoner,
+        // coOrganize: projectRuleForm.coOrganize,
+        // coSposoner: projectRuleForm.coSposoner,
         scorer: projectRuleForm.scorer.join(","),
       };
       console.log(data);
@@ -2428,6 +2615,16 @@ const confirmProject = (formEl) => {
       // // 判断是否有id存在,有则是修改账号
       if (projectRuleForm.id) {
         data.id = projectRuleForm.id;
+        if(projectRuleForm.coOrganize){
+          data.coOrganize = projectRuleForm.coOrganize;
+        }else{
+          data.coOrganize =""
+        }
+        if(projectRuleForm.coOrganize){
+          data.coSposoner = projectRuleForm.coSposoner;
+        }else{
+          data.coSposoner =""
+        }
         res = await axios({
           method: "post",
           url: api.value + "/api/sysProject/update",
@@ -2438,6 +2635,16 @@ const confirmProject = (formEl) => {
           data: data,
         });
       } else {
+        if(projectRuleForm.coOrganize){
+          data.coOrganize = projectRuleForm.coOrganize;
+        }else{
+          data.coOrganize ="null"
+        }
+        if(projectRuleForm.coOrganize){
+          data.coSposoner = projectRuleForm.coSposoner;
+        }else{
+          data.coSposoner ="null"
+        }
         res = await axios({
           method: "post",
           url: api.value + "/api/sysProject/add",
@@ -2629,7 +2836,10 @@ const handleUpload = async (file) => {
     file.file.type == "image/png" ||
     file.file.type == "application/pdf" ||
     file.file.type ==
-      "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+      "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
+    file.file.type ==
+      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || 
+    file.file.type == "application/vnd.ms-excel"
   ) {
     if (fileList.value.length >= 3) {
       ElMessage.warning("最多可上传3张附件!");
@@ -2671,7 +2881,7 @@ const handleUpload = async (file) => {
       }
     }
   } else {
-    ElMessage.warning("附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'格式");
+    ElMessage.warning("附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'、'.xlsx'、'.xls'格式");
   }
 };
 // 删除文件
@@ -2734,7 +2944,7 @@ const delProject = (row) => {
     .catch(() => {
       ElMessage({
         type: "info",
-        message: "Delete canceled",
+        message: "取消",
       });
     });
 };
@@ -3028,7 +3238,10 @@ const handleUploadTask = async (file) => {
     file.file.type == "image/png" ||
     file.file.type == "application/pdf" ||
     file.file.type ==
-      "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+      "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
+      file.file.type ==
+      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || 
+    file.file.type == "application/vnd.ms-excel"
   ) {
     if (fileListTask.value.length >= 3) {
       ElMessage.warning("最多可上传3张附件!");
@@ -3070,7 +3283,7 @@ const handleUploadTask = async (file) => {
       }
     }
   } else {
-    ElMessage.warning("附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'格式");
+    ElMessage.warning("附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'、'.xlsx'、'.xls'格式");
   }
 };
 // 删除文件
@@ -3234,7 +3447,10 @@ const handleAttachment = async (file) => {
     file.file.type == "image/png" ||
     file.file.type == "application/pdf" ||
     file.file.type ==
-      "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+      "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
+    file.file.type ==
+      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || 
+    file.file.type == "application/vnd.ms-excel"
   ) {
     if (fileListAttachment.value.length >= 3) {
       ElMessage.warning("最多可上传3张附件!");
@@ -3276,7 +3492,7 @@ const handleAttachment = async (file) => {
       }
     }
   } else {
-    ElMessage.warning("附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'格式");
+    ElMessage.warning("附件仅支持'.jpeg'、'.png'、'.pdf'、'.docx'、'.xlsx'、'.xls'格式");
   }
 };
 // 删除文件
@@ -3314,8 +3530,19 @@ const pdfChange = (url) => {
   ) {
     pdfFlag.value = 3;
   }
+  // execl文件
+  else if(url.includes(".xlsx") || url.includes(".xls")){
+    pdfFlag.value = 4;
+  }
   filePreviewPdf(url);
 };
+// execl文件预览
+const renderedHandler =()=> {
+  console.log("渲染完成")
+};
+const errorHandler = ()=> {
+  console.log("渲染失败")
+}
 // 查看PDF
 const filePreviewPdf = (url) => {
   console.log(url, "pdf地址信息");
@@ -3365,6 +3592,7 @@ onBeforeMount(() => {
   departmentList();
   // userList();
   users();
+  scorerList()
 });
 onMounted(() => {
   const timer = setTimeout(() => {