# -*- coding: utf-8 -*- from collections import Counter from odoo import fields, models, api, _ from odoo.exceptions import ValidationError class sf_technology_design(models.Model): _name = 'sf.technology.design' _description = "工艺设计" group_uniq_id = fields.Integer('同一制造订单唯一id',default=0) sequence = fields.Integer('序号') route_id = fields.Many2one('mrp.routing.workcenter', '工序') process_parameters_id = fields.Many2one('sf.production.process.parameter', string='表面工艺参数') panel = fields.Char('加工面') 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) # @api.depends('production_id') # def _compute_group_uniq_id(self): # for record in self: def json_technology_design_str(self, k, route, i, process_parameter): workorders_values_str = [0, '', { 'route_id': route.id if route.routing_type in ['表面工艺'] else route.route_workcenter_id.id, 'panel': k, 'process_parameters_id': False if route.routing_type != '表面工艺' else self.env[ 'sf.production.process.parameter'].search( [('id', '=', process_parameter.id)]).id, 'sequence': i, 'is_auto': True}] return workorders_values_str def write(self, vals): res = super(sf_technology_design, self).write(vals) if 'group_uniq_id' in vals or 'process_parameters_id' in vals or 'active' in vals: if self.production_id: process_parameters_id = self.production_id.technology_design_ids.mapped('process_parameters_id') if process_parameters_id.ids: self.production_id.product_id.model_process_parameters_ids = process_parameters_id.ids else: self.production_id.product_id.model_process_parameters_ids = None return res def unlink_technology_design(self): self.active = False @api.model_create_multi def create(self, vals_list): for vals in vals_list: if not vals.get('route_id'): raise ValidationError(_("工序不能为空")) result = super(sf_technology_design, self).create(vals_list) for res in result: record = self.search([('production_id', '=', res.production_id.id), ('active', 'in', [True, False])], order='group_uniq_id desc', limit=1) res.group_uniq_id = record.group_uniq_id + 1 return result def get_duplicates_with_inactive(self, technology_designs): # 统计每个 'sequence' 出现的次数 sequence_count = Counter(technology_design.sequence for technology_design in technology_designs) # 筛选出 'sequence' 重复且 'active' 为 False 的元素 result = [ technology_design for technology_design in technology_designs if sequence_count[technology_design.sequence] > 1 and technology_design.active is False ] return result # def rearrange_numbering(self,self_technology_designs): # inactive_designs = self.get_duplicates_with_inactive(self_technology_designs) # if inactive_designs: # max_design = max(self_technology_designs, key=lambda x: x.sequence) # max_sequence = max_design.sequence if max_design else 0 # for designs in inactive_designs: # max_sequence += 1 # designs.sequence = max_sequence # self_technology_designs.sorted(key=lambda techology_design:techology_design.sequence) # return self_technology_designs def get_technology_design(self): return { 'sequence': self.sequence, 'route_id': self.route_id.id, 'process_parameters_id': self.process_parameters_id.id, 'panel': self.panel, 'routing_tag': self.routing_tag, 'time_cycle_manual': self.time_cycle_manual, 'is_auto': self.is_auto, 'active': self.active, 'group_uniq_id': self.group_uniq_id, } def sync_technology_designs(self, production_technology_designs, self_technology_designs): production_id = production_technology_designs[0].production_id.id self_technology_design_dict = {item.group_uniq_id: item for item in self_technology_designs} production_technology_designs_dict = {item.group_uniq_id: item for item in production_technology_designs} for technology_design in production_technology_designs: if not self_technology_design_dict.get(technology_design.group_uniq_id): technology_design.write({'production_id': False}) else: technology_design.write( self_technology_design_dict.get(technology_design.group_uniq_id).get_technology_design()) for technology_design in self_technology_designs: if not production_technology_designs_dict.get(technology_design.group_uniq_id): technology_design = technology_design.get_technology_design() technology_design.update({'production_id': production_id}) technology_design.pop('group_uniq_id') self.env['sf.technology.design'].create(technology_design) def unified_procedure_multiple_work_orders(self, self_technology_designs, production_item): technology_designs = self.env['sf.technology.design'].sudo().search( [('production_id', '=', production_item.id), ('active', 'in', [True, False])]) self.sync_technology_designs(self_technology_designs=self_technology_designs, production_technology_designs=technology_designs)