From 2cc7386027366060ddc24e2a1eea768efffc8091 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Mon, 10 Mar 2025 17:10:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quality_control/models/quality.py | 80 +++++++++++++++++-------- quality_control/views/quality_views.xml | 1 + sf_quality/__manifest__.py | 1 + sf_quality/data/check_standards.xml | 11 ++++ sf_quality/models/custom_quality.py | 1 + 5 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 sf_quality/data/check_standards.xml diff --git a/quality_control/models/quality.py b/quality_control/models/quality.py index 011c7914..f64864f7 100644 --- a/quality_control/models/quality.py +++ b/quality_control/models/quality.py @@ -34,7 +34,8 @@ class QualityPoint(models.Model): ('day', 'Days'), ('week', 'Weeks'), ('month', 'Months')], default="day") # TDE RENAME ? - is_lot_tested_fractionally = fields.Boolean(string="Lot Tested Fractionally", help="Determines if only a fraction of the lot should be tested") + is_lot_tested_fractionally = fields.Boolean(string="Lot Tested Fractionally", + help="Determines if only a fraction of the lot should be tested") testing_percentage_within_lot = fields.Float(help="Defines the percentage within a lot that should be tested") norm = fields.Float('Norm', digits='Quality Tests') # TDE RENAME ? tolerance_min = fields.Float('Min Tolerance', digits='Quality Tests') @@ -63,7 +64,7 @@ class QualityPoint(models.Model): if n > 1: point.average = mean - point.standard_deviation = sqrt( s / ( n - 1)) + point.standard_deviation = sqrt(s / (n - 1)) elif n == 1: point.average = mean point.standard_deviation = 0.0 @@ -94,7 +95,7 @@ class QualityPoint(models.Model): checks = self.env['quality.check'].search([ ('point_id', '=', self.id), ('create_date', '>=', date_previous.strftime(DEFAULT_SERVER_DATETIME_FORMAT))], limit=1) - return not(bool(checks)) + return not (bool(checks)) return super(QualityPoint, self).check_execute_now() def _get_type_default_domain(self): @@ -123,13 +124,31 @@ class QualityPoint(models.Model): class QualityCheck(models.Model): _inherit = "quality.check" - part_name = fields.Char('零件名称', compute='_compute_part_name_number', readonly=True) + part_name = fields.Char('零件名称', compute='_compute_part_name_number', readonly=True) part_number = fields.Char('零件图号', compute='_compute_part_name_number', readonly=True) + # 材料 + material_name = fields.Char('材料名称', compute='_compute_material_name', readonly=True) + + # # 总数量,值未调拨单_产品明细_数量 + # total_qty = fields.Float('总数量', compute='_compute_total_qty', readonly=True) + # # 检验数 + # check_qty = fields.Float('检验数', compute='_compute_check_qty', readonly=True) + # # 出厂检验报告编号 + # report_number = fields.Char('出厂检验报告编号', compute='_compute_report_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 + + @depends('product_id') + def _compute_material_name(self): + for record in self: + materials_id_name = record.product_id.materials_id.name if record.product_id.materials_id else '' + materials_type_name = record.product_id.materials_type_id.name if record.product_id.materials_type_id else '' + record.material_name = materials_id_name + ' ' + materials_type_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([ @@ -141,7 +160,8 @@ class QualityCheck(models.Model): tolerance_max = fields.Float('Max Tolerance', related='point_id.tolerance_max', readonly=True) warning_message = fields.Text(compute='_compute_warning_message') norm_unit = fields.Char(related='point_id.norm_unit', readonly=True) - qty_to_test = fields.Float(compute="_compute_qty_to_test", string="Quantity to Test", help="Quantity of product to test within the lot") + qty_to_test = fields.Float(compute="_compute_qty_to_test", string="Quantity to Test", + help="Quantity of product to test within the lot") qty_tested = fields.Float(string="Quantity Tested", help="Quantity of product tested within the lot") measure_on = fields.Selection([ ('operation', 'Operation'), @@ -150,7 +170,8 @@ class QualityCheck(models.Model): help="""Operation = One quality check is requested at the operation level. Product = A quality check is requested per product. Quantity = A quality check is requested for each new product quantity registered, with partial quantity checks also possible.""") - move_line_id = fields.Many2one('stock.move.line', 'Stock Move Line', check_company=True, help="In case of Quality Check by Quantity, Move Line on which the Quality Check applies") + move_line_id = fields.Many2one('stock.move.line', 'Stock Move Line', check_company=True, + help="In case of Quality Check by Quantity, Move Line on which the Quality Check applies") lot_name = fields.Char('Lot/Serial Number Name') lot_line_id = fields.Many2one('stock.lot', store=True, compute='_compute_lot_line_id') qty_line = fields.Float(compute='_compute_qty_line', string="Quantity") @@ -231,7 +252,8 @@ class QualityCheck(models.Model): def _compute_qty_to_test(self): for qc in self: if qc.is_lot_tested_fractionally: - qc.qty_to_test = float_round(qc.qty_line * qc.testing_percentage_within_lot / 100, precision_rounding=self.product_id.uom_id.rounding, rounding_method="UP") + qc.qty_to_test = float_round(qc.qty_line * qc.testing_percentage_within_lot / 100, + precision_rounding=self.product_id.uom_id.rounding, rounding_method="UP") else: qc.qty_to_test = qc.qty_line @@ -386,7 +408,8 @@ class QualityAlert(models.Model): class ProductTemplate(models.Model): _inherit = "product.template" - quality_control_point_qty = fields.Integer(compute='_compute_quality_check_qty', groups='quality.group_quality_user') + quality_control_point_qty = fields.Integer(compute='_compute_quality_check_qty', + groups='quality.group_quality_user') quality_pass_qty = fields.Integer(compute='_compute_quality_check_qty', groups='quality.group_quality_user') quality_fail_qty = fields.Integer(compute='_compute_quality_check_qty', groups='quality.group_quality_user') @@ -394,14 +417,16 @@ class ProductTemplate(models.Model): def _compute_quality_check_qty(self): for product_tmpl in self: product_tmpl.quality_fail_qty, product_tmpl.quality_pass_qty = product_tmpl.product_variant_ids._count_quality_checks() - product_tmpl.quality_control_point_qty = product_tmpl.with_context(active_test=product_tmpl.active).product_variant_ids._count_quality_points() + product_tmpl.quality_control_point_qty = product_tmpl.with_context( + active_test=product_tmpl.active).product_variant_ids._count_quality_points() def action_see_quality_control_points(self): self.ensure_one() action = self.env["ir.actions.actions"]._for_xml_id("quality_control.quality_point_action") action['context'] = dict(self.env.context, default_product_ids=self.product_variant_ids.ids) - domain_in_products_or_categs = ['|', ('product_ids', 'in', self.product_variant_ids.ids), ('product_category_ids', 'parent_of', self.categ_id.ids)] + domain_in_products_or_categs = ['|', ('product_ids', 'in', self.product_variant_ids.ids), + ('product_category_ids', 'parent_of', self.categ_id.ids)] domain_no_products_and_categs = [('product_ids', '=', False), ('product_category_ids', '=', False)] action['domain'] = OR([domain_in_products_or_categs, domain_no_products_and_categs]) return action @@ -412,10 +437,10 @@ class ProductTemplate(models.Model): action['context'] = dict(self.env.context, default_product_id=self.product_variant_id.id, create=False) action['domain'] = [ '|', - ('product_id', 'in', self.product_variant_ids.ids), - '&', - ('measure_on', '=', 'operation'), - ('picking_id.move_ids.product_tmpl_id', '=', self.id), + ('product_id', 'in', self.product_variant_ids.ids), + '&', + ('measure_on', '=', 'operation'), + ('picking_id.move_ids.product_tmpl_id', '=', self.id), ] return action @@ -423,7 +448,8 @@ class ProductTemplate(models.Model): class ProductProduct(models.Model): _inherit = "product.product" - quality_control_point_qty = fields.Integer(compute='_compute_quality_check_qty', groups='quality.group_quality_user') + quality_control_point_qty = fields.Integer(compute='_compute_quality_check_qty', + groups='quality.group_quality_user') quality_pass_qty = fields.Integer(compute='_compute_quality_check_qty', groups='quality.group_quality_user') quality_fail_qty = fields.Integer(compute='_compute_quality_check_qty', groups='quality.group_quality_user') @@ -437,10 +463,10 @@ class ProductProduct(models.Model): quality_pass_qty = 0 domain = [ '|', - ('product_id', 'in', self.ids), - '&', - ('measure_on', '=', 'operation'), - ('picking_id.move_ids.product_id', 'in', self.ids), + ('product_id', 'in', self.ids), + '&', + ('measure_on', '=', 'operation'), + ('picking_id.move_ids.product_id', 'in', self.ids), ('company_id', '=', self.env.company.id), ('quality_state', '!=', 'none') ] @@ -464,7 +490,8 @@ class ProductProduct(models.Model): _, where_clause, where_clause_args = query.get_sql() additional_where_clause = self._additional_quality_point_where_clause() where_clause += additional_where_clause - parent_category_ids = [int(parent_id) for parent_id in self.categ_id.parent_path.split('/')[:-1]] if self.categ_id else [] + parent_category_ids = [int(parent_id) for parent_id in + self.categ_id.parent_path.split('/')[:-1]] if self.categ_id else [] self.env.cr.execute(""" SELECT COUNT(*) @@ -485,7 +512,7 @@ class ProductProduct(models.Model): ) ) """ % (where_clause,), where_clause_args + [self.ids, parent_category_ids] - ) + ) return self.env.cr.fetchone()[0] def action_see_quality_control_points(self): @@ -493,7 +520,8 @@ class ProductProduct(models.Model): action = self.product_tmpl_id.action_see_quality_control_points() action['context'].update(default_product_ids=self.ids) - domain_in_products_or_categs = ['|', ('product_ids', 'in', self.ids), ('product_category_ids', 'parent_of', self.categ_id.ids)] + domain_in_products_or_categs = ['|', ('product_ids', 'in', self.ids), + ('product_category_ids', 'parent_of', self.categ_id.ids)] domain_no_products_and_categs = [('product_ids', '=', False), ('product_category_ids', '=', False)] action['domain'] = OR([domain_in_products_or_categs, domain_no_products_and_categs]) return action @@ -504,10 +532,10 @@ class ProductProduct(models.Model): action['context'] = dict(self.env.context, default_product_id=self.id, create=False) action['domain'] = [ '|', - ('product_id', '=', self.id), - '&', - ('measure_on', '=', 'operation'), - ('picking_id.move_ids.product_id', '=', self.id), + ('product_id', '=', self.id), + '&', + ('measure_on', '=', 'operation'), + ('picking_id.move_ids.product_id', '=', self.id), ] return action diff --git a/quality_control/views/quality_views.xml b/quality_control/views/quality_views.xml index c40d42b2..1fd82ee3 100644 --- a/quality_control/views/quality_views.xml +++ b/quality_control/views/quality_views.xml @@ -268,6 +268,7 @@ + diff --git a/sf_quality/__manifest__.py b/sf_quality/__manifest__.py index 9c2c3138..9ca7128a 100644 --- a/sf_quality/__manifest__.py +++ b/sf_quality/__manifest__.py @@ -16,6 +16,7 @@ 'depends': ['quality_control', 'web_widget_model_viewer', 'sf_manufacturing','jikimo_attachment_viewer'], 'data': [ 'security/ir.model.access.csv', + 'data/check_standards.xml', 'views/view.xml', 'views/quality_cnc_test_view.xml', 'views/mrp_workorder.xml', diff --git a/sf_quality/data/check_standards.xml b/sf_quality/data/check_standards.xml new file mode 100644 index 00000000..ace59578 --- /dev/null +++ b/sf_quality/data/check_standards.xml @@ -0,0 +1,11 @@ + + + + + 出厂检验报告 + + product + all + + + diff --git a/sf_quality/models/custom_quality.py b/sf_quality/models/custom_quality.py index 8bf10c3e..f2277b7e 100644 --- a/sf_quality/models/custom_quality.py +++ b/sf_quality/models/custom_quality.py @@ -4,6 +4,7 @@ from odoo import models, fields class SfQualityPoint(models.Model): _inherit = 'quality.point' + _rec_name = 'title' product_ids = fields.Many2many( 'product.product', string='适用产品',