项目提交

项目全量提交
main
LiJiaWen 4 weeks ago
commit f4341c813a
  1. 54
      .gitignore
  2. 25
      LIS-Platform-Linker.sln
  3. 44
      LIS-Platform-Linker/Controllers/ReceiverController.cs
  4. 17
      LIS-Platform-Linker/Controllers/SenderController.cs
  5. 21
      LIS-Platform-Linker/Dtos/LIS/QueryApplyLISRequest.cs
  6. 21
      LIS-Platform-Linker/Dtos/LIS/SubmitReportLISRequest.cs
  7. 29
      LIS-Platform-Linker/Dtos/Platform/BasePlatformRequest.cs
  8. 27
      LIS-Platform-Linker/Dtos/Platform/QueryApplyData.cs
  9. 769
      LIS-Platform-Linker/Dtos/Platform/SubmitReportData.cs
  10. 23
      LIS-Platform-Linker/LIS-Platform-Linker.csproj
  11. 66
      LIS-Platform-Linker/Program.cs
  12. 30
      LIS-Platform-Linker/Properties/launchSettings.json
  13. 54
      LIS-Platform-Linker/Services/Interfaces/IReceiverService.cs
  14. 11
      LIS-Platform-Linker/Services/Interfaces/ISenderService.cs
  15. 289
      LIS-Platform-Linker/Services/ReceiverService.cs
  16. 12
      LIS-Platform-Linker/Services/SenderService.cs
  17. 85
      LIS-Platform-Linker/Startup.cs
  18. 30
      LIS-Platform-Linker/Tools/ConfigHelper.cs
  19. 109
      LIS-Platform-Linker/Tools/DBHelper.cs
  20. 15
      LIS-Platform-Linker/Tools/Extensions/DateTimeExtensions.cs
  21. 30
      LIS-Platform-Linker/Tools/HttpClientHelper.cs
  22. 13
      LIS-Platform-Linker/Tools/LoggerHelper.cs
  23. 253
      LIS-Platform-Linker/Tools/MySecurity.cs
  24. 30
      LIS-Platform-Linker/Tools/Nlog/CallsiteNamespaceLayoutRenderer.cs
  25. 21
      LIS-Platform-Linker/Tools/Nlog/LogHelper.cs
  26. 165
      LIS-Platform-Linker/Tools/Result.cs
  27. 9
      LIS-Platform-Linker/appsettings.Development.json
  28. 15
      LIS-Platform-Linker/appsettings.json
  29. 77
      LIS-Platform-Linker/nlog.config

54
.gitignore vendored

