ScanTaskProcessDialog.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <template>
  2. <div>
  3. <el-dialog
  4. class="scan-task-dialog page-dialog"
  5. :visible.sync="modalIsShow"
  6. fullscreen
  7. :close-on-click-modal="false"
  8. :close-on-press-escape="false"
  9. :show-close="false"
  10. append-to-body
  11. @open="dialogOpen"
  12. >
  13. <div class="scan-head" slot="title">
  14. <h3>
  15. 扫描详情
  16. <span class="color-gray ml-2"
  17. >{{ task.courseName }}({{ task.courseCode }})</span
  18. >
  19. </h3>
  20. <div
  21. v-if="scanStatus === 'INIT'"
  22. class="scan-head-btn cont-link"
  23. @click="close"
  24. >
  25. <i class="el-icon-close"></i>
  26. </div>
  27. </div>
  28. <div class="scan-image-list">
  29. <div
  30. v-for="item in scanHistoryList"
  31. :key="item"
  32. class="scan-image-item"
  33. @click="toViewPaper(item)"
  34. >
  35. <img :src="item" />
  36. </div>
  37. </div>
  38. <div slot="footer">
  39. <el-button
  40. type="primary"
  41. :loading="scanStatus !== 'INIT'"
  42. @click="startTask"
  43. >
  44. {{ statusDesc[scanStatus] }}
  45. </el-button>
  46. </div>
  47. </el-dialog>
  48. <!-- image-preview -->
  49. <simple-image-preview
  50. :cur-image="curPaper"
  51. @on-prev="toPrevPaper"
  52. @on-next="toNextPaper"
  53. ref="SimpleImagePreview"
  54. ></simple-image-preview>
  55. </div>
  56. </template>
  57. <script>
  58. import { mapState } from "vuex";
  59. import {
  60. getPreUploadFiles,
  61. saveOutputImage,
  62. clearDir,
  63. decodeImageCode,
  64. } from "../../../plugins/imageOcr";
  65. import db from "../../../plugins/db";
  66. import { evokeScanner } from "../../../plugins/scanner";
  67. import SimpleImagePreview from "@/components/SimpleImagePreview.vue";
  68. import log4js from "@/plugins/logger";
  69. const logger = log4js.getLogger("scan");
  70. export default {
  71. name: "scan-task-dialog",
  72. components: {
  73. SimpleImagePreview,
  74. },
  75. props: {
  76. task: {
  77. type: Object,
  78. default() {
  79. return {};
  80. },
  81. },
  82. },
  83. data() {
  84. return {
  85. modalIsShow: true,
  86. scanStatus: "INIT",
  87. realScanCount: 0,
  88. scanHistoryList: [],
  89. curPaper: {},
  90. statusDesc: {
  91. INIT: "开始扫描",
  92. SCAN: "扫描中",
  93. SAVING: "保存数据中",
  94. },
  95. };
  96. },
  97. computed: {
  98. ...mapState("client", ["ocrArea"]),
  99. },
  100. methods: {
  101. initData() {
  102. this.scanStatus = "INIT";
  103. this.realScanCount = 0;
  104. this.getScanHistory();
  105. },
  106. dialogOpen() {
  107. logger.info(`00进入扫描`);
  108. this.initData();
  109. },
  110. close() {
  111. this.modalIsShow = false;
  112. this.$emit("on-close");
  113. logger.info(`99退出扫描`);
  114. },
  115. open() {
  116. this.modalIsShow = true;
  117. },
  118. startTask() {
  119. logger.info(`01开始扫描`);
  120. this.scanStatus = "SCAN";
  121. this.evokeScanExe();
  122. },
  123. async evokeScanExe() {
  124. logger.info("02唤起扫描仪");
  125. // console.log(commandStr);
  126. await evokeScanner(this.GLOBAL.input).catch((error) => {
  127. console.error(error);
  128. });
  129. // 缓存已扫描的数据
  130. const res = getPreUploadFiles(this.GLOBAL.input);
  131. if (!res.succeed) {
  132. logger.error(`03扫描仪停止,故障:${res.errorMsg}`);
  133. this.$message.error(res.errorMsg);
  134. this.scanStatus = "INIT";
  135. return;
  136. }
  137. logger.info(`03扫描仪停止,扫描数:${res.data.length}`);
  138. this.scanStatus = "SAVING";
  139. await this.saveScanImage(res.data).catch(() => {
  140. this.$message.error("保存数据失败,请重新扫描!");
  141. logger.error(`保存数据失败,请重新扫描!`);
  142. });
  143. clearDir(this.GLOBAL.input);
  144. this.scanStatus = "INIT";
  145. await this.getScanHistory();
  146. },
  147. // scan relate
  148. async getScanHistory() {
  149. const res = await db
  150. .searchHistoryList({
  151. isFormal: this.task.isFormal ? 1 : 0,
  152. taskId: this.task.id,
  153. })
  154. .catch(() => {});
  155. if (!res) return;
  156. this.scanHistoryList = [];
  157. res.forEach((item) => {
  158. this.scanHistoryList.push(item.frontOriginImgPath);
  159. this.scanHistoryList.push(item.versoOriginImgPath);
  160. });
  161. this.curPaper = {};
  162. this.$refs.SimpleImagePreview.close();
  163. },
  164. async saveScanImage(imageList) {
  165. logger.info(`04-1开始保存数据`);
  166. for (let i = 0, len = imageList.length; i < len; i++) {
  167. const files = imageList[i];
  168. const ouputImageList = saveOutputImage(
  169. [files.frontFile, files.versoFile],
  170. {
  171. taskId: this.task.id,
  172. }
  173. );
  174. const fileInfo = {
  175. taskId: this.task.id,
  176. schoolId: this.task.schoolId,
  177. examId: this.task.examId,
  178. courseCode: this.task.courseCode,
  179. courseName: this.task.courseName,
  180. frontOriginImgPath: ouputImageList[0],
  181. versoOriginImgPath: ouputImageList[1],
  182. isFormal: this.task.isFormal ? 1 : 0,
  183. studentCode: "",
  184. clientUserId: this.user.id,
  185. clientUsername: this.user.loginName,
  186. clientUserLoginTime: this.user.loginTime,
  187. };
  188. if (this.task.isFormal) {
  189. const num = await decodeImageCode(
  190. fileInfo.frontOriginImgPath,
  191. this.ocrArea
  192. ).catch((err) => {
  193. console.error(err);
  194. logger.error(`04-2条码解析失败,${err}`);
  195. });
  196. console.log(num);
  197. fileInfo.studentCode = num || "";
  198. fileInfo.ocrArea = JSON.stringify(this.ocrArea);
  199. }
  200. let res = true;
  201. await db.saveUploadInfo(fileInfo).catch((err) => {
  202. res = false;
  203. console.error(err);
  204. logger.error(`04-1保存数据错误,${err}`);
  205. });
  206. if (!res) return Promise.reject();
  207. }
  208. logger.info(`04-2保存数据结束`);
  209. },
  210. // image-preview
  211. toViewPaper(imgUrl) {
  212. this.curPaper = { url: imgUrl };
  213. this.$refs.SimpleImagePreview.open();
  214. },
  215. toPrevPaper() {
  216. const curPaperIndex = this.scanHistoryList.findIndex(
  217. (item) => item === this.curPaper.url
  218. );
  219. if (curPaperIndex <= 0) return;
  220. this.curPaper = this.scanHistoryList[curPaperIndex - 1];
  221. },
  222. toNextPaper() {
  223. const curPaperIndex = this.scanHistoryList.findIndex(
  224. (item) => item === this.curPaper.url
  225. );
  226. if (curPaperIndex >= this.scanHistoryList.length - 1) return;
  227. this.curPaper = this.scanHistoryList[curPaperIndex + 1];
  228. },
  229. },
  230. };
  231. </script>