From 2cc3ff41419c05f3d39dc98324e97c6bd1a3c9cb Mon Sep 17 00:00:00 2001 From: zhoushengchen <3057083327@qq.com> Date: Mon, 12 Oct 2026 13:14:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=80=80=E8=B4=A7=E5=8F=96=E4=BB=B6?= =?UTF-8?q?=E7=AE=A1=E7=90=86):=20=E8=AF=A6=E6=83=85=E7=B2=BE=E7=AE=80?= =?UTF-8?q?=E7=BD=AE=E5=BA=95=E3=80=81=E5=BD=93=E5=89=8D=E8=A1=8C=E9=AB=98?= =?UTF-8?q?=E4=BA=AE=E3=80=81=E5=86=85=E9=83=A8=E6=BB=9A=E5=8A=A8=E4=B8=8E?= =?UTF-8?q?=E5=BF=AB=E9=80=92=E5=85=AC=E5=8F=B8=E5=A4=9A=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 详情去掉订单/发件人等大信息块,仅保留明细表格 - 详情面板移到列表下方并加锚点,当前查看行高亮,标题带单号/店铺/快递公司 - 列表与详情表格内部滚动、表头吸顶,减少页面长距离滚动 - 快递公司筛选改为可搜索多选,后端按 whereIn 过滤,导出同步 --- app/Http/Controllers/Business/Pages.php | 5 +- ...ReturnPickupManagementMirrorRepository.php | 11 +- .../return-pickup-management.blade.php | 247 +++++++++--------- .../ReturnPickupManagementPageTest.php | 16 +- 4 files changed, 144 insertions(+), 135 deletions(-) diff --git a/app/Http/Controllers/Business/Pages.php b/app/Http/Controllers/Business/Pages.php index d03eaaa5..d11897b8 100644 --- a/app/Http/Controllers/Business/Pages.php +++ b/app/Http/Controllers/Business/Pages.php @@ -6315,7 +6315,10 @@ class Pages extends Controller $filters = [ 'created_from' => $this->dateFilter($request->query('created_from')), 'created_to' => $this->dateFilter($request->query('created_to')), - 'carrier' => mb_substr(trim((string) $request->query('carrier', '')), 0, 64), + 'carrier' => array_values(array_filter(array_map( + static fn ($carrier): string => mb_substr(trim((string) $carrier), 0, 64), + (array) $request->query('carrier', []), + ), static fn (string $carrier): bool => $carrier !== '')), 'status' => mb_substr(trim((string) $request->query('status', '')), 0, 64), 'shop' => mb_substr(trim((string) $request->query('shop', '')), 0, 191), 'keyword' => mb_substr(trim((string) $request->query('keyword', '')), 0, 100), diff --git a/modules/EcommerceFinance/Repositories/ReturnPickupManagementMirrorRepository.php b/modules/EcommerceFinance/Repositories/ReturnPickupManagementMirrorRepository.php index cf04aef5..24b729c4 100644 --- a/modules/EcommerceFinance/Repositories/ReturnPickupManagementMirrorRepository.php +++ b/modules/EcommerceFinance/Repositories/ReturnPickupManagementMirrorRepository.php @@ -330,7 +330,7 @@ class ReturnPickupManagementMirrorRepository } } - /** @param array $filters */ + /** @param array $filters */ private function filteredQuery(array $filters): Builder { $query = $this->connection->table($this->dataset()->targetTable()); @@ -343,8 +343,13 @@ class ReturnPickupManagementMirrorRepository $query->where('createTime', '<', Carbon::parse($filters['created_to'])->addDay()->toDateString()); } - if (($filters['carrier'] ?? '') !== '') { - $query->where('express_company', $filters['carrier']); + $carriers = array_values(array_filter(array_map( + static fn ($carrier): string => trim((string) $carrier), + (array) ($filters['carrier'] ?? []), + ), static fn (string $carrier): bool => $carrier !== '')); + + if ($carriers !== []) { + $query->whereIn('express_company', $carriers); } if (($filters['status'] ?? '') !== '') { diff --git a/resources/views/business/pages/courier-payables/return-pickup-management.blade.php b/resources/views/business/pages/courier-payables/return-pickup-management.blade.php index ec7d68a9..b90e142e 100644 --- a/resources/views/business/pages/courier-payables/return-pickup-management.blade.php +++ b/resources/views/business/pages/courier-payables/return-pickup-management.blade.php @@ -1,3 +1,5 @@ +@include('business.pages.partials.multi-select') + @php $filters = $returnPickupFilters ?? []; $rows = $returnPickupRows ?? null; @@ -50,7 +52,7 @@ return route('business.pages.show', array_merge( ['section' => 'courier-payables', 'page' => 'return-pickup-management', 'pickup_id' => $id], array_filter($filters, static fn ($value): bool => $value !== '' && $value !== null), - )); + )) . '#return-pickup-detail'; }; $exportUrl = route( @@ -207,6 +209,18 @@ max-height: max(12rem, calc(100vh - 30rem)); } + .return-pickup-table-wrap--scroll { + max-height: max(16rem, min(56vh, 40rem)); + overflow-y: auto; + scrollbar-gutter: stable; + } + + .return-pickup-table-wrap--scroll thead th { + position: sticky; + top: 0; + z-index: 1; + } + .return-pickup-table { width: 100%; min-width: 1880px; @@ -235,6 +249,9 @@ } .return-pickup-table tbody tr:hover { background: #fcfaf5; } + .return-pickup-table tbody tr.is-active { background: var(--vip-content-accent-soft, #f7f0de); } + .return-pickup-table tbody tr.is-active td { border-bottom-color: #e4d7ba; } + .return-pickup-table tbody tr.is-active td:first-child { box-shadow: inset 3px 0 0 var(--vip-content-accent-dark, #856632); } .return-pickup-table .is-code { font-variant-numeric: tabular-nums; } .return-pickup-table .is-clamped { max-width: 220px; overflow: hidden; text-overflow: ellipsis; } .return-pickup-table .is-negative { color: var(--vip-danger, #b80000); font-weight: 600; } @@ -300,21 +317,8 @@ .return-pickup-page-link:hover { border-color: var(--vip-content-accent-dark, #856632); background: var(--vip-content-accent-soft, #f7f0de); } .return-pickup-page-link.is-disabled { opacity: .4; pointer-events: none; } - .return-pickup-detail-meta { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 8px 16px; - padding: 12px 14px; - border-bottom: 1px solid #eeeae3; - } - - .return-pickup-detail-meta div { display: grid; gap: 2px; } - .return-pickup-detail-meta dt { color: var(--vip-content-muted, #595959); font-size: 0.72rem; } - .return-pickup-detail-meta dd { margin: 0; word-break: break-word; white-space: normal; } - @media (max-width: 1200px) { .return-pickup-filters { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .return-pickup-detail-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 720px) { .return-pickup-filters { grid-template-columns: 1fr; } @@ -355,13 +359,16 @@
- - + + + + + + + +
@@ -400,39 +407,94 @@
{{ $error }}
@endif + +
+
+ + + + + + + + + + + + + + + + + + + + + + + @forelse (($rows ?? collect()) as $row) + + + + + + + + + + + + + + + + + + + @empty + + + + @endforelse + +
订单号快递公司紧急程度预计取件时间订单状态退货进度付款方式取件类型店铺名称交易单号总件数发件人发件省实退快递单号创建时间操作
{{ $row->orderId ?: '-' }}{{ $row->express_company ?: '-' }} + {{ $row->urgencyLevel ?: '-' }} + {{ $datetime($row->expectedPickupTime ?? null) }} + + {{ $orderStatusLabels[$row->orderStatus] ?? ($row->orderStatus ?: '-') }} + + {{ $row->expressFollowStatus ?: '-' }}{{ $row->expressFollowResult ? '(' . $row->expressFollowResult . ')' : '' }}{{ $row->paymentMethod ?: '-' }}{{ $row->pickupType ?: '-' }}{{ $row->shopName ?: '-' }}{{ $row->transactionNo ?: '-' }}{{ $row->totalReturnQuantity ?? '-' }}{{ $row->senderName ?: '-' }}{{ $row->province ?: '-' }}{{ $row->returnExpressNo ?: '-' }}{{ $datetime($row->createTime ?? null) }} + 查看 +
+ {{ $error !== null ? '退货取件管理数据暂时无法读取。' : '没有符合筛选条件的退货取件单。' }} +
+
+ + @if ($rows !== null) + + @endif +
+ @if ($detail !== null) @php $main = $detail['main']; @endphp -
+
- 退货取件单详情 · {{ $main->orderId ?? '-' }} + 退货取件单详情 · {{ $main->orderId ?? '-' }} · {{ $main->shopName ?: '-' }} · {{ $main->express_company ?: '-' }} 关闭详情
-
-
订单号
{{ $main->orderId ?? '-' }}
-
快递公司
{{ $main->express_company ?: '-' }}
-
订单状态
{{ $orderStatusLabels[$main->orderStatus] ?? ($main->orderStatus ?: '-') }}
-
紧急程度
{{ $main->urgencyLevel ?: '-' }}
-
店铺
{{ $main->shopName ?: '-' }}
-
交易单号
{{ $main->transactionNo ?: '-' }}
-
总件数
{{ $main->totalReturnQuantity ?? '-' }}
-
实退快递单号
{{ $main->returnExpressNo ?: ($detail['truth_numbers'][0] ?? '-') }}
-
实退单号映射
{{ $detail['truth_numbers'] === [] ? '-' : implode('、', $detail['truth_numbers']) }}
-
付款方式
{{ $main->paymentMethod ?: '-' }}
-
取件类型
{{ $main->pickupType ?: '-' }}
-
预计取件时间
{{ $datetime($main->expectedPickupTime ?? null) }}
-
快递下单 / 取件时间
{{ $datetime($main->expressOrderTime ?? null) }} / {{ $datetime($main->expressPickupTime ?? null) }}
-
发件人
{{ $main->senderName ?: '-' }} {{ $main->senderPhone ?: '' }}
-
发件地址
{{ trim(($main->province ?? '') . ($main->city ?? '') . ($main->district ?? '') . ($main->street ?? '') . ($main->address ?? '')) ?: '-' }}
-
问题类型 / 描述
{{ $main->issueType ?: '-' }} {{ $main->issueDescription ?: '' }}
-
问题跟进
{{ $main->expressFollowStatus ?: '-' }} / {{ $main->expressFollowResult ?: '-' }}
-
问题跟进说明
{{ $main->expressFollowDescription ?: '-' }}
-
备注
{{ $main->note ?: '-' }}
-
创建 / 更新
{{ $datetime($main->createTime ?? null) }} / {{ $datetime($main->updateTime ?? null) }}
-
创建人 / 取消人
{{ $main->creator ?: '-' }} / {{ $main->canceler ?: '-' }}
-
-
+
@@ -538,81 +600,18 @@ @endif - -
-
-
- - - - - - - - - - - - - - - - - - - - - - @forelse (($rows ?? collect()) as $row) - - - - - - - - - - - - - - - - - - - @empty - - - - @endforelse - -
订单号快递公司紧急程度预计取件时间订单状态退货进度付款方式取件类型店铺名称交易单号总件数发件人发件省实退快递单号创建时间操作
{{ $row->orderId ?: '-' }}{{ $row->express_company ?: '-' }} - {{ $row->urgencyLevel ?: '-' }} - {{ $datetime($row->expectedPickupTime ?? null) }} - - {{ $orderStatusLabels[$row->orderStatus] ?? ($row->orderStatus ?: '-') }} - - {{ $row->expressFollowStatus ?: '-' }}{{ $row->expressFollowResult ? '(' . $row->expressFollowResult . ')' : '' }}{{ $row->paymentMethod ?: '-' }}{{ $row->pickupType ?: '-' }}{{ $row->shopName ?: '-' }}{{ $row->transactionNo ?: '-' }}{{ $row->totalReturnQuantity ?? '-' }}{{ $row->senderName ?: '-' }}{{ $row->province ?: '-' }}{{ $row->returnExpressNo ?: '-' }}{{ $datetime($row->createTime ?? null) }} - 查看 -
- {{ $error !== null ? '退货取件管理数据暂时无法读取。' : '没有符合筛选条件的退货取件单。' }} -
-
- - @if ($rows !== null) - - @endif -
+ + diff --git a/tests/Feature/Business/ReturnPickupManagementPageTest.php b/tests/Feature/Business/ReturnPickupManagementPageTest.php index 7a52ea8e..fc7b9c1d 100644 --- a/tests/Feature/Business/ReturnPickupManagementPageTest.php +++ b/tests/Feature/Business/ReturnPickupManagementPageTest.php @@ -110,7 +110,7 @@ class ReturnPickupManagementPageTest extends FeatureTestCase $repository->shouldReceive('paginate') ->once() ->withArgs(function (array $filters, int $page, int $limit): bool { - return $filters['carrier'] === '中通快运' + return $filters['carrier'] === ['中通快运', '速寄递'] && $filters['keyword'] === 'E202610020090' && $filters['created_from'] === '2026-10-01' && $page === 1 @@ -208,18 +208,23 @@ class ReturnPickupManagementPageTest extends FeatureTestCase ->get(route('business.pages.show', [ 'section' => 'courier-payables', 'page' => 'return-pickup-management', - 'carrier' => '中通快运', + 'carrier' => ['中通快运', '速寄递'], 'keyword' => 'E202610020090', 'created_from' => '2026-10-01', 'pickup_id' => 307390, ])) ->assertOk() + ->assertSee('id="pickupCarrierFilter"', false) + ->assertSee('data-name="carrier"', false) ->assertSeeText('同步正常') ->assertSeeText('待快递下单') ->assertSeeText('E202610020090') ->assertSeeText('天猫-欧意朗旗舰店') ->assertSeeText('第 1 / 1 页,本页 1 条,共 1 条') ->assertSeeText('退货取件单详情') + ->assertSee('id="return-pickup-detail"', false) + ->assertSee('is-active', false) + ->assertSee('return-pickup-table-wrap--scroll', false) ->assertSeeText('SG007027') ->assertSeeText('SF-RMA-0001') ->assertSeeText('3316448031005001855') @@ -229,8 +234,6 @@ class ReturnPickupManagementPageTest extends FeatureTestCase ->assertSeeText('实退货号') ->assertSeeText('简尚-POP仓') ->assertSeeText('总件数') - ->assertSeeText('已与客户确认上门时间') - ->assertSeeText('客户要求下午上门') ->assertSeeText('长') ->assertSeeText('93.00') ->assertSeeText('13.00') @@ -251,8 +254,7 @@ class ReturnPickupManagementPageTest extends FeatureTestCase ->assertSeeText('19.00') ->assertSeeText('9.00') ->assertSeeText('1.70') - ->assertSeeText('SF1234567890') - ->assertSee('value="中通快运" selected', false) + ->assertSee('data-initial="["中通快运","速寄递"]"', false) ->assertSee('value="2026-10-01"', false); } @@ -357,7 +359,7 @@ class ReturnPickupManagementPageTest extends FeatureTestCase $repository->shouldReceive('exportRows') ->once() ->withArgs(static function (array $filters): bool { - return ($filters['carrier'] ?? '') === '中通快运'; + return ($filters['carrier'] ?? []) === ['中通快运']; }) ->andReturn((function (): \Generator { yield (object) [ -- 2.47.2