按工作平台 OmsDataDay 源码 + 9.1-9.16 逐单对比反推,合并/明细基础信息一致率均达 99.9% 以上。
取数范围
- 换单配对:快递明细旧单号在出库单查不到时,配同订单下未被占用的出库单新单号
- 作废重出:同单号/同订单多张出库单时优先有效单、再取最新 io_date
- 订单已取消/已拆分/已合并的快递明细不出行;订单标签含"线上发货"同样排除
- 合包/拼单:按 单号+订单号 定位出库单;同单号不同交易单号的出库单照常补出
- 发货明细无单号:出库单单号 -> 订单单号 -> 空,不再借运费表里其它包裹单号
- 自动发货仓虚拟/补差单:单号已被别的包裹输出则留空
- @ 去重只在同一交易单号、本次同步时间段内比对,剩余 @ 前缀统一去掉
字段取值
- 发货时间取出库单 io_date;平台取视图 shop_site(无则映射);省市区取视图
- 合并商品名称/供应商取包裹内最后一个商品(原为 MIN);名称 & 转 ^
- 明细体积:数量×长×宽×高,代发仓非标准承运商不乘数量,指定快递为 0(config detail_volume)
- 组合件合并值单独存 m_* 列(新迁移),合并导出优先使用
- 仓库 {未指定发货仓} 导出为空;明细 0 尺寸/体积导出为空
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014nvGZkg27YMEdhry6eiuwf
46 lines
2.0 KiB
PHP
46 lines
2.0 KiB
PHP
<?php
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use Illuminate\Console\Command;
|
||
use Modules\EcommerceFinance\Repositories\ShippingOrderRepository;
|
||
|
||
class JstDump extends Command
|
||
{
|
||
protected $signature = 'jst:dump {--mode=merged} {--from=} {--to=}';
|
||
protected $description = '把 caiwu 发货数据(合并/明细)以 CSV 输出到 STDOUT,供比对';
|
||
|
||
public function handle(ShippingOrderRepository $repo): int
|
||
{
|
||
@ini_set('memory_limit', '1024M');
|
||
@set_time_limit(0);
|
||
$mode = $this->option('mode') === 'detail' ? 'detail' : 'merged';
|
||
$filters = [
|
||
'ship_from' => (string) $this->option('from'),
|
||
'ship_to' => (string) $this->option('to'),
|
||
];
|
||
$cols = [
|
||
['express_no', '快递单号'], ['trade_no', '交易单号'], ['item_id', '商品ID'], ['barcode', '条形码'],
|
||
['product_name', '商品名称'], ['qty', '数量'], ['pkg_count', '件数'], ['warehouse_name', '仓库'],
|
||
['supplier_name', '供应商'], ['platform', '平台'], ['shop_name', '店铺名称'],
|
||
['volume_cm3', '体积'], ['length_cm', '长'], ['width_cm', '宽'], ['height_cm', '高'],
|
||
['actual_weight', '实称重量'], ['online_weight', '线上重量'], ['freight', '运费'],
|
||
['ship_time', '发货时间'], ['pay_time', '付款时间'], ['product_code', '货号'],
|
||
['receiver_state', '省'], ['receiver_city', '市'], ['receiver_district', '区'],
|
||
['package_no', '配货单号'], ['amount', '金额'], ['express_name1', '快递名称'],
|
||
];
|
||
$fh = fopen('php://output', 'w');
|
||
fwrite($fh, chr(0xEF).chr(0xBB).chr(0xBF));
|
||
fputcsv($fh, array_map(fn ($c) => $c[1], $cols));
|
||
$n = 0;
|
||
foreach ($repo->exportRows($filters, 2000, $mode) as $row) {
|
||
fputcsv($fh, array_map(fn ($c) => (string) ($row[$c[0]] ?? ''), $cols));
|
||
$n++;
|
||
}
|
||
fflush($fh);
|
||
fwrite(STDERR, 'wrote '.$n.' rows ('.$mode.')'.PHP_EOL);
|
||
|
||
return self::SUCCESS;
|
||
}
|
||
}
|