- 新增 jst_order_labels.item_code 迁移;导入时从商品明细镜像按 o_id 写入货号(被替换/取消的明细不计入) - 「是否种菜订单」增加规则:货号含 X00006(信誉订单虚拟条码)直接判「是」 - 页面与导出新增货号列;新增 jst-order-labels:sync-item-codes 回填命令 - 测试:新增货号/种菜判定/回填命令用例,并修正导出表头过时断言
60 lines
1.9 KiB
PHP
60 lines
1.9 KiB
PHP
<?php
|
||
|
||
namespace App\Business;
|
||
|
||
use Illuminate\Database\ConnectionInterface;
|
||
|
||
/**
|
||
* 订单「货号」查询:从聚水潭商品明细镜像按内部订单号取商品编码(sku_id)。
|
||
*
|
||
* 「被替换(Replaced)/取消(Cancelled、SentCancelled)」的明细行不算订单当前货号,
|
||
* 所以换过商品的订单(如信誉订单虚拟条码 X00006)只保留换入后的编码。
|
||
* 一单多个编码用英文逗号连接。
|
||
*/
|
||
class JstOrderLabelItemCodes
|
||
{
|
||
/** 商品明细状态:这些行不计入订单当前货号。 */
|
||
public const EXCLUDED_STATUSES = ['Replaced', 'Cancelled', 'SentCancelled'];
|
||
|
||
/**
|
||
* @param list<int|string> $orderIds 内部订单号(o_id)
|
||
* @return array<int,string> [内部订单号 => 货号]
|
||
*/
|
||
public function forOrderIds(ConnectionInterface $connection, string $itemsTable, array $orderIds): array
|
||
{
|
||
$orderIds = array_values(array_unique(array_filter(
|
||
array_map(static fn ($value): int => (int) $value, $orderIds),
|
||
static fn (int $value): bool => $value > 0,
|
||
)));
|
||
if ($orderIds === []) {
|
||
return [];
|
||
}
|
||
|
||
$rows = $connection->table($itemsTable)
|
||
->whereIn('o_id', $orderIds)
|
||
->where(function ($query): void {
|
||
$query->whereNull('item_status')
|
||
->orWhereNotIn('item_status', self::EXCLUDED_STATUSES);
|
||
})
|
||
->get(['o_id', 'sku_id']);
|
||
|
||
$skus = [];
|
||
foreach ($rows as $row) {
|
||
$sku = trim((string) $row->sku_id);
|
||
if ($sku === '') {
|
||
continue;
|
||
}
|
||
$skus[(int) $row->o_id][$sku] = true;
|
||
}
|
||
|
||
$codes = [];
|
||
foreach ($skus as $orderId => $list) {
|
||
$list = array_keys($list);
|
||
sort($list);
|
||
$codes[$orderId] = mb_substr(implode(',', $list), 0, 191);
|
||
}
|
||
|
||
return $codes;
|
||
}
|
||
}
|