v3.5.11企业微信通知调整
CI / verify (pull_request) Waiting to run

This commit is contained in:
2026-08-26 09:55:19 +08:00
parent 632539e8dc
commit 3afbdfe6b9
17 changed files with 775 additions and 83 deletions
@@ -7,7 +7,9 @@ import {
WECOM_PUSH_DEFAULT_BIZ_TODO_CONDITIONS,
WECOM_PUSH_DEFAULT_DEAL_BROADCAST_CONDITIONS,
WECOM_PUSH_DEFAULT_DEV_DISPATCH_CONDITIONS,
WECOM_PUSH_DEFAULT_SETTLEMENT_CONDITIONS,
WECOM_PUSH_DEFAULT_STORE_AUDIT_CONDITIONS,
WECOM_SETTLEMENT_PUSH_NAME,
WECOM_STORE_AUDIT_PLACEHOLDER_WEBHOOK,
WECOM_STORE_AUDIT_PUSH_NAME,
WECOM_TEMPLATE_EVENT_KEYS,
@@ -22,6 +24,7 @@ import { PrismaService } from '../../common/prisma/prisma.module';
import { applyWecomAtMentionInContent } from '../../modules/dev-plan/dev-plan-wecom-mention.util';
import {
WECOM_PUSH_TEMPLATE_DEFAULTS,
WECOM_PUSH_TEMPLATE_LEGACY_BODIES,
buildHqHandleUrl,
getDefaultTemplate,
renderWecomTemplate,
@@ -66,7 +69,7 @@ export class WecomMessagePushService implements OnModuleInit {
}
}
/** 表空时从 .env / 旧设置迁移;并确保门店审核 / 业务待办 / 成交播报 / 模板缺行 */
/** 表空时从 .env / 旧设置迁移;并确保门店审核 / 业务待办 / 成交播报 / 结算通知 / 模板缺行 */
async ensureDefaults(): Promise<void> {
const count = await this.prisma.wecomMessagePush.count();
if (count === 0) {
@@ -141,6 +144,12 @@ export class WecomMessagePushService implements OnModuleInit {
30,
process.env.WECOM_DEAL_BROADCAST_WEBHOOK_URL,
);
await this.ensureNamedPush(
WECOM_SETTLEMENT_PUSH_NAME,
WECOM_PUSH_DEFAULT_SETTLEMENT_CONDITIONS,
35,
process.env.WECOM_SETTLEMENT_WEBHOOK_URL,
);
await this.ensureTemplates();
}
@@ -181,22 +190,36 @@ export class WecomMessagePushService implements OnModuleInit {
this.logger.log(`seeded wecom message push: ${name} (placeholder, disabled)`);
}
/** 插入缺失 eventKey,不覆盖已有文案 */
/** 插入缺失 eventKey;仅当 body 仍为上一版默认文案时升级,不覆盖 HQ 手改 */
async ensureTemplates(): Promise<void> {
for (const def of WECOM_PUSH_TEMPLATE_DEFAULTS) {
const existing = await this.prisma.wecomPushTemplate.findUnique({
where: { eventKey: def.eventKey },
});
if (existing) continue;
await this.prisma.wecomPushTemplate.create({
data: {
eventKey: def.eventKey,
title: def.title,
body: def.body,
handleLabel: def.handleLabel,
},
});
this.logger.log(`seeded wecom push template: ${def.eventKey}`);
if (!existing) {
await this.prisma.wecomPushTemplate.create({
data: {
eventKey: def.eventKey,
title: def.title,
body: def.body,
handleLabel: def.handleLabel,
},
});
this.logger.log(`seeded wecom push template: ${def.eventKey}`);
continue;
}
const legacy = WECOM_PUSH_TEMPLATE_LEGACY_BODIES[def.eventKey];
if (legacy && existing.body === legacy) {
await this.prisma.wecomPushTemplate.update({
where: { eventKey: def.eventKey },
data: {
title: def.title,
body: def.body,
handleLabel: def.handleLabel,
},
});
this.logger.log(`upgraded wecom push template from legacy default: ${def.eventKey}`);
}
}
}
@@ -447,7 +470,9 @@ export class WecomMessagePushService implements OnModuleInit {
orderNo: 'DK202608200001',
payAmount: '199.00',
cityName: '郑州',
skuSummary: '杜康原浆 ×2',
skuSummary: '杜康原浆 52度 瓶×2',
deliveryLabel: '同城',
receiverInfo: '张三 13800008000 河南省郑州市金水区示例路1号',
phoneMasked: '138****8000',
},
handlePath: '/orders?orderNo=DK202608200001',
@@ -458,6 +483,8 @@ export class WecomMessagePushService implements OnModuleInit {
amount: '88.00',
storeName: '示例门店',
channel: '扫码',
userName: '好客用户',
userPhone: '138****8000',
},
handlePath: '/redeem-records?redeemNo=RD202608200001',
},
@@ -465,7 +492,8 @@ export class WecomMessagePushService implements OnModuleInit {
vars: {
storeName: '示例门店',
cityName: '郑州',
partnerLabel: '示例合伙人',
submitter: '郑州某某商贸 · 张三',
partnerLabel: '郑州某某商贸 · 张三',
action: '新建',
storeId: '1',
},
@@ -475,7 +503,7 @@ export class WecomMessagePushService implements OnModuleInit {
vars: {
storeName: '示例门店',
cityName: '郑州',
submitter: '合伙人',
submitter: '郑州某某商贸 · 张三',
packageCount: '3',
requestId: '1',
},
@@ -485,7 +513,7 @@ export class WecomMessagePushService implements OnModuleInit {
vars: {
storeName: '示例门店',
cityName: '郑州',
submitter: '门店',
submitter: '门店 · 李四',
changedFields: '门店名称、详细地址',
requestId: '1',
},
@@ -501,6 +529,16 @@ export class WecomMessagePushService implements OnModuleInit {
},
handlePath: '/finance/store-bills?kind=WITHDRAW&status=PENDING_REVIEW&storeId=1',
},
'store.withdraw_approved': {
vars: {
storeName: '示例门店',
withdrawNo: 'SW202608200001',
amount: '500.00',
bankAccount: '张三 / 郑州支行 / 6222000011112222',
storeId: '1',
},
handlePath: '/finance/store-bills?kind=WITHDRAW&status=PAID&storeId=1',
},
'invoice.pending': {
vars: {
invoiceNo: 'IV202608200001',
@@ -511,6 +549,39 @@ export class WecomMessagePushService implements OnModuleInit {
},
handlePath: '/invoices?status=PENDING&invoiceNo=IV202608200001',
},
'finance.store_bill': {
vars: {
period: '2026-08-25',
billCount: '2',
billSummary: '示例门店 ¥300.00 张三 / 郑州支行 / 6222000011112222',
},
handlePath: '/finance/store-bills?kind=T1_BILL',
},
'finance.partner_bill': {
vars: {
period: '2026-07',
billCount: '1',
billSummary: '郑州某某商贸 ¥120.00 张三 / 郑州支行 / 6222000011112222',
},
handlePath: '/finance/partner-bills',
},
'finance.winery_bill': {
vars: {
period: '2026-08-23',
amount: '1990.00',
orderCount: '8',
bankAccount: '杜康酒厂 / 洛阳支行 / 6222000099998888',
},
handlePath: '/finance/winery-bills',
},
'finance.logistics_bill': {
vars: {
period: '2026-07',
billCount: '1',
billSummary: '小飞侠 ¥86.00 承运商 / 郑州支行 / 6222000033334444',
},
handlePath: '/finance/logistics-bills',
},
};
return samples[eventKey];
}