K/3 Cloud 技术开发培训 ----BOS 单据转换插件开发 注:云图标可根据标题长度适度调整移动,以标题右上角,与标题上、右均等距离7个像素为标准。
课程说明: 课程简介: 本课程介绍K/3 Cloud BOS 单据转换插件的开发及配置,以功能讲解辅之案例演练帮助学员快速掌握K/3 Cloud BOS平台的单据转换功能。
目录 概述 单据转换插件 案例演练
目录 概述 单据转换插件 案例演练
单据转换插件 – 插件注册
目录 概述 单据转换插件 案例演练
单据转换插件 – 接口结构 AbstractConvertPlugIn 接口
AbstractConvertPlugIn插件接口下推执行顺序 如何开发插件 – 接口结构 AbstractConvertPlugIn插件接口下推执行顺序 OnInitVariable(InitVariableEventArgs e) 初始化变量,可以得到转换规则,源单和目标单的BussinessInfo OnQueryBuilderParemeter(QueryBuilderParemeterEventArgs e) 解析字段映射关系,并构建查询参数。这里可以加入你想要的额外的字段 OnInSelectedRow(InSelectedRowEventArgs e) 构建列表中选择数据行的查询条件语句 OnParseFilter(ParseFilterEventArgs e) 解析过滤策略中配置的条件,这里可以插件而外增加过滤条件。
AbstractConvertPlugIn插件接口下推执行顺序 如何开发插件 – 接口结构 AbstractConvertPlugIn插件接口下推执行顺序 OnGetSourceData(GetSourceDataEventArgs e) 下推时,执行SQL,读取源单数据(下推执行) OnBeforeGroupBy(BeforeGroupByEventArgs e) 执行源数据分组前,在这里可以修改分组字段。 OnCreateTarget(CreateTargetEventArgs e) 根据源数据分组结果,初始化创建目标单据数据包(下推执行) OnBeforeFieldMapping(BeforeFieldMappingEventArgs e) 根据字段映射,向目标字段填充值之前。这里可以设置e. FireFieldMappingEvent值,启动插件每个字段填充事件(即:OnFieldMapping事件)
AbstractConvertPlugIn插件接口下推执行顺序 如何开发插件 – 接口结构 AbstractConvertPlugIn插件接口下推执行顺序 OnFieldMapping(FieldMappingEventArgs e) 根据字段映射,向目标字段填充值 OnAfterFieldMapping(AfterFieldMappingEventArgs e) 所有字段映射完成 OnCreateLink(CreateLinkEventArgs e) 关联关系(Link表)创建前 OnAfterCreateLink(CreateLinkEventArgs e) 关联关系(Link表)创建完成 AfterConvert(AfterConvertEventArgs e) 单据转换后事件,这里目标单已经全部生成,可以在这里修改目标单数据包里的值。
AbstractConvertPlugIn插件接口选单前执行顺序 如何开发插件 – 接口结构 AbstractConvertPlugIn插件接口选单前执行顺序 OnInitVariable(InitVariableEventArgs e) 初始化变量,可以得到转换规则,源单和目标单的BussinessInfo OnParseFilterOptions(ParseFilterOptionsEventArgs e) 解析映射关系中的过滤选项 OnParseFilter(ParseFilterEventArgs e) 选单前事件:解析过滤策略中配置的条件
AbstractConvertPlugIn插件接口选单执行顺序 如何开发插件 – 接口结构 AbstractConvertPlugIn插件接口选单执行顺序 OnInitVariable(InitVariableEventArgs e) 初始化变量,可以得到转换规则,源单和目标单的BussinessInfo OnQueryBuilderParemeter(QueryBuilderParemeterEventArgs e) 解析字段映射关系,并构建查询参数。这里可以加入你想要的额外的字段 OnInSelectedRow(InSelectedRowEventArgs e) 构建列表中选择数据行的查询条件语句
AbstractConvertPlugIn插件接口选单执行顺序 如何开发插件 – 接口结构 AbstractConvertPlugIn插件接口选单执行顺序 OnGetDrawSourceData(GetSourceDataEventArgs e) 选单时,执行SQL,读取源单数据(选单执行) OnBeforeGroupBy(BeforeGroupByEventArgs e) 执行源数据分组前 OnCreateDrawTarget(CreateTargetEventArgs e) 根据源数据分组结果,初始化创建目标单据数据包(选单执行) OnBeforeFieldMapping(BeforeFieldMappingEventArgs e) 根据字段映射,向目标字段填充值之前
AbstractConvertPlugIn插件接口选单执行顺序 如何开发插件 – 接口结构 AbstractConvertPlugIn插件接口选单执行顺序 OnFieldMapping(FieldMappingEventArgs e) 根据字段映射,向目标字段填充值 OnAfterFieldMapping(AfterFieldMappingEventArgs e) 所有字段映射完成 OnCreateLink(CreateLinkEventArgs e) 关联关系(Link表)创建前 OnAfterCreateLink(CreateLinkEventArgs e) 关联关系(Link表)创建完成 AfterConvert(AfterConvertEventArgs e) 单据转换后事件
目录 概述 单据转换插件 示例 namespace Kingdee.BOS.Demo.PlugIns { public class ConvertDemoPlugIns : AbstractConvertPlugIn //构建源单取数参数 public override void OnQueryBuilderParemeter(QueryBuilderParemeterEventArgs e) base.OnQueryBuilderParemeter(e); e.DicFieldAlias.Add("Fxxxx", "f100"); } //解析选单条件策略 public override void OnParseFilter(ParseFilterEventArgs e) base.OnParseFilter(e); e.FilterPolicySQL += "???"; //修改过了语句 //选单前事件;解析字段映射关系中配置的过滤选项; public override void OnParseFilterOptions(ParseFilterOptionsEventArgs e) base.OnParseFilterOptions(e); e.FilterOptionsSQL += "???"; //修改过了语句 //执行源单取数前事件 public override void OnBeforeGetSourceData(BeforeGetSourceDataEventArgs e) base.OnBeforeGetSourceData(e); e.QueryObject.SQLOrderBy += ",FXxx"; //分组策略执行前事件 public override void OnBeforeGroupBy(BeforeGroupByEventArgs e) e.HeadGroupKey = e.HeadGroupKey + ",FXxx"; e.EntryGroupKey = e.EntryGroupKey + ",FYyy"; e.SubEntryGroupKey = e.SubEntryGroupKey + ",FZzz"; //字段映射前事件 public override void OnBeforeFieldMapping(BeforeFieldMappingEventArgs e) e.FireFieldMappingEvent = true; //触发单个字段映射事件 //单个字段映射事件 public override void OnFieldMapping(FieldMappingEventArgs e) if (e.TargetField.Key.EqualsIgnoreCase("FXxx")) e.MapValue = "xxx"; //修改每个字段的映射值 public override void OnAfterFieldMapping(AfterFieldMappingEventArgs e) var extendEntities = e.TargetExtendDataEntitySet.FindByEntityKey("FBillHead"); foreach (var extendEntity in extendEntities) var billDynamicObject = extendEntity.DataEntity; billDynamicObject["propertyName"] = "xxx"; List<DynamicObject> lstSoureObjs = extendEntity[BOSConst.ConvSourceExtKey] as List<DynamicObject>; billDynamicObject["????"] = lstSoureObjs[0]["f100"]; public override void AfterConvert(AfterConvertEventArgs e) base.AfterConvert(e); var extendEntities = e.Result.FindByEntityKey("FBillHead");
如何开发插件 – 代码示例 单据转换插件 OnInitVariable(InitVariableEventArgs e)初始化事件 e.SourceBusinessInfo源单据BusinessInfo e. TargetBusinessInfo目标单据BusinessInfo e. Rule单据转换规则 示例: public override void OnInitVariable(InitVariableEventArgs e) { base.OnInitVariable(e); mainOrgField = e.TargetBusinessInfo.MainOrgField; this.lstOrgFields = new List<OrgField>(from p in e.TargetBusinessInfo.GetFieldList() where p is OrgField select (OrgField)p); }
如何开发插件 – 代码示例 OnQueryBuilderParemeter(QueryBuilderParemeterEventArgs e) 解析字段映射关系,并构建查询参数 QueryBuilderParemeterEventArgs e.SourceBusinessInfo来源单据BusinessInfo e. SelectItems添加查询参数集合 e. DicFieldAlias字段别名字典包 示例: public override void OnQueryBuilderParemeter(BOS.Core.Metadata.ConvertElement.PlugIn.Args.QueryBuilderParemeterEventArgs e) { //添加单据类型字段 e.SelectItems.Add(new SelectorItemInfo("FBillTypeID")); //添加业务类型 e.SelectItems.Add(new SelectorItemInfo("FBusinessType")); }
如何开发插件 – 代码示例 OnBeforeGroupBy(BeforeGroupByEventArgs e) 分组事件之前,可以添加分组字段 BeforeGroupByEventArgs e. GroupByMode分组类型,比如一对一 e. HeadGroupKey添加分组字段,单据分组依据 e. EntryGroupKey添加分组字段,单据体分录合并 e. SourceData来源单据数据包 示例: public override void OnBeforeGroupBy(BeforeGroupByEventArgs e) { base.OnBeforeGroupBy(e); bool isSplitStock = false; bool isSplitProcess = false; DynamicObject param = AppServiceContext.ParamService.TryGetUserParam(this.Context, MFGFormIdConst.SubSys_PRD.PickMtrlBill, MFGFormIdConst.SubSys_PRD.PickBillParamter); if(param!=null) isSplitStock = param.GetDynamicObjectItemValue<bool>("IsSplitStock"); isSplitProcess = param.GetDynamicObjectItemValue<bool>("IsSplitProcess"); } if (isSplitStock) e.HeadGroupKey += ",FStockID"; if (isSplitProcess) e.HeadGroupKey += ",FProcessID";
如何开发插件 – 代码示例 OnBeforeGroupBy(BeforeGroupByEventArgs e) 分组事件之前,可以添加分组字段 BeforeGroupByEventArgs e. GroupByMode分组类型,比如一对一 e. HeadGroupKey添加分组字段,单据分组依据 e. EntryGroupKey添加分组字段,单据体分录合并 e. SourceData来源单据数据包 示例: public override void OnBeforeGroupBy(BeforeGroupByEventArgs e) { base.OnBeforeGroupBy(e); bool isSplitStock = false; bool isSplitProcess = false; DynamicObject param = AppServiceContext.ParamService.TryGetUserParam(this.Context, MFGFormIdConst.SubSys_PRD.PickMtrlBill, MFGFormIdConst.SubSys_PRD.PickBillParamter); if(param!=null) isSplitStock = param.GetDynamicObjectItemValue<bool>("IsSplitStock"); isSplitProcess = param.GetDynamicObjectItemValue<bool>("IsSplitProcess"); } if (isSplitStock) e.HeadGroupKey += ",FStockID"; if (isSplitProcess) e.HeadGroupKey += ",FProcessID";