diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index 7bfc0abb..07438afb 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -1574,12 +1574,18 @@ class MrpProduction(models.Model):
first_order = self.env['mrp.production'].search(
[('origin', '=', order.origin), ('product_id', '=', order.product_id.id)], limit=1, order='id asc')
order.picking_ids = self.env['stock.picking'].search([
- ('group_id', '=', first_order.procurement_group_id.id), ('group_id', '!=', False),
+ ('group_id', '!=', False), ('state', '!=', 'cancel'),
+ '|', # 表示“或”的开始
+ ('group_id', '=', order.procurement_group_id.id),
+ ('related_group_ids', '=', order.procurement_group_id.id)
])
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),
+ ('group_id', '!=', False),('state', '!=', 'cancel'),
+ '|', # 表示“或”的开始
+ ('group_id', '=', order.procurement_group_id.id),
+ ('related_group_ids', '=', order.procurement_group_id.id)
])
order.delivery_count = len(order.picking_ids)
diff --git a/sf_manufacturing/models/sale_order.py b/sf_manufacturing/models/sale_order.py
index 5d318141..3cc8e587 100644
--- a/sf_manufacturing/models/sale_order.py
+++ b/sf_manufacturing/models/sale_order.py
@@ -148,8 +148,52 @@ class SaleOrder(models.Model):
self.env.ref("base.user_admin")).bom_create(product, bom_type, 'product')
product_bom_purchase.with_user(self.env.ref("base.user_admin")).bom_create_line_has(
purchase_embryo)
- return super(SaleOrder, self).action_confirm()
+ result = super(SaleOrder, self).action_confirm()
+ self.merge_picking()
+ return result
+ def merge_picking(self):
+ """
+ 合并多个stock.picking为一个新的stock.picking。
+ :param picking_ids: 需要合并的stock.picking记录ID列表
+ :return: 合并后的新的stock.picking对象
+ """
+ picking_ids = self.env['stock.picking'].search([('retrospect_ref', '=', self.default_code)])
+ if not picking_ids:
+ return
+ # 获取需要合并的 stock.picking 记录
+ # 创建一个新的 stock.picking 作为合并结果
+ new_picking = self.env['stock.picking'].create({
+ 'partner_id': picking_ids[0].partner_id.id,
+ 'location_id': picking_ids[0].location_id.id,
+ 'location_dest_id': picking_ids[0].location_dest_id.id,
+ 'move_ids': False,
+ 'sale_id': self.id,
+ 'picking_type_id': picking_ids[0].picking_type_id.id,
+ 'origin': '合并自: ' + ','.join([p.origin for p in picking_ids]),
+ 'retrospect_ref':self.default_code,
+ 'person_of_delivery':picking_ids[0].person_of_delivery,
+ 'telephone_of_delivery': picking_ids[0].telephone_of_delivery,
+ 'address_of_delivery': picking_ids[0].address_of_delivery,
+ 'group_id':picking_ids[0].group_id.id
+ })
+
+ # 合并所有 move_lines
+ for picking in picking_ids:
+ for move in picking.move_ids:
+ # 复制 move_lines 到新的 picking
+ new_move_vals = move.copy_data()[0]
+ new_move_vals['picking_id']=new_picking.id
+ self.env['stock.move'].create(new_move_vals)
+
+ # 处理合并后的配送单状态
+ new_picking.action_confirm() # 确认新的配送单
+ new_picking.action_assign() # 分配新的配送单
+
+ # 删除原有的配送单
+ picking_ids.write({'state': 'cancel'}) # 将原配送单状态更改为取消
+
+ return new_picking
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index fbe3be8c..710d9abb 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -587,16 +587,28 @@ class StockPicking(models.Model):
telephone_of_delivery = fields.Char('电话号码', compute='_compute_move_ids', store=True)
address_of_delivery = fields.Char('联系地址', compute='_compute_move_ids', store=True)
- retrospect_ref = fields.Char('追溯参考', compute='_compute_move_ids', store=True)
-
+ retrospect_ref = fields.Char('平台订单号', compute='_compute_move_ids', store=True)
+ sale_name = fields.Char('销售订单', compute='_compute_move_ids', store=True)
picking_type_sequence_code = fields.Char(related='picking_type_id.sequence_code')
+ related_group_ids = fields.Many2many(
+ 'procurement.group', string='关联捕获组',
+ readonly=True, compute='_compute_related_group_ids', store=True)
+ @api.depends('origin')
+ def _compute_related_group_ids(self):
+ for record in self:
+ if not record.origin:
+ continue
+ names = record.origin.split(',')
+ related_group_ids = self.env['procurement.group'].search([('name', 'in', names)])
+ record.related_group_ids = [(6, 0, related_group_ids.ids)]
@api.depends('move_ids', 'move_ids.product_id')
def _compute_move_ids(self):
for item in self:
if item.move_ids:
if item.picking_type_id.sequence_code == 'DL':
- sale_name = item.move_ids[0].product_id.name.split('-')[1]
+ sale_name = item.move_ids[0].product_id.with_context(lang='zh_CN').name.split('-')[1]
+ item.sale_name=sale_name
if 'S' in sale_name:
sale_id = self.env['sale.order'].sudo().search([('name', '=', sale_name)])
item.person_of_delivery = sale_id.person_of_delivery
diff --git a/sf_manufacturing/views/stock_picking_view.xml b/sf_manufacturing/views/stock_picking_view.xml
index 30264f89..2fc61908 100644
--- a/sf_manufacturing/views/stock_picking_view.xml
+++ b/sf_manufacturing/views/stock_picking_view.xml
@@ -35,6 +35,7 @@
+