botp反写时如何给源单新增分录行原创
金蝶云社区-陈来珍
陈来珍
8人赞赏了该文章 800次浏览 未经作者许可,禁止转载编辑于2023年10月24日 14:08:50

关键词:botp、反写、序号seq

一、需求

有一个开发任务单,下推生成测试任务单。现在要求,在测试任务单保存时,反写测试任务单的分录到关联的开发任务单分录行的下一行中,如下效果。

image.png

二、思路与方案

在botp反写逻辑中,反写规则只支持反写分录某个字段数据,不支持反写时配置实现新增分录行,则需要根据反写插件实现分录的新增。在反写插件的afterCalcWriteValue事件中根据关联子表sunp_requiremententry_lk获取到各个分录行对应的源单分录行,然后把各测试分录行插入到关联的开发分录行下面。在插入分录行时,需要代码修改序号字段(seq)的值进行排序。

image.png

三、实现过程

1、注册插件

创建反写插件并注册到测试任务单的关联配置位置。

image.png

image.png

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);

    }

四、效果图

点击下推开发任务单,生成测试单之后编辑实际测试情况,点击测试单的保存时,反写开发任务单。

image.png

反写后的效果如下

image.png

五、开发环境版本

V5.0.011

六、参考资料

https://vip.kingdee.com/article/407846501084544512?productLineId=29&isKnowledge=2


图标赞 8
8人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0