diff --git a/quality_control/models/quality.py b/quality_control/models/quality.py index ebe73384..f2444024 100644 --- a/quality_control/models/quality.py +++ b/quality_control/models/quality.py @@ -7,6 +7,7 @@ from datetime import datetime import random from odoo import api, models, fields, _ +from odoo.api import depends from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, float_round from odoo.osv.expression import OR @@ -122,7 +123,13 @@ class QualityPoint(models.Model): class QualityCheck(models.Model): _inherit = "quality.check" - + part_name = fields.Char('零件名称', compute='_compute_part_name_number', readonly=True) + part_number = fields.Char('零件图号', compute='_compute_part_name_number', readonly=True) + @depends('product_id') + def _compute_part_name_number(self): + for record in self: + record.part_number = record.product_id.part_number + record.part_name = record.product_id.part_name failure_message = fields.Html(related='point_id.failure_message', readonly=True) measure = fields.Float('Measure', default=0.0, digits='Quality Tests', tracking=True) measure_success = fields.Selection([ diff --git a/quality_control/views/quality_views.xml b/quality_control/views/quality_views.xml index 8e5af75a..f4f05420 100644 --- a/quality_control/views/quality_views.xml +++ b/quality_control/views/quality_views.xml @@ -389,6 +389,8 @@ + + diff --git a/sf_dlm/models/stock_rule_inherit.py b/sf_dlm/models/stock_rule_inherit.py index 4a40ca2f..4d715196 100644 --- a/sf_dlm/models/stock_rule_inherit.py +++ b/sf_dlm/models/stock_rule_inherit.py @@ -9,9 +9,9 @@ class StockRuleInherit(models.Model): @api.model def _run_buy(self, procurements): # 判断补货组的采购类型 - procurements_group = {'standard': [], 'consignment': []} + procurements_group = {'standard': [], 'outsourcing': []} for procurement, rule in procurements: - is_consignment = False + is_outsourcing = False product = procurement.product_id # 获取主 BOM bom = self.env['mrp.bom'].search([('product_tmpl_id', '=', product.product_tmpl_id.id)], limit=1) @@ -24,17 +24,17 @@ class StockRuleInherit(models.Model): for route in raw_material.route_ids: # print('route.name:', route.name) if route.name == '按订单补给外包商': - is_consignment = True + is_outsourcing = True - if is_consignment: - procurements_group['consignment'].append((procurement, rule)) + if is_outsourcing: + procurements_group['outsourcing'].append((procurement, rule)) else: procurements_group['standard'].append((procurement, rule)) for key, value in procurements_group.items(): super(StockRuleInherit, self)._run_buy(value) - if key == 'consignment': + if key == 'outsourcing': for procurement, rule in value: supplier = procurement.values.get('supplier') if supplier: @@ -49,7 +49,7 @@ class StockRuleInherit(models.Model): ], limit=1) logging.info("po=: %s", po) if po: - po.write({'purchase_type': 'consignment'}) + po.write({'purchase_type': 'outsourcing'}) # # 首先调用父类的 _run_buy 方法,以保留原有逻辑 # super(StockRuleInherit, self)._run_buy(procurements) @@ -83,5 +83,5 @@ class StockRuleInherit(models.Model): # ], limit=1) # logging.info("po=: %s", po) # if po: - # po.write({'purchase_type': 'consignment'}) + # po.write({'purchase_type': 'outsourcing'}) # break diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index a7e9398c..ed117589 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -363,15 +363,9 @@ class MrpProduction(models.Model): # if production.state == 'pending_cam': # if all(wo_state in 'done' for wo_state in production.workorder_ids.mapped('state')): # production.state = 'done' - if any( - ( - wo.test_results == '返工' and wo.state == 'done' and production.programming_state in [ - '已编程']) or ( - wo.state == 'rework' and production.programming_state == '编程中') or ( - wo.is_rework is True and wo.state == 'done' and production.programming_state in ['编程中', - '已编程']) - for wo in - production.workorder_ids): + if any((wo.test_results == '返工' and wo.state == 'done' and production.programming_state in ['已编程']) + or (wo.is_rework is True and wo.state == 'done' and production.programming_state in ['编程中', '已编程']) + for wo in production.workorder_ids): production.state = 'rework' if any(wo.test_results == '报废' and wo.state == 'done' for wo in production.workorder_ids): production.state = 'scrap' diff --git a/sf_manufacturing/models/purchase_order.py b/sf_manufacturing/models/purchase_order.py index 1ffed728..607f64d1 100644 --- a/sf_manufacturing/models/purchase_order.py +++ b/sf_manufacturing/models/purchase_order.py @@ -31,3 +31,13 @@ class PurchaseOrder(models.Model): class PurchaseOrderLine(models.Model): _inherit = 'purchase.order.line' part_number = fields.Char('零件图号', related='product_id.part_number', readonly=True) + related_product = fields.Many2one('product.product',compute='_compute_related_product', string='关联产品',help='经此产品工艺加工成的成品') + @api.depends('order_id.origin') + def _compute_related_product(self): + for record in self: + if record.product_id.detailed_type: + production_id = self.env['mrp.production'].search([('name', '=', record.order_id.origin)]) + record.related_product = production_id.product_id if production_id else False + else: + record.related_product = False + diff --git a/sf_manufacturing/models/sf_technology_design.py b/sf_manufacturing/models/sf_technology_design.py index 392aa021..15d2c22d 100644 --- a/sf_manufacturing/models/sf_technology_design.py +++ b/sf_manufacturing/models/sf_technology_design.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +from collections import Counter + from odoo import fields, models, api, _ from odoo.exceptions import ValidationError @@ -6,7 +8,7 @@ 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='表面工艺参数') @@ -17,6 +19,11 @@ class sf_technology_design(models.Model): 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, @@ -28,6 +35,9 @@ class sf_technology_design(models.Model): 'is_auto': True}] return workorders_values_str + def write(self, vals): + print('qwfojkqwfkio') + return super(sf_technology_design, self).write(vals) def unlink_technology_design(self): self.active = False @@ -37,4 +47,64 @@ class sf_technology_design(models.Model): for vals in vals_list: if not vals.get('route_id'): raise ValidationError(_("工序不能为空")) - return super(sf_technology_design, self).create(vals_list) + 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) \ No newline at end of file diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 7fc2e8c5..1e47b873 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -174,8 +174,6 @@