diff --git a/mrp_workorder/views/mrp_workorder_views.xml b/mrp_workorder/views/mrp_workorder_views.xml index 19abe1bf..61491d4c 100644 --- a/mrp_workorder/views/mrp_workorder_views.xml +++ b/mrp_workorder/views/mrp_workorder_views.xml @@ -156,30 +156,27 @@ if env.user.has_group('mrp.group_mrp_workorder_dependencies'): - - Work Orders - ir.actions.act_window - mrp.workorder - kanban,tree,form - - fullscreen - [('state', 'not in', ['done', 'cancel'])] - {'search_default_workcenter_id': active_id} - -

- No work orders to do! -

- Work orders are operations to do as part of a manufacturing order. - Operations are defined in the bill of materials or added in the manufacturing order directly. -

- Use the table work center control panel to register operations in the shop floor directly. - The tablet provides worksheets for your workers and allow them to scrap products, track time, - launch a maintenance request, perform quality tests, etc. -

-
-
+ + + + + + + + + + + + + + + + + + + + + diff --git a/sf_base/__init__.py b/sf_base/__init__.py index 60182bcc..070e5f4e 100644 --- a/sf_base/__init__.py +++ b/sf_base/__init__.py @@ -1,2 +1,4 @@ from . import models from . import commons +from . import wizard + diff --git a/sf_base/__manifest__.py b/sf_base/__manifest__.py index d6f8a88a..6f05a4a5 100644 --- a/sf_base/__manifest__.py +++ b/sf_base/__manifest__.py @@ -18,6 +18,8 @@ 'views/common_view.xml', 'views/fixture_view.xml', 'views/functional_fixture_view.xml', + 'wizard/workpiece_clamping_wizard_view.xml', + 'wizard/stock_removal_wizard_view.xml', 'views/menu_view.xml', "views/tool_views.xml", "views/tool_menu.xml", diff --git a/sf_base/models/functional_fixture.py b/sf_base/models/functional_fixture.py index f8acaab2..cce1d9e3 100644 --- a/sf_base/models/functional_fixture.py +++ b/sf_base/models/functional_fixture.py @@ -16,7 +16,7 @@ class FunctionalFixture(models.Model): code = fields.Char(string='编码', readonly=True) name = fields.Char(string="名称", size=15, required=True) - functional_fixture_type_id = fields.Many2one('sf.functional.fixture.type', string="功能夹具类型", required=True) + type_id = fields.Many2one('sf.functional.fixture.type', string="功能夹具类型", required=True) zero_chuck_model_ids = fields.Many2many('sf.fixture.model', 'rel_fixture_model_zero_chuck', string="零点卡盘型号", required=True, domain=[('fixture_material_type', '=', '零点卡盘')]) diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index e5c4093c..16f639b7 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -14,20 +14,20 @@ access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user, access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,1 access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,1 access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,1 - access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,base.group_user,1,1,1,1 access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,1 access_sf_cutting_tool_model,sf_cutting_tool_model,model_sf_cutting_tool_model,base.group_user,1,1,1,1 access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,1 access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,1 - - - access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,base.group_user,1,1,1,1 access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,base.group_user,1,1,1,1 access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,1 access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,base.group_user,1,1,1,1 access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,1 +access_sf_workpiece_clamping_wizard,sf_workpiece_clamping_wizard,model_sf_workpiece_clamping_wizard,base.group_user,1,1,1,1 +access_sf_stock_removal_wizard,sf_stock_removal_wizard,model_sf_stock_removal_wizard,base.group_user,1,1,1,1 + + diff --git a/sf_base/views/functional_fixture_view.xml b/sf_base/views/functional_fixture_view.xml index 799c6351..2cf4d50a 100644 --- a/sf_base/views/functional_fixture_view.xml +++ b/sf_base/views/functional_fixture_view.xml @@ -82,7 +82,7 @@ - + @@ -98,7 +98,7 @@ - + diff --git a/sf_base/wizard/__init__.py b/sf_base/wizard/__init__.py new file mode 100644 index 00000000..ac69a1da --- /dev/null +++ b/sf_base/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import workpiece_clamping_wizard +from . import stock_removal_wizard diff --git a/sf_base/wizard/stock_removal_wizard.py b/sf_base/wizard/stock_removal_wizard.py new file mode 100644 index 00000000..58d7abc7 --- /dev/null +++ b/sf_base/wizard/stock_removal_wizard.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError +import logging +_logger = logging.getLogger(__name__) + + +class StockRemovalWizard(models.Model): + _name = 'sf.stock.removal.wizard' + _description = "出库" + + code = fields.Char(string="功能夹具编码", size=25, required=True) + name = fields.Char(string="功能夹具名称", size=25, required=True) + type = fields.Char(string="功能夹具类型", required=True) + production_line = fields.Char(string="生产线", required=True) + machine_tool = fields.Many2one('sf.machine_tool', string="机床", required=True) + + def submit(self): + return 1 + diff --git a/sf_base/wizard/stock_removal_wizard_view.xml b/sf_base/wizard/stock_removal_wizard_view.xml new file mode 100644 index 00000000..fbb7708b --- /dev/null +++ b/sf_base/wizard/stock_removal_wizard_view.xml @@ -0,0 +1,36 @@ + + + + sf.stock.removal.wizard.form.view + sf.stock.removal.wizard + +
+ + + + + + + + + + + + +
+
+
+
+
+
+ + + 出库 + sf.stock.removal.wizard + form + new + +
+
\ No newline at end of file diff --git a/sf_base/wizard/workpiece_clamping_wizard.py b/sf_base/wizard/workpiece_clamping_wizard.py new file mode 100644 index 00000000..81489bc8 --- /dev/null +++ b/sf_base/wizard/workpiece_clamping_wizard.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError +import logging + +_logger = logging.getLogger(__name__) + + +class WorkpieceClampingWizard(models.Model): + _name = 'sf.workpiece.clamping.wizard' + _description = "工件装夹" + # 以下为坯料(工件)申请信息 + apply_code = fields.Char(string="申请坯料编码", size=25, required=True) + apply_name = fields.Char(string="申请坯料名称", size=25, required=True) + material_id = fields.Many2one('sf.production.materials', string="坯料材料", required=True) + apply_width = fields.Float(string="申请宽度", required=True) + apply_length = fields.Float(string="申请长度", required=True) + apply_height = fields.Float(string="申请高度", required=True) + apply_weight = fields.Float(string="申请重量", required=True) + apply_diameter = fields.Float(string="申请直径", required=True) + surface_accuracy = fields.Char(string="表面精度", required=True) + # 以下为坯料(工件)装夹信息 + chuck_name = fields.Char(string="卡盘名称", required=True) + chuck_brand_id = fields.Many2one('sf.machine.brand', string="卡盘品牌", required=True) + chuck_type_id = fields.Char(string="卡盘类型", required=True) + chuck_model_id = fields.Char(string="卡盘型号", required=True) + tray_name = fields.Char(string="托盘名称", required=True) + tray_brand_id = fields.Many2one('sf.machine.brand', string="托盘品牌", required=True) + tray_type_id = fields.Char(string="托盘类型", required=True) + tray_model_id = fields.Char(string="托盘型号", required=True) + real_code = fields.Char(string="真实坯料编码", size=25, required=True) + real_name = fields.Char(string="真实坯料名称", size=25, required=True) + real_width = fields.Float(string="真实宽度", required=True) + real_length = fields.Float(string="真实长度", required=True) + real_height = fields.Float(string="真实高度", required=True) + real_diameter = fields.Float(string="真实直径", required=True) + # 以下为坯料(工件)预调信息 + # hole_site = fields.Char(string="孔位", required=True) + # curve = fields.Char(string="曲线", required=True) + # straight_line = fields.Char(string="直线", required=True) + # x_axis = fields.Float(string="X轴", required=True) + # y_axis = fields.Float(string="Y轴", required=True) + # z_axis = fields.Float(string="Z轴", required=True) + # tool_radius = fields.Float(string="刀具半径", required=True) + # tool_length = fields.Float(string="刀具长度", required=True) + # tool_offset_point = fields.Float(string="刀具偏移点", required=True) + # tool_compensation_value = fields.Float(string="刀具补偿值", required=True) + # cutting_spindle_speed = fields.Float(string="切削主轴转速", required=True) + # cutting_feed_rate = fields.Float(string="切削进给速度", required=True) + # depth_of_cutting = fields.Float(string="切削深度", required=True) + # cutting_direction = fields.Char(string="切削方向", required=True) + preset_program_information = fields.Char(string="预调程序信息", required=True) + + def submit(self): + return 1 diff --git a/sf_base/wizard/workpiece_clamping_wizard_view.xml b/sf_base/wizard/workpiece_clamping_wizard_view.xml new file mode 100644 index 00000000..6418f5c9 --- /dev/null +++ b/sf_base/wizard/workpiece_clamping_wizard_view.xml @@ -0,0 +1,87 @@ + + + + sf.workpiece.clamping.wizard.form.view + sf.workpiece.clamping.wizard + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + + 装夹 + sf.workpiece.clamping.wizard + form + new + +
+
\ No newline at end of file diff --git a/sf_bf_connect/models/process_status.py b/sf_bf_connect/models/process_status.py index 0a18096b..b5a1cc19 100644 --- a/sf_bf_connect/models/process_status.py +++ b/sf_bf_connect/models/process_status.py @@ -33,8 +33,8 @@ class StatusChange(models.Model): 'process_start_time': process_start_time, }, } - url1 = config['bfm_url'] + '/api/get/state/get_order' - requests.post(url1, json=json1, data=None) + # url1 = config['bfm_url'] + '/api/get/state/get_order' + # requests.post(url1, json=json1, data=None) logging.info('接口已经执行=============') return res @@ -57,8 +57,8 @@ class StatusChange(models.Model): 'state': '待派单', }, } - url1 = config['bfm_url'] + '/api/get/state/cancel_order' - requests.post(url1, json=json1, data=None) + # url1 = config['bfm_url'] + '/api/get/state/cancel_order' + # requests.post(url1, json=json1, data=None) return res diff --git a/sf_maintenance/__manifest__.py b/sf_maintenance/__manifest__.py index a25afa50..18a2fed8 100644 --- a/sf_maintenance/__manifest__.py +++ b/sf_maintenance/__manifest__.py @@ -12,7 +12,6 @@ 'data': [ 'security/group_security.xml', 'security/ir.model.access.csv', - 'views/production_line_view.xml', 'views/maintenance_views.xml', 'views/maintenance_logs_views.xml', 'views/equipment_maintenance_standards_views.xml', diff --git a/sf_maintenance/models/__init__.py b/sf_maintenance/models/__init__.py index 98f9d12c..0e06b132 100644 --- a/sf_maintenance/models/__init__.py +++ b/sf_maintenance/models/__init__.py @@ -3,4 +3,3 @@ from . import sf_maintenance from . import sf_maintenance_logs from . import sf_equipment_maintenance_standards from . import sf_maintenance_requests -from . import production_line_base diff --git a/sf_maintenance/models/sf_maintenance.py b/sf_maintenance/models/sf_maintenance.py index c5a31fb6..bc7c841b 100644 --- a/sf_maintenance/models/sf_maintenance.py +++ b/sf_maintenance/models/sf_maintenance.py @@ -66,7 +66,7 @@ class SfMaintenanceEquipment(models.Model): MTcode = fields.Char("编码", default=get_no) created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) equipment_type = fields.Selection([('机床', '机床')], related='category_id.equipment_type') - code = fields.Char('行业编码') + code = fields.Char('机台号') name = fields.Char('名称') knife_type = fields.Selection( [("BT40", "BT40"), ("BT30", "BT30")], @@ -144,7 +144,16 @@ class SfMaintenanceEquipment(models.Model): control_system_id = fields.Many2one('sf.machine.control_system', string="控制系统") active = fields.Boolean('有效', default=True) - code = fields.Char('编码') + + def name_get(self): + result = [] + for parameter in self: + if parameter.code: + name = parameter.name + '-' + parameter.code + else: + name = parameter.name + result.append((parameter.id, name)) + return result @api.constrains('rotate_speed') def _check_rotate_speed(self): diff --git a/sf_maintenance/security/ir.model.access.csv b/sf_maintenance/security/ir.model.access.csv index 809ed5b6..52c0ab72 100644 --- a/sf_maintenance/security/ir.model.access.csv +++ b/sf_maintenance/security/ir.model.access.csv @@ -4,6 +4,6 @@ access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,base.gr access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,base.group_user,1,1,1,1 access_maintenance_standards,maintenance_standards,model_maintenance_standards,base.group_user,1,1,1,1 -access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1 + diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index 1a780a8d..8b57bbc9 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -20,6 +20,7 @@ 'views/mrp_routing_workcenter_view.xml', 'views/mrp_workcenter_views.xml', 'views/mrp_workorder_view.xml', + 'views/production_line_view.xml', 'views/tray_view.xml', 'views/model_type_view.xml', diff --git a/sf_manufacturing/models/__init__.py b/sf_manufacturing/models/__init__.py index 055eece0..2d7d2f1e 100644 --- a/sf_manufacturing/models/__init__.py +++ b/sf_manufacturing/models/__init__.py @@ -8,6 +8,7 @@ from . import mrp_maintenance from . import mrp_routing_workcenter from . import stock from . import res_user +from . import production_line_base diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 1f4c662e..05bacce5 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -6,11 +6,14 @@ from odoo import api, fields, models, _ class MrpProduction(models.Model): _inherit = 'mrp.production' _description = "制造订单" + _order = 'create_date desc' tray_ids = fields.One2many('sf.tray', 'production_id', string="托盘") maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Number of maintenance requests") request_ids = fields.One2many('maintenance.request', 'production_id') model_file = fields.Binary('模型文件', related='product_id.model_file') + schedule_state = fields.Selection([('未排', '未排'), ('已排', '已排')], + string='排程状态', default='未排') @api.depends('request_ids') def _compute_maintenance_count(self): @@ -336,7 +339,7 @@ class MrpProduction(models.Model): current_sequence += 1 if work.name == '获取CNC加工程序': work.button_start() - work.fetchCNC() + #work.fetchCNC() # 创建工单并进行排序 def _create_workorder(self): diff --git a/sf_manufacturing/models/mrp_workcenter.py b/sf_manufacturing/models/mrp_workcenter.py index 388577d3..3539327a 100644 --- a/sf_manufacturing/models/mrp_workcenter.py +++ b/sf_manufacturing/models/mrp_workcenter.py @@ -6,7 +6,9 @@ from odoo.addons.resource.models.resource import Intervals class ResWorkcenter(models.Model): _inherit = "mrp.workcenter" - machine_tool_id = fields.Many2one('sf.machine_tool', '机床') + equipment_id = fields.Many2one('maintenance.equipment', string='设备') + machine_tool_id = fields.Many2one('sf.machine_tool', string='机床') + production_line_id = fields.Many2one('sf.production.line', string='生产线') is_process_outsourcing = fields.Boolean('工艺外协') users_ids = fields.Many2many("res.users", 'users_workcenter') diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index d002cecb..a5b110d7 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -16,7 +16,7 @@ from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController class ResMrpWorkOrder(models.Model): _inherit = 'mrp.workorder' - _order = 'sequence' + _order = 'sequence asc,create_date desc' product_tmpl_id_length = fields.Float(related='production_id.product_tmpl_id.length', readonly=True, store=True, check_company=True, string="坯料长度(mm)") @@ -28,7 +28,7 @@ class ResMrpWorkOrder(models.Model): store=True, check_company=True, string="材料") product_tmpl_id_materials_type_id = fields.Many2one(related='production_id.product_tmpl_id.materials_type_id', readonly=True, store=True, check_company=True, string="型号") - workcenter_id = fields.Many2one('mrp.workcenter', required=False) + workcenter_id = fields.Many2one('mrp.workcenter', string='工作中心', required=False) users_ids = fields.Many2many("res.users", 'users_workorder', related="workcenter_id.users_ids") processing_panel = fields.Char('加工面') sequence = fields.Integer(string='工序') @@ -106,6 +106,35 @@ class ResMrpWorkOrder(models.Model): picking_in_id = fields.Many2one('stock.picking', string='外协入库单') picking_out_id = fields.Many2one('stock.picking', string='外协出库单') supplier_id = fields.Many2one('res.partner', string='外协供应商') + equipment_id = fields.Many2one('maintenance.equipment', string='加工设备') + schedule_state = fields.Selection(related='production_id.schedule_state', store=True) + # 工件装夹信息 + functional_fixture_code = fields.Char(string="功能夹具编码", readonly=True) + functional_fixture_serial_number = fields.Char(string="功能夹具序列号", readonly=True) + functional_fixture_id = fields.Many2one('sf.functional.fixture', string="功能夹具") + functional_fixture_type_id = fields.Many2one('sf.functional.fixture.type', string="功能夹具类型", readonly=True) + chuck_serial_number = fields.Char(string="卡盘序列号") + chuck_name = fields.Char(string="卡盘名称") + chuck_brand_id = fields.Many2one('sf.machine.brand', string="卡盘品牌") + chuck_type_id = fields.Char(string="卡盘类型") + chuck_model_id = fields.Char(string="卡盘型号") + tray_serial_number = fields.Char(string="卡盘序列号") + tray_name = fields.Char(string="托盘名称") + tray_brand_id = fields.Many2one('sf.machine.brand', string="托盘品牌") + tray_type_id = fields.Char(string="托盘类型") + tray_model_id = fields.Char(string="托盘型号") + total_wight = fields.Float(string="总重量") + maximum_carrying_weight = fields.Char(string="最大承载重量[kg]") + maximum_clamping_force = fields.Char(string="最大夹持力[n]") + production_line = fields.Char(string="生产线") + preset_program_information = fields.Char(string="预调程序信息") + + @api.onchange('functional_fixture_id') + def _onchange_functional_fixture_id(self): + if self.functional_fixture_id: + self.functional_fixture_code = self.functional_fixture_id.code + self.functional_fixture_type_id = self.functional_fixture_id.type_id.id + def get_no_data(self, production_id): process_parameter_workorder = self.search( @@ -165,7 +194,7 @@ class ResMrpWorkOrder(models.Model): 'operation_id': False, 'name': route.route_workcenter_id.name, 'processing_panel': k, - 'quality_point_ids':route.route_workcenter_id.quality_point_ids, + 'quality_point_ids': route.route_workcenter_id.quality_point_ids, 'routing_type': route.routing_type, 'work_state': '' if not route.routing_type == '获取CNC加工程序' else '待发起', 'workcenter_id': self.env['mrp.routing.workcenter'].get_workcenter(route.workcenter_ids.ids, diff --git a/sf_maintenance/models/production_line_base.py b/sf_manufacturing/models/production_line_base.py similarity index 100% rename from sf_maintenance/models/production_line_base.py rename to sf_manufacturing/models/production_line_base.py diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 9def6eb3..cbd20b6e 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -231,18 +231,8 @@ class ProductionLot(models.Model): 1] now = datetime.now().strftime("%Y-%m-%d") # formatted_date = now.strftime("%Y-%m-%d") - if product.integral_cutting_tool_type_id: - return "%s-%s-%03d" % (product.integral_cutting_tool_type_id.code, now, 1) - if product.blade_type_id: - return "%s-%s-%03d" % (product.blade_type_id.code, now, 1) - if product.cutter_bar_type_id: - return "%s-%s-%03d" % (product.cutter_bar_type_id.code, now, 1) - if product.cutter_pad_type_id: - return "%s-%s-%03d" % (product.cutter_pad_type_id.code, now, 1) - if product.handle_type_id: - return "%s-%s-%03d" % (product.handle_type_id.code, now, 1) - if product.chuck_type_id: - return "%s-%s-%03d" % (product.chuck_type_id.code, now, 1) + if product.cutting_tool_model_id: + return "%s-%s-%03d" % (product.cutting_tool_model_id.code, now, 1) return "%s-%03d" % (product.name, 1) diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index bc24436c..e0a78bb6 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -5,7 +5,7 @@ access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,mod access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,base.group_user,1,1,1,1 access_sf_surface_technics_model_type_routing_sort,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,base.group_user,1,1,1,1 - +access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1 diff --git a/sf_manufacturing/views/mrp_workcenter_views.xml b/sf_manufacturing/views/mrp_workcenter_views.xml index d769b555..b2414a68 100644 --- a/sf_manufacturing/views/mrp_workcenter_views.xml +++ b/sf_manufacturing/views/mrp_workcenter_views.xml @@ -91,8 +91,8 @@ - + diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 295a8399..0b980564 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -7,6 +7,7 @@ + @@ -19,6 +20,9 @@ + + + @@ -73,7 +77,7 @@ (0, 0, {'view_mode': 'kanban', 'view_id': ref('mrp.workcenter_line_kanban')}) ]"/> current - [('state', '!=', 'cancel')] + [('state', '!=', 'cancel'),('schedule_state', '=', '已排')] {'search_default_workcenter_id': active_id}

@@ -91,17 +95,6 @@ - - - - - - - - - - - mrp.production.workorder.tray.form.inherit.sf mrp.workorder @@ -111,13 +104,15 @@ +