附加费结算:筛选字段可自选显示(筛选设置) (#321)
This commit is contained in:
parent
bbf8c1f16c
commit
8b62ba0504
@ -118,6 +118,7 @@
|
||||
}
|
||||
|
||||
.settlement-field { display: grid; gap: .2rem; min-width: 0; }
|
||||
.settlement-field[hidden] { display: none; }
|
||||
.settlement-field label { color: var(--settlement-muted); font-size: .68rem; font-weight: 600; }
|
||||
.settlement-field input,
|
||||
.settlement-field select {
|
||||
@ -219,19 +220,19 @@
|
||||
</div>
|
||||
|
||||
<form class="settlement-filter-bar" method="GET" action="{{ route('business.pages.show', ['section' => 'courier-payables', 'page' => 'courier-surcharge', 'tab' => 'settlement']) }}" aria-label="附加费结算筛选">
|
||||
<div class="settlement-field"><label for="settlement-courier">快递名称</label><input id="settlement-courier" type="search" name="courier_name" value="{{ $filterValue('courier_name') }}" placeholder="输入快递名称"></div>
|
||||
<div class="settlement-field"><label for="settlement-waybill">单号</label><input id="settlement-waybill" type="search" name="waybill" value="{{ $filterValue('waybill') }}" placeholder="输入单号"></div>
|
||||
<div class="settlement-field"><label for="settlement-platform-product">平台商品ID</label><input id="settlement-platform-product" type="search" name="platform_product_id" value="{{ $filterValue('platform_product_id') }}" placeholder="输入平台商品ID"></div>
|
||||
<div class="settlement-field"><label for="settlement-product-code">商品编码</label><input id="settlement-product-code" type="search" name="product_code" value="{{ $filterValue('product_code') }}" placeholder="输入商品编码"></div>
|
||||
<div class="settlement-field"><label for="settlement-shop">店铺名称</label><input id="settlement-shop" type="search" name="shop_name" value="{{ $filterValue('shop_name') }}" placeholder="输入店铺名称"></div>
|
||||
<div class="settlement-field"><label for="settlement-online-order">线上订单号</label><input id="settlement-online-order" type="search" name="online_order_no" value="{{ $filterValue('online_order_no') }}" placeholder="输入线上订单号"></div>
|
||||
<div class="settlement-field"><label for="settlement-inspection">查件类型</label><input id="settlement-inspection" type="search" name="inspection_type" value="{{ $filterValue('inspection_type') }}" placeholder="一级选项"></div>
|
||||
<div class="settlement-field"><label for="settlement-reason">查件原因</label><input id="settlement-reason" type="search" name="inspection_reason" value="{{ $filterValue('inspection_reason') }}" placeholder="二级选项"></div>
|
||||
<div class="settlement-field"><label for="settlement-surcharge-type">附加费类型</label><select id="settlement-surcharge-type" name="surcharge_type"><option value="">全部附加费类型</option>@foreach (['退回费','拦截费','改地址','上楼费','送货费','超区费','安装费','保费','进仓费','超长费'] as $type)<option value="{{ $type }}" @selected($filterValue('surcharge_type') === $type)>{{ $type }}</option>@endforeach</select></div>
|
||||
<div class="settlement-field"><label for="settlement-status">结算状态</label><select id="settlement-status" name="status"><option value="">全部状态</option>@foreach (['未匹配报价','待核价','已计算'] as $status)<option value="{{ $status }}" @selected($filterValue('status') === $status)>{{ $status }}</option>@endforeach</select></div>
|
||||
<div class="settlement-field"><label for="settlement-created-from">创建日期起</label><input id="settlement-created-from" type="date" name="created_from" value="{{ $filterValue('created_from') }}"></div>
|
||||
<div class="settlement-field"><label for="settlement-created-to">创建日期止</label><input id="settlement-created-to" type="date" name="created_to" value="{{ $filterValue('created_to') }}"></div>
|
||||
<div class="settlement-actions"><button class="settlement-button settlement-button--primary" type="submit"><span class="material-icons-outlined" aria-hidden="true">search</span>查询</button><a class="settlement-button" href="{{ route('business.pages.show', ['section' => 'courier-payables', 'page' => 'courier-surcharge', 'tab' => 'settlement']) }}"><span class="material-icons-outlined" aria-hidden="true">refresh</span>重置</a><a class="settlement-button" href="{{ route('business.courier-surcharge.settlement.export', array_filter($filters, static fn ($value): bool => $value !== '' && $value !== null)) }}" title="按当前筛选导出附加费结算明细(XLSX,仅含已生成结算行的数据;未生成结算行的运单请用导入核验)"><span class="material-icons-outlined" aria-hidden="true">download</span>导出</a></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="courier_name"><label for="settlement-courier">快递名称</label><input id="settlement-courier" type="search" name="courier_name" value="{{ $filterValue('courier_name') }}" placeholder="输入快递名称"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="waybill"><label for="settlement-waybill">单号</label><input id="settlement-waybill" type="search" name="waybill" value="{{ $filterValue('waybill') }}" placeholder="输入单号"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="platform_product_id"><label for="settlement-platform-product">平台商品ID</label><input id="settlement-platform-product" type="search" name="platform_product_id" value="{{ $filterValue('platform_product_id') }}" placeholder="输入平台商品ID"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="product_code"><label for="settlement-product-code">商品编码</label><input id="settlement-product-code" type="search" name="product_code" value="{{ $filterValue('product_code') }}" placeholder="输入商品编码"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="shop_name"><label for="settlement-shop">店铺名称</label><input id="settlement-shop" type="search" name="shop_name" value="{{ $filterValue('shop_name') }}" placeholder="输入店铺名称"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="online_order_no"><label for="settlement-online-order">线上订单号</label><input id="settlement-online-order" type="search" name="online_order_no" value="{{ $filterValue('online_order_no') }}" placeholder="输入线上订单号"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="inspection_type"><label for="settlement-inspection">查件类型</label><input id="settlement-inspection" type="search" name="inspection_type" value="{{ $filterValue('inspection_type') }}" placeholder="一级选项"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="inspection_reason"><label for="settlement-reason">查件原因</label><input id="settlement-reason" type="search" name="inspection_reason" value="{{ $filterValue('inspection_reason') }}" placeholder="二级选项"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="surcharge_type"><label for="settlement-surcharge-type">附加费类型</label><select id="settlement-surcharge-type" name="surcharge_type"><option value="">全部附加费类型</option>@foreach (['退回费','拦截费','改地址','上楼费','送货费','超区费','安装费','保费','进仓费','超长费'] as $type)<option value="{{ $type }}" @selected($filterValue('surcharge_type') === $type)>{{ $type }}</option>@endforeach</select></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="status"><label for="settlement-status">结算状态</label><select id="settlement-status" name="status"><option value="">全部状态</option>@foreach (['未匹配报价','待核价','已计算'] as $status)<option value="{{ $status }}" @selected($filterValue('status') === $status)>{{ $status }}</option>@endforeach</select></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="created_from"><label for="settlement-created-from">创建日期起</label><input id="settlement-created-from" type="date" name="created_from" value="{{ $filterValue('created_from') }}"></div>
|
||||
<div class="settlement-field" data-settlement-filter-field="created_to"><label for="settlement-created-to">创建日期止</label><input id="settlement-created-to" type="date" name="created_to" value="{{ $filterValue('created_to') }}"></div>
|
||||
<div class="settlement-actions"><button class="settlement-button settlement-button--primary" type="submit"><span class="material-icons-outlined" aria-hidden="true">search</span>查询</button><a class="settlement-button" href="{{ route('business.pages.show', ['section' => 'courier-payables', 'page' => 'courier-surcharge', 'tab' => 'settlement']) }}"><span class="material-icons-outlined" aria-hidden="true">refresh</span>重置</a><a class="settlement-button" href="{{ route('business.courier-surcharge.settlement.export', array_filter($filters, static fn ($value): bool => $value !== '' && $value !== null)) }}" title="按当前筛选导出附加费结算明细(XLSX,仅含已生成结算行的数据;未生成结算行的运单请用导入核验)"><span class="material-icons-outlined" aria-hidden="true">download</span>导出</a><div class="finance-table-field-picker settlement-filter-picker" data-settlement-filter-picker data-user="{{ auth()->id() }}"><button type="button" class="settlement-button" aria-expanded="false" title="选择要显示的筛选字段,选择会自动保存"><span class="material-icons-outlined" aria-hidden="true">tune</span>筛选设置</button><div class="finance-table-field-picker__panel" role="group" aria-label="选择筛选字段" hidden>@foreach (['courier_name' => '快递名称', 'waybill' => '单号', 'platform_product_id' => '平台商品ID', 'product_code' => '商品编码', 'shop_name' => '店铺名称', 'online_order_no' => '线上订单号', 'inspection_type' => '查件类型', 'inspection_reason' => '查件原因', 'surcharge_type' => '附加费类型', 'status' => '结算状态', 'created_from' => '创建日期起', 'created_to' => '创建日期止'] as $fieldKey => $fieldLabel)<label class="finance-table-field-picker__option"><input type="checkbox" value="{{ $fieldKey }}" data-settlement-filter-check checked><span>{{ $fieldLabel }}</span></label>@endforeach<div class="finance-table-field-picker__actions"><button type="button" data-settlement-filters-all>全选</button><button type="button" data-settlement-filters-reset>恢复默认</button></div></div></div></div>
|
||||
</form>
|
||||
|
||||
<form class="settlement-import-bar" method="POST" action="{{ route('business.courier-surcharge.settlement.import') }}" enctype="multipart/form-data" aria-label="附加费结算导入核验">
|
||||
@ -312,5 +313,74 @@
|
||||
activate(row);
|
||||
}
|
||||
});
|
||||
|
||||
})();
|
||||
|
||||
(() => {
|
||||
const filterBar = document.querySelector('.settlement-filter-bar');
|
||||
const filterPicker = document.querySelector('[data-settlement-filter-picker]');
|
||||
|
||||
if (filterBar && filterPicker) {
|
||||
const toggle = filterPicker.querySelector('button[aria-expanded]');
|
||||
const panel = filterPicker.querySelector('.finance-table-field-picker__panel');
|
||||
const checks = [...panel.querySelectorAll('input[data-settlement-filter-check]')];
|
||||
const fields = [...filterBar.querySelectorAll('[data-settlement-filter-field]')];
|
||||
const storageKey = 'caiwu:courier-surcharge-settlement:filter-fields:' + (filterPicker.dataset.user || 'anonymous');
|
||||
const defaultKeys = checks.map((check) => check.value);
|
||||
|
||||
const apply = (selected, save) => {
|
||||
fields.forEach((field) => {
|
||||
const visible = selected.has(field.dataset.settlementFilterField);
|
||||
field.hidden = !visible;
|
||||
field.querySelectorAll('input, select').forEach((control) => {
|
||||
if (visible) {
|
||||
control.removeAttribute('disabled');
|
||||
} else {
|
||||
control.setAttribute('disabled', 'disabled');
|
||||
}
|
||||
});
|
||||
});
|
||||
checks.forEach((check) => { check.checked = selected.has(check.value); });
|
||||
if (save) {
|
||||
try { localStorage.setItem(storageKey, JSON.stringify([...selected])); } catch (_) {}
|
||||
}
|
||||
};
|
||||
|
||||
let stored = null;
|
||||
try {
|
||||
const parsed = JSON.parse(localStorage.getItem(storageKey) ?? 'null');
|
||||
if (Array.isArray(parsed)) {
|
||||
stored = new Set(parsed.filter((key) => defaultKeys.includes(key)));
|
||||
}
|
||||
} catch (_) {}
|
||||
|
||||
apply(stored ?? new Set(defaultKeys), false);
|
||||
|
||||
toggle.addEventListener('click', () => {
|
||||
const open = panel.hidden;
|
||||
panel.hidden = !open;
|
||||
toggle.setAttribute('aria-expanded', String(open));
|
||||
});
|
||||
|
||||
document.addEventListener('click', (event) => {
|
||||
if (!panel.hidden && !filterPicker.contains(event.target)) {
|
||||
panel.hidden = true;
|
||||
toggle.setAttribute('aria-expanded', 'false');
|
||||
}
|
||||
});
|
||||
|
||||
checks.forEach((check) => check.addEventListener('change', () => {
|
||||
apply(new Set(checks.filter((item) => item.checked).map((item) => item.value)), true);
|
||||
}));
|
||||
|
||||
panel.querySelector('[data-settlement-filters-all]')?.addEventListener('click', () => {
|
||||
apply(new Set(defaultKeys), true);
|
||||
});
|
||||
|
||||
panel.querySelector('[data-settlement-filters-reset]')?.addEventListener('click', () => {
|
||||
try { localStorage.removeItem(storageKey); } catch (_) {}
|
||||
apply(new Set(defaultKeys), true);
|
||||
});
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
@ -55,6 +55,10 @@ class CourierSurchargeSettlementPageTest extends FeatureTestCase
|
||||
->assertSee('value="测试店铺"', false)
|
||||
->assertSee('value="SO-001"', false)
|
||||
->assertSee('value="已计算" selected', false)
|
||||
->assertSee('data-settlement-filter-picker', false)
|
||||
->assertSee('data-settlement-filter-check', false)
|
||||
->assertSee('data-settlement-filter-field="waybill"', false)
|
||||
->assertSeeText('筛选设置')
|
||||
->assertViewHas('content', fn (array $content) => $content['courierSurchargeSettlementFilters']['status'] === '已计算');
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user