From aa0dc973d0a1775d89c7067b45a2e8fbf94fbc39 Mon Sep 17 00:00:00 2001 From: yueyang <2495544247@qq.com> Date: Sat, 24 Oct 2026 19:22:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=9A=E7=BB=A9=E6=98=8E=E7=BB=86=E8=B4=A6?= =?UTF-8?q?=E5=8D=95=E6=B1=87=E6=80=BB=E5=A2=9E=E5=8A=A0=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/partials/directory-table.blade.php | 28 +++++++--- .../PerformanceDetailsMetricDetailsTest.php | 56 +++++++++++++++++-- 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/resources/views/business/pages/partials/directory-table.blade.php b/resources/views/business/pages/partials/directory-table.blade.php index cff8850e..10bdc0bf 100644 --- a/resources/views/business/pages/partials/directory-table.blade.php +++ b/resources/views/business/pages/partials/directory-table.blade.php @@ -1553,6 +1553,7 @@ + @@ -1584,7 +1585,7 @@
- 共 0 个账单名称 + 共 0 条平台账单汇总
@@ -2347,7 +2348,7 @@ title.textContent = label + ' · 明细汇总'; subtitle.textContent = '按平台、店铺和账单名称汇总'; currentTotalEl.textContent = '…'; - countEl.textContent = '正在读取账单名称'; + countEl.textContent = '正在读取平台账单汇总'; dialog.setAttribute('aria-busy', 'true'); } @@ -2384,6 +2385,9 @@ summaryRowsEl.replaceChildren(); rows.forEach(function (row) { var tr = document.createElement('tr'); + var platform = document.createElement('td'); + platform.textContent = row.platform || '—'; + tr.appendChild(platform); var billItem = document.createElement('td'); billItem.textContent = row.bill_item || '未命名账单项目'; tr.appendChild(billItem); @@ -2414,7 +2418,7 @@ function updateFooterCount() { countEl.textContent = activeTab === 'summary' - ? '共 ' + summaryCount.toLocaleString('zh-CN') + ' 个账单名称' + ? '共 ' + summaryCount.toLocaleString('zh-CN') + ' 条平台账单汇总' : '共 ' + detailCount.toLocaleString('zh-CN') + ' 条平台店铺明细'; } @@ -2438,15 +2442,25 @@ && (!store || row.store_name === store) && (!billItem || row.bill_item === billItem); }); - var totalsByBillItem = {}; + var totalsByPlatformBillItem = {}; rows.forEach(function (row) { + var platform = row.platform || '—'; var name = row.bill_item || '未命名账单项目'; - totalsByBillItem[name] = (totalsByBillItem[name] || 0) + Number(row.amount || 0); + var key = JSON.stringify([platform, name]); + if (!totalsByPlatformBillItem[key]) { + totalsByPlatformBillItem[key] = { + platform: platform, + bill_item: name, + amount: 0 + }; + } + totalsByPlatformBillItem[key].amount += Number(row.amount || 0); }); - var summaryRows = Object.keys(totalsByBillItem).map(function (name) { - return { bill_item: name, amount: totalsByBillItem[name] }; + var summaryRows = Object.keys(totalsByPlatformBillItem).map(function (key) { + return totalsByPlatformBillItem[key]; }).sort(function (left, right) { return Math.abs(right.amount) - Math.abs(left.amount) + || left.platform.localeCompare(right.platform, 'zh-CN') || left.bill_item.localeCompare(right.bill_item, 'zh-CN'); }); var filteredTotal = summaryRows.reduce(function (sum, row) { diff --git a/tests/Feature/Business/PerformanceDetailsMetricDetailsTest.php b/tests/Feature/Business/PerformanceDetailsMetricDetailsTest.php index d3347b86..ebd5bb38 100644 --- a/tests/Feature/Business/PerformanceDetailsMetricDetailsTest.php +++ b/tests/Feature/Business/PerformanceDetailsMetricDetailsTest.php @@ -75,11 +75,53 @@ class PerformanceDetailsMetricDetailsTest extends FeatureTestCase ], $rows); } - private function row(string $rowKey, string $storeName, float $offset): array + public function test_same_bill_item_is_split_by_platform_for_summary(): void + { + $mirror = DB::connection('business_mirror'); + $mirror->table('store_receipt_order_match_rows')->insert([ + $this->row('row-jd', '京东店铺', -100, '京东账单'), + $this->row('row-pdd', '拼多多店铺', -50, '拼多多'), + ]); + $mirror->table('store_receipt_order_match_metric_details')->insert([ + $this->detail('detail-jd', 'row-jd', '账单扣款', -100, '京东账单'), + $this->detail('detail-pdd', 'row-pdd', '账单扣款', -50, '拼多多'), + ]); + + $response = $this->loginAs()->getJson(route( + 'business.financial-operations.performance-details.metric-details', + [ + 'metric' => 'offset_amount', + 'month' => '2026-09', + ], + )); + + $response + ->assertOk() + ->assertJsonPath('total', -150) + ->assertJsonPath('detail_total', -150) + ->assertJsonPath('balanced', true); + + $this->assertContains([ + 'platform' => '京东账单', + 'store_name' => '京东店铺', + 'bill_item' => '账单扣款', + 'amount' => -100, + 'line_count' => 1, + ], $response->json('rows')); + $this->assertContains([ + 'platform' => '拼多多', + 'store_name' => '拼多多店铺', + 'bill_item' => '账单扣款', + 'amount' => -50, + 'line_count' => 1, + ], $response->json('rows')); + } + + private function row(string $rowKey, string $storeName, float $offset, string $platform = '京东账单'): array { return [ 'report_month' => '2026-09-01', - 'platform' => '京东账单', + 'platform' => $platform, 'row_key' => $rowKey, 'occurred_date' => '2026-09-01', 'store_name' => $storeName, @@ -100,13 +142,19 @@ class PerformanceDetailsMetricDetailsTest extends FeatureTestCase ]; } - private function detail(string $detailKey, string $rowKey, string $billItem, float $amount): array + private function detail( + string $detailKey, + string $rowKey, + string $billItem, + float $amount, + string $platform = '京东账单' + ): array { return [ 'report_month' => '2026-09-01', 'detail_key' => $detailKey, 'row_key' => $rowKey, - 'platform' => '京东账单', + 'platform' => $platform, 'metric' => 'offset', 'bill_item' => $billItem, 'amount' => $amount, -- 2.47.2
平台 账单名称 总金额