diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.test.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.test.ts index fe62ce6f..91ba7e16 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.test.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.test.ts @@ -326,6 +326,28 @@ describe('batch-form-model', () => { ); }); + it('keeps every row when a runtime row index is not a number', () => { + const rows = [createBatchRow()]; + const result = applyBatchResult(rows, { + successCount: 0, + failureCount: 1, + failures: [ + { + clientKey: 'unknown-key', + rowIndex: '1' as unknown as number, + errorCode: 'INVALID_INDEX', + message: '行号类型错误', + }, + ], + }); + const generalError = '批量保存结果无法匹配,请核对后重试'; + + expect(result.rows).toEqual(rows); + expect(result.rowErrors).toEqual( + new Map(rows.map((row) => [row.clientKey, generalError])), + ); + }); + it('returns no rows or errors when every row succeeds', () => { const result = applyBatchResult([createBatchRow()], { successCount: 1, diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.ts index 17d807ca..829558a6 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/lms/subpackagerelation/modules/batch-form-model.ts @@ -111,6 +111,13 @@ export function applyBatchResult( const failedClientKeys = new Set(); const rowErrors = new Map(); for (const failure of result.failures) { + if ( + !Number.isInteger(failure.rowIndex) || + failure.rowIndex < 1 || + failure.rowIndex > rows.length + ) { + return unsafeResult(); + } const rowByKey = rowByClientKey.get(failure.clientKey); const rowByIndex = rows[failure.rowIndex - 1]; if (