zhangjie 2 лет назад
Родитель
Сommit
9d111c038d

BIN
extra/database/org.rdb


+ 1 - 0
package.json

@@ -9,6 +9,7 @@
     "serve": "vue-cli-service serve",
     "serve": "vue-cli-service serve",
     "build": "vue-cli-service build",
     "build": "vue-cli-service build",
     "lint": "vue-cli-service lint",
     "lint": "vue-cli-service lint",
+    "win:build": "vue-cli-service electron:build",
     "e:build": "vue-cli-service electron:build --win --x64 --ia32",
     "e:build": "vue-cli-service electron:build --win --x64 --ia32",
     "e:serve": "vue-cli-service electron:serve",
     "e:serve": "vue-cli-service electron:serve",
     "postinstall": "electron-builder install-app-deps --arch=ia32",
     "postinstall": "electron-builder install-app-deps --arch=ia32",

+ 6 - 0
src/assets/styles/manage.less

@@ -285,6 +285,12 @@
       font-size: 16px;
       font-size: 16px;
     }
     }
 
 
+    > p {
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+
     &.task-current {
     &.task-current {
       box-shadow: 0 0 0 1px @main-color;
       box-shadow: 0 0 0 1px @main-color;
     }
     }

+ 1 - 1
src/modules/client/components/ScanAreaSteps.vue

@@ -121,7 +121,7 @@ export default {
       this.$refs[this.currentComponent].checkValid();
       this.$refs[this.currentComponent].checkValid();
     },
     },
     toNext(setting) {
     toNext(setting) {
-      console.log(setting);
+      // console.log(setting);
 
 
       Object.entries(setting).map(([key, val]) => {
       Object.entries(setting).map(([key, val]) => {
         this.newSetting[key] =
         this.newSetting[key] =

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

@@ -22,12 +22,13 @@
                 'task-over': task.isFinished
                 'task-over': task.isFinished
               }
               }
             ]"
             ]"
+            :title="`${task.studentName}${task.examNumber}`"
             @click="toDo(task)"
             @click="toDo(task)"
           >
           >
             <div class="task-item-icon">
             <div class="task-item-icon">
               <Icon type="ios-document" />
               <Icon type="ios-document" />
             </div>
             </div>
-            <p>{{ task.filename }}</p>
+            <p>{{ task.studentName }}{{ task.examNumber }}</p>
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>
@@ -123,6 +124,9 @@ export default {
       loading: false
       loading: false
     };
     };
   },
   },
