from odoo import api, models class StockPicking(models.Model): _inherit = 'stock.picking' def button_validate(self): res = super(StockPicking, self).button_validate() """ 出厂检验报告上传 """ out_quality_check = self.env['quality.check'].search( [('picking_id', '=', self.id), ('test_type_id.name', '=', '出厂检验报告')]) if not out_quality_check.is_factory_report_uploaded: if out_quality_check and self.state == 'assigned': out_quality_check.upload_factory_report() """ 调拨单若关联了质量检查单,验证调拨单时,应校验是否有不合格品,若存在,应弹窗提示: “警告:存在不合格产品XXXX n 件、YYYYY m件,继续调拨请点“确认”,否则请取消?” """ context = self.env.context if not context.get('again_validate') and self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'): # 回滚事务,为二次确认/取消做准备 self.env.cr.rollback() quality_check_ids = self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail') product_list = list(set([quality_check_id.product_id for quality_check_id in quality_check_ids])) fail_check_text = '' for product_id in product_list: check_ids = quality_check_ids.filtered(lambda qc: qc.product_id == product_id) if all(check_id.measure_on == 'move_line' for check_id in check_ids): number = sum(check_ids.mapped('qty_line')) else: number = sum(self.move_ids_without_package.filtered( lambda ml: ml.product_id == product_id).mapped('quantity_done')) fail_check_text = (f'{fail_check_text}、{product_id.name} {number}件' if fail_check_text != '' else f'{product_id.name} {number}件') return { 'type': 'ir.actions.act_window', 'res_model': 'picking.validate.check.wizard', 'name': '质检不合格提示', 'view_mode': 'form', 'target': 'new', 'context': { 'default_picking_id': self.id, 'default_fail_check_text': f'警告:存在不合格产品{fail_check_text},继续调拨请点“确认”,否则请取消?', 'again_validate': True} } return res