小技巧 - 转换插件如何拆分行,并支持表单服务策略
金蝶云社区-JohnnyDing
JohnnyDing
5人赞赏了该文章 6875次浏览 未经作者许可,禁止转载编辑于2020年02月13日 08:41:06

需求背景:
销售订单,下推发货通知单,
构建好目标单之后,需要根据批号,复制拆分出新行。
拆分出的新行,要保持与源单的关联关系,并且能够执行转换规则 - 表单服务策略

示例代码:
//****************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;


using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;

namespace JDSample.ServicePlugIn.BillConvert
{
///


/// 单据下推后,根据规则拆分行
///

///
/// 案例背景:
/// 销售订单,下推发货通知单,
/// 构建好目标单之后,需要根据规则复制拆分出新行
/// 拆分出的新行,要保持与源单的关联关系,
/// 并且能够执行转换规则 - 表单服务策略
///
/// 难点:
/// 1. 必须在表单服务策略执行之前处理;
/// 2. 必须在目标单构建完毕之后处理;
/// 3. 仅被"登记在册"的单据体行,才会执行表单服务策略;
/// 4. 如何自行构建关联关系;
///

[Description("单据下推后,根据规则拆分行")]
public class S150918SplitRowConvPlug : AbstractConvertPlugIn
{
///
/// 目标单单据构建完毕,且已经创建好与源单的关联关系之后,触发此事件
///

///
///
/// 本事件的时机,刚好能够符合需求,
/// 而AfterConvert事件,则在执行表单服务策略之后
///

public override void OnAfterCreateLink(CreateLinkEventArgs e)
{
// 目标单单据体元数据
Entity entity = e.TargetBusinessInfo.GetEntity("FEntity");

// 读取已经生成的发货通知单
ExtendedDataEntity[] bills = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead");


// 定义一个集合,存储新拆分出来的单据体行
List newRows = new List();

// 对目标单据进行循环
foreach (var bill in bills)
{
// 取单据体集合
DynamicObjectCollection rowObjs = entity.DynamicProperty.GetValue(bill.DataEntity)
as DynamicObjectCollection;


// 对单据体进行循环:从后往前循环,新拆分的行,避开循环
int rowCount = rowObjs.Count;
int newRowCount = 1;
for (int i = rowCount - 1; i >= 0; i--)
{
DynamicObject rowObj = rowObjs[ i ];


// 根据规则进行拆分:
// 示例代码略过拆分规则,强制对每行进行拆分

// 通过复制的方式,产生新行:确保字段值、关联关系与原行一致
DynamicObject newRowObj = (DynamicObject)rowObj.Clone(false, true);


// 把新行,插入到单据中,排在当前行之后
rowObjs.Insert(i + 1, newRowObj);


// 为新行创建一个ExtendedDataEntity对象,表单服务策略需要此对象
ExtendedDataEntity newRow = new ExtendedDataEntity(
newRowObj, bill.DataEntityIndex, rowCount + newRowCount);
newRows.Add(newRow);


newRowCount++;
}
}


// 把新拆分出来的单据体行,加入到下推结果中
// 特别说明:如果去掉此语句,新拆分的行,不会执行表单服务策略
e.TargetExtendedDataEntities.AddExtendedDataEntities("FEntity", newRows.ToArray());
}
}
}