diff --git a/jikimo_purchase_request/models/stock_rule.py b/jikimo_purchase_request/models/stock_rule.py index 08f32b2d..81f4f8ee 100644 --- a/jikimo_purchase_request/models/stock_rule.py +++ b/jikimo_purchase_request/models/stock_rule.py @@ -1,4 +1,5 @@ from odoo import api, fields, models +from collections import defaultdict class StockRule(models.Model): @@ -44,7 +45,39 @@ class StockRule(models.Model): purchase_request_line_model.create(request_line_data) def _run_buy(self, procurements): - res = super(StockRule, self)._run_buy(procurements) + # 如果补货组相同,并且产品相同,则合并 + procurements_dict = defaultdict() + for procurement, rule in procurements: + if (procurement.product_id, procurement.values['group_id'], rule) not in procurements_dict: + procurements_dict[(procurement.product_id, procurement.values['group_id'], rule)] = { + 'product_id': procurement.product_id, + 'product_qty': procurement.product_qty, + 'product_uom': procurement.product_uom, + 'location_id': procurement.location_id, + 'name': procurement.name, + 'origin': procurement.origin, + 'company_id': procurement.company_id, + 'values': procurement.values, + 'rule': rule + } + else: + procurements_dict[(procurement.product_id, procurement.values['group_id'], rule)]['product_qty'] += procurement.product_qty + new_procurements = [] + for k, p in procurements_dict.items(): + new_procurements.append(( + self.env['procurement.group'].Procurement( + product_id=p['product_id'], + product_qty=p['product_qty'], + product_uom=p['product_uom'], + location_id=p['location_id'], + name=p['name'], + origin=p['origin'], + company_id=p['company_id'], + values=p['values'] + ), p['rule']) + ) + + res = super(StockRule, self)._run_buy(new_procurements) # 判断是否根据规则生成新的采购申请单据,如果生成则修改状态为 approved origins = list(set([procurement[0].origin for procurement in procurements])) for origin in origins: diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index c051126c..b9d75545 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -928,7 +928,7 @@ class MrpProduction(models.Model): 'sf_stock.stock_route_process_outsourcing').id)] for product_id, request_line_list in grouped_purchase_request_line_sorted_list.items(): cur_request_line = request_line_list[0] - cur_request_line['product_qty'] = len(request_line_list) + # cur_request_line['product_qty'] = cur_request_line['product_qty'] cur_request_line['request_id'] = pr.id cur_request_line['origin'] = ", ".join({item['production_name'] for item in request_line_list if item.get('production_name')}) cur_request_line.pop('group_id', None) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 4c01ec06..ad5230ad 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1269,9 +1269,9 @@ class ResMrpWorkOrder(models.Model): workorder.state = 'pending' continue # ================= 如果制造订单制造类型为【人工线下加工】========================== - lot_id = workorder.production_id.move_raw_ids.move_line_ids.lot_id - picking_ids = workorder.production_id.picking_ids.filtered( - lambda wk: wk.location_id.name == '外协收料区' and wk.location_dest_id.name == '制造前') + # lot_id = workorder.production_id.move_raw_ids.move_line_ids.lot_id + # picking_ids = workorder.production_id.picking_ids.filtered( + # lambda wk: wk.location_id.name == '外协收料区' and wk.location_dest_id.name == '制造前') # exists = any( # move_line.lot_id == lot_id # for picking in picking_ids @@ -1279,7 +1279,7 @@ class ResMrpWorkOrder(models.Model): # for move_line in move.move_line_ids # ) if (workorder.production_id.production_type == '人工线下加工' - and workorder.production_id.schedule_state == '已排' and lot_id): + and workorder.production_id.schedule_state == '已排'): # and workorder.production_id.programming_state == '已编程' if workorder.is_subcontract is True: if workorder.production_id.state == 'rework': @@ -1369,11 +1369,10 @@ class ResMrpWorkOrder(models.Model): # 判断是否有坯料的序列号信息 boolean = False if self.production_id.move_raw_ids: - if self.production_id.move_raw_ids[0].product_id.categ_type == '坯料': + if self.production_id.move_raw_ids[0].product_id.categ_type == '坯料' and self.production_id.move_raw_ids[0].product_id.tracking == 'serial': if self.production_id.move_raw_ids[0].move_line_ids: - if self.production_id.move_raw_ids[0].move_line_ids: - if self.production_id.move_raw_ids[0].move_line_ids[0].lot_id.name: - boolean = True + if self.production_id.move_raw_ids[0].move_line_ids[0].lot_id.name: + boolean = True else: boolean = True if not boolean: diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 3a1b3cd9..249c3d9b 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -675,6 +675,7 @@ class StockPicking(models.Model): # 创建 外协出库入单 def create_outcontract_picking(self, workorders, item, sorted_workorders): + production = workorders[0].production_id for workorder in workorders: if workorder.move_subcontract_workorder_ids: workorder.move_subcontract_workorder_ids.write({'state': 'cancel'}) @@ -706,7 +707,7 @@ class StockPicking(models.Model): }) moves_in = self.env['stock.move'].sudo().with_context(context).create( self.env['stock.move']._get_stock_move_values_Res(item, outcontract_picking_type_in, - procurement_group_id.id, move_dest_id)) + procurement_group_id.id, move_dest_id, production.product_uom_qty)) picking_in = self.create( moves_in._get_new_picking_values_Res(item, workorder, 'WH/OCIN/')) # pick_ids.append(picking_in.id) @@ -716,7 +717,7 @@ class StockPicking(models.Model): # self.env.context.get('default_production_id') moves_out = self.env['stock.move'].sudo().with_context(context).create( self.env['stock.move']._get_stock_move_values_Res(item, outcontract_picking_type_out, - procurement_group_id.id, moves_in.id)) + procurement_group_id.id, moves_in.id, production.product_uom_qty)) workorder.write({'move_subcontract_workorder_ids': [(6, 0, [moves_in.id, moves_out.id])]}) picking_out = self.create( moves_out._get_new_picking_values_Res(item, workorder, 'WH/OCOUT/')) @@ -848,7 +849,7 @@ class ReStockMove(models.Model): traceback_error = traceback.format_exc() logging.error("零件图号 零件名称获取失败:%s" % traceback_error) - def _get_stock_move_values_Res(self, item, picking_type_id, group_id, move_dest_ids=False): + def _get_stock_move_values_Res(self, item, picking_type_id, group_id, move_dest_ids=False, product_uom_qty=1.0): route_id = self.env.ref('sf_manufacturing.route_surface_technology_outsourcing').id stock_rule = self.env['stock.rule'].sudo().search( [('route_id', '=', route_id), ('picking_type_id', '=', picking_type_id)]) @@ -857,7 +858,7 @@ class ReStockMove(models.Model): 'company_id': item.company_id.id, 'product_id': item.bom_id.bom_line_ids.product_id.id, 'product_uom': item.bom_id.bom_line_ids.product_uom_id.id, - 'product_uom_qty': 1.0, + 'product_uom_qty': product_uom_qty, 'location_id': stock_rule.location_src_id.id, 'location_dest_id': stock_rule.location_dest_id.id, 'origin': item.name, diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index 49bd0264..beb589fc 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -397,7 +397,7 @@ class RePurchaseOrder(models.Model): "name": production.procurement_group_id.name, "date_required": fields.Datetime.now(), "product_uom_id":server_template.uom_id.id, - "product_qty": 1, + "product_qty": production.product_qty, "request_id": False, "move_dest_ids": False, "orderpoint_id": False, @@ -420,7 +420,7 @@ class RePurchaseOrder(models.Model): ('detailed_type', '=', 'service')]) server_product_process.append((0, 0, { 'product_id': server_template.product_variant_id.id, - 'product_qty': 1, + 'product_qty': production.product_uom_qty, 'product_uom': server_template.uom_id.id, 'related_product': production.product_id.id, 'manual_part_number': pp.part_number,