Download presentation
Presentation is loading. Please wait.
1
K/3 Cloud V1.0技术开发培训 ----BOS 业务插件开发
注:云图标可根据标题长度适度调整移动,以标题右上角,与标题上、右均等距离7个像素为标准。
2
课程说明: 课程简介: 本课程介绍K/3 Cloud BOS 业务插件的开发及配置,以功能讲解辅之案例演练帮助学员快速掌握K/3 Cloud BOS平台的核心功能。 讲师:肖光雁
3
目录 概述 业务插件概览 如何开发插件 案例演练
4
目录 概述 业务插件概览 如何开发插件 案例演练
5
BOS概述- K/3 Cloud技术架构 技术特性 客户价值 .NET FrameWork4.0云平台技术 跨数据库技术
支撑动态商业应用;企业可以从容应对业务的发展与变化; K/3 cloud系统架构支撑动态商业应用,应用K/3 cloud的企业,可以从容应对业务的发展与变化。动态领域模型、云平台技术、跨数据库技术、Web2.0技术、无线技术、企业管理软件生态链等方面阐述K/3 cloud的技术特性。
6
BOS概述- K/3 BOS系统架构 技术特性 客户价值 .NET FrameWork4.0; Web2.0+3G; 动态BPM; SOA;
基于云计算; 技术特性 客户价值 存储云 虚拟服务器 网络及管理 PaaS基础设施服务(公有/私有云计算基础平台) 构件开发 发布/导入 服务组合 动态领域建模 企业服务总线 多租户管理 动态业务流程管理 领域模型解释器 方案组装 流程建模 在线测试 租户运维 应用部署 性能治理 系统优化 数据管理 业务应用方案 业务服务 动态领域模型 流程 公共服务/3rd服务 体验 在线应用 主数据管理 企业门户 商业智能 业务组件库 混合应用 多通道接入 协同社区交流 云服务接入 应用知识共享 软件社会生态链社区 开发云平台 方案云平台 运维服务 统一企业服务库 支撑平台 建模平台 随需应变的能力; 基于云计算的智慧开发平台; 支持行业应用的社会化规模交付; 基于.NET FrameWork4.0 Web2.0+3G支持丰富客户体验 动态BPM,支持业务流程优化与创新 SOA 动态领域模型,随需应变的柔性能力 基于云计算的智慧开发平台 软件社会生态链,支持行业应用的社会化规模交付
7
BOS概述-BOS动态领域模型 技术特性 客户价值 微内核架构设计;模型可持续发展; 技术无关性; 面向业务用户的交互设计;
动态领域模型建模工具 领域模型模板库 (通用/行业/客户化) 元模型库 界面模型设计 对象实体设计 业务逻辑设计 动态流程建模 方案管理 发布部署 用户界面服务 领域逻辑服务 领域操作服务 企业服务库 动态流程服务 动态数据服务 模型库 构件 抽象 领域模型 行业1模型 行业2模型 客户订制模型 通用模型 领域模型动态解释引擎 用户界面 业务对象 业务逻辑 模型合并 界面组装 动态业务对象构件 业务逻辑动态组装 解释引擎插件 通用业务领域插件 行业插件 客户订制插件 柔性领域构件 面向业务用户的交互设计; 实施和最终用户都可以配置出专业的ERP应用; 建立了标准、行业、伙伴、客户等多层次开发模型,支持成果组合应用与平滑升级 建立了能够自我学习和行业知识积累的智慧元模型系统 独特的的模型解释系统,动态性和开发效率的保障 设计了独特的的模型解释系统 实现了微内核架构设计 支持技术无关性设计
8
BOS概述-BOS动态BPM架构 技术特性 客户价值 通过将动态领域模型引入业务流程设计; 面向业务用户的设计交互体验
流程引擎 版本控制 统一流程模型定义 流程管理 业务驱动的流程设计器 可扩展 业务组件库 复杂业务 插件模型 多组织支持 二次开发SDK 追踪/状态图 统计查询 生产力、执行效率分析 规则引擎 可扩展面向服务架构(Extensible SOA) 业务组件封装 自定义 业务规则 多平台整合 流程 实时监控 流程分析 业务流程 优化重组 (BPR) 面向业务用户的设计交互体验 支持行业标准、规范(XPDL、BPMN) 灵活的 柔性业务支持 全面的业务流程分析 流程服务接口允许异构系统平台进行流程整合、集成; 通过将动态领域模型引入业务流程设计,业务流程设计变成了简单的配置过程,普通业务人员经过培训就可以胜任 流程服务接口允许异构系统平台进行流程整合、集成
9
目录 概述 业务插件概览 如何开发插件 案例演练
10
BOS业务插件开发概览 BOS业务插件用以解决什么问题? 有哪些插件? 标准业务对象的的业务逻辑应用: 客户二次开发的需求; Web层
标准业务对象没有实现的控制; 已有操作和服务未支持的功能; 更灵活的控制方式和客户化定制; 客户二次开发的需求; 快速开发、快速实施、快速应用; 可配置,可测试,快速部署; 有哪些插件? Web层 表单插件 列表插件 表单构建插件 App层 服务插件 什么时候用插件:实体服务规则/值更新事件/配置服务无法满足需要时,才采用插件二次开发
11
BOS业务插件开发概览 插件接口特性 支持插件顺序 支持动态语言 使用C# 4.0 支持继承和扩展 已封装业务插件; 组织控制;
基础资料分配 ……… 支持插件顺序 支持动态语言 IronPython 2.6.1
12
BOS业务插件开发概览—插件分类 表单插件 用于单个表单编辑界面 运行于Web层 列表插件 用于列表
13
BOS业务插件开发概览 – 插件分类 服务插件 插件配置入口 操作列表 – 编辑操作 挂在操作上的服务插件,对于操作进行扩展
和校验器配合使用 运行于App层 插件配置入口 操作列表 – 编辑操作
14
BOS业务插件开发概览 – 插件分类 表单构建插件 对于表单界面进行自定义的插件 运行于Web层 自定义菜单、控件
15
BOS业务插件开发概览 动态表单元数据结构
16
BOS业务插件开发概览 动态表单元数据结构
17
目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练
18
目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练
19
如何开发插件 – 接口结构 表单插件和列表插件 继承层次 插件针对对象 表单 单据 叙事簿 基础资料 动态表单
Kingdee.BOS.Core.dll
20
如何开发插件 – 接口结构 AbstractBillPlugIn 接口 动态表单视图插件编程模型接口 定义了视图模型扩展
允许通过接口处理视图,实现特定业务需求
21
AbstractBillPlugIn的ViewPlugin插件接口
如何开发插件 – 接口结构 AbstractBillPlugIn的ViewPlugin插件接口 OnBillInitialize 视图模型初始化事件 AfterBindData 绑定数据后事件处理接口 BeforeF7Select 基础资料弹出前事件 BeforeClosed 窗口关闭前事件
22
AbstractBillPlugIn的ViewPlugin插件接口
如何开发插件 – 接口结构 AbstractBillPlugIn的ViewPlugin插件接口 BarItemClick 菜单单击事件处理扩展接口 AfterBarItemClick 菜单单击事件后 BeforeDoOperation 操作调用前事件 AfterDoOperation 操作调用完成后事件 ButtonClick 按钮单击事件 AfterButtonClick 按钮单击后事件
23
AbstractBillPlugIn的ViewPlugin插件接口
如何开发插件 – 接口结构 AbstractBillPlugIn的ViewPlugin插件接口 ListViewClick 列表项目单击事件 TreeNodeClick 树控件单击事件 TreeDragDrop 树控件拖拽 EntityRowClick 分录行单击事件
24
AbstractBillPlugIn的ModelPlugIn接口
如何开发插件 – 接口结构 AbstractBillPlugIn的ModelPlugIn接口 动态表单数据模型插件编程接口 定义了数据模型扩展 允许通过接口处理数据,以实现特定业务需求
25
AbstractBillPlugIn插件方法
如何开发插件 – 接口结构 AbstractBillPlugIn插件方法 CreateNewData 数据模型创建实体对象事件 AfterCreateNewData 数据模型创建实体对象完成后事件 BeforeUpdateValue 数据更新前事件 DataChanged 数据改变后事件
26
AbstractBillPlugIn插件方法
如何开发插件 – 接口结构 AbstractBillPlugIn插件方法 CreateNewEntryRow 创建分录行事件 BeforeDeleteRow 删除分录行事件 AfterDeleteRow 删除分录后事件
27
如何开发插件 – 接口结构 叙事簿插件接口 继承AbstractListPlugIn IListViewPlugIn
IListModelPlugIn
28
AbstractListPlugIn 的ViewPlugIn接口
如何开发插件 – 接口结构 AbstractListPlugIn 的ViewPlugIn接口 序时簿视图插件编程模型接口 定义了序时簿视图模型扩展 允许通过接口处理视图,实现特定业务需求
29
AbstractListPlugIn 的ViewPlugIn接口
如何开发插件 – 接口结构 AbstractListPlugIn 的ViewPlugIn接口 ListInitialize 视图模型初始化事件 AfterGetData 完成取数后事件 FormatCellValue 列表格式化接口
30
AbstractListPlugIn 的ViewPlugIn接口
如何开发插件 – 接口结构 AbstractListPlugIn 的ViewPlugIn接口 BeforeButtonClick 按钮和菜单单击前事件 AfterButtonClick 按钮和菜单单击后事件 CellDbButtonClick 单元格双击事件
31
AbstractListPlugIn 的ModelPlugIn接口
如何开发插件 – 接口结构 AbstractListPlugIn 的ModelPlugIn接口 序时簿数据模型插件编程接口 定义了序时簿数据模型扩展 允许通过接口处理数据,以实现特定业务需求
32
AbstractListPlugIn插件方法
如何开发插件 – 接口结构 AbstractListPlugIn插件方法 PrepareFilterParameter 准备过滤条件 CreateFilterEditorControl 触发创建过滤条件控件事件 BatchCopyData 复制单据事件 AfterBatchCopyData 复制单据完毕事件
33
如何开发插件 – 接口结构 服务插件 插件特性 插件针对对象 IOperationServicePlugin 一般会附加校验器
运行于App层 事务保护 插件针对对象 操作 Kingdee.BOS.Core.dll
34
如何开发插件 – 接口结构 服务插件接口 服务插件 AbstractOperationServicePlugIn
应用服务器插件与业务数据更新操作在一个事务执行 校验器插件 AbstractValidator 在服务插件的OnAddValidators加入
35
AbstractOperationServicePlugIn插件方法
如何开发插件 – 接口结构 AbstractOperationServicePlugIn插件方法 OnPreparePropertys 可以定制加载指定字段到实体里 OnAddValidators 添加自定义数据校验器
36
AbstractOperationServicePlugIn插件方法
如何开发插件 – 接口结构 AbstractOperationServicePlugIn插件方法 BeforeExecuteOperationTransaction 执行操作事务前事件 AfterExecuteOperationTransaction 执行操作事务后事件 BeginOperationTransaction 调用操作事件前触发(支持事务) EndOperationTransaction 调用操作事件完毕(支持事务)
37
如何开发插件 – 接口结构 表单构建插件 继承层次 插件针对对象 表单 单据 叙事簿 基础资料 动态表单
Kingdee.BOS.Core.dll
38
AbstractDynamicWebFormBuilderPlugIn插件方法
如何开发插件 – 接口结构 AbstractDynamicWebFormBuilderPlugIn插件方法 CreateControl 构建界面元素事件 AfterCreateControl 构建界面元素后事件 CreateMainMenu 构建菜单事件 AfterCreateMainMenu 构建菜单后事件
39
如何开发插件 – 接口结构 表单插件调用过程 由控制器创建视图、模型、插件代理 初始化视图、模型 由插件服务注册到插件代理
插件代理初始化插件 加载数据,通知插件创建数据,创建表单数据包 表单操作 插件服务调用代理,发送事件通知 插件代理调用插件,执行事件 返回执行结果
40
业务插件 插件调用过程
41
业务插件 插件调用过程
42
如何开发插件 – 接口结构 动态语言支持 IronPython 脚本语言 支持和C#交互调用 事件接口和C#完全一致 更加简练明白
43
目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练
44
如何开发插件 – 常用对象 View对象 属性 this.View(View接口) this.View的常用属性
BusinessInfo(界面业务对象元数据) LayoutInfo(布局元数据) Model(动态表单模型接口) OpenParameter(页面调用时传入的参数) 方法 GetFieldEditor (获取界面控件对象) UpdateView(重新更新界面数据及状态) ShowMessage(显示信息)
45
如何开发插件 – 常用对象 View对象 更改界面控件状态 this.View. GetFieldEditor 示例:
/// <summary> /// 设置金额列精度 /// </summary> /// <param name="iScale"></param> /// <param name="strField"></param> private void SetColumnScale(short iScale, string strField) { this.View.GetFieldEditor<DecimalFieldEditor>(strField, -1).Scale = iScale; }
46
业务插件 View对象 更新界面数据和状态 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; }
47
如何开发插件 – 常用对象 View对象 if (e.CurParentId == "0") {
显示信息 this.View.ShowMessage 示例: if (e.CurParentId == "0") { this.View.ShowMessage(“请先选择顶层组织。”); return; }
48
如何开发插件 – 常用对象 Model对象 属性 this.View.Model(动态表单模型接口)
DataObject 当前对象的数据实体 方法 GetEntryCurrentRowIndex(获取分录当前行索引) GetEntryRowCount(获取分录行数量) CreateNewEntryRow(新建分录行) GetValue(获取字段(对象)值) SetValue(设置字段(对象)值)
49
如何开发插件 – 常用对象 Model对象 获取单据属性:例如分录集合 this.View.Model.DataObject 示例:
/// <summary> /// 获取分录集合 /// </summary> DynamicObjectCollection entrys = (DynamicObjectCollection)this.View.Model.DataObject["POOrderEntry"];
50
如何开发插件 – 常用对象 Model对象 /// <summary> /// 单据复制完成事件 新增单据体分录行
this.View.Model.CreateNewEntryRow 示例: /// <summary> /// 单据复制完成事件 /// </summary> /// <param name="e"></param> public override void AfterCopyData(CopyDataEventArgs e) { base.AfterCopyData(e); //单据复制完,处理单据体 _billFormID = “”; this.View.Model.CreateNewEntryRow(“FFieldControl”); UpdateFieldControlRowLock(); }
51
如何开发插件 – 常用对象 Model对象 //获取根节点组织复制到目标节点 获取字段值
this.View.Model.GetValue 示例: //获取根节点组织复制到目标节点 Organization org = (DynamicObject) this.View.Model.GetValue("FRootORGID"); targetRoot.id = rootOrgId; targetRoot.text = org.Name.ToString(); targetRoot.children = new List<TreeNode>(); ctl = this.View.GetControl<TreeView>("FOrgTree"); ctl.SetRootNode(targetRoot);
52
如何开发插件 – 常用对象 Model对象 设置字段值 this.View.Model.SetValue 示例:
/// <summary> /// 字段修改事件函数重载 /// </summary> public override void DataChanged(DataChangedEventArgs e) { switch (e.Key.ToUpper()) case "FPARENTDEPTID": //组织隶属方案和上级部门变化,重新生成部门全称 this.View.Model.SetValue(“FFullName”, GetFullName(e.Key)); this.View.UpdateView(“FFullName”); break; }
53
目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练
54
如何开发插件 – 代码示例 表单插件 OnBillInitialize初始化事件 BillInitializeEventArgs 示例:
public override void OnBillInitialize(BillInitializeEventArgs e) { base.OnBillInitialize(e); firstLoad = this.View.OpenParameter.Status != OperationStatus.ADDNEW; }
55
如何开发插件 – 代码示例 表单插件 AfterBindData绑定数据后事件 示例:
public override void AfterBindData(EventArgs e) { base.AfterBindData(e); DynamicObject dy = this.View.Model.GetValue("FAccountBookID") as DynamicObject; if (dy != null && !string.IsNullOrWhiteSpace(dy["Id"].ToString())) DynamicObject org = dy["AccountOrgID"] as DynamicObject; if (org != null && !string.IsNullOrWhiteSpace(org["Id"].ToString())) this.View.Model.SetValue("FACCBOOKORGID", org); }
56
如何开发插件 – 代码示例 表单插件 BeforeClosed绑定数据后事件 BeforeClosedEventArgs 示例:
public override void BeforeClosed(BeforeClosedEventArgs e) { ReturnData(); base.BeforeClosed(e); }
57
如何开发插件 – 代码示例 表单插件 BeforeF7Select BeforeF7SelectEventArgs 示例:
public override void BeforeF7Select(BeforeF7SelectEventArgs e) { base.BeforeF7Select(e); bool success = true; switch (e.FieldKey.ToUpperInvariant()) case "FACCOUNTORG": e.ListFilterParameter.Filter = this.GetAccountOrgFilter(e.ListFilterParameter.Filter, out success); break; case "FACCOUNTBOOK": e.ListFilterParameter.Filter = this.GetAccountBookFilter(e.ListFilterParameter.Filter, out success); } e.Cancel = !success;
58
如何开发插件 – 代码示例 表单插件 ButtonClick ButtonClickEventArgs 示例:
public override void ButtonClick(ButtonClickEventArgs e) { base.ButtonClick(e); switch (e.Key.ToUpperInvariant()) case "FBTNOK": this.StartDeposit(); break; default: }
59
如何开发插件 – 代码示例 表单插件 DataChanged DataChangedEventArgs 示例:
public override void DataChanged(DataChangedEventArgs e) { switch (e.Key.ToLowerInvariant()) case "fdiffadjusttype": case "fexpuniontype": SetEnableAndValue(); break; default: } base.DataChanged(e);
60
如何开发插件 – 代码示例 动态语言支持 IronPython 示例:
from System import StringComparison def DataChanged(e): if e.Field.Key.Equals("FIsTrans", StringComparison.OrdinalIgnoreCase): # isTrans = clr.Reference[bool]() isTrans = e.NewValue if isTrans == False : this.View.Model.SetValue("FPriority", 0)
61
如何开发插件 – 代码示例 服务插件 OnPreparePropertys PreparePropertysEventArgs 示例:
public override void OnPreparePropertys(PreparePropertysEventArgs e) { e.FieldKeys.Add("FAccountSystemEntry"); e.FieldKeys.Add("FMAINORGID"); e.FieldKeys.Add("FAPPACCTPOLICY"); e.FieldKeys.Add("FDefAcctPolicy"); base.OnPreparePropertys(e); }
62
如何开发插件 – 代码示例 服务插件 OnAddValidators AddValidatorsEventArgs 示例:
public override void OnAddValidators(AddValidatorsEventArgs e) { SaveValidator saveValid = new SaveValidator(); saveValid.EntityKey = "FBillHead"; e.Validators.Add(saveValid); SaveAfterAuditValidator saveAcctSysValid = new SaveAfterAuditValidator(); saveAcctSysValid.option = this.Option; saveAcctSysValid.EntityKey = "FBillHead"; e.Validators.Add(saveAcctSysValid); }
63
如何开发插件 – 代码示例 private class SaveValidator : AbstractValidator {
public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx) foreach (var acct in dataEntities) AccountSystem dEntity = (AccountSystem)acct.DataEntity; if (dEntity == null) continue; foreach (var acctSys in dEntity.AccountSystemEntrys) if (acctSys == null || acctSys.MainOrgId <= 0) continue; if (!acctSys.AccountSystemDetails.Any(p => p != null && p.SubOrgId > 0)) ValidationErrorInfo errorInfo = new ValidationErrorInfo("", dEntity.Id.ToString(), acct.DataEntityIndex, acct.DataEntityIndex, "BD", string.Format("核算组织【{0}】的下级组织不允许为空。", acctSys.MainOrgName.ToString()), string.Format("{0}【{1}】", dEntity.Name.ToString(), dEntity.Number)); validateContext.AddError(null, errorInfo); }
64
如何开发插件 – 代码示例 表单构建插件 CreateControl事件 CreateControlEventArgs 示例:
public override void CreateControl(CreateControlEventArgs e) { if (e.ControlAppearance.Key.EqualsIgnoreCase("FORGID")) if (this.Context.IsMultiOrg == false) e.Control.Put("visible", 0); } base.CreateControl(e);
65
如何开发插件 – 接口结构 表单插件
66
业务插件 叙事簿插件
67
目录 概述 业务插件概览 如何开发插件 案例演练
68
案例演练 业务插件开发 建立部门基础资料 增加部门全名(带上级部门前缀,以点分隔) 部门隶属关系变化后需要修改部门全名前缀 建立员工基础资料
增加禁用状态,不能在界面上用复制功能复制禁用员工
Similar presentations