CaiWuXiTong/modules/EcommerceFinance/View/SupplierBookkeepingConfigPageData.php
limeng 09b4ffcb8a 供应商应付-厂家记账:新增厂家记账配置并按配置判定厂家扣款
- 新增配置表 business_supplier_bookkeeping_configs(+ 操作日志表),迁移时导入财务提供的 209 家存量配置
- 记账方式:正常记账 / 仅代发仓发错货记账 / 不记账,支持生效期;配置页支持新增、编辑、删除恢复、Excel 导入导出
- 扣款判定:厂家记账按供应商配置,仅正常记账扣款;仓库记账仅订单发货仓库为代发仓且二级原因含“仓库发错货”时作为厂家扣款项,其余不扣
- 未配置/生效期外显示待配置,多供应商判定不一致显示待确认,均不计入扣款金额
- 明细页新增厂家扣款判定筛选、扣款工单数与扣款金额指标、导出列

涉及:数据库迁移(新建配置表并写入存量配置)、金额汇总展示;不涉及上游写入和权限模型。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JouFR6TJ7vGscRJanYScEo
2026-10-19 10:38:36 +08:00

39 lines
1.7 KiB
PHP

<?php
namespace Modules\EcommerceFinance\View;
use Modules\EcommerceFinance\Services\SupplierBookkeepingConfigStore;
use Modules\EcommerceFinance\Services\SupplierBookkeepingDeductionRule as Rule;
/** 供应商应付 → 厂家记账 → 厂家记账配置。 */
class SupplierBookkeepingConfigPageData
{
public function __construct(private readonly SupplierBookkeepingConfigStore $store) {}
/** @return array{supplier_name:string,mode:string,deleted_status:string} */
public function filters(): array
{
$text = static fn (string $key): string => mb_substr(trim((string) request()->query($key, '')), 0, 191);
$filters = ['supplier_name' => $text('supplier_name'), 'mode' => $text('mode'), 'deleted_status' => $text('deleted_status') ?: 'active'];
abort_unless($filters['mode'] === '' || isset(Rule::MODES[$filters['mode']]), 422, '记账方式无效。');
abort_unless(in_array($filters['deleted_status'], ['active', 'deleted', 'all'], true), 422, '删除状态无效。');
return $filters;
}
public function page(): array
{
$filters = $this->filters();
$counts = $this->store->query()->whereNull('deleted_at')->selectRaw('mode, COUNT(*) AS total')->groupBy('mode')->pluck('total', 'mode')->all();
return [
'view' => 'business.pages.supplier-payables.manufacturer-bookkeeping',
'bookkeepingView' => 'config',
'configFilters' => $filters,
'configCounts' => $counts,
'configRows' => $this->store->filtered($filters)->paginate(50, ['*'], 'page')->withQueryString(),
'configEvents' => $this->store->events()->paginate(20, ['*'], 'event_page')->withQueryString(),
];
}
}