From eb4a34cd5d067f62d6b1f7867d1e3dc73180d8e0 Mon Sep 17 00:00:00 2001 From: wuzilong <704541015@qq.com> Date: Sun, 1 Nov 2026 22:43:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(pl):=20=E9=9A=94=E7=A6=BB=E5=90=8C=E5=90=88?= =?UTF-8?q?=E5=90=8C=E4=BA=A7=E5=93=81=E5=8A=A0=E8=BD=BD=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=B9=B6=E5=85=81=E8=AE=B8=E5=A4=B1=E8=B4=A5=E5=90=8E=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E9=80=89=E6=8B=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web-admin/scripts/quota-cert-form.test.ts | 60 ++++++++++++++++++++- web-admin/src/views/pl/quota-cert/index.vue | 44 +++++++++++---- 2 files changed, 91 insertions(+), 13 deletions(-) diff --git a/web-admin/scripts/quota-cert-form.test.ts b/web-admin/scripts/quota-cert-form.test.ts index ec3085c0c..db3501e8c 100644 --- a/web-admin/scripts/quota-cert-form.test.ts +++ b/web-admin/scripts/quota-cert-form.test.ts @@ -10,10 +10,12 @@ import { usePersistedListColumns } from '../src/composables/usePersistedListColu function deferred() { let resolve!: (value: any) => void - const promise = new Promise((r) => { + let reject!: (reason: any) => void + const promise = new Promise((r, j) => { resolve = r + reject = j }) - return { promise, resolve } + return { promise, resolve, reject } } function harness() { const reads: string[] = [], @@ -354,6 +356,8 @@ test('产品勾选往返保留原范围ID;关闭重开后拒绝旧合同和产 try { await s.edit() s.addContractBinding('c') + h.productRequests[0].resolve([{ id: 'p' }, { id: 'p2' }]) + await vue.nextTick() s.form.value.contractBindings[0].products = [ { id: 'scope', contractProductId: 'p', scopeStatus: 'inactive' } ] @@ -436,6 +440,9 @@ test('新增多合同连同证面成功提交一次,移除全部提交明确 await s.edit() s.addContractBinding('one') s.addContractBinding('two') + h.productRequests[0].resolve([{ id: 'p1' }]) + h.productRequests[1].resolve([{ id: 'p2' }]) + await vue.nextTick() s.setBindingProducts(0, ['p1']) s.setBindingProducts(1, ['p2']) s.form.value.certNo = 'MULTI' @@ -456,3 +463,52 @@ test('新增多合同连同证面成功提交一次,移除全部提交明确 h.stop() } }) + +test('同合同产品后发请求优先,移除重加使移除前请求失效', async () => { + const h = harness(), + s = h.state + try { + await s.edit() + s.addContractBinding('c') + const second = s.loadBindingProducts('c') + h.productRequests[1].resolve([{ id: 'new', productName: '新产品' }]) + await second + h.productRequests[0].resolve([{ id: 'old', productName: '旧产品' }]) + await vue.nextTick() + assert.equal(s.bindingProducts.value.c[0].id, 'new') + const old = s.loadBindingProducts('c') + s.removeContractBinding(0) + s.addContractBinding('c') + h.productRequests[2].resolve([{ id: 'removed', productName: '移除前' }]) + await old + assert.equal(s.bindingProducts.value.c, undefined) + assert.equal(s.bindingProductLoading.value.c, true) + h.productRequests[3].resolve([{ id: 'readded', productName: '重加后' }]) + await vue.nextTick() + assert.equal(s.bindingProducts.value.c[0].id, 'readded') + } finally { + h.stop() + } +}) + +test('产品加载失败可再次展开重试,加载中不能改选择', async () => { + const h = harness(), + s = h.state + try { + await s.edit() + s.addContractBinding('c') + h.productRequests[0].reject(new Error('network')) + await vue.nextTick() + await vue.nextTick() + assert.equal(s.bindingProductLoading.value.c, false) + const retry = s.loadBindingProducts('c') + s.setBindingProducts(0, ['invalid']) + assert.deepEqual(s.form.value.contractBindings[0].products, []) + h.productRequests[1].resolve([{ id: 'p', productName: '产品' }]) + await retry + s.setBindingProducts(0, ['p']) + assert.equal(s.form.value.contractBindings[0].products[0].contractProductId, 'p') + } finally { + h.stop() + } +}) diff --git a/web-admin/src/views/pl/quota-cert/index.vue b/web-admin/src/views/pl/quota-cert/index.vue index 40f87e38e..8380d31bb 100644 --- a/web-admin/src/views/pl/quota-cert/index.vue +++ b/web-admin/src/views/pl/quota-cert/index.vue @@ -300,9 +300,8 @@