
【场景】动态表单等套打,平台不支持汇总管理,仅支持二开实现
【案例】采购订单 二开实现
<0>使用干预数据包接口,准备干预模板ID,干预的实体明细

<1>挂设表单插件

核心逻辑,设置分组字段、汇总字段

```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[calcIte