套打.二开案例.合并多个子单据体打印

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

套打.二开案例.合并多个子单据体打印

【场景】将多个子单据体合并成一个表格打印 ![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)【二开方案】以资产批量变...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息