Michael Wang 3 роки тому
батько
коміт
7d3b92c15a

+ 0 - 67
src/api/api.ts

@@ -1,69 +1,11 @@
-// import request from "requestretry";
-// import env from "./env";
-// import _logger from "./logger";
-// const logger = _logger("api.js");
 // @ts-nocheck
 import { httpApp } from "@/plugins/axiosApp";
-import { store } from "@/store";
-
-// async function execute(uri, method, form) {
-//   // await new Promise((res) => setTimeout(res, 3000));
-//   console.log("sending...");
-//   console.log(uri, method, globalThis, globalThis.env);
-//   // console.log(globalThis.electron.env);
-//   // Object.assign(env, globalThis.electron.env);
-//   return new Promise((resolve, reject) => {
-//     request(
-//       {
-//         url: env.server.host + uri,
-//         method: method,
-//         json: true,
-//         timeout: 10000,
-//         form: form || {},
-//         headers: {
-//           "auth-info":
-//             "loginname=" + env.loginName + ";password=" + env.password,
-//         },
-//         maxAttempts: 50,
-//         retryDelay: 500,
-//         retryStrategy: request.RetryStrategies.HTTPOrNetworkError,
-//       },
-//       function (error, response, body) {
-//         if (response.statusCode == 200) {
-//           resolve(body);
-//         } else {
-//           const message =
-//             response.statusCode +
-//             " " +
-//             (error || "") +
-//             (response.headers["error-info"] || "");
-//           logger.error(message);
-//           reject(message);
-//         }
-//       }
-//     );
-//   });
-// }
 
 export function login() {
-  // return execute("/api/user/login", "GET");
   return httpApp.get("/api/user/login");
 }
 
 export function getExams(pageNumber: number, pageSize: number) {
-  // let uri = "/api/exams";
-  // const param = [];
-  // if (pageNumber != undefined) {
-  //   param.push("pageNumber=" + pageNumber);
-  // }
-  // if (pageSize != undefined) {
-  //   param.push("pageSize=" + pageSize);
-  // }
-  // if (param.length > 0) {
-  //   uri = uri + "?" + param.join("&");
-  // }
-  // return execute(uri, "GET");
-
   return httpApp.get(
     "/api/exams?" +
       new URLSearchParams({
@@ -114,12 +56,3 @@ export function getPackages(examId, upload, withUrl) {
   }
   return httpApp.get(uri);
 }
-
-export default {
-  // execute,
-  login,
-  // getExams,
-  // getStudents,
-  // countStudents,
-  // getPackages,
-};

+ 1 - 14
src/background.ts

@@ -1,10 +1,9 @@
 "use strict";
 
 import path from "path";
-import { app, protocol, BrowserWindow, ipcMain } from "electron";
+import { app, protocol, BrowserWindow } from "electron";
 import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
 import installExtension, { VUEJS3_DEVTOOLS } from "electron-devtools-installer";
-import config from "./lib/config";
 const isDevelopment = process.env.NODE_ENV !== "production";
 
 // Scheme must be registered before the app is ready
@@ -87,15 +86,3 @@ if (isDevelopment) {
     });
   }
 }
-
-import theEnv, { merge } from "./lib/env";
-import { login } from "./lib/api";
-ipcMain.on("update-env", (event, env) => {
-  console.log(env, theEnv);
-  merge(env);
-  console.log(theEnv);
-  globalThis.env = theEnv;
-  // login();
-  // event.reply("asynchronous-reply", "pong");
-  event.returnValue = env;
-});

+ 1 - 1
src/components/Layout.vue

@@ -11,7 +11,7 @@
       <slot />
     </div>
     <div class="ft">
-      Copyright © 2011-2020 www.qmth.com.cn, All Rights Reserved
+      Copyright © 2011-2021 www.qmth.com.cn, All Rights Reserved
     </div>
   </div>
 </template>

+ 14 - 28
src/features/Sync/Sync.vue

@@ -1,31 +1,17 @@
 <template>
