From b14d2cb058f498b9325b45f9f6ec9eaa93f38b69 Mon Sep 17 00:00:00 2001 From: zhl Date: Thu, 6 Apr 2023 18:53:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=9A=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1API=E7=9A=84=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E9=98=9F=E5=88=97=E5=92=8CXML=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=99=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加fast-xml-parser并删除xml-js的依赖关系 - 重构TaskQueue并将ChainQueue重命名为TaskQueue - 改进错误日志记录并添加parseOneTask中缺少applyer对象的错误处理 - 修改parseWxApprovalInfo方法以接受starter参数并将starter属性添加到ChainTaskClass中 - 使用TaskStatus.PASS来检查批准是否通过,并在XML中找到SpNo后将任务添加到队列中。 --- package.json | 4 +-- src/controllers/workflow.controller.ts | 16 +++++++++--- src/models/ChainTask.ts | 6 +++-- src/queue/task.queue.ts | 5 +--- src/service/wechatwork.service.ts | 5 ++-- yarn.lock | 35 ++------------------------ 6 files changed, 25 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 41e1347..53e1426 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "dotenv": "^16.0.3", "ethereumjs-util": "^7.1.5", "fast-rbac": "^1.3.0", + "fast-xml-parser": "^4.1.3", "fastify": "^3.9.2", "fastify-cors": "^5.1.0", "fastify-file-upload": "^3.0.0", @@ -44,8 +45,7 @@ "node-xlsx": "^0.21.0", "redis": "^3.1.2", "tracer": "^1.1.6", - "web3": "^1.7.4", - "xml-js": "^1.6.11" + "web3": "^1.7.4" }, "devDependencies": { "@types/dotenv": "^8.2.0", diff --git a/src/controllers/workflow.controller.ts b/src/controllers/workflow.controller.ts index 8c8f97e..bb91dd5 100644 --- a/src/controllers/workflow.controller.ts +++ b/src/controllers/workflow.controller.ts @@ -3,7 +3,9 @@ import { ZError } from 'common/ZError' import { role, router } from 'decorators/router' import { getSignature, decrypt } from '@wecom/crypto' import { excelToJson } from 'utils/excel.util' -var convert = require('xml-js') +import { XMLParser } from 'fast-xml-parser' +import { TaskQueue } from 'queue/task.queue' +import { TaskStatus } from 'service/wechatwork.service' class WorkFlowController extends BaseController { @role('anon') @@ -32,8 +34,16 @@ class WorkFlowController extends BaseController { } const { message, id } = decrypt(aesKey, xml.Encrypt) console.log(message) - const jsonData = convert.xml2json(message, {}) - console.log(jsonData) + let parser = new XMLParser() + let jsonData = parser.parse(message) + let spStatus = jsonData.xml?.ApprovalInfo?.SpStatus + if (spStatus === TaskStatus.PASS) { + let spNo = jsonData.xml?.ApprovalInfo?.SpNo + if (spNo) { + new TaskQueue().addTaskToQueue(spNo) + } + } + res.send('success') } diff --git a/src/models/ChainTask.ts b/src/models/ChainTask.ts index 298b333..f506458 100644 --- a/src/models/ChainTask.ts +++ b/src/models/ChainTask.ts @@ -24,6 +24,8 @@ export class ChainTaskClass extends BaseModule { public name: string @prop() public desc: string + @prop() + public starter: string @prop({ type: mongoose.Schema.Types.Mixed }) public taskData: any @@ -103,9 +105,9 @@ export class ChainTaskClass extends BaseModule { /** * 解析企业微信审批信息 */ - public static async parseWxApprovalInfo({ taskId, name, desc, data }) { + public static async parseWxApprovalInfo({ taskId, name, desc, data, starter }) { let maxTryCount = parseInt(process.env.CHAIN_MAX_TRY) - let chainTask = await ChainTask.insertOrUpdate({ taskId }, { name, desc, data }) + let chainTask = await ChainTask.insertOrUpdate({ taskId }, { name, desc, starter, data }) let subTasks: any = [] if (chainTask.newRecord) { for (let sub of data) { diff --git a/src/queue/task.queue.ts b/src/queue/task.queue.ts index e1840ae..1bb6d40 100644 --- a/src/queue/task.queue.ts +++ b/src/queue/task.queue.ts @@ -1,14 +1,11 @@ import { AsyncQueue, createAsyncQueue } from 'common/AsyncQueue' import { singleton } from 'decorators/singleton' -import { DocumentType } from '@typegoose/typegoose' -import { ReqTaskStatus, RequestTaskClass } from 'models/RequestTask' import { BlockChain } from 'chain/BlockChain' -import { ChainTask } from 'models/ChainTask' import logger from 'logger/logger' import { TaskSvr } from 'service/task.service' @singleton -export class ChainQueue { +export class TaskQueue { private queue: AsyncQueue private blockChain: BlockChain diff --git a/src/service/wechatwork.service.ts b/src/service/wechatwork.service.ts index cce3dfd..4514cab 100644 --- a/src/service/wechatwork.service.ts +++ b/src/service/wechatwork.service.ts @@ -101,11 +101,12 @@ export class WechatWorkService { if (info.status !== TaskStatus.PASS) { throw new Error('approval status error, status: ' + info.status) } - const { apply_data } = info + const { apply_data, applyer } = info const { contents } = apply_data let name = '' let desc = '' let fileId = '' + let starter = applyer.userid for (let content of contents) { let { control, value, title } = content if (control === 'Text' && title.text == '名字') { @@ -121,7 +122,7 @@ export class WechatWorkService { } let filePath = await this.fetchFile(fileId) let data = excelToJson(filePath) - return { taskId: spNo, name, desc, data } + return { taskId: spNo, name, desc, data, starter } } /** diff --git a/yarn.lock b/yarn.lock index f8e0e9d..cec222a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2024,7 +2024,7 @@ fast-safe-stringify@^2.0.8: resolved "https://registry.npmmirror.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== -fast-xml-parser@^4.1.2: +fast-xml-parser@^4.1.2, fast-xml-parser@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.3.tgz#0254ad0d4d27f07e6b48254b068c0c137488dd97" integrity sha512-LsNDahCiCcJPe8NO7HijcnukHB24tKbfDDA5IILx9dmW3Frb52lhbeX6MPNUSvyGNfav2VTYpJ/OqkRoVLrh2Q== @@ -3952,11 +3952,6 @@ saslprep@^1.0.0: dependencies: sparse-bitfield "^3.0.3" -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - scrypt-js@^3.0.0, scrypt-js@^3.0.1: version "3.0.1" resolved "https://registry.npmmirror.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" @@ -4422,26 +4417,7 @@ ts-node-dev@^2.0.0: ts-node "^10.4.0" tsconfig "^7.0.0" -ts-node@^10.4.0: - version "10.9.1" - resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -ts-node@^10.9.1: +ts-node@^10.4.0, ts-node@^10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -5054,13 +5030,6 @@ xlsx@^0.17.4: wmf "~1.0.1" word "~0.3.0" -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - xtend@^4.0.0, xtend@^4.0.2: version "4.0.2" resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"