Browse Source

提速优化

刘洋 11 months ago
parent
commit
cb2791b412
3 changed files with 816 additions and 755 deletions
  1. 2 2
      package.json
  2. 231 193
      src/features/ImageDownload/ImageDownload.vue
  3. 583 560
      yarn.lock

+ 2 - 2
package.json

@@ -3,7 +3,7 @@
   "version": "1.3.4",
   "private": true,
   "scripts": {
-    "start": "vue-cli-service serve",
+    "start": "vue-cli-service electron:serve",
     "serve": "vue-cli-service serve",
     "build": "vue-cli-service build",
     "lint": "vue-cli-service lint",
@@ -15,7 +15,7 @@
   },
   "main": "background.js",
   "dependencies": {
-    "ant-design-vue": "^2.2.6",
+    "ant-design-vue": "2.2.6",
     "axios": "^0.21.1",
     "axios-progress-bar": "^1.2.0",
     "axios-retry": "^3.1.9",

+ 231 - 193
src/features/ImageDownload/ImageDownload.vue

@@ -24,6 +24,8 @@ import { countStudents, getPackages, getStudents } from "@/api/api";
 import { httpApp } from "@/plugins/axiosApp";
 import mustache from "mustache";
 
+let statisticTime = 0;
+
 async function getImageDim(
   blob: Blob
 ): Promise<[width: number, height: number]> {
@@ -80,15 +82,216 @@ let students = [];
 
 const config = store.pageInputs["/image-download"];
 // console.log("config::", config);
+const storePassedToNodeJs = JSON.parse(JSON.stringify(store));
+const color = storePassedToNodeJs.config.watermark.color;
+const nextColor = storePassedToNodeJs.config.watermark.nextColor || "#0000ff";
+// const otherColor = storePassedToNodeJs.config.watermark.otherColor;
+const otherColor = "#ddd";
+
+const studentHandler = async (student: any, urls: any) => {
+  try {
+    let allTags = Object.values(student.tags || {})
+      .filter((x) => !!x)
+      .flat()
+      .filter((v: any) => v.userId != 0);
+    allTags.forEach((item: any) => {
+      if (
+        allTags.find((v: any) => {
+          return v.groupNumber == item.groupNumber && v.userId != item.userId;
+        })
+      ) {
+        item.hide = true;
+      } else {
+        item.hide = false;
+      }
+      if (
+        allTags.find((v: any) => {
+          return (
+            v.groupNumber == item.groupNumber &&
+            v.userRole &&
+            v.userRole !== "MARKER" &&
+            (item.userRole === "MARKER" || !item.userRole)
+          );
+        })
+      ) {
+        item.forceHide = true;
+      }
+    });
+
+    // allTags.sort((a: any, b: any) => {
+    //   return a.userId - b.userId;
+    // });
+    let colorMap: any = {};
+    let headerColorMap: any = {};
+    for (let i = 0; i < allTags.length; i++) {
+      const tag: any = allTags[i];
+      const { groupNumber } = tag;
+      if (tag.userRole && tag.userRole !== "MARKER") {
+        if (!headerColorMap[groupNumber + ""]) {
+          headerColorMap[groupNumber + ""] = {};
+          headerColorMap[groupNumber + ""][tag.userId + ""] = "#008000";
+          continue;
+        } else {
+          headerColorMap[groupNumber + ""][tag.userId + ""] = "#008000";
+          continue;
+        }
+      }
+      if (!colorMap[groupNumber + ""]) {
+        colorMap[groupNumber + ""] = {};
+        colorMap[groupNumber + ""][tag.userId + ""] = color;
+      } else {
+        let targetGroupObjKeys = Object.keys(colorMap[groupNumber + ""]);
+        const len = targetGroupObjKeys.length;
+        if (len == 1) {
+          if (!targetGroupObjKeys.includes(tag.userId + "")) {
+            colorMap[groupNumber + ""][tag.userId + ""] = nextColor;
+          } else {
+            continue;
+          }
+        } else if (len > 1) {
+          if (!targetGroupObjKeys.includes(tag.userId + "")) {
+            colorMap[groupNumber + ""][tag.userId + ""] = otherColor;
+          } else {
+            continue;
+          }
+        }
+        // let c = len === 1 ? nextColor : otherColor;
+        // colorMap[groupNumber + ""][tag.userId + ""] = c;
+      }
+    }
+    // console.log("allTags:", allTags);
+    // console.log("colorMap:", colorMap);
+    let resultImgList: any[] = [];
+    let sheetUrlsLength = (student.sheetUrls || []).length;
+    for (const sheetUrl of student.sheetUrls) {
+      if (stopSignal) return;
+      try {
+        const index = student.sheetUrls.indexOf(sheetUrl);
+        student.index = index + 1;
+        student.examId = store.env.examId;
+        // const filePath = window.electron.join(
+        //   config.dir,
+        //   mustache.render(config.template, student)
+        // );
+        const filePath = [
+          config.dir,
+          mustache.render(config.template, student),
+        ];
+        if (config.append && window.electron.existsImage(filePath)) {
+          console.log(filePath + " already exists");
+          // 执行到这里时,可能图片已经cache了
+          urls.splice(urls.indexOf(sheetUrl), 1);
+          // console.log(urls);
+          continue;
+        }
+        console.debug("start ", sheetUrl);
+        const imageDownloadStartTime = Date.now();
+        const imageRes = await httpApp.get(sheetUrl, {
+          responseType: "blob",
+          headers: {
+            "Cache-Control": "no-cache",
+          },
+        });
+        // totalImageDownloadTime += Date.now() - imageDownloadStartTime;
+
+        const [width, height] = await getImageDim(imageRes.data);
+        const arrayBuffer = await imageRes.data.arrayBuffer();
+
+        // console.log(imageRes.data);
+        // console.log(await imageRes.data.arrayBuffer());
+        // console.log(new Uint8Array(await imageRes.data.arrayBuffer()));
+        let onlyUsePdf = config.pdf == "2";
+        // console.log("colorMap:", colorMap);
+        let fileLocation = await window.electron.addWatermark(
+          storePassedToNodeJs,
+          arrayBuffer,
+          width,
+          height,
+          filePath,
+          student,
+          index + 1,
+          config.trackMode,
+          config.x,
+          config.y,
+          colorMap,
+          headerColorMap,
+          onlyUsePdf
+        );
+        resultImgList.push(fileLocation);
+      } catch (error) {
+        window.electron.errorLogger(student, sheetUrl, error);
+        errorCount.value += 1;
+        if (config.failover) {
+          throw error;
+        } else {
+          console.log(student, error);
+          continue;
+        }
+      }
+    }
+    // 下载完一个学生
+    finishedCount.value += 1;
+    if (finishedCount.value == totalCount.value) {
+      console.log(
+        `${finishedCount.value}个学生的图片下载完成,总耗时${
+          Date.now() - statisticTime
+        }ms`
+      );
+      const modal = Modal.success({});
+      modal.update({
+        title: "图片下载完成",
+        content: "完成",
+        onOk: () => router.back(),
+      });
+    }
+    if (
+      resultImgList.length === sheetUrlsLength &&
+      (config.pdf == "2" || config.pdf == "3")
+    ) {
+      let imgName = "";
+      if (config.template.lastIndexOf("/") > -1) {
+        imgName = config.template.slice(config.template.lastIndexOf("/") + 1);
+      } else {
+        imgName = config.template;
+      }
+      let n = imgName.slice(0, imgName.lastIndexOf("."));
+      let pdfName = n
+        .match(/{{.*?}}/g)
+        ?.map((item: any) => {
+          return item.replace("{{", "").replace("}}", "");
+        })
+        .filter((v) => !!v)
+        .map((item: any) => {
+          return item === "index" ? "" : student[item];
+        })
+        .filter((v) => !!v)
+        .join("-");
+
+      window.electron.saveToPDF(resultImgList, [
+        config.dir,
+        `/pdfs/${store.env.examId}/${student.subjectCode}/${pdfName}.pdf`,
+      ]);
+    }
+  } catch (error) {
+    const modal = Modal.error({});
+    console.log(error);
+    modal.update({
+      title: "考生图片下载出错",
+      content: error.message || error,
+      onOk: () => router.back(),
+    });
+  }
+};
+
 onMounted(async () => {
-  const storePassedToNodeJs = JSON.parse(JSON.stringify(store));
-  const color = storePassedToNodeJs.config.watermark.color;
-  const nextColor = storePassedToNodeJs.config.watermark.nextColor || "#0000ff";
-  // const otherColor = storePassedToNodeJs.config.watermark.otherColor;
-  const otherColor = "#ddd";
+  // const storePassedToNodeJs = JSON.parse(JSON.stringify(store));
+  // const color = storePassedToNodeJs.config.watermark.color;
+  // const nextColor = storePassedToNodeJs.config.watermark.nextColor || "#0000ff";
+  // // const otherColor = storePassedToNodeJs.config.watermark.otherColor;
+  // const otherColor = "#ddd";
   try {
     if (config.type === "1") {
-      console.log("download start ", Date.now());
+      // console.log("download start ", Date.now());
       const res = await countStudents(store.env.examId, {
         upload: true,
         withSheetUrl: true,
@@ -99,7 +302,9 @@ onMounted(async () => {
         subjectCodeIn: config.subjectCode ?? "",
       });
       totalCount.value = res.data;
-      let totalImageDownloadTime = 0;
+      console.log(`一共${totalCount.value}个考生`);
+      // let totalImageDownloadTime = 0;
+      statisticTime = Date.now();
       for (
         let pageNumber = 0;
         pageNumber * 10 < totalCount.value;
@@ -128,198 +333,23 @@ onMounted(async () => {
         );
         // cacheImages(urls);
 
-        for (const student of students) {
-          let allTags = Object.values(student.tags || {})
-            .filter((x) => !!x)
-            .flat()
-            .filter((v: any) => v.userId != 0);
-          allTags.forEach((item: any) => {
-            if (
-              allTags.find((v: any) => {
-                return (
-                  v.groupNumber == item.groupNumber && v.userId != item.userId
-                );
-              })
-            ) {
-              item.hide = true;
-            } else {
-              item.hide = false;
-            }
-            if (
-              allTags.find((v: any) => {
-                return (
-                  v.groupNumber == item.groupNumber &&
-                  v.userRole &&
-                  v.userRole !== "MARKER" &&
-                  (item.userRole === "MARKER" || !item.userRole)
-                );
-              })
-            ) {
-              item.forceHide = true;
-            }
-          });
-
-          // allTags.sort((a: any, b: any) => {
-          //   return a.userId - b.userId;
-          // });
-          let colorMap: any = {};
-          let headerColorMap: any = {};
-          for (let i = 0; i < allTags.length; i++) {
-            const tag: any = allTags[i];
-            const { groupNumber } = tag;
-            if (tag.userRole && tag.userRole !== "MARKER") {
-              if (!headerColorMap[groupNumber + ""]) {
-                headerColorMap[groupNumber + ""] = {};
-                headerColorMap[groupNumber + ""][tag.userId + ""] = "#008000";
-                continue;
-              } else {
-                headerColorMap[groupNumber + ""][tag.userId + ""] = "#008000";
-                continue;
-              }
-            }
-            if (!colorMap[groupNumber + ""]) {
-              colorMap[groupNumber + ""] = {};
-              colorMap[groupNumber + ""][tag.userId + ""] = color;
-            } else {
-              let targetGroupObjKeys = Object.keys(colorMap[groupNumber + ""]);
-              const len = targetGroupObjKeys.length;
-              if (len == 1) {
-                if (!targetGroupObjKeys.includes(tag.userId + "")) {
-                  colorMap[groupNumber + ""][tag.userId + ""] = nextColor;
-                } else {
-                  continue;
-                }
-              } else if (len > 1) {
-                if (!targetGroupObjKeys.includes(tag.userId + "")) {
-                  colorMap[groupNumber + ""][tag.userId + ""] = otherColor;
-                } else {
-                  continue;
-                }
-              }
-              // let c = len === 1 ? nextColor : otherColor;
-              // colorMap[groupNumber + ""][tag.userId + ""] = c;
-            }
-          }
-          console.log("allTags:", allTags);
-          // console.log("colorMap:", colorMap);
-          let resultImgList: any[] = [];
-          let sheetUrlsLength = (student.sheetUrls || []).length;
-          for (const sheetUrl of student.sheetUrls) {
-            if (stopSignal) return;
-            try {
-              const index = student.sheetUrls.indexOf(sheetUrl);
-              student.index = index + 1;
-              student.examId = store.env.examId;
-              // const filePath = window.electron.join(
-              //   config.dir,
-              //   mustache.render(config.template, student)
-              // );
-              const filePath = [
-                config.dir,
-                mustache.render(config.template, student),
-              ];
-              if (config.append && window.electron.existsImage(filePath)) {
-                console.log(filePath + " already exists");
-                // 执行到这里时,可能图片已经cache了
-                urls.splice(urls.indexOf(sheetUrl), 1);
-                // console.log(urls);
-                continue;
-              }
-              console.debug("start ", sheetUrl);
-              const imageDownloadStartTime = Date.now();
-              const imageRes = await httpApp.get(sheetUrl, {
-                responseType: "blob",
-                headers: {
-                  "Cache-Control": "no-cache",
-                },
-              });
-              totalImageDownloadTime += Date.now() - imageDownloadStartTime;
-
-              const [width, height] = await getImageDim(imageRes.data);
-              const arrayBuffer = await imageRes.data.arrayBuffer();
+        // for (const student of students) {
 
-              // console.log(imageRes.data);
-              // console.log(await imageRes.data.arrayBuffer());
-              // console.log(new Uint8Array(await imageRes.data.arrayBuffer()));
-              let onlyUsePdf = config.pdf == "2";
-              console.log("colorMap:", colorMap);
-              let fileLocation = await window.electron.addWatermark(
-                storePassedToNodeJs,
-                arrayBuffer,
-                width,
-                height,
-                filePath,
-                student,
-                index + 1,
-                config.trackMode,
-                config.x,
-                config.y,
-                colorMap,
-                headerColorMap,
-                onlyUsePdf
-              );
-              resultImgList.push(fileLocation);
-            } catch (error) {
-              window.electron.errorLogger(student, sheetUrl, error);
-              errorCount.value += 1;
-              if (config.failover) {
-                throw error;
-              } else {
-                console.log(student, error);
-                continue;
-              }
-            }
-          }
-          // 下载完一个学生
-          finishedCount.value += 1;
-          if (
-            resultImgList.length === sheetUrlsLength &&
-            (config.pdf == "2" || config.pdf == "3")
-          ) {
-            let imgName = "";
-            if (config.template.lastIndexOf("/") > -1) {
-              imgName = config.template.slice(
-                config.template.lastIndexOf("/") + 1
-              );
-            } else {
-              imgName = config.template;
-            }
-            let n = imgName.slice(0, imgName.lastIndexOf("."));
-            let pdfName = n
-              .match(/{{.*?}}/g)
-              ?.map((item: any) => {
-                return item.replace("{{", "").replace("}}", "");
-              })
-              .filter((v) => !!v)
-              .map((item: any) => {
-                return item === "index" ? "" : student[item];
-              })
-              .filter((v) => !!v)
-              .join("-");
-
-            window.electron.saveToPDF(resultImgList, [
-              config.dir,
-              `/pdfs/${store.env.examId}/${student.subjectCode}/${pdfName}.pdf`,
-            ]);
-          }
-        }
+        // }
+        students.forEach((student: any) => {
+          studentHandler(student, urls);
+        });
       }
-      console.log(
-        "all end at ",
-        Date.now(),
-        " totalImageDownloadTime: ",
-        totalImageDownloadTime
-      );
     } else if (config.type === "2") {
       await processPackage();
     }
 
-    const modal = Modal.success({});
-    modal.update({
-      title: "图片下载完成",
-      content: "完成",
-      onOk: () => router.back(),
-    });
+    // const modal = Modal.success({});
+    // modal.update({
+    //   title: "图片下载完成",
+    //   content: "完成",
+    //   onOk: () => router.back(),
+    // });
   } catch (error) {
     const modal = Modal.error({});
     console.log(error);
@@ -374,6 +404,14 @@ async function processPackage() {
       }
     }
     finishedCount.value += 1;
+    if (finishedCount.value == totalCount.value) {
+      const modal = Modal.success({});
+      modal.update({
+        title: "图片下载完成",
+        content: "完成",
+        onOk: () => router.back(),
+      });
+    }
   }
 }
 

File diff suppressed because it is too large
+ 583 - 560
yarn.lock


Some files were not shown because too many files changed in this diff