如何以编程方式添加货物(跟踪代码+更改状态)?

发布于 2025-02-03 22:04:21 字数 2992 浏览 3 评论 0原文

我想将订单标记为发货,并在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千年*琉璃梦 2025-02-10 22:04:21

这是我设置订单运输和完成的方式

use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionActions;
use Shopware\Core\System\StateMachine\StateMachineRegistry;
use Shopware\Core\System\StateMachine\Transition;


    private function setOrderComplete(OrderEntity $order, Context $context): void
    {
        $this->stateMachineRegistry->transition(new Transition(
            OrderDefinition::ENTITY_NAME,
            $order->getId(),
            StateMachineTransitionActions::ACTION_COMPLETE,
            'stateId'
        ), $context);
    }

    private function setDeliveryShipped(OrderDeliveryEntity $delivery, Context $context): void
    {
        $this->stateMachineRegistry->transition(new Transition(
            OrderDeliveryDefinition::ENTITY_NAME,
            $delivery->getId(),
            StateMachineTransitionActions::ACTION_SHIP,
            'stateId'
        ), $context);
    }

here is how i set an order shipped and complete

use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionActions;
use Shopware\Core\System\StateMachine\StateMachineRegistry;
use Shopware\Core\System\StateMachine\Transition;


    private function setOrderComplete(OrderEntity $order, Context $context): void
    {
        $this->stateMachineRegistry->transition(new Transition(
            OrderDefinition::ENTITY_NAME,
            $order->getId(),
            StateMachineTransitionActions::ACTION_COMPLETE,
            'stateId'
        ), $context);
    }

    private function setDeliveryShipped(OrderDeliveryEntity $delivery, Context $context): void
    {
        $this->stateMachineRegistry->transition(new Transition(
            OrderDeliveryDefinition::ENTITY_NAME,
            $delivery->getId(),
            StateMachineTransitionActions::ACTION_SHIP,
            'stateId'
        ), $context);
    }
南烟 2025-02-10 22:04:21

对于跟踪代码,此操作:

$this->deliveryRepository->update([
    [
        'id' => $deliveries->first()->getId(),
        'trackingCodes' => [$trackingCode]
    ]
], $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');
    }

    $this->orderService->orderStateTransition(
        $order->getId(),
        'process',
        new ParameterBag(),
        $context
    );

    $deliveryId = $deliveries->first()->getId();

    $this->deliveryRepository->update([
        [
            'id' => $deliveryId,
            'trackingCodes' => [$trackingCode]
        ]
    ], $context);

    $context->addExtension(
        MailSendSubscriber::MAIL_CONFIG_EXTENSION,
        new MailSendSubscriberConfig(false)
    );

    $this->orderService->orderDeliveryStateTransition(
        $deliveryId,
        'ship',
        new ParameterBag(),
        $context
    );

    $this->orderService->orderStateTransition(
        $order->getId(),
        'complete',
        new ParameterBag(),
        $context
    );
}

For the tracking code, this works:

$this->deliveryRepository->update([
    [
        'id' => $deliveries->first()->getId(),
        'trackingCodes' => [$trackingCode]
    ]
], $context);

And the full code - state transitions on order might also needed to be run, depending on the requirements:

    $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');
    }

    $this->orderService->orderStateTransition(
        $order->getId(),
        'process',
        new ParameterBag(),
        $context
    );

    $deliveryId = $deliveries->first()->getId();

    $this->deliveryRepository->update([
        [
            'id' => $deliveryId,
            'trackingCodes' => [$trackingCode]
        ]
    ], $context);

    $context->addExtension(
        MailSendSubscriber::MAIL_CONFIG_EXTENSION,
        new MailSendSubscriberConfig(false)
    );

    $this->orderService->orderDeliveryStateTransition(
        $deliveryId,
        'ship',
        new ParameterBag(),
        $context
    );

    $this->orderService->orderStateTransition(
        $order->getId(),
        'complete',
        new ParameterBag(),
        $context
    );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文