ソースを参照

图片在处理上传模块

zhangjie 3 年 前
コミット
b765ccb838

+ 8 - 1
src/modules/cropper-task/CropperTaskDetailDialog.vue

@@ -89,12 +89,14 @@ import {
 import { saveCropperImage, downloadOriginImg } from "./taskUtils";
 import { formatDate, randomCode } from "../../plugins/utils";
 import { getPaperInfo } from "./api";
+import uploadMixin from "./uploadMixin";
 // const path = require("path");
 // const fs = require("fs");
 
 export default {
   name: "cropper-task-detail-dialog",
   components: { ScanAreaSteps },
+  mixins: [uploadMixin],
   props: {
     cropperTask: {
       type: Object,
@@ -124,7 +126,10 @@ export default {
     visibleChange(visible) {
       if (visible) {
         this.initData();
+        this.curCropperTaskId = this.cropperTask.id;
+        this.startUpload();
       } else {
+        this.stopUpload();
         this.$emit("modified");
       }
     },
@@ -155,7 +160,9 @@ export default {
       }
     },
     async getTasks() {
-      const data = await getCropperTaskDetailList(this.cropperTask.id);
+      const data = await getCropperTaskDetailList({
+        cropperTaskId: this.cropperTask.id
+      });
       this.taskList = data || [];
     },
     async updateProgress() {

+ 154 - 0
src/modules/cropper-task/uploadMixin.js

@@ -0,0 +1,154 @@
+import {
+  getCropperTaskDetailList,
+  getCropperTaskDetail,
+  updateCropperTaskDetail
+} from "../../plugins/db";
+const fs = require("fs");
+const crypto = require("crypto");
+import { uploadSliceImage, uploadFormalImage } from "../client/api";
+
+export default {
+  data() {
+    return {
+      uploadTaskIdList: [],
+      curCropperTaskId: null,
+      curUploadTask: null,
+      taskSetTs: [],
+      uploadSetTs: [],
+      taskRunning: false
+    };
+  },
+  methods: {
+    toUploadImg(options, type) {
+      const formData = new FormData();
+      const filePath =
+        type === "formal" ? options.formalImgPath : options.sliceImgPath;
+
+      const buffer = fs.readFileSync(filePath);
+      let fsHash = crypto.createHash("md5");
+      fsHash.update(buffer);
+      let md5 = fsHash.digest("hex");
+      formData.append("md5", md5);
+
+      const file = new File([buffer], options.examNumber + ".jpg");
+      formData.append("file", file);
+
+      return type === "formal"
+        ? uploadFormalImage(options, formData, { headers: { md5 } })
+        : uploadSliceImage(options, formData, { headers: { md5 } });
+    },
+    async getUploadTask(cropperTaskDetailId) {
+      const data = await getCropperTaskDetail(cropperTaskDetailId).catch(
+        err => {
+          console.log(err);
+        }
+      );
+      return data || null;
+    },
+    async getUploadTaskIds() {
+      const res = await getCropperTaskDetailList(
+        {
+          cropperTaskId: this.curCropperTaskId,
+          isUpload: 0,
+          isFinished: 1
+        },
+        ["id"]
+      );
+      const data = res || [];
+
+      this.uploadTaskIdList = data.map(item => item.id);
+    },
+    async startUpload() {
+      this.clearTaskSetTs();
+      this.clearUploadSetTs();
+
+      await this.getUploadTaskIds();
+      if (!this.uploadTaskIdList.length) {
+        this.taskSetTs.push(
+          setTimeout(() => {
+            this.startUpload();
+          }),
+          5 * 1000
+        );
+        return;
+      }
+
+      this.taskRunning = true;
+      this.runUploadTask();
+    },
+    async runUploadTask() {
+      if (!this.uploadTaskIdList.length || !this.taskRunning) {
+        this.overUploadTask();
+        return;
+      }
+
+      const cropperTaskDetailId = this.uploadTaskIdList.shift();
+      this.curUploadTask = await this.getUploadTask(cropperTaskDetailId);
+      if (!this.curUploadTask) {
+        this.uploadSetTs.push(
+          setTimeout(() => {
+            this.runUploadTask();
+          }),
+          10
+        );
+        return;
+      }
+
+      const uploadAll = [
+        this.toUploadImg(this.curUploadTask, "formal"),
+        this.toUploadImg(this.curUploadTask, "slice")
+      ];
+      let uploadResult = true;
+      await Promise.all(uploadAll).catch(() => {
+        uploadResult = false;
+      });
+
+      if (uploadResult) {
+        await this.updateCropperTaskDetailUploadStatus(this.curUploadTask.id);
+      } else {
+        this.updateTaskUploadStatus(cropperTaskDetailId, 0);
+      }
+
+      this.curUploadTask = null;
+      this.uploadSetTs.push(
+        setTimeout(() => {
+          this.runUploadTask();
+        }),
+        10
+      );
+    },
+    overUploadTask() {
+      this.taskRunning = false;
+      this.clearUploadSetTs();
+    },
+    stopUpload() {
+      this.taskRunning = false;
+      this.uploadTaskIdList = [];
+      this.clearTaskSetTs();
+      this.clearUploadSetTs();
+    },
+    async updateCropperTaskDetailUploadStatus(cropperTaskDetailId) {
+      await updateCropperTaskDetail({
+        id: cropperTaskDetailId,
+        isUpload: 1
+      });
+      this.updateTaskUploadStatus(cropperTaskDetailId, 1);
+    },
+    clearTaskSetTs() {
+      if (!this.taskSetTs.length) return;
+      this.taskSetTs.forEach(t => clearTimeout(t));
+      this.taskSetTs = [];
+    },
+    clearUploadSetTs() {
+      if (!this.uploadSetTs.length) return;
+      this.uploadSetTs.forEach(t => clearTimeout(t));
+      this.uploadSetTs = [];
+    },
+    // outer
+    updateTaskUploadStatus(cropperTaskDetailId, isUpload) {
+      const task = this.taskList.find(item => item.id === cropperTaskDetailId);
+      if (!task) return;
+      task.isUpload = isUpload;
+    }
+  }
+};

+ 21 - 7
src/plugins/db.js

@@ -680,14 +680,14 @@ CREATE TABLE "cropper_task_detail" (
 );
  */
 
-export function getCropperTaskDetailList(cropperTaskId) {
-  const sql = `SELECT * FROM cropper_task_detail WHERE cropperTaskId=$cropperTaskId`;
-  const datas = {
-    $cropperTaskId: cropperTaskId
-  };
+export function getCropperTaskDetailList(params, fields = []) {
+  const { where, whereData } = serializeWhere(params);
+  const fieldCont = fields.length ? fields.join(",") : "*";
+  const sql = `SELECT ${fieldCont} FROM cropper_task_detail WHERE ${where}`;
+
   return new Promise((resolve, reject) => {
-    db.all(sql, datas, (err, rows) => {
-      if (err) reject("search task fail!");
+    db.all(sql, whereData, (err, rows) => {
+      if (err) reject("search task detail list fail!");
       resolve(rows);
     });
   });
@@ -752,6 +752,20 @@ export function updateCropperTaskDetail(params) {
   });
 }
 
+export function getCropperTaskDetail(cropperTaskDetailId) {
+  const { where, whereData } = serializeWhere({
+    id: cropperTaskDetailId
+  });
+  const sql = `SELECT * FROM cropper_task_detail WHERE ${where}`;
+
+  return new Promise((resolve, reject) => {
+    db.all(sql, whereData, (err, rows) => {
+      if (err) reject("search task detail fail!");
+      resolve(rows[0]);
+    });
+  });
+}
+
 export default {
   init,
   // scan

+ 3 - 24
src/views/Home.vue

@@ -1,10 +1,9 @@
 <template>
   <Layout :back-handle="toBack">
     <template slot="head-info">
-        <span>{{ examName }}</span>
-        <i v-if="curSubject && curSubject.name"></i>
-        <span>{{ curSubject.name }}</span>
-      </div>
+      <span>{{ examName }}</span>
+      <i v-if="curSubject && curSubject.name"></i>
+      <span>{{ curSubject.name }}</span>
     </template>
   </Layout>
 </template>
@@ -18,8 +17,6 @@ import db from "../plugins/db";
 import log4js from "@/plugins/logger";
 const logger = log4js.getLogger("scan");
 
-const { ipcRenderer } = require("electron");
-
 export default {
   name: "home",
   mixins: [uploadTaskMixin, setTimeMixins],
@@ -69,10 +66,6 @@ export default {
         this.updateUnuploadCount();
       }, 2 * 1000);
     },
-    logout() {
-      this.$ls.clear();
-      this.$router.push({ name: "Login" });
-    },
     toBack() {
       const curRouteName = this.$route.name;
       const backRouter = this.backRouters[curRouteName];
@@ -87,20 +80,6 @@ export default {
       } else {
         this.$router.push({ name: backRouter });
       }
-    },
-    minWin() {
-      ipcRenderer.send("minimize-window");
-    },
-    maxWin() {
-      ipcRenderer.send("maximize-window");
-    },
-    close() {
-      this.$Modal.confirm({
-        content: "请确保当前窗口没有任务正在进行,确认要关闭当前窗口吗?",
-        onOk: () => {
-          ipcRenderer.send("close-window");
-        }
-      });
     }
   },
   beforeDestroy() {