-  <div class="wp">
-    <div class="hd">
-      <div class="logo"><img src="img/logo.png" /></div>
-      <span class="y">
-        欢迎您,<span id="user-name"></span> <span class="pipe">|</span
-        ><a href="login.html">退出</a>
-      </span>
-    </div>
-    <div class="cont">
-      <div class="title cl">
-        <span class="y"><a href="index.html">返回考试主页</a></span>
-        <h2>数据同步</h2>
-      </div>
-      <div class="data">
-        <p>
-          本地已下载考生数量:<b id="student-count">{{ studentCount }}</b>
-        </p>
-        <p>
-          上次下载完成时间:<b id="last-time">{{ lastTime }}</b>
-        </p>
-        <div class="btn">
-          <a href="/sync-run"><span>开始同步数据</span></a>
-        </div>
-      </div>
-    </div>
-    <div class="ft">
-      Copyright © 2011-2020 www.qmth.com.cn, All Rights Reserved
+  <div class="title cl">
+    <span class="y"><router-link to="/home">返回考试主页</router-link></span>
+    <h2>数据同步</h2>
+  </div>
+  <div class="data">
+    <p>
+      本地已下载考生数量:<b id="student-count">{{ studentCount }}</b>
+    </p>
+    <p>
+      上次下载完成时间:<b id="last-time">{{ lastTime }}</b>
+    </p>
+    <div class="btn">
+      <a href="/sync-run"><span>开始同步数据</span></a>
     </div>
   </div>
 </template>
@@ -42,7 +28,7 @@ onMounted(async () => {
   const studentCountRes = await window.electron.queryStudentCount(
     JSON.parse(JSON.stringify(store))
   );
-  console.log(studentCountRes);
+  // console.log(studentCountRes);
   studentCount.value = studentCountRes;
 });
 </script>

+ 13 - 34
src/features/SyncRun/SyncRun.vue

@@ -1,39 +1,18 @@
 <template>
-  <div class="wp">
-    <div class="wp">
-      <div class="hd">
-        <div class="logo"><img src="img/logo.png" /></div>
-        <span class="y">
-          欢迎您,<span id="user-name"></span> <span class="pipe">|</span
-          ><a href="##">退出</a>
-        </span>
-      </div>
-      <div class="cont">
-        <div class="title title_grey cl">
-          <h2>数据同步中 …</h2>
-        </div>
-        <div class="progress-box">
-          <h3 id="message">{{ status }}</h3>
-          <div class="progress">
-            <!-- <div class="progress-outer">
-              <div id="progress" class="progress-inner" style="width: 0%">
-                <span class="progress-text"></span>
-              </div>
-            </div> -->
-            <a-progress
-              :percent="Math.round((finishCount / totalCount) * 100)"
-            />
-          </div>
-          <p>
-            已数据同步考生:<b id="finish-count">{{ finishCount }}</b> /
-            全部考生:<b id="total-count">{{ totalCount }}</b>
-          </p>
-        </div>
-      </div>
-      <div class="ft">
-        Copyright © 2011-2020 www.qmth.com.cn, All Rights Reserved
-      </div>
+  <div class="title title_grey cl">
+    <h2>数据同步中 …</h2>
+  </div>
+  <div class="progress-box">
+    <h3 id="message">{{ status }}</h3>
+    <div class="progress">
+      <a-progress :percent="Math.round((finishCount / totalCount) * 100)" />
     </div>
+    <p>
+      已数据同步考生:<b id="finish-count">{{ finishCount }}</b> / 全部考生:<b
+        id="total-count"
+        >{{ totalCount }}</b
+      >
+    </p>
   </div>
 </template>
 

+ 0 - 115
src/lib/api.ts

