diff --git a/web-admin/src/api/presign-order.ts b/web-admin/src/api/presign-order.ts index 26684a8b..014051cd 100644 --- a/web-admin/src/api/presign-order.ts +++ b/web-admin/src/api/presign-order.ts @@ -71,10 +71,13 @@ export function fetchUpdatePresignTransfer(transferId: string, data: Record { + 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: '请填写转账金额' }]) + }) +}) diff --git a/web-admin/src/utils/presign-save-auto-submit.ts b/web-admin/src/utils/presign-save-auto-submit.ts new file mode 100644 index 00000000..ca9e09dc --- /dev/null +++ b/web-admin/src/utils/presign-save-auto-submit.ts @@ -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 | 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 +): Promise { + 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 +}