From fe0eace04661f8de6fa89783b3dcef72279adfde Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Tue, 15 Aug 2023 14:49:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E6=8A=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- pm2_release.sh | 1 + src/modules/ReportQueue.ts | 6 ++- src/reqport.queue.ts | 16 ++++++++ src/schedule/googlepurchase.schedule.ts | 2 +- src/schedule/payreport.schedule.ts | 50 +++++++++++++++++++++++++ 6 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 src/reqport.queue.ts create mode 100644 src/schedule/payreport.schedule.ts diff --git a/package.json b/package.json index a8a0e00..361afd4 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,11 @@ "main": "index.js", "scripts": { "dev:api": "ts-node -r tsconfig-paths/register src/api.ts", + "prod:api": "NODE_ENV=production NODE_PATH=./dist node dist/api.js", "test": "ts-node -r tsconfig-paths/register src/test.ts", "dev:monitor": "ts-node -r tsconfig-paths/register src/google.monitor.ts", + "prod:monitor": "NODE_ENV=production NODE_PATH=./dist node dist/google.monitor.js", "build": "tsc", - "prod:api": "NODE_ENV=production NODE_PATH=./dist node dist/api.js", "lint": "eslint --ext .ts src/**", "format": "eslint --ext .ts src/** --fix" }, diff --git a/pm2_release.sh b/pm2_release.sh index 0caa810..608e1f3 100755 --- a/pm2_release.sh +++ b/pm2_release.sh @@ -1 +1,2 @@ pm2 start npm --name "pay-svr-release" --log-date-format "YYYY-MM-DD HH:mm:ss" -- run "prod:api" +# pm2 start npm --name "google-monitor-release" --log-date-format "YYYY-MM-DD HH:mm:ss" -- run "prod:monitor" diff --git a/src/modules/ReportQueue.ts b/src/modules/ReportQueue.ts index 88c6c56..19a0c23 100644 --- a/src/modules/ReportQueue.ts +++ b/src/modules/ReportQueue.ts @@ -18,7 +18,7 @@ export class ReportQueueClass extends BaseModule { // 渠道: alchemy, google, apple @prop() public channel: string - // 本地记录id + // 渠道返回的订单id @prop() public recordId: string // 游戏服订单id @@ -61,6 +61,10 @@ export class ReportQueueClass extends BaseModule { txhash: this.txhash || '', } } + + public static async findUnfinishedRecords(this: ReturnModelType) { + return this.find({ reportStatus: 0 }).exec() + } } export const ReportQueue = getModelForClass(ReportQueueClass, { existingConnection: ReportQueueClass.db }) diff --git a/src/reqport.queue.ts b/src/reqport.queue.ts new file mode 100644 index 0000000..512b13d --- /dev/null +++ b/src/reqport.queue.ts @@ -0,0 +1,16 @@ +import * as dotenv from 'dotenv' +import logger from 'logger/logger' +const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' +dotenv.config({ path: envFile }) + +import 'common/Extend' +import PayReportSchedule from 'schedule/payreport.schedule' + +async function main() { + setInterval(function () { + new PayReportSchedule().parseAllRecord() + }, 60 * 60 * 1000) + new PayReportSchedule().parseAllRecord() +} + +main() diff --git a/src/schedule/googlepurchase.schedule.ts b/src/schedule/googlepurchase.schedule.ts index 2cb4f06..3468fc3 100644 --- a/src/schedule/googlepurchase.schedule.ts +++ b/src/schedule/googlepurchase.schedule.ts @@ -6,7 +6,7 @@ import { RedisClient } from 'redis/RedisClient' import { GooglePaySvr } from 'service/googlepay.svr' /** - * 定时更新发送邮件验证码的过期状态 + * 定时查询 google voided purchase * * * * * * * ┬ ┬ ┬ ┬ ┬ ┬ diff --git a/src/schedule/payreport.schedule.ts b/src/schedule/payreport.schedule.ts new file mode 100644 index 0000000..12bbbd9 --- /dev/null +++ b/src/schedule/payreport.schedule.ts @@ -0,0 +1,50 @@ +import { singleton } from 'decorators/singleton' +import logger from 'logger/logger' +import { ReportQueue } from 'modules/ReportQueue' +import * as schedule from 'node-schedule' +import { reportApplePurchaseResult, reportGooglePurchaseResult } from 'service/game.svr' + +/** + * 定时查询加密货币购买和内购上报失败的记录, 并重试 + * + * * * * * * + ┬ ┬ ┬ ┬ ┬ ┬ + │ │ │ │ │ │ + │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun) + │ │ │ │ └───── month (1 - 12) + │ │ │ └────────── day of month (1 - 31) + │ │ └─────────────── hour (0 - 23) + │ └──────────────────── minute (0 - 59) + └───────────────────────── second (0 - 59, OPTIONAL) + */ +@singleton +export default class PayReportSchedule { + async parseAllRecord() { + try { + let records = await ReportQueue.findUnfinishedRecords() + for (let record of records) { + logger.info(`parse record: ${record.id}, channel: ${record.channel}`) + switch (record.channel) { + case 'google': + await reportGooglePurchaseResult([record.toInAppData()]) + break + case 'apple': + await reportApplePurchaseResult([record.toInAppData()]) + break + case 'alchemy': + break + default: + break + } + } + } catch (err) { + logger.info('error query unfinished report records', err.message || err) + } + } + scheduleAll() { + const job = schedule.scheduleJob('1 * * * *', async () => { + await this.parseAllRecord() + }) + this.parseAllRecord() + } +}