更新
This commit is contained in:
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace app\command;
|
namespace app\command;
|
||||||
|
|
||||||
|
use app\common\model\tcm\PrescriptionOrder;
|
||||||
use app\common\service\ExpressTrackingService;
|
use app\common\service\ExpressTrackingService;
|
||||||
use app\common\service\gancao\GancaoLogisticsRouteService;
|
use app\common\service\gancao\GancaoLogisticsRouteService;
|
||||||
use app\common\service\gancao\GancaoScmRecipelService;
|
use app\common\service\gancao\GancaoScmRecipelService;
|
||||||
@@ -24,7 +25,8 @@ use think\console\Output;
|
|||||||
* 使用方法:
|
* 使用方法:
|
||||||
* php think gancao:sync-logistics 默认拉 2000 单(跳过已完成/已签收)
|
* php think gancao:sync-logistics 默认拉 2000 单(跳过已完成/已签收)
|
||||||
* php think gancao:sync-logistics --limit=500 自定义拉取上限
|
* php think gancao:sync-logistics --limit=500 自定义拉取上限
|
||||||
* php think gancao:sync-logistics --order-id=123 只跑指定订单
|
* php think gancao:sync-logistics --order-id=1424 只跑指定订单(数字 id)
|
||||||
|
* php think gancao:sync-logistics --order-id=PO20260530165158645023 或 PO 业务单号
|
||||||
* php think gancao:sync-logistics -t SF1234567890 按快递单号走快递100 查询并落库
|
* php think gancao:sync-logistics -t SF1234567890 按快递单号走快递100 查询并落库
|
||||||
* php think gancao:sync-logistics --detail 打印每单详细
|
* php think gancao:sync-logistics --detail 打印每单详细
|
||||||
*
|
*
|
||||||
@@ -42,7 +44,7 @@ class GancaoSyncLogisticsRoute extends Command
|
|||||||
$this->setName('gancao:sync-logistics')
|
$this->setName('gancao:sync-logistics')
|
||||||
->setDescription('同步甘草订单的物流路由(GET_TASK_ROUTE_LIST)到本地物流追踪表')
|
->setDescription('同步甘草订单的物流路由(GET_TASK_ROUTE_LIST)到本地物流追踪表')
|
||||||
->addOption('limit', 'l', Option::VALUE_OPTIONAL, '本次最多处理多少条订单(跳过已完成/已签收)', 2000)
|
->addOption('limit', 'l', Option::VALUE_OPTIONAL, '本次最多处理多少条订单(跳过已完成/已签收)', 2000)
|
||||||
->addOption('order-id', null, Option::VALUE_OPTIONAL, '只同步指定 prescription_order.id', null)
|
->addOption('order-id', null, Option::VALUE_OPTIONAL, '只同步指定订单:prescription_order.id 或 PO 业务单号 order_no', null)
|
||||||
->addOption('tracking-number', 't', Option::VALUE_REQUIRED, '按快递单号走快递100 查询并落库')
|
->addOption('tracking-number', 't', Option::VALUE_REQUIRED, '按快递单号走快递100 查询并落库')
|
||||||
->addOption('detail', 'd', Option::VALUE_NONE, '打印每单详细结果');
|
->addOption('detail', 'd', Option::VALUE_NONE, '打印每单详细结果');
|
||||||
}
|
}
|
||||||
@@ -50,8 +52,19 @@ class GancaoSyncLogisticsRoute extends Command
|
|||||||
protected function execute(Input $input, Output $output)
|
protected function execute(Input $input, Output $output)
|
||||||
{
|
{
|
||||||
$limit = max(1, (int) $input->getOption('limit'));
|
$limit = max(1, (int) $input->getOption('limit'));
|
||||||
$onlyOrderId = $input->getOption('order-id');
|
$onlyOrderId = null;
|
||||||
$onlyOrderId = $onlyOrderId !== null ? (int) $onlyOrderId : null;
|
$onlyOrderNo = '';
|
||||||
|
$orderIdArg = $input->getOption('order-id');
|
||||||
|
if ($orderIdArg !== null && trim((string) $orderIdArg) !== '') {
|
||||||
|
$resolved = self::resolvePrescriptionOrderId((string) $orderIdArg);
|
||||||
|
if ($resolved === null) {
|
||||||
|
$output->error('未找到订单:' . trim((string) $orderIdArg) . '(--order-id 支持数字 id 或 PO 业务单号)');
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
$onlyOrderId = $resolved['id'];
|
||||||
|
$onlyOrderNo = $resolved['order_no'];
|
||||||
|
}
|
||||||
$trackingNumber = trim((string) $input->getOption('tracking-number'));
|
$trackingNumber = trim((string) $input->getOption('tracking-number'));
|
||||||
$verbose = (bool) $input->getOption('detail');
|
$verbose = (bool) $input->getOption('detail');
|
||||||
|
|
||||||
@@ -73,7 +86,11 @@ class GancaoSyncLogisticsRoute extends Command
|
|||||||
if ($trackingNumber !== '') {
|
if ($trackingNumber !== '') {
|
||||||
$output->writeln('开始查询...(快递100,tracking_number=' . $trackingNumber . ')');
|
$output->writeln('开始查询...(快递100,tracking_number=' . $trackingNumber . ')');
|
||||||
} else {
|
} else {
|
||||||
$output->writeln('开始同步...(limit=' . $limit . ($onlyOrderId ? ', order_id=' . $onlyOrderId : '') . ')');
|
if ($onlyOrderId !== null) {
|
||||||
|
$output->writeln('开始同步...(指定单 order_id=' . $onlyOrderId . ($onlyOrderNo !== '' ? ', order_no=' . $onlyOrderNo : '') . ')');
|
||||||
|
} else {
|
||||||
|
$output->writeln('开始同步...(limit=' . $limit . ')');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -84,10 +101,16 @@ class GancaoSyncLogisticsRoute extends Command
|
|||||||
$stats['reconcile_lines'] = [];
|
$stats['reconcile_lines'] = [];
|
||||||
} else {
|
} else {
|
||||||
$stats = GancaoLogisticsRouteService::syncBatch($limit, $onlyOrderId);
|
$stats = GancaoLogisticsRouteService::syncBatch($limit, $onlyOrderId);
|
||||||
$recon = ExpressTrackingService::reconcileAssistantReleaseForShippedPrescriptionOrders(2000);
|
if ($onlyOrderId !== null) {
|
||||||
$stats['reconcile_cleared'] = (int) ($recon['cleared'] ?? 0);
|
$stats['reconcile_cleared'] = 0;
|
||||||
$stats['reconcile_scanned'] = (int) ($recon['scanned'] ?? 0);
|
$stats['reconcile_scanned'] = 0;
|
||||||
$stats['reconcile_lines'] = $recon['lines'] ?? [];
|
$stats['reconcile_lines'] = [];
|
||||||
|
} else {
|
||||||
|
$recon = ExpressTrackingService::reconcileAssistantReleaseForShippedPrescriptionOrders(2000);
|
||||||
|
$stats['reconcile_cleared'] = (int) ($recon['cleared'] ?? 0);
|
||||||
|
$stats['reconcile_scanned'] = (int) ($recon['scanned'] ?? 0);
|
||||||
|
$stats['reconcile_lines'] = $recon['lines'] ?? [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$output->error('同步异常:' . $e->getMessage());
|
$output->error('同步异常:' . $e->getMessage());
|
||||||
@@ -142,4 +165,35 @@ class GancaoSyncLogisticsRoute extends Command
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array{id:int, order_no:string}|null
|
||||||
|
*/
|
||||||
|
private static function resolvePrescriptionOrderId(string $raw): ?array
|
||||||
|
{
|
||||||
|
$raw = trim($raw);
|
||||||
|
if ($raw === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$q = PrescriptionOrder::whereNull('delete_time');
|
||||||
|
if (preg_match('/^\d+$/', $raw) === 1) {
|
||||||
|
$id = (int) $raw;
|
||||||
|
if ($id <= 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$row = (clone $q)->where('id', $id)->field('id,order_no')->find();
|
||||||
|
} else {
|
||||||
|
$row = (clone $q)->where('order_no', $raw)->field('id,order_no')->find();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$row) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => (int) $row->id,
|
||||||
|
'order_no' => (string) $row->order_no,
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user