using ATS.NonCustodial.Application.Base;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries.Input;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries.Output;
using ATS.NonCustodial.Domain.Entities.Admins;
using ATS.NonCustodial.Domain.Shared.AggRootEntities.Dtos;
using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore;
using ATS.NonCustodial.DynamicApi;
using ATS.NonCustodial.DynamicApi.Attributes;
using ATS.NonCustodial.Shared.Common.UnifiedResults;
using ATS.NonCustodial.Shared.Extensions;
using ATS.NonCustodial.Shared.Extensions.AdvancedQuery;
using AutoMapper.QueryableExtensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ATS.NonCustodial.Application.Impl.Admins
{
///
/// 数据字典服务
///
/// Author:mxg
/// CreatedTimed:2022-05-15 10:08 PM
[DynamicApi(Area = "admin")]
public class AppDictionaryService : AdminAppServiceBase, IAppDictionaryService, IDynamicApi
{
#region Identity
private readonly IEfRepository _appDictionaryTypeRepository;
private readonly IEfRepository _appDictionaryRepository;
public AppDictionaryService(IEfRepository appDictionaryTypeRepository, IEfRepository appDictionaryRepository)
{
_appDictionaryTypeRepository = appDictionaryTypeRepository;
_appDictionaryRepository = appDictionaryRepository;
}
#endregion Identity
///
/// 查询字典明细(字典类型及其明细)
///
///
///
public async Task GetAsync(long id)
{
//字典类型
var dictType = await base.GetWithDataAsync(_appDictionaryTypeRepository, id);
//字典值
var dictData = await base.GetListWithDataAsync(_appDictionaryRepository, w => w.DictionaryTypeId == id);
dictType.Dictionaries = dictData;
//返回
return ResultOutput.Ok(dictType);
}
///
/// 分页查询(字典类型)
///
///
///
[HttpPost]
public async Task GetPageAsync(DictionaryTypeGetPageInput input)
{
var express = GetExpression(input, _appDictionaryTypeRepository.AsQueryable(false, true));
var rtn = await base.GetPageAsync(input, express);
return ResultOutput.Ok(rtn);
}
///
/// 分页查询(字典)
///
///
///
[HttpPost]
public async Task GetDictionaryPageAsync(DictionaryGetPageInput input)
{
var express = GetExpression(input, _appDictionaryRepository.AsQueryable(false, true));
var rtn = await base.GetPageAsync(input, express);
return ResultOutput.Ok(rtn);
}
///
/// 获取字典列表(非分页)
///
/// 字典类型编码
///
public async Task GetListAsync(string? code)
{
var rtn = await GetListNoApiAsync(code);
foreach (var item in rtn)
{
if(item ==null) continue;
// 修复:添加 null 检查并转换为 List
if (item.Dictionaries != null)
{
item.Dictionaries = item.Dictionaries
.Where(wd => wd.DataStatus == 0)
.ToList(); // 添加 ToList() 转换
}
}
//返回
return ResultOutput.Ok(rtn);
}
///
/// 获取字典列表(非分页)
///
/// 字典类型编码
[NonAction]
public async Task> GetListNoApiAsync(string? code)
{
//字典类型
var dictionaryTypes = await _appDictionaryTypeRepository.AsQueryable(false, true)
.WhereIf(code.IsNotNullOrWhiteSpace(), w => w.Code.Contains(code))
.ProjectTo(Mapper.ConfigurationProvider)
.ToListAsync()
.ConfigureAwait(false);
//字典值
var dictTypeIds = dictionaryTypes.Select(w => w.Id).ToList();
var dictData = await base.GetListWithDataAsync(_appDictionaryRepository, w => dictTypeIds.Contains(w.DictionaryTypeId));
foreach (var dictionaryType in dictionaryTypes)
{
dictionaryType.Dictionaries = dictData.Where(w => w.DictionaryTypeId == dictionaryType.Id).ToList();
}
return dictionaryTypes;
}
///
/// 根据字典Id获取字典信息
///
///
///
public async Task GetDicByDicId(long id) => await base.GetAsync(_appDictionaryRepository, id);
///
///
///
///
public async Task> GetDicData()
{
return await _appDictionaryRepository.AsQueryable(false, true)
.ProjectTo(Mapper.ConfigurationProvider)
.OrderByDescending(r => r.CreatedTime)
.ToListAsync()
.ConfigureAwait(false);
}
///
/// 创建或者修改字典及其字典值
///
///
///
[HttpPost]
public async Task CreateOrModifyDictionary(CreateOrModifyAggDictionaryInput input)
{
var dictType = input.DictionaryTypeInput;
var dictValues = input.DictionaryInput;
//[1]校验非法数据
var valid = await Valid(dictType, dictValues);
if (!valid.Success) return valid;
//[2]处理逻辑(字典类型)
var dictionaryId = dictType!.Id;
if (dictType.Id > 0) await base.UpdateAsync(dictType, _appDictionaryTypeRepository);
else dictionaryId = (await base.AddWithDataAsync(dictType, _appDictionaryTypeRepository))?.Id;
//[3]处理逻辑(字典值)
var addDictData = dictValues
.Where(w => w.Id == 0)
.Select(w =>
{
w.DictionaryTypeId = dictionaryId!.Value;
return w;
}).ToList();
if (addDictData.Count > 0) await base.AddAsync(addDictData, _appDictionaryRepository);
var updateDictData = dictValues.Where(w => w.Id > 0).ToList();
if (updateDictData.Any()) await base.UpdateAsync(updateDictData, _appDictionaryRepository);
//返回结果
return ResultOutput.Ok();
}
///
/// 批量修改状态(如果禁用了字典类型,那么其下面所有的字典值都要禁用)
///
///
///
[HttpPost]
public async Task BatchChangeDictionaryTypeStatus(BatchChangeStatusInput input)
{
if (!input.Ids.Any()) return ResultOutput.NotOk("参数错误");
//字典类型
var dictType = await _appDictionaryTypeRepository.AsQueryable(false, true)
.Where(w => input.Ids.Contains(w.Id))
.ToListAsync();
var dictData = await _appDictionaryRepository.AsQueryable(false, true)
.Where(w => input.Ids.Contains(w.DictionaryTypeId))
.ToListAsync();
//批量更新
await _appDictionaryTypeRepository.UpdateAsync(
dictType.Select(w =>
{
w.DataStatus = input.DataStatus;
return w;
})
,
UpdatingProps(x => x.DataStatus)
);
//批量更新
await _appDictionaryRepository.UpdateAsync(
dictData.Select(w =>
{
w.DataStatus = input.DataStatus;
return w;
}),
UpdatingProps(x => x.DataStatus)
);
//返回结果
return ResultOutput.Ok();
}
///
/// 批量修改状态批量修改数据字典状态
///
///
///
[HttpPost]
public async Task BatchChangeDictionaryStatus(BatchChangeStatusInput input) => await base.BatchChangeStatus(input, _appDictionaryRepository);
///
/// 批量删除数据字典类型
///
///
[HttpDelete]
public async Task BatchDeleteDictionaryType(BatchIdsInput input)
{
await _appDictionaryTypeRepository.DeleteAsync(w => input.Ids.Contains(w.Id));
await _appDictionaryRepository.DeleteAsync(w => input.Ids.Contains(w.DictionaryTypeId));
return ResultOutput.Result(true);
}
///
/// 批量删除数据字典
///
///
[HttpDelete]
public async Task BatchDeleteDictionary(BatchIdsInput input)
{
await _appDictionaryRepository.DeleteAsync(w => input.Ids.Contains(w.Id));
return ResultOutput.Result(true);
}
///
/// 根据Ids获取字典
///
///
///
[HttpPost]
public async Task> GetDicByDicIds(BatchIdsInput input) => await base.GetListWithDataAsync(_appDictionaryRepository, w => input.Ids.Contains(w.Id));
#region Private
///
/// 查询条件
///
///
///
///
private IQueryable GetExpression(DictionaryTypeGetPageInput pageInput, IQueryable query)
{
query = query
.WhereIf(pageInput.KeyWord.NotNull(), a => a.Name.Contains(pageInput.KeyWord) || a.Code.Contains(pageInput.KeyWord))
.WhereIf(pageInput.StatusSearch?.Content != null, w => w.DataStatus == pageInput.StatusSearch!.Content);
var express = base.GetExpression(pageInput, query);
return express;
}
///
/// 查询字典条件
///
///
///
///
private IQueryable GetExpression(DictionaryGetPageInput pageInput, IQueryable query)
{
query = query
.WhereIf(pageInput.KeyWord.NotNull(), a => a.Name.Contains(pageInput.KeyWord) || a.Code.Contains(pageInput.KeyWord))
.WhereIf(pageInput.StatusSearch?.Content != null, w => w.DataStatus == pageInput.StatusSearch!.Content)
.WhereIf(pageInput.DictionaryTypeId != null, w => w.DictionaryTypeId == pageInput.DictionaryTypeId);
var express = base.GetExpression(pageInput, query);
return express;
}
///
/// 新增验证方法
///
private async Task Valid(CreateOrModifyDictionaryTypeInput? dictType, List? dictValues)
{
//校验字典类型
var dictTypeValid = await base.Valid(dictType, _appDictionaryTypeRepository, w =>
{
w = w.AndNotNull(w => w.Code.Equals(dictType.Code), dictType.Code.IsNotNullOrEmpty());
return (w, $"当前字典类型:{dictType.Code}已存在");
});
if (!dictTypeValid.Success) return dictTypeValid;
//字典值编码不能重复
var dictRepeatList = dictValues!.GroupBy(w => w.Code).Where(w => w.Count() > 1);
foreach (var dr in dictRepeatList)
{
return ResultOutput.NotOk($"字典编码:{dr.Key}不能重复!");
}
//校验字典值
foreach (var dictValue in dictValues)
{
//校验字典类型
var dictValueValid = await base.Valid(dictValue, _appDictionaryRepository, w =>
{
w = w.AndNotNull(w => w.Code.Equals(dictValue.Code) && w.DictionaryTypeId == dictType.Id, dictValue.Code.IsNotNullOrEmpty());
return (w, $"当前字典值:{dictValue.Code}已存在");
});
if (!dictValueValid.Success) return dictValueValid;
}
return ResultOutput.Ok(true);
}
#endregion Private
}
}