diff --git a/furniture-3d-system/src/lib/supply-chain-product-archive.ts b/furniture-3d-system/src/lib/supply-chain-product-archive.ts index 95d3e590..3119c5f7 100644 --- a/furniture-3d-system/src/lib/supply-chain-product-archive.ts +++ b/furniture-3d-system/src/lib/supply-chain-product-archive.ts @@ -42,6 +42,10 @@ export type SupplyChainProductArchiveRow = { moq: string firstLeadTime: string palletSpec: string + dailySales: string + sales3d: string + sales7d: string + sales15d: string } export const PRODUCT_ARCHIVE_SALES_STATUSES = ['销售', '停产', '退市'] as const diff --git a/furniture-3d-system/src/server/repositories/jst-stock-monitor.repository.ts b/furniture-3d-system/src/server/repositories/jst-stock-monitor.repository.ts index 0c7cf8e9..abf896cb 100644 --- a/furniture-3d-system/src/server/repositories/jst-stock-monitor.repository.ts +++ b/furniture-3d-system/src/server/repositories/jst-stock-monitor.repository.ts @@ -11,6 +11,10 @@ export type JstStockMonitorProfile = { minimum: string produceCycle: string trayParameter: string + purchaseSale: string + threeAvgSale: string + sevenAvgSale: string + fifteenAvgSale: string } export interface JstStockMonitorRepository { @@ -119,6 +123,10 @@ class JstStockMonitorRepositoryClass implements JstStockMonitorRepository { LTRIM(RTRIM(COALESCE(CAST(minimum AS varchar(50)), ''))) AS minimum, LTRIM(RTRIM(COALESCE(CAST(produceCycle AS varchar(50)), ''))) AS produceCycle, LTRIM(RTRIM(COALESCE(CAST(trayParameter AS varchar(50)), ''))) AS trayParameter, + LTRIM(RTRIM(COALESCE(CAST(purchaseSale AS varchar(50)), ''))) AS purchaseSale, + LTRIM(RTRIM(COALESCE(CAST(threeAvgSale AS varchar(50)), ''))) AS threeAvgSale, + LTRIM(RTRIM(COALESCE(CAST(sevenAvgSale AS varchar(50)), ''))) AS sevenAvgSale, + LTRIM(RTRIM(COALESCE(CAST(fifteenAvgSale AS varchar(50)), ''))) AS fifteenAvgSale, ROW_NUMBER() OVER ( PARTITION BY LTRIM(RTRIM(CAST(sku_id AS varchar(100)))) ORDER BY [date] DESC, created DESC, id DESC @@ -126,7 +134,16 @@ class JstStockMonitorRepositoryClass implements JstStockMonitorRepository { FROM [${schema}].[pm_stockMonitor] WHERE ${conditions.join(' OR ')} ) - SELECT sku, barcode, minimum, produceCycle, trayParameter + SELECT + sku, + barcode, + minimum, + produceCycle, + trayParameter, + purchaseSale, + threeAvgSale, + sevenAvgSale, + fifteenAvgSale FROM ranked_stock WHERE row_rank = 1 `) diff --git a/furniture-3d-system/src/server/services/__tests__/supply-chain-product-archive.service.test.ts b/furniture-3d-system/src/server/services/__tests__/supply-chain-product-archive.service.test.ts index 55bce61d..24d3eada 100644 --- a/furniture-3d-system/src/server/services/__tests__/supply-chain-product-archive.service.test.ts +++ b/furniture-3d-system/src/server/services/__tests__/supply-chain-product-archive.service.test.ts @@ -102,6 +102,10 @@ describe('supply-chain product archive field mapping', () => { minimum: '12', produceCycle: '7', trayParameter: '40', + purchaseSale: '35.39', + threeAvgSale: '0', + sevenAvgSale: '32.77', + fifteenAvgSale: '34.72', }, ]), } @@ -147,6 +151,10 @@ describe('supply-chain product archive field mapping', () => { moq: '12', firstLeadTime: '7', palletSpec: '40', + dailySales: '35.39', + sales3d: '0', + sales7d: '32.77', + sales15d: '34.72', }), ) expect(supplierProfileRepository.listByNames).toHaveBeenCalledWith([ diff --git a/furniture-3d-system/src/server/services/supply-chain-product-archive.service.ts b/furniture-3d-system/src/server/services/supply-chain-product-archive.service.ts index 85e7ee62..78b3e863 100644 --- a/furniture-3d-system/src/server/services/supply-chain-product-archive.service.ts +++ b/furniture-3d-system/src/server/services/supply-chain-product-archive.service.ts @@ -58,6 +58,12 @@ function mapProductArchiveRow( warehouseStorageTypes?: Map, warehouseHeads?: Map, ) { + const exactBarcodeStockProfile = + stockProfile && + normalizeStockKey(stockProfile.barcode) === normalizeStockKey(record.barcode) + ? stockProfile + : undefined + return { id: record.id, image: record.image?.trim() ?? '', @@ -104,6 +110,10 @@ function mapProductArchiveRow( moq: stockProfile?.minimum || record.minimumOrderQuantity, firstLeadTime: stockProfile?.produceCycle ?? '', palletSpec: stockProfile?.trayParameter ?? '', + dailySales: exactBarcodeStockProfile?.purchaseSale ?? '', + sales3d: exactBarcodeStockProfile?.threeAvgSale ?? '', + sales7d: exactBarcodeStockProfile?.sevenAvgSale ?? '', + sales15d: exactBarcodeStockProfile?.fifteenAvgSale ?? '', } satisfies SupplyChainProductArchiveRow }