diff --git a/sf_base/static/src/js/custom_barcode_handlers.js b/sf_base/static/src/js/custom_barcode_handlers.js new file mode 100644 index 00000000..220d2cbb --- /dev/null +++ b/sf_base/static/src/js/custom_barcode_handlers.js @@ -0,0 +1,61 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { barcodeGenericHandlers } from '@barcodes/barcode_handlers'; +import { patch } from "@web/core/utils/patch"; + +// 定义新的 clickOnButton 函数 +function customClickOnButton(selector) { + console.log("This is the custom clickOnButton function!"); + + const buttons = document.body.querySelectorAll(selector); + + let length = buttons.length; + if (length > 0) { + buttons[length - 1].click(); + } else { + console.warn(`Button with selector ${selector} not found`); + } +} + +patch(barcodeGenericHandlers, "start", { + start(env, { ui, barcode, notification }) { + // 使用新定义的 clickOnButton 函数 + const COMMANDS = { + "O-CMD.EDIT": () => customClickOnButton(".o_form_button_edit"), + "O-CMD.DISCARD": () => customClickOnButton(".o_form_button_cancel"), + "O-CMD.SAVE": () => customClickOnButton(".o_form_button_save"), + "O-CMD.PREV": () => customClickOnButton(".o_pager_previous"), + "O-CMD.NEXT": () => customClickOnButton(".o_pager_next"), + "O-CMD.PAGER-FIRST": () => updatePager("first"), + "O-CMD.PAGER-LAST": () => updatePager("last"), + "O-CMD.CONFIRM": () => customClickOnButton(".jikimo_button_confirm"), + }; + + barcode.bus.addEventListener("barcode_scanned", (ev) => { + const barcode = ev.detail.barcode; + if (barcode.startsWith("O-BTN.")) { + let targets = []; + try { + targets = getVisibleElements(ui.activeElement, `[barcode_trigger=${barcode.slice(6)}]`); + } catch (_e) { + console.warn(`Barcode '${barcode}' is not valid`); + } + for (let elem of targets) { + elem.click(); + } + } + if (barcode.startsWith("O-CMD.")) { + const fn = COMMANDS[barcode]; + if (fn) { + fn(); + } else { + notification.add(env._t("Barcode: ") + `'${barcode}'`, { + title: env._t("Unknown barcode command"), + type: "danger" + }); + } + } + }); + } +}) diff --git a/sf_base/static/src/js/remove_focus.js b/sf_base/static/src/js/remove_focus.js index 3e4cbb22..9a524360 100644 --- a/sf_base/static/src/js/remove_focus.js +++ b/sf_base/static/src/js/remove_focus.js @@ -5,9 +5,12 @@ import { registry } from '@web/core/registry'; import { formView } from '@web/views/form/form_view'; import { FormController } from '@web/views/form/form_controller'; +import { listView } from '@web/views/list/list_view'; +import { ListController } from '@web/views/list/list_controller' + import { onRendered, onMounted } from "@odoo/owl"; -export class RemoveFocusController extends FormController { +export class RemoveFocusFormController extends FormController { setup() { super.setup(); @@ -17,7 +20,23 @@ export class RemoveFocusController extends FormController { } } -registry.category('views').add('remove_focus_view', { +registry.category('views').add('remove_focus_form_view', { ...formView, - Controller: RemoveFocusController, + Controller: RemoveFocusFormController, +}); + + +export class RemoveFocusListController extends ListController { + setup() { + super.setup(); + + onMounted(() => { + this.__owl__.bdom.el.querySelectorAll(':focus').forEach(element => element.blur()); + }) + } +} + +registry.category('views').add('remove_focus_list_view', { + ...listView, + Controller: RemoveFocusListController, }); \ No newline at end of file diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index 35501367..8cf16106 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -45,6 +45,7 @@ 'sf_manufacturing/static/src/scss/kanban_change.scss', 'sf_manufacturing/static/src/xml/button_show_on_tree.xml', 'sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js', + 'sf_manufacturing/static/src/js/custom_barcode_handlers.js', ] }, diff --git a/sf_manufacturing/models/agv_scheduling.py b/sf_manufacturing/models/agv_scheduling.py index d232c643..488fa0a0 100644 --- a/sf_manufacturing/models/agv_scheduling.py +++ b/sf_manufacturing/models/agv_scheduling.py @@ -265,3 +265,17 @@ class ResMrpWorkOrder(models.Model): 'sf_agv_scheduling_mrp_workorder_ref', string='AGV调度', domain=[('state', '!=', '已取消')]) + + def get_down_product_agv_scheduling(self): + """ + 获取关联的制造订单下产线的agv任务 + """ + workorder_ids = self.production_id.workorder_ids + cnc_workorder = workorder_ids.filtered( + lambda w: w.routing_type == 'CNC加工' and w.state == 'done' and w.processing_panel == self.processing_panel + ) + if cnc_workorder: + agv_schedulingss = cnc_workorder.agv_scheduling_ids + return agv_schedulingss.filtered(lambda a: a.state == '已配送' and a.agv_route_type == '下产线') + else: + return None diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 8934711f..a5e20ff7 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1340,7 +1340,7 @@ class ResMrpWorkOrder(models.Model): 'name': 'button_delivery', 'type': 'object', 'string': '解除装夹', - 'class': 'btn-primary', + 'class': 'btn-primary jikimo_button_confirm', # 'className': 'btn-primary', 'modifiers': '{"force_show": 1}' }) @@ -1355,6 +1355,7 @@ class ResMrpWorkOrder(models.Model): workorder_ids = [] delivery_type = '运送空料架' max_num = 4 # 最大配送数量 + feeder_station_start_id = False if len(self) > max_num: raise UserError('仅限于拆卸1-4个制造订单,请重新选择') for item in self: @@ -1363,6 +1364,10 @@ class ResMrpWorkOrder(models.Model): production_ids.append(item.production_id.id) workorder_ids.append(item.id) + if not feeder_station_start_id: + down_product_agv_scheduling = self.get_down_product_agv_scheduling() + if down_product_agv_scheduling: + feeder_station_start_id = down_product_agv_scheduling.end_site_id.id return { 'name': _('确认'), 'type': 'ir.actions.act_window', @@ -1375,7 +1380,8 @@ class ResMrpWorkOrder(models.Model): 'default_delivery_type': delivery_type, 'default_workorder_ids': [(6, 0, workorder_ids)], 'default_workcenter_id': self.env.context.get('default_workcenter_id'), - 'default_confirm_button': '确认解除' + 'default_confirm_button': '确认解除', + 'default_feeder_station_start_id': feeder_station_start_id, }} diff --git a/sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js b/sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js index 236836ab..d7900984 100644 --- a/sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js +++ b/sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js @@ -10,7 +10,7 @@ odoo.define('sf_manufacturing.action_dispatch_confirm', function (require) { title: "确认", $content: $('