@@ -1,115 +0,0 @@
-import request from "requestretry";
-// import env from "./env";
-import _logger from "./logger";
-const logger = _logger("api.js");
-import fs from "fs/promises";
-
-async function doIt(filepath: string) {
-  const b = await fs.readFile(filepath);
-  console.log(b.toString());
-}
-
-async function execute(uri, method, form) {
-  // await new Promise((res) => setTimeout(res, 3000));
-  console.log("sending...");
-  console.log(uri, method, globalThis, globalThis.env);
-  // console.log(globalThis.electron.env);
-  // Object.assign(env, globalThis.electron.env);
-  return new Promise((resolve, reject) => {
-    request(
-      {
-        url: env.server.host + uri,
-        method: method,
-        json: true,
-        timeout: 10000,
-        form: form || {},
-        headers: {
-          "auth-info":
-            "loginname=" + env.loginName + ";password=" + env.password,
-        },
-        maxAttempts: 50,
-        retryDelay: 500,
-        retryStrategy: request.RetryStrategies.HTTPOrNetworkError,
-      },
-      function (error, response, body) {
-        if (response.statusCode == 200) {
-          resolve(body);
-        } else {
-          const message =
-            response.statusCode +
-            " " +
-            (error || "") +
-            (response.headers["error-info"] || "");
-          logger.error(message);
-          reject(message);
-        }
-      }
-    );
-  });
-}
-
-export function login() {
-  return execute("/api/user/login", "GET");
-}
-
-export function getExams(pageNumber, pageSize) {
-  let uri = "/api/exams";
-  const param = [];
-  if (pageNumber != undefined) {
-    param.push("pageNumber=" + pageNumber);
-  }
-  if (pageSize != undefined) {
-    param.push("pageSize=" + pageSize);
-  }
-  if (param.length > 0) {
-    uri = uri + "?" + param.join("&");
-  }
-  return execute(uri, "GET");
-}
-
-export function getStudents(examId, pageNumber, pageSize, params) {
-  const form = {
-    examId: examId,
-    pageNumber: pageNumber,
-    pageSize: pageSize,
-  };
-  if (params != undefined) {
-    for (const key in params) {
-      if (params[key] && params[key] != "") {
-        form[key] = params[key];
-      }
-    }
-  }
-  return execute("/api/exam/students", "POST", form);
-}
-
-export function countStudents(examId, params) {
-  params = params || {};
-  params.examId = examId;
-  return execute("/api/exam/students/count", "POST", params);
-}
-
-export function getPackages(examId, upload, withUrl) {
-  let uri = "/api/package/count/" + examId;
-  const param = [];
-  if (upload != undefined) {
-    param.push("upload=" + (upload ? "true" : "false"));
-  }
-  if (withUrl != undefined) {
-    param.push("withUrl=" + (withUrl ? "true" : "false"));
-  }
-  if (param.length > 0) {
-    uri = uri + "?" + param.join("&");
-  }
-  return execute(uri, "GET");
-}
-
-export default {
-  execute,
-  // login,
-  getExams,
-  getStudents,
-  countStudents,
-  getPackages,
-  doIt,
-};

+ 0 - 11
src/lib/channel.ts

@@ -1,11 +0,0 @@
-const { MessageChannel } = require("worker_threads");
-
-const { port1, port2 } = new MessageChannel();
-
-export function send(message) {
-  port2.postMessage(message);
-}
-
-export function receiveMessage(cb) {
-  port1.on("message", cb);
-}

+ 0 - 1
src/lib/config.ts

@@ -1,7 +1,6 @@
 import fs, { readFileSync } from "fs";
 import path from "path";
 import moment from "moment";
-// import env from "./env";
 
 const configJson = readFileSync(path.join(__dirname, "../config.json"));
 const store = JSON.parse(configJson.toString());

+ 0 - 7
src/lib/env.ts

@@ -1,10 +1,3 @@
 const store = {};
 
 export default store;
-
-export function merge(obj: any): void {
-  if (obj == undefined) {
-    return;
-  }
-  Object.assign(store, obj);
-}

+ 0 - 449
src/lib/image.ts

