Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
commit
256a5a6ea6
|
@ -27,6 +27,7 @@ using Microsoft.AspNetCore.WebUtilities;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Localization;
|
using Microsoft.Extensions.Localization;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
using MiniExcelLibs;
|
using MiniExcelLibs;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
@ -38,6 +39,7 @@ using System.Data;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Path = System.IO.Path;
|
using Path = System.IO.Path;
|
||||||
|
|
||||||
|
@ -527,7 +529,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
}
|
}
|
||||||
var uploadFinishedTime = DateTime.Now;
|
var uploadFinishedTime = DateTime.Now;
|
||||||
|
|
||||||
var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId,true);
|
var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId, true);
|
||||||
|
|
||||||
noneDicomStudy.FileCount = noneDicomStudy.FileCount + (incommand.VisitTaskId != null ? 0 : incommand.UploadedFileList.Count);
|
noneDicomStudy.FileCount = noneDicomStudy.FileCount + (incommand.VisitTaskId != null ? 0 : incommand.UploadedFileList.Count);
|
||||||
|
|
||||||
|
@ -799,12 +801,13 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
|
|
||||||
[HttpPost, Route("TrialSiteSurvey/UploadTrialSiteSurveyUser")]
|
[HttpPost, Route("TrialSiteSurvey/UploadTrialSiteSurveyUser")]
|
||||||
[DisableFormValueModelBinding]
|
[DisableFormValueModelBinding]
|
||||||
[UnitOfWork]
|
|
||||||
public async Task<IResponseOutput> UploadTrialSiteSurveyUser(Guid trialId, string baseUrl, string routeUrl,
|
public async Task<IResponseOutput> UploadTrialSiteSurveyUser(Guid trialId, string baseUrl, string routeUrl,
|
||||||
[FromServices] IRepository<TrialSite> _trialSiteRepository,
|
[FromServices] IRepository<TrialSite> _trialSiteRepository,
|
||||||
[FromServices] IRepository<UserType> _usertypeRepository,
|
[FromServices] IRepository<UserType> _usertypeRepository,
|
||||||
[FromServices] ITrialSiteSurveyService _trialSiteSurveyService,
|
[FromServices] ITrialSiteSurveyService _trialSiteSurveyService,
|
||||||
[FromServices] IOSSService oSSService,
|
[FromServices] IOSSService oSSService,
|
||||||
|
[FromServices] IOptionsMonitor<SystemEmailSendConfig> _systemEmailConfig,
|
||||||
|
|
||||||
[FromServices] IRepository<InspectionFile> _inspectionFileRepository)
|
[FromServices] IRepository<InspectionFile> _inspectionFileRepository)
|
||||||
{
|
{
|
||||||
var templateFileStream = new MemoryStream();
|
var templateFileStream = new MemoryStream();
|
||||||
|
@ -823,7 +826,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
|
|
||||||
var ossRelativePath = await oSSService.UploadToOSSAsync(fileStream, "InspectionUpload/SiteSurvey", realFileName);
|
var ossRelativePath = await oSSService.UploadToOSSAsync(fileStream, "InspectionUpload/SiteSurvey", realFileName);
|
||||||
|
|
||||||
await _inspectionFileRepository.AddAsync(new InspectionFile() { FileName = realFileName, RelativePath = ossRelativePath, TrialId = trialId },true);
|
await _inspectionFileRepository.AddAsync(new InspectionFile() { FileName = realFileName, RelativePath = ossRelativePath, TrialId = trialId }, true);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -836,6 +839,26 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
.Where(t => !(string.IsNullOrWhiteSpace(t.TrialSiteCode) && string.IsNullOrWhiteSpace(t.FirstName) && string.IsNullOrWhiteSpace(t.LastName) && string.IsNullOrWhiteSpace(t.Email)
|
.Where(t => !(string.IsNullOrWhiteSpace(t.TrialSiteCode) && string.IsNullOrWhiteSpace(t.FirstName) && string.IsNullOrWhiteSpace(t.LastName) && string.IsNullOrWhiteSpace(t.Email)
|
||||||
&& string.IsNullOrWhiteSpace(t.Phone) && string.IsNullOrWhiteSpace(t.UserTypeStr) && string.IsNullOrWhiteSpace(t.OrganizationName))).ToList();
|
&& string.IsNullOrWhiteSpace(t.Phone) && string.IsNullOrWhiteSpace(t.UserTypeStr) && string.IsNullOrWhiteSpace(t.OrganizationName))).ToList();
|
||||||
|
|
||||||
|
//处理前后空格
|
||||||
|
foreach (var excel in excelList)
|
||||||
|
{
|
||||||
|
excel.Email = excel.Email.Trim();
|
||||||
|
excel.Phone = excel.Phone.Trim();
|
||||||
|
excel.OrganizationName = excel.OrganizationName.Trim();
|
||||||
|
excel.UserTypeStr = excel.UserTypeStr?.Trim();
|
||||||
|
excel.TrialSiteCode = excel.TrialSiteCode.Trim();
|
||||||
|
excel.FirstName = excel.FirstName.Trim();
|
||||||
|
excel.LastName = excel.LastName.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
var emailRegexStr = _systemEmailConfig.CurrentValue.EmailRegexStr;
|
||||||
|
if (excelList.Any(t => !Regex.IsMatch(t.Email, emailRegexStr)))
|
||||||
|
{
|
||||||
|
var errorList = excelList.Where(t => !Regex.IsMatch(t.Email, emailRegexStr)).Select(t => t.Email).ToList();
|
||||||
|
//有邮箱不符合邮箱格式,请核查Excel数据
|
||||||
|
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidEmail"] + string.Join(" | ", errorList));
|
||||||
|
}
|
||||||
|
|
||||||
if (excelList.Any(t => string.IsNullOrWhiteSpace(t.TrialSiteCode) || string.IsNullOrWhiteSpace(t.FirstName) || string.IsNullOrWhiteSpace(t.LastName) || string.IsNullOrWhiteSpace(t.Email) || string.IsNullOrWhiteSpace(t.UserTypeStr)))
|
if (excelList.Any(t => string.IsNullOrWhiteSpace(t.TrialSiteCode) || string.IsNullOrWhiteSpace(t.FirstName) || string.IsNullOrWhiteSpace(t.LastName) || string.IsNullOrWhiteSpace(t.Email) || string.IsNullOrWhiteSpace(t.UserTypeStr)))
|
||||||
{
|
{
|
||||||
//请确保Excel中 每一行的 中心编号,姓名,邮箱,用户类型数据记录完整再进行上传
|
//请确保Excel中 每一行的 中心编号,姓名,邮箱,用户类型数据记录完整再进行上传
|
||||||
|
@ -864,11 +887,6 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (excelList.Any(t => !t.Email.Contains("@")))
|
|
||||||
{
|
|
||||||
//有邮箱不符合邮箱格式,请核查Excel数据
|
|
||||||
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidEmail"]);
|
|
||||||
}
|
|
||||||
var generateUserTypeList = new List<string>() { "CRC", "CRA" };
|
var generateUserTypeList = new List<string>() { "CRC", "CRA" };
|
||||||
|
|
||||||
//if (excelList.Any(t => !generateUserTypeList.Contains(t.UserTypeStr.ToUpper())))
|
//if (excelList.Any(t => !generateUserTypeList.Contains(t.UserTypeStr.ToUpper())))
|
||||||
|
|
|
@ -76,16 +76,15 @@
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="ConfigMapFileProvider" Version="2.0.1" />
|
<PackageReference Include="ConfigMapFileProvider" Version="2.0.1" />
|
||||||
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.18" />
|
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.20" />
|
||||||
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
|
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
|
||||||
<PackageReference Include="Hangfire.InMemory" Version="1.0.0" />
|
<PackageReference Include="Hangfire.InMemory" Version="1.0.0" />
|
||||||
<PackageReference Include="Hangfire.SqlServer" Version="1.8.18" />
|
<PackageReference Include="Hangfire.SqlServer" Version="1.8.20" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.Email" Version="4.0.0" />
|
<PackageReference Include="Serilog.Sinks.Email" Version="4.1.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="8.1.1" />
|
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -94,6 +94,7 @@
|
||||||
"CompanyShortNameCN": "展影医疗",
|
"CompanyShortNameCN": "展影医疗",
|
||||||
"IsEnv_US": false,
|
"IsEnv_US": false,
|
||||||
"IsOpenErrorNoticeEmail": false,
|
"IsOpenErrorNoticeEmail": false,
|
||||||
|
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
||||||
"ErrorNoticeEmailList": [ "872297557@qq.com" ]
|
"ErrorNoticeEmailList": [ "872297557@qq.com" ]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using ILogger = Microsoft.Extensions.Logging.ILogger;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service.BusinessFilter;
|
namespace IRaCIS.Core.Application.Service.BusinessFilter;
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,8 @@ public class SystemEmailSendConfig
|
||||||
|
|
||||||
public bool IsOpenErrorNoticeEmail { get; set; }
|
public bool IsOpenErrorNoticeEmail { get; set; }
|
||||||
|
|
||||||
|
public string EmailRegexStr { get; set; }
|
||||||
|
|
||||||
public List<string> ErrorNoticeEmailList { get; set; } =new List<string>();
|
public List<string> ErrorNoticeEmailList { get; set; } =new List<string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,5 +11,6 @@ global using AutoMapper;
|
||||||
global using IRaCIS.Core.Domain.Share;
|
global using IRaCIS.Core.Domain.Share;
|
||||||
global using IRaCIS.Core.Application.BusinessFilter;
|
global using IRaCIS.Core.Application.BusinessFilter;
|
||||||
global using IdentityUser = IRaCIS.Core.Domain.Models.IdentityUser;
|
global using IdentityUser = IRaCIS.Core.Domain.Models.IdentityUser;
|
||||||
|
global using Serilog;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
namespace IRaCIS.Core.Application.Helper;
|
using System.Globalization;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Application.Helper;
|
||||||
|
|
||||||
public static class IRCEmailPasswordHelper
|
public static class IRCEmailPasswordHelper
|
||||||
{
|
{
|
||||||
|
@ -74,4 +77,56 @@ public static class IRCEmailPasswordHelper
|
||||||
// 随机打乱密码字符顺序
|
// 随机打乱密码字符顺序
|
||||||
return new string(password.OrderBy(_ => Random.Next()).ToArray());
|
return new string(password.OrderBy(_ => Random.Next()).ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format
|
||||||
|
/// <summary>
|
||||||
|
/// 微软官方邮件验证 很宽松
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="email"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool IsValidEmail(string email)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(email))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Normalize the domain
|
||||||
|
email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
|
||||||
|
RegexOptions.None, TimeSpan.FromMilliseconds(200));
|
||||||
|
|
||||||
|
// Examines the domain part of the email and normalizes it.
|
||||||
|
string DomainMapper(Match match)
|
||||||
|
{
|
||||||
|
// Use IdnMapping class to convert Unicode domain names.
|
||||||
|
var idn = new IdnMapping();
|
||||||
|
|
||||||
|
// Pull out and process domain name (throws ArgumentException on invalid)
|
||||||
|
string domainName = idn.GetAscii(match.Groups[2].Value);
|
||||||
|
|
||||||
|
return match.Groups[1].Value + domainName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (RegexMatchTimeoutException e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (ArgumentException e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Regex.IsMatch(email,
|
||||||
|
@"^[^@\s]+@[^@\s]+\.[^@\s]+$",
|
||||||
|
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
|
||||||
|
}
|
||||||
|
catch (RegexMatchTimeoutException)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,7 +123,7 @@ public class AWSTempToken
|
||||||
public string SecretAccessKey { get; set; }
|
public string SecretAccessKey { get; set; }
|
||||||
public string BucketName { get; set; }
|
public string BucketName { get; set; }
|
||||||
public string ViewEndpoint { get; set; }
|
public string ViewEndpoint { get; set; }
|
||||||
public DateTime Expiration { get; set; }
|
public DateTime? Expiration { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ObjectStoreUse
|
public enum ObjectStoreUse
|
||||||
|
|
|
@ -33,38 +33,39 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="IdentityModel.OidcClient" Version="6.0.0" />
|
<PackageReference Include="IdentityModel.OidcClient" Version="6.0.0" />
|
||||||
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.5" />
|
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.6" />
|
||||||
<PackageReference Include="AWSSDK.SecurityToken" Version="3.7.401.81" />
|
<PackageReference Include="AWSSDK.SecurityToken" Version="4.0.1.3" />
|
||||||
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
||||||
<PackageReference Include="AWSSDK.S3" Version="3.7.416.8" />
|
<PackageReference Include="AWSSDK.S3" Version="4.0.4.1" />
|
||||||
<PackageReference Include="DocX" Version="4.0.25105.5786" />
|
<PackageReference Include="DocX" Version="4.0.25105.5786" />
|
||||||
<PackageReference Include="FreeSpire.Doc" Version="12.2.0" />
|
<PackageReference Include="FreeSpire.Doc" Version="12.2.0" />
|
||||||
<PackageReference Include="Hangfire.Core" Version="1.8.18" />
|
<PackageReference Include="Hangfire.Core" Version="1.8.20" />
|
||||||
<PackageReference Include="ExcelDataReader" Version="3.7.0" />
|
<PackageReference Include="ExcelDataReader" Version="3.7.0" />
|
||||||
<PackageReference Include="ExcelDataReader.DataSet" Version="3.7.0" />
|
<PackageReference Include="ExcelDataReader.DataSet" Version="3.7.0" />
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.0.3" />
|
<PackageReference Include="DistributedLock.Redis" Version="1.0.3" />
|
||||||
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.6" />
|
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.6" />
|
||||||
<PackageReference Include="fo-dicom" Version="5.2.1" />
|
<PackageReference Include="fo-dicom" Version="5.2.2" />
|
||||||
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.1" />
|
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.2" />
|
||||||
<PackageReference Include="fo-dicom.Codecs" Version="5.16.1" />
|
<PackageReference Include="fo-dicom.Codecs" Version="5.16.3" />
|
||||||
<PackageReference Include="IP2Region.Net" Version="2.0.2" />
|
<PackageReference Include="IP2Region.Net" Version="2.0.2" />
|
||||||
<PackageReference Include="MailKit" Version="4.11.0" />
|
<PackageReference Include="MailKit" Version="4.11.0" />
|
||||||
<PackageReference Include="Masa.Contrib.Service.MinimalAPIs" Version="1.0.0" />
|
<PackageReference Include="Masa.Contrib.Service.MinimalAPIs" Version="1.0.0" />
|
||||||
<PackageReference Include="MaxMind.GeoIP2" Version="5.2.0" />
|
<PackageReference Include="MaxMind.GeoIP2" Version="5.3.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
|
||||||
<PackageReference Include="MimeKit" Version="4.11.0" />
|
<PackageReference Include="MimeKit" Version="4.11.0" />
|
||||||
<PackageReference Include="MiniExcel" Version="1.41.2" />
|
<PackageReference Include="MiniExcel" Version="1.41.2" />
|
||||||
<PackageReference Include="Minio" Version="6.0.4" />
|
<PackageReference Include="Minio" Version="6.0.5" />
|
||||||
<PackageReference Include="MiniWord" Version="0.9.2" />
|
<PackageReference Include="MiniWord" Version="0.9.2" />
|
||||||
|
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
|
||||||
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
|
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
|
||||||
<TreatAsUsed>true</TreatAsUsed>
|
<TreatAsUsed>true</TreatAsUsed>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="NPOI" Version="2.7.3" />
|
<PackageReference Include="NPOI" Version="2.7.4" />
|
||||||
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
|
||||||
<PackageReference Include="RestSharp" Version="112.1.0" />
|
<PackageReference Include="RestSharp" Version="112.1.0" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.10" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="8.0.2" />
|
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="8.0.2" />
|
||||||
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.1.0" />
|
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.3.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -14182,6 +14182,13 @@
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Helper.IRCEmailPasswordHelper.GenerateRandomPassword(System.Int32)" -->
|
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Helper.IRCEmailPasswordHelper.GenerateRandomPassword(System.Int32)" -->
|
||||||
|
<member name="M:IRaCIS.Core.Application.Helper.IRCEmailPasswordHelper.IsValidEmail(System.String)">
|
||||||
|
<summary>
|
||||||
|
微软官方邮件验证 很宽松
|
||||||
|
</summary>
|
||||||
|
<param name="email"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Helper.FileConvertHelper.ConvertWordToPdf(System.String,System.String)">
|
<member name="M:IRaCIS.Core.Application.Helper.FileConvertHelper.ConvertWordToPdf(System.String,System.String)">
|
||||||
<summary>
|
<summary>
|
||||||
镜像里面打入libreoffice 的方案
|
镜像里面打入libreoffice 的方案
|
||||||
|
|
|
@ -10,9 +10,41 @@ using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using MimeKit;
|
using MimeKit;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service
|
namespace IRaCIS.Core.Application.Service
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public static class SafeMailHelper
|
||||||
|
{
|
||||||
|
public static async Task Run(Func<Task> func, [CallerMemberName] string caller = "")
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await func();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Logger.Error($"【邮件失败 - {caller}】: {ex.Message}");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<T?> Run<T>(Func<Task<T>> func, [CallerMemberName] string caller = "")
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return await func();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Logger.Error($"【邮件失败 - {caller}】: {ex.Message}");
|
||||||
|
}
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public interface IMailVerificationService
|
public interface IMailVerificationService
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -68,6 +100,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
if (configInfo == null)
|
if (configInfo == null)
|
||||||
{
|
{
|
||||||
|
Log.Logger.Error($"系统未找到当前场景:{scenario}邮件配置信息");
|
||||||
|
|
||||||
throw new BusinessValidationFailedException("系统未找到当前场景邮件配置信息,请联系运维人员核查");
|
throw new BusinessValidationFailedException("系统未找到当前场景邮件配置信息,请联系运维人员核查");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,6 +115,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Log.Logger.Error($"邮件模板内容有误,填充内容出现问题,需要核查{scenario}场景邮件配置信息");
|
||||||
|
|
||||||
throw new BusinessValidationFailedException("邮件模板内容有误,填充内容出现问题,请联系运维人员核查");
|
throw new BusinessValidationFailedException("邮件模板内容有误,填充内容出现问题,请联系运维人员核查");
|
||||||
}
|
}
|
||||||
|
@ -103,6 +138,8 @@ namespace IRaCIS.Core.Application.Service
|
||||||
|
|
||||||
if (configInfo == null)
|
if (configInfo == null)
|
||||||
{
|
{
|
||||||
|
Log.Logger.Error($"系统未找到当前场景:{scenario}邮件配置信息");
|
||||||
|
|
||||||
throw new BusinessValidationFailedException("系统未找到当前场景邮件配置信息,请联系运维人员核查");
|
throw new BusinessValidationFailedException("系统未找到当前场景邮件配置信息,请联系运维人员核查");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
//subject 随机阅片 或者无序 有上传 才处理任务编号
|
//subject 随机阅片 或者无序 有上传 才处理任务编号
|
||||||
if (_visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId &&
|
if (_visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId &&
|
||||||
(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom ||
|
(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom ||
|
||||||
(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.Random && t.TrialReadingCriterion.ImageUploadEnum != ReadingImageUpload.None))))
|
(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.Random && t.TrialReadingCriterion.ImageDownloadEnum != ReadingImageDownload.None))))
|
||||||
{
|
{
|
||||||
//找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
|
//找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
|
||||||
var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
|
var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
|
||||||
|
|
|
@ -70,8 +70,9 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public async Task<IResponseOutput> SendEmialVerifyCode(SendEmialVerifyCodeInDto userInfo)
|
public async Task<IResponseOutput> SendEmialVerifyCode(SendEmialVerifyCodeInDto userInfo)
|
||||||
{
|
{
|
||||||
|
var emailRegexStr = _systemEmailConfig.EmailRegexStr;
|
||||||
//检查手机或者邮箱是否有效
|
//检查手机或者邮箱是否有效
|
||||||
if (!Regex.IsMatch(userInfo.Email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
|
if (!Regex.IsMatch(userInfo.Email, emailRegexStr))
|
||||||
{
|
{
|
||||||
//---请输入正确的邮箱地址。
|
//---请输入正确的邮箱地址。
|
||||||
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]);
|
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]);
|
||||||
|
@ -271,8 +272,10 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public async Task<IResponseOutput> SendVerifyCode(SiteSurveySendVerifyCode userInfo)
|
public async Task<IResponseOutput> SendVerifyCode(SiteSurveySendVerifyCode userInfo)
|
||||||
{
|
{
|
||||||
|
var emailRegexStr = _systemEmailConfig.EmailRegexStr;
|
||||||
|
|
||||||
//检查手机或者邮箱是否有效
|
//检查手机或者邮箱是否有效
|
||||||
if (!Regex.IsMatch(userInfo.Email, @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
|
if (!Regex.IsMatch(userInfo.Email, emailRegexStr))
|
||||||
{
|
{
|
||||||
//---请输入正确的邮箱地址。
|
//---请输入正确的邮箱地址。
|
||||||
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]);
|
throw new BusinessValidationFailedException(_localizer["TrialSiteSurvey_InvalidEmail"]);
|
||||||
|
|
|
@ -486,7 +486,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(ex.Message);
|
Log.Logger.Error($"【邮件失败 - ConfirmReviewer接口】: {ex.Message}");
|
||||||
intoGroupItem.EnrollStatus = EnrollStatus.ConfirmIntoGroupFailed;
|
intoGroupItem.EnrollStatus = EnrollStatus.ConfirmIntoGroupFailed;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,6 +93,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
await _readingConsistentClinicalDataRepository.BatchDeleteNoTrackingAsync(t => consistentSubjectIdList.Contains(t.SubjectId));
|
await _readingConsistentClinicalDataRepository.BatchDeleteNoTrackingAsync(t => consistentSubjectIdList.Contains(t.SubjectId));
|
||||||
|
|
||||||
await _readingConsistentClinicalDataRepository.SaveChangesAsync();
|
await _readingConsistentClinicalDataRepository.SaveChangesAsync();
|
||||||
|
|
||||||
return ResponseOutput.Ok();
|
return ResponseOutput.Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue