- 所有账户页签在「店铺」右侧新增「总账备注」下拉:按(平台+账单项目)翻译成账单项目集合过滤,页面/列设置/导出同口径;淘系支付宝、淘系微信同页签混多平台时按店铺名前缀细分 - 每日账单脚本:胜算超出同步导出上限(url=null+taskId)时自动从「异步导出下载管理」取回本次任务全部分片并合并成一份 CSV,导入前按页面笔数核对(不一致则跳过导入) - 实测:京东 7 月异步导出两片 219158+235846=455004 笔 / 收入 17695094.84 / 支出 8035128.21,与已导入口径一致
86 lines
2.7 KiB
PHP
86 lines
2.7 KiB
PHP
<?php
|
||
|
||
namespace Modules\EcommerceFinance\Http\Concerns;
|
||
|
||
use Modules\EcommerceFinance\Services\AccountLedgerRemarkMap;
|
||
|
||
/**
|
||
* 店铺收款账户账单:给每行账单补「总账备注」(按平台 + 账单项目匹配映射表)。
|
||
*
|
||
* 只在读取时补齐,不改动上游账单与镜像数据。
|
||
*/
|
||
trait DecoratesLedgerRemarks
|
||
{
|
||
/** 「总账备注」在本页签没有对应账单项目时的占位条件(保证命中 0 行)。 */
|
||
private const LEDGER_REMARK_NO_MATCH_ITEM = '__no_such_ledger_remark_item__';
|
||
|
||
protected function ledgerRemarkMap(): AccountLedgerRemarkMap
|
||
{
|
||
return app(AccountLedgerRemarkMap::class);
|
||
}
|
||
|
||
/**
|
||
* 把「总账备注」筛选翻译成账单项目集合。
|
||
*
|
||
* 页面、列设置与导出都调用这里,保证同一份筛选口径;
|
||
* bill_items 供各仓库 whereIn(账单项目) 使用,bill_item_groups 供
|
||
* 淘系这种同一页签混多平台的仓库按店铺名前缀再细分。
|
||
*
|
||
* @param array<string,mixed> $filters
|
||
* @return array<string,mixed>
|
||
*/
|
||
protected function withLedgerRemarkFilter(array $filters, string $tab): array
|
||
{
|
||
$remark = trim((string) ($filters['ledger_remark'] ?? ''));
|
||
if ($remark === '') {
|
||
return $filters;
|
||
}
|
||
|
||
$groups = $this->ledgerRemarkMap()->billItemGroupsForTab($tab, $remark);
|
||
$filters['bill_item_groups'] = $groups;
|
||
|
||
$items = [];
|
||
foreach ($groups as $group) {
|
||
foreach ($group['items'] as $item) {
|
||
$items[$item] = true;
|
||
}
|
||
}
|
||
$filters['bill_items'] = array_keys($items);
|
||
if ($filters['bill_items'] === []) {
|
||
$filters['bill_items'] = [self::LEDGER_REMARK_NO_MATCH_ITEM];
|
||
}
|
||
|
||
return $filters;
|
||
}
|
||
|
||
/**
|
||
* 分页结果(含 data 行数组)补总账备注。
|
||
*
|
||
* @param array<string,mixed> $data
|
||
* @return array<string,mixed>
|
||
*/
|
||
protected function withLedgerRemarks(array $data, string $tab): array
|
||
{
|
||
if (! empty($data['data']) && is_array($data['data'])) {
|
||
$map = $this->ledgerRemarkMap();
|
||
$data['data'] = array_map(
|
||
static fn (mixed $row): mixed => is_array($row) ? $map->decorate($row, $tab) : $row,
|
||
$data['data'],
|
||
);
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* 导出/流式行补总账备注。
|
||
*
|
||
* @param iterable<int,array<string,mixed>> $rows
|
||
* @return iterable<int,array<string,mixed>>
|
||
*/
|
||
protected function ledgerRemarkRows(iterable $rows, string $tab): iterable
|
||
{
|
||
return $this->ledgerRemarkMap()->decorateAll($rows, $tab);
|
||
}
|
||
}
|