# 报表及单据打印开发

本系统支持基于 Jasper Report 的报表及单据打印模板开发

# 目标读者

本文档的目标读者为:本系统的开发和实施人员

# 相关资料

本系统的报表及单据打印模板开发基于 Jasper Report 技术,相关技术文档可参考:

# 界面交互

单据打印和报表的界面交互方式,与运行动态动作类似,同时针对打印和报表,提供了针对 性的优化。

# 报表定义

报表定义在系统中为 DynamicReport 对象,相关关键字段说明如下:

字段 描述 类型
name 报表名称,必填,创建后无法修改 java.lang.String
label 报表界面显示名称,必填 java.lang.String
template 报表模板文件,必填,为 jrxml 格式的报表定义文件。 tech.muyan.storage.StorageFieldValue
action 报表关联的动作,必填 tech.muyan.dynamic.action.DynamicAction
domainClass 报表关联的领域对象,必填 tech.muyan.DomainClass
parameters 报表参数,可选,供用户输入查询参数。 List<tech.muyan.dynamic.field.DynamicFieldInstance>
enableRoles 报表可用的角色, 逗号分隔的角色名 java.lang.String
active 报表是否激活,非激活状态的报表不会在界面上显示 java.lang.Boolean

# 默认运行报表的动作定义

报表是通过系统中定义的 action 进行执行,系统已经默认定义了一些报表动作,可以直接 使用,如果不满足需求,也可以自定义报表动作,并与报表进行关联。

系统中默认定义的报表动作如下:

动作名称 动作类型 动作说明
ClassLevelPrintDocumentAction CLASS_LEVEL 用于 Class Level 单据打印运行
SinglePrintDocumentAction OBJECT_SINGLE 用于选中单个对象后的单据打印运行
SingleAndMultiplePrintDocumentAction OBJECT_SINGLE_MULTIPLE 用于选中单个或者多个对象后的单据打印运行
MultiplePrintDocumentAction OBJECT_MULTIPLE 用于选中多哥对象后的单据打印运行
ClassLevelRunReportDocumentAction CLASS_LEVEL 用于 Class Level 报表运行
SingleRunReportDocumentAction OBJECT_SINGLE 用于选中单个对象后的报表运行
SingleAndMultipleRunReportDocumentAction OBJECT_SINGLE_MULTIPLE 用于选中单个或者多个对象后的报表运行
MultipleRunReportDocumentAction OBJECT_MULTIPLE 用于选中多哥对象后的报表运行

提示

单据打印与报表的区别

业务上,单据打印一般不需要用户输入查询参数,而报表可能需要用户输入查询参数。

打印类型的动作,交互方式为 NO_POPUP_NO_CONFIRM 用户点击后,直接生成打印 PDF 文 件,不需要用户输入查询参数。

报表类型的动作,交互方式为 NO_CONFIRM 用户点击后,可能弹出参数输入界面,供用户 输入查询参数。

# 报表设计

  1. 本公司开发人员可以使用 Github 账号登陆 在线报表设计系统 (opens new window) 进行报表设计,设计后,可以将报表模板文件下载到本地。

  2. 也可以直接下载基于 Eclipse, 全功能的 Jasper Report Studio (opens new window), 在本地进行报表设计,设计后,导出 jrxml 报表设计文件。

# 默认报表模板下载

可以从运行中的系统下载默认的报表模板,该模板存放在 key 为 report.templateDynamicConfig 配置中

下载报表模板

# 默认注入参数

系统默认会注入以下查询参数到报表模板中:

参数名 参数类型 说明 对应数据库路径
objectIds java.util.Collection<java.lang.Long> 选中的对象 id 列表 <domain 表>.id
objectIdsStr java.util.Collection<java.lang.String> 选中的对象 id 列表,已转换为 String <domain 表>.id
firstObjectId java.lang.Long 选中的第一个对象的 id <domain 表 >.id
firstObjectIdStr java.lang.String 选中的第一个对象的 id, 已转换为 String <domain 表 >.id
objectTypeId java.lang.Long 选中的对象的类型 id, 数据保存在 domain_class 表中 domain_class.id
objectTypeShortName java.lang.String 选中的对象类型的 ShortName, 对应不带 package 的 java 类名称 domain_class.short_name
objectTypeFullName java.lang.String 选中的对象类型的 FullName, 对应带 package 的 java 类名称 domain_class.full_name
userId java.lang.Long 用户的 id application_user.id
username java.lang.String 用户的登陆名 application_user.username
userDisplayName java.lang.String 用户的姓名 application_user.name
rootOrganizationId java.lang.Long 用户所属的顶层组织的 id organization.id
rootOrganizationName java.lang.String 用户所属的顶层组织的名称 organization.name
userOrganizationId java.lang.Long 用户所属组织的 id organization.id
userOrganizationName java.lang.String 用户所属组织的名称 organization.name
logo java.io.InputStream 系统中当前生效 DynamicTheme 中定义的 logo dynamic_theme.logo

# FAQ

  1. 如何在报表中使用注入的参数?

    在报表模板中,可以使用 $P{<参数名>} 的方式引用注入的参数,例如:$P{userId}

  2. 如何使用 java.util.Collection 作为查询条件?

    Jasper report 提供了语法支持,可以使用 $X{IN, <数据库字段名>, <参数名>} 的 方式,如下的 SQL 中,使用了 $X{IN, al.persisted_object_id, objectIdsStr} 的 方式,将 objectIdsStr 参数作为查询条件,查询 audit_log 表中的数据。

     SELECT 
        al.id, 
        al.persisted_object_id, 
        al.property_name, 
        al.date_created, 
        al.old_value, 
        al.new_value, 
        COALESCE(au.username, 'System') AS actor 
     FROM audit_log al 
     LEFT JOIN application_user au ON al.actor = au.id::varchar 
     WHERE 
       $X{IN, al.persisted_object_id, objectIdsStr} 
       AND al.class_name = $P{objectTypeFullName}   
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
  3. 为什么对查询出来的每一行,都会重复打印?

    请检查报表模板中的 Detail 区域设计,默认 Jasper Report 针对 SQL 返回的每一行数据,都会重复打印 Detail 区域。

  4. 如何显示 logo

    直接在报表模板中,加入图片组件,将其表达式设置为 $P{logo} 即可,系统会自动注入 logo 的图片流。

最后更新: 2024/2/23 07:44:20