using ATS.NonCustodial.Application.Base;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.View;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.View.Input;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.View.Output;
using ATS.NonCustodial.Domain.Entities.Admins;
using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore;
using ATS.NonCustodial.DynamicApi;
using ATS.NonCustodial.DynamicApi.Attributes;
using ATS.NonCustodial.Shared.Common.Enums;
using ATS.NonCustodial.Shared.Common.UnifiedResults;
using ATS.NonCustodial.Shared.Extensions;
using AutoMapper.QueryableExtensions;
using Microsoft.EntityFrameworkCore;
namespace ATS.NonCustodial.Application.Impl.Admins
{
///
/// 视图服务
///
/// Author:mxg
/// CreatedTimed:2022-05-15 10:08 PM
[DynamicApi(Area = "admin")]
public class ViewService : AdminAppServiceBase, IViewService, IDynamicApi
{
#region Identity
private readonly IEfRepository _viewRepository;
public ViewService(IEfRepository moduleRepository)
{
_viewRepository = moduleRepository;
}
#endregion Identity
///
/// 查询视图
///
///
///
public async Task GetAsync(long id)
{
var rtn = await base.GetAsync(_viewRepository, id);
return ResultOutput.Ok(rtn);
}
///
/// 查询列表
///
///
///
public async Task GetListAsync(string key)
{
var data = await _viewRepository.AsQueryable(false, true)
.WhereIf(key.NotNull(), a => a.Path.Contains(key) || a.Label.Contains(key))
.ProjectTo(Mapper.ConfigurationProvider)
.OrderByDescending(r => r.CreatedTime)
.ToListAsync()
.ConfigureAwait(false);
return ResultOutput.Ok(data);
}
///
/// 新增
///
///
///
public async Task AddAsync(ViewAddInput input)
{
var entity = Mapper.Map(input);
await _viewRepository.InsertAsync(entity);
return ResultOutput.Result(entity.Id > 0);
}
///
/// 修改
///
///
///
public async Task UpdateAsync(ViewUpdateInput input)
{
if (!(input?.Id > 0)) return ResultOutput.NotOk();
var entity = await _viewRepository.FindAsync(input.Id);
if (!(entity?.Id > 0)) return ResultOutput.NotOk("视图不存在!");
Mapper.Map(input, entity);
await _viewRepository.UpdateAsync(entity);
return ResultOutput.Ok();
}
///
/// 彻底删除
///
///
///
public async Task DeleteAsync(long id)
{
var result = false;
if (id > 0) result = (await _viewRepository.DeleteAsync(m => m.Id == id)) > 0;
return ResultOutput.Result(result);
}
///
/// 删除
///
///
///
public async Task SoftDeleteAsync(long id)
{
var result = await _viewRepository.DeleteAsync(w => w.Id == id);
return ResultOutput.Result(result > 0);
}
///
/// 批量删除
///
///
///
public async Task BatchSoftDeleteAsync(long[] ids)
{
var result = await _viewRepository.DeleteAsync(w => ids.Contains(w.Id));
return ResultOutput.Result(result > 0);
}
///
/// 同步
///
///
///
public async Task SyncAsync(ViewSyncInput input)
{
//查询所有视图
var views = await _viewRepository.AsQueryable(false, true).ToListAsync();
var names = views.Select(a => a.Name).ToList();
var paths = views.Select(a => a.Path).ToList();
//path处理
foreach (var view in input.Views)
{
view.Path = view.Path?.Trim();
}
//批量插入
{
var inputViews = (from a in input.Views where !(paths.Contains(a.Path) || names.Contains(a.Name)) select a).ToList();
if (inputViews.Count > 0)
{
var insertViews = Mapper.Map>(inputViews);
foreach (var insertView in insertViews)
{
if (insertView.Label.IsNull())
{
insertView.Label = insertView.Name;
}
}
insertViews = await _viewRepository.InsertAsync(insertViews);
views.AddRange(insertViews);
}
}
//批量更新
{
var inputPaths = input.Views.Select(a => a.Path).ToList();
var inputNames = input.Views.Select(a => a.Name).ToList();
//修改
var updateViews = (from a in views where inputPaths.Contains(a.Path) || inputNames.Contains(a.Name) select a).ToList();
if (updateViews.Count > 0)
{
foreach (var view in updateViews)
{
var inputView = input.Views.Where(a => a.Name == view.Name || a.Path == view.Path).FirstOrDefault();
if (view.Label.IsNull())
{
view.Label = inputView.Label ?? inputView.Name;
}
if (view.Description.IsNull())
{
view.Description = inputView.Description;
}
view.Name = inputView.Name;
view.Path = inputView.Path;
view.DataStatus = DataStatusEnum.Normal;
}
}
//禁用
var disabledViews = (from a in views where (a.Path.NotNull() || a.Name.NotNull()) && (!inputPaths.Contains(a.Path) || !inputNames.Contains(a.Name)) select a).ToList();
if (disabledViews.Count > 0)
{
foreach (var view in disabledViews)
{
view.DataStatus = DataStatusEnum.Disable;
}
}
updateViews.AddRange(disabledViews);
//批量更新
await _viewRepository.UpdateAsync(
updateViews,
UpdatingProps(x => x.Label, x => x.Path, x => x.Name, x => x.Description, x => x.DataStatus)
);
}
return ResultOutput.Ok();
}
}
}