增加excel导入时的审核

This commit is contained in:
zhl 2021-06-17 18:01:40 +08:00
parent 502253c369
commit 2915c6301c
6 changed files with 135 additions and 6 deletions

View File

@ -46,6 +46,7 @@
"node-html-to-image": "^3.1.0",
"qrcode": "^1.4.4",
"querystring": "^0.2.1",
"queue": "^6.0.2",
"redis": "^3.1.2",
"reflect-metadata": "^0.1.13",
"svg-captcha": "^1.4.0",

View File

@ -2,6 +2,8 @@ import BaseController from '../../common/base.controller'
import { permission, router } from '../../decorators/router'
import { ShopPuzzle } from '../../models/shop/ShopPuzzle'
import { ZError } from '../../common/ZError'
import { AuditTask } from '../../models/AuditTask'
import { AuditSvr } from '../../services/AuditSvr'
export default class ShopPuzzleController extends BaseController {
@permission('shoppuzzle:read')
@ -111,7 +113,8 @@ export default class ShopPuzzleController extends BaseController {
delete data.status
}
let result: any = {}
const initStatus = { status: 1, deleted: 0, is_hide: 0, quality: 1 }
const batchTag = Date.now()
const initStatus = { status: 0, deleted: 0, is_hide: 0, quality: 1, batchTag }
try {
datas.map(data => Object.assign(data, initStatus))
let results = await ShopPuzzle.bulkWrite(
@ -127,6 +130,10 @@ export default class ShopPuzzleController extends BaseController {
result.insert = results.upsertedCount + results.insertedCount
result.update = results.modifiedCount
result.skip = 0
let records = await ShopPuzzle.find({ batchTag })
let ids = records.map(data => data._id + '')
let id = await AuditTask.addOneTask('shop_puzzle', ids)
new AuditSvr().addTask(id)
} catch (err) {
console.log(err)
result.insert = err.upsertedCount + err.insertedCount

36
src/models/AuditTask.ts Normal file
View File

@ -0,0 +1,36 @@
import { dbconn } from '../decorators/dbconn'
import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose'
import { Severity } from '@typegoose/typegoose/lib/internal/constants'
import { BaseModule } from './Base'
@dbconn()
@index({ status: 1 }, { unique: false })
@modelOptions({
schemaOptions: { collection: 'audit_task', timestamps: true },
options: { allowMixed: Severity.ALLOW },
})
export class AuditTaskClass extends BaseModule {
@prop()
public tableName: string
@prop({ type: () => [String] })
public ids: string[]
@prop({ default: 0 })
public status: number
@prop({ default: 0 })
public processNum: number
@prop({ default: 0 })
public failNum: number
public static async addOneTask(tableName: string, datas: string[]) {
let record = new AuditTask({})
record.tableName = tableName
record.ids = datas
await record.save()
return record._id
}
}
export const AuditTask = getModelForClass(AuditTaskClass, { existingConnection: AuditTaskClass.db })

View File

@ -1,11 +1,10 @@
import { dbconn } from '../../decorators/dbconn'
import { getModelForClass, index, modelOptions, prop, ReturnModelType } from '@typegoose/typegoose'
import { getModelForClass, index, modelOptions, mongoose, prop, ReturnModelType } from '@typegoose/typegoose'
import { BaseModule } from '../Base'
import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'
import { checkJson, noJson } from '../../decorators/nojson'
import { Puzzle, PuzzleClass } from '../content/Puzzle'
import { QCategoryCache } from '../../services/QCategoryCache'
import { CompactPuzzleClass } from '../match/PuzzleSession'
import { Severity } from '@typegoose/typegoose/lib/internal/constants'
const jsonExcludeKeys = ['updatedAt', '__v']
@ -20,7 +19,10 @@ export interface ShopPuzzleClass extends Base, TimeStamps {}
@index({ shop: 1, question: 1 }, { unique: true })
@index({ groups: 1 }, { unique: false })
@index({ shop: 1, tag: 1, sub_tag: 1 }, { unique: false })
@modelOptions({ schemaOptions: { collection: 'shop_puzzle', timestamps: true } })
@modelOptions({
schemaOptions: { collection: 'shop_puzzle', timestamps: true },
options: { allowMixed: Severity.ALLOW },
})
export class ShopPuzzleClass extends BaseModule {
@prop()
public shop: string
@ -68,6 +70,9 @@ export class ShopPuzzleClass extends BaseModule {
@prop({ type: () => [String] })
public groups: string[]
@prop()
public batchTag: number
/**
*
* @type {boolean}
@ -87,8 +92,11 @@ export class ShopPuzzleClass extends BaseModule {
@prop({ default: 0 })
public status: number
@prop({ type: mongoose.Schema.Types.Mixed })
public auditResult: {}
public static parseQueryParam(params) {
let { key, timeBegin, timeEnd, tag, sub_tag, groups, dp, quality, sort, length, shop } = params
let { key, timeBegin, timeEnd, tag, sub_tag, groups, dp, quality, sort, length, shop, status } = params
let opt: any = { deleted: 0, is_hide: 0 }
if (key) {
opt.question = { $regex: key, $options: 'i' }
@ -125,6 +133,9 @@ export class ShopPuzzleClass extends BaseModule {
if (length) {
opt.length = { $gte: length }
}
if (status !== undefined && status !== 9) {
opt.status = status
}
let sortObj = { _id: 1 }
if (sort) {
sortObj = sort

67
src/services/AuditSvr.ts Normal file
View File

@ -0,0 +1,67 @@
import axios, { AxiosRequestConfig } from 'axios'
import { singleton } from '../decorators/singleton'
import Queue from 'queue'
import { AuditTask } from '../models/AuditTask'
import { ShopPuzzle } from '../models/shop/ShopPuzzle'
export async function auditTxt(txt: string) {
let data = { content: txt }
const url = 'http://127.0.0.1:8019/check_all'
let reqConfig: AxiosRequestConfig = {
method: 'post',
url,
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/json',
},
data,
}
return axios(reqConfig)
}
@singleton
export class AuditSvr {
private q
constructor() {
this.q = new Queue({ concurrency: 1, autostart: true })
}
addTask(taskId: string) {
this.q.push(async function (cb) {
let taskRecord = await AuditTask.findById(taskId)
if (!taskRecord) {
cb()
return
}
let failCount = 0
let processNum = 0
let riskNum = 0
for (let id of taskRecord.ids) {
let record = await ShopPuzzle.findById(id)
if (record.status === 1) {
continue
}
processNum++
let txt = `${record.question},${record.a1},${record.a2},${record.a3},${record.a4}`
let { data } = await auditTxt(txt)
record.auditResult = data
if (data.errcode) {
failCount++
} else {
if (data.wx || data.bd || data.local) {
record.status = -1
riskNum++
} else {
record.status = 1
}
}
await record.save()
}
taskRecord.processNum = processNum
taskRecord.failNum = failCount
await taskRecord.save()
console.log(`audit task finished: ${taskId}, found ${riskNum} risk`)
cb()
})
}
}

View File

@ -2648,6 +2648,13 @@ queue-microtask@^1.1.2, queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
queue@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65"
integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==
dependencies:
inherits "~2.0.3"
quick-format-unescaped@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.3.tgz#6d6b66b8207aa2b35eef12be1421bb24c428f652"