You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:24:07