瀏覽代碼

feat: 放弃gm,使用canvas

zhangjie 11 月之前
父節點
當前提交
fe4565c6d4

+ 77 - 24
electron/preload/api.ts

@@ -5,6 +5,7 @@ import path from 'node:path';
 import fs from 'node:fs';
 import PDFDocument from 'pdfkit';
 import log from 'electron-log/renderer';
+import { createCanvas, loadImage, GlobalFonts } from '@napi-rs/canvas';
 
 import {
   getImagicPath,
@@ -21,6 +22,8 @@ import {
   DrawTrackTextOption,
 } from './types';
 
+GlobalFonts.registerFromPath(getGmFontPath(), 'song');
+
 // macos install gm imagemagick https://github.com/aheckmann/gm/blob/master/README.md
 const gmInst =
   process.platform === 'win32'
@@ -49,7 +52,69 @@ function writeData(content: string) {
   fs.writeFileSync(outpath, content, { flag: 'a' });
 }
 
-function drawTrack(
+async function drawCanvasTrack(
+  imgPath: string,
+  drawTrackList: DrawTrackItem[],
+  outpath: string
+) {
+  makeDirSync(path.dirname(outpath));
+
+  const imgBuf = await fs.promises.readFile(imgPath);
+  const curImage = await loadImage(imgBuf).catch((e) => {
+    console.dir(e);
+  });
+  if (!curImage) return;
+  const canvas = createCanvas(curImage.width, curImage.height);
+  const ctx = canvas.getContext('2d');
+
+  const defaultColor = '#f53f3f';
+  const defaultFontSize = 22;
+  ctx.drawImage(curImage, 0, 0, curImage.width, curImage.height);
+
+  drawTrackList.forEach((track) => {
+    // text
+    if (track.type === 'text') {
+      const { x, y, text, color, fontSize } =
+        track.option as DrawTrackTextOption;
+      const fsize = fontSize || defaultFontSize;
+      const textColor = color || defaultColor;
+      const ny = y + fsize;
+      ctx.font = `bold ${fsize}px song`;
+      ctx.fillStyle = textColor;
+      ctx.fillText(text, x, ny);
+      return;
+    }
+    // circle
+    if (track.type === 'circle') {
+      const { x0, y0, x1, y1 } = track.option as DrawTrackCircleOption;
+      const radiusX = (x1 - x0) / 2;
+      const radiusY = (y1 - y0) / 2;
+      const centerX = x0 + radiusX;
+      const centerY = y0 + radiusY;
+      ctx.beginPath();
+      ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);
+      ctx.strokeStyle = defaultColor;
+      ctx.lineWidth = 2;
+      ctx.stroke();
+      return;
+    }
+
+    // line
+    if (track.type === 'line') {
+      const { x0, y0, x1, y1 } = track.option as DrawTrackLineOption;
+      ctx.beginPath();
+      ctx.moveTo(x0, y0);
+      ctx.lineTo(x1, y1);
+      ctx.strokeStyle = defaultColor;
+      ctx.lineWidth = 2;
+      ctx.stroke();
+    }
+  });
+  const imgBuffer = await canvas.encode('jpeg');
+  await fs.promises.writeFile(outpath, imgBuffer);
+}
+
+function drawGmTrack(
   imgPath: string,
   drawTrackList: DrawTrackItem[],
   outpath: string
@@ -112,34 +177,16 @@ function drawTrack(
   });
 }
 
-interface ImageItem {
-  url: string;
-  width: number;
-  height: number;
-}
 interface TaskItem {
-  imgItem: ImageItem;
+  url: string;
   outpath: string;
   drawTrackList: DrawTrackItem[];
 }
