Odoo v13采购订单行描述字段移除前缀零件号方案问询
Odoo v13 订单行描述字段前缀PN移除方案
本方案同时适用于采购订单行(purchase.order.line)、销售订单行(sale.order.line)场景,核心逻辑为不修改name字段的原始存储内容,仅在渲染层做临时拆分处理,完全符合业务中保留name字段编辑权限、完整展示补充上下文的需求。
核心实现思路
通过正则规则匹配name字段开头方括号包裹的PN内容,在视图、报表渲染时拆分出独立的PN段和纯描述段,全程不改动name字段的存储值,所有业务编辑的补充内容都会完整保留。
具体操作步骤
1. 正则匹配规则
通用匹配规则可覆盖单PN、多PN前缀的场景:
# 匹配开头所有[xxx]格式的PN段,自动忽略前后空格 import re pn_pattern = re.compile(r'^\s*(\[[^\]]+\]\s*)*')
示例效果:
原始name值:[TBL101][FURN_6741] 北欧实木餐桌 定制尺寸120*80cm
- 提取PN段:
[TBL101][FURN_6741],可进一步拆分得到供应商PNTBL101、内部PNFURN_6741 - 剥离PN后的纯描述:
北欧实木餐桌 定制尺寸120*80cm
2. 全场景适配方案(后端视图+PDF报表通用)
给对应订单行模型添加依赖name的计算字段,无需修改原有业务逻辑:
from odoo import models, fields, api import re # 采购订单行扩展 class PurchaseOrderLine(models.Model): _inherit = 'purchase.order.line' pn_segment = fields.Char(compute='_split_pn_and_desc', string='PN段') pure_description = fields.Char(compute='_split_pn_and_desc', string='纯描述内容') @api.depends('name') def _split_pn_and_desc(self): pn_pattern = re.compile(r'^\s*(\[[^\]]+\]\s*)*') for line in self: if not line.name: line.pn_segment = '' line.pure_description = '' continue match_res = pn_pattern.match(line.name) if match_res: line.pn_segment = match_res.group().strip() line.pure_description = line.name[match_res.end():].strip() else: line.pn_segment = '' line.pure_description = line.name.strip() # 销售订单行扩展逻辑完全一致,仅需将继承模型改为`sale.order.line`即可
注:计算字段默认不存储,完全依赖
name字段原始值生成,不会影响业务对name字段的编辑操作,编辑后的内容会自动同步到拆分结果。
3. 仅修改PDF报表的轻量化方案
如果不需要调整后端视图,仅需要PDF报表拆分展示PN和描述,可以直接修改QWeb报表模板,无需新增Python代码:
<odoo> <template id="report_purchaseorder_document_inherit" inherit_id="purchase.report_purchaseorder_document"> <xpath expr="//tbody//td[hasclass('o_purchase_order_line_name')]" position="replace"> <td class="o_purchase_order_line_name"> <t t-set="pn_pattern" t-value="re.compile(r'^\s*(\[[^\]]+\]\s*)*')"/> <t t-set="match_res" t-value="pn_pattern.match(line.name)"/> <!-- 独立展示PN信息 --> <div t-if="match_res" class="mb-1"> <strong>供应商PN:</strong> <span t-esc="match_res.group().split(']')[0][1:]"/> <strong class="ml-2">内部PN:</strong> <span t-esc="match_res.group().split(']')[1][1:]"/> </div> <!-- 展示完整的纯描述内容,包含所有业务补充上下文 --> <div t-esc="match_res and line.name[match_res.end():].strip() or line.name"/> </td> </xpath> </template> </odoo>
注意事项
- 正则规则可根据实际PN格式调整,适配特殊的PN编码规则
- 所有修改均不改动
name字段的原始存储值,业务编辑的所有内容都会完整保留 - 销售订单场景仅需对应修改销售订单的QWeb报表模板、继承
sale.order.line模型即可
内容的提问来源于stack exchange,提问作者Matthew Goulart
相关产品推荐
相关产品推荐

