251 lines
12 KiB
PHP
251 lines
12 KiB
PHP
<?php
|
||
|
||
namespace Modules\EcommerceFinance;
|
||
|
||
/**
|
||
* 店铺收款账户账单 - 各账户类型的列配置(单一数据源)。
|
||
*
|
||
* 列定义来自「账单抬头.xlsx」的各子表(sheet 名 = 账户类型)。
|
||
* sheet 名 ↔ tab slug ↔ 列 三者在此一一对应,避免错乱。
|
||
*
|
||
* 账户可选配置分组表头 groups,字段列统一由 columns 定义。
|
||
* 每列: [label, field, kind]
|
||
* field: 真实列名(如 record_code / income / occurred_at / updated_at),
|
||
* 或 'payload.xxx' 表示存在 payload JSON 中。
|
||
* kind: text | num | money | money_in | money_out | balance | date | tag
|
||
*
|
||
* 淘系支付宝账户(taobao-alipay)已有独立实现,不在此处定义。
|
||
*/
|
||
class AccountBillColumns
|
||
{
|
||
/**
|
||
* @return array<string,array{title:string,groups?:array<int,array{0:string,1:int}>,columns:array<int,array{0:string,1:string,2:string}>}>
|
||
*/
|
||
public static function map(): array
|
||
{
|
||
return [
|
||
'taobao-wechat' => [
|
||
'title' => '淘系微信账户',
|
||
'groups' => [
|
||
['基础信息', 7],
|
||
['账户与交易', 5],
|
||
['金额', 2],
|
||
['业务关联', 2],
|
||
['维护信息', 2],
|
||
],
|
||
'columns' => [
|
||
['记录编码', 'record_code', 'num'],
|
||
['店铺', 'store_name', 'text'],
|
||
['财务备注', 'finance_remark', 'text'],
|
||
['订单号', 'order_no', 'num'],
|
||
['金额', 'amount', 'money'],
|
||
['自定义备注', 'custom_remark', 'text'],
|
||
['账单项目', 'bill_item', 'tag'],
|
||
['线上单号', 'payload.online_order_no', 'num'],
|
||
['淘宝订单编号', 'payload.taobao_order_no', 'num'],
|
||
['支付流水号', 'payload.pay_serial_no', 'num'],
|
||
['入账时间', 'occurred_at', 'date'],
|
||
['入账类型', 'payload.entry_type', 'text'],
|
||
['收入金额', 'income', 'money_in'],
|
||
['支出金额', 'expense', 'money_out'],
|
||
['业务描述', 'payload.business_desc', 'text'],
|
||
['备注', 'remark', 'text'],
|
||
['JST拉取时间', 'payload.jst_pulled_at', 'date'],
|
||
['修改人', 'modifier', 'text'],
|
||
],
|
||
],
|
||
|
||
'pinduoduo' => [
|
||
'title' => '拼多多账户',
|
||
'columns' => [
|
||
['记录编码', 'record_code', 'num'],
|
||
['店铺', 'store_name', 'text'],
|
||
['财务备注', 'finance_remark', 'text'],
|
||
['订单', 'order_no', 'num'],
|
||
['金额', 'amount', 'money'],
|
||
['自定义备注', 'custom_remark', 'text'],
|
||
['账单项目', 'bill_item', 'tag'],
|
||
['商户订单号', 'payload.merchant_order_no', 'num'],
|
||
['线上单号', 'payload.online_order_no', 'num'],
|
||
['财务类型', 'payload.finance_type', 'text'],
|
||
['类型', 'payload.type', 'text'],
|
||
['发生时间', 'occurred_at', 'date'],
|
||
['收入金额', 'income', 'money_in'],
|
||
['支出金额', 'expense', 'money_out'],
|
||
['备注', 'remark', 'text'],
|
||
['修改时间', 'updated_at', 'date'],
|
||
['修改人', 'modifier', 'text'],
|
||
],
|
||
],
|
||
|
||
'jd-wallet' => [
|
||
'title' => '京东网银钱包账户',
|
||
'columns' => [
|
||
['记录编码', 'record_code', 'num'],
|
||
['店铺', 'store_name', 'text'],
|
||
['财务备注', 'finance_remark', 'text'],
|
||
['订单', 'order_no', 'num'],
|
||
['金额', 'amount', 'money'],
|
||
['自定义备注', 'custom_remark', 'text'],
|
||
['账单项目', 'bill_item', 'tag'],
|
||
['线上单号', 'payload.online_order_no', 'num'],
|
||
['单据编号', 'payload.doc_no', 'num'],
|
||
['订单编号', 'payload.order_no_2', 'num'],
|
||
['商户订单号', 'payload.merchant_order_no', 'num'],
|
||
['单据类型', 'payload.doc_type', 'text'],
|
||
['商品编码', 'payload.goods_code', 'num'],
|
||
['商品名称', 'payload.goods_name', 'text'],
|
||
['费用结算时间', 'occurred_at', 'date'],
|
||
['费用发生时间', 'payload.fee_occurred_at', 'date'],
|
||
['费用项', 'payload.fee_item', 'text'],
|
||
['收入金额', 'income', 'money_in'],
|
||
['支出金额', 'expense', 'money_out'],
|
||
['币种', 'payload.currency', 'text'],
|
||
['钱包结算备注', 'payload.wallet_remark', 'text'],
|
||
['备注', 'remark', 'text'],
|
||
['店铺号', 'payload.store_no', 'num'],
|
||
['京东门店编码', 'payload.jd_store_code', 'num'],
|
||
['品牌门店编号', 'payload.brand_store_no', 'num'],
|
||
['门店名称', 'payload.store_name_2', 'text'],
|
||
['账户代码', 'payload.account_code', 'num'],
|
||
['修改时间', 'updated_at', 'date'],
|
||
['修改人', 'modifier', 'text'],
|
||
],
|
||
],
|
||
|
||
'jd-transactions' => [
|
||
'title' => '京东流水',
|
||
'columns' => [
|
||
['记录编码', 'record_code', 'num'],
|
||
['店铺', 'store_name', 'text'],
|
||
['财务备注', 'finance_remark', 'text'],
|
||
['订单', 'order_no', 'num'],
|
||
['金额', 'amount', 'money'],
|
||
['自定义备注', 'custom_remark', 'text'],
|
||
['账单项目', 'bill_item', 'tag'],
|
||
['线上单号', 'payload.online_order_no', 'num'],
|
||
['流水号', 'payload.serial_no', 'num'],
|
||
['交易订单号', 'payload.tx_order_no', 'num'],
|
||
['账户名称', 'payload.account_name', 'text'],
|
||
['费用结算时间', 'occurred_at', 'date'],
|
||
['账单日期', 'payload.bill_date', 'date'],
|
||
['商户订单号', 'payload.merchant_order_no', 'num'],
|
||
['交易备注', 'payload.tx_remark', 'text'],
|
||
['交易类型', 'payload.tx_type', 'text'],
|
||
['收入金额', 'income', 'money_in'],
|
||
['支出金额', 'expense', 'money_out'],
|
||
['账户余额', 'balance', 'balance'],
|
||
['币种', 'payload.currency', 'text'],
|
||
['记账请求号', 'payload.book_request_no', 'num'],
|
||
['业务订单号', 'payload.business_order_no', 'num'],
|
||
['修改时间', 'updated_at', 'date'],
|
||
['修改人', 'modifier', 'text'],
|
||
],
|
||
],
|
||
|
||
'douyin' => [
|
||
'title' => '抖音账户',
|
||
'columns' => [
|
||
['记录编码', 'record_code', 'num'],
|
||
['店铺', 'store_name', 'text'],
|
||
['财务备注', 'finance_remark', 'text'],
|
||
['订单', 'order_no', 'num'],
|
||
['金额', 'amount', 'money'],
|
||
['自定义备注', 'custom_remark', 'text'],
|
||
['商户主体名称', 'payload.merchant_name', 'text'],
|
||
['账单项目', 'bill_item', 'tag'],
|
||
['动账流水号', 'payload.move_serial_no', 'num'],
|
||
['订单号', 'payload.order_no_2', 'num'],
|
||
['线上单号', 'payload.online_order_no', 'num'],
|
||
['子订单号', 'payload.sub_order_no', 'num'],
|
||
['商品ID', 'payload.goods_id', 'num'],
|
||
['账务类型', 'payload.account_type', 'text'],
|
||
['结算时间', 'occurred_at', 'date'],
|
||
['动账摘要', 'payload.move_summary', 'text'],
|
||
['下单时间', 'payload.order_placed_at', 'date'],
|
||
['业务类型', 'payload.business_type', 'text'],
|
||
['结算账户', 'payload.settle_account', 'text'],
|
||
['动账场景', 'payload.move_scene', 'text'],
|
||
['达人ID', 'payload.talent_id', 'num'],
|
||
['达人名称', 'payload.talent_name', 'text'],
|
||
['备注', 'remark', 'text'],
|
||
['收入', 'income', 'money_in'],
|
||
['支出', 'expense', 'money_out'],
|
||
['创建时间', 'created_at', 'date'],
|
||
['修改时间', 'updated_at', 'date'],
|
||
['修改人', 'modifier', 'text'],
|
||
],
|
||
],
|
||
|
||
'dewu' => [
|
||
'title' => '得物账户',
|
||
'columns' => [
|
||
['记录编码', 'record_code', 'num'],
|
||
['店铺', 'store_name', 'text'],
|
||
['财务备注', 'finance_remark', 'text'],
|
||
['金额', 'amount', 'money'],
|
||
['订单号', 'order_no', 'num'],
|
||
['线上单号', 'payload.online_order_no', 'num'],
|
||
['自定义备注', 'custom_remark', 'text'],
|
||
['账单项目', 'bill_item', 'tag'],
|
||
['店铺', 'payload.store_2', 'text'],
|
||
['订单类型', 'payload.order_type', 'text'],
|
||
['商品名称', 'payload.goods_name', 'text'],
|
||
['商品货号', 'payload.goods_no', 'num'],
|
||
['数量', 'payload.quantity', 'num'],
|
||
['渠道', 'payload.channel', 'text'],
|
||
['源渠道代码', 'payload.source_channel', 'text'],
|
||
['业务类型', 'payload.business_type', 'text'],
|
||
['收入金额', 'income', 'money_in'],
|
||
['支出金额', 'expense', 'money_out'],
|
||
['线上单号对应实际店铺', 'payload.online_real_store', 'text'],
|
||
['订单创建时间', 'payload.order_created_at', 'date'],
|
||
['支付/退款时间', 'occurred_at', 'date'],
|
||
['发货/退货时间', 'payload.ship_return_at', 'date'],
|
||
['结算状态', 'payload.settle_status', 'text'],
|
||
['收款账期', 'payload.pay_period', 'text'],
|
||
['拉取时间', 'payload.pulled_at', 'date'],
|
||
['修改时间', 'updated_at', 'date'],
|
||
['修改人', 'modifier', 'text'],
|
||
],
|
||
],
|
||
];
|
||
}
|
||
|
||
public static function types(): array
|
||
{
|
||
return array_keys(self::map());
|
||
}
|
||
|
||
public static function has(string $type): bool
|
||
{
|
||
return isset(self::map()[$type]);
|
||
}
|
||
|
||
/**
|
||
* @return array{title:string,groups:array<int,array{label:string,span:int}>,columns:array<int,array{label:string,field:string,kind:string}>}
|
||
*/
|
||
public static function for(string $type): ?array
|
||
{
|
||
$map = self::map();
|
||
|
||
if (! isset($map[$type])) {
|
||
return null;
|
||
}
|
||
|
||
$columns = array_map(function ($c) {
|
||
return ['label' => $c[0], 'field' => $c[1], 'kind' => $c[2]];
|
||
}, $map[$type]['columns']);
|
||
|
||
$groups = array_map(function ($group) {
|
||
return ['label' => $group[0], 'span' => $group[1]];
|
||
}, $map[$type]['groups'] ?? []);
|
||
|
||
return [
|
||
'title' => $map[$type]['title'],
|
||
'groups' => $groups,
|
||
'columns' => $columns,
|
||
];
|
||
}
|
||
}
|