using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.UserServer.Application
{
///
/// 同步电子签配置
///
public class SyncElectronSignSettingsCommandHandler(
IRepository rep,
IRepository repEnterpriseElectronSignSetting
) :
IRequestHandler,
IRequestHandler
{
private readonly IRepository rep = rep;
private readonly IRepository repEnterpriseElectronSignSetting = repEnterpriseElectronSignSetting;
///
/// 同步电子签配置
///
///
///
///
public async Task Handle(SyncElectronSignSettingsCommand request, CancellationToken cancellationToken)
{
var accesses = request.Items.DistinctSelect(it => it.Access);
var entities = await rep.AsQueryable()
.Where(it => accesses.Contains(it.Access))
.ToListAsync();
foreach (var item in request.Items)
{
var entity = entities.FirstOrDefault(it => it.Access == item.Access);
if (entity == null)
{
entity = new ElectronSignSetting();
item.Adapt(entity);
await rep.InsertAsync(entity);
}
else
{
item.Adapt(entity);
await rep.UpdateAsync(entity);
}
}
var disableds = entities.Where(it => it.IsDisabled).Select(it => it.Access).ToList();
var settings = await repEnterpriseElectronSignSetting.AsQueryable()
.Where(it => disableds.Contains(it.ElectronSignAccess))
.ToListAsync();
if (settings.IsNotNull())
{
await repEnterpriseElectronSignSetting.DeleteAsync(settings);
}
return true;
}
///
/// 校验电子签通道是否启用
///
///
///
///
public async Task Handle(CheckElectronSignAccessEnabledsCommand request, CancellationToken cancellationToken)
{
var accesses = await rep.AsQueryable().AsNoTracking()
.Where(it => !it.IsDisabled)
.Select(it => it.Access)
.ToListAsync(cancellationToken);
var disabledAccesses = request.Accesses.Where(it => !accesses.Contains(it)).ToList();
if (disabledAccesses.IsNotNull())
{
var model = await EnumUtils.GetModel();
var descriptions = model.Items.Where(it => disabledAccesses.Contains(it.Enum)).Select(it => it.Description).SplitJoin(",");
throw Oops.Oh(EnumErrorCodeType.s400, $"未开通通道:{descriptions}");
}
return true;
}
}
}