Browse Source

采集完成

zhangjie 2 years ago
parent
commit
38d7584ad9

+ 22 - 0
src/assets/styles/login.scss

@@ -72,3 +72,25 @@
     margin-top: 5px;
   }
 }
+
+
+// setting 
+.setting {
+  .el-form{
+    width: 400px;
+  }
+  .el-form-item{
+    margin-right: 0;
+    display: inline-block;
+  }
+  .ip-split{
+    display: inline-block;
+    vertical-align: top;
+    margin: 6px 5px auto;
+  }
+  .el-input-number.is-without-controls .el-input__inner{
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+  
+}

+ 3 - 0
src/assets/styles/pages.scss

@@ -0,0 +1,3 @@
+.task-manage{
+  padding: 20px;
+}

+ 1 - 1
src/mixins/uploadTaskMixin.js

@@ -45,7 +45,7 @@ export default {
           );
         },
         uploadErrorCallBack: curUploadTask => {
-          const content = `考生:${curUploadTask.studentName},准考证:${curUploadTask.examNumber},科目:${curUploadTask.subjectName},图片上传失败!`;
+          const content = `任务:${curUploadTask.taskId},采集Id:${curUploadTask.id},图片上传失败!`;
           console.log(content);
           return;
         }

+ 6 - 29
src/modules/client/api.js

@@ -1,35 +1,12 @@
 import { $post, $get } from "@/plugins/axios";
 
-export const uploadFormalImage = (options, datas, config) => {
-  const pathInfo = options.imageEncrypt ? "image/uploadsheet" : "ms-sheet";
-  return $post(
-    `/api/file/${pathInfo}/${options.examId}/${options.subjectId}/${options.examNumber}`,
-    datas,
-    { ...config, showTinyTips: true }
-  );
-};
-export const uploadSliceImage = (options, datas, config) => {
-  const pathInfo = options.imageEncrypt ? "image/upload" : "ms-slice";
-  return $post(
-    `/api/file/${pathInfo}/${options.examId}/${options.subjectId}/${options.examNumber}`,
-    datas,
-    { ...config, showTinyTips: true }
-  );
-};
-export const getStudentGroupByExamNumber = examNumber => {
-  return $get(`/api/exam/listStudents/${examNumber}`);
-};
-export const getStudentByExamNumber = examNumber => {
-  return $get(`/api/exam/getStudent/${examNumber}`);
-};
-export const uploadStudent = datas => {
-  return $post(`/api/upload/student/${datas.subjectId}`, datas, {
-    showTinyTips: true
-  });
-};
-export const saveCollectLog = datas => {
-  return $post(`/api/marklog/saveCollectLog`, datas, { showTinyTips: true });
+export const uploadFormalImage = (datas, config = {}) => {
+  return $post(`/api/file/`, datas, { ...config, showTinyTips: true });
 };
+
 export const getLevelList = examId => {
   return $get(`/api/level/${examId}`);
 };
+export const taskListPage = datas => {
+  return $get(`/api/level/`, datas);
+};

+ 213 - 0
src/modules/client/components/ScanTaskDialog.vue

@@ -0,0 +1,213 @@
+<template>
+  <el-dialog
+    class="scan-task-dialog"
+    :visible.sync="modalIsShow"
+    top="10vh"
+    width="550px"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    @open="visibleChange"
+  >
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="120"
+    >
+      <el-form-item label="课程名称:">
+        {{ task.courseName }}({{ task.courseCode }})
+      </el-form-item>
+      <el-form-item prop="preScanCount" label="预扫张数:">
+        <el-input-number
+          v-model="modalForm.preScanCount"
+          :min="0"
+          :max="1000000"
+          :step="1"
+          step-strictly
+          :controls="false"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item label="实扫张数:">
+        <span class="color-danger">
+          {{ realScanCount }}
+        </span>
+      </el-form-item>
+    </el-form>
+    <div slot="footer">
+      <el-button v-if="!isScaning" type="primary" @click="startTask"
+        >开始扫描</el-button
+      >
+      <el-button v-if="isScaning" type="primary" @click="confirm"
+        >确认</el-button
+      >
+      <el-button @click="cancel">取消</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { getEarliestFile, saveOutputImage } from "../../../plugins/imageOcr";
+import setTimeMixins from "../../../mixins/setTimeMixins";
+import db from "../../../plugins/db";
+const fs = require("fs");
+
+export default {
+  name: "scan-task-dialog",
+  props: {
+    task: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  mixins: [setTimeMixins],
+  data() {
+    return {
+      modalIsShow: false,
+      loading: false,
+      isScaning: false,
+      canScan: true,
+      modalForm: {
+        preScanCount: 0
+      },
+      rules: {
+        preScanCount: [
+          {
+            required: true,
+            message: "请输入预扫张数",
+            trigger: "change"
+          }
+        ]
+      },
+      scanList: [],
+      scaningImageList: []
+    };
+  },
+  computed: {
+    realScanCount() {
+      return this.scanList.length;
+    },
+    user() {
+      return this.$store.state.user;
+    }
+  },
+  beforeDestroy() {
+    this.clearSetTs();
+  },
+  methods: {
+    initData() {
+      this.loading = false;
+      this.modalForm.preScanCount = 0;
+      this.scanList = [];
+      this.isScaning = false;
+    },
+    visibleChange() {
+      this.initData();
+    },
+    close() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async startTask() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.loading) return;
+      this.loading = true;
+
+      this.startScan();
+    },
+    async confirm() {
+      await this.addUploadTask();
+      this.pauseScan();
+
+      const confirm = await this.$confirm(`是否继续扫描?`, "提示", {
+        type: "warning"
+      }).catch(() => {});
+
+      if (confirm !== "confirm") {
+        this.close();
+        return;
+      }
+
+      this.initData();
+    },
+    async cancel() {
+      const confirm = await this.$confirm(
+        `取消扫描后,当前未保存的数据将会被清空,确定要取消扫描吗?`,
+        "提示",
+        {
+          type: "warning"
+        }
+      ).catch(() => {});
+      if (confirm !== "confirm") return;
+
+      this.clearScanList();
+      this.close();
+    },
+    // scan relate
+    getInitFile() {
+      this.clearSetTs();
+      if (!this.canScan) return;
+
+      const scaningImageList = getEarliestFile(this.GLOBAL.input);
+      this.scaningImageList = scaningImageList || [];
+
+      if (this.scaningImageList.length) {
+        this.saveScanImage(this.scaningImageList);
+        this.addSetTime(() => {
+          this.getInitFile();
+        }, 200);
+      } else {
+        this.addSetTime(() => {
+          this.getInitFile();
+        }, 1000);
+      }
+    },
+    saveScanImage() {
+      const ouputImageList = saveOutputImage(this.scaningImageList);
+      this.scanList.push({
+        taskId: this.task.id,
+        taskName: this.task.name,
+        courseCode: this.task.courseCode,
+        courseName: this.task.courseName,
+        teachingClassName: this.task.teachingClassName,
+        frontOriginImgPath: ouputImageList[0],
+        versoOriginImgPath: ouputImageList[1],
+        clientUserId: this.user.userId,
+        clientUsername: this.user.name,
+        clientUserLoginTime: this.user.loginTime
+      });
+    },
+    pauseScan() {
+      this.canScan = false;
+    },
+    startScan() {
+      this.scaningImageList = [];
+      this.canScan = true;
+      this.isScaning = true;
+      this.getInitFile();
+    },
+    async addUploadTask() {
+      // 添加上传任务
+      for (let i = 0, len = this.scanList.length; i < len; i++) {
+        await db.saveUploadInfo(this.scanList[i]).catch(err => {
+          console.log(err);
+        });
+      }
+    },
+    clearScanList() {
+      for (let i = 0; i < this.scanList.length; i++) {
+        const item = this.scanList[i];
+        fs.unlinkSync(item.frontOriginImgPath);
+        fs.unlinkSync(item.versoOriginImgPath);
+      }
+      this.scanList = [];
+    }
+  }
+};
+</script>