@ -0,0 +1,54 @@
# 编译输出目录
[Dd]ebug/
[Rr]elease/
bin/
obj/
# .NET 生成文件
*.cs.user
*.csproj.user
*.suo
*.user
*.userosscache
*.sln.docstates
# Visual Studio
.vs/
*.swp
*.vspx
*.vspscc
*.vssscc
_ReSharper*/
*.ReSharper*
# Rider / JetBrains
.idea/
*.iml
*.iws
*.xml
# VS Code
.vscode/
*.code-workspace
# 日志
logs/
*.log
# 临时文件
*.tmp
*.temp
# 操作系统文件
.DS_Store
Thumbs.db
# dotnet tools 本地安装
.dotnet/
# NuGet
*.nupkg
.nuget/
# 测试覆盖率
coverage/

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.36324.18
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LIS-Platform-Linker", "LIS-Platform-Linker\LIS-Platform-Linker.csproj", "{593EF56D-F8AE-4A4F-B12D-8CA6C13885A1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{593EF56D-F8AE-4A4F-B12D-8CA6C13885A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{593EF56D-F8AE-4A4F-B12D-8CA6C13885A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{593EF56D-F8AE-4A4F-B12D-8CA6C13885A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{593EF56D-F8AE-4A4F-B12D-8CA6C13885A1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {466EAB96-E647-4084-8FD2-7D573E73B85E}
EndGlobalSection
EndGlobal

@ -0,0 +1,44 @@
using LIS_Platform_Linker.Dtos.LIS;
using LIS_Platform_Linker.Services.Interfaces;
using LIS_Platform_Linker.Tools;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Controllers
{
[Route("[controller]/[action]")]
[ApiController]
public class ReceiverController : ControllerBase
{
private readonly IReceiverService receiverService;
public ReceiverController(IReceiverService ireceiverService)
{
receiverService = ireceiverService;
}
/// <summary>
/// 查询申请单
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult QueryApply([FromBody] QueryApplyLISRequest queryApplyLISRequest)
{
return receiverService.QueryApply(queryApplyLISRequest);
}
/// <summary>
/// 发送报告单
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult SubmitReport([FromBody] SubmitReportLISRequest submitReportRequest)
{
return receiverService.SubmitReport(submitReportRequest);
}
}
}

@ -0,0 +1,17 @@
using LIS_Platform_Linker.Tools;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Controllers
{
[Route("[controller]/[action]")]
[ApiController]
public class SenderController : ControllerBase
{
}
}

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Dtos.LIS
{
public class QueryApplyLISRequest
{
//标本所属医疗机构代码
public string srclabcode { get; set; }
//标本所属医疗机构名称
public string srclabname { get; set; }
//操作人工号
public string operatorcode { get; set; }
//操作人姓名
public string operatorname { get; set; }
//条形码
public string barcode { get; set; }
}
}

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Dtos.LIS
{
public class SubmitReportLISRequest
{
//标本所属医疗机构代码
public string srclabcode { get; set; }
//标本所属医疗机构名称
public string srclabname { get; set; }
//操作人工号
public string operatorcode { get; set; }
//操作人姓名
public string operatorname { get; set; }
//条形码
public List<string> barcodes { get; set; }
}
}

@ -0,0 +1,29 @@
using LIS_Platform_Linker.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Dtos.Platform
{
public class BasePlatformRequest
{
public Header header;
public object data;
public BasePlatformRequest(string servicename)
{
header = new Header
{
servicename = servicename
};
}
}
public class Header
{
public string hospitalcode = ConfigHelper.HospitalCode;
public string hospitalname = ConfigHelper.HospitalName;
public string servicename;
}
}

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Dtos.Platform
{
public class QueryApplyData
{
public QueryApply queryapply;
}
/// <summary>
/// 查询申请信息
/// </summary>
public class QueryApply
{
public string srclabcode;
public string srclabname;
public string targetlabcode;
public string targetlabname;
public string barcode;
public string operatetime;
public string operatorcode;
public string operatorname;
}
}

@ -0,0 +1,769 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Dtos.Platform
{
public class SubmitReportData
{
public SubmitReport report;
public List<SubmitOrder> order;
public SubmitFile file;
public List<SubmitItem> item;
public List<SubmitBacteria> bacterias;
}
/// <summary>
/// 报告信息
/// </summary>
public class SubmitReport
{
/// <summary>
/// 标本所属医疗机构代码
/// </summary>
public string srclabcode { get; set; }
/// <summary>
/// 标本所属医疗机构名称
/// </summary>
public string srclabname { get; set; }
/// <summary>
/// 标本送往医疗机构代码
/// </summary>
public string targetlabcode { get; set; }
/// <summary>
/// 标本送往医疗机构名称
/// </summary>
public string targetlabname { get; set; }
/// <summary>
/// 操作时间
/// </summary>
public string operatetime { get; set; }
/// <summary>
/// 操作人工号
/// </summary>
public string operatorcode { get; set; }
/// <summary>
/// 操作人姓名
/// </summary>
public string operatorname { get; set; }
/// <summary>
/// 条码号
/// </summary>
public string barcode { get; set; }
/// <summary>
/// 报告单号
/// </summary>
public string reportno { get; set; }
/// <summary>
/// 患者姓名
/// </summary>
public string patname { get; set; }
/// <summary>
/// 患者唯一号
/// </summary>
public string patientid { get; set; }
/// <summary>
/// 就诊号
/// </summary>
public string cureno { get; set; }
/// <summary>
/// 住院号
/// </summary>
public string hospno { get; set; }
/// <summary>
/// 磁卡号
/// </summary>
public string cardno { get; set; }
/// <summary>
/// 卡类型
/// </summary>
public string cardtype { get; set; }
/// <summary>
/// 出生日期
/// </summary>
public string birthday { get; set; }
/// <summary>
/// 身份证号
/// </summary>
public string idnum { get; set; }
/// <summary>
/// 年龄
/// </summary>
public string age { get; set; }
/// <summary>
/// 年龄单位
/// </summary>
public string ageunit { get; set; }
/// <summary>
/// 性别
/// </summary>
public string sex { get; set; }
/// <summary>
/// 病人类型代码
/// </summary>
public string wardorreg { get; set; }
/// <summary>
/// 病人类型名称
/// </summary>
public string wardorregname { get; set; }
/// <summary>
/// 标本类型代码
/// </summary>
public string samplecode { get; set; }
/// <summary>
/// 标本类型名称
/// </summary>
public string samplename { get; set; }
/// <summary>
/// 标本说明代码
/// </summary>
public string sampledescode { get; set; }
/// <summary>
/// 标本说明名称
/// </summary>
public string sampledescname { get; set; }
/// <summary>
/// 标本性状代码
/// </summary>
public string sampleshapecode { get; set; }
/// <summary>
/// 标本性状名称
/// </summary>
public string sampleshapename { get; set; }
/// <summary>
/// 检验机构报告的仪器id
/// </summary>
public string testinstid { get; set; }
/// <summary>
/// 检验机构报告的仪器代码
/// </summary>
public string testinstcode { get; set; }
/// <summary>
/// 检验机构报告的仪器名称
/// </summary>
public string testinstname { get; set; }
/// <summary>
/// 检验机构报告的样本号
/// </summary>
public string testtechno { get; set; }
/// <summary>
/// 检验时间
/// </summary>
public string exectime { get; set; }
/// <summary>
/// 检验医生工号
/// </summary>
public string execdoccode { get; set; }
/// <summary>
/// 检验医生姓名
/// </summary>
public string execdocname { get; set; }
/// <summary>
/// 审核时间
/// </summary>
public string verifytime { get; set; }
/// <summary>
/// 审核人工号
/// </summary>
public string verifiercode { get; set; }
/// <summary>
/// 审核人姓名
/// </summary>
public string verifiername { get; set; }
/// <summary>
/// 报告时间
/// </summary>
public string reporttime { get; set; }
/// <summary>
/// 发布时间
/// </summary>
public string pubtime { get; set; }
/// <summary>
/// 发布人工号
/// </summary>
public string pubdoccode { get; set; }
/// <summary>
/// 发布人姓名
/// </summary>
public string pubdocname { get; set; }
/// <summary>
/// 备注
/// </summary>
public string remark { get; set; }
/// <summary>
/// 检验结论
/// </summary>
public string examresult { get; set; }
/// <summary>
/// 实验室诊断
/// </summary>
public string labdiagnosis { get; set; }
/// <summary>
/// 复做标志
/// </summary>
public string redoflag { get; set; }
/// <summary>
/// 复做标本来源
/// </summary>
public string redosample { get; set; }
/// <summary>
/// 复做原因
/// </summary>
public string redoreason { get; set; }
/// <summary>
/// 复做标本说明
/// </summary>
public string redosampledesc { get; set; }
/// <summary>
/// 危急值报告标志
/// </summary>
public string panicflag { get; set; }
/// <summary>
/// 传染病报告标志
/// </summary>
public string biohazardflag { get; set; }
/// <summary>
/// 微生物报告标志
/// </summary>
public string micflag { get; set; }
/// <summary>
/// 报告完成标志
/// </summary>
public string finishflag { get; set; }
}
/// <summary>
/// 医嘱信息
/// </summary>
public class SubmitOrder
{
/// <summary>
/// 项目代码
/// </summary>
public string itemcode { get; set; }
/// <summary>
/// 项目名称
/// </summary>
public string itemname { get; set; }
/// <summary>
/// 项目类型
/// </summary>
public string itemtype { get; set; }
/// <summary>
/// 项目数量
/// </summary>
public string itemqty { get; set; }
/// <summary>
/// 项目单位
/// </summary>
public string itemunit { get; set; }
/// <summary>
/// 项目单价
/// </summary>
public string price { get; set; }
/// <summary>
/// 申请单号
/// </summary>
public string hisapplyno { get; set; }
/// <summary>
/// 分组序号
/// </summary>
public string groupno { get; set; }
/// <summary>
/// 医嘱序号
/// </summary>
public string logno { get; set; }
/// <summary>
/// 标本类型代码
/// </summary>
public string specimencode { get; set; }
/// <summary>
/// 标本类型名称
/// </summary>
public string specimenname { get; set; }
/// <summary>
/// 项目状态
/// </summary>
public string status { get; set; }
/// <summary>
/// 费用类别
/// </summary>
public string chargeflag { get; set; }
}
/// <summary>
/// 报告文件信息
/// </summary>
public class SubmitFile
{
/// <summary>
/// 报告文件列表
/// </summary>
public List<ReportFile> reportfile { get; set; }
/// <summary>
/// 项目图片列表
/// </summary>
public List<ItemImage> itemimg { get; set; }
}
public class ReportFile
{
/// <summary>
/// 文件名称
/// </summary>
public string filename { get; set; }
/// <summary>
/// 报告标志
/// </summary>
public string reportflag { get; set; }
/// <summary>
/// 文件类型
/// </summary>
public string filetype { get; set; }
/// <summary>
/// 文件数据 (Base64编码)
/// </summary>
public string filedata { get; set; }
}
public class ItemImage
{
/// <summary>
/// 项目代码
/// </summary>
public string itemcode { get; set; }
/// <summary>
/// 文件名称
/// </summary>
public string filename { get; set; }
/// <summary>
/// 文件类型
/// </summary>
public string filetype { get; set; }
/// <summary>
/// 文件数据 (Base64编码)
/// </summary>
public string filedata { get; set; }
}
/// <summary>
/// 检验指标信息-常规
/// </summary>
public class SubmitItem
{
/// <summary>
/// 项目编码
/// </summary>
public string itemnum { get; set; }
/// <summary>
/// 项目代码
/// </summary>
public string itemcode { get; set; }
/// <summary>
/// 项目名称
/// </summary>
public string itemname { get; set; }
/// <summary>
/// 出结果时间
/// </summary>
public string resulttime { get; set; }
/// <summary>
/// 检测仪器ID
/// </summary>
public string instid { get; set; }
/// <summary>
/// 检测仪器编码
/// </summary>
public string instcode { get; set; }
/// <summary>
/// 检测仪器名称
/// </summary>
public string instname { get; set; }
/// <summary>
/// 定量结果
/// </summary>
public string resultvalue { get; set; }
/// <summary>
/// 定性结果
/// </summary>
public string resultchar { get; set; }
/// <summary>
/// 报告结果
/// </summary>
public string result { get; set; }
/// <summary>
/// 提示信息
/// </summary>
public string hintinfo { get; set; }
/// <summary>
/// 显示状态
/// </summary>
public string displayflag { get; set; }
/// <summary>
/// 隐藏标志
/// </summary>
public string hideflag { get; set; }
/// <summary>
/// 科研标志
/// </summary>
public string scientificflag { get; set; }
/// <summary>
/// OD值
/// </summary>
public string odresult { get; set; }
/// <summary>
/// OD值字符表示
/// </summary>
public string odresultchar { get; set; }
/// <summary>
/// CUTOFF比值
/// </summary>
public string cutoffvalue { get; set; }
/// <summary>
/// CUTOFF比值字符表示
/// </summary>
public string cutoffvaluechar { get; set; }
/// <summary>
/// SCO比值
/// </summary>
public string scovalue { get; set; }
/// <summary>
/// SCO比值字符表示
/// </summary>
public string scovaluechar { get; set; }
/// <summary>
/// 检测方法
/// </summary>
public string testmethod { get; set; }
/// <summary>
/// 打印序号
/// </summary>
public string printorder { get; set; }
/// <summary>
/// 异常标志
/// </summary>
public string highlowflag { get; set; }
/// <summary>
/// 参考区间
/// </summary>
public string referencerange { get; set; }
/// <summary>
/// 单位
/// </summary>
public string unit { get; set; }
/// <summary>
/// 结果类型
/// </summary>
public string resulttype { get; set; }
/// <summary>
/// 复做标记
/// </summary>
public string redo { get; set; }
/// <summary>
/// 危急值项目
/// </summary>
public string panicflag { get; set; }
/// <summary>
/// 危急值参考区间
/// </summary>
public string panicreferencerange { get; set; }
/// <summary>
/// 传染病标志
/// </summary>
public string biohazardflag { get; set; }
/// <summary>
/// 镜检复片标志
/// </summary>
public string scopicflag { get; set; }
}
/// <summary>
/// 细菌结果信息-微生物
/// </summary>
public class SubmitBacteria
{
/// <summary>
/// 细菌报告单号
/// </summary>
public string orgreportno { get; set; }
/// <summary>
/// 涂片方法代码
/// </summary>
public string smearcode { get; set; }
/// <summary>
/// 涂片方法名称
/// </summary>
public string smearname { get; set; }
/// <summary>
/// 涂片结果
/// </summary>
public string smearresult { get; set; }
/// <summary>
/// 细菌代码
/// </summary>
public string organismcode { get; set; }
/// <summary>
/// 细菌名称
/// </summary>
public string organismname { get; set; }
/// <summary>
/// 菌落计数
/// </summary>
public string quantity { get; set; }
/// <summary>
/// 检测结果
/// </summary>
public string result { get; set; }
/// <summary>
/// 培养基
/// </summary>
public string culturemedium { get; set; }
/// <summary>
/// 培养时间
/// </summary>
public string culturetimes { get; set; }
/// <summary>
/// 发现方式
/// </summary>
public string foundway { get; set; }
/// <summary>
/// 备注
/// </summary>
public string remark { get; set; }
/// <summary>
/// 检测仪器ID
/// </summary>
public string testinstid { get; set; }
/// <summary>
/// 检测仪器名称
/// </summary>
public string testinstname { get; set; }
/// <summary>
/// 打印顺序
/// </summary>
public string printorder { get; set; }
/// <summary>
/// 综合评价
/// </summary>
public string summingup { get; set; }
/// <summary>
/// 细菌检测人工号
/// </summary>
public string orgdoccode { get; set; }
/// <summary>
/// 细菌检测人姓名
/// </summary>
public string orgdocname { get; set; }
/// <summary>
/// 细菌检测时间
/// </summary>
public string organismtime { get; set; }
/// <summary>
/// 阳性细菌标志
/// </summary>
public string positiveflag { get; set; }
/// <summary>
/// 多重耐药标记
/// </summary>
public string warnorganism { get; set; }
/// <summary>
/// 耐药机制代码
/// </summary>
public string mdrcode { get; set; }
/// <summary>
/// 耐药机制名称
/// </summary>
public string mdrname { get; set; }
/// <summary>
/// 药敏结果信息列表
/// </summary>
public List<Antibiotic> antibiotics { get; set; }
}
/// <summary>
/// 药敏结果信息
/// </summary>
public class Antibiotic
{
/// <summary>
/// 细菌报告单号
/// </summary>
public string orgreportno { get; set; }
/// <summary>
/// 细菌代码
/// </summary>
public string organismcode { get; set; }
/// <summary>
/// 药敏代码
/// </summary>
public string anticode { get; set; }
/// <summary>
/// 药敏名称
/// </summary>
public string antiname { get; set; }
/// <summary>
/// 测定值
/// </summary>
public string antivalue { get; set; }
/// <summary>
/// 参考范围
/// </summary>
public string referevalue { get; set; }
/// <summary>
/// 药敏结果
/// </summary>
public string antiresult { get; set; }
/// <summary>
/// 备注
/// </summary>
public string remark { get; set; }
/// <summary>
/// 抗生素分组
/// </summary>
public string antigroup { get; set; }
/// <summary>
/// 药敏结果是否打印
/// </summary>
public string printflag { get; set; }
/// <summary>
/// 打印序号
/// </summary>
public string printorder { get; set; }
}
}

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>LIS_Platform_Linker</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="NLog" Version="4.7.15" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
<ItemGroup>
<Content Update="nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

@ -0,0 +1,66 @@
using LIS_Platform_Linker.Tools;
using LIS_Platform_Linker.Tools.Nlog;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NLog.LayoutRenderers;
using NLog.Web;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker
{
public class Program
{
public static void Main(string[] args)
{
#region 注册Nlog自定义布局渲染器
LayoutRenderer.Register<CallsiteNamespaceLayoutRenderer>("callsite-namespace");
#endregion
//var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger(); // Nlog配置文件初始化
try
{
LoggerHelper.Log.Info("===========program initialization===============");
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
};
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
// Nlog:捕获设置错误
LoggerHelper.Log.Error(exception, "Stopped program because of exception");
throw;
}
finally
{
// 确保在应用程序退出前刷新和停止内部定时器/线程(避免Linux上的分段故障)
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureLogging(logging =>
{
//logging.ClearProviders(); // 这个方法会清空所有控制台的输出
// 日志配置,控制台日志输出时间
logging.AddConsole(c => c.TimestampFormat = "【yyyy-MM-dd HH:mm:ss】");
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace).AddConsole(); // 控制台日志输出
})
.UseNLog(); //添加日志组件。依赖性注入设置Nlog;
}
}

@ -0,0 +1,30 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:65422",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"LIS_Platform_Linker": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

@ -0,0 +1,54 @@
using LIS_Platform_Linker.Dtos.LIS;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Services.Interfaces
{
public interface IReceiverService
{
/// <summary>
/// 查询申请单
/// </summary>
/// <returns></returns>
public ActionResult QueryApply(QueryApplyLISRequest queryApplyLISRequest);
/// <summary>
/// 撤销签收申请单
/// </summary>
/// <returns></returns>
public ActionResult CancelRegApply(string jsonString);
/// <summary>
/// 拒绝签收申请单
/// </summary>
/// <returns></returns>
public ActionResult RejectApply(string jsonString);
/// <summary>
/// 发送报告单
/// </summary>
/// <returns></returns>
public ActionResult SubmitReport(SubmitReportLISRequest submitReportRequest);
/// <summary>
/// 召回报告单
/// </summary>
/// <returns></returns>
public ActionResult CallbackReport(string jsonString);
/// <summary>
/// 发送PDF报告
/// </summary>
/// <returns></returns>
public ActionResult ImportPDF(string jsonString);
/// <summary>
/// 查询申请单-按时间
/// </summary>
/// <returns></returns>
public ActionResult QueryApplyByTime(string jsonString);
}
}

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Services.Interfaces
{
public interface ISenderService
{
}
}

@ -0,0 +1,289 @@
using LIS_Platform_Linker.Dtos.LIS;
using LIS_Platform_Linker.Dtos.Platform;
using LIS_Platform_Linker.Services.Interfaces;
using LIS_Platform_Linker.Tools;
using LIS_Platform_Linker.Tools.Extensions;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Services
{
public class ReceiverService : IReceiverService
{
public ActionResult QueryApply(QueryApplyLISRequest queryApplyLISRequest)
{
try
{
LoggerHelper.Log.Info("【查询申请单】接收入参:" + JsonConvert.SerializeObject(queryApplyLISRequest));
var request = new BasePlatformRequest("QUERYAPPLY");
var data = new QueryApplyData();
request.data = data;
var queryApply = new QueryApply();
data.queryapply = queryApply;
queryApply.srclabcode = queryApplyLISRequest.srclabcode;
queryApply.srclabname = queryApplyLISRequest.srclabname;
queryApply.targetlabcode = ConfigHelper.HospitalCode;
queryApply.targetlabname = ConfigHelper.HospitalName;
queryApply.barcode = queryApplyLISRequest.barcode;
queryApply.operatetime = DateTime.Now.ToStandardString();
queryApply.operatorcode = queryApplyLISRequest.operatorcode;
queryApply.operatorname = queryApplyLISRequest.operatorname;
var response = HttpClientHelper.Post(request);
LoggerHelper.Log.Info("【查询申请单】返回结果:" + JsonConvert.SerializeObject(response));
return Result.Success(response);
}
catch (Exception ex)
{
LoggerHelper.Log.Error(ex);
return Result.Fail(ex.Message);
}
}
public ActionResult CancelRegApply(string jsonString)
{
throw new NotImplementedException();
}
public ActionResult RejectApply(string jsonString)
{
throw new NotImplementedException();
}
public ActionResult SubmitReport(SubmitReportLISRequest submitReportRequest)
{
try
{
LoggerHelper.Log.Info("【发送报告单】接收入参:" + JsonConvert.SerializeObject(submitReportRequest));
var request = new BasePlatformRequest("SUBMITREPORT");
var datas = new List<SubmitReportData>();
request.data = datas;
var now = DateTime.Now.ToStandardString();
foreach (string barcode in submitReportRequest.barcodes)
{
var data = new SubmitReportData();
datas.Add(data);
var report = new SubmitReport();
data.report = report;
data.order = new List<SubmitOrder>();
data.file = new SubmitFile();
data.item = new List<SubmitItem>();
//data.bacterias = new List<SubmitBacteria>();
#region report
string sql_report = $@"select ID, PatientName, PatientID, HisId, BirthDay, IDCardNo, Age, AgeClass, Sex, PatientClass, SpecimenCode, SpecimenName, SampleCode, ReportDate, Reporter, CheckDate, Checker, Description, TestDate from Rpt_Patient (NOLOCK) where barcode = '{barcode}'; ";
var dt_report = DBHelper.ExecuteDataTable(sql_report);
report.srclabcode = submitReportRequest.srclabcode;
report.srclabname = submitReportRequest.srclabname;
report.targetlabcode = ConfigHelper.HospitalCode;
report.targetlabname = ConfigHelper.HospitalName;
report.operatetime = now;
report.operatorcode = submitReportRequest.operatorcode;
report.operatorname = submitReportRequest.operatorname;
report.barcode = barcode;
report.reportno = dt_report.Rows[0]["ID"].ToString();
report.patname = dt_report.Rows[0]["PatientName"].ToString();
report.patientid = dt_report.Rows[0]["PatientID"].ToString();
report.cureno = dt_report.Rows[0]["HisId"].ToString();
report.hospno = dt_report.Rows[0]["HisId"].ToString();
report.cardno = dt_report.Rows[0]["HisId"].ToString();
report.cardtype = string.Empty;
report.birthday = DateTime.Parse(dt_report.Rows[0]["BirthDay"].ToString()).ToStandardString();
report.idnum = dt_report.Rows[0]["IDCardNo"].ToString();
report.age = dt_report.Rows[0]["Age"].ToString();
report.ageunit = dt_report.Rows[0]["AgeClass"].ToString();
report.sex = dt_report.Rows[0]["Sex"].ToString();
report.wardorreg = string.Empty;
report.wardorregname = dt_report.Rows[0]["PatientClass"].ToString();
report.samplecode = dt_report.Rows[0]["SpecimenCode"].ToString();
report.samplename = dt_report.Rows[0]["SpecimenName"].ToString();
report.sampledescode = string.Empty;
report.sampledescname = string.Empty;
report.sampleshapecode = string.Empty;
report.sampleshapename = string.Empty;
report.testinstid = string.Empty;
report.testinstcode = string.Empty;
report.testinstname = string.Empty;
report.testtechno = dt_report.Rows[0]["SampleCode"].ToString();
report.exectime = dt_report.Rows[0]["ReportDate"].ToString();
report.execdoccode = string.Empty;
report.execdocname = dt_report.Rows[0]["Reporter"].ToString();
report.verifytime = dt_report.Rows[0]["CheckDate"].ToString();
report.verifiercode = string.Empty;
report.verifiername = dt_report.Rows[0]["Checker"].ToString();
report.reporttime = dt_report.Rows[0]["CheckDate"].ToString();
report.pubtime = dt_report.Rows[0]["CheckDate"].ToString();
report.pubdoccode = string.Empty;
report.pubdocname = dt_report.Rows[0]["Checker"].ToString();
report.remark = dt_report.Rows[0]["Description"].ToString();
report.examresult = string.Empty;
report.labdiagnosis = string.Empty;
report.redoflag = "0";
report.redosample = string.Empty;
report.redoreason = string.Empty;
report.redosampledesc = string.Empty;
report.panicflag = "0";
report.biohazardflag = "0";
report.micflag = "0";
report.finishflag = "1";
//测试用
//report.barcode = "260305000001";
//report.patname = "铁扎啊";
//report.birthday = "2002-12-10 00:00:00";
//report.idnum = "5327295272544448";
//report.age = "23";
#endregion
#region order
string sql_order = $@"select ReqItemCode, ReqItemName, Cost, SerialNum, CostDate from Rpt_CheckCost where barcode = '{barcode}'; ";
var dt_order = DBHelper.ExecuteDataTable(sql_order);
foreach (DataRow dr in dt_order.Rows)
{
var order = new SubmitOrder();
data.order.Add(order);
order.itemcode = dr["ReqItemCode"].ToString();
order.itemname = dr["ReqItemName"].ToString();
order.itemtype = string.Empty;
order.itemqty = string.Empty;
order.itemunit = string.Empty;
order.price = dr["Cost"].ToString();
order.hisapplyno = dr["SerialNum"].ToString();
order.groupno = string.Empty;
order.logno = string.Empty;
order.specimencode = data.report.samplecode;
order.specimenname = data.report.samplename;
order.status = "1";
order.chargeflag = dr["SerialNum"] == DBNull.Value ? "0" : "1";
}
#endregion
#region file
var reportfiles = new List<ReportFile>();
data.file.reportfile = reportfiles;
string sql_file = $@"select Report from Rpt_ReportFile where Barcode = '{barcode}'; ";
var dt_file = DBHelper.ExecuteDataTable(sql_file);
foreach (DataRow dr in dt_file.Rows)
{
var reportfile = new ReportFile();
reportfiles.Add(reportfile);
reportfile.filename = "报告文件";
reportfile.reportflag = "1";
reportfile.filetype = "9";
reportfile.filedata = dr["Report"].ToString();
}
var itemimgs = new List<ItemImage>();
data.file.itemimg = itemimgs;
string sql_img = $@"select RptItemCode, Img from Rpt_ImageResult where SampleCode='{dt_report.Rows[0]["SampleCode"]}' and TestDate = '{dt_report.Rows[0]["TestDate"]}'; ";
var dt_img = DBHelper.ExecuteDataTable(sql_img);
foreach (DataRow dr in dt_img.Rows)
{
var itemimg = new ItemImage();
itemimgs.Add(itemimg);
string[] imgcode = dr["RptItemCode"].ToString().Split(' ', StringSplitOptions.RemoveEmptyEntries);
itemimg.itemcode = imgcode[0];
itemimg.filename = imgcode[1];
itemimg.filetype = "1";
itemimg.filedata = dr["Img"].ToString();
}
#endregion
#region item
string sql_item = $@"select C.RptItemCode, C.RptItemName, A.InTime, A.Result, A.ResultStr, A.Range, A.Unit, A.IsReview from Rpt_CheckResult A
join Rpt_Patient B on A.SampleCode=B.SampleCode and A.TestDate=B.TestDate
join Dict_ReportItem C on A.RptItemCode=C.RptItemCode
where B.Barcode = '{barcode}'; ";
var dt_item = DBHelper.ExecuteDataTable(sql_item);
foreach (DataRow dr in dt_item.Rows)
{
var item = new SubmitItem();
data.item.Add(item);
item.itemnum = dr["RptItemCode"].ToString();
item.itemcode = dr["RptItemCode"].ToString();
item.itemname = dr["RptItemName"].ToString();
item.resulttime = DateTime.Parse(dr["InTime"].ToString()).ToStandardString();
item.instid = string.Empty;
item.instcode = string.Empty;
item.instname = string.Empty;
item.resultvalue = dr["Result"].ToString();
item.resultchar = dr["ResultStr"].ToString();
item.result = dr["ResultStr"].ToString();
item.hintinfo = string.Empty;
item.displayflag = "0";
item.hideflag = "0";
item.scientificflag = string.Empty;
item.odresult = string.Empty;
item.odresultchar = string.Empty;
item.cutoffvalue = string.Empty;
item.cutoffvaluechar = string.Empty;
item.scovalue = string.Empty;
item.scovaluechar = string.Empty;
item.testmethod = string.Empty;
item.printorder = string.Empty;
item.highlowflag = string.Empty;
item.referencerange = dr["Range"].ToString();
item.unit = dr["Unit"].ToString();
item.resulttype = string.Empty;
item.redo = dr["IsReview"].ToString() == "1" ? "1" : "0";
item.panicflag = string.Empty;
item.panicreferencerange = string.Empty;
item.biohazardflag = string.Empty;
item.scopicflag = string.Empty;
}
#endregion
}
LoggerHelper.Log.Info("【发送报告单】发送对象:" + JsonConvert.SerializeObject(request));
var response = HttpClientHelper.Post(request);
LoggerHelper.Log.Info("【发送报告单】返回结果:" + JsonConvert.SerializeObject(response));
return Result.Success(response);
//LoggerHelper.Log.Info("【发送报告单】发送对象:" + JsonConvert.SerializeObject(request));
//return Result.Success(request);
}
catch (Exception ex)
{
LoggerHelper.Log.Error(ex);
return Result.Fail(ex.Message);
}
}
public ActionResult CallbackReport(string jsonString)
{
throw new NotImplementedException();
}
public ActionResult ImportPDF(string jsonString)
{
throw new NotImplementedException();
}
public ActionResult QueryApplyByTime(string jsonString)
{
throw new NotImplementedException();
}
}
}

@ -0,0 +1,12 @@
using LIS_Platform_Linker.Services.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Services
{
public class SenderService : ISenderService
{
}
}

@ -0,0 +1,85 @@
using LIS_Platform_Linker.Services;
using LIS_Platform_Linker.Services.Interfaces;
using LIS_Platform_Linker.Tools;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//读取配置
ConfigHelper.Initialize(Configuration);
services.AddControllers();
//注册服务
services.AddTransient<IReceiverService, ReceiverService>();
services.AddTransient<ISenderService, SenderService>();
services.AddSwaggerGen(s =>
{
//标记swagger 信息(内容自定义)
//V1.0.0-->SwaggerEndpoint(url,name)-->url 使用
s.SwaggerDoc("V1.0.0", new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = "检验平台连接服务",
Version = "1.0.0",
});
s.AddServer(new OpenApiServer
{
Url = "/LISPlatformLinker",
Description = "API全局路由"
});
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UsePathBase("/LISPlatformLinker");
app.UseSwagger();
app.UseSwaggerUI(su =>
{
//url中[V1.0.0]与ConfigureServices 中配置的SwaggerDoc("V1.0.0",..) 保持一致
su.SwaggerEndpoint("/swagger/V1.0.0/swagger.json", null);
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}

@ -0,0 +1,30 @@
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools
{
public static class ConfigHelper
{
private static IConfiguration _config;
public static void Initialize(IConfiguration configuration)
{
_config = configuration;
}
// LIS数据库连接字符串
public static string ConnectionString => MySecurity.SDecryptString(_config.GetValue<string>("ConnectionString"));
// 检验平台接口地址
public static string PlatformUrl => _config.GetValue<string>("PlatformUrl");
// 医疗机构代码
public static string HospitalCode => _config.GetValue<string>("HospitalCode");
// 医疗机构名称
public static string HospitalName => _config.GetValue<string>("HospitalName");
}
}

@ -0,0 +1,109 @@
using Microsoft.Data.SqlClient;
using System;
using System.Data;
namespace LIS_Platform_Linker.Tools
{
public static class DBHelper
{
private static readonly string _connectionString;
static DBHelper()
{
_connectionString = ConfigHelper.ConnectionString;
if (string.IsNullOrEmpty(_connectionString))
{
throw new ArgumentException($"连接字符串未找到或为空");
}
}
/// <summary>
/// 执行查询,返回结果的第一行第一列(字符串)
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">参数列表</param>
/// <returns>结果的第一行第一列</returns>
public static string ExecuteScalarString(string sql, params SqlParameter[] parameters)
{
using (var connection = new SqlConnection(_connectionString))
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
command.Parameters.AddRange(parameters);
}
connection.Open();
var result = command.ExecuteScalar();
return result?.ToString() ?? string.Empty;
}
}
/// <summary>
/// 执行查询,返回结果的第一行第一列(泛型版本)
/// </summary>
public static T ExecuteScalar<T>(string sql, params SqlParameter[] parameters)
{
using (var connection = new SqlConnection(_connectionString))
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
command.Parameters.AddRange(parameters);
}
connection.Open();
var result = command.ExecuteScalar();
if (result == null || result == DBNull.Value)
{
return default(T);
}
return (T)Convert.ChangeType(result, typeof(T));
}
}
/// <summary>
/// 执行查询,返回DataTable
/// </summary>
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
{
using (var connection = new SqlConnection(_connectionString))
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
command.Parameters.AddRange(parameters);
}
var dataTable = new DataTable();
using (var adapter = new SqlDataAdapter(command))
{
adapter.Fill(dataTable);
}
return dataTable;
}
}
/// <summary>
/// 执行非查询SQL,返回影响的行数
/// </summary>
public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
using (var connection = new SqlConnection(_connectionString))
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
if (parameters != null && parameters.Length > 0)
{
command.Parameters.AddRange(parameters);
}
connection.Open();
return command.ExecuteNonQuery();
}
}
}
}

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools.Extensions
{
public static class DateTimeExtensions
{
public static string ToStandardString(this DateTime dt)
{
return dt.ToString("yyyy-MM-dd HH:mm:ss");
}
}
}

