子数据表格合并汇总

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

子数据表格合并汇总

1. 案例介绍

    在打印差旅报销单时,我们希望依据“差旅项目名称”字段对子单据体数据进行合并汇总差旅项目名称相同的数据行合并为一行“报销金额”字段进行合并汇总“备注”字段合并结果为各行备注信息使用分号拼接后的文本

2. 适用版本

金蝶云苍穹 V4.0.0012及以上版本

3. 模板设计

3.1 模板配置

   添加数据表格绑定“行程信息”单据体字段,添加横向子数据表格绑定“差旅项目”子单据体字段

3.2 注册插件

    创建插件类MergeSubEntryPlugin并继承AbstractPrintPlugin打印插件基类。(基类全路径kd.bos.print.core.plugin.AbstractPrintPlugin),随后在打印模板中注册该插件。

4. 插件开发

Java

 

//代码块

public class MergeSubEntryPlugin extends AbstractPrintPlugin {


   //单据体(行程信息)

   private static final String ENTRY_ENTITY = "entryentity";


   //子单据体(费用项目)

   private static final String SUB_ENTRY_ENTITY = "subentryentity";


   //差旅项目

   private static final String EXPENSE_ITEM = "expenseitem.name";


   //报销金额

   private static final String TRIP_AMOUNT = "tripamount";


   //备注

   private static final String REMARK = "remark";


   //序号

   private static final String SEQ = "seq";


   @Override

   public void afterLoadData(AfterLoadDataEvent evt) {

       for (DataRowSet rowSet : evt.getDataRowSets()) {

           //获取单据体数据

           List<DataRowSet> entryRows = rowSet.getCollectionField(ENTRY_ENTITY).getValue();

           for (DataRowSet entryRow : entryRows) {

               List<DataRowSet> subEntryRows = entryRow.getCollectionField(SUB_ENTRY_ENTITY).getValue();

               //子单据体数据分组

               Map<String, List<DataRowSet>> groupMap = subEntryRows

                       .stream()

                       .filter(f -> f.getField(EXPENSE_ITEM) != null)

                       .collect(Collectors.groupingBy(m -> m.getField(EXPENSE_ITEM).getValue().toString()));

               List<DataRowSet> resultRows = new ArrayList<>(groupMap.size());

               groupMap.forEach((key, values) -> {

                   if (!CollectionUtils.isEmpty(values)) {

                       //报销金额累计求和

                       double sum = values.stream()

                               .filter(f -> f.getField(TRIP_AMOUNT) != null)

                               .mapToDouble(m -> ((DecimalField) m.getField(TRIP_AMOUNT)).getValue().longValue())

                               .sum();

                       //备注字段通过分号拼接

                       String remarks = values.stream()

                               .filter(f -> f.getField(REMARK) != null)

                               .map(m -> m.getField(REMARK).toString())

                               .collect(Collectors.joining(";\n"));

                       //字段合并后,合并结果保存于当前分组的第一行数据

                       DataRowSet firstRow = values.get(0);

                       Field tripAmount = firstRow.getField(TRIP_AMOUNT);

                       tripAmount.setValue(new BigDecimal(sum));

                       firstRow.put(TRIP_AMOUNT, tripAmount);

                       firstRow.put(REMARK, new TextField(remarks));

                       //合并后仅仅保留第一条数据

                       resultRows.add(firstRow);

                   }

               });

               //子单据体数据清空

               subEntryRows.clear();

               //根据序号重排序,并重新编号

               AtomicInteger seq = new AtomicInteger(1);

               resultRows.stream()

                       .filter(f -> f.getField(SEQ) != null)

                       .sorted(Comparator.comparing(r -> ((IntegerField) r.getField(SEQ)).getValue()))

                       .collect(Collectors.toList())

                       .forEach(row -> {

                           row.getField(SEQ).setValue(seq.getAndIncrement());

                           //保存结果

                           subEntryRows.add(row);

                       });

           }

       }

   }

}

    我们可以通过修改打印取数后的数据包,实现子数据表格的数据进行合并及汇总操作,相同合并依据字段的数据行仅保留一行记录,合并汇总字段可以根据需求来编码,从而决定累计求和还是使用特殊符号拼接文本。

在本例中,合并依据字段是“差旅项目名称”字段,合并汇总字段则是“报销金额”和“备注”字段。

5. 效果预览

5.1 开发前效果

   开发前“差旅项目名称”一列中数据相同的行并不会合并汇总,而是直接展示多行记录

5.2 开发后效果

    开发后,子数据表格中的数据已经按照差旅项目名称字段进行了合并,并且“报销金额”字段的结果已经累计求和,“备注”字段则是通过分号拼接汇总


子数据表格合并汇总

1. 案例介绍 在打印差旅报销单时,我们希望依据“差旅项目名称”字段对子单据体数据进行合并汇总。差旅项目名称相同的数据行合并为一行...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息