+ 187 - 3
src/modules/client/views/TaskManage.vue

@@ -1,15 +1,199 @@
 <template>
   <div class="task-manage">
-    task-manage
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <el-form-item label="档案:">
+          <el-select
+            v-model="filter.recordId"
+            placeholder="请选择档案"
+            clearable
+          >
+            <el-option
+              v-for="item in recordList"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="课程:">
+          <el-select
+            v-model="filter.courseCode"
+            placeholder="请选择课程"
+            clearable
+          >
+            <el-option
+              v-for="item in courseList"
+              :key="item.courseCode"
+              :value="item.courseCode"
+              :label="item.courseName"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="教学班:">
+          <el-select
+            v-model="filter.teachingClassId"
+            placeholder="请选择教学班"
+            clearable
+          >
+            <el-option
+              v-for="item in teachingClassList"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label-width="0px">
+          <el-button type="primary" @click="toPage(1)">查询</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <div class="mb-4 tab-btns">
+      <el-button
+        v-for="tab in tabs"
+        :key="tab.val"
+        size="medium"
+        :type="curTab == tab.val ? 'primary' : 'default'"
+        @click="selectMenu(tab.val)"
+        >{{ tab.name }}
+      </el-button>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" size="medium" :data="dataList">
+        <el-table-column
+          prop="taskId"
+          label="任务ID"
+          min-width="160"
+        ></el-table-column>
+        <el-table-column
+          prop="taskName"
+          label="任务名称"
+          min-width="160"
+        ></el-table-column>
+        <el-table-column prop="courseName" label="课程(代码)" min-width="200">
+          <template slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="userName"
+          label="教学班"
+          min-width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="userName"
+          label="学生数"
+          min-width="100"
+        ></el-table-column>
+        <el-table-column
+          prop="userName"
+          label="已扫描数量"
+          min-width="100"
+        ></el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="80"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              class="btn-primary"
+              type="text"
+              @click="toScan(scope.row)"
+              >扫描</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
   </div>
 </template>
 
 <script>
+import { taskListPage } from "../api";
+
 export default {
   name: "task-manage",
   data() {
-    return {};
+    return {
+      curTab: "all",
+      tabs: [
+        {
+          name: "全部",
+          val: "all"
+        },
+        {
+          name: "我的",
+          val: "my"
+        }
+      ],
+      cacheData: {
+        all: {},
+        my: {}
+      },
+      filter: {
+        recordId: "",
+        courseCode: "",
+        teachingClassId: ""
+      },
+      current: 1,
+      size: 10,
+      total: 0,
+      dataList: [],
+      curRow: {}
+    };
+  },
+  methods: {
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await taskListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    selectMenu(curTab) {
+      this.cacheData[this.curTab] = {
+        current: this.current,
+        total: this.total,
+        dataList: this.dataList
+      };
+
+      this.curTab = curTab;
+
+      if (this.cacheData[this.curTab].total) {
+        const { current, total, dataList } = this.cacheData[this.curTab];
+        this.current = current;
+        this.total = total;
+        this.dataList = dataList;
+      } else {
+        this.toPage(1);
+      }
+    }
   },
-  methods: {}
+  toScan(row) {
+    this.curRow = row;
+  }
 };
 </script>

+ 6 - 0
src/modules/login/router.js

@@ -1,5 +1,6 @@
 import LoginHome from "./views/LoginHome.vue";
 import Login from "./views/Login.vue";
+import Setting from "./views/Setting.vue";
 
 export default {
   path: "/login-home",
@@ -10,6 +11,11 @@ export default {
       path: "/login",
       name: "Login",
       component: Login
+    },
+    {
+      path: "/setting",
+      name: "Setting",
+      component: Setting
     }
   ]
 };

+ 7 - 1
src/modules/login/views/Login.vue

@@ -40,6 +40,12 @@
               @click="submit"
               >登录</el-button
             >
+            <el-button
+              type="primary"
+              size="large"
+              @click="$router.push({ name: 'Home' })"
+              >任务管理</el-button
+            >
           </el-form-item>
         </el-form>
       </div>
@@ -93,7 +99,7 @@ export default {
       this.$router.push({ name: "Setting" });
     },
     async submit() {
-      const valid = await this.$refs.loginForm.validate();
+      const valid = await this.$refs.loginForm.validate().catch(() => {});
       if (!valid) return;
 
       if (this.isSubmit) return;

+ 122 - 0
src/modules/login/views/Setting.vue

@@ -0,0 +1,122 @@
+<template>
+  <div class="setting login-body">
+    <div class="login-form">
+      <h2 class="login-form-title">服务器IP地址设置</h2>
+      <el-form ref="setForm" :model="setModel" :rules="setRules" inline>
+        <el-form-item prop="ipCont1">
+          <el-input-number
+            style="width:60px;"
+            v-model="setModel.ipCont1"
+            :min="0"
+            :max="255"
+            :step="1"
+            step-strictly
+            :controls="false"
+          ></el-input-number>
+        </el-form-item>
+        <span class="ip-split">—</span>
+        <el-form-item prop="ipCont2">
+          <el-input-number
+            style="width:60px;"
+            v-model="setModel.ipCont2"
+            :min="0"
+            :max="255"
+            :step="1"
+            step-strictly
+            :controls="false"
+          ></el-input-number>
+        </el-form-item>
+        <span class="ip-split">—</span>
+        <el-form-item prop="ipCont3">
+          <el-input-number
+            style="width:60px;"
+            v-model="setModel.ipCont3"
+            :min="0"
+            :max="255"
+            :step="1"
+            step-strictly
+            :controls="false"
+          ></el-input-number>
+        </el-form-item>
+        <span class="ip-split">—</span>
+        <el-form-item prop="ipCont4">
+          <el-input-number
+            style="width:60px;"
+            v-model="setModel.ipCont4"
+            :min="0"
+            :max="255"
+            :step="1"
+            step-strictly
+            :controls="false"
+          ></el-input-number>
+        </el-form-item>
+        <span class="ip-split">:</span>
+        <el-form-item prop="port">
+          <el-input-number
+            style="width:60px;"
+            v-model="setModel.port"
+            :min="1"
+            :max="1000000"
+            :step="1"
+            step-strictly
+            :controls="false"
+          ></el-input-number>
+        </el-form-item>
+        <br />
+        <el-form-item>
+          <el-button
+            type="primary"
+            :disabled="loading"
+            size="large"
+            @click="submit"
+            >登录</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "setting",
+  data() {
+    const ipValidator = [
+      {
+        required: true,
+        message: " ",
+        trigger: "change"
+      }
+    ];
+    return {
+      setModel: {
+        ipCont1: undefined,
+        ipCont2: undefined,
+        ipCont3: undefined,
+        ipCont4: undefined,
+        port: undefined
+      },
+      setRules: {
+        ipCont1: [...ipValidator],
+        ipCont2: [...ipValidator],
+        ipCont3: [...ipValidator],
+        ipCont4: [...ipValidator],
+        port: [...ipValidator]
+      },
+      loading: false
+    };
+  },
+  methods: {
+    async submit() {
+      if (this.loading) return;
+      this.loading = true;
+
+      const valid = await this.$refs.setForm.validate().catch(() => {});
+      if (!valid) {
+        this.loading = false;
+        return;
+      }
+    }
+  }
+};
+</script>

+ 25 - 619
src/plugins/db.js

@@ -41,42 +41,34 @@ function serializeWhere(params) {
   };
 }
 
