服务插件如何抛出交互信息

来源:互联网 发布:pdf文件修改软件 编辑:程序博客网 时间:2024/06/15 23:37
需求背景:

服务插件中,需要弹出消息界面,供用户确认是否继续,或者录入数据后继续;
因为这样的信息,需要用户确认,称之为交互信息。

简单一点的交互信息,由平台标准消息显示界面显示,包括了提示内容,是、否两个按钮:如果选择是,则继续操作;
复杂一点的交互信息,可以由二开自行定制消息显示界面,显示非常复杂的信息,并要求用户录入内容后继续:如录入密码进行二次验权等。

本帖的示例代码,在一个操作中,依次弹出这两种交互信息。

案例说明:

本案例,需要一个单据A、一个动态表单B:

在单据A的保存操作上,挂上示例代码中的操作插件:
用于制造交互信息;单据上有什么字段不做要求;

动态表单B,挂上示例代码中的界面插件:
用于显示定制消息,上面放两个标签控件,两个按钮;其他不做要求;

运行效果:

1. 新建单据A,保存;
2. 弹出第一条交互信息:用K/3 Cloud标准的消息显示界面显示;
3. 点击"是",确认继续;
4. 弹出第二条交互信息:用自定义的消息显示界面;
5. 点击“继续”,继续保存;
6. 保存完毕,给出操作成功提示;

图一:标准交互消息显示界面
20160426 00交互信息1.png 


图二:定制交互消息显示界面
20160426 00交互信息2.png 


需掌握的技术难点:
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
原创粉丝点击