我正在使用 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
在每种情况下都会更新?
几天来我对此感到疯狂,答案是个笑话。
这段代码看起来运行完美。然而,有时,尤其是当我 通过 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()
就是这样。不存在异步问题,我已经抱怨了好几天了。
程序员被低估了...