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
相关产品推荐
相关产品推荐

