K/3 Cloud 技术开发培训 ----BOS 业务插件开发

Slides:



Advertisements
Similar presentations
单元二:面向对象程序设计 任务二:借书卡程序设计.
Advertisements

3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
第 4 章 PHP 基本語法.
学生教育办介绍 2015年9月.
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
C#程序设计案例教程 第3章 程 序 结 构.
速收简历 速收简历移动APP项目 速收简历团队.
MVC Servlet与MVC设计模式.
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
第 5 章 流程控制 (一): 條件分支.
第二章 JAVA语言基础.
第一部分 系统概述 第二部分 技术背景 目录 第三部分 维修流程描述 成功案例 第四部分. 第一部分 系统概述 第二部分 技术背景 目录 第三部分 维修流程描述 成功案例 第四部分.
臺北市特殊教育校園融合 聽覺障礙篇 臺北市政府教育局 發行 臺北市立中山女子高級中學 彙編.
類別與物件 Class & Object.
選擇 運算式 邏輯運算 if指令 流程圖基本觀念 程式註解 巢狀if指令 switch指令.
第三章 控制结构.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Ch07 PHP程式基礎 網頁程式設計.
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第二章 C# 基础知识.
C++Primer 3rd edition 中文版 Chap 5
第10章 App微信分享的实现 倚动实验室.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
本單元介紹何謂變數,及說明變數的宣告方式。
程式設計實作.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Android + Service 建國科技大學 資管系 饒瑞佶.
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
PHP 程式流程控制結構.
软件建模与UML.
C#面向对象程序设计 $7 继承和多态性.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
K/3 Cloud V6.0_产品培训 —BOS万能报表平台
視窗程式設計 (Windows Programming)
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
K/3 Cloud V1.0技术开发培训 ----BOS 业务插件开发
Java程序设计 第2章 基本数据类型及操作.
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
臺北市特殊教育校園融合 聽覺障礙篇 臺北市政府教育局 發行 臺北市立中山女子高級中學 彙編.
第11章 系统结构与包模型模型.
第三章 C# 基础知识.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
软件测试 (四)静态测试与动态测试.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
第二章Java基本程序设计.
K/3 Cloud V5.0_产品培训 —BOS套打设计平台
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
101年度經費結報說明 會計室 黃玉露.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
C#快速導讀 流程控制.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Presentation transcript:

K/3 Cloud 技术开发培训 ----BOS 业务插件开发 注:云图标可根据标题长度适度调整移动,以标题右上角,与标题上、右均等距离7个像素为标准。

课程说明: 课程简介: 本课程介绍K/3 Cloud BOS 业务插件的开发及配置,以功能讲解辅之案例演练帮助学员快速掌握K/3 Cloud BOS平台的核心功能。

目录 概述 业务插件概览 如何开发插件 案例演练

目录 概述 业务插件概览 如何开发插件 案例演练

K/3 Cloud 分层架构图 Http Http 展示层 服务层 动 态 表 单 元 数 内核层 据 扩展逻辑层 Silverlight Web客户端 WPF 桌面客户端 Office客户端 移动客户端 客户端公共编程模型+客户端插件+第三方设备集成接口 Http Http 服务层 动 态 表 单 元 数 据 Web 服 务 器 动态表单UI生成服务 动态表单控制服务 业务服务 内核层 表单动态生成引擎 动态表单控制器 动态表单视图模型 动态表单数据模型 动态表单编程接口 扩展逻辑层 表单生成插件 表单逻辑服务 表单操作 缺省值计算函数 业务插件 应用服务 器 动态表单逻辑组件 动态表单服务端编程接口 动态表单服务端插件 校验规则 数据库服务器 元数据 业务数据

目录 概述 业务插件概览 如何开发插件 案例演练

