
【场景】反写树形单据体的父分录
参考数据

【二开案例】
(0)树形单据体开发,这里不做介绍
[二开案例.元模型.树形单据体](https://vip.kingdee.com/article/165462548668510976)
(1)单据转换,控制仅子分录可以下推,然后配置关联的字段映射

(2)反写规则,增加对源单的 关联下推数量的 反写

(3)反写插件,增加处理 反写源单时同时更新父分录的关联数量逻辑

```csharp
using Kingdee.BOS.Core.BusinessFlow.PlugIn;
using Kingdee.BOS.Core.BusinessFlow.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System.Collections.Generic;
namespace DynamicFormPlugIn.WriteBack
{
[Kingdee.BOS.Util.HotUpdate]
[System.ComponentModel.Description("反写源行的同时反写父分录")]
public class WriteBackPlugIn_WriteBackParentRow : AbstractBusinessFlowServicePlugIn
{
/// <summary>
/// 是否干预反写
/// </summary>
private bool needHandle = false;
/// <summary>
/// 需要干预的反写规则
/// </summary>
private static List<string> HandleRuleIds = new List<string>() { "67e43642-3270-469d-8e51-12b57910ccff" };
public override void BeforeWriteBack(BeforeWriteBackEventArgs e)
{
needHandle = false;
if (!HandleRuleIds.Contains(e.Rule.Id))
return;
needHandle = true;
}
/// <summary>
/// 增加插件需要用到的字段,因为读取源单数据为片段数据包,仅提取反写规则用到的字段
/// </summary>
/// <param name="e"></param>
public override void AfterCustomReadFields(AfterCustomReadFieldsEventArgs e)
{
if (!needHandle)
return;
e.AddFieldKey("F_BHR_ParentId");
}
public override void AfterCommitAmount(AfterCommitAmountEventArgs e)
{
base.AfterCommitAmount(e);
}
/// <summary>
/// 源单更新前事件,可以用来调整源单数据包
/// </summary>
/// <param name="e"></param>
public override void BeforeSaveWriteBackData(BeforeSaveWriteBackDataEventArgs e)
{
if (!needHandle)
return;
var srcObjs = e.SourceDataEntitySet.FindByEntityKey("FBillHead");
foreach (var srcObj in srcObjs)
{
var srcBillData = srcObj.DataEntity;
DynamicObjectCollection entityObjs = srcBillData["FEntity"] as DynamicObjectCollection;
if (entityObjs == null