diff --git a/yuthon_stock/models/inherit_stock_picking.py b/yuthon_stock/models/inherit_stock_picking.py index 34dd00a58..70bcc7076 100644 --- a/yuthon_stock/models/inherit_stock_picking.py +++ b/yuthon_stock/models/inherit_stock_picking.py @@ -257,26 +257,20 @@ class StockPicking(models.Model): return True def action_update_name_by_products(self): - """批量更新入库单名称(根据产品生成)""" + """批量更新入库单编号(SH+年月+序号格式)""" updated_count = 0 for picking in self: - # 只处理入库单 - if picking.picking_type_code == 'incoming' and picking.move_ids_without_package: - product_names = picking.move_ids_without_package.mapped('product_id.name') - if product_names: - products_str = '/'.join(product_names) - # 添加入库单ID确保唯一性 - new_name = f"{products_str}的入库单-{picking.id}" - picking.write({'name': new_name}) - updated_count += 1 + if picking.picking_type_code == 'incoming': + new_name = picking._generate_sh_sequence(picking.scheduled_date) + picking.write({'name': new_name}) + updated_count += 1 - # 返回提示消息 return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'title': '更新完成', - 'message': f'已成功更新 {updated_count} 条入库单的名称', + 'message': f'已成功更新 {updated_count} 条入库单的编号', 'type': 'success', 'sticky': False, } @@ -293,40 +287,48 @@ class StockPicking(models.Model): self.receipt_status = 'certification' # 状态变为证明 return True + def _generate_sh_sequence(self, date=None): + """生成 SH+年月+三位序号 格式的编号,按月重置""" + from datetime import datetime + if not date: + date = datetime.now() + elif isinstance(date, str): + date = fields.Datetime.from_string(date) + + year_month = date.strftime('%Y%m') # 例: 202601 + prefix = f'SH{year_month}' + + # 查询当月已有的最大序号 + existing = self.env['stock.picking'].search([ + ('name', 'like', f'{prefix}%'), + ('picking_type_code', '=', 'incoming') + ], order='name desc', limit=1) + + if existing: + try: + last_seq = int(existing.name[-3:]) + next_seq = last_seq + 1 + except (ValueError, IndexError): + next_seq = 1 + else: + next_seq = 1 + + return f'{prefix}{next_seq:03d}' + @api.model_create_multi def create(self, vals_list): - """重写create方法,根据产品生成入库单名称""" + """重写create方法,生成 SH+年月+序号 格式的入库单编号""" pickings = super(StockPicking, self).create(vals_list) for picking in pickings: - # 只处理入库单(picking_type_code为incoming) - if picking.picking_type_code == 'incoming' and picking.move_ids_without_package: - # 获取所有产品名称 - product_names = picking.move_ids_without_package.mapped('product_id.name') - if product_names: - # 用/连接产品名称 - products_str = '/'.join(product_names) - # 生成新的name格式:产品/产品/产品的入库单-ID(确保唯一性) - new_name = f"{products_str}的入库单-{picking.id}" - # 更新name字段 - picking.write({'name': new_name}) + # 只处理入库单 + if picking.picking_type_code == 'incoming': + new_name = picking._generate_sh_sequence(picking.scheduled_date) + picking.write({'name': new_name}) return pickings def write(self, vals): - """重写write方法,当产品变化时更新入库单名称""" + """重写write方法""" result = super(StockPicking, self).write(vals) - - # 如果修改了move_ids相关字段,更新name - if 'move_ids_without_package' in vals or 'move_ids' in vals: - for picking in self: - if picking.picking_type_code == 'incoming' and picking.move_ids_without_package: - product_names = picking.move_ids_without_package.mapped('product_id.name') - if product_names: - products_str = '/'.join(product_names) - new_name = f"{products_str}的入库单-{picking.id}" - # 避免递归调用,使用super().write - if picking.name != new_name: - super(StockPicking, picking).write({'name': new_name}) - return result \ No newline at end of file diff --git a/yuthon_stock/views/inherit_stock_picking.xml b/yuthon_stock/views/inherit_stock_picking.xml index 418144044..b0d99a975 100644 --- a/yuthon_stock/views/inherit_stock_picking.xml +++ b/yuthon_stock/views/inherit_stock_picking.xml @@ -90,9 +90,9 @@ -