关键词:编码规则
一、需求
编码规则我们都知道是使用在单据编号上,现在有一个需求,客户需求在分录行每新增一行数据的数据就能生成行的编码规则,而且这个编码规则是与单据头上的编码规则是不一样的规则的,增加了一些其他逻辑
比如说单据头上是,常量-组织-流水号,分录上则是 常量-人员-日期-流水号 这种。
那我们应该如何实现呢?
二、思路与方案
如果我们想要自己去绕过苍穹自己创建一套编码规则来适应这个业务也未尝不可,但是放着已有的功能不使用去从新开始搭建太费时费力,这里我们就想着我们也可以借助苍穹自有编码规则来实现。
我们把原来的单据称为主单据, 可以创建一个新单据(副单据),这个单据的作用就是记录分录的编码规则,然后再通过插件把这些规则在原来单据显示保存即可。
三、实现过程
1 配置主单据数据
主单据标识bidt_test_code,
我们在单据头上加上组织,分录上添加分录编码,和一个文本字段
2 配置副单据数据
副单据标识bidt_entry_code
这个单据的作用就是记录分录的编码规则
我们在上面添加了人员,这个字段主要是要根据前一张单据的人员来做单据规则的
源单单据编号,主要是为了记录是源单哪张单据跟这个单据编码的映射
3 配置编码规则
配置主单据的编码规则
配置副单据的编码规则
4 编写主单据的页面插件
下面这个插件的作用是生成编码规则,并复制到页面上
import java.util.EventObject; import kd.bos.coderule.api.CodeRuleInfo; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.form.IFormView; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.form.plugin.AbstractFormPlugin; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.coderule.CodeRuleServiceHelper; public class TestCreateEntryCode extends AbstractFormPlugin { public void registerListener(EventObject e) { super.registerListener(e); //监听分录上增行的点击事件 addItemClickListeners(new String[] { "advcontoolbarap" }); } public void afterCreateNewData(EventObject e) { DynamicObjectCollection doc=this.getModel().getEntryEntity("entryentity"); for(int i=0;i<doc.size();i++) { String entryCode=getEntryCode(); this.getModel().setValue("bidt_entrycode", entryCode,i); } } private String getEntryCode() { DynamicObject entry = BusinessDataServiceHelper.newDynamicObject("bidt_entry_code"); entry.set("bidt_sourceuser",this.getModel().getValue("creator")); CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(entry.getDataEntityType().getName(), entry, null); String entryCode=CodeRuleServiceHelper.getNumber(codeRule, entry); return entryCode; } public void itemClick(ItemClickEvent evt) { if("tb_new".equals(evt.getItemKey())) { IFormView view =this.getView(); int currentRow = this.getModel().getEntryCurrentRowIndex("entryentity"); String entryCode=getEntryCode(); this.getModel().setValue("bidt_entrycode", entryCode,currentRow); } } }
5 编写主单据的操作插件
这个插件需要绑定到提交按钮上,主单据提交了就要在副单据上保存这个映射关系,也不怕编码规则生成的单据号被回收
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.PreparePropertysEventArgs; import kd.bos.entity.plugin.args.EndOperationTransactionArgs; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; public class SaveCodeRuleOp extends AbstractOperationServicePlugIn { public void onPreparePropertys(PreparePropertysEventArgs e) { e.getFieldKeys().add("creator"); e.getFieldKeys().add("bidt_entrycode"); e.getFieldKeys().add("billno"); } @Override public void endOperationTransaction(EndOperationTransactionArgs e) { DynamicObject[] dataEntities = e.getDataEntities(); for(DynamicObject formData:dataEntities) { DynamicObjectCollection entryData= formData.getDynamicObjectCollection("entryentity"); DynamicObject[] dysList=new DynamicObject[entryData.size()]; for(int i=0;i<entryData.size();i++) { DynamicObject newdyo=entryData.get(i); DynamicObject newDynamicObject = BusinessDataServiceHelper.newDynamicObject("bidt_entry_code"); newDynamicObject.set("billno", newdyo.get("bidt_entrycode")); newDynamicObject.set("billstatus", "A"); newDynamicObject.set("bidt_sourecode", formData.get("billno")); newDynamicObject.set("bidt_sourceuser", formData.get("creator")); dysList[i]=newDynamicObject; } SaveServiceHelper.save(dysList); } } }
四、效果图
1 这是在主单据上自动生成的分录编码,每次点击增行的时候会自动带出分录的编码规则。
2 主单据提交后,就可以在副单据上看到生成的编码规则了
点进去看到数据也是显示正确的。
五、开发环境版本
COSMICV5.0.003.0
六、参考资料
https://vip.kingdee.com/knowledge/specialDetail/225659499216741632?productLineId=29
代码.rar(1.33KB)
bidt_devtset-bidt_yanzheng-202 …(12.20KB)
推荐阅读