二开插件 - 动态调用必录校验器的方法
客户需求: 目前操作可以配置校验器,如果校验失败可以终止操作。但是操作的校验器需要在元数据中配置后才会执行,能不能根据需要动态调用校验器呢?
解决方法:
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. 动态调用其它校验器的方法相似。
二开插件 - 动态调用必录校验器的方法
客户需求: 目前操作可以配置校验器,如果校验失败可以终止操作。但是操作的校验器需要在元数据中配置后才会执行,能不能根据需要动态调用...
点击下载文档
本文2024-09-23 04:08:48发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-163432.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章