该文本概述了如何在一个基于KingdeeBOS平台的环境中,通过反写规则和插件来处理单据B(子单据)与单据A(父单据)之间的数据联动,特别关注于单据B需要反写单据A关联实体的子单据体时的处理方式。具体步骤包括在单据A和B的关联单据体中增加隐藏字段,设置反写规则,编写反写插件并在单据B的反写过程中通过插件控制何时进行反写以及处理保存和删除操作,最终实现对上游单据子单据体的数据反写或清空。
说明:目前反写规则只支持关联实体(一般为单据体),和关联实体的父单据体(单据头)的反写,如果需要反写上游单据的关联实体的子单据体,则需要插件处理。
示例:单据B关联实体反写单据A关联实体的子单据体
步骤:
在单据A和单据B关联的单据体都增加一个隐藏的整形字段,命名为隐藏整数,key设置为FHideInterger,并设置单据B中的隐藏整数默认值为100
创建一个反写规则,如下图:
编写反写插件,并注册到单据B的反写插件中,业务逻辑要点:
3.1 反写规则为上面的反写规则才运行
3.2 保存和删除操作都需要处理
3.3 此反写规则每次保存都需要运行
执行效果,如下图:
反写代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.BusinessEntity;
using Kingdee.BOS.Core.BusinessFlow;
using Kingdee.BOS.Core.BusinessFlow.PlugIn;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.BusinessFlow.PlugIn.Args;
using Kingdee.BOS.BusinessEntity.BusinessFlow;
namespace Kingdee.BOS.TestPlugIn.BillABillB
{
[Description("单据B反写插件")]
[Kingdee.BOS.Util.HotUpdate]
public class BillBWriteBackPlugIn : AbstractBusinessFlowServicePlugIn
{
//需要干预的反写规则
private bool _isNeedHandleRule = false;
/// <summary>
/// 反写前事件,每个反写规则走一次,得到需要干预反写规则
/// </summary>
/// <param name="e"></param>
public override void BeforeWriteBack(BeforeWriteBackEventArgs e)
{
this._isNeedHandleRule = false;
var ruleName = e.Rule.Name.ToString();
if (ruleName.EqualsIgnoreCase("单据B反写单据A—隐藏的整数字段"))
{
this._isNeedHandleRule = true;
}
}
/// <summary>
/// 加入需要反写的上游字段,反写取得是上游部分数据包,所以要通过插件加入自定义需要处理的字段
/// </summary>
/// <param name="e"></param>
public override void AfterCustomReadFields(AfterCustomReadFieldsEventArgs e)
{
if (this._isNeedHandleRule)
{
e.AddFieldKey("F_KKK_SubText2");//上游单据子单据体文本
}
}
/// <summary>
/// 反写条目反写后事件,每一行都会走
/// </summary>
/// <param name="e"></param>
public override void AfterCommitAmount(AfterCommitAmountEventArgs e)
{
base.AfterCommitAmount(e);
if (this._isNeedHandleRule)
{
//保存操作
if (this.OperationNumber.EqualsIgnoreCase("Save"))
{
Random rd = new Random();
var wbRule = e.WriteBackRuleRow as WRule<Id>;//反写条目
var curRowObj = wbRule.Row.DataEntity;//当前单据当前行数据包
curRowObj["FHideInteger"] = rd.Next(); //确保反写规则每次保存操作都会走
var targetFieldValue = curRowObj["FEntry1Remark"]; //当前单据单据体备注
var sourceField = e.SourceBusinessInfo.GetField("F_KKK_SUBTEXT2") ;//上游单据子单据体文本
var sourceSubObjs = sourceField.Entity.DynamicProperty.GetValue( e.SourceActiveRow) as DynamicObjectCollection;
foreach(var subObj in sourceSubObjs)
{
sourceField.DynamicProperty.SetValue(subObj,targetFieldValue);
}
}
else if (this.OperationNumber.EqualsIgnoreCase("Delete")) //删除操作
{
//清空上游单据子单据体文本
var sourceField = e.SourceBusinessInfo.GetField("F_KKK_SUBTEXT2");//上游单据子单据体文本
var sourceRow = e.SourceActiveRow;
var sourceSubObjs = sourceField.Entity.DynamicProperty.GetValue(e.SourceActiveRow) as DynamicObjectCollection;
foreach (var subObj in sourceSubObjs)
{
sourceField.DynamicProperty.SetValue(subObj, "");
}
}
}
}
}
}
推荐阅读