@ -0,0 +1,30 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools
{
public static class HttpClientHelper
{
private static readonly string _url;
static HttpClientHelper()
{
_url = ConfigHelper.PlatformUrl;
if (string.IsNullOrEmpty(_url))
{
throw new ArgumentException($"平台URL未找到或为空");
}
}
public static string Post(object data)
{
using var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
return client.UploadString(_url, "POST", JsonConvert.SerializeObject(data));
}
}
}

@ -0,0 +1,13 @@
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools
{
public static class LoggerHelper
{
public static readonly ILogger Log = LogManager.GetCurrentClassLogger();
}
}

@ -0,0 +1,253 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools
{
/// <summary>
/// MySecurity(安全类) 的摘要说明。
/// </summary>
public class MySecurity
{
/// <summary>
/// 初始化安全类
/// </summary>
public MySecurity()
{
///默认密码
key = "peis77911@*71";
}
private string key; //默认密钥
private byte[] sKey;
private byte[] sIV;
#region 加密字符串
/// <summary>
/// 加密字符串
/// </summary>
/// <param name="inputStr">输入字符串</param>
/// <param name="keyStr">密码,可以为“”</param>
/// <returns>输出加密后字符串</returns>
static public string SEncryptString(string inputStr, string keyStr)
{
MySecurity ws = new MySecurity();
return ws.EncryptString(inputStr, keyStr);
}
/// <summary>
/// 加密字符串
/// </summary>
/// <param name="inputStr">输入字符串</param>
/// <param name="keyStr">密码,可以为“”</param>
/// <returns>输出加密后字符串</returns>
public string EncryptString(string inputStr, string keyStr)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
if (keyStr == "")
keyStr = key;
byte[] inputByteArray = Encoding.Default.GetBytes(inputStr);
byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
SHA1 ha = new SHA1Managed();
byte[] hb = ha.ComputeHash(keyByteArray);
sKey = new byte[8];
sIV = new byte[8];
for (int i = 0; i < 8; i++)
sKey[i] = hb[i];
for (int i = 8; i < 16; i++)
sIV[i - 8] = hb[i];
des.Key = sKey;
des.IV = sIV;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
cs.Close();
ms.Close();
return ret.ToString();
}
#endregion 加密字符串
#region 加密字符串 密钥为系统默认 0123456789
/// <summary>
/// 加密字符串 密钥为系统默认
/// </summary>
/// <param name="inputStr">输入字符串</param>
/// <returns>输出加密后字符串</returns>
static public string SEncryptString(string inputStr)
{
MySecurity ws = new MySecurity();
return ws.EncryptString(inputStr, "");
}
#endregion 加密字符串 密钥为系统默认 0123456789
#region 加密文件
/// <summary>
/// 加密文件
/// </summary>
/// <param name="filePath">输入文件路径</param>
/// <param name="savePath">加密后输出文件路径</param>
/// <param name="keyStr">密码,可以为“”</param>
/// <returns></returns>
public bool EncryptFile(string filePath, string savePath, string keyStr)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
if (keyStr == "")
keyStr = key;
FileStream fs = File.OpenRead(filePath);
byte[] inputByteArray = new byte[fs.Length];
fs.Read(inputByteArray, 0, (int)fs.Length);
fs.Close();
byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
SHA1 ha = new SHA1Managed();
byte[] hb = ha.ComputeHash(keyByteArray);
sKey = new byte[8];
sIV = new byte[8];
for (int i = 0; i < 8; i++)
sKey[i] = hb[i];
for (int i = 8; i < 16; i++)
sIV[i - 8] = hb[i];
des.Key = sKey;
des.IV = sIV;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
fs = File.OpenWrite(savePath);
foreach (byte b in ms.ToArray())
{
fs.WriteByte(b);
}
fs.Close();
cs.Close();
ms.Close();
return true;
}
#endregion 加密文件
#region 解密字符串
/// <summary>
/// 解密字符串
/// </summary>
/// <param name="inputStr">要解密的字符串</param>
/// <param name="keyStr">密钥</param>
/// <returns>解密后的结果</returns>
static public string SDecryptString(string inputStr, string keyStr)
{
MySecurity ws = new MySecurity();
return ws.DecryptString(inputStr, keyStr);
}
/// <summary>
/// 解密字符串 密钥为系统默认
/// </summary>
/// <param name="inputStr">要解密的字符串</param>
/// <returns>解密后的结果</returns>
static public string SDecryptString(string inputStr)
{
MySecurity ws = new MySecurity();
return ws.DecryptString(inputStr, "");
}
/// <summary>
/// 解密字符串
/// </summary>
/// <param name="inputStr">要解密的字符串</param>
/// <param name="keyStr">密钥</param>
/// <returns>解密后的结果</returns>
public string DecryptString(string inputStr, string keyStr)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
if (keyStr == "")
keyStr = key;
byte[] inputByteArray = new byte[inputStr.Length / 2];
for (int x = 0; x < inputStr.Length / 2; x++)
{
int i = (Convert.ToInt32(inputStr.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
SHA1 ha = new SHA1Managed();
byte[] hb = ha.ComputeHash(keyByteArray);
sKey = new byte[8];
sIV = new byte[8];
for (int i = 0; i < 8; i++)
sKey[i] = hb[i];
for (int i = 8; i < 16; i++)
sIV[i - 8] = hb[i];
des.Key = sKey;
des.IV = sIV;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
#endregion 解密字符串
#region 解密文件
/// <summary>
/// 解密文件
/// </summary>
/// <param name="filePath">输入文件路径</param>
/// <param name="savePath">解密后输出文件路径</param>
/// <param name="keyStr">密码,可以为“”</param>
/// <returns></returns>
public bool DecryptFile(string filePath, string savePath, string keyStr)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
if (keyStr == "")
keyStr = key;
FileStream fs = File.OpenRead(filePath);
byte[] inputByteArray = new byte[fs.Length];
fs.Read(inputByteArray, 0, (int)fs.Length);
fs.Close();
byte[] keyByteArray = Encoding.Default.GetBytes(keyStr);
SHA1 ha = new SHA1Managed();
byte[] hb = ha.ComputeHash(keyByteArray);
sKey = new byte[8];
sIV = new byte[8];
for (int i = 0; i < 8; i++)
sKey[i] = hb[i];
for (int i = 8; i < 16; i++)
sIV[i - 8] = hb[i];
des.Key = sKey;
des.IV = sIV;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
fs = File.OpenWrite(savePath);
foreach (byte b in ms.ToArray())
{
fs.WriteByte(b);
}
fs.Close();
cs.Close();
ms.Close();
return true;
}
#endregion 解密文件
}
}

