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