diff --git a/modules/EcommerceFinance/View/SupplierReconciliationPageData.php b/modules/EcommerceFinance/View/SupplierReconciliationPageData.php index 066fd6b0..e39e037d 100644 --- a/modules/EcommerceFinance/View/SupplierReconciliationPageData.php +++ b/modules/EcommerceFinance/View/SupplierReconciliationPageData.php @@ -346,6 +346,9 @@ class SupplierReconciliationPageData $total = 0.0; $confirmedAmount = 0.0; $disputedAmount = 0.0; + $returnQuantity = 0.0; + $confirmedQuantity = 0.0; + $disputedQuantity = 0.0; $disputedCount = 0; $confirmedCount = 0; @@ -356,14 +359,18 @@ class SupplierReconciliationPageData $deduction = $row['_accounting_target'] === '不记账' ? 0.0 : (float) $row['_supplier_amount']; + $quantity = (float) $row['_supplier_qty']; $status = (string) ($row['_status'] ?? ''); $total += $deduction; + $returnQuantity += $quantity; if ($status === SupplierReturnConfirmation::STATUS_CONFIRMED) { $confirmedAmount += $deduction; + $confirmedQuantity += $quantity; $confirmedCount++; } elseif ($status === SupplierReturnConfirmation::STATUS_DISPUTED) { $disputedAmount += $deduction; + $disputedQuantity += $quantity; $disputedCount++; } @@ -386,6 +393,11 @@ class SupplierReconciliationPageData 'total_rows' => count($returnRows), 'all_rows' => $allRows, 'total_amount' => round($total, 2), + 'return_qty' => round($returnQuantity, 2), + 'confirmed_qty' => round($confirmedQuantity, 2), + 'disputed_qty' => round($disputedQuantity, 2), + 'pending_qty' => round(max($returnQuantity - $confirmedQuantity - $disputedQuantity, 0), 2), + 'pending_amount' => round(max($total - $confirmedAmount - $disputedAmount, 0), 2), 'confirmed_count' => $confirmedCount, 'confirmed_amount' => round($confirmedAmount, 2), 'disputed_count' => $disputedCount, diff --git a/resources/views/business/pages/supplier-reconciliation/supplier-data.blade.php b/resources/views/business/pages/supplier-reconciliation/supplier-data.blade.php index a0593552..76c88000 100644 --- a/resources/views/business/pages/supplier-reconciliation/supplier-data.blade.php +++ b/resources/views/business/pages/supplier-reconciliation/supplier-data.blade.php @@ -1,4 +1,11 @@
+ @php + $formatReturnQty = static function (mixed $value): string { + $quantity = (float) $value; + + return number_format($quantity, abs($quantity - round($quantity)) < 0.00001 ? 0 : 2); + }; + @endphp @@ -80,7 +96,8 @@ @else 当前还没有上传过对账单。 @endif - 退货明细:共 {{ number_format($returnPanel['total_rows']) }} 行 + 退货件数:{{ $formatReturnQty($returnPanel['return_qty']) }} 件 + 退货金额:¥{{ number_format($returnPanel['total_amount'], 2) }}
@@ -89,17 +106,39 @@

这里展示本厂家的全部退货数据(包含待确认、已确认和异议中),按导入顺序排列。 @if ($returnPanel['is_filtered']) - 当前筛选出 {{ number_format($returnPanel['total_rows']) }} 行。 + 当前筛选结果:{{ $formatReturnQty($returnPanel['return_qty']) }} 件,退货金额 ¥{{ number_format($returnPanel['total_amount'], 2) }}。 @endif

