using NCC.Dependency; using NCC.VisualDev.Entitys; using NCC.VisualDev.Entitys.Dto.VisualDevModelData; using NCC.VisualDev.Run.Interfaces; using NCC.Common.Helper; using NCC.VisualDev.Entitys.Model.VisualDevModelData; using NCC.Common.Core.Manager; using NCC.System.Interfaces.System; using NCC.System.Interfaces.Permission; using NCC.JsonSerialization; using NCC.VisualDev.Entitys.Entity; using NCC.System.Entitys.Model.System.DataBase; using NCC.Common.Extension; using NCC.Common.Filter; using NCC.Common.Const; using NCC.VisualDev.Entitys.Enum.VisualDevModelData; using NCC.System.Entitys.System; using NCC.FriendlyException; using NCC.Common.Enum; using Newtonsoft.Json.Linq; using NCC.Common.Model; using System; using System.Text; using System.Threading.Tasks; using System.Linq; using System.Collections.Generic; using SqlSugar; using Yitter.IdGenerator; using NCC.ClayObject.Extensions; using Newtonsoft.Json; namespace NCC.VisualDev.Core { /// /// 在线开发运行服务 /// public class RunService : IRunService, ITransient { private readonly ISqlSugarRepository _visualDevModelDataRepository; private readonly ISqlSugarRepository _visualDevRepository; private readonly IBillRullService _billRuleService; private readonly IOrganizeService _organizeService; private readonly IDepartmentService _departmentService; private readonly IUsersService _userService; private readonly IPositionService _positionService; private readonly IDataBaseService _databaseService; private readonly IDbLinkService _dbLinkService; private readonly ISysCacheService _sysCacheService; private readonly IDictionaryDataService _dictionaryDataService; private readonly IDataInterfaceService _dataInterfaceService; private readonly IDictionaryTypeService _dictionaryTypeService; private readonly IProvinceService _provinceService; private readonly IUserManager _userManager; // 用户管理 /// /// 初始化一个类型的新实例 /// public RunService(ISqlSugarRepository visualDevModelDataRepository, ISqlSugarRepository visualDevRepository, IUserManager userManager, IBillRullService billRuleService, IOrganizeService organizeService, IUsersService userService, IPositionService positionService, IDataBaseService databaseService, IDbLinkService dbLinkService, ISysCacheService sysCacheService, IDictionaryDataService dictionaryDataService, IDataInterfaceService dataInterfaceService, IDictionaryTypeService dictionaryTypeService, IProvinceService provinceService, IDepartmentService departmentService) { _visualDevModelDataRepository = visualDevModelDataRepository; _visualDevRepository = visualDevRepository; _userManager = userManager; _billRuleService = billRuleService; _organizeService = organizeService; _userService = userService; _positionService = positionService; _databaseService = databaseService; _dbLinkService = dbLinkService; _sysCacheService = sysCacheService; _dictionaryDataService = dictionaryDataService; _dataInterfaceService = dataInterfaceService; _dictionaryTypeService = dictionaryTypeService; _provinceService = provinceService; _departmentService = departmentService; } #region Get /// /// 列表数据处理 /// /// /// /// public async Task>> GetListResult(VisualDevEntity entity, VisualDevModelListQueryInput input, string actionType = "List") { var realList = new PageResult>(); realList.list = new List>(); var list = new List(); FormDataModel formDataModel = TemplateKeywordsHelper.ReplaceKeywords(entity.FormData).Deserialize(); List formData = formDataModel.fields; //先模板数据缓存 解开子表无限children formData = TemplateCacheDataConversion(formData); Dictionary templateData = await GetVisualDevTemplateData(entity.Id, formData); formData = formDataModel.fields; //剔除布局控件 formData = TemplateDataConversion(formData); var columnData = TemplateKeywordsHelper.ReplaceKeywords(entity.ColumnData).Deserialize(); //列表主键 var primaryKey = "F_Id"; if (!string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables)) { List mapList = entity.Tables.ToString().Deserialize>(); string mainTable = mapList.Find(m => m.relationTable == "").table; var tableList = new List(); var link = await _dbLinkService.GetInfo(entity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable); var mainPrimary = tableList.Find(t => t.primaryKey == 1); primaryKey = mainPrimary.field; StringBuilder feilds = new StringBuilder(); tableList.ForEach(item => { feilds.AppendFormat("{0},", item.field); }); if (columnData.columnList.Count > 0) { feilds = new StringBuilder(feilds.ToString().TrimEnd(',')); } StringBuilder sql = new StringBuilder(); sql.AppendFormat("select {0} from {1}", feilds, mainTable); realList = _databaseService.GetInterFaceData(link, sql.ToString(), input, columnData, input.menuId); list = GetTableDataList(realList.list.ToList(), primaryKey); } else { list = await GetList(entity.Id); } input.sidx = string.IsNullOrEmpty(input.sidx) ? (columnData.defaultSidx == "" ? primaryKey : columnData.defaultSidx) : input.sidx; //关键字过滤 if (list.Count > 0) { //将查询的关键字json转成Dictionary Dictionary keywordJsonDic = string.IsNullOrEmpty(input.json) ? null : input.json.Deserialize>(); //将关键字查询传输的id转换成名称 Dictionary keyAndList = new Dictionary(); if ((!string.IsNullOrEmpty(entity.Tables) && "[]".Equals(entity.Tables)) || string.IsNullOrEmpty(entity.Tables)) { list = GetNoTableFilteringData(list, keywordJsonDic, formData); keyAndList = await GetKeyData(formData, templateData, null, list, columnData, actionType, entity.WebType.ToInt(), primaryKey); realList.list = GetQueryDataConversion(keyAndList["list"].Serialize().Deserialize>()); //关键字过滤 //realList.list = GetQueryFilteringData(keyAndList["keyJsonMap"].Serialize().Deserialize>(), keyAndList["list"].Serialize().Deserialize>(), columnData); } else { keyAndList = await GetKeyData(formData, templateData, null, list, columnData, actionType, entity.WebType.ToInt(), primaryKey); realList.list = GetQueryDataConversion(keyAndList["list"].Serialize().Deserialize>()); } if (input.sort == "desc") { realList.list = realList.list.OrderByDescending(x => { var dic = x as IDictionary; dic.GetOrAdd(input.sidx, () => null); return dic[input.sidx]; }).ToList(); } else { realList.list = realList.list.OrderBy(x => { var dic = x as IDictionary; dic.GetOrAdd(input.sidx, () => null); return dic[input.sidx]; }).ToList(); } } if (input.dataType == "0") { if (!string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables)) { } else { realList.pagination = new PageResult(); realList.pagination.total = realList.list.Count; realList.pagination.pageSize = input.pageSize; realList.pagination.pageIndex = input.currentPage; realList.list = realList.list.Skip(input.pageSize * (input.currentPage - 1)).Take(input.pageSize).ToList(); } //分组表格 if (columnData.type == 3) { var groupList = columnData.columnList.Where(p => p.prop == columnData.groupField).ToList(); var exceptList = columnData.columnList.Except(groupList).FirstOrDefault(); //分组数据 Dictionary>> groupDic = new Dictionary>>(); foreach (var item in realList.list) { if (item.ContainsKey(columnData.groupField)) { var groupDicKey = item[columnData.groupField] is null ? "" : item[columnData.groupField].ToString(); if (!groupDic.ContainsKey(groupDicKey)) { groupDic.Add(groupDicKey, new List>()); //初始化 } item.Remove(columnData.groupField); groupDic[groupDicKey].Add(item); } else { var groupDicKey = "null"; if (!groupDic.ContainsKey(groupDicKey)) { groupDic.Add(groupDicKey, new List>()); //初始化 } groupDic[groupDicKey].Add(item); } } List> realGroupDic = new List>(); foreach (var item in groupDic) { Dictionary dataMap = new Dictionary(); dataMap.Add("top", true); dataMap.Add("id", YitIdHelper.NextId().ToString()); dataMap.Add("children", DateConver(item.Value)); dataMap.Add(exceptList.prop, item.Key); realGroupDic.Add(dataMap); } realList.list = realGroupDic; } } else { if (!string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables)) { } else { realList.pagination = new PageResult(); realList.pagination.total = realList.list.Count; realList.pagination.pageSize = input.pageSize; realList.pagination.pageIndex = input.currentPage; realList.list = realList.list.ToList(); } } realList.list = DateConver(realList.list); return realList; } /// /// 获取表主键 /// /// /// public async Task GetTablePrimary(VisualDevEntity entity) { var primaryKey = "F_Id"; if (!string.IsNullOrEmpty(entity.Tables) && !"[]".Equals(entity.Tables))// { List mapList = entity.Tables.ToString().Deserialize>(); string mainTable = mapList.Find(m => m.relationTable == "").table; var tableList = new List(); var link = await _dbLinkService.GetInfo(entity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable); var mainPrimary = tableList.Find(t => t.primaryKey == 1); primaryKey = mainPrimary.field; } return primaryKey; } /// /// 获取模型数据信息 /// /// /// public async Task GetInfo(string id) { return await _visualDevModelDataRepository.SingleAsync(m => m.Id == id); } /// /// 获取无表详情转换 /// /// 模板实体 /// 真实数据 /// public async Task GetIsNoTableInfo(VisualDevEntity templateEntity, string data) { var formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject(); var modelList = formData.fields; //获取Redis缓存模板数据 var templateData = await GetVisualDevTemplateData(templateEntity.Id, modelList); data = await GetSystemComponentsData(modelList, templateData, data); return data; } /// /// 获取有表详情转换 /// /// 主键 /// 模板实体 /// public async Task GetHaveTableInfo(string id, VisualDevEntity templateEntity) { FormDataModel formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject(); List modelList = formData.fields.ToList(); //剔除无限极 modelList = TemplateDataConversion(modelList); List tableMapList = templateEntity.Tables.ToObject>(); StringBuilder mainfeild = new StringBuilder(); StringBuilder mainSql = new StringBuilder(); var mainTable = tableMapList.Find(m => m.relationTable == ""); var tableList = new List(); var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable.table); var mainPrimary = tableList.Find(t => t.primaryKey == 1); mainSql.AppendFormat("select * from {0} where {2}='{1}';", mainTable.table, id, mainPrimary.field); var mainData = _databaseService.GetInterFaceData(link, mainSql.ToString()).Serialize().Deserialize>>(); List> mainMap = GetTableDataInfoByTimeStamp(mainData, modelList, "update"); //记录全部主表数据 Dictionary dataMap = mainMap.FirstOrDefault(); Dictionary newDataMap = new Dictionary(); foreach (var model in modelList) { if (!string.IsNullOrEmpty(model.__vModel__)) { if ("table".Equals(model.__config__.NCCKey)) { StringBuilder feilds = new StringBuilder(); List childModelList = model.__config__.children; foreach (var childModel in childModelList) { feilds.Append(childModel.__vModel__ + ","); } if (childModelList.Count > 0) { feilds = new StringBuilder(feilds.ToString().TrimEnd(',')); } //子表字段 string relationFeild = ""; //主表字段 string relationMainFeild = ""; string relationMainFeildValue = ""; //查询子表数据 StringBuilder childSql = new StringBuilder(); childSql.Append("select " + feilds + " from " + model.__config__.tableName + " where 1=1 "); foreach (var tableMap in tableMapList) { if (tableMap.table.Equals(model.__config__.tableName)) { relationFeild = tableMap.tableField; relationMainFeild = tableMap.relationField; if (dataMap.ContainsKey(relationMainFeild)) { relationMainFeildValue = dataMap[relationMainFeild].ToString(); childSql.Append(@" And " + relationFeild + "='" + relationMainFeildValue + "'"); } var childData = _databaseService.GetInterFaceData(link, childSql.ToString()).Serialize().Deserialize>>(); var childTableData = GetTableDataInfoByTimeStamp(childData, model.__config__.children, "update"); if (childTableData.Count > 0) { newDataMap[model.__vModel__] = childTableData; } } } } else { mainfeild.Append(model.__vModel__ + ","); } } } if (modelList.Count > 0) { mainfeild = new StringBuilder(mainfeild.ToString().TrimEnd(',')); } int dicCount = newDataMap.Keys.Count; string[] strKey = new string[dicCount]; newDataMap.Keys.CopyTo(strKey, 0); for (int i = 0; i < strKey.Length; i++) { var model = modelList.Where(m => m.__vModel__ == strKey[i]).FirstOrDefault(); if (model != null) { List> tables = newDataMap[strKey[i]].ToObject>>(); List> newTables = new List>(); foreach (var item in tables) { Dictionary dic = new Dictionary(); foreach (var value in item) { var child = model.__config__.children.Find(c => c.__vModel__ == value.Key); if (child != null) { dic.Add(value.Key, value.Value); } } newTables.Add(dic); } if (newTables.Count > 0) { newDataMap[strKey[i]] = newTables; } } } foreach (var entryMap in dataMap) { if (entryMap.Value != null) { var model = modelList.Where(m => m.__vModel__ == entryMap.Key.ToString()).FirstOrDefault(); if (model != null) { if (entryMap.Key.Equals(model.__vModel__)) { if (mainfeild.ToString().Contains(entryMap.Key)) { newDataMap[entryMap.Key] = entryMap.Value; } } } } } return await GetTableInfoBySystemComponentsData(templateEntity.Id, modelList, newDataMap.Serialize()); } /// /// 获取有表详情转换 /// /// 主键 /// 模板实体 /// public async Task GetHaveTableInfoDetails(string id, VisualDevEntity templateEntity, bool isFlowTask = false) { FormDataModel formData = !isFlowTask ? TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject() : templateEntity.FormData.ToObject(); List modelList = formData.fields; //先模板数据缓存 解开子表无限children modelList = TemplateCacheDataConversion(modelList); Dictionary templateData = await GetVisualDevTemplateData(templateEntity.Id, modelList); //再将模板数据还原回原始结构 modelList = formData.fields.ToList(); var columnData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.ColumnData).Deserialize(); //解开模板样式控件 modelList = TemplateDataConversion(modelList); List tableMapList = templateEntity.Tables.ToObject>(); StringBuilder mainfeild = new StringBuilder(); StringBuilder mainSql = new StringBuilder(); var mainTable = tableMapList.Find(m => m.relationTable == ""); var tableList = new List(); var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable.table); var mainPrimary = tableList.Find(t => t.primaryKey == 1); mainSql.AppendFormat("select * from {0} where {2}='{1}';", mainTable.table, id, mainPrimary.field); var mainData = _databaseService.GetInterFaceData(link, mainSql.ToString()).ToObeject>>(); List> mainMap = GetTableDataInfo(mainData, modelList, "detail"); //记录全部主表数据 Dictionary dataMap = mainMap.FirstOrDefault(); Dictionary newDataMap = new Dictionary(); foreach (var model in modelList) { if (!string.IsNullOrEmpty(model.__vModel__)) { if ("table".Equals(model.__config__.NCCKey)) { StringBuilder feilds = new StringBuilder(); List childModelList = model.__config__.children; foreach (var childModel in childModelList) { feilds.Append(childModel.__vModel__ + ","); } if (childModelList.Count > 0) { feilds = new StringBuilder(feilds.ToString().TrimEnd(',')); } //子表字段 string relationFeild = ""; //主表字段 string relationMainFeild = ""; string relationMainFeildValue = ""; //查询子表数据 StringBuilder childSql = new StringBuilder(); childSql.Append("select " + feilds + " from " + model.__config__.tableName + " where 1=1 "); foreach (var tableMap in tableMapList) { if (tableMap.table.Equals(model.__config__.tableName)) { relationFeild = tableMap.tableField; relationMainFeild = tableMap.relationField; if (dataMap.ContainsKey(relationMainFeild)) { relationMainFeildValue = dataMap[relationMainFeild].ToString(); childSql.Append(@" And " + relationFeild + "='" + relationMainFeildValue + "'"); } var childData = _databaseService.GetInterFaceData(link, childSql.ToString()).Serialize().Deserialize>>(); var childTableData = GetTableDataInfo(childData, model.__config__.children, "transition"); if (childTableData.Count > 0) { newDataMap[model.__vModel__] = childTableData; } } } } else { mainfeild.Append(model.__vModel__ + ","); } } } if (modelList.Count > 0) { mainfeild = new StringBuilder(mainfeild.ToString().TrimEnd(',')); } int dicCount = newDataMap.Keys.Count; string[] strKey = new string[dicCount]; newDataMap.Keys.CopyTo(strKey, 0); for (int i = 0; i < strKey.Length; i++) { var model = modelList.Find(m => m.__vModel__ == strKey[i]); if (model != null) { List childModelData = new List(); List> tables = newDataMap[strKey[i]].ToObject>>(); List> newTables = new List>(); foreach (var item in tables) { Dictionary dic = new Dictionary(); foreach (KeyValuePair value in item) { var child = model.__config__.children.Find(c => c.__vModel__ == value.Key); if (child != null && value.Value != null) { var NCCKey = child.__config__.NCCKey; switch (NCCKey) { case "time": dic.Add(value.Key, value.Value); break; case "date": dic.Add(value.Key, Ext.TimeToTimeStamp(value.Value.ToDate())); break; default: dic.Add(value.Key, value.Value); break; } } } childModelData.Add(new VisualDevModelDataEntity() { Id = YitIdHelper.NextId().ToString(), Data = dic.ToJson() }); } if (childModelData.Count > 0) { //将关键字查询传输的id转换成名称 Dictionary childKeyAndList = await GetKeyData(model.__config__.children, templateData, null, childModelData, columnData); foreach (var item in childKeyAndList["list"].ToObject>()) { newTables.Add(item.Data.ToObject>()); } newDataMap[strKey[i]] = newTables; } } } var entity = new VisualDevModelDataEntity() { Id = dataMap[mainPrimary.field].ToString(), Data = dataMap.ToJson() }; List listEntity = new List(); listEntity.Add(entity); //将关键字查询传输的id转换成名称 Dictionary keyAndList = await GetKeyData(modelList, templateData, null, listEntity, columnData, "detail"); var convData = keyAndList["list"].ToObject>().FirstOrDefault().Data.ToObject>(); foreach (var entryMap in convData) { if (entryMap.Value != null) { var model = modelList.Where(m => m.__vModel__.Contains(entryMap.Key.ToString())).FirstOrDefault(); if (model != null) { if (entryMap.Key.Equals(model.__vModel__)) { if (mainfeild.ToString().Contains(entryMap.Key)) { newDataMap[entryMap.Key] = entryMap.Value; } } } else { model = modelList.Where(m => m.__vModel__ == entryMap.Key.ToString().Replace("_id", "")).FirstOrDefault(); if (model != null) { newDataMap[entryMap.Key] = entryMap.Value; } } } } return newDataMap.ToJson(); } /// /// 获取无表信息详情 /// /// 模板实体 /// 真实数据 /// public async Task GetIsNoTableInfoDetails(VisualDevEntity templateEntity, VisualDevModelDataEntity data) { var formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject(); List modelList = formData.fields; //先模板数据缓存 解开子表无限children modelList = TemplateCacheDataConversion(modelList); Dictionary templateData = await GetVisualDevTemplateData(templateEntity.Id, modelList); modelList = formData.fields; //剔除布局控件 modelList = TemplateDataConversion(modelList); //模板分离子表模板 var childTemplateList = modelList.FindAll(m => m.__config__.NCCKey == "table"); //删除模板内子表模板 modelList.RemoveAll(x => x.__config__.NCCKey == "table"); var columnData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.ColumnData).Deserialize(); //获取真实数据 var realData = data.Data.ToObject>(); //数据分离子表数据 var childRealData = realData.Where(p => p.Key.Contains("tableField")); //获取关联表单 var relationFormList = modelList.FindAll(m => m.__config__.NCCKey == "relationForm"); if (relationFormList.Count > 0) { foreach (var item in relationFormList) { realData.Add(item.__vModel__ + "_id", null); } } Dictionary newDataMap = new Dictionary(); //循环子表数据 foreach (var item in childRealData) { realData.Remove(item.Key); List childModelData = new List(); var childTemplate = childTemplateList.Find(c => c.__vModel__ == item.Key); List> tables = item.Value.ToObject>>(); List> newTables = new List>(); if (childTemplate != null) { foreach (var childColumn in tables) { Dictionary dic = new Dictionary(); foreach (KeyValuePair column in childColumn) { var child = childTemplate.__config__.children.Find(c => c.__vModel__ == column.Key); if (child != null && column.Value != null) { dic.Add(column.Key, column.Value); } } childModelData.Add(new VisualDevModelDataEntity() { Id = YitIdHelper.NextId().ToString(), Data = dic.ToJson() }); } if (childModelData.Count > 0) { //将关键字查询传输的id转换成名称 Dictionary childKeyAndList = await GetKeyData(childTemplate.__config__.children, templateData, null, childModelData, columnData); foreach (var items in childKeyAndList["list"].ToObject>()) { newTables.Add(items.Data.ToObject>()); } newDataMap[item.Key] = newTables; } } } var modelData = new VisualDevModelDataEntity() { Id = data.Id.ToString(), Data = realData.ToJson() }; List listEntity = new List(); listEntity.Add(modelData); //将关键字查询传输的id转换成名称 Dictionary keyAndList = await GetKeyData(modelList, templateData, null, listEntity, columnData); var convData = keyAndList["list"].ToObject>().FirstOrDefault().Data.ToObject>(); foreach (var entryMap in convData) { if (entryMap.Value != null) { var model = modelList.Where(m => m.__vModel__ == entryMap.Key.ToString()).FirstOrDefault(); if (model != null) { newDataMap[entryMap.Key] = entryMap.Value; } else { model = modelList.Where(m => m.__vModel__ == entryMap.Key.ToString().Replace("_id", "")).FirstOrDefault(); if (model != null) { newDataMap[entryMap.Key] = entryMap.Value; } } } } return newDataMap.ToJson(); } #endregion #region Post /// /// 创建在线开发功能 /// /// 功能模板实体 /// 数据输入 /// 是否创建新ID /// public async Task Create(VisualDevEntity templateEntity, VisualDevModelDataCrInput dataInput) { if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables)) { var mainId = YitIdHelper.NextId().ToString(); var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); var haveTableSql = await CreateHaveTableSql(templateEntity, dataInput, mainId); try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //新增功能数据 await _databaseService.ExecuteSql(link, haveTableSql); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } else { var allDataMap = dataInput.data.Deserialize>(); var formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).Deserialize(); var fieldsModelList = formData.fields; //剔除布局控件 fieldsModelList = TemplateDataConversion(fieldsModelList); // 生成系统自动生成字段 allDataMap = await GenerateFeilds(fieldsModelList, allDataMap, true); VisualDevModelDataEntity entity = new VisualDevModelDataEntity(); entity.Data = allDataMap.Serialize(); entity.VisualDevId = templateEntity.Id; try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //新增功能数据 var visualDevModelData = await _visualDevModelDataRepository.Context.Insertable(entity).CallEntityMethod(m => m.Creator()).ExecuteReturnEntityAsync(); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } } /// /// 创建有表SQL /// /// /// /// /// public async Task CreateHaveTableSql(VisualDevEntity templateEntity, VisualDevModelDataCrInput dataInput, string mainId) { var allDataMap = dataInput.data.Deserialize>(); var formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).Deserialize(); var fieldsModelList = formData.fields; //剔除布局控件 fieldsModelList = TemplateDataConversion(fieldsModelList); // 生成系统自动生成字段 allDataMap = await GenerateFeilds(fieldsModelList, allDataMap, true); //实例化模板信息 var tableMapList = templateEntity.Tables.Deserialize>(); //获取主表 var mainTable = tableMapList.Find(t => t.relationTable == ""); var tableList = new List(); var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable.table); //分离主子表数据 //先记录子表数据 var childTableDataKey = allDataMap.Where(d => d.Key.Contains("tableField")).Select(d => d.Key).ToList(); //记录主表数据 var mainPrimary = tableList.Find(t => t.primaryKey == 1); var mainTableDataKey = allDataMap.Keys.Except(childTableDataKey).ToList(); //主表字段集合 StringBuilder mainFelid = new StringBuilder(); List mainFelidList = new List(); //主表查询语句 StringBuilder mainSql = new StringBuilder(); StringBuilder mainColumn = new StringBuilder(); StringBuilder mainValues = new StringBuilder(); //子表查询语句 StringBuilder childSql = new StringBuilder(); //拼接主表查询语句 var mainFields = mainTable.fields; foreach (var item in mainTableDataKey) { var mainField = mainFields.Where(f => f.Field == item).FirstOrDefault(); if (mainField != null) { var allMap = allDataMap[item]; if (allMap != null && !string.IsNullOrEmpty(allMap.ToString()) && allMap.ToString() != "[]") { //Column部分 mainColumn.AppendFormat("{0},", item); //Values部分 var value = TransformDataObject(allMap, item, fieldsModelList, "create"); mainValues.AppendFormat("'{0}',", value); } } } //去除多余的, if (mainTableDataKey.Count > 0) { mainSql.AppendFormat("insert into {0} ({3}{1}) values('{4}'{2});", mainTable.table, (mainColumn.Length > 0 ? "," : "") + mainColumn.ToString().Trim(','), (mainValues.Length > 0 ? "," : "") + mainValues.ToString().Trim(','), mainPrimary.field, mainId); } //拼接子表sql foreach (var item in childTableDataKey) { //查找到该控件数据 var objectData = allDataMap[item]; var model = objectData.Serialize().Deserialize>>(); if (model.Count > 0) { //利用key去找模板 var fieldsModel = fieldsModelList.Find(f => f.__vModel__ == item); var fieldsConfig = fieldsModel.__config__; model = GetTableDataListByDic(model, fieldsConfig.children); StringBuilder childColumn = new StringBuilder(); StringBuilder childValues = new StringBuilder(); var childTable = tableMapList.Find(t => t.table == fieldsModel.__config__.tableName); tableList = new List(); tableList = _databaseService.GetFieldListByNoAsync(link, childTable.table); var childPrimary = tableList.Find(t => t.primaryKey == 1); foreach (var data in model) { if (data.Count > 0) { foreach (KeyValuePair child in data) { if (child.Value != null && child.Value.ToString() != "[]" && child.Value.ToString() != "") { //Column部分 childColumn.AppendFormat("{0},", child.Key); //Values部分 var value = TransformDataObject(child.Value, child.Key, fieldsConfig.children, "create"); childValues.AppendFormat("'{0}',", value); } } if (!string.IsNullOrEmpty(childColumn.ToString())) { childSql.AppendFormat("insert into {0}({6},{4},{1}) values('{3}','{5}',{2});", fieldsModel.__config__.tableName, childColumn.ToString().Trim(','), childValues.ToString().Trim(','), YitIdHelper.NextId().ToString(), childTable.tableField, mainId, childPrimary.field); } childColumn = new StringBuilder(); childValues = new StringBuilder(); } } } } return mainSql.ToString() + childSql.ToString(); } /// /// 修改 /// /// 修改ID /// /// /// public async Task Update(string id, VisualDevEntity templateEntity, VisualDevModelDataUpInput visualdevModelDataUpForm) { if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables)) { var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); var haveTableSql = await UpdateHaveTableSql(templateEntity, visualdevModelDataUpForm, id); try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //修改功能数据 await _databaseService.ExecuteSql(link, haveTableSql); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } else { Dictionary allDataMap = visualdevModelDataUpForm.data.ToObject>(); FormDataModel formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject(); List fieldsModelList = formData.fields.ToObject>(); fieldsModelList = TemplateDataConversion(fieldsModelList); //生成系统自动生成字段 allDataMap = await GenerateFeilds(fieldsModelList, allDataMap, false); VisualDevModelDataEntity entity = new VisualDevModelDataEntity(); entity.Data = allDataMap.Serialize(); entity.VisualDevId = templateEntity.Id; entity.Id = id; try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //修改功能数据 await _visualDevModelDataRepository.Context.Updateable(entity).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync(); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } } /// /// 修改有表SQL /// /// /// /// /// public async Task UpdateHaveTableSql(VisualDevEntity templateEntity, VisualDevModelDataUpInput visualdevModelDataUpForm, string id) { Dictionary allDataMap = visualdevModelDataUpForm.data.ToObject>(); FormDataModel formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject(); List fieldsModelList = formData.fields.ToObject>(); fieldsModelList = TemplateDataConversion(fieldsModelList); //生成系统自动生成字段 allDataMap = await GenerateFeilds(fieldsModelList, allDataMap, false); List tableMapList = templateEntity.Tables.ToObject>(); //循环表 var mainTable = tableMapList.Where(t => t.relationTable == "").FirstOrDefault(); var tableList = new List(); var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable.table); var mainPrimary = tableList.Find(t => t.primaryKey == 1); StringBuilder delMain = new StringBuilder(); delMain.AppendFormat("delete from {0} where {2}='{1}';", mainTable.table, id, mainPrimary.field); StringBuilder allDelSql = new StringBuilder(); allDelSql.AppendFormat("{0}", delMain.ToString()); StringBuilder queryMain = new StringBuilder(); queryMain.AppendFormat("select * from {0} where {2}='{1}';", mainTable.table, id, mainPrimary.field); var mainData = _databaseService.GetInterFaceData(link, queryMain.ToString()).Serialize().Deserialize>>(); Dictionary mainMap = GetTableDataInfo(mainData, fieldsModelList, "List").FirstOrDefault(); if (tableMapList.Count > 1) { //去除主表,剩余的为子表,再进行子表删除语句生成 tableMapList.RemoveAt(0); foreach (var tableMap in tableMapList) { //主表字段 //与主表关联字段 string relationField = tableMap.relationField; var relationFieldValue = mainMap.Where(f => f.Key == relationField).FirstOrDefault(); //子表字段 string tableField = tableMap.tableField; allDelSql.AppendFormat("delete from {0} where {1}='{2}';", tableMap.table, tableField, relationFieldValue.Value); } } string mainId = id; //分离主子表数据 //先记录子表数据 var childTableDataKey = allDataMap.Where(d => d.Key.Contains("tableField")).Select(d => d.Key).ToList(); //记录主表数据 var mainTableDataKey = allDataMap.Keys.Except(childTableDataKey).ToList(); //实例化模板信息 //主表字段集合 StringBuilder mainFelid = new StringBuilder(); List mainFelidList = new List(); //主表查询语句 StringBuilder mainSql = new StringBuilder(); StringBuilder mainColumn = new StringBuilder(); StringBuilder mainValues = new StringBuilder(); //子表查询语句 StringBuilder childSql = new StringBuilder(); //拼接主表插入语句 var mainFields = mainTable.fields; foreach (var item in mainTableDataKey) { var mainField = mainFields.Where(f => f.Field == item).FirstOrDefault(); if (mainField != null) { var allMap = allDataMap[item]; if (allMap != null && !string.IsNullOrEmpty(allMap.ToString()) && !allMap.ToString().Contains("[]")) { //Column部分 mainColumn.AppendFormat("{0},", item); //Values部分 mainValues.AppendFormat("'{0}',", TransformDataObject(allMap, item, fieldsModelList, "create")); } } } //去除多余的, if (mainTableDataKey.Count > 0) { mainSql.AppendFormat("insert into {0} ({3}{1}) values('{4}'{2});", mainTable.table, (mainColumn.Length > 0 ? "," : "") + mainColumn.ToString().Trim(','), (mainValues.Length > 0 ? "," : "") + mainValues.ToString().Trim(','), mainPrimary.field, mainId); } //拼接子表sql foreach (var item in childTableDataKey) { //查找到该控件数据 var model = allDataMap[item].ToJson().ToList>(); if (model.Count > 0) { //利用key去找模板 var fieldsModel = fieldsModelList.Find(f => f.__vModel__ == item); var fieldsConfig = fieldsModel.__config__; model = GetTableDataListByDic(model, fieldsConfig.children); StringBuilder childColumn = new StringBuilder(); StringBuilder childValues = new StringBuilder(); var childTable = tableMapList.Where(t => t.table == fieldsConfig.tableName).FirstOrDefault(); tableList = new List(); tableList = _databaseService.GetFieldListByNoAsync(link, childTable.table); var childPrimary = tableList.Find(t => t.primaryKey == 1); foreach (var data in model) { if (data.Count > 0) { foreach (KeyValuePair child in data) { if (child.Value != null) { //Column部分 childColumn.AppendFormat("{0},", child.Key); //Values部分 childValues.AppendFormat("'{0}',", TransformDataObject(child.Value, child.Key, fieldsConfig.children, "create")); } } if (!string.IsNullOrEmpty(childColumn.ToString())) { childSql.AppendFormat("insert into {0}({6},{4},{1}) values('{3}','{5}',{2});", fieldsModel.__config__.tableName, childColumn.ToString().Trim(','), childValues.ToString().Trim(','), YitIdHelper.NextId().ToString(), childTable.tableField, mainId, childPrimary.field); } childColumn = new StringBuilder(); childValues = new StringBuilder(); } } } } return allDelSql.ToString() + mainSql.ToString() + childSql.ToString(); } #endregion #region PrivateMethod #region 拆解模板 /// /// 模板缓存数据转换 /// 专门为模板缓存数据,会将子表内的控件全部获取出来 /// 适用场景缓存模板数据 /// /// private List TemplateCacheDataConversion(List fieldsModelList) { var template = new List(); //将模板内的无限children解析出来 //包含子表children foreach (var item in fieldsModelList) { var config = item.__config__; switch (config.NCCKey) { //栅格布局 case "row": { template.AddRange(TemplateCacheDataConversion(config.children)); } break; //表格 case "table": { template.AddRange(TemplateCacheDataConversion(config.children)); } break; //卡片 case "card": { template.AddRange(TemplateCacheDataConversion(config.children)); } break; //折叠面板 case "collapse": { foreach (var collapse in config.children) { template.AddRange(TemplateCacheDataConversion(collapse.__config__.children)); } } break; //tab标签 case "tab": { foreach (var collapse in config.children) { template.AddRange(TemplateCacheDataConversion(collapse.__config__.children)); } } break; //文本 case "NCCText": break; //分割线 case "divider": break; //分组标题 case "groupTitle": break; default: { template.Add(item); } break; } } return template; } #endregion #region 解析模板数据 /// /// 控制模板数据转换 /// /// 数据 /// 数据模板 /// 操作类型(List-列表值,create-创建值,update-更新值,detail-详情值,transition-过渡值,query-查询) /// private object TemplateControlsDataConversion(object data, FieldsModel fieldsModel, string actionType = null) { try { object conversionData = new object(); switch (fieldsModel.__config__.NCCKey) { #region 基础控件 //单行输入 case "comInput": { conversionData = string.IsNullOrEmpty(data.ToString()) ? null : data.ToString(); } break; //多行输入 case "textarea": { conversionData = data.ToString(); } break; //数字输入 case "numInputc": { conversionData = data.ToInt(); } break; //金额输入 case "NCCAmount": { conversionData = data.ToDecimal(); } break; //单选框组 case "radio": { conversionData = string.IsNullOrEmpty(data.ToString()) ? null : data.ToString(); } break; //多选框组 case "checkbox": { if (data.ToString().Contains("[")) conversionData = data.ToString().ToObject>(); else conversionData = data.ToString(); } break; //下拉选择 case "select": { switch (actionType) { case "transition": { conversionData = data; } break; case "List": { if (data.ToString().Contains(",")) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; default: { if (fieldsModel.multiple && actionType != "query") { if (data.ToString().Contains(",")) { conversionData = data.ToString().ToObject>(); } else { conversionData = string.Join(",", data.ToString().Split(',').ToArray()); } } else { conversionData = data.ToString(); } } break; } } break; //时间选择 case "time": { switch (actionType) { case "List": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data); break; case "create": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data); break; case "detail": conversionData = data.ToString(); break; default: conversionData = data.ToString(); break; } } break; //时间范围 case "timeRange": { switch (actionType) { case "List": conversionData = data.ToString().ToObject>(); break; case "create": conversionData = data.ToString().ToObject>(); break; case "transition": conversionData = data; break; case "update": conversionData = data.ToString().ToObject>(); break; } } break; //日期选择 case "date": { switch (actionType) { case "List": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Ext.GetDateTime(data.ToString())); break; case "create": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Ext.GetDateTime(data.ToString())); break; case "detail": conversionData = data.ToString(); break; case "update": conversionData = data; break; default: conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Ext.GetDateTime(data.ToString())); break; } } break; //日期范围 case "dateRange": { switch (actionType) { case "List": conversionData = data.ToString().ToObject>(); break; case "transition": conversionData = data; break; case "create": conversionData = data.ToString().ToObject>(); break; case "update": conversionData = data.ToString().ToObject>(); break; } } break; //创建时间 case "createTime": { switch (actionType) { case "List": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Ext.GetDateTime(data.ToString())); break; case "create": conversionData = data.ToString(); break; case "update": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Ext.GetDateTime(data.ToString())); break; case "detail": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data); break; default: conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data); break; } } break; //修改时间 case "modifyTime": { switch (actionType) { case "List": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Ext.GetDateTime(data.ToString())); break; case "create": conversionData = data.ToString(); break; case "update": conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Ext.GetDateTime(data.ToString())); break; default: conversionData = string.Format("{0:yyyy-MM-dd HH:mm:ss}", data); break; } } break; //文件上传 case "uploadFz": { if (data.ToString() != "[]") { conversionData = data.ToString().ToObject>(); } else { conversionData = null; } } break; //图片上传 case "uploadImg": { if (data.ToString() != "[]") { conversionData = data.ToString().ToObject>(); } else { conversionData = null; } } break; //颜色选择 case "colorPicker": { conversionData = string.IsNullOrEmpty(data.ToString()) ? null : data.ToString(); } break; //评分 case "rate": { conversionData = data.ToInt(); } break; //开关 case "switch": { conversionData = data.ToInt(); } break; //滑块 case "slider": { if (fieldsModel.range) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToInt(); }; } break; ////文本 //case "NCCText": // break; //富文本 case "editor": { conversionData = string.IsNullOrEmpty(data.ToString()) ? null : data.ToString(); } break; //单据组件 case "billRule": { conversionData = data.ToString(); } break; //省市区联动 case "address": { switch (actionType) { case "transition": { conversionData = data; } break; default: conversionData = data.ToString().ToObject>(); break; } } break; //创建人员 case "createUser": { conversionData = data.ToString(); } break; //修改人员 case "modifyUser": { conversionData = string.IsNullOrEmpty(data.ToString()) ? null : data.ToString(); } break; //所属组织 case "currOrganize": { conversionData = data.ToString(); } break; //所属部门 case "currDept": { conversionData = data.ToString(); } break; //所属岗位 case "currPosition": { conversionData = data.ToString(); } break; case "table": { } break; //级联 case "cascader": switch (actionType) { case "transition": { conversionData = data; } break; default: { if (fieldsModel.props.props.multiple) { conversionData = data.ToString().ToObject>>(); } else { conversionData = data.ToString().ToObject>(); } } break; } break; default: conversionData = data.ToString(); break; #endregion #region 高级控件 //公司组件 case "comSelect": { switch (actionType) { case "List": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "create": { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; case "update": { if (fieldsModel.multiple) { var list = data.ToString().ToObject>(); conversionData = string.Join(",", list.ToArray()); } else { conversionData = data.ToString(); } } break; case "detail": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "transition": { conversionData = data; } break; default: { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; } } break; //部门组件 case "depSelect": { switch (actionType) { case "List": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "create": { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; case "update": { if (fieldsModel.multiple) { var list = data.ToString().ToObject>(); conversionData = string.Join(",", list.ToArray()); } else { conversionData = data.ToString(); } } break; case "detail": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "transition": { conversionData = data; } break; default: { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; } } break; //岗位组件 case "posSelect": { switch (actionType) { case "List": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "create": { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; case "update": { if (fieldsModel.multiple) { var list = data.ToString().ToObject>(); conversionData = string.Join(",", list.ToArray()); } else { conversionData = data.ToString(); } } break; case "detail": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "transition": { conversionData = data; } break; default: { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; } } break; //用户组件 case "userSelect": { switch (actionType) { case "List": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "create": { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; case "update": { if (fieldsModel.multiple) { var list = data.ToString().ToObject>(); conversionData = string.Join(",", list.ToArray()); } else { conversionData = data.ToString(); } } break; case "detail": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "transition": { conversionData = data; } break; default: { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; } } break; //树形选择 case "treeSelect": { switch (actionType) { case "List": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "create": { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; case "update": { if (fieldsModel.multiple) { var list = data.ToString().ToObject>(); conversionData = string.Join(",", list.ToArray()); } else { conversionData = data.ToString(); } } break; case "detail": { if (fieldsModel.multiple) { conversionData = data.ToString().ToObject>(); } else { conversionData = data.ToString(); } } break; case "transition": { conversionData = data; } break; default: { if (fieldsModel.multiple) { conversionData = data.CastTo("").Split(",", true).ToList(); } else { conversionData = data.ToString(); } } break; } } break; //弹窗选择 case "popupSelect": { conversionData = data.ToString(); } break; #endregion } return conversionData; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 转换对应数据Object /// /// 数据值 /// 数据Key /// 模板 /// 操作类型(List-列表值,create-创建值,detail-详情值,transition-过渡值) /// private string TransformDataObject(object dataValue, string dataKey, List fieldsModelList, string actionType = null) { StringBuilder sb = new StringBuilder(); //根据KEY查找模板 var model = fieldsModelList.Find(f => f.__vModel__ == dataKey); if (model != null) { switch (model.__config__.NCCKey) { //文件上传 case "uploadFz": { var fileList = TemplateControlsDataConversion(dataValue, model); if (fileList != null) { sb.AppendFormat("{0}", fileList.Serialize()); } } break; //图片上传 case "uploadImg": { var fileList = TemplateControlsDataConversion(dataValue, model); if (fileList != null) { sb.AppendFormat("{0}", fileList.Serialize()); } } break; //省市区联动 case "address": { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } break; //树形选择 case "treeSelect": { if (model.multiple) { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } else { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model)); } } break; //公司组件 case "comSelect": { if (model.multiple) { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model, actionType).Serialize()); } else { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model)); } } break; //部门组件 case "depSelect": { if (model.multiple) { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } else { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model)); } } break; //岗位组件 case "posSelect": { if (model.multiple) { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } else { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model)); } } break; //用户组件 case "userSelect": { if (model.multiple) { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } else { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model)); } } break; //滑块 case "slider": { if (model.multiple) { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } else { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model)); } } break; //时间范围 case "timeRange": { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model, actionType).Serialize()); } break; //日期范围 case "dateRange": { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model, actionType).Serialize()); } break; //下拉选择 case "select": { if (model.multiple) { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } else { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model)); } } break; //复选框 case "checkbox": { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } break; //级联 case "cascader": { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model).Serialize()); } break; //日期选择 case "date": { try { DateTime.Parse(dataValue.ToString()); sb.AppendFormat("{0}", TemplateControlsDataConversion(Ext.TimeToTimeStamp(Convert.ToDateTime(dataValue)), model, actionType)); } catch { sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model, actionType)); } } break; default: sb.AppendFormat("{0}", TemplateControlsDataConversion(dataValue, model, actionType)); break; } } if (dataKey == "F_Id") { sb.AppendFormat("{0}", dataValue.ToString()); } return sb.ToString().TrimStart('"').TrimEnd('"'); } #endregion #region 缓存模板数据 /// /// 获取可视化开发模板可缓存数据 /// /// 模型id /// 模板数据结构 /// private async Task> GetVisualDevTemplateData(string moldelId, List formData) { Dictionary templateData = new Dictionary(); var cacheKey = CommonConst.VISUALDEV + _userManager.TenantId + "_" + moldelId; if (_sysCacheService.Exists(cacheKey)) { templateData = _sysCacheService.Get(cacheKey).Deserialize>(); } else { foreach (var model in formData) { if (model != null && model.__vModel__ != null) { ConfigModel configModel = model.__config__; string fieldName1 = model.__vModel__; string type = configModel.NCCKey; switch (type) { //单选框 case NCCKeyConst.RADIO: { if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) { var dictionaryDataEntityList = string.IsNullOrEmpty(configModel.dictionaryType) ? null : await _dictionaryDataService.GetList(configModel.dictionaryType); List> dictionaryDataList = new List>(); foreach (var item in dictionaryDataEntityList) { Dictionary dictionary = new Dictionary(); dictionary.Add(item.Id, item.FullName); dictionaryDataList.Add(dictionary); } templateData.Add(fieldName1, dictionaryDataList); } if (vModelType.STATIC.GetDescription() == configModel.dataType) { var optionList = model.__slot__.options; List> list = new List>(); foreach (var item in optionList) { Dictionary option = new Dictionary(); option.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(option); } templateData.Add(fieldName1, list); } if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) { //获取远端数据 var dynamic = await _dataInterfaceService.GetInfo(model.__config__.propsUrl); if (1.Equals(dynamic.DataType)) { var linkEntity = await _dbLinkService.GetInfo(dynamic.DBLinkId); var dt = _databaseService.GetInterFaceData(linkEntity, dynamic.Query); List> dynamicDataList = dt.Serialize().Deserialize>>(); List> list = new List>(); foreach (var item in dynamicDataList) { Dictionary dynamicDic = new Dictionary(); dynamicDic.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(dynamicDic); } templateData.Add(fieldName1, list); } } } break; //下拉框 case NCCKeyConst.SELECT: { if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) { List dictionaryDataEntityList = string.IsNullOrEmpty(configModel.dictionaryType) ? null : await _dictionaryDataService.GetList(configModel.dictionaryType); List> dictionaryDataList = new List>(); foreach (var item in dictionaryDataEntityList) { Dictionary dictionary = new Dictionary(); dictionary.Add(item.Id, item.FullName); dictionaryDataList.Add(dictionary); } templateData.Add(fieldName1, dictionaryDataList); } else if (vModelType.STATIC.GetDescription() == configModel.dataType) { var optionList = model.__slot__.options; List> list = new List>(); foreach (var item in optionList) { Dictionary option = new Dictionary(); option.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(option); } templateData.Add(fieldName1, list); } else if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) { //获取远端数据 DataInterfaceEntity dynamic = await _dataInterfaceService.GetInfo(model.__config__.propsUrl); if (1.Equals(dynamic.DataType)) { var linkEntity = await _dbLinkService.GetInfo(dynamic.DBLinkId); var dt = _databaseService.GetInterFaceData(linkEntity, dynamic.Query); List> dynamicDataList = dt.Serialize().Deserialize>>(); List> list = new List>(); foreach (var item in dynamicDataList) { Dictionary dynamicDic = new Dictionary(); dynamicDic.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(dynamicDic); } templateData.Add(fieldName1, list); } } } break; //复选框 case NCCKeyConst.CHECKBOX: { if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) { List dictionaryDataEntityList = string.IsNullOrEmpty(configModel.dictionaryType) ? null : await _dictionaryDataService.GetList(configModel.dictionaryType); List> dictionaryDataList = new List>(); foreach (var item in dictionaryDataEntityList) { Dictionary dictionary = new Dictionary(); dictionary.Add(item.Id, item.FullName); dictionaryDataList.Add(dictionary); } templateData.Add(fieldName1, dictionaryDataList); } if (vModelType.STATIC.GetDescription() == configModel.dataType) { var optionList = model.__slot__.options; List> list = new List>(); foreach (var item in optionList) { Dictionary option = new Dictionary(); option.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(option); } templateData.Add(fieldName1, list); } if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) { //获取远端数据 DataInterfaceEntity dynamic = await _dataInterfaceService.GetInfo(model.__config__.propsUrl); if (1.Equals(dynamic.DataType)) { var linkEntity = await _dbLinkService.GetInfo(dynamic.DBLinkId); var dt = _databaseService.GetInterFaceData(linkEntity, dynamic.Query); List> dynamicDataList = dt.Serialize().Deserialize>>(); List> list = new List>(); foreach (var item in dynamicDataList) { Dictionary dynamicDic = new Dictionary(); dynamicDic.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(dynamicDic); } templateData.Add(fieldName1, list); } } } break; //树形选择 case NCCKeyConst.TREESELECT: { if (vModelType.DICTIONARY.GetDescription() == configModel.dataType) { List dictionaryDataEntityList = await _dictionaryDataService.GetList(); List> dictionaryDataList = new List>(); foreach (var item in dictionaryDataEntityList) { Dictionary dictionary = new Dictionary(); dictionary.Add(item.Id, item.FullName); dictionaryDataList.Add(dictionary); } templateData.Add(fieldName1, dictionaryDataList); } else if (vModelType.STATIC.GetDescription() == configModel.dataType) { var props = model.props.props; var optionList = GetTreeOptions(model.options, props); List> list = new List>(); foreach (var item in optionList) { Dictionary option = new Dictionary(); option.Add(item.value, item.label); list.Add(option); } templateData.Add(fieldName1, list); } else if (vModelType.DYNAMIC.GetDescription() == configModel.dataType) { //获取远端数据 DataInterfaceEntity dynamic = await _dataInterfaceService.GetInfo(model.__config__.propsUrl); if (1.Equals(dynamic.DataType)) { var linkEntity = await _dbLinkService.GetInfo(dynamic.DBLinkId); var dt = _databaseService.GetInterFaceData(linkEntity, dynamic.Query); List> dynamicDataList = dt.Serialize().Deserialize>>(); List> list = new List>(); foreach (var item in dynamicDataList) { Dictionary dynamicDic = new Dictionary(); dynamicDic.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); list.Add(dynamicDic); } templateData.Add(fieldName1, list); } } } break; //公司 case NCCKeyConst.COMSELECT: { var com_organizeEntityList = await _organizeService.GetCompanyListAsync(); List> com_organizeList = new List>(); foreach (var item in com_organizeEntityList) { Dictionary com_organize = new Dictionary(); com_organize.Add(item.Id, item.FullName); com_organizeList.Add(com_organize); } templateData.Add(fieldName1, com_organizeList); } break; //部门 case NCCKeyConst.DEPSELECT: { var dep_organizeEntityList = await _departmentService.GetListAsync(); List> dep_organizeList = new List>(); foreach (var item in dep_organizeEntityList) { Dictionary dep_organize = new Dictionary(); dep_organize.Add(item.Id, item.FullName); dep_organizeList.Add(dep_organize); } templateData.Add(fieldName1, dep_organizeList); } break; //岗位 case NCCKeyConst.POSSELECT: { var positionEntityList = await _positionService.GetListAsync(); List> positionList = new List>(); foreach (var item in positionEntityList) { Dictionary position = new Dictionary(); position.Add(item.Id, item.FullName); positionList.Add(position); } templateData.Add(fieldName1, positionList); } break; //用户 case NCCKeyConst.USERSELECT: { var userEntityList = await _userService.GetList(); List> userList = new List>(); foreach (var item in userEntityList) { Dictionary user = new Dictionary(); user.Add(item.Id, item.RealName + "/" + item.Account); userList.Add(user); } templateData.Add(fieldName1, userList); } break; //数据字典 case NCCKeyConst.DICTIONARY: { var dictionaryTypeEntityLists = await _dictionaryTypeService.GetList(); List> dictionaryTypeList = new List>(); foreach (var item in dictionaryTypeEntityLists) { Dictionary dictionaryType = new Dictionary(); dictionaryType.Add(item.Id, item.FullName); dictionaryTypeList.Add(dictionaryType); } templateData.Add(fieldName1, dictionaryTypeList); } break; //省市区 case NCCKeyConst.ADDRESS: { var addressEntityList = await _provinceService.GetList(); List> addressList = new List>(); foreach (var item in addressEntityList) { Dictionary address = new Dictionary(); address.Add(item.Id, item.FullName); addressList.Add(address); } templateData.Add(fieldName1, addressList); } break; //级联选择 case NCCKeyConst.CASCADER: { if (vModelType.STATIC.GetDescription() == configModel.dataType) { var props = model.props.props; var optionList = GetTreeOptions(model.options, props); List> list = new List>(); foreach (var item in optionList) { Dictionary option = new Dictionary(); option.Add(item.value, item.label); list.Add(option); } templateData.Add(fieldName1, list); } } break; } } } //缓存2分钟 _sysCacheService.Set(cacheKey, templateData, TimeSpan.FromMinutes(2)); } return templateData; } #endregion #region 系统组件生成与解析 /// /// 生成系统自动生成字段 /// /// 模板数据 /// 真实数据 /// 创建与修改标识 true创建 false 修改 /// public async Task> GenerateFeilds(List fieldsModelList, Dictionary allDataMap, bool IsCreate) { int dicCount = allDataMap.Keys.Count; string[] strKey = new string[dicCount]; allDataMap.Keys.CopyTo(strKey, 0); for (int i = 0; i < strKey.Length; i++) { //根据KEY查找模板 var model = fieldsModelList.Find(f => f.__vModel__ == strKey[i]); if (model != null) { //如果模板NCCKey为table为子表数据 if ("table".Equals(model.__config__.NCCKey) && allDataMap[strKey[i]] != null) { List childFieldsModelList = model.__config__.children; var objectData = allDataMap[strKey[i]]; List> childAllDataMapList = objectData.Serialize().Deserialize>>(); List> newChildAllDataMapList = new List>(); foreach (var childmap in childAllDataMapList) { var newChildData = new Dictionary(); foreach (KeyValuePair item in childmap) { var childFieldsModel = childFieldsModelList.Where(c => c.__vModel__ == item.Key).FirstOrDefault(); if (childFieldsModel != null) { var userInfo = await _userManager.GetUserInfo(); if (childFieldsModel.__vModel__.Equals(item.Key)) { string NCCKeyType = childFieldsModel.__config__.NCCKey; switch (NCCKeyType) { case "billRule": if (IsCreate) { string billNumber = await _billRuleService.GetBillNumber(childFieldsModel.__config__.rule); if (!"单据规则不存在".Equals(billNumber)) { newChildData[item.Key] = billNumber; } else { newChildData[item.Key] = ""; } } else { newChildData[item.Key] = childmap[item.Key]; } break; case "createUser": if (IsCreate) { newChildData[item.Key] = userInfo.userId; } break; case "createTime": if (IsCreate) { newChildData[item.Key] = string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now); } break; case "modifyUser": if (!IsCreate) { newChildData[item.Key] = userInfo.userId; } break; case "modifyTime": if (!IsCreate) { newChildData[item.Key] = string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now); } break; case "currPosition": var userEntity = _userService.GetInfoByUserId(userInfo.userId); if (!string.IsNullOrEmpty(userEntity.PositionId)) { var positionEntity = await _positionService.GetInfoById(userEntity.PositionId.Split(",").FirstOrDefault()); if (positionEntity != null) { newChildData[item.Key] = positionEntity.Id; } } else { newChildData[item.Key] = ""; } break; case "currOrganize": { if (userInfo.organizeId != null) { newChildData[item.Key] = userInfo.organizeId; } else { newChildData[item.Key] = ""; } } break; default: newChildData[item.Key] = childmap[item.Key]; break; } } } } newChildAllDataMapList.Add(newChildData); allDataMap[strKey[i]] = newChildAllDataMapList; } } else { var userInfo = await _userManager.GetUserInfo(); if (model.__vModel__.Equals(strKey[i])) { string NCCKeyType = model.__config__.NCCKey; switch (NCCKeyType) { case "billRule": if (IsCreate) { string billNumber = await _billRuleService.GetBillNumber(model.__config__.rule); if (!"单据规则不存在".Equals(billNumber)) { allDataMap[strKey[i]] = billNumber; } else { allDataMap[strKey[i]] = ""; } } break; case "createUser": { if (IsCreate) { allDataMap[strKey[i]] = userInfo.userId; } else { allDataMap[strKey[i]] = await _userService.GetUserIdByRealName(allDataMap[strKey[i]].ToString()); } } break; case "createTime": if (IsCreate) { allDataMap[strKey[i]] = string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now); } break; case "modifyUser": if (!IsCreate) { allDataMap[strKey[i]] = userInfo.userId; } break; case "modifyTime": if (!IsCreate) { allDataMap[strKey[i]] = string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now); } break; case "currPosition": var userEntity = _userService.GetInfoByUserId(userInfo.userId); if (!string.IsNullOrEmpty(userEntity.PositionId)) { var positionEntity = await _positionService.GetInfoById(userEntity.PositionId.Split(",").FirstOrDefault()); if (positionEntity != null) { allDataMap[strKey[i]] = positionEntity.Id; } } else { allDataMap[strKey[i]] = ""; } break; case "currOrganize": { if (userInfo.organizeId != null) { allDataMap[strKey[i]] = userInfo.organizeId; } else { allDataMap[strKey[i]] = ""; } } break; default: break; } } } } } return allDataMap; } /// /// 将系统组件生成的数据转换为数据 /// /// 数据库模板数据 /// 模板真实数据 /// 真实数据 /// private async Task GetSystemComponentsData(List formData, Dictionary templateData, string modelData) { //剔除无限极 formData = TemplateDataConversion(formData); //数据库保存的F_Data Dictionary dataMap = modelData.ToObject>(); int dicCount = dataMap.Keys.Count; string[] strKey = new string[dicCount]; dataMap.Keys.CopyTo(strKey, 0); //自动生成的数据不在模板数据内 var record = dataMap.Keys.Except(templateData.Keys).ToList(); foreach (var key in record) { if (dataMap[key] != null) { var dataValue = dataMap[key].ToString(); if (!string.IsNullOrEmpty(dataValue)) { var model = formData.Where(f => f.__vModel__ == key).FirstOrDefault(); if (model != null) { ConfigModel configModel = model.__config__; string type = configModel.NCCKey; switch (type) { //case "currDept": // { // var deptMapList = await _departmentService.GetListAsync(); // dataMap[key] = deptMapList.Find(o => o.Id.Equals(dataMap[key].ToString())).FullName; // } // break; case "createUser": { var createUser = await _userService.GetInfoByUserIdAsync(dataMap[key].ToString()); if (createUser != null) dataMap[key] = createUser.RealName; } break; case "modifyUser": { var modifyUser = await _userService.GetInfoByUserIdAsync(dataMap[key].ToString()); if (modifyUser != null) dataMap[key] = modifyUser.RealName; } break; case "currPosition": { var mapList = await _positionService.GetListAsync(); dataMap[key] = mapList.Where(p => p.Id == dataMap[key].ToString()).FirstOrDefault().FullName; } break; case "currOrganize": { var orgMapList = await _organizeService.GetListAsync(); dataMap[key] = orgMapList.Find(o => o.Id.Equals(dataMap[key].ToString())).FullName; } break; } } } } } return dataMap.Serialize(); } #endregion #region 转换数据 /// /// 将关键字key查询传输的id转换成名称,还有动态数据id成名称 /// /// 数据库模板数据 /// 模板真实数据 /// 查询数据 /// 真实数据 /// 表单类型1-纯表单、2-普通表单、3-工作流表单 /// 数据主键 /// private async Task> GetKeyData(List formData, Dictionary templateData, Dictionary keywordJsonDic, List list, ColumnDesignModel columnDesign = null, string actionType = "List", int webType = 2, string primaryKey = "F_Id") { List redisList = new List(); //转换数据 var convData = new Dictionary(); //转换列表数据 foreach (var entity in list) { //数据库保存的F_Data Dictionary dataMap = entity.Data.Deserialize>(); 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)) { var form = formData.Where(f => f.__vModel__ == strKey[i]).FirstOrDefault(); if (form != null) { if (form.__vModel__.Contains(form.__config__.NCCKey + "Field")) { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], form); } else { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], form, actionType); } var templateValue = templateData.Where(t => t.Key.Equals(strKey[i])).FirstOrDefault(); //转换后的数据值 var dataDicValue = dataMap[strKey[i]]; if (templateValue.Key != null && !(dataDicValue is null) && dataDicValue.ToString() != "[]") { var NCCKey = form.__config__.NCCKey; var moreValue = dataDicValue as IEnumerable; //不是List数据直接赋值 if (moreValue == null) { NCCKey = ""; } switch (NCCKey) { case NCCKeyConst.COMSELECT: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var comData = dicAdd.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault(); if (comData != null) { addName.Append(comData[item.ToString()] + ","); } } if (addName.Length != 0) { dataMap[strKey[i]] = addName.ToString().TrimEnd(','); } } break; case NCCKeyConst.DEPSELECT: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var comData = dicAdd.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault(); if (comData != null) { addName.Append(comData[item.ToString()] + ","); } } if (addName.Length != 0) { dataMap[strKey[i]] = addName.ToString().TrimEnd(','); } } break; case NCCKeyConst.ADDRESS: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var addressData = dicAdd.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault(); if (addressData != null) { addName.Append(addressData[item.ToString()] + "/"); } } if (addName.Length != 0) { dataMap[strKey[i]] = addName.ToString().TrimEnd('/'); } } break; case NCCKeyConst.CASCADER: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); if (form.props.props.multiple) { foreach (var item in moreValue) { StringBuilder sb = new StringBuilder(); foreach (var items in item.Serialize().Deserialize>()) { var cascaderData = dicAdd.Where(c => c.ContainsKey(items.ToString())).FirstOrDefault(); if (cascaderData != null) { sb.Append(cascaderData[items.ToString()] + "/"); } } if (sb.Length != 0) { addName.AppendFormat("{0}", sb.ToString().TrimEnd('/') + ","); } } if (addName.Length != 0) { dataMap[strKey[i]] = addName.ToString().TrimEnd(','); } } else { foreach (var item in moreValue) { var cascaderData = dicAdd.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { addName.Append(cascaderData[item.ToString()] + "/"); } } if (addName.Length != 0) { dataMap[strKey[i]] = addName.ToString().TrimEnd('/'); } } } break; case NCCKeyConst.CHECKBOX: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicAdd.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { addName.Append(cascaderData[item.ToString()] + ","); } } if (addName.Length != 0) { dataMap[strKey[i]] = addName.ToString().TrimEnd(','); } } break; case NCCKeyConst.USERSELECT: { StringBuilder userName = new StringBuilder(); List> dicUser = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicUser.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { userName.Append(cascaderData[item.ToString()] + ","); } } if (userName.Length != 0) { dataMap[strKey[i]] = userName.ToString().TrimEnd(','); } } break; case NCCKeyConst.POSSELECT: { StringBuilder posName = new StringBuilder(); List> dicPos = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicPos.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { posName.Append(cascaderData[item.ToString()] + ","); } } if (posName.Length != 0) { dataMap[strKey[i]] = posName.ToString().TrimEnd(','); } } break; case NCCKeyConst.SELECT: { StringBuilder selectName = new StringBuilder(); List> dicSelect = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicSelect.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { selectName.Append(cascaderData[item.ToString()] + ","); } } if (selectName.Length != 0) { dataMap[strKey[i]] = selectName.ToString().TrimEnd(','); } } break; case NCCKeyConst.TREESELECT: { StringBuilder treeSelectName = new StringBuilder(); List> treeSelectDic = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = treeSelectDic.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { treeSelectName.Append(cascaderData[item.ToString()] + ","); } } if (treeSelectName.Length != 0) { dataMap[strKey[i]] = treeSelectName.ToString().TrimEnd(','); } } break; default: { var convertList = templateValue.Value.Serialize().Deserialize>>(); var convertData = convertList.Where(t => t.ContainsKey(dataMap[strKey[i]].ToString())).FirstOrDefault(); if (convertData != null) { dataMap[strKey[i]] = convertData.Values.FirstOrDefault().ToString(); } } break; } } } } } //转换模板没记录的数据 var record = dataMap.Keys.Except(templateData.Keys).ToList(); //针对有表的模板去除"rownum,主键" record.RemoveAll(r => { return r == "ROWNUM"; }); record.RemoveAll(r => { return r == primaryKey; }); foreach (var key in record) { if (!(dataMap[key] is null) && dataMap[key].ToString() != "") { var dataValue = dataMap[key]; var model = formData.Where(f => f.__vModel__ == key).FirstOrDefault(); if (model != null) { ConfigModel configModel = model.__config__; string type = configModel.NCCKey; switch (type) { //switch开关 case "switch": { dataMap[key] = dataMap[key].ToInt() == 0 ? "关" : "开"; } break; //时间范围 case NCCKeyConst.TIMERANGE: { List jsonArray = new List(); jsonArray = dataValue.Serialize().Deserialize>(); string value1 = string.Format("{0:" + model.format + "}", Convert.ToDateTime(jsonArray.First())); string value2 = string.Format("{0:" + model.format + "}", Convert.ToDateTime(jsonArray.Last())); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2); dataMap[key] = jsonArray; } break; //日期选择 case NCCKeyConst.DATE: { string value = string.Empty; if (!string.IsNullOrEmpty(model.format)) { value = string.Format("{0:" + model.format + "}", Convert.ToDateTime(dataMap[key].ToString())); } else { switch (model.type) { case "date": value = string.Format("{0:yyyy-MM-dd}", Convert.ToDateTime(dataMap[key].ToString())); break; default: value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Convert.ToDateTime(dataMap[key].ToString())); break; } } dataMap[key] = value; } break; //日期选择 case NCCKeyConst.TIME: { string value = string.Empty; if (!string.IsNullOrEmpty(model.format)) { value = string.Format("{0:" + model.format + "}", Convert.ToDateTime(dataMap[key].ToString())); } else { value = dataMap[key].ToString(); } dataMap[key] = value; } break; //日期范围 case NCCKeyConst.DATERANGE: { List jsonArray = new List(); jsonArray = dataValue.Serialize().Deserialize>(); string value1 = string.Format("{0:" + model.format + "}", Ext.GetDateTime(jsonArray.First())); string value2 = string.Format("{0:" + model.format + "}", Ext.GetDateTime(jsonArray.Last())); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2); dataMap[key] = jsonArray; } break; case "currDept": { var orgMapList = await _organizeService.GetListAsync(); foreach (var organizeEntity in orgMapList) { if (dataMap[key].ToString().Equals(organizeEntity.Id)) { dataMap[key] = organizeEntity.FullName; } } } break; case "createUser": { var userCreEntity = await _userService.GetInfoByUserIdAsync(dataMap[key].ToString()); if (userCreEntity != null) { dataMap[key] = userCreEntity.RealName; } else { dataMap[key] = dataMap[key]; } } break; case "createTime": { string value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Convert.ToDateTime(dataMap[key].ToString())); dataMap[key] = value; } break; case "modifyUser": { var userModEntity = await _userService.GetInfoByUserIdAsync(dataMap[key].ToString()); if (userModEntity != null) { dataMap[key] = userModEntity.RealName; } else { dataMap[key] = dataMap[key]; } } break; case "modifyTime": { string value = string.Format("{0:yyyy-MM-dd HH:mm:ss}", Convert.ToDateTime(dataMap[key].ToString())); dataMap[key] = value; } break; case "currPosition": { var mapList = await _positionService.GetListAsync(); var position = mapList.Where(p => p.Id == dataMap[key].ToString()).FirstOrDefault(); if (position != null) { dataMap[key] = position.FullName; } } break; case "currOrganize": { var orgMapList = await _organizeService.GetListAsync(); foreach (var organizeEntity in orgMapList) { if (dataMap[key].ToString().Equals(organizeEntity.Id)) { dataMap[key] = organizeEntity.FullName; } } } break; //级联 case "cascader": { switch (configModel.dataType) { case "dictionary": { List data = new List(); var cacheKey = CommonConst.VISUALDEV + _userManager.TenantId + "_" + configModel.dictionaryType; if (_sysCacheService.Exists(cacheKey)) { data = _sysCacheService.Get(cacheKey).Deserialize>(); } else { data = await _dictionaryDataService.GetList(configModel.dictionaryType); _sysCacheService.Set(cacheKey, data); redisList.Add(cacheKey); } List dataList = dataMap[key].Serialize().Deserialize>(); List cascaderList = new List(); foreach (var items in dataList) { var cascader = data.Find(d => d.Id == items); if (cascader != null) { cascaderList.Add(cascader.FullName); } } dataMap[key] = cascaderList; } break; case "dynamic": { //获取远端数据 DataInterfaceEntity dataEntity = await _dataInterfaceService.GetInfo(configModel.propsUrl); switch (dataEntity.DataType) { //SQL数据 case 1: { var linkEntity = await _dbLinkService.GetInfo(dataEntity.DBLinkId); var dt = _databaseService.GetInterFaceData(linkEntity, dataEntity.Query); //List> dynamicDataList = dt.Serialize().Deserialize>>(); //List> list = new List>(); //foreach (var item in dynamicDataList) //{ // Dictionary dynamicDic = new Dictionary(); // dynamicDic.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); // list.Add(dynamicDic); //} //templateData.Add(fieldName1, list); } break; //静态数据 case 2: { List> dynamicList = new List>(); var value = model.props.props.value; var label = model.props.props.label; var children = model.props.props.children; JToken dynamicDataList = JValue.Parse(dataEntity.Query); foreach (var data in dynamicDataList) { 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() != "") { dynamicList.AddRange(GetDynamicInfiniteData(data.Value(children).ToString(), model.props.props)); } } List dataList = dataMap[key].Serialize().Deserialize>(); List cascaderList = new List(); foreach (var items in dataList) { var vara = dynamicList.Where(a => a.ContainsValue(items)).FirstOrDefault(); if (vara != null) { cascaderList.Add(vara[label]); } } dataMap[key] = cascaderList; } break; //Api数据 case 3: { } break; default: break; } } break; default: break; } } break; //关联表单 case NCCKeyConst.RELATIONFORM: { List> relationFormDataList = new List>(); var redisName = CommonConst.VISUALDEV + _userManager.TenantId + "_" + configModel.NCCKey + "_" + model.modelId; if (_sysCacheService.Exists(redisName)) { relationFormDataList = _sysCacheService.Get(redisName).Deserialize>>(); } else { //根据可视化功能ID获取该模板全部数据 var relationFormModel = await _visualDevRepository.FirstOrDefaultAsync(v => v.Id == model.modelId); FormDataModel relationFormData = relationFormModel.FormData.Deserialize(); //多虑多余控件 var newFields = this.TemplateDataConversion(relationFormData.fields); var newFieLdsModelList = newFields.FindAll(x => model.relationField.Equals(x.__vModel__)); VisualDevModelListQueryInput listQueryInput = new VisualDevModelListQueryInput { dataType = "1", sidx = columnDesign.defaultSidx, sort = columnDesign.sort }; relationFormDataList = (await GetListResult(relationFormModel, listQueryInput)).list.ToList(); _sysCacheService.Set(redisName, relationFormDataList); redisList.Add(redisName); } 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[model.relationField]; } } break; case NCCKeyConst.POPUPSELECT: { var popupsList = (await _dataInterfaceService.GetData(model.interfaceId)).Serialize().Deserialize>>(); var specificData = popupsList.Where(it => it.ContainsKey(model.propsValue) && it.ContainsValue(dataMap[key].ToString())).FirstOrDefault(); if (specificData != null) { var showField = model.columnOptions.First(); dataMap[key] = specificData[showField.value]; } } break; } } } } //为数据实时性,接口请求完后删除Redis缓存 if (redisList != null) { foreach (var items in redisList) { _sysCacheService.Del(items); } } entity.Data = dataMap.Serialize(); } //转换查询数据 if (keywordJsonDic != null) { int dicCount = keywordJsonDic.Keys.Count; string[] strKey = new string[dicCount]; keywordJsonDic.Keys.CopyTo(strKey, 0); for (int i = 0; i < strKey.Length; i++) { var form = formData.Where(f => f.__vModel__ == strKey[i]).FirstOrDefault(); //范围查询跳过数据转换 var scopeList = new List(); scopeList.Add(NCCKeyConst.TIMERANGE); scopeList.Add(NCCKeyConst.DATE); scopeList.Add(NCCKeyConst.TIME); scopeList.Add(NCCKeyConst.DATERANGE); scopeList.Add("createTime"); scopeList.Add("modifyTime"); scopeList.Add("numInput"); var NCCKey = form.__config__.NCCKey; var isScope = scopeList.Find(s => s.Equals(NCCKey)); if (form != null && isScope == null) { if (form.__vModel__.Contains(form.__config__.NCCKey + "Field")) { keywordJsonDic[strKey[i]] = TemplateControlsDataConversion(keywordJsonDic[strKey[i]], form); } else { keywordJsonDic[strKey[i]] = TemplateControlsDataConversion(keywordJsonDic[strKey[i]], form, "query"); } var templateValue = templateData.Where(t => t.Key.Equals(strKey[i])).FirstOrDefault(); //转换后的数据值 var dataDicValue = keywordJsonDic[strKey[i]]; if (templateValue.Key != null && !(dataDicValue is null) && dataDicValue.ToString() != "[]") { var moreValue = dataDicValue as IEnumerable; //不是List数据直接赋值 if (moreValue == null) { NCCKey = ""; } switch (NCCKey) { case NCCKeyConst.COMSELECT: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var comData = dicAdd.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault(); if (comData != null) { addName.Append(comData[item.ToString()] + ","); } } if (addName.Length != 0) { keywordJsonDic[strKey[i]] = addName.ToString().TrimEnd(','); } } break; case NCCKeyConst.DEPSELECT: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var comData = dicAdd.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault(); if (comData != null) { addName.Append(comData[item.ToString()] + ","); } } if (addName.Length != 0) { keywordJsonDic[strKey[i]] = addName.ToString().TrimEnd(','); } } break; case NCCKeyConst.ADDRESS: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var addressData = dicAdd.Where(a => a.ContainsKey(item.ToString())).FirstOrDefault(); if (addressData != null) { addName.Append(addressData[item.ToString()] + "/"); } } if (addName.Length != 0) { keywordJsonDic[strKey[i]] = addName.ToString().TrimEnd('/'); } } break; case NCCKeyConst.CASCADER: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); if (form.props.props.multiple) { foreach (var item in moreValue) { StringBuilder sb = new StringBuilder(); foreach (var items in item.Serialize().Deserialize>()) { var cascaderData = dicAdd.Where(c => c.ContainsKey(items.ToString())).FirstOrDefault(); if (cascaderData != null) { sb.Append(cascaderData[items.ToString()] + "/"); } } if (sb.Length != 0) { addName.AppendFormat("{0}", sb.ToString().TrimEnd('/') + ","); } } if (addName.Length != 0) { keywordJsonDic[strKey[i]] = addName.ToString().TrimEnd(','); } } else { foreach (var item in moreValue) { var cascaderData = dicAdd.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { addName.Append(cascaderData[item.ToString()] + "/"); } } if (addName.Length != 0) { keywordJsonDic[strKey[i]] = addName.ToString().TrimEnd('/'); } } } break; case NCCKeyConst.CHECKBOX: { StringBuilder addName = new StringBuilder(); List> dicAdd = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicAdd.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { addName.Append(cascaderData[item.ToString()] + ","); } } if (addName.Length != 0) { keywordJsonDic[strKey[i]] = addName.ToString().TrimEnd(','); } } break; case NCCKeyConst.USERSELECT: { StringBuilder userName = new StringBuilder(); List> dicUser = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicUser.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { userName.Append(cascaderData[item.ToString()] + ","); } } if (userName.Length != 0) { keywordJsonDic[strKey[i]] = userName.ToString().TrimEnd(','); } } break; case NCCKeyConst.POSSELECT: { StringBuilder posName = new StringBuilder(); List> dicPos = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicPos.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { posName.Append(cascaderData[item.ToString()] + ","); } } if (posName.Length != 0) { keywordJsonDic[strKey[i]] = posName.ToString().TrimEnd(','); } } break; case NCCKeyConst.SELECT: { StringBuilder selectName = new StringBuilder(); List> dicSelect = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = dicSelect.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { selectName.Append(cascaderData[item.ToString()] + ","); } } if (selectName.Length != 0) { keywordJsonDic[strKey[i]] = selectName.ToString().TrimEnd(','); } } break; case NCCKeyConst.TREESELECT: { StringBuilder treeSelectName = new StringBuilder(); List> treeSelectDic = templateValue.Value.Serialize().Deserialize>>(); foreach (var item in moreValue) { var cascaderData = treeSelectDic.Where(c => c.ContainsKey(item.ToString())).FirstOrDefault(); if (cascaderData != null) { treeSelectName.Append(cascaderData[item.ToString()] + ","); } } if (treeSelectName.Length != 0) { keywordJsonDic[strKey[i]] = treeSelectName.ToString().TrimEnd(','); } } break; default: { var convertList = templateValue.Value.Serialize().Deserialize>>(); var convertData = convertList.Where(t => t.ContainsKey(keywordJsonDic[strKey[i]].ToString())).FirstOrDefault(); if (convertData != null) { keywordJsonDic[strKey[i]] = convertData.Values.FirstOrDefault().ToString(); } } break; } } } } //转换查询条件没记录的数据 var record = keywordJsonDic.Keys.Except(templateData.Keys).ToList(); foreach (var key in record) { var model = formData.Where(f => f.__vModel__ == key).FirstOrDefault(); ConfigModel configModel = model.__config__; string type = configModel.NCCKey; switch (type) { //时间范围 case NCCKeyConst.TIMERANGE: { List jsonArray = keywordJsonDic[key].Serialize().Deserialize>(); string value1 = string.Format("{0:HH:mm:ss}", jsonArray[0].ToDate()); string value2 = string.Format("{0:HH:mm:ss}", jsonArray[1].ToDate()); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2); keywordJsonDic[key] = jsonArray; } break; //日期选择 case NCCKeyConst.DATE: { var jsonArray = keywordJsonDic[key].Serialize().Deserialize>(); string value1 = string.Format("{0:" + model.format + "}", Ext.GetDateTime(jsonArray[0])); string value2 = string.Format("{0:" + model.format + "}", Ext.GetDateTime(jsonArray[1])); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2 + "至"); keywordJsonDic[key] = jsonArray; } break; //日期范围 case NCCKeyConst.DATERANGE: { List jsonArray = keywordJsonDic[key].Serialize().Deserialize>(); string value1 = string.Format("{0:yyyy-MM-dd}", Ext.GetDateTime(jsonArray[0])); string value2 = string.Format("{0:yyyy-MM-dd}", Ext.GetDateTime(jsonArray[1])); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2); keywordJsonDic[key] = jsonArray; } break; case "createUser": { var userEntity = _userService.GetInfoByUserId(keywordJsonDic[key].ToString()); keywordJsonDic[key] = userEntity.RealName; } break; case "createTime": { var jsonArray = keywordJsonDic[key].ToObeject>(); string value1 = string.Format("{0:yyyy-MM-dd 00:00:00}", Ext.GetDateTime(jsonArray[0])); string value2 = string.Format("{0:yyyy-MM-dd 23:59:59}", Ext.GetDateTime(jsonArray[1])); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2 + "至"); keywordJsonDic[key] = jsonArray; } break; case "modifyUser": { var userEntity = _userService.GetInfoByUserId(keywordJsonDic[key].ToString()); keywordJsonDic[key] = userEntity.RealName; } break; case "modifyTime": { var jsonArray = keywordJsonDic[key].ToObeject>(); string value1 = string.Format("{0:yyyy-MM-dd 00:00:00}", Ext.GetDateTime(jsonArray[0])); string value2 = string.Format("{0:yyyy-MM-dd 23:59:59}", Ext.GetDateTime(jsonArray[1])); jsonArray.Clear(); jsonArray.Add(value1 + "至"); jsonArray.Add(value2 + "至"); keywordJsonDic[key] = jsonArray; } break; case "currDept": { var currDept = _departmentService.GetDepName(keywordJsonDic[key].ToString()); keywordJsonDic[key] = currDept; } break; case "currPosition": { var currPosition = _positionService.GetName(keywordJsonDic[key].ToString()); keywordJsonDic[key] = currPosition; } break; case "cascader": { switch (configModel.dataType) { case "dictionary": { List data = new List(); var cacheKey = CommonConst.VISUALDEV + _userManager.TenantId + "_" + configModel.dictionaryType; if (_sysCacheService.Exists(cacheKey)) { data = _sysCacheService.Get(cacheKey).Deserialize>(); } else { data = await _dictionaryDataService.GetList(configModel.dictionaryType); _sysCacheService.Set(cacheKey, data); redisList.Add(cacheKey); } List dataList = keywordJsonDic[key].Serialize().Deserialize>(); List cascaderList = new List(); foreach (var items in dataList) { var cascader = data.Find(d => d.Id == items); if (cascader != null) { cascaderList.Add(cascader.FullName); } } keywordJsonDic[key] = cascaderList; } break; case "dynamic": { //获取远端数据 //DataInterfaceEntity dynamic = await dataInterfaceService.GetInfo(configModel.propsUrl); //if (1.Equals(dynamic.DataType)) //{ // var linkEntity = await dbLinkservice.GetInfo(dynamic.DBLinkId); // var dt = await databaseService.GetInterFaceData(linkEntity, dynamic.Query); // List> dynamicDataList = UtilConvert.DataTableToDicList(dt); // List> list = new List>(); // foreach (var item in dynamicDataList) // { // Dictionary dynamicDic = new Dictionary(); // dynamicDic.Add(item[model.__config__.props.value].ToString(), item[model.__config__.props.label].ToString()); // list.Add(dynamicDic); // } // templateData.Add(fieldName1, list); //} } break; default: break; } } break; } } } Dictionary map = new Dictionary(); map[vModelType.LIST.GetDescription()] = list; map[vModelType.KEYJSONMAP.GetDescription()] = keywordJsonDic; return map; } #endregion #region 数据转换与筛选 /// /// 无表的数据筛选 /// /// /// /// /// private List GetNoTableFilteringData(List list, Dictionary keyJsonMap, List formData) { List realList = new List(); foreach (var entity in list) { Dictionary query = keyJsonMap; Dictionary realEntity = entity.Data.Deserialize>(); 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; var type = model.__config__.NCCKey; switch (type) { case NCCKeyConst.DATE: { List queryTime = keyValue.ToObeject>(); 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}", Ext.GetDateTime(queryTime.First())); string value2 = string.Format("{0:yyyy-MM-dd}", Ext.GetDateTime(queryTime.Last())); if (Ext.IsInTimeRange(Ext.GetDateTime(realValue.ToString()), value1, value2, formatType)) { realEntity["id"] = entity.Id; m++; } } break; case NCCKeyConst.TIME: { List queryTime = keyValue.ToObeject>(); if (Ext.IsInTimeRange(realValue.ToDate(), queryTime.First(), queryTime.Last(), 3)) { realEntity["id"] = entity.Id; m++; } } break; case "createTime": { List dayTime1 = keyValue.ToObeject>(); string value1 = string.Format("{0:yyyy-MM-dd 00:00:00}", Ext.GetDateTime(dayTime1.First())); string value2 = string.Format("{0:yyyy-MM-dd 23:59:59}", Ext.GetDateTime(dayTime1.Last())); if (Ext.IsInTimeRange(Convert.ToDateTime(realValue), value1, value2)) { realEntity["id"] = entity.Id; m++; } } break; case "modifyTime": { List dayTime1 = keyValue.ToObeject>(); string value1 = string.Format("{0:yyyy-MM-dd 00:00:00}", Ext.GetDateTime(dayTime1.First())); string value2 = string.Format("{0:yyyy-MM-dd 23:59:59}", Ext.GetDateTime(dayTime1.Last())); if (!string.IsNullOrEmpty(realValue.ToString())) { if (Ext.IsInTimeRange(Convert.ToDateTime(realValue), value1, value2)) { realEntity["id"] = entity.Id; m++; } } } break; case "numInput": { List numArray = keyValue.ToObeject>(); var numA = numArray.First().ToInt(); var numB = numArray.Last() == null ? Int64.MaxValue : numArray.Last().ToInt(); var numC = realValue.ToInt(); if (numC >= numA && numC <= numB) { realEntity["id"] = entity.Id; m++; } } break; case "calculate": { List numArray = keyValue.ToObeject>(); var numA = numArray.First().ToInt(); var numB = numArray.Last() == null ? Int64.MaxValue : numArray.Last().ToInt(); var numC = realValue.ToInt(); if (numC >= numA && numC <= numB) { realEntity["id"] = entity.Id; m++; } } break; default: { if (model.searchType == 2) { if (realValue.ToString().Contains(keyValue.ToString())) { realEntity["id"] = entity.Id; m++; } } else if (model.searchType == 1) { //多选时为模糊查询 if (model.multiple || type == "checkbox") { if (realValue.ToString().Contains(keyValue.ToString())) { realEntity["id"] = entity.Id; m++; } } else { if (realValue.ToString().Equals(keyValue.ToString())) { realEntity["id"] = entity.Id; m++; } } } else { if (realValue.ToString().Contains(keyValue.ToString())) { realEntity["id"] = entity.Id; m++; } } } break; } } if (m == dicCount) { realList.Add(entity); } } } else { realList.Add(entity); } } return realList; } /// /// 查询过滤数据 /// /// /// /// /// private List> GetQueryFilteringData(Dictionary keyJsonMap, List list, ColumnDesignModel columnDesignModel) { List> realList = new List>(); foreach (var entity in list) { Dictionary query = keyJsonMap; Dictionary realEntity = entity.Data.Deserialize>(); var formData = columnDesignModel.searchList; 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; var type = model.__config__.NCCKey; switch (type) { case NCCKeyConst.DATERANGE: { List dayTime1 = keyValue.Serialize().Deserialize>(); List dayTime2 = realValue.Serialize().Deserialize>(); var newList1 = new List { dayTime1[0].TrimEnd('至') }; var newList2 = new List { dayTime2[0].TrimEnd('至') }; dayTime1.RemoveRange(0, 1); dayTime2.RemoveRange(0, 1); dayTime1.InsertRange(0, newList1); dayTime2.InsertRange(0, newList2); bool cont1 = Ext.timeCalendar(dayTime2[0], dayTime1[0], dayTime1[1]); bool cont2 = Ext.timeCalendar(dayTime2[1], dayTime1[0], dayTime1[1]); if (cont1 || cont2) { realEntity["id"] = entity.Id; m++; } } break; case NCCKeyConst.DATE: { List queryTime = keyValue.ToObeject>(); if (Ext.IsInTimeRange(realValue.ToDate(), queryTime[0].TrimEnd('至'), queryTime[1].TrimEnd('至'))) { realEntity["id"] = entity.Id; m++; } } break; case NCCKeyConst.TIME: { List queryTime = keyValue.ToObeject>(); if (Ext.IsInTimeRange(realValue.ToDate(), queryTime[0], queryTime[1])) { realEntity["id"] = entity.Id; m++; } } break; case NCCKeyConst.TIMERANGE: { List dayTime1 = keyValue.Serialize().Deserialize>(); List dayTime2 = realValue.Serialize().Deserialize>(); if (dayTime2 != null) { var newList1 = new List { dayTime1[0].TrimEnd('至') }; var newList2 = new List { dayTime2[0].TrimEnd('至') }; dayTime1.RemoveRange(0, 1); dayTime2.RemoveRange(0, 1); dayTime1.InsertRange(0, newList1); dayTime2.InsertRange(0, newList2); bool cont1 = Ext.timeCalendar(dayTime2[0], dayTime1[0], dayTime1[1]); bool cont2 = Ext.timeCalendar(dayTime2[1], dayTime1[0], dayTime1[1]); if (cont1 || cont2) { realEntity["id"] = entity.Id; m++; } } } break; case "createTime": { List dayTime1 = keyValue.ToObeject>(); if (Ext.IsInTimeRange(realValue.ToDate(), dayTime1[0].TrimEnd('至'), dayTime1.Last().TrimEnd('至'))) { realEntity["id"] = entity.Id; m++; } } break; case "modifyTime": { List dayTime1 = keyValue.ToObeject>(); if (Ext.IsInTimeRange(realValue.ToDate(), dayTime1[0].TrimEnd('至'), dayTime1.Last().TrimEnd('至'))) { realEntity["id"] = entity.Id; m++; } } break; case "numInput": { List numArray = keyValue.ToObeject>(); var numA = numArray.First().ToInt(); var numB = numArray.Last() == null ? Int64.MaxValue : numArray.Last().ToInt(); var numC = realValue.ToInt(); if (numC >= numA && numC <= numB) { realEntity["id"] = entity.Id; m++; } } break; default: { if (model.searchType == 2) { if (realValue.ToString().Contains(keyValue.ToString())) { realEntity["id"] = entity.Id; m++; } } else if (model.searchType == 1) { //多选时为模糊查询 if (model.multiple || type == "checkbox") { if (realValue.ToString().Contains(keyValue.ToString())) { realEntity["id"] = entity.Id; m++; } } else { if (realValue.ToString().Equals(keyValue.ToString())) { realEntity["id"] = entity.Id; m++; } } } } break; } } if (m == dicCount) { realList.Add(realEntity); } } } else { realEntity["id"] = entity.Id; realList.Add(realEntity); } } return realList; } /// /// 查询转换格式 /// /// /// private List> GetQueryDataConversion(List list) { List> realList = new List>(); foreach (var entity in list) { Dictionary realEntity = entity.Data.Deserialize>(); realEntity["id"] = entity.Id; realList.Add(realEntity); } return realList; } #endregion /// /// 获取无表列表数据 /// /// 模板ID /// private async Task> GetList(string modelId) { return await _visualDevModelDataRepository.Where(m => m.VisualDevId == modelId && m.DeleteMark == null).ToListAsync(); } /// /// options无限级 /// /// private List GetTreeOptions(List model, PropsBeanModel props) { List options = new List(); foreach (var item in model) { OptionsModel option = new OptionsModel(); var dicObject = item.Serialize().Deserialize>(); option.label = dicObject[props.label].ToString(); option.value = dicObject[props.value].ToString(); if (dicObject.ContainsKey(props.children)) { var children = dicObject[props.children].Serialize().Deserialize>(); options.AddRange(GetTreeOptions(children, props)); } options.Add(option); } return options; } /// /// 获取动态无限级数据 /// /// /// /// private List> GetDynamicInfiniteData(string data, PropsBeanModel props) { List> list = new List>(); var value = props.value; var label = props.label; var children = props.children; JToken dynamicDataList = JValue.Parse(data); foreach (var info in dynamicDataList) { Dictionary dic = new Dictionary(); dic[value] = info.Value(value); dic[label] = info.Value(label); list.Add(dic); if (info.Value(children) != null && info.Value(children).ToString() != "") { list.AddRange(GetDynamicInfiniteData(info.Value(children).ToString(), props)); } } return list; } /// /// 将有表转无表 /// /// /// /// private List GetTableDataList(List> dicList, string mainPrimary) { List list = new List(); foreach (var dataMap in dicList) { VisualDevModelDataEntity entity = new VisualDevModelDataEntity(); //需要将小写的转为大写 entity.Data = dataMap.ToJson(); entity.Id = dataMap[mainPrimary].ToString(); list.Add(entity); } return list; } /// /// 获取有表单条数据 /// /// /// private 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()) && !dataValue.ToString().Contains("[]")) { var model = fieldsModels.Find(f => f.__vModel__ == strKey[i]); if (model != null) { switch (model.__config__.NCCKey) { //日期选择 case "date": { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, "List"); } break; //创建时间 case "createTime": { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, "List"); } break; //修改选择 case "modifyTime": { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, "List"); } break; default: dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, actionType); break; } } } } } return dataList; } /// /// 转换字典列表内是否有时间戳 /// /// /// private List> GetTableDataListByDic(List> dicList, List fieldsModels) { List> list = new List>(); foreach (var dataMap in dicList) { 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__ == strKey[i]); if (model != null) { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, "transition"); } } } list.Add(dataMap); } return list; } /// /// 获取有表单条数据 转时间戳 /// /// /// /// /// private List> GetTableDataInfoByTimeStamp(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()) && !dataValue.ToString().Contains("[]")) { var model = fieldsModels.Find(f => f.__vModel__ == strKey[i]); if (model != null) { dataMap[strKey[i]] = TemplateControlsDataConversion(dataMap[strKey[i]], model, actionType); } } } } return dataList; } #endregion #region PublicMethod /// /// 模板数据转换 /// /// /// public List TemplateDataConversion(List fieldsModelList) { var template = new List(); //将模板内的无限children解析出来 //不包含子表children foreach (var item in fieldsModelList) { var config = item.__config__; switch (config.NCCKey) { //栅格布局 case "row": { template.AddRange(TemplateDataConversion(config.children)); } break; //表格 case "table": { template.Add(item); } break; //卡片 case "card": { template.AddRange(TemplateDataConversion(config.children)); } break; //折叠面板 case "collapse": { foreach (var collapse in config.children) { template.AddRange(TemplateDataConversion(collapse.__config__.children)); } } break; case "tab": foreach (var collapse in config.children) { template.AddRange(TemplateDataConversion(collapse.__config__.children)); } break; //文本 case "NCCText": break; //分割线 case "divider": break; //分组标题 case "groupTitle": break; default: { template.Add(item); } break; } } return template; } /// /// 获取有表详情系统组件数据 /// /// /// /// /// public async Task GetTableInfoBySystemComponentsData(string id, List modelList, string data) { //获取Redis缓存模板数据 var templateData = await GetVisualDevTemplateData(id, modelList); data = await GetSystemComponentsData(modelList, templateData, data); return data; } /// /// 删除无表数据 /// /// /// public async Task DelIsNoTableInfo(string id, VisualDevEntity templateEntity) { var ids = new List(); ids.Add(id); id = ids.FirstOrDefault(); if (id != null) { var entity = await _visualDevModelDataRepository.FirstOrDefaultAsync(v => v.Id == id && v.DeleteMark == null); _ = entity ?? throw NCCException.Oh(ErrorCode.COM1007); try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //删除无表表数据 await _visualDevModelDataRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).UpdateColumns(it => new { it.DeleteMark, it.DeleteTime, it.DeleteUserId }).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync(); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } } /// /// 批量删除无表数据 /// /// ID数组 /// public async Task BatchDelIsNoTableData(List ids, VisualDevEntity templateEntity) { ids = ids.Where(i => i != null).ToList(); if (ids.Count > 0) { var dataList = await _visualDevModelDataRepository.Entities.In(r => r.Id, ids.Where(i => i != null).ToArray()).Where(v => v.DeleteMark == null).ToListAsync(); try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //删除有表数据 await _visualDevModelDataRepository.Context.Updateable(dataList).UpdateColumns(it => new { it.DeleteMark, it.DeleteTime, it.DeleteUserId }).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync(); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } } /// /// 删除有表信息 /// /// 主键 /// 模板实体 /// public async Task DelHaveTableInfo(string id, VisualDevEntity templateEntity) { var ids = new List(); ids.Add(id); id = ids.FirstOrDefault(); if (ids.Count > 0) { List tableMapList = templateEntity.Tables.ToObject>(); //获取详情模板 FormDataModel formDataModel = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject(); List formData = formDataModel.fields; var tableList = new List(); //获取主表 var mainTable = tableMapList.Find(t => t.relationTable == ""); var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable.table); //获取主键 var mainPrimary = tableList.Find(t => t.primaryKey == 1); //拼接语句 //主表删除语句 StringBuilder delMain = new StringBuilder(); //总删除语句 StringBuilder allDelSql = new StringBuilder(); //查询主表信息语句 StringBuilder queryMain = new StringBuilder(); //子表删除语句 StringBuilder childSql = new StringBuilder(); delMain.AppendFormat("delete from {0} where {1} = '{2}';", mainTable.table, mainPrimary.field, id); allDelSql.Append(delMain); queryMain.AppendFormat("select * from {0} where {1}='{2}';", tableMapList.FirstOrDefault().table, mainPrimary.field, id); var mainData = _databaseService.GetInterFaceData(link, queryMain.ToString()).Serialize().Deserialize>>(); List> mainMapList = GetTableDataInfo(mainData, formData, null); if (mainMapList.Count > 0) { if (tableMapList.Count > 1) { //去除主表 tableMapList.Remove(mainTable); foreach (var tableMap in tableMapList) { //主表字段 string relationField = tableMap.relationField; string relationFieldValue = mainMapList.First()[relationField].ToString(); //子表字段 string tableField = tableMap.tableField; childSql.AppendFormat("delete from {0} where {1} = '{2}';", tableMap.table, tableField, relationFieldValue); allDelSql.Append(childSql); } } try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //删除有表数据 await _databaseService.ExecuteSql(link, allDelSql.ToString()); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } } } /// /// 批量删除有表数据 /// /// id数组 /// 模板实体 /// public async Task BatchDelHaveTableData(List ids, VisualDevEntity templateEntity) { if (ids.Count > 0) { List tableMapList = templateEntity.Tables.ToObject>(); //获取详情模板 FormDataModel formDataModel = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).ToObject(); List formData = formDataModel.fields; var tableList = new List(); //获取主表 var mainTable = tableMapList.Find(t => t.relationTable == ""); var link = await _dbLinkService.GetInfo(templateEntity.DbLinkId); tableList = _databaseService.GetFieldListByNoAsync(link, mainTable.table); //获取主键 var mainPrimary = tableList.Find(t => t.primaryKey == 1); //拼接语句 //主表删除语句 StringBuilder delMain = new StringBuilder(); //总删除语句 StringBuilder allDelSql = new StringBuilder(); //查询主表信息语句 StringBuilder queryMain = new StringBuilder(); //子表删除语句 StringBuilder childSql = new StringBuilder(); delMain.AppendFormat("delete from {0} where {1} in ('{2}');", mainTable.table, mainPrimary.field, string.Join("','", ids.ToArray())); allDelSql.Append(delMain); queryMain.AppendFormat("select * from {0} where {1} in ('{2}');", tableMapList.FirstOrDefault().table, mainPrimary.field, string.Join("','", ids.ToArray())); var mainData = _databaseService.GetInterFaceData(link, queryMain.ToString()).Serialize().Deserialize>>(); List> mainMapList = GetTableDataInfo(mainData, formData, null); if (mainMapList.Count > 0) { if (tableMapList.Count > 1) { //去除主表 tableMapList.Remove(mainTable); foreach (var tableMap in tableMapList) { //主表字段 string relationField = tableMap.relationField; string relationFieldValue = mainMapList.First()[relationField].ToString(); //子表字段 string tableField = tableMap.tableField; childSql.AppendFormat("delete from {0} where {1} = '{2}';", tableMap.table, tableField, relationFieldValue); allDelSql.Append(childSql); } } try { //开启事务 _visualDevModelDataRepository.Context.BeginTran(); //删除有表数据 await _databaseService.ExecuteSql(link, allDelSql.ToString()); //关闭事务 _visualDevModelDataRepository.Context.CommitTran(); } catch (Exception) { _visualDevModelDataRepository.Context.RollbackTran(); throw; } } } } /// /// 动态表单时间格式转换 /// /// /// private List> DateConver(List> diclist) { foreach (var item in diclist) { foreach (var dic in item.Keys) { if (item[dic] is DateTime) { item[dic] = item[dic].ToString() + " "; } } } return diclist; } #endregion } }