套打.二开案例.自实现套打汇总
【场景】动态表单等套打,平台不支持汇总管理,仅支持二开实现
【案例】采购订单 二开实现
<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,干预...
点击下载文档
本文2024-09-16 18:32:36发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-22828.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章