套打.二开案例.自实现套打汇总

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

套打.二开案例.自实现套打汇总

【场景】动态表单等套打,平台不支持汇总管理,仅支持二开实现 【案例】采购订单 二开实现 <0>使用干预数据包接口,准备干预模板ID,干预的实体明细 ![Image_20230209201345.webp](/download/010042e14f9678b44c15b3e7c8e034108dda.webp) <1>挂设表单插件 ![1675947541615.webp](/download/0100cbec65123c774b77b031f79638838032.webp) 核心逻辑,设置分组字段、汇总字段 ![1675947623055.webp](/download/01007c200309050244e094ef6060c104bab3.webp) ```csharp using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DynamicFormPlugIn.NotePrint { public class NotePrintHanlder_GroupData { public List<string> GroupByFields; public List<StatItem> CalcFields; public NotePrintHanlder_GroupData() { GroupByFields = new List<string>(); CalcFields = new List<StatItem>(); } public class StatItem { public string Key; public StatEnum SType; } public enum StatEnum { Default, Sum, StringJoin, } public List<DynamicObject> GroupData(List<DynamicObject> dataObjColl) { if (dataObjColl == null) return dataObjColl; if (GroupByFields == null || !GroupByFields.Any()) return dataObjColl; if (CalcFields == null || !CalcFields.Any()) return dataObjColl; // <0>计算当前行的分组依据,根据分组依据值分组 List<int> groupSeq = new List<int>(); Dictionary<string, List<DynamicObject>> groupData = new Dictionary<string, List<DynamicObject>>(); for (int idx = 0; idx < dataObjColl.Count; ++idx) { DynamicObject dataObject = dataObjColl[idx]; string dataGroupKey = GetGroupKey(dataObject); if (!groupData.ContainsKey(dataGroupKey)) { groupSeq.Add(idx); groupData[dataGroupKey] = new List<DynamicObject>(); } groupData[dataGroupKey].Add(dataObject); } // <1>计算每个分组的汇总后数据包 List<DynamicObject> result = new List<DynamicObject>(); for (int i = 0; i < groupSeq.Count; ++i) { DynamicObject groupObj = dataObjColl[i]; string dataGroupKey = GetGroupKey(groupObj); if (!groupData.ContainsKey(dataGroupKey)) { continue; } var calcObj = CalcDataObj(groupData[dataGroupKey]); result.Add(calcObj); } return result; } /// <summary> /// 计算分组依据 /// </summary> /// <param name="dataObj"></param> /// <returns></returns> private string GetGroupKey(DynamicObject dataObj) { List<string> groupResult = new List<string>(); foreach (var key in GroupByFields) { string itemVal = ObjectUtils.Object2String(dataObj[key]); groupResult.Add(itemVal); } return string.Join(",", groupResult); } /// <summary> /// 计算汇总后数据包 /// </summary> /// <param name="dataObjList"></param> /// <returns></returns> private DynamicObject CalcDataObj(List<DynamicObject> dataObjList) { // <2>按照最后一行返回 var lastRow = dataObjList.LastOrDefault(); if (dataObjList.Count <= 0 || lastRow == null) return null; Dictionary<string, StatItem> calcMap = new Dictionary<string, StatItem>(); foreach (var calcItem in CalcFields) { calcMap[calcItem.Key] = calcItem; } var objType = lastRow.DynamicObjectType; DynamicObject result = new DynamicObject(objType); foreach (var prop in objType.Properties) { if (!calcMap.ContainsKey(prop.Name)) { result[prop.Name] = lastRow[prop.Name]; continue; } CalcField(result, dataObjList, calcMap[prop.Name]); } return result; } private void CalcField(DynamicObject result, List<DynamicObject> dataObjList, StatItem statItem) { object statVal = null; switch (statItem.SType) { case StatEnum.StringJoin: statVal = string.Join(";", dataObjList.Select(x => ObjectUtils.Object2String(x[statItem.Key]))); break; case StatEnum.Sum: case StatEnum.Default: statVal = dataObjList.Sum(x => ObjectUtils.ToDecimal(x[statItem.Key])); break; } result[statItem.Key] = statVal; } } [Kingdee.BOS.Util.HotUpdate] public class NotePrintPlugin_GroupData : AbstractBillPlugIn { /// <summary> /// 套打干预打印数据包事件 /// </summary> /// <param name="e"></param> public override void OnPrepareNotePrintData(PreparePrintDataEventArgs e) { if (e.NotePrintTplId == "0e05e45a-1368-46fb-86a3-e65669d321ca" && e.DataSourceId == "FPOOrderEntry") { NotePrintHanlder_GroupData handler = new NotePrintHanlder_GroupData(); //分组字段 handler.GroupByFields.Add("FMaterialId_FNumber"); //汇总字段 var item = new NotePrintHanlder_GroupData.StatItem() { Key = "FEntryNote", SType = NotePrintHanlder_GroupData.StatEnum.StringJoin }; handler.CalcFields.Add(item); var item2 = new NotePrintHanlder_GroupData.StatItem() { Key = "FQty", SType = NotePrintHanlder_GroupData.StatEnum.Sum }; handler.CalcFields.Add(item2); var result = handler.GroupData(e.DataObjects.ToList()); e.DataObjects = result.ToArray(); } } } } ``` 【案例】效果 ![1675947746152.webp](/download/01007ab25c2c6bd5441184c8c80ec21b69b1.webp)

套打.二开案例.自实现套打汇总

【场景】动态表单等套打,平台不支持汇总管理,仅支持二开实现【案例】采购订单 二开实现 <0>使用干预数据包接口,准备干预模板ID,干预...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息