Merge branch 'main' into dev_match

This commit is contained in:
2026-11-06 10:14:43 +08:00
63 changed files with 7027 additions and 954 deletions
@@ -0,0 +1,12 @@
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
const page = readFileSync(new URL('../src/pages/admin/AdminTasksPage.tsx', import.meta.url), 'utf8')
test('任务页默认仅展示当前任务,并可切换全部历史尝试', () => {
assert.ok(page.includes("searchParams.get('scope') === 'all' ? 'all' : 'current'"))
assert.ok(page.includes('currentOnly: filters.scope !=='))
assert.ok(page.includes("label: '当前任务'"))
assert.ok(page.includes("label: '全部历史尝试'"))
})
@@ -0,0 +1,28 @@
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
test('寄售仓库必须提供通过审核入库时间范围筛选,并透传到库存查询', () => {
const source = readFileSync(
new URL('../src/pages/admin/panels/ConsignmentInventoryPanel.tsx', import.meta.url).pathname,
'utf8',
)
assert.ok(
source.includes("from '@/components/admin/AdminDatePicker'"),
'必须复用后台日期范围控件',
)
assert.ok(source.includes("placeholder={['入库开始日期', '入库结束日期']}"), '必须明确筛选口径')
assert.ok(source.includes('dateFrom: inboundRange?.[0]'), '开始日期必须透传后端')
assert.ok(source.includes('dateTo: inboundRange?.[1]'), '结束日期必须透传后端')
assert.ok(
source.includes('inboundRange?.[0],\n inboundRange?.[1],'),
'日期变化必须进入 React Query key 并触发重新查询',
)
assert.ok(
source
.slice(source.indexOf('<AdminRangePicker'), source.indexOf('<Input.Search'))
.includes('setPage(1)'),
'修改日期筛选后必须回到第一页',
)
})
@@ -0,0 +1,32 @@
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
const panel = readFileSync(
new URL('../src/pages/admin/AdminFulfillmentChannelPage.tsx', import.meta.url),
'utf8',
)
test('待分类队列按问题类型拆分动作', () => {
assert.ok(panel.includes('去补配置'))
assert.ok(panel.includes('处理人工复核'))
assert.ok(panel.includes('确认重试'))
assert.ok(panel.includes('解除锁定'))
assert.ok(panel.includes('等待补配置'))
assert.ok(panel.includes('用户已申请退款'))
assert.ok(panel.includes('上游履约已取消'))
assert.ok(panel.includes('PENDING_ISSUE_CATEGORY_OPTIONS'))
assert.ok(panel.includes("label: '配置待补'"))
assert.ok(panel.includes("label: '售后关闭'"))
})
test('重开历史载体必须二次确认且不会处理锁定项', () => {
assert.ok(panel.includes('确认重开履约载体'))
assert.ok(panel.includes('retryInactiveCarrier: true'))
assert.ok(panel.includes('不会重开失败或关闭的旧任务'))
assert.ok(panel.includes('unlockPendingChannelGroup'))
assert.ok(panel.includes('hasOnlyRetryableIssues'))
assert.ok(panel.includes('issueCodes: retryableIssueCodes'))
assert.ok(panel.includes('issueCodes: autoRetryableIssueCodes'))
assert.ok(!panel.includes('PENDING_RETRYABLE_TERMINAL_REASONS'))
})
@@ -0,0 +1,17 @@
import assert from 'node:assert/strict'
import { readFile } from 'node:fs/promises'
import test from 'node:test'
test('人工成本配置直接展示标准商品,不再要求按日期扫描内部 SKU', async () => {
const source = await readFile(
new URL('../src/pages/admin/cost-center/ManualSkuConfigPanel.tsx', import.meta.url),
'utf8',
)
assert.ok(source.includes('人工标准商品与成本配置一一对应'))
assert.ok(source.includes("title: '人工标准商品'"))
assert.ok(source.includes('SKU:{row.skuKey}'))
assert.ok(!source.includes('扫描内部 SKU'))
assert.ok(!source.includes('DatePicker.RangePicker'))
assert.ok(!source.includes('rematchAdminManualFulfillments'))
})
@@ -0,0 +1,23 @@
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
const panel = readFileSync(
new URL('../src/pages/admin/panels/VoucherConsumePolicyPanel.tsx', import.meta.url),
'utf8',
)
test('最近核销任务提供关键词、平台、渠道和状态筛选', () => {
assert.ok(panel.includes('placeholder="任务号 / 订单号 / 平台单号"'))
assert.ok(panel.includes('placeholder="全部平台"'))
assert.ok(panel.includes('placeholder="全部渠道"'))
assert.ok(panel.includes('placeholder="全部状态"'))
assert.ok(panel.includes('resetJobFilters'))
})
test('最近核销任务使用服务端分页', () => {
assert.ok(panel.includes('buildAdminTablePagination'))
assert.ok(panel.includes('total: jobsQuery.data?.data.total'))
assert.ok(panel.includes('setPageSize(nextPageSize)'))
assert.ok(!panel.includes('pagination={false}\n scroll={{ x: 1200 }}'))
})
@@ -0,0 +1,21 @@
import assert from 'node:assert/strict'
import { readFile } from 'node:fs/promises'
import test from 'node:test'
test('第三方卡券面板提供安全删除入口并格式化生效时间', async () => {
const [panel, service] = await Promise.all([
readFile(
new URL('../src/pages/admin/cost-center/VoucherSkuPanel.tsx', import.meta.url),
'utf8',
),
readFile(new URL('../src/services/admin/cost-center.ts', import.meta.url), 'utf8'),
])
assert.ok(panel.includes('deleteAdminVoucherProduct'))
assert.ok(panel.includes('DeleteOutlined'))
assert.ok(panel.includes('Popconfirm'))
assert.ok(panel.includes('已有历史订单或成本快照时会自动归档'))
assert.ok(panel.includes('formatAdminDateTime(value)'))
assert.ok(service.includes('/api/v1/admin/cost-center/voucher-products/${productId}'))
assert.ok(service.includes("action: 'deleted' | 'archived'"))
})