用户通过转换规则由源单生成目标单后(以目标单保存时反写为例),在目标单配置了保存时的反写规则,在目标单保存时触发反写对源单的数据进行调整。当用户删除目标单时会触发反写回滚,导致之前对源单调整的数据回退,用户可以通过实现反写插件的方式来避免这个问题。(注意:通过删除反写规则的方式无法解决该问题,而且对于已经发生业务的反写规则删除后会有不可逆的风险。)
2 使用说明
2.1 设计插件
首先,需要派生kd.bos.entity.botp.plugin.AbstractWriteBackPlugIn类,来创建干预反写的插件类。
import kd.bos.entity.botp.plugin.AbstractWriteBackPlugIn;
public class AvoidRollbackPlugin extends AbstractWriteBackPlugIn {}
在此类中实现删除时避免反写回滚的逻辑,需要通过重写afterCommitAmount事件,可以在这个事件里面动态调整反写量;
例:实现删除目标单时不修改源单数据(即避免反写回滚)。
import kd.bos.entity.botp.plugin.args.AfterCommitAmountEventArgs;
import java.util.Arrays;
import java.util.List;
public class AvoidRollbackPlugin extends AbstractWriteBackPlugIn{
private final List<String> rules = Arrays.asList("1691222118181677056");
/**
* 执行反写规则,把当前反写量,写到源单行之后,触发此事件;
* 可以通过调整反写量来达到源单数据不发生变化的目的(即避免回滚)
* @param e
*/
@Override
public void afterCommitAmount(AfterCommitAmountEventArgs e) {
super.afterCommitAmount(e);
String opType = getOpType();//获取当前执行反写的操作
String srcFieldKey = e.getSrcFieldKey();//获取源单字段标识
String ruleId = e.getRule().getId();//获取当前执行的反写规则id
if("delete".equalsIgnoreCase(opType) && "qtyfield".equals(srcFieldKey) && rules.contains(ruleId)){
e.getSrcActiveRow().set(srcFieldKey,999);//修改数值
}
}
}
2.2 插件注册
在配置完插件类后,需要我们在目标单的表单设计界面注册一个插件。插件注册请参考文档:反写插件手册