U9 表达式接口范例说明 版 本 号 :V1.0 作者:鲁宁 版本记录 【此部分要记录该文档形成过程中的历次版本变更过程及变更的内容】 版本 修改与参与人 修改时间 修改原因 修改概述 审批人1.0 鲁宁 2008/06/27 原始文档建立 一.问题域说明 说明本范例的应用场景:UI 前台重载表达式接口,现在注意用于 HR 模块,由于 HR需要加载的元数据较多,通常都是多个实体的信息,同时元数据树的结构由于计算的需要比较特殊,所以需要调用 BP,自行构建元数据树。 二.基本原理 重载表达式编辑器接口方法. 三.关键代码及说明 1)在 UI 项目中添加引用 E:\View\U9Product\U9.VOB.Product.Component\UI\UFIDA.U9.Expression.Editor.Interface.dll 2) 重载表达式编辑器接口 UFIDA.U9.Expression.Editor.Interface.Expression 中的方法. public class PayExpression : UFIDA.U9.Expression.Editor.Interface.Expression { //获取表达式元数据 public override IExpressionTreeData GetMetaDataDataItem() { return new PayExpressionTreeData(this.InParm["MetaDataParam"], "HRItem"); } //表达式名称到编码的转换 public override string ConvertNameToCode(string name) { UFIDA.U9.PAY.PayExpression.Proxy.PayExpressNameToCodeBPProxy nameToCodeBP = new UFIDA.U9.PAY.PayExpression.Proxy.PayExpressNameToCodeBPProxy(); nameToCodeBP.Name = name; nameToCodeBP.InParam = this.InParm["MetaDataParam"]; return nameToCodeBP.Do(); return string.Empty; } //表达式编码到名称转换 public override string ConvertCodeToName(string code) { UFIDA.U9.PAY.PayExpression.Proxy.PayExpressCodeToNameBPProxy codeToNameBP = new UFIDA.U9.PAY.PayExpression.Proxy.PayExpressCodeToNameBPProxy(); codeToNameBP.Code = code; codeToNameBP.InParam = this.InParm["MetaDataParam"]; return codeToNameBP.Do(); } //获取表达式函数 public override IExpressionTreeData GetFunctionDataItem() { //return new PayExpressionTreeData(this.InParm["MetaDataParam"], "Func"); return base.GetFunctionDataItem(); } } public class PayExpressionTreeData : IExpressionTreeData { private string inParam; private string LoadNodeType; public PayExpressionTreeData(string inparam, string CurType) { this.InParm = inparam; this.LoadNodeType = CurType; } //按照表达式元数据树结构全部加载表达式元数据 public IList LoadAllData() { if (LoadNodeType == "HRItem") { UFIDA.U9.PAY.PayExpression.Proxy.GetPayExpressItemDataProxy GetExpressItemBP = new UFIDA.U9.PAY.PayExpression.Proxy.GetPayExpressItemDataProxy(); GetExpressItemBP.InParam = this.InParm; return GetExpressItemBP.Do(); } else if (LoadNodeType == "Func") { UFIDA.U9.PAY.PayExpression.Proxy.GetFunctionBPProxy funcBP = new UFIDA.U9.PAY.PayExpression.Proxy.GetFunctionBPProxy(); funcBP.InParam = this.inParam; return funcBP.Do(); } return null; } //为了提供加载速度,提供懒加载方式,初始加载2级元数据 public IList LoadDataOndemand(string inparam) { if (LoadNodeType == "HRItem") { UFIDA.U9.PAY.PayExpression.Proxy.GetPayExpressItemDataProxy GetExpressItemBP = new UFIDA.U9.PAY.PayExpression.Proxy.GetPayExpressItemDataProxy(); GetExpressItemBP.InParam = inparam; return GetExpressItemBP.Do(); } else if (LoadNodeType == "Func") { UFIDA.U9.PAY.PayExpression.Proxy.GetFunctionBPProxy funcBP = new UFIDA.U9.PAY.PayExpression.Proxy.GetFunctionBPProxy(); funcBP.InParam = inparam; return funcBP.Do(); } return null; } public string InParm { get { return inParam; } set { inParam = value; } } public string LoadType { get { return LoadNodeType; } set { LoadNodeType = value; } } } } 注意:为了提高表达式编辑器的加载速度, 只需要重载IExpressionTreeData 中的LoadDataOndemand方法,进行懒加载。设置完成后,需要向CBO提供重载类的名称以及dll的具体位置。 (2)表达式的使用: 在工程文件中需要引入U9.VOB.Product.UBF\UBFStudio\Runtime下的UFSoft.UBF.Util.Expression.Dll,同时为了进行计算需要为定义的表达式提供上下文数据, 具体的使用方法如下: 例如在表达式中定义了人员的性别,对应编码为Person.Sex 在上下文中指定 IEvaluationContext context = new StandardContext(); context["Person"] =Person;(Person为对象实例) 然后根据传入的上下文进行计算 Script script = new Script(Expression); val = script.Execute(context); //计算结果 script.Execute(context)执行完毕后返回对象类型的结果 四.源代码使用说明 下载:http://u9scm91/isvdoc/download/U9 研发体系(表达式范例).zip位置:E:\View\U9UICode\U9.VOB.PD.HR\Pay\Code\PayRuleUI\ PayExpression.cs 五.组装发布说明(可选)