//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2022-03-28 16:46:23 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore.Common; using MassTransit; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Npgsql; namespace IRaCIS.Core.Application.Service { /// /// FrontAuditConfigService /// [ApiExplorerSettings(GroupName = "Reviewer")] public class FrontAuditConfigService( IRepository _frontAuditConfigRepository, IRepository _qCChallengeDialogRepository, IRepository _dataInspectionRepository, IRepository _qCChallengeRepository, IRepository _dictionaryRepository, IRepository _trialRepository, IRepository _userRepository, IRepository _checkChallengeDialogRepository) : BaseService, IFrontAuditConfigService { /// /// 获取数据库所有表 /// /// [HttpPost] public List GetDatabaseTables() { return _frontAuditConfigRepository._dbContext.GetContextTablesList(); } /// /// 获取查询对象 /// /// /// [HttpPost] public async Task> GetDialogList(AccessToDialogueInDto inDto) { List data = new List(); switch (inDto.Type) { case AccessToDialogueEnum.Question: AccessToDialogueOutDto title = (await _qCChallengeRepository.Where(x => x.Id == inDto.Id).Include(x => x.CreateUser).Select(x => new AccessToDialogueOutDto() { CreateTime = x.CreateTime, CreateUserName = x.CreateUser.UserName, TalkContent = x.Content, IsTitle = true, }).FirstOrDefaultAsync()) ?? new AccessToDialogueOutDto(); data = await _qCChallengeDialogRepository.Where(x => x.QCChallengeId == inDto.Id && x.CreateTime <= inDto.Createtime).Include(x => x.CreateUser).Select( x => new AccessToDialogueOutDto() { CreateTime = x.CreateTime, CreateUserName = x.CreateUser.UserName, TalkContent = x.TalkContent } ).OrderBy(x => x.CreateTime).ToListAsync(); data.Insert(0, title); break; case AccessToDialogueEnum.Consistency: data = await _checkChallengeDialogRepository.Where(x => x.SubjectVisitId == inDto.Id && x.CreateTime <= inDto.Createtime).Include(x => x.CreateUser).Select( x => new AccessToDialogueOutDto() { CreateTime = x.CreateTime, CreateUserName = x.CreateUser.UserName, TalkContent = x.TalkContent } ).OrderBy(x => x.CreateTime).ToListAsync(); break; } return data; } /// /// 获取表列名 /// /// [HttpPost] public List GetTableColumn(string tableName) { return _frontAuditConfigRepository._dbContext.GetContextTableColumnList(tableName); } /// /// 复制配置项及其子项 /// /// 传入对象 /// [HttpPost] public async Task CopyFrontAuditConfigItem(CopyFrontAuditConfigItemDto input) { var id = NewId.NextGuid(); List frontAudits = new List(); var frontAuditConfig = (await _frontAuditConfigRepository.FirstOrDefaultAsync(x => x.Id == input.ChildId)).Clone(); var fronts = await _frontAuditConfigRepository.Where(x => x.ParentId == frontAuditConfig.Id).ToListAsync(); fronts.ForEach(x => { x.Id = NewId.NextGuid(); x.ParentId = id; }); frontAuditConfig.ParentId = input.ParentId; frontAuditConfig.Id = id; frontAudits.Add(frontAuditConfig); frontAudits.AddRange(fronts); await _frontAuditConfigRepository.AddRangeAsync(frontAudits); await _frontAuditConfigRepository.SaveChangesAsync(); } /// /// 批量添加字段 /// /// 数据集 /// public async Task BatchAddFrontAudit(BatchAddFrontAudit data) { var maxSort = await _frontAuditConfigRepository.Where(x => x.ParentId == data.ParentId).MaxAsync(x => x.Sort); List fronts = new List(); foreach (var item in data.Columns) { maxSort++; fronts.Add(new FrontAuditConfig() { Sort = maxSort, Code = item.Name, ValueCN = item.Remake, IsEnable = true, ParentId = data.ParentId }); } await _frontAuditConfigRepository.AddRangeAsync(fronts); } /// /// 翻译稽查数据 /// /// /// [HttpPost] public async Task> SetInspectionEnumValue(SetInspectionEnumValueDto dto) { return await SetInspectionEnumValueDataList(dto, dto.AuditDataIds.FirstOrDefault()); } public async Task> GetInspectionJsonDataList(Guid trialId, Guid id) { //找到上一条Id var currentInspection = await _dataInspectionRepository.Where(t => t.Id == id).Select(t => new { t.GeneralId, t.ObjectRelationParentId, t.CreateTime }).FirstNotNullAsync(); var beforeId = await _dataInspectionRepository.Where(x => x.GeneralId == currentInspection.GeneralId && x.CreateTime <= currentInspection.CreateTime && x.Id != id).OrderByDescending(x => x.CreateTime).Select(t => t.Id) .FirstOrDefaultAsync(); List searchGuidList = new List() { id }; if (beforeId != Guid.Empty) { searchGuidList.Add(beforeId); } return await SetInspectionEnumValueDataList(new SetInspectionEnumValueDto() { TrialId = trialId, AuditDataIds = searchGuidList }, id); } /// /// 翻译稽查数据 /// /// /// /// private async Task> SetInspectionEnumValueDataList(SetInspectionEnumValueDto dto, Guid currentInspectionId) { var auditDatas = await _dataInspectionRepository.AsQueryable().Where(x => dto.AuditDataIds.Contains(x.Id)).Select(x => new SetInspectionEnumDataDto() { Id = x.Id, JsonStr = x.JsonDetail, Identification = x.Identification, ObjectRelationParentId = x.ObjectRelationParentId, ObjectRelationParentId2 = x.ObjectRelationParentId2, ObjectRelationParentId3 = x.ObjectRelationParentId3, CreateTime = x.CreateTime, BatchId = x.BatchId, }).ToListAsync(); var listIdentification = auditDatas.Select(x => x.Identification).Distinct().ToList(); foreach (var item in auditDatas) { Dictionary jsonDict = (JsonConvert.DeserializeObject>(item.JsonStr)).IfNullThrowException(); if (!jsonDict.ContainsKey(nameof(InspectionJsonDetail.CommonData))) { jsonDict.Add(nameof(InspectionJsonDetail.CommonData), new { }); } //查询关联父层级数据 if (item.Id == currentInspectionId) { //把父层级的数据的 CommonData 数据合并(每一个层级把下面层级需要的数据放在CommonData 里面) 麻烦点是每个层级都需要记录一些信息,而且名称不能重复 var objectLsit = new List(); var relationParentDataObjList = await GetRelationParentData(item.Id, item.ObjectRelationParentId, item.ObjectRelationParentId2, item.ObjectRelationParentId3, item.CreateTime, item.BatchId, objectLsit); var currentCommonDataDic = JsonConvert.DeserializeObject>(jsonDict[nameof(InspectionJsonDetail.CommonData)].ToJsonStr()); foreach (var relationParentDataObj in relationParentDataObjList) { var otherDic = JsonConvert.DeserializeObject>(relationParentDataObj.ToJsonStr()); foreach (var valuePair in otherDic) { //关联层级的数据 if (valuePair.Key.Contains("_")) { var entityProperName = valuePair.Key.Split("_").ToList().Last(); if (!currentCommonDataDic.ContainsKey(entityProperName)) { currentCommonDataDic.Add(entityProperName, valuePair.Value); } else { if (!currentCommonDataDic.ContainsKey(valuePair.Key)) { currentCommonDataDic.Add(valuePair.Key, valuePair.Value); } } } else { if (!currentCommonDataDic.ContainsKey(valuePair.Key)) { currentCommonDataDic.Add(valuePair.Key, valuePair.Value); } } } } jsonDict[nameof(InspectionJsonDetail.CommonData)] = currentCommonDataDic; } #region Old //item.JsonStr = jsonDict[nameof(InspectionJsonDetail.Data)].ToString(); //if (item.Identification == string.Empty || item.JsonStr == string.Empty) //{ // continue; //} //item.JsonStr = await GetInspectionEnumValue(listIdentification, item.JsonStr); //item.JsonStr = await SetEnum(dto.TrialId, listIdentification, item.JsonStr); //item.JsonStr = await SetDataInspectionDateType(listIdentification, item.JsonStr); //jsonDict[nameof(InspectionJsonDetail.Data)] = JsonConvert.DeserializeObject(item.JsonStr); #endregion #region New var str = jsonDict[nameof(InspectionJsonDetail.Data)].ToString(); if (item.Identification == string.Empty || str == string.Empty) { continue; } str = await GetInspectionEnumValue(listIdentification, item.Identification, str); str = await SetEnum(dto.TrialId, listIdentification, item.Identification, str); str = await SetDataInspectionDateType(listIdentification, item.Identification, str); jsonDict[nameof(InspectionJsonDetail.Data)] = JsonConvert.DeserializeObject(str); var str2 = jsonDict[nameof(InspectionJsonDetail.CommonData)].ToJsonStr(); if (item.Identification == string.Empty || str2 == string.Empty) { continue; } str2 = await GetInspectionEnumValue(listIdentification, item.Identification, str2); str2 = await SetEnum(dto.TrialId, listIdentification, item.Identification, str2); str2 = await SetDataInspectionDateType(listIdentification, item.Identification, str2); jsonDict[nameof(InspectionJsonDetail.CommonData)] = JsonConvert.DeserializeObject(str2); #endregion #region 后续移除 避免前端看到的不统一 因为采用了新的关联方式,之前数据在Data里面取 现在配置在CommonData 里取 //var dataDic = JsonConvert.DeserializeObject>(str); //var commonDic = JsonConvert.DeserializeObject>(str2); //foreach (var valuePair in dataDic) //{ // if (!commonDic.ContainsKey(valuePair.Key)) // { // commonDic.Add(valuePair.Key, valuePair.Value); // } //} //jsonDict[nameof(InspectionJsonDetail.CommonData)] = JsonConvert.DeserializeObject(commonDic.ToJsonStr()); #endregion item.JsonStr = JsonConvert.SerializeObject(jsonDict); } var resultJsonStrList = new List(); dto.AuditDataIds.ForEach(x => { var auditData = auditDatas.FirstOrDefault(y => y.Id == x); resultJsonStrList.Add(auditData?.JsonStr); }); if (resultJsonStrList.Count < 2) { resultJsonStrList.Add(String.Empty); } return resultJsonStrList; } private async Task AddJsonObjectToDic(Guid id, Guid? objectRelationParentId, DateTime createTime, Guid batchId, List objectLsit) { if (objectRelationParentId != null) { //父子层级的数据可能在同一个批次 进行更新 但是后插入的是父层级的数据 找父层级的稽查应该优先同一批次的 var relationParentInspection = await _dataInspectionRepository.Where(t => t.GeneralId == objectRelationParentId && (t.CreateTime <= createTime || t.BatchId == batchId) && t.Id != id).OrderByDescending(x => x.CreateTime).Select(t => new { t.ObjectRelationParentId, t.CreateTime, t.JsonDetail, t.BatchId, t.ObjectRelationParentId2, t.ObjectRelationParentId3, t.EntityName, t.Id }).FirstOrDefaultAsync(); if (relationParentInspection != null) { Dictionary jsonDic = (JsonConvert.DeserializeObject>(relationParentInspection.JsonDetail)).IfNullThrowConvertException(); //避免对象信息记录 把 Data里面的信息也取过去 但是加上稽查对象的前缀 var dataDicObj = jsonDic[nameof(InspectionJsonDetail.Data)]; if (dataDicObj != null) { var entityName = relationParentInspection.EntityName; IDictionary newNamepDic = new Dictionary(); var tempDic = JsonConvert.DeserializeObject>(dataDicObj.ToJsonStr()); foreach (var valuePair in tempDic) { newNamepDic.Add(entityName + "_" + valuePair.Key, valuePair.Value); } objectLsit.Add(newNamepDic); } await AddJsonObjectToDic(relationParentInspection.Id, relationParentInspection.ObjectRelationParentId, relationParentInspection.CreateTime, relationParentInspection.BatchId, objectLsit); await AddJsonObjectToDic(relationParentInspection.Id, relationParentInspection.ObjectRelationParentId2, relationParentInspection.CreateTime, relationParentInspection.BatchId, objectLsit); await AddJsonObjectToDic(relationParentInspection.Id, relationParentInspection.ObjectRelationParentId3, relationParentInspection.CreateTime, relationParentInspection.BatchId, objectLsit); } else { //用户的数据稽查没有 临时处理 var userObj = await _userRepository.Where(t => t.Id == objectRelationParentId).Select(t => new { UserRealName = t.FullName, t.Phone, t.UserName, UserType = t.UserTypeRole.UserTypeShortName, t.EMail, t.OrganizationName }).FirstOrDefaultAsync(); if (userObj != null) { objectLsit.Add(userObj); } } } } private async Task> GetRelationParentData(Guid id, Guid? objectRelationParentId, Guid? objectRelationParentId2, Guid? objectRelationParentId3, DateTime createTime, Guid batchId, List objectLsit) { await AddJsonObjectToDic(id, objectRelationParentId, createTime, batchId, objectLsit); await AddJsonObjectToDic(id, objectRelationParentId2, createTime, batchId, objectLsit); await AddJsonObjectToDic(id, objectRelationParentId3, createTime, batchId, objectLsit); return objectLsit; } /// /// 格式化日期和时间 /// /// /// /// /// private async Task SetDataInspectionDateType(List identificationList, string identification, string jsonStr) { var list = await (from parent in _frontAuditConfigRepository.AsQueryable().Where(x => identificationList.Contains(x.Identification)) join child in _frontAuditConfigRepository.AsQueryable().Where(x => x.EnumType == "Date" && x.IsEnable) on parent.Id equals child.ParentId select new DateDto() { Identification = parent.Identification, Code = child.Code, DateType = child.DateType, }).ToListAsync(); list = list.GroupBy(x => new { x.Code }, (key, lst) => new DateDto() { Code = key.Code, DateType = lst.FirstOrDefault(y => y.Identification == identification)?.DateType ?? lst.Max(x => x.DateType), }).ToList(); var jsonDataDic = JsonConvert.DeserializeObject>(jsonStr); if (jsonDataDic == null) { return jsonStr; } foreach (var item in jsonDataDic.Keys) { var datefirst = list.FirstOrDefault(x => x.Code.ToLower() == item.ToLower()); if (datefirst != null && !IsNullOrEmpty(jsonDataDic[item])) { try { if (datefirst.DateType == FrontAuditDateType.Date.GetDescription()) { jsonDataDic[item] = DateTime.Parse(jsonDataDic[item].ToString()).ToString("yyyy-MM-dd"); } if (datefirst.DateType == FrontAuditDateType.DateTime.GetDescription()) { jsonDataDic[item] = DateTime.Parse(jsonDataDic[item].ToString()).ToString("yyyy-MM-dd HH:mm:ss"); } } catch (Exception) { continue; } } } return JsonConvert.SerializeObject(jsonDataDic); } /// /// 获取外键表数据 /// /// /// /// ///// 表名称 ///// 外键value ///// 要查询的外键值 ///// 传入的纸 private async Task GetInspectionEnumValue(List identificationList, string identification, string jsonStr) { var list = await (from u in _frontAuditConfigRepository.Where(x => identificationList.Contains(x.Identification)) join p in _frontAuditConfigRepository.Where(x => x.EnumType == "Foreign" && x.IsEnable) on u.Id equals p.ParentId select new { Key = p.Code, Identification = u.Identification, ForeignKeyValue = p.ForeignKeyValue, ForeignKeyText = p.ForeignKeyText, p.ForeignKeyEnText, ForeignKeyTable = p.ForeignKeyTableName }).ToListAsync(); list = list.GroupBy(x => new { x.Key }, (key, lst) => new { Key = key.Key, Identification = string.Empty, ForeignKeyValue = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyValue ?? lst.Max(x => x.ForeignKeyValue), ForeignKeyText = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyText ?? lst.Max(x => x.ForeignKeyText), ForeignKeyEnText = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyEnText ?? lst.Max(x => x.ForeignKeyEnText), ForeignKeyTable = lst.FirstOrDefault(y => y.Identification == identification)?.ForeignKeyTable ?? lst.Max(x => x.ForeignKeyTable), }).ToList(); var jsonDataValueDic = (JsonConvert.DeserializeObject>(jsonStr)).IfNullThrowConvertException(); foreach (var item in list) { if (!jsonDataValueDic.ContainsKey(item.Key)) { continue; } string Table = item.ForeignKeyTable; string ForeignKeyValue = item.ForeignKeyValue; string ForeignKeyText = item.ForeignKeyText; if (_userInfo.IsEn_Us && !item.ForeignKeyEnText.IsNullOrEmpty()) { ForeignKeyText = item.ForeignKeyEnText; } if (jsonDataValueDic[item.Key] != null) { string value = jsonDataValueDic[item.Key].ToString(); string para = string.Empty; string sql = string.Empty; var JsonData = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(new { item = value })); if (JsonData["item"].GetType() == typeof(JArray)) { foreach (var v in JsonData["item"] as JArray) { para += para == string.Empty ? $"'{v.ToString()}'" : $",'{v.ToString()}'"; } if (_frontAuditConfigRepository._dbContext.Database.IsSqlServer()) { sql = $"select {ForeignKeyText} Text from [{Table}] where {ForeignKeyValue} in (@para)"; } else if (_frontAuditConfigRepository._dbContext.Database.IsNpgsql()) { //sql = $"select {ForeignKeyText} Text from \"{Table}\" where {ForeignKeyValue} = ANY(STRING_TO_ARRAY(@para, ','))"; } else { throw new Exception("不支持的数据库"); } } else { para = $"{JsonData["item"].ToString()}"; if (_frontAuditConfigRepository._dbContext.Database.IsSqlServer()) { sql = $"select {ForeignKeyText} Text from [{Table}] where {ForeignKeyValue} = @para"; } else if (_frontAuditConfigRepository._dbContext.Database.IsNpgsql()) { sql = $"select \"{ForeignKeyText}\" Text from \"{Table}\" where \"{ForeignKeyValue}\" = @para"; } else { throw new Exception("不支持的数据库"); } //https://learn.microsoft.com/zh-tw/ef/core/querying/sql-queries } if (_frontAuditConfigRepository._dbContext.Database.IsSqlServer()) { jsonDataValueDic[item.Key] = string.Join(",", _frontAuditConfigRepository._dbContext.Database.SqlQueryRaw (sql, new SqlParameter("@para", para)).ToList()); } else if (_frontAuditConfigRepository._dbContext.Database.IsNpgsql()) { jsonDataValueDic[item.Key] = string.Join(",", _frontAuditConfigRepository._dbContext.Database.SqlQueryRaw (sql, new NpgsqlParameter("@para", para)).ToList()); } else { throw new Exception("不支持的数据库"); } } } return JsonConvert.SerializeObject(jsonDataValueDic); } /// /// 获取枚举 /// /// 标识 /// 标识 /// /// Json对象 /// private async Task SetEnum(Guid trialId, List identificationList, string identification, string jsonStr) { if (jsonStr == null || jsonStr == "null") { return null; } //DictionaryCode='' and EnumType='Dictionary' 是审核状态 var list = await (from u in _frontAuditConfigRepository.Where(x => identificationList.Contains(x.Identification)) join p in _frontAuditConfigRepository.Where(x => (x.DictionaryCode != string.Empty && x.EnumType == "Dictionary") || (x.DataType == "Table") && x.IsEnable) on u.Id equals p.ParentId select new { Key = p.Code, Identification = u.Identification, //前端展示类型 DataType = p.DataType, TableConfigJsonStr = p.TableConfigJsonStr, Code = p.DictionaryCode, Type = p.DictionaryType }).ToListAsync(); //两条不同的标识 但是里面配置有相同的翻译字典 list = list.GroupBy(x => new { x.Key }, (key, lst) => new { Key = key.Key, Identification = string.Empty, DataType = lst.FirstOrDefault(y => y.Identification == identification)?.DataType ?? lst.Max(x => x.DataType), TableConfigJsonStr = lst.FirstOrDefault(y => y.Identification == identification)?.TableConfigJsonStr ?? lst.Max(x => x.TableConfigJsonStr), Code = lst.FirstOrDefault(y => y.Identification == identification)?.Code ?? lst.Max(x => x.Code), Type = lst.FirstOrDefault(y => y.Identification == identification)?.Type ?? lst.Max(x => x.Type), }).ToList(); // 添加单双审 var trialtype = await _trialRepository.AsQueryable().Where(x => x.Id == trialId).Select(x => x.QCProcessEnum).FirstOrDefaultAsync(); if (!list.Any(x => x.Key == "AuditState")) { list.Add(new { Key = "AuditState", Identification = string.Empty, DataType = string.Empty, TableConfigJsonStr = string.Empty, Code = trialtype == TrialQCProcess.SingleAudit ? "AuditStatePE" : "AuditStateRC", Type = "Code", }); } var jsonDataDic = JsonConvert.DeserializeObject>(jsonStr); foreach (var item in list) { try { if (!jsonDataDic.ContainsKey(item.Key) || jsonDataDic[item.Key] == null) { continue; } var value = jsonDataDic[item.Key]; //翻译的是数组 if (value.GetType() == typeof(JArray)) { JArray arrays = (JArray)value; //动态配置表翻译 if (item.DataType == "Table") { var tableConfigList = JsonConvert.DeserializeObject>(item.TableConfigJsonStr) ?? new List(); //处理静态翻译 var translateInfoList = tableConfigList.Where(t => t.IsNeedTransalate).Select(t => new { t.ColumnValue, t.TranslateDictionaryName }).Distinct().ToList(); var dictionaryNameList = translateInfoList.Select(t => t.TranslateDictionaryName).Distinct().ToList(); //处理动态翻译 会在数组中提供 一个属性 “DictionaryCode” 这个是默认约束,做稽查的时候记得注意,免得配置麻烦 var dynamicTranslateInfoList = tableConfigList.Where(t => t.IsDynamicTranslate && t.IsList).Select(t => new { t.ListName, t.ColumnValue }).Distinct().ToList(); var dynamicDictionaryNameList = new List(); foreach (var dynamicTranslateInfo in dynamicTranslateInfoList) { var tempNameList = arrays[0][dynamicTranslateInfo.ListName].Select(t => t["DictionaryCode"].ToString()).Where(t => !string.IsNullOrEmpty(t)).ToList(); dynamicDictionaryNameList.AddRange(tempNameList); dynamicDictionaryNameList = dynamicDictionaryNameList.Distinct().ToList(); } var specialDynamicColumnValueList = new List(); if (tableConfigList.Any(t => t.IsDynamicTranslate && t.IsList == false)) { // 兼容之前数组的那种方式 实际配置只会配置一条 specialDynamicColumnValueList = tableConfigList.Where(t => t.IsDynamicTranslate && t.IsList == false) .Select(t => t.ColumnValue).Distinct().ToList(); var dicNames = arrays.Where(t => !string.IsNullOrEmpty(t["DictionaryCode"].ToString())).Select(t => t["DictionaryCode"].ToString()).Distinct().ToList(); dictionaryNameList.AddRange(dicNames); } var allDictionaryNameList = dictionaryNameList.Union(dynamicDictionaryNameList).Distinct(); var searchList = await _dictionaryRepository.Where(t => allDictionaryNameList.Contains(t.Parent.Code) && t.ParentId != null && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); //翻译的字典数据 var translateDataList = searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList()); List jsonList = new List(); foreach (JToken arraysItem in arrays) { var jsonObject = JObject.Parse(arraysItem.ToString()); //处理静态翻译 foreach (var translateInfo in translateInfoList) { //Json 解析后 true 变为了True jsonObject[translateInfo.ColumnValue] = translateDataList[translateInfo.TranslateDictionaryName].Where(t => t.Code.ToLower() == jsonObject[translateInfo.ColumnValue]?.ToString().ToLower()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefault(); } foreach (var specialDynamicColumnValue in specialDynamicColumnValueList) { jsonObject[specialDynamicColumnValue] = translateDataList[jsonObject["DictionaryCode"].ToString()].Where(t => t.Code.ToLower() == jsonObject[specialDynamicColumnValue]?.ToString().ToLower()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefault(); } //处理动态翻译 foreach (var dynamicTranslateInfo in dynamicTranslateInfoList) { var innerArrays = (JArray)jsonObject[dynamicTranslateInfo.ListName]; List innberJsonList = new List(); foreach (var innerItem in innerArrays) { var innerObject = JObject.Parse(innerItem.ToString()); var dicName = innerObject["DictionaryCode"]?.ToString(); if (dicName != null && !string.IsNullOrEmpty(dicName)) { innerObject[dynamicTranslateInfo.ColumnValue] = translateDataList[dicName].Where(t => t.Code.ToLower() == innerObject[dynamicTranslateInfo.ColumnValue].ToString().ToLower()).Select(t => _userInfo.IsEn_Us ? t.Value : t.ValueCN).FirstOrDefault(); } innberJsonList.Add(innerObject); } jsonObject[dynamicTranslateInfo.ListName] = JToken.FromObject(innberJsonList); } jsonList.Add(jsonObject); } jsonDataDic[item.Key] = JToken.FromObject(jsonList); continue; } if (item.Type.ToLower() == FrontAudit.Id.GetDescription().ToLower()) { List guids = new List(); arrays.ForEach(x => { guids.Add(Guid.Parse(x.ToString())); }); jsonDataDic[item.Key] = string.Join(',', await _dictionaryRepository.Where(x => guids.Contains(x.Id)).Select(x => _userInfo.IsEn_Us ? x.Value : x.ValueCN).ToListAsync()); } else if (item.Type.ToLower() == FrontAudit.ChildGroup.GetDescription().ToLower()) { List guids = new List(); arrays.ForEach(x => { guids.Add(x.ToString()); }); jsonDataDic[item.Key] = string.Join(',', await _dictionaryRepository.Where(x => x.Code == item.Code).GroupJoin( _dictionaryRepository.Where(x => guids.Contains(x.ChildGroup)), a => a.Id, b => b.ParentId, (a, b) => new { parent = b }).SelectMany(a => a.parent, (m, n) => new { value = _userInfo.IsEn_Us ? n.Value : n.ValueCN }).Select(x => x.value).ToListAsync() ); } //稽查 后端查询记录出表格数据,但是表格数据需要翻译,显示给出了翻译字典名,翻译的配置 else if (item.Type.ToLower() == FrontAudit.DictionaryType.GetDescription().ToLower()) { List jsonList = new List(); foreach (JToken arraysItem in arrays) { var jsonObject = JObject.Parse(arraysItem.ToString()); try { if (jsonObject["DictionaryCode"] != null && jsonObject["DictionaryCode"].ToString() != string.Empty) { jsonObject[item.Code] = await _dictionaryRepository.Where(x => x.Code == jsonObject["DictionaryCode"].ToString()).Join(_dictionaryRepository.Where(x => x.Code == jsonObject[item.Code].ToString()), a => a.Id, b => b.ParentId, (a, b) => new { value = _userInfo.IsEn_Us ? b.Value : b.ValueCN }).Select(x => x.value).FirstOrDefaultAsync(); } jsonList.Add(jsonObject); } catch (Exception) { jsonList.Add(jsonObject); } } jsonDataDic[item.Key] = JToken.FromObject(jsonList); } else { List guids = new List(); arrays.ForEach(x => { guids.Add(x.ToString()); }); jsonDataDic[item.Key] = string.Join(',', await _dictionaryRepository.Where(x => x.Code == item.Code).GroupJoin( _dictionaryRepository.Where(x => guids.Contains(x.Code)), a => a.Id, b => b.ParentId, (a, b) => new { parent = b }).SelectMany(a => a.parent, (m, n) => new { value = _userInfo.IsEn_Us ? n.Value : n.ValueCN }).Select(x => x.value).ToListAsync() ); } } //翻译的是单个字段 else { //通过字典项的Guid 翻译 if (item.Type.ToLower() == FrontAudit.Id.GetDescription().ToLower()) { Guid guid = Guid.Parse(value.ToString()); jsonDataDic[item.Key] = await _dictionaryRepository.Where(x => x.Id == guid).Select(x => _userInfo.IsEn_Us ? x.Value : x.ValueCN).FirstOrDefaultAsync(); } else if (item.Type.ToLower() == FrontAudit.ChildGroup.GetDescription().ToLower()) { jsonDataDic[item.Key] = await _dictionaryRepository.Where(x => x.Code == item.Code).Join(_dictionaryRepository.Where(x => x.ChildGroup == value.ToString()), a => a.Id, b => b.ParentId, (a, b) => new { value = _userInfo.IsEn_Us ? b.Value : b.ValueCN }).Select(x => x.value).FirstOrDefaultAsync(); } // else if (item.Type.ToLower() == FrontAudit.LineSpilt.GetDescription().ToLower()) { var data = value.ToString().Split('|').ToList(); var codeList = await _dictionaryRepository.Where(x => x.Code == item.Code).Join(_dictionaryRepository.Where(x => data.Contains(x.Code)), a => a.Id, b => b.ParentId, (a, b) => new { value = _userInfo.IsEn_Us ? b.Value : b.ValueCN }).Select(x => x.value).ToListAsync(); jsonDataDic[item.Key] = string.Join("|", codeList); } //通过字典项的code 翻译 枚举或者 bool else { jsonDataDic[item.Key] = await _dictionaryRepository.Where(x => x.Code == item.Code).Join(_dictionaryRepository.Where(x => x.Code == value.ToString()), a => a.Id, b => b.ParentId, (a, b) => new { value = _userInfo.IsEn_Us ? b.Value : b.ValueCN }).Select(x => x.value).FirstOrDefaultAsync(); } } } catch (Exception) { } } return JsonConvert.SerializeObject(jsonDataDic); } /// /// 格式化日期和时间 /// /// 稽查数据 /// private async Task SetDataInspectionDateType(DataInspection Data) { var list = await (from parent in _frontAuditConfigRepository.AsQueryable().Where(x => x.Identification == Data.Identification) join child in _frontAuditConfigRepository.AsQueryable().Where(x => x.EnumType == "Date") on parent.Id equals child.ParentId select new DateDto() { Code = child.Code, DateType = child.DateType, }).ToListAsync(); var JsonData = (JsonConvert.DeserializeObject>(Data.JsonDetail)).IfNullThrowException(); foreach (var item in JsonData.Keys) { var datefirst = list.FirstOrDefault(x => x.Code.ToLower() == item.ToLower()); if (datefirst != null && !IsNullOrEmpty(JsonData[item])) { try { if (datefirst.DateType == FrontAuditDateType.Date.GetDescription()) { JsonData[item] = DateTime.Parse(JsonData[item].ToString()!).ToString("yyyy-MM-dd"); } if (datefirst.DateType == FrontAuditDateType.DateTime.GetDescription()) { JsonData[item] = DateTime.Parse(JsonData[item].ToString()!).ToString("yyyy-MM-dd HH:mm:ss"); } } catch (Exception) { continue; } } } Data.JsonDetail = JsonConvert.SerializeObject(JsonData); return Data; } /// /// IsNullOrEmpty /// /// /// private bool IsNullOrEmpty(object value) { if (value == null || value.ToString() == string.Empty) { return true; } else { return false; } } /// /// 获取子数据 /// /// /// [HttpGet] public async Task> GetAuditConfigChildList(Guid frontAuditConfigId) { //var list = await (from data in _frontAuditConfigRepository.Where().Where(x => x.Id == frontAuditConfigId) // join childrenType in _frontAuditConfigRepository.Where() on data.Id equals childrenType.ParentId // select childrenType).OrderBy(x => x.Sort).ToListAsync(); //return list; var list = await _frontAuditConfigRepository.Where(t => t.ParentId == frontAuditConfigId).OrderBy(x => x.Sort).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); foreach (var item in list) { item.TableConfigList = JsonConvert.DeserializeObject>(item.TableConfigJsonStr) ?? new List(); item.UrlConfig = JsonConvert.DeserializeObject(item.UrlConfigJsonStr) ?? new UrlConfig(); } return list; } /// /// 完全复制其他子项到当前项 /// /// /// [HttpPost] public async Task FullyReplicated(FullyReplicated fully) { await _frontAuditConfigRepository.DeleteFromQueryAsync(x => x.ParentId == fully.ToItemId); var list = await _frontAuditConfigRepository.Where(x => x.ParentId == fully.FromItemId).ToListAsync(); list.ForEach(x => { x.Id = NewId.NextGuid(); x.ParentId = fully.ToItemId; }); await _frontAuditConfigRepository.AddRangeAsync(list); await _frontAuditConfigRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// Cope子项数据 /// /// /// [HttpPost] public async Task CopyOtherToThisItem(CopyOtherToThisItem item) { var lists = _frontAuditConfigRepository.Where(x => x.ParentId == item.AddItemGuid).ToList(); var additem = await _frontAuditConfigRepository.FirstOrDefaultAsync(x => x.Id == item.AddItemGuid); //跟踪的方式查询,直接修改,然后保存数据库 var alllist = _frontAuditConfigRepository.Where(x => item.DataSourceGuids.Contains(x.ParentId), true).ToList().GroupBy(x => new { x.ValueCN }, (key, lst) => new FrontAuditConfig { Sort = lst.Select(x => x.Sort).FirstOrDefault(), TableConfigJsonStr = lst.Select(x => x.TableConfigJsonStr).FirstOrDefault(), UrlConfigJsonStr = lst.Select(x => x.UrlConfigJsonStr).FirstOrDefault(), IsShowByTrialConfig = lst.Select(x => x.IsShowByTrialConfig).FirstOrDefault(), TrialConfigRelyFieldName = lst.Select(x => x.TrialConfigRelyFieldName).FirstOrDefault(), Code = lst.Max(x => x.Code), ConfigType = lst.Select(x => x.ConfigType).FirstOrDefault(), CreateTime = DateTime.Now, Description = lst.Select(x => x.Description).FirstOrDefault(), //EnumList = lst.Select(x => x.EnumList).FirstOrDefault(), //IsConfig = lst.Select(x => x.IsConfig).FirstOrDefault(), IsShowParent = lst.Select(x => x.IsShowParent).FirstOrDefault(), ParentId = item.AddItemGuid, CreateUserId = _userInfo.Id, IsEnable = lst.Select(x => x.IsEnable).FirstOrDefault(), DictionaryKey = lst.Select(x => x.DictionaryKey).FirstOrDefault(), EnumType = lst.Select(x => x.EnumType).FirstOrDefault(), UpdateTime = DateTime.Now, ValueCN = lst.Select(x => x.ValueCN).FirstOrDefault(), Value = lst.Max(x => x.Value), UpdateUserId = _userInfo.Id, ChildrenTypeId = additem?.ChildrenTypeId, ModuleTypeId = additem?.ModuleTypeId, ObjectTypeId = additem?.ObjectTypeId, OptTypeId = additem?.OptTypeId, DictionaryCode = lst.Max(x => x.DictionaryCode), DictionaryType = lst.Max(x => x.DictionaryType), DateType = lst.Select(x => x.DateType).FirstOrDefault(), ForeignKeyValue = lst.Select(x => x.ForeignKeyValue).FirstOrDefault(), ForeignKeyText = lst.Select(x => x.ForeignKeyText).FirstOrDefault(), ForeignKeyTableName = lst.Select(x => x.ForeignKeyTableName).FirstOrDefault(), DataType = lst.Select(x => x.DataType).FirstOrDefault(), Id = NewId.NextGuid()//新id, }).ToList(); // 获取已存在的所有名称 var names = lists.Select(x => x.ValueCN).ToList(); // 获取不存在的数据 var list = alllist.Where(x => !names.Contains(x.ValueCN)).ToList(); // 获取要添加的name var addvaluecns = list.Select(x => x.ValueCN); // 获取要修改的数据 var neewupdate = lists.Where(x => !addvaluecns.Contains(x.ValueCN)); neewupdate.ForEach(x => { var item = alllist.FirstOrDefault(y => y.ValueCN == x.ValueCN); if (item != null) { x.Code = item.Code; x.Value = !item.Code.IsNullOrEmpty() ? item.Value : x.Value; x.DictionaryType = !item.DictionaryType.IsNullOrEmpty() ? item.DictionaryType : x.DictionaryType; x.DictionaryCode = !item.DictionaryCode.IsNullOrEmpty() ? item.DictionaryCode : x.DictionaryCode; x.DataType = !item.DataType.IsNullOrEmpty() ? item.DataType : x.DataType; x.DateType = !item.DateType.IsNullOrEmpty() ? item.DateType : x.DateType; x.DictionaryKey = !item.DictionaryKey.IsNullOrEmpty() ? item.DictionaryKey : x.DictionaryKey; x.IsShowParent = /*!item.IsShowParent == null ?*/ item.IsShowParent /*: x.IsShowParent*/; x.ForeignKeyTableName = !item.ForeignKeyTableName.IsNullOrEmpty() ? item.ForeignKeyTableName : x.ForeignKeyTableName; x.ForeignKeyText = !item.ForeignKeyText.IsNullOrEmpty() ? item.ForeignKeyText : x.ForeignKeyText; x.ForeignKeyValue = !item.ForeignKeyValue.IsNullOrEmpty() ? item.ForeignKeyValue : x.ForeignKeyValue; x.EnumType = !item.EnumType.IsNullOrEmpty() ? item.EnumType : x.EnumType; } }); await _frontAuditConfigRepository.AddRangeAsync(list); await _frontAuditConfigRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 获取Description /// /// /// [HttpGet] public async Task> GetModuleTypeDescriptionList(Guid moduleTypeId) { var result = (await _frontAuditConfigRepository.Where(x => x.ModuleTypeId == moduleTypeId && x.ObjectTypeId != null && x.OptTypeId != null && x.Description.Length > 0).Select(x => new { x.Description, x.DescriptionCN, x.Sort }).OrderBy(t => t.Sort).ToListAsync() ).Select(t => _userInfo.IsEn_Us ? t.Description : t.DescriptionCN).Distinct().ToList(); return result; } /// /// 获取列表 /// /// /// [HttpPost] public async Task> GetFrontAuditConfigList(FrontAuditConfigQuery iq) { var query = from data in _frontAuditConfigRepository.Where() join childrenType in _dictionaryRepository.Where() on data.ChildrenTypeId equals childrenType.Id into childrenTypetemp from leftchildrenType in childrenTypetemp.DefaultIfEmpty() join ModuleType in _dictionaryRepository.Where() on data.ModuleTypeId equals ModuleType.Id into ModuleTypetemp from leftModuleType in ModuleTypetemp.DefaultIfEmpty() join OptTypeId in _dictionaryRepository.Where() on data.OptTypeId equals OptTypeId.Id into OptTypeIdtemp from leftOptTypeId in OptTypeIdtemp.DefaultIfEmpty() join ObjectTypeId in _dictionaryRepository.Where() on data.ObjectTypeId equals ObjectTypeId.Id into ObjectTypeIdtemp from leftObjectTypeIdtemp in ObjectTypeIdtemp.DefaultIfEmpty() select new FrontAuditConfigView() { IsShowParent = data.IsShowParent, ChildrenTypeId = data.ChildrenTypeId, Code = data.Code, ConfigType = data.ConfigType, CreateTime = data.CreateTime, CreateUserId = data.CreateUserId, Description = data.Description, DescriptionCN = data.DescriptionCN, IsConfig = data.IsConfig, IsEnable = data.IsEnable, ModuleTypeId = data.ModuleTypeId, Id = data.Id, ParentId = data.ParentId, UpdateTime = data.UpdateTime, Value = data.Value, ChildrenTypeValueCN = leftchildrenType.ValueCN, ModuleTypeValue = leftModuleType.Value, ModuleTypeValueCN = leftModuleType.ValueCN, OptTypeId = data.OptTypeId, OptTypeValue = leftOptTypeId.Value, OptTypeValueCN = leftOptTypeId.ValueCN, UpdateUserId = data.UpdateUserId, Sort = data.Sort, ValueCN = data.ValueCN, ChildrenTypeValue = leftchildrenType.Value, DictionaryKey = data.DictionaryKey, EnumType = data.EnumType, ObjectTypeId = data.ObjectTypeId, ObjectTypeValue = leftObjectTypeIdtemp.Value, ObjectTypeValueCN = leftObjectTypeIdtemp.ValueCN, IsShowByTrialConfig = data.IsShowByTrialConfig, TrialConfigRelyFieldName = data.TrialConfigRelyFieldName, Identification = data.Identification, IsHaveReason = data.IsHaveReason, IsHaveSign = data.IsHaveSign, IsFinish = data.IsFinish, IsJoinPlan = data.IsJoinPlan, DataType = data.DataType, ChildDataLabel = data.ChildDataLabel, ChildDataValue = data.ChildDataValue, IsSpecialType = data.IsSpecialType, DateType = data.DataType, DictionaryCode = data.DictionaryCode, DictionaryType = data.DictionaryType, InterfaceName = data.InterfaceName, UrlConfigJsonStr = data.UrlConfigJsonStr, TableConfigJsonStr = data.TableConfigJsonStr, }; query = query .WhereIf(!iq.Value.IsNullOrEmpty(), x => x.Value == iq.Value) .WhereIf(!iq.ValueCN.IsNullOrEmpty(), x => x.ValueCN == iq.ValueCN) .WhereIf(!iq.Description.IsNullOrEmpty(), x => x.Description == iq.Description) .WhereIf(iq.OptTypeId != null, x => x.OptTypeId == iq.OptTypeId) .WhereIf(!iq.Code.IsNullOrEmpty(), x => x.Code == iq.Code) .WhereIf(iq.ChildrenTypeId != null, x => x.ChildrenTypeId == iq.ChildrenTypeId) .WhereIf(iq.ModuleTypeId != null, x => x.ModuleTypeId == iq.ModuleTypeId) .WhereIf(iq.ObjectTypeId != null, x => x.ObjectTypeId == iq.ObjectTypeId) .WhereIf(!iq.ConfigType.IsNullOrEmpty(), x => x.ConfigType == iq.ConfigType); return await query.OrderBy(x => x.Sort).ToListAsync(); } /// /// 修改排序 /// /// /// public async Task ChangeFrontAuditSort(List sortDataList) { foreach (var item in sortDataList) { await _frontAuditConfigRepository.BatchUpdateNoTrackingAsync(x => x.Id == item.Id, x => new FrontAuditConfig { Sort = item.Sort }); } await _frontAuditConfigRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 新增或者修改 /// /// /// public async Task AddOrUpdateFrontAuditConfig(FrontAuditConfigAddOrEdit addOrEditFrontAuditConfig) { if (await _frontAuditConfigRepository.AnyAsync(x => x.Identification != string.Empty && x.Identification == addOrEditFrontAuditConfig.Identification && x.Id != addOrEditFrontAuditConfig.Id && x.ConfigType == "M" && addOrEditFrontAuditConfig.ConfigType == "M")) { //---标识重复 return ResponseOutput.NotOk(_localizer["FrontAudit_IdDup"]); } if (await _frontAuditConfigRepository.AnyAsync(x => x.Description == addOrEditFrontAuditConfig.Description && x.Id != addOrEditFrontAuditConfig.Id && x.ConfigType == "M" && addOrEditFrontAuditConfig.ConfigType == "M")) { //---名称重复 return ResponseOutput.NotOk(_localizer["FrontAudit_NameDup"]); } if (addOrEditFrontAuditConfig.ConfigType == "C") { addOrEditFrontAuditConfig.Description = ""; } addOrEditFrontAuditConfig.TableConfigJsonStr = JsonConvert.SerializeObject(addOrEditFrontAuditConfig.TableConfigList); addOrEditFrontAuditConfig.UrlConfigJsonStr = JsonConvert.SerializeObject(addOrEditFrontAuditConfig.UrlConfig); var entity = await _frontAuditConfigRepository.InsertOrUpdateAsync(addOrEditFrontAuditConfig, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除 /// /// /// [HttpDelete("{frontAuditConfigId:guid}")] public async Task DeleteFrontAuditConfig(Guid frontAuditConfigId) { if (await _frontAuditConfigRepository.AnyAsync(x => x.ParentId == frontAuditConfigId)) { //---存在子类 不能删除 return ResponseOutput.NotOk(_localizer["FrontAudit_CannotDelSub"]); } var success = await _frontAuditConfigRepository.BatchDeleteNoTrackingAsync(t => t.Id == frontAuditConfigId); return ResponseOutput.Result(success); } } }