【API下推接口】---实现一行拆成多行

实现说明
调用API下推接口,根据传入的自定义数据,实现单据在转换过程中对行进行拆分。
要点:
1. 下推接口传入自定义数据,作为拆分行依据。
2. 在转换插件OnAfterCreateLink事件中取到自定义数据。
3. 并在2中的事件处理相关的业务逻辑。
4. 注意拆分行的依据和被拆分的字段以及被拆分的关联字段。
5. 注意创建和更新关联数据包,如果被拆分的字段是控制字段,则需要更新关联数据包中的携带和反写。
示例参考
通过webapi下推接口,并带自定义参数,实现单据A下推单据B,按基本单位数量10来拆分,基本单位数量字段在单据体中。
注册转换插件

调用webapi下推接口

查看下推结果

转换插件代码参考
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.DataEntity;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata.FormElement;
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.Metadata.DataEntity;
namespace Kingdee.BOS.TestPlugIn
{
[Kingdee.BOS.Util.HotUpdate]
[Description("单据A到单据B单转换插件")]
public class BillAConvertBillBPlugIn : AbstractConvertPlugIn
{
//控制字段Key和属性集合
private List<DynamicProperty> _lstProperys = null;
/// <summary>
/// 单据转换之后事件
/// </summary>
/// <param name="e"></param>
public override void AfterConvert(AfterConvertEventArgs e)
{
//行拆分依据
long splitNumber = 0;
// webapi下推接口中的自定义参数,CustomParams={"FBaseQty":10}
this.Option.TryGetVariableValue<long>("FBaseQty", out splitNumber);
if (splitNumber == 0) return; //分录行拆分数量
var field = e.TargetBusinessInfo.GetField("FBaseQty"); //基本单据数量字段
var entryEntity = field.Entity; //字段所在的单据体
//得到单据数据包扩展集合
var billDynObjExs = e.Result.FindByEntityKey("FBillHead");
var tView = CreateView(e.TargetBusinessInfo.GetForm().Id); //创建目标单据视图
var targetLinkSet = e.TargetBusinessInfo.GetForm().LinkSet;
var targetLinConfig= targetLinkSet.LinkEntitys[0]; //平台只支持一个关联实体,故取第一个关联设置就可以
var targetLinkEntity = e.TargetBusinessInfo.GetEntity(targetLinConfig.Key); //关联实体
this.InitLinkFieldProperty(targetLinkEntity, targetLinConfig, e.TargetBusinessInfo); //初始化关联字段属性
foreach (var billDynObjEx in billDynObjExs) //循环数据包扩展集合
{
var billDynObj = billDynObjEx.DataEntity; //单个单据数据包
tView.Model.DataObject = billDynObj; //给模型设置数据包
var entryDynObjs = entryEntity.DynamicProperty.GetValue(billDynObj) as DynamicObjectCollection; //得到字段所在实体的数据包
int rowIndex = 0; //分录行索引
//拆分信息;原分录行索引,新增拆分的行数,最后一行值,来源单内码,来源单分录内码
Dictionary<int, Tuple<int, decimal, long, long>> dicSplitInfo = new Dictionary<int, Tuple<int, decimal, long, long>>();
foreach (var rowObj in entryDynObjs) //循环分录
{
var linkObjs= rowObj[targetLinkEntity.Key] as DynamicObjectCollection;
long sBillId = Int64.Parse(linkObjs[0]["SBillId"].ToString()); //来源单据内码
long sId = Int64.Parse(linkObjs[0]["SId"].ToString());//来源分录内码
var sRealQty = decimal.Parse(Convert.ToString(field.DynamicProperty.GetValue(rowObj ))); //得到字段在此分录下的值
if (sRealQty > splitNumber) //如果值大于行拆分值
{
var rowCount = (int)(sRealQty % splitNumber > 0 ? sRealQty / splitNumber : sRealQty / splitNumber - 1); //需要新增拆分的行数
decimal leaveValue = sRealQty - splitNumber * rowCount; //剩余值
dicSplitInfo.Add(rowIndex, Tuple.Create(rowCount, leaveValue, sBillId, sId));
}
//复制拆分行,并设置拆分值
int offsetRow = 0; //偏移数
foreach (var item in dicSplitInfo)
{
rowIndex = item.Key + offsetRow; //原分录行索引加偏移量在变动的数据包中的索引
var dynObj = entryDynObjs[rowIndex]; //原原分录行数据包
tView.Model.SetValue(field, dynObj, splitNumber); //这字段值并且会触发值更新事件
tView.InvokeFieldUpdateService(field.Key, rowIndex); //调用实体服务规则
offsetRow = 0; //偏移量重置
for (int i = 0; i < item.Value.Item1; i++)
{
tView.Model.CopyEntryRowFollowCurrent(field.Entity.Key, rowIndex + offsetRow, rowIndex, true); //rowIndex + offsetRow+1插入的位置;rowIndex复制行的位置;true,复制关联关系
int newRowIndex = rowIndex + offsetRow + 1; //新分录行索引
var fValue = i == item.Value.Item1 - 1 ? (item.Value.Item2 == 0 ? splitNumber : item.Value.Item2) : splitNumber;
//对单据体进行赋值
tView.Model.SetValue(field, entryDynObjs[newRowIndex], fValue); //这字段值并且会触发值更新事件
tView.InvokeFieldUpdateService(field.Key, newRowIndex); //调用实体服务规则
//关联数据包的处理
//处理关联数据包
var linkObjs = targetLinkEntity.DynamicProperty.GetValueFast(entryDynObjs[newRowIndex]) as DynamicObjectCollection;
// 控制字段处【API下推接口】---实现一行拆成多行
实现说明 调用API下推接口,根据传入的自定义数据,实现单据在转换过程中对行进行拆分。要点: 1. 下推接口传入自定义...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



