PAYATHON 2026

Shopware 6 批量编辑中不显示新增 payment status

支付小周

结论

如果新增状态已能在单个订单中选择,说明 reminded_second 和 reminded_third 已加入订单交易状态机。批量编辑中没有显示,通常并非缺少数据库配置,而是当前 Shopware 6 版本的 Administration 批量编辑页面不会自动读取自定义 payment status,或者前端固定了状态列表或对其进行了过滤。

可以通过 Administration 插件扩展批量编辑订单组件,将这两个状态加入 transactionStatusOptions。此外,还要确认它们属于 order_transaction.state 状态机,并已配置批量操作所需的状态转换。

先检查状态机归属

两个状态必须属于技术名称为 order_transaction.state 的状态机,而不是订单主状态机 order.state。

可以在数据库中核对:

SELECT
    sms.technical_name AS state_name,
    sm.technical_name AS state_machine_name
FROM state_machine_state sms
INNER JOIN state_machine sm
    ON sm.id = sms.state_machine_id
WHERE sms.technical_name IN (
    'reminded_second',
    'reminded_third'
);

预期的 state_machine_name 是:

order_transaction.state

如果状态属于其他状态机,需要先修正其 state_machine_id。不要只根据单订单页面中的显示结果作判断,因为自定义页面扩展或缓存也可能掩盖配置问题。

扩展批量编辑的状态列表

建议通过自定义插件覆盖 Administration 组件,不要直接修改 Shopware 核心文件。

插件的 Administration 入口可以这样写:

// src/Resources/app/administration/src/main.js

const { Component } = Shopware;

Component.override('sw-bulk-edit-order', {
    computed: {
        transactionStatusOptions() {
            const options = this.$super('transactionStatusOptions') || [];

            const customOptions = [
                {
                    value: 'reminded_second',
                    label: this.$tc(
                        'custom-order-status.paymentStatus.remindedSecond'
                    ),
                },
                {
                    value: 'reminded_third',
                    label: this.$tc(
                        'custom-order-status.paymentStatus.remindedThird'
                    ),
                },
            ];

            return [
                ...options,
                ...customOptions.filter((customOption) => {
                    return !options.some(
                        (option) => option.value === customOption.value
                    );
                }),
            ];
        },
    },
});

添加中文翻译:

{
    "custom-order-status": {
        "paymentStatus": {
            "remindedSecond": "第二次催款",
            "remindedThird": "第三次催款"
        }
    }
}

文件可以放在:

src/Resources/app/administration/src/snippet/zh-CN.json

英文翻译示例:

{
    "custom-order-status": {
        "paymentStatus": {
            "remindedSecond": "Reminded second",
            "remindedThird": "Reminded third"
        }
    }
}

对应文件为:

src/Resources/app/administration/src/snippet/en-GB.json

完成后重新构建 Administration 并清理缓存。具体命令取决于安装方式,标准安装通常需要执行类似操作:

bin/console cache:clear
bin/console plugin:refresh
bin/console plugin:install --activate YourPluginName
bin/build-administration.sh

生产环境可能还需要重新执行主题或资源构建流程。

不同 Shopware 版本可能需要调整属性名

上面的示例适用于批量编辑组件使用 transactionStatusOptions 的版本。Shopware 6 的批量编辑模块在不同版本中有所调整,组件名称、计算属性名称和 option 的值都可能不同。

如果当前版本使用状态 UUID 作为选项值,而不是 technical_name,就不能直接这样设置 value:

value: 'reminded_second'

这种情况下,需要从 state_machine_state repository 查询实体,并使用状态的 id。可以查看当前 transactionStatusOptions 中标准状态的 value 来判断:

  • 如果值是 paid、open 等技术名称,就使用 reminded_second。
  • 如果值是 32 位十六进制 UUID,就应传入自定义状态对应的 id。

还要检查当前版本是否已经动态读取 order_transaction.state。如果已经动态读取,但自定义状态仍未出现,应重点排查:

  • 状态是否属于正确的状态机;
  • 状态实体是否有有效翻译;
  • Administration 缓存和构建产物是否仍为旧版本;
  • 插件是否给状态查询添加了过滤条件;
  • 查询分页是否截断了状态列表。

确认状态转换是否完整

状态显示在下拉列表中,不代表批量修改一定能成功。如果批量操作出现状态转换错误,还需要为可能的来源状态配置相应的 state_machine_transition。

例如,订单交易可能从 open、reminded 或 reminded_second 进入新的催款状态。至少要确保业务允许的转换链存在:

open -> reminded_second
reminded_second -> reminded_third

如果业务允许从第一次催款状态进入第二次催款状态,也应针对实际使用的源状态配置转换。转换的 action_name 必须唯一且稳定,例如:

remind_second
remind_third

不要为了让批量编辑成功,就在所有状态之间随意创建转换。状态机转换应符合实际的支付和催款流程。

注意事项

直接修改 Administration 核心源码也能让状态显示出来,但升级 Shopware 后这些修改会丢失,所以应通过插件覆盖。

如果当前版本的批量编辑页面已经采用动态状态查询,前端覆盖只能作为临时绕过方案。此时应先检查状态机归属、翻译、缓存和 Administration 构建结果。确认该版本确实固定或过滤了交易状态列表后,再扩展 sw-bulk-edit-order。

备注:内容仅供参考。