You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1386 lines
69 KiB
1386 lines
69 KiB
using ATS.NonCustodial.Application.Base; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth.Output; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppAnnouncements; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppAnnouncements.Input; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications.Input; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications.Output; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppCaseManagement; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppCaseManagement.Input; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppCaseManagement.Output; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppSignsInformations; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppSignsInformations.Output; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppEarlyWarnings; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppEarlyWarnings.Input; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.Apps; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.Apps.Input; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.Apps.Output; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.MaterialManager.Directories; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.MaterialManager.Directories.Output; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices.Input; |
|
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices.Output; |
|
using ATS.NonCustodial.Application.Impl.Admins; |
|
using ATS.NonCustodial.Application.Impl.Business.CaseManagements; |
|
using ATS.NonCustodial.Application.Impl.Business.IM; |
|
using ATS.NonCustodial.Domain.Entities.Admins; |
|
using ATS.NonCustodial.Domain.Entities.Business; |
|
using ATS.NonCustodial.Domain.Entities.Business.CaseManagements; |
|
using ATS.NonCustodial.Domain.Entities.Business.EarlyWarning; |
|
using ATS.NonCustodial.Domain.Entities.Business.IM; |
|
using ATS.NonCustodial.Domain.Entities.Business.MaterialManager; |
|
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.Dtos; |
|
using ATS.NonCustodial.Shared.Common.Enums; |
|
using ATS.NonCustodial.Shared.Common.UnifiedResults; |
|
using ATS.NonCustodial.Shared.Configurations.Options; |
|
using ATS.NonCustodial.Shared.Extensions; |
|
using ATS.NonCustodial.Shared.Extensions.Collection; |
|
using AutoMapper.QueryableExtensions; |
|
using Castle.Components.DictionaryAdapter; |
|
using Microsoft.AspNetCore.Authorization; |
|
using Microsoft.AspNetCore.Http; |
|
using Microsoft.AspNetCore.Mvc; |
|
using Microsoft.AspNetCore.SignalR; |
|
using Microsoft.EntityFrameworkCore; |
|
using NPOI.SS.UserModel; |
|
using System.IO; |
|
|
|
namespace ATS.NonCustodial.Application.Impl.Business |
|
{ |
|
/// <summary> |
|
/// App接口 |
|
/// </summary> |
|
/// Author:mxg |
|
/// CreatedTimed:2022-06-12 03:40 PM |
|
[DynamicApi(Area = "admin")] |
|
public class AppManagementService : AdminCommonService, IAppManagementService, IDynamicApi |
|
{ |
|
#region Identity |
|
|
|
/// <summary> |
|
/// 案子管理人员 |
|
/// </summary> |
|
private readonly IEfRepository<AppCaseSupervisor, long> _appSupervisorRepository; |
|
|
|
private readonly IEfRepository<AppSessionMessage, long> _appSessionMessageRepository; |
|
private readonly IAuthService _authService; |
|
private readonly IAppCaseManagementService _appCaseManagementService; |
|
private readonly IAppSignsInformationService _appSignsInformationService; |
|
private readonly IAppPunchRecordService _appPunchRecordService; |
|
private readonly IAppBusinessApplicationService _appBusinessApplicationService; |
|
private readonly IEfRepository<AppBusinessApplication, long> _appBusinessApplicationRepository; |
|
private readonly IEfRepository<AppFileAccessRecords, long> _appFileAccessRecordsRepository; |
|
private readonly IEfRepository<AppAnnouncement, long> _appAnnouncementRepository; |
|
private readonly IEfRepository<AppEarlyWarning, long> _appEarlyWarningRepository; |
|
private readonly IEfRepository<AppEarlyWarningViewStatistics, long> _appEarlyWarningViewStatisticsRepository; |
|
private readonly IEfRepository<AppAnnouncementViewStatistics, long> _appAnnouncementViewStatisticsRepository; |
|
private readonly IEfRepository<AppBusinessApplicationViewStatistics, long> _appBusinessApplicationViewStatisticsRepository; |
|
private readonly IEfRepository<AppDirectoryDescriptor, long> _appDirectoryDescriptorRepository; |
|
private readonly IEfRepository<AppFileDescriptor, long> _appFileDescriptorRepository; |
|
private readonly IHubContext<NonCustodialHub> _hubContext; |
|
private readonly IEfRepository<AppUser, long> _appUserRepository; |
|
private readonly IAppEarlyWarningService _appEarlyWarningService; |
|
private readonly IAppAnnouncementService _appAnnouncementService; |
|
private readonly IAppDirectorDescriptorService _appDirectorDescriptorService; |
|
private readonly ISMSService _smsService; |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <param name="appSupervisorRepository"></param> |
|
/// <param name="appSupervisedPersonRepository"></param> |
|
/// <param name="appManagementRepository"></param> |
|
/// <param name="appSupervisedPersonRealTimeLocationRepository"></param> |
|
/// <param name="userService"></param> |
|
/// <param name="appDictionaryService"></param> |
|
/// <param name="appCaseManagementService"></param> |
|
/// <param name="appSignsInformationService"></param> |
|
/// <param name="appPunchRecordService"></param> |
|
/// <param name="appBusinessApplicationService"></param> |
|
/// <param name="appBusinessApplicationRepository"></param> |
|
/// <param name="appAnnouncementRepository"></param> |
|
/// <param name="appEarlyWarningRepository"></param> |
|
/// <param name="appAnnouncementViewStatisticsRepository"></param> |
|
/// <param name="appBusinessApplicationViewStatisticsRepository"></param> |
|
/// <param name="authService"></param> |
|
/// <param name="appUserRepository"></param> |
|
/// <param name="hubContext"></param> |
|
/// <param name="appSessionMessageRepository"></param> |
|
/// <param name="appEarlyWarningService"></param> |
|
/// <param name="appAnnouncementService"></param> |
|
public AppManagementService(IEfRepository<AppCaseSupervisor, long> appSupervisorRepository, |
|
IEfRepository<AppCaseSupervisedPerson, long> appSupervisedPersonRepository, |
|
IEfRepository<AppCaseManagement, long> appManagementRepository, |
|
IEfRepository<AppSupervisedPersonRealTimeLocation, long> appSupervisedPersonRealTimeLocationRepository, |
|
IUserService userService, |
|
IAppDictionaryService appDictionaryService, |
|
IAppDirectorDescriptorService appDirectorDescriptorService, |
|
IAppCaseManagementService appCaseManagementService, |
|
IAppSignsInformationService appSignsInformationService, |
|
IAppPunchRecordService appPunchRecordService, |
|
IAppBusinessApplicationService appBusinessApplicationService, |
|
IEfRepository<AppBusinessApplication, long> appBusinessApplicationRepository, |
|
IEfRepository<AppFileAccessRecords, long> appFileAccessRecordsRepository, |
|
IEfRepository<AppAnnouncement, long> appAnnouncementRepository, |
|
IEfRepository<AppEarlyWarning, long> appEarlyWarningRepository, |
|
IEfRepository<AppAnnouncementViewStatistics, long> appAnnouncementViewStatisticsRepository, |
|
IEfRepository<AppBusinessApplicationViewStatistics, long> appBusinessApplicationViewStatisticsRepository, IEfRepository<AppDirectoryDescriptor, long> appDirectoryDescriptorRepository, |
|
IEfRepository<AppFileDescriptor, long> appFileDescriptorRepository, |
|
IAuthService authService, |
|
IEfRepository<AppUser, long> appUserRepository, |
|
IHubContext<NonCustodialHub> hubContext, |
|
IEfRepository<AppSessionMessage, long> appSessionMessageRepository, |
|
IAppEarlyWarningService appEarlyWarningService, |
|
IAppAnnouncementService appAnnouncementService, |
|
IEfRepository<AppEarlyWarningViewStatistics, long> appEarlyWarningViewStatisticsRepository, |
|
ISMSService smsService) |
|
: base( |
|
appManagementRepository, |
|
appSupervisorRepository, |
|
appSupervisedPersonRepository, |
|
userService, |
|
appDictionaryService, |
|
appSupervisedPersonRealTimeLocationRepository) |
|
{ |
|
_appSupervisorRepository = appSupervisorRepository; |
|
_appCaseManagementService = appCaseManagementService; |
|
_appFileAccessRecordsRepository = appFileAccessRecordsRepository; |
|
_appSignsInformationService = appSignsInformationService; |
|
_appPunchRecordService = appPunchRecordService; |
|
_appBusinessApplicationService = appBusinessApplicationService; |
|
_appBusinessApplicationRepository = appBusinessApplicationRepository; |
|
_appAnnouncementRepository = appAnnouncementRepository; |
|
_appEarlyWarningRepository = appEarlyWarningRepository; |
|
_appAnnouncementViewStatisticsRepository = appAnnouncementViewStatisticsRepository; |
|
_appBusinessApplicationViewStatisticsRepository = appBusinessApplicationViewStatisticsRepository; |
|
_authService = authService; |
|
_hubContext = hubContext; |
|
_appDirectorDescriptorService = appDirectorDescriptorService; |
|
_appSessionMessageRepository = appSessionMessageRepository; |
|
_appUserRepository = appUserRepository; |
|
_appEarlyWarningService = appEarlyWarningService; |
|
_appAnnouncementService = appAnnouncementService; |
|
_appEarlyWarningViewStatisticsRepository = appEarlyWarningViewStatisticsRepository; |
|
_appDirectoryDescriptorRepository = appDirectoryDescriptorRepository; |
|
_appFileDescriptorRepository = appFileDescriptorRepository; |
|
_smsService = smsService; |
|
} |
|
|
|
#endregion Identity |
|
|
|
#region 案件管理(监管人) |
|
|
|
/// <summary> |
|
/// 获取监管人员下的所有被监管人员人信息 |
|
/// </summary> |
|
/// <param name="name">被监管人员名字</param> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// </remarks> |
|
public async Task<IResultOutput<List<SupervisedPersonListOutput>>> GetSupervisedPersonListByName(string? name) |
|
{ |
|
//CaseProgressEnum案件已结束的不再展示 |
|
var rtn = (await GetCaseListDetail(name)).Where(w => w.Latitude != null && w.Longitude != null&&w.CaseProgress!= CaseProgressEnum.Closed).ToList(); |
|
|
|
//返回结果 |
|
return (IResultOutput<List<SupervisedPersonListOutput>>)ResultOutput.Ok(rtn); |
|
} |
|
|
|
/// <summary> |
|
/// 获取监管人员下的所有被监管人员人信息(通过案件分组) |
|
/// </summary> |
|
/// <param name="name"></param> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<IEnumerable<SupervisedPersonListGroupOutput>>> GetSupervisedPersonListByNameToCaseGroup(string? name) |
|
{ |
|
var rtn = await GetCaseListDetailByIm(name); |
|
|
|
var dataGroup = rtn.GroupBy(w => new { w.CaseId, w.CaseName }) |
|
.Select(w => new SupervisedPersonListGroupOutput() |
|
{ |
|
CaseId = w.Key.CaseId, |
|
CaseName = w.Key.CaseName, |
|
PersonList = w.ToList() |
|
}); |
|
|
|
return (IResultOutput<IEnumerable<SupervisedPersonListGroupOutput>>)ResultOutput.Ok(dataGroup); |
|
} |
|
|
|
/// <summary> |
|
/// 点击被监管人员查看其案子明细 |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// ###### 入参示例 |
|
/// { |
|
/// "caseId": 300418976542789, |
|
/// "superPersonId": 297606179328069 |
|
/// } |
|
/// </remarks> |
|
[HttpPost] |
|
public async Task<IResultOutput<GetSuperPersonCaseDetailDto>> GetSuperPersonCaseDetail(GetSuperPersonCaseDetailInput input) |
|
{ |
|
var caseDetail = await _appCaseManagementRepository.FindAsync(input.CaseId); |
|
if (caseDetail == null) return (IResultOutput<GetSuperPersonCaseDetailDto>)ResultOutput.NotOk("当前案子不存在!"); |
|
|
|
var caseDto = Mapper.Map<AppCaseManagement, GetSuperPersonCaseDetailDto>(caseDetail); |
|
|
|
//裁决状态 |
|
caseDto.JudgmentStatusName = (await _appDictionaryService.GetDicByDicId(caseDto.JudgmentStatusId))?.Name; |
|
//案件类型 |
|
caseDto.CaseTypeName = (await _appDictionaryService.GetDicByDicId(caseDto.CaseTypeId))?.Name; |
|
//获取打卡时间区间分钟 |
|
var mis = await base.GetDictionariesOutput("plan_time", "interval"); |
|
caseDto.interval = mis.Value; |
|
var isAdmin = await _userService.IsAdmin(User.Id); |
|
|
|
//监管人员 |
|
var sp = await _appSupervisorRepository |
|
.AsQueryable(false, true) |
|
.Where(w => w.CaseId == caseDetail.Id && (isAdmin.IsAdmin || w.SupervisorId == User.Id)) |
|
.ToListAsync(); |
|
|
|
caseDto.SupervisorId = sp?.Select(w => w.SupervisorId)?.JoinAsString(","); |
|
caseDto.SupervisorName = sp?.Select(w => w.SupervisorName)?.JoinAsString(","); |
|
|
|
//被监管人员 |
|
var spR = await _appSupervisedPersonRepository |
|
.AsQueryable(false, true) |
|
.FirstOrDefaultAsync(w => w.CaseId == caseDetail.Id && w.SupervisedPersonId == input.SuperPersonId); |
|
|
|
caseDto.SupervisedPersonUserId = spR?.SupervisedPersonId; |
|
caseDto.SupervisedPersonId = spR?.Id; |
|
caseDto.EnterFace = spR?.EnterFace; |
|
caseDto.SupervisedPersonName = spR?.SupervisedPersonName; |
|
caseDto.ElectricFenceId = spR?.ElectricFenceId; |
|
caseDto.IdCard = spR?.IdCard; |
|
|
|
//案件类型() |
|
var caseType = (await _appDictionaryService.GetDicByDicId(caseDto.CaseTypeId)); |
|
if (caseType.Value.IsNotNullOrWhiteSpace() && caseType.Value!.IndexOf(",", StringComparison.Ordinal) > 0) |
|
{ |
|
caseDto.AlertTypeLevelRules = caseType.Value; |
|
var caseTypeArray = caseType.Value.Split(","); |
|
if (caseTypeArray.Length >= 2) caseDto.CaseTypeName = $"预警 {caseTypeArray[0]} 次变黄,预警 {caseTypeArray[1]} 次变红"; |
|
} |
|
|
|
//返回结果 |
|
return (IResultOutput<GetSuperPersonCaseDetailDto>)ResultOutput.Ok(caseDto); |
|
} |
|
|
|
/// <summary> |
|
/// 获取案件批注内容列表 |
|
/// </summary> |
|
/// <param name="id"></param> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// ###### 入参示例 |
|
/// 299059431809093 |
|
/// </remarks> |
|
public async Task<IResultOutput<List<AppCaseNotesListOut>>> GetAppCaseNotes(long id) => (IResultOutput<List<AppCaseNotesListOut>>)await _appCaseManagementService.GetCaseNotes(id); |
|
|
|
/// <summary> |
|
/// 根据被监管人员Id查询体征信息 |
|
/// </summary> |
|
/// <param name="supervisedPersonId"></param> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// ###### 入参示例 |
|
/// 297606179328069 |
|
/// </remarks> |
|
public async Task<IResultOutput<AppSignsInformationListDto>> GetAppSignsInformation(long supervisedPersonId) => (IResultOutput<AppSignsInformationListDto>)await _appSignsInformationService.Get(supervisedPersonId); |
|
|
|
/// <summary> |
|
/// 获取被监管人员的打卡记录(被监管人和监管人App通用) |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// ###### 入参示例 |
|
/// { |
|
/// "pageIndex": 1, |
|
/// "pageSize": 10, |
|
/// "caseId": 300418976542789, |
|
/// "supervisedPersonId": 297606179328069 |
|
/// } |
|
/// </remarks> |
|
[HttpPost] |
|
public async Task<IResultOutput<PagedList<AppPunchRecordListDto>>> GetAppPunchRecord(GetAppPunchRecordInput input) |
|
{ |
|
var userCase = await base.GetCurrentSupervisePersonProcessingCase(input.SupervisedPersonId ?? User.Id); |
|
|
|
if (userCase == null) return new ResultOutput<PagedList<AppPunchRecordListDto>>(); |
|
|
|
return (IResultOutput<PagedList<AppPunchRecordListDto>>)await _appPunchRecordService.GetPageAsync(new AppPunchRecordGetPageInput() |
|
{ |
|
Id = userCase.CaseId, |
|
SupervisedPersonId = input.SupervisedPersonId ?? User.Id, |
|
PageIndex = input.PageIndex, |
|
PageSize = input.PageSize |
|
}); |
|
} |
|
|
|
/// <summary> |
|
/// 获取被监管人员历史轨迹 |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// ###### 入参示例 |
|
/// { |
|
/// "pageIndex": 1, |
|
/// "pageSize": 10, |
|
/// "caseId": 300418976542789, |
|
/// "supervisedPersonId": 297606179328069 |
|
/// } |
|
/// </remarks> |
|
[HttpPost] |
|
public async Task<IResultOutput<List<GetAppHistoricalTrackDto>>> GetAppHistoricalTrack(GetAppPunchRecordInput input) |
|
{ |
|
var rtn = await _appSupervisedPersonRealTimeLocationRepository |
|
.Where(w => w.SupervisedPersonId == input.SupervisedPersonId && w.CaseId == input.CaseId) |
|
.WhereIf(input.TimeSearch is { SearchType: SearchTimeTypeEnums.CreatedTimed, BeginTime: { } }, p => p.CreatedTime >= input.TimeSearch!.BeginTime) |
|
.WhereIf(input.TimeSearch is { SearchType: SearchTimeTypeEnums.CreatedTimed, EndTime: { } }, p => p.CreatedTime < input.TimeSearch!.EndTime) |
|
.OrderBy(w => w.CreatedTime) |
|
.ProjectTo<GetAppHistoricalTrackDto>(Mapper.ConfigurationProvider) |
|
.ToListAsync(); |
|
|
|
return (IResultOutput<List<GetAppHistoricalTrackDto>>)ResultOutput.Ok(rtn); |
|
} |
|
|
|
/// <summary> |
|
/// 获取监管人员手里的案子列表[分页] |
|
/// </summary> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// ###### 入参示例 |
|
/// { |
|
/// "supervisorId": 298680001155141, |
|
/// "caseProgress": 0 |
|
/// } |
|
/// </remarks> |
|
[HttpPost] |
|
public async Task<IResultOutput<PagedList<GetSupervisorCaseListDto>>> GetAppSupervisorCaseList(GetSupervisorCaseListInput input) |
|
{ |
|
var rtn = await _appCaseManagementService.GetSupervisorCaseList(input); |
|
|
|
return (IResultOutput<PagedList<GetSupervisorCaseListDto>>)rtn; |
|
} |
|
|
|
/// <summary> |
|
/// 获取案子明细 |
|
/// </summary> |
|
/// <param name="caseId"></param> |
|
/// <returns></returns> |
|
/// <remarks> |
|
/// ###### 入参示例 |
|
/// 300418976542789 |
|
/// </remarks> |
|
public async Task<IResultOutput<GetSuperPersonCaseDetailDto>> GetAppCaseDetail(long caseId) |
|
{ |
|
var caseDetail = await _appCaseManagementRepository.FindAsync(caseId); |
|
if (caseDetail == null) return (IResultOutput<GetSuperPersonCaseDetailDto>)ResultOutput.NotOk("当前案子不存在!"); |
|
|
|
var caseDto = Mapper.Map<AppCaseManagement, GetSuperPersonCaseDetailDto>(caseDetail); |
|
//裁决状态 |
|
caseDto.JudgmentStatusName = (await _appDictionaryService.GetDicByDicId(caseDto.JudgmentStatusId))?.Name; |
|
//案件类型() |
|
var caseType = (await _appDictionaryService.GetDicByDicId(caseDto.CaseTypeId)); |
|
if (caseType.Value.IsNotNullOrWhiteSpace() && caseType.Value!.IndexOf(",", StringComparison.Ordinal) > 0) |
|
{ |
|
caseDto.AlertTypeLevelRules = caseType.Value; |
|
var caseTypeArray = caseType.Value.Split(","); |
|
if (caseTypeArray.Length >= 2) caseDto.CaseTypeName = $"预警 {caseTypeArray[0]} 次变黄,预警 {caseTypeArray[1]} 次变红"; |
|
} |
|
|
|
//监管人员 |
|
caseDto.SupervisorName = (await _appSupervisorRepository |
|
.AsQueryable(false, true) |
|
.Where(w => w.CaseId == caseDetail.Id) |
|
.ToListAsync()) |
|
.Select(w => w.SupervisorName)! |
|
.JoinAsString(","); |
|
|
|
//被监管人员 |
|
caseDto.SupervisedPersonName = (await _appSupervisedPersonRepository |
|
.AsQueryable(false, true) |
|
.Where(w => w.CaseId == caseDetail.Id) |
|
.ToListAsync()) |
|
.Select(w => w.SupervisedPersonName)! |
|
.JoinAsString(","); |
|
|
|
return (IResultOutput<GetSuperPersonCaseDetailDto>)ResultOutput.Ok(caseDto); |
|
} |
|
|
|
/// <summary> |
|
/// 添加案件重要节点批注 |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput> AddAppCaseNotes(AddCaseNotesInput input) => await _appCaseManagementService.AddCaseNotes(input); |
|
|
|
#endregion 案件管理(监管人) |
|
|
|
#region 业务审核(监管人) |
|
|
|
/// <summary> |
|
/// 获取当前监管人拥有的被监管人的业务申请记录列表[分页] |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <see cref="AuditStatusEnum"/> |
|
/// <returns></returns> |
|
/// <remarks>业务申请审核状态(0:待审核 1:已通过 2:已驳回)</remarks> |
|
[HttpPost] |
|
public async Task<IResultOutput<PagedList<AppBusinessApplicationListDto>>> GetAppBusinessByStatusListAsync(GetAppBusinessByStatusListPageInput input) |
|
{ |
|
var data = await _appCaseManagementService.GetCaseSuperviseList(); |
|
|
|
var caseIds = data.Select(w => w.CaseId).ToList(); |
|
|
|
//业务申请列表 |
|
var businessList = await _appBusinessApplicationRepository |
|
.AsQueryable(false, true) |
|
.Where(w => w.AuditStatus == input.AuditStatus && caseIds.Contains(w.CaseId)) |
|
.OrderByDescending(w => w.CreatedTime) |
|
.ProjectTo<AppBusinessApplicationListDto>(Mapper.ConfigurationProvider) |
|
.PagedAsync(input) |
|
.ConfigureAwait(true); |
|
|
|
return (IResultOutput<PagedList<AppBusinessApplicationListDto>>)ResultOutput.Ok(businessList); |
|
} |
|
|
|
/// <summary> |
|
/// 获取业务申请明细 |
|
/// </summary> |
|
/// <param name="id"></param> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<AppBusinessApplicationGetDto>> GetAppBusinessDetail(long id) => (IResultOutput<AppBusinessApplicationGetDto>)await _appBusinessApplicationService.GetAsync(id); |
|
|
|
/// <summary> |
|
/// 批量审核(App业务审核) |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput> AppBusinessBatchAudit(BatchAuditInput input) => await _appBusinessApplicationService.BatchAudit(input); |
|
|
|
/// <summary> |
|
/// 监管人提醒 |
|
/// </summary> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<List<AppBusinessApplicationListDto>>> AppSupervisorReminds() |
|
{ |
|
var data = await _appCaseManagementService.GetCaseSuperviseList(); |
|
|
|
var caseIds = data.Select(w => w.CaseId).ToList(); |
|
|
|
//业务申请列表 |
|
var businessList = await _appBusinessApplicationRepository |
|
.AsQueryable(false, true) |
|
.Where(w => caseIds.Contains(w.CaseId)) |
|
.OrderByDescending(w => w.CreatedTime) |
|
.ProjectTo<AppBusinessApplicationListDto>(Mapper.ConfigurationProvider) |
|
.ToListAsync(); |
|
|
|
return (IResultOutput<List<AppBusinessApplicationListDto>>)ResultOutput.Ok(businessList); |
|
} |
|
|
|
/// <summary> |
|
/// 监管人简化版提醒(监管人) |
|
/// </summary> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput<PagedList<SupervisorRemindOutput>>> GetSimplifySupervisorReminds(GetSimplifySupervisorRemindsPageInput input) |
|
{ |
|
var rtn = new List<SupervisorRemindOutput>(); |
|
|
|
//业务申请提醒 |
|
var data = await _appCaseManagementService.GetCaseSuperviseList(); |
|
|
|
var caseIds = data.Select(w => w.CaseId).ToList(); |
|
var rtnBusiness = (from bp in _appBusinessApplicationRepository.AsQueryable(false, true) |
|
join bavs in _appBusinessApplicationViewStatisticsRepository.AsQueryable(false, true) on bp.Id equals bavs.AppBusinessApplicationId |
|
where caseIds.Contains(bavs.CaseId) |
|
select new SupervisorRemindOutput() |
|
{ |
|
Id = bp.Id, |
|
Title = bp.ApplicationTypeName, |
|
Content = bp.ApplicationDescription, |
|
CreatedUserId = bp.CreatedUserId, |
|
CreatedUserName = bp.CreatedUserName, |
|
CreatedTime = bp.CreatedTime, |
|
CheckStatus = bavs.CheckStatus, |
|
CheckTime = bavs.CheckTime |
|
}); |
|
|
|
if (rtnBusiness.Any()) rtn.AddRange(rtnBusiness); |
|
|
|
var totalCount = rtnBusiness.Count(); |
|
|
|
var pageDataList = await rtnBusiness |
|
.OrderByDescending(w => w.CheckTime) |
|
.Skip((input.PageIndex - 1) * input.PageSize) |
|
.Take(input.PageSize) |
|
.ToListAsync(); |
|
|
|
//返回结果 |
|
return (IResultOutput<PagedList<SupervisorRemindOutput>>)ResultOutput.Ok(new PagedList<SupervisorRemindOutput>() |
|
{ |
|
TotalCount = totalCount, |
|
Data = pageDataList.Distinct((x, y) => x.Id == y.Id).ToList() |
|
}); |
|
} |
|
|
|
/// <summary> |
|
/// 批量设置消息提示是否查阅(监管人) |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput> GetCheckSupervisorRemindsStatus(GetCheckSupervisorRemindsStatusInput input) |
|
{ |
|
if (!input.BusinessApplicationIds.Any()) return ResultOutput.NotOk("参数不能为空"); |
|
|
|
var busViewList = await _appBusinessApplicationViewStatisticsRepository |
|
.Where(w => input.BusinessApplicationIds.Contains(w.AppBusinessApplicationId) && w.SubscriberId == User.Id) |
|
.ToListAsync(); |
|
|
|
foreach (var item in busViewList) |
|
{ |
|
item.CheckStatus = input.CheckStatus; |
|
|
|
if (input.CheckStatus == CheckStatusEnum.Checked) |
|
{ |
|
item.CheckTime = DateTime.Now; |
|
} |
|
else |
|
{ |
|
item.CheckTime = null; |
|
} |
|
} |
|
|
|
await _appBusinessApplicationViewStatisticsRepository.UpdateAsync(busViewList); |
|
|
|
return ResultOutput.Ok(); |
|
} |
|
|
|
#endregion 业务审核(监管人) |
|
|
|
#region 聊天(IM)(监管人-被监管人) |
|
|
|
/// <summary> |
|
/// 获取当前监管人下所有的被监管人(聊天列表) |
|
/// </summary> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<List<ChatSupervisedPersonListDto>>> GetChatSupervisedPersonAsync() |
|
{ |
|
var dataList = await (from sp in _appSupervisorRepository.AsQueryable(false, true).Where(w => w.SupervisorId == User.Id) |
|
join csp in _appSupervisedPersonRepository.AsQueryable(false, true) on sp.CaseId equals csp.CaseId |
|
select new ChatSupervisedPersonListDto() |
|
{ |
|
CaseId = sp.CaseId, |
|
SupervisorId = sp.SupervisorId, |
|
SupervisorName = sp.SupervisorName, |
|
SupervisedPersonId = csp.SupervisedPersonId, |
|
SupervisedPersonName = csp.SupervisedPersonName, |
|
SupervisorAvatar = _user.Name |
|
}).ToListAsync(); |
|
|
|
return (IResultOutput<List<ChatSupervisedPersonListDto>>)ResultOutput.Ok(dataList); |
|
} |
|
|
|
/// <summary> |
|
/// 获取当前监管人下所有的被监管人(聊天列表)[监管人+被监管人] |
|
/// </summary> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput<PagedList<SupervisedPersonChatListOutput>>> GetChatSimplifySupervisedPersonListAsync(GetChatSimplifySupervisedPersonPageInput input) |
|
{ |
|
var dataPerson = await GetChatPersonList(new GetChatPersonListPageInput() |
|
{ |
|
PageIndex = input.PageIndex, |
|
PageSize = input.PageSize |
|
}); |
|
|
|
var receiverList = await _userService.GetAllByConditionAsync(new BatchIdsInput() |
|
{ |
|
Ids = dataPerson.Data.Where(q => q.ReceiverId != null) |
|
.Select(w => w.ReceiverId!.Value) |
|
.Union(dataPerson.Data.Select(w => w.SenderId!.Value)) |
|
.Distinct() |
|
.ToList() |
|
}); |
|
|
|
//用来存储职位及对应index |
|
var postDict = new Dictionary<string, int>(); |
|
|
|
//处理头像 |
|
dataPerson.Data = dataPerson.Data.Where(q => q.ReceiverId != null).Select((item, index) => |
|
{ |
|
item.SenderAvatar ??= receiverList.FirstOrDefault(w => w.Id == item.SenderId)?.Avatar ?? "/avatar/default.png"; |
|
item.ReceiverAvatar ??= receiverList.FirstOrDefault(w => w.Id == item.ReceiverId)?.Avatar ?? "/avatar/default.png"; |
|
var EnterFace = base._appSupervisedPersonRepository.AsQueryable(false, true).Where(q => q.SupervisedPersonId == item.ReceiverId).FirstOrDefault()?.EnterFace; |
|
if (!string.IsNullOrEmpty(EnterFace)) |
|
item.Avatar ??= EnterFace; |
|
else |
|
item.Avatar ??= receiverList.FirstOrDefault(w => w.Id == item.ReceiverId)?.Avatar ?? "/avatar/default.png"; |
|
|
|
//职位名字 |
|
if (User.ChatPersonType != ChatPersonTypeEnum.SupervisedPerson) return item; |
|
{ |
|
var positionName = receiverList.FirstOrDefault(w => w.Id == item.ReceiverId)?.PositionName; |
|
if (postDict.ContainsKey(positionName)) |
|
{ |
|
postDict[positionName] += 1; |
|
} |
|
else |
|
{ |
|
postDict.Add(positionName, 1); |
|
} |
|
|
|
item.ReceiverName = positionName + postDict[positionName].ToString(); |
|
} |
|
|
|
return item; |
|
}).ToList(); |
|
|
|
//分页处理消息 |
|
List<SupervisedPersonChatListOutput> pageData = new EditableList<SupervisedPersonChatListOutput>(); |
|
foreach (var chatDto in dataPerson.Data.Where(q => q.ReceiverId != null)) |
|
{ |
|
/*当前聊天页面,逻辑应该是发送者是xxx,接收者是当前登录人 |
|
* chatDto也就是列表人员的Id==当前登录人的Id(也就是说当前User为接收者) |
|
*/ |
|
//当前聊天的所有消息 |
|
var sessionMessage = _appSessionMessageRepository |
|
.AsQueryable(false, true) |
|
.Where(w => w.CaseId == chatDto.CaseId && |
|
( |
|
w.SenderId == chatDto.SenderId && w.ReceiverId == chatDto.ReceiverId |
|
|| |
|
w.SenderId == chatDto.ReceiverId && w.ReceiverId == chatDto.SenderId) |
|
); |
|
|
|
var messageList = await sessionMessage.OrderByDescending(w => w.CreatedTime).ToListAsync(); |
|
|
|
var dto = Mapper.Map<SupervisedPersonChatListOutput>(chatDto); |
|
dto.UnReadCount = messageList.Count(w => w.CheckStatus == CheckStatusEnum.NotChecked && w.SenderId == chatDto.ReceiverId && w.ReceiverId == chatDto.SenderId); |
|
dto.LastMessage = messageList.FirstOrDefault()?.Content; |
|
dto.LastMsgTime = messageList.FirstOrDefault()?.CreatedTime; |
|
|
|
pageData.Add(dto); |
|
} |
|
|
|
//返回结果 |
|
return (IResultOutput<PagedList<SupervisedPersonChatListOutput>>)ResultOutput.Ok(new PagedList<SupervisedPersonChatListOutput>() |
|
{ |
|
TotalCount = dataPerson.TotalCount, |
|
Data = pageData |
|
}); |
|
} |
|
|
|
#endregion 聊天(IM)(监管人-被监管人) |
|
|
|
#region (被监管人) |
|
|
|
/// <summary> |
|
/// 被监管人首页数据 |
|
/// </summary> |
|
/// <param name="imei">被监管人手机唯一标识</param> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<GetSuperPersonCaseDetailDto>> GetSupervisedPersonHomepage(string imei) |
|
{ |
|
var data = await (from c in _appCaseManagementRepository.AsQueryable(false, true) |
|
join spcr in _appSupervisedPersonRepository.AsQueryable(false, true) on c.Id equals spcr.CaseId |
|
where spcr.IMEI == imei && c.CaseProgress != CaseProgressEnum.Closed |
|
select new |
|
{ |
|
c.Id, |
|
spcr.SupervisedPersonId |
|
}).FirstOrDefaultAsync(); |
|
|
|
if (data == null) return new ResultOutput<GetSuperPersonCaseDetailDto>(); |
|
|
|
return await this.GetSuperPersonCaseDetail(new GetSuperPersonCaseDetailInput() |
|
{ |
|
CaseId = data!.Id, |
|
SuperPersonId = data.SupervisedPersonId |
|
}); |
|
} |
|
|
|
/// <summary> |
|
/// 被监管人员提醒列表 |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput<PagedList<AppRemindListDto>>> GetAppRemindListAsync(AppRemindInput input) |
|
{ |
|
List<AppRemindListDto> rtn; |
|
var totalCount = 0; |
|
//如果SupervisedPersonId不为空并查询结果为空执行下面查询 |
|
var currentCase = await GetCurrentSupervisePersonProcessingCase(input.SupervisedPersonId!=null ? (long)input.SupervisedPersonId : User.Id); |
|
if (input.RemindType == AppRemindTypeEnum.EarlyWarning) |
|
{ |
|
var earlyWarningList = (from ew in _appEarlyWarningRepository.AsQueryable(false, true) |
|
join ewv in _appEarlyWarningViewStatisticsRepository.AsQueryable(false, true) on ew.Id equals ewv.AppEarlyWarningId |
|
where ewv.SubscriberId == currentCase.SupervisedPersonId && ewv.CaseId == currentCase.CaseId |
|
select new AppRemindListDto() |
|
{ |
|
Id = ew.Id, |
|
Title = ew.Title, |
|
CreatedTime = ew.CreatedTime, |
|
CreatedUserId = ew.CreatedUserId, |
|
CreatedUserName = ew.CreatedUserName, |
|
Content = ew.Content, |
|
CheckStatus = ewv.CheckStatus, |
|
CheckTime = ewv.CheckTime, |
|
CaseId = ew.CaseId, |
|
CaseName = ew.CaseName |
|
}); |
|
|
|
totalCount = earlyWarningList.Count(); |
|
var WarningList = new List<AppRemindListDto>(); |
|
var NotChecked = earlyWarningList.Where(q => q.CheckStatus == CheckStatusEnum.NotChecked).OrderByDescending(q => q.CreatedTime).ToList(); |
|
WarningList.AddRange(NotChecked); |
|
var Checked = earlyWarningList.Where(q => q.CheckStatus == CheckStatusEnum.Checked).OrderByDescending(q => q.CreatedTime).ToList(); |
|
WarningList.AddRange(Checked); |
|
rtn = WarningList |
|
.Skip((input.PageIndex - 1) * input.PageSize) |
|
.Take(input.PageSize) |
|
.ToList(); |
|
} |
|
else |
|
{ |
|
var noteList = await _appAnnouncementViewStatisticsRepository |
|
.AsQueryable(false, true) |
|
.Where(w => w.SupervisedPersonId == currentCase.SupervisedPersonId && w.CaseId == currentCase.CaseId) |
|
.ToListAsync(); |
|
|
|
totalCount = noteList.Count; |
|
var WarningList = new List<AppAnnouncementViewStatistics?>(); |
|
var NotChecked = noteList.Where(q => q.CheckStatus == CheckStatusEnum.NotChecked).OrderByDescending(q => q.CreatedTime).ToList(); |
|
WarningList.AddRange(NotChecked); |
|
var Checked = noteList.Where(q => q.CheckStatus == CheckStatusEnum.Checked).OrderByDescending(q => q.CreatedTime).ToList(); |
|
WarningList.AddRange(Checked); |
|
noteList = noteList |
|
.Skip((input.PageIndex - 1) * input.PageSize) |
|
.Take(input.PageSize) |
|
.ToList(); |
|
|
|
rtn = noteList.Select(w => new AppRemindListDto() |
|
{ |
|
Id = w.AnnouncementId, |
|
Title = w.Title, |
|
CreatedTime = w.CreatedTime, |
|
CreatedUserId = w.CreatedUserId, |
|
CreatedUserName = w.CreatedUserName, |
|
CheckStatus = w.CheckStatus, |
|
CheckTime = w.CheckTime ?? null, |
|
CaseId = w.CaseId, |
|
CaseName = w.CaseName |
|
}).ToList(); |
|
} |
|
|
|
return (IResultOutput<PagedList<AppRemindListDto>>)ResultOutput.Ok(new PagedList<AppRemindListDto>() |
|
{ |
|
TotalCount = totalCount, |
|
Data = rtn.ToList() |
|
}); |
|
} |
|
|
|
/// <summary> |
|
/// 被监管人提醒明细 |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput<GetAppRemindDetailDto>> GetAppRemindDetail(GetAppRemindDetailInput input) |
|
{ |
|
GetAppRemindDetailDto? rtn = null; |
|
|
|
if (input.RemindType == AppRemindTypeEnum.EarlyWarning) |
|
{ |
|
//先修改状态 |
|
await _appEarlyWarningService.BatchSetCheckStatus(new SetCheckStatusInput() |
|
{ |
|
Ids = new EditableList<long>() { input.Id }, |
|
CheckStatus = CheckStatusEnum.Checked |
|
}); |
|
|
|
rtn = await base.GetAsync<AppEarlyWarning, GetAppRemindDetailDto, long>(_appEarlyWarningRepository, input.Id); |
|
} |
|
else |
|
{ |
|
//先修改状态 |
|
await _appAnnouncementService.BatchSetCheckStatus(new BatchSetCheckStatusInput() |
|
{ |
|
AnnouncementIds = new EditableList<long>() { input.Id }, |
|
CheckStatus = CheckStatusEnum.Checked |
|
}); |
|
|
|
rtn = await base.GetAsync<AppAnnouncement, GetAppRemindDetailDto, long>(_appAnnouncementRepository, input.Id); |
|
} |
|
|
|
return (IResultOutput<GetAppRemindDetailDto>)ResultOutput.Ok(rtn); |
|
} |
|
|
|
/// <summary> |
|
/// 被监管人员添加业务申请 |
|
/// </summary> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput> AddAppBusinessAsync(AppBusinessApplicationCreateOrModifyInput input) |
|
{ |
|
//根据案件找监管人,找到多个,均发送消息提醒 |
|
var currentUserCase = await base.GetCurrentSupervisePersonProcessingCase(User.Id); |
|
|
|
var supervisorList = await _appSupervisorRepository |
|
.AsQueryable(false, true) |
|
.Where(w => w.CaseId == currentUserCase.CaseId) |
|
.ToListAsync(); |
|
var applicationType = await base.GetDictionariesOutput("application_type", "df"); |
|
|
|
foreach (var supervisor in supervisorList) |
|
{ |
|
var user = await _appUserRepository.AsQueryable(false, true).Where(w => w.Id == supervisor.SupervisorId).ToListAsync(); |
|
//发短信给监管人,提醒处理审批 |
|
await _smsService.SendMessageSMS(MessageAlertTypeEnum.ReviewNotification, user.FirstOrDefault().UserName, user.FirstOrDefault().Phone, DateTime.Now, applicationType.Name, "", currentUserCase.SupervisedPersonName); |
|
} |
|
return await _appBusinessApplicationService.CreateOrModify(input); |
|
} |
|
|
|
/// <summary> |
|
/// 获取被监管人员业务申请列表(正在进行的案件) |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput<PagedList<AppBusinessListDto>>> GetAppBusinessListAsync(GetAppBusinessListPageInput input) |
|
{ |
|
var query = (from c in _appCaseManagementRepository.AsQueryable(false, true).Where(w => w.CaseProgress != CaseProgressEnum.Closed) |
|
join ba in _appBusinessApplicationRepository.AsQueryable(false, true) on c.Id equals ba.CaseId |
|
select ba) |
|
.WhereIf(input.AuditStatus != null, w => w.AuditStatus == input.AuditStatus) |
|
.Where(w => w.SupervisedPersonId == (input.SupervisedPersonId!=null ? input.SupervisedPersonId : User.Id)) |
|
.OrderByDescending(w => w.CreatedTime); |
|
|
|
//正在进行的案件 |
|
|
|
var totalCount = await query.CountAsync(); |
|
|
|
var rtn = await query.Skip((input.PageIndex - 1) * input.PageSize) |
|
.Take(input.PageSize) |
|
.ProjectTo<AppBusinessListDto>(Mapper.ConfigurationProvider) |
|
.ToListAsync(); |
|
|
|
return (IResultOutput<PagedList<AppBusinessListDto>>)ResultOutput.Ok(new PagedList<AppBusinessListDto>() |
|
{ |
|
TotalCount = totalCount, |
|
Data = rtn |
|
}); |
|
} |
|
|
|
|
|
/// <summary> |
|
/// 获取被监管人员学习资料(正在进行的案件) |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
public async Task<IResultOutput> GetAppfileaccessrecordsAsync(GetAppBusinessListPageInput input) |
|
{ |
|
var list = new List<dynamic>(); |
|
var query = (from c in _appCaseManagementRepository.AsQueryable(false, true).Where(w => w.CaseProgress != CaseProgressEnum.Closed) |
|
join a in _appSupervisedPersonRepository.AsQueryable(false, true) on c.Id equals a.CaseId |
|
join ba in _appFileAccessRecordsRepository.AsQueryable(false, true) on a.SupervisedPersonId equals ba.SupervisedPersonId |
|
select ba) |
|
.Where(w => w.SupervisedPersonId == (input.SupervisedPersonId!=null ? input.SupervisedPersonId : User.Id)) |
|
.OrderByDescending(w => w.CreatedTime); |
|
var Direclist = (from c in _appDirectoryDescriptorRepository.AsQueryable(false, true) |
|
join a in _appFileDescriptorRepository.AsQueryable(false, true) on c.Id equals a.DirectoryId |
|
select new{ typename=c.Name, a.Name,a.Id,a.DirectoryId }).ToList(); |
|
foreach (var item in Direclist) |
|
{ |
|
var Direcbol = query.ToList().Where(q => q.FileDescriptorId == item.Id&&q.CaseId==(input.CaseId!=null? input.CaseId:0)).OrderByDescending(q=>q.CreatedTime).ToList(); |
|
if (Direcbol.Count > 0) |
|
{ |
|
list.Add(new |
|
{ |
|
typename = $"{item.typename}", |
|
name = $"{item.Name}", |
|
time = $"{Direcbol.First()?.CreatedTime}", |
|
bol = true |
|
}); |
|
} |
|
else |
|
{ |
|
list.Add(new |
|
{ |
|
typename = $"{item.typename}", |
|
name = $"{item.Name}", |
|
time="", |
|
bol = false |
|
}); |
|
} |
|
} |
|
|
|
var totalCount = list.Count(); |
|
var pagelist = list.Skip((input.PageIndex - 1) * input.PageSize) |
|
.Take(input.PageSize); |
|
return ResultOutput.Ok(new |
|
{ |
|
TotalCount = totalCount, |
|
Data = pagelist |
|
}); |
|
} |
|
|
|
/// <summary> |
|
/// App根据业务Id获取业务明细 |
|
/// </summary> |
|
/// <param name="id"></param> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<AppBusinessApplicationGetDto>> GetAppBusinessDetailById(long id) => (IResultOutput<AppBusinessApplicationGetDto>)await _appBusinessApplicationService.GetAsync(id); |
|
|
|
/// <summary> |
|
/// 添加打卡记录 |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
public async Task<IResultOutput> AddPunchRecord(AppPunchRecordAddInput input) => await _appPunchRecordService.AddAsync(input); |
|
|
|
/// <summary> |
|
/// 被监管人登录 |
|
/// </summary> |
|
/// <param name="imei">IMEI是被监管人在APP上提交申请时,会自动上报的手机唯一标识数据。(获取自动登录)</param> |
|
/// <returns></returns> |
|
[HttpGet] |
|
[AllowAnonymous] |
|
public async Task<IResultOutput<string>> SupervisedPersonLogin(string imei) |
|
{ |
|
var spData = await _appSupervisedPersonRepository.FindAsync(w => w.IMEI == imei); |
|
|
|
if (spData is { IsBound: true, ApprovalStatus: ApprovalStatusEnum.PassReview }) |
|
{ |
|
var userData = await _appUserRepository.FindAsync(w => spData.SupervisedPersonId == 0 |
|
? w.IdCard == spData.IdCard |
|
: w.Id == spData.SupervisedPersonId); |
|
|
|
var token = await _authService.GetToken(new AuthLoginOutput() |
|
{ |
|
Id = spData.SupervisedPersonId, |
|
UserName = spData.SupervisedPersonName, |
|
NickName = userData?.NickName, |
|
Avatar = userData?.Avatar, |
|
Phone = spData.Phone, |
|
ChatPersonType = userData!.ChatPersonType, |
|
PositionName = userData.PositionName, |
|
IdCard = userData.IdCard |
|
}); |
|
|
|
return (IResultOutput<string>)ResultOutput.Ok(token); |
|
} |
|
else |
|
{ |
|
return (IResultOutput<string>)ResultOutput.NotOk(spData == null |
|
? $"当前用户未注册!" |
|
: $"当前用户还在:{spData.ApprovalStatus.ToDescription()}"); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 被监管人提交绑定申请(必须是在后台管理端的案件管理中添加了被监管人才能) |
|
/// </summary> |
|
/// <returns></returns> |
|
/// <remarks>这个接口的作用其实就是用户和手机之间的绑定</remarks> |
|
[AllowAnonymous] |
|
public async Task<IResultOutput> SubmitBindingApplication(SubmitBindingApplicationInput input) |
|
{ |
|
if (!string.IsNullOrEmpty(input.phone)) |
|
{ |
|
bool checkCode = await _smsService.CheckCodeAsync(input.phone, input.checkCode, "CheckCode"); |
|
if (!checkCode) return ResultOutput.NotOk("无效验证码"); |
|
} |
|
//[1]校验当前账户是否是第一次绑定 |
|
//if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard && !w.IsBound)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确"); |
|
if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确"); |
|
|
|
//[2]判断当前被监管人的案件是否为未关闭,关闭了就不能绑定了 |
|
var cspData = await (from c in _appCaseManagementRepository.AsQueryable(false, true) |
|
join spr in _appSupervisedPersonRepository.AsQueryable(false, true) on c.Id equals spr.CaseId |
|
where c.CaseProgress != CaseProgressEnum.Closed && spr.IdCard == input.IdCard |
|
select new |
|
{ |
|
c.CaseProgress, |
|
spr.SupervisedPersonId, |
|
spr.ApprovalStatus, |
|
spr.IMEI, |
|
spr.IdCard |
|
}) |
|
.ToListAsync(); |
|
|
|
//if (cspData.FirstOrDefault()?.IdCard != input.IdCard || cspData.FirstOrDefault()?.IMEI != input.IMEI) return ResultOutput.NotOk("当前身份和Iemi不匹配"); |
|
|
|
if (!cspData.Any(w => w.CaseProgress is CaseProgressEnum.InExecution or CaseProgressEnum.Pending or CaseProgressEnum.Examination or CaseProgressEnum.Hear)) return ResultOutput.NotOk("当前被监管人不存在进行中的案件"); |
|
|
|
//[3]修改审核状态 |
|
// var spData = await _appSupervisedPersonRepository.FindAsync(w => w.IdCard == input.IdCard && !w.IsBound); |
|
var spData = await _appSupervisedPersonRepository.FindAsync(w => w.IdCard == input.IdCard); |
|
if (spData == null) return ResultOutput.Ok(); |
|
|
|
spData.ApprovalStatus = ApprovalStatusEnum.PendingReview; |
|
spData.EnterFace = input.EnterFace; |
|
spData.IMEI = input.IMEI; |
|
var userdata = _appUserRepository.AsQueryable(false, true).Where(q => q.Id == spData.SupervisedPersonId).FirstOrDefault(); |
|
if (userdata!=null) |
|
{ |
|
userdata.CId = input.CId; |
|
await _appUserRepository.UpdateAsync(userdata,UpdatingProps<AppUser>(q=>q.CId)); |
|
} |
|
await _appSupervisedPersonRepository.UpdateAsync(spData); |
|
|
|
return ResultOutput.Ok(); |
|
} |
|
|
|
/// <summary> |
|
/// 判断被监管人是否绑定了 |
|
/// </summary> |
|
/// <param name="imei">IMEI是被监管人在APP上提交申请时,会自动上报的手机唯一标识数据。(获取自动登录)</param> |
|
/// <returns></returns> |
|
[AllowAnonymous] |
|
[HttpGet] |
|
public async Task<IResultOutput<CheckSupervisedPersonIsBindOutput>> CheckSupervisedPersonIsBind(string imei) |
|
{ |
|
var cspData = await (from c in _appCaseManagementRepository.AsQueryable(false, true) |
|
join spr in _appSupervisedPersonRepository.AsQueryable(false, true) on c.Id equals spr.CaseId |
|
where c.CaseProgress != CaseProgressEnum.Closed && spr.IMEI == imei |
|
select new CheckSupervisedPersonIsBindOutput() |
|
{ |
|
Name = c.Name, |
|
CaseProgress = c.CaseProgress, |
|
SupervisedPersonId = spr.SupervisedPersonId, |
|
SupervisedPersonName = spr.SupervisedPersonName, |
|
IsBound = spr.IsBound, |
|
ApprovalStatus = spr.ApprovalStatus |
|
}).FirstOrDefaultAsync(); |
|
|
|
if (cspData is { IsBound: true, ApprovalStatus: ApprovalStatusEnum.PassReview }) cspData.Token = (await SupervisedPersonLogin(imei)).Data; |
|
|
|
return (IResultOutput<CheckSupervisedPersonIsBindOutput>)ResultOutput.Ok(cspData); |
|
} |
|
|
|
/// <summary> |
|
/// 统计被监管人的打卡、学习、申请、聊天、提醒 |
|
/// </summary> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<List<SupervisedStatisticsOutput>>> SupervisedStatistics() |
|
{ |
|
List<SupervisedStatisticsOutput> rtn = new EditableList<SupervisedStatisticsOutput>(); |
|
|
|
var caseIds = await (await base.GetCurrentUserCaseListAsync()).Select(w => w.AppCaseManagement.Id).ToListAsync(); |
|
var currentCase = await GetCurrentSupervisePersonProcessingCase(User.Id); |
|
//预警 |
|
rtn.Add(new SupervisedStatisticsOutput() |
|
{ |
|
Key = "early_warning_type", |
|
Count = await _appEarlyWarningViewStatisticsRepository.AsQueryable(false, true) |
|
.Where(w => w.CaseId == currentCase.CaseId) |
|
.CountAsync(w => w.SubscriberId == User.Id && w.CheckStatus == CheckStatusEnum.NotChecked) |
|
+ |
|
await _appAnnouncementViewStatisticsRepository.AsQueryable(false, true) |
|
.Where(w => w.CaseId != null && caseIds.Contains(w.CaseId.Value)) |
|
.CountAsync(w => w.SupervisedPersonId == User.Id && w.CheckStatus == CheckStatusEnum.NotChecked) |
|
}); |
|
|
|
//聊天 |
|
rtn.Add(new SupervisedStatisticsOutput() |
|
{ |
|
Key = "chat", |
|
Count = await _appSessionMessageRepository |
|
.AsQueryable(false, true) |
|
// .Where(w => w.CaseId != null && caseIds.Contains(w.CaseId.Value)) |
|
.Where(w => w.CaseId == currentCase.CaseId) |
|
.CountAsync(w => w.ReceiverId == User.Id && w.CheckStatus == CheckStatusEnum.NotChecked) |
|
}); |
|
|
|
return (IResultOutput<List<SupervisedStatisticsOutput>>)ResultOutput.Ok(rtn); |
|
} |
|
|
|
#endregion (被监管人) |
|
|
|
#region 文件上传(录入人脸、打卡视频) |
|
|
|
/// <summary> |
|
/// 文件上传(录入人脸、打卡视频) |
|
/// </summary> |
|
/// <param name="uploadFileType">上传文件类型:0</param> |
|
/// <param name="file"></param> |
|
/// <returns></returns> |
|
[HttpPost] |
|
[AllowAnonymous] |
|
public async Task<IResultOutput> SupervisedPersonUpload([FromQuery] UploadFileTypeEnum uploadFileType, [FromForm] IFormFile file) |
|
{ |
|
var uploadConfig = LazyGetRequiredService<UploadConfigConfiguration>(); |
|
|
|
var ufConfig = (uploadFileType == UploadFileTypeEnum.Image ? uploadConfig.Image : uploadConfig.Video); |
|
|
|
return await base.CustomizedUpload(file, User.Id, ufConfig, null); |
|
} |
|
|
|
#endregion 文件上传(录入人脸、打卡视频) |
|
|
|
#region Pc端提醒 |
|
|
|
/// <summary> |
|
/// 获取当前人的预警信息 |
|
/// </summary> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<AppRemindListWithCountDto>> GetRemindListByCurrentUser() |
|
{ |
|
//预警信息 |
|
var earlyList = await GetRemindListByCurrentUserPageAsync(new AppRemindPageInput() |
|
{ |
|
PageIndex = 1, |
|
PageSize = 999999, |
|
CheckStatus = CheckStatusEnum.NotChecked |
|
}); |
|
|
|
//返回数据 |
|
return (IResultOutput<AppRemindListWithCountDto>)ResultOutput.Ok(new AppRemindListWithCountDto() |
|
{ |
|
TotalCount = earlyList.Data.TotalCount, |
|
RemindList = earlyList.Data.Data.OrderByDescending(w => w.CreatedTime).ToList(), |
|
}); |
|
} |
|
|
|
/// <summary> |
|
/// 获取当前人的预警信息(分页查询) |
|
/// </summary> |
|
/// <param name="input"></param> |
|
/// <returns></returns> |
|
public async Task<IResultOutput<PagedList<AppRemindListDto>>> GetRemindListByCurrentUserPageAsync(AppRemindPageInput input) |
|
{ |
|
var limits = User.limits; |
|
var selectLimits = await _appCaseSupervisorRepository.AsQueryable(false, true) |
|
.Where(w => limits.Contains(w.UnitId.ToString())) |
|
.ToListAsync(); |
|
var caseIdList = selectLimits.Select(w => w.CaseId).Distinct().ToList(); |
|
//预警信息 |
|
var earlyList = await (from e in _appEarlyWarningRepository.AsQueryable(false, true) |
|
join ev in _appEarlyWarningViewStatisticsRepository.AsQueryable(false, true) on e.Id equals ev.AppEarlyWarningId |
|
where ev.SubscriberId == User.Id && caseIdList.Contains(e.CaseId) |
|
select new AppRemindListDto() |
|
{ |
|
Id = e.Id, |
|
Title = e.Title, |
|
Content = e.Content, |
|
CheckStatus = ev.CheckStatus, |
|
CheckTime = ev.CheckTime, |
|
CreatedUserId = e.SupervisedPersonId, |
|
CreatedTime = e.CreatedTime, |
|
SupervisedPersonId = e.SupervisedPersonId, |
|
SupervisedPersonName = e.SupervisedPersonName, |
|
CaseId = e.CaseId |
|
}) |
|
.WhereIf(input.CheckStatus.HasValue, w => w.CheckStatus == input.CheckStatus) |
|
.ToListAsync(); |
|
earlyList = earlyList.Distinct((x, y) => x.CaseId == y.CaseId && x.SupervisedPersonId == y.SupervisedPersonId && x.CreatedTime == y.CreatedTime).OrderByDescending(q => q.CreatedTime).ToList(); |
|
if (!input.CheckStatus.HasValue) |
|
{ |
|
var WarningList = new List<AppRemindListDto>(); |
|
var NotChecked = earlyList.Where(q => q.CheckStatus == CheckStatusEnum.NotChecked).OrderByDescending(q => q.CreatedTime).ToList(); |
|
WarningList.AddRange(NotChecked); |
|
var Checked = earlyList.Where(q => q.CheckStatus == CheckStatusEnum.Checked).OrderByDescending(q => q.CreatedTime).ToList(); |
|
WarningList.AddRange(Checked); |
|
earlyList = WarningList; |
|
} |
|
return (IResultOutput<PagedList<AppRemindListDto>>)ResultOutput.Ok(new PagedList<AppRemindListDto>() |
|
{ |
|
TotalCount = earlyList.Count, |
|
Data = earlyList.Skip((input.PageIndex - 1) * input.PageSize).Take(input.PageSize).ToList() |
|
}); |
|
} |
|
|
|
#endregion Pc端提醒 |
|
|
|
#region Private |
|
|
|
/// <summary> |
|
/// App获取案件管理公共逻辑方法(正在进行中的案件) |
|
/// </summary> |
|
/// <param name="name"></param> |
|
/// <returns></returns> |
|
private async Task<List<SupervisedPersonListOutput>> GetCaseListDetail(string? name) |
|
{ |
|
//获取当前用户权限下的案件ids |
|
var limits = User.limits; |
|
var selectLimits = await _appCaseSupervisorRepository.AsQueryable(false, true) |
|
.Where(w => limits.Contains(w.UnitId.ToString())) |
|
.ToListAsync(); |
|
var caseIdList = selectLimits.Select(w => w.CaseId).Distinct().ToList(); |
|
|
|
var data = (await base.GetCurrentUserCaseListAsync()) |
|
.Where(W => W.AppCaseManagement!=null&& W.AppCaseManagement.CaseProgress != CaseProgressEnum.Closed && caseIdList.Contains(W.AppCaseManagement.Id)) |
|
.Where(W => W.AppCaseSupervisedPerson != null&& caseIdList.Contains(W.AppCaseSupervisedPerson.CaseId)) |
|
.Where(W=>W.AppCaseSupervisor!=null && caseIdList.Contains(W.AppCaseSupervisor.CaseId)) |
|
.WhereIf(name.NotNull(), w => w.AppCaseSupervisedPerson.SupervisedPersonName!.Contains(name)) |
|
.Select(w => new |
|
{ |
|
w.AppCaseManagement, |
|
w.AppCaseSupervisor, |
|
w.AppCaseSupervisedPerson |
|
}).ToList(); |
|
|
|
//当前登录人员下的所有被监管人员Ids |
|
var caseIds = data.Select(w => w.AppCaseManagement.Id).ToList(); |
|
var spIds = data.Where(q => q.AppCaseSupervisedPerson != null).Select(w => w.AppCaseSupervisedPerson.SupervisedPersonId).ToList(); |
|
|
|
//最新地理位置(注意根据被监管人设置的隐私等级时间获取xxx前最近一次的位置信息) |
|
var points = await base.GetSpLocationByPrivacyLevel(spIds, caseIds); |
|
|
|
//头像列表 |
|
var userAvatarList = await _userService.UserAvatarList(new BatchIdsInput() { Ids = spIds }); |
|
|
|
//处理地址坐标 |
|
var rtn = (from d in data.Where(q => q.AppCaseSupervisedPerson != null) |
|
join p in points on new { d.AppCaseSupervisedPerson.SupervisedPersonId, d.AppCaseSupervisedPerson.CaseId } equals new { p.SupervisedPersonId, p.CaseId } into pTemp |
|
from pt in pTemp.DefaultIfEmpty() |
|
select new |
|
{ |
|
d, |
|
pt |
|
}).ToList() |
|
.Select(@t => new SupervisedPersonListOutput() |
|
{ |
|
CaseId = @t.d.AppCaseSupervisedPerson.CaseId, |
|
CaseName = @t.d.AppCaseManagement.Name, |
|
UserId = User.ChatPersonType == ChatPersonTypeEnum.SupervisedPerson ? @t.d.AppCaseSupervisor.SupervisorId : @t.d.AppCaseSupervisedPerson!.SupervisedPersonId, |
|
UserName = User.ChatPersonType == ChatPersonTypeEnum.SupervisedPerson ? @t.d.AppCaseSupervisor.SupervisorName : @t.d.AppCaseSupervisedPerson.SupervisedPersonName, |
|
Latitude = @t.pt?.Latitude, |
|
Longitude = @t.pt?.Longitude, |
|
Address = @t.pt?.Place, |
|
Gender = @t.d.AppCaseSupervisedPerson.Gender, |
|
Avatar = userAvatarList.FirstOrDefault(w => w.UserId == @t.d.AppCaseSupervisedPerson!.SupervisedPersonId)?.Avatar, |
|
CaseTypeId = @t.d.AppCaseManagement.CaseTypeId, |
|
PrivacyLevel = @t.d.AppCaseSupervisedPerson.PrivacyLevel |
|
}).ToList(); |
|
|
|
rtn = rtn.Distinct((x, y) => |
|
x.CaseId == y.CaseId && |
|
x.UserId == y.UserId && |
|
x.Latitude == y.Latitude && |
|
x.Longitude == y.Longitude) |
|
.ToList(); |
|
|
|
//预警总次数 |
|
var earlyWarning = _appEarlyWarningRepository.AsQueryable(false, true); |
|
var dictList = await _appDictionaryService.GetDicByDicIds(new BatchIdsInput() |
|
{ |
|
Ids = rtn.Select(w => w.CaseTypeId).ToList() |
|
}); |
|
foreach (var item in rtn) |
|
{ |
|
item.TotalEarlyWarningCount = item.AlertType = earlyWarning.Where(w => w.SupervisedPersonId == item.UserId).Where(w => w.CaseId == item.CaseId).Count(); |
|
item.AlertTypeLevelRules = dictList.FirstOrDefault(w => w.Id == item.CaseTypeId)?.Value; |
|
} |
|
|
|
//返回结果 |
|
return rtn; |
|
} |
|
|
|
/// <summary> |
|
/// App获取案件管理公共逻辑方法(聊条管理) |
|
/// </summary> |
|
/// <param name="name"></param> |
|
/// <returns></returns> |
|
private async Task<List<SupervisedPersonListOutput>> GetCaseListDetailByIm(string? name) |
|
|
|
{ |
|
//获取当前用户权限下的案件ids |
|
var limits = User.limits; |
|
var selectLimits = await _appCaseSupervisorRepository.AsQueryable(false, true) |
|
.Where(w => limits.Contains(w.UnitId.ToString())) |
|
.ToListAsync(); |
|
var caseIdList = selectLimits.Select(w => w.CaseId).Distinct().ToList(); |
|
|
|
var data = (await base.GetCurrentUserCaseListAsync()) |
|
.Where(W => W.AppCaseManagement!=null&& W.AppCaseSupervisedPerson != null && W.AppCaseSupervisor != null && W.AppCaseManagement.CaseProgress != CaseProgressEnum.Pending && caseIdList.Contains(W.AppCaseManagement.Id)&&caseIdList.Contains(W.AppCaseSupervisedPerson.CaseId)&&caseIdList.Contains(W.AppCaseSupervisor.CaseId)) |
|
.WhereIf(name.NotNull(), w => w.AppCaseSupervisedPerson.SupervisedPersonName!.Contains(name)) |
|
.Select(w => new |
|
{ |
|
w.AppCaseManagement, |
|
w.AppCaseSupervisor, |
|
w.AppCaseSupervisedPerson |
|
}).ToList(); |
|
|
|
//当前登录人员下的所有被监管人员Ids |
|
var caseIds = data.Select(w => w.AppCaseManagement.Id).ToList(); |
|
var spIds = data.Where(q => q.AppCaseSupervisedPerson != null).Select(w => w.AppCaseSupervisedPerson.SupervisedPersonId).ToList(); |
|
|
|
//最新地理位置(注意根据被监管人设置的隐私等级时间获取xxx前最近一次的位置信息) |
|
var points = await base.GetSpLocationByPrivacyLevel(spIds, caseIds); |
|
|
|
//头像列表 |
|
var userAvatarList = await _userService.UserAvatarList(new BatchIdsInput() { Ids = spIds }); |
|
|
|
//处理地址坐标 |
|
var rtn = (from d in data.Where(q => q.AppCaseSupervisedPerson != null) |
|
join p in points on new { d.AppCaseSupervisedPerson.SupervisedPersonId, d.AppCaseSupervisedPerson.CaseId } equals new { p.SupervisedPersonId, p.CaseId } into pTemp |
|
from pt in pTemp.DefaultIfEmpty() |
|
select new |
|
{ |
|
d, |
|
pt |
|
}).ToList() |
|
.Select(@t => new SupervisedPersonListOutput() |
|
{ |
|
CaseId = @t.d.AppCaseSupervisedPerson.CaseId, |
|
CaseName = @t.d.AppCaseManagement.Name, |
|
UserId = User.ChatPersonType == ChatPersonTypeEnum.SupervisedPerson ? @t.d.AppCaseSupervisor.SupervisorId : @t.d.AppCaseSupervisedPerson!.SupervisedPersonId, |
|
UserName = User.ChatPersonType == ChatPersonTypeEnum.SupervisedPerson ? @t.d.AppCaseSupervisor.SupervisorName : @t.d.AppCaseSupervisedPerson.SupervisedPersonName, |
|
Latitude = @t.pt?.Latitude, |
|
Longitude = @t.pt?.Longitude, |
|
Address = @t.pt?.Place, |
|
Gender = @t.d.AppCaseSupervisedPerson.Gender, |
|
Avatar = userAvatarList.FirstOrDefault(w => w.UserId == @t.d.AppCaseSupervisedPerson!.SupervisedPersonId)?.Avatar, |
|
CaseTypeId = @t.d.AppCaseManagement.CaseTypeId, |
|
CaseProgress = @t.d.AppCaseManagement.CaseProgress, |
|
PrivacyLevel = @t.d.AppCaseSupervisedPerson.PrivacyLevel |
|
}).ToList(); |
|
|
|
rtn = rtn.Distinct((x, y) => |
|
x.CaseId == y.CaseId && |
|
x.UserId == y.UserId && |
|
x.Latitude == y.Latitude && |
|
x.Longitude == y.Longitude) |
|
.ToList(); |
|
|
|
//预警总次数 |
|
var earlyWarning = _appEarlyWarningRepository.AsQueryable(false, true); |
|
var dictList = await _appDictionaryService.GetDicByDicIds(new BatchIdsInput() |
|
{ |
|
Ids = rtn.Select(w => w.CaseTypeId).ToList() |
|
}); |
|
foreach (var item in rtn) |
|
{ |
|
item.TotalEarlyWarningCount = item.AlertType = earlyWarning.Where(w => w.SupervisedPersonId == item.UserId).Where(w => w.CaseId == item.CaseId).Count(); |
|
item.AlertTypeLevelRules = dictList.FirstOrDefault(w => w.Id == item.CaseTypeId)?.Value; |
|
} |
|
|
|
//返回结果 |
|
return rtn; |
|
} |
|
#endregion Private |
|
} |
|
} |