快手发码数据接入发单平台工单侧

- 新增 sync-work-orders-from-send-code 服务:91 先到则回填 shopId/补建工单/凭证回填 material_json;91 未到则兜底建单建工单
- order-service 与 ninetyone order-service 改用 findLatestOrderByPlatformOrderId,放宽 shopId 查重避免重复建单
- work-order-repo 新增 listWorkOrdersByPlatformOrderId 供兜底查重
- send-code-service 挂接同步逻辑并吞错,不影响发码主流程
- ProductRulesPanel 新增店铺列
- .gitignore 忽略 send_code/ 与 .reasonix/
This commit is contained in:
yml2213
2026-08-05 11:22:24 +08:00
parent 1dd92ec10c
commit 4bd2c174c5
7 changed files with 391 additions and 11 deletions
@@ -10,8 +10,9 @@ import {
} from '../../../repositories/kuaishou-industry-voucher-repo.js'
import { OPEN_91_PLATFORM, OPEN_91_PROVIDER } from '../../open-91/config.js'
import { retryOpen91Order } from '../ninetyone/order-service.js'
import { syncWorkOrdersFromKuaishouSendCode } from '../../worker-platform/sync-work-orders-from-send-code.js'
import { normalizeTimestampIso } from '../../../utils/time.js'
import { logIntegration } from '../../../utils/logger.js'
import { logWarn, logIntegration } from '../../../utils/logger.js'
import {
getKuaishouIndustryConfig,
assertMatchingAppKey,
@@ -119,6 +120,24 @@ export async function handleSendCode(rawBody: JsonObject = {}) {
})
}
await syncWorkOrdersFromKuaishouSendCode({
oid: normalizedOid,
sellerId: params.sellerId,
itemId: params.itemId,
itemTitle: params.itemTitle,
skuId: params.skuId,
num: params.num,
paymentFen: resolveSendCodePaymentFen(params.ext),
rawParams: params,
vouchers,
now,
}).catch((error) => {
logWarn('[kuaishou-industry/send-code]', '发单平台工单同步失败,不影响发码主流程', {
oid: normalizedOid,
error: error instanceof Error ? error.message : String(error),
})
})
scheduleKuaishouIndustrySendCallbackRetry(normalizedOid, SEND_CALLBACK_INITIAL_DELAY_MS, {
source: 'send_code_accepted',
})
@@ -671,6 +690,17 @@ function normalizePositiveInteger(value: unknown): number {
return Number.isFinite(parsed) && parsed > 0 ? Math.trunc(parsed) : 0
}
function resolveSendCodePaymentFen(ext: unknown): number {
const parsed = parseJsonObject(ext)
return normalizePositiveInteger(
parsed.payment
?? parsed.totalGoodsValue
?? parsed.goodsValue
?? parsed.payAmount
?? parsed.amount,
)
}
function parseJsonObject(value: unknown): JsonObject {
if (value && typeof value === 'object' && !Array.isArray(value)) {
return value as JsonObject
@@ -1,7 +1,7 @@
import { query } from '../../../db/client.js'
import {
createOrder,
findOrderByPlatformOrderId,
findLatestOrderByPlatformOrderId,
getOrderById,
updateOrder,
} from '../../../repositories/order-repo.js'
@@ -122,10 +122,9 @@ export function parseOpen91ProductNo(value: unknown) {
export async function upsertOpen91PendingOrder(payload: JsonObject = {}, config: JsonObject = {}) {
const event = buildOpen91SourceEvent(payload, config)
const now = nowIso()
const existing = await findOrderByPlatformOrderId({
const existing = await findLatestOrderByPlatformOrderId({
provider: event.provider,
platform: event.platform,
shopId: event.shopId,
platformOrderId: event.platformOrderId,
})
@@ -137,8 +136,8 @@ export async function upsertOpen91PendingOrder(payload: JsonObject = {}, config:
const orderPayload = {
provider: event.provider,
platform: event.platform,
shopId: event.shopId,
shopName: event.shopName,
shopId: String(existing?.shop_id || event.shopId || '').trim(),
shopName: String(existing?.shop_name || event.shopName || '').trim(),
platformOrderId: event.platformOrderId,
orderStatus: OPEN_91_PENDING_CONFIG_STATUS,
payStatus: 'paid',