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 } }