K3Cloud7.0插件开发应用案例
- 格式:doc
- 大小:100.00 KB
- 文档页数:7
架构模型动态表单领域模型插件开发步骤定义插件类(参照继承体系);分析业务定义重载方法;引用相关组件(参照组件引用规则);重载方法编码;设置编译路径,编译组件;打开IDE设计器,配置插件;动态表单视图接口IDynamicFormViewIDynamicFormViewService2个重要的属性BusinessInfoLayoutInfo界面元素访问1、访问菜单this.View.GetMainBarItemthis.View.GetBarItem2、访问表单控件this.View.GetControlthis.View.GetView3、访问字段this.View.GetFieldEditorthis.View.LockFieldthis.View.SetFormTitle 4、执行操作ShowFormUpdateViewInvokeFieldUpdateService动态表单模型接口IDynamicFormModelIDynamicFormModelService属性BusinessInfoDataObject数据操作CreateNewDataCreateNewEntryRowInsertEntryRowGetEntryCurrentRowIndexLoadReferenceDataGetValueGetEntityDataObject动态表单插件命名空间:Kingdee.BOS.Core.DynamicForm.PlugInIDynamicFormViewPlugIn IDynamicFormModelPlugIn加载机制OnInitializeCreateNewData / AfterCreateNewData BeforeBindData / AfterBindDataBeforeClosed表单操作BeforeDoOperation / AfterDoOperationBeforeF7Select / AfterF7Select TabItemSelectedChange表单事件BarItemClickEntryBarItemClickToolBarItemClickButtonClickEntityRowClickEntityRowDoubleClickEntryButtonCellClick模型访问操作BeforeUpdateValueBeforeDeleteRowAfterDeleteRow单据插件(基础资料插件)继承自动态表单接口IBillViewPlugInOnBillInitialize参数BillOpenParameterIBillModelPlugInBeforeSave / AfterSaveBeforeSubmit / AfterSubmit列表插件继承自动态表单接口IListViewPlugInOnListInitialize参数ListOpenParameterAfterGetDataFormatCellValueIListModelPlugInPrepareFilterParameterBatchCopyData过滤条件插件接口IListFilterViewIListFilterModelFilterObjectQuickFilterObjectIsolationOrgIdGetFilterField事件OnParseSettingFireBeforeBindFilterMetadataFireBeforeSelectTreeNodeScheme服务插件命名空间:Kingdee.BOS.Core.DynamicForm.PlugIn抽象类:AbstractOperationServicePlugIn继承体系:(继承自抽象类)Kingdee.BOS.Core.DynamicForm.PlugIn.AbstractOperationServicePlugIn接口IOperationServicePlugInBeforeExecuteOperationTransactionAfterExecuteOperationTransactionBeginOperationTransactionEndOperationTransaction校验服务IOperationServicePlugInOnAddValidatorsSaveValidator : AbstractValidatorValidate表单插件和列表插件继承层次表单单据叙事簿基础资料插件针对对象动态表单单据基础资料Kingdee.BOS.Core.dllAbstractBillPlugIn 接口AbstractBillPlugIn的ViewPlugin插件接口OnBillInitialize 视图模型初始化事件AfterBindData 绑定数据后事件处理接口BeforeF7Select 基础资料弹出前事件BeforeClosed 窗口关闭前事件BarItemClick 菜单单击事件处理扩展接口AfterBarItemClick 菜单单击事件后BeforeDoOperation 操作调用前事件AfterDoOperation 操作调用完成后事件ButtonClick 按钮单击事件AfterButtonClick 按钮单击后事件ListViewClick 列表项目单击事件TreeNodeClick 树控件单击事件TreeDragDrop 树控件拖拽EntityRowClick 分录行单击事件AbstractBillPlugIn的ModelPlugIn接口动态表单数据模型插件编程接口定义了数据模型扩展允许通过接口处理数据,以实现特定业务需求AbstractBillPlugIn插件方法CreateNewData 数据模型创建实体对象事件AfterCreateNewData 数据模型创建实体对象完成后事件BeforeUpdateValue 数据更新前事件DataChanged 数据改变后事件CreateNewEntryRow 创建分录行事件BeforeDeleteRow 删除分录行事件AfterDeleteRow 删除分录后事件叙事簿插件接口AbstractListPlugIn 的ViewPlugIn接口序时簿视图插件编程模型接口定义了序时簿视图模型扩展允许通过接口处理视图,实现特定业务需求ListInitialize 视图模型初始化事件AfterGetData 完成取数后事件FormatCellValue 列表格式化接口BeforeButtonClick 按钮和菜单单击前事件AfterButtonClick 按钮和菜单单击后事件CellDbButtonClick 单元格双击事件AbstractListPlugIn 的ModelPlugIn接口序时簿数据模型插件编程接口定义了序时簿数据模型扩展允许通过接口处理数据,以实现特定业务需求PrepareFilterParameter 准备过滤条件CreateFilterEditorControl 触发创建过滤条件控件事件BatchCopyData 复制单据事件AfterBatchCopyData 复制单据完毕事件服务插件插件特性IOperationServicePlugin一般会附加校验器运行于App层事务保护插件针对对象操作Kingdee.BOS.Core.dll服务插件AbstractOperationServicePlugIn应用服务器插件与业务数据更新操作在一个事务执行校验器插件AbstractValidator在服务插件的OnAddValidators加入AbstractOperationServicePlugIn插件方法OnPreparePropertys 可以定制加载指定字段到实体里OnAddValidators 添加自定义数据校验器BeforeExecuteOperationTransaction 执行操作事务前事件AfterExecuteOperationTransaction 执行操作事务后事件BeginOperationTransaction 调用操作事件前触发(支持事务) EndOperationTransaction 调用操作事件完毕(支持事务)表单构建插件继承层次表单单据叙事簿基础资料插件针对对象动态表单单据基础资料Kingdee.BOS.Core.dllAbstractDynamicWebFormBuilderPlugIn插件方法CreateControl 构建界面元素事件AfterCreateControl 构建界面元素后事件CreateMainMenu 构建菜单事件AfterCreateMainMenu 构建菜单后事件表单插件调用过程由控制器创建视图、模型、插件代理初始化视图、模型由插件服务注册到插件代理插件代理初始化插件加载数据,通知插件创建数据,创建表单数据包表单操作插件服务调用代理,发送事件通知插件代理调用插件,执行事件返回执行结果View对象属性this.View(View接口)this.View的常用属性BusinessInfo(界面业务对象元数据)LayoutInfo(布局元数据)Model(动态表单模型接口)OpenParameter(页面调用时传入的参数)方法GetFieldEditor (获取界面控件对象)UpdateView(重新更新界面数据及状态)ShowMessage(显示信息)更改界面控件状态this.View. GetFieldEditor示例:/// <summary>/// 设置金额列精度/// </summary>/// <param name="iScale"></param>/// <param name="strField"></param>private void SetColumnScale(short iScale, string strField){his.View.GetFieldEditor<DecimalFieldEditor>(strField, -1).Scale = iScale; }更新界面数据和状态this.View.UpdateView示例:/// <summary>/// 字段修改事件函数重载/// </summary>public override void DataChanged(DataChangedEventArgs e){switch (e.Key.ToUpper()){case "FPARENTDEPTID": //组织隶属方案和上级部门变化,重新生成部门全称this.Model.SetValue(“FFullName”, GetFullName(e.Key));this.View.UpdateView(“FFullName”);break;}}显示信息this.View.ShowMessage示例:if (e.CurParentId == "0"){this.View.ShowMessage(“请先选择顶层组织。
10.插件开发在过去,由于追求大规模集约生产技术、标准化的理念和操作的高效率,使得很多应用产品都趋于标准化。
随着信息技术快速发展,越来越多的企业把对人的关注、人的个性释放及人的个性需求的满足推到空前中心的地位,企业与市场逐步建立一种新型关系,建立消费者个人数据库和信息档案,与消费者建立更为个人化的联系,及时地了解市场动向和顾客需求,向顾客提供一种个人化的销售和服务,顾客根据自己需求提出商品性能要求,企业尽可能按顾客要求进行生产,迎合消费者个别需求和品味,并应用信息,采用灵活战略适时地加以调整,以生产者与消费者之间的协调合作来提高竞争力,以多品种、中小批量混合生产取代过去的大批量生产。
这有利于节省中间环节,降低销售成本。
K/3Cloud BOS平台提供动态扩展功能,通过动态领域模型建模将业务成各种标准接口和标准服务,通过插件开发完成标准业务扩展,快速高效实现个性化和非标准化业务。
K/3Cloud BOS平台的插件是一种专门为某一软件设计、用于功能扩充的程序。
通过它可以:实现更灵活的控制方式和客户化定制;实现标准产品中特殊的业务流程处理;进行个性化的菜单、外观定制;增加自定义的菜单并响应其操作;对已有操作和服务未支持的功能进行扩展;快速开发、快速实施、快速应用;可配置,可测试,快速部署。
介绍插件开发前再回顾一下BOS架构模型:(图 10 – 1 架构模型)动态表单模型封装了表单标准服务、操作和扩展服务,通过引擎和标准插件调用来组装业务。
标准插件可被业务插件继承和替代,实现客户个性化需求。
根据应用,BOS平台提供了4类插件:1.动态表单插件业务逻辑封装的插件,用于单据上业务各种事件、操作和服务的介入;提供了一系列事件、操作和服务接口;此类插件最常用。
2.服务插件基于动态表单服务端的插件,提供服务编程接口;此类接口在外部服务直接调用。
3.校验规则插件针对业务规则进行校验的插件;4.表单构建插件对界面加载控件和元数据的插件;通过此插件可对界面控件及元数据动态调整实现特殊需求。
收货单提供以下功能:1.增加下拉列表,显示单据头的所有字段;2.在分录菜单上增加库存查询(FQueryInventory)菜单项;3.点击库存查询时,查询分录上当前焦点所在物料的库存(STK_InvSumQuery);STK_Inventory4.查询库存时按组织隔离,只查询当前组织的库存;5.当前分录物料F8时,显示所有组织的物料;6.暂存时清空单据类型的值;7.物料基础资料增加字段有效期至(F_MCY_ExpiryDate);时只显示有效期〉今天的物料;9.保存判断物料的库存,如果〉100则提示“库存〉100,是否入库”;10.保存后锁定“收料部门”、“收料员”;11.保存后自动记录收料日志(MCY_stk_ReceiptLog);操作步骤:1.增加下拉列表,显示单据头的所有字段;a)新建(打开)收货单插件工程();b)重载OnInitialize方法,定义List<EnumItem>用于存储下拉列表枚举值;c)通过方法获取所有字段;d)通过方法获取界面上的下拉列表控件;e)SetComboItems绑定值;f)代码如下:C#public override void OnInitialize(InitializeEventArgs e){(e);List<EnumItem> list = new List<EnumItem>();foreach (Field field in {EnumItem item = new EnumItem();= ;= ;= ;(item);}"FCombo").SetComboItems(list);}2.在分录菜单上增加库存查询(tbQueryInventory)菜单项;a)运行IDE,选择单据体-菜单集合,新增菜单:b)保存;3.点击库存查询时,查询分录上当前焦点所在物料的库存;a)打开插件工程,重载方法EntryBarItemClickb)判断BarItemKey==库存查询(tbQueryInventory)c)取当前分录行d)设置ListShowParameter参数,打开表单这里介绍2种获取当前分录字段数据的方法:TryGetEntryCurrentRow:获取单据体当前行,返回是否取到值以及行数据和行号;另外一种方法:先获取单据体当前行号,再取指定行数据;2种方法没什么区别。
收货单提供以下功能:1.增加下拉列表,显示单据头的所有字段;2.在分录菜单上增加库存查询(FQueryInventory)菜单项;3.点击库存查询时,查询分录上当前焦点所在物料的库存(STK_InvSumQuery);STK_Inventory4.查询库存时按组织隔离,只查询当前组织的库存;5.当前分录物料F8时,显示所有组织的物料;6.暂存时清空单据类型的值;7.物料基础资料增加字段有效期至(F_MCY_ExpiryDate);8.F8时只显示有效期〉今天的物料;9.保存判断物料的库存,如果〉100则提示“库存〉100,是否入库”;10.保存后锁定“收料部门”、“收料员”;11.保存后自动记录收料日志(MCY_stk_ReceiptLog);操作步骤:1.增加下拉列表,显示单据头的所有字段;a)新建(打开)收货单插件工程();b)重载OnInitialize方法,定义List<EnumItem>用于存储下拉列表枚举值;c)通过方法获取所有字段;d)通过方法获取界面上的下拉列表控件;e)SetComboItems绑定值;f)代码如下:C#public override void OnInitialize(InitializeEventArgs e){(e);List<EnumItem> list = new List<EnumItem>();foreach (Field field in{EnumItem item = new EnumItem();= ;= ;= ;(item);}"FCombo").SetComboItems(list);}2.在分录菜单上增加库存查询(tbQueryInventory)菜单项;a)运行IDE,选择单据体-菜单集合,新增菜单:b)保存;3.点击库存查询时,查询分录上当前焦点所在物料的库存;a)打开插件工程,重载方法EntryBarItemClickb)判断BarItemKey==库存查询(tbQueryInventory)c)取当前分录行d)设置ListShowParameter参数,打开表单这里介绍2种获取当前分录字段数据的方法:TryGetEntryCurrentRow:获取单据体当前行,返回是否取到值以及行数据和行号;另外一种方法:先获取单据体当前行号,再取指定行数据;2种方法没什么区别。
示例代码如下:C#public override void EntryBarItemClick(BarItemClickEventArgs e){(e);if== "tbQueryInventory"){ShowQueryInventory();}}private void ShowQueryInventory(){DynamicObject row;int rowIndex;调试状态下,可以屏蔽代码看看过滤条件的效果。
注意:ListFilterParameter的Filter属性设置的字段是用IDE中的字段标识。
4.查询库存时按组织隔离,只查询当前组织的库存:a)增加过滤条件,组织=当前组织b)= (" FORGID ={0} ", });5.当前分录物料F8时,显示所有组织的物料;a)重载AuthPermissionBeforeF7Select方法,设置参数IsIsolationOrg = false;b)同样,如果需要F8时控制只显示当前组织的物料,该参数设置为true。
注意:在BOS系统中,默认是按组织隔离的,即非共享基础资料,在F8时都是只显示当前组织的物料。
代码示例如下:C#public override void AuthPermissionBeforeF7Select(AuthPermissionBeforeF7SelectEventArgs e){(e);if== "FBase"){= false;}}6.暂存时清空单据类型的值;(e);if"DRAFT", ){"FBillTypeID", null);}}7.F8时只显示审核日期〉2014-03-22的供应商;a)重载BeforeF7Select事件;b)设置列表过滤参数ListFilterParameter的属性Filter;C#public override void BeforeF7Select(BeforeF7SelectEventArgs e){(e);if== "FSupplierId1"){string filter = " FCreateDate > '2014-03-20' ";if{= filter;}else{+= " AND " + filter;}}}8.保存判断物料的库存,如果〉100则提示“库存〉100,是否入库”;a)新建收货单服务插件工程;b)定义保存服务类SaveServicePlugIn,继承自AbstractOperationServicePlugIn;c)重载OnAddValidators方法;代码示例如下:C#public override void OnAddValidators(AddValidatorsEventArgs e){(e);SaveValidator saveValidator = new SaveValidator();= "FBillHead";d)定义保存校验类SaveValidator,继承自AbstractValidator;e)重载方法:Validate:i.获取单据体分录数据,取到物料Id;ii.查询物料库存;iii.检查库存是否〉100;iv.构造校验结果信息;代码示例:C#public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, ctx) {if (dataEntities == null || == 0){return;}Dictionary<long, decimal> dictErrMaterialId = new Dictionary<long, decimal>();FMATERIALID) group by FMATERIALID ";SqlParam param = new SqlParam("@FMATERIALID", , ().ToArray());using (IDataReader dr = , sql, param)){while ()){decimal qty = (dr["FQTY"]);if (qty > 100){(dr["FMATERIALID"]), qty);}}}foreach (ExtendedDataEntity entityObj in dataEntities){DynamicObjectCollection collection = (DynamicObjectCollection)entityObj["FEntity"];foreach (DynamicObject rowObj in collection){if ((long)rowObj["FBase_Id"])){ValidationErrorInfo errinfo = new ValidationErrorInfo("FMATERIALID", ["Id"]), , (rowObj["Id"]), "SaveValidator", "库存数量大于100", "校验失败", ;(entityObj, errinfo);}}}f)重载方法:Validate:9.保存后锁定“收料部门”、“收料员”;a)锁定字段的方法:;b)该锁定与事务无关,只要在客户端保存后事件(AfterBarItemClick)处理即可;c)“收料部门”、“收料员”的key可以在IDE设计器中拷贝;代码如下:C#public override void AfterBarItemClick(AfterBarItemClickEventArgs e){(e);if== "tbSave"){"FBase1", true);"FBase2", true);}}10.保存后自动记录收料日志(KDV_stk_ReceiptLog);根据需求设计收料日志表:保存有2种方法:方法1:a)在IDE中定义收料日志基础资料;b)打开收货单服务插件保存服务类SaveServicePlugIn;c)根据收料日志基础资料的元数据定义,创建动态实体对象;d)设置对象属性值;e)调用BusinessDataService服务的保存方法保存动态实体对象;(e);MetaDataService metaService = new MetaDataService();FormMetadata formMetaData = (FormMetadata), "1823871d-b9cf-4d8b-93af-39c0c37011a5");DynamicObjectType dt = DynamicObject obj = new DynamicObject(dt);["KDV_UserID_Id"].SetValueFast(obj, ["KDV_Content"].SetValueFast(obj, "保存");ISaveService saveService = <ISaveService>();, new DynamicObject[] { obj });}方法2:a)自定义收料日志表;b)获取日志的自增长(序列)值;c)执行insert;代码如下:C#public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e){(e);SequenceReader sequence = new SequenceReader;int[] ids = (int[])("KDV_stk_ReceiptLog", 1);int id = ids[0];string sql = " insert into KDV_stk_ReceiptLog(FID, KDV_UserID, KDV_Content) values (@FID,@KDV_UserID, @KDV_Content) ";SqlParam[] sqlParams = new SqlParam[3];sqlParams[0] = new SqlParam("@FID", , id);sqlParams[1] = new SqlParam("@KDV_UserID", , sqlParams[2] = new SqlParam("@KDV_Content", , "保存");, sql, sqlParams);}。