@@ -1,449 +0,0 @@
-//云端图片操作工具
-import EventEmitter from "events";
-import api from "./api";
-import env from "./env";
-import config from "./config";
-import fs from "fs";
-import path from "path";
-import readline from "readline";
-import request_util from "requestretry";
-import sizeOf from "image-size";
-import mustache from "mustache";
-import mkdirp from "mkdirp";
-
-import _logger from "./logger";
-const logger = _logger("image.js");
-const downloadLogger = _logger("download");
-
-const gm =
-  config.imagemagick != undefined
-    ? require("gm").subClass({
-        imageMagick: true,
-        appPath: config.imagemagick,
-      })
-    : require("gm");
-
-class executor extends EventEmitter {
-  async readFile(file) {
-    return new Promise((resolve) => {
-      const data = [];
-      if (fs.existsSync(file)) {
-        const reader = readline.createInterface({
-          input: fs.createReadStream(file),
-        });
-        reader.on("line", (line) => {
-          data.push(line);
-        });
-        reader.on("close", () => {
-          resolve(data);
-        });
-      } else {
-        resolve(data);
-      }
-    });
-  }
-
-  async addWatermark(image, file, student, index, trackMode) {
-    const fontFile = config.watermark.fontFile;
-    const color = config.watermark.color;
-    const size = sizeOf(image);
-    const imgData = gm(image);
-    //添加第一页的得分明细
-    if (index == 1) {
-      //初始坐标
-      let x = 30;
-      let y = 10;
-      //最大宽/高限制
-      const fontSize = config.watermark.fontSize || 30;
-      const maxX = size.width / 2 - x * 2;
-      const height = fontSize + 10;
-      //计算总分
-      const totalScore =
-        (parseFloat(student.objectiveScore) || 0) +
-        (parseFloat(student.subjectiveScore) || 0);
-      //显示总分明细
-      imgData.font(fontFile, fontSize).fill(color);
-      imgData.drawText(x, (y += height), "成绩明细");
-      //普通考试模式,按客观+主观模式显示总分
-      if (trackMode === "1") {
-        imgData.drawText(
-          x,
-          (y += height),
-          "总分=(客观+主观) | " +
-            totalScore +
-            "=" +
-            student.objectiveScore +
-            "+" +
-            student.subjectiveScore
-        );
-      }
-      //研究生考试模式,只显示总分
-      else if (trackMode === "2") {
-        imgData.drawText(x, (y += height), "总分=" + totalScore + "分");
-      }
-      //显示客观题明细
-      if (
-        student.objectiveScoreDetail &&
-        student.objectiveScoreDetail.length > 0
-      ) {
-        const lines = [];
-        let array = [];
-        //前置提示文字的字符数
-        let count = 10;
-        lines.push(array);
-        for (let i = 0; i < student.objectiveScoreDetail.length; i++) {
-          const detail = student.objectiveScoreDetail[i];
-          const content = detail.answer + ":" + detail.score;
-          //超长后另起一行显示客观题
-          if ((count + content.length) * fontSize * 0.7 > maxX) {
-            array = [];
-            lines.push(array);
-            count = 10;
-          }
-          array.push(content);
-          count += content.length;
-        }
-        //显示所有行的客观题明细
-        for (let l = 0; l < lines.length; l++) {
-          imgData.drawText(
-            x,
-            (y += height),
-            "客观题识别结果 | " + lines[l].join(";")
-          );
-        }
-      }
-      //显示复核人
-      if (student.inspector) {
-        imgData.drawText(
-          x,
-          (y += height),
-          "复核人: " + student.inspector.loginName
-        );
-      }
-      //显示主观题明细
-      if (
-        student.subjectiveScoreDetail &&
-        student.subjectiveScoreDetail.length > 0
-      ) {
-        //普通考试模式,按小题显示明细
-        if (trackMode === "1") {
-          const title = "主观题号 | 分数 | 评卷员 | 仲裁员";
-          const startY = y;
-          let width = title.length * fontSize;
-          imgData.drawText(x, (y += height), title);
-          for (let i = 0; i < student.subjectiveScoreDetail.length; i++) {
-            const detail = student.subjectiveScoreDetail[i];
-            //超过最大高度了则另起一列
-            if (y + height + 15 > size.height) {
-              y = startY;
-              x += width;
-              imgData.drawText(x, (y += height), title);
-            }
-            const content =
-              detail.mainNumber +
-              "-" +
-              detail.subNumber +
-              " : " +
-              detail.score +
-              " " +
-              (detail.marker || "") +
-              " " +
-              (detail.header || "");
-            width = Math.max(width, content.length * fontSize);
-            imgData.drawText(x, (y += height), content);
-          }
-        }
-        //研究生考试模式,按分组显示明细
-        else if (trackMode === "2") {
-          const title = "评卷分组 | 总分 | 评卷员 | 仲裁员";
-          const startY = y;
-          let width = title.length * fontSize;
-          imgData.drawText(x, (y += height), title);
-          //所有小题得分按评卷分组聚合
-          let maxGroupNumber = 0;
-          const groups = {};
-          for (let i = 0; i < student.subjectiveScoreDetail.length; i++) {
-            const detail = student.subjectiveScoreDetail[i];
-            let group = groups[detail.groupNumber];
-            if (group == undefined) {
-              group = {
-                number: detail.groupNumber,
-                score: 0,
-                title: {},
-                titleString: [],
-                marker: {},
-                markerString: [],
-                header: {},
-                headerString: [],
-              };
-              groups[detail.groupNumber] = group;
-              maxGroupNumber = Math.max(maxGroupNumber, group.number);
-            }
-            group.score = group.score + detail.score;
-            if (detail.mainTitle && !group.title[detail.mainTitle]) {
-              group.titleString.push(detail.mainTitle);
-              group.title[detail.mainTitle] = true;
-            }
-            if (detail.marker && !group.marker[detail.marker]) {
-              group.markerString.push(detail.marker);
-              group.marker[detail.marker] = true;
-            }
-            if (detail.header && !group.header[detail.header]) {
-              group.headerString.push(detail.header);
-              group.header[detail.header] = true;
-            }
-          }
-          for (let i = 1; i <= maxGroupNumber; i++) {
-            const group = groups[i];
-            if (group != undefined) {
-              //超过最大高度了则另起一列
-              if (y + height + 15 > size.height) {
-                y = startY;
-                x += width;
-                imgData.drawText(x, (y += height), title);
-              }
-              const content =
-                group.number +
-                "(" +
-                group.titleString.join(",") +
-                ")" +
-                " " +
-                group.score +
-                " " +
-                group.markerString.join(",") +
-                " " +
-                group.headerString.join(",");
-              width = Math.max(width, content.length * fontSize);
-              imgData.drawText(x, (y += height), content);
-            }
-          }
-        }
-      }
-    }
-    //显示评卷标记
-    if (student.tags != undefined && student.tags[index] != undefined) {
-      const fontSize = 60;
-      const height = fontSize + 10;
-      imgData.font(fontFile, fontSize).fill(color);
-      const tags = student.tags[index];
-      for (let i = 0; i < tags.length; i++) {
-        const tag = tags[i];
-        if (tag.content != undefined) {
-          let top = tag.top;
-          for (let j = 0; j < tag.content.length; j++) {
-            imgData.drawText(tag.left, top, tag.content[j]);
-            top += height;
-          }
-        }
-      }
-    }
-
-    return new Promise((resolve, reject) => {
-      imgData.write(file, (error) => {
-        if (error) {
-          logger.error("add watermark error: " + file);
-          logger.error(error);
-          reject(error);
-        } else {
-          resolve();
-        }
-      });
-    });
-  }
-
-  async downloadUrl(url) {
-    return new Promise((resolve, reject) => {
-      request_util(
-        {
-          url: url,
-          method: "GET",
-          encoding: null,
-          timeout: 3000,
-          maxAttempts: 3,
-          retryDelay: 500,
-          retryStrategy: request_util.RetryStrategies.HTTPOrNetworkError,
-        },
-        function (error, response, body) {
-          if (!error && response.statusCode == 200) {
-            resolve(body);
-          } else {
-            logger.error(error || url + " download error");
-            error = error || {};
-            error.code = response ? response.statusCode : 500;
-            reject(error);
-          }
-        }
-      );
-    });
-  }
-
-  async downloadFile(
-    type,
-    append,
-    url,
-    localTemplate,
-    data,
-    dir,
-    index,
-    watermark,
-    trackMode
-  ) {
-    data.index = index;
-    const local = path.join(dir, mustache.render(localTemplate, data));
-    mkdirp.sync(path.dirname(local));
-
-    //续传模式下,判断目标文件是否存在,存在则直接跳过
-    if (append && fs.existsSync(local)) {
-      return Promise.resolve();
-    } else {
-      let imgData;
-      try {
-        imgData = await this.downloadUrl(url);
-      } catch (err) {
-        if (err.code === 404) {
-          //文件不存在,记录日志并跳过
-          downloadLogger.error("404 " + type + " " + url);
-          return Promise.resolve();
-        } else {
-          logger.error(err);
-          return Promise.reject(err);
-        }
-      }
-
-      //是否需要添加分数水印
-      if (watermark) {
-        return this.addWatermark(imgData, local, data, index, trackMode);
-      } else {
-        return new Promise((resolve, reject) => {
-          fs.writeFile(local, imgData, (err) => {
-            if (err) {
-              logger.error("write image file error: " + local);
-              logger.error(err);
-              reject(err);
-            } else {
-              resolve();
-            }
-          });
-        });
-      }
-    }
-  }
-
-  async downloadSheet(
-    dir,
-    template,
-    append,
-    failover,
-    watermark,
-    trackMode,
-    params
-  ) {
-    params.upload = true;
-    params.withSheetUrl = true;
-    params.withScoreDetail = watermark === true;
-    params.withMarkTrack = watermark === true;
-    params.withGroupScoreTrack = watermark === true && trackMode === "1";
-
-    try {
-      const totalCount = await api.countStudents(env.examId, params);
-      this.emit("total", totalCount);
-
-      let count = 0;
-      let pageNumber = 0;
-      this.emit("count", 0);
-      for (;;) {
-        pageNumber++;
-        const array = await api.getStudents(env.examId, pageNumber, 10, params);
-        if (array == undefined || array.length == 0) {
-          break;
-        }
-        for (let i = 0; i < array.length; i++) {
-          const promises = [];
-          const student = array[i];
-          student.examId = env.examId;
-          for (let i = 0; i < student.sheetUrls.length; i++) {
-            promises.push(
-              this.downloadFile(
-                "sheet",
-                append,
-                student.sheetUrls[i],
-                template,
-                student,
-                dir,
-                i + 1,
-                watermark,
-                trackMode
-              )
-            );
-          }
-          try {
-            //等待所有图片下载完毕
-            await Promise.all(promises);
-            count++;
-            this.emit("count", count);
-          } catch (err) {
-            //判断是否异常终止
-            if (failover) {
-              throw err;
-            } else {
-              logger.error("download sheet error:" + err);
-              logger.error(err);
-              continue;
-            }
-          }
-        }
-      }
-      this.emit("finish");
-    } catch (error) {
-      logger.error("download sheet error:" + error);
-      logger.error(error);
-      this.emit("error", error);
-    }
-  }
-
-  async downloadPackage(dir, template, append, failover) {
-    try {
-      const array = await api.getPackages(env.examId, true, true);
-      this.emit("total", array.length);
-      let count = 0;
-      this.emit("count", 0);
-      for (let i = 0; i < array.length; i++) {
-        const p = array[i];
-        p.examId = env.examId;
-        for (let i = 0; i < p.urls.length; i++) {
-          try {
-            await this.downloadFile(
-              "package",
-              append,
-              p.urls[i],
-              template,
-              p,
-              dir,
-              i + 1
-            );
-          } catch (err) {
-            //判断是否异常终止
-            if (failover) {
-              throw err;
-            } else {
-              logger.error("download package error: " + err);
-              logger.error(err);
-              continue;
-            }
-          }
-        }
-        count++;
-        this.emit("count", count);
-      }
-      this.emit("finish");
-    } catch (error) {
-      logger.error("download package error: " + error);
-      logger.error(error);
-      this.emit("error", error);
-    }
-  }
-}
-
-export default function () {
-  return new executor();
-}

