Просмотр исходного кода

fix(excel export): 完善考核数据导出excel的表头和列宽适配

1.  新增动态采集二级指标作为导出表头
2.  为每个二级指标添加对应列宽
3.  修复导出时的字段引用问题
4.  添加数据时间过滤逻辑
SanHQin 2 дней назад
Родитель
Сommit
e0c7a4932b
1 измененных файлов с 62 добавлено и 5 удалено
  1. 62 5
      src/components/pages/test/examine/conpoments/personPage.vue

+ 62 - 5
src/components/pages/test/examine/conpoments/personPage.vue

@@ -750,6 +750,8 @@ ws['!page'] = {
             e.json = JSON.parse(e.json);
             e.json = JSON.parse(e.json);
           });
           });
 
 
+          data =  data.filter(e=>[this.timeA,this.timeB].includes(e.time))
+          // console.log("filterData",data)
           data.forEach(e => {
           data.forEach(e => {
             e.evaSca = 0;
             e.evaSca = 0;
             e.cogSco = 0;
             e.cogSco = 0;
@@ -796,6 +798,8 @@ ws['!page'] = {
 
 
             if(testList.length>0){
             if(testList.length>0){
               let _time = data[i].timeValue?JSON.parse(data[i].timeValue):{};
               let _time = data[i].timeValue?JSON.parse(data[i].timeValue):{};
+              // console.log("testList",testList)
+              // console.log("await this.computedTest(testList,data[i].userid,_time)3")
               let testData = await this.computedTest(testList,data[i].userid,_time)
               let testData = await this.computedTest(testList,data[i].userid,_time)
               let _isReviewNum = 0;
               let _isReviewNum = 0;
               let _num = 0;
               let _num = 0;
@@ -917,6 +921,7 @@ ws['!page'] = {
 
 
       let _time = _test.timeValue?JSON.parse(_test.timeValue):{};
       let _time = _test.timeValue?JSON.parse(_test.timeValue):{};
 
 
+      // console.log("this.computedTest(_testList,_test.userid,_time)1")
       let allTestData = await this.computedTest(_testList,_test.userid,_time)
       let allTestData = await this.computedTest(_testList,_test.userid,_time)
 
 
 
 
@@ -1376,6 +1381,7 @@ ws['!page'] = {
       for (const e of this.PageBaseData) {
       for (const e of this.PageBaseData) {
         for (const k of e.children) {
         for (const k of e.children) {
           if (k.testid.test.length > 0) {
           if (k.testid.test.length > 0) {
+            // console.log("await this.computedTest(k.testid.test);")
             k.testid.test = await this.computedTest(k.testid.test);
             k.testid.test = await this.computedTest(k.testid.test);
           }
           }
         }
         }
@@ -1512,14 +1518,62 @@ ws['!page'] = {
 
 
     exportListExcel() {
     exportListExcel() {
       this.fetchFormulaForList().then(formula => {
       this.fetchFormulaForList().then(formula => {
-        let headers = [["教师名称", "认定分", "加权分"]];
+        // 解析 rjson 的辅助函数
+        const parseRjson = (person) => {
+          if (!person.rjson) return null;
+          try {
+            let obj = typeof person.rjson === "string" ? JSON.parse(person.rjson) : person.rjson;
+            return obj.rjson || null;
+          } catch (e) {
+            return null;
+          }
+        };
+
+        // 收集所有唯一的二级指标(按首次出现顺序)
+        let indicatorMap = new Map();
+        this.copyTableData.forEach(person => {
+          let rjsonArr = parseRjson(person);
+          if (rjsonArr && Array.isArray(rjsonArr)) {
+            rjsonArr.forEach(firstLevel => {
+              if (firstLevel.children && Array.isArray(firstLevel.children)) {
+                firstLevel.children.forEach(secondLevel => {
+                  if (!indicatorMap.has(secondLevel.id)) {
+                    indicatorMap.set(secondLevel.id, {
+                      id: secondLevel.id,
+                      name: secondLevel.name
+                    });
+                  }
+                });
+              }
+            });
+          }
+        });
+        let indicators = Array.from(indicatorMap.values());
+
+        let headers = [["教师名称", ...indicators.map(i => i.name), "认定分", "加权分"]];
         let rows = this.copyTableData.map(person => {
         let rows = this.copyTableData.map(person => {
+          // 构建该人员的 sco2 映射
+          let sco2Map = {};
+          let rjsonArr = parseRjson(person);
+          let personJson = person.json;
+          if (rjsonArr && Array.isArray(rjsonArr)) {
+            rjsonArr.forEach(firstLevel => {
+              if (firstLevel.children && Array.isArray(firstLevel.children)) {
+                firstLevel.children.forEach(secondLevel => {
+                  sco2Map[secondLevel.id] = secondLevel.sco2 || "";
+                });
+              }
+            });
+          }
+          let indicatorScores = indicators.map(ind =>
+            sco2Map[ind.id] !== undefined ? sco2Map[ind.id] : ""
+          );
           let cogSco = person.cogSco || "0.00";
           let cogSco = person.cogSco || "0.00";
           let formulaScore = "0.00";
           let formulaScore = "0.00";
-          if (formula && person.json) {
-            formulaScore = this.computeFormulaForPerson(person.json, formula);
+          if (formula && personJson) {
+            formulaScore = this.computeFormulaForPerson(personJson, formula);
           }
           }
-          return [person.username || "", cogSco, formulaScore];
+          return [person.username || "", ...indicatorScores, cogSco, formulaScore];
         });
         });
         let data = [...headers, ...rows];
         let data = [...headers, ...rows];
         const wb = XLSX.utils.book_new();
         const wb = XLSX.utils.book_new();
@@ -1535,7 +1589,10 @@ ws['!page'] = {
             ws[cellRef].s = commonStyle;
             ws[cellRef].s = commonStyle;
           }
           }
         }
         }
-        ws["!cols"] = [{ wch: 20 }, { wch: 12 }, { wch: 12 }];
+        let colWidths = [{ wch: 20 }];
+        indicators.forEach(() => colWidths.push({ wch: 14 }));
+        colWidths.push({ wch: 12 }, { wch: 12 });
+        ws["!cols"] = colWidths;
         XLSX.utils.book_append_sheet(wb, ws, "考核列表");
         XLSX.utils.book_append_sheet(wb, ws, "考核列表");
         XLSX.writeFile(wb, "考核数据导出.xlsx");
         XLSX.writeFile(wb, "考核数据导出.xlsx");
       });
       });