-function serializeUpdate(params) {
-  const template = Object.keys(params)
-    .map(key => {
-      return `${key}=$${key}`;
-    })
-    .join(",");
-  const templateData = {};
-  Object.entries(params).map(([key, val]) => {
-    templateData[`$${key}`] = val;
-  });
-
-  return {
-    template,
-    templateData
-  };
-}
+// function serializeUpdate(params) {
+//   const template = Object.keys(params)
+//     .map(key => {
+//       return `${key}=$${key}`;
+//     })
+//     .join(",");
+//   const templateData = {};
+//   Object.entries(params).map(([key, val]) => {
+//     templateData[`$${key}`] = val;
+//   });
+
+//   return {
+//     template,
+//     templateData
+//   };
+// }
 
 // scan
 function saveUploadInfo(params) {
-  const sql = `INSERT INTO scan (examId, examName, subjectId, subjectName, examNumber, studentName, siteCode, roomCode, originImgPath,formalImgPath, sliceImgPath,compressRate,isManual,imageEncrypt,level,clientUserId, clientUsername, clientUserLoginTime, isUpload,createdTime, finishTime) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`;
+  const sql = `INSERT INTO scan (taskId, taskName, courseCode, courseName, teachingClassName, frontOriginImgPath, versoOriginImgPath, clientUserId, clientUsername, clientUserLoginTime, isUpload,createdTime, finishTime) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)`;
   const datas = [
-    params.examId,
-    params.examName,
-    params.subjectId,
-    params.subjectName,
-    params.examNumber,
-    params.studentName,
-    params.siteCode,
-    params.roomCode,
-    params.originImgPath || "",
-    params.formalImgPath,
-    params.sliceImgPath,
-    params.compressRate || 100,
-    params.isManual ? 1 : 0,
-    params.imageEncrypt,
-    params.level,
+    params.taskId,
+    params.taskName,
+    params.courseCode,
+    params.courseName,
+    params.teachingClassName,
+    params.frontOriginImgPath,
+    params.versoOriginImgPath,
     params.clientUserId,
     params.clientUsername,
     params.clientUserLoginTime,
@@ -132,30 +124,6 @@ function getUploadCount(limitTime) {
   });
 }
 
-function getScanCount(limitTime, subjectId) {
-  const sql = `SELECT COUNT(DISTINCT examNumber) AS count FROM scan WHERE strftime('%s',createdTime, 'utc') >= '${limitTime}' AND subjectId = '${subjectId}'`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, (err, rows) => {
-      if (err) reject("count list fail!");
-
-      resolve(rows[0].count);
-    });
-  });
-}
-
-function getHistory(limitTime, subjectId) {
-  const sql = `SELECT max(id) id, examNumber,studentName name,formalImgPath FROM scan WHERE strftime('%s',createdTime, 'utc') >= '${limitTime}' AND subjectId = '${subjectId}' GROUP BY examNumber ORDER BY id DESC LIMIT 30`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, (err, rows) => {
-      if (err) reject("get list fail!");
-
-      resolve(rows);
-    });
-  });
-}
-
 function updateUploadState(id) {
   const sql = `UPDATE scan SET isUpload=$isUpload,finishTime=$finishTime WHERE id=$id`;
   const datas = {
@@ -172,21 +140,6 @@ function updateUploadState(id) {
   });
 }
 
-function updateLocalPaperId(id, paperId) {
-  const sql = `UPDATE scan SET paperId=$paperId WHERE id=$id`;
-  const datas = {
-    $paperId: paperId,
-    $id: id
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("update paperId info fail!");
-
-      resolve();
-    });
-  });
-}
-
 function deleteScanById(id) {
   const sql = `DELETE FROM scan WHERE id=$id`;
   const datas = {
@@ -252,534 +205,6 @@ function setDict(key, val) {
   });
 }
 
