服务插件如何抛出交互信息
来源:互联网 发布:pdf文件修改软件 编辑:程序博客网 时间:2024/06/15 23:37
需求背景:
服务插件中,需要弹出消息界面,供用户确认是否继续,或者录入数据后继续;
因为这样的信息,需要用户确认,称之为交互信息。
简单一点的交互信息,由平台标准消息显示界面显示,包括了提示内容,是、否两个按钮:如果选择是,则继续操作;
复杂一点的交互信息,可以由二开自行定制消息显示界面,显示非常复杂的信息,并要求用户录入内容后继续:如录入密码进行二次验权等。
本帖的示例代码,在一个操作中,依次弹出这两种交互信息。
案例说明:
本案例,需要一个单据A、一个动态表单B:
在单据A的保存操作上,挂上示例代码中的操作插件:
用于制造交互信息;单据上有什么字段不做要求;
动态表单B,挂上示例代码中的界面插件:
用于显示定制消息,上面放两个标签控件,两个按钮;其他不做要求;
运行效果:
1. 新建单据A,保存;
2. 弹出第一条交互信息:用K/3 Cloud标准的消息显示界面显示;
3. 点击"是",确认继续;
4. 弹出第二条交互信息:用自定义的消息显示界面;
5. 点击“继续”,继续保存;
6. 保存完毕,给出操作成功提示;
图一:标准交互消息显示界面
图二:定制交互消息显示界面
需掌握的技术难点:
1. 如何显示标准的交互信息?
2. 如何显示定制的交互信息?
3. 一个操作需要显示两条交互信息,即需要多次重新执行操作,如何避免重复显示?
4. 如何把定制消息输出到定制界面,并接收定制界面传回的用户录入结果?
服务插件中,需要弹出消息界面,供用户确认是否继续,或者录入数据后继续;
因为这样的信息,需要用户确认,称之为交互信息。
简单一点的交互信息,由平台标准消息显示界面显示,包括了提示内容,是、否两个按钮:如果选择是,则继续操作;
复杂一点的交互信息,可以由二开自行定制消息显示界面,显示非常复杂的信息,并要求用户录入内容后继续:如录入密码进行二次验权等。
本帖的示例代码,在一个操作中,依次弹出这两种交互信息。
案例说明:
本案例,需要一个单据A、一个动态表单B:
在单据A的保存操作上,挂上示例代码中的操作插件:
用于制造交互信息;单据上有什么字段不做要求;
动态表单B,挂上示例代码中的界面插件:
用于显示定制消息,上面放两个标签控件,两个按钮;其他不做要求;
运行效果:
1. 新建单据A,保存;
2. 弹出第一条交互信息:用K/3 Cloud标准的消息显示界面显示;
3. 点击"是",确认继续;
4. 弹出第二条交互信息:用自定义的消息显示界面;
5. 点击“继续”,继续保存;
6. 保存完毕,给出操作成功提示;
图一:标准交互消息显示界面
图二:定制交互消息显示界面
需掌握的技术难点:
1. 如何显示标准的交互信息?
2. 如何显示定制的交互信息?
3. 一个操作需要显示两条交互信息,即需要多次重新执行操作,如何避免重复显示?
4. 如何把定制消息输出到定制界面,并接收定制界面传回的用户录入结果?
示例代码(本地验证通过)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel;using Kingdee.BOS;using Kingdee.BOS.Util;using Kingdee.BOS.Core;using Kingdee.BOS.Core.DynamicForm;using Kingdee.BOS.Core.DynamicForm.PlugIn;using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;using Kingdee.BOS.Core.Interaction;namespace JDSample.ServicePlugIn.Operation{ [Description("如何显示交互信息:操作插件,给出交互信息内容")] public class S160425ShowInteractionOpPlug : AbstractOperationServicePlugIn { /// <summary> /// 操作事务开始事件 /// </summary> /// <param name="e"></param> /// <remarks> /// 只有BeginOperationTransaction、EndOperationTransaction这两个事件,才能够按照本示例代码弹出交互信息 /// </remarks> public override void BeginOperationTransaction(BeginOperationTransactionArgs e) { // 利用K3标准消息显示界面,显示交互消息 this.ShowK3DisplayMessage(); // 利用自定义消息显示界面,显示交互消息 this.ShowCustomMsgForm(); } /// <summary> /// 利用K/3 Cloud标准的交互消息界面,显示消息:通常用于给用户选择是、否 /// </summary> /// <remarks> /// 本案例,向用户提示负库存,如果用户选择是,则继续操作;否则中断操作 /// </remarks> private void ShowK3DisplayMessage() { // 判断操作校验是否通过 : 如果通过了校验,则不用给出提示 if (this.OperationCheck1()) { return; } // 定义交互消息标识,以与其他交互消息区分开 string spensorKey = "JDSample.ServicePlugIn.Operation.S160425ShowInteractionOpPlug.ShowK3DisplayMessage"; // 判断用户是否已经确认过本交互信息 if (this.Option.HasInteractionFlag(spensorKey)) { // this.Option.HasInteractionFlag()在如下两种情况下,返回true: // 1. 用户已经确认过本交互信息,并选择了继续 // 2. 外围代码,在调用本操作前,通过如下代码,强制要求不显示交互消息: // this.Option.SetIgnoreInteractionFlag(true); // 因此,如果 this.Option.HasInteractionFlag() == true, 表示需要忽略本交互 return; } // 提示信息的列标题,以“~|~”分开两列 string titleMsg = "行号~|~物料编码~|~物料名称~|~单据数量~|~序列号数量~|~错误消息"; // 对应的提示信息格式,以"~|~"分开两列,以{n}进行占位 string errMsg = "{0}~|~{1}~|~{2}~|~{3}~|~{4}~|~{5}"; // 构建消息模型K3DisplayerModel,在此对象中,添加消息内容 K3DisplayerModel model = K3DisplayerModel.Create(Context, titleMsg); // 消息内容:可以添加多行 string rowMsg = string.Format(errMsg, "1", "1.01.001", "50KW柴油机", "10 Pcs", "10 Pcs", "库存不够,继续操作,会引起负库存,是否继续?"); ((K3DisplayerModel)model).AddMessage(rowMsg); // 消息抬头 model.Option.SetVariableValue(K3DisplayerModel.CST_FormTitle, "有多条信息需要您确认,是否继续?"); // 是否继续按钮 model.OKButton.Visible = true; model.OKButton.Caption = new LocaleValue("是", Context.UserLocale.LCID); model.CancelButton.Visible = true; model.CancelButton.Caption = new LocaleValue("否", Context.UserLocale.LCID); // 创建一个交互提示错误对象KDInteractionException: // 通过throw new KDInteractionException()的方式,向操作调用者,输出交互信息 KDInteractionException ie = new KDInteractionException(this.Option, spensorKey); // 提示信息显示界面 ie.InteractionContext.InteractionFormId = FormIdConst.BOS_K3Displayer; // 提示内容 ie.InteractionContext.K3DisplayerModel = model; // 是否需要交互 ie.InteractionContext.IsInteractive = true; // 抛出错误,终止流程 throw ie; } /// <summary> /// 利用自定义消息显示界面,显示交互消息:通常用于给用户输入数值、密码等 /// </summary> /// <remarks> /// 这种消息显示模式,需要自定义界面显示消息; /// 自定义消息界面插件示例代码为S160425ShowInteractionEdit /// </remarks> private void ShowCustomMsgForm() { // 定义交互消息标识,以与其他交互消息区分开 string spensorKey = "JDSample.ServicePlugIn.Operation.S160425ShowInteractionOpPlug.ShowCustomMsgForm"; // 判断用户是否已经确认过本交互信息 if (this.Option.HasInteractionFlag(spensorKey)) { // this.Option.HasInteractionFlag()在如下两种情况下,返回true: // 1. 用户已经确认过本交互信息,并选择了继续 // 2. 外围代码,在调用本操作前,通过如下代码,强制要求不显示交互消息: // this.Option.SetIgnoreInteractionFlag(true); // 因此,如果 this.Option.HasInteractionFlag() == true, 表示需要忽略本交互 return; } // 如果已经交互过,获取交互时用户录入的数据:如果没有交互过,获得的结果为null RespondDataContext respondData = this.Option.GetInteractionFlag(spensorKey); var interactionFormResult = respondData.FormResult; // 判断操作校验是否通过 : 如果通过了校验,则不用给出提示 if (this.OperationCheck2(interactionFormResult)) { return; } // 自定义任意的消息模型,以传递消息内容; // 本演示代码,仅供参考:现场可以自行创建各种对象向外传递 dynamic customMessageModel = new System.Dynamic.ExpandoObject(); customMessageModel.MessageTitle = "属性1的值(仅供演示)"; customMessageModel.MessageContent = "属性2的值(仅供演示)"; // 创建自定义消息界面ShowParameter参数 : 把自定义消息数据,附加到参数中 DynamicFormShowParameter showParameter = new DynamicFormShowParameter(); showParameter.CustomComplexParams.Add("CustomMessageModel", customMessageModel); // 创建一个交互提示错误对象KDInteractionException: // 通过throw new KDInteractionException()的方式,向操作调用者,输出交互信息 KDInteractionException ie = new KDInteractionException(this.Option, spensorKey); // 提示信息显示界面 :自定义消息界面FormId ie.InteractionContext.InteractionFormId = "ec1e91f227f443ff869b48a5de6f1db4"; // 自定义消息界面ShowParameter参数 ie.InteractionContext.FormShowParameter = showParameter; // 是否需要交互 ie.InteractionContext.IsInteractive = true; // 抛出错误,终止流程 throw ie; } /// <summary> /// 操作校验:如果校验不通过,则需要给出交互提示。 /// </summary> /// <returns></returns> /// <remarks> /// 本案例,强制返回校验不通过,以演示交互信息显示效果 /// </remarks> private bool OperationCheck1() { return false; } /// <summary> /// 操作校验:如果校验不通过,则需要给出交互提示。 /// </summary> /// <param name="interactionFormResult">用户在交互界面上录入的内容</param> /// <returns></returns> /// <remarks> /// 本案例,强制返回校验不通过,以演示交互信息显示效果 /// </remarks> private bool OperationCheck2(InteractionFormResult interactionFormResult) { if (interactionFormResult == null) { return false; } else { // TODO: 进一步判断用户录入的内容是否合法 // 示例代码略过判断,直接返回true return true; } } } /// <summary> /// 消息界面插件 /// </summary> /// <remarks> /// 界面上,包括两个标签,显示消息标题与正文; /// 两个按钮:继续,取消 /// </remarks> [Description("如何显示交互信息:定制消息界面插件,显示出交互信息内容")] public class S160425ShowInteractionEdit : AbstractDynamicFormPlugIn { private dynamic _customMessageModel; /// <summary> /// 接收操作给出的自定义消息对象 /// </summary> /// <param name="e"></param> public override void OnInitialize(InitializeEventArgs e) { // 取到操作插件传出的自定义消息对象:后面需要把消息对象中的内容,显示到界面上 this._customMessageModel = e.Paramter.GetCustomParameter("CustomMessageModel"); } /// <summary> /// 在界面上显示消息内容 /// </summary> /// <param name="e"></param> public override void AfterBindData(EventArgs e) { if (this._customMessageModel != null) { this.View.GetControl("F_JD_MessageTitle").Text = this._customMessageModel.MessageTitle; this.View.GetControl("F_JD_MessageContent").Text = this._customMessageModel.MessageContent; } } /// <summary> /// 用户选择完毕,系统继续 /// </summary> /// <param name="e"></param> public override void ButtonClick(ButtonClickEventArgs e) { if (e.Key.EqualsIgnoreCase("F_JD_Yes")) {// 用户选择了继续 // 是否继续 bool redo = true; // 在此执行操作时,需要传递给服务端插件的内容,如用户选择的选项,录入的数值等: // 服务端插件,需要据此进行后续处理 dynamic redoParameter = new System.Dynamic.ExpandoObject(); redoParameter.Field1 = "用户录入的值(仅供演示)"; // 把需要传递给服务操作插件的数据,包在InteractionFormResult对象中,返回给父界面 this.View.ReturnToParentWindow(new InteractionFormResult(redo, redoParameter)); // 关闭消息显示界面 this.View.Close(); } else if (e.Key.EqualsIgnoreCase("F_JD_No")) { // 不需继续,直接关闭界面即可 this.View.Close(); } } }}
0 0
- 服务插件如何抛出交互信息
- 纳税服务系统【信息发布管理、Ueditor、异步信息交互】
- 如何在 Internet 信息服务中为所有与您的网站交互的用户启用 SSL
- service 如何抛出ANR
- 如何抛出问题
- 如何自己抛出异常
- 如何抛出异常
- JAVA如何抛出异常
- 如何打开IIS信息服务管理器
- 教你如何安装 Internet 信息服务
- Windows服务启动时,如何与UI进行交互
- 在与WCF服务交互过程中传递用户信息等附加信息
- 如何在serviceImpl抛出异常
- JDBC连接MySQL抛出异常信息乱码
- 获取线程中抛出的异常信息
- Ajax获取接口抛出的异常信息
- 数据库数据表交互信息
- FS信息交互
- c语言学习之数组指针
- 通过打"patch"简单升级Android Studio
- POJ 3090 Visible Lattice Points
- OC 单例设计
- c++第四次实验
- 服务插件如何抛出交互信息
- Windows API一日一练(一)第一个应用程序 使用应用程序句柄 使用命令行参数 MessageBox函数 RegisterClass和RegisterClassEx函数
- 数据融合(data fusion)原理与方法
- JFinal的简单原理
- BindService详解
- php Warning: Module 'modulename' already loaded in Unknown on line 0
- 最近的两个小项目,1:在Vscode里写C/C++
- 文件上传异步
- Yii2 常用配置和概念小记