CaiWuXiTong/app/Business/JstOrderLabelItemCodes.php
qiuxiang 53cd0c3ce6 聚水潭订单标签明细:新增「货号」列,货号 X00006 的订单判为种菜订单
- 新增 jst_order_labels.item_code 迁移;导入时从商品明细镜像按 o_id 写入货号(被替换/取消的明细不计入)
- 「是否种菜订单」增加规则:货号含 X00006(信誉订单虚拟条码)直接判「是」
- 页面与导出新增货号列;新增 jst-order-labels:sync-item-codes 回填命令
- 测试:新增货号/种菜判定/回填命令用例,并修正导出表头过时断言
2026-10-10 16:06:02 +08:00

60 lines
1.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}