Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
commit
69fd8ec123
|
@ -585,7 +585,6 @@ namespace IRaCIS.Core.API.Controllers
|
||||||
var etcCheckList = new List<CheckViewModel>();
|
var etcCheckList = new List<CheckViewModel>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region MiniExcel 需要自己验证数据格式规范
|
#region MiniExcel 需要自己验证数据格式规范
|
||||||
|
|
||||||
//if (fileName.EndsWith(".csv"))
|
//if (fileName.EndsWith(".csv"))
|
||||||
|
|
|
@ -365,6 +365,11 @@
|
||||||
IPLimit限流 启动服务
|
IPLimit限流 启动服务
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:IRaCIS.Core.API.JSONTimeZoneConverter">
|
||||||
|
<summary>
|
||||||
|
序列化,反序列化的时候,处理时间 时区转换
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="M:IRaCIS.Core.API.NullToEmptyStringResolver.CreateProperties(System.Type,Newtonsoft.Json.MemberSerialization)">
|
<member name="M:IRaCIS.Core.API.NullToEmptyStringResolver.CreateProperties(System.Type,Newtonsoft.Json.MemberSerialization)">
|
||||||
<summary>
|
<summary>
|
||||||
创建属性
|
创建属性
|
||||||
|
@ -380,6 +385,11 @@
|
||||||
<param name="httpContext"></param>
|
<param name="httpContext"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:TimeZoneAdjustmentMiddleware">
|
||||||
|
<summary>
|
||||||
|
废弃,没用
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="T:ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt.CustomHSJWTService">
|
<member name="T:ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt.CustomHSJWTService">
|
||||||
<summary>
|
<summary>
|
||||||
对称可逆加密
|
对称可逆加密
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Primitives;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 废弃,没用
|
||||||
|
/// </summary>
|
||||||
|
public class TimeZoneAdjustmentMiddleware
|
||||||
|
{
|
||||||
|
private readonly RequestDelegate _next;
|
||||||
|
|
||||||
|
public TimeZoneAdjustmentMiddleware(RequestDelegate next)
|
||||||
|
{
|
||||||
|
_next = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Invoke(HttpContext context)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(context.Request.ContentType))
|
||||||
|
{
|
||||||
|
// 请求没有内容体,可能是一个没有请求体的请求,比如 GET 请求
|
||||||
|
await _next(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var timeZoneId = "Asia/Shanghai"; // 客户端默认时区
|
||||||
|
|
||||||
|
var timeZoneIdHeaderValue = context.Request.Headers["TimeZoneId"];
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(timeZoneIdHeaderValue))
|
||||||
|
{
|
||||||
|
timeZoneId = timeZoneIdHeaderValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 处理 JSON 请求体中的时间字段
|
||||||
|
if (context.Request.ContentType.StartsWith("application/json"))
|
||||||
|
{
|
||||||
|
var requestBody = await new StreamReader(context.Request.Body).ReadToEndAsync();
|
||||||
|
|
||||||
|
// 使用 JSON.NET 或 System.Text.Json 解析 JSON 请求体
|
||||||
|
// 假设请求体中有一个名为 "dateTime" 的时间字段
|
||||||
|
dynamic jsonData = JsonConvert.DeserializeObject(requestBody);
|
||||||
|
|
||||||
|
if (jsonData.dateTime != null)
|
||||||
|
{
|
||||||
|
if (DateTime.TryParse((string)jsonData.dateTime, out DateTime dateTime))
|
||||||
|
{
|
||||||
|
// 将 JSON 请求体中的时间字段转换为服务器时区的时间
|
||||||
|
var serverTime = TimeZoneInfo.ConvertTime(dateTime, timeZone);
|
||||||
|
jsonData.dateTime = serverTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将修改后的 JSON 请求体重新写入请求流中
|
||||||
|
var jsonBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(jsonData));
|
||||||
|
context.Request.Body = new MemoryStream(jsonBytes);
|
||||||
|
context.Request.ContentLength = jsonBytes.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 处理 URL 表单参数
|
||||||
|
var modifiedQuery = new Dictionary<string, StringValues>();
|
||||||
|
|
||||||
|
foreach (var key in context.Request.Query.Keys)
|
||||||
|
{
|
||||||
|
if (DateTime.TryParse(context.Request.Query[key], out DateTime dateTime))
|
||||||
|
{
|
||||||
|
// 将 URL 表单参数中的时间转换为服务器时区的时间
|
||||||
|
var serverTime = TimeZoneInfo.ConvertTime(dateTime, timeZone);
|
||||||
|
modifiedQuery[key] = new StringValues(serverTime.ToString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
modifiedQuery[key] = context.Request.Query[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Request.Query = new QueryCollection(modifiedQuery);
|
||||||
|
|
||||||
|
// 处理Form请求体中的参数
|
||||||
|
if (context.Request.HasFormContentType)
|
||||||
|
{
|
||||||
|
var modifiedForm = new Dictionary<string, StringValues>();
|
||||||
|
|
||||||
|
foreach (var key in context.Request.Form.Keys)
|
||||||
|
{
|
||||||
|
if (DateTime.TryParse(context.Request.Form[key], out DateTime dateTime))
|
||||||
|
{
|
||||||
|
// 将请求体中的时间转换为服务器时区的时间
|
||||||
|
var serverTime = TimeZoneInfo.ConvertTime(dateTime, timeZone);
|
||||||
|
modifiedForm[key] = new StringValues(serverTime.ToString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
modifiedForm[key] = context.Request.Form[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var newFormCollection = new FormCollection(modifiedForm);
|
||||||
|
|
||||||
|
// 将新的表单集合设置回请求对象
|
||||||
|
context.Request.Form = newFormCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
await _next(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -26,7 +26,7 @@ using IRaCIS.Application.Services.BackGroundJob;
|
||||||
using LogDashboard;
|
using LogDashboard;
|
||||||
using OfficeOpenXml.Utils;
|
using OfficeOpenXml.Utils;
|
||||||
|
|
||||||
|
Console.WriteLine("这是一个示例文本,示例文本中会出现示例多次。".Replace("示例", "替换"));
|
||||||
|
|
||||||
#region 获取环境变量
|
#region 获取环境变量
|
||||||
//以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数)
|
//以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数)
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Converters;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.API
|
|
||||||
{
|
|
||||||
public class JSONCustomDateConverter : DateTimeConverterBase
|
|
||||||
{
|
|
||||||
private TimeZoneInfo _timeZoneInfo;
|
|
||||||
private string _dateFormat;
|
|
||||||
|
|
||||||
private IUserInfo _userInfo;
|
|
||||||
public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo, IUserInfo userInfo)
|
|
||||||
{
|
|
||||||
_dateFormat = dateFormat;
|
|
||||||
_timeZoneInfo = timeZoneInfo;
|
|
||||||
|
|
||||||
_userInfo = userInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static readonly TimeZoneInfo ChinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
|
|
||||||
|
|
||||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
if (reader.ValueType == typeof(DateTime))
|
|
||||||
{
|
|
||||||
DateTime dateTime = (DateTime)reader.Value;
|
|
||||||
|
|
||||||
var zoneTime = TimeZoneInfo.ConvertTime(dateTime, ChinaTimeZone);
|
|
||||||
|
|
||||||
return zoneTime;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return reader.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
|
||||||
{
|
|
||||||
var timeZoneId = _userInfo.TimeZoneId;
|
|
||||||
|
|
||||||
//var needConvertUtcDateTime = Convert.ToDateTime(value);
|
|
||||||
|
|
||||||
|
|
||||||
//var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
|
|
||||||
|
|
||||||
|
|
||||||
//var dateTimeOffset = new DateTimeOffset(needConvertUtcDateTime);
|
|
||||||
|
|
||||||
//var time = TimeZoneInfo.ConvertTimeFromUtc(needConvertUtcDateTime, tz).ToString(_dateFormat);
|
|
||||||
|
|
||||||
//writer.WriteValue(time);
|
|
||||||
//writer.Flush();
|
|
||||||
|
|
||||||
|
|
||||||
if (value is DateTime dateTime)
|
|
||||||
{
|
|
||||||
DateTime chinaTime = TimeZoneInfo.ConvertTime(dateTime, ChinaTimeZone);
|
|
||||||
writer.WriteValue(chinaTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
using IRaCIS.Core.Domain.Share;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Converters;
|
||||||
|
using StackExchange.Redis;
|
||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.API
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 序列化,反序列化的时候,处理时间 时区转换
|
||||||
|
/// </summary>
|
||||||
|
public class JSONTimeZoneConverter : DateTimeConverterBase
|
||||||
|
{
|
||||||
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
|
|
||||||
|
private readonly TimeZoneInfo _clientTimeZone;
|
||||||
|
public JSONTimeZoneConverter(IHttpContextAccessor httpContextAccessor)
|
||||||
|
{
|
||||||
|
_httpContextAccessor = httpContextAccessor;
|
||||||
|
|
||||||
|
//默认是UTC
|
||||||
|
//var timeZoneId = "Etc/UTC";
|
||||||
|
var timeZoneId = "Asia/Shanghai";
|
||||||
|
|
||||||
|
var timeZoneIdHeader = _httpContextAccessor?.HttpContext?.Request?.Headers["TimeZoneId"];
|
||||||
|
|
||||||
|
if (timeZoneIdHeader is not null && !string.IsNullOrEmpty(timeZoneIdHeader.Value))
|
||||||
|
{
|
||||||
|
timeZoneId = timeZoneIdHeader.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
_clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CanConvert(Type objectType)
|
||||||
|
{
|
||||||
|
// 仅支持 DateTime 类型的转换
|
||||||
|
return objectType == typeof(DateTime)|| objectType == typeof(DateTime?);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
DateTime? nullableDateTime = reader.Value as DateTime?;
|
||||||
|
|
||||||
|
if (nullableDateTime != null && nullableDateTime.HasValue)
|
||||||
|
{
|
||||||
|
var dateTime = (DateTime)reader.Value;
|
||||||
|
|
||||||
|
// 将客户端时间转换为服务器时区的时间
|
||||||
|
var serverZoneTime = TimeZoneInfo.ConvertTime(dateTime, _clientTimeZone, TimeZoneInfo.Local);
|
||||||
|
|
||||||
|
return serverZoneTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
DateTime? nullableDateTime = value as DateTime?;
|
||||||
|
|
||||||
|
if (nullableDateTime != null && nullableDateTime.HasValue)
|
||||||
|
{
|
||||||
|
//第一个参数默认使用系统本地时区 也就是应用服务器的时区
|
||||||
|
DateTime clientZoneTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, _clientTimeZone);
|
||||||
|
writer.WriteValue(clientZoneTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writer.WriteNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,7 +10,8 @@ namespace IRaCIS.Core.API
|
||||||
{
|
{
|
||||||
public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder, IServiceCollection services)
|
public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder, IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddScoped<DateTimeConverterBase, JSONCustomDateConverter>();
|
services.AddHttpContextAccessor();
|
||||||
|
services.AddScoped<JSONTimeZoneConverter>();
|
||||||
|
|
||||||
builder.AddNewtonsoftJson(options =>
|
builder.AddNewtonsoftJson(options =>
|
||||||
{
|
{
|
||||||
|
@ -24,8 +25,11 @@ namespace IRaCIS.Core.API
|
||||||
// 设置时间格式
|
// 设置时间格式
|
||||||
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
|
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
|
||||||
|
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
|
||||||
|
|
||||||
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
|
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
|
||||||
//options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONCustomDateConverter>());
|
|
||||||
|
//options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONTimeZoneConverter>());
|
||||||
|
|
||||||
//IsoDateTimeConverter
|
//IsoDateTimeConverter
|
||||||
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
|
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
|
||||||
|
|
|
@ -51,6 +51,10 @@
|
||||||
"FromEmail": "IRC@extimaging.com",
|
"FromEmail": "IRC@extimaging.com",
|
||||||
"FromName": "IRC",
|
"FromName": "IRC",
|
||||||
"AuthorizationCode": "ExtImg@2022",
|
"AuthorizationCode": "ExtImg@2022",
|
||||||
"SiteUrl": "http://irc.extimaging.com/login"
|
"SiteUrl": "http://irc.extimaging.com/login",
|
||||||
|
"CompanyName": "Extensive Imaging",
|
||||||
|
"CompanyNameCN": "上海展影医疗科技有限公司",
|
||||||
|
"CompanyShortName": "Extensive Imaging",
|
||||||
|
"CompanyShortNameCN": "展影医疗"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,12 @@
|
||||||
"FromName": "Test_IRC",
|
"FromName": "Test_IRC",
|
||||||
"AuthorizationCode": "SHzyyl2021",
|
"AuthorizationCode": "SHzyyl2021",
|
||||||
|
|
||||||
"SiteUrl": "http://irc.test.extimaging.com/login"
|
"SiteUrl": "http://irc.test.extimaging.com/login",
|
||||||
|
|
||||||
|
"CompanyName": "Extensive Imaging",
|
||||||
|
"CompanyNameCN": "上海展影医疗科技有限公司",
|
||||||
|
"CompanyShortName": "Extensive Imaging",
|
||||||
|
"CompanyShortNameCN": "展影医疗"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,11 @@
|
||||||
"Host": "smtp.qiye.aliyun.com",
|
"Host": "smtp.qiye.aliyun.com",
|
||||||
"FromEmail": "test@extimaging.com",
|
"FromEmail": "test@extimaging.com",
|
||||||
"FromName": "Test_IRC",
|
"FromName": "Test_IRC",
|
||||||
"AuthorizationCode": "SHzyyl2021"
|
"AuthorizationCode": "SHzyyl2021",
|
||||||
|
"CompanyName": "Elevate Imaging",
|
||||||
|
"CompanyNameCN": "上海展影医疗科技有限公司",
|
||||||
|
"CompanyShortName": "Elevate Imaging",
|
||||||
|
"CompanyShortNameCN": "展影医疗"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,11 @@
|
||||||
"FromEmail": "uat@extimaging.com",
|
"FromEmail": "uat@extimaging.com",
|
||||||
"FromName": "UAT_IRC",
|
"FromName": "UAT_IRC",
|
||||||
"AuthorizationCode": "SHzyyl2021",
|
"AuthorizationCode": "SHzyyl2021",
|
||||||
"SiteUrl": "http://irc.uat.extimaging.com/login"
|
"SiteUrl": "http://irc.uat.extimaging.com/login",
|
||||||
|
"CompanyName": "Extensive Imaging",
|
||||||
|
"CompanyNameCN": "上海展影医疗科技有限公司",
|
||||||
|
"CompanyShortName": "Extensive Imaging",
|
||||||
|
"CompanyShortNameCN": "展影医疗"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
尊敬的 {0} ,您好:
|
尊敬的 {0} ,您好:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
展影医疗为您添加了账户,账户信息如下:
|
{company abbreviation}为您添加了账户,账户信息如下:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
首次登陆前,请通过该链接修改您的账户信息:
|
首次登陆前,请通过该链接修改您的账户信息:
|
||||||
<a href='{3}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{3}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
初始化账号信息
|
初始化账号信息
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,20 +11,20 @@
|
||||||
Dear {0} ,
|
Dear {0} ,
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Extimaging has added an account for you. The account information is as follows:
|
{company abbreviation} has created an account for you. The account information is as follows:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
<div>
|
<div>
|
||||||
User name: {1}
|
User ID: {1}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Role: {2}
|
Role: {2}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Before logging in for the first time, please modify your account information by this link:
|
Before logging in for the first time, please modify the account information through this link:
|
||||||
<a href='{3}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{3}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
Initialize the account information
|
Initialize account information
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
尊敬的 {0} ,您好:
|
尊敬的 {0} ,您好:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
展影医疗将您的账户密码已重置,账户信息如下:
|
{company abbreviation}将您的账户密码已重置,账户信息如下:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,12 +11,12 @@
|
||||||
Dear {0} ,
|
Dear {0} ,
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Extimaging has reset your account password, and the account information is as follows:
|
{company abbreviation} has reset your account password, and the account information is as follows:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
<div>
|
<div>
|
||||||
User name: {1}
|
User ID: {1}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Role: {2}
|
Role: {2}
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
Dear:
|
Dear:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Thank you for using Extensive Imaging Cloud System.
|
Thank you for using {company abbreviation} Cloud System.
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
{0}。
|
{0}。
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
尊敬的 {0} ,您好:
|
尊敬的 {0} ,您好:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目阅片相关工作。
|
{company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目阅片相关工作。
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
系统登录地址:
|
系统登录地址:
|
||||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
点击跳转
|
点击跳转
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
Dear {0},
|
Dear {0},
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||||
As the service provider of {1} trial(Protocol ID is {2}), Extensive Imaging invites you to participate in the independent assessment work of this trial.
|
{company abbreviation} invites you to participate in the IRC work of a trial ({1} , {2}).
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
This project adopts electronic workflow. The system and your account information are as follows:
|
Your account information is as follows:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -28,20 +28,23 @@
|
||||||
Study name: {1}
|
Study name: {1}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
User name: {4}
|
User ID: {4}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Role: {5}
|
Role: {5}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Login URL: {6}
|
Login URL:
|
||||||
|
<a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
|
Click to login
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
尊敬的 {0} ,您好:
|
尊敬的 {0} ,您好:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
|
{company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
首次登陆前,请通过该链接修改您的账户信息:
|
首次登陆前,请通过该链接修改您的账户信息:
|
||||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
初始化账号信息
|
初始化账号信息
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
Dear {0},
|
Dear {0},
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
{company abbreviation} invites you to participate in the IRC work of a trial ({1}, {2}).
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
This project adopts electronic workflow. The system and your account information are as follows:
|
Your account information is as follows:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -28,15 +28,15 @@
|
||||||
Study name: {1}
|
Study name: {1}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
User name: {4}
|
User ID: {4}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Role: {5}
|
Role: {5}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Before logging in for the first time, please modify your account information by this link:
|
Before logging in for the first time, please modify the account information through this link:
|
||||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
Initialize the account information
|
Initialize account information
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
尊敬的 {0} ,您好:
|
尊敬的 {0} ,您好:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
您好, 您填写的中心调研表被驳回,详细信息如下:
|
您填写的中心调研表被驳回,详细信息如下:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
Dear {0} ,
|
Dear {0} ,
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Hello, the center survey form you filled in has been rejected. The details are as follows:
|
The site survey form you filled in has been rejected. The details are as follows:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
尊敬的 {0} ,您好:
|
尊敬的 {0} ,您好:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目相关工作,欢迎您提供指导和建议,非常感谢!
|
{company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目相关工作,欢迎您提供指导和建议,非常感谢!
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
系统登录地址:
|
系统登录地址:
|
||||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{6}' style='margin-left:5px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
点击跳转
|
点击跳转
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
Dear {0},
|
Dear {0},
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
|
||||||
As the service provider of {1} trial (Protocol ID is {2}), Extensive Imaging invites you to participate in related work of this trial.
|
{company abbreviation} invites you to participate in the IRC work of a trial ({1}, {2}).
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
This project adopts electronic workflow. The system and your account information are as follows:
|
Your account information is as follows:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -28,20 +28,23 @@
|
||||||
Study name: {1}
|
Study name: {1}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
User name: {4}
|
User ID: {4}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Role: {5}
|
Role: {5}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Login URL: {6}
|
Login URL:
|
||||||
|
<a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
|
Click to login
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
尊敬的 {0} ,您好:
|
尊敬的 {0} ,您好:
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
|
{company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
首次登陆前,请通过该链接修改您的账户信息:
|
首次登陆前,请通过该链接修改您的账户信息:
|
||||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
初始化账号信息
|
初始化账号信息
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,10 +11,10 @@
|
||||||
Dear {0},
|
Dear {0},
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
{company abbreviation} invites you to participate in the IRC work of a trial ({1}, {2}).
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
This project adopts electronic workflow. The system and your account information are as follows:
|
Your account information is as follows:
|
||||||
</div>
|
</div>
|
||||||
<span style="color: #00D1B2"></span>
|
<span style="color: #00D1B2"></span>
|
||||||
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
|
||||||
|
@ -28,14 +28,14 @@
|
||||||
Study name: {1}
|
Study name: {1}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
User name: {4}
|
User ID: {4}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Role: {5}
|
Role: {5}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Before logging in for the first time, please modify your account information by this link:
|
Before logging in for the first time, please modify the account information through this link:
|
||||||
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
<a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
|
||||||
Initialize the account information
|
Initialize the account information
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||||
<div style='padding-top: 20px;'>
|
<div style='padding-top: 20px;'>
|
||||||
<div style='line-height: 40px;font-size: 18px'>
|
<div style='line-height: 40px;font-size: 18px'>
|
||||||
Hello {0},
|
{0}您好,
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
感谢您使用展影云平台。
|
感谢您使用展影云平台。
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>祝您顺利!</div>
|
<div>祝您顺利!</div>
|
||||||
<div style="font-size: 14px;">上海展影医疗科技有限公司</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,21 +8,21 @@
|
||||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||||
<div style='padding-top: 20px;'>
|
<div style='padding-top: 20px;'>
|
||||||
<div style='line-height: 40px;font-size: 18px'>
|
<div style='line-height: 40px;font-size: 18px'>
|
||||||
Hello {0},
|
Dear {0},
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Thank you for using Extensive Imaging’s cloud system!
|
{1}
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
{1}, and the verification code is <span style="font-weight:bold">{2}</span>.
|
The verification code is <span style="font-weight:bold">{2}</span>.
|
||||||
</div>
|
</div>
|
||||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||||
Please enter this verification code within 3 minutes for subsequent operations.
|
This code will expire in 3 minutes.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||||
<div>Best regards,</div>
|
<div>Best regards,</div>
|
||||||
<div style="font-size: 14px;">Extensive Imaging</div>
|
<div style="font-size: 14px;">{company}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,6 +3,7 @@ using DocumentFormat.OpenXml.Presentation;
|
||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
using DocumentFormat.OpenXml.Spreadsheet;
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
using IRaCIS.Application.Interfaces;
|
using IRaCIS.Application.Interfaces;
|
||||||
|
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Contracts.DTO;
|
using IRaCIS.Core.Application.Contracts.DTO;
|
||||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
|
@ -59,7 +60,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = await _trialUseRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
var list = await _trialUseRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||||||
.WhereIf(param.UserTypeId != null, t => t.User.UserTypeId == param.UserTypeId)
|
.WhereIf(param.UserTypeId != null, t => t.User.UserTypeId == param.UserTypeId)
|
||||||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserName), t => t.User.UserName.Contains(param.UserName))
|
.WhereIf(!string.IsNullOrWhiteSpace(param.UserName), t => t.User.UserName.Contains(param.UserName))
|
||||||
|
|
||||||
|
@ -70,8 +71,10 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
t => (t.User.FullName).Contains(param.UserRealName))
|
t => (t.User.FullName).Contains(param.UserRealName))
|
||||||
.ProjectTo<TrialMaintenanceDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
.ProjectTo<TrialMaintenanceDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialMaintenanceDTO));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialMaintenanceDTO));
|
||||||
|
|
||||||
|
@ -100,7 +103,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = await _trialSiteUserRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
var list = await _trialSiteUserRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||||||
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||||||
.WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.Site.SiteName.Contains(param.SiteName))
|
.WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.Site.SiteName.Contains(param.SiteName))
|
||||||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName),
|
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName),
|
||||||
|
@ -114,7 +117,12 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
.ProjectTo<SiteUserExportDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
.ProjectTo<SiteUserExportDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||||
|
|
||||||
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SiteUserExportDTO));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SiteUserExportDTO));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -161,13 +169,14 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
.WhereIf(!string.IsNullOrEmpty(queryParam.OrganizationName), t => t.OrganizationName.Contains(queryParam.OrganizationName))
|
.WhereIf(!string.IsNullOrEmpty(queryParam.OrganizationName), t => t.OrganizationName.Contains(queryParam.OrganizationName))
|
||||||
.ProjectTo<TrialSiteUserSummaryDto>(_mapper.ConfigurationProvider);
|
.ProjectTo<TrialSiteUserSummaryDto>(_mapper.ConfigurationProvider);
|
||||||
|
|
||||||
data.List = await query.ToListAsync();
|
var list = await query.ToListAsync();
|
||||||
|
data.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
|
|
||||||
|
|
||||||
var exportInfo = data;
|
var exportInfo = data;
|
||||||
|
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserSummary_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialSiteUserSummaryDto));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserSummary_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialSiteUserSummaryDto));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -230,8 +239,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == visitSearchDTO.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == visitSearchDTO.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO));
|
||||||
|
@ -280,8 +290,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == challengeQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == challengeQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCImageChanllengeList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCChanllengeExportDto));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCImageChanllengeList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCChanllengeExportDto));
|
||||||
}
|
}
|
||||||
|
@ -317,8 +328,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO));
|
||||||
|
|
||||||
|
@ -425,8 +437,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialSubjectProgressList_Export, exportInfo, /*"", */_commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectProgressDto));
|
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialSubjectProgressList_Export, exportInfo, /*"", */_commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectProgressDto));
|
||||||
|
|
||||||
|
@ -491,7 +504,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoryStream2 = new MemoryStream();
|
var memoryStream2 = new MemoryStream();
|
||||||
wb.Write(memoryStream2,true);
|
wb.Write(memoryStream2, true);
|
||||||
memoryStream2.Seek(0, SeekOrigin.Begin);
|
memoryStream2.Seek(0, SeekOrigin.Begin);
|
||||||
|
|
||||||
return new FileStreamResult(memoryStream2, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
return new FileStreamResult(memoryStream2, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||||||
|
@ -565,8 +578,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyUploadMonitor_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyMonitorExportDto));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyUploadMonitor_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyMonitorExportDto));
|
||||||
|
@ -601,8 +615,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectReadingPeriodList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadPeriodExportDto));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectReadingPeriodList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadPeriodExportDto));
|
||||||
|
|
||||||
|
@ -690,8 +705,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyExportDTO));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyExportDTO));
|
||||||
}
|
}
|
||||||
|
@ -729,8 +745,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == checkQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == checkQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectVisitCheckList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PMKCheckEXportDTO));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectVisitCheckList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PMKCheckEXportDTO));
|
||||||
}
|
}
|
||||||
|
@ -780,8 +797,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadingTaskExportDto));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadingTaskExportDto));
|
||||||
}
|
}
|
||||||
|
@ -831,8 +849,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReReadingTaskExportDto));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReReadingTaskExportDto));
|
||||||
}
|
}
|
||||||
|
@ -873,8 +892,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialMedicalReviewList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TaskMedicalReviewExportDto));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialMedicalReviewList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TaskMedicalReviewExportDto));
|
||||||
}
|
}
|
||||||
|
@ -957,8 +977,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSelfAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SelftAnalysisExport));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSelfAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SelftAnalysisExport));
|
||||||
}
|
}
|
||||||
|
@ -1060,8 +1081,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
exportInfo.CriterionName = await _repository.Where<ReadingQuestionCriterionTrial>(u => u.TrialId == queryVisitTask.TrialId && u.IsConfirm && u.Id == queryVisitTask.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
||||||
exportInfo.List = newList;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(newList, _userInfo.TimeZoneId); ;
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialGroupAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(GroupAnalysisExport));
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialGroupAnalysisList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(GroupAnalysisExport));
|
||||||
}
|
}
|
||||||
|
@ -1145,7 +1167,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
{
|
{
|
||||||
foreach (var item in resultList)
|
foreach (var item in resultList)
|
||||||
{
|
{
|
||||||
item.IsGenerateJudge = list.Where(t => t.ReadingCategory == ReadingCategory.Judge && t.SubjectCode == item.SubjectCode && t.VisitTaskNum>item.VisitTaskNum
|
item.IsGenerateJudge = list.Where(t => t.ReadingCategory == ReadingCategory.Judge && t.SubjectCode == item.SubjectCode && t.VisitTaskNum > item.VisitTaskNum
|
||||||
).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault()?.JudgeArmEnum == item.ArmEnum ? true : false;
|
).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault()?.JudgeArmEnum == item.ArmEnum ? true : false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1213,8 +1235,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
//处理裁判标记
|
//处理裁判标记
|
||||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.OverallTumorEvaluation_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(OverallTumorEvaluationExport), criterion.CriterionType);
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.OverallTumorEvaluation_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(OverallTumorEvaluationExport), criterion.CriterionType);
|
||||||
|
@ -1272,8 +1295,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
//处理裁判标记
|
//处理裁判标记
|
||||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||||
|
|
||||||
exportInfo.List = list;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1EvaluationOfTumorEfficacyExport), criterion.CriterionType);
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1EvaluationOfTumorEfficacyExport), criterion.CriterionType);
|
||||||
|
@ -1305,7 +1329,7 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
{
|
{
|
||||||
|
|
||||||
//每次查询必须是单标准的
|
//每次查询必须是单标准的
|
||||||
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName,t.ArbitrationRule }).FirstOrDefaultAsync();
|
var criterion = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstOrDefaultAsync();
|
||||||
|
|
||||||
var query = _repository.Where<VisitTask>(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
var query = _repository.Where<VisitTask>(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||||||
|
|
||||||
|
@ -1363,8 +1387,9 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
//处理裁判标记
|
//处理裁判标记
|
||||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||||
exportInfo.List = exportList;
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(exportList, _userInfo.TimeZoneId);
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1DetailedOfEvaluatedLesionExport), criterion.CriterionType);
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1DetailedOfEvaluatedLesionExport), criterion.CriterionType);
|
||||||
|
|
||||||
|
@ -1396,8 +1421,10 @@ namespace IRaCIS.Core.Application.Service.Common
|
||||||
|
|
||||||
//处理裁判标记
|
//处理裁判标记
|
||||||
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
list = DealJudgeMark(criterion.ArbitrationRule, list);
|
||||||
exportInfo.List = exportList;
|
|
||||||
|
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(exportList, _userInfo.TimeZoneId); ;
|
||||||
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
exportInfo.IsEn_US = _userInfo.IsEn_Us;
|
||||||
|
exportInfo.ClientZoneId = _userInfo.TimeZoneId;
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PCWG3DetailedOfEvaluatedLesionExport), criterion.CriterionType);
|
return await ExcelExportHelper.DataExportAsync(StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PCWG3DetailedOfEvaluatedLesionExport), criterion.CriterionType);
|
||||||
|
|
||||||
|
|
|
@ -164,19 +164,19 @@ namespace IRaCIS.Core.Application.Service
|
||||||
VerifyExp = t => t.Code == addOrEditInternationalization.Code && t.InternationalizationType == addOrEditInternationalization.InternationalizationType,
|
VerifyExp = t => t.Code == addOrEditInternationalization.Code && t.InternationalizationType == addOrEditInternationalization.InternationalizationType,
|
||||||
|
|
||||||
VerifyMsg = $"该类型已有{addOrEditInternationalization.Code}名称的国际化标识",
|
VerifyMsg = $"该类型已有{addOrEditInternationalization.Code}名称的国际化标识",
|
||||||
IsVerify = internationalizationType == 1
|
IsVerify = true /*internationalizationType == 1*/
|
||||||
};
|
};
|
||||||
|
|
||||||
//前端验证标识重复与否
|
//前端验证标识重复与否
|
||||||
var verifyExp2 = new EntityVerifyExp<Internationalization>()
|
//var verifyExp2 = new EntityVerifyExp<Internationalization>()
|
||||||
{
|
//{
|
||||||
VerifyExp = t => t.Code == addOrEditInternationalization.Code && t.InternationalizationType == addOrEditInternationalization.InternationalizationType && t.Description == addOrEditInternationalization.Description,
|
// VerifyExp = t => t.Code == addOrEditInternationalization.Code && t.InternationalizationType == addOrEditInternationalization.InternationalizationType && t.Description == addOrEditInternationalization.Description,
|
||||||
|
|
||||||
VerifyMsg = $"该类型已有{addOrEditInternationalization.Description}下的{addOrEditInternationalization.Code}名称的国际化标识",
|
// VerifyMsg = $"该类型已有{addOrEditInternationalization.Description}下的{addOrEditInternationalization.Code}名称的国际化标识",
|
||||||
IsVerify = internationalizationType == 0
|
// IsVerify = internationalizationType == 0
|
||||||
};
|
//};
|
||||||
|
|
||||||
var entity = await _internationalizationRepository.InsertOrUpdateAsync(addOrEditInternationalization, true, verifyExp1, verifyExp2);
|
var entity = await _internationalizationRepository.InsertOrUpdateAsync(addOrEditInternationalization, true, verifyExp1/*, verifyExp2*/);
|
||||||
|
|
||||||
if (addOrEditInternationalization.InternationalizationType == 1)
|
if (addOrEditInternationalization.InternationalizationType == 1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,7 @@ using AutoMapper;
|
||||||
using IRaCIS.Application.Contracts;
|
using IRaCIS.Application.Contracts;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Medallion.Threading;
|
using Medallion.Threading;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace IRaCIS.Application.Services
|
namespace IRaCIS.Application.Services
|
||||||
{
|
{
|
||||||
|
@ -82,6 +83,13 @@ namespace IRaCIS.Application.Services
|
||||||
_distributedLockProvider = distributedLockProvider;
|
_distributedLockProvider = distributedLockProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private string ReplaceCompanyName(string needDealtxt)
|
||||||
|
{
|
||||||
|
return needDealtxt.Replace("{company}", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyName : _systemEmailConfig.CompanyNameCN)
|
||||||
|
.Replace("{{company abbreviation}}", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN);
|
||||||
|
}
|
||||||
|
|
||||||
//重置邮箱
|
//重置邮箱
|
||||||
public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode)
|
public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode)
|
||||||
{
|
{
|
||||||
|
@ -112,7 +120,7 @@ namespace IRaCIS.Application.Services
|
||||||
var templateInfo = SourceReader.ReadToEnd();
|
var templateInfo = SourceReader.ReadToEnd();
|
||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
|
|
||||||
//---尊敬的
|
//---尊敬的
|
||||||
_localizer["Mail_Dear", userName],
|
_localizer["Mail_Dear", userName],
|
||||||
|
@ -179,7 +187,7 @@ namespace IRaCIS.Application.Services
|
||||||
var templateInfo = SourceReader.ReadToEnd();
|
var templateInfo = SourceReader.ReadToEnd();
|
||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
"",
|
"",
|
||||||
//---您正在进行邮箱重置密码操作
|
//---您正在进行邮箱重置密码操作
|
||||||
_localizer["Mail_ResettingPassword"],
|
_localizer["Mail_ResettingPassword"],
|
||||||
|
@ -247,7 +255,7 @@ namespace IRaCIS.Application.Services
|
||||||
var templateInfo = SourceReader.ReadToEnd();
|
var templateInfo = SourceReader.ReadToEnd();
|
||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
"",
|
"",
|
||||||
//---您正在参与展影医疗IRC项目
|
//---您正在参与展影医疗IRC项目
|
||||||
_localizer["Mail_IRCProject"],
|
_localizer["Mail_IRCProject"],
|
||||||
|
@ -314,7 +322,7 @@ namespace IRaCIS.Application.Services
|
||||||
var templateInfo = SourceReader.ReadToEnd();
|
var templateInfo = SourceReader.ReadToEnd();
|
||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
"",
|
"",
|
||||||
//---您正在参与展影医疗IRC项目中心调研工作
|
//---您正在参与展影医疗IRC项目中心调研工作
|
||||||
_localizer["Mail_CenterResearchReminder"],
|
_localizer["Mail_CenterResearchReminder"],
|
||||||
|
@ -403,7 +411,7 @@ namespace IRaCIS.Application.Services
|
||||||
var templateInfo = SourceReader.ReadToEnd();
|
var templateInfo = SourceReader.ReadToEnd();
|
||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
sysUserInfo.FullName,
|
sysUserInfo.FullName,
|
||||||
sysUserInfo.UserName,
|
sysUserInfo.UserName,
|
||||||
sysUserInfo.UserTypeRole.UserTypeShortName,
|
sysUserInfo.UserTypeRole.UserTypeShortName,
|
||||||
|
@ -450,7 +458,7 @@ namespace IRaCIS.Application.Services
|
||||||
var templateInfo = SourceReader.ReadToEnd();
|
var templateInfo = SourceReader.ReadToEnd();
|
||||||
|
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
sysUserInfo.FullName,
|
sysUserInfo.FullName,
|
||||||
sysUserInfo.UserName,
|
sysUserInfo.UserName,
|
||||||
sysUserInfo.UserTypeRole.UserTypeShortName,
|
sysUserInfo.UserTypeRole.UserTypeShortName,
|
||||||
|
@ -512,7 +520,7 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}";
|
var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}";
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
sysUserInfo.FullName,
|
sysUserInfo.FullName,
|
||||||
trialInfo.ExperimentName,
|
trialInfo.ExperimentName,
|
||||||
trialInfo.ResearchProgramNo,
|
trialInfo.ResearchProgramNo,
|
||||||
|
@ -574,7 +582,7 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}";
|
var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}";
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
sysUserInfo.FullName,
|
sysUserInfo.FullName,
|
||||||
trialInfo.ExperimentName,
|
trialInfo.ExperimentName,
|
||||||
trialInfo.ResearchProgramNo,
|
trialInfo.ResearchProgramNo,
|
||||||
|
@ -696,7 +704,7 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}";
|
var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}";
|
||||||
|
|
||||||
builder.HtmlBody = string.Format(templateInfo,
|
builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo),
|
||||||
sysUserInfo.FullName,
|
sysUserInfo.FullName,
|
||||||
trialInfo.ExperimentName,
|
trialInfo.ExperimentName,
|
||||||
trialInfo.ResearchProgramNo,
|
trialInfo.ResearchProgramNo,
|
||||||
|
|
|
@ -6,6 +6,7 @@ using MiniExcelLibs.Attributes;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using IRaCIS.Core.Application.Contracts;
|
using IRaCIS.Core.Application.Contracts;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace IRaCIS.Application.Contracts
|
namespace IRaCIS.Application.Contracts
|
||||||
{
|
{
|
||||||
|
@ -119,10 +120,11 @@ namespace IRaCIS.Application.Contracts
|
||||||
public class ExcelExportInfo : TrialSelectDTO
|
public class ExcelExportInfo : TrialSelectDTO
|
||||||
{
|
{
|
||||||
|
|
||||||
public string CurrentTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
public string CurrentTime => TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById(ClientZoneId)).ToString("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
public bool IsEn_US { get; set; }
|
public bool IsEn_US { get; set; }
|
||||||
|
|
||||||
|
public string ClientZoneId { get; set; } = string.Empty;
|
||||||
public object List { get; set; }
|
public object List { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,16 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
public string AuthorizationCode { get; set; }
|
public string AuthorizationCode { get; set; }
|
||||||
|
|
||||||
public string SiteUrl { get; set; }
|
public string SiteUrl { get; set; }
|
||||||
|
|
||||||
|
public string CompanyName { get; set; }
|
||||||
|
|
||||||
|
public string CompanyNameCN { get; set; }
|
||||||
|
|
||||||
|
public string CompanyShortName { get; set; }
|
||||||
|
|
||||||
|
public string CompanyShortNameCN { get; set; }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -278,8 +278,8 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
return timeZoneId.Value;
|
return timeZoneId.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "Etc/UTC";
|
//return "Etc/UTC";
|
||||||
//return "Asia/Shanghai";
|
return "Asia/Shanghai";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
//using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
//using Microsoft.AspNetCore.Mvc;
|
||||||
|
//using Newtonsoft.Json;
|
||||||
|
//using System;
|
||||||
|
//using System.Collections.Generic;
|
||||||
|
//using System.Linq;
|
||||||
|
//using System.Text;
|
||||||
|
//using System.Threading.Tasks;
|
||||||
|
//using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
//namespace IRaCIS.Core.Application.BusinessFilter
|
||||||
|
//{
|
||||||
|
// public class ConvertToClientTimeResultFilter : IAsyncResultFilter
|
||||||
|
// {
|
||||||
|
|
||||||
|
|
||||||
|
// public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
|
||||||
|
// {
|
||||||
|
|
||||||
|
// //JsonConvert.DeserializeObject<T>(jsonStr, new JsonSerializerSettings
|
||||||
|
// //{
|
||||||
|
// // DateTimeZoneHandling = DateTimeZoneHandling.Local
|
||||||
|
// //});
|
||||||
|
|
||||||
|
// if (context.Result is ObjectResult objectResult)
|
||||||
|
// {
|
||||||
|
// var statusCode = objectResult.StatusCode ?? context.HttpContext.Response.StatusCode;
|
||||||
|
|
||||||
|
// if (statusCode == 200)
|
||||||
|
// {
|
||||||
|
// var result = objectResult.Value;
|
||||||
|
|
||||||
|
// // 将数据中的 DateTime 值转换为 DateTimeOffset,指定时区为东八区
|
||||||
|
// ConvertDateTimeToDateTimeOffset(result);
|
||||||
|
|
||||||
|
// // 使用 Newtonsoft.Json 序列化转换后的数据
|
||||||
|
// string json = JsonConvert.SerializeObject(result);
|
||||||
|
|
||||||
|
// // 重新设置 JsonResult 的值为处理后的数据
|
||||||
|
// context.Result = new JsonResult(json);
|
||||||
|
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// // 执行动作方法
|
||||||
|
// await next();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void ConvertDateTimeToDateTimeOffset(object data)
|
||||||
|
// {
|
||||||
|
// // 假设客户端时区为东八区
|
||||||
|
// TimeZoneInfo clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
|
||||||
|
|
||||||
|
// // 将对象中的 DateTime 值转换为 DateTimeOffset,指定时区为东八区
|
||||||
|
// string json = JsonConvert.SerializeObject(data);
|
||||||
|
// data = json.Replace("\"DateTime\":", "\"DateTimeOffset\":");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -0,0 +1,83 @@
|
||||||
|
using Newtonsoft.Json.Converters;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using SharpCompress.Writers;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public class ExportExcelDateConverter : DateTimeConverterBase
|
||||||
|
{
|
||||||
|
private readonly TimeZoneInfo _clientTimeZone;
|
||||||
|
|
||||||
|
public ExportExcelDateConverter(TimeZoneInfo clientTimeZone)
|
||||||
|
{
|
||||||
|
_clientTimeZone = clientTimeZone;
|
||||||
|
}
|
||||||
|
public override bool CanConvert(Type objectType)
|
||||||
|
{
|
||||||
|
|
||||||
|
return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
|
||||||
|
}
|
||||||
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
DateTime? nullableDateTime = value as DateTime?;
|
||||||
|
|
||||||
|
if (nullableDateTime != null && nullableDateTime.HasValue)
|
||||||
|
{
|
||||||
|
// 将服务器时间转换为客户端时间
|
||||||
|
DateTime clientTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, TimeZoneInfo.Local, _clientTimeZone);
|
||||||
|
writer.WriteValue(clientTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writer.WriteNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||||
|
{
|
||||||
|
DateTime? nullableDateTime = reader.Value as DateTime?;
|
||||||
|
|
||||||
|
if (nullableDateTime != null && nullableDateTime.HasValue)
|
||||||
|
|
||||||
|
{ // 服务器时区的时间转为客户端时间
|
||||||
|
var clientZoneTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, TimeZoneInfo.Local, _clientTimeZone);
|
||||||
|
|
||||||
|
return clientZoneTime;
|
||||||
|
}
|
||||||
|
return reader.Value;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
public class ExportExcelConverterDate
|
||||||
|
{
|
||||||
|
public static T ConvertToClientTimeInObject<T>(T obj, string timeZoneId)
|
||||||
|
{
|
||||||
|
var clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
|
||||||
|
if (obj == null)
|
||||||
|
return obj;
|
||||||
|
|
||||||
|
// 将对象序列化为 JSON 字符串
|
||||||
|
string json = JsonConvert.SerializeObject(obj);
|
||||||
|
|
||||||
|
// 将 JSON 字符串反序列化回对象
|
||||||
|
var deserializedObj = JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings
|
||||||
|
{
|
||||||
|
Converters = { new ExportExcelDateConverter(clientTimeZone) }
|
||||||
|
});
|
||||||
|
|
||||||
|
return deserializedObj!;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue