# 报表及单据打印
本系统支持基于 Jasper Report 的报表及单据打印模板开发
# 目标读者
本文档的目标读者为:本系统的开发和实施人员
# 相关资料
本系统的报表及单据打印模板开发基于 Jasper Report 技术,相关技术文档可参考:
- Jasper Report 官方文档 (opens new window)
- Jasper Report 英文教程 (opens new window)
- Jasper Report 中文教程 (opens new window)
- Jasper Report 中文教程 (opens new window)
# 界面交互
单据打印和报表的界面交互方式,与运行动态动作类似,同时针对打印和报表,提供了针对 性的优化。
# 报表定义
报表定义在系统中为 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
用户点击后,可能弹出参数输入界面,供用户
输入查询参数。
# 报表设计
本公司开发人员可以使用 Github 账号登陆 在线报表设计系统 (opens new window) 进行报表设计,设计后,可以将报表模板文件下载到本地。
也可以直接下载基于 Eclipse, 全功能的 Jasper Report Studio (opens new window), 在本地进行报表设计,设计后,导出
jrxml
报表设计文件。
# 默认报表模板下载
可以从运行中的系统下载默认的报表模板,该模板存放在 key 为 report.template
的
DynamicConfig
配置中
# 默认注入参数
系统默认会注入以下查询参数到报表模板中:
参数名 | 参数类型 | 说明 | 对应数据库路径 |
---|---|---|---|
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
如何在报表中使用注入的参数?
在报表模板中,可以使用
$P{<参数名>}
的方式引用注入的参数,例如:$P{userId}
如何使用
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为什么对查询出来的每一行,都会重复打印?
请检查报表模板中的
Detail
区域设计,默认 Jasper Report 针对 SQL 返回的每一行数据,都会重复打印Detail
区域。如何显示 logo
直接在报表模板中,加入图片组件,将其表达式设置为
$P{logo}
即可,系统会自动注入 logo 的图片流。
← ⏲️ 定时任务 🎨 显示风格及 SSO →