diff --git a/Dockerfile b/Dockerfile
index 39501d7..b1c49e8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -98,7 +98,8 @@ RUN test -s "/app/public/brand/header-logo.png" && \
test -f "/app/prisma/migrations/20260914_add_brand_knowledge_engagement/migration.sql" && \
test -f "/app/prisma/migrations/20260914_expand_brand_knowledge_download_count/migration.sql" && \
test -f "/app/prisma/migrations/20260914_expand_brand_knowledge_preview_slices/migration.sql" && \
- test -f "/app/prisma/migrations/20260915_add_brand_knowledge_soft_delete/migration.sql"
+ test -f "/app/prisma/migrations/20260915_add_brand_knowledge_soft_delete/migration.sql" && \
+ test -f "/app/prisma/migrations/20260918_add_performance_conversion_sync/migration.sql"
# 这两个动态路由负责兜底访问本地上传文件;如果它们在构建上下文里丢失,
# 线上音频/视频就会直接 404。这里提前失败,避免再把缺路由的镜像发出去。
@@ -230,6 +231,7 @@ COPY --from=builder --chown=root:root /app/prisma/migrations/20260914_add_brand_
COPY --from=builder --chown=root:root /app/prisma/migrations/20260914_expand_brand_knowledge_download_count ./prisma/migrations/20260914_expand_brand_knowledge_download_count
COPY --from=builder --chown=root:root /app/prisma/migrations/20260914_expand_brand_knowledge_preview_slices ./prisma/migrations/20260914_expand_brand_knowledge_preview_slices
COPY --from=builder --chown=root:root /app/prisma/migrations/20260915_add_brand_knowledge_soft_delete ./prisma/migrations/20260915_add_brand_knowledge_soft_delete
+COPY --from=builder --chown=root:root /app/prisma/migrations/20260918_add_performance_conversion_sync ./prisma/migrations/20260918_add_performance_conversion_sync
COPY --from=builder --chown=nextjs:nodejs /app/lib ./lib
COPY --from=builder --chown=nextjs:nodejs /app/scripts/public-traffic-rollup-from-nginx.py ./scripts/public-traffic-rollup-from-nginx.py
COPY --from=builder --chown=nextjs:nodejs /app/scripts/collapse-performance-survey-template-versions.mjs ./scripts/collapse-performance-survey-template-versions.mjs
diff --git a/components/department-dashboard/PerformanceConversionDashboard.test.tsx b/components/department-dashboard/PerformanceConversionDashboard.test.tsx
index 1fc1cb2..080a84d 100644
--- a/components/department-dashboard/PerformanceConversionDashboard.test.tsx
+++ b/components/department-dashboard/PerformanceConversionDashboard.test.tsx
@@ -99,6 +99,28 @@ describe('PerformanceConversionDashboard filters', () => {
expect(await screen.findByText(label)).toBeInTheDocument()
})
+ it('shows the business data incremental synchronization state', async () => {
+ global.fetch = jest.fn().mockResolvedValue({
+ ok: true,
+ json: async () => ({
+ success: true,
+ data: {
+ ...emptyList,
+ performanceSync: {
+ status: 'ready',
+ lastCompletedAt: '2099-09-17T01:00:00.000Z',
+ lastSourceDate: '2099-09-17',
+ },
+ },
+ }),
+ } as Response)
+
+ render(
+ + {view.label} +
+{view.detail}{sync.lastSourceDate ? ` · 已扫描至 ${formatDate(sync.lastSourceDate)}` : ''}
+当前品牌
{appliedFilters.completedFrom || appliedFilters.completedTo ? '区间内 ' : ''}{selectedBrandCount} 个有效流程商品 ID{listState.data?.invalidProductIdCount ? ` · ${listState.data.invalidProductIdCount} 条流程未填写有效 ID` : ''}
当前品牌
{appliedFilters.completedFrom || appliedFilters.completedTo ? '区间内 ' : ''}{selectedBrandCount} 个有效流程商品 ID{listState.data?.invalidProductIdCount ? ` · ${listState.data.invalidProductIdCount} 条流程未填写有效 ID` : ''}