BOS业务插件开发概览 BOS业务插件用以解决什么问题? 有哪些插件? 标准业务对象的的业务逻辑应用: 客户二次开发的需求; Web层 标准业务对象没有实现的控制; 已有操作和服务未支持的功能; 更灵活的控制方式和客户化定制; 客户二次开发的需求; 快速开发、快速实施、快速应用; 可配置,可测试,快速部署; 有哪些插件? Web层 表单插件 列表插件 表单构建插件 App层 服务插件 什么时候用插件:实体服务规则/值更新事件/配置服务无法满足需要时,才采用插件二次开发

BOS业务插件开发概览 插件接口特性 支持插件顺序 支持动态语言 使用C# 4.0 支持继承和扩展 已封装业务插件; 组织控制; 基础资料分配 ……… 支持插件顺序 支持动态语言 IronPython 2.6.1

BOS业务插件开发概览—插件分类 表单插件 用于单个表单编辑界面 运行于Web层 列表插件 用于列表

BOS业务插件开发概览 – 插件分类 服务插件 插件配置入口 操作列表 – 编辑操作 挂在操作上的服务插件,对于操作进行扩展 和校验器配合使用 运行于App层 插件配置入口 操作列表 – 编辑操作

BOS业务插件开发概览 – 插件分类 表单构建插件 对于表单界面进行自定义的插件 运行于Web层 自定义菜单、控件

BOS业务插件开发概览 动态表单元数据结构

BOS业务插件开发概览 动态表单元数据结构

目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练

目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练

如何开发插件 – 接口结构 表单插件和列表插件 继承层次 表单 单据 单据列表 基础资料 插件针对对象 动态表单

如何开发插件 – 接口结构 AbstractBillPlugIn 接口 动态表单视图插件编程模型接口 定义了视图模型扩展 允许通过接口处理视图,实现特定业务需求

AbstractBillPlugIn的ViewPlugin插件接口 如何开发插件 – 接口结构 AbstractBillPlugIn的ViewPlugin插件接口 OnBillInitialize 视图模型初始化事件 AfterBindData 绑定数据后事件处理接口 BeforeF7Select 基础资料弹出前事件 BeforeClosed 窗口关闭前事件

AbstractBillPlugIn的ViewPlugin插件接口 如何开发插件 – 接口结构 AbstractBillPlugIn的ViewPlugin插件接口 BarItemClick 菜单单击事件处理扩展接口 AfterBarItemClick 菜单单击事件后 BeforeDoOperation 操作调用前事件 AfterDoOperation 操作调用完成后事件 ButtonClick 按钮单击事件 AfterButtonClick 按钮单击后事件

AbstractBillPlugIn的ViewPlugin插件接口 如何开发插件 – 接口结构 AbstractBillPlugIn的ViewPlugin插件接口 ListViewClick 列表项目单击事件 TreeNodeClick 树控件单击事件 TreeDragDrop 树控件拖拽 EntityRowClick 分录行单击事件

AbstractBillPlugIn的ModelPlugIn接口 如何开发插件 – 接口结构 AbstractBillPlugIn的ModelPlugIn接口 动态表单数据模型插件编程接口 定义了数据模型扩展 允许通过接口处理数据,以实现特定业务需求

AbstractBillPlugIn插件方法 如何开发插件 – 接口结构 AbstractBillPlugIn插件方法 CreateNewData 数据模型创建实体对象事件 AfterCreateNewData 数据模型创建实体对象完成后事件 BeforeUpdateValue 数据更新前事件 DataChanged 数据改变后事件

AbstractBillPlugIn插件方法 如何开发插件 – 接口结构 AbstractBillPlugIn插件方法 CreateNewEntryRow 创建分录行事件 BeforeDeleteRow 删除分录行事件 AfterDeleteRow 删除分录后事件

如何开发插件 – 接口结构 列表插件接口 继承AbstractListPlugIn IListViewPlugIn IListModelPlugIn

AbstractListPlugIn 的ViewPlugIn接口 如何开发插件 – 接口结构 AbstractListPlugIn 的ViewPlugIn接口 序时簿视图插件编程模型接口 定义了序时簿视图模型扩展 允许通过接口处理视图,实现特定业务需求

