通过套打模板打印列表数据

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

通过套打模板打印列表数据

1 场景介绍

套打模板一般用于对单据数据打印,但部分场景中用户希望列表的数据可以按自定义模板进行套打。 目前列表打印的功能是根据列表所见即所得的,无法自定义设计模板样式,本篇文档介绍如何利用打印二开插件,完成列表数据根据自定义模板进行套打。

模板设计

打印效果

2 适用版本

金蝶云苍穹 V5.0.01以上

3 解决方案

3.1 整体思路

    首先我们可以考虑通过自定义数据源来实现该业务场景,收集我们列表上需要打印的所有字段,按照单据字段标识,在自定义数据源下原封不动的添加这些字段,并通过插件给这些字段赋值,这样就能通过数据表格绑定自定义数据源,从而实现打印列表的数据。

3.2 关键步骤

  1. 创建打印模板,根据列表字段添加自定义数据源

    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 场景介绍套打模板一般用于对单据数据打印,但部分场景中用户希望列表的数据可以按自定义模板进行套打。 目前列表打印的功能是根据列表...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息