打印模板实现动态列的介绍(以差旅报销场景为例)

1. 案例介绍
在打印差旅报销单时,因为“差旅项目名称”的数据是不确定的,根据出差行程不同差旅项目也不同,如飞机、住宿费和市内交通费在内的费用项目。所以我们希望“差旅项目名称”分录行的数据转为新的列,新增的列展示对应项目的报销金额,从而我们可以直观的看到各类差旅项目对应的报销金额。
2. 适用版本
金蝶云苍穹 V5.0.002及以上版本
3. 模板配置
3.1 模板设计

添加数据表格绑定“行程信息”子单据体字段,“差旅项目名称”一列宽度设置为30mm,且数据表格右边为新增列预留一定宽度
3.2 注册插件
创建插件类Row2ColPlugin,并继承AbstractPrintPlugin打印插件基类。(基类全路径kd.bos.print.core.plugin.AbstractPrintPlugin),随后在打印模板中注册该插件。
4. 插件开发
Java |
|
public class Row2ColPlugin extends AbstractPrintPlugin { //需动态添加的列的标题 private List<String> addCols = new ArrayList<>(10); //单据体(行程信息) private static final String ENTRY_ENTITY = "entryentity"; //子单据体(费用项目) private static final String SUB_ENTRY_ENTITY = "subentryentity"; //差旅项目名称 private static final String EXPENSE_ITEM_NAME = "expenseitem.name"; //报销金额 private static final String TRIP_AMOUNT = "tripamount"; //子单据体数据源标识 private static final String DS_SUB_ENTRY = "er_tripreimbursebill2.subentryentity"; //字段拼接符 private static final String FIELD_JOIN_MARK = "_"; //被转换的行所在列的列下标 private static final int deleteColIndex = 3; //被转换的行所在列的宽度 300 = 30mm private static final int deletedColWidth = 300; @Override public void afterLoadData(AfterLoadDataEvent evt) { //获取子单据体记录行 List<DataRowSet> subRows = evt.getDataRowSets().stream() .flatMap(fMap -> fMap.getCollectionField(ENTRY_ENTITY).getValue().stream()) .flatMap(fMap -> fMap.getCollectionField(SUB_ENTRY_ENTITY).getValue().stream()) .collect(Collectors.toList()); //获取需动态添加的列的标题 addCols = subRows.stream() .map(m -> m.getField(EXPENSE_ITEM_NAME).getValue().toString()) .distinct() .collect(Collectors.toList()); for (DataRowSet subRow : subRows) { //为新加入的列添加字段绑定 Field tripAmount = subRow.getField(TRIP_AMOUNT); for (String col : addCols) { if (col.equals(subRow.getField(EXPENSE_ITEM_NAME).getValue().toString())) { subRow.put(EXPENSE_ITEM_NAME + FIELD_JOIN_MARK + col, tripAmount); } else {
| |
打印模板实现动态列的介绍(以差旅报销场景为例)
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