-// paper-manage
-function getAreas(subjectId) {
-  const sql = `SELECT DISTINCT siteCode from scan WHERE subjectId = '${subjectId}'`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, (err, rows) => {
-      if (err) reject("get list fail!");
-      resolve(rows.map(item => item.siteCode));
-    });
-  });
-}
-
-function getPaperList({
-  examId,
-  subjectId,
-  areaCode,
-  isManual,
-  missing,
-  sortBy,
-  pageNumber,
-  pageSize
-}) {
-  const orderBy = sortBy === "1" ? "id DESC" : "examNumber ASC";
-
-  let options = [];
-  if (examId) {
-    options.push(`examId = '${examId}'`);
-  }
-  if (subjectId) {
-    options.push(`subjectId = '${subjectId}'`);
-  }
-  if (areaCode) {
-    options.push(`siteCode = '${areaCode}'`);
-  }
-  if (isManual !== null) {
-    options.push(`isManual = ${isManual}`);
-  }
-  if (missing !== null) {
-    options.push(`missing = ${missing}`);
-  }
-  const optionStr = options.length ? "WHERE " + options.join(" and ") : "";
-
-  const condition = `${optionStr} GROUP BY examNumber ORDER BY ${orderBy}`;
-  const countSql = `SELECT count(id) count FROM ( SELECT max(id) id FROM scan ${condition})`;
-
-  // console.log(countSql);
-
-  return new Promise((resolve, reject) => {
-    db.all(countSql, (err, rows) => {
-      if (err) reject("count list fail!");
-
-      // console.log(rows);
-
-      const total = rows[0].count;
-      const offset = (pageNumber - 1) * pageSize;
-      const sql = `SELECT max(id) pid, * FROM scan ${condition} LIMIT ${pageSize} OFFSET ${offset}`;
-
-      // console.log(sql);
-
-      db.all(sql, (err, rows) => {
-        if (err) reject("get list fail!");
-        resolve({
-          datas: rows,
-          pageNumber,
-          pageSize,
-          total
-        });
-      });
-    });
-  });
-}
-
-function absentLocalPaper(id, missing) {
-  const sql = `UPDATE scan SET missing=$missing WHERE id=$id`;
-  const datas = {
-    $missing: missing,
-    $id: id
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("update absent info fail!");
-
-      resolve();
-    });
-  });
-}
-
-function saveRotateHistory(params) {
-  const sql = `INSERT INTO rotate_history (examId,subjectId,paperId, studentName, examNumber,imageEncrypt,filePath, isUpload,createdTime, finishTime) VALUES (?,?,?,?,?,?,?,?,?,?)`;
-  const datas = [
-    params.examId,
-    params.subjectId,
-    params.paperId,
-    params.studentName,
-    params.examNumber,
-    params.imageEncrypt,
-    params.filePath,
-    0, // isUpload
-    formatDate(), // createdTime
-    null
-  ];
-  return new Promise((resolve, reject) => {
-    db.serialize(() => {
-      db.run(sql, datas, function(err) {
-        if (err) reject(err);
-        resolve(this.lastID);
-      });
-    });
-  });
-}
-
-function getUnfinishRotateHistoryList() {
-  const sql = `SELECT * FROM rotate_history WHERE isUpload = 0`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, (err, rows) => {
-      if (err) reject("get history list fail!");
-
-      resolve(rows);
-    });
-  });
-}
-
-function getUnfinishRotateHistoryCount() {
-  const sql = `SELECT COUNT(1) AS count FROM rotate_history WHERE isUpload = 0`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, (err, rows) => {
-      if (err) reject("count history list fail!");
-
-      resolve(rows[0].count);
-    });
-  });
-}
-
-function finishRotateHistory(id) {
-  const sql = `UPDATE rotate_history SET isUpload=$isUpload,finishTime=$finishTime WHERE id=$id`;
-  const datas = {
-    $id: id,
-    $isUpload: 1,
-    $finishTime: formatDate()
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("update download task info fail!");
-
-      resolve(true);
-    });
-  });
-}
-
-// export data
-function addExportTask(params) {
-  const sql = `INSERT INTO export_task (examId, examName,imageType,isWatermark,isResume,nameRule,startScore,endScore,outputDir,savePathRule,isFinish,createdTime,finishTime) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)`;
-  const datas = [
-    params.examId,
-    params.examName,
-    params.imageType,
-    params.isWatermark,
-    params.isResume,
-    params.nameRule,
-    params.startScore,
-    params.endScore,
-    params.outputDir,
-    params.savePathRule,
-    0, // isFinish
-    formatDate(), // createdTime
-    null
-  ];
-
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, function(err) {
-      console.log(err);
-      if (err) reject(err);
-      resolve(this.lastID);
-    });
-  });
-}
-
-/**
- *
- * @param {Array} paramList 参数列表
- */
-function addExportTaskDetail(paramList) {
-  const listVals = paramList.map(params => {
-    const datas = [
-      params.serialNo,
-      params.taskId,
-      params.examId,
-      params.examName,
-      params.school,
-      params.studentId,
-      params.studentName,
-      params.subject,
-      params.subjectName,
-      params.areaCode,
-      params.areaName,
-      params.examNumber,
-      params.score,
-      params.url,
-      params.filename,
-      0, // isDownload
-      formatDate(), // createdTime
-      ""
-    ];
-    const nitem = datas.map(val =>
-      typeof val === "string" ? `'${val}'` : val
-    );
-    return `(${nitem.join(",")})`;
-  });
-  const vals = listVals.join(",");
-
-  const sql = `INSERT INTO export_task_detail (serialNo,taskId, examId, examName,school,studentId,studentName,subject,subjectName,areaCode,areaName,examNumber,score,url,filename,isDownload,createdTime,finishTime) VALUES ${vals}`;
-
-  return new Promise((resolve, reject) => {
-    db.run(sql, function(err) {
-      console.log(err);
-      if (err) reject(err);
-      resolve(true);
-    });
-  });
-}
-
-function getUnfinishTask() {
-  const sql = `SELECT * FROM export_task WHERE isFinish = 0 LIMIT 1;`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, (err, rows) => {
-      if (err) reject("get task fail!");
-      resolve(rows[0]);
-    });
-  });
-}
-
-function getDownloadTaskList(taskId) {
-  const sql = `SELECT * FROM export_task_detail WHERE taskId = '${taskId}' and isDownload = 0`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, (err, rows) => {
-      if (err) reject("get task list fail!");
-
-      resolve(rows);
-    });
-  });
-}
-
-function getDownloadTaskCount(params) {
-  const { where, whereData } = serializeWhere(params);
-  const sql = `SELECT COUNT(1) AS count FROM export_task_detail WHERE ${where}`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, whereData, (err, rows) => {
-      if (err) reject("count task list fail!");
-
-      resolve(rows[0].count);
-    });
-  });
-}
-
-function updateDownloadTaskDownload(id) {
-  const sql = `UPDATE export_task_detail SET isDownload=$isDownload,finishTime=$finishTime WHERE id=$id`;
-  const datas = {
-    $id: id,
-    $isDownload: 1,
-    $finishTime: formatDate()
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("update download task info fail!");
-
-      resolve(true);
-    });
-  });
-}
-
-function updateTaskFinish(id) {
-  const sql = `UPDATE export_task SET isFinish=$isFinish,finishTime=$finishTime WHERE id=$id`;
-  const datas = {
-    $id: id,
-    $isFinish: 1,
-    $finishTime: formatDate()
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("update export task info fail!");
-
-      resolve(true);
-    });
-  });
-}
-
-// cropper-task
-export function getCropperTaskList(params) {
-  const { where, whereData } = serializeWhere(params);
-  let sql = `SELECT * FROM cropper_task`;
-  if (where) {
-    sql += ` WHERE ${where}`;
-  }
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, whereData, (err, rows) => {
-      if (err) reject("search task fail!");
-      resolve(rows);
-    });
-  });
-}
-
-export function deleteCropperTaskById(id) {
-  const sql = `DELETE FROM cropper_task WHERE id=$id`;
-  const datas = {
-    $id: id
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("delete cropper-task fail!");
-      resolve(true);
-    });
-  });
-}
-
-export function deleteCropperTaskDetail(cropperTaskId) {
-  const sql = `DELETE FROM cropper_task_detail WHERE cropperTaskId=$cropperTaskId`;
-  const datas = {
-    $cropperTaskId: cropperTaskId
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("delete cropper-task-detail fail!");
-      resolve(true);
-    });
-  });
-}
-
-export function addCropperTask(params) {
-  const sql = `INSERT INTO cropper_task (name,inputFile,taskCount,finishedCount,createTime,updateTime) VALUES (?,?,?,?,?,?)`;
-  const datas = [
-    params.name,
-    params.inputFile,
-    params.taskCount,
-    0,
-    formatDate(), // createTime
-    ""
-  ];
-
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, function(err) {
-      if (err) reject(err);
-      resolve(this.lastID);
-    });
-  });
-}
-
-export function updateCropperTask(params) {
-  const sql = `UPDATE cropper_task SET name=$name,inputFile=$inputFile,taskCount=$taskCount,finishedCount=$finishedCount,updateTime=$updateTime WHERE id=$id`;
-  const datas = {
-    $id: params.id,
-    $name: params.name,
-    $inputFile: params.inputFile,
-    $taskCount: params.taskCount,
-    $finishedCount: 0,
-    $updateTime: formatDate()
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("update cropper task fail!");
-
-      resolve(true);
-    });
-  });
-}
-
-export function updateCropperTaskFinishedCount(params) {
-  const sql = `UPDATE cropper_task SET finishedCount=$finishedCount,updateTime=$updateTime WHERE id=$id`;
-  const datas = {
-    $id: params.id,
-    $finishedCount: params.finishedCount,
-    $updateTime: formatDate()
-  };
-  return new Promise((resolve, reject) => {
-    db.run(sql, datas, err => {
-      if (err) reject("update cropper task count fail!");
-
-      resolve(true);
-    });
-  });
-}
-
-export function getCropperTaskFinishCount(cropperTaskId) {
-  const { where, whereData } = serializeWhere({
-    cropperTaskId: cropperTaskId,
-    isFinished: 1
-  });
-  const sql = `SELECT COUNT(1) AS count FROM cropper_task_detail WHERE ${where}`;
-
-  return new Promise((resolve, reject) => {
-    db.all(sql, whereData, (err, rows) => {
-      if (err) reject("count task list fail!");
-
-      resolve(rows[0].count);
-    });
-  });
-}
-
-/**
- * 
-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" (
-  "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")
-);
- */
-
-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, whereData, (err, rows) => {
-      if (err) reject("search task detail list fail!");
-      resolve(rows);
-    });
-  });
-}
-
-/**
- *
- * @param {Array} paramList 参数列表
- */
-export function addCropperTaskDetail(paramList) {
-  const listVals = paramList.map(params => {
-    const datas = [
-      params.cropperTaskId,
-      params.examId,
-      params.paperId || "",
-      params.subjectId,
-      params.subject,
-      params.subjectName,
-      params.examNumber,
-      params.studentName,
-      params.originImgPath,
-      params.formalImgPath,
-      params.sliceImgPath,
-      params.imageEncrypt,
-      0, // isUpload
-      params.cropperSet,
-      0, // isFinished
-      formatDate(), // createTime
-      ""
-    ];
-    const nitem = datas.map(val =>
-      typeof val === "string" ? `'${val}'` : val
-    );
-    return `(${nitem.join(",")})`;
-  });
-  const vals = listVals.join(",");
-
-  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) => {
-    db.run(sql, function(err) {
-      if (err) reject(err);
-      resolve(true);
-    });
-  });
-}
-
-export function updateCropperTaskDetail(params) {
-  if (!params.id) return Promise.reject("id is required");
-
-  const id = params.id;
-  let paramData = { ...params };
-  delete paramData.id;
-  const { template, templateData } = serializeUpdate(paramData);
-  const sql = `UPDATE cropper_task_detail SET ${template} WHERE id=${id}`;
-
-  return new Promise((resolve, reject) => {
-    db.run(sql, templateData, err => {
-      if (err) reject("update cropper task detail fail!");
-
-      resolve(true);
-    });
-  });
-}
-
-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
@@ -787,30 +212,11 @@ export default {
   searchUploadList,
   countScanList,
   getUploadCount,
-  getScanCount,
-  getHistory,
   updateUploadState,
-  updateLocalPaperId,
   deleteScanById,
   // dict
   getDict,
   setDict,
   getAllDict,
-  initDict,
-  // paper-manage
-  getAreas,
-  getPaperList,
-  absentLocalPaper,
-  saveRotateHistory,
-  getUnfinishRotateHistoryList,
-  finishRotateHistory,
-  getUnfinishRotateHistoryCount,
-  // export data
-  addExportTask,
-  addExportTaskDetail,
-  getUnfinishTask,
-  getDownloadTaskList,
-  getDownloadTaskCount,
-  updateDownloadTaskDownload,
-  updateTaskFinish
+  initDict
 };

