本文档详细说明了如何在打印工作流审批信息时包含子工作流的审批信息,包括打印模板的布局设计、动态列的配置以及如何通过插件代码实现字段的自定义和动态数据的处理。文中提到打印模板的配置涉及样式属性和数据源配置,并通过插件代码示例展示了如何在加载数据前取消特定数据源的取数、在输出元素后根据条件设置控件值、动态添加列并绑定数据源字段以及合并单元格的处理。此外,还提供了关于工作流与子工作流开发的参考链接和打印模板设置的参考资源。
1、解析
关于工作流审批信息打印,在打印工作流审批信息时打印子工作流的审批信息,主要讲解打印模板的布局、打印模板的动态列、打印模板插件实现字段自定义。
Ps:对于工作流与子工作流开发参考(https://vip.kingdee.com/article/182756)
2、实现效果
2.1父页面:ecos_testbill
2.2子页面:ecos_testbill2
2.3 打印模板配置
打印最后结果
2.3.1样式属性配置
使用的到三个数据表格,首先采用网格布局,网格的相关属性如下:
非包含数据表格网格行的属性设置:设置高度为30,去掉内边框和外边框
包含数据表格网格行的属性配置:需要设置网格行为“行高自适应”,数据表格样式属性设置顶部位置、左部位置为0,横向充满打开。
Ps:其他打印模板设置,
参考
https://dev.kdcloud.com/index/study/detail/e7c6e372-da0e-48c8-99aa-c92bc1e773b2
2.3.2 数据源配置
引入数据源实体:wf_hicomment(任务执行结果)
3、插件代码
package kd.bos.ecos.print;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import com.kingdee.bos.ctrl.reportone.r1.print.engine.widget.datagrid.PWDataGridColumn;
import kd.bos.dataentity.entity.CloneUtils;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
import kd.bos.dataentity.metadata.dynamicobject.DynamicSimpleProperty;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.plugin.AbstractPrintServicePlugin;
import kd.bos.entity.plugin.IPrintScriptable;
import kd.bos.entity.plugin.args.BeforeLoadDataArgs;
import kd.bos.entity.plugin.args.CustomPrintDataEntitiesArgs;
import kd.bos.entity.plugin.args.DynamicColumnArgs;
import kd.bos.entity.plugin.args.OutputElementArgs;
import kd.bos.entity.print.DynamicColumn;
import kd.bos.entity.print.GridHeader;
import kd.bos.entity.print.MergeBlock;
import kd.bos.org.utils.DynamicObjectUtils;
import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
import kd.bos.workflow.component.approvalrecord.IApprovalRecordGroup;
public class EcosTestPrintPlugin extends AbstractPrintServicePlugin{
// 单据标识
private static final String BILL_HEAD_KEY = "ecos_testbill";
// 任务执行结果表单标识
private static final String WF_ENTRY_KEY = "wf_hicomment";
@Override
public void beforeLoadData(BeforeLoadDataArgs e) {
if(e.getDataSourceName().equalsIgnoreCase("wf_hicomment")) {
//取消对数据源名为【testdatasource】的系统取数
// e.setCancel(true);
}
}
/**
* 控件输出后事件
*
* @param e
* 控件输出后事件
*/
@Override
public void afterOutputElement(OutputElementArgs e) {
// 数据源的标识
String dataSourceName = e.getCurrentDataSource();
if(dataSourceName != null) {
dataSourceName = dataSourceName.split(":")[0];
if (dataSourceName.equalsIgnoreCase(WF_ENTRY_KEY) & e.getKey() != null) {
if (e.getKey().equals("datacell56")) {
/* 获取同一数据源下绑定的字段为fieldb的值并赋值到text2控件 */
kd.bos.entity.plugin.IPrintScriptable apw = e.getOutput();
//设置当前对象所绑定数据源的某一字段的值
String newValue = apw.getFieldValue("activityname").toString();
// apw.setValue(newValue);
//拿到子流程关联单据数据ID
String pkId = e.getDataHelper().getValue(BILL_HEAD_KEY, "subid").toString();
//拿到子流程的审批信息
List<IApprovalRecordGroup> subRecords = WorkflowServiceHelper.getAllApprovalRecord(pkId);
String rule = "";
for (IApprovalRecordGroup iApprovalRecordGroup : subRecords) {
String activityname = iApprovalRecordGroup.getActivityName();
if(activityname !=null && StringUtils.equals(newValue.trim(), activityname.trim())){
//审批规则
rule = iApprovalRecordGroup.getThroughRule();
break;
}
}
apw.setValue(rule);
}
}
}
}
/**
* 动态添加列
*/
@Override
public void addDynamicColumns(DynamicColumnArgs e) {
// TODO Auto-generated method stub
//添加动态列
if ("datacolumn16".equals(e.getKey())) {
List<DynamicColumn> dynamicColumns = new ArrayList<>();
DynamicColumn col1 = new DynamicColumn("field1");
List<GridHeader> header1 = new ArrayList<>();
header1.add(new GridHeader(1,"审批通过规则"));
// header1.add(new GridHeader(2, "text28"));
col1.setGridHeader(header1);
//绑定已有的数据源字段
// col1.setBindField("modifier.name");
dynamicColumns.add(col1);
e.setDynamicColumns(dynamicColumns);
//添加合并单元格的描述
// List<MergeBlock> mBlocks = new ArrayList<>();
// MergeBlock mb = new MergeBlock(0, 0, 2, 3, "子审批流信息");
// mBlocks.add(mb);
// e.setMergeBlocks(mBlocks);
}
}
4、代码方法解析
动态添加列数据,可以在创建列的时绑定源数据的某个字段,在addDynamicColumns添加如下代码:col1.setBindField("modifier.name");
添加合并单元格数据:
---------------------------------------------------------------------------------------------------------------------------------------------
List<MergeBlock> mBlocks = new ArrayList<>();
MergeBlock mb = new MergeBlock(0, 0, 2, 3, "子审批流信息");
mBlocks.add(mb);
e.setMergeBlocks(mBlocks);
----------------------------------------------------------------------------------------------------------------------------------------------
在afterOutputElement方法可以添加如下代码也可以实现对动态列绑定数据源原有字段。
kd.bos.entity.plugin.IPrintScriptable apw = e.getOutput();
//设置当前对象所绑定数据源的某一字段的值,activityname
String newValue = apw.getFieldValue("activityname");
apw.setValue(newValue);
补充:在插件中,我们可以在customPrintDataEntities方法实现 :
1. 动态修改字段的值
2. 增加属性和值--自定义字段
3.为单据体赋值
@Override
public void customPrintDataEntities(CustomPrintDataEntitiesArgs e) {
// 新的数据包
List<DynamicObject> newDataEntities = new ArrayList<>();
// 数据源的标识
String dataSourceName = e.getDataSourceName();
// 自定义字段的集合
Set<String> customFields = e.getCustomFields();
// 查询的数据包
List<DynamicObject> dataEntities = e.getDataEntities();
// 查询当前单据的pkid
Object billId = e.getPKId();
// 单据头处理
if ("ecos_testbill".equals(dataSourceName)) {
// Do something
// 注册属性
for (DynamicObject dataEntity : dataEntities) {
DynamicObjectType dataEntityType =
(DynamicObjectType) dataEntity.getDataEntityType();
DynamicObjectType cloneType = null;
try {
// 自定义字段
// 使用前先克隆,因为在一个JVM中,所有同类型的TYPE同享一个对象实例。
cloneType = (DynamicObjectType) dataEntityType.clone();
// 注册简单属性,也可以是自定义字段
for (String customField : customFields) {
DynamicSimpleProperty demoProp = new DynamicSimpleProperty(customField, String.class, "自定义字段默认值");
cloneType.registerSimpleProperty(demoProp);
}
// 复制生成新的数据包--注:CloneUtils中的参数可以自行设置
DynamicObject newObj = (DynamicObject) (new CloneUtils(false, false)).clone(cloneType, dataEntity);
//这个不能少,少了在复制单据头数据就会不完全
DynamicObjectUtils.copy(dataEntity, newObj);
// 修改字段值,不限于自定义字段
for (String customField1 : customFields) {
newObj.set(customField1, "自定义字段测试");
}
// 将新数据包设置回去
newDataEntities.add(newObj);
} catch (CloneNotSupportedException e1) {
}
}
e.setDataEntities(newDataEntities);
}
}
只打印分录某条数据可以在customPrintDataEntities方法中对数据包干预,例如:只打印金额为300.00的分录数据
@Override
public void customPrintDataEntities(CustomPrintDataEntitiesArgs e) {
// 新的数据包
List<DynamicObject> newDataEntities = new ArrayList<>();
// 数据源的标识
String dataSourceName = e.getDataSourceName();
// 查询的数据包(此时是单据体分录数据)
List<DynamicObject> dataEntities = e.getDataEntities();
// 单据体处理
if ("entryentity".equals(dataSourceName)) {
// Do something
// 注册属性
for (DynamicObject dataEntity : dataEntities) {
//获取金额为300.00
BigDecimal amount = dataEntity.getBigDecimal("amountfield");
//金额比较
int x = amount.compareTo(new BigDecimal(300.00));
if(x==0) {
newDataEntities.add(dataEntity);
}
}
e.setDataEntities(newDataEntities);
}
}
调用打印接口,打印数据
//pageId页面id,formId表单标识,key模板标识
生成PDF的url
String downloadUrl = PrintServiceHelper.createSamplePdfUrl(this.getView().getPageId(), formId, key);
if (StringUtils.isNotBlank(downloadUrl)) {
this.getView().openUrl(downloadUrl);
}
推荐阅读