-
- 退货合计 {{ number_format($returnPanel['total_rows']) }} 行 - 扣减合计 ¥{{ number_format($returnPanel['total_amount'], 2) }} - 已确认 {{ $returnPanel['confirmed_count'] }} 行(¥{{ number_format($returnPanel['confirmed_amount'], 2) }}) - 异议 {{ $returnPanel['disputed_count'] }} 行(暂不扣减 ¥{{ number_format($returnPanel['disputed_amount'], 2) }}) - 待确认 {{ max($returnPanel['total_rows'] - $returnPanel['confirmed_count'] - $returnPanel['disputed_count'], 0) }} 行 +
+
+ 退货件数 + {{ $formatReturnQty($returnPanel['return_qty']) }}件 +
+
+ 退货金额 + ¥{{ number_format($returnPanel['total_amount'], 2) }} +
+
+ 已确认 + {{ $formatReturnQty($returnPanel['confirmed_qty']) }}件 + ¥{{ number_format($returnPanel['confirmed_amount'], 2) }} +
+
+ 异议中 + {{ $formatReturnQty($returnPanel['disputed_qty']) }}件 + ¥{{ number_format($returnPanel['disputed_amount'], 2) }} +
+
+ 待确认 + {{ $formatReturnQty($returnPanel['pending_qty']) }}件 + ¥{{ number_format($returnPanel['pending_amount'], 2) }} +
@if ($returnPanel['accounting_summary']['logistics_rows'] > 0) - 转物流记账 {{ $returnPanel['accounting_summary']['logistics_rows'] }} 行,{{ number_format($returnPanel['accounting_summary']['logistics_qty'], 2) }} 件(¥{{ number_format($returnPanel['accounting_summary']['logistics_amount'], 2) }}) +
+ 转物流记账 + {{ $formatReturnQty($returnPanel['accounting_summary']['logistics_qty']) }}件 + ¥{{ number_format($returnPanel['accounting_summary']['logistics_amount'], 2) }} +
@endif
@@ -140,7 +179,7 @@ 重置 - 导出当前筛选结果({{ number_format($returnPanel['total_rows']) }} 行) + 导出当前筛选结果
diff --git a/tests/Feature/Business/SupplierReconciliationTest.php b/tests/Feature/Business/SupplierReconciliationTest.php index aecb1b36..d76ac10b 100644 --- a/tests/Feature/Business/SupplierReconciliationTest.php +++ b/tests/Feature/Business/SupplierReconciliationTest.php @@ -132,7 +132,7 @@ class SupplierReconciliationTest extends FeatureTestCase ->assertSeeText('厂家对账单 · 上传与实时数据') ->assertSeeText('上传记录') ->assertSeeText('退货扣减确认') - ->assertSeeText('合计扣减') + ->assertSeeText('退货金额') ->assertSeeText('全部确认无异议') ->assertSeeText('待确认') ->assertSeeText('条形码') @@ -525,11 +525,11 @@ class SupplierReconciliationTest extends FeatureTestCase $this->loginAs()->get(route('business.pages.show', $filters)) ->assertOk() - ->assertSeeText('筛选出 19 行,全部 21 行') + ->assertSeeText('当前筛选 19 件,退货金额 ¥1,900.00') ->assertSeeText('MATCH-01') ->assertDontSeeText('MATCH-20') ->assertDontSeeText('OTHER-01') - ->assertSeeText('导出当前筛选结果(19 行)'); + ->assertSeeText('导出当前筛选结果'); $this->loginAs()->get(route('business.pages.show', $filters + ['return_page' => 2])) ->assertOk() @@ -539,6 +539,66 @@ class SupplierReconciliationTest extends FeatureTestCase ->assertSee('return_status=pending', false); } + public function test_return_summary_uses_quantity_and_amount_without_row_counts(): void + { + $store = app(SupplierPayableOverrideStore::class); + $companyId = (int) $this->company->id; + $rows = [ + 'summary:1' => ['qty' => '2', 'amount' => '200'], + 'summary:2' => ['qty' => '3', 'amount' => '300'], + 'summary:3' => ['qty' => '1', 'amount' => '50'], + 'summary:4' => ['qty' => '4', 'amount' => '400'], + ]; + foreach ($rows as $key => $values) { + $store->save('final:supplier:return-reconciliation', $key, $values + [ + 'summary_month' => '2026-09', + 'send_time' => '2026-09-20', + 'supplier' => '晨丰', + 'barcode' => strtoupper($key), + 'unit_price' => '100', + ], $companyId, null); + } + + $confirmations = app(\Modules\EcommerceFinance\Services\SupplierReturnConfirmation::class); + $confirmations->mark('晨丰', 'summary:1', 'confirmed', $companyId, null); + $confirmations->mark('晨丰', 'summary:3', 'disputed', $companyId, null); + + $vendor = $this->createVendorPortalUser('晨丰'); + $portal = $this->loginAs($vendor)->get(route('portal.supplier-reconciliation.index', [ + 'company_id' => $companyId, + ])); + $portal->assertOk() + ->assertSeeText('退货件数') + ->assertSeeText('退货金额') + ->assertSee('10件', false) + ->assertSeeText('¥950.00') + ->assertSee('2件', false) + ->assertSeeText('¥200.00') + ->assertSee('1件', false) + ->assertSeeText('¥50.00') + ->assertSee('7件', false) + ->assertSeeText('¥700.00') + ->assertDontSeeText('退货合计') + ->assertDontSeeText('扣减合计') + ->assertDontSeeText('已确认 2 行') + ->assertDontSeeText('异议 1 行') + ->assertDontSeeText('待确认 3 行'); + + $this->loginAs()->get(route('business.pages.show', [ + 'company_id' => $companyId, + 'section' => 'supplier-reconciliation', + 'page' => 'supplier-data', + 'supplier' => '晨丰', + ])) + ->assertOk() + ->assertSeeText('退货件数') + ->assertSeeText('退货金额') + ->assertSee('10件', false) + ->assertSeeText('¥950.00') + ->assertDontSeeText('退货合计') + ->assertDontSeeText('扣减合计'); + } + public function test_confirm_all_only_applies_to_the_current_return_filter(): void { $store = app(SupplierPayableOverrideStore::class); @@ -655,7 +715,7 @@ class SupplierReconciliationTest extends FeatureTestCase 'supplier' => '晨丰', ]))->assertOk(); - $page()->assertSeeText('合计扣减 ¥2,653.00'); + $page()->assertSeeText('退货金额')->assertSeeText('¥2,653.00'); $this->loginAs() ->post(route('business.supplier-reconciliation.return.confirm'), ['supplier' => '晨丰', 'key' => 'return:1'])