+ 0 - 30
src/lib/logger.ts

@@ -1,30 +0,0 @@
-import log4js from "log4js";
-import path from "path";
-import config from "./config";
-
-log4js.configure({
-  appenders: {
-    everything: {
-      type: "dateFile",
-      filename: path.join(__dirname, "../../logs/app.log"),
-    },
-    download: {
-      type: "file",
-      filename: path.join(__dirname, "../../logs/download.log"),
-    },
-  },
-  categories: {
-    default: {
-      appenders: ["everything"],
-      level: config.logger.level,
-    },
-    download: {
-      appenders: ["download"],
-      level: config.logger.level,
-    },
-  },
-});
-
-export default function (module) {
-  return log4js.getLogger(module);
-}

+ 0 - 37
src/lib/promise-pool.ts

@@ -1,37 +0,0 @@
-//Promise并发控制池
-import EventEmitter from "events";
-
-class PromisePool extends EventEmitter {
-  constructor(concurrent, promiseCreator) {
-    super();
-    this.concurrent = concurrent || 5;
-    this.promiseCreator = promiseCreator;
-  }
-
-  start(datas) {
-    const self = this;
-    let index = 0;
-    let running = 0;
-    return new Promise((resolved) => {
-      const execute = () => {
-        running++;
-        self.promiseCreator(datas[index++]).finally(() => {
-          self.emit("count", index);
-          running--;
-          if (running < self.concurrent && datas.length > index) {
-            execute();
-          } else if (datas.length == index && running == 0) {
-            resolved();
-          }
-        });
-      };
-      while (running < self.concurrent && datas.length > index) {
-        execute();
-      }
-    });
-  }
-}
-
-export function create(concurrent, promiseCreator) {
-  return new PromisePool(concurrent, promiseCreator);
-}

