二开案例.服务插件.校验器使用内置交互界面显示自定义数据源
【应用场景】操作执行前需要对单据合法性进行校验,校验不通过时,使用内置交互界面显示自定义数据源,将校验结果显示给操作用户进行决策,是否把操作继续进行下去。
【案例演示】采购订单,点击保存时,判断采购总金额是否超额,超额时弹出自定义交互界面。
【实现步骤】
<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
二开案例.服务插件.校验器使用内置交互界面显示自定义数据源
本文2024-09-23 04:20:43发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164704.html