+ 17 - 26
src/plugins/imageOcr.js

@@ -1,45 +1,38 @@
 import { getInputDir, getOutputDir, makeDirSync } from "./env";
-import { randomCode } from "./utils";
 const fs = require("fs");
 const path = require("path");
 
 /**
  * 旋转图片,并保存为正式文件
- * @param {*} imgPath 图片路径
+ * @param {*} scaningImageList 图片路径
  * @param {String} paperInfo 保持文件名称
- * @param {Object} collectConfig 裁剪区域
  */
-async function saveOutputImage(imgPath, paperInfo, collectConfig) {
-  // console.log(collectConfig);
-  const outputOriginPath = saveOriginImage(imgPath, paperInfo);
-
-  return outputOriginPath;
-}
-
-function saveOriginImage(imgPath, paperInfo) {
-  if (paperInfo.compressRate === 100) return "";
-
-  const outputOriginPath = getOutputImagePath(paperInfo, "origin");
-  fs.copyFileSync(imgPath, outputOriginPath);
-  return outputOriginPath;
+export function saveOutputImage(scaningImageList, paperInfo) {
+  let outputOriginPaths = [];
+  for (let i = 0; i < scaningImageList.length; i++) {
+    const imagePath = scaningImageList[i];
+    const originImageFile = saveOriginImage(imagePath, paperInfo);
+    outputOriginPaths.push(originImageFile);
+    fs.unlinkSync(imagePath);
+  }
+
+  return outputOriginPaths;
 }
 
-function getOutputImagePath(paperInfo, type) {
-  const outputDir = path.join(
-    getOutputDir(type),
-    paperInfo.examId + "",
-    paperInfo.subjectId + ""
-  );
+function saveOriginImage(imagePath, paperInfo) {
+  const outputDir = path.join(getOutputDir("origin"), paperInfo.taskId + "");
 
   if (!fs.existsSync(outputDir)) makeDirSync(outputDir);
-  return path.join(outputDir, `${paperInfo.examNumber}-${randomCode()}.jpg`);
+  const outputOriginPath = path.join(outputDir, path.basename(imagePath));
+  fs.copyFileSync(imagePath, outputOriginPath);
+  return outputOriginPath;
 }
 
 /**
  * 获取最早添加的文件
  * @param {String} dir 图片目录
  */
-function getEarliestFile(dir) {
+export function getEarliestFile(dir) {
   const ddir = dir || getInputDir();
   const files = fs
     .readdirSync(ddir)
@@ -59,5 +52,3 @@ function getEarliestFile(dir) {
     name: files[0].name
   };
 }
-
-export { saveOutputImage, getEarliestFile };

+ 46 - 70
src/plugins/imageUpload.js

@@ -1,62 +1,40 @@
 const fs = require("fs");
+const path = require("path");
 const crypto = require("crypto");
-import { formatDate } from "./utils";
-import {
-  uploadSliceImage,
-  uploadFormalImage,
-  uploadStudent,
-  saveCollectLog
-} from "../modules/client/api";
-import db from "@/plugins/db";
+import { uploadFormalImage } from "../modules/client/api";
 
 /**
  * 文件上传
- * @param {Object} options 上传配置信息
- * @param {String} type 上传类型:formal=>原图,slice=>剪切图
+ * @param {Object} options 上传信息
  */
-function toUploadImg(options, type) {
+function toUploadImg(options) {
   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);
-  formData.append("level", options.level);
+  // frontFile,frontMd5,versoFile,versoMd5,taskId
+
+  const { file: frontFile, md5: frontMd5 } = getFileAdnMd5(
+    options.frontOriginImgPath
+  );
+  formData.append("frontMd5", frontMd5);
+  formData.append("frontFile", frontFile);
+  const { file: versoFile, md5: versoMd5 } = getFileAdnMd5(
+    options.versoOriginImgPath
+  );
+  formData.append("versoMd5", versoMd5);
+  formData.append("versoFile", versoFile);
+
+  formData.append("taskId", options.taskId);
   formData.append("scanUserId", options.clientUserId);
 
-  return type === "formal"
-    ? uploadFormalImage(options, formData, { headers: { md5 } })
-    : uploadSliceImage(options, formData, { headers: { md5 } });
+  return uploadFormalImage(formData);
 }
 
-function toUploadStudent(options) {
-  const datas = {
-    subjectId: options.subjectId,
-    examNumber: options.examNumber
-  };
-  return uploadStudent(datas);
-}
-
-function toSaveCollectLog(options) {
-  const datas = {
-    workId: options.examId,
-    subjectId: options.subjectId,
-    examNumber: options.examNumber,
-    clientUsername: options.clientUsername,
-    clientUserId: options.clientUserId,
-    clientUserLoginTime: options.clientUserLoginTime,
-    time: formatDate(),
-    level: options.level,
-    name: options.studentName,
-    manual: options.isManual + ""
-  };
-  return saveCollectLog(datas);
+function getFileAdnMd5(filepath) {
+  const buffer = fs.readFileSync(filepath);
+  let fsHash = crypto.createHash("md5");
+  fsHash.update(buffer);
+  const md5 = fsHash.digest("hex");
+  const file = new File([buffer], path.basename(filepath));
+  return { file, md5 };
 }
 
 /**
@@ -78,7 +56,7 @@ class UploadTask {
     uploadErrorCallBack
   }) {
     this.taskList = taskList;
-    this.setT = "";
+    this.setTs = [];
     this.taskRunning = false;
     this.uploadSuccessCallback = uploadSuccessCallback;
     this.uploadTaskOverCallback = uploadTaskOverCallback;
@@ -87,6 +65,16 @@ class UploadTask {
     this.startUploadTask();
   }
 
+  addSetTime(action, time = 1 * 1000) {
+    this.setTs.push(setTimeout(action, time));
+  }
+
+  clearSetTs() {
+    if (!this.setTs.length) return;
+    this.setTs.forEach(t => clearTimeout(t));
+    this.setTs = [];
+  }
+
   addUploadTask(data) {
     this.taskList.push(data);
   }
@@ -97,51 +85,39 @@ class UploadTask {
 
   async startUploadTask() {
     this.taskRunning = true;
-    setTimeout(() => {
+
+    this.addSetTime(() => {
       this.runUploadTask();
     }, 10);
   }
 
   async runUploadTask() {
+    this.clearSetTs();
+
     if (!this.taskList.length || !this.taskRunning) {
       this.overUploadTask();
       return;
     }
     const curTask = this.getCurTask();
 
-    const uploadAll = [
-      toUploadImg(curTask, "formal"),
-      toUploadImg(curTask, "slice")
-    ];
     let uploadResult = true;
-    await Promise.all(uploadAll).catch(() => {
+    await toUploadImg(curTask).catch(() => {
       uploadResult = false;
     });
-
-    let updateStdRes, saveLogRes;
     if (uploadResult) {
-      updateStdRes = await toUploadStudent(curTask).catch(() => {});
-      saveLogRes = await toSaveCollectLog(curTask).catch(() => {});
-
-      if (updateStdRes && saveLogRes) {
-        // 更新paperId
-        await db.updateLocalPaperId(curTask.id, updateStdRes.paperId);
-        this.uploadSuccessCallback(curTask);
-      }
-    }
-    // 待定:只要有一个接口出错,则提示上传失败!
-    if (!uploadResult || !updateStdRes || !saveLogRes) {
+      this.uploadSuccessCallback(curTask);
+    } else {
       this.uploadErrorCallBack(curTask);
     }
 
-    this.setT = setTimeout(() => {
+    this.addSetTime(() => {
       this.runUploadTask();
     }, 10);
   }
 
   overUploadTask() {
     this.taskRunning = false;
-    if (this.setT) clearTimeout(this.setT);
+    this.clearSetTs();
     this.uploadTaskOverCallback && this.uploadTaskOverCallback();
   }
   stopUploadTask() {

+ 1 - 0
src/router.js

@@ -26,6 +26,7 @@ export default new Router({
       path: "/home",
       name: "Home",
       component: Home,
+      redirect: { name: "TaskManage" },
       children: [...client]
     }
     // [lazy-loaded] route level code-splitting

+ 10 - 28
src/views/Home.vue

@@ -6,36 +6,20 @@
 import Layout from "./Layout.vue";
 import uploadTaskMixin from "../mixins/uploadTaskMixin";
 import setTimeMixins from "../mixins/setTimeMixins";
-import { mapState, mapMutations } from "vuex";
 import db from "../plugins/db";
-import log4js from "@/plugins/logger";
-const logger = log4js.getLogger("scan");
 
 export default {
   name: "home",
   mixins: [uploadTaskMixin, setTimeMixins],
   components: { Layout },
   data() {
-    return {
-      showProgress: false
-    };
-  },
-  computed: {
-    ...mapState("client", ["curSubject", "clientConfig"])
+    return {};
   },
   created() {
-    this.examName = this.$ls.get("user", { examName: "" }).examName;
-    const scanBackRouter = this.clientConfig.paperStage
-      ? "CheckInfo"
-      : "ScanWait";
-    this.backRouters.GroupScan = scanBackRouter;
-    this.backRouters.LineScan = scanBackRouter;
     this.initUploadTask();
-    this.setCurSubject({});
     this.updateUnuploadCount();
   },
   methods: {
-    ...mapMutations("client", ["setCurSubject"]),
     // unupload count
     async updateUnuploadCount() {
       this.clearSetTs();
@@ -46,18 +30,16 @@ export default {
       }, 2 * 1000);
     },
     toBack() {
-      const curRouteName = this.$route.name;
-      const backRouter = this.backRouters[curRouteName];
-      if (curRouteName === "GroupScan" || curRouteName === "LineScan") {
-        this.$Modal.confirm({
-          content: "当前正处于采集状态,确定要退出吗?",
-          onOk: () => {
-            this.$router.push({ name: backRouter });
-            logger.warn("退出采集页面");
-          }
-        });
+      if (this.$route.name === "TaskManage") {
+        this.$confirm("确定要退出采集吗?", "提示", {
+          type: "warning"
+        })
+          .then(() => {
+            this.$router.go(-1);
+          })
+          .catch(() => {});
       } else {
-        this.$router.push({ name: backRouter });
+        this.$router.go(-1);
       }
     }
   },