子数据表格合并汇总

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())
| |
子数据表格合并汇总
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



