
# 1 业务场景
单据中有多个字段需要使用编码规则生成编号,如单据中的“单据编号”和“业务编号”字段都需要自动生成编号。

# 2 解决方案
**注:凭证字段或其他已包含二开编码规则插件的单据不建议使用方案二,在启动条件包含相同字段时,不可用。**
配置两个编码规则分别给两个编号字段使用:
①正常配置一个默认的编码规则给单据编号使用。
②配置第二个编码规则设置启动条件给业务编号用。
可使用单据中某个或多个字段作为区分依据,如“是否使用业务编号编码规则”,在编码规则的启动条件中配置该字段。


## 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 Co