@ -0,0 +1,30 @@
using NLog;
using NLog.LayoutRenderers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools.Nlog
{
/// <summary>
/// Nlog 日志调用方命名空间名称
/// </summary>
[LayoutRenderer("callsite-namespace")]
public class CallsiteNamespaceLayoutRenderer : LayoutRenderer
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
if (logEvent != null && !string.IsNullOrEmpty(logEvent.CallerClassName) && logEvent.CallerClassName.Contains("."))
{
// 获取命名空间(如果类型在命名空间中)
var namespaceName = logEvent.CallerClassName.ToString().Split(".")[0];
if (!string.IsNullOrEmpty(namespaceName))
{
builder.Append(namespaceName);
}
}
}
}
}

@ -0,0 +1,21 @@
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools.Nlog
{
/// <summary>
/// 日志静态类
/// </summary>
public class LogHelper
{
/// <summary>
/// 日志调用对象
/// </summary>
public static readonly NLog.Logger Log = LogManager.GetCurrentClassLogger();
}
}

@ -0,0 +1,165 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
namespace LIS_Platform_Linker.Tools
{
/// <summary>
/// 返回结果封装
/// </summary>
public static class Result
{
/// <summary>
/// 响应枚举
/// </summary>
public enum ResultType
{
[Description("成功")]
SUCCESS = 200,
[Description("失败")]
ERROR = 500,
}
/// <summary>
/// 获取枚举描述
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public static string GetDescription(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
//自定义属性
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
}
/// <summary>
/// 获取枚举的值
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public static int GetField(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
return field != null ? Convert.ToInt32(field.GetValue(val)) : 0;
}
/// <summary>
/// 通过code获取枚举描述
/// </summary>
/// <param name="code">code</param>
/// <returns></returns>
public static string GetMessageByCode(int code)
{
// 获取枚举名称
var name = Enum.GetName(typeof(ResultType), code);
// 获取ResultType中名称为name的对象
var item = Enum.Parse(typeof(ResultType), name);
return GetDescription((Enum)item);
}
/// <summary>
/// 响应返回(失败)
/// </summary>
/// <param name="resStatus">响应类型对象</param>
/// <param name="data"></param>
/// <returns></returns>
public static ActionResult Fail(ResultType resStatus, object data)
{
var code = GetField(resStatus);
var message = GetDescription(resStatus);
return new ObjectResult(new ResultModel(code, message, data));
}
public static ActionResult Fail(ResultType resStatus)
{
var code = GetField(resStatus);
var message = GetDescription(resStatus);
return new ObjectResult(new ResultModel(code, message, null));
}
/// <summary>
/// 响应返回(失败)
/// </summary>
/// <param name="code">响应代码</param>
/// <param name="data">响应数据</param>
/// <returns></returns>
public static ActionResult Fail(int code, object data)
{
var message = GetMessageByCode(code);
return new ObjectResult(new ResultModel(code, message, data));
}
public static ActionResult Fail(string message)
{
return new ObjectResult(new ResultModel(500, message, null));
}
public static ActionResult Fail(string message, object data)
{
return new ObjectResult(new ResultModel(500, message, data));
}
public static ActionResult Fail()
{
return new ObjectResult(new ResultModel(500, "失败", null));
}
/// <summary>
/// 响应返回(成功)
/// </summary>
/// <param name="data">响应数据</param>
/// <returns></returns>
public static ActionResult Success(object data)
{
return new ObjectResult(new ResultModel(200, "成功", data));
}
/// <summary>
/// 响应返回(成功)
/// </summary>
/// <returns></returns>
public static ActionResult Success()
{
return new ObjectResult(new ResultModel(200, "成功", null));
}
}
/// <summary>
/// 接口响应实体
/// </summary>
public class ResultModel
{
/// <summary>
/// code
/// </summary>
public int code { get; set; }
/// <summary>
/// 响应信息
/// </summary>
public string message { get; set; }
/// <summary>
/// 响应数据
/// </summary>
public object data { get; set; }
public ResultModel()
{
}
public ResultModel(int code, string message, object data)
{
this.code = code;
this.message = message;
this.data = data;
}
public override string ToString()
{
return $"code={this.code},message={this.message},data={this.data}";
}
}
}

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