AbstractListPlugIn 的ViewPlugIn接口 如何开发插件 – 接口结构 AbstractListPlugIn 的ViewPlugIn接口 ListInitialize 视图模型初始化事件 AfterGetData 完成取数后事件 FormatCellValue 列表格式化接口

AbstractListPlugIn 的ViewPlugIn接口 如何开发插件 – 接口结构 AbstractListPlugIn 的ViewPlugIn接口 BeforeButtonClick 按钮和菜单单击前事件 AfterButtonClick 按钮和菜单单击后事件 CellDbButtonClick 单元格双击事件

AbstractListPlugIn 的ModelPlugIn接口 如何开发插件 – 接口结构 AbstractListPlugIn 的ModelPlugIn接口 序时簿数据模型插件编程接口 定义了序时簿数据模型扩展 允许通过接口处理数据,以实现特定业务需求

AbstractListPlugIn插件方法 如何开发插件 – 接口结构 AbstractListPlugIn插件方法 PrepareFilterParameter 准备过滤条件 CreateFilterEditorControl 触发创建过滤条件控件事件 BatchCopyData 复制单据事件 AfterBatchCopyData 复制单据完毕事件

如何开发插件 – 接口结构 服务插件 插件特性 插件针对对象 IOperationServicePlugin 一般会附加校验器 运行于App层 事务保护 插件针对对象 操作

如何开发插件 – 接口结构 服务插件接口 服务插件 AbstractOperationServicePlugIn 应用服务器插件与业务数据更新操作在一个事务执行 校验器插件 AbstractValidator 在服务插件的OnAddValidators加入

AbstractOperationServicePlugIn插件方法 如何开发插件 – 接口结构 AbstractOperationServicePlugIn插件方法 OnPreparePropertys 可以定制加载指定字段到实体里 OnAddValidators 添加自定义数据校验器

AbstractOperationServicePlugIn插件方法 如何开发插件 – 接口结构 AbstractOperationServicePlugIn插件方法 BeforeExecuteOperationTransaction 执行操作事务前事件 AfterExecuteOperationTransaction 执行操作事务后事件 BeginOperationTransaction 调用操作事件前触发(支持事务) EndOperationTransaction 调用操作事件完毕(支持事务)

如何开发插件 – 接口结构 表单构建插件 继承层次 表单 单据 叙事簿 基础资料 插件针对对象 动态表单

AbstractDynamicWebFormBuilderPlugIn插件方法 如何开发插件 – 接口结构 AbstractDynamicWebFormBuilderPlugIn插件方法 CreateControl 构建界面元素事件 AfterCreateControl 构建界面元素后事件 CreateMainMenu 构建菜单事件 AfterCreateMainMenu 构建菜单后事件

如何开发插件 – 接口结构 表单插件调用过程 由控制器创建视图、模型、插件代理 初始化视图、模型 由插件服务注册到插件代理 插件代理初始化插件 加载数据,通知插件创建数据,创建表单数据包 表单操作 插件服务调用代理,发送事件通知 插件代理调用插件,执行事件 返回执行结果

业务插件 插件调用过程

业务插件 插件调用过程

如何开发插件 – 接口结构 动态语言支持 IronPython 脚本语言 支持和C#交互调用 事件接口和C#完全一致 更加简练明白

目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练

如何开发插件 – 常用对象 View对象 属性 this.View(View接口) this.View的常用属性 BillBusinessInfo(界面业务对象元数据) LayoutInfo(布局元数据) Model(动态表单模型接口) OpenParameter(页面调用时传入的参数) 方法 GetFieldEditor (获取界面控件对象) ShowMessage(显示信息)

如何开发插件 – 常用对象 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; }

