using MongoDB.Driver; using System.Text; using VitalService.Common; using WingServerCommon.Mapper; using VitalService.Entities; using VitalService.Request; using WingInterfaceLibrary.Interface.DBVitalInterface; using WingInterfaceLibrary.Request.DBVitalRequest; using WingInterfaceLibrary.Enum.VitalEnum; using WingInterfaceLibrary.DTO.Vital; using WingInterfaceLibrary.Request; using System; using WingServerCommon.Log; using WingInterfaceLibrary.DB.Request; using System.Text.RegularExpressions; using WingInterfaceLibrary.Enum; namespace VitalService.Service { /// /// 居民数据服务 /// public partial class VitalDatabaseService : IVitalPatientDBService { private IEncrypt _encryptInstance = new DBEncryptHelper(); /// /// 创建居民数据 /// /// 创建请求 /// public async Task CreatePatientAsync(CreatePatientDBRequest request) { try { AddDoctorCode(request.OperationDoctor); StringBuilder logBuilder = new StringBuilder(); var entity = request.MappingTo(); var permissionInfo = await SetPatientRequestCreatedFrom(entity, request.OperationDoctor); if (permissionInfo.team == null || string.IsNullOrWhiteSpace(permissionInfo.team.Code)) { ThrowRpcException(CustomerRpcCode.TeamNotSet, "Team not set"); } if (!string.IsNullOrWhiteSpace(request.Code)) { var filter = Builders.Filter.Eq(x => x.Code, request.Code); var patientInfo = await _patientDBRepository.FindOneAsync(filter, null, false); if (patientInfo != null) { string doctorChange = string.Empty; string orgChange = string.Empty; string teamChange = string.Empty; patientInfo = Decrypt(patientInfo); var patientFilter = Builders.Filter.Eq(x => x.Code, request.Code); var patientsUpdate = new List>(); if (!string.IsNullOrWhiteSpace(request.PatientName) && patientInfo.PatientName != request.PatientName) { logBuilder.AppendLine($"居民姓名从{patientInfo.PatientName}变更为{request.PatientName}"); patientsUpdate.Add(Builders.Update.Set(x => x.PatientName, _encryptInstance.Encrypt(request.PatientName))); } if (!string.IsNullOrWhiteSpace(request.PatientAddress) && patientInfo.PatientAddress != request.PatientAddress) { logBuilder.AppendLine($"居民地址从{patientInfo.PatientAddress}变更为{request.PatientAddress}"); patientsUpdate.Add(Builders.Update.Set(x => x.PatientAddress, _encryptInstance.Encrypt(request.PatientAddress))); } if (!string.IsNullOrWhiteSpace(request.PermanentResidenceAddress) && patientInfo.PermanentResidenceAddress != request.PermanentResidenceAddress) { logBuilder.AppendLine($"户籍地址从{patientInfo.PermanentResidenceAddress}变更为{request.PermanentResidenceAddress}"); patientsUpdate.Add(Builders.Update.Set(x => x.PermanentResidenceAddress, _encryptInstance.Encrypt(request.PermanentResidenceAddress))); } if (!string.IsNullOrWhiteSpace(request.Phone) && patientInfo.Phone != request.Phone) { logBuilder.AppendLine($"居民电话从{patientInfo.Phone}变更为{request.Phone}"); patientsUpdate.Add(Builders.Update.Set(x => x.Phone, _encryptInstance.Encrypt(request.Phone))); } if (!string.IsNullOrWhiteSpace(request.EmergencyName) && patientInfo.EmergencyName != request.EmergencyName) { logBuilder.AppendLine($"居民紧急联系人从{patientInfo.EmergencyName}变更为{request.EmergencyName}"); patientsUpdate.Add(Builders.Update.Set(x => x.EmergencyName, _encryptInstance.Encrypt(request.EmergencyName))); } if (!string.IsNullOrWhiteSpace(request.EmergencyPhone) && patientInfo.EmergencyPhone != request.EmergencyPhone) { logBuilder.AppendLine($"居民紧急联系电话从{patientInfo.EmergencyPhone}变更为{request.EmergencyPhone}"); patientsUpdate.Add(Builders.Update.Set(x => x.EmergencyPhone, _encryptInstance.Encrypt(request.EmergencyPhone))); } if (!string.IsNullOrWhiteSpace(request.Nationality) && patientInfo.Nationality != request.Nationality) { logBuilder.AppendLine($"民族从{patientInfo.Nationality}变更为{request.Nationality}"); patientsUpdate.Add(Builders.Update.Set(x => x.Nationality, request.Nationality)); } if (request.Birthday != null && patientInfo.Birthday != request.Birthday) { logBuilder.AppendLine($"出生日期从{patientInfo.Birthday.ToString("yyyy-MM-dd")}变更为{request.Birthday.ToString("yyyy-MM-dd")}"); patientsUpdate.Add(Builders.Update.Set(x => x.Birthday, request.Birthday)); } if (patientInfo.PatientGender != request.PatientGender) { logBuilder.AppendLine($"性别从{patientInfo.PatientGender}变更为{request.PatientGender}"); patientsUpdate.Add(Builders.Update.Set(x => x.PatientGender, request.PatientGender)); } if (!string.IsNullOrWhiteSpace(entity.CreatedDoctor) && patientInfo.CreatedDoctor != entity.CreatedDoctor) { logBuilder.AppendLine($"建档医生从'{patientInfo.CreatedDoctor}'变更为'{entity.CreatedDoctor}';"); patientsUpdate.Add(Builders.Update.Set(x => x.CreatedDoctor, entity.CreatedDoctor)); AddDoctorCode(patientInfo.CreatedDoctor); } if (!string.IsNullOrWhiteSpace(entity.CreatedOrgCode) && patientInfo.CurrentOrgCode != entity.CreatedOrgCode) { logBuilder.AppendLine($"归档机构从'{patientInfo.CurrentOrgCode}'变更为'{entity.CreatedOrgCode}';"); patientsUpdate.Add(Builders.Update.Set(x => x.CurrentOrgCode, entity.CreatedOrgCode)); } if (!string.IsNullOrWhiteSpace(entity.CreatedTeamCode) && patientInfo.CurrentTeamCode != entity.CreatedTeamCode) { logBuilder.AppendLine($"归档团队从'{patientInfo.CurrentTeamCode}'变更为'{entity.CreatedTeamCode}';"); patientsUpdate.Add(Builders.Update.Set(x => x.CurrentTeamCode, entity.CreatedTeamCode)); } if (!AreEqual(patientInfo.CrowdLabels, entity.CrowdLabels)) { logBuilder.AppendLine($"人群分类从'{string.Join(";", patientInfo.CrowdLabels ?? new List())}'变更为'{string.Join(";", entity.CrowdLabels ?? new List())}';"); patientsUpdate.Add(Builders.Update.Set(x => x.CrowdLabels, entity.CrowdLabels ?? new List())); } if (!string.IsNullOrWhiteSpace(entity.ArchivedDoctorName) && patientInfo.ArchivedDoctorName != entity.ArchivedDoctorName) { patientsUpdate.Add(Builders.Update.Set(x => x.ArchivedDoctorName, entity.ArchivedDoctorName)); } Logger.WriteLineWarn($"VitalPatientDBService CreatePatientAsync update, request: {Newtonsoft.Json.JsonConvert.SerializeObject(entity)}"); patientsUpdate.Add(Builders.Update.Set(x => x.IsDelete, false)); if (logBuilder.Length > 0) { Logger.WriteLineInfo($"{logBuilder}"); } var updateAll = Builders.Update.Combine(patientsUpdate); await _patientDBRepository.UpdateOneAsync(patientFilter, updateAll, false); return patientInfo.Code; } } entity = Encrypt(entity); entity.CurrentOrgCode = entity.CreatedOrgCode; entity.CurrentTeamCode = entity.CreatedTeamCode; Logger.WriteLineWarn($"VitalPatientDBService CreatePatientAsync insert, request: {Newtonsoft.Json.JsonConvert.SerializeObject(entity)}"); return await _patientDBRepository.InsertOneAsync(entity); } catch (Exception ex) { Logger.WriteLineWarn($"VitalPatientDBService CreatePatientAsync failed, ex:{ex}, request: {Newtonsoft.Json.JsonConvert.SerializeObject(request)}"); } return string.Empty; } /// /// 根据编码获取居民数据 /// /// 获取请求 /// public async Task GetPatientDetailAsync(GetPatientDBRequest request) { var filter = Builders.Filter.Eq(x => x.Code, request.Code); if (request.IsValidOperationDoctor) { filter = await AddPermissionPatientFilter(filter, request.OperationDoctor); } var result = await _patientDBRepository.FindOneAsync(filter); return await ConvertToDTO(result); } /// /// 根据编码获取居民数据 /// /// 获取请求 /// public async Task GetPatientByCodeAsync(GetPatientByCodeDBRequest request) { var filter = Builders.Filter.Eq(x => x.Code, request.Code); var result = await _patientDBRepository.FindOneAsync(filter); return await ConvertToDTO(result); } /// /// 根据编码获取居民数据如非同一团队则迁移人员 /// /// 获取请求 /// public async Task GetPatientDetailOrMoveAsync(GetPatientDBRequest request) { var filter = Builders.Filter.Eq(x => x.Code, request.Code); filter = await AddPermissionPatientFilter(filter, request.OperationDoctor); var result = await _patientDBRepository.FindOneAsync(filter); if (result == null) { filter = Builders.Filter.Eq(x => x.Code, request.Code); var patientInfo = await _patientDBRepository.FindOneAsync(filter); if (patientInfo != null) { string doctorChange = string.Empty; string orgChange = string.Empty; string teamChange = string.Empty; var oldPatientInfo = Decrypt(patientInfo); var newPatientInfo = new PatientEntity(); await SetPatientRequestCreatedFrom(newPatientInfo, request.OperationDoctor); var patientFilter = Builders.Filter.Eq(x => x.Code, request.Code); var patientsUpdate = new List>(); if (!string.IsNullOrWhiteSpace(newPatientInfo.CreatedDoctor) && patientInfo.CreatedDoctor != newPatientInfo.CreatedDoctor) { doctorChange = $"建档医生从'{patientInfo.CreatedDoctor}'变更为'{newPatientInfo.CreatedDoctor}';"; patientsUpdate.Add(Builders.Update.Set(x => x.CreatedDoctor, newPatientInfo.CreatedDoctor)); } if (!string.IsNullOrWhiteSpace(newPatientInfo.CreatedOrgCode) && patientInfo.CurrentOrgCode != newPatientInfo.CreatedOrgCode) { orgChange = $"建档机构从'{patientInfo.CurrentOrgCode}'变更为'{newPatientInfo.CreatedOrgCode}';"; patientsUpdate.Add(Builders.Update.Set(x => x.CurrentOrgCode, newPatientInfo.CreatedOrgCode)); } if (!string.IsNullOrWhiteSpace(newPatientInfo.CreatedTeamCode) && patientInfo.CurrentTeamCode != newPatientInfo.CreatedTeamCode) { teamChange = $"建档团队从'{patientInfo.CurrentTeamCode}'变更为'{newPatientInfo.CreatedTeamCode}';"; patientsUpdate.Add(Builders.Update.Set(x => x.CurrentTeamCode, newPatientInfo.CreatedTeamCode)); } if (!string.IsNullOrWhiteSpace(newPatientInfo.ArchivedDoctorName) && patientInfo.ArchivedDoctorName != newPatientInfo.ArchivedDoctorName) { patientsUpdate.Add(Builders.Update.Set(x => x.ArchivedDoctorName, newPatientInfo.ArchivedDoctorName)); } patientsUpdate.Add(Builders.Update.Set(x => x.IsDelete, false)); if (!string.IsNullOrWhiteSpace(doctorChange) || !string.IsNullOrWhiteSpace(orgChange) || !string.IsNullOrWhiteSpace(teamChange)) { Logger.WriteLineInfo($"{orgChange}{teamChange}{doctorChange}"); } var updateAll = Builders.Update.Combine(patientsUpdate); if (await _patientDBRepository.UpdateOneAsync(filter, updateAll, false) > 0) { await SetPatientRequestCreatedFrom(patientInfo, request.OperationDoctor); result = patientInfo; } } } return await ConvertToDTO(result); } /// /// 根据关键字段获取居民数据 /// /// 获取请求 /// public async Task GetPatientDetailByKeyAsync(GetPatientByKeyDBRequest request) { var filter = Builders.Filter.Eq(request.Key, request.Value); filter = await AddPermissionPatientFilter(filter, request.OperationDoctor); var result = await _patientDBRepository.FindOneAsync(filter); return await ConvertToDTO(result); } /// /// 获取居民数据分页 /// /// 分页请求 /// public async Task> GetPatientPageAsync(PatientPageDBRequest request) { var filter = await _patientDBRepository.GetPageFilter(request); filter = await AddPermissionPatientFilter(filter, request.OperationDoctor); if (request.CrowdLabels != null && request.CrowdLabels.Count > 0) { var crowdLabelsFilter = Builders.Filter.AnyIn(f => f.CrowdLabels, request.CrowdLabels); filter = Builders.Filter.And(filter, crowdLabelsFilter); } if (request.PatientCodes != null && request.PatientCodes.Count > 0) { var patientCodesFilter = Builders.Filter.In(f => f.Code, request.PatientCodes); filter = Builders.Filter.And(filter, patientCodesFilter); } var pageFilter = new DBPageRequest { PageIndex = request.PageIndex, PageSize = request.PageSize, Filter = filter, Sort = Builders.Sort.Descending(x => x.UpdateTime) }; var result = await _patientDBRepository.GetPages(pageFilter); var data = await ConvertToDTOPage(result); return data; } /// /// 删除居民数据 /// /// 删除请求 /// public async Task RemovePatientAsync(RemovePatientDBRequest request) { AddDoctorCode(request.OperationDoctor); var filter2 = Builders.Filter.Eq(f => f.Code, request.Code); var update = Builders.Update .Set(f => f.IsDelete, true) .Set(f => f.Photos, new List()) .Set(f => f.UpdateTime, DateTime.UtcNow); return await _patientDBRepository.UpdateOneAsync(filter2, update, false) > 0; } /// /// 删除多个居民数据 /// /// 删除请求 /// public async Task RemovePatientListAsync(RemovePatientListDBRequest request) { AddDoctorCode(request.OperationDoctor); var filter = new List<(string key, string val)>(); foreach (var code in request.Codes) { filter.Add(("Code", code)); } return await _patientDBRepository.DeleteAllAsync(filter); } /// /// 获取居民数据列表 /// /// 列表请求 /// public async Task> GetPatientListAsync(GetPatientListDBRequest request) { var filter = Builders.Filter.In(f => f.Code, request.Codes); if (request.IsValidOperationDoctor) { filter = await AddPermissionPatientFilter(filter, request.OperationDoctor); } var result = await _patientDBRepository.FindAllAsync(filter, new FindOptions { Sort = Builders.Sort.Descending(f => f.UpdateTime) }); return await ConvertToDTOList(result); } /// /// 根据关键字段获取居民数据列表 /// /// 列表请求 /// public async Task> GetPatientListByKeyAsync(GetPatientListByKeyDBRequest request) { var filter = Builders.Filter.Eq(request.Key, request.Value); filter = await AddPermissionPatientFilter(filter, request.OperationDoctor); var result = await _patientDBRepository.FindAllAsync(filter, new FindOptions { Sort = Builders.Sort.Descending(f => f.UpdateTime) }); return await ConvertToDTOList(result); } /// /// 更新居民数据 /// /// 更新请求 /// public async Task UpdatePatientAsync(UpdatePatientDBRequest request) { AddDoctorCode(request.OperationDoctor); var filter = Builders.Filter.Eq(f => f.Code, request.Code); var updates = new List>(); if (request.PatientName != "-1") { updates.Add(Builders.Update.Set(f => f.PatientName, _encryptInstance.Encrypt(request.PatientName))); } if (request.Phone != "-1") { updates.Add(Builders.Update.Set(f => f.Phone, _encryptInstance.Encrypt(request.Phone))); } if (request.EmergencyPhone != "-1") { updates.Add(Builders.Update.Set(f => f.EmergencyPhone, _encryptInstance.Encrypt(request.EmergencyPhone))); } if (request.EmergencyName != "-1") { updates.Add(Builders.Update.Set(f => f.EmergencyName, _encryptInstance.Encrypt(request.EmergencyName))); } if (request.CardNo != "-1") { updates.Add(Builders.Update.Set(f => f.CardNo, _encryptInstance.Encrypt(request.CardNo))); } if (request.Nationality != "-1") { updates.Add(Builders.Update.Set(f => f.Nationality, request.Nationality)); } if (request.PatientAddress != "-1") { updates.Add(Builders.Update.Set(f => f.PatientAddress, _encryptInstance.Encrypt(request.PatientAddress))); } if (request.PermanentResidenceAddress != "-1") { updates.Add(Builders.Update.Set(f => f.PermanentResidenceAddress, _encryptInstance.Encrypt(request.PermanentResidenceAddress))); } if (request.TeamRegionCode != "-1") { updates.Add(Builders.Update.Set(f => f.TeamRegionCode, request.TeamRegionCode)); } if (request.ContractedDoctor != "-1") { updates.Add(Builders.Update.Set(f => f.ContractedDoctor, request.ContractedDoctor)); } if (request.PatientGender != null) { updates.Add(Builders.Update.Set(f => f.PatientGender, request.PatientGender)); } if (request.CardType != null) { updates.Add(Builders.Update.Set(f => f.CardType, request.CardType)); } if (request.CrowdLabels != null) { updates.Add(Builders.Update.Set(f => f.CrowdLabels, request.CrowdLabels)); } if (request.Birthday != null) { updates.Add(Builders.Update.Set(f => f.Birthday, request.Birthday)); } updates.Add(Builders.Update.Set(f => f.IsDelete, false)); var update = Builders.Update.Combine(updates); return await _patientDBRepository.UpdateOneAsync(filter, update) > 0; } /// /// 更新居民照片数据 /// /// 更新请求 /// true public async Task UpdatePatientPhotosAsync(UpdatePatientPhotosDBRequest request) { var filter = Builders.Filter.Eq(f => f.Code, request.Code); var update = Builders.Update.Set(s => s.Photos, request.Photos).Set(s => s.UpdateTime, DateTime.UtcNow); return await _patientDBRepository.UpdateOneAsync(filter, update) > 0; } public async Task GetPatientStatisticDBAsync(GetPatientStatisticDBRequest request) { var filter = Builders.Filter.Eq(f => f.Code, request.OperationDoctor); var user = await _userDBRepository.FindOneAsync(filter); var teamCode = user.TeamCode; var teamPatientsFilter = Builders.Filter.Eq(f => f.CurrentTeamCode, teamCode); var teamPatients = await _patientDBRepository.FindAllAsync(teamPatientsFilter, new FindOptions { Projection = Builders.Projection.Include(p => p.CreateTime).Include(p => p.Code) }); var dto = new PatientStatisticDTO(); dto.Count = teamPatients.Count(); dto.TodayCount = teamPatients.Where(w => w.CreateTime.ToLocalTime().Date == DateTime.Now.Date).Count(); return dto; } /// /// 分页查询增量居民信息集合 /// /// public async Task> FindPatientByUpdateTimeDBAsync(FindCollectionByTimeDBRequest request) { var startTime = request.StartTime; var pageIndex = request.PageIndex; var pageSize = request.PageSize; var builder = Builders.Filter; var filter = builder.Where(c => c.UpdateTime > startTime); var pageFilter = new DBPageRequest { PageIndex = request.PageIndex, PageSize = request.PageSize, Filter = filter, Sort = Builders.Sort.Ascending(x => x.UpdateTime) }; var pagedResult = await _patientDBRepository.GetPages(pageFilter, onlyNotDeleted: false); var pageData = new List(); if (pagedResult.PageData?.Any() ?? false) { foreach (var entity in pagedResult.PageData) { var dto = entity.MappingTo(); pageData.Add(dto); } } var result = new PageCollection { DataCount = pagedResult.DataCount, CurrentPage = pagedResult.CurrentPage, PageSize = pagedResult.PageSize, PageData = pageData, }; return result; } /// /// 保存居民记录 /// /// public async Task SavePatientInfoDBAsync(PatientDTO request) { try { var code = request.Code; var patientDO = request.MappingTo(); var filter = Builders.Filter.Eq(f => f.Code, code); var entity = await _patientDBRepository.FindOneAsync(filter, onlyNotDeleted: false); if (entity != null && !string.IsNullOrWhiteSpace(entity.Code)) { var filter2 = Builders.Filter.Eq(f => f.Code, code); var update = Builders.Update .Set(f => f.RecordNo, patientDO.RecordNo) .Set(f => f.PatientName, patientDO.PatientName) .Set(f => f.Phone, patientDO.Phone) .Set(f => f.EmergencyPhone, patientDO.EmergencyPhone) .Set(f => f.EmergencyName, patientDO.EmergencyName) .Set(f => f.CardNo, patientDO.CardNo) .Set(f => f.Nationality, patientDO.Nationality) .Set(f => f.Birthday, patientDO.Birthday) .Set(f => f.CrowdLabels, patientDO.CrowdLabels) .Set(f => f.CardType, patientDO.CardType) .Set(f => f.PatientGender, patientDO.PatientGender) .Set(f => f.PatientAddress, patientDO.PatientAddress) .Set(f => f.PermanentResidenceAddress, patientDO.PermanentResidenceAddress) .Set(f => f.TeamRegionCode, patientDO.TeamRegionCode) .Set(f => f.ContractedDoctor, patientDO.ContractedDoctor) .Set(f => f.Status, patientDO.Status) .Set(f => f.Photos, patientDO.Photos) .Set(f => f.CurrentTeamCode, patientDO.CurrentTeamCode) .Set(f => f.CurrentOrgCode, patientDO.CurrentOrgCode) .Set(f => f.CreatedOrgCode, patientDO.CreatedOrgCode) .Set(f => f.CreatedTeamCode, patientDO.CreatedTeamCode) .Set(f => f.CreatedDoctor, patientDO.CreatedDoctor) .Set(f => f.ArchivedDoctorName, patientDO.ArchivedDoctorName) .Set(f => f.IsDelete, patientDO.IsDelete) .Set(f => f.CreateTime, patientDO.CreateTime) .Set(f => f.UpdateTime, patientDO.UpdateTime); await _patientDBRepository.UpdateOneAsync(filter2, update, false, false); } else { await _patientDBRepository.InsertOneAsync(patientDO, false); } } catch (Exception ex) { Logger.WriteLineWarn($"ExamDBService SavePatientInfoDBAsync failed, ex:{ex}"); } return true; } /// /// 加密 /// /// /// private PatientEntity Encrypt(PatientEntity entity) { if (!string.IsNullOrWhiteSpace(entity.CardNo)) { entity.CardNo = _encryptInstance.Encrypt(entity.CardNo); } if (!string.IsNullOrWhiteSpace(entity.PatientAddress)) { entity.PatientAddress = _encryptInstance.Encrypt(entity.PatientAddress); } if (!string.IsNullOrWhiteSpace(entity.PermanentResidenceAddress)) { entity.PermanentResidenceAddress = _encryptInstance.Encrypt(entity.PermanentResidenceAddress); } if (!string.IsNullOrWhiteSpace(entity.PatientName)) { entity.PatientName = _encryptInstance.Encrypt(entity.PatientName); } if (!string.IsNullOrWhiteSpace(entity.Phone)) { entity.Phone = _encryptInstance.Encrypt(entity.Phone); } if (!string.IsNullOrWhiteSpace(entity.EmergencyPhone)) { entity.EmergencyPhone = _encryptInstance.Encrypt(entity.EmergencyPhone); } if (!string.IsNullOrWhiteSpace(entity.EmergencyName)) { entity.EmergencyName = _encryptInstance.Encrypt(entity.EmergencyName); } return entity; } /// /// 解密 /// /// /// private PatientDTO Decrypt(PatientDTO dto) { if (!string.IsNullOrWhiteSpace(dto.CardNo)) { dto.CardNo = _encryptInstance.Decrypt(dto.CardNo); } if (!string.IsNullOrWhiteSpace(dto.PatientAddress)) { dto.PatientAddress = _encryptInstance.Decrypt(dto.PatientAddress); } if (!string.IsNullOrWhiteSpace(dto.PermanentResidenceAddress)) { dto.PermanentResidenceAddress = _encryptInstance.Decrypt(dto.PermanentResidenceAddress); } if (!string.IsNullOrWhiteSpace(dto.PatientName)) { dto.PatientName = _encryptInstance.Decrypt(dto.PatientName); } if (!string.IsNullOrWhiteSpace(dto.Phone)) { dto.Phone = _encryptInstance.Decrypt(dto.Phone); } if (!string.IsNullOrWhiteSpace(dto.EmergencyPhone)) { dto.EmergencyPhone = _encryptInstance.Decrypt(dto.EmergencyPhone); } if (!string.IsNullOrWhiteSpace(dto.EmergencyName)) { dto.EmergencyName = _encryptInstance.Decrypt(dto.EmergencyName); } return dto; } /// /// 解密 /// /// /// private PatientEntity Decrypt(PatientEntity entity) { if (!string.IsNullOrWhiteSpace(entity.CardNo)) { entity.CardNo = _encryptInstance.Decrypt(entity.CardNo); } if (!string.IsNullOrWhiteSpace(entity.PatientAddress)) { entity.PatientAddress = _encryptInstance.Decrypt(entity.PatientAddress); } if (!string.IsNullOrWhiteSpace(entity.PermanentResidenceAddress)) { entity.PermanentResidenceAddress = _encryptInstance.Decrypt(entity.PermanentResidenceAddress); } if (!string.IsNullOrWhiteSpace(entity.PatientName)) { entity.PatientName = _encryptInstance.Decrypt(entity.PatientName); } if (!string.IsNullOrWhiteSpace(entity.Phone)) { entity.Phone = _encryptInstance.Decrypt(entity.Phone); } if (!string.IsNullOrWhiteSpace(entity.EmergencyName)) { entity.EmergencyName = _encryptInstance.Decrypt(entity.EmergencyName); } if (!string.IsNullOrWhiteSpace(entity.EmergencyPhone)) { entity.EmergencyPhone = _encryptInstance.Decrypt(entity.EmergencyPhone); } return entity; } private async Task ConvertToDTO(PatientEntity entity) { if (entity == null) return null; var dto = entity.MappingTo(); if (!string.IsNullOrWhiteSpace(entity.CurrentOrgCode)) { var filter = Builders.Filter.Eq(f => f.Code, entity.CurrentOrgCode); var org = await _organizationDBRepository.FindOneAsync(filter); dto.CreatedOrgName = org?.OrganizationName; } if (!string.IsNullOrWhiteSpace(entity.CurrentTeamCode)) { var filter = Builders.Filter.Eq(f => f.Code, entity.CurrentTeamCode); var team = await _teamDBRepository.FindOneAsync(filter); dto.CreatedTeamName = team?.TeamName; } if (!string.IsNullOrWhiteSpace(entity.Code)) { var filter = Builders.Filter.Eq(f => f.ContractedPatient, entity.Code); var contractRecord = await _contractRecordDBRepository.FindOneAsync(filter); if (!string.IsNullOrWhiteSpace(contractRecord?.ContractedDoctor)) { var filterUser = Builders.Filter.Eq(f => f.Code, contractRecord?.ContractedDoctor); var userInfo = await _userDBRepository.FindOneAsync(filterUser); dto.ContractedDoctorName = !string.IsNullOrWhiteSpace(userInfo.RealName) ? userInfo.RealName : userInfo.UserName; } } if (!string.IsNullOrWhiteSpace(entity.CreatedDoctor)) { var filter = Builders.Filter.Eq(f => f.Code, entity.CreatedDoctor); var userInfo = await _userDBRepository.FindOneAsync(filter); if (userInfo != null && !string.IsNullOrWhiteSpace(userInfo.Code)) { dto.CreatedDoctorName = !string.IsNullOrWhiteSpace(userInfo.RealName) ? userInfo.RealName : userInfo.UserName; } } if (string.IsNullOrWhiteSpace(dto.CreatedDoctorName)) { dto.CreatedDoctorName = dto.ArchivedDoctorName; } FillingPersopnType(entity); dto.CrowdLabels = entity.CrowdLabels; if (entity.CrowdLabels != null && entity.CrowdLabels.Count > 0) { var filterLabel = Builders.Filter.In(f => f.LabelTypeKey, new List { "RQFL", "CJJB", "TSZG" }); var labels = await _labelDBRepository.FindAllAsync(filterLabel); dto.LabelNames = labels?.Where(w => entity.CrowdLabels.Contains(w.Code)).Select(f => f.LabelName).ToList(); } if (!string.IsNullOrWhiteSpace(entity.Code)) { var contractFilter = Builders.Filter.Eq(f => f.ContractedPatient, entity.Code); var contract = await _contractRecordDBRepository.FindOneAsync(contractFilter, new FindOptions { Sort = Builders.Sort.Descending(f => f.UpdateTime) }); dto.ContractState = contract?.ContractState ?? ContractStateEnum.Unsigned; } return Decrypt(dto); } private async Task> ConvertToDTOList(List entitys) { if (entitys == null || entitys.Count == 0) return new List(); var userCodes = entitys.Select(f => f.ContractedDoctor).Union(entitys.Select(f => f.CreatedDoctor)).Distinct(); var filterUsers = Builders.Filter.In(f => f.Code, userCodes); var usersInfo = await _userDBRepository.FindAllAsync(filterUsers); var orgCodes = usersInfo.Select(u => u.OrganizationCode).Union(entitys.Select(f => f.CreatedOrgCode)).Union(entitys.Select(f => f.CurrentOrgCode)).Distinct(); var filterOrgs = Builders.Filter.In(f => f.Code, orgCodes); var orgsInfo = await _organizationDBRepository.FindAllAsync(filterOrgs); var teamCodes = entitys.Select(f => f.CurrentTeamCode).Union(entitys.Select(f => f.CreatedTeamCode)).Union(entitys.Select(f => f.CurrentTeamCode)).Distinct(); var filterTeams = Builders.Filter.In(f => f.Code, teamCodes); var teamsInfo = await _teamDBRepository.FindAllAsync(filterTeams); var filterLabel = Builders.Filter.In(f => f.LabelTypeKey, new List { "RQFL", "CJJB", "TSZG" }); var labels = await _labelDBRepository.FindAllAsync(filterLabel); var patientCodes = entitys.Select(f => f.Code).Distinct(); var contractFilter = Builders.Filter.In(f => f.ContractedPatient, patientCodes); var contracts = await _contractRecordDBRepository.FindAllAsync(contractFilter, new FindOptions { Projection = Builders.Projection.Exclude(f => f.ContractedFileUrl).Exclude(f => f.Photos) }); var resultList = new List(); foreach (var entity in entitys) { if (entity == null) { continue; } var record = entity.MappingTo(); if (!string.IsNullOrWhiteSpace(entity.ContractedDoctor)) { var userInfo = usersInfo.FirstOrDefault(w => w.Code == entity.ContractedDoctor); record.ContractedDoctorName = !string.IsNullOrWhiteSpace(userInfo?.RealName) ? userInfo.RealName : userInfo?.UserName; } if (!string.IsNullOrWhiteSpace(entity.CreatedDoctor)) { var userInfo = usersInfo.FirstOrDefault(w => w.Code == entity.CreatedDoctor); record.CreatedDoctorName = !string.IsNullOrWhiteSpace(userInfo?.RealName) ? userInfo.RealName : userInfo?.UserName; } if (string.IsNullOrWhiteSpace(record.CreatedDoctorName)) { record.CreatedDoctorName = record.ArchivedDoctorName; } if (!string.IsNullOrWhiteSpace(entity.CurrentOrgCode)) { var orgInfo = orgsInfo.FirstOrDefault(w => w.Code == entity.CurrentOrgCode); record.CreatedOrgName = orgInfo?.OrganizationName; } if (!string.IsNullOrWhiteSpace(entity.CurrentTeamCode)) { var teamInfo = teamsInfo.FirstOrDefault(w => w.Code == entity.CurrentTeamCode); record.CreatedTeamName = teamInfo?.TeamName; } FillingPersopnType(entity); record.CrowdLabels = entity.CrowdLabels; if (entity.CrowdLabels != null && entity.CrowdLabels.Count > 0) { record.LabelNames = labels?.Where(w => entity.CrowdLabels?.Contains(w.Code) == true).Select(f => f.LabelName).ToList(); } if (!string.IsNullOrWhiteSpace(entity.Code)) { record.ContractState = contracts?.Where(w => entity.Code == w.ContractedPatient).OrderByDescending(o => o.UpdateTime).FirstOrDefault()?.ContractState ?? ContractStateEnum.Unsigned; } resultList.Add(Decrypt(record)); } return resultList; } private async Task> ConvertToDTOPage(PageCollection entitys) { var resultPage = new PageCollection { DataCount = entitys.DataCount, CurrentPage = entitys.CurrentPage, PageSize = entitys.PageSize, PageData = await ConvertToDTOList(entitys.PageData) }; return resultPage; } private async Task> AddPermissionPatientFilter(FilterDefinition filter, string userCode, bool skipTeamVerify = false) { var (user, org, team) = await VerifyPermission(userCode, skipTeamVerify); if (user.RoleCode != "Role_SystemAdministrator") { FilterDefinition orFilter = null; if (user.RoleCode != "Role_HeadOfInstitution") { orFilter = Builders.Filter.Or( Builders.Filter.And(Builders.Filter.Eq(x => x.CurrentOrgCode, user.OrganizationCode), Builders.Filter.Eq(x => x.CurrentTeamCode, user.TeamCode)), Builders.Filter.And(Builders.Filter.Exists(x => x.CurrentOrgCode, false), Builders.Filter.Exists(x => x.CurrentTeamCode, false)), Builders.Filter.And(Builders.Filter.Eq(x => x.CurrentOrgCode, null), Builders.Filter.Eq(x => x.CurrentTeamCode, null)) ); } else { orFilter = Builders.Filter.Or( Builders.Filter.Eq(x => x.CurrentOrgCode, user.OrganizationCode), Builders.Filter.And(Builders.Filter.Exists(x => x.CurrentOrgCode, false)), Builders.Filter.And(Builders.Filter.Eq(x => x.CurrentOrgCode, null)) ); } List> filterList = new() { filter, orFilter }; return Builders.Filter.And(filterList); } return filter; } private async Task<(UserEntity user, OrganizationEntity org, TeamEntity team)> SetPatientRequestCreatedFrom(PatientEntity entity, string userCode, bool skipTeamVerify = false) { var (user, org, team) = await VerifyPermission(userCode, skipTeamVerify); entity.CreatedDoctor = user?.Code; entity.CreatedOrgCode = org?.Code; entity.CreatedTeamCode = team?.Code; entity.CurrentOrgCode = org?.Code; entity.CurrentTeamCode = team?.Code; entity.ArchivedDoctorName = user?.RealName ?? string.Empty; return (user, org, team); } public bool AreEqual(List array1, List array2) { try { if (array1 == null || array2 == null) return array1 == array2; array1 = array1.OrderBy(x => x).ToList(); array2 = array2.OrderBy(x => x).ToList(); return array1.SequenceEqual(array2); } catch (Exception ex) { Logger.WriteLineWarn($"PatientDBService AreEqual failed, ex:{ex}"); return false; } } private void FillingPersopnType(PatientEntity entity) { try { entity.CrowdLabels = entity.CrowdLabels?.ToList() ?? new List(); var idCardNo = entity.Code; if (entity.CrowdLabels.Contains("CJJB_TNB") && entity.CrowdLabels.Contains("CJJB_TNB_Suspected")) { entity.CrowdLabels = entity.CrowdLabels.Where(x => x != "CJJB_TNB_Suspected")?.ToList() ?? new List(); } if (entity.CrowdLabels.Contains("CJJB_GXY") && entity.CrowdLabels.Contains("CJJB_GXY_Suspected")) { entity.CrowdLabels = entity.CrowdLabels.Where(x => x != "CJJB_GXY_Suspected")?.ToList() ?? new List(); } if (!string.IsNullOrWhiteSpace(idCardNo) && Regex.IsMatch(idCardNo, @"^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})(\d|X)$")) { var birthDay = new DateTime(Convert.ToInt32(idCardNo.Substring(6, 4)), Convert.ToInt32(idCardNo.Substring(10, 2)), Convert.ToInt32(idCardNo.Substring(12, 2))); var childDay = DateTime.Now.AddYears(-6); var childLabel = "RQFL_ET"; if (birthDay >= childDay) { if (!entity.CrowdLabels.Contains(childLabel)) { entity.CrowdLabels.Add(childLabel); } } else { if (entity.CrowdLabels.Contains(childLabel)) { entity.CrowdLabels = entity.CrowdLabels.Where(x => x != childLabel)?.ToList() ?? new List(); } } var lnrDay = DateTime.Now.AddYears(-65); var lnrLabel = "RQFL_LNR"; if (birthDay <= lnrDay) { if (!entity.CrowdLabels.Contains(lnrLabel)) { entity.CrowdLabels.Add(lnrLabel); } } else { if (entity.CrowdLabels.Contains(lnrLabel)) { entity.CrowdLabels = entity.CrowdLabels.Where(x => x != lnrLabel)?.ToList() ?? new List(); } } } } catch (Exception ex) { Logger.WriteLineDebug($"FillingPersopnType error,{entity.CardNo}," + ex); } } } }