二开插件 - 动态调用必录校验器的方法

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

二开插件 - 动态调用必录校验器的方法

客户需求: 目前操作可以配置校验器,如果校验失败可以终止操作。但是操作的校验器需要在元数据中配置后才会执行,能不能根据需要动态调用校验器呢?


解决方法:

1. 通过T_MDL_FORMVALIDATIONTYPE / T_MDL_FORMVALIDATIONTYPE_L查看校验器Id。

可知必录校验器的FTYPEID=1014


2. 通过元数据,查看校验器的表达式。

可知格式为 单据体Key + 冒号 + 字段 + 分号,同一单据体的字段可以列多个。 

不同单据体的字段需要创建不同的校验器。


3. 调用必录校验器的代码如下,可以动态增加必录字段。


/// <summary>
/// 为每个实体的必录字段创建必录校验器
/// </summary>
/// <param name="ctx"></param>
/// <param name="bizInfo">单据元数据</param>
/// <param name="dataEntities">数据包</param>
/// <param name="dic">多个必录校验的表达式。Key=EntityKey,Value=Express</param>
/// <param name="option">可以为null</param>
/// <returns></returns>
private static List<ValidationErrorInfo> ValidateMustInput(Context ctx, BusinessInfo bizInfo, DynamicObject[] dataEntities, Dictionary<string, string> dic, OperateOption option)
{
    var lstValidation = GetMustInputValidations(dic);
    var validateContext = CreateValidateContext(ctx, bizInfo, "Save", true);
    validateContext.Option = option;
    var validationService = CreateValidationService(ctx);
    validationService.Validators = lstValidation;
    //执行校验服务
    List<ValidationErrorInfo> errorInfo;
    validationService.TryValidate(dataEntities, validateContext, out errorInfo);
    var billNoField=bizInfo.GetBillNoField();
    if (!errorInfo.IsEmpty() && billNoField != null && dataEntities[0].DynamicObjectType.Properties.ContainsKey(billNoField.PropertyName))
    {
        List<ValidationErrorInfo> errorInfoNo = new List<ValidationErrorInfo>();
        for (int i = 0, j = 0; i < dataEntities.Length; i++)
        {
            var dyn = dataEntities[i];
            string id = ObjectUtils.Object2String(dyn["Id"]);
            var lstTmp = errorInfo.Where(m => m.BillPKID == id).ToList();
            if (lstTmp.IsEmpty()) continue;
            string title = Kingdee.BOS.Resource.ResManager.LoadKDString("单据编号", "0025669000008480", Kingdee.BOS.Resource.SubSystemType.BOS) + dyn[billNoField.PropertyName];
            foreach (var itemError in lstTmp)
            {
                errorInfoNo.Add(new ValidationErrorInfo(itemError.DisplayToFieldKey, itemError.BillPKID, i, j++, itemError.Id, itemError.Message, title));
            }
        }
        return errorInfoNo;
    }           
    return errorInfo;
}

/// <summary>
/// 为每个实体的必录字段创建必录校验器
/// </summary>
/// <returns></returns>
private static AbstractValidator[] GetMustInputValidations(Dictionary<string, string> dic)
{
    List<AbstractValidator> lstValidation = new List<AbstractValidator>();
    if (dic.IsEmpty()) return lstValidation.ToArray();
    int index = 0;
    foreach (var item in dic)
    {
        var validation = new MustInputValidation() { Id = index.ToString(), EntityKey = item.Key, Express = item.Value, TypeId = 1014 }; ;
        lstValidation.Add(validation.CreateValidator());
        index++;
    }
    return lstValidation.ToArray();
}

/// <summary>
/// 创建校验服务
/// </summary>
/// <returns></returns>
private static ValidationService CreateValidationService(Context ctx)
{
    if (ApmConfig.IsOpenApm())
    {
        return ApmProxyHelper.CreateProxy<ValidationService>(typeof(ValidationService), new object[] { ctx });
    }
    else
    {
        ValidationService validationService = new ValidationService(ctx);
        return validationService;
    }
}

/// <summary>
/// 创建校验上下文
/// </summary>
/// <returns></returns>
private static ValidateContext CreateValidateContext(Context ctx, BusinessInfo bizInfo, string operation, bool IgnoreWarning)
{
    var funcLib = new FunctionService().GetFunctionLib(ctx);
    ValidateContext validateContext = new ValidateContext(Enum_TimingPoint.Other, bizInfo, funcLib, operation, IgnoreWarning);
    return validateContext;
}

4. 动态调用其它校验器的方法相似。


二开插件 - 动态调用必录校验器的方法

客户需求: 目前操作可以配置校验器,如果校验失败可以终止操作。但是操作的校验器需要在元数据中配置后才会执行,能不能根据需要动态调用...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息