+  beforeDestroy() {
+    this.stopUpload();
+  },
   methods: {
   methods: {
     visibleChange(visible) {
     visibleChange(visible) {
       if (visible) {
       if (visible) {
@@ -150,6 +154,7 @@ export default {
 
 
       const nextTaskIndex = this.taskList.findIndex(item => !item.isFinished);
       const nextTaskIndex = this.taskList.findIndex(item => !item.isFinished);
       if (nextTaskIndex === -1) {
       if (nextTaskIndex === -1) {
+        this.curCollectConfig = JSON.parse(this.taskList[0].cropperSet);
         this.$Message.success("当前任务已全部结束");
         this.$Message.success("当前任务已全部结束");
       } else {
       } else {
         this.curCollectConfig =
         this.curCollectConfig =
@@ -184,8 +189,8 @@ export default {
       if (paperInfo.originImgPath) return paperInfo.originImgPath;
       if (paperInfo.originImgPath) return paperInfo.originImgPath;
 
 
       const pInfo = await getPaperInfo({
       const pInfo = await getPaperInfo({
-        workId: paperInfo.workId,
-        subjectId: paperInfo.subjectId,
+        workId: paperInfo.examId,
+        subject: paperInfo.subject,
         examNumber: paperInfo.examNumber
         examNumber: paperInfo.examNumber
       }).catch(() => {});
       }).catch(() => {});
       if (!pInfo) {
       if (!pInfo) {
@@ -197,7 +202,7 @@ export default {
 
 
       const outputOriginPath = await downloadOriginImg({
       const outputOriginPath = await downloadOriginImg({
         ...paperInfo,
         ...paperInfo,
-        url: pInfo.imgSrc
+        url: pInfo.sheetSrc
       }).catch(() => {});
       }).catch(() => {});
       if (!outputOriginPath) {
       if (!outputOriginPath) {
         this.$Message.error("下载原图失败,请重新尝试!");
         this.$Message.error("下载原图失败,请重新尝试!");
@@ -222,7 +227,7 @@ export default {
       }
       }
     },
     },
     async curTaskFinished(setting) {
     async curTaskFinished(setting) {
-      await updateCropperTaskDetail({
+      const updateData = {
         id: this.curTask.id,
         id: this.curTask.id,
         cropperSet: JSON.stringify(setting),
         cropperSet: JSON.stringify(setting),
         originImgPath: this.curTask.originImgPath,
         originImgPath: this.curTask.originImgPath,
@@ -231,11 +236,14 @@ export default {
         isFinished: 1,
         isFinished: 1,
         isUpload: 0,
         isUpload: 0,
         updateTime: formatDate()
         updateTime: formatDate()
-      });
+      };
+      await updateCropperTaskDetail(updateData);
       await this.updateProgress();
       await this.updateProgress();
 
 
-      const curTask = this.taskList.find(item => item.id === this.curTask.id);
-      curTask.isFinished = true;
+      const ind = this.taskList.findIndex(item => item.id === this.curTask.id);
+      this.taskList[ind] = Object.assign({}, this.curTask, {
+        ...updateData
+      });
 
 
       return true;
       return true;
     },
     },
@@ -294,6 +302,7 @@ export default {
       const nextTask = this.taskList.find(item => !item.isFinished);
       const nextTask = this.taskList.find(item => !item.isFinished);
       if (!nextTask) {
       if (!nextTask) {
         this.$Message.success("当前任务已全部结束");
         this.$Message.success("当前任务已全部结束");
+        this.curTask = {};
         return;
         return;
       }
       }
 
 

+ 17 - 2
src/modules/cropper-task/ModifyCropperTask.vue

@@ -88,6 +88,11 @@ export default {
             required: true,
             required: true,
             message: "请输入任务名称",
             message: "请输入任务名称",
             trigger: "change"
             trigger: "change"
+          },
+          {
+            max: 100,
+            message: "任务名称最长100个字符",
+            trigger: "change"
           }
           }
         ],
         ],
         inputFile: [
         inputFile: [
@@ -124,7 +129,7 @@ export default {
         {
         {
           title: "选择输入目录",
           title: "选择输入目录",
           filters: [{ name: "excel", extensions: ["xls", "xlsx"] }],
           filters: [{ name: "excel", extensions: ["xls", "xlsx"] }],
-          properties: ["openDirectory"]
+          properties: ["openFile"]
         },
         },
         folderPaths => {
         folderPaths => {
           if (folderPaths && folderPaths[0]) {
           if (folderPaths && folderPaths[0]) {
@@ -135,10 +140,18 @@ export default {
     },
     },
     checkData(data) {
     checkData(data) {
       // let error
       // let error
-      const columnNames = ["工作id", "科目", "科目名称", "考号", "姓名"];
+      const columnNames = [
+        "工作id",
+        "科目id",
+        "科目代码",
+        "科目名称",
+        "考号",
+        "姓名"
+      ];
       const columnCodes = [
       const columnCodes = [
         "examId",
         "examId",
         "subjectId",
         "subjectId",
+        "subject",
         "subjectName",
         "subjectName",
         "examNumber",
         "examNumber",
         "studentName"
         "studentName"
@@ -220,6 +233,7 @@ export default {
             const [
             const [
               examId,
               examId,
               subjectId,
               subjectId,
+              subject,
               subjectName,
               subjectName,
               examNumber,
               examNumber,
               studentName
               studentName
@@ -228,6 +242,7 @@ export default {
               cropperTaskId,
               cropperTaskId,
               examId,
               examId,
               subjectId,
               subjectId,
+              subject,
               subjectName,
               subjectName,
               examNumber,
               examNumber,
               studentName,
               studentName,

+ 2 - 2
src/modules/cropper-task/api.js

@@ -1,5 +1,5 @@
 import { $get } from "@/plugins/axios";
 import { $get } from "@/plugins/axios";
 
 
-export const getPaperInfo = ({ workId, subjectId, examNumber }) => {
-  return $get(`/api/papers/${workId}/${subjectId}/${examNumber}`);
+export const getPaperInfo = ({ workId, subject, examNumber }) => {
+  return $get(`/api/papers/${workId}/${subject}/${examNumber}`);
 };
 };

+ 15 - 7
src/modules/cropper-task/uploadMixin.js

@@ -67,8 +67,7 @@ export default {
         this.taskSetTs.push(
         this.taskSetTs.push(
           setTimeout(() => {
           setTimeout(() => {
             this.startUpload();
             this.startUpload();
-          }),
-          5 * 1000
+          }, 5 * 1000)
         );
         );
         return;
         return;
       }
       }
@@ -77,10 +76,21 @@ export default {
       this.runUploadTask();
       this.runUploadTask();
     },
     },
     async runUploadTask() {
     async runUploadTask() {
-      if (!this.uploadTaskIdList.length || !this.taskRunning) {
+      this.clearTaskSetTs();
+      this.clearUploadSetTs();
+
+      if (!this.taskRunning) {
         this.overUploadTask();
         this.overUploadTask();
         return;
         return;
       }
       }
+      if (!this.uploadTaskIdList.length) {
+        this.taskSetTs.push(
+          setTimeout(() => {
+            this.startUpload();
+          }, 5 * 1000)
+        );
+        return;
+      }
 
 
       const cropperTaskDetailId = this.uploadTaskIdList.shift();
       const cropperTaskDetailId = this.uploadTaskIdList.shift();
       this.curUploadTask = await this.getUploadTask(cropperTaskDetailId);
       this.curUploadTask = await this.getUploadTask(cropperTaskDetailId);
@@ -88,8 +98,7 @@ export default {
         this.uploadSetTs.push(
         this.uploadSetTs.push(
           setTimeout(() => {
           setTimeout(() => {
             this.runUploadTask();
             this.runUploadTask();
-          }),
-          10
+          }, 10)
         );
         );
         return;
         return;
       }
       }
@@ -113,8 +122,7 @@ export default {
       this.uploadSetTs.push(
       this.uploadSetTs.push(
         setTimeout(() => {
         setTimeout(() => {
           this.runUploadTask();
           this.runUploadTask();
-        }),
-        10
+        }, 10)
       );
       );
     },
     },
     overUploadTask() {
     overUploadTask() {

+ 15 - 1
src/plugins/db.js

@@ -657,12 +657,24 @@ export function getCropperTaskFinishCount(cropperTaskId) {
 
 
 /**
 /**
  * 
  * 
+CREATE TABLE "cropper_task" (
+  "id" INTEGER NOT NULL,
+  "name" TEXT NOT NULL,
+  "inputFile" TEXT NOT NULL,
+  "taskCount" integer NOT NULL,
+  "finishedCount" integer NOT NULL DEFAULT 0,
+  "createTime" TEXT NOT NULL,
+  "updateTime" TEXT NOT NULL DEFAULT '',
+  PRIMARY KEY ("id")
+);
+ * 
 CREATE TABLE "cropper_task_detail" (
 CREATE TABLE "cropper_task_detail" (
   "id" INTEGER NOT NULL,
   "id" INTEGER NOT NULL,
   "cropperTaskId" INTEGER NOT NULL,
   "cropperTaskId" INTEGER NOT NULL,
   "examId" text NOT NULL,
   "examId" text NOT NULL,
   "paperId" text,
   "paperId" text,
   "subjectId" text NOT NULL,
   "subjectId" text NOT NULL,
+  "subject" text NOT NULL,
   "subjectName" TEXT,
   "subjectName" TEXT,
   "examNumber" text NOT NULL,
   "examNumber" text NOT NULL,
   "studentName" TEXT NOT NULL,
   "studentName" TEXT NOT NULL,
@@ -704,6 +716,7 @@ export function addCropperTaskDetail(paramList) {
       params.examId,
       params.examId,
       params.paperId || "",
       params.paperId || "",
       params.subjectId,
       params.subjectId,
+      params.subject,
       params.subjectName,
       params.subjectName,
       params.examNumber,
       params.examNumber,
       params.studentName,
       params.studentName,
@@ -724,7 +737,8 @@ export function addCropperTaskDetail(paramList) {
   });
   });
   const vals = listVals.join(",");
   const vals = listVals.join(",");
 
 
-  const sql = `INSERT INTO cropper_task_detail (cropperTaskId,examId,paperId, subjectId,subjectName,examNumber,studentName,originImgPath, formalImgPath,sliceImgPath,imageEncrypt,isUpload,cropperSet,isFinished,createTime,updateTime) VALUES ${vals}`;
+  const sql = `INSERT INTO cropper_task_detail (cropperTaskId,examId,paperId, subjectId,subject,subjectName,examNumber,studentName,originImgPath, formalImgPath,sliceImgPath,imageEncrypt,isUpload,cropperSet,isFinished,createTime,updateTime) VALUES ${vals}`;
+  // console.log(sql);
 
 
   return new Promise((resolve, reject) => {
   return new Promise((resolve, reject) => {
     db.run(sql, function(err) {
     db.run(sql, function(err) {

+ 178 - 0
src/plugins/db.sql

@@ -0,0 +1,178 @@
+/*
+ Navicat Premium Data Transfer
+ 
+ Source Server         : sqlite-msyj-org
+ Source Server Type    : SQLite
+ Source Server Version : 3021000
+ Source Schema         : main
+ 
+ Target Server Type    : SQLite
+ Target Server Version : 3021000
+ File Encoding         : 65001
+ 
+ Date: 09/08/2022 08:32:08
+ */
+PRAGMA foreign_keys = false;
+
+-- ----------------------------
+-- Table structure for cropper_task
+-- ----------------------------
+DROP TABLE IF EXISTS "cropper_task";
+
+CREATE TABLE "cropper_task" (
+  "id" INTEGER NOT NULL,
+  "name" TEXT NOT NULL,
+  "inputFile" TEXT NOT NULL,
+  "taskCount" integer NOT NULL,
+  "finishedCount" integer NOT NULL DEFAULT 0,
+  "createTime" TEXT NOT NULL,
+  "updateTime" TEXT NOT NULL DEFAULT '',
+  PRIMARY KEY ("id")
+);
+
+-- ----------------------------
+-- Table structure for cropper_task_detail
+-- ----------------------------
+DROP TABLE IF EXISTS "cropper_task_detail";
+
+CREATE TABLE "cropper_task_detail" (
+  "id" INTEGER NOT NULL,
+  "cropperTaskId" INTEGER NOT NULL,
+  "examId" text NOT NULL,
+  "paperId" text,
+  "subjectId" text NOT NULL,
+  "subject" TEXT NOT NULL,
+  "subjectName" TEXT,
+  "examNumber" text NOT NULL,
+  "studentName" TEXT NOT NULL,
+  "originImgPath" TEXT,
+  "formalImgPath" TEXT,
+  "sliceImgPath" TEXT,
+  "compressRate" integer NOT NULL DEFAULT 100,
+  "imageEncrypt" integer NOT NULL DEFAULT 1,
+  "isUpload" integer NOT NULL DEFAULT 0,
+  "cropperSet" TEXT,
+  "isFinished" integer NOT NULL DEFAULT 0,
+  "createTime" TEXT NOT NULL DEFAULT '',
+  "updateTime" TEXT NOT NULL DEFAULT '',
+  PRIMARY KEY ("id")
+);
+
+-- ----------------------------
+-- Table structure for dict
+-- ----------------------------
+DROP TABLE IF EXISTS "dict";
+
+CREATE TABLE "dict" ("key" TEXT NOT NULL, "val" TEXT);
+
+-- ----------------------------
+-- Table structure for export_task
+-- ----------------------------
+DROP TABLE IF EXISTS "export_task";
+
+CREATE TABLE "export_task" (
+  "id" INTEGER NOT NULL,
+  "examId" text NOT NULL,
+  "examName" TEXT NOT NULL,
+  "imageType" integer,
+  "isWatermark" integer,
+  "isResume" integer,
+  "nameRule" integer,
+  "startScore" integer,
+  "endScore" integer,
+  "outputDir" TEXT NOT NULL,
+  "savePathRule" TEXT NOT NULL,
+  "isFinish" integer DEFAULT 0,
+  "createdTime" TEXT NOT NULL,
+  "finishTime" TEXT,
+  PRIMARY KEY ("id")
+);
+
+-- ----------------------------
+-- Table structure for export_task_detail
+-- ----------------------------
+DROP TABLE IF EXISTS "export_task_detail";
+
+CREATE TABLE "export_task_detail" (
+  "id" INTEGER NOT NULL COLLATE BINARY PRIMARY KEY AUTOINCREMENT,
+  "serialNo" integer NOT NULL DEFAULT 1,
+  "taskId" text NOT NULL,
+  "examId" text NOT NULL,
+  "examName" TEXT NOT NULL,
+  "school" TEXT,
+  "studentId" text NOT NULL,
+  "studentName" TEXT NOT NULL,
+  "subject" TEXT NOT NULL,
+  "subjectName" TEXT NOT NULL,
+  "areaCode" TEXT NOT NULL,
+  "areaName" TEXT NOT NULL,
+  "examNumber" text NOT NULL,
+  "score" TEXT NOT NULL,
+  "url" TEXT NOT NULL,
+  "filename" TEXT NOT NULL,
+  "isDownload" integer NOT NULL DEFAULT 0,
+  "createdTime" TEXT NOT NULL,
+  "finishTime" TEXT
+);
+
+-- ----------------------------
+-- Table structure for rotate_history
+-- ----------------------------
+DROP TABLE IF EXISTS "rotate_history";
+
+CREATE TABLE "rotate_history" (
+  "id" INTEGER NOT NULL,
+  "examId" text NOT NULL,
+  "subjectId" text NOT NULL,
+  "paperId" text NOT NULL,
+  "studentName" TEXT NOT NULL,
+  "examNumber" text NOT NULL,
+  "imageEncrypt" integer NOT NULL,
+  "filePath" TEXT NOT NULL,
+  "isUpload" integer NOT NULL DEFAULT 0,
+  "createdTime" TEXT NOT NULL,
+  "finishTime" TEXT,
+  PRIMARY KEY ("id")
+);
+
+-- ----------------------------
+-- Table structure for scan
+-- ----------------------------
+DROP TABLE IF EXISTS "scan";
+
+CREATE TABLE "scan" (
+  "id" INTEGER NOT NULL,
+  "examId" text NOT NULL,
+  "examName" TEXT NOT NULL,
+  "paperId" text,
+  "subjectId" text NOT NULL,
+  "subjectName" TEXT NOT NULL,
+  "examNumber" text NOT NULL,
+  "studentName" text NOT NULL,
+  "siteCode" text NOT NULL,
+  "roomCode" text NOT NULL,
+  "originImgPath" TEXT,
+  "formalImgPath" TEXT NOT NULL,
+  "sliceImgPath" TEXT NOT NULL,
+  "compressRate" integer NOT NULL DEFAULT 100,
+  "level" TEXT,
+  "imageEncrypt" integer NOT NULL DEFAULT 1,
+  "isUpload" integer NOT NULL DEFAULT 0,
+  "missing" integer NOT NULL DEFAULT 0,
+  "isManual" integer NOT NULL DEFAULT 0,
+  "clientUserId" text NOT NULL,
+  "clientUsername" text NOT NULL,
+  "clientUserLoginTime" text NOT NULL,
+  "createdTime" text NOT NULL,
+  "finishTime" text,
+  PRIMARY KEY ("id")
+);
+
+-- ----------------------------
+-- Table structure for sqlite_sequence
+-- ----------------------------
+DROP TABLE IF EXISTS "sqlite_sequence";
+
+CREATE TABLE "sqlite_sequence" ("name", "seq");
+
+PRAGMA foreign_keys = true;