单据多个字段使用编码规则生成编号
# 1 业务场景
单据中有多个字段需要使用编码规则生成编号,如单据中的“单据编号”和“业务编号”字段都需要自动生成编号。
![image-20240125174221408.webp](/download/010037de8dce0b54435b9d1de77d16d0ebd1.webp)
# 2 解决方案
**注:凭证字段或其他已包含二开编码规则插件的单据不建议使用方案二,在启动条件包含相同字段时,不可用。**
配置两个编码规则分别给两个编号字段使用:
①正常配置一个默认的编码规则给单据编号使用。
②配置第二个编码规则设置启动条件给业务编号用。
可使用单据中某个或多个字段作为区分依据,如“是否使用业务编号编码规则”,在编码规则的启动条件中配置该字段。
![image-20240126182359026.webp](/download/0100e7b83f42425b486ba360f284f7db28f4.webp)
![image-20240126182442513.webp](/download/0100710dbf62a0d241059fc4cf1a0fd650a1.webp)
## 2.1 方案一
自行调用编码规则生成编号接口,把生成的编号赋值给字段。建议在表单插件先预读编号,在保存/提交操作中再实际生成编号。
预读编号(CodeRuleServiceHelper.readNumber),生成单个编号(CodeRuleServiceHelper.getNumber),更多接口方法详情可参考[《编码规则接口介绍》]
此方案处理简单,但如对编号有完整性和连续性要求,需要自行控制编号的回收等逻辑。
## 2.2 方案二
继承编码规则标准表单插件(kd.bos.form.plugin.CodeRulePlugin)和保存、提交操作插件(kd.bos.business.plugin.CodeRuleOp),重写部分方法。具体可参考以下实现:
表单插件
```java
public class CodeRulePluginDemo extends CodeRulePlugin {
@Override
protected String getClassName() {
//用于区分标准插件
return "CodeRulePluginDemo";
}
@Override
protected String getBillNoField() {
//指定需要生成编号的字段标识
return "businessnumber";
}
@Override
protected CodeRuleInfo getCodeRuleInfo() {
//指定需要使用的编码规则
//设置启动条件中配置的字段符合条件
getModel().beginInit();
getModel().setValue("isusebusinessnumber", true);
getModel().endInit();
CodeRuleInfo codeRuleInfo = null;
try {
codeRuleInfo = CodeRulePluginUtil.getCodeRuleInfoByDynamicObj(getModel().getDataEntity());
} catch (KDException e) {
ErrorCode errorCode = e.getErrorCode();
if (errorCode != null && StringUtils.equals(errorCode.getCode(), "CODERULE_VALID_CONDITION_ERROR")) {
throw new KDBizException(e.getMessage());
}
}
//恢复字段值,防止影响另一个编码规则
getModel().beginInit();
getModel().setValue("isusebusinessnumber", false);
getModel().endInit();
return codeRuleInfo;
}
}
```
操作插件(注意需要注册到保存和提交操作上)
```java
public class CodeRuleOpDemo extends CodeRuleOp {
@Override
protected String getClassName() {
//用于区分标准插件
return "CodeRuleOpDemo";
}
@Override
protected String getBillNoField(BillEntityType billEntityType) {
//指定需要生成编号的字段标识
return "businessnumber";
}
@Override
protected CodeRuleInfo getCodeRuleInfo(DynamicObject dynamicObject) {
//指定生成编号需要使用的编码规则
//设置启动条件中配置的字段符合条件
dynamicObject.beginInit();
dynamicObject.set("isusebusinessnumber", true);
dynamicObject.endInit();
CodeRuleInfo codeRuleInfo = super.getCodeRuleInfo(dynamicObject);
//恢复字段值,防止影响另一个编码规则
dynamicObject.beginInit();
dynamicObject.set("isusebusinessnumber", false);
dynamicObject.endInit();
return codeRuleInfo;
}
@Override
protected CodeRuleInfo checkCodeRule(String entityNum, List<CodeRuleInfo> codeRuleList, DynamicObject dynamicObject) {
//指定回收编号需要使用的编码规则
//设置启动条件中配置的字段符合条件
dynamicObject.beginInit();
dynamicObject.set("isusebusinessnumber", true);
dynamicObject.endInit();
CodeRuleInfo codeRuleInfo = super.checkCodeRule(entityNum, codeRuleList, dynamicObject);
//恢复字段值,防止影响另一个编码规则
dynamicObject.beginInit();
dynamicObject.set("isusebusinessnumber", false);
dynamicObject.endInit();
return codeRuleInfo;
}
}
```
单据多个字段使用编码规则生成编号
# 1 业务场景单据中有多个字段需要使用编码规则生成编号,如单据中的“单据编号”和“业务编号”字段都需要自动生成编号。![image-202401...
点击下载文档
上一篇:附件二开常见问题汇总下一篇:打印中如何计算多选基础资料字段中数据的个数
本文2024-09-23 00:36:03发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-140509.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章