CaiWuXiTong/modules/EcommerceFinance/Services/ShengsuanOrderProfitDisplayMapper.php
renshen d79a1eedfe feat: 成本运费异常接入完整订单商品明细 (#1004)
合并 PR #1004:补全订单商品明细并按条码识别缺成本。
2026-11-09 11:02:21 +08:00

137 lines
4.9 KiB
PHP

<?php
namespace Modules\EcommerceFinance\Services;
class ShengsuanOrderProfitDisplayMapper
{
private const ORDER_TITLES = [
'c_900901' => '店铺名称',
'c_900902' => '线上单号',
'c_900903' => '内部单号',
'c_900972' => '发货时间',
'c_900966' => '订单类型',
'c_900933' => '标签',
'c_900905' => '订单销售数量(扣退)',
'c_900015' => '订单销售金额(扣退)',
'c_900208' => '订单销售成本(扣退)',
'c_900952' => '分类单销售数量(扣退)',
'c_900014' => '分类单销售金额(扣退)',
'c_900207' => '分类单销售成本(扣退)',
'c_900953' => '销售数量(扣退)',
'c_900099' => '销售金额(扣退)',
'c_900299' => '销售成本(扣退)',
'c_900019' => '其中:手动调整收入',
'c_900008' => '其中:其他调整收入',
'c_900210' => '其中:手动调整成本',
'c_900203' => '其中:其他调整成本',
'c_900301' => '毛利额',
'c_900302' => '毛利率',
'c_900499' => '订单费用',
'c_900498' => '费用占比',
'c_900497' => '其中:推广费',
'c_900501' => '经营利润',
'c_900502' => '经营利润率',
'c_900940' => '商品数量',
'c_900001' => '商品金额',
'c_900201' => '商品成本',
'c_900209' => '其中:红冲订单成本',
'c_900007' => '商家优惠',
'c_900003' => '运费收入',
'c_900002' => '付款金额',
'c_900006' => '其中:平台优惠',
'c_900016' => '其中:红冲订单金额',
'c_900949' => '实发金额',
'c_900925' => '实发数量',
'c_900950' => '实发成本',
'c_900954' => '退款数量合计',
'c_900012' => '退款金额合计',
'c_900018' => '其中:退平台补贴',
'c_900202' => '退款成本合计',
'c_900941' => '发货前-申请数量',
'c_900943' => '发货前-申请金额',
'c_900942' => '发货前-申请成本',
'c_900926' => '发货前-退回数量',
'c_900928' => '发货前-退回金额',
'c_900929' => '发货前-退回成本',
'c_900930' => '发货前-退款金额',
'c_900984' => '发货前-退款类型',
'c_900944' => '发货前-退平台补贴',
'c_900945' => '发货后-申请数量',
'c_900947' => '发货后-申请金额',
'c_900946' => '发货后-申请成本',
'c_900927' => '发货后-退回数量',
'c_900931' => '发货后-退回金额',
'c_900932' => '发货后-退回成本',
'c_900935' => '发货后-退款金额',
'c_900985' => '发货后-退货类型',
'c_900948' => '发货后-退平台补贴',
'c_900409' => '包材费(自动匹配)',
'c_900407' => '快递费(自动匹配)',
'c_900412' => '账单费用(自动匹配)',
'c_900413' => '分类单成本生成费用',
'c_900414' => '商品成本生成费用',
'c_900415' => '人工维护',
'c_900951' => '发货仓库',
'c_9001013' => '运营云仓',
'c_900989' => '供销商',
'c_9001015' => '业务员',
'c_9002022' => '线下客户',
'c_9002010' => '省',
'c_9002011' => '市',
'c_9002014' => '订单卖家备注',
'c_900967' => '胜算订单号',
'c_9001062' => '确认收货状态',
'c_9002013' => '商品总体积(扣退)',
];
/**
* @param array<string,mixed> $payload
* @param list<array<string,mixed>> $headers
* @return list<array{code:string,title:string,value:string}>
*/
public static function fields(array $payload, array $headers = []): array
{
$titles = self::ORDER_TITLES;
$codes = [];
foreach ($headers as $header) {
$code = trim((string) ($header['fld'] ?? ''));
if ($code === '') {
continue;
}
$titles[$code] = trim((string) ($header['title'] ?? '')) ?: ($titles[$code] ?? $code);
$codes[$code] = true;
}
foreach (array_keys($payload) as $code) {
$codes[(string) $code] = true;
}
$fields = [];
foreach (array_keys($codes) as $code) {
$fields[] = [
'code' => $code,
'title' => $titles[$code] ?? $code,
'value' => self::value($payload[$code] ?? null),
];
}
return $fields;
}
public static function value(mixed $value): string
{
if ($value === null) {
return '-';
}
if (is_bool($value)) {
return $value ? '是' : '否';
}
if (is_array($value) || is_object($value)) {
return json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?: '-';
}
$text = trim((string) $value);
return $text === '' ? '-' : $text;
}
}