This commit is contained in:
wujinliang
2026-08-25 22:08:30 +08:00
parent 63170f9b73
commit b12196c7a8
11 changed files with 30 additions and 18 deletions
+1
View File
@@ -13,6 +13,7 @@
"dependencies": { "dependencies": {
"@chongchong/shared": "link:./shared", "@chongchong/shared": "link:./shared",
"axios": "^1.18.1", "axios": "^1.18.1",
"dayjs": "^1.11.21",
"element-plus": "^2.14.3", "element-plus": "^2.14.3",
"@lucide/vue": "^1.27.0", "@lucide/vue": "^1.27.0",
"pinia": "^4.0.2", "pinia": "^4.0.2",
+3
View File
@@ -17,6 +17,9 @@ importers:
axios: axios:
specifier: ^1.18.1 specifier: ^1.18.1
version: 1.18.1(debug@4.4.3) version: 1.18.1(debug@4.4.3)
dayjs:
specifier: ^1.11.21
version: 1.11.21
element-plus: element-plus:
specifier: ^2.14.3 specifier: ^2.14.3
version: 2.14.3(vue@3.5.40(typescript@5.9.3)) version: 2.14.3(vue@3.5.40(typescript@5.9.3))
+1
View File
@@ -1,5 +1,6 @@
import { createApp } from 'vue' import { createApp } from 'vue'
import { h } from 'vue' import { h } from 'vue'
import 'dayjs/locale/zh-cn'
import { createPinia } from 'pinia' import { createPinia } from 'pinia'
import { ElConfigProvider } from 'element-plus' import { ElConfigProvider } from 'element-plus'
import zhCn from 'element-plus/es/locale/lang/zh-cn' import zhCn from 'element-plus/es/locale/lang/zh-cn'
@@ -131,6 +131,7 @@ export interface MerchantUnifiedOrderQuery {
keyword?: string keyword?: string
fbaCode?: string fbaCode?: string
orderNo?: string orderNo?: string
inboundCode?: string
mainStatus?: ApiUnifiedOrderMainStatus mainStatus?: ApiUnifiedOrderMainStatus
receivingWarehouseId?: number | string receivingWarehouseId?: number | string
destinationWarehouseId?: number | string destinationWarehouseId?: number | string
@@ -100,6 +100,7 @@ test('routes supported filters to C02 without sending DRAFT as a main status', (
assert.match(storeSource, /interface ClientOrderReadQuery extends MerchantUnifiedOrderQuery/) assert.match(storeSource, /interface ClientOrderReadQuery extends MerchantUnifiedOrderQuery/)
assert.match(storeSource, /if \(query\.draftOnly\)/) assert.match(storeSource, /if \(query\.draftOnly\)/)
assert.match(storeSource, /const unifiedQuery: MerchantUnifiedOrderQuery/) assert.match(storeSource, /const unifiedQuery: MerchantUnifiedOrderQuery/)
assert.match(storeSource, /inboundCode: query\.inboundCode/)
assert.match(storeSource, /getMerchantUnifiedOrders\(unifiedQuery\)/) assert.match(storeSource, /getMerchantUnifiedOrders\(unifiedQuery\)/)
}) })
@@ -461,6 +461,7 @@ async function getOrdersForClient(query: ClientOrderReadQuery = {}): Promise<Ord
mainStatus: query.mainStatus, mainStatus: query.mainStatus,
receivingWarehouseId: query.receivingWarehouseId, receivingWarehouseId: query.receivingWarehouseId,
destinationWarehouseId: query.destinationWarehouseId, destinationWarehouseId: query.destinationWarehouseId,
inboundCode: query.inboundCode,
createdFrom: query.createdFrom, createdFrom: query.createdFrom,
createdTo: query.createdTo, createdTo: query.createdTo,
fbaCode: query.fbaCode, fbaCode: query.fbaCode,
@@ -122,8 +122,8 @@ test('requires FBA warehouse and cargo-level shipment, reference, SKU and UPC fi
assert.ok(errors.includes('FBA 订单请填写 Amazon 仓库编码')) assert.ok(errors.includes('FBA 订单请填写 Amazon 仓库编码'))
assert.ok(errors.includes('第 1 条货物缺少客户 SKU')) assert.ok(errors.includes('第 1 条货物缺少客户 SKU'))
assert.ok(errors.includes('第 1 条货物缺少 UPC')) assert.ok(errors.includes('第 1 条货物缺少 UPC'))
assert.ok(errors.includes('第 1 条货物缺少 Shipment ID')) assert.ok(errors.includes('第 1 条货物缺少货件编号'))
assert.ok(errors.includes('第 1 条货物缺少 Reference ID')) assert.ok(errors.includes('第 1 条货物缺少跟踪编号'))
}) })
test('requires public destination ids while keeping private addresses detached from public warehouses', () => { test('requires public destination ids while keeping private addresses detached from public warehouses', () => {
+2 -2
View File
@@ -123,8 +123,8 @@ export function validateFirstLegOrderDraft(draft: FirstLegOrderDraft) {
if (!item.packageType.trim()) errors.push(`${line}缺少包装类型`) if (!item.packageType.trim()) errors.push(`${line}缺少包装类型`)
if (draft.destinationType === 'FBA' && !item.sku.trim()) errors.push(`${line}缺少客户 SKU`) if (draft.destinationType === 'FBA' && !item.sku.trim()) errors.push(`${line}缺少客户 SKU`)
if (draft.destinationType === 'FBA' && !item.upc.trim()) errors.push(`${line}缺少 UPC`) if (draft.destinationType === 'FBA' && !item.upc.trim()) errors.push(`${line}缺少 UPC`)
if (draft.destinationType === 'FBA' && !item.shipmentId.trim()) errors.push(`${line}缺少 Shipment ID`) if (draft.destinationType === 'FBA' && !item.shipmentId.trim()) errors.push(`${line}缺少货件编号`)
if (draft.destinationType === 'FBA' && !item.referenceId.trim()) errors.push(`${line}缺少 Reference ID`) if (draft.destinationType === 'FBA' && !item.referenceId.trim()) errors.push(`${line}缺少跟踪编号`)
if (!Number.isInteger(item.pieces) || item.pieces <= 0) errors.push(`${line}件数必须为正整数`) if (!Number.isInteger(item.pieces) || item.pieces <= 0) errors.push(`${line}件数必须为正整数`)
if (!Number.isInteger(item.packageCount) || item.packageCount <= 0) errors.push(`${line}箱数必须为正整数`) if (!Number.isInteger(item.packageCount) || item.packageCount <= 0) errors.push(`${line}箱数必须为正整数`)
if (!Number.isInteger(item.unitsPerPackage) || item.unitsPerPackage <= 0) errors.push(`${line}每箱数量必须为正整数`) if (!Number.isInteger(item.unitsPerPackage) || item.unitsPerPackage <= 0) errors.push(`${line}每箱数量必须为正整数`)
@@ -1544,7 +1544,8 @@ async function searchOrders(model: QueryModel) {
const cargoKeyword = typeof model.cargoKeyword === 'string' ? model.cargoKeyword.trim() : '' const cargoKeyword = typeof model.cargoKeyword === 'string' ? model.cargoKeyword.trim() : ''
const range = Array.isArray(createdRange) ? createdRange.filter((value): value is string => typeof value === 'string') : [] const range = Array.isArray(createdRange) ? createdRange.filter((value): value is string => typeof value === 'string') : []
const query = { const query = {
keyword: cargoKeyword || undefined, keyword: undefined,
inboundCode: cargoKeyword || undefined,
orderNo: orderNo || undefined, orderNo: orderNo || undefined,
receivingWarehouseId: typeof model.receivingWarehouseId === 'string' && model.receivingWarehouseId ? model.receivingWarehouseId : undefined, receivingWarehouseId: typeof model.receivingWarehouseId === 'string' && model.receivingWarehouseId ? model.receivingWarehouseId : undefined,
mainStatus: statusValue && statusValue !== 'DRAFT' ? statusValue : undefined, mainStatus: statusValue && statusValue !== 'DRAFT' ? statusValue : undefined,
@@ -1554,9 +1555,9 @@ async function searchOrders(model: QueryModel) {
createdTo: range[1] ? `${range[1]}T23:59:59` : undefined, createdTo: range[1] ? `${range[1]}T23:59:59` : undefined,
} }
await store.load(query) await store.load(query)
const cargoMatched = cargoKeyword && store.orders.some((order) => orderMatchesCargoKeyword(order, cargoKeyword)) const cargoMatched = cargoKeyword && store.orders.some((order) => order.status !== 'DRAFT' && orderMatchesCargoKeyword(order, cargoKeyword))
if (cargoKeyword && !cargoMatched && statusValue !== 'DRAFT') { if (cargoKeyword && !cargoMatched && statusValue !== 'DRAFT') {
await store.load({ ...query, keyword: undefined, fbaCode: cargoKeyword }) await store.load({ ...query, keyword: undefined, inboundCode: undefined, fbaCode: cargoKeyword })
} }
selectedOrders.value = [] selectedOrders.value = []
orderTableVersion.value += 1 orderTableVersion.value += 1
@@ -36,7 +36,7 @@ export interface MerchantQualification {
tenantId: number | string tenantId: number | string
qualificationType: MerchantQualificationType qualificationType: MerchantQualificationType
certificateNo: string | null certificateNo: string | null
documentUrl: string documentUrl?: string | null
validTo: string | null validTo: string | null
status: QualificationStatus status: QualificationStatus
reviewComment: string | null reviewComment: string | null
@@ -135,20 +135,23 @@ export const useTenantAdministrationStore = defineStore('tenant-administration',
registeredAddress: profile.registeredAddress ?? '', registeredAddress: profile.registeredAddress ?? '',
auditStatus: profile.status, auditStatus: profile.status,
} }
qualifications.value = qualificationRecords.map((item) => ({ qualifications.value = qualificationRecords.map((item) => {
id: String(item.id), const documentUrl = typeof item.documentUrl === 'string' ? item.documentUrl : ''
type: ({ return {
id: String(item.id),
type: ({
BUSINESS_LICENSE: '营业执照', BUSINESS_LICENSE: '营业执照',
LEGAL_PERSON_ID: '法人身份证', LEGAL_PERSON_ID: '法人身份证',
FREIGHT_FORWARDER_CERTIFICATE: '货代资质证书', FREIGHT_FORWARDER_CERTIFICATE: '货代资质证书',
BANK_ACCOUNT_LICENSE: '银行开户许可证', BANK_ACCOUNT_LICENSE: '银行开户许可证',
} as const)[item.qualificationType], } as const)[item.qualificationType] || '企业资质',
fileName: item.documentUrl.split('/').pop() || '资质文件', fileName: documentUrl.split('/').pop() || '资质文件',
status: normalizeQualificationStatus(item.status), status: normalizeQualificationStatus(item.status),
expiresAt: item.validTo || '长期有效', expiresAt: item.validTo || '长期有效',
updatedAt: '-', updatedAt: '-',
documentUrl: item.documentUrl, documentUrl,
})) }
})
} }
function mapMerchantRole(role: MerchantRole): TenantRole { function mapMerchantRole(role: MerchantRole): TenantRole {