二开案例.服务插件.校验器使用内置交互界面显示自定义数据源

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.服务插件.校验器使用内置交互界面显示自定义数据源

【应用场景】操作执行前需要对单据合法性进行校验,校验不通过时,使用内置交互界面显示自定义数据源,将校验结果显示给操作用户进行决策,是否把操作继续进行下去。

【案例演示】采购订单,点击保存时,判断采购总金额是否超额,超额时弹出自定义交互界面。

【实现步骤】

<1>编写服务插件,代码如下。

using Kingdee.BOS;

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.Interaction;

using Kingdee.BOS.Core.Validation;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Util;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Linq;


namespace Jac.XkDemo.BOS.App.PlugIn

{

    /// <summary>

    /// 【服务插件】校验器使用内置交互界面显示自定义数据源

    /// </summary>

    [Description("【服务插件】校验器使用内置交互界面显示自定义数据源"), HotUpdate]

    public class ShowInteractionFormUseK3DisplayerServicePlugIn : AbstractOperationServicePlugIn

    {

        /// <summary>

        /// 添加校验器

        /// </summary>

        /// <param name="e"></param>

        public override void OnAddValidators(AddValidatorsEventArgs e)

        {

            base.OnAddValidators(e);

            // 添加校验器

            e.Validators.Add(new PurchaseOrderCheckAmountValidator());

            // 继续添加其他校验器

            // TODO

        }

    }


    /// <summary>

    /// 自定义校验器:检查采购订单的采购总金额是否超额

    /// </summary>

    public class PurchaseOrderCheckAmountValidator : AbstractValidator

    {

        /// <summary>

        /// 交互标识

        /// </summary>

        const string InteractionKey = "PurchaseOrderCheckAmountValidator";


        public override void InitializeConfiguration(ValidateContext validateContext, Context ctx)

        {

            base.InitializeConfiguration(validateContext, ctx);

            if (validateContext.BusinessInfo != null)

            {

                EntityKey = validateContext.BusinessInfo.GetEntity(0).Key;

            }

        }


        public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx)

        {

            if (validateContext.Option.HasInteractionFlag(InteractionKey))

            {

                // ★★★★★★★★★★★★★★★★★★★★★★★★★★

                // 已经交互过,不再处理

                return;

            }


            if (dataEntities == null || dataEntities.Length <= 0)

            {

                return;

            }


            // 记录校验不通过的订单

            var errorBills = new Dictionary<string, decimal>();

            foreach (var et in dataEntities)

            {

                var dyEntrys = et.DataEntity["POOrderEntry"] as DynamicObjectCollection;

                if (dyEntrys == null)

                {

                    continue;

                }


                var amount = dyEntrys.Sum(dy => Convert.ToDecimal(dy["AllAmount"]));

                if (amount > 10000)

                {

                    // 采购订单的价税合计总金额超过10000时,终止操作,弹出交互界面

                    errorBills[et.BillNo] = amount;

                }

            }


            if (errorBills.Count <= 0)

            {

                return;

            }


            // 校验不通过,发起交互

            // 设置交互数据表格的列信息

            var titleMsg = string.Join(K3DisplayerModel.CST_SplitChar, "单据编号", "物料编码", "物料名称", "数量", "价税合计");

            var model = K3DisplayerModel.Create(ctx, titleMsg);

            // 设置交互数据

            foreach (var et in dataEntities)

            {

                if (!errorBills.ContainsKey(et.BillNo))

                {

                    continue;

                }


                var dyEntrys = et.DataEntity["POOrderEntry"] as DynamicObjectCollection;

                if (dyEntrys == null)

                {

                    continue;

                }


                foreach (var dy in dyEntrys)

                {

                    var material = (DynamicObject)dy["MaterialId"];

                    model.AddMessage(string.Join(K3DisplayerModel.CST_SplitChar, et.BillNo, material["Number"], material["Name"], dy["Qty"], dy["AllAmount"]));

                }

            }


            // 设置交互界面的标题和按钮

            model.Option.SetVariableValue(K3DisplayerModel.CST_FormTitle, "采购金额超额,价税合计总金额不能超过10000,是否继续?");

            model.OKButton.Visible = true;

            model.OKButton.Caption = new LocaleValue("是", ctx.UserLocale.LCID);

            model.CancelButton.Visible = true;

            model.CancelButton.Caption = new LocaleValue("否", ctx.UserLocale.LCID);

            // 抛交互异常

            var ex = new KDInteractionException(InteractionKey);

            ex.InteractionContext.InteractionFormId = FormIdConst.BOS_K3Displayer;

            ex.InteractionContext.K3DisplayerModel = model;

            ex.InteractionContext.IsInteractive = true;

            ex.InteractionContext.SimpleMessage = "复杂交互异常演示:价税合计总金额不能超过10000。";

            throw ex;

        }

    }

}


<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<3>BOSIDE扩展采购订单,保存操作,注册服务插件,保存元数据,开发完毕。




现在可以登录业务站点,打开采购订单,录入数据后,点击保存,检验一下插件效果啦。














【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

二开案例.服务插件.校验器使用内置交互界面显示自定义数据源

【应用场景】操作执行前需要对单据合法性进行校验,校验不通过时,使用内置交互界面显示自定义数据源,将校验结果显示给操作用户进行决策,...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息