diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index ebe08942..54b1a61c 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -254,6 +254,44 @@ class MrpProduction(models.Model): if production.tool_state == '2': production.state = 'rework' + def technology_confirm(self): + # 判断同一个加工面的标准工序的顺序是否依次排序 + technology_design = self.technology_design_ids.sorted(key=lambda m: m.sequence) + current_design_index = None + for index, design in enumerate(technology_design.filtered(lambda a: a.routing_tag == 'standard')): + if design == current_design: + current_design_index = index + break # 找到了 current_design,跳出循环 + + # 现在我们有了 current_design 的索引,我们可以找到下一条设计 + if current_design_index is not None and current_design_index + 1 < len(technology_design): + next_design = technology_design[current_design_index + 1] + # 下一条设计是 next_design + else: + # 如果 current_design_index 为 None 或者没有下一条设计,则 next_design 为 None + next_design = None + for design in technology_design.filtered(lambda a: a.routing_tag == 'standard'): + routing_type = design.route_id.routing_type + if routing_type in ['装夹预调', 'CNC加工', '解除装夹']: + # standard_designs = [d for d in technology_design_ids if d.routing_tag == 'standard'] + # last_design = technology_design[technology_design.index(design) - 1] + next_design = technology_design[2] + for next_design in technology_design: + next_design_routing_type = next_design.route_id.routing_type + logging.info('next_design:%s' % next_design.route_id.name) + logging.info('next_design面:%s' % next_design.panel) + logging.info('design:%s' % design.route_id.name) + logging.info('design面:%s' % design.panel) + if next_design == design: + break + if design.panel != next_design.panel and routing_type not in ['解除装夹']: + raise UserError('【加工面】为%s的标准工序里含有其他加工面的工序,请调整后重试' % design.panel) + if design.panel == next_design.panel: + if (routing_type == '装夹预调' and next_design_routing_type == '解除装夹') or ( + routing_type == 'CNC加工' and next_design_routing_type == '装夹预调'): + raise UserError('【加工面】为%s的标准工序顺序有误,请调整后重试' % design.panel) + return True + def action_check(self): """ 审核启用 diff --git a/sf_manufacturing/models/mrp_routing_workcenter.py b/sf_manufacturing/models/mrp_routing_workcenter.py index ef451df7..2916bdce 100644 --- a/sf_manufacturing/models/mrp_routing_workcenter.py +++ b/sf_manufacturing/models/mrp_routing_workcenter.py @@ -14,7 +14,7 @@ class ResMrpRoutingWorkcenter(models.Model): ('表面工艺', '表面工艺') ], string="工序类型") routing_tag = fields.Selection([ - ('Standard', '标准'), + ('standard', '标准'), ('special', '特殊') ], string="标签") is_repeat = fields.Boolean('重复', default=False) @@ -23,6 +23,7 @@ class ResMrpRoutingWorkcenter(models.Model): bom_id = fields.Many2one('mrp.bom', required=False) surface_technics_id = fields.Many2one('sf.production.process', string="表面工艺") reserved_duration = fields.Float('预留时长', default=30, tracking=True) + def get_no(self): international_standards = self.search( [('code', '!=', ''), ('active', 'in', [True, False])], @@ -79,3 +80,13 @@ class ResMrpRoutingWorkcenter(models.Model): else: workcenter_id = workcenter_ids[0] return workcenter_id + + @api.model + def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None): + if self._context.get('production_id'): + technology_design = self.env['sf.technology.design'].search( + [('production_id', '=', self._context.get('production_id'))]) + route_ids = [t.route_id.id for t in technology_design] + domain = [('id', 'not in', route_ids)] + return self._search(domain, limit=limit, access_rights_uid=name_get_uid) + return super()._name_search(name, args, operator, limit, name_get_uid) diff --git a/sf_manufacturing/models/sf_technology_design.py b/sf_manufacturing/models/sf_technology_design.py index afb5f05b..e5ce0c69 100644 --- a/sf_manufacturing/models/sf_technology_design.py +++ b/sf_manufacturing/models/sf_technology_design.py @@ -6,22 +6,23 @@ class sf_technology_design(models.Model): _name = 'sf.technology.design' _description = "工艺设计" - name = fields.Char('工序') + route_id = fields.Many2one('mrp.routing.workcenter', '工序') panel = fields.Char('加工面') sequence = fields.Integer('序号') - time_cycle_manual = fields.Float('预计时长') + routing_tag = fields.Selection(related='route_id.routing_tag', string='标签', store=True) + time_cycle_manual = fields.Float(related='route_id.time_cycle_manual', string='预计时长') production_id = fields.Many2one('mrp.production') is_auto = fields.Boolean('是否自动生成', default=False) active = fields.Boolean('有效', default=True) - def json_technology_design_str(self, k, route_name, time_cycle_manual, i): + def json_technology_design_str(self, k, route, i): workorders_values_str = [0, '', { - 'name': route_name, + 'route_id': route.id, 'panel': k, 'sequence': i, - 'is_auto': True, - 'time_cycle_manual': time_cycle_manual}] + 'is_auto': True}] return workorders_values_str def unlink_technology_design(self): self.active = False + diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 64c89d46..70dbdf68 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -367,10 +367,7 @@ class StockRule(models.Model): for route in product_routing_workcenter: i += 1 technology_design_values.append( - self.env['sf.technology.design'].json_technology_design_str(k, - route.route_workcenter_id.name, - route.route_workcenter_id.time_cycle_manual, - i)) + self.env['sf.technology.design'].json_technology_design_str(k, route, i)) surface_technics_arr = [] route_workcenter_arr = [] for process_param in production.product_id.product_model_type_id.surface_technics_routing_tmpl_ids.filtered( @@ -403,8 +400,7 @@ class StockRule(models.Model): ('id', 'in', route_workcenter_arr)]) technology_design_values.append( self.env['sf.technology.design'].json_technology_design_str(k, - process_parameter.display_name, - route_production_process.time_cycle_manual, + route_production_process, i)) productions.technology_design_ids = technology_design_values @@ -624,12 +620,12 @@ class StockPicking(models.Model): item.telephone_of_delivery = sale_id.telephone_of_delivery item.address_of_delivery = sale_id.address_of_delivery - bom = self.env['mrp.bom'].sudo().search([('bom_line_ids.product_id', '=', self.move_ids.product_id.id)]) - if bom: - if item.picking_type_id.sequence_code == 'DL': - item.retrospect_ref = bom.product_tmpl_id.default_code - elif item.picking_type_id.sequence_code in ['INT', 'PC']: - item.retrospect_ref = bom.product_tmpl_id.name + # bom = self.env['mrp.bom'].sudo().search([('bom_line_ids.product_id', '=', self.move_ids.product_id.id)]) + # if bom: + # if item.picking_type_id.sequence_code == 'DL': + # item.retrospect_ref = bom.product_tmpl_id.default_code + # elif item.picking_type_id.sequence_code in ['INT', 'PC']: + # item.retrospect_ref = bom.product_tmpl_id.name # 设置外协出入单的名称 def _get_name_Res(self, rescode): diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index 42b68eae..1899aad2 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -114,12 +114,18 @@ string="验证" type="object" class="oe_highlight" confirm="There are no components to consume. Are you still sure you want to continue?" data-hotkey="g" groups="sf_base.group_sf_mrp_user"/> + +