如何开发插件 – 常用对象 View对象 if (e.CurParentId == "0") { 显示信息 this.View.ShowMessage 示例: if (e.CurParentId == "0") { this.View.ShowMessage(“请先选择顶层组织。”); return; }

如何开发插件 – 常用对象 Model对象 属性 this.View.Model(动态表单模型接口) DataObject 当前对象的数据实体 方法 GetEntryCurrentRowIndex(获取分录当前行索引) GetEntryRowCount(获取分录行数量) CreateNewEntryRow(新建分录行) GetValue(获取字段(对象)值) SetValue(设置字段(对象)值)

如何开发插件 – 常用对象 Model对象 获取单据属性:例如分录集合 this.View.Model.DataObject 示例: /// <summary> /// 获取分录集合 /// </summary> DynamicObjectCollection entrys = (DynamicObjectCollection)this.View.Model.DataObject["POOrderEntry"];

如何开发插件 – 常用对象 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(); }

如何开发插件 – 常用对象 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);

如何开发插件 – 常用对象 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)); break; }

目录 概述 业务插件概览 如何开发插件 接口结构 插件中常用的对象说明 具体的代码示例 案例演练

如何开发插件 – 代码示例 表单插件 OnBillInitialize初始化事件 BillInitializeEventArgs 示例: public override void OnBillInitialize(BillInitializeEventArgs e) { base.OnBillInitialize(e); msgType = this.View.OpenParameter.GetCustomParameter("MessageType"); }

如何开发插件 – 代码示例 表单插件 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); }

如何开发插件 – 代码示例 表单插件 BeforeClosed绑定数据后事件 BeforeClosedEventArgs 示例: public override void BeforeClosed(BeforeClosedEventArgs e) { ReturnData(); base.BeforeClosed(e); }

如何开发插件 – 代码示例 表单插件 BeforeF7Select BeforeF7SelectEventArgs 示例: public override void BeforeF7Select(BeforeF7SelectEventArgs e) { base.BeforeF7Select(e); bool success = true; switch (e.FieldKey) 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;

如何开发插件 – 代码示例 表单插件 ButtonClick ButtonClickEventArgs 示例: public override void ButtonClick(ButtonClickEventArgs e) { base.ButtonClick(e); switch (e.Key) case "FBtOK": this.StartDeposit(); break; default: }

如何开发插件 – 代码示例 表单插件 DataChanged DataChangedEventArgs 示例: public override void DataChanged(DataChangedEventArgs e) { switch (e.Key) case "fdiffadjusttype": case "fexpuniontype": SetEnableAndValue(); break; default: } base.DataChanged(e);

如何开发插件 – 代码示例 动态语言支持 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)

如何开发插件 – 代码示例 服务插件 OnPreparePropertys PreparePropertysEventArgs 示例: public override void OnPreparePropertys(PreparePropertysEventArgs e) { e.FieldKeys.Add("FAccountSystemEntry"); e.FieldKeys.Add("FMainOrgId"); e.FieldKeys.Add("FAcctPolicy"); e.FieldKeys.Add("FDefAcctPolicy"); base.OnPreparePropertys(e); }

如何开发插件 – 代码示例 服务插件 OnAddValidators AddValidatorsEventArgs 示例: public override void OnAddValidators(AddValidatorsEventArgs e) { SaveValidator saveValid = new SaveValidator(); saveValid.EntityKey = "FBillHead"; e.Validators.Add(saveValid); SaveAuditValidator saveAcctValid = new SaveAuditValidator(); saveAcctValid.option = this.Option; saveAcctValid.EntityKey = "FBillHead"; e.Validators.Add(saveAcctValid); }

如何开发插件 – 代码示例 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); }

如何开发插件 – 代码示例 表单构建插件 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);

如何开发插件 – 接口结构 表单插件

业务插件 列表插件

目录 概述 业务插件概览 如何开发插件 案例演练

案例演练 业务插件开发 建立部门基础资料 增加部门全名(带上级部门前缀,以点分隔) 部门隶属关系变化后需要修改部门全名前缀 建立员工基础资料 增加禁用状态,不能在界面上用复制功能复制禁用员工