如何以编程方式添加货物(跟踪代码+更改状态)?
我想将订单标记为发货,并在Shopware 6 CLI命令中添加跟踪代码。
我了解我必须创建交付并附加跟踪代码。我可以通过dal做到这一点。但是我想知道是否有更高级别的服务? 我是否必须使用状态机来更改状态?还是可以一步一步完成?
我已经写了一项测试来检查跟踪代码:
$this->assertEquals('01234567890123', $order->get('deliveries')[0]->get('tracking_codes')[0]);
我想我可以从\ shopware \ core \ ceckout \ cechbout \ rode \ api \ api \ prodactionController :: orderDeliveryStateTransition
中使用逻辑,但是它需要复制&粘贴。
编辑对于跟踪代码,我尝试了以下操作:
// FIXME: get the right context
$context = Context::createDefaultContext();
$order = $this->findOrder($orderNumber);
/** @var \Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryCollection $deliveries */
$deliveries = $order->get('deliveries');
if (count($deliveries) == 0) {
throw new \LogicException('No delivery found');
}
if (count($deliveries) > 1) {
throw new \LogicException('We support only 1 delivery per order');
}
$deliveries->first()->setTrackingCodes([$trackingCode]);
$this->orderRepository->update([
[
'id' => $order->getId(),
'deliveries' => json_decode( json_encode($deliveries), true)
]
], $context);
但是我得到了:
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/0/deliveries/0/shippingOrderAddress/salutation/translations/2fbb5fe2e29a4d70aa5854ce7ce3e20b/displayName] Dieser Wert sollte nicht leer sein.
1. [/0/deliveries/0/shippingOrderAddress/salutation/translations/2fbb5fe2e29a4d70aa5854ce7ce3e20b/letterName] Dieser Wert sollte nicht leer sein.
1. [/] Expected data to be array.
我也尝试过
$this->orderRepository->update([
[
'id' => $order->getId(),
'deliveries' => [
$deliveries->first()->getId() => [
'trackingCodes' => [ $trackingCode ]
]
]
]
], $context);
,这对我来说更有意义,因为我只想更新跟踪代码,而不是完整的装运。
这扔了:
Shopware\Core\Framework\DataAbstractionLayer\Write\WriteException : There are 5 error(s) while writing data.
1. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingOrderAddressId] Dieser Wert sollte nicht leer sein.
2. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingMethodId] Dieser Wert sollte nicht leer sein.
3. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/stateId] Dieser Wert sollte nicht leer sein.
4. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingDateEarliest] Dieser Wert sollte nicht null sein.
5. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingDateLatest] Dieser Wert sollte nicht null sein.
I want to mark an order as shipped and add the tracking code inside a Shopware 6 CLI command.
I understand that I have to create a delivery and attach the tracking code. I could do this via DAL. But I am wondering if there is a higher-level service for this?
Do I have to use the state machine to change the status ? Or can this done in one step?
I have already written a test to check the tracking code:
$this->assertEquals('01234567890123', $order->get('deliveries')[0]->get('tracking_codes')[0]);
I think I can use the logic from \Shopware\Core\Checkout\Order\Api\OrderActionController::orderDeliveryStateTransition
but it would require copy & paste.
EDIT For the tracking code I tried this:
// FIXME: get the right context
$context = Context::createDefaultContext();
$order = $this->findOrder($orderNumber);
/** @var \Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryCollection $deliveries */
$deliveries = $order->get('deliveries');
if (count($deliveries) == 0) {
throw new \LogicException('No delivery found');
}
if (count($deliveries) > 1) {
throw new \LogicException('We support only 1 delivery per order');
}
$deliveries->first()->setTrackingCodes([$trackingCode]);
$this->orderRepository->update([
[
'id' => $order->getId(),
'deliveries' => json_decode( json_encode($deliveries), true)
]
], $context);
But I get:
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/] Expected data to be array.
1. [/0/deliveries/0/shippingOrderAddress/salutation/translations/2fbb5fe2e29a4d70aa5854ce7ce3e20b/displayName] Dieser Wert sollte nicht leer sein.
1. [/0/deliveries/0/shippingOrderAddress/salutation/translations/2fbb5fe2e29a4d70aa5854ce7ce3e20b/letterName] Dieser Wert sollte nicht leer sein.
1. [/] Expected data to be array.
I also tried
$this->orderRepository->update([
[
'id' => $order->getId(),
'deliveries' => [
$deliveries->first()->getId() => [
'trackingCodes' => [ $trackingCode ]
]
]
]
], $context);
Which makes more sense to my, as I just want to update the tracking code, not the full shipment.
This throws:
Shopware\Core\Framework\DataAbstractionLayer\Write\WriteException : There are 5 error(s) while writing data.
1. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingOrderAddressId] Dieser Wert sollte nicht leer sein.
2. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingMethodId] Dieser Wert sollte nicht leer sein.
3. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/stateId] Dieser Wert sollte nicht leer sein.
4. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingDateEarliest] Dieser Wert sollte nicht null sein.
5. [/0/deliveries/9272d3693d014b25aaeadb8249ede5c2/shippingDateLatest] Dieser Wert sollte nicht null sein.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是我设置订单运输和完成的方式
here is how i set an order shipped and complete
对于跟踪代码,此操作:
以及完整的代码 - 状态过渡也可能需要运行,具体取决于要求:
For the tracking code, this works:
And the full code - state transitions on order might also needed to be run, depending on the requirements: