botp反写时如何给源单新增分录行原创
8人赞赏了该文章
800次浏览
编辑于2023年10月24日 14:08:50
关键词:botp、反写、序号seq
一、需求
有一个开发任务单,下推生成测试任务单。现在要求,在测试任务单保存时,反写测试任务单的分录到关联的开发任务单分录行的下一行中,如下效果。
二、思路与方案
在botp反写逻辑中,反写规则只支持反写分录某个字段数据,不支持反写时配置实现新增分录行,则需要根据反写插件实现分录的新增。在反写插件的afterCalcWriteValue事件中根据关联子表sunp_requiremententry_lk获取到各个分录行对应的源单分录行,然后把各测试分录行插入到关联的开发分录行下面。在插入分录行时,需要代码修改序号字段(seq)的值进行排序。
三、实现过程
1、注册插件
创建反写插件并注册到测试任务单的关联配置位置。
2、开发反写插件
基于下游单据当前行,反写值计算完毕后,还没读取源单数据,触发的afterCalcWriteValue事件中实现反写
public class TestBillWriteBackPlugin extends AbstractWriteBackPlugIn implements Plugin { @Override public void afterCalcWriteValue(AfterCalcWriteValueEventArgs e) { EntityType entity = e.getEntity(); DynamicObject activeRow =e.getActiveRow(); Map<BFRowId, BigDecimal> srcRowVal = e.getSrcRowVal(); DynamicObject targetobj = (DynamicObject)activeRow.getParent(); DynamicObjectCollection targetcols = ((DynamicObjectCollection) targetobj.get("sunp_requiremententry")); if (targetcols.size()>0) { //从关联关系表中获取源单pkid Object srcId = targetcols.get(0).getDynamicObjectCollection("sunp_requiremententry_lk").get(0).get("sunp_requiremententry_lk_sbillid"); //查询出源单数据 DynamicObject srcobj = BusinessDataServiceHelper.loadSingle(srcId, "sunp_devbill", "id,sunp_requiremententry.sunp_task,sunp_requiremententry.seq,sunp_requiremententry.sunp_combofield,sunp_requiremententry.sunp_combofield1,sunp_requiremententry.sunp_userfield"); DynamicObjectCollection srcCols = srcobj.getDynamicObjectCollection("sunp_requiremententry"); //每行反写都会触发afterCalcWriteValue事件,但是实际一次性完成增行,即判断是否已增行了 if (srcCols.size() == targetcols.size()) { DynamicObjectType srcEntryType = srcCols.getDynamicObjectType(); for (DynamicObject targetCol : targetcols) { DynamicObjectCollection lk = targetCol.getDynamicObjectCollection("sunp_requiremententry_lk"); //获取目标行与源单行的关联关系表数据 DynamicObject entrylk = lk.get(0); Object srcEntryid = entrylk.get("sunp_requiremententry_lk_sid"); //创建新行并赋值 DynamicObject srcentry = new DynamicObject(srcEntryType); srcentry.set("sunp_task",targetCol.get("sunp_task")); srcentry.set("sunp_combofield","1"); srcentry.set("sunp_combofield1","3"); srcentry.set("sunp_userfield",targetCol.get("sunp_userfield")); for(int index=0;index<srcCols.size();index++){ if (srcCols.get(index).getPkValue().equals(srcEntryid)){ //插入分录时,要调整序号,实际分录的排序是根据数据库里的序号值排序的 srcentry.set("seq",index+1); srcCols.add(index+1,srcentry); break; } } } OperationResult result = SaveServiceHelper.saveOperate("sunp_devbill", new DynamicObject[]{srcobj}, OperateOption.create()); } } super.afterCalcWriteValue(e); }
四、效果图
点击下推开发任务单,生成测试单之后编辑实际测试情况,点击测试单的保存时,反写开发任务单。
反写后的效果如下
五、开发环境版本
V5.0.011
六、参考资料
https://vip.kingdee.com/article/407846501084544512?productLineId=29&isKnowledge=2
botpwriteback.zip(13.40KB)
赞 8
8人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *
10金币20金币30金币40金币50金币60金币
可用金币: 0