通过套打模板打印列表数据
1 场景介绍
套打模板一般用于对单据数据打印,但部分场景中用户希望列表的数据可以按自定义模板进行套打。 目前列表打印的功能是根据列表所见即所得的,无法自定义设计模板样式,本篇文档介绍如何利用打印二开插件,完成列表数据根据自定义模板进行套打。
模板设计
打印效果
2 适用版本
金蝶云苍穹 V5.0.01以上
3 解决方案
3.1 整体思路
首先我们可以考虑通过自定义数据源来实现该业务场景,收集我们列表上需要打印的所有字段,按照单据字段标识,在自定义数据源下原封不动的添加这些字段,并通过插件给这些字段赋值,这样就能通过数据表格绑定自定义数据源,从而实现打印列表的数据。
3.2 关键步骤
创建打印模板,根据列表字段添加自定义数据源
2. 创建打印插件,通过插件给自定义数据源赋值
package kd.bos.print.service; /** * @description: * @author: Dech * @create: 2021-05-26 17:31 **/ public class PrintDsSamplePlugin extends AbstractPrintSeniorPlugin { //记录主数据源 private MainDataSource mainDataSource; //定义需要打印的查询字段 private String queryFields = "billstatus,org.name,pxhe_supplier.name,pxhe_createdate,pxhe_paytype,billno,entryentity.pxhe_materiel.name,entryentity.pxhe_applyqty,entryentity.pxhe_price,entryentity.pxhe_amount,entryentity.pxhe_requiredate"; /** * 数据访问器初始化事件 * @param event */ @Override public void beforeInitDataVisitor(DataVisitorEvent event) { //在初始化数据访问器中设置一个合理的查询大小。打印引擎默认500一批分批查询,如果分批后会把勾选的数据拆分,这样会导致数据没办法打印到一个表格。 event.setMaxQuerySize(1000); } /** * 数据加载前方法 * @param evt */ @Override public void beforeLoadData(BeforeLoadDataEvent evt) { PrtDataSource dataSource = evt.getDataSource(); if(!(dataSource instanceof MainDataSource)){ return;//非主数据源,立即返回 } //记录主数据源,用于自定义数据源查询时,获取需要的信息 mainDataSource = (MainDataSource) dataSource; /** * 取消系统加载主数据源信息,并设置其查询结果为一个DataRowSet * 目的:引擎会根据主数据源结果集进行分页。一个DataRowSet就会对应至少一页,按列表打印时,不需要根据单据进行分页,只需要根据内容进行分页即可 */ evt.setCancleLoadData(true);//取消系统加载数据, List<DataRowSet> returnDataSet = new ArrayList<>(1); returnDataSet.add(new DataRowSet()); evt.setDataRowSets(returnDataSet); } /** * 加载自定义数据源方法 * @param evt */ @Override public void loadCustomData(CustomDataLoadEvent evt) { //自己查询数据,获取打平的数据,符合列表展示效果 DynamicObjectCollection collection = QueryServiceHelper.query(mainDataSource.getFormId(), queryFields, new QFilter[]{mainDataSource.getQFilter()}); //将主数据源的信息,组装到自定义数据源中 for(DynamicObject ds : collection){ DataRowSet dataRowSet = new DataRowSet(); String[] splits = queryFields.split(","); for(String split : splits){ Object value = ds.get(split); if(value == null){ dataRowSet.put(split, NullField.get()); continue; } /** * 1. 类型转换二开根据实际情况调整,可以全部转成TextField,也可根据字段类型进行特殊处理。 * 2. 数据格式化也可以在这里处理好,也可以利用打印模板的能力。比如金额精度,币别显示等等,可以代码做好,也可以通过模板进行配置 */ if(StringUtils.equals(split,"status")){ if(StringUtils.equals((String) value,"A")){ dataRowSet.put(split,new TextField("暂存")); }else if(StringUtils.equals((String) value,"B")){ dataRowSet.put(split,new TextField("提交")); }else if(StringUtils.equals((String) value,"C")){ dataRowSet.put(split,new TextField("审核")); } }else if(value instanceof Integer){ dataRowSet.put(split,new IntegerField((Integer) value)); }else if(value instanceof BigDecimal){ dataRowSet.put(split,new DecimalField((BigDecimal) value)); }else{ dataRowSet.put(split,new TextField(String.valueOf(value))); } } //组织好数据好添加到自定义数据源中。 evt.getCustomDataRows().add(dataRowSet); } } }
4 效果展示
5 扩展场景
该方式可以扩展为将相同类型的单据打到一个表格上,不同类型的单据打印到另外一个表格。比如针对采购订单,希望同一格供应商的列表数据打印到一个表格,不同供应商的列表数据打印到另外一个表格,则可以参考上述方式结合表格分组来实现。
通过套打模板打印列表数据
1 场景介绍套打模板一般用于对单据数据打印,但部分场景中用户希望列表的数据可以按自定义模板进行套打。 目前列表打印的功能是根据列表...
点击下载文档
本文2024-09-23 00:47:16发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-141735.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章