-async function drawTracks(taskList: TaskItem[]): Promise<ImageItem[]> {
+async function drawTracks(taskList: TaskItem[]) {
   const downloads = taskList.map((item) =>
-    drawTrack(item.imgItem.url, item.drawTrackList, item.outpath)
+    drawCanvasTrack(item.url, item.drawTrackList, item.outpath)
   );
-  const images = await Promise.all(downloads).catch((error) => {
-    console.log(error);
-  });
-  if (!images) {
-    return Promise.reject(new Error('绘制轨迹错误'));
-  }
-  const result = taskList.map((item, index) => {
-    return {
-      url: images[index],
-      width: item.imgItem.width,
-      height: item.imgItem.height,
-    };
-  });
-  return result;
+  await Promise.all(downloads);
 }
 
 async function downloadFile(url: string, outputPath: string): Promise<string> {
@@ -175,6 +222,11 @@ function joinPath(paths: string[]) {
   return path.join(...paths);
 }
 
+interface ImageItem {
+  url: string;
+  width: number;
+  height: number;
+}
 async function imagesToPdf(
   images: ImageItem[],
   outpath: string
@@ -213,7 +265,8 @@ function logger(content: string, type?: 'info' | 'error') {
 
 const commonApi = {
   cropImage,
-  drawTrack,
+  drawGmTrack,
+  drawCanvasTrack,
   drawTracks,
   joinPath,
   downloadImage,

+ 11 - 11
electron/preload/utils.ts

@@ -54,28 +54,28 @@ export function makeDirSync(pathContent: string) {
 makeDirSync(getTempPath());
 
 // 系统配置
-interface ConfitSetType {
+interface ConfigSetType {
   downloadProcessCount: number;
 }
-type PartConfitSetType = Partial<ConfitSetType>;
-type ConfitSetTypeEnum = keyof ConfitSetType;
+type PartConfigSetType = Partial<ConfigSetType>;
+type ConfigSetTypeEnum = keyof ConfigSetType;
 
 const configSets = [
   {
     field: 'downloadProcessCount',
     validate(val: any) {
-      return [1, 2, 3, 4, 5, 6].includes(val);
+      return [1, 2, 3].includes(val);
     },
-    default: 2,
+    default: 1,
   },
 ];
 
-function getConfig(datas: PartConfitSetType) {
-  const configData = {} as ConfitSetType;
+function getConfig(datas: PartConfigSetType) {
+  const configData = {} as ConfigSetType;
   configSets.forEach((config) => {
-    const field = config.field as ConfitSetTypeEnum;
+    const field = config.field as ConfigSetTypeEnum;
     if (config.validate(datas[field])) {
-      configData[field] = datas[field] as ConfitSetType[ConfitSetTypeEnum];
+      configData[field] = datas[field] as ConfigSetType[ConfigSetTypeEnum];
     } else {
       configData[field] = config.default;
     }
@@ -83,7 +83,7 @@ function getConfig(datas: PartConfitSetType) {
   return configData;
 }
 
-export function getConfigData(data: PartConfitSetType) {
+export function getConfigData(data: PartConfigSetType) {
   let configData = getConfig(data);
   if (process.env.NODE_ENV === 'development') return configData;
 
@@ -92,7 +92,7 @@ export function getConfigData(data: PartConfitSetType) {
     try {
       const configFileData = JSON.parse(
         fs.readFileSync(configPath, 'utf8')
-      ) as PartConfitSetType;
+      ) as PartConfigSetType;
       configData = getConfig(configFileData);
     } catch (error) {
       console.log(error);

+ 1 - 1
package.json

@@ -16,7 +16,6 @@
     "typecheck": "npm run typecheck:node && npm run typecheck:web",
     "lint-staged": "npx lint-staged",
     "prepare": "husky install",
-    "postinstall": "electron-builder install-app-deps",
     "build": "npm run typecheck && electron-vite build",
     "build:unpack": "npm run build && electron-builder --dir",
     "build:win": "npm run build && electron-builder --win --x64",
@@ -40,6 +39,7 @@
     "@arco-design/web-vue": "^2.44.7",
     "@electron-toolkit/preload": "^3.0.0",
     "@electron-toolkit/utils": "^3.0.0",
+    "@napi-rs/canvas": "^0.1.53",
     "@types/vue-ls": "^3.2.7",
     "@vueuse/core": "^9.3.0",
     "axios": "^0.24.0",

+ 102 - 0
pnpm-lock.yaml

@@ -15,6 +15,7 @@ specifiers:
   '@electron-toolkit/preload': ^3.0.0
   '@electron-toolkit/tsconfig': ^1.0.1
   '@electron-toolkit/utils': ^3.0.0
+  '@napi-rs/canvas': ^0.1.53
   '@rushstack/eslint-patch': ^1.7.1
   '@types/crypto-js': ^4.2.1
   '@types/gm': ^1.25.4
@@ -86,6 +87,7 @@ dependencies:
   '@arco-design/web-vue': 2.55.2_vue@3.4.27
   '@electron-toolkit/preload': 3.0.1_electron@28.3.3
   '@electron-toolkit/utils': 3.0.0_electron@28.3.3
+  '@napi-rs/canvas': 0.1.53
   '@types/vue-ls': 3.2.7
   '@vueuse/core': 9.13.0_vue@3.4.27
   axios: 0.24.0
@@ -1381,6 +1383,106 @@ packages:
       - supports-color
     dev: false
 
+  /@napi-rs/canvas-android-arm64/0.1.53:
+    resolution: {integrity: sha512-2YhxfVsZguATlRWE0fZdTx35SE9+r5D7HV5GPNDataZOKmHf+zZ5//dspuuBSbOriQdoicaFrgXKCUqI0pK3WQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-darwin-arm64/0.1.53:
+    resolution: {integrity: sha512-ls+CWLMusf4RAGo5BvIIzA6dNcc0elwVp6LKjHfQECHA8KKmvdB58YuE5BQcTlb2rzk0SEKtBC/Th3NI2oNdfg==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-darwin-x64/0.1.53:
+    resolution: {integrity: sha512-ZAgcoCH5+5OKS2P8Lxx+jbkAPKkyLD2x6OvSrHg1U6ppdxmLA+CkJlRl8w45HCXwuyIiP7OeymECRtiNYTwznQ==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-linux-arm-gnueabihf/0.1.53:
+    resolution: {integrity: sha512-p9km/3C/loDxu3AvA8/vtpIS1BGMd/Ehkl2Iu/v/Gw8N/KUIt3HUvTS7AKApyVE28bxTfq96wJQjtcT8jzDncw==}
+    engines: {node: '>= 10'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-linux-arm64-gnu/0.1.53:
+    resolution: {integrity: sha512-QKK+sykEiYwjwd+ogyLcpcnH38DNZ8KViBlnfEpoGA2Wa+21/cWQKfMxnbgb/rbvm5tazJinZcihFvH577WQ5g==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-linux-arm64-musl/0.1.53:
+    resolution: {integrity: sha512-2N41U0X8RnrTKzpTtPv1ozlYkJtPsUdbfF3uP/KEd/BsULGd8Y8ghkGMS6CM+821au4ex0dPrWOOdT9wC1rSqQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-linux-x64-gnu/0.1.53:
+    resolution: {integrity: sha512-7XjuTvDKCODtf/vMwF43VGDrjfgwYKgS91ggdcX3UrJaBYWyWu/+eqNvNj+zdXSe/0x+YOjf5jG4m8xIXdBMQA==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-linux-x64-musl/0.1.53:
+    resolution: {integrity: sha512-970WEvB8vmj+uxvgdBZ+AGFV7uq9GJhXrqG5PGQ5lWciHX0P0d/OhS2F7TITgFR0LsKDQZ7XQgzMxsYOfwZ0FQ==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas-win32-x64-msvc/0.1.53:
+    resolution: {integrity: sha512-rLFQCSJaWg/sv54Aap9nAhaodi4Vyb4un50EgW+PNkk8icMziU6KLRKirGBdQr9ZdxnshAPeQXD1g2ArStujKA==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@napi-rs/canvas/0.1.53:
+    resolution: {integrity: sha512-XsEZi97+kKykmAiPpY+IpZoHxJY1srqFZp8jDt1/RySzC0kB0iZYt/VMIFqQKpLCARZjD7SOAz2AULtwYlesCA==}
+    engines: {node: '>= 10'}
+    optionalDependencies:
+      '@napi-rs/canvas-android-arm64': 0.1.53
+      '@napi-rs/canvas-darwin-arm64': 0.1.53
+      '@napi-rs/canvas-darwin-x64': 0.1.53
+      '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.53
+      '@napi-rs/canvas-linux-arm64-gnu': 0.1.53
+      '@napi-rs/canvas-linux-arm64-musl': 0.1.53
+      '@napi-rs/canvas-linux-x64-gnu': 0.1.53
+      '@napi-rs/canvas-linux-x64-musl': 0.1.53
+      '@napi-rs/canvas-win32-x64-msvc': 0.1.53
+    dev: false
+
   /@nodelib/fs.scandir/2.1.5:
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     engines: {node: '>= 8'}

+ 6 - 7
src/views/base/track-export/taskProgress.vue

@@ -193,13 +193,12 @@
     updateProgress();
 
     // 开启导出进程
-    // let downloadProcessCount = 2;
-    // if (total.value >= 10) {
-    //   const appConfig = window.api.getConfigData({});
-    //   downloadProcessCount = appConfig.downloadProcessCount;
-    // }
-    // window.electron.startWinProcess(downloadProcessCount, getExportUrl());
-    window.electron.startWinProcess(1, getExportUrl());
+    const appConfig = window.api.getConfigData({});
+    window.electron.startWinProcess(
+      appConfig.downloadProcessCount,
+      getExportUrl()
+    );
+    // window.electron.startWinProcess(1, getExportUrl());
   }
 
   function updateTaskFilerInfo(data: FilterDataType | null) {

+ 374 - 0
src/views/base/track-export/test/main-canvas-log.txt

@@ -0,0 +1,374 @@
+# 8个任务,16张图,pdf,并发1 ======>
+[2024-07-18 09:39:21.895] [info]  win:4 00-开启进程
+[2024-07-18 09:39:21.903] [info]  win:4 [543372074027057152] 01-开始任务
+[2024-07-18 09:39:22.017] [info]  win:4 [543372074027057152] 02-获取任务数据成功
+[2024-07-18 09:39:22.056] [info]  win:4 [543372074027057152] 02-1-图片下载成功
+[2024-07-18 09:39:22.057] [info]  win:4 [543372074027057152] 03-解析绘制数据成功
+[2024-07-18 09:39:22.108] [info]  win:4 [543372074027057152] 04-绘制成功
+[2024-07-18 09:39:22.115] [info]  win:4 [543372074027057152] 05-生成pdf成功
+[2024-07-18 09:39:22.116] [info]  win:4 [543372074027057152] 09-任务结束
+[2024-07-18 09:39:22.116] [info]  win:4 [543374858424156160] 01-开始任务
+[2024-07-18 09:39:22.211] [info]  win:4 [543374858424156160] 02-获取任务数据成功
+[2024-07-18 09:39:22.245] [info]  win:4 [543374858424156160] 02-1-图片下载成功
+[2024-07-18 09:39:22.245] [info]  win:4 [543374858424156160] 03-解析绘制数据成功
+[2024-07-18 09:39:22.287] [info]  win:4 [543374858424156160] 04-绘制成功
+[2024-07-18 09:39:22.291] [info]  win:4 [543374858424156160] 05-生成pdf成功
+[2024-07-18 09:39:22.292] [info]  win:4 [543374858424156160] 09-任务结束
+[2024-07-18 09:39:22.292] [info]  win:4 [543374858487070720] 01-开始任务
+[2024-07-18 09:39:22.393] [info]  win:4 [543374858487070720] 02-获取任务数据成功
+[2024-07-18 09:39:22.426] [info]  win:4 [543374858487070720] 02-1-图片下载成功
+[2024-07-18 09:39:22.426] [info]  win:4 [543374858487070720] 03-解析绘制数据成功
+[2024-07-18 09:39:22.464] [info]  win:4 [543374858487070720] 04-绘制成功
+[2024-07-18 09:39:22.466] [info]  win:4 [543374858487070720] 05-生成pdf成功
+[2024-07-18 09:39:22.467] [info]  win:4 [543374858487070720] 09-任务结束
+[2024-07-18 09:39:22.467] [info]  win:4 [543396931624239104] 01-开始任务
+[2024-07-18 09:39:22.565] [info]  win:4 [543396931624239104] 02-获取任务数据成功
+[2024-07-18 09:39:22.599] [info]  win:4 [543396931624239104] 02-1-图片下载成功
+[2024-07-18 09:39:22.599] [info]  win:4 [543396931624239104] 03-解析绘制数据成功
+[2024-07-18 09:39:22.648] [info]  win:4 [543396931624239104] 04-绘制成功
+[2024-07-18 09:39:22.652] [info]  win:4 [543396931624239104] 05-生成pdf成功
+[2024-07-18 09:39:22.653] [info]  win:4 [543396931624239104] 09-任务结束
+[2024-07-18 09:39:22.653] [info]  win:4 [543396931666182144] 01-开始任务
+[2024-07-18 09:39:22.757] [info]  win:4 [543396931666182144] 02-获取任务数据成功
+[2024-07-18 09:39:22.791] [info]  win:4 [543396931666182144] 02-1-图片下载成功
+[2024-07-18 09:39:22.792] [info]  win:4 [543396931666182144] 03-解析绘制数据成功
+[2024-07-18 09:39:22.832] [info]  win:4 [543396931666182144] 04-绘制成功
+[2024-07-18 09:39:22.834] [info]  win:4 [543396931666182144] 05-生成pdf成功
+[2024-07-18 09:39:22.835] [info]  win:4 [543396931666182144] 09-任务结束
+[2024-07-18 09:39:22.835] [info]  win:4 [543396931745873920] 01-开始任务
+[2024-07-18 09:39:22.927] [info]  win:4 [543396931745873920] 02-获取任务数据成功
+[2024-07-18 09:39:22.961] [info]  win:4 [543396931745873920] 02-1-图片下载成功
+[2024-07-18 09:39:22.961] [info]  win:4 [543396931745873920] 03-解析绘制数据成功
+[2024-07-18 09:39:23.008] [info]  win:4 [543396931745873920] 04-绘制成功
+[2024-07-18 09:39:23.012] [info]  win:4 [543396931745873920] 05-生成pdf成功
+[2024-07-18 09:39:23.013] [info]  win:4 [543396931745873920] 09-任务结束
+[2024-07-18 09:39:23.013] [info]  win:4 [543396931787816960] 01-开始任务
+[2024-07-18 09:39:23.109] [info]  win:4 [543396931787816960] 02-获取任务数据成功
+[2024-07-18 09:39:23.140] [info]  win:4 [543396931787816960] 02-1-图片下载成功
+[2024-07-18 09:39:23.141] [info]  win:4 [543396931787816960] 03-解析绘制数据成功
+[2024-07-18 09:39:23.188] [info]  win:4 [543396931787816960] 04-绘制成功
+[2024-07-18 09:39:23.190] [info]  win:4 [543396931787816960] 05-生成pdf成功
+[2024-07-18 09:39:23.191] [info]  win:4 [543396931787816960] 09-任务结束
+[2024-07-18 09:39:23.191] [info]  win:4 [543372074081583104] 01-开始任务
+[2024-07-18 09:39:23.282] [info]  win:4 [543372074081583104] 02-获取任务数据成功
+[2024-07-18 09:39:23.313] [info]  win:4 [543372074081583104] 02-1-图片下载成功
+[2024-07-18 09:39:23.313] [info]  win:4 [543372074081583104] 03-解析绘制数据成功
+[2024-07-18 09:39:23.365] [info]  win:4 [543372074081583104] 04-绘制成功
+[2024-07-18 09:39:23.368] [info]  win:4 [543372074081583104] 05-生成pdf成功
+[2024-07-18 09:39:23.369] [info]  win:4 [543372074081583104] 09-任务结束
+[2024-07-18 09:39:23.371] [info]  win:4 00-无任务
+[2024-07-18 09:39:24.373] [info]  win:4 99-结束进程
+# 8个任务,16张图,pdf,并发1 ======> 耗时:1476ms
+
+# 8个任务,16张图,pdf,并发2 ======>
+[2024-07-18 09:40:43.448] [info]  win:5 00-开启进程
+[2024-07-18 09:40:43.454] [info]  win:5 [543372074027057152] 01-开始任务
+[2024-07-18 09:40:43.454] [info]  win:5 [543374858424156160] 01-开始任务
+[2024-07-18 09:40:43.561] [info]  win:5 [543372074027057152] 02-获取任务数据成功
+[2024-07-18 09:40:43.563] [info]  win:5 [543374858424156160] 02-获取任务数据成功
+[2024-07-18 09:40:43.621] [info]  win:5 [543372074027057152] 02-1-图片下载成功
+[2024-07-18 09:40:43.623] [info]  win:5 [543372074027057152] 03-解析绘制数据成功
+[2024-07-18 09:40:43.647] [info]  win:5 [543374858424156160] 02-1-图片下载成功
+[2024-07-18 09:40:43.647] [info]  win:5 [543374858424156160] 03-解析绘制数据成功
+[2024-07-18 09:40:43.696] [info]  win:5 [543372074027057152] 04-绘制成功
+[2024-07-18 09:40:43.704] [info]  win:5 [543372074027057152] 05-生成pdf成功
+[2024-07-18 09:40:43.706] [info]  win:5 [543372074027057152] 09-任务结束
+[2024-07-18 09:40:43.706] [info]  win:5 [543374858487070720] 01-开始任务
+[2024-07-18 09:40:43.708] [info]  win:5 [543374858424156160] 04-绘制成功
+[2024-07-18 09:40:43.711] [info]  win:5 [543374858424156160] 05-生成pdf成功
+[2024-07-18 09:40:43.712] [info]  win:5 [543374858424156160] 09-任务结束
+[2024-07-18 09:40:43.712] [info]  win:5 [543396931624239104] 01-开始任务
+[2024-07-18 09:40:43.807] [info]  win:5 [543396931624239104] 02-获取任务数据成功
+[2024-07-18 09:40:43.834] [info]  win:5 [543374858487070720] 02-获取任务数据成功
+[2024-07-18 09:40:43.843] [info]  win:5 [543396931624239104] 02-1-图片下载成功
+[2024-07-18 09:40:43.843] [info]  win:5 [543396931624239104] 03-解析绘制数据成功
+[2024-07-18 09:40:43.876] [info]  win:5 [543374858487070720] 02-1-图片下载成功
+[2024-07-18 09:40:43.876] [info]  win:5 [543374858487070720] 03-解析绘制数据成功
+[2024-07-18 09:40:43.913] [info]  win:5 [543396931624239104] 04-绘制成功
+[2024-07-18 09:40:43.917] [info]  win:5 [543396931624239104] 05-生成pdf成功
+[2024-07-18 09:40:43.918] [info]  win:5 [543396931624239104] 09-任务结束
+[2024-07-18 09:40:43.918] [info]  win:5 [543396931666182144] 01-开始任务
+[2024-07-18 09:40:43.921] [info]  win:5 [543374858487070720] 04-绘制成功
+[2024-07-18 09:40:43.923] [info]  win:5 [543374858487070720] 05-生成pdf成功
+[2024-07-18 09:40:43.924] [info]  win:5 [543374858487070720] 09-任务结束
+[2024-07-18 09:40:43.924] [info]  win:5 [543396931745873920] 01-开始任务
+[2024-07-18 09:40:44.022] [info]  win:5 [543396931666182144] 02-获取任务数据成功
+[2024-07-18 09:40:44.053] [info]  win:5 [543396931745873920] 02-获取任务数据成功
+[2024-07-18 09:40:44.057] [info]  win:5 [543396931666182144] 02-1-图片下载成功
+[2024-07-18 09:40:44.057] [info]  win:5 [543396931666182144] 03-解析绘制数据成功
+[2024-07-18 09:40:44.090] [info]  win:5 [543396931745873920] 02-1-图片下载成功
+[2024-07-18 09:40:44.091] [info]  win:5 [543396931745873920] 03-解析绘制数据成功
+[2024-07-18 09:40:44.120] [info]  win:5 [543396931666182144] 04-绘制成功
+[2024-07-18 09:40:44.124] [info]  win:5 [543396931666182144] 05-生成pdf成功
+[2024-07-18 09:40:44.125] [info]  win:5 [543396931666182144] 09-任务结束
+[2024-07-18 09:40:44.125] [info]  win:5 [543396931787816960] 01-开始任务
+[2024-07-18 09:40:44.132] [info]  win:5 [543396931745873920] 04-绘制成功
+[2024-07-18 09:40:44.134] [info]  win:5 [543396931745873920] 05-生成pdf成功
+[2024-07-18 09:40:44.135] [info]  win:5 [543396931745873920] 09-任务结束
+[2024-07-18 09:40:44.135] [info]  win:5 [543372074081583104] 01-开始任务
+[2024-07-18 09:40:44.229] [info]  win:5 [543396931787816960] 02-获取任务数据成功
+[2024-07-18 09:40:44.256] [info]  win:5 [543372074081583104] 02-获取任务数据成功
+[2024-07-18 09:40:44.261] [info]  win:5 [543396931787816960] 02-1-图片下载成功
+[2024-07-18 09:40:44.261] [info]  win:5 [543396931787816960] 03-解析绘制数据成功
+[2024-07-18 09:40:44.291] [info]  win:5 [543372074081583104] 02-1-图片下载成功
+[2024-07-18 09:40:44.292] [info]  win:5 [543372074081583104] 03-解析绘制数据成功
+[2024-07-18 09:40:44.321] [info]  win:5 [543396931787816960] 04-绘制成功
+[2024-07-18 09:40:44.325] [info]  win:5 [543396931787816960] 05-生成pdf成功
+[2024-07-18 09:40:44.326] [info]  win:5 [543396931787816960] 09-任务结束
+[2024-07-18 09:40:44.330] [info]  win:5 [543372074081583104] 04-绘制成功
+[2024-07-18 09:40:44.331] [info]  win:5 [543372074081583104] 05-生成pdf成功
+[2024-07-18 09:40:44.332] [info]  win:5 [543372074081583104] 09-任务结束
+[2024-07-18 09:40:44.334] [info]  win:5 00-无任务
+[2024-07-18 09:40:45.340] [info]  win:5 99-结束进程
+# 8个任务,16张图,pdf,并发2 ======> 耗时:886ms
+
+# 8个任务,16张图,pdf,并发3 ======>
+[2024-07-18 09:35:40.857] [info]  win:2 00-开启进程
+[2024-07-18 09:35:40.865] [info]  win:2 [543372074027057152] 01-开始任务
+[2024-07-18 09:35:40.866] [info]  win:2 [543374858424156160] 01-开始任务
+[2024-07-18 09:35:40.866] [info]  win:2 [543374858487070720] 01-开始任务
+[2024-07-18 09:35:40.992] [info]  win:2 [543372074027057152] 02-获取任务数据成功
+[2024-07-18 09:35:40.994] [info]  win:2 [543374858424156160] 02-获取任务数据成功
+[2024-07-18 09:35:41.021] [info]  win:2 [543374858487070720] 02-获取任务数据成功
+[2024-07-18 09:35:41.055] [info]  win:2 [543372074027057152] 02-1-图片下载成功
+[2024-07-18 09:35:41.057] [info]  win:2 [543372074027057152] 03-解析绘制数据成功
+[2024-07-18 09:35:41.092] [info]  win:2 [543374858424156160] 02-1-图片下载成功
+[2024-07-18 09:35:41.092] [info]  win:2 [543374858424156160] 03-解析绘制数据成功
+[2024-07-18 09:35:41.095] [info]  win:2 [543374858487070720] 02-1-图片下载成功
+[2024-07-18 09:35:41.095] [info]  win:2 [543374858487070720] 03-解析绘制数据成功
+[2024-07-18 09:35:41.160] [info]  win:2 [543372074027057152] 04-绘制成功
+[2024-07-18 09:35:41.167] [info]  win:2 [543374858424156160] 04-绘制成功
+[2024-07-18 09:35:41.170] [info]  win:2 [543372074027057152] 05-生成pdf成功
+[2024-07-18 09:35:41.171] [info]  win:2 [543374858424156160] 05-生成pdf成功
+[2024-07-18 09:35:41.172] [info]  win:2 [543372074027057152] 09-任务结束
+[2024-07-18 09:35:41.172] [info]  win:2 [543396931624239104] 01-开始任务
+[2024-07-18 09:35:41.174] [info]  win:2 [543374858487070720] 04-绘制成功
+[2024-07-18 09:35:41.176] [info]  win:2 [543374858424156160] 09-任务结束
+[2024-07-18 09:35:41.176] [info]  win:2 [543396931666182144] 01-开始任务
+[2024-07-18 09:35:41.177] [info]  win:2 [543374858487070720] 05-生成pdf成功
+[2024-07-18 09:35:41.178] [info]  win:2 [543374858487070720] 09-任务结束
+[2024-07-18 09:35:41.178] [info]  win:2 [543396931745873920] 01-开始任务
+[2024-07-18 09:35:41.280] [info]  win:2 [543396931624239104] 02-获取任务数据成功
+[2024-07-18 09:35:41.295] [info]  win:2 [543396931666182144] 02-获取任务数据成功
+[2024-07-18 09:35:41.325] [info]  win:2 [543396931624239104] 02-1-图片下载成功
+[2024-07-18 09:35:41.325] [info]  win:2 [543396931624239104] 03-解析绘制数据成功
+[2024-07-18 09:35:41.338] [info]  win:2 [543396931745873920] 02-获取任务数据成功
+[2024-07-18 09:35:41.358] [info]  win:2 [543396931666182144] 02-1-图片下载成功
+[2024-07-18 09:35:41.359] [info]  win:2 [543396931666182144] 03-解析绘制数据成功
+[2024-07-18 09:35:41.390] [info]  win:2 [543396931745873920] 02-1-图片下载成功
+[2024-07-18 09:35:41.390] [info]  win:2 [543396931745873920] 03-解析绘制数据成功
+[2024-07-18 09:35:41.415] [info]  win:2 [543396931624239104] 04-绘制成功
+[2024-07-18 09:35:41.422] [info]  win:2 [543396931666182144] 04-绘制成功
+[2024-07-18 09:35:41.424] [info]  win:2 [543396931624239104] 05-生成pdf成功
+[2024-07-18 09:35:41.425] [info]  win:2 [543396931666182144] 05-生成pdf成功
+[2024-07-18 09:35:41.426] [info]  win:2 [543396931624239104] 09-任务结束
+[2024-07-18 09:35:41.426] [info]  win:2 [543396931787816960] 01-开始任务
+[2024-07-18 09:35:41.427] [info]  win:2 [543396931666182144] 09-任务结束
+[2024-07-18 09:35:41.427] [info]  win:2 [543372074081583104] 01-开始任务
+[2024-07-18 09:35:41.428] [info]  win:2 [543396931745873920] 04-绘制成功
+[2024-07-18 09:35:41.430] [info]  win:2 [543396931745873920] 05-生成pdf成功
+[2024-07-18 09:35:41.431] [info]  win:2 [543396931745873920] 09-任务结束
+[2024-07-18 09:35:41.524] [info]  win:2 [543372074081583104] 02-获取任务数据成功
+[2024-07-18 09:35:41.525] [info]  win:2 [543396931787816960] 02-获取任务数据成功
+[2024-07-18 09:35:41.565] [info]  win:2 [543372074081583104] 02-1-图片下载成功
+[2024-07-18 09:35:41.565] [info]  win:2 [543372074081583104] 03-解析绘制数据成功
+[2024-07-18 09:35:41.594] [info]  win:2 [543396931787816960] 02-1-图片下载成功
+[2024-07-18 09:35:41.594] [info]  win:2 [543396931787816960] 03-解析绘制数据成功
+[2024-07-18 09:35:41.633] [info]  win:2 [543372074081583104] 04-绘制成功
+[2024-07-18 09:35:41.637] [info]  win:2 [543372074081583104] 05-生成pdf成功
+[2024-07-18 09:35:41.639] [info]  win:2 [543372074081583104] 09-任务结束
+[2024-07-18 09:35:41.641] [info]  win:2 [543396931787816960] 04-绘制成功
+[2024-07-18 09:35:41.643] [info]  win:2 [543396931787816960] 05-生成pdf成功
+[2024-07-18 09:35:41.643] [info]  win:2 [543396931787816960] 09-任务结束
+[2024-07-18 09:35:41.645] [info]  win:2 00-无任务
+[2024-07-18 09:35:42.647] [info]  win:2 99-结束进程
+# 8个任务,16张图,pdf,并发3 ======> 耗时:788ms
+
+# 8个任务,16张图,pdf,并发4 ======>
+[2024-07-18 09:38:13.464] [info]  win:3 00-开启进程
+[2024-07-18 09:38:13.469] [info]  win:3 [543372074027057152] 01-开始任务
+[2024-07-18 09:38:13.470] [info]  win:3 [543374858424156160] 01-开始任务
+[2024-07-18 09:38:13.470] [info]  win:3 [543374858487070720] 01-开始任务
+[2024-07-18 09:38:13.470] [info]  win:3 [543396931624239104] 01-开始任务
+[2024-07-18 09:38:13.625] [info]  win:3 [543372074027057152] 02-获取任务数据成功
+[2024-07-18 09:38:13.658] [info]  win:3 [543374858424156160] 02-获取任务数据成功
+[2024-07-18 09:38:13.659] [info]  win:3 [543374858487070720] 02-获取任务数据成功
+[2024-07-18 09:38:13.660] [info]  win:3 [543396931624239104] 02-获取任务数据成功
+[2024-07-18 09:38:13.667] [info]  win:3 [543372074027057152] 02-1-图片下载成功
+[2024-07-18 09:38:13.668] [info]  win:3 [543372074027057152] 03-解析绘制数据成功
+[2024-07-18 09:38:13.721] [info]  win:3 [543374858424156160] 02-1-图片下载成功
+[2024-07-18 09:38:13.721] [info]  win:3 [543374858424156160] 03-解析绘制数据成功
+[2024-07-18 09:38:13.757] [info]  win:3 [543374858487070720] 02-1-图片下载成功
+[2024-07-18 09:38:13.757] [info]  win:3 [543374858487070720] 03-解析绘制数据成功
+[2024-07-18 09:38:13.761] [info]  win:3 [543396931624239104] 02-1-图片下载成功
+[2024-07-18 09:38:13.761] [info]  win:3 [543396931624239104] 03-解析绘制数据成功
+[2024-07-18 09:38:13.787] [info]  win:3 [543372074027057152] 04-绘制成功
+[2024-07-18 09:38:13.834] [info]  win:3 [543374858424156160] 04-绘制成功
+[2024-07-18 09:38:13.837] [info]  win:3 [543374858487070720] 04-绘制成功
+[2024-07-18 09:38:13.839] [info]  win:3 [543372074027057152] 05-生成pdf成功
+[2024-07-18 09:38:13.842] [info]  win:3 [543372074027057152] 09-任务结束
+[2024-07-18 09:38:13.842] [info]  win:3 [543396931666182144] 01-开始任务
+[2024-07-18 09:38:13.844] [info]  win:3 [543374858424156160] 05-生成pdf成功
+[2024-07-18 09:38:13.844] [info]  win:3 [543396931624239104] 04-绘制成功
+[2024-07-18 09:38:13.847] [info]  win:3 [543374858487070720] 05-生成pdf成功
+[2024-07-18 09:38:13.847] [info]  win:3 [543374858424156160] 09-任务结束
+[2024-07-18 09:38:13.847] [info]  win:3 [543396931745873920] 01-开始任务
+[2024-07-18 09:38:13.848] [info]  win:3 [543396931624239104] 05-生成pdf成功
+[2024-07-18 09:38:13.848] [info]  win:3 [543374858487070720] 09-任务结束
+[2024-07-18 09:38:13.848] [info]  win:3 [543396931787816960] 01-开始任务
+[2024-07-18 09:38:13.849] [info]  win:3 [543396931624239104] 09-任务结束
+[2024-07-18 09:38:13.849] [info]  win:3 [543372074081583104] 01-开始任务
+[2024-07-18 09:38:13.977] [info]  win:3 [543396931745873920] 02-获取任务数据成功
+[2024-07-18 09:38:13.978] [info]  win:3 [543396931666182144] 02-获取任务数据成功
+[2024-07-18 09:38:13.990] [info]  win:3 [543396931787816960] 02-获取任务数据成功
+[2024-07-18 09:38:14.018] [info]  win:3 [543372074081583104] 02-获取任务数据成功
+[2024-07-18 09:38:14.042] [info]  win:3 [543396931745873920] 02-1-图片下载成功
+[2024-07-18 09:38:14.042] [info]  win:3 [543396931745873920] 03-解析绘制数据成功
+[2024-07-18 09:38:14.084] [info]  win:3 [543396931787816960] 02-1-图片下载成功
+[2024-07-18 09:38:14.085] [info]  win:3 [543396931787816960] 03-解析绘制数据成功
+[2024-07-18 09:38:14.113] [info]  win:3 [543396931666182144] 02-1-图片下载成功
+[2024-07-18 09:38:14.114] [info]  win:3 [543396931666182144] 03-解析绘制数据成功
+[2024-07-18 09:38:14.117] [info]  win:3 [543372074081583104] 02-1-图片下载成功
+[2024-07-18 09:38:14.117] [info]  win:3 [543372074081583104] 03-解析绘制数据成功
+[2024-07-18 09:38:14.169] [info]  win:3 [543396931745873920] 04-绘制成功
+[2024-07-18 09:38:14.176] [info]  win:3 [543396931666182144] 04-绘制成功
+[2024-07-18 09:38:14.178] [info]  win:3 [543396931787816960] 04-绘制成功
+[2024-07-18 09:38:14.180] [info]  win:3 [543396931745873920] 05-生成pdf成功
+[2024-07-18 09:38:14.181] [info]  win:3 [543396931666182144] 05-生成pdf成功
+[2024-07-18 09:38:14.182] [info]  win:3 [543396931787816960] 05-生成pdf成功
+[2024-07-18 09:38:14.182] [info]  win:3 [543396931745873920] 09-任务结束
+[2024-07-18 09:38:14.184] [info]  win:3 [543396931666182144] 09-任务结束
+[2024-07-18 09:38:14.184] [info]  win:3 [543372074081583104] 04-绘制成功
+[2024-07-18 09:38:14.186] [info]  win:3 [543396931787816960] 09-任务结束
+[2024-07-18 09:38:14.186] [info]  win:3 [543372074081583104] 05-生成pdf成功
+[2024-07-18 09:38:14.187] [info]  win:3 [543372074081583104] 09-任务结束
+[2024-07-18 09:38:14.189] [info]  win:3 00-无任务
+[2024-07-18 09:38:15.192] [info]  win:3 99-结束进程
+# 8个任务,16张图,pdf,并发4 ======> 耗时:725ms
+
+# 8个任务,16张图,pdf,并发5 ======>
+[2024-07-18 09:42:07.104] [info]  win:6 00-开启进程
+[2024-07-18 09:42:07.112] [info]  win:6 [543372074027057152] 01-开始任务
+[2024-07-18 09:42:07.112] [info]  win:6 [543374858424156160] 01-开始任务
+[2024-07-18 09:42:07.112] [info]  win:6 [543374858487070720] 01-开始任务
+[2024-07-18 09:42:07.113] [info]  win:6 [543396931624239104] 01-开始任务
+[2024-07-18 09:42:07.113] [info]  win:6 [543396931666182144] 01-开始任务
+[2024-07-18 09:42:07.233] [info]  win:6 [543374858424156160] 02-获取任务数据成功
+[2024-07-18 09:42:07.240] [info]  win:6 [543372074027057152] 02-获取任务数据成功
+[2024-07-18 09:42:07.276] [info]  win:6 [543396931624239104] 02-获取任务数据成功
+[2024-07-18 09:42:07.286] [info]  win:6 [543374858487070720] 02-获取任务数据成功
+[2024-07-18 09:42:07.303] [info]  win:6 [543374858424156160] 02-1-图片下载成功
+[2024-07-18 09:42:07.305] [info]  win:6 [543374858424156160] 03-解析绘制数据成功
+[2024-07-18 09:42:07.322] [info]  win:6 [543396931666182144] 02-获取任务数据成功
+[2024-07-18 09:42:07.343] [info]  win:6 [543372074027057152] 02-1-图片下载成功
+[2024-07-18 09:42:07.344] [info]  win:6 [543372074027057152] 03-解析绘制数据成功
+[2024-07-18 09:42:07.379] [info]  win:6 [543396931624239104] 02-1-图片下载成功
+[2024-07-18 09:42:07.379] [info]  win:6 [543396931624239104] 03-解析绘制数据成功
+[2024-07-18 09:42:07.384] [info]  win:6 [543374858487070720] 02-1-图片下载成功
+[2024-07-18 09:42:07.384] [info]  win:6 [543374858487070720] 03-解析绘制数据成功
+[2024-07-18 09:42:07.409] [info]  win:6 [543374858424156160] 04-绘制成功
+[2024-07-18 09:42:07.416] [info]  win:6 [543396931666182144] 02-1-图片下载成功
+[2024-07-18 09:42:07.416] [info]  win:6 [543396931666182144] 03-解析绘制数据成功
+[2024-07-18 09:42:07.453] [info]  win:6 [543372074027057152] 04-绘制成功
+[2024-07-18 09:42:07.479] [info]  win:6 [543396931624239104] 04-绘制成功
+[2024-07-18 09:42:07.481] [info]  win:6 [543374858424156160] 05-生成pdf成功
+[2024-07-18 09:42:07.483] [info]  win:6 [543374858487070720] 04-绘制成功
+[2024-07-18 09:42:07.484] [info]  win:6 [543374858424156160] 09-任务结束
+[2024-07-18 09:42:07.484] [info]  win:6 [543396931745873920] 01-开始任务
+[2024-07-18 09:42:07.487] [info]  win:6 [543372074027057152] 05-生成pdf成功
+[2024-07-18 09:42:07.488] [info]  win:6 [543396931624239104] 05-生成pdf成功
+[2024-07-18 09:42:07.488] [info]  win:6 [543372074027057152] 09-任务结束
+[2024-07-18 09:42:07.488] [info]  win:6 [543396931787816960] 01-开始任务
+[2024-07-18 09:42:07.489] [info]  win:6 [543374858487070720] 05-生成pdf成功
+[2024-07-18 09:42:07.489] [info]  win:6 [543396931624239104] 09-任务结束
+[2024-07-18 09:42:07.489] [info]  win:6 [543372074081583104] 01-开始任务
+[2024-07-18 09:42:07.490] [info]  win:6 [543374858487070720] 09-任务结束
+[2024-07-18 09:42:07.491] [info]  win:6 [543396931666182144] 04-绘制成功
+[2024-07-18 09:42:07.493] [info]  win:6 [543396931666182144] 05-生成pdf成功
+[2024-07-18 09:42:07.494] [info]  win:6 [543396931666182144] 09-任务结束
+[2024-07-18 09:42:07.589] [info]  win:6 [543396931787816960] 02-获取任务数据成功
+[2024-07-18 09:42:07.590] [info]  win:6 [543396931745873920] 02-获取任务数据成功
+[2024-07-18 09:42:07.615] [info]  win:6 [543372074081583104] 02-获取任务数据成功
+[2024-07-18 09:42:07.637] [info]  win:6 [543396931787816960] 02-1-图片下载成功
+[2024-07-18 09:42:07.638] [info]  win:6 [543396931787816960] 03-解析绘制数据成功
+[2024-07-18 09:42:07.677] [info]  win:6 [543396931745873920] 02-1-图片下载成功
+[2024-07-18 09:42:07.678] [info]  win:6 [543396931745873920] 03-解析绘制数据成功
+[2024-07-18 09:42:07.685] [info]  win:6 [543372074081583104] 02-1-图片下载成功
+[2024-07-18 09:42:07.685] [info]  win:6 [543372074081583104] 03-解析绘制数据成功
+[2024-07-18 09:42:07.735] [info]  win:6 [543396931787816960] 04-绘制成功
+[2024-07-18 09:42:07.738] [info]  win:6 [543396931745873920] 04-绘制成功
+[2024-07-18 09:42:07.741] [info]  win:6 [543396931787816960] 05-生成pdf成功
+[2024-07-18 09:42:07.741] [info]  win:6 [543396931745873920] 05-生成pdf成功
+[2024-07-18 09:42:07.742] [info]  win:6 [543396931787816960] 09-任务结束
+[2024-07-18 09:42:07.742] [info]  win:6 [543396931745873920] 09-任务结束
+[2024-07-18 09:42:07.744] [info]  win:6 [543372074081583104] 04-绘制成功
+[2024-07-18 09:42:07.746] [info]  win:6 [543372074081583104] 05-生成pdf成功
+[2024-07-18 09:42:07.747] [info]  win:6 [543372074081583104] 09-任务结束
+[2024-07-18 09:42:07.748] [info]  win:6 00-无任务
+[2024-07-18 09:42:08.754] [info]  win:6 99-结束进程
+# 8个任务,16张图,pdf,并发5 ======> 耗时:644ms
+
+# 8个任务,16张图,pdf,并发6 ======>
+[2024-07-18 09:43:07.839] [info]  win:7 00-开启进程
+[2024-07-18 09:43:07.845] [info]  win:7 [543372074027057152] 01-开始任务
+[2024-07-18 09:43:07.845] [info]  win:7 [543374858424156160] 01-开始任务
+[2024-07-18 09:43:07.845] [info]  win:7 [543374858487070720] 01-开始任务
+[2024-07-18 09:43:07.846] [info]  win:7 [543396931624239104] 01-开始任务
+[2024-07-18 09:43:07.846] [info]  win:7 [543396931666182144] 01-开始任务
+[2024-07-18 09:43:07.846] [info]  win:7 [543396931745873920] 01-开始任务
+[2024-07-18 09:43:07.967] [info]  win:7 [543372074027057152] 02-获取任务数据成功
+[2024-07-18 09:43:07.971] [info]  win:7 [543374858424156160] 02-获取任务数据成功
+[2024-07-18 09:43:08.011] [info]  win:7 [543374858487070720] 02-获取任务数据成功
+[2024-07-18 09:43:08.026] [info]  win:7 [543396931624239104] 02-获取任务数据成功
+[2024-07-18 09:43:08.042] [info]  win:7 [543374858424156160] 02-1-图片下载成功
+[2024-07-18 09:43:08.043] [info]  win:7 [543374858424156160] 03-解析绘制数据成功
+[2024-07-18 09:43:08.045] [info]  win:7 [543372074027057152] 02-1-图片下载成功
+[2024-07-18 09:43:08.046] [info]  win:7 [543372074027057152] 03-解析绘制数据成功
+[2024-07-18 09:43:08.087] [info]  win:7 [543396931666182144] 02-获取任务数据成功
+[2024-07-18 09:43:08.117] [info]  win:7 [543396931745873920] 02-获取任务数据成功
+[2024-07-18 09:43:08.119] [info]  win:7 [543374858487070720] 02-1-图片下载成功
+[2024-07-18 09:43:08.120] [info]  win:7 [543374858487070720] 03-解析绘制数据成功
+[2024-07-18 09:43:08.125] [info]  win:7 [543396931624239104] 02-1-图片下载成功
+[2024-07-18 09:43:08.125] [info]  win:7 [543396931624239104] 03-解析绘制数据成功
+[2024-07-18 09:43:08.151] [info]  win:7 [543374858424156160] 04-绘制成功
+[2024-07-18 09:43:08.159] [info]  win:7 [543396931666182144] 02-1-图片下载成功
+[2024-07-18 09:43:08.159] [info]  win:7 [543396931666182144] 03-解析绘制数据成功
+[2024-07-18 09:43:08.196] [info]  win:7 [543396931745873920] 02-1-图片下载成功
+[2024-07-18 09:43:08.196] [info]  win:7 [543396931745873920] 03-解析绘制数据成功
+[2024-07-18 09:43:08.199] [info]  win:7 [543372074027057152] 04-绘制成功
+[2024-07-18 09:43:08.232] [info]  win:7 [543374858424156160] 05-生成pdf成功
+[2024-07-18 09:43:08.256] [info]  win:7 [543374858487070720] 04-绘制成功
+[2024-07-18 09:43:08.260] [info]  win:7 [543374858424156160] 09-任务结束
+[2024-07-18 09:43:08.260] [info]  win:7 [543396931787816960] 01-开始任务
+[2024-07-18 09:43:08.262] [info]  win:7 [543396931624239104] 04-绘制成功
+[2024-07-18 09:43:08.264] [info]  win:7 [543372074027057152] 05-生成pdf成功
+[2024-07-18 09:43:08.265] [info]  win:7 [543396931666182144] 04-绘制成功
+[2024-07-18 09:43:08.267] [info]  win:7 [543372074027057152] 09-任务结束
+[2024-07-18 09:43:08.267] [info]  win:7 [543372074081583104] 01-开始任务
+[2024-07-18 09:43:08.268] [info]  win:7 [543374858487070720] 05-生成pdf成功
+[2024-07-18 09:43:08.268] [info]  win:7 [543396931624239104] 05-生成pdf成功
+[2024-07-18 09:43:08.269] [info]  win:7 [543374858487070720] 09-任务结束
+[2024-07-18 09:43:08.269] [info]  win:7 [543396931666182144] 05-生成pdf成功
+[2024-07-18 09:43:08.269] [info]  win:7 [543396931745873920] 04-绘制成功
+[2024-07-18 09:43:08.271] [info]  win:7 [543396931624239104] 09-任务结束
+[2024-07-18 09:43:08.272] [info]  win:7 [543396931745873920] 05-生成pdf成功
+[2024-07-18 09:43:08.272] [info]  win:7 [543396931666182144] 09-任务结束
+[2024-07-18 09:43:08.273] [info]  win:7 [543396931745873920] 09-任务结束
+[2024-07-18 09:43:08.360] [info]  win:7 [543396931787816960] 02-获取任务数据成功
+[2024-07-18 09:43:08.382] [info]  win:7 [543372074081583104] 02-获取任务数据成功
+[2024-07-18 09:43:08.396] [info]  win:7 [543396931787816960] 02-1-图片下载成功
+[2024-07-18 09:43:08.396] [info]  win:7 [543396931787816960] 03-解析绘制数据成功
+[2024-07-18 09:43:08.428] [info]  win:7 [543372074081583104] 02-1-图片下载成功
+[2024-07-18 09:43:08.429] [info]  win:7 [543372074081583104] 03-解析绘制数据成功
+[2024-07-18 09:43:08.462] [info]  win:7 [543396931787816960] 04-绘制成功
+[2024-07-18 09:43:08.466] [info]  win:7 [543396931787816960] 05-生成pdf成功
+[2024-07-18 09:43:08.467] [info]  win:7 [543396931787816960] 09-任务结束
+[2024-07-18 09:43:08.475] [info]  win:7 [543372074081583104] 04-绘制成功
+[2024-07-18 09:43:08.476] [info]  win:7 [543372074081583104] 05-生成pdf成功
+[2024-07-18 09:43:08.477] [info]  win:7 [543372074081583104] 09-任务结束
+[2024-07-18 09:43:08.478] [info]  win:7 00-无任务
+[2024-07-18 09:43:09.484] [info]  win:7 99-结束进程
+# 8个任务,16张图,pdf,并发6 ======> 耗时:639ms
+
+# ['1', '2', '3', '4', '5', '6']
+# [1476, 886, 788, 725, 644, 639]

+ 2 - 5
src/views/base/track-export/trackTaskExport.vue

@@ -36,7 +36,7 @@
   const stop = ref(false);
   const task = ref({} as TrackTaskData);
   const trackConfig = ref({} as TrackConfigType);
-  const downloadProcessCount = ref(2);
+  const queueConcurrency = 4;
   const groupCount = 20;
 
   function addLog(content: string, type?: 'info' | 'error') {
@@ -67,7 +67,7 @@
 
   async function runGroupTask(datas: TrackTaskDetailData[]) {
     const { buildQueue, stopQueue } = usePQueue({
-      concurrency: downloadProcessCount.value,
+      concurrency: queueConcurrency,
     });
 
     const runItemTask = async (itemTask: TrackTaskDetailData) => {
@@ -116,9 +116,6 @@
     addLog(`00-开启进程`);
     registEvent();
 
-    const appConfig = window.api.getConfigData({});
-    downloadProcessCount.value = appConfig.downloadProcessCount;
-
     const res = await window.db
       .getUnfinishTrackTask(userStore.curSchoolInfo.id)
       .catch(() => {

+ 8 - 28
src/views/base/track-export/useDraw.ts

@@ -21,6 +21,7 @@ interface TrackItemType {
   url: string;
   width: number;
   height: number;
+  outpath: string;
   drawTrackList: DrawTrackItem[];
 }
 
@@ -155,17 +156,6 @@ export default function useDraw(drawConfig: DrawConfig) {
     window.api.logger(`win:${winId} ${content}`, type);
   }
 
-  // async function getTrackTask(schoolId: string) {
-  //   const res = await window.db.getUnfinishTrackTask(schoolId);
-  //   if (!res) return Promise.reject(new Error('无任务'));
-  //   task.value = res;
-  //   trackConfig.value = JSON.parse(res.trackConfig) as TrackConfigType;
-  //   isOnlyOrigin = checkOnlyOrigin();
-  //   hasPdf = trackConfig.value.pictureType.includes('pdf');
-  //   updateColorConfig();
-  //   return res.id;
-  // }
-
   async function runTask() {
     initData();
     curStudentId = taskDetail.studentId;
@@ -301,6 +291,7 @@ export default function useDraw(drawConfig: DrawConfig) {
       if (!url.startsWith('http://') && !url.startsWith('https://')) {
         url = `${domain}/${url}`;
       }
+      // url += `&t=${Date.now()}`;
       downloads.push(
         window.api.downloadImage(url, getOutputPath('origin', i + 1))
       );
@@ -355,6 +346,7 @@ export default function useDraw(drawConfig: DrawConfig) {
         url: img.url,
         width: img.width,
         height: img.height,
+        outpath: getOutputPath('track', i + 1),
         drawTrackList,
       };
     }
@@ -363,27 +355,15 @@ export default function useDraw(drawConfig: DrawConfig) {
   async function drawTask(): Promise<ImageItem[]> {
     if (!trackData.length) return [];
 
-    const tasks = trackData.map((item, index) => {
-      const outpath = getOutputPath('track', index + 1);
+    await window.api.drawTracks(trackData);
 
+    return trackData.map((item) => {
       return {
-        imgItem: {
-          url: item.url,
-          width: item.width,
-          height: item.height,
-        },
-        outpath,
-        drawTrackList: item.drawTrackList,
+        url: item.outpath,
+        width: item.width,
+        height: item.height,
       };
     });
-
-    const res = await window.api.drawTracks(tasks).catch((error) => {
-      console.log(error);
-    });
-    if (!res) {
-      return Promise.reject(new Error('绘制轨迹错误'));
-    }
-    return res;
   }
 
   // track ----- start->

+ 1 - 2
src/views/base/track-export/z-readme.md

@@ -8,6 +8,5 @@
 
 # 下载优化策略
 
-- 生成轨迹图放主进程。
 - 单个窗口开始多任务。
-- 多页答题纸轨迹图开启多任务执行。
+- 放弃 gm,使用@napi-rs/canvas

+ 14 - 9
src/views/login/test-page/index.vue

@@ -16,7 +16,7 @@
 <script setup lang="ts">
   import { ref } from 'vue';
   import { usePQueue } from '@/hooks/p-queue';
-  import taskData from './task.json';
+  import taskData from './task.local.json';
 
   import { DrawTrackItem } from '../../../../electron/preload/types';
 
@@ -58,14 +58,18 @@
 
   async function toDrawCircle(type: 'circle' | 'line') {
     const url =
-      'https://oss-file.qmth.com.cn/teachcloud-dps-dev-private/sheet/506931097515331584/511142910851289088/2024000001/1-1.jpg?Expires=1717638293&OSSAccessKeyId=key&Signature=UYsoE6XTZ3KR8cng7liDN1zmwj0%3D';
+      '/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070902-大米0709002-1.jpg';
     const outpath =
       '/Users/chulin/develop/workspace/tcs/teachcloud-mark-tool/store/temp/122.jpg';
-    await window.api.drawTrack(
-      url,
-      [{ type, option: { x0: 200, y0: 200, x1: 200, y1: 110 } }],
-      outpath
-    );
+    await window.api
+      .drawCanvasTrack(
+        url,
+        [{ type, option: { x0: 200, y0: 200, x1: 500, y1: 400 } }],
+        outpath
+      )
+      .catch((e) => {
+        console.log(e);
+      });
     cropImg.value = `local://${outpath}`;
   }
 
@@ -79,7 +83,7 @@
     outpath: string;
     drawTrackList: DrawTrackItem[];
   }
-  // TODO:测试少轨迹的耗时
+
   async function toTextGm() {
     const st = Date.now();
     const concurrency = 3;
@@ -99,11 +103,12 @@
           Date.now() - st,
           0,
         ];
-        await window.api.drawTrack(
+        await window.api.drawCanvasTrack(
           item.imgItem.url,
           item.drawTrackList,
           item.outpath
         );
+
         times[index][2] = Date.now() - st;
       };
     });

+ 48 - 48
src/views/login/test-page/task.local.json

@@ -2,11 +2,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070902-大米0709002-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070902-大米0709002-1.jpg",
         "width": 2496,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070902-大米0709002-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070902-大米0709002-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -188,11 +188,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070902-大米0709002-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070902-大米0709002-2.jpg",
         "width": 2496,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070902-大米0709002-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070902-大米0709002-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -296,11 +296,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070905-大米0709005-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070905-大米0709005-1.jpg",
         "width": 2500,
         "height": 1762
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070905-大米0709005-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070905-大米0709005-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -472,11 +472,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070905-大米0709005-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070905-大米0709005-2.jpg",
         "width": 2500,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070905-大米0709005-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070905-大米0709005-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -580,11 +580,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070907-大米0709007-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070907-大米0709007-1.jpg",
         "width": 2498,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070907-大米0709007-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070907-大米0709007-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -756,11 +756,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070907-大米0709007-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070907-大米0709007-2.jpg",
         "width": 2498,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070907-大米0709007-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070907-大米0709007-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -864,11 +864,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070906-大米0709006-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070906-大米0709006-1.jpg",
         "width": 2496,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070906-大米0709006-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070906-大米0709006-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -1040,11 +1040,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070906-大米0709006-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070906-大米0709006-2.jpg",
         "width": 2498,
         "height": 1762
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070906-大米0709006-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070906-大米0709006-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -1148,11 +1148,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070908-大米0709008-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070908-大米0709008-1.jpg",
         "width": 2492,
         "height": 1762
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070908-大米0709008-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070908-大米0709008-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -1324,11 +1324,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070908-大米0709008-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070908-大米0709008-2.jpg",
         "width": 2492,
         "height": 1760
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070908-大米0709008-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070908-大米0709008-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -1432,11 +1432,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070910-大米0709010-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070910-大米0709010-1.jpg",
         "width": 2494,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070910-大米0709010-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070910-大米0709010-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -1608,11 +1608,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070910-大米0709010-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070910-大米0709010-2.jpg",
         "width": 2494,
         "height": 1762
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070910-大米0709010-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070910-大米0709010-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -1716,11 +1716,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070911-大米0709011-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070911-大米0709011-1.jpg",
         "width": 2494,
         "height": 1762
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070911-大米0709011-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070911-大米0709011-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -1902,11 +1902,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070911-大米0709011-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/原图/070911-大米0709011-2.jpg",
         "width": 2496,
         "height": 1760
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070911-大米0709011-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/教学班01/轨迹图/070911-大米0709011-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -2010,11 +2010,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/原图/1272-大米72-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/原图/1272-大米72-1.jpg",
         "width": 2494,
         "height": 1760
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/轨迹图/1272-大米72-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/轨迹图/1272-大米72-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -2186,11 +2186,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/原图/1272-大米72-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/原图/1272-大米72-2.jpg",
         "width": 2494,
         "height": 1760
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/轨迹图/1272-大米72-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/中国古代文学00快快快快快快快快(0300)/bh070902/m教学班01/轨迹图/1272-大米72-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -2294,11 +2294,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101907-罗元祥-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101907-罗元祥-1.jpg",
         "width": 2500,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101907-罗元祥-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101907-罗元祥-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -2599,11 +2599,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101907-罗元祥-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101907-罗元祥-2.jpg",
         "width": 2500,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101907-罗元祥-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101907-罗元祥-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -2649,11 +2649,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101631-史仁烨-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101631-史仁烨-1.jpg",
         "width": 2500,
         "height": 1762
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101631-史仁烨-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101631-史仁烨-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -2954,11 +2954,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101631-史仁烨-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101631-史仁烨-2.jpg",
         "width": 2500,
         "height": 1762
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101631-史仁烨-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101631-史仁烨-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -3024,11 +3024,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101934-崔丽峰-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101934-崔丽峰-1.jpg",
         "width": 2500,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101934-崔丽峰-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101934-崔丽峰-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -3369,11 +3369,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101934-崔丽峰-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/原图/18101934-崔丽峰-2.jpg",
         "width": 2502,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101934-崔丽峰-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)02班/轨迹图/18101934-崔丽峰-1.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -3439,11 +3439,11 @@
   [
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101911-刘英明-1.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101911-刘英明-1.jpg",
         "width": 2502,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101911-刘英明-0.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101911-刘英明-0.jpg",
       "drawTrackList": [
         {
           "type": "text",
@@ -3744,11 +3744,11 @@
     },
     {
       "imgItem": {
-        "url": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101911-刘英明-2.jpg",
+        "url": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/原图/18101911-刘英明-2.jpg",
         "width": 2500,
         "height": 1764
       },
-      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101911-刘英明-1.jpg",
+      "outpath": "/Users/chulin/workFiles/teach-mark-tool/test-local/2021~2022第一学期/上学期/模式1-条码印刷/电力电子与电力传动(0100)/bh070404/18电气工程及其自动化(电力工程造价与管理方向)01班/轨迹图/18101911-刘英明-1.jpg",
       "drawTrackList": [
         {
           "type": "text",