为什么 Odoo 16 中的 JS 方法有时只能在类似的环境中工作?

问题描述 投票:0回答:1

我正在使用 Odoo 16。我已经安装了 Enterprise Barcode 应用程序,并对其进行了通用开发。

条形码应用程序有一个菜单,可在看板视图中显示选择。我正在做的开发工作是,每当属于特定组的用户单击其看板卡将其打开时,自动填写一个挑选字段。

示例:条形码应用程序在看板视图中显示三个拣货(PICK001、PICK002、PICK003)。我是用户管理员,我单击 PICK003 的看板卡,这样我就会重定向到显示 PICK003 的库存移动线的其他视图。同时,我的开发将拾取字段

preparer_id
(指向
Many2one
res.users
)设置为
Administrator

现在,我的开发代码:

/** @odoo-module **/
import { StockBarcodeKanbanController } from '@stock_barcode/kanban/stock_barcode_kanban_controller';
import { patch } from 'web.utils';
import { useService } from "@web/core/utils/hooks";
import { session } from "@web/session";

const originalOpenRecord = StockBarcodeKanbanController.prototype.openRecord;

patch(StockBarcodeKanbanController.prototype, 'StockBarcodeKanbanControllerIchExt', {
    setup() {
        this._super.apply(this, arguments);
        this.rpc = useService("rpc");
    },

    async openRecord(record) {
        // Check if preparer_id is empty
        if (!record.data.preparer_id) {
            // Check if current user is preparer (belong to preparers group)
            const isPreparer = await this.rpc("/web/dataset/call_kw", {
                model: 'res.users',
                method: 'has_group',
                args: ['ich_stock_ext.group_stock_preparer'],
                kwargs: {}
            });
            if(isPreparer) {
                // Call RPC to update preparer_id value with the current user
                await this.rpc('/web/dataset/call_kw/stock.picking/write', {
                    model: 'stock.picking',
                    method: 'write',
                    args: [[record.resId], { 'preparer_id': session.uid }],
                    kwargs: {}
                });
                // Refresh view
                this.model.load({reload: true});
            }
        }
        // Call "super" to execute whatever the original method did
        return originalOpenRecord.apply(this, arguments);
    },

});

这段代码看起来运行完美。然而,有时,特别是当我通过 Odoo 移动应用程序登录时,如果我单击 PICK003,然后单击 PICK002,然后再次单击 PICK003,字段

preparer_id
仍为空,而不是再次向用户显示。

我在每一步中都检查过该字段。我有另一个开发,当返回看板视图时会清空该字段。此其他开发始终运行良好,因此在单击看板卡之前,

preparer_id
始终为空。

可能会发生什么?如何更改代码以确保

preparer_id
在每种情况下都会更新?

javascript odoo odoo-16
1个回答
0
投票

几天来我对此感到疯狂,答案是个笑话。

这段代码看起来运行完美。然而,有时,尤其是当我 通过 Odoo 移动应用程序登录,如果我单击 PICK003,则单击 PICK002,然后再次在 PICK003 上,字段preparer_id 保持为空,而不是再次向用户显示。

特别是当我使用移动应用程序时...因为移动屏幕比电脑屏幕小...因此看板卡也更小...并且人的手指比鼠标指针更大...因此,有时,用户单击拣选的名称而不是看板卡,并且 Enterprise Barcode 应用程序对他们有不同的行为,但是两者都会将您带到同一个屏幕,这就是为什么没有人注意到这一点的原因。

这些天在看板卡上点击了一千多次之后,我发现点击这个名字会调用一个名为

action_open_picking_client_action
的 Python 方法,它也会打开股票移动线屏幕,但不通过 JS,因此,我的 JS 代码被忽略了。但是如果我点击看板卡而不是名称,股票移动线屏幕将通过 JS 代码打开,执行我的 JS 代码。

所以我只需要这样做:

def action_open_picking_client_action(self):
    if self.env.user.has_group('ich_stock_ext.group_stock_preparer'):
        self.filtered(lambda p: not p.preparer_id).write({
            'preparer_id': self.env.user.id,
        })
    return super(StockPicking, self).action_open_picking_client_action()

就是这样。不存在异步问题,我已经抱怨了好几天了。

程序员被低估了...

© www.soinside.com 2019 - 2024. All rights reserved.