批量更新编号,字段只读修改
This commit is contained in:
@@ -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
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user