CaiWuXiTong/modules/EcommerceFinance/Http/Concerns/DecoratesLedgerRemarks.php
qiuxiang 13a9697447 店铺收款账户账单新增「总账备注」筛选;每日账单脚本支持胜算异步分片导出
- 所有账户页签在「店铺」右侧新增「总账备注」下拉:按(平台+账单项目)翻译成账单项目集合过滤,页面/列设置/导出同口径;淘系支付宝、淘系微信同页签混多平台时按店铺名前缀细分
- 每日账单脚本:胜算超出同步导出上限(url=null+taskId)时自动从「异步导出下载管理」取回本次任务全部分片并合并成一份 CSV,导入前按页面笔数核对(不一致则跳过导入)
- 实测:京东 7 月异步导出两片 219158+235846=455004 笔 / 收入 17695094.84 / 支出 8035128.21,与已导入口径一致
2026-10-06 18:46:57 +08:00

86 lines
2.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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);
}
}