1刘兵2020年6月金蝶云星空BOS专题中级课BOSIDE2Content010203总体介绍操作校验器函数04实体服务05二开规范及最佳实践063Content010203总体介绍操作校验器函数04实体服务05二开规范及最佳实践064BOSIDE是金蝶云星空最重要的设计工具。金蝶云星空是基于BOSIDE从无到有搭建起来的。BOSIDE整体介绍业务领域财务会计基础管理流程中心Silverlight\WPF多端展示门户仪表盘移动设备套打模板设计(新建、复制、导入)标准报表设计(新建、复制、导入)业务对象设计(新建、继承、扩展)BOS平台(元数据、动态领域模型)Office集成基础资料、单据、账表、动态表单、系统参数、弹性域、移动业务成本管理资产管理供应链生产制造人力资源…集成开发平台套打设计平台字段集、控件集属性组合发布展示集成开发平台套打设计平台万能报表平台字段集、控件集属性组合控件集、数据源属性组合控件集、区段集、数据源、属性组合基础资料、单据动态表单、账表单据类报表列表类报表SQL增强报表5动态领域模型——金蝶云星空的的核心技术。独创的动态领域模型,抽象了32种标准ERP领域模型、849种模型元素、16819种模型元素属性组合,268个业务服务构件。BOSIDE整体介绍6动态领域模型相关概念BOSIDE整体介绍动态领域建模总体上由模型库,领域模型,领域模型动态解释引擎三个部分组成动态领域模型是一个由模型-元素-属性组成的三层体系结构领域模型动态解释引擎由展示层,服务层,内核层组成7BOSIDE整体介绍业务对象间的继承与组合方式,大大简化了系统的设计每种动态领域模型由若干元素组成每种元素又有若干属性模型中包含操作,服务,规则,插件编程模型实现业务功能和逻辑控制模型元素属性①元模型示意图基本元素1基本元素2基本元素n业务对象A业务对象B继承……②模块继承示意图业务对象A基本元素1基本元素2基本元素n……业务对象B③模块组合示意图建模机制操作服务业务规则插件模型8动态领域建模设计界面BOSIDE整体介绍领域模型构件菜单字段操作控件实体服务校验器操作服务函数业务元素库业务服务构件领域模型及实例元素属性9Content010203总体介绍操作校验器函数04实体服务05二开规范及最佳实践0610操作的作用校验规则服务调用权限服务插件•可以配置内置的校验规则,如单据合法校验等,有效的减少了用户代码量•可以调用系统内置的服务端服务,减少代码的重复量,以达到复用的目的。•可直接利用现有的权限功能对当前操作设置权限,无需代码编写•开发可以对当前操作轻松的编写二开插件实现自定义的事件干预11常用的操作列表操作代码操作名称操作描述New新增打开新增业务对象数据(如单据、基础资料等)的界面Save保存保存业务数据到数据库Audit审核对选择的业务数据进行审核操作Delete删除在列表界面删除数据库中的业务数据ImportData引入通过Excel将数据导入到数据库Export按列表引出将当前列表查出的数据导出到ExcelExportData按引出模板引出数据按照设置好的引出模板把数据导出到ExcelFilter过滤可以对当前列表数据显示进行个性化的过滤设置Refresh刷新用于在列表界面重新刷新显示的业务对象数据12操作配置-审核13操作配置-共享中心打印封面14空操作应用场景•现有标准操作集合列表中没有所需的业务操作•需要对菜单的按钮设置权限•需要用到系统内置的校验器•需要调用系统的服务端服务•Web插件操作前操作后事件干预•App服务插件事务前事务中事务事件后干预15最佳实践•配置菜单中的点击事件,建议只配置一个操作,因为如果配置多个操作,不同的操作不在一个事务中,可能会导致数据不一致的问题•多个单据体配置操作时(如新增分录),需要添加多个新增分录操作,否则会导致操作不成功•涉及到数据修改和数据库相关的业务,建议优先使用操作服务插件,不要把代码写在表单插件里•涉及到业务操作合法性校验的业务,建议使用操作校验器或操作服务插件,不要把代码写在表单插件•操作之后还有后续自动业务处理,应该在操作服务插件处理,不要把代码写在表单插件•在很多单据都要使用的操作,标准产品没有提供的,可以考虑自定义扩展16Content010203总体介绍操作校验器函数04实体服务05二开规范及最佳实践0617可以在各个业务对象操作上实现快速的校验规则设置,用来保证业务操作正确和数据的合法性的装置支持二开扩展校验器18校验器列表常见校验器合法性检查,检查组合字段唯一性合法性检查,检查分录字段唯一性合法性检查,检查分录字段一致性单据合法性校验有且只能选择一条分录合法性检查,默认数据设置正则表达式验证检查当前基础资料是否被其他业务对象使用合法性检查,字段必录19选择单个或多个字段作为组合字段,检查不同单据之间组合字段值的唯一性。校验器合法性检查,检查组合字段唯一性20勾选单据体或子单据体分录下字段,检查不同分录之间字段值的唯一性。校验器合法性检查,检查分录字段唯一性21勾选单据体或子单据体分录下字段,检查不同分录之间字段值的一致性。校验器合法性检查,检查分录字段一致性22检查单据数据是否合法,根据业务规则设置检查表达式校验器单据合法性校验23检查单据数据是否合法,使用lambda表达式常见错误校验器单据合法性校验24使用filter+lambda表达式可以判断多条记录情况。单据体中的字段,公式取到的是一个集合,不能直接跟常量进行比较。用lambda表达式,对单据体行,进行循环,逐行取基础资料字段值进行比较:举例说明:len(filter(lambdax:(x.FBase.FProperty['Name'].ToString()='采购员'),FEntity))>0说明:FEntity是单据体标识,公式中取到的是行数据集合x代表单据体当前行,允许直接使用"."取字段值FBase.FProperty['Name']返回的是多语言文本对象,需要使用ToString()函数,转换成纯文本lambda表达式25前值条件判断物料是否启用了辅助属性lambda表达式26保存校验:使用lambda表达式判断物料辅助属性启用的情况下,辅助属性不能为空。lambda表达式27保存校验:使用lambda表达式判断物料启用BOM版本管理,BOM版本不能为空。lambda表达式28选择待校验的复选框字段,所在实体不同分录间有且只能有一个复选框选中时校验通过。校验器有且只能选择一条分录29勾选待校验字段,输入正则表达式,字段值满足正则表达式时校验通过。校验器正则表达式验证30为基础资料业务对象添加校验器,当该基础资料数据被其他业务对象引用时校验不通过,常用于删除和反审核操作。校验器检查当前基础资料是否被其他业务对象使用31勾选待校验的字段,检查字段必录性。校验器合法性检查,字段必录32校验器扩展继承校验器基类AbstractValidator,实现自定义的校验器服务继承校验器元模型对象基类,重写ValidatorClass属性添加预插脚本331、通用校验逻辑,能用校验器配置的用校验器,不能配置的用操作服务插件。2、插件动态设置字段必录,或者实体服务设置必录,同时需要配置校验器必录。3、有第三方集成时,校验器可根据服务类型变量作为条件,设置是否执行。最佳实践34Content010203总体介绍操作校验器函数04实体服务05二开规范及最佳实践0635应用场景:条件表达式,计算表达式等。特性:(1)基于IronPython进行解析执行,语法和Python语法保持一致。(2)表达式大小写敏感。(3)内置常用函数。(4)支持自定义函数。函数36函数类型过滤取值函数缺省值函数系统函数系统变量Python原生函数(部分支持)37应用场景:BOSIDE,设计时,给基础资料指定过滤条件。过滤取值函数-GetValue38应用场景:BOSIDE,设计时,给指定字段设置缺省值。特性:(1)界面配置,格式固定。(2)和字段类型强关联。(3)内置常用函数。(4)暂不支持二开扩展(后续可放开)。(5)不区分大小写(内部会强制转大写后解析)。缺省值函数39函数标识函数名称GetDate获取日期GetTime获取时间GetUser获取用户(或指定用户)GetOrgUnit获取组织(或指定组织)GetBaseData获取基础资料GetFieldValue获取字段值GetBillNumber获取单据编号GetBusinessFlow获取以本单为入口的业务流程版本常用缺省值函数列表40函数标识:GETFIELDVALUE函数名称:获取指定字段值功能说明:获取父分录下的指定字段的值使用范围:分录和子分录字段使用示例:GetFieldValue(FDeliveryDate)缺省值函数41函数标识:GETUSER函数名称:获取用户功能说明:获取当前用户使用范围:用户字段使用示例:GetUser(@CurrentUser)缺省值函数42函数标识:GETORGUNIT函数名称:获取组织功能说明:获取当前组织使用范围:组织字段使用示例:GetOrgUnit(@CurrentOrgUnit)缺省值函数43函数标识:GETBASEDATA函数名称:获取基础资料功能说明:获取基础资料使用范围:基础资料字段使用示例GetBaseData("KCZT02_SYS"):缺省值函数44函数标识:GETDATE函数名称:获取当前日期功能说明:获取当前日期使用范围:日期字段使用示例:GetDate(yyyy-MM-dd,@CurrentDate)缺省值函数45函数标识:GETTIME函数名称:获取当前时间功能说明:获取当前时间使用范围:时间字段使用示例:GetTime(@CurrentTime)缺省值函数46函数标识:GETBUSINESSFLOW函数名称:获取当前单据的默认业务流程功能说明:获取当前单据的默认业务流程使用范围:业务流程字段使用示例:GetBusinessFlow(null)缺省值函数47应用场景:BOSIDE,设计时,表达式中使用。特性:(1)界面配置,格式固定。(2)和表达式语义强关联。(3)内置常用函数。(4)暂不支持二开扩展(后续可放开)。(5)不区分大小写(内部会强制转小写后解析)。系统变量48函数标识函数名称使用说明currentlongdate获取长日期系统时间(DateTime.Now)FCreateDate=@currentlongdatecurrentshortdate获取长日期系统时间(DateTime.TodayFCreateDate=@currentshortdatemaxdate获取长日期系统时间(DateTime.MaxValue)FCreateDate=@maxdatemindate获取长日期系统时间(DateTime.MinValue)FCreateDate=@mindateuserid获取当前用户(Context.UserId)FCreatorId=@userid系统变量列表49函数标识函数名称使用说明currentorgid获取当前组织(Context.CurrentOrganizationInfo.ID)FOrgId=@currentorgidservicetype获取当前服务端类型(Context.ServiceType[WebSite,WebService])一般用于条件判断,例如@servicetype=0ismultiorg获取是否启用了多组织特性(Context.IsMultiOrg)Fxx=@ismultiorgnull返回nullFxx=nullctx返回当前上下文FCreatorId=@ctx.UserId系统变量列表50应用场景:BOSIDE,设计时,表达式中使用。特性:(1)界面配置,格式固定,使用Python语法。(2)和表达式语义强关联。(3)内置常用函数。(4)支持二开扩展。(5)区分大小写。(6)基于IronPython进行解析执行。。表达式函数51函数标识函数名称ISFLOATUNITCONVERT判断是否单位浮动换算BILLTYPEPARAMNEW获取单据类型参数SYSPARAM获取系统参数sum汇总函数AVG平均值函数COUNT计数函数ISPUSH是否已关联(是否已下推)ISDRAW是否关联生成(是否是下推而来)常用表达式函数52函数标识函数名称HasWorkflowInst是否存在流程实例HasUnCompleteWorkflowInst是否存在未完成的流程实例OPERATIONSTATUS获取当前操作状态(查看,新增,编辑)GETACRONYM获取中文首字母GETCONVERTTYPE获取单位换算关系类型ISMRPRUNNING是否正在执行MRP运算max最大值函数min最小值函数常用表达式函数53函数标识:BILLTYPEPARAMNEW函数名称:获取单据类型参数功能说明:获取单据类型参数参数说明:billTypeFieldKey:单据类型字段标识PropertyName:参数字段的属性名paramFormId:单据参数表单的标识使用示例:获取采购订单的单据类型参数【允许修改交货数量】F_KKK_Text1=BILLTYPEPARAMNEW('FBillTypeID','ControlDeliveryRate','PUR_OrderParam')表达式函数54函数标识:SYSPARAM函数名称:获取系统参数功能说明:获取系统参数参数说明:orgFieldKey:主组织字段acctBookFieldKey:账簿字段parameterObjId:参数对象唯一标识parameterName:参数属性名使用示例:获取库存管理的系统参数【库存更新方式】F_KKK_Text1=SYSPARAM('','','STK_StockParameter','UpdateStockPoint')表达式函数55函数扩展继承函数基类AbstractFuncDefine,实现自定义的函数服务添加预插脚本56Content010203总体介绍操作校验器函数04实体服务05二开规范及最佳实践0657实体服务是什么实体对象上配置的服务实体数据发生变化时要做的事情58实体服务规则列表实体服务规则主要使用服务:•计算定义的公式值到指定列•锁定/解锁字段、按钮和菜单等•隐藏/显示字段、按钮和菜单等•业务相关的服务(销售价格折扣等)59实体服务规则-配置规则条件:根据实际应用场景设置条件,用于执行下方的服务条件为真执行的服务可以选择BOS预置服务支持多个服务条件为假执行的服务60实体服务规则-触发时机实体服务规则主要触发时机:值更新、加载、新增、行选择61实体服务规则-支持禁用实体服务规则支持引入和WebAPI禁用62实体服务规则与值更新实体服务规则支持值更新、加载和新增等触发时机;值更新事件仅支持值更新触发值更新和实体服务共有一些服务,但有各自特有的服务;值更新可以携带基础资料属性值到指定列值更新可进行国际化税率等特定服务配置值更新可以做调用指定字段的值更新服务等63判断单据是否下推生成判断源单来源实体服务规则实践-是否下推64获取基础资料数据,获取基础资料的属性数据,需要先添加引用实体服务规则实践-计算服务65使用lambda表达式判断存在销售订单时,锁定往来单位类型、结算币别、结算组织、收款组织等信息。实体服务规则实践-lambda表达式前置条件66计算日期差:(F_JD_Date1-F_JD_Date2).Days增加天数:FDate1.AddDays(1)增加月份:FDate1.AddMonths(1)增加年份:FDate1.AddYears(1)当前日期+10天:@currentshortdate.AddDays(10)将一个日期字段设置为当前日期每个月的第一天:F_PAEZ_Datetime=str(@currentshortdate.Year)+'-'+str(@currentshortdate.Month)+'-01'实体服务规则实践-日期处理67必须与true,false比较,不能与0,1比较示例:FCheckBox1=trueandFCheckBox2=false实体服务规则实践-复选框处理68下拉列表字段,存储的是枚举项,显示的是枚举名称,公式中,需要与枚举项进行比较示例:FCombo1绑定的枚举类型为价格类型,有两个枚举项('1':到岸价;'2':出厂价)FCombo1='1'实体服务规则实践-下拉框处理69实体服务规则常见问题实体服务规则选择的服务不支持跨实体配置公式中使用基础资料的属性,需要先在基础资料的引用中添加才可以使用操作后刷新字段后续不再触发值更新和实体服务规则70实体服务规则常见问题当实体服务和值更新配置成A和B相互更新时,可能引发死循环,导致系统挂起F_ff_Integer1F_ff_Text1F_ff_Integer271实体服务规则常见问题数据发生变化后有关联影响的服务应该放到一个实体服务集合中,一个判断条件72实体服务规则常见问题•实体服务规则选择的服务不支持跨实体(如单据体实体服务规则锁定单据头字段)73实体服务规则常见问题•配置公式中使用基础资料字段,需要在基础资料的引用中添加才可以使用74Content010203总体介绍操作校验器函数04实体服务05二开规范及最佳实践0675二开规范及最佳实践单据或基础资料对象唯一标识以字母开头,不要以数字开头,否则在某些表达式计算应用上可能会出错单据元数据对象表和元数据多语言表的FID字段大小写敏感,代码中使用的FormId要和元数据定义的大小写保持一致76二开规范及最佳实践所有元素标识、字段名、属性等增加开发商唯一标识信息,防止和标准产品冲突常用查询字段维护索引77二开规范及最佳实践新建单据或基础资料模型时,实体表名最好先确定,因为一旦业务发生,表名不能再做修改,否则会涉及到数据同步和数据修复78二开规范及最佳实践新建单据或基础资料模型时,文本或多语言字段的编辑长度最好事先考虑,因为一旦保存后,再调整长度需要分别调整元数据和数据库字段长度79二开规范及最佳实践如果有国际化业务,新增加日期类型字段时建议使用长日期80二开规范及最佳实践如果枚举类型只在本单据使用,或者有可能被客户修改,则建议使用私有下拉列表,不建议用下拉列表81二开规范及最佳实践新建单据和基础资料都建议继承BOS基类模板,否则有些特性需要而外配置82二开规范及最佳实践新建的单据和基础资料建议配置网控,否则并发容易导致数据错误83二开规范及最佳实践添加实体对象尽量少用复制,有些设置复制后是需要修改的,容易引发错误84二开规范及最佳实践修改模型,不要每次修改都去扩展,尽量减少扩展85二开规范及最佳实践单据或基础资料在保存后建议使用右键检查元数据86Thanksterimakasih感謝谢谢ありがとうขอบคุณ