@ -0,0 +1,15 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionString": "10C598E364BCAFCFDC6960B18CB026C75BD46245729DFD1D5BA71CC4E633BF9331462312CA70E7AAF675E8DF1A3F3D8BC9D22C1D1906F33A35CCAA2FBA518461F9EA2F0925C3F6B9A4019DAD079E279A175C0642D39D79126EC4BA2D83549E45B8D6257379A298386F60C60A0BF938CE",
"PlatformUrl": "http://127.0.0.1:5050",
"HospitalCode": "001",
"HospitalName": "测试医院"
}

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Info">
<!-- 启用.net core的核心布局渲染器 -->
<extensions>
<add assembly="NLog.Web.AspNetCore" />
<add assembly="PeisReserve.Helper.Nlog" />
</extensions>
<!-- 变量 -->
<!-- 控制器、方法,以及是否显示 -->
<variable name="vController"
value="${when:when= '${aspnet-mvc-controller}'=='':then='':else=【url\:${vUrl}】}"></variable>
<!-- Url以及是否显示 -->
<variable name="vUrl"
value="${when:when= '${aspnet-mvc-controller}'=='':then='':else=${aspnet-mvc-controller}/${aspnet-mvc-action}}"></variable>
<!-- 命名空间名称 -->
<variable name="namespace"
value="${when:when='${callsite}'=='':then='':else=${callsite-namespace}}"></variable>
<!-- 类名 -->
<variable name="class-name"
value="${callsite:className=true:methodName=false:includeNamespace=false}"></variable>
<!-- 方法名 -->
<variable name="method-name"
value="${callsite:className=false:methodName=true:includeNamespace=false}"></variable>
<!-- 日期时间格式化 -->
<variable name="date-format"
value="【${date:format=yyyy-MM-dd HH\:mm\:ss}】"></variable>
<!-- 调用类名和方法 || '${class-name}'=='PersonalService' -->
<variable name="caller"
value="${when:when='${class-name}'=='MyResultFilter':inner=【${vUrl}】:else=【${class-name} - ${method-name} - ${callsite-linenumber}】}"></variable>
<!-- 写入日志的目标配置 -->
<targets>
<!-- 信息 -->
<target xsi:type="File"
name="info"
fileName="logs/info/${shortdate}.txt"
readOnly="true"
layout="【${time}】【${uppercase:${level}}】${caller}${vController}${message}" />
<!-- 错误 -->
<target xsi:type="File"
name="error"
fileName="logs/error/${shortdate}.txt"
readOnly="true"
layout="【${time}】【${uppercase:${level}}】${caller}${vController}${message}" />
<!-- 调试 -->
<target xsi:type="File"
name="debug"
fileName="logs/debug/${shortdate}.txt"
readOnly="true"
layout="【${time}】【${uppercase:${level}}】${caller}${vController}${message}" />
<!-- 控制台输出 -->
<target xsi:type="Console"
name="console"
layout="${date-format}${uppercase:${level}}${caller}${vController}${message}" />
</targets>
<!-- 映射规则 -->
<rules>
<!-- 调试 -->
<logger name="*" minlevel="Trace" maxlevel="Debug" writeTo="debug" />
<!-- 警告 -->
<logger name="*" level="Info" writeTo="info" />
<!-- 错误 -->
<logger name="*" minlevel="Warn" maxlevel="Error" writeTo="error" />
<!-- 控制台输出 -->
<logger name="*" minlevel="Info" maxlevel="Error" writeTo="console" final="true" />
</rules>
</nlog>
Loading…
Cancel
Save