diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 66cfb98f..536cc13a 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -701,7 +701,6 @@ class MrpProduction(models.Model): for workorder in production.workorder_ids: workorder.duration_expected = workorder._get_duration_expected() - # 外协出入库单处理 def get_subcontract_pick_purchase(self): production_all = self.sorted(lambda x: x.id) @@ -715,67 +714,43 @@ class MrpProduction(models.Model): [('surface_technics_parameters_id', '!=', False), ('production_id', '=', production.id), ('is_subcontract', '=', True)], order='sequence asc') if process_parameter_workorder: - is_pick = False consecutive_workorders = [] - m = 0 sorted_workorders = sorted(process_parameter_workorder, key=lambda w: w.sequence) - for i in range(len(sorted_workorders) - 1): - if m == 0: - is_pick = False - logging.info(sorted_workorders[i].sequence) - logging.info(sorted_workorders[i + 1].sequence) - logging.info(sorted_workorders[i + 1].sequence - 1) - if sorted_workorders[i].supplier_id.id == sorted_workorders[i + 1].supplier_id.id and \ - sorted_workorders[i].sequence == sorted_workorders[i + 1].sequence - 1: - if sorted_workorders[i] not in consecutive_workorders: - consecutive_workorders.append(sorted_workorders[i]) - consecutive_workorders.append(sorted_workorders[i + 1]) - m += 1 - continue + for i, workorder in enumerate(sorted_workorders): + # 检查当前工作订单和下一个工作订单是否连续,并且供应商相同 + if workorder.sequence == 1: + consecutive_workorders.append(workorder) + elif workorder.sequence == sorted_workorders[ + i - 1].sequence + 1 and workorder.supplier_id.id == sorted_workorders[i - 1].supplier_id.id: + consecutive_workorders.append(workorder) else: - if m == len(consecutive_workorders) - 1 and m != 0: - self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, - production) - self.env['purchase.order'].get_purchase_order(consecutive_workorders, - production, + # 处理连续组,如果它不为空 + if consecutive_workorders: + # 创建出库拣货单和采购订单 + self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) + self.env['purchase.order'].get_purchase_order(consecutive_workorders, production, product_id_to_production_names) - if sorted_workorders[i] in consecutive_workorders: - is_pick = True - consecutive_workorders = [] - m = 0 - # 当前面的连续工序生成对应的外协出入库单再生成当前工序的外协出入库单 - if is_pick is False: - self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], - production) - self.env['purchase.order'].get_purchase_order(sorted_workorders[i], - production, - product_id_to_production_names) - if m == len(consecutive_workorders) - 1 and m != 0: - self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, - production) - self.env['purchase.order'].get_purchase_order(consecutive_workorders, - production, - product_id_to_production_names) - if sorted_workorders[i] in consecutive_workorders: - is_pick = True - consecutive_workorders = [] - m = 0 - if m == len(consecutive_workorders) - 1 and m != 0: + if i < len(sorted_workorders) - 1: + # 重置连续组,并添加当前工作订单 + consecutive_workorders = [workorder] + else: + # 判断最后一笔: + if workorder.sequence == sorted_workorders[ + i - 1].sequence and workorder.supplier_id.id == sorted_workorders[ + i - 1].supplier_id.id: + consecutive_workorders = [workorder] + else: + # 立即创建出库拣货单和采购订单 + self.env['stock.picking'].create_outcontract_picking(workorder, production) + self.env['purchase.order'].get_purchase_order(workorder, production, + product_id_to_production_names) + consecutive_workorders = [] + + # 处理最后一个组,即使它可能只有一个工作订单 + if consecutive_workorders: self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) - self.env['purchase.order'].get_purchase_order(consecutive_workorders, - production, + self.env['purchase.order'].get_purchase_order(consecutive_workorders, production, product_id_to_production_names) - if is_pick is False and m == 0: - if len(sorted_workorders) == 1: - self.env['stock.picking'].create_outcontract_picking(sorted_workorders, production) - self.env['purchase.order'].get_purchase_order(sorted_workorders, - production, - product_id_to_production_names) - else: - self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production) - self.env['purchase.order'].get_purchase_order(sorted_workorders[i], - production, - product_id_to_production_names) # 工单排序 def _reset_work_order_sequence1(self, k): @@ -875,7 +850,6 @@ class MrpProduction(models.Model): if td_ids: work.sequence = td_ids[0].sequence - def _reset_work_order_sequence_1(self): """ 工单工序排序方法(旧) diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index e0d51bea..cb4ac951 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -647,40 +647,43 @@ class StockPicking(models.Model): # 创建 外协出库入单 def create_outcontract_picking(self, sorted_workorders_arr, item): - for sorted_workorders in sorted_workorders_arr: - # pick_ids = [] - if not sorted_workorders.picking_ids: - outcontract_stock_move = self.env['stock.move'].search( - [('workorder_id', '=', sorted_workorders.id), ('production_id', '=', item.id)]) - if not outcontract_stock_move: - new_picking = True - location_id = self.env['stock.location'].search( - [('barcode', 'ilike', 'VL-SPOC')]).id, - location_dest_id = self.env['stock.location'].search( - [('barcode', 'ilike', 'WH-PREPRODUCTION')]).id, - outcontract_picking_type_in = self.env.ref( - 'sf_manufacturing.outcontract_picking_in').id, - outcontract_picking_type_out = self.env.ref( - 'sf_manufacturing.outcontract_picking_out').id, - moves_out = self.env['stock.move'].sudo().create( - self.env['stock.move']._get_stock_move_values_Res(item, location_dest_id, location_id, - outcontract_picking_type_out)) - picking_out = self.create( - moves_out._get_new_picking_values_Res(item, sorted_workorders, 'WH/OCOUT/')) - # pick_ids.append(picking_out.id) - moves_out.write( - {'picking_id': picking_out.id, 'state': 'waiting', 'workorder_id': sorted_workorders.id}) - moves_out._assign_picking_post_process(new=new_picking) - moves_in = self.env['stock.move'].sudo().create( - self.env['stock.move']._get_stock_move_values_Res(item, location_id, location_dest_id, - outcontract_picking_type_in)) - picking_in = self.create( - moves_in._get_new_picking_values_Res(item, sorted_workorders, 'WH/OCIN/')) - # pick_ids.append(picking_in.id) - moves_in.write( - {'picking_id': picking_in.id, 'state': 'waiting', 'workorder_id': sorted_workorders.id}) - moves_in._assign_picking_post_process(new=new_picking) - # sorted_workorders.write({'picking_ids': [(6, 0, pick_ids)]}) + if len(sorted_workorders_arr) > 1: + sorted_workorders_arr = sorted_workorders_arr[0] + stock_picking = self.env['stock.picking'].search( + [('origin', '=', sorted_workorders_arr.production_id.name), ('name', 'ilike', 'OCOUT')]) + if not stock_picking: + for sorted_workorders in sorted_workorders_arr: + # pick_ids = [] + if not sorted_workorders.picking_ids: + outcontract_stock_move = self.env['stock.move'].search([('production_id', '=', item.id)]) + if not outcontract_stock_move: + new_picking = True + location_id = self.env['stock.location'].search( + [('barcode', 'ilike', 'VL-SPOC')]).id, + location_dest_id = self.env['stock.location'].search( + [('barcode', 'ilike', 'WH-PREPRODUCTION')]).id, + outcontract_picking_type_in = self.env.ref( + 'sf_manufacturing.outcontract_picking_in').id, + outcontract_picking_type_out = self.env.ref( + 'sf_manufacturing.outcontract_picking_out').id, + moves_out = self.env['stock.move'].sudo().create( + self.env['stock.move']._get_stock_move_values_Res(item, location_dest_id, location_id, + outcontract_picking_type_out)) + picking_out = self.create( + moves_out._get_new_picking_values_Res(item, sorted_workorders, 'WH/OCOUT/')) + # pick_ids.append(picking_out.id) + moves_out.write( + {'picking_id': picking_out.id, 'state': 'waiting'}) + moves_out._assign_picking_post_process(new=new_picking) + moves_in = self.env['stock.move'].sudo().create( + self.env['stock.move']._get_stock_move_values_Res(item, location_id, location_dest_id, + outcontract_picking_type_in)) + picking_in = self.create( + moves_in._get_new_picking_values_Res(item, sorted_workorders, 'WH/OCIN/')) + # pick_ids.append(picking_in.id) + moves_in.write( + {'picking_id': picking_in.id, 'state': 'waiting'}) + moves_in._assign_picking_post_process(new=new_picking) class ReStockMove(models.Model): @@ -786,7 +789,6 @@ class ReStockMove(models.Model): elif self.product_id.tracking == "lot": self._put_tool_lot(self.company_id, self.product_id, self.origin) - return { 'name': _('Detailed Operations'), 'type': 'ir.actions.act_window',