单据转换插件二次开发分享
金蝶云社区-贾佳霖
贾佳霖
0人赞赏了该文章 1,268次浏览 未经作者许可,禁止转载编辑于2017年05月24日 15:14:54

功能需求:“销售订单”下推“销售出库单”时 自动填写序列号。
序列号来源:“销售出库单”的源单号和源单行号 与“产品入库单”中的参考标签下的需求单据和需求行号进行关联。“销售出库单”中的序列号为对应的产品入库单中的序列号(在库)。
开发思路:开发一个单据转换插件,在该插件的AfterConvert事件中通过数据库查询获取到对应的序列号信息,并向目标单数据包中添加序列号子单据体的信息。
本人第一次做cloud的二次开发,C#也是第一次用,代码肯定有不规范的地方,请大家见谅,也请大家给我提意见!!!
以下是插件代码

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Kingdee.BOS;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Resource;
using Kingdee.K3.SCM.Contracts;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Util;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Metadata.EntityElement;

namespace JS.K3.SCM.SAL.ConvertPlug
{

public class PushEventSeq : AbstractConvertPlugIn
{

// ******本事件同时适用于下推、选单******
///


/// 单据从源单到目标单已经转换完毕,输出最后的目标单数据包之前触发,
/// 此时,目标单数据包已经构建完毕,不会再有变动了
///

///
///
/// 可以在此事件中,对目标单数据包进行最后的修订、补充
///

public override void AfterConvert(AfterConvertEventArgs e)
{
base.AfterConvert(e);
//System.Diagnostics.Debug.Print("AfterConvert");
ExtendedDataEntity[] rows = e.Result.FindByEntityKey("FEntity");
foreach (ExtendedDataEntity entity in rows)
{

//throw new KDException("aaa","错误信息"); //抛出异常
DynamicObject billObj = entity.DataEntity;
DynamicObjectCollection SrcBIllInfos = (DynamicObjectCollection)billObj["FEntity_Link"];
DynamicObject SrcBillInfo = SrcBIllInfos[0]; //第一个源单数据,如果多个源单对SrcBIllInfos进行遍历处理多源单数据
long SrcBillID = Convert.ToInt64(SrcBillInfo["SBillID"]); //获取源单单据内码
long SrcEntryID = Convert.ToInt64(SrcBillInfo["SID"]); //获取源单分录内码

string sql = @"select t3.FSERIALNO from T_PRD_INSTOCKENTRY t1 ";
sql += "left join T_PRD_INSTOCKENTRY_A t2 on t1.FENTRYID = t2.FENTRYID ";
sql += "left join T_PRD_INSTOCKMTRLSERIAL t3 on t1.FENTRYID = t3.FENTRYID ";
sql += "left join T_BD_SERIALMASTERORG t4 on t3.FSERIALID = t4.FSERIALID ";
sql += "where t2.FREQBILLID = @SrcBillID and FREQENTRYID = @SrcEntryID and t4.FSTOCKSTATUS = 1 ";
sql += "order by t4.FSERIALID ; ";
SqlParam param1 = new SqlParam("SrcBillID", KDDbType.Int64, SrcBillID);
SqlParam param2 = new SqlParam("SrcEntryID", KDDbType.Int64, SrcEntryID);
List ListParam = new List();
ListParam.Add(param1);
ListParam.Add(param2);
DynamicObjectCollection Serials = (DynamicObjectCollection)billObj["SAL_OutStockSerial"]; //获取序列号子单据体的数据集合对象
//using (var reader = DBUtils.ex.ExecuteReader(this.Context, sql, ListParam))
using (DataSet ds = DBUtils.ExecuteDataSet(this.Context, sql, ListParam))
{
for (int i = 0;i < ds.Tables[0].Rows.Count; i++)
{
DynamicObject item = new DynamicObject(Serials.DynamicCollectionItemPropertyType);
item["Id"] = 0;
item["Seq"] = i + 1; //行号
item["SerialNo"] =ds.Tables[0].Rows[i][0].ToString(); //序列号名称
item["serialId_Id"] = 0;
item["serialId"] = null;
item["serialNote"] = null;
Serials.Add(item);
}
}
}
}
}
}[/i]


[i]另外分享两个新手学习的资料:[/i]
单据数据包DynamicObject的结构及操作
{{{/article/2697544}}}=数据包%20中添加数据
K/3 Cloud 数据架构模型
http://open.kingdee.com/K3Cloud/CDPPortal/DataModel.aspx