修复容器测试并补订单回归
This commit is contained in:
@@ -8,7 +8,7 @@ import { ENV_OVERRIDES } from './env-overrides.js'
|
|||||||
|
|
||||||
const CURRENT_DIR = path.dirname(fileURLToPath(import.meta.url))
|
const CURRENT_DIR = path.dirname(fileURLToPath(import.meta.url))
|
||||||
const BACKEND_ROOT = path.resolve(CURRENT_DIR, '../..')
|
const BACKEND_ROOT = path.resolve(CURRENT_DIR, '../..')
|
||||||
const WORKSPACE_ROOT = path.resolve(BACKEND_ROOT, '../..')
|
const WORKSPACE_ROOT = process.env.WORKSPACE_ROOT || path.resolve(BACKEND_ROOT, '../..')
|
||||||
|
|
||||||
const SPECIAL_RUNTIME_ENV_NAMES = ['APP_BASE_URL', 'CLAIM_BASE_URL']
|
const SPECIAL_RUNTIME_ENV_NAMES = ['APP_BASE_URL', 'CLAIM_BASE_URL']
|
||||||
|
|
||||||
@@ -31,6 +31,7 @@ const DEPLOYMENT_ONLY_ENV_NAMES = [
|
|||||||
'VITE_API_TARGET',
|
'VITE_API_TARGET',
|
||||||
'VITE_ALLOWED_HOSTS',
|
'VITE_ALLOWED_HOSTS',
|
||||||
'VITE_WORKER_SITE_URL',
|
'VITE_WORKER_SITE_URL',
|
||||||
|
'WORKSPACE_ROOT',
|
||||||
'WORKER_SITE_ADDR',
|
'WORKER_SITE_ADDR',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import type {
|
|||||||
WorkerUserRow,
|
WorkerUserRow,
|
||||||
} from '../../repositories/worker-platform/index.js'
|
} from '../../repositories/worker-platform/index.js'
|
||||||
import {
|
import {
|
||||||
|
buildWorkOrderWhere,
|
||||||
resolveWorkOrderShareCancellationStatus,
|
resolveWorkOrderShareCancellationStatus,
|
||||||
resolveWorkOrderShareJoinQuantity,
|
resolveWorkOrderShareJoinQuantity,
|
||||||
resolveOpenSharingSyncReward,
|
resolveOpenSharingSyncReward,
|
||||||
@@ -36,6 +37,7 @@ import {
|
|||||||
resolveSkuNameQuantity,
|
resolveSkuNameQuantity,
|
||||||
resolveWorkOrderRulePricing,
|
resolveWorkOrderRulePricing,
|
||||||
resolveWorkOrderTemplateSyncPrice,
|
resolveWorkOrderTemplateSyncPrice,
|
||||||
|
resolveWorkerShareStatus,
|
||||||
resolveWorkOrderSharingEnabled,
|
resolveWorkOrderSharingEnabled,
|
||||||
validateWorkerPassword,
|
validateWorkerPassword,
|
||||||
} from './index.js'
|
} from './index.js'
|
||||||
@@ -817,6 +819,29 @@ test('mapWorkOrderForWorker 使用个人拼单份数、金额、状态和接单
|
|||||||
assert.equal(mapped.assignedAt, '2026-08-18T09:09:08.000Z')
|
assert.equal(mapped.assignedAt, '2026-08-18T09:09:08.000Z')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('打手拼单状态以个人份额为准,母工单终态优先', () => {
|
||||||
|
assert.equal(resolveWorkerShareStatus('open', 'joined'), 'in_progress')
|
||||||
|
assert.equal(resolveWorkerShareStatus('open', 'submitted'), 'pending_acceptance')
|
||||||
|
assert.equal(resolveWorkerShareStatus('open', 'accepted'), 'accepted')
|
||||||
|
assert.equal(resolveWorkerShareStatus('open', 'cancelled'), 'cancelled')
|
||||||
|
assert.equal(resolveWorkerShareStatus('problem', 'joined'), 'problem')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('打手订单状态筛选使用个人拼单份额状态', () => {
|
||||||
|
const { joins, whereClause, params } = buildWorkOrderWhere({
|
||||||
|
workerSharingId: 42,
|
||||||
|
statuses: ['in_progress', 'pending_acceptance'],
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.deepEqual(params, [42, ['in_progress', 'pending_acceptance']])
|
||||||
|
assert.match(joins, /work_order_shares share_source/)
|
||||||
|
assert.match(joins, /worker_share\.worker_id = \$1/)
|
||||||
|
assert.match(whereClause, /WHEN 'joined' THEN 'in_progress'/)
|
||||||
|
assert.match(whereClause, /WHEN 'submitted' THEN 'pending_acceptance'/)
|
||||||
|
assert.match(whereClause, /worker_share\.status/)
|
||||||
|
assert.match(whereClause, /= ANY\(\$2::text\[\]\)/)
|
||||||
|
})
|
||||||
|
|
||||||
test('后台拼单聚合状态同时收敛筛选语义和操作能力', () => {
|
test('后台拼单聚合状态同时收敛筛选语义和操作能力', () => {
|
||||||
const waitingForClaim = mapWorkOrderAdmin(buildWorkOrderRow({ status: 'open' }))
|
const waitingForClaim = mapWorkOrderAdmin(buildWorkOrderRow({ status: 'open' }))
|
||||||
assert.equal(waitingForClaim.status, 'open')
|
assert.equal(waitingForClaim.status, 'open')
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ import type {
|
|||||||
import { formatDateTime } from '@/utils/date-time'
|
import { formatDateTime } from '@/utils/date-time'
|
||||||
import { getImageIdentity } from '@/utils/image-identity'
|
import { getImageIdentity } from '@/utils/image-identity'
|
||||||
import { useIsMobile } from '@/utils/use-is-mobile'
|
import { useIsMobile } from '@/utils/use-is-mobile'
|
||||||
|
import { buildWorkerOrderQuery } from '@/utils/worker-order-query'
|
||||||
|
|
||||||
const STATUS_OPTIONS = [
|
const STATUS_OPTIONS = [
|
||||||
{ value: 'in_progress', label: '代练中' },
|
{ value: 'in_progress', label: '代练中' },
|
||||||
@@ -86,15 +87,6 @@ type FeedbackFormValues = {
|
|||||||
content?: string
|
content?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildWorkerOrderQuery(status: string, keyword: string, page: number, pageSize: number) {
|
|
||||||
return {
|
|
||||||
keyword,
|
|
||||||
page,
|
|
||||||
pageSize,
|
|
||||||
...(status === 'vip_evidence_pending' ? { vipEvidencePending: true } : { status }),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type NoteTheme = 'success' | 'processing' | 'danger' | 'warning' | 'purple' | 'default'
|
type NoteTheme = 'success' | 'processing' | 'danger' | 'warning' | 'purple' | 'default'
|
||||||
|
|
||||||
const PRESET_NOTE_TAGS: Array<{ label: string; theme: NoteTheme }> = [
|
const PRESET_NOTE_TAGS: Array<{ label: string; theme: NoteTheme }> = [
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
export function buildWorkerOrderQuery(
|
||||||
|
status: string,
|
||||||
|
keyword: string,
|
||||||
|
page: number,
|
||||||
|
pageSize: number,
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
keyword,
|
||||||
|
page,
|
||||||
|
pageSize,
|
||||||
|
...(status === 'vip_evidence_pending' ? { vipEvidencePending: true } : { status }),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import assert from 'node:assert/strict'
|
||||||
|
import test from 'node:test'
|
||||||
|
|
||||||
|
import { buildWorkerOrderQuery } from '../src/utils/worker-order-query.ts'
|
||||||
|
|
||||||
|
test('打手订单页按普通状态筛选并保留分页参数', () => {
|
||||||
|
assert.deepEqual(buildWorkerOrderQuery('in_progress', '王者荣耀', 2, 20), {
|
||||||
|
status: 'in_progress',
|
||||||
|
keyword: '王者荣耀',
|
||||||
|
page: 2,
|
||||||
|
pageSize: 20,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test('打手订单页待补图筛选使用独立标记', () => {
|
||||||
|
assert.deepEqual(buildWorkerOrderQuery('vip_evidence_pending', '', 1, 20), {
|
||||||
|
vipEvidencePending: true,
|
||||||
|
keyword: '',
|
||||||
|
page: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test('打手订单页选择全部订单时不附加状态筛选值', () => {
|
||||||
|
assert.deepEqual(buildWorkerOrderQuery('', '', 1, 20), {
|
||||||
|
status: '',
|
||||||
|
keyword: '',
|
||||||
|
page: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -82,6 +82,7 @@ services:
|
|||||||
STORAGE_SECRET_ACCESS_KEY: ${STORAGE_SECRET_ACCESS_KEY:-minioadmin}
|
STORAGE_SECRET_ACCESS_KEY: ${STORAGE_SECRET_ACCESS_KEY:-minioadmin}
|
||||||
STORAGE_REGION: ${STORAGE_REGION:-us-east-1}
|
STORAGE_REGION: ${STORAGE_REGION:-us-east-1}
|
||||||
STORAGE_MAX_UPLOAD_SIZE_MB: ${STORAGE_MAX_UPLOAD_SIZE_MB:-10}
|
STORAGE_MAX_UPLOAD_SIZE_MB: ${STORAGE_MAX_UPLOAD_SIZE_MB:-10}
|
||||||
|
WORKSPACE_ROOT: /workspace
|
||||||
# ADMIN_* 仅走 env_file,避免 JSON 经 ${} 注入时被 YAML 破坏
|
# ADMIN_* 仅走 env_file,避免 JSON 经 ${} 注入时被 YAML 破坏
|
||||||
KUASHOU_INDUSTRY_RATE_LIMIT_MAX: ${KUASHOU_INDUSTRY_RATE_LIMIT_MAX:-120}
|
KUASHOU_INDUSTRY_RATE_LIMIT_MAX: ${KUASHOU_INDUSTRY_RATE_LIMIT_MAX:-120}
|
||||||
logging: *json-log-rotation
|
logging: *json-log-rotation
|
||||||
@@ -89,6 +90,10 @@ services:
|
|||||||
- ./apps/backend:/app
|
- ./apps/backend:/app
|
||||||
- ./.prettierrc.json:/.prettierrc.json:ro
|
- ./.prettierrc.json:/.prettierrc.json:ro
|
||||||
- ./.prettierignore:/.prettierignore:ro
|
- ./.prettierignore:/.prettierignore:ro
|
||||||
|
- ./.env.server.example:/workspace/.env.server.example:ro
|
||||||
|
- ./.env.mac-docker.example:/workspace/.env.mac-docker.example:ro
|
||||||
|
- ./docker-compose.yml:/workspace/docker-compose.yml:ro
|
||||||
|
- ./docker-compose.dev.yml:/workspace/docker-compose.dev.yml:ro
|
||||||
- backend_node_modules:/app/node_modules
|
- backend_node_modules:/app/node_modules
|
||||||
- ./apps/backend/data:/app/data
|
- ./apps/backend/data:/app/data
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user