using System.Text.RegularExpressions; using JNPF.Common.Const; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos; using JNPF.Common.Extension; using JNPF.Common.Filter; using JNPF.Common.Manager; using JNPF.Common.Models; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.RemoteRequest; using JNPF.RemoteRequest.Extensions; using JNPF.Systems.Entitys.Model.DataBase; using JNPF.Systems.Entitys.Model.DataInterFace; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using JNPF.UnifyResult; using JNPF.VisualDev.Engine.Enum.VisualDevModelData; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Entitys.Dto.VisualDevModelData; using JNPF.VisualDev.Interfaces; using JNPF.WorkFlow.Entitys.Entity; using Mapster; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json.Linq; using SqlSugar; namespace JNPF.VisualDev.Engine.Core; /// /// 模板表单列表数据解析. /// public class FormDataParsing : ITransient { #region 构造 /// /// 用户管理. /// private readonly IUserManager _userManager; /// /// 切库. /// private readonly IDataBaseManager _databaseService; /// /// 数据接口. /// private readonly IDataInterfaceService _dataInterfaceService; /// /// 缓存管理. /// private readonly ICacheManager _cacheManager; /// /// 缓存管理. /// private readonly IMemoryCache _memCache; /// /// 服务基础仓储. /// //private readonly ISqlSugarRepository _db; private readonly ISqlSugarClient _sugar; /// /// 构造. /// /// /// /// /// /// public FormDataParsing( IUserManager userManager, ICacheManager cacheManager, IDataBaseManager databaseService, IDataInterfaceService dataInterfaceService, ISqlSugarRepository context, IMemoryCache memCache) { _userManager = userManager; _cacheManager = cacheManager; _databaseService = databaseService; _dataInterfaceService = dataInterfaceService; _sugar = context.AsSugarClient().CopyNew(); //_db = context; _memCache = memCache; } #endregion #region 解析模板数据 /// /// 控制模板数据转换. /// /// 数据. /// 数据模板. /// 操作类型(List-列表值,create-创建值,update-更新值,detail-详情值,transition-过渡值,query-查询). /// object. public object TemplateControlsDataConversion(object data, FieldsModel fieldsModel, string? actionType = null) { if (fieldsModel == null || data == null || data.Equals("[]") || data.ToString().Equals("[]") || string.IsNullOrEmpty(data.ToString())) return string.Empty; try { object conversionData = new object(); switch (fieldsModel.__config__.jnpfKey) { case JnpfKeyConst.SWITCH: // 开关 conversionData = data.ParseToInt(); break; case JnpfKeyConst.RATE: // 评分 case JnpfKeyConst.NUMINPUT: if (fieldsModel.precision.IsNullOrEmpty()) fieldsModel.precision = 0; // 数字输入 if (data.ToString().Contains(".")) { var len = data.ToString().Split('.').Last().Length; if (fieldsModel.precision > len) fieldsModel.precision = len; conversionData = data.ToString().Substring(0, data.ToString().IndexOf(".") + (int)fieldsModel.precision + 1);//modifyby zhoukeda 20230512 增加+1 conversionData = data.ParseToDouble();//modifyby zhoukeda 20230512 } else conversionData = data; break; case JnpfKeyConst.JNPFAMOUNT: conversionData = data.ParseToDecimal(); // 金额输入 break; case JnpfKeyConst.CHECKBOX: // 多选框组 { switch (actionType) { case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; default: if (data.ToString().Contains("[")) conversionData = data.ToString().ToObject>(); else conversionData = data; break; } } break; case JnpfKeyConst.SELECT: // 下拉选择 { switch (actionType) { case "transition": conversionData = data; break; case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else conversionData = data; break; default: if (fieldsModel.multiple && actionType != "query") { if (data.ToString().Contains("[")) conversionData = data.ToString().ToObject>(); else if (data.ToString().Contains(",")) conversionData = string.Join(",", data.ToString().Split(',').ToArray()); else conversionData = data.ToString(); } else { conversionData = data; } break; } } break; case JnpfKeyConst.TIME: // 时间选择 { conversionData = data; } break; case JnpfKeyConst.TIMERANGE: // 时间范围 { switch (actionType) { case "transition": conversionData = data; break; default: conversionData = data.ToString().ToObject>(); break; } } break; case JnpfKeyConst.DATE: // 日期选择 { switch (actionType) { case "List": DateTime dtDate; if (DateTime.TryParse(data.ToString(), out dtDate)) conversionData = data.ToString(); else conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data.ToString().TimeStampToDateTime()); break; case "create": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data.ToString().TimeStampToDateTime()); break; case "detail": conversionData = data; break; default: try { DateTime.Parse(data.ToString()); conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", data.ToString()); } catch { conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", data.ToString().TimeStampToDateTime()); } break; } } break; case JnpfKeyConst.DATERANGE: // 日期范围 { switch (actionType) { case "transition": conversionData = data; break; default: conversionData = data.ToString().ToObject>(); break; } } break; case JnpfKeyConst.CREATETIME: // 创建时间 case JnpfKeyConst.MODIFYTIME: // 修改时间 { switch (actionType) { case "create": conversionData = data.ToString(); break; default: DateTime dtDate; if (DateTime.TryParse(data.ToString(), out dtDate)) conversionData = data.ToString(); else conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data.ToString().TimeStampToDateTime()); break; } } break; case JnpfKeyConst.UPLOADFZ: // 文件上传 switch (actionType) { case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; default: if (data.ToJsonString() != "[]") { if (data is List) conversionData = data.ToJsonString().ToObject>(); else conversionData = data.ToString().ToObject>(); } else { conversionData = null; } break; } break; case JnpfKeyConst.UPLOADIMG: // 图片上传 { switch (actionType) { case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; default: if (data.ToJsonString() != "[]") conversionData = data.ToString().ToObject>(); else conversionData = null; break; } } break; case JnpfKeyConst.SLIDER: // 滑块 if (fieldsModel.range) conversionData = data.ToString().ToObject>(); else conversionData = data.ParseToInt(); break; case JnpfKeyConst.ADDRESS: // 省市区联动 { switch (actionType) { case "transition": conversionData = data; break; case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; default: conversionData = data.ToString().ToObject>(); break; } } break; case JnpfKeyConst.TABLE: // 设计子表 break; case JnpfKeyConst.CASCADER: // 级联 switch (actionType) { case "transition": conversionData = data; break; case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; default: { if (fieldsModel.props.props.multiple) conversionData = data.ToString().ToObject>(); else if (data.ToString().Contains("[")) conversionData = data.ToString().ToObject>(); else conversionData = data; } break; } break; case JnpfKeyConst.COMSELECT: // 公司组件 { switch (actionType) { case "transition": { conversionData = data; } break; case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; case "List": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>>(); } else { conversionData = data; } } break; default: { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>>(); } else { conversionData = data.ToString().ToObject>(); } } break; } } break; case JnpfKeyConst.GROUPSELECT: // 分组 case JnpfKeyConst.ROLESELECT: // 角色 case JnpfKeyConst.DEPSELECT: // 部门组件 case JnpfKeyConst.POSSELECT: // 岗位组件 case JnpfKeyConst.USERSELECT: // 用户组件 case JnpfKeyConst.USERSSELECT: // 新用户组件 case JnpfKeyConst.TREESELECT: // 树形选择 { switch (actionType) { case "transition": conversionData = data; break; case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data.ToString(); else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; default: if (fieldsModel.multiple) conversionData = data.ToString().ToObject>(); else conversionData = data; break; } } break; case JnpfKeyConst.POPUPTABLESELECT: // 下拉表格 { switch (actionType) { case "transition": conversionData = data; break; case "update": case "create": if (data.GetType().Name.ToLower().Equals("string")) conversionData = data; else if (data.ToString().Contains("[")) conversionData = data.ToJsonString(); else conversionData = data; break; default: if (fieldsModel.multiple) conversionData = data.ToString().ToObject>(); else conversionData = data; break; } } break; default: conversionData = data; break; } return conversionData; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 获取有表单条数据. /// /// /// /// /// public List> GetTableDataInfo(List> dataList, List fieldsModels, string actionType) { // 转换表字符串成数组 foreach (var dataMap in dataList) { int dicCount = dataMap.Keys.Count; string[] strKey = new string[dicCount]; dataMap.Keys.CopyTo(strKey, 0); for (int i = 0; i < strKey.Length; i++) { var dataValue = dataMap[strKey[i]]; if (dataValue != null && !string.IsNullOrEmpty(dataValue.ToString())) { var model = fieldsModels.Find(f => f.__vModel__.Equals(strKey[i])); if (model != null) { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, actionType); } } } } return dataList; } /// /// 解析处理 Sql 插入数据的 value. /// /// 数据库 类型. /// 表数据. /// 前端字段名. /// 插入的数据. /// 控件集合. /// 操作类型. /// string. public object InsertValueHandle(string dbType, List _tableList, string field, object data, List _fieldsModelList, string actionType = "create") { // 根据KEY查找模板 FieldsModel? model = _fieldsModelList.Find(f => f.__vModel__ == field); // 单独处理 Oracle,Kdbndp 日期格式转换 if (!actionType.Equals("create") && dbType == "Oracle" && _tableList.Find(x => x.dataType == "DateTime" && x.field == field.ReplaceRegex(@"(\w+)_jnpf_", string.Empty)) != null) { return string.Format("to_date('{0}','yyyy-mm-dd HH24/MI/SS')", TemplateControlsDataConversion(data, model, actionType)); } else { var res = TemplateControlsDataConversion(data, model, actionType); if (actionType.Equals("create")) { if (model.__config__.jnpfKey.Equals(JnpfKeyConst.CREATETIME) || model.__config__.jnpfKey.Equals(JnpfKeyConst.DATE)) return res.ToString().ParseToDateTime(); else if (model.__config__.jnpfKey.Equals(JnpfKeyConst.NUMINPUT) || model.__config__.jnpfKey.Equals(JnpfKeyConst.SWITCH))//modify by zhoukeda 2023427 开关默认数字 return res; else return res.ToString(); } else { res = res.IsNullOrEmpty() ? "null" : string.Format("'{0}'", res); return res; } } } #endregion #region 缓存模板数据 /// /// 获取可视化开发模板可缓存数据. /// /// 模型id. /// 模板数据结构. /// 控件缓存数据. public async Task> GetVisualDevCaCheData(List formData) { Dictionary templateData = new Dictionary(); string? cacheKey = CommonConst.VISUALDEV + _userManager.TenantId + "_"; // 获取或设置控件缓存数据 foreach (FieldsModel? model in formData) { if (model != null && model.__vModel__ != null) { ConfigModel configModel = model.__config__; string fieldCacheKey = cacheKey + configModel.renderKey + "_" + model.__vModel__; switch (configModel.jnpfKey) { case JnpfKeyConst.RADIO: // 单选框 case JnpfKeyConst.SELECT: // 下拉框 case JnpfKeyConst.CHECKBOX: // 复选框 if (!GetCacheValues(fieldCacheKey, templateData)) { List>? list = new List>(); if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) list = await GetDictionaryList(configModel.dictionaryType); if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) list = await GetDynamicList(model); if (vModelType.STATIC.GetDescription() == configModel.dataType) { foreach (Dictionary? item in model.__slot__.options) { Dictionary option = new Dictionary(); option.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(option); } } templateData.Add(fieldCacheKey, list); _cacheManager.Set(fieldCacheKey, list, TimeSpan.FromMinutes(3)); } break; case JnpfKeyConst.TREESELECT: // 树形选择 if (!GetCacheValues(fieldCacheKey, templateData)) { List>? list = new List>(); if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) list = await GetDictionaryList(configModel.dictionaryType); if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) list = await GetDynamicList(model); if (vModelType.STATIC.GetDescription() == configModel.dataType) list = GetStaticList(model); templateData.Add(fieldCacheKey, list); _cacheManager.Set(fieldCacheKey, list, TimeSpan.FromMinutes(3)); } break; case JnpfKeyConst.CASCADER: // 级联选择 if (!GetCacheValues(fieldCacheKey, templateData)) { List>? list = new List>(); if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) list = await GetDictionaryList(configModel.dictionaryType); if (vModelType.STATIC.GetDescription() == configModel.dataType) list = GetStaticList(model); if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) list = await GetDynamicList(model); templateData.Add(fieldCacheKey, list); _cacheManager.Set(fieldCacheKey, list, TimeSpan.FromMinutes(3)); } break; case JnpfKeyConst.DEPSELECT: // 部门 await GetOrgList(fieldCacheKey, JnpfKeyConst.DEPSELECT, templateData); break; case JnpfKeyConst.COMSELECT: // 公司 await GetOrgList(fieldCacheKey, JnpfKeyConst.COMSELECT, templateData); break; case JnpfKeyConst.CURRORGANIZE: // 所属组织 await GetOrgList(fieldCacheKey, JnpfKeyConst.CURRORGANIZE, templateData); break; case JnpfKeyConst.DICTIONARY: // 数据字典 if (!GetCacheValues(fieldCacheKey, templateData)) { List>? vlist = await GetDictionaryList(); templateData.Add(fieldCacheKey, vlist); _cacheManager.Set(fieldCacheKey, vlist, TimeSpan.FromMinutes(3)); } break; case JnpfKeyConst.POSSELECT: // 岗位 if (!GetCacheValues(fieldCacheKey, templateData)) { List? positionEntityList = await _sugar.Queryable().Where(u => u.DeleteMark == null).ToListAsync(); List> positionList = new List>(); foreach (PositionEntity? item in positionEntityList) { Dictionary position = new Dictionary(); position.Add(item.Id, item.FullName); positionList.Add(position); } templateData.Add(fieldCacheKey, positionList); _cacheManager.Set(fieldCacheKey, positionList, TimeSpan.FromMinutes(3)); } break; case JnpfKeyConst.GROUPSELECT: // 分组 if (!GetCacheValues(fieldCacheKey, templateData)) { List? positionEntityList = await _sugar.Queryable().Where(u => u.DeleteMark == null).ToListAsync(); List> positionList = new List>(); foreach (GroupEntity? item in positionEntityList) { Dictionary position = new Dictionary(); position.Add(item.Id, item.FullName); positionList.Add(position); } templateData.Add(fieldCacheKey, positionList); _cacheManager.Set(fieldCacheKey, positionList, TimeSpan.FromMinutes(3)); } break; case JnpfKeyConst.ROLESELECT: // 角色 if (!GetCacheValues(fieldCacheKey, templateData)) { List? positionEntityList = await _sugar.Queryable().Where(u => u.DeleteMark == null).ToListAsync(); List> positionList = new List>(); foreach (RoleEntity? item in positionEntityList) { Dictionary position = new Dictionary(); position.Add(item.Id, item.FullName); positionList.Add(position); } templateData.Add(fieldCacheKey, positionList); _cacheManager.Set(fieldCacheKey, positionList, TimeSpan.FromMinutes(3)); } break; } } } #region 省市区 单独处理 if (formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.ADDRESS).Any()) { bool level3 = formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.ADDRESS && x.level == 3).Any(); string? addCacheKey = CommonConst.VISUALDEV + "_address1"; string? addCacheKey2 = CommonConst.VISUALDEV + "_address2"; if (level3) { if (_cacheManager.Exists(addCacheKey2)) { templateData.Add(addCacheKey2, _cacheManager.Get(addCacheKey2).ToObject>>()); } else { List? addressEntityList = await _sugar.Queryable().Select(x => new ProvinceEntity { Id = x.Id, ParentId = x.ParentId, Type = x.Type, FullName = x.FullName }).ToListAsync(); // 处理省市区树 addressEntityList.Where(x => x.Type == "1").ToList().ForEach(item => item.QuickQuery = item.FullName); addressEntityList.Where(x => x.Type == "2").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName); addressEntityList.Where(x => x.Type == "3").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName); addressEntityList.Where(x => x.Type == "4").ToList().ForEach(item => { ProvinceEntity? it = addressEntityList.Find(x => x.Id == item.ParentId); if (it != null) item.QuickQuery = it.QuickQuery + "/" + item.FullName; }); // 分开 省市区街道 数据 List> addressList = new List>(); foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "4").ToList()) { Dictionary address = new Dictionary(); address.Add(item.Id, item.QuickQuery); addressList.Add(address); } var noTypeList = addressEntityList.Where(x => x.Type.IsNullOrWhiteSpace()).ToList(); foreach (ProvinceEntity? item in noTypeList) item.QuickQuery = GetAddressByPList(noTypeList, item); foreach (ProvinceEntity? item in noTypeList) { Dictionary address = new Dictionary(); address.Add(item.Id, item.QuickQuery); addressList.Add(address); } // 缓存七天 _cacheManager.Set(addCacheKey2, addressList, TimeSpan.FromDays(7)); templateData.Add(addCacheKey2, addressList); } } if (_cacheManager.Exists(addCacheKey)) { templateData.Add(addCacheKey, _cacheManager.Get(addCacheKey).ToObject>>()); } else { List? addressEntityList = await _sugar.Queryable().Select(x => new ProvinceEntity { Id = x.Id, ParentId = x.ParentId, Type = x.Type, FullName = x.FullName }).ToListAsync(); // 处理省市区树 addressEntityList.Where(x => x.Type == "1").ToList().ForEach(item => item.QuickQuery = item.FullName); addressEntityList.Where(x => x.Type == "2").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName); addressEntityList.Where(x => x.Type == "3").ToList().ForEach(item => item.QuickQuery = addressEntityList.Find(x => x.Id == item.ParentId).QuickQuery + "/" + item.FullName); // 分开 省市区街道 数据 List> addressList = new List>(); foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "1").ToList()) { Dictionary address = new Dictionary(); address.Add(item.Id, item.QuickQuery); addressList.Add(address); } foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "2").ToList()) { Dictionary address = new Dictionary(); address.Add(item.Id, item.QuickQuery); addressList.Add(address); } foreach (ProvinceEntity? item in addressEntityList.Where(x => x.Type == "3").ToList()) { Dictionary address = new Dictionary(); address.Add(item.Id, item.QuickQuery); addressList.Add(address); } var noTypeList = addressEntityList.Where(x => x.Type.IsNullOrWhiteSpace()).ToList(); foreach (ProvinceEntity? item in noTypeList) item.QuickQuery = GetAddressByPList(noTypeList, item); foreach (ProvinceEntity? item in noTypeList) { Dictionary address = new Dictionary(); address.Add(item.Id, item.QuickQuery); addressList.Add(address); } // 缓存七天 _cacheManager.Set(addCacheKey, addressList, TimeSpan.FromDays(7)); templateData.Add(addCacheKey, addressList); } } #endregion #region 用户单独处理 if (formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.USERSELECT).Any()) { string? userCacheKey = CommonConst.VISUALDEV + "_userSelect"; if (_cacheManager.Exists(userCacheKey)) { templateData.Add(userCacheKey, _cacheManager.Get(userCacheKey).ToObject>>()); } else { List? userEntityList = await _sugar.Queryable().Where(x => x.DeleteMark == null).Select(x => new UserEntity() { Id = x.Id, RealName = x.RealName, Account = x.Account }).ToListAsync(); List> userList = new List>(); foreach (UserEntity? item in userEntityList) { Dictionary user = new Dictionary(); user.Add(item.Id, item.RealName + "/" + item.Account); userList.Add(user); } // 缓存30分钟 _cacheManager.Set(userCacheKey, userList, TimeSpan.FromMinutes(30)); templateData.Add(userCacheKey, userList); } } if (formData.Where(x => x.__config__.jnpfKey == JnpfKeyConst.USERSSELECT).Any()) { string? userCacheKey = CommonConst.VISUALDEV + "_usersSelect"; if (_cacheManager.Exists(userCacheKey)) { templateData.Add(userCacheKey, _cacheManager.Get(userCacheKey).ToObject>>()); } else { var addList = new List>(); (await _sugar.Queryable().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.RealName, x.Account }).ToListAsync()).ForEach(item => { Dictionary user = new Dictionary(); user.Add(item.Id + "--user", item.RealName + "/" + item.Account); addList.Add(user); }); (await _sugar.Queryable().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item => { Dictionary user = new Dictionary(); user.Add(item.Id + "--company", item.FullName); user.Add(item.Id + "--department", item.FullName); addList.Add(user); }); (await _sugar.Queryable().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item => { Dictionary user = new Dictionary(); user.Add(item.Id + "--role", item.FullName); addList.Add(user); }); (await _sugar.Queryable().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item => { Dictionary user = new Dictionary(); user.Add(item.Id + "--position", item.FullName); addList.Add(user); }); (await _sugar.Queryable().Where(x => x.DeleteMark == null).Select(x => new { x.Id, x.FullName }).ToListAsync()).ForEach(item => { Dictionary user = new Dictionary(); user.Add(item.Id + "--group", item.FullName); addList.Add(user); }); // 缓存30分钟 _cacheManager.Set(userCacheKey, addList, TimeSpan.FromMinutes(30)); templateData.Add(userCacheKey, addList); } } #endregion return templateData; } /// /// 获取缓存 根据控件key. /// /// /// /// private bool GetCacheValues(string fieldCacheKey, Dictionary templateData) { if (_cacheManager.Exists(fieldCacheKey)) { List>? list = _cacheManager.Get(fieldCacheKey).ToObject>>(); templateData.Add(fieldCacheKey, list); return true; } return false; } /// /// 处理组织信息. /// /// /// /// /// private async Task GetOrgList(string fieldCacheKey, string orgType, Dictionary templateData) { if (!GetCacheValues(fieldCacheKey, templateData)) { List? dep_organizeEntityList = await _sugar.Queryable().Where(d => d.EnabledMark == 1 && d.DeleteMark == null) .WhereIF(orgType.Equals(JnpfKeyConst.DEPSELECT), d => d.Category.Equals("department")).ToListAsync(); List> vlist = new List>(); foreach (OrganizeEntity? item in dep_organizeEntityList) { Dictionary organize = new Dictionary(); if (orgType.Equals(JnpfKeyConst.DEPSELECT)) organize.Add(item.Id, item.FullName); // 部门 if (orgType.Equals(JnpfKeyConst.COMSELECT)) organize.Add(item.Id, new string[] { item.OrganizeIdTree, item.FullName }); // 公司 if (orgType.Equals(JnpfKeyConst.CURRORGANIZE)) organize.Add(item.Id, new string[] { item.OrganizeIdTree, item.Category, item.FullName }); // 所属组织 vlist.Add(organize); } templateData.Add(fieldCacheKey, vlist); _cacheManager.Set(fieldCacheKey, vlist, TimeSpan.FromMinutes(3)); } } /// /// 处理远端数据. /// /// /// private async Task>> GetDynamicList(FieldsModel model) { List> list = new List>(); // 获取远端数据 DataInterfaceEntity? dynamic = await _dataInterfaceService.GetInfo(model.__config__.propsUrl); if (dynamic == null) return list; var propsValue = string.Empty; var propsLabel = string.Empty; var children = string.Empty; if (model.__config__.jnpfKey.Equals(JnpfKeyConst.TREESELECT) || model.__config__.jnpfKey.Equals(JnpfKeyConst.CASCADER)) { propsValue = model.props.props.value; propsLabel = model.props.props.label; children = model.props.props.children; } else { propsValue = model.__config__.props.value; propsLabel = model.__config__.props.label; children = model.__config__.props.children; } switch (dynamic.DataType) { // SQL数据 case 1: { // 远端数据 配置参数 List? parameter = new List(); if (_userManager.ToKen != null) { parameter.Add(new SugarParameter("@user", _userManager.UserId)); parameter.Add(new SugarParameter("@organization", _userManager?.User?.OrganizeId)); var subordinates = _userManager.Subordinates; subordinates.Add(_userManager.UserId); parameter.Add(new SugarParameter("@currentUsersAndSubordinates", subordinates)); var subsidiary = _userManager.Subsidiary; subsidiary.Add(_userManager.User.OrganizeId); parameter.Add(new SugarParameter("@currentOrganizationAndSuborganization", subsidiary)); var chargeorganization = _userManager.DataScope.Where(x => x.organizeId == _userManager.User.OrganizeId && x.Select).ToList().FirstOrDefault(); parameter.Add(new SugarParameter("@chargeorganization", chargeorganization?.organizeId)); subsidiary = _userManager.DataScope.Select(x => x.organizeId).Intersect(_userManager.Subsidiary).ToList(); parameter.Add(new SugarParameter("@currentChargeorganizationAndSuborganization", subsidiary)); } DbLinkEntity? linkEntity = await _sugar.Queryable().Where(m => m.Id == dynamic.DBLinkId && m.DeleteMark == null).FirstAsync(); if (linkEntity == null) linkEntity = _databaseService.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName); _dataInterfaceService.ReplaceParameterValue(dynamic, new Dictionary()); System.Data.DataTable? dt = _databaseService.GetInterFaceData(linkEntity, dynamic.Query, parameter.ToArray()); List> dynamicDataList = dt.ToJsonString().ToObject>>(); foreach (Dictionary? item in dynamicDataList) { Dictionary dynamicDic = new Dictionary(); dynamicDic.Add(item[propsValue]?.ToString(), item[propsLabel]?.ToString()); list.Add(dynamicDic); } } break; // 静态数据 case 2: { foreach (var data in JValue.Parse(dynamic.Query)) { Dictionary dic = new Dictionary(); dic[data.Value(propsValue)] = data.Value(propsLabel); list.Add(dic); if (children != null && data.Value(children) != null && data.Value(children).ToString().IsNotEmptyOrNull()) list.AddRange(GetDynamicInfiniteData(data.Value(children).ToString(), model.props.props)); } } break; // Api数据 case 3: { // 获取远端数据 var dynamicList = await _dataInterfaceService.GetInfo(model.__config__.propsUrl); if (dynamicList == null) break; var redisName = CommonConst.VISUALDEV + _userManager.TenantId + "_" + model.__config__.jnpfKey + "_" + model.__config__.renderKey; switch (dynamicList.DataType) { case 1: // SQL数据 { _dataInterfaceService.ReplaceParameterValue(dynamicList, new Dictionary()); var pObj = await _dataInterfaceService.GetData(dynamicList); list = pObj.ToJsonString().ToObject>>(); } break; case 2: // 静态数据 { foreach (var data in JValue.Parse(dynamicList.Query)) { list.Add(new Dictionary() { { data.Value(propsValue), data.Value(propsLabel) } }); if (children != null && data.Value(children) != null && data.Value(children).ToString() != "") list.AddRange(GetDynamicInfiniteData(data.Value(children).ToString(), model.props.props)); } } break; case 3: // Api数据 { var result = await GetApiDataByTypePreview(dynamicList); // 请求接口 list = result.ContainsKey("list") ? result["list"].ToObject>>() : new List>(); if ((list == null || !list.Any()) && result.ContainsKey("data")) { var newList = result["data"].ToObject>().ContainsKey("list") ? result["data"]["list"].ToObject>>() : new List>(); foreach (var data in JValue.Parse(newList.ToJsonString())) { list.Add(new Dictionary() { { data.Value(propsValue), data.Value(propsLabel) } }); if (children != null && data.Value(children) != null && data.Value(children).ToString() != "") list.AddRange(GetDynamicInfiniteData(data.Value(children).ToString(), model.props.props)); } } } break; } } break; } return list; } /// /// 处理静态数据. /// /// /// private List> GetStaticList(FieldsModel model) { PropsBeanModel? props = model.props.props; List? optionList = GetTreeOptions(model.options, props); List> list = new List>(); foreach (OptionsModel? item in optionList) { Dictionary option = new Dictionary(); option.Add(item.value, item.label); list.Add(option); } return list; } /// /// 获取数据字典数据 根据 类型Id. /// /// /// List. private async Task>> GetDictionaryList(string? dictionaryTypeId = null) { List dictionaryDataEntityList = await _sugar.Queryable((a, b) => new JoinQueryInfos(JoinType.Left, b.Id == a.DictionaryTypeId)) .WhereIF(dictionaryTypeId.IsNotEmptyOrNull(), (a, b) => b.Id == dictionaryTypeId || b.EnCode == dictionaryTypeId).Where(a => a.DeleteMark == null).ToListAsync(); List> dictionaryDataList = new List>(); foreach (DictionaryDataEntity? item in dictionaryDataEntityList) { Dictionary dictionary = new Dictionary(); dictionary.Add(item.Id, item.FullName); dictionary.Add(item.EnCode, item.FullName); dictionaryDataList.Add(dictionary); } return dictionaryDataList; } /// /// options无限级. /// /// private List GetTreeOptions(List model, PropsBeanModel props) { List options = new List(); foreach (object? item in model) { OptionsModel option = new OptionsModel(); Dictionary? dicObject = item.ToJsonString().ToObject>(); option.label = dicObject[props.label].ToString(); option.value = dicObject[props.value].ToString(); if (dicObject.ContainsKey(props.children)) { List? children = dicObject[props.children].ToJsonString().ToObject>(); options.AddRange(GetTreeOptions(children, props)); } options.Add(option); } return options; } /// /// 递归获取手动添加的省市区,名称处理成树形结构. /// /// private string GetAddressByPList(List addressEntityList, ProvinceEntity pEntity) { if (pEntity.ParentId == null || pEntity.ParentId.Equals("-1")) { return pEntity.FullName; } else { var pItem = addressEntityList.Find(x => x.Id == pEntity.ParentId); if (pItem != null) pEntity.QuickQuery = GetAddressByPList(addressEntityList, pItem) + "/" + pEntity.FullName; else pEntity.QuickQuery = pEntity.FullName; return pEntity.QuickQuery; } } #endregion #region 系统组件生成与解析 /// /// 将系统组件生成的数据转换为数据. /// /// 表单模板. /// 真实数据. /// public async Task> GetSystemComponentsData(List formData, string modelData) { // 获取控件缓存数据 Dictionary templateData = await GetVisualDevCaCheData(formData); Dictionary dataMap = modelData.ToObject>(); // 数据库保存的F_Data // 序列化后时间戳转换处理 List? timeList = formData.Where(x => x.__config__.jnpfKey == "createTime" || x.__config__.jnpfKey == "modifyTime").ToList(); if (timeList.Any()) { timeList.ForEach(item => { if (dataMap.ContainsKey(item.__vModel__) && dataMap[item.__vModel__] != null) { string value = dataMap[item.__vModel__].ToString(); if (value.IsNotEmptyOrNull()) { dataMap.Remove(item.__vModel__); DateTime dtDate; if (!DateTime.TryParse(value, out dtDate)) value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", value.TimeStampToDateTime()); else value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", value.ParseToDateTime()); dataMap.Add(item.__vModel__, value); } } }); } int dicCount = dataMap.Keys.Count; string[] strKey = new string[dicCount]; dataMap.Keys.CopyTo(strKey, 0); // 自动生成的数据不在模板数据内 foreach (string? key in dataMap.Keys.ToList()) { FieldsModel? model = formData.Where(f => f.__vModel__ == key).FirstOrDefault(); if (model == null) continue; if (dataMap[key] != null) { string? dataValue = dataMap[key].ToString(); if (!string.IsNullOrEmpty(dataValue) && model != null) { ConfigModel configModel = model.__config__; if (string.IsNullOrWhiteSpace(model.separator)) model.separator = ","; switch (configModel.jnpfKey) { case JnpfKeyConst.UPLOADFZ: // 文件上传 case JnpfKeyConst.UPLOADIMG: // 图片上传 dataMap[key] = dataMap[key] == null ? new List().ToJsonString() : dataMap[key]; break; case JnpfKeyConst.CREATEUSER: case JnpfKeyConst.MODIFYUSER: dataMap[key] = await _sugar.Queryable().Where(x => x.Id == dataValue).Select(x => SqlFunc.MergeString(x.RealName, "/", x.Account)).FirstAsync(); break; case JnpfKeyConst.CURRPOSITION: dataMap[key] = (await _sugar.Queryable().FirstAsync(p => p.Id == dataMap[key].ToString()))?.FullName; if (dataMap[key].IsNullOrEmpty()) dataMap[key] = " "; break; case JnpfKeyConst.CURRORGANIZE: { var currOrganizeTemplateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + _userManager.TenantId + "_" + configModel.renderKey + "_" + key)).FirstOrDefault().Value?.ToJsonString().ToObject>>(); var valueId = currOrganizeTemplateValue.Where(x => x.Keys.Contains(dataMap[key].ToString())).FirstOrDefault(); if (valueId != null) { if (model.showLevel == "all") { string[]? cascaderData = valueId[dataMap[key].ToString()]; if (cascaderData != null && !string.IsNullOrWhiteSpace(cascaderData.FirstOrDefault())) { List? treeFullName = new List(); cascaderData.FirstOrDefault()?.Split(',').ToList().ForEach(item => { treeFullName.Add(currOrganizeTemplateValue.Find(x => x.Keys.Contains(item)).FirstOrDefault().Value?.LastOrDefault()); }); dataMap[key] = string.Join("/", treeFullName); } else { dataMap[key] = string.Empty; } } else { string[]? cascaderData = valueId[dataMap[key].ToString()]; if (cascaderData != null && cascaderData[1] == "department") dataMap[key] = valueId[dataMap[key].ToString()]?.LastOrDefault(); else dataMap[key] = string.Empty; } } else { dataMap[key] = string.Empty; } if (dataMap[key].IsNullOrEmpty()) dataMap[key] = " "; } break; } } } else { // 前端空数组提交 转换 . switch (model.__config__.jnpfKey) { case JnpfKeyConst.CASCADER: case JnpfKeyConst.CHECKBOX: case JnpfKeyConst.UPLOADFZ: // 文件上传 case JnpfKeyConst.UPLOADIMG: // 图片上传 dataMap[key] = dataMap[key] == null ? new List() : dataMap[key]; break; case JnpfKeyConst.SELECT: case JnpfKeyConst.ADDRESS: case JnpfKeyConst.GROUPSELECT: case JnpfKeyConst.POSSELECT: case JnpfKeyConst.ROLESELECT: case JnpfKeyConst.COMSELECT: case JnpfKeyConst.DEPSELECT: case JnpfKeyConst.TREESELECT: case JnpfKeyConst.USERSELECT: case JnpfKeyConst.POPUPTABLESELECT: if (model.multiple) dataMap[key] = dataMap[key] == null ? new List() : dataMap[key]; break; } } } return dataMap; } #endregion #region 无表的数据查询筛选 /// /// 无表的数据筛选. /// /// 数据列表. /// 查询条件值. /// /// public List> GetNoTableFilteringData(List list, Dictionary keyJsonMap, List formData) { List> realList = new List>(); foreach (var entity in list) { Dictionary query = keyJsonMap; Dictionary realEntity = entity.Data.ToObject>(); realEntity.Add("id", entity.Id); if (query != null && query.Count != 0) { int m = 0; int dicCount = query.Keys.Count; string[] strKey = new string[dicCount]; query.Keys.CopyTo(strKey, 0); for (int i = 0; i < strKey.Length; i++) { var keyValue = keyJsonMap[strKey[i]]; var queryEntity = realEntity.Where(e => e.Key == strKey[i]).FirstOrDefault(); var model = formData.Where(f => f.__vModel__ == strKey[i]).FirstOrDefault(); if (queryEntity.Value != null && !string.IsNullOrWhiteSpace(keyValue.ToString())) { var realValue = queryEntity.Value.ObjToString(); var type = model.__config__.jnpfKey; switch (type) { case JnpfKeyConst.TIME: { var queryTime = new List(); keyValue.ToObject>().ForEach(item => { if (!string.IsNullOrWhiteSpace(item)) queryTime.Add(item.ParseToDateTime().ToLongTimeString()); }); if (Common.Extension.Extensions.IsInTimeRange(realValue.ParseToDateTime(), queryTime.First(), queryTime.Last(), 3)) m++; } break; case JnpfKeyConst.DATE: { List queryTime = keyValue.ToObject>(); int formatType = 0; if (model.format == "yyyy-MM") formatType = 1; else if (model.format == "yyyy") formatType = 2; string value1 = string.Format("{0:yyyy-MM-dd}", queryTime.First().ParseToDateTime()); string value2 = string.Format("{0:yyyy-MM-dd}", queryTime.Last().ParseToDateTime()); if (Common.Extension.Extensions.IsInTimeRange(realValue.ParseToDateTime(), value1, value2, formatType)) m++; } break; case JnpfKeyConst.CREATETIME: case JnpfKeyConst.MODIFYTIME: { List dayTime1 = keyValue.ToObject>(); string value1 = string.Format("{0:yyyy-MM-dd 00:00:00}", dayTime1.First().ParseToDateTime()); string value2 = string.Format("{0:yyyy-MM-dd 23:59:59}", dayTime1.Last().ParseToDateTime()); if (!string.IsNullOrEmpty(realValue) && Common.Extension.Extensions.IsInTimeRange(Convert.ToDateTime(realValue), value1, value2)) m++; } break; case JnpfKeyConst.NUMINPUT: case JnpfKeyConst.CALCULATE: { List numArray = keyValue.ToObject>(); var numA = numArray.First().ParseToInt(); var numB = numArray.Last() == null ? long.MaxValue : numArray.Last().ParseToInt(); var numC = realValue.ParseToInt(); if (numC >= numA && numC <= numB) m++; } break; default: if (realValue.IsNotEmptyOrNull() && keyValue != null) { string keyV = keyValue.ToString(); if (model.searchType == 2 && realValue.Contains(keyV)) m++; else if (model.searchType == 1) { // 多选时为模糊查询 if ((model.multiple || type == "checkbox") && realValue.Contains(keyV)) m++; else if (realValue.Equals(keyV)) m++; } else if (realValue.Replace(" ", "").Contains(keyV.Replace(" ", ""))) m++; } break; } } if (m == dicCount) realList.Add(realEntity); } } else { realList.Add(realEntity); } } return realList; } #endregion #region 列表转换数据(Id 转 Name) /// /// 将关键字key查询传输的id转换成名称,还有动态数据id成名称. /// /// 数据库模板数据. /// 真实数据. /// /// /// 表单类型1-纯表单、2-普通表单、3-工作流表单. /// 数据主键. /// 子表解析时调用 (控件联动可能需要主表的数据). /// public async Task>> GetKeyData( List formData, List> list, ColumnDesignModel? columnDesign = null, string actionType = "List", int webType = 2, string primaryKey = "F_Id", Dictionary? mainData = null) { // 获取控件缓存数据 Dictionary templateData = await GetVisualDevCaCheData(formData); // 转换数据 Dictionary? convData = new Dictionary(); // 存放 预缓存数据的控件的缓存数据 , 避免循环时重复序列化 耗资源 List>? currOrganizeTemplateValue = new List>(); // 组织 List>? addressTemplateValue = new List>(); // 地址 省市区 缓存 List>? streetTemplateValue = new List>(); // 地址 街道 缓存 List>? comselectTemplateValue = new List>(); // 公司 List>? depselectTemplateValue = new List>(); // 部门 List>? userselectTemplateValue = new List>(); // 用户 List>? usersselectTemplateValue = new List>(); // 用户组件 List>? posselectTemplateValue = new List>(); // 岗位 List>? radioTemplateValue = new List>(); // 单选框 List>? checkboxTemplateValue = new List>(); // 复选框 List>? selectTemplateValue = new List>(); // 下拉框 List>? treeSelectTemplateValue = new List>(); // 树 List>? cascaderTemplateValue = new List>(); // 级联选择 List>? groupTemplateValue = new List>(); // 分组 List>? roleTemplateValue = new List>(); // 角色 Dictionary>>? templateValues = new Dictionary>>(); // 其他 if (webType == 3) { var ids = list.Select(x => x[primaryKey]).ToList(); var flowTaskList = await _sugar.Queryable().Where(x => ids.Contains(x.Id)).Select(x => new FlowTaskEntity() { Id = x.Id, Status = x.Status }).ToListAsync(); list.ForEach(item => { if (flowTaskList.Any(x => x.Id.Equals(item[primaryKey].ToString()))) { var flowTask = flowTaskList.Where(x => x.Id.Equals(item[primaryKey].ToString())).FirstOrDefault(); item["flowState"] = flowTask.Status; item["flowState_name"] = flowTask.Status; } else { item["flowState"] = 0; item["flowState_name"] = 0; } }); } // 转换列表数据 foreach (Dictionary? dataMap in list) { var oldDataMap = dataMap.Copy(); if (mainData != null) oldDataMap.Add("JnpfKeyConst_MainData", mainData); if (dataMap.ContainsKey(primaryKey)) dataMap["id"] = dataMap[primaryKey].ToString(); // 主键 int dicCount = dataMap.Keys.Count; string[] strKey = new string[dicCount]; dataMap.Keys.CopyTo(strKey, 0); // 处理有缓存 for (int i = 0; i < strKey.Length; i++) { if (!(dataMap[strKey[i]] is null)) { FieldsModel? form = formData.Where(f => f.__vModel__ == strKey[i]).FirstOrDefault(); if (form != null) { if (form.__vModel__.Contains(form.__config__.jnpfKey + "Field")) dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], form); else dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], form, actionType); string? jnpfKey = form.__config__.jnpfKey; KeyValuePair templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + _userManager.TenantId + "_" + form.__config__.renderKey + "_" + strKey[i])).FirstOrDefault(); #region 处理 单独存储缓存 if (jnpfKey == JnpfKeyConst.USERSELECT) { templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_userSelect")).FirstOrDefault(); if (!templateData.ContainsKey(form.__config__.renderKey + "_" + strKey[i])) templateData.Add(form.__config__.renderKey + "_" + strKey[i], string.Empty); } if (jnpfKey == JnpfKeyConst.USERSSELECT) { templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_usersSelect")).FirstOrDefault(); if (!templateData.ContainsKey(form.__config__.renderKey + "_" + strKey[i])) templateData.Add(form.__config__.renderKey + "_" + strKey[i], string.Empty); } if (jnpfKey == JnpfKeyConst.ADDRESS) { templateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_address1")).FirstOrDefault(); if (!templateData.ContainsKey(form.__config__.renderKey + "_" + strKey[i])) templateData.Add(form.__config__.renderKey + "_" + strKey[i], string.Empty); } #endregion // 转换后的数据值 object? dataDicValue = dataMap[strKey[i]]; if (templateValue.Key != null && !(dataDicValue is null) && dataDicValue.ToString() != "[]") { IEnumerable? moreValue = dataDicValue as IEnumerable; if (dataDicValue.IsNullOrEmpty()) jnpfKey = string.Empty; // 空数据直接赋值 // 不是List数据直接赋值 用逗号切割成 List if (moreValue == null && !dataDicValue.ToString().Contains("[")) moreValue = dataDicValue.ToString().Split(","); if (moreValue == null && dataDicValue.ToString().Contains("[[")) moreValue = dataDicValue.ToString().ToObject>>(); if (moreValue == null && dataDicValue.ToString().Contains("[")) moreValue = dataDicValue.ToString().ToObject>(); if (string.IsNullOrWhiteSpace(form.separator)) form.separator = ","; switch (jnpfKey) { case JnpfKeyConst.COMSELECT: { var currOrganizeValues = new List>(); if (form.multiple) currOrganizeValues = moreValue != null ? moreValue.ToJsonString().ToObject>>() : dataDicValue.ToString().ToObject>>(); else currOrganizeValues.Add(moreValue != null ? moreValue.ToJsonString().ToObject>() : dataDicValue.ToString().ToObject>()); var addNames = new List(); if (comselectTemplateValue.Count < 1) comselectTemplateValue = templateValue.Value.ToJsonString().ToObject>>(); foreach (var item in currOrganizeValues) { var addName = new List(); foreach (var it in item) { var currOrganizeData = comselectTemplateValue.Where(a => a.ContainsKey(it.ToString())).FirstOrDefault(); if (currOrganizeData != null) addName.Add(currOrganizeData[it.ToString()].LastOrDefault()); } addNames.Add(string.Join("/", addName)); } if (addNames.Any()) dataMap[strKey[i]] = string.Join(form.separator, addNames); } break; case JnpfKeyConst.ADDRESS: { var addressValues = new List>(); if (form.multiple) addressValues = dataDicValue.ToJsonString().ToObject>>(); else addressValues.Add(dataDicValue.ToJsonString().ToObject>()); var addNames = new List(); if (addressTemplateValue.Count < 1) addressTemplateValue = templateValue.Value.ToObject>>(); if (form.level == 3 && streetTemplateValue.Count < 1) streetTemplateValue = templateData.Where(t => t.Key.Equals(CommonConst.VISUALDEV + "_address2")).FirstOrDefault().Value.ToObject>>(); foreach (var item in addressValues) { if (item.Any()) { var value = addressTemplateValue.Where(a => a.ContainsKey(item.LastOrDefault().ToString())).FirstOrDefault(); if (form.level == 3 && value == null) value = streetTemplateValue.Where(a => a.ContainsKey(item.LastOrDefault().ToString())).FirstOrDefault(); if (value != null) addNames.Add(value[item.LastOrDefault().ToString()]); } } if (addNames.Count != 0) dataMap[strKey[i]] = string.Join(form.separator, addNames); } break; case JnpfKeyConst.CURRORGANIZE: { if (currOrganizeTemplateValue.Count < 1) currOrganizeTemplateValue = templateValue.Value.ToJsonString().ToObject>>(); var valueId = currOrganizeTemplateValue.Where(x => x.Keys.Contains(dataDicValue.ToString())).FirstOrDefault(); if (valueId != null) { if (form.showLevel == "all") { var cascaderData = valueId[dataDicValue.ToString()]; if (cascaderData != null && !string.IsNullOrWhiteSpace(cascaderData.FirstOrDefault())) { var treeFullName = new List(); cascaderData.FirstOrDefault()?.Split(',').ToList().ForEach(item => { treeFullName.Add(currOrganizeTemplateValue.Find(x => x.Keys.Contains(item)).FirstOrDefault().Value?.LastOrDefault()); }); dataMap[strKey[i]] = string.Join("/", treeFullName); } else { dataMap[strKey[i]] = string.Empty; } } else { var cascaderData = valueId[dataDicValue.ToString()]; if (cascaderData != null && cascaderData[1] == "department") dataMap[strKey[i]] = valueId[dataDicValue.ToString()]?.LastOrDefault(); else dataMap[strKey[i]] = string.Empty; } } else { dataMap[strKey[i]] = string.Empty; } } break; case JnpfKeyConst.DEPSELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(depselectTemplateValue, templateValue, moreValue, form); break; case JnpfKeyConst.USERSELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(userselectTemplateValue, templateValue, moreValue, form); break; case JnpfKeyConst.USERSSELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(usersselectTemplateValue, templateValue, moreValue, form); break; case JnpfKeyConst.POSSELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(posselectTemplateValue, templateValue, moreValue, form); break; case JnpfKeyConst.RADIO: dataMap[strKey[i]] = GetTemplateDataValueByKey(radioTemplateValue, templateValue, moreValue, form, formData, oldDataMap); break; case JnpfKeyConst.CHECKBOX: dataMap[strKey[i]] = GetTemplateDataValueByKey(checkboxTemplateValue, templateValue, moreValue, form, formData, oldDataMap); break; case JnpfKeyConst.SELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(selectTemplateValue, templateValue, moreValue, form, formData, oldDataMap); break; case JnpfKeyConst.TREESELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(treeSelectTemplateValue, templateValue, moreValue, form, formData, oldDataMap); break; case JnpfKeyConst.CASCADER: dataMap[strKey[i]] = GetTemplateDataValueByKey(cascaderTemplateValue, templateValue, moreValue, form, formData, oldDataMap); break; case JnpfKeyConst.GROUPSELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(groupTemplateValue, templateValue, moreValue, form); break; case JnpfKeyConst.ROLESELECT: dataMap[strKey[i]] = GetTemplateDataValueByKey(roleTemplateValue, templateValue, moreValue, form); break; default: { if (jnpfKey.IsNotEmptyOrNull()) { if (!templateValues.ContainsKey(strKey[i])) templateValues.Add(strKey[i], templateValue.Value.ToJsonString().ToObject>>()); var convertData = templateValues[strKey[i]].Where(t => t.ContainsKey(dataMap[strKey[i]].ToString())).FirstOrDefault(); if (convertData != null) dataMap[strKey[i]] = convertData.Values.FirstOrDefault().ToString(); } else { dataMap[strKey[i]] = string.Empty; } } break; } } } } } // 剪掉有缓存的,获取无缓存的 继续解析 List? record = dataMap.Keys.Except(templateData.Keys.Select(x => x = x.Substring(14, x.Length - 14))).ToList(); // 针对有表的模板去除"rownum,主键" record.RemoveAll(r => r == "ROWNUM"); record.RemoveAll(r => r == primaryKey); foreach (string? key in record) { if (!(dataMap[key] is null) && dataMap[key].ToString() != string.Empty) { var dataValue = dataMap[key]; var model = formData.Where(f => f.__vModel__ == key).FirstOrDefault(); if (model != null) { ConfigModel configModel = model.__config__; string type = configModel.jnpfKey; if (string.IsNullOrWhiteSpace(model.separator)) model.separator = ","; switch (type) { case JnpfKeyConst.SWITCH: // switch开关 dataMap[key] = dataMap[key].ParseToInt() == 0 ? model.inactiveTxt : model.activeTxt; break; case JnpfKeyConst.DATERANGE: // 日期范围 case JnpfKeyConst.TIMERANGE: // 时间范围 dataMap[key] = QueryDateTimeToString(dataValue, model.format, model.format); break; case JnpfKeyConst.DATE: // 日期选择 { string value = string.Empty; var keyValue = dataMap[key].ToString(); DateTime dtDate; if (DateTime.TryParse(keyValue, out dtDate)) value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue); else value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue.ParseToDateTime()); if (!string.IsNullOrEmpty(model.format)) { value = string.Format("{0:" + model.format + "}", Convert.ToDateTime(value)); } else { switch (model.type) { case "date": value = string.Format("{0:yyyy-MM-dd}", Convert.ToDateTime(value)); break; default: value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Convert.ToDateTime(value)); break; } } dataMap[key] = value; } break; case JnpfKeyConst.TIME: // 日期选择 { string value = string.Empty; var keyValue = dataMap[key].ToString(); DateTime dtDate; if (DateTime.TryParse(keyValue, out dtDate)) value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue); else value = string.Format("{0:yyyy-MM-dd HH:mm:ss} ", keyValue.TimeStampToDateTime()); if (!string.IsNullOrEmpty(model.format)) value = string.Format("{0:" + model.format + "}", Convert.ToDateTime(value)); else value = dataMap[key].ToString(); dataMap[key] = value; } break; case JnpfKeyConst.CURRDEPT: dataMap[key] = await _memCache.GetOrCreateAsync($"organizeId_{dataValue}", async entry => { entry.SlidingExpiration = TimeSpan.FromSeconds(60); return (await _sugar.Queryable().FirstAsync(x => x.Id == dataValue.ToString()))?.FullName; }); break; case JnpfKeyConst.MODIFYUSER: case JnpfKeyConst.CREATEUSER: dataMap[key] = await _memCache.GetOrCreateAsync($"userId_{dataValue}", async entry => { entry.SlidingExpiration = TimeSpan.FromSeconds(60); return await _sugar.Queryable().Where(x => x.Id == dataValue.ToString()).Select(x => SqlFunc.MergeString(x.RealName, "/", x.Account)).FirstAsync(); }); break; case JnpfKeyConst.MODIFYTIME: case JnpfKeyConst.CREATETIME: dataMap[key] = string.Format("{0:yyyy-MM-dd HH:mm:ss}", dataMap[key].ToString().ParseToDateTime()); break; case JnpfKeyConst.CURRPOSITION: dataMap[key] = await _memCache.GetOrCreateAsync($"positionId_{dataValue}", async entry => { entry.SlidingExpiration = TimeSpan.FromSeconds(60); return (await _sugar.Queryable().FirstAsync(x => x.Id == dataValue.ToString()))?.FullName; }); break; case JnpfKeyConst.POPUPTABLESELECT: case JnpfKeyConst.POPUPSELECT: { // 获取远端数据 var dynamic = await _dataInterfaceService.GetInfo(model.interfaceId); if (dynamic == null) break; List> popupselectDataList = new List>(); var redisName = CommonConst.VISUALDEV + _userManager.TenantId + "_" + model.__config__.jnpfKey + "_" + model.__config__.renderKey; if (_cacheManager.Exists(redisName)) { popupselectDataList = _cacheManager.Get(redisName).ToObject>>(); } else { switch (dynamic.DataType) { case 1: // SQL数据 { _dataInterfaceService.ReplaceParameterValue(dynamic, new Dictionary()); var pObj = await _dataInterfaceService.GetData(dynamic); popupselectDataList = pObj.ToJsonString().ToObject>>(); } break; case 2: // 静态数据 { var children = model.props.props.children; foreach (var data in JValue.Parse(dynamic.Query)) { popupselectDataList.Add(new Dictionary() { { data.Value(model.props.props.value), data.Value(model.props.props.label) } }); if (data.Value(children) != null && data.Value(children).ToString() != "") popupselectDataList.AddRange(GetDynamicInfiniteData(data.Value(children).ToString(), model.props.props)); } } break; case 3: // Api数据 { var result = await GetApiDataByTypePreview(dynamic); // 请求接口 popupselectDataList = result.ContainsKey("list") ? result["list"].ToObject>>() : new List>(); if ((popupselectDataList == null || !popupselectDataList.Any()) && result.ContainsKey("data")) popupselectDataList = result["data"].ToObject>().ContainsKey("list") ? result["data"]["list"].ToObject>>() : new List>(); } break; } _cacheManager.Set(redisName, popupselectDataList.ToList(), TimeSpan.FromMinutes(10)); // 缓存10分钟 popupselectDataList = _cacheManager.Get(redisName).ToObject>>(); } switch (dynamic.DataType) { case 1: // SQL数据 { var specificData = popupselectDataList.Where(it => it.ContainsKey(model.propsValue) && it.ContainsValue(dataMap[key].ToString())).FirstOrDefault(); if (specificData != null) { // 要用模板的 “显示字段 - relationField”来展示数据 if (model.relationField.IsNullOrEmpty()) { var showField = model.columnOptions.First(); dataMap[key] = specificData[showField.value]; } else { dataMap[key + "_id"] = dataValue; dataMap[key] = specificData[model.relationField]; } } else { if (model.multiple) { var nameList = new List(); dataMap[key].ToObject>().ForEach(strIt => { var specificData = popupselectDataList.Where(it => it.ContainsKey(model.propsValue) && it.ContainsValue(strIt)).FirstOrDefault(); if (specificData != null) { // 要用模板的 “显示字段 - relationField”来展示数据 if (model.relationField.IsNullOrEmpty()) { var showField = model.columnOptions.First(); nameList.Add(specificData[showField.value]); } else { nameList.Add(specificData[model.relationField]); } } }); if (nameList.Any()) { dataMap[key] = string.Join(model.separator, nameList); dataMap[key + "_id"] = dataValue; } } else { dataMap[key] = dataMap[key].ToString().Contains("[") ? string.Join(model.separator, dataMap[key].ToObject>()) : dataMap[key]; } } } break; case 2: // 静态数据 { List dataList = dataMap[key].ToJsonString().ToObject>(); List cascaderList = new List(); foreach (var items in dataList) { var vara = popupselectDataList.Where(a => a.ContainsValue(items)).FirstOrDefault(); if (vara != null) cascaderList.Add(vara[model.props.props.label]); } dataMap[key + "_id"] = dataValue; if (actionType == "List") dataMap[key] = string.Join(model.separator, cascaderList); else dataMap[key] = cascaderList; } break; case 3: // Api数据 { List cascaderList = new List(); if (model.multiple && popupselectDataList != null) { popupselectDataList.ForEach(obj => { dataValue.ToObject>().ForEach(str => { if (obj[model.propsValue] == str) cascaderList.Add(obj[model.relationField]); }); }); } else if (popupselectDataList != null) { popupselectDataList.ForEach(obj => { if (obj[model.propsValue] == dataValue.ToString()) cascaderList.Add(obj[model.relationField]); }); } dataMap[key + "_id"] = dataValue; dataMap[key] = string.Join(model.separator, cascaderList); } break; } } break; case JnpfKeyConst.RELATIONFORM: // 关联表单 { List> relationFormDataList = new List>(); var redisName = CommonConst.VISUALDEV + _userManager.TenantId + "_" + model.__config__.jnpfKey + "_" + model.__config__.renderKey; if (_cacheManager.Exists(redisName)) { relationFormDataList = _cacheManager.Get(redisName).ToObject>>(); } else { // 根据可视化功能ID获取该模板全部数据 var relationFormModel = await _sugar.Queryable().FirstAsync(v => v.Id == model.modelId); var newFieLdsModelList = relationFormModel.FormData.ToObject().fields.FindAll(x => model.relationField.Equals(x.__vModel__)); VisualDevModelListQueryInput listQueryInput = new VisualDevModelListQueryInput { dataType = "1", sidx = columnDesign.defaultSidx, sort = columnDesign.sort, pageSize = 999999 }; Scoped.Create(async (_, scope) => { var services = scope.ServiceProvider; var _runService = App.GetService(services); var res = await _runService.GetRelationFormList(relationFormModel, listQueryInput); _cacheManager.Set(redisName, res.list.ToList(), TimeSpan.FromMinutes(10)); // 缓存10分钟 }); var cacheStr = _cacheManager.Get(redisName); if (cacheStr.IsNotEmptyOrNull()) relationFormDataList = _cacheManager.Get(redisName).ToObject>>(); } var relationFormRealData = relationFormDataList.Where(it => it["id"].Equals(dataMap[key])).FirstOrDefault(); if (relationFormRealData != null && relationFormRealData.Count > 0) { dataMap[key + "_id"] = relationFormRealData["id"]; dataMap[key] = relationFormRealData.ContainsKey(model.relationField) ? relationFormRealData[model.relationField] : string.Empty; } else { dataMap[key] = string.Empty; } } break; } } } } } return list; } /// /// 从缓存读取数据,根据Key. /// /// 控件对应的缓存 /// 所有的缓存 /// 要转换的key /// 组件 /// 所有组件(控件联动会用到) /// 当前行数据(控件联动会用到) /// private string GetTemplateDataValueByKey(List> keyTData, KeyValuePair tValue, IEnumerable mValue, FieldsModel? form, List? fieldList = null, Dictionary? dataMap = null) { List? data = new List(); if (keyTData.Count < 1) keyTData = tValue.Value.ToObject>>(); if (form != null && form.props != null && form.props.props != null && form.props.props.multiple) { foreach (object? item in mValue) { List? sb = new List(); item.ToJsonString().ToObject>().ForEach(items => { var cascaderData = keyTData.Where(c => c.ContainsKey(items)).FirstOrDefault(); if (cascaderData != null) sb.Add(cascaderData[items]); }); if (sb.Count != 0) data.Add(string.Join("/", sb)); else data.Add(item.ToString()); } } else if (form.IsNotEmptyOrNull() && form.__config__.IsNotEmptyOrNull() && form.__config__.props.IsNotEmptyOrNull() && form.__config__.props.value.IsNotEmptyOrNull() && form.__config__.props.label.IsNotEmptyOrNull()) { foreach (object? item in mValue) { var itemData = keyTData.FirstOrDefault(x => (x.ContainsKey(form.__config__.props.value) && x.ContainsValue(item.ToString())) || x.ContainsKey(item.ToString())); if (itemData != null) data.Add(itemData.First().Value); else data.Add(item.ToString()); } } else { foreach (object? item in mValue) { Dictionary? comData = keyTData.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault(); if (comData != null) data.Add(comData[item.ToString()]); else data.Add(item.ToString()); } } // 控件联动 if (data.ToJsonString().Equals(mValue.ToJsonString()) && (form.__config__.templateJson != null && form.__config__.templateJson.Any())) { data.Clear(); form.__config__.templateJson.ForEach(x => { if (x.relationField.ToLower().Contains("tablefield") && x.relationField.Contains("-")) { var rField = x.relationField.Split("-").Last(); if (dataMap.ContainsKey(rField)) x.defaultValue = dataMap[rField] != null ? dataMap[rField]?.ToString() : x.defaultValue; } else { if (dataMap.ContainsKey(x.relationField)) { x.defaultValue = dataMap[x.relationField] != null ? dataMap[x.relationField]?.ToString() : x.defaultValue; } else if (dataMap.ContainsKey("JnpfKeyConst_MainData")) { var mainData = dataMap["JnpfKeyConst_MainData"].ToObject>(); if (mainData.ContainsKey(x.relationField)) x.defaultValue = mainData[x.relationField] != null ? mainData[x.relationField]?.ToString() : x.defaultValue; } } }); _databaseService.ChangeDataBase(_databaseService.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName)); var res = _dataInterfaceService.GetResponseByType(form.__config__.propsUrl, 0, string.Empty, new Common.Dtos.VisualDev.VisualDevDataFieldDataListInput() { paramList = form.__config__.templateJson.Adapt>(), pageSize = 500, currentPage = 1 }).Result; var resList = res.ToObject>>(); if (resList != null && resList.list.Any()) { foreach (object? item in mValue) { var comData = resList.list.Where(a => a.ContainsValue(item.ToString())).FirstOrDefault(); var props = form.__config__.props != null ? form.__config__.props.label : form.props.props.label; if (comData != null) data.Add(comData[props].ToString()); else data.Add(item.ToString()); } } } return string.Join(form.separator, data); } /// /// 查询时间转成设定字符串. /// /// private List QueryDateTimeToString(object value, string format1, string format2) { List? jsonArray = value.ToJsonString().ToObject>(); string value1 = string.Format("{0:" + format1 + "}", jsonArray.FirstOrDefault().ParseToDateTime()); string value2 = string.Format("{0:" + format2 + "}", jsonArray.LastOrDefault().ParseToDateTime()); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2); return jsonArray; } #endregion #region 公用方法 /// /// 解析 处理 条形码和二维码. /// /// /// /// public void GetBARAndQR(List fieldsModels, Dictionary _newDataMap, Dictionary _dataMap) { fieldsModels.Where(x => x.__config__.jnpfKey == "barcode" || x.__config__.jnpfKey == "qrcode").Where(x => !string.IsNullOrWhiteSpace(x.relationField)).ToList().ForEach(item => { if (!_newDataMap.ContainsKey(item.relationField + "_id") && _dataMap.ContainsKey(item.relationField)) _newDataMap.Add(item.relationField + "_id", _dataMap[item.relationField]); }); } /// /// 获取弹窗选择 数据列表. /// /// /// /// public async Task>?> GetPopupSelectDataList(string interfaceId, FieldsModel model) { List>? result = new List>(); // 获取远端数据 DataInterfaceEntity? dynamic = await _dataInterfaceService.GetInfo(interfaceId); if (dynamic == null) return null; switch (dynamic.DataType) { case 1: // SQL数据 { _dataInterfaceService.ReplaceParameterValue(dynamic, new Dictionary()); System.Data.DataTable? pObj = await _dataInterfaceService.GetData(dynamic); result = pObj.ToJsonString().ToObject>>(); } break; case 2: // 静态数据 { List> dynamicList = new List>(); string? value = model.props.props.value; string? label = model.props.props.label; string? children = model.props.props.children; foreach (JToken? data in JToken.Parse(dynamic.Query)) { Dictionary dic = new Dictionary(); dic[value] = data.Value(value); dic[label] = data.Value(label); dynamicList.Add(dic); if (data.Value(children) != null && data.Value(children).ToString() != string.Empty) { dynamicList.AddRange(GetDynamicInfiniteData(data.Value(children).ToString(), model.props.props)); } } result = dynamicList; } break; case 3: // Api数据 { string? response = await new HttpRequestPart().SetRequestUrl(dynamic.Path).GetAsStringAsync(); // 请求接口 RESTfulResult? res = response.ToObject>(); result = res.data?.ToString().ToObject>>>().FirstOrDefault().Value; } break; default: break; } return result; } #endregion #region 私有方法 /// /// 获取动态无限级数据. /// /// /// /// private List> GetDynamicInfiniteData(string data, PropsBeanModel props) { List> list = new List>(); string? value = props.value; string? label = props.label; string? children = props.children; foreach (JToken? info in JToken.Parse(data)) { Dictionary dic = new Dictionary(); dic[info.Value(value)] = info.Value(label); list.Add(dic); if (info.Value(children) != null && info.Value(children).ToString() != string.Empty) list.AddRange(GetDynamicInfiniteData(info.Value(children).ToString(), props)); } return list; } /// /// 根据不同规则请求接口(预览). /// /// /// private async Task GetApiDataByTypePreview(DataInterfaceEntity entity) { var result = new JObject(); var parameters = entity.RequestParameters.ToObject>(); var parametersHerader = entity.RequestHeaders.ToObject>(); var dic = new Dictionary(); var dicHerader = new Dictionary(); dicHerader.Add("JNPF_API", true); if (_userManager.ToKen != null && !_userManager.ToKen.Contains("::")) dicHerader.Add("Authorization", _userManager.ToKen); foreach (var key in parameters) { dic.Add(key.field, key.defaultValue); } foreach (var key in parametersHerader) { dicHerader[key.field] = key.defaultValue; } switch (entity.RequestMethod) { case "6": result = (await entity.Path.SetHeaders(dicHerader).SetQueries(dic).GetAsStringAsync()).ToObject(); break; case "7": result = (await entity.Path.SetHeaders(dicHerader).SetBody(dic).PostAsStringAsync()).ToObject(); break; } return result; } #endregion }