From ffa3374483d4207c149509398b5fc38f3d2a071b Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 12 Sep 2026 15:16:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(pdd-sync):=20=E9=BB=98=E8=AE=A4=E6=8B=89?= =?UTF-8?q?=E5=8F=96=E5=B7=B2=E5=8F=91=E8=B4=A7=E8=AE=A2=E5=8D=95=E5=B9=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=85=8D=E7=BD=AE=E5=8D=95=E6=AC=A1=E6=8B=89?= =?UTF-8?q?=E5=8D=95=E4=B8=8A=E9=99=90=E4=B8=8E=E6=8A=93=E5=8F=96=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/routes/admin/platform-config/pdd.ts | 13 +- .../src/services/platforms/pdd/pdd-client.ts | 6 +- .../pdd/pdd-source-config-service.ts | 16 +++ .../platforms/pdd/pdd-sync-service.ts | 7 +- .../services/scheduler/pdd-order-sync-job.ts | 7 +- .../pages/admin/platform/PddPlatformPanel.tsx | 120 ++++++++++++++---- .../src/services/admin/platform-config/pdd.ts | 4 +- .../src/types/admin/platform-config/pdd.ts | 2 + 8 files changed, 135 insertions(+), 40 deletions(-) diff --git a/apps/backend/src/routes/admin/platform-config/pdd.ts b/apps/backend/src/routes/admin/platform-config/pdd.ts index 4bac7cd3..5d71792f 100644 --- a/apps/backend/src/routes/admin/platform-config/pdd.ts +++ b/apps/backend/src/routes/admin/platform-config/pdd.ts @@ -159,8 +159,15 @@ router.post( '/pdd/sync', createJsonHandler( async (req) => { - const body = (req.body || {}) as { shopId?: string; pageSize?: number } + const body = (req.body || {}) as { + shopId?: string + pageSize?: number + orderType?: number + } const shopId = String(body.shopId || '').trim() + const config = getPddSourcesConfig() + const pageSize = Math.min(100, Math.max(1, Number(body.pageSize || config.pageSize || 50))) + const orderType = Number(body.orderType ?? config.orderType ?? 2) if (shopId) { const store = getPddStoreById(shopId) @@ -170,10 +177,10 @@ router.post( errorCode: 'pdd_store_not_found', }) } - return syncStoreOrders(store, { pageSize: body.pageSize || 10 }) + return syncStoreOrders(store, { pageSize, orderType }) } - return syncAllPddStores({ pageSize: body.pageSize || 10 }) + return syncAllPddStores({ pageSize, orderType }) }, { successMessage: '拼多多同步已触发', diff --git a/apps/backend/src/services/platforms/pdd/pdd-client.ts b/apps/backend/src/services/platforms/pdd/pdd-client.ts index f91dea71..4504191a 100644 --- a/apps/backend/src/services/platforms/pdd/pdd-client.ts +++ b/apps/backend/src/services/platforms/pdd/pdd-client.ts @@ -124,13 +124,13 @@ export class PddClient { /** * Query recent orders page from PDD MMS. - * 单页查询拼多多商户近期订单(默认查询待发货订单)。 + * 单页查询拼多多商户近期订单(默认查询已发货订单)。 */ public async queryRecentOrders(options: QueryOrdersOptions = {}): Promise { const { pageNumber = 1, - pageSize = 20, - orderType = 1, // 1: 待发货 (Pending shipment) + pageSize = 50, + orderType = 2, // 2: 已发货 (Shipped, default) afterSaleStatus = 0, groupType = 0, remarkStatus = -1, diff --git a/apps/backend/src/services/platforms/pdd/pdd-source-config-service.ts b/apps/backend/src/services/platforms/pdd/pdd-source-config-service.ts index a329ab44..f5873cc4 100644 --- a/apps/backend/src/services/platforms/pdd/pdd-source-config-service.ts +++ b/apps/backend/src/services/platforms/pdd/pdd-source-config-service.ts @@ -27,6 +27,8 @@ export interface PddStoreConfigItem { export interface PddSourcesConfig { enabled: boolean pollIntervalSeconds: number + orderType: number // 0: 全部, 1: 待发货, 2: 已发货 (默认 2) + pageSize: number // 单次拉取数量 (默认 50) stores: PddStoreConfigItem[] } @@ -167,9 +169,21 @@ export function normalizePddSourcesConfig(rawValue: unknown): PddSourcesConfig { ? Math.min(3600, Math.max(10, rawInterval)) : 20 + const rawOrderType = Number(source.orderType) + const orderType = Number.isInteger(rawOrderType) && [0, 1, 2].includes(rawOrderType) + ? rawOrderType + : 2 + + const rawPageSize = Number(source.pageSize) + const pageSize = Number.isInteger(rawPageSize) + ? Math.min(100, Math.max(10, rawPageSize)) + : 50 + return { enabled: source.enabled !== false, pollIntervalSeconds, + orderType, + pageSize, stores, } } @@ -178,6 +192,8 @@ function createDefaultPddSourcesConfig(): PddSourcesConfig { return { enabled: true, pollIntervalSeconds: 20, + orderType: 2, + pageSize: 50, stores: [], } } diff --git a/apps/backend/src/services/platforms/pdd/pdd-sync-service.ts b/apps/backend/src/services/platforms/pdd/pdd-sync-service.ts index da8c8504..45ee9f71 100644 --- a/apps/backend/src/services/platforms/pdd/pdd-sync-service.ts +++ b/apps/backend/src/services/platforms/pdd/pdd-sync-service.ts @@ -22,7 +22,7 @@ import { logError, logInfo, logWarn } from '../../../utils/logger.js' export interface SyncStoreOrdersOptions { pageNumber?: number | undefined pageSize?: number | undefined - orderType?: number | undefined // 1: 待发货 (默认) + orderType?: number | undefined // 2: 已发货 (默认), 1: 待发货, 0: 全部 startTime?: number | undefined endTime?: number | undefined } @@ -71,9 +71,10 @@ export async function syncStoreOrders( } const client = new PddClient(store) - const pageSize = Math.min(50, Math.max(1, Number(options.pageSize || 10))) + const sourcesConfig = getPddSourcesConfig() + const pageSize = Math.min(100, Math.max(1, Number(options.pageSize || sourcesConfig.pageSize || 50))) const pageNumber = Math.max(1, Number(options.pageNumber || 1)) - const orderType = options.orderType ?? 1 // 1: 待发货 (Pending shipment) + const orderType = options.orderType ?? sourcesConfig.orderType ?? 2 // 2: 已发货 (Shipped, default) try { const queryOptions: QueryOrdersOptions = { diff --git a/apps/backend/src/services/scheduler/pdd-order-sync-job.ts b/apps/backend/src/services/scheduler/pdd-order-sync-job.ts index 1eb14801..d5aa4cc3 100644 --- a/apps/backend/src/services/scheduler/pdd-order-sync-job.ts +++ b/apps/backend/src/services/scheduler/pdd-order-sync-job.ts @@ -6,15 +6,18 @@ import type { JsonObject } from '../../types/json.js' import { logInfo } from '../../utils/logger.js' import { syncAllPddStores } from '../platforms/pdd/pdd-sync-service.js' +import { getPddSourcesConfig } from '../platforms/pdd/pdd-source-config-service.js' export async function runPddOrderSyncJob(job: JsonObject) { const config = job.config && typeof job.config === 'object' && !Array.isArray(job.config) ? (job.config as JsonObject) : {} - const pageSize = Math.min(50, Math.max(1, Number(config.pageSize || 10))) + const sourcesConfig = getPddSourcesConfig() + const pageSize = Math.min(100, Math.max(1, Number(config.pageSize || sourcesConfig.pageSize || 50))) + const orderType = Number(config.orderType ?? sourcesConfig.orderType ?? 2) - const syncResult = await syncAllPddStores({ pageSize }) + const syncResult = await syncAllPddStores({ pageSize, orderType }) if (!syncResult.enabled) { return { diff --git a/apps/frontend/src/pages/admin/platform/PddPlatformPanel.tsx b/apps/frontend/src/pages/admin/platform/PddPlatformPanel.tsx index c544d26f..40176277 100644 --- a/apps/frontend/src/pages/admin/platform/PddPlatformPanel.tsx +++ b/apps/frontend/src/pages/admin/platform/PddPlatformPanel.tsx @@ -31,6 +31,7 @@ import { Modal, Popconfirm, Row, + Select, Space, Spin, Statistic, @@ -76,6 +77,8 @@ export function PddPlatformPanel() { const [config, setConfig] = useState({ enabled: true, pollIntervalSeconds: 20, + orderType: 2, + pageSize: 50, stores: [], }) @@ -144,13 +147,18 @@ export function PddPlatformPanel() { async function handleSyncAll() { setSyncingAll(true) try { - const response = await triggerAdminPddSync() + const response = await triggerAdminPddSync({ + pageSize: config.pageSize || 50, + orderType: config.orderType ?? 2, + }) const data = response?.data as AdminPddSyncAllResponse | undefined if (data && Array.isArray(data.results)) { const totalFetched = data.results.reduce((acc, r) => acc + (r.fetchedCount || 0), 0) const totalUpserted = data.results.reduce((acc, r) => acc + (r.upsertedCount || 0), 0) + const statusLabel = + config.orderType === 1 ? '待发货' : config.orderType === 0 ? '全部' : '已发货' showSuccess( - `全量店铺同步完成:共抓取 ${totalFetched} 笔,入库/更新 ${totalUpserted} 笔待发货订单`, + `全量店铺【${statusLabel}】同步完成:共抓取 ${totalFetched} 笔,入库/更新 ${totalUpserted} 笔订单`, ) } else { showSuccess('全量店铺同步完成') @@ -169,7 +177,11 @@ export function PddPlatformPanel() { async function handleSyncSingleStore(store: AdminPddStoreItem) { setSyncingShopId(store.shopId) try { - const response = await triggerAdminPddSync({ shopId: store.shopId }) + const response = await triggerAdminPddSync({ + shopId: store.shopId, + pageSize: config.pageSize || 50, + orderType: config.orderType ?? 2, + }) const data = response?.data as AdminPddSyncResult | undefined if (data) { showSuccess( @@ -206,7 +218,7 @@ export function PddPlatformPanel() { })) if (result.valid) { showSuccess( - `【${store.shopName}】Cookie 校验通过,在线待发货订单数: ${result.totalOrders ?? 0}`, + `【${store.shopName}】Cookie 校验通过,在售/历史订单总数: ${result.totalOrders ?? 0}`, ) } else { showError(`【${store.shopName}】Cookie 校验未通过: ${result.message}`) @@ -458,7 +470,7 @@ export function PddPlatformPanel() { return ( } color="success"> - 有效 (待发货: {testRes.totalOrders ?? 0}) + 有效 (在售/历史: {testRes.totalOrders ?? 0}) {testRes.testedAt && ( @@ -501,7 +513,9 @@ export function PddPlatformPanel() { 测试CK - +