默认消息模板增加换行-待测试

This commit is contained in:
yml
2026-04-14 23:02:45 +08:00
parent 52c190c575
commit 24d5f233d9
4 changed files with 47 additions and 10 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"defaults": { "defaults": {
"messageTemplate": "您的订单 {platformOrderId} 已创建领取链接,请您复制链接到 浏览器 自动兑换, 请尽快打开并完成领取:\\n\\n{claimUrl}", "messageTemplate": "您的订单 {platformOrderId} 已创建领取链接,请您复制链接到浏览器自动兑换请尽快打开并完成领取:\n\n{claimUrl}",
"autoDeliveryMessageTemplate": "亲亲,您购买的兑换码已自行兑换成功,请在游戏中邮件领取,感谢您的支持" "autoDeliveryMessageTemplate": "亲亲,您购买的兑换码已自行兑换成功,请在游戏中邮件领取,感谢您的支持"
}, },
"shops": { "shops": {
@@ -9,6 +9,7 @@ import {
saveAgisoMessagingConfig, saveAgisoMessagingConfig,
} from '../platforms/agiso/shop-config-service.js' } from '../platforms/agiso/shop-config-service.js'
import { enrichAgisoXianyuTradeOrder } from '../platforms/agiso/xianyu/order-detail-service.js' import { enrichAgisoXianyuTradeOrder } from '../platforms/agiso/xianyu/order-detail-service.js'
import { normalizeAgisoMessageTemplate } from '../platforms/agiso/xianyu/message-service.js'
import { import {
getOrderFulfillmentBindingConfigs, getOrderFulfillmentBindingConfigs,
getOrderFulfillmentBindingsFilePath, getOrderFulfillmentBindingsFilePath,
@@ -141,8 +142,8 @@ export function updateAdminAgisoShopConfigs(payload = /** @type {AdminAgisoShopC
function mapAdminAgisoMessagingDefaults(defaults = {}) { function mapAdminAgisoMessagingDefaults(defaults = {}) {
return { return {
messageTemplate: String(defaults.messageTemplate || '').trim(), messageTemplate: normalizeAgisoMessageTemplate(String(defaults.messageTemplate || '').trim()),
autoDeliveryMessageTemplate: String(defaults.autoDeliveryMessageTemplate || '').trim(), autoDeliveryMessageTemplate: normalizeAgisoMessageTemplate(String(defaults.autoDeliveryMessageTemplate || '').trim()),
} }
} }
@@ -153,8 +154,8 @@ function mapAdminAgisoShopConfigItem(shopId, config = {}) {
accessToken: String(config.accessToken || '').trim(), accessToken: String(config.accessToken || '').trim(),
accessTokenMasked: maskSecret(config.accessToken), accessTokenMasked: maskSecret(config.accessToken),
enabled: typeof config.enabled === 'boolean' ? config.enabled : null, enabled: typeof config.enabled === 'boolean' ? config.enabled : null,
messageTemplate: String(config.messageTemplate || '').trim(), messageTemplate: normalizeAgisoMessageTemplate(String(config.messageTemplate || '').trim()),
autoDeliveryMessageTemplate: String(config.autoDeliveryMessageTemplate || '').trim(), autoDeliveryMessageTemplate: normalizeAgisoMessageTemplate(String(config.autoDeliveryMessageTemplate || '').trim()),
appSecretConfigured: Boolean(String(config.appSecret || '').trim()), appSecretConfigured: Boolean(String(config.appSecret || '').trim()),
apiVersion: String(config.apiVersion || '').trim(), apiVersion: String(config.apiVersion || '').trim(),
sendMessageEndpoint: String(config.sendMessageEndpoint || '').trim(), sendMessageEndpoint: String(config.sendMessageEndpoint || '').trim(),
@@ -168,7 +169,7 @@ function applyOptionalStringField(target, key, source) {
const value = String(source[key] || '').trim() const value = String(source[key] || '').trim()
if (value) { if (value) {
target[key] = value target[key] = normalizeAgisoMessageTemplate(value)
return return
} }
@@ -49,6 +49,13 @@ export async function ensureAgisoXianyuAutoDeliveryMessageDeliveredForTask({ ord
}) })
} }
export function normalizeAgisoMessageTemplate(value) {
return String(value || '')
.replaceAll('\\r\\n', '\n')
.replaceAll('\\n', '\n')
.replaceAll('\r\n', '\n')
}
async function deliverAgisoXianyuMessageForTask({ async function deliverAgisoXianyuMessageForTask({
order, order,
task, task,
@@ -241,7 +248,8 @@ function generateSign(params, appSecret) {
} }
function renderAgisoClaimMessage({ order, task, claimUrl, expiredAt, template, shopName = '' }) { function renderAgisoClaimMessage({ order, task, claimUrl, expiredAt, template, shopName = '' }) {
const source = String(template || '').trim() || '您的订单 {platformOrderId} 已创建领取链接,请在 {expiredAt} 前完成领取:{claimUrl}' const source = normalizeAgisoMessageTemplate(String(template || '').trim())
|| '您的订单 {platformOrderId} 已创建领取链接,请在 {expiredAt} 前完成领取:{claimUrl}'
return renderAgisoMessageTemplate({ return renderAgisoMessageTemplate({
order, order,
@@ -254,7 +262,8 @@ function renderAgisoClaimMessage({ order, task, claimUrl, expiredAt, template, s
} }
export function renderAgisoAutoDeliveryMessage({ order, task, template, shopName = '' }) { export function renderAgisoAutoDeliveryMessage({ order, task, template, shopName = '' }) {
const source = String(template || '').trim() || '您的订单 {platformOrderId} 已完成自动发货,请注意查收。' const source = normalizeAgisoMessageTemplate(String(template || '').trim())
|| '您的订单 {platformOrderId} 已完成自动发货,请注意查收。'
return renderAgisoMessageTemplate({ return renderAgisoMessageTemplate({
order, order,
@@ -276,7 +285,7 @@ function renderAgisoMessageTemplate({
} = {}) { } = {}) {
const resolvedShopName = String(shopName || order?.shop_name || order?.shop_id || '').trim() const resolvedShopName = String(shopName || order?.shop_name || order?.shop_id || '').trim()
return String(template || '') return normalizeAgisoMessageTemplate(template)
.replaceAll('{platformOrderId}', String(order?.platform_order_id || '')) .replaceAll('{platformOrderId}', String(order?.platform_order_id || ''))
.replaceAll('{taskNo}', String(task?.task_no || '')) .replaceAll('{taskNo}', String(task?.task_no || ''))
.replaceAll('{shopName}', resolvedShopName) .replaceAll('{shopName}', resolvedShopName)
@@ -2,7 +2,11 @@ import test from 'node:test'
import assert from 'node:assert/strict' import assert from 'node:assert/strict'
import { runtimeConfig } from '../../../../config/runtime.js' import { runtimeConfig } from '../../../../config/runtime.js'
import { deliverAgisoXianyuMessageForTaskWithDeps } from './message-service.js' import {
deliverAgisoXianyuMessageForTaskWithDeps,
normalizeAgisoMessageTemplate,
renderAgisoAutoDeliveryMessage,
} from './message-service.js'
test('deliverAgisoXianyuMessageForTaskWithDeps skips duplicate successful claim message by order scope', async () => { test('deliverAgisoXianyuMessageForTaskWithDeps skips duplicate successful claim message by order scope', async () => {
const originalMessaging = runtimeConfig.platforms.agiso.messaging const originalMessaging = runtimeConfig.platforms.agiso.messaging
@@ -74,3 +78,26 @@ test('deliverAgisoXianyuMessageForTaskWithDeps skips duplicate successful claim
runtimeConfig.platforms.agiso.appSecret = originalAppSecret runtimeConfig.platforms.agiso.appSecret = originalAppSecret
} }
}) })
test('normalizeAgisoMessageTemplate converts escaped newline sequences into real line breaks', () => {
assert.equal(
normalizeAgisoMessageTemplate('第一行\\n第二行\\r\\n第三行'),
'第一行\n第二行\n第三行',
)
})
test('renderAgisoAutoDeliveryMessage supports escaped newlines in configured template', () => {
const message = renderAgisoAutoDeliveryMessage({
order: {
platform_order_id: '4502280133178028841',
shop_id: '2209880145223',
shop_name: '大锤号商',
},
task: {
task_no: 'DT7af76e9b2438',
},
template: '订单 {platformOrderId}\\n结果:{resultMessage}',
})
assert.equal(message, '订单 4502280133178028841\n结果:自动发货成功')
})