套打.二开案例.合并多个子单据体打印
【场景】将多个子单据体合并成一个表格打印
![image.webp](/download/0100adbbac19e61d43a79e09cc428e2d9b05.webp)
【二开方案】以资产批量变更单为例,打印所有子单据体
(1)调整套打模板,放置一个简单数据表格,所有打印的子单据体字段全部放到一个简单数据表格中
![231101 1837.webp](/download/01006b54a7c840e54da9be0fe654763c96a0.webp)
(2)实现二开插件,分别取多个子单据体的数据,而后拼接成一个完整的表格
![image.webp](/download/010046190dcb5b704b5cadb75c0d96a16aa3.webp)
```csharp
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ElementMetadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Orm.Metadata.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DynamicFormPlugIn.NotePrint
{
[Kingdee.BOS.Util.HotUpdate]
public class NotePrintPlugIn_MergeSubEntity : AbstractBillPlugIn
{
/// <summary>
/// 简单数据表格绑定的数据源的实体,通常是最后一个拖入字段的所属实体
/// </summary>
private string dataSourceId = "FDeviceEntity";
/// <summary>
/// 模板的过滤
/// </summary>
private ConcurrentDictionary<string, string> jobFilter = new ConcurrentDictionary<string, string>();
private ConcurrentDictionary<string, List<SelectorItemInfo>> jobSelectItems = new ConcurrentDictionary<string, List<SelectorItemInfo>>();
public override void OnPrepareNotePrintQueryParam(PrepareNotePrintQueryParamEventArgs e)
{
if (!string.Equals(e.DataSourceId, dataSourceId, StringComparison.OrdinalIgnoreCase))
return;
jobFilter[e.NotePrintTplId] = e.QueryParameter.FilterClauseWihtKey;
jobSelectItems[e.NotePrintTplId] = e.QueryParameter.SelectItems;
//不使用笛卡尔积的数据包
e.QueryParameter.FilterClauseWihtKey = e.QueryParameter.FilterClauseWihtKey.JoinFilterString("1=0");
}
public override void OnPrepareNotePrintData(PreparePrintDataEventArgs e)
{
if (!string.Equals(e.DataSourceId, dataSourceId, StringComparison.OrdinalIgnoreCase))
return;
BusinessInfo businessInfo = this.View.BillBusinessInfo;
Dictionary<string, List<SelectorItemInfo>> entityFields = new Dictionary<string, List<SelectorItemInfo>>();
Action<string, SelectorItemInfo> addSelectItem = (entityKey, item) =>
{
if (!entityFields.ContainsKey(entityKey))
entityFields[entityKey] = new List<SelectorItemInfo>();
entityFields[entityKey].Add(item);
};
string strOrgKey = string.Empty;
Form form = businessInfo.GetForm();
int elementType = form.ElementType;
if (elementType == ElementType.ELEMENTTYPE_BASE && businessInfo.GetForm().IsBaseDataTypeControl)
{
strOrgKey = form.UseOrgFieldKey;
}
else if (elementType == ElementType.ELEMENTTYPE_BILL && businessInfo.MainOrgField != null)
{
strOrgKey = businessInfo.MainOrgField.Key;
}
foreach (var item in jobSelectItems[e.NotePrintTplId])
{
if (item == null || item.Key == null)
continue;
//组织强制每个实体查询
if (item.Key == strOrgKey)
continue;
Field field = businessInfo.GetField(item.Key);
if(field == null)
{
//如果数据源实体和查询实体一致,连带把单据头、明细的数据同时查出来
addSelectItem(dataSourceId, item);
continue;
}
SubEntryEntity subEntryEntity = field.Entity as SubEntryEntity;
if (subEntryEntity == null)
{
//如果数据源实体和查询实体一致,连带把单据头、明细的数据同时查出来
addSelectItem(dataSourceId, item);
}
else
{
addSelectItem(subEntryEntity.Key, item);
}
}
List<DynamicObject> resultObjs = new List<DynamicObject>();
foreach(var entityKey in entityFields.Keys)
{
var entity = businessInfo.GetEntity(entityKey);
SubEntryEntity subEntryEntity = entity as SubEntryEntity;
QueryBuilderParemeter queryParam = new QueryBuilderParemeter();
queryParam.FormId = businessInfo.GetForm().Id;
queryParam.FilterClauseWihtKey = jobFilter[e.NotePrintTplId];
queryParam.SelectItems = entityFields[entityKey];
if(strOrgKey != null)
{
queryParam.SelectItems.Add(new SelectorItemInfo(strOrgKey));
}
//按照序号排序
queryParam.OrderByClauseWihtKey = string.Format("{0}.{1} ASC", subEntryEntity.TableAlias, subEntryEntity.SeqFieldKey);
var queryObjs = QueryServiceHelper.GetMemberwiseDynamicObject(this.Context, queryParam);
AppendResultObject(e.DynamicObjectType, resultObjs, queryObjs);
}
e.DataObjects = resultObjs.ToArray();
}
/// <summary>
/// 按照顺序拼接数据包
/// </summary>
/// <param name="objectType"></param>
/// <param name="resultObjs"></param>
/// <param name="queryObjs"></param>
private void AppendResultObject(DynamicObjectType objectType, List<DynamicObject> resultObjs, DynamicObjectCollection queryObjs)
{
Func<int, DynamicObject> getRowObj = (idx) =>
{
while(resultObjs.Count < idx +1)
{
resultObjs.Add(new DynamicObject(objectType));
}
return resultObjs[idx];
};
for (int i = 0; i < queryObjs.Count; ++i)
{
var queryObj = queryObjs[i];
if (queryObj == null)
continue;
DynamicObject rowObj = getRowObj(i);
foreach (var prop in queryObjs.DynamicCollectionItemPropertyType.Properties)
{
rowObj[prop.Name] = queryObj[prop.Name];
}
}
}
}
}
```
(3)验证效果
![231101 1843.webp](/download/0100e2ba597dbb0f4a3d9e5c385143d2bdc6.webp)
套打.二开案例.合并多个子单据体打印
【场景】将多个子单据体合并成一个表格打印![image.webp](/download/0100adbbac19e61d43a79e09cc428e2d9b05.webp)【二开方案】以资产批量变...
点击下载文档
上一篇:实施认证考勤是否支持补考下一篇:出货仓库与备货仓库的区别
本文2024-09-16 18:16:10发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-21030.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章