feat(web-admin): add presign save auto-submit helpers and silent finance submit option

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-14 12:02:24 +08:00
1 parent 0398cb3897
commit e56d8d7f51
3 files changed
+109 -2

No files matched your search

+5 -2
View File
@@ -71,10 +71,13 @@ export function fetchUpdatePresignTransfer(transferId: string, data: Record<stri
})
}
export function fetchSubmitPresignTransferFinance(transferId: string) {
export function fetchSubmitPresignTransferFinance(
transferId: string,
options?: { showSuccessMessage?: boolean }
) {
return request.post({
url: `/web/admin/presign-transfers/${transferId}/submit-receipt-finance`,
showSuccessMessage: true
showSuccessMessage: options?.showSuccessMessage !== false
})
}
@@ -0,0 +1,48 @@
import { describe, it } from 'node:test'
import assert from 'node:assert/strict'
import {
collectDfjTransferIds,
formatAutoSubmitFinanceFailureMessage,
submitDfjTransfersOnSave
} from './presign-save-auto-submit'
describe('presign-save-auto-submit', () => {
it('collects only dfj transfers with ids', () => {
assert.deepEqual(
collectDfjTransferIds([
{ id: 't1', payStatus: 'dfj' },
{ id: 't2', payStatus: 'jfqrz' },
{ id: '', payStatus: 'dfj' },
{ payStatus: 'dfj' },
{ id: 't3', payStatus: 'dfj' }
]),
['t1', 't3']
)
})
it('formats partial failure message', () => {
assert.equal(
formatAutoSubmitFinanceFailureMessage([
{ id: 't1', message: '请选择转账方式' },
{ id: 't2', message: '请填写转账金额' }
]),
'订单已保存,但有 2 笔提交财务确认失败:请选择转账方式;请填写转账金额'
)
})
it('continues submitting after one failure', async () => {
const calls: string[] = []
const failures = await submitDfjTransfersOnSave(
[
{ id: 'ok', payStatus: 'dfj' },
{ id: 'bad', payStatus: 'dfj' }
],
async (id) => {
calls.push(id)
if (id === 'bad') throw new Error('请填写转账金额')
}
)
assert.deepEqual(calls, ['ok', 'bad'])
assert.deepEqual(failures, [{ id: 'bad', message: '请填写转账金额' }])
})
})
@@ -0,0 +1,56 @@
export type PresignTransferLike = {
id?: string | null
payStatus?: string | null
}
export type AutoSubmitFailure = {
id: string
message: string
}
export function collectDfjTransferIds(
transfers: PresignTransferLike[] | null | undefined
): string[] {
const rows = Array.isArray(transfers) ? transfers : []
return rows
.filter((row) => {
const id = String(row?.id || '').trim()
const status = String(row?.payStatus || 'dfj').trim() || 'dfj'
return Boolean(id) && status === 'dfj'
})
.map((row) => String(row.id).trim())
}
export function formatAutoSubmitFinanceFailureMessage(
failures: Array<AutoSubmitFailure | string> | null | undefined
): string {
const list = Array.isArray(failures) ? failures.filter(Boolean) : []
if (!list.length) return ''
const reasons = list
.map((item) =>
typeof item === 'string'
? item.trim()
: String(item?.message || '提交失败').trim()
)
.filter(Boolean)
return `订单已保存,但有 ${list.length} 笔提交财务确认失败:${reasons.join(';')}`
}
export async function submitDfjTransfersOnSave(
transfers: PresignTransferLike[] | null | undefined,
submitOne: (transferId: string) => Promise<unknown>
): Promise<AutoSubmitFailure[]> {
const ids = collectDfjTransferIds(transfers)
const failures: AutoSubmitFailure[] = []
for (const id of ids) {
try {
await submitOne(id)
} catch (error: any) {
failures.push({
id,
message: String(error?.message || error || '提交失败').trim() || '提交失败'
})
}
}
return failures
}