From a7ed317b09a1edbf4cb239cde698991c35879431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Wed, 20 Nov 2024 16:53:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95=E5=AE=A2?= =?UTF-8?q?=E4=BE=9B=E6=96=99=E6=98=BE=E7=A4=BA=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=86=85=E9=83=A8=E8=B0=83=E6=8B=A8=E3=80=81=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E5=8F=91=E6=96=99=E5=90=88=E5=B9=B6=E5=8D=95=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 47 +++++++++++ sf_manufacturing/models/stock.py | 80 +++++++++++++------ sf_manufacturing/security/ir.model.access.csv | 1 + sf_sale/models/sale_order.py | 9 ++- sf_sale/views/sale_order_view.xml | 4 +- 5 files changed, 112 insertions(+), 29 deletions(-) diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 536cc13a..132373da 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -1382,7 +1382,54 @@ class MrpProduction(models.Model): def _compute_production_type(self): for production in self: production.production_type = '自动化产线加工' if not production.product_id.is_manual_processing else '人工线下加工' + + @api.model_create_multi + def create(self, vals_list): + """ + 重载创建制造订单的方法,单件制造订单只创建一个采购组,用于后续单据的创建 + """ + group_id = None + for vals in vals_list: + if not vals.get('name', False) or vals['name'] == _('New'): + picking_type_id = vals.get('picking_type_id') + if not picking_type_id: + picking_type_id = self._get_default_picking_type_id(vals.get('company_id', self.env.company.id)) + vals['picking_type_id'] = picking_type_id + vals['name'] = self.env['stock.picking.type'].browse(picking_type_id).sequence_id.next_by_id() + if not vals.get('procurement_group_id'): + product_id = self.env['product.product'].browse(vals['product_id']) + if product_id.product_tmpl_id.single_manufacturing: + procurement_group_vals = self._prepare_procurement_group_vals(vals) + group_id = self.env["procurement.group"].create(procurement_group_vals).id if not group_id else group_id + vals['procurement_group_id'] = group_id + return super(MrpProduction, self).create(vals_list) + @api.depends('procurement_group_id.stock_move_ids.created_purchase_line_id.order_id', 'procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id') + def _compute_purchase_order_count(self): + for production in self: + # 找到来源的第一张制造订单的采购组 + if production.product_id.product_tmpl_id.single_manufacturing == True: + first_production = self.env['mrp.production'].search([('origin', '=', production.origin)], limit=1, order='id asc') + production.purchase_order_count = len(first_production.procurement_group_id.stock_move_ids.created_purchase_line_id.order_id | + first_production.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id) + else: + production.purchase_order_count = len(production.procurement_group_id.stock_move_ids.created_purchase_line_id.order_id | + production.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id) + + @api.depends('procurement_group_id', 'procurement_group_id.stock_move_ids.group_id') + def _compute_picking_ids(self): + for order in self: + if order.product_id.product_tmpl_id.single_manufacturing == True: + first_order = self.env['mrp.production'].search([('origin', '=', order.origin)], limit=1, order='id asc') + order.picking_ids = self.env['stock.picking'].search([ + ('group_id', '=', first_order.procurement_group_id.id), ('group_id', '!=', False), + ]) + order.delivery_count = len(first_order.picking_ids) + else: + order.picking_ids = self.env['stock.picking'].search([ + ('group_id', '=', order.procurement_group_id.id), ('group_id', '!=', False), + ]) + order.delivery_count = len(order.picking_ids) class sf_detection_result(models.Model): _name = 'sf.detection.result' diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 9642cb51..3acf4cb4 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -125,30 +125,36 @@ class StockRule(models.Model): product = self.env['product.product'].search( [("id", '=', item[0].product_id.id)]) - product_tmpl = self.env['product.template'].search( - ["&", ("id", '=', product.product_tmpl_id.id), ('single_manufacturing', "!=", False)]) - if product_tmpl: - if num > 1: - for no in range(1, num + 1): - Procurement = namedtuple('Procurement', ['product_id', 'product_qty', - 'product_uom', 'location_id', 'name', 'origin', - 'company_id', - 'values']) - s = Procurement(product_id=item[0].product_id, product_qty=1.0, product_uom=item[0].product_uom, - location_id=item[0].location_id, - name=item[0].name, - origin=item[0].origin, - company_id=item[0].company_id, - values=item[0].values, - ) - item1 = list(item) - item1[0] = s + # 如果产品是坯料,则根据作业类型来设置采购组 + if product.categ_id.name == '坯料': + if item[1]['picking_type_id'].name in ['生产发料', '内部调拨']: + item[0][7]['group_id'] = procurements[0][0][7]['group_id'] + list2.append(item) + else: + product_tmpl = self.env['product.template'].search( + ["&", ("id", '=', product.product_tmpl_id.id), ('single_manufacturing', "!=", False)]) + if product_tmpl: + if num > 1: + for no in range(1, num + 1): + Procurement = namedtuple('Procurement', ['product_id', 'product_qty', + 'product_uom', 'location_id', 'name', 'origin', + 'company_id', + 'values']) + s = Procurement(product_id=item[0].product_id, product_qty=1.0, product_uom=item[0].product_uom, + location_id=item[0].location_id, + name=item[0].name, + origin=item[0].origin, + company_id=item[0].company_id, + values=item[0].values, + ) + item1 = list(item) + item1[0] = s - list2.append(tuple(item1)) + list2.append(tuple(item1)) + else: + list2.append(item) else: list2.append(item) - else: - list2.append(item) for procurement, rule in list2: procure_method = rule.procure_method @@ -208,6 +214,12 @@ class StockRule(models.Model): '''创建制造订单''' productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company(company_id).create( productions_values) + # 将这一批制造订单的采购组设置为不同的采购组 + for index, production in enumerate(productions): + if index > 0: + productions_values[index].update({'name': production.name}) + procurement_group_vals = production._prepare_procurement_group_vals(productions_values[index]) + production.procurement_group_id = self.env["procurement.group"].create(procurement_group_vals).id # self.env['stock.move'].sudo().create(productions._get_moves_raw_values()) # self.env['stock.move'].sudo().create(productions._get_moves_finished_values()) @@ -941,10 +953,28 @@ class ReStockMove(models.Model): qty_by_location[loc.id] += 1 return move_lines_commands - # def _prepare_procurement_origin(self): - # """修改采购来源""" - # self.ensure_one() - # return self.group_id and self.group_id.name or (self.origin or self.picking_id.name or "/") + def _merge_moves_fields(self): + """ + 合并制造订单的完成move单据 + """ + res = super(ReStockMove, self)._merge_moves_fields() + res = self._single_manufactuing_mo_generate_origin(res) + return res + + def _get_new_picking_values(self): + res = super(ReStockMove, self)._get_new_picking_values() + res = self._single_manufactuing_mo_generate_origin(res) + return res + + def _single_manufactuing_mo_generate_origin(self, res): + """ + 单件制造订单的完成move单据修改来源为制造订单 + """ + if self[0].origin and self.picking_type_id.name in ['生产发料', '内部调拨']: + production = self.env['mrp.production'].search([('name', '=', self[0].origin)], limit=1, order='id asc') + productions = self.env['mrp.production'].search([('origin', '=', production.origin)]) + res['origin'] = ','.join(productions.mapped('name')) + return res class ReStockQuant(models.Model): diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index b9d0710f..f9f4c159 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -178,3 +178,4 @@ access_sf_production_technology_re_adjust_wizard_group_production_engineer,sf_pr access_sf_manual_product_model_type_routing_sort_group_sf_mrp_user,sf_manual_product_model_type_routing_sort,model_sf_manual_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0 access_sf_manual_product_model_type_routing_sort_manager,sf_manual_product_model_type_routing_sort,model_sf_manual_product_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0 access_sf_manual_product_model_type_routing_sort_group_plan_dispatch,sf_manual_product_model_type_routing_sort_group_plan_dispatch,model_sf_manual_product_model_type_routing_sort,sf_base.group_plan_dispatch,1,0,0,0 +access_sf_detection_result_manager,sf_detection_result_manager,model_sf_detection_result,,1,1,1,1 diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index 5cc826eb..0b1871ed 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -133,7 +133,7 @@ class ReSaleOrder(models.Model): 'product_uom_qty': item['number'], 'model_glb_file': base64.b64decode(item['model_file']), 'remark': item.get('remark'), - 'embryo_redundancy_id': item.get('embryo_redundancy_id'), + 'is_incoming_material': True if item.get('embryo_redundancy_id') else False, 'manual_quotation': item.get('manual_quotation') } return self.env['sale.order.line'].with_context(skip_procurement=True).create(vals) @@ -175,10 +175,15 @@ class ResaleOrderLine(models.Model): check_status = fields.Selection(related='order_id.check_status') remark = fields.Char('备注') - # is_incoming_material = fields.Boolean('客供料', default=False) + is_incoming_material = fields.Boolean('客供料', compute='_compute_is_incoming_material', store=True) embryo_redundancy_id = fields.Many2one('sf.embryo.redundancy', '坯料冗余') manual_quotation = fields.Boolean('人工编程', default=False) + @api.depends('embryo_redundancy_id') + def _compute_is_incoming_material(self): + for line in self: + line.is_incoming_material = True if line.embryo_redundancy_id else False + @api.depends('product_template_id') def _compute_model_glb_file(self): for line in self: diff --git a/sf_sale/views/sale_order_view.xml b/sf_sale/views/sale_order_view.xml index 5da88398..a5adfcfa 100644 --- a/sf_sale/views/sale_order_view.xml +++ b/sf_sale/views/sale_order_view.xml @@ -119,7 +119,7 @@ - + {'readonly': [('state', 'in', ['cancel','sale'])]} @@ -167,7 +167,7 @@ - +