非羁押人员管理平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

356 lines
14 KiB

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
{
/// <summary>
/// 数据字典服务
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-05-15 10:08 PM
[DynamicApi(Area = "admin")]
public class AppDictionaryService : AdminAppServiceBase, IAppDictionaryService, IDynamicApi
{
#region Identity
private readonly IEfRepository<AppDictionaryType?, long> _appDictionaryTypeRepository;
private readonly IEfRepository<AppDictionary?, long> _appDictionaryRepository;
public AppDictionaryService(IEfRepository<AppDictionaryType?, long> appDictionaryTypeRepository, IEfRepository<AppDictionary?, long> appDictionaryRepository)
{
_appDictionaryTypeRepository = appDictionaryTypeRepository;
_appDictionaryRepository = appDictionaryRepository;
}
#endregion Identity
/// <summary>
/// 查询字典明细(字典类型及其明细)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<IResultOutput> GetAsync(long id)
{
//字典类型
var dictType = await base.GetWithDataAsync<AppDictionaryType, DictionaryAggGetOutput, long>(_appDictionaryTypeRepository, id);
//字典值
var dictData = await base.GetListWithDataAsync<AppDictionary, DictionaryGetOutput, long>(_appDictionaryRepository, w => w.DictionaryTypeId == id);
dictType.Dictionaries = dictData;
//返回
return ResultOutput.Ok(dictType);
}
/// <summary>
/// 分页查询(字典类型)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResultOutput> GetPageAsync(DictionaryTypeGetPageInput input)
{
var express = GetExpression(input, _appDictionaryTypeRepository.AsQueryable(false, true));
var rtn = await base.GetPageAsync<AppDictionaryType, DictionaryTypeGetPageInput, DictionaryTypeListOutput>(input, express);
return ResultOutput.Ok(rtn);
}
/// <summary>
/// 分页查询(字典)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResultOutput> GetDictionaryPageAsync(DictionaryGetPageInput input)
{
var express = GetExpression(input, _appDictionaryRepository.AsQueryable(false, true));
var rtn = await base.GetPageAsync<AppDictionary, DictionaryGetPageInput, DictionaryListOutput>(input, express);
return ResultOutput.Ok(rtn);
}
/// <summary>
/// 获取字典列表(非分页)
/// </summary>
/// <param name="code">字典类型编码</param>
/// <returns></returns>
public async Task<IResultOutput> 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);
}
/// <summary>
/// 获取字典列表(非分页)
/// </summary>
/// <param name="code">字典类型编码</param>
[NonAction]
public async Task<List<DictionaryAggGetOutput>> GetListNoApiAsync(string? code)
{
//字典类型
var dictionaryTypes = await _appDictionaryTypeRepository.AsQueryable(false, true)
.WhereIf(code.IsNotNullOrWhiteSpace(), w => w.Code.Contains(code))
.ProjectTo<DictionaryAggGetOutput>(Mapper.ConfigurationProvider)
.ToListAsync()
.ConfigureAwait(false);
//字典值
var dictTypeIds = dictionaryTypes.Select(w => w.Id).ToList();
var dictData = await base.GetListWithDataAsync<AppDictionary, DictionaryGetOutput, long>(_appDictionaryRepository, w => dictTypeIds.Contains(w.DictionaryTypeId));
foreach (var dictionaryType in dictionaryTypes)
{
dictionaryType.Dictionaries = dictData.Where(w => w.DictionaryTypeId == dictionaryType.Id).ToList();
}
return dictionaryTypes;
}
/// <summary>
/// 根据字典Id获取字典信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<DictionaryGetOutput> GetDicByDicId(long id) => await base.GetAsync<AppDictionary, DictionaryGetOutput, long>(_appDictionaryRepository, id);
/// <summary>
///
/// </summary>
/// <returns></returns>
public async Task<List<DictionaryGetOutput>> GetDicData()
{
return await _appDictionaryRepository.AsQueryable(false, true)
.ProjectTo<DictionaryGetOutput>(Mapper.ConfigurationProvider)
.OrderByDescending(r => r.CreatedTime)
.ToListAsync()
.ConfigureAwait(false);
}
/// <summary>
/// 创建或者修改字典及其字典值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResultOutput> 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();
}
/// <summary>
/// 批量修改状态(如果禁用了字典类型,那么其下面所有的字典值都要禁用)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResultOutput> 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<AppDictionaryType>(x => x.DataStatus)
);
//批量更新
await _appDictionaryRepository.UpdateAsync(
dictData.Select(w =>
{
w.DataStatus = input.DataStatus;
return w;
}),
UpdatingProps<AppDictionary>(x => x.DataStatus)
);
//返回结果
return ResultOutput.Ok();
}
/// <summary>
/// 批量修改状态批量修改数据字典状态
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResultOutput> BatchChangeDictionaryStatus(BatchChangeStatusInput input) => await base.BatchChangeStatus(input, _appDictionaryRepository);
/// <summary>
/// 批量删除数据字典类型
/// </summary>
/// <returns></returns>
[HttpDelete]
public async Task<IResultOutput> 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);
}
/// <summary>
/// 批量删除数据字典
/// </summary>
/// <returns></returns>
[HttpDelete]
public async Task<IResultOutput> BatchDeleteDictionary(BatchIdsInput input)
{
await _appDictionaryRepository.DeleteAsync(w => input.Ids.Contains(w.Id));
return ResultOutput.Result(true);
}
/// <summary>
/// 根据Ids获取字典
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<DictionaryGetOutput>> GetDicByDicIds(BatchIdsInput input) => await base.GetListWithDataAsync<AppDictionary, DictionaryGetOutput, long>(_appDictionaryRepository, w => input.Ids.Contains(w.Id));
#region Private
/// <summary>
/// 查询条件
/// </summary>
/// <param name="pageInput"></param>
/// <param name="query"></param>
/// <returns></returns>
private IQueryable<AppDictionaryType> GetExpression(DictionaryTypeGetPageInput pageInput, IQueryable<AppDictionaryType?> 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<AppDictionaryType, DictionaryTypeGetPageInput, long>(pageInput, query);
return express;
}
/// <summary>
/// 查询字典条件
/// </summary>
/// <param name="pageInput"></param>
/// <param name="query"></param>
/// <returns></returns>
private IQueryable<AppDictionary> GetExpression(DictionaryGetPageInput pageInput, IQueryable<AppDictionary?> 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<AppDictionary, DictionaryGetPageInput, long>(pageInput, query);
return express;
}
/// <summary>
/// 新增验证方法
/// </summary>
private async Task<IResultOutput> Valid(CreateOrModifyDictionaryTypeInput? dictType, List<CreateOrModifyDictionaryInput>? dictValues)
{
//校验字典类型
var dictTypeValid = await base.Valid<AppDictionaryType, CreateOrModifyDictionaryTypeInput, long>(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<AppDictionary, CreateOrModifyDictionaryInput, long>(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
}
}