using APT.BaseData.Domain.Entities; using APT.BaseData.Domain.Enums; using APT.Infrastructure.Core; using APT.MS.Domain.ApiModel; using APT.BaseData.Domain.Entities.FM; using APT.BaseData.Domain.IServices.EX; using APT.Utility; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using APT.Utility; using APT.BaseData.Domain.ApiModel; using APT.BaseData.Domain.ApiModel.Platform; using APT.Infrastructure.Api.Redis; using System.Configuration; namespace APT.FM.WebApi.Controllers.Api.FM { [Route("api/FM/UserCCQuery")] [APT.Infrastructure.Api.RootOrg] public class UserCCQueryController : AuthorizeApiController { /// /// 查询 /// /// /// [HttpPost, Route("Entities")] public JsonActionResult> Entities([FromBody] KeywordFilter filter) { return WitEntities(null, filter); } /// /// 查询 /// /// /// /// [HttpPost, Route("OrderEntities")] public JsonActionResult> OrderEntities([FromBody] KeywordFilter filter) { return WitOrderEntities(null, filter); } /// /// 查询 /// /// /// [HttpPost, Route("Paged")] public PagedActionResult Paged([FromBody] KeywordPageFilter pageFilter) { return WitPaged(null, pageFilter); } /// /// 查询 /// /// /// [HttpPost, Route("OrderPaged")] public PagedActionResult OrderPaged([FromBody] KeywordPageFilter pageFilter) { return WitOrderPaged(null, pageFilter); } /// /// 删除 /// /// /// [HttpGet, Route("Delete")] public JsonActionResult Delete(string id) { return WitDelete(id); } /// /// 更新 /// /// /// [HttpPost, Route("Update")] public JsonActionResult Update([FromBody] T_FM_USER_C_C_QUERY entity) { return WitUpdate(entity); } /// /// 批量删除 /// /// /// [HttpGet, Route("BatchDelete")] public JsonActionResult BatchDelete(string ids) { return WitBatchDelete(ids); } /// /// 获得单条实体数据 /// /// /// [HttpPost, Route("Get")] public JsonActionResult Get([FromBody] KeywordFilter filter) { return WitEntity(null, filter); } /// /// 查询实体并获取枚举 /// /// /// [HttpPost, Route("OrderEntitiesOnEnum")] public JsonActionResult> OrderEntitiesOnEnum([FromBody] KeywordFilter filter) { return SafeExecute>(() => { var tmps = this.GetOrderEntities(null, filter); var list = tmps.ToList(); if (list != null && list.Any()) { list.ForEach(t => { if (t.Nav_Fields != null && t.Nav_Fields.Any()) { t.Nav_Fields.Where(t1 => t1.DATA_TYPE == (int)PFDataTypeEnum.枚举 && !string.IsNullOrEmpty(t1.ENUM_NAME)).ForEach(t1 => { t1.ENUM_NAME = DataHelper.EnumToString(t1.ENUM_NAME); }); } }); } return list; }); } private void GetDeleteChildGroupId(List list, List deleteGroupIds) { var temps = list.Where(t => deleteGroupIds.Contains(t.PARENT_ID ?? Guid.Empty)).ToList(); temps.ForEach(t => { if (!deleteGroupIds.Contains(t.ID)) deleteGroupIds.Add(t.ID); this.GetDeleteChildGroupId(list, deleteGroupIds); }); } private void DoFullUpdate(T_FM_USER_C_C_QUERY entity) { var fields = entity.Nav_Fields; var groups = entity.Nav_Groups; entity.Nav_Groups = null; entity.Nav_Fields = null; if (fields != null && fields.Any()) fields.ForEach(t => t.USER_C_C_QUERY_ID = entity.ID); if (groups != null && groups.Any()) groups.ForEach(t => t.USER_C_C_QUERY_ID = entity.ID); List deleteFieldIds = new List(); List deleteGroupIds = new List(); var dbEntity = this.GetEntity(entity.ID.ToString(), new string[] { "Nav_Fields", "Nav_Groups" }); if (dbEntity != null) { if (dbEntity.Nav_Groups != null) { dbEntity.Nav_Groups.ForEach(item => { var group = groups == null ? null : groups.FirstOrDefault(t => t.ID == item.ID); if (group == null) deleteGroupIds.Add(item.ID); if (group != null) { group.CREATER_ID = item.CREATER_ID; group.CREATE_TIME = item.CREATE_TIME; } }); this.GetDeleteChildGroupId(dbEntity.Nav_Groups.ToList(), deleteGroupIds); } if (dbEntity.Nav_Fields != null) { dbEntity.Nav_Fields.ForEach(item => { var field = fields == null ? null : fields.FirstOrDefault(t => t.ID == item.ID); if (field == null || deleteGroupIds.Any(t => t == item.USER_C_C_QUERY_GROUP_ID)) deleteFieldIds.Add(item.ID); if (field != null) { field.CREATER_ID = item.CREATER_ID; field.CREATE_TIME = item.CREATE_TIME; } }); } } if (deleteGroupIds != null && deleteGroupIds.Any()) fields = fields.Where(t => !deleteGroupIds.Contains(t.USER_C_C_QUERY_GROUP_ID ?? Guid.Empty)).ToList(); List updateList = null; if (entity.IS_DEFAULT && (dbEntity == null || !dbEntity.IS_DEFAULT)) { updateList = this.GetEntities(t => t.PAGE_FORM_ID == entity.PAGE_FORM_ID && t.ID != entity.ID, new BaseFilter()).ToList(); if (updateList != null && updateList.Any()) { updateList.ForEach(t => { t.IS_DEFAULT = false; }); } } UnifiedCommit(() => { this.UpdateEntityNoCommit(entity); if (groups != null && groups.Any()) this.BantchSaveEntityNoCommit(groups); if (fields != null && fields.Any()) this.BantchSaveEntityNoCommit(fields); if (updateList != null && updateList.Any()) this.BantchUpdateEntityNoCommit(updateList); if (deleteFieldIds.Any()) this.DeleteEntityNoCommit(t => deleteFieldIds.Contains(t.ID)); if (deleteGroupIds.Any()) this.DeleteEntityNoCommit(t => deleteGroupIds.Contains(t.ID)); }); } /// /// 更新 /// /// /// [HttpPost, Route("FullUpdate")] public JsonActionResult FullUpdate([FromBody] T_FM_USER_C_C_QUERY entity) { return SafeExecute(() => { this.DoFullUpdate(entity); return true; }); } /// /// 删除 /// /// /// [HttpGet, Route("FullDelete")] public JsonActionResult FullDelete(string id) { return SafeExecute(() => { if (string.IsNullOrEmpty(id)) return false; var tmpsIds = this.GetEntities(t => t.USER_C_C_QUERY_ID == new Guid(id), new BaseFilter()). Select(t => t.ID).ToList(); if (tmpsIds != null && tmpsIds.Any()) foreach (var item in tmpsIds) this.DeleteEntity(item.ToString()); this.DeleteEntity(id); return true; }); } /// ///更新是否默认值 /// /// /// [HttpPost, Route("UpdateIsDefault")] public JsonActionResult UpdateIsDefault([FromBody] KeywordFilter filter) { return SafeExecute(() => { string id = filter.Keyword;//查询方案ID bool isDefault = string.IsNullOrEmpty(filter.Parameter1) ? false : LibUtils.ToBoolean(filter.Parameter1);//是否默认 if (string.IsNullOrEmpty(id)) return false; var query = this.GetEntity(id); if (query == null) return false; query.IS_DEFAULT = isDefault; List updateList = null; if (isDefault) { updateList = this.GetEntities(t => t.PAGE_FORM_ID == query.PAGE_FORM_ID && t.ID != query.ID, new BaseFilter()).ToList(); if (updateList != null && updateList.Any()) { updateList.ForEach(t => { t.IS_DEFAULT = false; }); } } this.UpdateEntity(query); if (updateList != null && updateList.Any()) this.BantchUpdateEntity(updateList); return true; }); } /// /// 获取用户查询配置并且查询字段 /// /// /// [HttpPost, Route("GetQueryFieldByUserQuery")] public JsonActionResult GetQueryFieldByUserQuery([FromBody] KeywordFilter filter) { return base.SafeExecute(() => { string formIdStr = filter.Keyword;//表单ID; string queryId = filter.Parameter1;//用户自定义查询方案ID string userId = filter.Parameter2;//用户ID string code = filter.Parameter3;//编号 bool isCopyFromSys = string.IsNullOrEmpty(filter.Parameter4) ? false : LibUtils.ToBoolean(filter.Parameter4);//从系统查询中拷贝 string copyCCQueryId = filter.Parameter5;//拷贝Id UserCCQueryModel model = new UserCCQueryModel(); if (string.IsNullOrEmpty(formIdStr)) throw new Exception("请选择表单ID"); var redisCode = string.Format(RedisCacheKey.TableUserConfigRedisKey, queryId,filter.GetOrgId()); bool isRedisConfig = true; var redisConfig =APT.Infrastructure.Api.ConfigurationManager.AppSettings["RedisFormConfig"]; if (!string.IsNullOrEmpty(redisConfig)) isRedisConfig = bool.Parse(redisConfig); if (isRedisConfig) { if (CsRedisManager.KeyExists(redisCode)) return CsRedisManager.GetClient().Get(redisCode); } //var baseFilter = new BaseFilter(); //baseFilter.SelectField = new string[] { "ID", "CODE" }; //baseFilter.IsNoTranking = true; T_PF_FORM form = this.GetEntity(formIdStr); if (form == null) throw new Exception("无效表单"); var entityOperateService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService(); Dictionary existFields = new Dictionary(); //Expression> queryExpression = t => t.PAGE_FORM_ID == form.ID; var formQuerys = this.GetEntitiesByRedis(null, new BaseFilter(filter.GetOrgId()), form.ID.ToString()); var formQuery = formQuerys.FirstOrDefault(); List querys = null; filter.Sort = "NUM"; if (formQuery != null) { //Expression> expression = t => t.PAGE_FORM_QUERY_ID == formQuery.ID; //if (!string.IsNullOrEmpty(code)) // expression = expression.And(t => t.CODE == code); //querys = this.GetEntities(expression, new BaseFilter()).ToList(); querys = this.GetEntitiesByRedis(null, new BaseFilter(filter.GetOrgId()), formQuery.ID.ToString()) .ToList(); if (!string.IsNullOrEmpty(code)) querys = querys.Where(t => t.CODE == code).ToList(); } List expandFields = null; if (!string.IsNullOrEmpty(queryId)) { //var userCCQuery = this.GetEntity(queryId, new string[] { "Nav_Fields", "Nav_Groups" }); T_FM_USER_C_C_QUERY userCCQuery = null; userCCQuery = GetCCQueryByRedis(filter, queryId); if (userCCQuery == null) { T_FM_USER_C_C_QUERY copyUserCCQuery = string.IsNullOrEmpty(copyCCQueryId) ? null : GetCCQueryByRedis(filter, copyCCQueryId); userCCQuery = new T_FM_USER_C_C_QUERY(); userCCQuery.ID = new Guid(queryId); userCCQuery.ORG_ID = filter.OrgId; if (copyUserCCQuery != null) { CopyUtils.CopyObject(userCCQuery, copyUserCCQuery); userCCQuery.TITLE = userCCQuery.TITLE + "-副本"; } userCCQuery.PAGE_FORM_ID = form.ID; //拷贝系统查询方案 if (isCopyFromSys && querys != null && querys.Any()) { userCCQuery.Nav_Fields = new List(); querys.ForEach(t => { T_FM_USER_C_C_QUERY_FIELD field = new T_FM_USER_C_C_QUERY_FIELD(); field.ORG_ID = userCCQuery.ORG_ID; field.USER_C_C_QUERY_ID = userCCQuery.ID; CopyUtils.CopyObject(field, t); if (!string.IsNullOrEmpty(code)) field.CODE = code; field.IS_SYS_QUERY_FIELD = true; userCCQuery.Nav_Fields.Add(field); }); } Dictionary groupIdRelations = new Dictionary();//拷贝分组ID和新增分组ID对应关系列表 //拷贝已有的自定义查询方案 分组 if (copyUserCCQuery != null && copyUserCCQuery.Nav_Groups != null && copyUserCCQuery.Nav_Groups.Any()) { var tmps = copyUserCCQuery.Nav_Groups.OrderBy(t => t.NUM).ToList(); userCCQuery.Nav_Groups = new List(); this.GetGroupByList(tmps, null, null, userCCQuery, code, groupIdRelations); } //拷贝已有的自定义查询方案 字段 if (copyUserCCQuery != null && copyUserCCQuery.Nav_Fields != null && copyUserCCQuery.Nav_Fields.Any()) { var tmps = copyUserCCQuery.Nav_Fields.OrderBy(t => t.NUM).ToList(); userCCQuery.Nav_Fields = new List(); tmps.ForEach(t => { Guid? currGroupId = null; if (t.USER_C_C_QUERY_GROUP_ID != null) { if (!groupIdRelations.TryGetValue(t.USER_C_C_QUERY_GROUP_ID.Value, out currGroupId)) return; } T_FM_USER_C_C_QUERY_FIELD field = new T_FM_USER_C_C_QUERY_FIELD(); field.ORG_ID = userCCQuery.ORG_ID; CopyUtils.CopyObject(field, t); field.USER_C_C_QUERY_ID = userCCQuery.ID; field.USER_C_C_QUERY_GROUP_ID = currGroupId; if (!string.IsNullOrEmpty(code)) field.CODE = code; userCCQuery.Nav_Fields.Add(field); }); } var customConfigs = this.GetEntitiesByRedis(null, new BaseFilter(filter.GetOrgId()), userId); var customConfig = customConfigs.FirstOrDefault(); if (customConfig == null) { customConfig = new T_FM_USER_CUSTOM_CONFIG(); customConfig.ORG_ID = filter.OrgId; customConfig.USER_ID = new Guid(userId); this.AddEntity(customConfig); } userCCQuery.USER_CUSTOM_CONFIG_ID = customConfig.ID; } model.Nav_UserCCQuery = userCCQuery; if (userCCQuery != null && userCCQuery.Nav_Fields != null && userCCQuery.Nav_Fields.Any()) { Dictionary expandFieldDic = new Dictionary(); model.Nav_UserCCQuery.Nav_Fields.ForEach(t => { if (t.IS_SYS_QUERY_FIELD || !string.IsNullOrEmpty(t.QUERY_NAME)) return; var tmps = t.QUERY_NAME.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (tmps.Count >= 1) { tmps.RemoveAt(tmps.Count - 1); var expand = string.Join(".", tmps); if (!expandFieldDic.ContainsKey(expand)) expandFieldDic.Add(expand, 0); } }); expandFields = expandFieldDic.Keys.ToList(); } } var fields = entityOperateService.GetEntityFieldsByQueryFormId(form.ID, code, string.Empty, string.Empty, expandFields, filter); if (fields != null && fields.Any()) fields.ForEach(t => model.Nav_Fields.Add(t)); CsRedisManager.GetClient().Set(redisCode, model); return model; }); } private T_FM_USER_C_C_QUERY GetCCQueryByRedis(KeywordFilter filter, string queryId) { T_FM_USER_C_C_QUERY userCCQuery = this.GetEntityByRedis(queryId, filter.GetOrgId()); if (userCCQuery != null) { var fileds = this.GetEntitiesByRedis(filter) .Where(t => t.USER_C_C_QUERY_ID == userCCQuery.ID).ToList(); userCCQuery.Nav_Fields = fileds; var groups = this.GetEntitiesByRedis(filter) .Where(t => t.USER_C_C_QUERY_ID == userCCQuery.ID).ToList(); userCCQuery.Nav_Groups = groups; } return userCCQuery; } private void GetGroupByList(List list, Guid? parentId, Guid? currParentId, T_FM_USER_C_C_QUERY userCCQuery, string code, Dictionary groupIdRelations) { var tmps = list == null ? null : list.Where(t => t.PARENT_ID == parentId).ToList(); if (tmps == null || !tmps.Any()) return; tmps.ForEach(t => { T_FM_USER_C_C_QUERY_GROUP group = new T_FM_USER_C_C_QUERY_GROUP(); group.ORG_ID = userCCQuery.ORG_ID; CopyUtils.CopyObject(group, t); group.USER_C_C_QUERY_ID = userCCQuery.ID; if (!string.IsNullOrEmpty(code)) group.CODE = code; group.PARENT_ID = currParentId; userCCQuery.Nav_Groups.Add(group); groupIdRelations[t.ID] = group.ID; GetGroupByList(list, t.ID, group.ID, userCCQuery, code, groupIdRelations); }); } /// /// 获取查询字段 /// /// /// [HttpPost, Route("GetQueryFields")] public JsonActionResult> GetQueryFields([FromBody] KeywordFilter filter) { return SafeExecute>(() => { string formIdStr = filter.Keyword;//表单ID; string curFieldName = filter.Parameter1;//当前字段名称 string tableName = filter.Parameter2;//表名 string lablePrefix = filter.Parameter3;//显示名称前缀 var entityOperateService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService(); return entityOperateService.GetEntityFieldsByTableName(tableName, curFieldName, lablePrefix, null); }); } /// /// 保存查询字段默认值 /// /// /// [HttpPost, Route("SaveQueryFieldDefaultValue")] public JsonActionResult SaveQueryFieldDefaultValue([FromBody] T_FM_USER_C_C_QUERY entity) { return SafeExecute(() => { var dbEntity = this.GetEntity(entity.ID.ToString()); dbEntity.Nav_Groups = entity.Nav_Groups; dbEntity.Nav_Fields = entity.Nav_Fields; this.DoFullUpdate(dbEntity); return true; }); } } }