using IRaCIS.Application.Interfaces;
using IRaCIS.Application.Contracts;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Infra.EFCore.Common;
namespace IRaCIS.Application.Services
{
///
/// 数据字典-基础数据维护
///
[ApiExplorerSettings(GroupName = "Common")]
public class DictionaryService : BaseService, IDictionaryService
{
private readonly IRepository _dicRepository;
private readonly IRepository _trialDictionaryRepository;
private readonly IRepository _trialRepository;
private readonly IRepository _systemCriterionDictionaryCodeRepository;
private readonly IRepository _trialCriterionDictionaryCodeRepository;
private readonly IRepository _readingTrialCriterionDictionaryRepository;
private readonly IRepository _readingCriterionDictionaryRepository;
private readonly IRepository _readingQuestionCriterionSystem;
private readonly IRepository _readingQuestionCriterionTrial;
public DictionaryService(IRepository sysDicRepository, IRepository trialDictionaryRepository,
IRepository trialRepository,
IRepository systemCriterionDictionaryCodeRepository,
IRepository trialCriterionDictionaryCodeRepository,
IRepository readingTrialCriterionDictionaryRepository,
IRepository readingCriterionDictionaryRepository,
IRepository readingQuestionCriterionSystem,
IRepository readingQuestionCriterionTrial
)
{
_dicRepository = sysDicRepository;
_trialDictionaryRepository = trialDictionaryRepository;
_trialRepository = trialRepository;
this._systemCriterionDictionaryCodeRepository = systemCriterionDictionaryCodeRepository;
this._trialCriterionDictionaryCodeRepository = trialCriterionDictionaryCodeRepository;
this._readingTrialCriterionDictionaryRepository = readingTrialCriterionDictionaryRepository;
this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository;
this._readingQuestionCriterionSystem = readingQuestionCriterionSystem;
this._readingQuestionCriterionTrial = readingQuestionCriterionTrial;
}
///
/// 添加bool
///
///
///
[HttpPost]
public async Task AddBoolDic(AddOrEditBasicDic addOrEditBasic)
{
var entity = await _dicRepository.InsertFromDTOAsync(addOrEditBasic);
var child1 = entity.Clone();
child1.Id = Guid.Empty;
child1.Code = "true";
child1.ParentId = entity.Id;
entity.ChildList.Add(child1);
var child2 = entity.Clone();
child2.Id = Guid.Empty;
child2.Code = "false";
child2.ParentId = entity.Id;
entity.ChildList.Add(child2);
await _dicRepository.SaveChangesAsync();
return ResponseOutput.Ok(entity.Id.ToString());
}
///
/// 添加字典 的同时 一起添加子项 --New
///
///
///
[HttpPost]
public async Task AddBasicDicAndChild(AddBasicDicAndChild addBasicDicAndChild)
{
var verifyExp1 = new EntityVerifyExp()
{
VerifyExp = t => t.Code == addBasicDicAndChild.Code && t.ParentId == null,
VerifyMsg = $"已有{addBasicDicAndChild.Code}名称的字典",
IsVerify = true
};
var entity = await _dicRepository.InsertFromDTOAsync(addBasicDicAndChild, false, verifyExp1);
var childList = _mapper.Map>(addBasicDicAndChild.ChildList);
foreach (var item in childList)
{
item.DataTypeEnum = addBasicDicAndChild.DataTypeEnum;
item.ParentId = entity.Id;
}
await _dicRepository.AddRangeAsync(childList);
await _dicRepository.SaveChangesAsync();
return ResponseOutput.Ok(entity.Id.ToString());
}
///
/// New 查询条件
///
///
///
[HttpPost]
public async Task> GetBasicDicList(BasicDicQuery basicDicQuery)
{
var systemBasicDataQueryable = _dicRepository.Where(t => t.ParentId == null)
.WhereIf(!string.IsNullOrEmpty(basicDicQuery.Code), t => t.Code.Contains(basicDicQuery.Code!))
.WhereIf(!string.IsNullOrEmpty(basicDicQuery.keyInfo), t => t.Description.Contains(basicDicQuery.keyInfo!)
|| t.Code.Contains(basicDicQuery.keyInfo!)
|| t.ChildList.Any(u => u.ValueCN.Contains(basicDicQuery.keyInfo!))
|| t.ChildList.Any(u => u.Description.Contains(basicDicQuery.keyInfo!))
|| t.ChildList.Any(u => u.Value.Contains(basicDicQuery.keyInfo!)))
.WhereIf(basicDicQuery.ConfigTypeId != null, t => t.ConfigTypeId == basicDicQuery.ConfigTypeId!)
.WhereIf(basicDicQuery.DataTypeEnum != null, t => t.DataTypeEnum == basicDicQuery.DataTypeEnum)
.WhereIf(basicDicQuery.DataTypeEnum == null, t => t.DataTypeEnum != DicDataTypeEnum.Config)
.ProjectTo(_mapper.ConfigurationProvider);
return await systemBasicDataQueryable.ToPagedListAsync(basicDicQuery.PageIndex, basicDicQuery.PageSize, String.IsNullOrEmpty(basicDicQuery.SortField) ? nameof(BasicDicView.ConfigType) : basicDicQuery.SortField, basicDicQuery.Asc, String.IsNullOrEmpty(basicDicQuery.SortField), new[] { nameof(BasicDicView.ConfigType), nameof(BasicDicView.ShowOrder) });
}
///
/// 添加和编辑
///
///
///
[HttpPost]
public async Task AddOrUpdateBasicDic(AddOrEditBasicDic addOrEditBasic)
{
var verifyExp1 = new EntityVerifyExp()
{
VerifyExp = t => t.Code == addOrEditBasic.Code && t.ParentId == addOrEditBasic.ParentId,
//---------- $"已有{addOrEditBasic.Code}名称的字典"
VerifyMsg = _localizer["Dictionary_DictionaryName", addOrEditBasic.Code],
IsVerify = addOrEditBasic.ParentId == null
};
//// 验证阅片标准是否可禁用
//if (!addOrEditBasic.IsEnable&&addOrEditBasic.Id!=null)
//{
// var result = await _readingQuestionService.SetSystemCriterionDisable(addOrEditBasic.Id.Value,addOrEditBasic.ParentId);
// if (!result.IsSuccess)
// {
// return result;
// }
//}
if (addOrEditBasic.Id != null && addOrEditBasic.ParentId == null)
{
await _dicRepository.UpdatePartialFromQueryAsync(t => t.ParentId == addOrEditBasic.Id, c => new Dictionary() { DataTypeEnum = addOrEditBasic.DataTypeEnum });
//await _dicRepository.BatchUpdateNoTrackingAsync(t => t.ParentId == addOrEditBasic.Id, c => new Dictionary() { DataTypeEnum = addOrEditBasic.DataTypeEnum });
}
var entity = await _dicRepository.InsertOrUpdateAsync(addOrEditBasic, true, verifyExp1);
await _dicRepository.SaveChangesAsync();
return ResponseOutput.Ok(entity.Id.ToString());
}
///
/// 获取子项数组
///
///
///
[HttpGet("{parentId:guid}")]
public async Task> GetChildList(Guid parentId)
{
return await _dicRepository.Where(t => t.ParentId == parentId)
.OrderBy(t => t.ShowOrder).ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
}
/// 删除字典数据
[HttpDelete("{id:guid}")]
public async Task DeleteDictionary(Guid id)
{
if (await _readingCriterionDictionaryRepository.AnyAsync(x => x.DictionaryId == id))
{
await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.DictionaryId == id);
//---当前字典在标准中被引用,不允许删除!
//return ResponseOutput.NotOk(_localizer["Dictionary_DictionaryDeletion"]);
}
if (await _readingTrialCriterionDictionaryRepository.AnyAsync(x => x.DictionaryId == id))
{
await _readingTrialCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.DictionaryId == id);
//---当前字典在标准中被引用,不允许删除!
//return ResponseOutput.NotOk(_localizer["Dictionary_DictionaryDeletion"]);
}
if (await _dicRepository.AnyAsync(t => t.ParentId == id))
{
//---有子项数据,不允许直接删除!
return ResponseOutput.NotOk(_localizer["Dictionary_SubitemDeletion"]);
}
if (await _trialDictionaryRepository.AnyAsync(t => t.DictionaryId == id) ||
await _trialRepository.AnyAsync(t => t.ReviewModeId == id))
{
//---当前条目已经在项目信息中被引用。
return ResponseOutput.NotOk(_localizer["Dictionary_ProjectReference"]);
}
var success = await _dicRepository.BatchDeleteNoTrackingAsync(t => t.Id == id);
return ResponseOutput.Result(success);
}
///
/// 传递父亲 code 字符串 数组 返回多个下拉框数据
///
///
///
[HttpPost]
public async Task>> GetBasicDataSelect(string[] searchArray)
{
var searchList = await _dicRepository.Where(t => searchArray.Contains(t.Parent.Code) && t.ParentId != null && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider,new { isEn_Us = _userInfo.IsEn_Us}).ToListAsync();
return searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
}
///
/// 根据父亲Code 获取单个下拉框数据
///
///
///
public async Task> GetBasicDataSelect(string searchKey)
{
var searchList = await _dicRepository.Where(t => t.Parent.Code == searchKey && t.ParentId != null && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
return searchList;
}
///
/// 根据父亲字典分组 获取子项
///
///
///
public async Task> GetBasicConfigSelect(string searchKey)
{
var searchList = await _dicRepository.Where(t => t.ConfigDictionary.Code == searchKey && t.ParentId == null && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync();
return searchList;
}
///
/// 获取标准字典
///
///
public async Task> GetCriterionDictionaryList(GetCriterionDictionaryListInDto inDto)
{
var criterionCodes = await _systemCriterionDictionaryCodeRepository.Where(x => x.SystemCriterionId == inDto.SystemCriterionId).ToListAsync();
var parentCodes = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.SystemCriterionId).Select(x => x.ParentCode).ToListAsync();
var codes = criterionCodes.Select(x => x.Code).ToList();
var dictionaryList = await _dicRepository.Where(x => codes.Contains(x.Code) && x.ParentId == null)
.OrderBy(x => x.ShowOrder).Select(x => new GetCriterionDictionaryListOutDto()
{
Code = x.Code,
ShowOrder = x.ShowOrder,
Description = x.Description
}).ToListAsync();
dictionaryList.ForEach(x =>
{
x.Count = parentCodes.Count(y => y == x.Code);
x.Id = criterionCodes.Where(y => y.Code == x.Code).Select(x => x.Id).FirstOrDefault();
});
return dictionaryList;
}
///
/// 获取标准字典
///
///
public async Task> GetTrialCriterionDictionaryList(GetTrialCriterionDictionaryListInDto inDto)
{
var criterionCodes = await _trialCriterionDictionaryCodeRepository.Where(x => x.TrialCriterionId == inDto.TrialCriterionId).ToListAsync();
var parentCodes = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialCriterionId).Select(x => x.ParentCode).ToListAsync();
var codes = criterionCodes.Select(x => x.Code).ToList();
var dictionaryList = await _dicRepository.Where(x => codes.Contains(x.Code) && x.ParentId == null)
.OrderBy(x => x.ShowOrder).Select(x => new GetCriterionDictionaryListOutDto()
{
Code = x.Code,
ShowOrder = x.ShowOrder,
Description = x.Description
}).ToListAsync();
dictionaryList.ForEach(x =>
{
x.Count = parentCodes.Count(y => y == x.Code);
x.Id = criterionCodes.Where(y => y.Code == x.Code).Select(x => x.Id).FirstOrDefault();
});
return dictionaryList;
}
///
/// 获取标准指定字典
///
///
///
[AllowAnonymous]
[HttpPost]
public async Task>> GetCriterionDictionary(GetCriterionDictionaryInDto inDto)
{
var searchList = await _dicRepository.Where(t => t.ParentId != null && t.IsEnable)
.WhereIf(!inDto.DictionaryCode.IsNullOrEmpty(), x => x.Parent.Code == inDto.DictionaryCode)
.WhereIf(inDto.DictionaryCodeList.Count() > 0, x => inDto.DictionaryCodeList.Contains(x.Parent.Code))
.ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
var result = searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
if (inDto.ReadingCriterionId == null)
{
return result;
}
else
{
List selectCode = new List();
List criterionDictionList = new List();
var isSystemCriterion = await _readingQuestionCriterionSystem.AnyAsync(x => x.Id == inDto.ReadingCriterionId);
if (isSystemCriterion)
{
selectCode = await _systemCriterionDictionaryCodeRepository.Where(x => x.SystemCriterionId == inDto.ReadingCriterionId).Select(x => x.Code).ToListAsync();
criterionDictionList = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.ReadingCriterionId).Select(x => new BasicDicSelect()
{
ChildGroup = x.Dictionary.ChildGroup,
Code = x.Dictionary.Code,
DataTypeEnum = x.Dictionary.DataTypeEnum,
ParentChildCodeEnum = x.Dictionary.Parent.ChildCodeEnum,
ShowOrder = x.Dictionary.ShowOrder,
ParentCode = x.ParentCode,
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
Id = x.DictionaryId,
ParentId = x.Dictionary.ParentId,
Value = x.Dictionary.Value,
ValueCN = x.Dictionary.ValueCN
}).ToListAsync();
}
else
{
selectCode = await _trialCriterionDictionaryCodeRepository.Where(x => x.TrialCriterionId == inDto.ReadingCriterionId).Select(x => x.Code).ToListAsync();
criterionDictionList = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.ReadingCriterionId).Select(x => new BasicDicSelect()
{
ChildGroup = x.Dictionary.ChildGroup,
Code = x.Dictionary.Code,
DataTypeEnum = x.Dictionary.DataTypeEnum,
ParentChildCodeEnum = x.Dictionary.Parent.ChildCodeEnum,
ShowOrder = x.Dictionary.ShowOrder,
ParentCode = x.ParentCode,
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
Id = x.DictionaryId,
ParentId = x.Dictionary.ParentId,
Value = x.Dictionary.Value,
ValueCN = x.Dictionary.ValueCN
}).ToListAsync();
}
var criterionCode = await _dicRepository.Where(x => x.ConfigDictionary.Code == "Reading_eCRF_Criterion").Select(x => x.Code).ToListAsync();
foreach (var item in criterionCode)
{
if (result.ContainsKey(item))
{
result[item] = new List();
}
}
criterionDictionList = criterionDictionList.Where(x => selectCode.Contains(x.ParentCode)).ToList();
var criterionDic = criterionDictionList.GroupBy(x => x.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
foreach (var item in criterionDic)
{
if (result.ContainsKey(item.Key))
{
result[item.Key] = item.Value;
}
}
return result;
}
}
///
/// 获取所有下拉框 枚举 bool 数据
///
///
[AllowAnonymous]
public async Task>> GetBasicDataAllSelect(GetBasicDataAllSelectInDto inDto)
{
var searchList = await _dicRepository.Where(t => t.ParentId != null && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
var result = searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
if (inDto.TrialReadingCriterionId == null)
{
return result;
}
else
{
var trialCriterionType = await _readingQuestionCriterionTrial.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.CriterionType).FirstOrDefaultAsync();
if (trialCriterionType == CriterionType.SelfDefine)
{
return result;
}
List selectCode = await _trialCriterionDictionaryCodeRepository.Where(x => x.TrialCriterionId == inDto.TrialReadingCriterionId).Select(x => x.Code).ToListAsync();
var criterionCode = await _dicRepository.Where(x => x.ConfigDictionary.Code == "Reading_eCRF_Criterion").Select(x => x.Code).ToListAsync();
foreach (var item in criterionCode)
{
if (result.ContainsKey(item))
{
result[item] = new List();
}
}
var criterionDictionList = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialReadingCriterionId).Select(x => new BasicDicSelect()
{
ChildGroup = x.Dictionary.ChildGroup,
Code = x.Dictionary.Code,
Description = x.Dictionary.Description,
DataTypeEnum = x.Dictionary.DataTypeEnum,
ParentChildCodeEnum = x.Dictionary.Parent.ChildCodeEnum,
ShowOrder = x.Dictionary.ShowOrder,
ParentCode = x.ParentCode,
Id = x.DictionaryId,
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
ParentId = x.Dictionary.ParentId,
Value = x.Dictionary.Value,
ValueCN = x.Dictionary.ValueCN
}).ToListAsync();
criterionDictionList = criterionDictionList.Where(x => selectCode.Contains(x.ParentCode)).ToList();
var criterionDic = criterionDictionList.GroupBy(x => x.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
foreach (var item in criterionDic)
{
result[item.Key] = item.Value;
}
return result;
}
}
#region 稽查相关
///
/// 获取是和否
///
///
///
public async Task GetBoolValueState(bool value)
{
return await _dicRepository.Where(t => t.Parent.Code == "YesOrNo" && t.Code == value.ToString()).Select(x => x.ValueCN).FirstOrDefaultAsync() ?? string.Empty;
}
///
/// 获取审核状态
///
///
///
///
///
public async Task GetAuditState(Guid trial, T childCode)
{
var QCProcessEnum = _trialRepository.Where(x => x.Id == trial).Select(x => x.QCProcessEnum).FirstOrDefault();
switch (QCProcessEnum)
{
case TrialQCProcess.SingleAudit:
return await _dicRepository.Where(t => t.Parent.Code == "AuditStatePE" && t.Code == Convert.ToInt32(childCode).ToString()).Select(x => x.ValueCN).FirstOrDefaultAsync() ?? string.Empty;
case TrialQCProcess.DoubleAudit:
return await _dicRepository.Where(t => t.Parent.Code == "AuditStateRC" && t.Code == Convert.ToInt32(childCode).ToString()).Select(x => x.ValueCN).FirstOrDefaultAsync() ?? string.Empty;
default:
return string.Empty;
}
}
public async Task GetBasicDataTranslateItem(string parentCode, T childCode)
{
return await _dicRepository.Where(t => t.Parent.Code == parentCode && t.Code == Convert.ToInt32(childCode).ToString()).Select(x => x.ValueCN).FirstOrDefaultAsync() ?? string.Empty;
}
#endregion
}
}