|
@@ -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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|