批量更新编号,字段只读修改

This commit is contained in:
李鹏宇
2026-02-27 16:33:22 +08:00
parent c316eb2623
commit 70bc06c1dc
2 changed files with 79 additions and 10 deletions
+65 -1
View File
@@ -173,9 +173,73 @@ class StockPicking(models.Model):
record._compute_json_display()
return True
def action_update_name_by_products(self):
"""批量更新入库单名称(根据产品生成)"""
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
# 返回提示消息
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': '更新完成',
'message': f'已成功更新 {updated_count} 条入库单的名称',
'type': 'success',
'sticky': False,
}
}
def action_acceptance(self):
"""验收按钮"""
self.ensure_one()
self.acceptance_date = fields.Datetime.now()
self.receipt_status = 'certification' # 状态变为证明
return True
return True
@api.model_create_multi
def create(self, vals_list):
"""重写create方法,根据产品生成入库单名称"""
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})
return pickings
def write(self, vals):
"""重写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
+14 -9
View File
@@ -9,7 +9,7 @@
<field name="department_id" options="{'no_create': True}" invisible="1"/>
</xpath>
<xpath expr="//field[@name='picking_type_id']" position="attributes">
<attribute name="readonly">receipt_status in ['acceptance', 'certification']</attribute>
<attribute name="readonly">state != 'draft' and receipt_status in ['acceptance', 'certification']</attribute>
</xpath>
<xpath expr="//field[@name='origin']" position="attributes">
<attribute name="invisible">1</attribute>
@@ -31,14 +31,14 @@
<xpath expr="//page[@name='operations']/field[@name='move_ids_without_package']" position="after">
<group>
<group>
<field name="employee_id" string="验收人" required="1" options="{'no_create': True}" readonly="receipt_status == 'certification'"/>
<field name="document_ids" widget="preview_many2many" readonly="receipt_status == 'certification'"/>
<field name="acceptance_date" readonly="receipt_status == 'certification'"/>
<field name="employee_id" string="验收人" required="1" options="{'no_create': True}" readonly="state != 'draft' and receipt_status == 'certification'"/>
<field name="document_ids" widget="preview_many2many" readonly="state != 'draft' and receipt_status == 'certification'"/>
<field name="acceptance_date" readonly="state != 'draft' and receipt_status == 'certification'"/>
</group>
<group>
<field name="certifier_id" options="{'no_create': True}" readonly="receipt_status == 'acceptance'"/>
<field name="certifier_document_ids" widget="preview_many2many" readonly="receipt_status == 'acceptance'"/>
<field name="certification_date" readonly="receipt_status == 'acceptance'"/>
<field name="certifier_id" options="{'no_create': True}" readonly="state != 'draft' and receipt_status == 'acceptance'"/>
<field name="certifier_document_ids" widget="preview_many2many" readonly="state != 'draft' and receipt_status == 'acceptance'"/>
<field name="certification_date" readonly="state != 'draft' and receipt_status == 'acceptance'"/>
</group>
</group>
</xpath>
@@ -66,10 +66,10 @@
</xpath>
<xpath expr="//field[@name='partner_id']" position="attributes">
<attribute name="string">供应商</attribute>
<attribute name="readonly">receipt_status in ['acceptance', 'certification']</attribute>
<attribute name="readonly">state != 'draft' and receipt_status in ['acceptance', 'certification']</attribute>
</xpath>
<xpath expr="//field[@name='scheduled_date']" position="attributes">
<attribute name="readonly">receipt_status in ['acceptance', 'certification']</attribute>
<attribute name="readonly">state != 'draft' and receipt_status in ['acceptance', 'certification']</attribute>
</xpath>
<xpath expr="(//field[@name='state'][@widget='statusbar'])[1]" position="replace">
<field name="receipt_status" widget="statusbar" statusbar_visible="acceptance,certification,receipt" invisible="picking_type_code != 'incoming'"/>
@@ -84,6 +84,11 @@
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.vpicktree"/>
<field name="arch" type="xml">
<xpath expr="//tree/header" position="inside">
<button name="action_update_name_by_products" type="object" string="根据产品更新名称"
class="btn-secondary"
help="将选中的入库单名称更新为:产品1/产品2/产品3的入库单"/>
</xpath>
<xpath expr="//field[@name='name']" position="attributes">
<attribute name="string">编号</attribute>
</xpath>