重构:重构企业微信API的任务队列和XML解析器。

- 添加fast-xml-parser并删除xml-js的依赖关系
- 重构TaskQueue并将ChainQueue重命名为TaskQueue
- 改进错误日志记录并添加parseOneTask中缺少applyer对象的错误处理
- 修改parseWxApprovalInfo方法以接受starter参数并将starter属性添加到ChainTaskClass中
- 使用TaskStatus.PASS来检查批准是否通过,并在XML中找到SpNo后将任务添加到队列中。
This commit is contained in:
zhl 2023-04-06 18:53:29 +08:00
parent ab782820fe
commit b14d2cb058
6 changed files with 25 additions and 46 deletions

View File

@ -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",

View File

@ -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')
}

View File

@ -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) {

View File

@ -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

View File

@ -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 }
}
/**

View File

@ -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"