非羁押人员管理平台
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.
 
 

137 lines
6.4 KiB

using ATS.NonCustodial.Application.Base;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppSupervisedPersons;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppSupervisedPersons.Input;
using ATS.NonCustodial.Domain.Entities.Business.CaseManagements;
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 Microsoft.EntityFrameworkCore;
using Yitter.IdGenerator;
namespace ATS.NonCustodial.Application.Impl.Business.CaseManagements
{
/// <summary>
/// 被监管人员管理服务
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-06-06 11:16 AM
/// <remarks>
/// 1、姓名可模糊搜索系统用户管理中用户类型为“被监管人”的数据,展示“姓名_手机号”,选择后可作为填写数据的默认值,用户还是可以在此基础上进行更改。
/// 2、预警类型等级根据案件类型来展示,在案件类型字典数据中取数据。
/// 3、打卡频次的数据可输入小数,保留一位小数。在被监管人在非休息时间内打卡时间间隔超过设置的间隔,则需要进行预警,提示XXX未打卡。
/// 4、隐私等级的时间是在监控大屏展示该人员的位置信息,是在设置的时间之前,如设置为120min,则大屏展示的该人员位置信息展示的是120分钟前的位置。
/// 5、被监管人对应的未结束的案件,只能是一个。提交案件创建时进行校验判定。
/// </remarks>
[DynamicApi(Area = "admin")]
public class AppSupervisedPersonService : AdminAppServiceBase, IAppSupervisedPersonService, IDynamicApi
{
#region Identity
private readonly IEfRepository<AppCaseSupervisedPerson, long> _appSupervisedPersonRepository;
private readonly IEfRepository<AppCaseManagement, long> _appCaseManagementEfRepository;
private readonly IEfRepository<appauditrecords, long> _appauditrecordsRepository;
/// <summary>
///
/// </summary>
/// <param name="appSupervisedPersonRepository"></param>
/// <param name="appCaseManagementEfRepository"></param>
public AppSupervisedPersonService(IEfRepository<AppCaseSupervisedPerson, long> appSupervisedPersonRepository,
IEfRepository<AppCaseManagement, long> appCaseManagementEfRepository, IEfRepository<appauditrecords, long> appauditrecords)
{
_appSupervisedPersonRepository = appSupervisedPersonRepository;
_appCaseManagementEfRepository = appCaseManagementEfRepository;
_appauditrecordsRepository = appauditrecords;
}
#endregion Identity
/// <summary>
/// 批量审核 被监管人员账号绑定
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<IResultOutput> BatchAuditSupervisedPersonBinding(BatchAuditSupervisedPersonBindingInput input)
{
if (!input.Ids.Any()) return ResultOutput.NotOk("参数不能为空!");
var allCaseIds = new List<long>();
var dataList = await _appSupervisedPersonRepository
.Where(w => input.Ids.Contains(w.SupervisedPersonId) && w.ApprovalStatus != ApprovalStatusEnum.PassReview)
.ToListAsync();
dataList.ForEach(item =>
{
item!.ApprovalStatus = input.ApprovalStatus;
item.IsBound = input.ApprovalStatus == ApprovalStatusEnum.PassReview;
allCaseIds.Add(item.CaseId);
});
await _appSupervisedPersonRepository.UpdateAsync(dataList, UpdatingProps<AppCaseSupervisedPerson>(w =>
w.ApprovalStatus,
w => w.IsBound));
#region 添加被监管人审核记录
var data = new List<appauditrecords>();
foreach (var item in dataList)
{
data.Add(new appauditrecords
{
Id = YitIdHelper.NextId(),
SupervisedPersonId = item.SupervisedPersonId,
recordstime = DateTime.Now,
CreatedTime = DateTime.Now,
});
}
if(data.Count>0)
await _appauditrecordsRepository.InsertAsync(data);
#endregion
//更改案件的状态
allCaseIds = allCaseIds.Distinct().ToList();
var spCaseList = await _appSupervisedPersonRepository.AsQueryable(false, true)
.Where(w => allCaseIds.Contains(w.CaseId))
.ToListAsync();
var spCaseGroup = spCaseList.GroupBy(w => w.CaseId).ToList();
/*
1、当案例已在的被监管人 只要有审核通过的。案件变更位已经行
2、如果说 我把这个审核通过的删除了,其余被监管人里没有审核通过的 则变更位待进行
3、如果只存在1个被监管人则不能被删除,且创建案件和编辑案件的时候 被监管人必须存在
*/
var caseProgress = new Dictionary<long, CaseProgressEnum>();
foreach (var scg in spCaseGroup)
{
var existPass = await _appSupervisedPersonRepository.AnyAsync(w => w.CaseId == scg.Key && w.ApprovalStatus == ApprovalStatusEnum.PassReview);
switch (existPass)
{
//如果有任何审核通过的案件都将变为执行中
case true:
caseProgress.TryAdd(scg.Key, CaseProgressEnum.InExecution);
break;
case false:
caseProgress.TryAdd(scg.Key, CaseProgressEnum.Pending);
break;
}
}
//修改状态
foreach (var (key, value) in caseProgress)
{
await _appCaseManagementEfRepository.UpdateAsync(w => w.Id == key,
w => new AppCaseManagement()
{
CaseProgress = value,
CaseBeginTime = value == CaseProgressEnum.InExecution ? DateTime.Now : null
});
}
return ResultOutput.Ok();
}
}
}