修复店铺收款账户账单日期筛选 #254

Merged
qiuxiang merged 2 commits from fix/codex-account-bill-export-scope into main 2026-09-23 17:44:47 +08:00
3 changed files with 14 additions and 8 deletions

View File

@ -176,9 +176,14 @@ class AccountBills extends Controller
if (! is_array($requested)) {
$requested = [];
}
if ($requested !== []) {
$requested = collect($requested)->unique()->values();
$invalid = $requested->reject(fn (string $field): bool => $available->has($field));
abort_if($invalid->isNotEmpty(), 422, '包含不可导出的字段:' . $invalid->implode('、'));
}
$columns = $requested === []
? $available->values()
: collect($requested)->unique()->map(fn (string $field) => $available->get($field))->filter()->values();
: $requested->map(fn (string $field) => $available->get($field))->values();
abort_if($columns->isEmpty(), 422, '至少选择一个可导出的字段。');
@ -311,10 +316,9 @@ class AccountBills extends Controller
$selected = $columns;
} else {
$columnsByField = $columns->keyBy('field');
$selected = $requested
->map(static fn (string $field) => $columnsByField->get($field))
->filter(static fn ($column): bool => is_array($column))
->values();
$invalid = $requested->reject(static fn (string $field): bool => $columnsByField->has($field));
abort_if($invalid->isNotEmpty(), 422, '包含不可导出的字段:' . $invalid->implode('、'));
$selected = $requested->map(static fn (string $field) => $columnsByField->get($field))->values();
abort_if($selected->isEmpty(), 422, '未选择有效的导出字段。');
}

View File

@ -81,7 +81,9 @@ export default {
data(){return{loading:false,loadError:false,sync:null,rows:[],sourceColumns:[],configuredColumns:[],columnsTitle:'',sourceGroups:[],summary:{income:0,expense:0,balance:0,count:0},total:0,currentPage:1,lastPage:1,perPage:20,filters:emptyFilters(this.billType),queryFilters:emptyFilters(this.billType),resultFilters:null,filterOptions:{shops:[],bill_items:[]},filterOptionsLoading:false,filterOptionsError:false,requestSerial:0,sort:{key:'occurred_at',dir:'desc'},exportMode:'filtered-visible'};},
computed:{
isDouyin(){return this.billType==='douyin';},
usesStableDateControl(){return ['pinduoduo','dewu'].indexOf(this.billType)!==-1;},
// Every account-bill tab uses the same explicit picker path. Keeping one
// control avoids browser-native date inputs appearing on older tabs.
usesStableDateControl(){return true;},
usesMirrorOptions(){return ['douyin','pinduoduo','dewu','jd-transactions','jd-wallet'].indexOf(this.billType)!==-1;},
invalidDateRange(){return Boolean(this.filters.start&&this.filters.end&&this.filters.start>this.filters.end);},
startDateConfig(){return {...dateConfig,maxDate:this.filters.end||null};},

View File

@ -122,13 +122,13 @@ test('calendar selection submits both bounds, resets pagination and preserves da
assert.equal(opened, true);
});
test('authoritative pinduoduo and dewu pages enable the stable full-control date picker treatment', () => {
test('all account-bill pages enable the stable full-control date picker treatment', () => {
const { instance: pinduoduo } = component(async () => response(), 'pinduoduo');
const { instance: dewu } = component(async () => response(), 'dewu');
const { instance: douyin } = component(async () => response(), 'douyin');
assert.equal(pinduoduo.usesStableDateControl, true);
assert.equal(dewu.usesStableDateControl, true);
assert.equal(douyin.usesStableDateControl, false);
assert.equal(douyin.usesStableDateControl, true);
assert.match(sfc.template.content, /is-stable-date/);
assert.match(source, /\.tw-date\.is-stable-date \.tw-date-control/);
});