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

Idempiere扩展product模型生成编码所需导入类及重写方法咨询

实现Idempiere自定义产品编码生成方案

1. 需要导入的核心类

  • 父类:org.compiere.model.MProduct(Idempiere官方产品核心模型,你需要继承的目标类)
  • 上下文依赖:org.compiere.util.Ctx(存储租户、用户等会话信息的上下文对象)
  • 事务依赖:org.compiere.util.Trx(保证数据操作一致性的事务对象)
  • 可选导入(如果要保留导入构造逻辑):org.compiere.model.X_I_Product(产品导入接口模型)
  • 可选依赖:java.sql.ResultSet(数据库结果集构造用)

2. 需要重写的核心逻辑

编码一般存储在产品模型的value字段,你需要重写PO模型的生命周期钩子方法beforeSave实现自定义编码生成,这个方法会在数据插入/更新到数据库前自动触发,是字段预处理的最佳位置。

beforeSave返回true才会继续执行后续保存逻辑,返回false会直接中断保存,适合同时做编码合法性校验。

完整自定义类示例如下:

public class MCustomProduct extends MProduct {
    // 必须重载父类所有构造方法,避免系统实例化时报错
    public MCustomProduct(Ctx ctx, int M_Product_ID, String trxName) {
        super(ctx, M_Product_ID, trxName);
    }

    public MCustomProduct(Ctx ctx, ResultSet rs, String trxName) {
        super(ctx, rs, trxName);
    }

    // 你参考的导入场景构造方法
    public MCustomProduct(X_I_Product impP) {
        super(impP);
    }

    // 重写保存前钩子,实现组合编码生成
    @Override
    protected boolean beforeSave(boolean newRecord) {
        // 可自行调整规则:比如仅新增时生成编码,或者每次更新都重新生成
        if (newRecord || getValue() == null || getValue().trim().isEmpty()) {
            // 示例:产品分类编码 + 单位编码 + 3位随机后缀,可替换为你需要的组合逻辑
            String categoryCode = getM_Product_Category().getValue();
            String uomCode = getC_UOM().getValue();
            String suffix = String.valueOf((int)((Math.random()*900)+100));
            String customValue = categoryCode + "-" + uomCode + "-" + suffix;
            setValue(customValue);
        }
        // 保留父类原有保存前逻辑
        return super.beforeSave(newRecord);
    }
}

3. 生效注意事项

  • 生成编码前要对依赖的组合字段做空指针校验,避免运行时异常
  • 如果要求编码全局唯一,可在生成后增加重复校验逻辑,存在重复则重新生成或抛出错误提示
  • 需要在自定义插件的model.factory扩展点注册该自定义类,否则系统仍然会默认实例化原生MProduct,自定义逻辑不会生效

内容的提问来源于stack exchange,提问作者alejandrohtadinom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:02