+ 0 - 159
src/lib/sync.ts

@@ -1,13 +1,5 @@
 //云端数据同步导本地
-import EventEmitter from "events";
-// const EventEmitter = require("events");
 import db from "./db";
-// import env from "./env";
-import api from "./api";
-
-import _logger from "./logger";
-const logger = _logger("sync.js");
-import { send } from "./channel";
 
 export async function queryStudentCount(store) {
   db.init();
@@ -43,154 +35,3 @@ export async function replacePackage(packageData) {
     // packageData
   );
 }
-
-class executor extends EventEmitter {
-  async start(env) {
-    try {
-      console.log(env);
-      send("db on");
-      db.init();
-      send("db oned");
-
-      const totalCount = await api.countStudents(env.examId);
-      // logger.info("student count: " + totalCount);
-      send({ totalCount });
-      this.emit("total", totalCount);
-
-      const promises = [];
-      let count = 0;
-      let pageNumber = 0;
-      send({ student: 0 });
-      this.emit("student", 0);
-      while (true) {
-        pageNumber++;
-        logger.info("student page=" + pageNumber);
-        const array = await api.getStudents(env.examId, pageNumber, 100, {
-          withScoreDetail: true,
-        });
-        if (array == undefined || array.length == 0) {
-          break;
-        }
-        const datas = [];
-        for (let i = 0; i < array.length; i++) {
-          const obj = array[i];
-          var objList = [];
-          var subList = [];
-          if (obj.objectiveScoreDetail) {
-            obj.objectiveScoreDetail.forEach((detail) => {
-              const score = Math.round((detail.score * 10) / 10);
-              objList.push(detail.answer + ":" + score);
-            });
-          }
-          if (obj.subjectiveScoreDetail) {
-            obj.subjectiveScoreDetail.forEach((detail) => {
-              const score = Math.round((detail.score * 10) / 10);
-              subList.push(score);
-            });
-          }
-          datas.push([
-            obj["id"],
-            env.examId,
-            obj["schoolId"],
-            obj["examNumber"],
-            obj["examNumber"],
-            obj["name"],
-            obj["studentCode"],
-            obj["subjectCode"],
-            obj["subjectName"],
-            obj["campusName"],
-            obj["packageCode"],
-            obj["batchCode"],
-            obj["sheetCount"],
-            obj["sliceCount"],
-            obj["answers"],
-            obj["upload"] ? 1 : 0,
-            obj["absent"] ? 1 : 0,
-            obj["breach"] ? 1 : 0,
-            obj["manualAbsent"] ? 1 : 0,
-            obj["objectiveScore"].length > 0 ? obj["objectiveScore"] : 0,
-            obj["subjectiveScore"].length > 0 ? obj["subjectiveScore"] : 0,
-            objList.join(";"),
-            subList.join(";"),
-            obj["subjectiveStatus"] || "UNMARK",
-            obj["examSite"],
-            obj["examRoom"],
-            obj["remark"],
-            obj["college"] || "",
-            obj["className"] || "",
-            obj["teacher"] || "",
-            obj["paperType"] || "",
-          ]);
-        }
-        //console.log('get:' + array.length)
-        promises.push(
-          new Promise((resolve, reject) => {
-            db.batchQuery(
-              "select 1 from eb_exam_student"
-              // "replace into eb_exam_student(id, exam_id, school_id\
-              //           , exam_number, secret_number, name, student_code, subject_code, subject_name, campus_name\
-              //           , package_code, batch_code, sheet_count, slice_count, answers, is_upload\
-              //           , is_absent, is_manual_absent, is_breach, is_exception\
-              //           , objective_score, subjective_score, objective_score_list, subjective_score_list, subjective_status\
-              //           , exam_site, exam_room, remark, college, class_name, teacher, paper_type) \
-              //           values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?,?,?,?,?,?,?,?,?,?,?)",
-              // datas
-            )
-              .then(() => {
-                count += datas.length;
-                send({ student: count });
-                this.emit("student", count);
-                resolve();
-              })
-              .catch((err) => {
-                reject(err);
-              });
-          })
-        );
-      }
-
-      //get and save package
-      send({ package: 0 });
-      this.emit("package", 0);
-      const packages = await api.getPackages(env.examId);
-      const packageData = [];
-      for (let i = 0; i < packages.length; i++) {
-        const obj = packages[i];
-        packageData.push([env.examId, obj["code"], obj["picCount"]]);
-      }
-      logger.info("package count:" + packageData.length);
-      promises.push(
-        new Promise((resolve, reject) => {
-          db.batchQuery(
-            "replace into eb_exam_package(exam_id, code, pic_count) values (?,?,?)",
-            packageData
-          )
-            .then(() => {
-              send({ package: packageData.length });
-              this.emit("package", packageData.length);
-              resolve();
-            })
-            .catch((err) => {
-              reject(err);
-            });
-        })
-      );
-
-      await Promise.all(promises);
-      send({ finish: true });
-      this.emit("finish");
-    } catch (err) {
-      this.emit("error", err);
-      logger.error(err);
-    } finally {
-      //console.log(moment().format('YYYY-MM-DD HH:mm:ss'))
-    }
-  }
-}
-
-// export const syncer = new executor();
-
-export default function (store) {
-  console.log("objechat");
-  return new executor().start(store.env);
-}

+ 2 - 2
src/plugins/axiosApp.ts

@@ -1,4 +1,4 @@
-import Vue from "vue";
+// import Vue from "vue";
 // import Store from "@/store";
 import axios from "axios";
 // @ts-ignore
@@ -15,7 +15,7 @@ const config = {
 };
 
 const _axiosApp = axios.create(config);
-axiosRetry(_axiosApp);
+axiosRetry(_axiosApp, { retries: 3, retryDelay: axiosRetry.exponentialDelay });
 
 _axiosApp.interceptors.request.use(
   function (config) {

+ 0 - 4
src/preload.ts

@@ -1,20 +1,16 @@
 import { contextBridge, remote } from "electron";
 
-import env from "./lib/env";
 import config from "./lib/config";
 import { addWatermark } from "./lib/watermark";
 import { queryStudentCount, replaceStudents, replacePackage } from "./lib/sync";
-import { receiveMessage } from "./lib/channel";
 
 export const electronInWindow = {
   dialog: remote.dialog,
-  env: env,
   config,
   addWatermark,
   queryStudentCount,
   replaceStudents,
   replacePackage,
-  receiveMessage,
 };
 
 contextBridge.exposeInMainWorld("electron", electronInWindow);