using AutoMapper;
using AutoMapper.QueryableExtensions;
using IRaCIS.Application.ExpressionExtend;
using IRaCIS.Application.Interfaces;
using IRaCIS.Application.ViewModels;
using IRaCIS.Core.Application.Contracts.RequestAndResponse;
using IRaCIS.Core.Domain.Interfaces;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Infra.Data.ExpressionExtend;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace IRaCIS.Application.Services
{
public class DictionaryService : IDictionaryService
{
private readonly IDictionaryRepository _dicRepository;
private readonly IDoctorDictionaryRepository _doctorDictionaryRepository;
private readonly ITrialDictionaryRepository _trialDictionaryRepository;
private readonly IMapper _mapper;
public DictionaryService(IDictionaryRepository sysDicRepository, IDoctorDictionaryRepository doctorDictionaryRepository, ITrialDictionaryRepository trialDictionaryRepository,IMapper mapper)
{
_dicRepository = sysDicRepository;
_doctorDictionaryRepository = doctorDictionaryRepository;
_trialDictionaryRepository = trialDictionaryRepository;
_mapper = mapper;
}
/// 根据字典 Key 获取字典数据
public DicResultDTO GetDictionaryResult(string[] searchArray)
{
var doctorViewList = _dicRepository.GetAll().ProjectTo(_mapper.ConfigurationProvider).OrderBy(t => t.KeyName)
.ThenBy(t => t.ShowOrder).ToList();
var projectDicResult = new DicResultDTO();
foreach (var searchItem in searchArray)
{
var item = searchItem.Trim();
var tempDic = new Dictionary();
doctorViewList.Where(o => o.KeyName == item).ToList().ForEach(o => tempDic.Add(o.Id, o.Value));
projectDicResult.DicList.Add(item, tempDic);
}
return projectDicResult;
}
public DicResultDTO GetAllDictionary()
{
var list = _dicRepository.GetAll().ProjectTo(_mapper.ConfigurationProvider).OrderBy(t => t.KeyName)
.ThenBy(t => t.ShowOrder).ToList();
var types = list.Select(u => u.KeyName).Distinct();
var projectDicResult = new DicResultDTO();
foreach (var type in types)
{
var tempDic = new Dictionary();
list.Where(o => o.KeyName == type).ToList().ForEach(o => tempDic.Add(o.Id, o.Value));
projectDicResult.DicList.Add(type, tempDic);
}
return projectDicResult;
}
/// 根据Key,获取单个字典数组
public PageOutput GetDicSelectList(DicQueryDTO dicSearchModel)
{
Expression> dictionaryLambda = x => true;
if (!string.IsNullOrWhiteSpace(dicSearchModel.KeyName.Trim()))
{
dictionaryLambda = dictionaryLambda.And(t => t.KeyName == dicSearchModel.KeyName.Trim());
}
var dicQueryable = _dicRepository.GetAll().Where(dictionaryLambda).ProjectTo(_mapper.ConfigurationProvider);
var totalCount = dicQueryable.Count();
//处理排序字段
var propName = dicSearchModel.SortField == string.Empty ? "KeyName" : dicSearchModel.SortField;
//处理升序和降序
dicQueryable = dicSearchModel.Asc ? dicQueryable.OrderBy(propName) : dicQueryable.OrderByDescending(propName);
//分页
dicQueryable = dicQueryable
.Skip((dicSearchModel.PageIndex - 1) * dicSearchModel.PageSize)
.Take(dicSearchModel.PageSize);
var list = dicQueryable.OrderBy(t => t.ShowOrder).ToList();
return new PageOutput(dicSearchModel.PageIndex, dicSearchModel.PageSize, totalCount, list);
}
/// 根据Type、Key 获取字典 树结构
public List GetDicTree()
{
var keyNameTypeDistinctList = _dicRepository.Find(u => !(u.KeyName == "UserType" || u.KeyName == "InstitutionalType")).ProjectTo(_mapper.ConfigurationProvider).Distinct().ToList();
var treeNodeList = new List();
var group = keyNameTypeDistinctList.GroupBy(t => t.Type);
foreach (var groupItem in group)
{
var node = new DictionaryTreeNode()
{
Id = Guid.NewGuid(),
KeyName = groupItem.Key,
Type = groupItem.Key,
Children = keyNameTypeDistinctList.Where(t => t.Type == groupItem.Key).Select(t =>
new DictionaryTreeNode()
{
Id = Guid.NewGuid(),
KeyName = t.KeyName,
Type = t.Type,
Children = new List()
}).ToList()
};
treeNodeList.Add(node);
}
return treeNodeList;
}
/// 添加或更新字典数据
public IResponseOutput AddOrUpdateDictionary(DicViewModelDTO viewModel)
{
if (viewModel.Id == Guid.Empty)
{
var existItem = _dicRepository.FindSingleOrDefault(dic => dic.KeyName.Equals(viewModel.KeyName) && dic.Value.Equals(viewModel.Value));
if (existItem != null)
{
return ResponseOutput.NotOk("新添加项不能与当前类别下面子项同名,请修改名称");
}
var result = _dicRepository.Add(_mapper.Map(viewModel));
var success = _dicRepository.SaveChanges();
return ResponseOutput.Result(success);
}
else
{
var existItem = _dicRepository.FindSingleOrDefault(dic => dic.KeyName.Equals(viewModel.KeyName) && dic.Value.Equals(viewModel.Value));
if (existItem != null && existItem.Id != viewModel.Id)
{
return ResponseOutput.NotOk("更新后的名称不能与该类别下子项同名,请修改名称");
}
var updateItem = _dicRepository.GetAll().FirstOrDefault(t => t.Id == viewModel.Id);
_mapper.Map(viewModel, updateItem);
_dicRepository.Update(updateItem);
var success = _dicRepository.SaveChanges();
return ResponseOutput.Result(success);
}
}
/// 删除字典数据
public IResponseOutput DeleteDictionary(Guid id)
{
if (_doctorDictionaryRepository.GetAll().Any(t => t.DictionaryId == id))
{
return ResponseOutput.NotOk("医生简历表有数据关联此字典表项");
}
if (_trialDictionaryRepository.GetAll().Any(t => t.DictionaryId == id))
{
return ResponseOutput.NotOk("项目表有数据关联此字典表项");
}
var success = _dicRepository.Delete(t => t.Id == id);
return ResponseOutput.Result(success);
}
/// 获取所有字典数据
public IEnumerable GetDicSelect()
{
return _dicRepository.GetAll().Select(t => t.KeyName).Distinct().ToList();
}
public DicViewModelDTO GetDetailById(Guid id)
{
var result = _dicRepository.FindSingleOrDefault(u => u.Id == id);
return _mapper.Map(result);
}
}
}