using ATS.NonCustodial.Application.Base;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppAnnouncements;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppAnnouncements.Input;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppAnnouncements.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppCaseManagement.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.Apps.Output;
using ATS.NonCustodial.Application.Impl.Business.IM;
using ATS.NonCustodial.Domain.Entities.Business;
using ATS.NonCustodial.Domain.Entities.Business.CaseManagements;
using ATS.NonCustodial.Domain.Entities.Business.IM;
using ATS.NonCustodial.Domain.Shared.AggRootEntities.Dtos;
using ATS.NonCustodial.Domain.Shared.Enums;
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.Configurations.Options;
using ATS.NonCustodial.Shared.Extensions;
using ATS.NonCustodial.Shared.Extensions.AdvancedQuery;
using ATS.NonCustodial.Shared.Extensions.Collection;
using AutoMapper.QueryableExtensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using Yitter.IdGenerator;
namespace ATS.NonCustodial.Application.Impl.Business
{
///
/// 通知公告管理
///
/// Author:mxg
/// CreatedTimed:2022-06-05 10:01 PM
[DynamicApi(Area = "admin")]
public class AppAnnouncementService : AdminAppServiceBase, IAppAnnouncementService, IDynamicApi
{
#region Identity
private readonly IEfRepository _appAnnouncementRepository;
private readonly IEfRepository _appAnnouncementViewStatisticsRepository;
private readonly IHubContext _hubContext;
protected readonly IEfRepository _appCaseManagementRepository;
protected readonly IEfRepository _appSupervisedPersonRepository;
///
///
///
///
///
///
///
///
public AppAnnouncementService(IEfRepository appAnnouncementRepository,
IEfRepository appAnnouncementViewStatisticsRepository,
IHubContext hubContext,
IEfRepository appCaseManagementRepository,
IEfRepository appSupervisedPersonRepository)
{
_appAnnouncementRepository = appAnnouncementRepository;
_appAnnouncementViewStatisticsRepository = appAnnouncementViewStatisticsRepository;
_hubContext = hubContext;
_appCaseManagementRepository = appCaseManagementRepository;
_appSupervisedPersonRepository = appSupervisedPersonRepository;
}
#endregion Identity
///
/// 查询公告明细
///
///
///
[AllowAnonymous]
public async Task Get(long id)
{
var appAnnouncement = await _appAnnouncementRepository.GetAsync(id);
var appAnnouncementViewStatistics = await _appAnnouncementViewStatisticsRepository
.AsQueryable(false, true)
.Where(w => w.AnnouncementId == id)
.ToListAsync();
var rtn = new AppAnnouncementGetDto()
{
Title = appAnnouncement.Title,
Content = appAnnouncement.Content,
AnnouncementTypeId = appAnnouncement.AnnouncementTypeId,
SupervisedPersonIds = appAnnouncementViewStatistics.Select(w => w.SupervisedPersonId).ToList()
};
//返回结果
return ResultOutput.Ok(rtn);
}
///
/// 分页查询
///
///
///
[HttpPost]
public async Task GetPageAsync(AppAnnouncementPageInput input)
{
var express = GetExpression(input, _appAnnouncementRepository.AsQueryable(false, true));
var rtn = await base.GetPageAsync(input, express);
return ResultOutput.Ok(rtn);
}
///
/// 创建或者修改通知公告
///
///
///
public async Task CreateOrModify(AppAnnouncementCreateOrModifyInput input)
{
var announceValid = await base.Valid(input, _appAnnouncementRepository, w =>
{
w = w.AndNotNull(w => w.Title.Equals(input.Title), input.Title.IsNotNullOrEmpty());
return (w, $"当前公告类型名字:{input.Title}已存在");
});
if (!announceValid.Success) return announceValid;
var announcementId = input.Id;
input.SenderId = User.Id;
//修改
if (input.Id > 0) await base.UpdateAsync(input, _appAnnouncementRepository);
else announcementId = (await base.AddWithDataAsync(input, _appAnnouncementRepository))?.Id;
//处理发送人
var personalIds = input.SupervisedPersonDtos!.Where(w => w.SupervisedPersonId > 0).Select(w => w.SupervisedPersonId);
//查出当前公告发送人在查阅表中
var senderIds = (await _appAnnouncementViewStatisticsRepository
.AsQueryable(false, true)
.Where(w => w.AnnouncementId == input.Id)
.ToListAsync())
.Select(w => w.SupervisedPersonId);
//新增的
var addIds = personalIds.Except(senderIds);
if (addIds.Any())
{
var spCaseList = await GetCurrentSupervisePersonProcessingCase(addIds);
var addAnnouncementViews = addIds.Select(spId =>
{
var currentSpCase = spCaseList.FirstOrDefault(w => w.SupervisedPersonId == spId);
return new AppAnnouncementViewStatistics()
{
AnnouncementId = announcementId!.Value,
Title = input.Title,
CaseId = currentSpCase?.CaseId,
CaseName = currentSpCase?.CaseName,
SupervisedPersonId = spId,
SupervisedPersonName = input.SupervisedPersonDtos!.FirstOrDefault(w => w.SupervisedPersonId == spId)?.SupervisedPersonName
};
});
await _appAnnouncementViewStatisticsRepository.InsertAsync(addAnnouncementViews);
}
//
//删除的
var removeIds = senderIds.Except(personalIds);
if (removeIds.Any()) await _appAnnouncementViewStatisticsRepository.DeleteAsync(w => removeIds.Contains(w.AnnouncementId));
#region 发送给目标signalR客户端连接对象(到时候app端直接on("NoticeAnnouncementToSupervisedPerson"))即可接收
var remindLis = _appAnnouncementViewStatisticsRepository
.Where(w => w.AnnouncementId == announcementId)
.Select(w => new AppRemindListDto()
{
Id = announcementId!.Value,
CreatedTime = w.CheckTime,
CreatedUserId = w.CreatedUserId,
CreatedUserName = w.CreatedUserName,
Title = input.Title,
Content = input.Content,
CheckStatus = w.CheckStatus,
CheckTime = w.CheckTime
}).ToList();
var receiveIds = input
.SupervisedPersonDtos!
.Select(w => w.SupervisedPersonId.ToString())
.ToList();
await _hubContext
.Clients
.Users(receiveIds)
.SendAsync(nameof(NonCustodialHub.NoticeAnnouncementToSupervisedPerson), JsonConvert.SerializeObject(remindLis));
#endregion 发送给目标signalR客户端连接对象(到时候app端直接on("NoticeAnnouncementToSupervisedPerson"))即可接收
//返回结果
return ResultOutput.Ok();
}
///
/// 批量修改状态
///
///
///
public async Task BatchChangeDictionaryStatus(BatchChangeStatusInput input) => await base.BatchChangeStatus(input, _appAnnouncementRepository);
///
/// 批量删除
///
///
///
[HttpDelete]
public async Task BatchDeleteAsync(BatchIdsInput input)
{
if (!input.Ids.Any()) return ResultOutput.NotOk("参数不能为空!");
await _appAnnouncementRepository.DeleteAsync(w => input.Ids.Contains(w.Id));
await _appAnnouncementViewStatisticsRepository.DeleteAsync(w => input.Ids.Contains(w.AnnouncementId));
return ResultOutput.Result(true);
}
///
/// 分页查询(公告查阅列表)
///
///
///
public async Task ViewStatistics(ViewStatisticsPageInput input)
{
var data = await _appAnnouncementViewStatisticsRepository
.AsQueryable(false, true)
.Where(w => w.AnnouncementId == input.Id)
.OrderByDescending(r => r.Id)
.ProjectTo(Mapper.ConfigurationProvider)
.PagedAsync(input)
.ConfigureAwait(false);
return ResultOutput.Ok(data);
}
///
/// 业务工作台==>最新5条公告
///
///
public async Task AnnouncementBusinessWorkbench()
{
var dataList = await _appAnnouncementRepository.AsQueryable(false, true)
.OrderByDescending(w => w.CreatedTime)
.Skip(0)
.Take(5)
.ProjectTo(Mapper.ConfigurationProvider)
.ToListAsync();
return ResultOutput.Ok(dataList);
}
///
/// 上传文件
///
///
///
public async Task UploadFile([FromForm] IFormFile file)
{
var uploadConfig = LazyGetRequiredService();
return await base.CustomizedUpload(file, YitIdHelper.NextId(), uploadConfig.Announcement, null);
}
///
/// 批量设置是否查阅状态
///
///
///
public async Task BatchSetCheckStatus(BatchSetCheckStatusInput input)
{
if (_user?.Id > 0 || !input.AnnouncementIds.Any()) return ResultOutput.Ok();
//查询记录(根据公告Id和订阅者ID(被监管人Id))
var subAnnList = await _appAnnouncementViewStatisticsRepository
.Where(w => input.AnnouncementIds.Contains(w.AnnouncementId) && w.SupervisedPersonId == User.Id)
.ToListAsync();
subAnnList.ForEach(item =>
{
//如果已经是已读了就直接返回
if (item.CheckStatus == CheckStatusEnum.Checked) return;
item!.CheckStatus = input.CheckStatus;
if (input.CheckStatus == CheckStatusEnum.Checked)
{
item.CheckTime = DateTime.Now;
}
else
{
item.CheckTime = null;
}
});
//批量修改
await _appAnnouncementViewStatisticsRepository.UpdateAsync(subAnnList);
return ResultOutput.Ok();
}
#region Private
///
/// 查询条件
///
///
///
///
private IQueryable GetExpression(AppAnnouncementPageInput pageInput, IQueryable query)
{
query = query
.WhereIf(pageInput.KeyWord.NotNull(), a => a.Title.Contains(pageInput.KeyWord))
.WhereIf(pageInput.AnnouncementTypeIds.IsNotNullOrEmpty(), w => pageInput.AnnouncementTypeIds.Contains(w.AnnouncementTypeId))
.WhereIf(pageInput.StatusSearch?.Content != null, w => w.DataStatus == pageInput.StatusSearch!.Content);
var express = base.GetExpression(pageInput, query);
return express;
}
///
/// 获取当前被监管人正在进行的案件
///
///
private async Task> GetCurrentSupervisePersonProcessingCase(IEnumerable spIds)
{
var caseDto = await (from c in _appCaseManagementRepository.AsQueryable(false, true)
join cspr in _appSupervisedPersonRepository.AsQueryable(false, true) on c.Id equals cspr.CaseId
where spIds.Contains(cspr.SupervisedPersonId) && c.CaseProgress != CaseProgressEnum.Closed
select new SupervisedPersonByUserOutput()
{
CaseId = c.Id,
CaseName = c.Name,
SupervisedPersonId = cspr.SupervisedPersonId,
SupervisedPersonName = cspr.SupervisedPersonName
}).ToListAsync();
return caseDto.OrderBy(w => w.SupervisedPersonId).ToList();
}
#endregion Private
}
}