
【场景】汇总翻倍和自定义合并汇总
【案例】检验单 合并套打


```csharp
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List.PlugIn;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DynamicFormPlugIn.NotePrint
{
[Kingdee.BOS.Util.HotUpdate]
[System.ComponentModel.Description("列表插件")]
public class NotePrintListPlugIn_MergeData : AbstractListPlugIn
{
public override void OnPrepareNotePrintData(PreparePrintDataEventArgs e)
{
MergeHandler.Instance.Execute(e);
SumHandler.Instance.Execute(e);
}
}
[Kingdee.BOS.Util.HotUpdate]
[System.ComponentModel.Description("表单插件")]
public class NotePrintBillPlugIn_MergeData : AbstractBillPlugIn
{
public override void OnPrepareNotePrintData(PreparePrintDataEventArgs e)
{
MergeHandler.Instance.Execute(e);
SumHandler.Instance.Execute(e);
}
}
public class CaleHandler
{
/// <summary>
/// 处理的单据体标识
/// </summary>
public readonly string EntityKey = "FEntity";
/// <summary>
/// 行标识
/// </summary>
public readonly string IdentityKey = "FEntryID";
public readonly string TemplateId = "0adbc4f0-bc05-4aa8-abad-42a6fa8b0642";
public CaleHandler()
{
}
public CaleHandler CheckPropoerty(Kingdee.BOS.Orm.DataEntity.DynamicObject dataObj, string prop)
{
if (!dataObj.DynamicObjectType.Properties.ContainsKey(prop))
throw new Exception("数据包不存在对应字段,检查是否有配置动态字段或者引用字段:" + prop);
return this;
}
public void Execute(PreparePrintDataEventArgs e)
{
if (ExecuteCheck(e))
{
ExecuteInner(e);
}
}
protected virtual bool ExecuteCheck(PreparePrintDataEventArgs e)
{
if (!string.Equals(e.DataSourceId, EntityKey, StringComparison.OrdinalIgnoreCase))
return false;
if (e.DataObjects == null || e.DataObjects.Length <= 0)
return false;
if (TemplateId != string.Empty && !string.Equals(e.NotePrintTplId, TemplateId, StringComparison.OrdinalIgnoreCase))
return false;
CheckPropoerty(e.DataObjects[0], IdentityKey);
return true;
}
protected virtual void ExecuteInner(PreparePrintDataEventArgs e) { }
}
public sealed class MergeHandler : CaleHandler
{
/// <summary>
/// 分组字段标识
/// </summary>
public readonly string GroupKey = "F_BHR_Text_qtr";
/// <summary>
/// 数量字段标识
/// </summary>
public readonly string QtyKey = "FInspectQty";
/// <summary>
/// 填充字段标识
/// </summary>
public readonly string CalcKey = "CustomField_Merge";
private HashSet<string> handleRows = new HashSet<string>();
private Dictionary<string, decimal> groupQty = new Dictionary<string, decimal>();
private MergeHandler()
{
}
public static readonly MergeHandler Instance = new MergeHandler();
protected override bool ExecuteCheck(PreparePrintDataEventArgs e)
{
var check = base.ExecuteCheck(e);
if (!check)
return check;
var rowObj = e.DataObjects[0];
CheckPropoerty(rowObj, GroupKey).CheckPropoerty(rowObj, QtyKey).CheckPropoerty(rowObj, CalcKey);
return true;
}
protected override void ExecuteInner(PreparePrintDataEventArgs e)
{
for (int i = 0; i < e.DataObjects.Length; ++i)
{
var rowObj = e.DataObjects[i];
//计算过的行不处理