BOTP选单操作根据用户选择的源单顺序添加到目标单分录
1 业务背景
产品现状:选单的顺序和最后添加到目标单的顺序是不一致的,因为BOTP存在分单合并策略的各种组合,所以不能做到统一的排序出来,默认是按源单列表的顺序加载到目标单;
选单顺序:
实际顺序:
客户需求:对于一些业务场景比如计划(任务)编排,需要根据用户的选择顺序去编排计划(任务)的执行顺序,所以需要选单操作时选择的顺序和加载到目标单分录的顺序要要保持一致;
2 思路与方案
通过单据转换插件动态干预目标单分录顺序
1、在initVariable事件拿到用户原始勾选顺序,并添加到操作变量中
2、在afterConvert事件中动态调整目标单分录顺序
3 实现步骤
以源单(单据头)下推目标单(单据体)为例讲解,没有涉及到复杂的分单合并策略,源单和目标单创建和BOTP配置简单的配置这里就不过多介绍
1、目标单关联配置,配置关联目标单单据体
2、BOTP转换规则关联实体配置,源单(单据头)<--->目标单(单据体)
3、编写单据转换插件
public class DemoConvertPlugin03 extends AbstractConvertPlugIn implements Plugin { @Override public void initVariable(InitVariableEventArgs e) { super.initVariable(e); if (e.getConvertArgs() instanceof DrawArgs){ List<Long> soucePkList= new ArrayList<>(); DrawArgs drawArgs = (DrawArgs)e.getConvertArgs(); //用户原始勾选顺序 List<ListSelectedRow> selectedRows = drawArgs.getSelectedRows(); for (ListSelectedRow selectedRow : selectedRows) { Long primaryKeyValue = (Long) selectedRow.getPrimaryKeyValue(); soucePkList.add(primaryKeyValue); } getOption().setVariableValue("test_sourcerow_pdorder", SerializationUtils.toJsonString(soucePkList)); } } @Override public void afterConvert(AfterConvertEventArgs e) { //获取用户选择的顺序ids String testSourcerowPdorder = getOption().getVariableValue("test_sourcerow_pdorder"); List<Long> objects = (List<Long>) SerializationUtils.fromJsonStringToList(testSourcerowPdorder, Long.class); //获取目标单对象 ExtendedDataEntitySet targetExtDataEntitySet = e.getTargetExtDataEntitySet(); Map<String, List<ExtendedDataEntity>> extDataEntityMap = targetExtDataEntitySet.getExtDataEntityMap(); List<ExtendedDataEntity> headList = extDataEntityMap.get(getTgtMainType().getName()); ExtendedDataEntity extendedDataEntity = headList.get(0); DynamicObject headObj = extendedDataEntity.getDataEntity(); DynamicObjectCollection entryEntityCol = headObj.getDynamicObjectCollection("entryentity"); //根据用户选择的顺序,变量entryEntityCol添加到list对象,用于后续重新排序 List<DynamicObject> list = new ArrayList<>(); for (int i = 0; i < objects.size(); i++) { for (int i1 = entryEntityCol.size() - objects.size(); i1 < entryEntityCol.size(); i1++) { DynamicObjectCollection o = (DynamicObjectCollection) entryEntityCol.get(i1).get("entryentity_lk"); if(o.size() > 0){ //获取源单id并与选择源单的id一一比对 Long o1 = o.get(0).getLong("entryentity_lk_sbillid"); if(objects.get(i).equals(o1)){ list.add(entryEntityCol.get(i1)); break; } } } } //对entryEntityCol重新排序 int index = 0; for (int i = list.size(); i > 0; i--) { entryEntityCol.set(entryEntityCol.size() - 1 - index,list.get(i - 1)); index ++; } super.afterConvert(e); } }
4、注册插件
5、实现效果
选择顺序:
分录加载顺序:
4 注意事项
1、以上的代码只是一个示例,并不是通用性的代码,需要根据实际的业务需求进行调整,只需关注,在initVariable事件拿到用户原始勾选顺序,在afterConvert事件中可以动态调整目标单顺序
2、 entryentity_lk_sbillid代表当前这行分录的来源单据PK,entryentity_lk_sid来源最小实体PK,最小实体的意思是,如果是源单分录映射过来的,就是源单分录id,如果是子分录,就是源单子分录id
3、如果业务不是很复杂,afterConvert事件中解析数据起来比较麻烦,也可以通过在目标单冗余相应的字段,把源单关键的字段携带过去,比如单据id、分录id、编码等等,可以根据冗余字段去解析数据
4、在afterConvert事件中以下是关键代码
ExtendedDataEntitySet targetExtDataEntitySet = e.getTargetExtDataEntitySet(); Map<String, List<ExtendedDataEntity>> extDataEntityMap = targetExtDataEntitySet.getExtDataEntityMap(); List<ExtendedDataEntity> headList = extDataEntityMap.get(getTgtMainType().getName()); //拷贝单据头对象 for (ExtendedDataEntity extendedDataEntity : headList) { DynamicObject headObj = extendedDataEntity.getDataEntity(); DynamicObjectCollection entryEntityCol = headObj.getDynamicObjectCollection("entryentity"); //调整顺序 DynamicObject dynamicObject_0 = entryEntityCol.get(0); DynamicObject dynamicObject_1 = entryEntityCol.get(1); entryEntityCol.set(1,dynamicObject_0); entryEntityCol.set(0,dynamicObject_1); }
5 相关资料(可选)
BOTP选单操作根据用户选择的源单顺序添加到目标单分录
本文2024-09-23 00:24:09发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-139233.html