diff --git a/CompressToExe/CompressToExe.csproj b/CompressToExe/CompressToExe.csproj new file mode 100644 index 00000000..b57c89e6 --- /dev/null +++ b/CompressToExe/CompressToExe.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net6.0-windows + enable + true + enable + + + \ No newline at end of file diff --git a/CompressToExe/Form1.Designer.cs b/CompressToExe/Form1.Designer.cs new file mode 100644 index 00000000..b758a303 --- /dev/null +++ b/CompressToExe/Form1.Designer.cs @@ -0,0 +1,39 @@ +namespace CompressToExe +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "Form1"; + } + + #endregion + } +} \ No newline at end of file diff --git a/CompressToExe/Form1.cs b/CompressToExe/Form1.cs new file mode 100644 index 00000000..b5803f23 --- /dev/null +++ b/CompressToExe/Form1.cs @@ -0,0 +1,10 @@ +namespace CompressToExe +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/CompressToExe/Program.cs b/CompressToExe/Program.cs new file mode 100644 index 00000000..7a17e829 --- /dev/null +++ b/CompressToExe/Program.cs @@ -0,0 +1,17 @@ +namespace CompressToExe +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/EI_Image_Viewer/EI_Image_Viewer.vdproj b/EI_Image_Viewer/EI_Image_Viewer.vdproj new file mode 100644 index 00000000..c5764318 --- /dev/null +++ b/EI_Image_Viewer/EI_Image_Viewer.vdproj @@ -0,0 +1,723 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:EI_Image_Viewer" +"LanguageId" = "3:2052" +"CodePage" = "3:936" +"UILanguageId" = "3:2052" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_671ACE803849427ABF43662CDE6B54E3" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_6BD8B282CE934C3AAD3841638BE9D51E" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\EI_Image_Viewer.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\EI_Image_Viewer.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + } + } + "File" + { + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_6BD8B282CE934C3AAD3841638BE9D51E" + { + "SourcePath" = "8:D:\\Soft\\WX\\WeChat Files\\WeChat Files\\wxid_r2imdzb7j3q922\\FileStorage\\File\\2023-04\\favicon.ico" + "TargetName" = "8:favicon.ico" + "Tag" = "8:" + "Folder" = "8:_FC6A2494EDBE4963A84EBD88E04B3F04" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{1525181F-901A-416C-8A58-119130FE478E}:_8D81C358540F4384A07E881ECA670B06" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_CEB3ABC1E0034A319A55466553922586" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_FC6A2494EDBE4963A84EBD88E04B3F04" + { + "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:2052" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:EI_Image_Viewer" + "ProductCode" = "8:{E8F96E3C-EA54-429B-BB58-B5ED2D6FCA8C}" + "PackageCode" = "8:{908AC8AE-E525-45D8-A456-9C695A3B4D9C}" + "UpgradeCode" = "8:{DAEA1B25-CE0C-4ED7-A6E1-A0E32F09B34B}" + "AspNetVersion" = "8:4.0.30319.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:FALSE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:FALSE" + "ProductVersion" = "8:1.0.0" + "Manufacturer" = "8:微软中国" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:" + "Title" = "8:EI_Image_Viewer" + "Subject" = "8:" + "ARPCONTACT" = "8:微软中国" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:" + "ARPURLINFOABOUT" = "8:" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4B3A8DDB66C14C26B1FDEB73E654D73E" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D4DC14C1806A4415B3D158086D20A384" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FDC39226C9AF424BA1A2EB9CB480C9AF" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EA384AA6FD9B43348966A96518AFEDCB" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_36E629868FD94281A9512B653A68C76E" + { + "Name" = "8:Shortcut to 发布项 from Start (Active)" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_671ACE803849427ABF43662CDE6B54E3" + "Folder" = "8:_FC6A2494EDBE4963A84EBD88E04B3F04" + "WorkingFolder" = "8:_FC6A2494EDBE4963A84EBD88E04B3F04" + "Icon" = "8:_6BD8B282CE934C3AAD3841638BE9D51E" + "Feature" = "8:" + } + } + "UserInterface" + { + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1CCA0CBF4AED4FC48560F2AF5AAD31B6" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_36E70F23303C475EAD3030D279A6D0AE" + { + "Sequence" = "3:200" + "DisplayName" = "8:安装文件夹" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D5D84CAA84CE405B84FCD1F603BF5A04" + { + "Sequence" = "3:100" + "DisplayName" = "8:欢迎使用" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F2AE58A5FFC9409F8C3BC02EC666A4E1" + { + "Sequence" = "3:300" + "DisplayName" = "8:确认安装" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_621AF3658AF94FB7B1CDFF5DF1609491" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_818FD021D326496AB2F1D52C8713ACE1" + { + "Sequence" = "3:100" + "DisplayName" = "8:已完成" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8B8A18872BD040FF9FD618D775AFD701" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C476041D34EB4C48B4BBF6EE9B23EB0B" + { + "Sequence" = "3:100" + "DisplayName" = "8:进度" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_A83D160A087845238F7A677809EDA0C8" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_AA1E9CA25272498B836014BB47156D90" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_251EAFC6E38642FBB5C702BE6B1FDB30" + { + "Sequence" = "3:100" + "DisplayName" = "8:进度" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_C9A8427C4B4A483095D2544D9175A5E4" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_70E6B3E76711448496915BDC2763B21F" + { + "Sequence" = "3:100" + "DisplayName" = "8:欢迎使用" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_978CF68169D34FF7A0C440DCE87C41F7" + { + "Sequence" = "3:300" + "DisplayName" = "8:确认安装" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E17D627579F34787981DEE6B595B7F1E" + { + "Sequence" = "3:200" + "DisplayName" = "8:安装文件夹" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_CF08905C7B824DAA802D43F4223E1BA2" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D2E0AB446E6241D8ABE6FD9CD0E01163" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_315C6B4D72B74607BEDFF0BCFC8DD40F" + { + "Sequence" = "3:100" + "DisplayName" = "8:已完成" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_671ACE803849427ABF43662CDE6B54E3" + { + "SourcePath" = "8:..\\Start\\obj\\Debug\\net6.0-windows\\apphost.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FC6A2494EDBE4963A84EBD88E04B3F04" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:PublishItems" + "OutputProjectGuid" = "8:{D96F4B52-359C-43C9-8110-BAD1437F9280}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +} diff --git a/EI_Image_Viewer_Activation/EI_Image_Viewer_Activation.csproj b/EI_Image_Viewer_Activation/EI_Image_Viewer_Activation.csproj new file mode 100644 index 00000000..7b46caa4 --- /dev/null +++ b/EI_Image_Viewer_Activation/EI_Image_Viewer_Activation.csproj @@ -0,0 +1,17 @@ + + + + WinExe + net6.0-windows + enable + true + enable + icons8-access-control-64.ico + AnyCPU;x64 + + + + + + + \ No newline at end of file diff --git a/EI_Image_Viewer_Activation/Main.Designer.cs b/EI_Image_Viewer_Activation/Main.Designer.cs new file mode 100644 index 00000000..b2c8e50d --- /dev/null +++ b/EI_Image_Viewer_Activation/Main.Designer.cs @@ -0,0 +1,120 @@ +namespace EI_Image_Viewer_Activation +{ + partial class Main + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); + label1 = new Label(); + label2 = new Label(); + codeTBox = new TextBox(); + activeSecreteTbox = new TextBox(); + btnCopy = new Button(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Font = new Font("Microsoft YaHei UI", 15F, FontStyle.Regular, GraphicsUnit.Point); + label1.Location = new Point(54, 69); + label1.Margin = new Padding(4, 0, 4, 0); + label1.Name = "label1"; + label1.Size = new Size(72, 27); + label1.TabIndex = 0; + label1.Text = "机器码"; + // + // label2 + // + label2.AutoSize = true; + label2.Font = new Font("Microsoft YaHei UI", 15F, FontStyle.Regular, GraphicsUnit.Point); + label2.Location = new Point(54, 183); + label2.Margin = new Padding(4, 0, 4, 0); + label2.Name = "label2"; + label2.Size = new Size(72, 27); + label2.TabIndex = 1; + label2.Text = "激活码"; + // + // codeTBox + // + codeTBox.Font = new Font("Microsoft YaHei UI", 15F, FontStyle.Regular, GraphicsUnit.Point); + codeTBox.Location = new Point(168, 69); + codeTBox.Margin = new Padding(4); + codeTBox.Name = "codeTBox"; + codeTBox.Size = new Size(424, 33); + codeTBox.TabIndex = 2; + codeTBox.TextChanged += codeTBox_TextChanged; + // + // activeSecreteTbox + // + activeSecreteTbox.Enabled = false; + activeSecreteTbox.Font = new Font("Microsoft YaHei UI", 15F, FontStyle.Regular, GraphicsUnit.Point); + activeSecreteTbox.Location = new Point(168, 183); + activeSecreteTbox.Margin = new Padding(4); + activeSecreteTbox.Name = "activeSecreteTbox"; + activeSecreteTbox.Size = new Size(424, 33); + activeSecreteTbox.TabIndex = 3; + // + // btnCopy + // + btnCopy.Font = new Font("Microsoft YaHei UI", 15F, FontStyle.Regular, GraphicsUnit.Point); + btnCopy.Location = new Point(619, 178); + btnCopy.Margin = new Padding(4); + btnCopy.Name = "btnCopy"; + btnCopy.Size = new Size(144, 41); + btnCopy.TabIndex = 4; + btnCopy.Text = "拷贝"; + btnCopy.UseVisualStyleBackColor = true; + btnCopy.Click += btnCopy_Click; + // + // Main + // + AutoScaleDimensions = new SizeF(10F, 21F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(818, 498); + Controls.Add(btnCopy); + Controls.Add(activeSecreteTbox); + Controls.Add(codeTBox); + Controls.Add(label2); + Controls.Add(label1); + Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point); + Icon = (Icon)resources.GetObject("$this.Icon"); + Margin = new Padding(4); + Name = "Main"; + Text = "EI_Image_viewer Activation"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label2; + private TextBox codeTBox; + private TextBox activeSecreteTbox; + private Button btnCopy; + } +} \ No newline at end of file diff --git a/EI_Image_Viewer_Activation/Main.cs b/EI_Image_Viewer_Activation/Main.cs new file mode 100644 index 00000000..1bedfac8 --- /dev/null +++ b/EI_Image_Viewer_Activation/Main.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace EI_Image_Viewer_Activation +{ + public partial class Main : Form + { + public Main() + { + InitializeComponent(); + } + + private void btnCopy_Click(object sender, EventArgs e) + { + Clipboard.SetText(activeSecreteTbox.Text); + + MessageBox.Show("拷贝成功!"); + } + + private void codeTBox_TextChanged(object sender, EventArgs e) + { + this.activeSecreteTbox.Text = Md5($"{this.codeTBox.Text.Trim()}_XINGCANG"); + } + + public static string Md5(string target) + { + using (MD5 md5 = MD5.Create()) + { // MD5非线程安全 + byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(target)); + StringBuilder sb = new StringBuilder(32); + for (int i = 0; i < bytes.Length; ++i) + sb.Append(bytes[i].ToString("x2")); + return sb.ToString(); + } + } + } +} diff --git a/EI_Image_Viewer_Activation/Main.resx b/EI_Image_Viewer_Activation/Main.resx new file mode 100644 index 00000000..6a9f3436 --- /dev/null +++ b/EI_Image_Viewer_Activation/Main.resx @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAABMLAAATCwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVaoDdW+EYnVvhGJVVaoDAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1bYU/dW6Dz3Ru + g/J0boPydW6Dz3VthT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZt + fxx0b4SidG6E/XRvhKJ0an8YcnJ/FHVug5F1b4P8dG+Es3NsgyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAf2Z/CnVvg4B1boP2dW+EynRvhjkAAAAAAAAAAAAAAAAAAAAAdXCEMnRvhMN0boT5dW6DkXV1 + iQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 6vvx5ur98ufqovPn5xYAAAAAAAAAAH9mfwp1b4R3dG+E83Rug8t2bYM6AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AXVvhFV1b4TgdW6D5HRv + hF4AAP8BAAAAAAAAAADy5uwp8ubsKQAAAAAAAAAAAAAAAHNwhE10boPfdG+E5XVuhGZ/f38CAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAf2Z/CnVvg4B1boP2dW+EynRvhjkAAAAAAAAAAAAAAAAAAAAAdXCEMnRug8J0boT5dW6DkXV1 + iQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm1/HHRvhKJ0boT9dG+EonRqfxhycn8UdW6DkXVv + g/x0b4Szc2yDIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdW2FP3Vu + g890boPydG6D8nVug891bYU/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVVaoDdW+EYnVvhGJVVaoDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/////////////////////////////////////////////////////////////////////D// + ///////4H////////+AH////////g8H///////4GcH///////BgYP//////wYAYP/////8HBg4P///// + gwfgwf////4MH/gwf///+DB//gwf///g4P//Bwf//8GD///Bg///hg4AAHBh//+MHgAAeBH//4h+AAB+ + Ef//if5//n+R//+J/n/+f5H//4n+fn5/kf//if5+fn+R//+J/n5+f5H//4n+fn5/kf//if58Pn+R//+J + /ngef5H//4n+eB5/kf//if55nn+R//+J/ngef5H//4n+fD5/kf//if5//n+R//+J/n/+f5H//4n+f/5/ + kf//if4AAH+R//+J/gAAf5H//4n/z/P/kf//if/P8/+R//+J/8/z/5H//4h/z/P+Ef//jB/H4/gR//+G + D8PD8GH//8GD4AfBg///4ODwDwcH///4MH5+DB////4MH/gwf////4MH4MH/////wcGDg//////wYAYP + //////wYGD///////gZwf///////g8H////////gB/////////gf/////////D////////////////// + //////////////////////////////////////////////////8= + + + \ No newline at end of file diff --git a/EI_Image_Viewer_Activation/Program.cs b/EI_Image_Viewer_Activation/Program.cs new file mode 100644 index 00000000..3735e4ae --- /dev/null +++ b/EI_Image_Viewer_Activation/Program.cs @@ -0,0 +1,17 @@ +namespace EI_Image_Viewer_Activation +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Main()); + } + } +} \ No newline at end of file diff --git a/EI_Image_Viewer_Activation/icons8-access-control-64.ico b/EI_Image_Viewer_Activation/icons8-access-control-64.ico new file mode 100644 index 00000000..2231ed0d Binary files /dev/null and b/EI_Image_Viewer_Activation/icons8-access-control-64.ico differ diff --git a/IRaCIS.Core.API.sln b/IRaCIS.Core.API.sln index cb23da7d..a077bf2b 100644 --- a/IRaCIS.Core.API.sln +++ b/IRaCIS.Core.API.sln @@ -11,80 +11,174 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Application", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Domain.Share", "IRaCIS.Core.Domain.Share\IRaCIS.Core.Domain.Share.csproj", "{7CBC76F5-3817-46B7-8D9D-79253A89B578}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.JWT.RS256", "ZhiZhunAuthenticationCenter\IRaCIS.JWT.RS256.csproj", "{3EF210EE-D5D1-4C93-A8FA-E0DB1852BD39}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Test", "IRaCIS.Core.Test\IRaCIS.Core.Test.csproj", "{3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Infra.EFCore", "IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj", "{6D8115E5-84D6-424B-8F8D-0C2D40347A8C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Infrastructure", "IRaCIS.Core.Infrastructure\IRaCIS.Core.Infrastructure.csproj", "{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IRaCIS.AuthenticationCenter", "IRaCIS.AuthenticationCenter", "{481329D6-B8A0-491F-A398-1DF66A0FBB62}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EI_Image_Viewer_Installer", "Start\EI_Image_Viewer_Installer.csproj", "{D96F4B52-359C-43C9-8110-BAD1437F9280}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.IdentityServer4", "IRaCIS.Core.IdentityServer4\IRaCIS.Core.IdentityServer4.csproj", "{C3DD48CF-B8B3-40F6-9BDB-B7C7F0851674}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Install", "Install\Install.csproj", "{F5820DF0-DE23-4F4A-8D49-7E22F67B784D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.IdentityServer4.MVC", "IRaCIS.Core.IdentityServer4.MVC\IRaCIS.Core.IdentityServer4.MVC.csproj", "{F621ADD6-94E8-4A4B-998E-25B8EF15D39C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnInstall", "UnInstall\UnInstall.csproj", "{60B9AC72-5744-4517-93A5-A1ECD573A529}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F852ABFB-88AC-48BE-B876-2228BE2373D6}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EI_Image_Viewer_Activation", "EI_Image_Viewer_Activation\EI_Image_Viewer_Activation.csproj", "{1D8AC441-D578-4B38-BCEE-686BD5D59E5A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PublishSite", "PublishSite\PublishSite.csproj", "{1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Debug|x64.ActiveCfg = Debug|x64 + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Debug|x64.Build.0 = Debug|x64 + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Debug|x86.ActiveCfg = Debug|Any CPU + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Debug|x86.Build.0 = Debug|Any CPU {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Release|Any CPU.ActiveCfg = Release|Any CPU {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Release|Any CPU.Build.0 = Release|Any CPU + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Release|x64.ActiveCfg = Release|x64 + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Release|x64.Build.0 = Release|x64 + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Release|x86.ActiveCfg = Release|Any CPU + {F15CE209-6039-46A6-AE7F-E81ADA795F28}.Release|x86.Build.0 = Release|Any CPU {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Debug|x64.ActiveCfg = Debug|x64 + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Debug|x64.Build.0 = Debug|x64 + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Debug|x86.Build.0 = Debug|Any CPU {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Release|Any CPU.ActiveCfg = Release|Any CPU {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Release|Any CPU.Build.0 = Release|Any CPU + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Release|x64.ActiveCfg = Release|x64 + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Release|x64.Build.0 = Release|x64 + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Release|x86.ActiveCfg = Release|Any CPU + {D4DF27AC-3739-4264-BFB8-AED6DC2B84C7}.Release|x86.Build.0 = Release|Any CPU {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Debug|x64.ActiveCfg = Debug|x64 + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Debug|x64.Build.0 = Debug|x64 + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Debug|x86.ActiveCfg = Debug|Any CPU + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Debug|x86.Build.0 = Debug|Any CPU {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Release|Any CPU.ActiveCfg = Release|Any CPU {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Release|Any CPU.Build.0 = Release|Any CPU + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Release|x64.ActiveCfg = Release|x64 + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Release|x64.Build.0 = Release|x64 + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Release|x86.ActiveCfg = Release|Any CPU + {037E7DE9-0AE2-4987-8C69-F51D5B9CA19D}.Release|x86.Build.0 = Release|Any CPU {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Debug|x64.ActiveCfg = Debug|x64 + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Debug|x64.Build.0 = Debug|x64 + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Debug|x86.ActiveCfg = Debug|Any CPU + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Debug|x86.Build.0 = Debug|Any CPU {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Release|Any CPU.ActiveCfg = Release|Any CPU {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Release|Any CPU.Build.0 = Release|Any CPU - {3EF210EE-D5D1-4C93-A8FA-E0DB1852BD39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3EF210EE-D5D1-4C93-A8FA-E0DB1852BD39}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3EF210EE-D5D1-4C93-A8FA-E0DB1852BD39}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3EF210EE-D5D1-4C93-A8FA-E0DB1852BD39}.Release|Any CPU.Build.0 = Release|Any CPU + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Release|x64.ActiveCfg = Release|x64 + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Release|x64.Build.0 = Release|x64 + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Release|x86.ActiveCfg = Release|Any CPU + {7CBC76F5-3817-46B7-8D9D-79253A89B578}.Release|x86.Build.0 = Release|Any CPU {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Debug|x64.ActiveCfg = Debug|x64 + {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Debug|x86.ActiveCfg = Debug|Any CPU {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Release|Any CPU.Build.0 = Release|Any CPU + {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Release|x64.ActiveCfg = Release|x64 + {3292B2B4-6E8A-43AA-84C0-AB4A391E8A2A}.Release|x86.ActiveCfg = Release|Any CPU {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Debug|x64.ActiveCfg = Debug|x64 + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Debug|x64.Build.0 = Debug|x64 + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Debug|x86.ActiveCfg = Debug|Any CPU + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Debug|x86.Build.0 = Debug|Any CPU {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Release|Any CPU.ActiveCfg = Release|Any CPU {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Release|Any CPU.Build.0 = Release|Any CPU + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Release|x64.ActiveCfg = Release|x64 + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Release|x64.Build.0 = Release|x64 + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Release|x86.ActiveCfg = Release|Any CPU + {6D8115E5-84D6-424B-8F8D-0C2D40347A8C}.Release|x86.Build.0 = Release|Any CPU {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|x64.ActiveCfg = Debug|x64 + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|x64.Build.0 = Debug|x64 + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|x86.ActiveCfg = Debug|Any CPU + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|x86.Build.0 = Debug|Any CPU {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|Any CPU.ActiveCfg = Release|Any CPU {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|Any CPU.Build.0 = Release|Any CPU - {C3DD48CF-B8B3-40F6-9BDB-B7C7F0851674}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C3DD48CF-B8B3-40F6-9BDB-B7C7F0851674}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C3DD48CF-B8B3-40F6-9BDB-B7C7F0851674}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C3DD48CF-B8B3-40F6-9BDB-B7C7F0851674}.Release|Any CPU.Build.0 = Release|Any CPU - {F621ADD6-94E8-4A4B-998E-25B8EF15D39C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F621ADD6-94E8-4A4B-998E-25B8EF15D39C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F621ADD6-94E8-4A4B-998E-25B8EF15D39C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F621ADD6-94E8-4A4B-998E-25B8EF15D39C}.Release|Any CPU.Build.0 = Release|Any CPU + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|x64.ActiveCfg = Release|x64 + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|x64.Build.0 = Release|x64 + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|x86.ActiveCfg = Release|Any CPU + {07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|x86.Build.0 = Release|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Debug|x64.ActiveCfg = Debug|x64 + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Debug|x64.Build.0 = Debug|x64 + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Debug|x86.ActiveCfg = Debug|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Debug|x86.Build.0 = Debug|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Release|Any CPU.Build.0 = Release|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Release|x64.ActiveCfg = Release|x64 + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Release|x64.Build.0 = Release|x64 + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Release|x86.ActiveCfg = Release|Any CPU + {D96F4B52-359C-43C9-8110-BAD1437F9280}.Release|x86.Build.0 = Release|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Debug|x64.ActiveCfg = Debug|x64 + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Debug|x64.Build.0 = Debug|x64 + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Debug|x86.ActiveCfg = Debug|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Debug|x86.Build.0 = Debug|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Release|Any CPU.Build.0 = Release|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Release|x64.ActiveCfg = Release|x64 + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Release|x64.Build.0 = Release|x64 + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Release|x86.ActiveCfg = Release|Any CPU + {F5820DF0-DE23-4F4A-8D49-7E22F67B784D}.Release|x86.Build.0 = Release|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Debug|x64.ActiveCfg = Debug|x64 + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Debug|x64.Build.0 = Debug|x64 + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Debug|x86.ActiveCfg = Debug|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Debug|x86.Build.0 = Debug|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Release|Any CPU.Build.0 = Release|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Release|x64.ActiveCfg = Release|x64 + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Release|x64.Build.0 = Release|x64 + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Release|x86.ActiveCfg = Release|Any CPU + {60B9AC72-5744-4517-93A5-A1ECD573A529}.Release|x86.Build.0 = Release|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Debug|x64.ActiveCfg = Debug|x64 + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Debug|x64.Build.0 = Debug|x64 + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Debug|x86.ActiveCfg = Debug|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Debug|x86.Build.0 = Debug|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Release|Any CPU.Build.0 = Release|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Release|x64.ActiveCfg = Release|x64 + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Release|x64.Build.0 = Release|x64 + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Release|x86.ActiveCfg = Release|Any CPU + {1D8AC441-D578-4B38-BCEE-686BD5D59E5A}.Release|x86.Build.0 = Release|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Debug|x64.ActiveCfg = Debug|x64 + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Debug|x64.Build.0 = Debug|x64 + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Debug|x86.ActiveCfg = Debug|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Debug|x86.Build.0 = Debug|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Release|Any CPU.Build.0 = Release|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Release|x64.ActiveCfg = Release|x64 + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Release|x64.Build.0 = Release|x64 + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Release|x86.ActiveCfg = Release|Any CPU + {1CC3F0F8-8701-4F49-837B-DBFDAC2C19ED}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {3EF210EE-D5D1-4C93-A8FA-E0DB1852BD39} = {481329D6-B8A0-491F-A398-1DF66A0FBB62} - {C3DD48CF-B8B3-40F6-9BDB-B7C7F0851674} = {481329D6-B8A0-491F-A398-1DF66A0FBB62} - {F621ADD6-94E8-4A4B-998E-25B8EF15D39C} = {481329D6-B8A0-491F-A398-1DF66A0FBB62} - EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BCC2EB19-3914-489B-B1D7-B7303E0218A3} EndGlobalSection diff --git a/IRaCIS.Core.API/AnonymizeTagSetting.json b/IRaCIS.Core.API/AnonymizeTagSetting.json deleted file mode 100644 index 6576ca04..00000000 --- a/IRaCIS.Core.API/AnonymizeTagSetting.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "needAnonymizeTag": [ - { //PatientsName - "Group": "0010", - "Element": "0010", - "ReplaceValue": "", - "Enable": true - }, - { // PatientID - "Group": "0010", - "Element": "0020", - "ReplaceValue": "", - "Enable": true - }, - { // IssuerOfPatientID - "Group": "0010", - "Element": "0021", - "ReplaceValue": "", - "Enable": true - }, - { // PatientsBirthDate - "Group": "0010", - "Element": "0030", - "ReplaceValue": "", - "Enable": true - }, - { // PatientsBirthTime - "Group": "0010", - "Element": "0032", - "ReplaceValue": "", - "Enable": false - }, - { // PatientsSex - "Group": "0010", - "Element": "0040", - "ReplaceValue": "", - "Enable": false - }, - { // OtherPatientIDs - "Group": "0010", - "Element": "1000", - "ReplaceValue": "", - "Enable": false - }, - { // OtherPatientNames - "Group": "0010", - "Element": "1001", - "ReplaceValue": "", - "Enable": false - }, - { // OtherPatientNames - "Group": "0010", - "Element": "1005", - "ReplaceValue": "", - "Enable": true - }, - { // PatientBirthName - "Group": "0010", - "Element": "1005", - "ReplaceValue": "", - "Enable": true - }, - { // PatientsAge - "Group": "0010", - "Element": "1010", - "ReplaceValue": "", - "Enable": true - }, - { // PatientsAddress - "Group": "0010", - "Element": "1040", - "ReplaceValue": "", - "Enable": true - }, - { // PatientsMothersBirthName - "Group": "0010", - "Element": "1060", - "ReplaceValue": "", - "Enable": true - }, - { - "Group": "0010", - "Element": "2150", - "ReplaceValue": "", - "Enable": true - }, - { - "Group": "0010", - "Element": "2152", - "ReplaceValue": "", - "Enable": true - }, - { - "Group": "0010", - "Element": "2154", - "ReplaceValue": "", - "Enable": true - }, - { - "Group": "0012", - "Element": "0040", - "ReplaceValue": "XXX", - "Enable": true - } - ] -} \ No newline at end of file diff --git a/IRaCIS.Core.API/Controllers/FinancialChangeController.cs b/IRaCIS.Core.API/Controllers/FinancialChangeController.cs index 282891a3..2b21a1d5 100644 --- a/IRaCIS.Core.API/Controllers/FinancialChangeController.cs +++ b/IRaCIS.Core.API/Controllers/FinancialChangeController.cs @@ -31,19 +31,19 @@ namespace IRaCIS.Core.API.Controllers.Special } - //[TrialAudit(AuditType.TrialAudit, AuditOptType.AddOrUpdateTrial)] + ////[TrialAudit(AuditType.TrialAudit, AuditOptType.AddOrUpdateTrial)] - /// 添加实验项目-返回新增Id[AUTH] - /// 新记录Id - [HttpPost, Route("Inspection/trial/addOrUpdateTrial")] - [UnitOfWork] + ///// 添加实验项目-返回新增Id[AUTH] + ///// 新记录Id + //[HttpPost, Route("Inspection/trial/addOrUpdateTrial")] + //[UnitOfWork] - public async Task AddOrUpdateTrialInspection(DataInspectionDto opt) - { - var fun =await AddOrUpdateTrial(opt.Data); + //public async Task AddOrUpdateTrialInspection(DataInspectionDto opt) + //{ + // var fun =await AddOrUpdateTrial(opt.Data); - return fun; - } + // return fun; + //} /// 添加实验项目-返回新增Id[AUTH] @@ -53,10 +53,10 @@ namespace IRaCIS.Core.API.Controllers.Special [Authorize(Policy = IRaCISPolicy.PM_APM)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AddOrUpdateTrial", "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })] - public async Task> AddOrUpdateTrial(TrialCommand param) + public async Task> AddOrUpdateTrial(TrialCommand param, [FromServices] ITrialConfigService _ITrialConfigService) { var userId = Guid.Parse(User.FindFirst("id").Value); - var result = await _trialService.AddOrUpdateTrial(param); + var result = await _trialService.AddOrUpdateTrial(param, _ITrialConfigService); if (_trialService.TrialExpeditedChange) { diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index 91a74a73..e548d07b 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -329,7 +329,7 @@ namespace IRaCIS.Core.API.Controllers /// - /// CRC RequestToQC 批量提交 + /// IC RequestToQC 批量提交 /// /// /// @@ -392,7 +392,7 @@ namespace IRaCIS.Core.API.Controllers /// - /// CRC 设置已经重传完成 + /// IC 设置已经重传完成 /// [HttpPost, Route("Inspection/QCOperation/SetReuploadFinished")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index cd7ab7fb..8eec838d 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -385,7 +385,7 @@ namespace IRaCIS.Core.API.Controllers if (archivedStudyIds.Count > 0) // 上传成功,处理逻辑 { - // 同一个访视 多个线程上传处理 批量保存 可能造成死锁 https://www.cnblogs.com/johnblogs/p/9945767.html + // 同一个检查批次 多个线程上传处理 批量保存 可能造成死锁 https://www.cnblogs.com/johnblogs/p/9945767.html await _dicomArchiveService.DicomDBDataSaveChange(); @@ -434,7 +434,6 @@ namespace IRaCIS.Core.API.Controllers /// [HttpPost("ClinicalData/UploadVisitClinicalData/{trialId:guid}/{subjectVisitId:guid}")] [DisableRequestSizeLimit] - [Authorize(Policy = IRaCISPolicy.CRC)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task UploadVisitClinicalData(Guid subjectVisitId) @@ -672,7 +671,6 @@ namespace IRaCIS.Core.API.Controllers [RequestSizeLimit(1_073_741_824)] [HttpPost("NoneDicomStudy/UploadNoneDicomFile/{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}/{studyMonitorId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.CRC)] public async Task UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId, Guid studyMonitorId, [FromServices] IRepository _noneDicomStudyRepository, [FromServices] IRepository _studyMonitorRepository) { diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.csproj b/IRaCIS.Core.API/IRaCIS.Core.API.csproj index 9769b6bb..ee010747 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.csproj +++ b/IRaCIS.Core.API/IRaCIS.Core.API.csproj @@ -6,10 +6,14 @@ 354572d4-9e15-4099-807c-63a2d29ff9f2 default Linux - 1.0.1.001 - IRC影像系统 (EICS) - 上海展影医疗科技有限公司版权所有 - 上海展影医疗科技有限公司 + 武汉行藏科技有限公司版权所有 + + 1.0.0.001 + 医学影像处理软件 + 1.0.0.001 + favicon.ico + AnyCPU;x64 + EI_Image_Viewer @@ -18,12 +22,36 @@ ..\bin\ + + .\IRaCIS.Core.API.xml + 1701;1702;1591; + ..\bin\ + + + + .\IRaCIS.Core.API.xml + 1701;1702;1591; + ..\bin\ + + bin\Release\IRaCIS.Core.API.xml bin\Release\ 1701;1702;1591 + + bin\Release\IRaCIS.Core.API.xml + bin\Release\ + 1701;1702;1591 + + + + bin\Release\IRaCIS.Core.API.xml + bin\Release\ + 1701;1702;1591 + + @@ -48,6 +76,10 @@ + + + + Always @@ -86,6 +118,8 @@ + + @@ -103,9 +137,6 @@ - - Always - Always @@ -142,7 +173,7 @@ - + diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index 045a819c..999ba0b5 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -1,7 +1,7 @@ - IRaCIS.Core.API + EI_Image_Viewer @@ -32,11 +32,7 @@ 系统用户登录接口[New] - - 添加实验项目-返回新增Id[AUTH] - 新记录Id - - + 添加实验项目-返回新增Id[AUTH] 新记录Id @@ -175,7 +171,7 @@ - CRC RequestToQC 批量提交 + IC RequestToQC 批量提交 @@ -199,7 +195,7 @@ - CRC 设置已经重传完成 + IC 设置已经重传完成 diff --git a/IRaCIS.Core.API/NLog.config b/IRaCIS.Core.API/NLog.config deleted file mode 100644 index bf1dbbb1..00000000 --- a/IRaCIS.Core.API/NLog.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/IRaCIS.Core.API/Program.cs b/IRaCIS.Core.API/Program.cs index 7cd490da..e58662a7 100644 --- a/IRaCIS.Core.API/Program.cs +++ b/IRaCIS.Core.API/Program.cs @@ -9,14 +9,27 @@ using IRaCIS.Core.Application.MediatR.Handlers; using System.Threading.Tasks; using MassTransit; using MassTransit.NewIdProviders; +using System.IO; +using Newtonsoft.Json.Linq; +using System.Security.Cryptography; +using IRaCIS.Core.Infrastructure; +using System.Net.NetworkInformation; +using System.Linq; +using System.Text.Json.Nodes; +using Microsoft.EntityFrameworkCore; +using IRaCIS.Core.Infra.EFCore; +using Microsoft.Data.SqlClient; namespace IRaCIS.Core.API { public class Program { public readonly string environment; - public static async Task Main(string[] args) + public static async Task Main(string[] args) { + + + try { //ļΪ׼ urlȡֵ(дݲļ˾ͲҪݻ) @@ -59,6 +72,59 @@ namespace IRaCIS.Core.API //// Serilog SerilogExtension.AddSerilogSetup(enviromentName, host.Services); + + + #region ֤ + + if (!File.Exists($@"C:\ProgramData\.xingcang\config.json")) + { + Console.WriteLine("ǰδע"); + Log.Logger.Error("ǰδע"); + Console.ReadLine(); + return; + } + else + { + var json = File.ReadAllText($@"C:\ProgramData\.xingcang\config.json"); + + JObject jsonObject = JObject.Parse(json); + + var key = jsonObject["key"].ToString(); + + var value = jsonObject["value"].ToString(); + + + var physicalAddressList = NetworkInterface.GetAllNetworkInterfaces().Select(t => t.GetPhysicalAddress().ToString()); + + // жļĻǷDZ + if (!physicalAddressList.Contains(key)) + { + Console.WriteLine("ͱӦ"); + Log.Logger.Error("ͱӦ"); + Console.ReadLine(); + + return; + } + + + var secrete = MD5Helper.Md5($"{key}_XINGCANG"); + + if (value != secrete) + { + Console.WriteLine("ע벻ƥ"); + Log.Logger.Error("ע벻ƥ"); + Console.ReadLine(); + + return; + + } + + } + + #endregion + + + //Ŀ״̬ await InitCache(host); @@ -77,43 +143,6 @@ namespace IRaCIS.Core.API - #region Nlog - //var logger = NLog.Web.NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger(); - //try - //{ - // var ihostBuilder = CreateHostBuilder(args); - - // ihostBuilder.UseEnvironment(environment); - - // ihostBuilder.ConfigureAppConfiguration((hostContext, config) => - // { - - // //Console.WriteLine(hostContext.HostingEnvironment.EnvironmentName); - // config.AddJsonFile("appsettings.json", false, true) - // .AddJsonFile($"appsettings.{environment}.json", false, true); - // }); - - // var host = ihostBuilder.Build(); - - // CacheTrialStatus(host); - - // host.Run(); - - //} - //catch (Exception exception) - //{ - // //NLog: catch setup errors - // logger.Error(exception, "Stopped program because of exception"); - //} - //finally - //{ - // // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux) - // NLog.LogManager.Shutdown(); - //} - - #endregion - - } diff --git a/IRaCIS.Core.API/Startup.cs b/IRaCIS.Core.API/Startup.cs index 7bf6254c..6be3082d 100644 --- a/IRaCIS.Core.API/Startup.cs +++ b/IRaCIS.Core.API/Startup.cs @@ -115,7 +115,8 @@ namespace IRaCIS.Core.API //services.AddDistributedMemoryCache(); // hangfire ʱ н棬Ѻ~ - services.AddhangfireSetup(_configuration); + //services.AddhangfireSetup(_configuration); + // QuartZ ʱ ʹhangfire ʱãҪԴ򿪣Ѿ services.AddQuartZSetup(_configuration); @@ -172,7 +173,6 @@ namespace IRaCIS.Core.API //Ӧѹ app.UseResponseCompression(); - //app.UseCors(t => t.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); //Ҫ token ʵľ̬ļ wwwroot css, JavaScript, and images don't require authentication. app.UseStaticFiles(); @@ -181,14 +181,9 @@ namespace IRaCIS.Core.API //LogDashboard app.UseLogDashboard("/LogDashboard"); - //hangfire - app.UseHangfireConfig(env); + ////hangfire + //app.UseHangfireConfig(env); - ////ʱ - //app.UseHttpReports(); - - //// м - //app.UseIpRateLimiting(); @@ -202,7 +197,6 @@ namespace IRaCIS.Core.API } Console.WriteLine("ǰ " + env.EnvironmentName); - //app.UseMiddleware(); // 쳣 404 app.UseStatusCodePagesWithReExecute("/Error/{0}"); @@ -220,17 +214,9 @@ namespace IRaCIS.Core.API app.UseIRacisHostStaticFileStore(env); - - app.UseAuthentication(); - //app.UseJwtBearerQueryString(); app.UseAuthorization(); - ////ļŷ Token - ////app.UseIRacisHostStaticFileStore(env); - - - app.UseEndpoints(endpoints => { diff --git a/IRaCIS.Core.API/_ServiceExtensions/Authorization/AuthorizationPolicySetup.cs b/IRaCIS.Core.API/_ServiceExtensions/Authorization/AuthorizationPolicySetup.cs index a6ea6138..8e3ec147 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/Authorization/AuthorizationPolicySetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/Authorization/AuthorizationPolicySetup.cs @@ -12,13 +12,13 @@ namespace IRaCIS.Core.API { services.AddAuthorization(options => { - //影像质控策略 只允许 CRC IQC进行操作 + //影像质控策略 只允许 IC IQC进行操作 options.AddPolicy(IRaCISPolicy.CRC_IQC, policyBuilder => { policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ClinicalResearchCoordinator).ToString(), ((int)UserTypeEnum.IQC).ToString()); }); - //一致性核查策略 只允许 CRC PM APM 进行操作 + //一致性核查策略 只允许 IC PM APM 进行操作 options.AddPolicy(IRaCISPolicy.PM_APM_CRC, policyBuilder => { policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.ClinicalResearchCoordinator).ToString(), ((int)UserTypeEnum.APM).ToString()); @@ -47,10 +47,6 @@ namespace IRaCIS.Core.API policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.IQC).ToString()); }); - options.AddPolicy(IRaCISPolicy.CRC, policyBuilder => - { - policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ClinicalResearchCoordinator).ToString()); - }); options.AddPolicy(IRaCISPolicy.PM_APM_CRC_QC, policyBuilder => { diff --git a/IRaCIS.Core.API/_ServiceExtensions/QuartZSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/QuartZSetup.cs index bd48c49a..dec9e061 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/QuartZSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/QuartZSetup.cs @@ -1,6 +1,8 @@  +using IRaCIS.Application.Services.BackGroundJob; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Quartz; namespace IRaCIS.Core.API { @@ -8,37 +10,35 @@ namespace IRaCIS.Core.API { public static void AddQuartZSetup(this IServiceCollection services, IConfiguration configuration) { - //services.AddTransient(); + services.AddTransient(); - //services.AddQuartz(q => - //{ - // // base quartz scheduler, job and trigger configuration + services.AddQuartz(q => + { + // base quartz scheduler, job and trigger configuration - // // as of 3.3.2 this also injects scoped services (like EF DbContext) without problems - // q.UseMicrosoftDependencyInjectionJobFactory(); + // as of 3.3.2 this also injects scoped services (like EF DbContext) without problems + q.UseMicrosoftDependencyInjectionJobFactory(); - // // 基本Quartz调度器、作业和触发器配置 - // var jobKey = new JobKey("RegularTrialWork", "regularWorkGroup"); - // q.AddJob(jobKey, j => j - // .WithDescription("Trial regular work") - // ); - // q.AddTrigger(t => t - // .WithIdentity("TrialStatusTrigger") - // .ForJob(jobKey) - // //.StartNow() - // //.WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(15))//开始秒数 15s - // // .RepeatForever())//持续工作 - // .WithCronSchedule("0 0 0/2 * * ?")//每小时执行一次 - // .WithDescription("My regular trial work trigger") - // ); - //}); + // 基本Quartz调度器、作业和触发器配置 + var jobKey = new JobKey("RegularTrialWork", "regularWorkGroup"); + q.AddJob(jobKey, j => j + .WithDescription("Trial regular work") + ); + q.AddTrigger(t => t + .WithIdentity("TrialStatusTrigger") + .ForJob(jobKey) + + .WithCronSchedule("0 0 * * * ?")//每小时执行一次 + .WithDescription("My regular trial work trigger") + ); + }); - //// ASP.NET Core hosting - //services.AddQuartzServer(options => - //{ - // // when shutting down we want jobs to complete gracefully - // options.WaitForJobsToComplete = true; - //}); + // ASP.NET Core hosting + services.AddQuartzHostedService(options => + { + // when shutting down we want jobs to complete gracefully + options.WaitForJobsToComplete = true; + }); } } diff --git a/IRaCIS.Core.API/_ServiceExtensions/Swagger/SwaggerSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/Swagger/SwaggerSetup.cs index 4a16162e..56da182f 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/Swagger/SwaggerSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/Swagger/SwaggerSetup.cs @@ -114,9 +114,11 @@ namespace IRaCIS.Core.API //注意localhost:8001/swagger是访问不到的,去launchSettings.json把launchUrl去掉,如果你想换一个路径,直接写名字即可,比如直接写c.Route = "doc"; //options.RoutePrefix = string.Empty; - var data = Assembly.GetExecutingAssembly().Location; - options.IndexStream = () => Assembly.GetExecutingAssembly() - .GetManifestResourceStream("IRaCIS.Core.API.wwwroot.swagger.ui.Index.html"); + + + + //options.IndexStream = () => Assembly.GetExecutingAssembly() + //.GetManifestResourceStream("IRaCIS.Core.API.wwwroot.swagger.ui.Index.html"); options.RoutePrefix = string.Empty; diff --git a/IRaCIS.Core.API/appsettings.CertificateApply.json b/IRaCIS.Core.API/appsettings.CertificateApply.json index 2c04ce92..6324d02d 100644 --- a/IRaCIS.Core.API/appsettings.CertificateApply.json +++ b/IRaCIS.Core.API/appsettings.CertificateApply.json @@ -7,21 +7,14 @@ } }, "ConnectionStrings": { - "RemoteNew": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_Certificate;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true", - "Hangfire": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=Hangfire_IRaCIS;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true" - + "RemoteNew": "Server=localhost;Database=IRaCIS;User ID=sa;Password=123456;TrustServerCertificate=true" }, "BasicSystemConfig": { - - "OpenUserComplexPassword": false, - - "OpenSignDocumentBeforeWork": false, - + "OpenUserComplexPassword": true, + "OpenSignDocumentBeforeWork": true, "OpenTrialRelationDelete": true, - - "OpenLoginLimit": false + "OpenLoginLimit": true }, - "SystemEmailSendConfig": { "Port": 465, "Host": "smtp.qiye.aliyun.com", @@ -29,5 +22,4 @@ "FromName": "Test_IRC", "AuthorizationCode": "SHzyyl2021" } - -} +} \ No newline at end of file diff --git a/IRaCIS.Core.API/appsettings.Development.json b/IRaCIS.Core.API/appsettings.Development.json index e9f58c77..d283f553 100644 --- a/IRaCIS.Core.API/appsettings.Development.json +++ b/IRaCIS.Core.API/appsettings.Development.json @@ -7,9 +7,7 @@ } }, "ConnectionStrings": { - "RemoteNew": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_New_Tet;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true", - "Hangfire": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=Hangfire_IRaCIS;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true" - + "RemoteNew": "Server=.;Database=IRaCIS;Trusted_Connection=True;TrustServerCertificate=true" }, "BasicSystemConfig": { diff --git a/IRaCIS.Core.API/appsettings.Production.json b/IRaCIS.Core.API/appsettings.Production.json deleted file mode 100644 index 7daa550e..00000000 --- a/IRaCIS.Core.API/appsettings.Production.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - //"RootUrl": "http://123.56.181.144:8060/", - "ConnectionStrings": { - "RemoteNew": "Server=101.132.193.237,1433;Database=IRaCIS.Production;User ID=sa;Password=zhanying2021;TrustServerCertificate=true", - "Hangfire": "Server=101.132.193.237,1433;Database=Hangfire.IRaCIS.Production;User ID=sa;Password=zhanying2021;TrustServerCertificate=true" - }, - "BasicSystemConfig": { - - "OpenUserComplexPassword": true, - - "OpenSignDocumentBeforeWork": true, - - "OpenLoginLimit": true - }, - //"SystemEmailSendConfig": { - // "Port": 465, - // "Host": "smtp.163.com", - // "FromEmail": "zhou941003@qq.com", - // "FromName": "hangZhou", - // "AuthorizationCode": "sqfhlpfdvnexbcab" - //} - - "SystemEmailSendConfig": { - "Port": 465, - "Host": "smtp.qiye.aliyun.com", - "FromEmail": "IRC@extimaging.com", - "FromName": "IRC", - "AuthorizationCode": "ExtImg@2022" - } - - -} diff --git a/IRaCIS.Core.API/appsettings.Staging.json b/IRaCIS.Core.API/appsettings.Staging.json deleted file mode 100644 index 79ee99b2..00000000 --- a/IRaCIS.Core.API/appsettings.Staging.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "ConnectionStrings": { - "RemoteNew": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_Verify;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true", - "Hangfire": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=Hangfire_IRaCIS;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true" - }, - "BasicSystemConfig": { - - "OpenUserComplexPassword": true, - - "OpenSignDocumentBeforeWork": true, - - "OpenLoginLimit": true - - }, - "SystemEmailSendConfig": { - "Port": 465, - "Host": "smtp.qiye.aliyun.com", - "FromEmail": "uat@extimaging.com", - "FromName": "UAT_IRC", - "AuthorizationCode": "SHzyyl2021" - } - - -} diff --git a/IRaCIS.Core.API/appsettings.USDemo.json b/IRaCIS.Core.API/appsettings.USDemo.json deleted file mode 100644 index 2f062f04..00000000 --- a/IRaCIS.Core.API/appsettings.USDemo.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "ConnectionStrings": { - "RemoteNew": "Server=47.90.161.85,1433\\MSSQLSERVER;Database=IRaCIS_Demo_US;User ID=sa;Password=zhanying2021;TrustServerCertificate=true", - "Hangfire": "Server=47.90.161.85,1433\\MSSQLSERVER;Database=Hangfire.IRaCIS_Demo_US;User ID=sa;Password=zhanying2021;TrustServerCertificate=true" - - }, - "BasicSystemConfig": { - - "OpenUserComplexPassword": false, - - "OpenSignDocumentBeforeWork": false, - - "OpenTrialRelationDelete": true, - - "OpenLoginLimit": false - }, - - "SystemEmailSendConfig": { - "Port": 465, - "Host": "smtp.qiye.aliyun.com", - "FromEmail": "test@extimaging.com", - "FromName": "Test_IRC", - "AuthorizationCode": "SHzyyl2021" - } - -} diff --git a/IRaCIS.Core.API/appsettings.json b/IRaCIS.Core.API/appsettings.json index c200d077..ac43d2e7 100644 --- a/IRaCIS.Core.API/appsettings.json +++ b/IRaCIS.Core.API/appsettings.json @@ -1,7 +1,4 @@ { - "ConnectionStrings": { - "hang": "Server=ZHOU;Database=IRaCIS;User ID=sa;Password=sa123456;" - }, "JwtSetting": { "SecurityKey": "3e6dbfa227234a03977a2f421bdb7f4f", // 密钥 "Issuer": "IRaCIS", // 颁发者 @@ -73,12 +70,13 @@ "QCChallengeCodePrefix": "Q", "NoneDicomStudyCodePrefix": "NST", + "DicomStudyCodePrefix": "ST", "SystemSiteCodePrefix": "S", - "DefaultPassword": "123456", + "DefaultPassword": "EIImage@2023", "DefaultInternalOrganizationName": "ExtImaging", diff --git a/IRaCIS.Core.API/favicon.ico b/IRaCIS.Core.API/favicon.ico new file mode 100644 index 00000000..70e9d37f Binary files /dev/null and b/IRaCIS.Core.API/favicon.ico differ diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminAddUser.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminAddUser.html index 9191707f..aabdcaf7 100644 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminAddUser.html +++ b/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminAddUser.html @@ -11,7 +11,7 @@ 尊敬的 {0} ,您好:
- 展影医疗为您添加了账户,账户信息如下: + 行藏医学影像处理软件系统为您添加了账户,账户信息如下:
@@ -32,7 +32,7 @@
祝您顺利!/Best Regards
-
上海展影医疗科技有限公司
+
武汉行藏科技有限公司
diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminResetUser.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminResetUser.html index e8121618..8f8bb433 100644 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminResetUser.html +++ b/IRaCIS.Core.API/wwwroot/EmailTemplate/AdminResetUser.html @@ -11,7 +11,7 @@ 尊敬的 {0} ,您好:
- 展影医疗将您的账户密码已重置,账户信息如下: + 行藏医学影像处理软件系统将您的账户密码已重置,账户信息如下:
@@ -29,7 +29,7 @@
祝您顺利!/Best Regards
-
上海展影医疗科技有限公司
+
武汉行藏科技有限公司
diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html index 0d184d0a..6f1d3a5d 100644 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html +++ b/IRaCIS.Core.API/wwwroot/EmailTemplate/EmailConfigTest.html @@ -11,7 +11,7 @@ 您好:
- 感谢您使用展影云平台。 + 感谢您使用行藏医学影像处理软件。
{0}。 @@ -19,7 +19,7 @@
祝您顺利!/Best Regards
-
上海展影医疗科技有限公司
+
武汉行藏科技有限公司
diff --git a/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html b/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html index 90dbb7d4..f21fa50f 100644 --- a/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html +++ b/IRaCIS.Core.API/wwwroot/EmailTemplate/UserOptCommon.html @@ -11,7 +11,7 @@ {0}您好:
- 感谢您使用展影云平台。 + 感谢您使用行藏医学影像处理软件。
{1},验证码是: {2},请在3分钟内输入该验证码,进行后续操作。如非本人操作,请忽略该邮件。 @@ -19,7 +19,7 @@
祝您顺利!/Best Regards
-
上海展影医疗科技有限公司
+
武汉行藏科技有限公司
diff --git a/IRaCIS.Core.Application/AOP/QANoticeAOP.cs b/IRaCIS.Core.Application/AOP/QANoticeAOP.cs index 0e80ae3a..79ea5771 100644 --- a/IRaCIS.Core.Application/AOP/QANoticeAOP.cs +++ b/IRaCIS.Core.Application/AOP/QANoticeAOP.cs @@ -55,17 +55,17 @@ // NoticeTypeEnum = NoticeType.NotNeedNotice, // NeedDeal = false, // StudyStatusStr = "Uploaded", -// Message = $"CRC : {_userInfo.RealName} has uploaded {study.StudyCode} ", +// Message = $"IC : {_userInfo.RealName} has uploaded {study.StudyCode} ", // SendTime = DateTime.Now, // }); // } // #region 处理QA通知模块 -// //查询项目的参与者 和 负责site下CRC用户 +// //查询项目的参与者 和 负责site下IC用户 // var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); -// // 找到该study 关联Site 下的CRC +// // 找到该study 关联Site 下的IC // var crcList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); @@ -78,11 +78,11 @@ -// // CRC =>QA +// // IC =>QA // if (studyStatus.Status == (int)StudyStatus.QARequested) // { -// //找出当前操作的CRC -// //PM 或者admin可以代替CRC角色 不能从CRC列表中查询用户 +// //找出当前操作的IC +// //PM 或者admin可以代替IC角色 不能从IC列表中查询用户 // //var currentCRC = trialUserList.First(t => t.UserId == _userInfo.Id); // var notice = new QANotice() @@ -100,7 +100,7 @@ // NeedDeal = true, // StudyStatusStr = "QA Requested", // Message = -// $"CRC -> QA : {_userInfo.RealName} request QA {study.StudyCode} , Inquiry can be performed! ", +// $"IC -> QA : {_userInfo.RealName} request QA {study.StudyCode} , Inquiry can be performed! ", // SendTime = DateTime.Now, // }; @@ -128,18 +128,18 @@ // }); // } -// // QA =>CRC 向CRC推送消息影像有问题 同时作为 requestToQA 的边界 +// // QA =>IC 向IC推送消息影像有问题 同时作为 requestToQA 的边界 // else if (studyStatus.Status == (int)StudyStatus.QAing) // { // //找出当前操作的QA 如果是pm 或者admin 代替操作 此时会有问题 所以 谁代替,就以谁的名义执行 // //var currentQA = qaList.First(t => t.UserId == _userInfo.Id); // //var currentQA = trialUserList.First(t => t.UserId == _userInfo.Id); -// //在项目CRC列表中筛选出 负责该study关联 site的CRC +// //在项目IC列表中筛选出 负责该study关联 site的IC // var siteCRCList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); -// //查询项目的参与者 和 负责site下CRC用户 +// //查询项目的参与者 和 负责site下IC用户 @@ -156,7 +156,7 @@ // NoticeTypeEnum = NoticeType.QA_InQA_NoticeCRC, // NeedDeal = true, // StudyStatusStr = "In QA", -// Message = $"QA -> CRC : {_userInfo.RealName} inquiry {study.StudyCode} ", +// Message = $"QA -> IC : {_userInfo.RealName} inquiry {study.StudyCode} ", // SendTime = DateTime.Now, // }; @@ -169,7 +169,7 @@ // ToUserType = t.UserTypeRole.UserTypeShortName // })); -// //添加 发送给CRC的消息 消息和CRC是 一对多 +// //添加 发送给IC的消息 消息和IC是 一对多 // _qaNoticeRepository.Add(notice); @@ -228,7 +228,7 @@ // _qaNoticeRepository.Add(notice); -// //处理 消息 标记已处理 存在意外情况 qa发给CRC的 但是qa里面设置了 通过或者不通过 此时qa发送的消息也设置为已处理 +// //处理 消息 标记已处理 存在意外情况 qa发给IC的 但是qa里面设置了 通过或者不通过 此时qa发送的消息也设置为已处理 // var needDealNoticeList = _qaNoticeRepository.AsQueryable() // .Where(t => t.SubjectVisitId == study.Id && t.NeedDeal && // (t.NoticeTypeEnum == NoticeType.CRC_RequestToQA_NoticeQA || @@ -248,7 +248,7 @@ // } -// // QA =>CRC 暂时不用发送消息给CRC 因为CRC 暂时没有入口回复 同时作为 requestToQA 的边界 +// // QA =>IC 暂时不用发送消息给IC 因为IC 暂时没有入口回复 同时作为 requestToQA 的边界 // else if (studyStatus.Status == (int)StudyStatus.QAFInishNotPass) // { @@ -298,24 +298,24 @@ // var study = _studyRepository.FirstOrDefault(t => t.Id == studyId); // var status = study.Status; -// //处理CRC 重传时 QA消息 +// //处理IC 重传时 QA消息 // if (status == (int)StudyStatus.QAing) // { -// //查询项目的参与者 和 负责site下CRC用户 +// //查询项目的参与者 和 负责site下IC用户 // var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); -// // 找到该study 关联Site 下的CRC +// // 找到该study 关联Site 下的IC // var crcList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); // var qaList = trialUserList.Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).ToList(); -// //CRC =>QA CRC的职能被PM 或者admin代替 +// //IC =>QA IC的职能被PM 或者admin代替 // //if (_userInfo.UserTypeEnumInt == (int)UserType.ClinicalResearchCoordinator) // { -// //PM 或者admin可以代替CRC角色 不能从CRC列表中查询用户 +// //PM 或者admin可以代替IC角色 不能从IC列表中查询用户 // //var currentCRC = trialUserList.First(t => t.UserId == _userInfo.Id); // var notice = new QANotice() @@ -330,7 +330,7 @@ // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.CRC_ReUpload_NoticeQA, // NeedDeal = true, -// Message = $"CRC -> QA :{_userInfo.RealName} has reuploaded {study.StudyCode} , Need to be inquiry again", +// Message = $"IC -> QA :{_userInfo.RealName} has reuploaded {study.StudyCode} , Need to be inquiry again", // SendTime = DateTime.Now // }; @@ -345,7 +345,7 @@ // _qaNoticeRepository.Add(notice); -// //这里作为 QA 设置 Inqa 状态的回复 或者QA和CRC对话的 +// //这里作为 QA 设置 Inqa 状态的回复 或者QA和IC对话的 // var needDealNoticeList = _qaNoticeRepository.Where(t => t.SubjectVisitId == study.Id && t.NeedDeal // && (t.NoticeTypeEnum == NoticeType.QA_InQA_NoticeCRC || t.NoticeTypeEnum == NoticeType.QA_QARecordDialogPost_NoticeCRC)) // .ToList(); @@ -377,10 +377,10 @@ // #region 处理QA通知 匿名化完毕 通知PM -// //查询项目的参与者 和 负责site下CRC用户 +// //查询项目的参与者 和 负责site下IC用户 // var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); -// // 找到该study 关联Site 下的CRC +// // 找到该study 关联Site 下的IC // var crcList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); diff --git a/IRaCIS.Core.Application/Auth/IRaCISPolicy.cs b/IRaCIS.Core.Application/Auth/IRaCISPolicy.cs index 994cbbc9..e469ec2e 100644 --- a/IRaCIS.Core.Application/Auth/IRaCISPolicy.cs +++ b/IRaCIS.Core.Application/Auth/IRaCISPolicy.cs @@ -10,10 +10,7 @@ namespace IRaCIS.Core.Application.Auth public static class IRaCISPolicy { - - - - public const string CRC = "CRC"; + public const string IC = "IC"; public const string PM = "PM"; diff --git a/IRaCIS.Core.Application/BackGroundJob/CacheTrialStatusQuartZJob.cs b/IRaCIS.Core.Application/BackGroundJob/CacheTrialStatusQuartZJob.cs index dcc0f40a..e3be2747 100644 --- a/IRaCIS.Core.Application/BackGroundJob/CacheTrialStatusQuartZJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/CacheTrialStatusQuartZJob.cs @@ -7,6 +7,7 @@ using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Domain.Models; using Microsoft.Extensions.Logging; using Quartz; +using IRaCIS.Core.Domain.Share; namespace IRaCIS.Application.Services.BackGroundJob { @@ -17,36 +18,55 @@ namespace IRaCIS.Application.Services.BackGroundJob private readonly IRepository _trialRepository; private readonly IEasyCachingProvider _provider; private readonly ILogger _logger; + private readonly IRepository _systemAnonymizationRepository; - public CacheTrialStatusQuartZJob(IRepository trialRepository, IEasyCachingProvider provider,ILogger logger) + public CacheTrialStatusQuartZJob(IRepository trialRepository, IEasyCachingProvider provider,ILogger logger, IRepository systemAnonymizationRepository) { _trialRepository = trialRepository; _provider = provider; _logger = logger; + _systemAnonymizationRepository = systemAnonymizationRepository; } - public Task Execute(IJobExecutionContext context) + public async Task Execute(IJobExecutionContext context) { _logger.LogInformation($"开始执行QuartZ定时任务作业"); try { - var list = _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr }) - .ToList(); + await MemoryCacheTrialStatus(); + + await MemoryCacheAnonymizeData(); - list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(1))); - } catch (Exception e) { _logger.LogError($" 查询和缓存过程出现异常"+e.Message); } _logger.LogInformation("QuartZ定时任务作业结束"); - return Task.CompletedTask; } - - + public async Task MemoryCacheTrialStatus() + { + var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr }) + .ToListAsync(); + + list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7))); + + } + + public async Task MemoryCacheAnonymizeData() + { + var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync(); + + _provider.Set(StaticData.Anonymize.Anonymize_AddFixedFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed).ToList(), TimeSpan.FromDays(7)); + _provider.Set(StaticData.Anonymize.Anonymize_AddIRCInfoFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed == false).ToList(), TimeSpan.FromDays(7)); + _provider.Set(StaticData.Anonymize.Anonymize_FixedField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed).ToList(), TimeSpan.FromDays(7)); + _provider.Set(StaticData.Anonymize.Anonymize_IRCInfoField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed == false).ToList(), TimeSpan.FromDays(7)); + } + + + } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/BackGroundJob/ObtainTaskAutoCancelJob.cs b/IRaCIS.Core.Application/BackGroundJob/ObtainTaskAutoCancelJob.cs index ebd09161..94011887 100644 --- a/IRaCIS.Core.Application/BackGroundJob/ObtainTaskAutoCancelJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/ObtainTaskAutoCancelJob.cs @@ -30,7 +30,7 @@ namespace IRaCIS.Core.Application.BackGroundJob var success = await _subjectVisitRepository.SaveChangesAsync(); - _logger.LogWarning($"任务建立时间:{startTime} 取消时间:{DateTime.Now} 取消 受试者访视:{ subjectVisitId }success:{success}"); + _logger.LogWarning($"任务建立时间:{startTime} 取消时间:{DateTime.Now} 取消 患者检查批次:{ subjectVisitId }success:{success}"); } catch (Exception e) { diff --git a/IRaCIS.Core.Application/BusinessFilter/TrialAuditFilter.cs b/IRaCIS.Core.Application/BusinessFilter/TrialAuditFilter.cs index a614a1e6..578431f4 100644 --- a/IRaCIS.Core.Application/BusinessFilter/TrialAuditFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/TrialAuditFilter.cs @@ -45,11 +45,11 @@ public enum AuditOptType AddTrialSite = 5, DeleteTrialSite = 6, - //Site CRC + //Site IC AddTrialSiteCRC = 7, DeleteTrialSiteCRC = 8, - //访视计划 + //检查批次计划 AddOrUpdateTrialVisitPlanItem = 9, DeleteTrialVisitPlanItem = 10, ConfirmTrialVisitPlan = 11, @@ -58,7 +58,7 @@ public enum AuditOptType AddOrUpdateTrialTemplate = 12, DeleteTrialTemplate = 13, - //subject 访视计划 + //subject 检查批次计划 AddOrUpdateSubjectOutPlanVisit = 14, DeleteSubjectOutPlanVisit = 15, SetSVExecuted = 16, @@ -355,7 +355,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // //删除项目Site CRC +// // //删除项目Site IC // // case AuditOptType.DeleteTrialSiteCRC: // // if (result.IsSuccess) @@ -378,7 +378,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // //添加访视计划Item +// // //添加检查批次计划Item // // case AuditOptType.AddOrUpdateTrialVisitPlanItem: // // //接口参数 // // var visitPlanItem = (VisitPlanCommand)_actionArguments.Values.ToList()[0]; @@ -390,7 +390,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = visitPlanItem.TrialId, // // SubjectId = Guid.Empty, // // AuditType = (int)AuditType.TrialAudit, -// // Note = visitPlanItem.Id == null ? $"{ _userRealName} 添加了访视计划项 {visitPlanItem.VisitName} " : $"{ _userRealName} 更新了访视计划项为 {visitPlanItem.VisitName} ", +// // Note = visitPlanItem.Id == null ? $"{ _userRealName} 添加了检查批次计划项 {visitPlanItem.VisitName} " : $"{ _userRealName} 更新了检查批次计划项为 {visitPlanItem.VisitName} ", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -399,7 +399,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // //删除访视计划Item +// // //删除检查批次计划Item // // case AuditOptType.DeleteTrialVisitPlanItem: // // if (result.IsSuccess) @@ -409,7 +409,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = _visitPlan.TrialId, // // SubjectId = Guid.Empty, // // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 移除了访视计划项 {_visitPlan.VisitName} ", +// // Note = $"{ _userRealName} 移除了检查批次计划项 {_visitPlan.VisitName} ", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -418,7 +418,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // //确认了访视计划 +// // //确认了检查批次计划 // // case AuditOptType.ConfirmTrialVisitPlan: // // var trialId = (Guid)_actionArguments.Values.ToList()[0]; @@ -429,7 +429,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = trialId, // // SubjectId = Guid.Empty, // // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 确认了访视计划,不允许修改 ", +// // Note = $"{ _userRealName} 确认了检查批次计划,不允许修改 ", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -484,13 +484,13 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // //受试者审计 +// // //患者审计 // // case AuditType.SubjectAudit: // // switch (_attr._auditOptType) // // { -// // // 添加或者更新受试者 +// // // 添加或者更新患者 // // case AuditOptType.AddOrUpdateSubject: // // //接口参数 @@ -503,7 +503,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = subject.TrialId, // // SubjectId = subject.Id == null ? Guid.Parse(result.Data) : subject.Id.Value, // // AuditType = (int)AuditType.SubjectAudit, -// // Note = subject.Id == null ? $"{ _userRealName} 添加了受试者 {subject.LastName + subject.FirstName} 并初始化了访视计划" : $"{ _userRealName} 对受试者 { subject.LastName + subject.FirstName} 信息进行了更新 ", +// // Note = subject.Id == null ? $"{ _userRealName} 添加了患者 {subject.LastName + subject.FirstName} 并初始化了检查批次计划" : $"{ _userRealName} 对患者 { subject.LastName + subject.FirstName} 信息进行了更新 ", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -512,7 +512,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // // 删除受试者 +// // // 删除患者 // // case AuditOptType.DeleteSubject: // // if (result.IsSuccess) // // { @@ -521,7 +521,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = _subject.TrialId, // // SubjectId = _subject.Id, // // AuditType = (int)AuditType.SubjectAudit, -// // Note = $"{ _userRealName} 移除了受试者 {_subject.LastName + _subject.FirstName} ", +// // Note = $"{ _userRealName} 移除了患者 {_subject.LastName + _subject.FirstName} ", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -530,7 +530,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // // 受试者计划外访视 +// // // 患者计划外检查批次 // // case AuditOptType.AddOrUpdateSubjectOutPlanVisit: // // //接口参数 @@ -549,7 +549,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = _subject.TrialId, // // SubjectId = _subject.Id, // // AuditType = (int)AuditType.SubjectAudit, -// // Note = subjectVisit.Id == null ? $"{ _userRealName} 为受试者 {_subject.LastName + _subject.FirstName} 添加了计划外访视 {subjectVisit.VisitName}" : $"{ _userRealName} 更新受试者 {_subject.LastName + _subject.FirstName} 计划外访视{subjectVisit.VisitName}", +// // Note = subjectVisit.Id == null ? $"{ _userRealName} 为患者 {_subject.LastName + _subject.FirstName} 添加了计划外检查批次 {subjectVisit.VisitName}" : $"{ _userRealName} 更新患者 {_subject.LastName + _subject.FirstName} 计划外检查批次{subjectVisit.VisitName}", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -558,7 +558,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // } // // break; -// // // 删除计划外访视 +// // // 删除计划外检查批次 // // case AuditOptType.DeleteSubjectOutPlanVisit: // // if (result.IsSuccess) @@ -568,7 +568,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = _subjectVisit.TrialId, // // SubjectId = _subject.Id, // // AuditType = (int)AuditType.SubjectAudit, -// // Note = $"{ _userRealName} 移除了受试者{_subject.LastName + _subject.FirstName} 计划外访视 {_subjectVisit.VisitName} ", +// // Note = $"{ _userRealName} 移除了患者{_subject.LastName + _subject.FirstName} 计划外检查批次 {_subjectVisit.VisitName} ", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -587,7 +587,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // TrialId = _subjectVisit.TrialId, // // SubjectId = _subject.Id, // // AuditType = (int)AuditType.SubjectAudit, -// // Note = $"{ _userRealName} 将受试者 {_subject.LastName + _subject.FirstName} 访视 {_subjectVisit.VisitName} 设置为已执行 ", +// // Note = $"{ _userRealName} 将患者 {_subject.LastName + _subject.FirstName} 检查批次 {_subjectVisit.VisitName} 设置为已执行 ", // // Detail = string.Empty, // // OptUserId = Guid.Parse(_userIdStr), // // OptUser = _userRealName, @@ -700,7 +700,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // //删除项目运维人员 // // case AuditOptType.DeleteTrailStaff: -// // // 删除项目Site CRC +// // // 删除项目Site IC // // case AuditOptType.DeleteTrialSiteCRC: // // //接口参数 @@ -756,7 +756,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // // break; -// // //受试者审计 +// // //患者审计 // // case AuditType.SubjectAudit: // // switch (_auditOptType) @@ -920,7 +920,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // _userTrial = _userTrialRepository.AsQueryable().Include(t => t.User).FirstOrDefault(t => t.Id == userTrial); // break; -// // 删除项目Site CRC +// // 删除项目Site IC // case AuditOptType.DeleteTrialSiteCRC: // //接口参数 @@ -969,7 +969,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // break; -// //受试者审计 +// //患者审计 // case AuditType.SubjectAudit: // switch (_auditOptType) @@ -1258,7 +1258,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// //删除项目Site CRC +// //删除项目Site IC // case AuditOptType.DeleteTrialSiteCRC: // if (result.IsSuccess) @@ -1281,7 +1281,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// //添加访视计划Item +// //添加检查批次计划Item // case AuditOptType.AddOrUpdateTrialVisitPlanItem: // //接口参数 // var visitPlanItem = (VisitPlanCommand)_actionArguments.Values.ToList()[0]; @@ -1293,7 +1293,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = visitPlanItem.TrialId, // SubjectId = Guid.Empty, // AuditType = (int)AuditType.TrialAudit, -// Note = visitPlanItem.Id == null ? $"{ _userRealName} 添加了访视计划项 {visitPlanItem.VisitName} " : $"{ _userRealName} 更新了访视计划项为 {visitPlanItem.VisitName} ", +// Note = visitPlanItem.Id == null ? $"{ _userRealName} 添加了检查批次计划项 {visitPlanItem.VisitName} " : $"{ _userRealName} 更新了检查批次计划项为 {visitPlanItem.VisitName} ", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, @@ -1302,7 +1302,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// //删除访视计划Item +// //删除检查批次计划Item // case AuditOptType.DeleteTrialVisitPlanItem: // if (result.IsSuccess) @@ -1312,7 +1312,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = _visitPlan.TrialId, // SubjectId = Guid.Empty, // AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 移除了访视计划项 {_visitPlan.VisitName} ", +// Note = $"{ _userRealName} 移除了检查批次计划项 {_visitPlan.VisitName} ", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, @@ -1321,7 +1321,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// //确认了访视计划 +// //确认了检查批次计划 // case AuditOptType.ConfirmTrialVisitPlan: // var trialId = (Guid)_actionArguments.Values.ToList()[0]; @@ -1332,7 +1332,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = trialId, // SubjectId = Guid.Empty, // AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 确认了访视计划,不允许修改 ", +// Note = $"{ _userRealName} 确认了检查批次计划,不允许修改 ", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, @@ -1364,13 +1364,13 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// //受试者审计 +// //患者审计 // case AuditType.SubjectAudit: // switch (_attr._auditOptType) // { -// // 添加或者更新受试者 +// // 添加或者更新患者 // case AuditOptType.AddOrUpdateSubject: // //接口参数 @@ -1383,7 +1383,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = subject.TrialId, // SubjectId = subject.Id == null ? Guid.Parse(result.Data) : subject.Id.Value, // AuditType = (int)AuditType.SubjectAudit, -// Note = subject.Id == null ? $"{ _userRealName} 添加了受试者 {subject.ShortName } 并初始化了访视计划" : $"{ _userRealName} 对受试者 { subject.ShortName } 信息进行了更新 ", +// Note = subject.Id == null ? $"{ _userRealName} 添加了患者 {subject.ShortName } 并初始化了检查批次计划" : $"{ _userRealName} 对患者 { subject.ShortName } 信息进行了更新 ", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, @@ -1392,7 +1392,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// // 删除受试者 +// // 删除患者 // case AuditOptType.DeleteSubject: // if (result.IsSuccess) // { @@ -1401,7 +1401,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = _subject.TrialId, // SubjectId = _subject.Id, // AuditType = (int)AuditType.SubjectAudit, -// Note = $"{ _userRealName} 移除了受试者 {_subject.LastName + _subject.FirstName} ", +// Note = $"{ _userRealName} 移除了患者 {_subject.LastName + _subject.FirstName} ", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, @@ -1410,7 +1410,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// // 受试者计划外访视 +// // 患者计划外检查批次 // case AuditOptType.AddOrUpdateSubjectOutPlanVisit: // //接口参数 @@ -1429,7 +1429,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = _subject.TrialId, // SubjectId = _subject.Id, // AuditType = (int)AuditType.SubjectAudit, -// Note = subjectVisit.Id == null ? $"{ _userRealName} 为受试者 {_subject.LastName + _subject.FirstName} 添加了计划外访视 {subjectVisit.VisitName}" : $"{ _userRealName} 更新受试者 {_subject.LastName + _subject.FirstName} 计划外访视{subjectVisit.VisitName}", +// Note = subjectVisit.Id == null ? $"{ _userRealName} 为患者 {_subject.LastName + _subject.FirstName} 添加了计划外检查批次 {subjectVisit.VisitName}" : $"{ _userRealName} 更新患者 {_subject.LastName + _subject.FirstName} 计划外检查批次{subjectVisit.VisitName}", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, @@ -1438,7 +1438,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // } // break; -// // 删除计划外访视 +// // 删除计划外检查批次 // case AuditOptType.DeleteSubjectOutPlanVisit: // if (result.IsSuccess) @@ -1448,7 +1448,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = _subjectVisit.TrialId, // SubjectId = _subject.Id, // AuditType = (int)AuditType.SubjectAudit, -// Note = $"{ _userRealName} 移除了受试者{_subject.LastName + _subject.FirstName} 计划外访视 {_subjectVisit.VisitName} ", +// Note = $"{ _userRealName} 移除了患者{_subject.LastName + _subject.FirstName} 计划外检查批次 {_subjectVisit.VisitName} ", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, @@ -1467,7 +1467,7 @@ public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilt // TrialId = _subjectVisit.TrialId, // SubjectId = _subject.Id, // AuditType = (int)AuditType.SubjectAudit, -// Note = $"{ _userRealName} 将受试者 {_subject.LastName + _subject.FirstName} 访视 {_subjectVisit.VisitName} 设置为已执行 ", +// Note = $"{ _userRealName} 将患者 {_subject.LastName + _subject.FirstName} 检查批次 {_subjectVisit.VisitName} 设置为已执行 ", // Detail = string.Empty, // OptUserId = Guid.Parse(_userIdStr), // OptUser = _userRealName, diff --git a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs index e8da8a52..19ced478 100644 --- a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs @@ -491,7 +491,7 @@ public static class FileStoreHelper { var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment); - //加入访视层级 和Data + //加入检查批次层级 和Data var path = Path.Combine(rootPath, StaticData.Folder.TrialDataFolder, trialId.ToString(), siteId.ToString(), subjectId.ToString(), subjectVisitId.ToString(), StaticData.Folder.DicomFolder, studyId.ToString()); diff --git a/IRaCIS.Core.Application/Helper/NpoiWordHelper.cs b/IRaCIS.Core.Application/Helper/NpoiWordHelper.cs deleted file mode 100644 index 2e993214..00000000 --- a/IRaCIS.Core.Application/Helper/NpoiWordHelper.cs +++ /dev/null @@ -1,171 +0,0 @@ - -using IRaCIS.Core.Application.Helper; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using NPOI.OpenXmlFormats.Wordprocessing; -using NPOI.XWPF.UserModel; -using System.Collections; -using System.Reflection; - -namespace IRaCIS.Core.Application.Service; - -public static class NpoiWordHelper -{ - public static async Task TemplateExportWordAsync(string code, object data, IRepository? _commonDocumentRepository, IWebHostEnvironment _hostEnvironment) - { - //var (physicalPath, fileNmae) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code); - - var physicalPath = code; - - - using (FileStream stream = File.OpenRead(physicalPath)) - { - XWPFDocument doc = new XWPFDocument(stream); - //遍历段落 - foreach (var para in doc.Paragraphs) - { - ReplaceKey(para, data); - } - //遍历表格 - var tables = doc.Tables; - foreach (var table in tables) - { - //ReplaceTableKey(table, data, "Data"); - } - - foreach (var table in tables) - { - foreach (var row in table.Rows) - { - foreach (var cell in row.GetTableCells()) - { - foreach (var para in cell.Paragraphs) - { - ReplaceKey(para, data); - } - } - } - } - - FileStream out1 = new FileStream("table.docx", FileMode.Create); - doc.Write(out1); - out1.Close(); - return new FileStreamResult(stream, "application/msword") - { - FileDownloadName = $"replaced_{DateTime.Now.ToString("yyyyMMddHHmmss")}.docx" - }; - } - - - - - - - - - - - - - - - } - - private static void ReplaceKey(XWPFParagraph para, object model) - { - string text = para.ParagraphText; - - Type t = model.GetType(); - PropertyInfo[] pi = t.GetProperties(); - foreach (PropertyInfo p in pi) - { - //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一 - if (text.Contains("$" + p.Name + "$")) - { - text = text.Replace("$" + p.Name + "$", p.GetValue(model)?.ToString()); - } - } - - //var runs = para.Runs; - //string styleid = para.Style; - //for (int i = 0; i < runs.Count; i++) - //{ - // var run = runs[i]; - // text = run.ToString(); - // Type t = model.GetType(); - // PropertyInfo[] pi = t.GetProperties(); - // foreach (PropertyInfo p in pi) - // { - // //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一 - // if (text.Contains("$" + p.Name + "$")) - // { - // text = text.Replace("$" + p.Name + "$", p.GetValue(model)?.ToString()); - // } - // } - // runs[i].SetText(text, 0); - //} - } - - - - - /// - /// 替换表格Key - /// - /// - /// - /// - - private static void ReplaceTableKey(XWPFTable table, IList list, String field) - { - List paras = new List(); - // 获取最后一行数据,最后一行设置值 - Int32 iLastRowIndex = 0; - for (int iIndex = 0; iIndex < table.Rows.Count; iIndex++) - { - if (iIndex == table.Rows.Count - 1) - { - iLastRowIndex = iIndex; - foreach (var cell in table.Rows[iIndex].GetTableCells()) - { - foreach (var para in cell.Paragraphs) - { - paras.Add(para); - } - } - } - } - // 删除最后一行 - table.RemoveRow(iLastRowIndex); - - for (int iIndex = 0; iIndex < list.Count; iIndex++) - { - object data = list[iIndex]; - Type t = data.GetType(); - PropertyInfo[] pi = t.GetProperties(); - // 表增加行 - XWPFTableRow m_row = table.CreateRow(); - CT_Row m_NewRow = new CT_Row(); - String text = String.Empty; - Int32 jIndex = 0; - paras.ForEach(para => - { - text = para.ParagraphText; - foreach (PropertyInfo p in pi) - { - if (text.Contains("$" + field + "." + p.Name + "$")) - { - m_row.GetCell(jIndex).SetText(p.GetValue(data, null).ToString()); - } - } - jIndex++; - }); - m_row = new XWPFTableRow(m_NewRow, table); - table.AddRow(m_row); - - } - } - - - -} \ No newline at end of file diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj b/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj index 656726dc..3b91fcdb 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.csproj @@ -6,6 +6,7 @@ enable enable True + AnyCPU;x64 @@ -14,10 +15,30 @@ 1701;1702;1591 + + ..\bin\ + .\IRaCIS.Core.Application.xml + 1701;1702;1591 + + + + ..\bin\ + .\IRaCIS.Core.Application.xml + 1701;1702;1591 + + 1701;1702;1591;1587 + + 1701;1702;1591;1587 + + + + 1701;1702;1591;1587 + + @@ -104,7 +125,6 @@ - diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index f30170f5..7bc079ce 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -85,14 +85,6 @@
- - - 替换表格Key - - - - - 分配规则 @@ -115,7 +107,7 @@ - 获取访视任务 应用Subject后 医生比率情况 + 获取检查批次任务 应用Subject后 医生比率情况 @@ -258,12 +250,12 @@ - 访视读片任务 + 检查批次读片任务 - 访视读片任务 + 检查批次读片任务 @@ -345,7 +337,7 @@ - 访视任务 + 检查批次任务 @@ -436,7 +428,7 @@ - 影响提示列表 重阅仅仅针对已完成的任务申请 退回针对的是未完成的(退回仅仅针对是访视类型的) + 影响提示列表 重阅仅仅针对已完成的任务申请 退回针对的是未完成的(退回仅仅针对是检查批次类型的) 重阅还是直接回退 @@ -456,7 +448,7 @@ - 影像上传列表 只导出已上传状态的访视记录 + 影像上传列表 只导出已上传状态的检查批次记录 @@ -477,7 +469,7 @@ - 受试者信息导出表 + 患者信息导出表 @@ -702,8 +694,8 @@ - 获取某个检查的关联检查列表(该受试者在这个想项目下的所有检查) - 点击检查检查列表中的一个检查获取对应的序列列表(调用之前的接口:/series/list/,根据StudyId,获取访视的序列列表) + 获取某个检查的关联检查列表(该患者在这个想项目下的所有检查) + 点击检查检查列表中的一个检查获取对应的序列列表(调用之前的接口:/series/list/,根据StudyId,获取检查批次的序列列表) @@ -765,12 +757,12 @@ - 受试者Code + 患者Code - 访视名称 + 检查批次名称 @@ -795,7 +787,7 @@ - 访视计划ID + 检查批次计划ID @@ -851,7 +843,7 @@ - 受试者 + 患者 @@ -1080,7 +1072,7 @@ - 验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 + 验证IC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 @@ -1168,7 +1160,7 @@ - 自治疗后第二个访视点以来持续的新骨病变数量 + 自治疗后第二个检查批次点以来持续的新骨病变数量 @@ -1182,21 +1174,21 @@ - 访视点肿瘤评估 + 检查批次点肿瘤评估 - 修改上一次访视结果 + 修改上一次检查批次结果 - 获取访视日期信息 + 获取检查批次日期信息 @@ -1222,14 +1214,14 @@ - 验证访视提交 + 验证检查批次提交 - 将上一次的访视病灶添加到这一次 + 将上一次的检查批次病灶添加到这一次 @@ -1318,14 +1310,14 @@ - 验证访视提交 + 验证检查批次提交 - 将上一次的访视病灶添加到这一次 + 将上一次的检查批次病灶添加到这一次 @@ -1356,14 +1348,14 @@ - 与基线访视相比SOD变化百分比 + 与基线检查批次相比SOD变化百分比 - 与整个访视期间SOD最低点相比增加的值(mm) + 与整个检查批次期间SOD最低点相比增加的值(mm) @@ -1373,7 +1365,7 @@ - 与整个访视期间SOD最低点相比增加的百分比 + 与整个检查批次期间SOD最低点相比增加的百分比 @@ -1383,7 +1375,7 @@ - 整个访视期间SOD最低点访视名称 + 整个检查批次期间SOD最低点检查批次名称 @@ -1400,14 +1392,14 @@ - 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上 + 是否存在淋巴结靶病灶且该病灶比上一检查批次短径增加5MM以上 - 获取存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上的病灶 + 获取存在淋巴结靶病灶且该病灶比上一检查批次短径增加5MM以上的病灶 @@ -1435,7 +1427,7 @@ - 修改与整个访视期间SOD最低点相比增加的值(mm) + 修改与整个检查批次期间SOD最低点相比增加的值(mm) @@ -1449,7 +1441,7 @@ - 修改所有访视任务的答案 + 修改所有检查批次任务的答案 @@ -1472,14 +1464,14 @@ - 获取访视任务信息 + 获取检查批次任务信息 - 获取上一个访视任务Id + 获取上一个检查批次任务Id @@ -1513,7 +1505,7 @@ - 将上一次的访视病灶添加到这一次 + 将上一次的检查批次病灶添加到这一次 @@ -1550,14 +1542,14 @@ - 验证访视提交 + 验证检查批次提交 - 将上一次的访视病灶添加到这一次 + 将上一次的检查批次病灶添加到这一次 @@ -1605,14 +1597,14 @@ - 验证访视提交 + 验证检查批次提交 - 将上一次的访视病灶添加到这一次 + 将上一次的检查批次病灶添加到这一次 @@ -1764,12 +1756,12 @@ - 受试者ID + 患者ID - 访视或者阅片ID + 检查批次或者阅片ID @@ -1829,7 +1821,7 @@ - 受试者Code + 患者Code @@ -1854,7 +1846,7 @@ - 受试者ID + 患者ID @@ -1864,17 +1856,17 @@ - 截止访视 + 截止检查批次 - 访视计划ID + 检查批次计划ID - 受试者ID + 患者ID @@ -1894,12 +1886,12 @@ - 受试者Id + 患者Id - 访视Id + 检查批次Id @@ -1909,12 +1901,12 @@ - 访视ID + 检查批次ID - 访视名称 + 检查批次名称 @@ -1959,7 +1951,7 @@ - Id(阅片期Id 或者 访视ID) + Id(阅片期Id 或者 检查批次ID) @@ -1969,12 +1961,12 @@ - 受试者ID + 患者ID - 访视或者阅片ID + 检查批次或者阅片ID @@ -2014,7 +2006,7 @@ - 是否存在靶病灶 (当前访视 至少一个靶病灶的状态为存在) + 是否存在靶病灶 (当前检查批次 至少一个靶病灶的状态为存在) @@ -2044,22 +2036,22 @@ - SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% + SOD 百分比 整体检查批次期间SOD最低点SOD相比增加<20% - SOD 百分比 比整体访视期间最低点SOD增加≥20% + SOD 百分比 比整体检查批次期间最低点SOD增加≥20% - SOD 变化值 比整体访视期间最低点SOD绝对增加值<5 mm + SOD 变化值 比整体检查批次期间最低点SOD绝对增加值<5 mm - 比整体访视期间最低点SOD绝对增加值≥5 mm + 比整体检查批次期间最低点SOD绝对增加值≥5 mm @@ -2069,12 +2061,12 @@ - 上次访视点整体肿瘤评估 + 上次检查批次点整体肿瘤评估 - 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 + 当前检查批次点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 @@ -2164,7 +2156,7 @@ - 受试者ID + 患者ID @@ -2179,7 +2171,7 @@ - 是否是访视 + 是否是检查批次 @@ -2249,12 +2241,12 @@ - 获取访视列表 + 获取检查批次列表 - 是否是访视 + 是否是检查批次 @@ -2279,7 +2271,7 @@ - 是否为访视 + 是否为检查批次 @@ -2299,7 +2291,7 @@ - 是否为访视 + 是否为检查批次 @@ -2314,7 +2306,7 @@ - 访视Id 或者模块Id + 检查批次Id 或者模块Id @@ -2359,7 +2351,7 @@ - 是否为CRC上传 + 是否为IC上传 @@ -2419,7 +2411,7 @@ - 是否是访视 + 是否是检查批次 @@ -2689,7 +2681,7 @@ - 任务盲态名称 和访视盲态一样 + 任务盲态名称 和检查批次盲态一样 @@ -2929,7 +2921,7 @@ - 任务展示访视 读片任务显示是否顺序 + 任务展示检查批次 读片任务显示是否顺序 @@ -3559,12 +3551,12 @@ - 任务展示访视 读片任务显示是否顺序 + 任务展示检查批次 读片任务显示是否顺序 - 阅片是否显示受试者信息 + 阅片是否显示患者信息 @@ -3849,12 +3841,12 @@ - 截止访视 + 截止检查批次 - 访视计划ID + 检查批次计划ID @@ -3869,7 +3861,7 @@ - 访视ID + 检查批次ID @@ -3899,12 +3891,12 @@ - 截止访视 + 截止检查批次 - 访视计划ID + 检查批次计划ID @@ -3929,17 +3921,17 @@ - 访视Id + 检查批次Id - 受试者Id + 患者Id - 受试者名称 + 患者名称 @@ -3994,12 +3986,12 @@ - 截止访视 + 截止检查批次 - 访视计划ID + 检查批次计划ID @@ -4069,7 +4061,7 @@ - 截止访视 + 截止检查批次 @@ -6082,12 +6074,12 @@ - 任务展示访视 读片任务显示是否顺序 + 任务展示检查批次 读片任务显示是否顺序 - 阅片是否显示受试者信息 + 阅片是否显示患者信息 @@ -6338,12 +6330,12 @@ - 访视Id + 检查批次Id - 访视Id + 检查批次Id @@ -6941,12 +6933,12 @@ - 受试者临床信息 + 患者临床信息 - 获取访视+受试者级别的数据 + 获取检查批次+患者级别的数据 @@ -7014,7 +7006,7 @@ - 是否是访视 + 是否是检查批次 @@ -7039,7 +7031,7 @@ - 受试者ID + 患者ID @@ -7047,7 +7039,7 @@ - 是否是访视 + 是否是检查批次 @@ -7072,7 +7064,7 @@ - 受试者ID + 患者ID @@ -7238,7 +7230,7 @@ - 获取访视病灶信息 + 获取检查批次病灶信息 @@ -7380,7 +7372,7 @@ - 受试者编号具体规则 + 患者编号具体规则 @@ -7390,7 +7382,7 @@ - 是否 提醒受试者编号规则 + 是否 提醒患者编号规则 @@ -7400,12 +7392,12 @@ - 是否有 受试者年龄 + 是否有 患者年龄 - 出组后计划外访视名称 + 出组后计划外检查批次名称 @@ -7445,7 +7437,7 @@ - 阅片是否显示受试者信息 + 阅片是否显示患者信息 @@ -7465,7 +7457,7 @@ - 阅片是否显示受试者信息 + 阅片是否显示患者信息 @@ -7485,7 +7477,7 @@ - 阅片是否显示受试者信息 + 阅片是否显示患者信息 @@ -7545,7 +7537,7 @@ - IR阅片是否显示受试者信息 + IR阅片是否显示患者信息 @@ -7800,7 +7792,7 @@ - IR阅片是否显示受试者信息 + IR阅片是否显示患者信息 @@ -8026,7 +8018,7 @@ [new] setting页面Site列表,和getSiteCRCList对比 没有统计数据,增加了一些site信息 - 获取某一Site下面的负责的CRC列表 + 获取某一Site下面的负责的IC列表 [new] Setting页面 Site勾选列表( @@ -8042,14 +8034,14 @@ - 批量添加Site下 CRC的负责人 + 批量添加Site下 IC的负责人 - 删除CRC人员 + 删除IC人员 - 获取项目下的 site 下拉框数据 CRC只看到他负责的 + 获取项目下的 site 下拉框数据 IC只看到他负责的 @@ -8059,7 +8051,7 @@ - 获取访视下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 + 获取检查批次下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 @@ -8068,28 +8060,28 @@ - 获取访视下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 + 获取检查批次下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 - 设置受试者访视已执行 也就是将studyUploaded状态置为true 为了那些没有影像 人工设置准备 + 设置患者检查批次已执行 也就是将studyUploaded状态置为true 为了那些没有影像 人工设置准备 - CRC 访视上传列表 + IC 检查批次上传列表 - CRC 质疑列表 + IC 质疑列表 @@ -8110,14 +8102,14 @@ - QC 访视列表 + QC 检查批次列表 - 获取一致性核查列表 CRC/PM 公用 + 获取一致性核查列表 IC/PM 公用 @@ -8139,10 +8131,10 @@ - 获取某次访视 QA界面所有信息 单独每一项都有接口(往下看),这里是一个大接口,方便第一次获取完整的所有的数据 + 获取某次检查批次 QA界面所有信息 单独每一项都有接口(往下看),这里是一个大接口,方便第一次获取完整的所有的数据 - 项目配置的针对访视检查是那种审核,0 不审,1 单审,2双审 + 项目配置的针对检查批次检查是那种审核,0 不审,1 单审,2双审 当前 QC进入的是那种审核 1 单审,2复审 @@ -8154,11 +8146,11 @@ - 获取某次访视 QC 问题核对答案 列表 初始化进去的时候是模板项,QC填写了就是对应的内容 + 获取某次检查批次 QC 问题核对答案 列表 初始化进去的时候是模板项,QC填写了就是对应的内容 - 项目配置的针对访视检查是那种审核,0 不审,1 单审,2双审 + 项目配置的针对检查批次检查是那种审核,0 不审,1 单审,2双审 当前 QC进入的是那种审核 1 单审,2复审 @@ -8166,26 +8158,26 @@ 获次QC 历史质疑列表 不分页 - 项目配置的针对访视检查是那种审核,0 不审,1 单审,2双审 + 项目配置的针对检查批次检查是那种审核,0 不审,1 单审,2双审 当前 QC进入的是那种审核 1 单审,2复审 - 获取访视下的受试者访视、受试者、site信息 + 获取检查批次下的患者检查批次、患者、site信息 - 访视下的Study 和Series列表 + 检查批次下的Study 和Series列表 - 访视下的检查列表 + 检查批次下的检查列表 @@ -8199,7 +8191,7 @@ - CRC/PM 看到某次访视下的所有质疑和聊天内容 包括初审和复审的 。 + IC/PM 看到某次检查批次下的所有质疑和聊天内容 包括初审和复审的 。 @@ -8227,14 +8219,14 @@ - 添加计划外访视 下拉框 选择上一次访视 + 添加计划外检查批次 下拉框 选择上一次检查批次 - 上传界面 受试者 访视、site 基本信息 + 上传界面 患者 检查批次、site 基本信息 @@ -8289,7 +8281,7 @@ - CRC 请求回退 + IC 请求回退 @@ -8351,7 +8343,7 @@ - CRC RequestToQC 批量提交 [需要签名 不需要对] + IC RequestToQC 批量提交 [需要签名 不需要对] @@ -8366,7 +8358,7 @@
- 设置、取消 访视紧急 + 设置、取消 检查批次紧急 @@ -8386,13 +8378,13 @@ - CRC 设置已经重传完成 [需要签名 不需要对] + IC 设置已经重传完成 [需要签名 不需要对] - 上传界面 更新受试者访视基准日期 是否入组确认,以及访视 是否PD进展 + 上传界面 更新患者检查批次基准日期 是否入组确认,以及检查批次 是否PD进展 @@ -8608,7 +8600,7 @@ - 添加访视计划 要给改项目下的所有Subject 添加该访视 + 添加检查批次计划 要给改项目下的所有Subject 添加该检查批次 @@ -8618,24 +8610,24 @@ - 处理 访视 末次评估 会影响Subject 状态 + 处理 检查批次 末次评估 会影响Subject 状态 - 处理 访视 末次评估 会影响Subject 状态 + 处理 检查批次 末次评估 会影响Subject 状态 - 处理生成阅片期 以及后续访视状态 + 处理生成阅片期 以及后续检查批次状态 - 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期 + 处理 检查批次 1、提交状态 2、执行状态 3、最早最晚 拍片日期 @@ -9414,14 +9406,14 @@ - 获取CRC上传的文件 + 获取IC上传的文件 - 添加CRC数据类型 + 添加IC数据类型 @@ -9439,7 +9431,7 @@
- 获取访视 阅片或任务临床数据 + 获取检查批次 阅片或任务临床数据 @@ -9767,14 +9759,14 @@ - 获取阅片的受试者信息 + 获取阅片的患者信息 - 验证是否为基线访视任务 + 验证是否为基线检查批次任务 @@ -9906,7 +9898,7 @@ - 验证访视提交 + 验证检查批次提交 @@ -9979,7 +9971,7 @@ - 判断任务是否是全局访视任务 + 判断任务是否是全局检查批次任务 @@ -10005,7 +9997,7 @@ - 提交访视阅片问题 + 提交检查批次阅片问题 @@ -10160,7 +10152,7 @@ - 获取阅片期配置的截至访视的下拉框 (增加标准搜索,已修改) + 获取阅片期配置的截至检查批次的下拉框 (增加标准搜索,已修改) @@ -10190,7 +10182,7 @@ - 添加阅片的时候 获取访视 //标准参数必传 + 添加阅片的时候 获取检查批次 //标准参数必传 @@ -10264,7 +10256,7 @@ - Setting页面 为 site 勾选CRC用户列表 + Setting页面 为 site 勾选IC用户列表 Setting页面 项目参与人员勾选列表 @@ -10293,7 +10285,7 @@ - + 添加项目 @@ -10323,36 +10315,36 @@ - 添加或更新受试者信息[New] + 添加或更新患者信息[New] - state:1-访视中,2-出组。0-全部 + state:1-检查批次中,2-出组。0-全部 - 分页获取受试者列表[New] - /// state:1-访视中,2-出组。0-全部 + 分页获取患者列表[New] + /// state:1-检查批次中,2-出组。0-全部 - 计划外访视 获取受试者选择下拉框列表 + 计划外检查批次 获取患者选择下拉框列表 暂时不用 - 获取项目访视计划 + 获取项目检查批次计划 - 根据项目Id,获取项目访视计划(不分页)[New] + 根据项目Id,获取项目检查批次计划(不分页)[New] - 获取访视计划下拉框列表 + 获取检查批次计划下拉框列表 - 添加或更新访视计划某项 + 添加或更新检查批次计划某项 删除项目计划某一项 废弃 diff --git a/IRaCIS.Core.Application/Resources/en-US.json b/IRaCIS.Core.Application/Resources/en-US.json index d2305efb..0c0783ed 100644 --- a/IRaCIS.Core.Application/Resources/en-US.json +++ b/IRaCIS.Core.Application/Resources/en-US.json @@ -60,7 +60,7 @@ // TrialSiteService "CodeRepeated": "Code is not allowed to be repeated", - "CRCCanNotDeleted": "The site has been associated with CRC, and couldn't be deleted", + "CRCCanNotDeleted": "The site has been associated with IC, and couldn't be deleted", "SiteCanNotDeleted": "The subjects has been added to this site, and couldn't be deleted", "StudyCanNotDeleted": "The site has been uploaded study, and couldn't be deleted.", @@ -76,8 +76,8 @@ // SubjectVisitService "ContainsVisitnum": "This subject's visit plan already contains a visit with the same visitnum", "LastEvaluationNotAllowed": "After setting the last evaluation, you are not allowed to add scheduled outbound visits", - "CRCSubmit": "PD confirmation status cannot be modified after CRC submission", - "BacktrackingVisits": "After the CRC is submitted, the PD confirmation status cannot be changed", + "CRCSubmit": "PD confirmation status cannot be modified after IC submission", + "BacktrackingVisits": "After the IC is submitted, the PD confirmation status cannot be changed", "ImageUpload": "The subject uploaded the image after this visit, and this visit is not allowed to be set as the last visit", "AssociatedUploaded": "This visit is associated with the uploaded study images and couldn't be deleted", "InPlanCanNotDeleted": "This visit is InPlan and couldn't be deleted", @@ -87,7 +87,7 @@ "AccordWithVisitNum": "For the visit plan, the VisitDay with a larger VisitNum should be larger than the VisitDay with a smaller VisitNum", "same/VisitName": "A visit with the same VisitName/VisitNum already existed in the current visit plan", "AlreadyBaseline": "A visit already is baseline in the current visit plan", - "IsUploadVideo": "A CRC has uploaded image data for the baseline and is not allowed to modify the baseline", + "IsUploadVideo": "A IC has uploaded image data for the baseline and is not allowed to modify the baseline", "VisitHasBeenExecuted": "The visit plan has been assigned to the subjects and executed", "OnlyProgressCanEdit": "Modification validation is allowed only during project initialization or in progress", "NoBaselineNoConfirmation": "No baseline, no confirmation allowed", @@ -121,10 +121,10 @@ // QCOperationService "AuditQuestionMust": "The audit question must be filled out and saved, otherwise no challenge is allowed to be added", - "VisitNoClose": "The current viewer has unclosed query for CRC upload permission. No further query is allowed", - "NotFinish": "CRC retransmission request /QC agrees to retransmission challenge and is not allowed to close the challenge until CRC setup retransmission is complete", + "VisitNoClose": "The current viewer has unclosed query for IC upload permission. No further query is allowed", + "NotFinish": "IC retransmission request /QC agrees to retransmission challenge and is not allowed to close the challenge until IC setup retransmission is complete", "QCHasBeenReplied": "This QC inquiry has been answered", - "OperationUserMustBeCRC/PM": "Only CRC and PM are allowed", + "OperationUserMustBeCRC/PM": "Only IC and PM are allowed", "CanNotCloseQuery": "Visits that perform conformance checks are not allowed to close queries", "OnlyPMCanSet": "Only PM manual Settings are allowed to pass the consistency check", "CanNotSettingConsistency": "Currently, the PM approves the rollback and does not allow the consistency check to pass", @@ -155,7 +155,7 @@ "CanNotSetQCFailed": "QC Failed cannot be set in the unchecked state", "NotInPrimaryQCQCFailed": "The project is configured as a single audit. The current audit status is not InPrimaryQC and cannot be changed to QCFailed", "TrialIsDoubleCheckCanNotQCFailed{0}": "The project is configured with double audit. The current audit status is {0} and cannot be changed to QCFailed", - "CRCHasBeenSubmitted": "CRC has submitted an unmodified group confirmation status", + "CRCHasBeenSubmitted": "IC has submitted an unmodified group confirmation status", "CannotBeChangedPD": "PD confirmation status cannot be modified for rollback visits", "OtherQCProcessAudit": "Other QC is conducting audit, current operation is not allowed", "ForwardFailed": "Forward failure", @@ -183,9 +183,9 @@ //StudyListService - "TimeTooLow": "当前访视检查时间不能小于该访视之前检查的时间,请核对检查数据是否有误", + "TimeTooLow": "当前检查批次检查时间不能小于该检查批次之前检查的时间,请核对检查数据是否有误", "SomeoneLoading": "当前有人正在上传归档该检查!", - "VisitEnd": "受试者访视结束,不允许上传!", + "VisitEnd": "患者检查批次结束,不允许上传!", "DICOMUploaded{0}{1}{2}{3}": "{0}: This DICOM images have been uploaded and allocate to the {1} of the subject {2} (Study ID: {3}), which cannot continue to upload and assign it to others.", //StudyService diff --git a/IRaCIS.Core.Application/Resources/zh-CN.json b/IRaCIS.Core.Application/Resources/zh-CN.json index b4b15072..64081372 100644 --- a/IRaCIS.Core.Application/Resources/zh-CN.json +++ b/IRaCIS.Core.Application/Resources/zh-CN.json @@ -36,7 +36,7 @@ "ProjSetDisable": "项目不在Initializing/Ongoing,不允许确认配置", //不允许确认配置 "QCRepate": "QC问题显示序号不允许重复", // QC问题显示序号不允许重复 "ParentNumToLow": "父问题的序号要比子问题序号小,请确认", // 父问题的序号要比子问题序号小,请确认 - "ExistUnconfirmedItems": "项目、基础配置、流程配置、加急配置、访视计划,有未确认项", // 存在未确认项 + "ExistUnconfirmedItems": "项目、基础配置、流程配置、加急配置、检查批次计划,有未确认项", // 存在未确认项 "NotAllCanOperate": "只有“初始化中”和“正在进行中”才能进行操作", //只有“初始化中”和“正在进行中”才能进行操作 // TrialExternalUserService @@ -51,7 +51,7 @@ "OnlyPMAPM": "仅PM/APM可以操作!", "TrialIDExist": "相同的试用ID已经存在。", "ProjNot": "项目初始化或者进行中时,才允许操作", - "TrialConfirm": "Trial访视计划已经确认,无法删除", + "TrialConfirm": "Trial检查批次计划已经确认,无法删除", "TrialIntoTheGroup": "该Trial有医生入组或在入组流程中,无法删除", "TrialHaveSite": "该Trial下面有Site,无法删除", "TrialHaveParticipants": "该Trial下面有参与者,无法删除", @@ -59,7 +59,7 @@ // TrialSiteService "CodeRepeated": "编码不允许重复", - "CRCCanNotDeleted": "该站点已与CRC关联,无法删除", + "CRCCanNotDeleted": "该站点已与IC关联,无法删除", "SiteCanNotDeleted": "主题已添加到本网站,无法删除", "StudyCanNotDeleted": "该网站已上传研究,无法删除", @@ -67,18 +67,18 @@ // SubjectService "VisitNotConfirmed": "试访计划尚未确定。添加主题前请联系项目经理确认访问计划", - "ExistedTrial": "在本试验中已经存在一个具有相同受试者ID的受试者.", - "TheLastVisit": "该受试者已经有访视设置为末次访视,不允许将该访视设置为末次访视", - "ImagesUploaded": "该受试者此访视后有影像上传,该访视不允许设置为末次访视", + "ExistedTrial": "在本试验中已经存在一个具有相同患者ID的患者.", + "TheLastVisit": "该患者已经有检查批次设置为末次检查批次,不允许将该检查批次设置为末次检查批次", + "ImagesUploaded": "该患者此检查批次后有影像上传,该检查批次不允许设置为末次检查批次", "StudyImagesCanBotDeleted": "本课题已上传研究图像进行访问,无法删除", // SubjectVisitService "ContainsVisitnum": "这个主题的访问计划已经包含了一个访问次数相同的访问", - //该受试者已经有访视设置为末次访视,不允许将该访视设置为末次访视 这个在上面有 TheLastVisit - "LastEvaluationNotAllowed": "设置末次评估后,不允许添加计划外访视", - "CRCSubmit": "CRC提交后,不允许修改PD确认状态", - "BacktrackingVisits": "回退的访视,不允许修改PD确认状态", - "ImageUpload": "该受试者此访视后有影像上传,该访视不允许设置为末次访视", + //该患者已经有检查批次设置为末次检查批次,不允许将该检查批次设置为末次检查批次 这个在上面有 TheLastVisit + "LastEvaluationNotAllowed": "设置末次评估后,不允许添加计划外检查批次", + "CRCSubmit": "IC提交后,不允许修改PD确认状态", + "BacktrackingVisits": "回退的检查批次,不允许修改PD确认状态", + "ImageUpload": "该患者此检查批次后有影像上传,该检查批次不允许设置为末次检查批次", "AssociatedUploaded": "本次访问与上传的研究图片有关,无法删除", "InPlanCanNotDeleted": "此访问为InPlan,不能删除", @@ -86,12 +86,12 @@ "OnlyInitializing": "只有“初始化中”和“正在进行中”才能进行操作", "AccordWithVisitNum": "对于访问计划,具有较大VisitNum的VisitDay应该大于具有较小VisitNum的VisitDay", "same/VisitName": "当前访问计划中已经存在具有相同VisitName/VisitNum的访问", - "AlreadyBaseline": "已访视是当前访视计划的基线", - "IsUploadVideo": "有CRC已经为基线上传了影像数据,不允许修改基线", - "VisitHasBeenExecuted": "访问计划已分配给受试者并执行", + "AlreadyBaseline": "已检查批次是当前检查批次计划的基线", + "IsUploadVideo": "有IC已经为基线上传了影像数据,不允许修改基线", + "VisitHasBeenExecuted": "访问计划已分配给患者并执行", "OnlyProgressCanEdit": "仅仅在项目初始化或者进行中时,才允许修改确认", "NoBaselineNoConfirmation": "没有基线,不允许确认", - "NotConfirmedCanNotVisit": "项目配置未确认,不允许确认访视计划", + "NotConfirmedCanNotVisit": "项目配置未确认,不允许确认检查批次计划", "VisitDayNotMinimum": "基线VisitDay 不是最小的, 不允许确认", @@ -122,11 +122,11 @@ // QCOperationService "AuditQuestionMust": "必须填写审核问题,并保存,否则不允许添加质疑", - "VisitNoClose": "当前访视有未关闭的 同意CRC上传的质疑,不允许再次添加质疑", - "NotFinish": "CRC申请重传的/QC同意重传的质疑,在CRC设置重传完成前不允许关闭质疑", + "VisitNoClose": "当前检查批次有未关闭的 同意IC上传的质疑,不允许再次添加质疑", + "NotFinish": "IC申请重传的/QC同意重传的质疑,在IC设置重传完成前不允许关闭质疑", "QCHasBeenReplied": "此QC质询已回复", - "OperationUserMustBeCRC/PM": "一致性核查对话操作用户 只允许 CRC/PM", - "CanNotCloseQuery": "执行一致性核查的访视 不允许关闭质疑", + "OperationUserMustBeCRC/PM": "一致性核查对话操作用户 只允许 IC/PM", + "CanNotCloseQuery": "执行一致性核查的检查批次 不允许关闭质疑", "OnlyPMCanSet": "只允许PM 手动设置一致性核查通过", "CanNotSettingConsistency": "当前是PM同意回退,不允许设置一致性核查通过", "ConsistencyNotClose": "致性核查质疑未关闭/审核状态不是通过,不允许设置一致性核查通过", @@ -137,15 +137,15 @@ "OnlyExcelCSV": "只允许Excel、 CSV!", "ExcelVerificationFailed": "请上传规定格式的Excel文件,保证有有效数据", "QCUnconfirmed": "QC问题未确认,不允许领取任务", - "MustBeFinish": "您已经领取了其他受试者,完成后才允许领取新的受试者", + "MustBeFinish": "您已经领取了其他患者,完成后才允许领取新的患者", "BeReceive": "当前已被领取,不允许领取", "CancelQCTask": "项目配置为不审,没有领取或者取消QC Task", "FirstTriaPassed": "初审已通过,不能继续领取", "CanNotReceive": "项目配置为单审,不满足SubmmitState:已提交 或者 AuditState:待审核/审核中, 不允许领取,请刷新界面", "MustBeDifferent": "复审不能和初审是同一个人", "IsNotSatisfied": "项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面", - "VisitNotUploaded": "有访视未上传任何Dicom/非Dicom数据 不允许提交", - "MandatoryFailed": "项目配置了需要填写首次给药日期 但是受试者没有填写首次给药日期,不允许提交", + "VisitNotUploaded": "有检查批次未上传任何Dicom/非Dicom数据 不允许提交", + "MandatoryFailed": "项目配置了需要填写首次给药日期 但是患者没有填写首次给药日期,不允许提交", "YouBeenRemoved": "您已经被移出项目,不允许该操作", "QuestionsNotClosed": "有质疑未关闭,不允许该操作", "CanNotSetQCPassed": "不审状态下,不允许设置为QC Passed", @@ -156,8 +156,8 @@ "CanNotSetQCFailed": "不审状态下,不允许设置为QC Failed", "NotInPrimaryQCQCFailed": "项目配置为单审 当前审核状态不为 InPrimaryQC,不能变更到 QCFailed", "TrialIsDoubleCheckCanNotQCFailed{0}": "项目配置为双审 当前审核状态为 {0},不能变更到 QCFailed", - "CRCHasBeenSubmitted": "CRC已提交了 不能修改入组确认状态", - "CannotBeChangedPD": "回退的访视,不允许修改PD确认状态", + "CRCHasBeenSubmitted": "IC已提交了 不能修改入组确认状态", + "CannotBeChangedPD": "回退的检查批次,不允许修改PD确认状态", "OtherQCProcessAudit": "其他QC正在进行审核,当前操作不允许", "ForwardFailed": "转发失败", @@ -185,9 +185,9 @@ //StudyListService - "TimeTooLow": "当前访视检查时间不能小于该访视之前检查的时间,请核对检查数据是否有误", + "TimeTooLow": "当前检查批次检查时间不能小于该检查批次之前检查的时间,请核对检查数据是否有误", "SomeoneLoading": "当前有人正在上传归档该检查!", - "VisitEnd": "受试者访视结束,不允许上传!", + "VisitEnd": "患者检查批次结束,不允许上传!", "DICOMUploaded{0}{1}{2}{3}": "{0}:此DICOM图片已上传并分配给课题{2}(研究ID:{3})的{1},课题{2}无法继续上传并分配给他人。", //StudyService @@ -195,15 +195,15 @@ //SystemAnonymizationService //ReadingImageTaskService - "ReadingImage_NotVisit": "系统调用错误,当前任务不是访视任务。", + "ReadingImage_NotVisit": "系统调用错误,当前任务不是检查批次任务。", "ReadingImage_CantSplit": "当前任务是基线任务,不能执行分裂病灶的操作。", "ReadingImage_BeSigned": "当前任务已经签名,请勿重复提交。", "ReadingImage_Beinvalid": "当前任务已失效,不能执行阅片。", - "ReadingImage_NotaTask": "合并的病灶并非同一个访视任务", + "ReadingImage_NotaTask": "合并的病灶并非同一个检查批次任务", "ReadingImage_DeleteError": "当前病灶分裂出其他病灶或者其他病灶合并到了当前病灶,删除失败。", "ReadingImage_Idnotcorrespond": "病灶标记添加失败,影像的Instance ID和Series ID不对应。", - "ReadingImage_IsLymphNotbigger": "当前访视该淋巴结病灶的短径小于上一访视的值,不能设置为显著增大。", - "ReadingImage_NotLymphNotbigger": "当前访视该非淋巴结病灶的长径小于上一访视的值,不能设置为显著增大。", + "ReadingImage_IsLymphNotbigger": "当前检查批次该淋巴结病灶的短径小于上一检查批次的值,不能设置为显著增大。", + "ReadingImage_NotLymphNotbigger": "当前检查批次该非淋巴结病灶的长径小于上一检查批次的值,不能设置为显著增大。", "ReadingImage_Twice": "系统调用错误,提交的问题及答案重复。", "ReadingImage_MaxQuestion": "按照《独立影像评估章程》的相关规则,当前病灶类型的病灶数量不超过{0}个。", "ReadingImage_Maxlesion": "按照《独立影像评估章程》的相关规则,同一器官的靶病灶数量不超过{0}个,请确认", @@ -212,7 +212,7 @@ "ReadingImage_RequiredQuestion": "提交前,请完成\"{0}\"", "ReadingImage_ClinicalRead": "临床数据未阅读,请确认!", "ReadingImage_IDMust": "系统调用失败,当没有任务ID的时候,标准ID必传。", - "ReadingImage_TaskFinish": "当前受试者所有阅片任务已完成,请知悉。", + "ReadingImage_TaskFinish": "当前患者所有阅片任务已完成,请知悉。", "ReadingImage_NeedRest": "您已连续阅片{0}个小时,请休息{1}分钟后,再继续阅片。", //ReadingJudgeTaskService "ReadingJudge_SouceIdNull": "系统调用失败,当前裁判的全局任务的SouceId为null。", diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs index f31eaaac..ac9eb48e 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs @@ -209,10 +209,10 @@ namespace IRaCIS.Core.Application.ViewModel { public Guid TrialId { get; set; } - //针对访视产生任务的 有用 + //针对检查批次产生任务的 有用 public bool IsAssignSubjectToDoctor { get; set; } - //访视任务产生的时候传递 + //检查批次任务产生的时候传递 public List VisitGenerataTaskList { get; set; } = new List(); diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index 315580a1..1e323a40 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -82,13 +82,13 @@ namespace IRaCIS.Core.Application.ViewModel public ReadingTool? ReadingTool { get; set; } /// - /// 任务展示访视 读片任务显示是否顺序 + /// 任务展示检查批次 读片任务显示是否顺序 /// public bool IsReadingTaskViewInOrder { get; set; } = true; /// - /// 阅片是否显示受试者信息 + /// 阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } = false; @@ -178,7 +178,7 @@ namespace IRaCIS.Core.Application.ViewModel public ReReadingApplyState ReReadingApplyState { get; set; } public DateTime? SuggesteFinishedTime { get; set; } - //任务来源访视Id 方便回更访视读片状态 + //任务来源检查批次Id 方便回更检查批次读片状态 public Guid? SourceSubjectVisitId { get; set; } public Guid? SouceReadModuleId { get; set; } @@ -378,6 +378,13 @@ namespace IRaCIS.Core.Application.ViewModel public RequestReReadingResult? RequestReReadingResultEnum { get; set; } + + public DateTime? BeginSignTime { get; set; } + + public DateTime? EndSignTime { get; set; } + + + } diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs index 980d36b2..65c966eb 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskAllocationRuleService.cs @@ -135,11 +135,10 @@ namespace IRaCIS.Core.Application.Service public async Task> GetDoctorUserSelectList(Guid trialId, [FromServices] IRepository _enrollRepository) { var query = from enroll in _enrollRepository.Where(t => t.TrialId == trialId && t.EnrollStatus >= EnrollStatus.ConfirmIntoGroup) - join user in _userRepository.AsQueryable() on enroll.DoctorId equals user.DoctorId + join user in _userRepository.AsQueryable() on enroll.DoctorUserId equals user.Id select new TrialDoctorUserSelectView() { TrialId = enroll.TrialId, - //ReadingType = enroll.Trial.ReadingType, DoctorUserId = user.Id, FullName = user.FullName, UserCode = user.UserCode, @@ -149,7 +148,9 @@ namespace IRaCIS.Core.Application.Service }; - return await query.ToListAsync(); + var list= await query.ToListAsync(); + + return list; } @@ -187,7 +188,7 @@ namespace IRaCIS.Core.Application.Service #region 废弃 /// - /// 获取访视任务 应用Subject后 医生比率情况 + /// 获取检查批次任务 应用Subject后 医生比率情况 /// /// [HttpPost] diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs index 4ed8bb46..78af17eb 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs @@ -182,7 +182,7 @@ namespace IRaCIS.Core.Application.Service }); - //最后一个访视添加全局 + //最后一个检查批次添加全局 if (filterObj.IsGenerateGlobalTask) { var lastTask = (subject.VisitTaskList.Take(filterObj.PlanVisitCount).Last()).Clone(); @@ -373,7 +373,7 @@ namespace IRaCIS.Core.Application.Service } - //最后一个访视添加全局 + //最后一个检查批次添加全局 if (filterObj.IsGenerateGlobalTask) { @@ -468,7 +468,7 @@ namespace IRaCIS.Core.Application.Service Expression> visitTaskFilter = comonTaskFilter.And(t => t.ReadingCategory == ReadingCategory.Visit); - ////所选访视数量 的访视 其中必有一个访视后有全局任务 + ////所选检查批次数量 的检查批次 其中必有一个检查批次后有全局任务 //if (filterObj.IsHaveReadingPeriod == true) //{ // //这里的过滤条件 不能用 where(comonTaskFilter) 会报错,奇怪的问题 只能重新写一遍 @@ -581,7 +581,7 @@ namespace IRaCIS.Core.Application.Service Expression> visitTaskFilter = comonTaskFilter.And(t => t.ReadingCategory == ReadingCategory.Visit); - ////所选访视数量 的访视 其中必有一个访视后有全局任务 + ////所选检查批次数量 的检查批次 其中必有一个检查批次后有全局任务 //if (filterObj.IsHaveReadingPeriod == true) //{ // //visitTaskFilter = visitTaskFilter.And(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Any(u => u.VisitTaskNum == t.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Global] && u.ReadingCategory == ReadingCategory.Global)); diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 6c5a3163..ea6b8f5d 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -22,7 +22,7 @@ namespace IRaCIS.Core.Application.Service /// - /// 访视读片任务 + /// 检查批次读片任务 /// [ApiExplorerSettings(GroupName = "Trial")] public class VisitTaskHelpeService : IVisitTaskHelpeService @@ -93,7 +93,7 @@ namespace IRaCIS.Core.Application.Service //基于标准签名 产生任务 public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId) { - //找到一致性核查通过且没有产生任务的访视 + //找到一致性核查通过且没有产生任务的检查批次 var needGenerateVisit = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed && !t.VisitTaskList.Any(u => u.TrialReadingCriterionId == confirmedTrialReadingCriterionId && u.SourceSubjectVisitId == t.Id && u.TaskState==TaskState.Effect && u.IsAnalysisCreate==false)).ToListAsync(); @@ -123,28 +123,30 @@ namespace IRaCIS.Core.Application.Service foreach (var subjectVisit in subjectGroup.SubjectVisitList) { - var blindTaskName = string.Empty; + //var blindTaskName = string.Empty; + + var blindTaskName = subjectVisit.VisitName; var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList); var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId); - if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0) - { - blindTaskName = visitBlindConfig.BlindBaseLineName; - } - else - { - if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) - { - blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum); - } - else - { - blindTaskName = visitBlindConfig.BlindFollowUpPrefix; - } - } + //if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0) + //{ + // blindTaskName = visitBlindConfig.BlindBaseLineName; + //} + //else + //{ + // if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) + // { + // blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum); + // } + // else + // { + // blindTaskName = visitBlindConfig.BlindFollowUpPrefix; + // } + //} - //每个访视 根据项目配置生成任务 双审生成两个 + //每个检查批次 根据项目配置生成任务 双审生成两个 TaskUrgentType? taskUrgentType = null; @@ -321,7 +323,7 @@ namespace IRaCIS.Core.Application.Service private bool IsNeedClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, Guid trialReadingCriterionId, List trialClinicalDataSetList) { - //访视 + //检查批次 if (readingCategory == ReadingCategory.Visit) { if (isbaseLine) @@ -373,16 +375,16 @@ namespace IRaCIS.Core.Application.Service var needSignCount = 0; - //CRC 的自动签名 不用管 只用处理PM的就好 + //IC 的自动签名 不用管 只用处理PM的就好 var haveSignedCount = _readingClinicalDataRepository .Where(t => t.TrialId == trialId && t.IsSign && t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned && t.ReadingId == readingId && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM).Count(); - //访视 + //检查批次 if (readingCategory == ReadingCategory.Visit) { if (isbaseLine) { - //CRC 的自动签名 不用管 只用处理PM 的就好 + //IC 的自动签名 不用管 只用处理PM 的就好 needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId) && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit) && t.UploadRole == UploadRole.PM).Count(); } else @@ -412,7 +414,7 @@ namespace IRaCIS.Core.Application.Service needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead && t.UploadRole == UploadRole.PM).Count(); } - //可能仅仅CRC 基线 没有PM + //可能仅仅IC 基线 没有PM if (needSignCount == haveSignedCount /*&& needSignCount != 0*/) { isClinicalDataSign = true; @@ -499,7 +501,7 @@ namespace IRaCIS.Core.Application.Service { case GenerateTaskCategory.Visit: - //每个Subject 的每个访视 都要根据每个标准进行任务的生成 和分配(考虑回退后 的分配) + //每个Subject 的每个检查批次 都要根据每个标准进行任务的生成 和分配(考虑回退后 的分配) foreach (var subjectGroup in generateTaskCommand.VisitGenerataTaskList.GroupBy(t => t.SubjectId).Select(g => new { SubjectId = g.Key, SubjectVisitList = g.ToList() })) @@ -542,30 +544,30 @@ namespace IRaCIS.Core.Application.Service var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync(); - var blindTaskName = string.Empty; + var blindTaskName = subjectVisit.VisitName; var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList); var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId); - if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0) - { - blindTaskName = visitBlindConfig.BlindBaseLineName; - } - else - { - if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) - { - blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum); - } - else - { - blindTaskName = visitBlindConfig.BlindFollowUpPrefix; - } - } + //if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0) + //{ + // blindTaskName = visitBlindConfig.BlindBaseLineName; + //} + //else + //{ + // if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) + // { + // blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum); + // } + // else + // { + // blindTaskName = visitBlindConfig.BlindFollowUpPrefix; + // } + //} - //每个访视 根据项目配置生成任务 双审生成两个 + //每个检查批次 根据项目配置生成任务 双审生成两个 //双重 可能有一个人的任务没分配,然后影像回退不会影响未分配的任务,所以生成的时候 要进行判断 不能每次都生成两个 if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double) @@ -661,25 +663,25 @@ namespace IRaCIS.Core.Application.Service if (assignConfigList.Count > 0 && trialReadingCriterionConfig.IsFollowVisitAutoAssign) { - #region 后续访视 未分配的进行再次分配,重置的或者失效的 需要重新生成新的任务 (PM 有序退回 或者PM 有序 申请重阅) + #region 后续检查批次 未分配的进行再次分配,重置的或者失效的 需要重新生成新的任务 (PM 有序退回 或者PM 有序 申请重阅) if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) { - //之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去(排除失访的) + //之前有回退到影像上传的检查批次 那么当前检查批次一致性核查通过的时候,当前检查批次生成但是不分配出去(排除失访的) var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); - //之前有回退的,那么当前访视任务生成但是不分配 + //之前有回退的,那么当前检查批次任务生成但是不分配 if (beforeBackVisitTask != null) { //不用进行额外处理 - //访视2 PM 回退 基线回退 访视2先一致性核查通过,生成访视2任务,但是不分配 + //检查批次2 PM 回退 基线回退 检查批次2先一致性核查通过,生成检查批次2任务,但是不分配 } else { - #region 当前访视根据配置规则分配出去 + #region 当前检查批次根据配置规则分配出去 var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; @@ -704,12 +706,12 @@ namespace IRaCIS.Core.Application.Service #endregion } - //后续最近的未一致性核查通过的访视任务 + //后续最近的未一致性核查通过的检查批次任务 var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); - //大于当前访视 同时小于最近的未一致性核查通过的访视任务分配 或者生成 + //大于当前检查批次 同时小于最近的未一致性核查通过的检查批次任务分配 或者生成 - //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是访视1还未通过时 生成任务 + //存在退回检查批次1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是检查批次1还未通过时 生成任务 var followVisitTaskList = await _visitTaskRepository .Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) .WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum) @@ -717,7 +719,7 @@ namespace IRaCIS.Core.Application.Service var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum); - //每个访视去判断 是分配还是生成(因为影响哪里有些是取消分配,有些是重阅重置需要重新生成) + //每个检查批次去判断 是分配还是生成(因为影响哪里有些是取消分配,有些是重阅重置需要重新生成) foreach (var visitGroup in followVisitGroup) { @@ -746,7 +748,7 @@ namespace IRaCIS.Core.Application.Service bool isCanEdit = urgentType == TaskUrgentType.EnrollmentConfirm || urgentType == TaskUrgentType.PDProgress ? false : true; - //如果后续访视已分配有效 就不用处理 + //如果后续检查批次已分配有效 就不用处理 if (visitGroup.Any(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.ArmEnum == Arm.DoubleReadingArm1)) { //不做处理 @@ -815,7 +817,7 @@ namespace IRaCIS.Core.Application.Service } - //如果后续访视已分配有效 就不用处理 + //如果后续检查批次已分配有效 就不用处理 if (visitGroup.Any(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.ArmEnum == Arm.DoubleReadingArm2)) { //不做处理 @@ -916,7 +918,7 @@ namespace IRaCIS.Core.Application.Service } else - //后续访视不自动分配,或者配置的医生数量不足,就不进行分配 + //后续检查批次不自动分配,或者配置的医生数量不足,就不进行分配 { } @@ -991,17 +993,17 @@ namespace IRaCIS.Core.Application.Service if (assignConfigList.Count > 0) { - #region 重阅/退回的时候,需要将取消分配的访视类型的 任务重新分配 + #region 重阅/退回的时候,需要将取消分配的检查批次类型的 任务重新分配 if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) { - //之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去(排除失访的) + //之前有回退到影像上传的检查批次 那么当前检查批次一致性核查通过的时候,当前检查批次生成但是不分配出去(排除失访的) var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); if (beforeBackVisitTask == null) { - #region 访视2 PM 回退 基线回退 访视2先一致性核查通过,生成访视2任务,但是不分配 + #region 检查批次2 PM 回退 基线回退 检查批次2先一致性核查通过,生成检查批次2任务,但是不分配 var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; @@ -1023,7 +1025,7 @@ namespace IRaCIS.Core.Application.Service var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); - //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是访视1还未通过时 生成任务 + //存在退回检查批次1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是检查批次1还未通过时 生成任务 var followVisitTaskList = await _visitTaskRepository .Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) .WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum) @@ -1031,12 +1033,12 @@ namespace IRaCIS.Core.Application.Service var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum); - //每个访视去判断 是分配还是生成 + //每个检查批次去判断 是分配还是生成 foreach (var visitGroup in followVisitGroup) { - //如果后续访视已分配有效 就不用处理 + //如果后续检查批次已分配有效 就不用处理 if (visitGroup.Any(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.ArmEnum == Arm.SingleReadingArm)) { //不做处理 @@ -1096,7 +1098,7 @@ namespace IRaCIS.Core.Application.Service } } - //之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去 + //之前有回退的 后续检查批次不生成或者分配 当前检查批次生成但是不分配出去 else { diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 87a133ec..dfe54859 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -25,7 +25,7 @@ using IRaCIS.Core.Domain.Share.Reading; namespace IRaCIS.Core.Application.Service.Allocation { /// - /// 访视读片任务 + /// 检查批次读片任务 /// [ApiExplorerSettings(GroupName = "Trial")] public class VisitTaskService : BaseService, IVisitTaskService @@ -166,7 +166,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //if (inOrder) //{ - // //针对有序阅片 只分配< 最小的 不是一致性核查通过状态 和不是失访 的访视 的任务 + // //针对有序阅片 只分配< 最小的 不是一致性核查通过状态 和不是失访 的检查批次 的任务 // if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == subjectId && t.CheckState != CheckStateEnum.CVPassed && t.IsLostVisit == false)) // { // var notCheckPassedMinVisitNum = await _subjectVisitRepository.Where(t => t.SubjectId == subjectId && t.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitNum).Select(t => t.VisitNum).FirstOrDefaultAsync(); @@ -312,10 +312,10 @@ namespace IRaCIS.Core.Application.Service.Allocation throw new BusinessValidationFailedException("出现脏数据 任务来源字段没有值"); } - //PM 回退了 但是还没生成任务 当前任务编号前有访视进行了回退就不允许分配 + //PM 回退了 但是还没生成任务 当前任务编号前有检查批次进行了回退就不允许分配 if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == visitTask.SubjectId && t.IsPMBackOrReReading && t.VisitNum <= visitTask.VisitTaskNum)) { - return ResponseOutput.NotOk("该受试者有访视进入了退回流程,还未经过一致性核查通过,不允许分配"); + return ResponseOutput.NotOk("该患者有检查批次进入了退回流程,还未经过一致性核查通过,不允许分配"); } @@ -340,7 +340,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //是否删除配置规则表里的 Subject 医生绑定关系 重新添加绑定关系 - //是否其该Subject 其他访视 绑定的医生 也同时变更? + //是否其该Subject 其他检查批次 绑定的医生 也同时变更? } @@ -618,7 +618,7 @@ namespace IRaCIS.Core.Application.Service.Allocation /// - /// 访视任务 + /// 检查批次任务 /// /// /// @@ -626,7 +626,7 @@ namespace IRaCIS.Core.Application.Service.Allocation [HttpPost] public async Task> GetVisitTaskList(VisitTaskQuery queryVisitTask, [FromServices] IVisitTaskHelpeService _visitTaskCommonService) { - //以前访视未产生任务的,在查询这里要产生 + //以前检查批次未产生任务的,在查询这里要产生 var svIdList = await _subjectVisitRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.CheckState == CheckStateEnum.CVPassed && t.IsVisitTaskGenerated == false).Select(t => t.Id).ToListAsync(); //之前没有生成任务的逻辑 但是现在加了,任务要自动生成 @@ -735,8 +735,11 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate == false)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate)) - .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate) - .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) + .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime >= queryVisitTask.BeginAllocateDate) + .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime <= queryVisitTask.EndAllocateDate) + .WhereIf(queryVisitTask.TaskCode != null, t => t.TaskCode.Contains(queryVisitTask.TaskCode) ) + .WhereIf(queryVisitTask.BeginSignTime != null, t => t.SignTime >= queryVisitTask.BeginSignTime) + .WhereIf(queryVisitTask.EndSignTime != null, t => t.SignTime <= queryVisitTask.EndSignTime) .ProjectTo(_mapper.ConfigurationProvider); var defalutSortArray = new string[] { nameof(VisitTask.IsUrgent) + " desc", nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) }; @@ -1007,7 +1010,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //.Where(t => t.VisitTaskNum < t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) ) .Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum < t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true) - //满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang + //满足前序检查批次不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang //但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候,要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活 //.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)) .WhereIf(!string.IsNullOrEmpty(inDto.SubjectCode), t => (t.Subject.Code.Contains(inDto.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inDto.SubjectCode) && t.IsAnalysisCreate)); @@ -1215,18 +1218,18 @@ namespace IRaCIS.Core.Application.Service.Allocation if (task.ReadingCategory != ReadingCategory.Visit) { - throw new BusinessValidationFailedException("PM 仅仅允许对访视类型的任务申请重阅"); + throw new BusinessValidationFailedException("PM 仅仅允许对检查批次类型的任务申请重阅"); } - // 有序 一个受试者访视重阅未处理完,不能申请其他的 + // 有序 一个患者检查批次重阅未处理完,不能申请其他的 if (criterionConfig.IsReadingTaskViewInOrder) { if (await _visitTaskReReadingRepository.AnyAsync(t => t.OriginalReReadingTask.TrialId == task.TrialId && t.OriginalReReadingTask.SubjectId == task.SubjectId && t.OriginalReReadingTask.TaskState == TaskState.Effect && t.OriginalReReadingTask.TrialReadingCriterionId == task.TrialReadingCriterionId && t.OriginalReReadingTask.ReadingTaskState == ReadingTaskState.HaveSigned && t.RequestReReadingType == RequestReReadingType.TrialGroupApply && t.RequestReReadingResultEnum == RequestReReadingResult.Default)) { - return ResponseOutput.NotOk("当前为有序阅片,该受试者已有访视已申请重阅还未处理(项目组申请),暂不能继续申请重阅"); + return ResponseOutput.NotOk("当前为有序阅片,该患者已有检查批次已申请重阅还未处理(项目组申请),暂不能继续申请重阅"); } } @@ -1247,7 +1250,7 @@ namespace IRaCIS.Core.Application.Service.Allocation && t.OriginalReReadingTask.TrialReadingCriterionId == task.TrialReadingCriterionId && t.OriginalReReadingTask.ReadingTaskState == ReadingTaskState.HaveSigned && t.RequestReReadingType == RequestReReadingType.DocotorApply && t.RequestReReadingResultEnum == RequestReReadingResult.Default)) { - return ResponseOutput.NotOk("当前为有序阅片,该受试者已有访视已申请重阅还未处理,暂不能继续申请重阅"); + return ResponseOutput.NotOk("当前为有序阅片,该患者已有检查批次已申请重阅还未处理,暂不能继续申请重阅"); } @@ -1277,17 +1280,17 @@ namespace IRaCIS.Core.Application.Service.Allocation if (task.ReadingCategory == ReadingCategory.Global && await _visitTaskRepository.AnyAsync(filterExpression.And(t => t.ReadingCategory == ReadingCategory.Global))) { - throw new BusinessValidationFailedException("有序阅片,只允许申请该受试者阅片人最后一次全局任务重阅"); + throw new BusinessValidationFailedException("有序阅片,只允许申请该患者阅片人最后一次完成全局任务重阅"); } if (task.ReadingCategory == ReadingCategory.Oncology && await _visitTaskRepository.AnyAsync(filterExpression.And(t => t.ReadingCategory == ReadingCategory.Oncology))) { - throw new BusinessValidationFailedException("有序阅片,只允许申请该受试者阅片人最后一次肿瘤学任务重阅"); + throw new BusinessValidationFailedException("有序阅片,只允许申请该患者阅片人最后一次完成肿瘤学任务重阅"); } if (task.ReadingCategory == ReadingCategory.Judge && await _visitTaskRepository.AnyAsync(filterExpression.And(t => t.ReadingCategory == ReadingCategory.Judge))) { - throw new BusinessValidationFailedException("有序阅片,只允许申请该受试者阅片人最后一次裁判的任务重阅"); + throw new BusinessValidationFailedException("有序阅片,只允许申请该患者阅片人最后一次完成裁判的任务重阅"); } } @@ -1295,7 +1298,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { if (task.ReadingCategory != ReadingCategory.Visit && task.ReadingCategory != ReadingCategory.Global) { - throw new BusinessValidationFailedException("无序阅片,仅仅允许IR 申请 全局和访视类型类别的任务进行重阅"); + throw new BusinessValidationFailedException("无序阅片,仅仅允许IR 申请 全局和检查批次类型类别的任务进行重阅"); } } @@ -1442,10 +1445,10 @@ namespace IRaCIS.Core.Application.Service.Allocation if (agreeReReadingCommand.RequestReReadingResultEnum == RequestReReadingResult.Agree) { - //PM申请 SPM / CPM审批 回退访视,在此不生成访视任务 影响多个标准的任务 + //PM申请 SPM / CPM审批 回退检查批次,在此不生成检查批次任务 影响多个标准的任务 if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.TrialGroupApply && (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM)) { - #region PM 申请两个IR 同一访视,其他人的申请记录也设置为同意 不会出现,因为在未处理前 一个Subject只能申请一次 + #region PM 申请两个IR 同一检查批次,其他人的申请记录也设置为同意 不会出现,因为在未处理前 一个Subject只能申请一次 // await _visitTaskReReadingRepository.BatchUpdateNoTrackingAsync(t => t.OriginalReReadingTask.SubjectId == origenalTask.SubjectId && @@ -1458,7 +1461,7 @@ namespace IRaCIS.Core.Application.Service.Allocation // RequestReReadingResultEnum = RequestReReadingResult.Agree, //}); - // //只更新 PM 申请 同一访视的数据 + // //只更新 PM 申请 同一检查批次的数据 // await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == origenalTask.SubjectId && // t.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed && // t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId && @@ -1472,7 +1475,7 @@ namespace IRaCIS.Core.Application.Service.Allocation #endregion - // 不管有序 无序 都会 回退访视 + // 不管有序 无序 都会 回退检查批次 if (origenalTask.ReadingCategory == ReadingCategory.Visit) { //执行类似一致性核查回退流程 @@ -1480,7 +1483,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } else { - throw new BusinessValidationFailedException("仅允许同意访视类型的任务重阅"); + throw new BusinessValidationFailedException("仅允许同意检查批次类型的任务重阅"); } //有序阅片 @@ -1488,7 +1491,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { - //访视影响当前以及当前之后的 两个阅片人的 + //检查批次影响当前以及当前之后的 两个阅片人的 filterExpression = filterExpression.And(t => t.VisitTaskNum >= origenalTask.VisitTaskNum); @@ -1520,7 +1523,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } - //申请的访视 要不是重阅重置,要不就是失效 不会存在取消分配 + //申请的检查批次 要不是重阅重置,要不就是失效 不会存在取消分配 if (influenceTask.ReadingCategory == ReadingCategory.Visit && influenceTask.VisitTaskNum != origenalTask.VisitTaskNum) { if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) @@ -1544,7 +1547,7 @@ namespace IRaCIS.Core.Application.Service.Allocation trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.CancelAssign }); } } - //当前访视 + //当前检查批次 else { if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) @@ -1623,10 +1626,10 @@ namespace IRaCIS.Core.Application.Service.Allocation } - //IR申请 PM 审批 注意这里有一致性分析的申请同意 不会回退访视,在此要生成影响的访视任务 + //IR申请 PM 审批 注意这里有一致性分析的申请同意 不会回退检查批次,在此要生成影响的检查批次任务 else if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.DocotorApply && (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.AIR)) { - #region 两个IR 申请同一访视,其他人的申请记录也设置为同意 + #region 两个IR 申请同一检查批次,其他人的申请记录也设置为同意 await _visitTaskReReadingRepository.BatchUpdateNoTrackingAsync(t => t.OriginalReReadingTask.SubjectId == origenalTask.SubjectId && @@ -1655,14 +1658,14 @@ namespace IRaCIS.Core.Application.Service.Allocation if (criterionConfig.IsReadingTaskViewInOrder) { - #region 有序 IR 申请 重阅 影响的其他访视查询 + #region 有序 IR 申请 重阅 影响的其他检查批次查询 switch (origenalTask.ReadingCategory) { case ReadingCategory.Visit: - //影响后续访视已经读完的,正在读的,未读的不做处理 以及其他类型任务 + //影响后续检查批次已经读完的,正在读的,未读的不做处理 以及其他类型任务 filterExpression = filterExpression.And(t => t.VisitTaskNum >= origenalTask.VisitTaskNum && ((t.DoctorUserId == origenalTask.DoctorUserId && ((t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState != ReadingTaskState.WaitReading) || t.ReadingCategory == ReadingCategory.Global)) || @@ -1671,7 +1674,7 @@ namespace IRaCIS.Core.Application.Service.Allocation break; - //不影响后续访视: (t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState != ReadingTaskState.WaitReading) || + //不影响后续检查批次: (t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState != ReadingTaskState.WaitReading) || case ReadingCategory.Global: filterExpression = filterExpression.And(t => t.VisitTaskNum > origenalTask.VisitTaskNum && @@ -1681,7 +1684,7 @@ namespace IRaCIS.Core.Application.Service.Allocation case ReadingCategory.Oncology: - //仅仅影响自己 后续任务如果是访视任务、全局任务或裁判任务,均不处理 + //仅仅影响自己 后续任务如果是检查批次任务、全局任务或裁判任务,均不处理 filterExpression = filterExpression.And(t => t.Id == origenalTask.Id); break; @@ -1806,7 +1809,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } - //无序阅片 只会申请访视类型和裁判类型的任务 注意这里有一致性分析的申请同意 + //无序阅片 只会申请检查批次类型和裁判类型的任务 注意这里有一致性分析的申请同意 else { //1.当前任务及裁判任务 @@ -1970,13 +1973,13 @@ namespace IRaCIS.Core.Application.Service.Allocation if (task.TaskState != TaskState.Effect || task.ReadingCategory != ReadingCategory.Visit || task.ReadingTaskState == ReadingTaskState.HaveSigned) { - return ResponseOutput.NotOk("仅仅允许针对生效、未完成的访视任务进行退回操作,请刷新页面数据"); + return ResponseOutput.NotOk("仅仅允许针对生效、未完成的检查批次任务进行退回操作,请刷新页面数据"); } if( await _subjectVisitRepository.AnyAsync(t=>t.Id==task.SourceSubjectVisitId && t.CheckState!= CheckStateEnum.CVPassed)) { - return ResponseOutput.NotOk("当前访视已回退到影像上传,不允许继续回退!"); + return ResponseOutput.NotOk("当前检查批次已回退到影像上传,不允许继续回退!"); } @@ -1992,7 +1995,7 @@ namespace IRaCIS.Core.Application.Service.Allocation #region 有序 无序公用流程 - //执行类似一致性核查回退流程 回退访视到影像上传流程 + //执行类似一致性核查回退流程 回退检查批次到影像上传流程 await VisitBackAsync(task.SourceSubjectVisitId); #endregion @@ -2018,7 +2021,7 @@ namespace IRaCIS.Core.Application.Service.Allocation #region 方式一 //foreach (var influenceTask in influenceTaskList) //{ - // //申请任务的阅片人 后续任务肯定没做, 只有访视任务,没有其他任务 取消分配 + // //申请任务的阅片人 后续任务肯定没做, 只有检查批次任务,没有其他任务 取消分配 // if (influenceTask.DoctorUserId == task.DoctorUserId) // { @@ -2122,7 +2125,7 @@ namespace IRaCIS.Core.Application.Service.Allocation foreach (var influenceTask in influenceTaskList) { - //同意的访视 因为要记录具体的操作,所以废弃 + //同意的检查批次 因为要记录具体的操作,所以废弃 if (influenceTask.Id == task.Id) { //influenceTaskList.ForEach(t => @@ -2140,10 +2143,10 @@ namespace IRaCIS.Core.Application.Service.Allocation influenceTask.IsPMSetBack = true; } - //申请的访视 要不是重阅重置,要不就是失效 不会存在取消分配 + //申请的检查批次 要不是重阅重置,要不就是失效 不会存在取消分配 if (influenceTask.ReadingCategory == ReadingCategory.Visit && influenceTask.VisitTaskNum != task.VisitTaskNum) { - //后续访视处理访视 + //后续检查批次处理检查批次 if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) { influenceTask.TaskState = TaskState.HaveReturned; @@ -2167,7 +2170,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } else { - //申请的访视 全局肿瘤学 + //申请的检查批次 全局肿瘤学 if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) { @@ -2197,7 +2200,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //// 当前任务标为失效 //task.TaskState = TaskState.Adbandon; - ////考虑该访视 另外一个阅片人的任务 + ////考虑该检查批次 另外一个阅片人的任务 //var otherReviewerTask = await _visitTaskRepository.FirstOrDefaultAsync(t => t.SourceSubjectVisitId == task.SourceSubjectVisitId && t.Id != task.Id && t.TaskState == TaskState.Effect); @@ -2212,7 +2215,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //} - // 申请该访视的任务 申请人失效 另外一个人重阅重置或者失效 + // 申请该检查批次的任务 申请人失效 另外一个人重阅重置或者失效 var currentVisitList = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == task.SourceSubjectVisitId && t.ReadingCategory == ReadingCategory.Visit && t.TaskState == TaskState.Effect && t.VisitTaskNum == task.VisitTaskNum, true).ToListAsync(); @@ -2236,7 +2239,7 @@ namespace IRaCIS.Core.Application.Service.Allocation origenalTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); } - ////同意的访视 + ////同意的检查批次 //if (influenceTask.Id == task.Id) //{ // currentVisitList.ForEach(t => @@ -2327,7 +2330,7 @@ namespace IRaCIS.Core.Application.Service.Allocation /// - /// 影响提示列表 重阅仅仅针对已完成的任务申请 退回针对的是未完成的(退回仅仅针对是访视类型的) + /// 影响提示列表 重阅仅仅针对已完成的任务申请 退回针对的是未完成的(退回仅仅针对是检查批次类型的) /// /// /// 重阅还是直接回退 @@ -2347,7 +2350,7 @@ namespace IRaCIS.Core.Application.Service.Allocation Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == filterObj.SubjectId && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated; - //是否是一致性分析任务 (一致性分析的任务 不会产生裁判 肿瘤学 仅仅有生成的访视和全局) + //是否是一致性分析任务 (一致性分析的任务 不会产生裁判 肿瘤学 仅仅有生成的检查批次和全局) filterExpression = filterExpression.And(t => t.IsAnalysisCreate == filterObj.IsAnalysisCreate); @@ -2364,7 +2367,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId); - //当前任务及其之后的所有访视任务、全局任务、裁判任务、肿瘤学阅片任务 + //当前任务及其之后的所有检查批次任务、全局任务、裁判任务、肿瘤学阅片任务 //有序 if (criterionConfig.IsReadingTaskViewInOrder) @@ -2373,9 +2376,9 @@ namespace IRaCIS.Core.Application.Service.Allocation switch (filterObj.ReadingCategory) { case ReadingCategory.Visit: - //影响当前医生 以及当前医生之后的 1、访视任务 已经读完的 + //影响当前医生 以及当前医生之后的 1、检查批次任务 已经读完的 //2、后续任务如果是全局、肿瘤学阅片任务,状态为阅片完成标记为重阅重置;若在阅片中,则标记为失效;若为待阅片,则标记为失效; - //3、当前任务、后续访视任务或者全局任务触发了裁判任务,若裁判任务状态为阅片完成,则标记为重阅重置;若在阅片中或待阅片,则标记为失效 + //3、当前任务、后续检查批次任务或者全局任务触发了裁判任务,若裁判任务状态为阅片完成,则标记为重阅重置;若在阅片中或待阅片,则标记为失效 // filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum && //((t.DoctorUserId == filterObj.DoctorUserId && ((t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned) || t.ReadingCategory == ReadingCategory.Global)) // || @@ -2398,7 +2401,7 @@ namespace IRaCIS.Core.Application.Service.Allocation case ReadingCategory.Global: - // 1、后续任务如果是访视任务,均不处理; + // 1、后续任务如果是检查批次任务,均不处理; //2、后续任务如果是全局、状态为阅片完成则标记为重阅重置,若阅片中或待阅片则不处理; //3、当前任务或者全局任务触发了裁判任务,若裁判任务状态为阅片完成,则标记为重阅重置;若在阅片中或待阅片,则标记为失效 //4、后续任务为肿瘤学阅片任务,状态为阅片完成标记为重阅重置;若在阅片中,则标记为失效;若为待阅片,则标记为失效; @@ -2416,7 +2419,7 @@ namespace IRaCIS.Core.Application.Service.Allocation break; - //1、后续任务如果是访视任务、全局任务或裁判任务,均不处理; + //1、后续任务如果是检查批次任务、全局任务或裁判任务,均不处理; case ReadingCategory.Oncology: //仅仅影响自己 @@ -2426,7 +2429,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //(只允许申请该阅片人最后一次完成裁判的任务重阅)申请的时候做了限制 case ReadingCategory.Judge: - // 1、后续任务如果是访视任务、全局任务,均不处理; + // 1、后续任务如果是检查批次任务、全局任务,均不处理; //2、后续若有肿瘤学阅片,若肿瘤学阅片任务状态为阅片完成,则标记为重阅重置;若为阅片中则标记为失效,如为待阅片,则取消分配 //裁判的影响自己 和后续肿瘤学阅片(不是自己做的) @@ -2450,7 +2453,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //throw new BusinessValidationFailedException("仅允许PM 同意 IR 申请的任务"); } - //PM 影响所有阅片人 仅仅针对访视 SPM CPM 掉用 + //PM 影响所有阅片人 仅仅针对检查批次 SPM CPM 掉用 else if (((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.ProjectManager) && filterObj.IsAnalysisCreate == false && filterObj.ReadingCategory == ReadingCategory.Visit) || (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId == null)) @@ -2462,7 +2465,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { case ReadingCategory.Visit: - //访视影响当前以及当前之后的 两个阅片人的 + //检查批次影响当前以及当前之后的 两个阅片人的 filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum); break; @@ -2488,7 +2491,7 @@ namespace IRaCIS.Core.Application.Service.Allocation filterExpression = filterExpression.And(t => t.VisitTaskNum == filterObj.VisitTaskNum || t.VisitTaskNum == judegTaskNum); } - //throw new BusinessValidationFailedException("仅允许SPM CPM 同意 PM 申请的非 一致性分析的访视任务"); + //throw new BusinessValidationFailedException("仅允许SPM CPM 同意 PM 申请的非 一致性分析的检查批次任务"); } else { @@ -2500,7 +2503,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } - //退回影响 仅仅针对是访视类型的 影响多个标准的任务 + //退回影响 仅仅针对是检查批次类型的 影响多个标准的任务 else { @@ -2514,10 +2517,10 @@ namespace IRaCIS.Core.Application.Service.Allocation //有序 if (criterionConfig.IsReadingTaskViewInOrder) { - // 当前任务及其之后的所有访视任务 两个阅片人的 + // 当前任务及其之后的所有检查批次任务 两个阅片人的 - // 1.后续访视不处理 - //2.当前任务未完成,不会产生全局任务。后续任务均为访视任务,且均为待阅片,取消分配; + // 1.后续检查批次不处理 + //2.当前任务未完成,不会产生全局任务。后续任务均为检查批次任务,且均为待阅片,取消分配; filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum); @@ -2536,7 +2539,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } else { - throw new BusinessValidationFailedException("仅仅访视类型的任务支持PM退回"); + throw new BusinessValidationFailedException("仅仅检查批次类型的任务支持PM退回"); } } @@ -2593,7 +2596,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //有序 if (criterionConfig.IsReadingTaskViewInOrder) { - //申请的访视 要不是重阅重置,要不就是失效 不会存在取消分配 + //申请的检查批次 要不是重阅重置,要不就是失效 不会存在取消分配 if (influenceTask.ReadingCategory == ReadingCategory.Visit && influenceTask.VisitTaskNum != filterObj.VisitTaskNum) { if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) @@ -2641,10 +2644,10 @@ namespace IRaCIS.Core.Application.Service.Allocation //有序 if (criterionConfig.IsReadingTaskViewInOrder) { - //申请的访视 要不是重阅重置,要不就是失效 不会存在取消分配 + //申请的检查批次 要不是重阅重置,要不就是失效 不会存在取消分配 if (influenceTask.ReadingCategory == ReadingCategory.Visit && influenceTask.VisitTaskNum != filterObj.VisitTaskNum) { - //后续访视处理访视 + //后续检查批次处理检查批次 if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) { influenceTask.OptType = ReReadingOrBackOptType.Return; @@ -2660,7 +2663,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } else { - //申请的访视 全局肿瘤学 + //申请的检查批次 全局肿瘤学 if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) { diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index 167d0841..540da3eb 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -32,7 +32,7 @@ namespace IRaCIS.Core.Application.Service.Common /// - /// 影像上传列表 只导出已上传状态的访视记录 + /// 影像上传列表 只导出已上传状态的检查批次记录 /// /// /// @@ -128,7 +128,7 @@ namespace IRaCIS.Core.Application.Service.Common /// - /// 受试者信息导出表 + /// 患者信息导出表 /// /// /// @@ -148,7 +148,7 @@ namespace IRaCIS.Core.Application.Service.Common .WhereIf(!string.IsNullOrWhiteSpace(param.Sex), t => t.Sex.Contains(param.Sex)) .WhereIf(param.Status != null, t => t.Status == param.Status) .WhereIf(param.SiteId != null, t => t.SiteId == param.SiteId) - // CRC 只负责他管理site的受试者 + // IC 只负责他管理site的患者 .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); @@ -166,7 +166,7 @@ namespace IRaCIS.Core.Application.Service.Common ///// - ///// 受试者 阅片期 进度表 导出 + ///// 患者 阅片期 进度表 导出 ///// ///// ///// @@ -554,7 +554,7 @@ namespace IRaCIS.Core.Application.Service.Common .WhereIf(checkQuery.SiteId != null, t => t.SiteId == checkQuery.SiteId) .WhereIf(!string.IsNullOrEmpty(checkQuery.SubjectInfo), t => t.Subject.Code.Contains(checkQuery.SubjectInfo)) .WhereIf(checkQuery.VisitPlanArray != null && checkQuery.VisitPlanArray?.Length > 0, svExpression) - .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//CRC 过滤负责的site + .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//IC 过滤负责的site .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); list = list.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitNum).ToList(); @@ -735,7 +735,7 @@ namespace IRaCIS.Core.Application.Service.Common var subjectQuerybal = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == true).Select(t => t.SubjectId).Distinct(); var allList = await _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && subjectQuerybal.Contains(t.SubjectId) && t.ReadingCategory == ReadingCategory.Visit) - .Where(t => (t.IsSelfAnalysis == true || t.IsSelfAnalysis == null)&& t.VisitTaskNum>0) //一致性分析的结果 + 正常任务的结果 + 仅仅访视的结果 +去除基线 + .Where(t => (t.IsSelfAnalysis == true || t.IsSelfAnalysis == null)&& t.VisitTaskNum>0) //一致性分析的结果 + 正常任务的结果 + 仅仅检查批次的结果 +去除基线 //.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) //.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) @@ -763,7 +763,7 @@ namespace IRaCIS.Core.Application.Service.Common //To do 根据任务Id 找对评估结果,这里需要考虑标准 以及对应的翻译 - //基线和访视的评估结果翻译枚举 分别对应着 + //基线和检查批次的评估结果翻译枚举 分别对应着 foreach (var item in list) { @@ -771,11 +771,11 @@ namespace IRaCIS.Core.Application.Service.Common var selfAnalysisTask = allList.Where(t => t.IsSelfAnalysis == true && t.SubjectCode == item.SubjectCode && t.VisitTaskNum == item.VisitTaskNum && t.TaskName == t.TaskName).FirstOrDefault(); - //因为基线的评估结果是 是否存在疾病 而 其他访视的结果是 整体肿瘤评估结果 是用不同的枚举翻译的 所以这里手动翻译 不把翻译逻辑耦合到通用的翻译代码里面 在此特殊处理 + //因为基线的评估结果是 是否存在疾病 而 其他检查批次的结果是 整体肿瘤评估结果 是用不同的枚举翻译的 所以这里手动翻译 不把翻译逻辑耦合到通用的翻译代码里面 在此特殊处理 item.AgainEvaluateResult = selfAnalysisTask?.EvaluateResult ?? String.Empty; - //将自身一致性分析的字段 赋值到访视任务这个字段 + //将自身一致性分析的字段 赋值到检查批次任务这个字段 item.IsAnalysisDiffToOriginalData = selfAnalysisTask?.IsAnalysisDiffToOriginalData; } @@ -817,7 +817,7 @@ namespace IRaCIS.Core.Application.Service.Common var subjectQuerybal = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == false).Select(t => t.SubjectId).Distinct(); var allList = await _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && subjectQuerybal.Contains(t.SubjectId) && t.ReadingCategory == ReadingCategory.Visit) - .Where(t => (t.IsSelfAnalysis == false || t.IsSelfAnalysis == null) && t.VisitTaskNum > 0) //一致性分析的结果 + 正常任务的结果 +仅仅访视的结果 + .Where(t => (t.IsSelfAnalysis == false || t.IsSelfAnalysis == null) && t.VisitTaskNum > 0) //一致性分析的结果 + 正常任务的结果 +仅仅检查批次的结果 //.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) //.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) @@ -846,7 +846,7 @@ namespace IRaCIS.Core.Application.Service.Common var newList = new List(); - // 每个subject访视进行分组 + // 每个subject检查批次进行分组 foreach (var group in list.GroupBy(t => new { t.SubjectCode, t.VisitTaskNum, t.TaskName, t.ArmEnum }) .OrderBy(g => g.Key.SubjectCode) @@ -857,7 +857,7 @@ namespace IRaCIS.Core.Application.Service.Common var subjectVisitGroupList = group.ToList(); - //找到当前访视组间一致性分析的任务结果 + //找到当前检查批次组间一致性分析的任务结果 var groupTaskList = allList.Where(t => t.IsSelfAnalysis == false && t.SubjectCode == group.Key.SubjectCode && t.VisitTaskNum == group.Key.VisitTaskNum && t.TaskName == group.Key.TaskName).ToList(); @@ -929,8 +929,8 @@ namespace IRaCIS.Core.Application.Service.Common if (criterion.CriterionType == CriterionType.RECIST1Pointt1) { - list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.EvaluationOfTumorEfficacy }); + //list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + //list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.EvaluationOfTumorEfficacy }); list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); } @@ -1009,7 +1009,7 @@ namespace IRaCIS.Core.Application.Service.Common exportInfo.List = list; - 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.TrialCode}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(OverallTumorEvaluationExport), criterion.CriterionType); } /// @@ -1146,7 +1146,7 @@ namespace IRaCIS.Core.Application.Service.Common exportInfo.List = exportList; - 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.TrialCode}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1DetailedOfEvaluatedLesionExport), criterion.CriterionType); } @@ -1176,7 +1176,7 @@ namespace IRaCIS.Core.Application.Service.Common exportInfo.List = exportList; - 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.TrialCode}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PCWG3DetailedOfEvaluatedLesionExport), criterion.CriterionType); } diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index cdd1685d..63c56d6a 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -192,7 +192,7 @@ namespace IRaCIS.Application.Services EventHandler sucessHandle = (sender, args) => { - var code = verificationCode.ToString(); + var code = verificationCode.ToString().Trim(); _ = _verificationCodeRepository.AddAsync(new VerificationCode() { CodeType = Core.Domain.Share.VerifyType.Email, diff --git a/IRaCIS.Core.Application/Service/Document/DTO/SystemDocumentViewModel.cs b/IRaCIS.Core.Application/Service/Document/DTO/SystemDocumentViewModel.cs index 574b33bf..78f9d479 100644 --- a/IRaCIS.Core.Application/Service/Document/DTO/SystemDocumentViewModel.cs +++ b/IRaCIS.Core.Application/Service/Document/DTO/SystemDocumentViewModel.cs @@ -5,6 +5,7 @@ //-------------------------------------------------------------------- using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Infrastructure.Extention; +using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -25,7 +26,7 @@ namespace IRaCIS.Core.Application.Contracts public class UnionDocumentView : SystemDocumentAddOrEdit { - public string FullFilePath { get; set; } = string.Empty; + public string FullFilePath { get; set; } public DateTime CreateTime { get; set; } public DateTime UpdateTime { get; set; } diff --git a/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs b/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs index 25fae0c6..2b00d708 100644 --- a/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs +++ b/IRaCIS.Core.Application/Service/Document/SystemDocumentService.cs @@ -151,7 +151,7 @@ namespace IRaCIS.Core.Application.Services FileType = sysDoc.FileType.MappedValue, UpdateTime = sysDoc.UpdateTime, - FullFilePath = sysDoc.Path, + FullFilePath = sysDoc.Path , ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 26c7ac38..6870fea0 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -353,7 +353,7 @@ namespace IRaCIS.Core.Application.Service var sendEmailConfig = new SMTPEmailConfig(); - //收件人 如果是CRC CRA 要按照中心发送 + //收件人 如果是IC CRA 要按照中心发送 var toUserTypeEnumList = emailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(c => c.UserType).ToList(); @@ -436,7 +436,7 @@ namespace IRaCIS.Core.Application.Service if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed) { - sendEmailConfig.TopicDescription = $"【入组确认报告】关于{taskInfo.ResearchProgramNo}项目{taskInfo.SubjectCode}受试者"; + sendEmailConfig.TopicDescription = $"【入组确认报告】关于{taskInfo.ResearchProgramNo}项目{taskInfo.SubjectCode}患者"; using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { @@ -450,7 +450,7 @@ namespace IRaCIS.Core.Application.Service } else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed) { - sendEmailConfig.TopicDescription = $"【疾病进展确认报告】关于{taskInfo.ResearchProgramNo}项目{taskInfo.SubjectCode}受试者"; + sendEmailConfig.TopicDescription = $"【疾病进展确认报告】关于{taskInfo.ResearchProgramNo}项目{taskInfo.SubjectCode}患者"; using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) { @@ -540,10 +540,10 @@ namespace IRaCIS.Core.Application.Service { - //仲裁在访视上 就没有全局阅片 没有阅片期 + //仲裁在检查批次上 就没有全局阅片 没有阅片期 if (taskInfo.ArbitrationRule == ArbitrationRule.Visit) { - //找到 访视,裁判 所有有效任务(不可能有全局的) 访视和裁判任务的SourceSubjectVisitId 一样 + //找到 检查批次,裁判 所有有效任务(不可能有全局的) 检查批次和裁判任务的SourceSubjectVisitId 一样 var taskList = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Judge)).ToListAsync(); @@ -581,11 +581,11 @@ namespace IRaCIS.Core.Application.Service //仲裁在阅片期 else if (taskInfo.ArbitrationRule == ArbitrationRule.Reading) { - //是访视任务 不可能是裁判任务(访视上不会生成裁判),也不会是全局任务(全局任务 SourceSubjectVisitId=null ) + //是检查批次任务 不可能是裁判任务(检查批次上不会生成裁判),也不会是全局任务(全局任务 SourceSubjectVisitId=null ) if (taskInfo.SourceSubjectVisitId != null) { - //访视类型的任务 根本就不需要发送邮件 + //检查批次类型的任务 根本就不需要发送邮件 isNeedSend = false; @@ -648,7 +648,7 @@ namespace IRaCIS.Core.Application.Service ////单重 //else if (taskInfo.ReadingType == ReadingMethod.Single) //{ - // //仲裁在访视上 或者在阅片期 + // //仲裁在检查批次上 或者在阅片期 // if (taskInfo.ArbitrationRule != ArbitrationRule.None) // { @@ -656,21 +656,21 @@ namespace IRaCIS.Core.Application.Service // } - // //要求PD 确认的访视 是截止访视 还是非截止访视(根据该访视有没有配置阅片期来判断) + // //要求PD 确认的检查批次 是截止检查批次 还是非截止检查批次(根据该检查批次有没有配置阅片期来判断) // if (taskInfo.ReadingCategory == ReadingCategory.Visit) // { - // //存在阅片期 那么就是截止访视 + // //存在阅片期 那么就是截止检查批次 // if (await _repository.Where(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.SubjectVisitId == taskInfo.SourceSubjectVisitId && t.ReadingSetType == ReadingSetType.ImageReading).AnyAsync()) // { // isNeedSend = false; // } - // else//非截止访视 在访视读完后,发送 + // else//非截止检查批次 在检查批次读完后,发送 // { // answer = await TranslatePdStateAsync(visitTaskId, ReadingCategory.Visit, taskInfo.CriterionType); // } // } - // //截止访视 在访视读完,并完成全局阅片后发送全局的结果 + // //截止检查批次 在检查批次读完,并完成全局阅片后发送全局的结果 // else if (taskInfo.ReadingCategory == ReadingCategory.Global) // { // answer = await TranslatePdStateAsync(visitTaskId, ReadingCategory.Global, taskInfo.CriterionType); @@ -715,10 +715,10 @@ namespace IRaCIS.Core.Application.Service // isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); // } - // //双重 截止访视只在阅片期的时候存在 要求PD确认的访视 肯定是非截止访视 + // //双重 截止检查批次只在阅片期的时候存在 要求PD确认的检查批次 肯定是非截止检查批次 // else if (taskInfo.ReadingType == ReadingMethod.Double && taskInfo.ArbitrationRule == ArbitrationRule.Visit) // { - // //在两位阅片人读完访视后,如果有裁判者等裁判读完,如果无裁判则等第二个人的读完 + // //在两位阅片人读完检查批次后,如果有裁判者等裁判读完,如果无裁判则等第二个人的读完 // var taskList = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect // && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Judge)).ToListAsync(); @@ -748,7 +748,7 @@ namespace IRaCIS.Core.Application.Service // } // else // { - // throw new BusinessValidationFailedException("无序阅片配置有误(应为单重无仲裁对象,双重针对访视仲裁),请核查!"); + // throw new BusinessValidationFailedException("无序阅片配置有误(应为单重无仲裁对象,双重针对检查批次仲裁),请核查!"); // } //} @@ -884,7 +884,7 @@ namespace IRaCIS.Core.Application.Service var trialConfig = await _subjectRepository.Where(t => t.Id == subjectId).Select(t => new { t.Trial.IsEnrollementQualificationConfirm, t.Trial.IsPDProgressView }).FirstNotNullAsync(); - //找到入组确认 或者Pd 进展 已生成任务的 访视 + //找到入组确认 或者Pd 进展 已生成任务的 检查批次 var subjectVisitList = await _subjectVisitRepository.Where(t => t.SubjectId == subjectId & t.CheckState == CheckStateEnum.CVPassed && (t.IsEnrollmentConfirm == true || t.PDState == PDStateEnum.PDProgress)).ToListAsync(); if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed) @@ -898,7 +898,7 @@ namespace IRaCIS.Core.Application.Service var exisitBaseline = subjectVisitList.FirstOrDefault(t => t.IsEnrollmentConfirm); if (exisitBaseline == null) { - return ResponseOutput.NotOk("不存在配置了入组确认的并且生成任务的基线访视"); + return ResponseOutput.NotOk("不存在配置了入组确认的并且生成任务的基线检查批次"); } else { @@ -949,13 +949,13 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.NotOk("项目未配置PD进展!"); } - //是否是截止访视 截止访视在全局发 否则就在当前访视发 + //是否是截止检查批次 截止检查批次在全局发 否则就在当前检查批次发 var pdSubjectVisitIdList = subjectVisitList.Where(t => t.PDState == PDStateEnum.PDProgress).OrderBy(t => t.VisitNum).Select(t => (Guid?)t.Id).ToList(); if (pdSubjectVisitIdList.Count == 0) { - return ResponseOutput.NotOk("不存在配置了PD进展的并且生成任务的访视"); + return ResponseOutput.NotOk("不存在配置了PD进展的并且生成任务的检查批次"); } @@ -967,10 +967,10 @@ namespace IRaCIS.Core.Application.Service // 项目双重 if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double && trialReadingCriterionConfig.IsReadingTaskViewInOrder) { - //仲裁在访视上面 + //仲裁在检查批次上面 if (trialReadingCriterionConfig.ArbitrationRule == ArbitrationRule.Visit) { - //在两位阅片人读完访视后,如果有裁判者等裁判读完,如果无裁判则等第二个人的读完 + //在两位阅片人读完检查批次后,如果有裁判者等裁判读完,如果无裁判则等第二个人的读完 var taskList = await _visitTaskRepository.Where(t => t.SourceSubjectVisitId == currentLatestPdVisitId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Judge)).ToListAsync(); @@ -999,7 +999,7 @@ namespace IRaCIS.Core.Application.Service } else { - return ResponseOutput.NotOk("当前受试者最新PD访视阅片任务完成状态不符合发送条件"); + return ResponseOutput.NotOk("当前患者最新PD检查批次阅片任务完成状态不符合发送条件"); } } @@ -1011,7 +1011,7 @@ namespace IRaCIS.Core.Application.Service if (existReadModule == null) { - return ResponseOutput.NotOk("项目配置了阅片期仲裁,但是当前受试者最新PD访视没有影像学阅片期"); + return ResponseOutput.NotOk("项目配置了阅片期仲裁,但是当前患者最新PD检查批次没有影像学阅片期"); } else { @@ -1045,7 +1045,7 @@ namespace IRaCIS.Core.Application.Service else { - return ResponseOutput.NotOk("当前受试者最新PD访视阅片期任务完成状态不符合发送条件"); + return ResponseOutput.NotOk("当前患者最新PD检查批次阅片期任务完成状态不符合发送条件"); } } @@ -1058,7 +1058,7 @@ namespace IRaCIS.Core.Application.Service } #region 发送邮件屏蔽单重阅片情况 - //// 项目单重 判断最新的Pd 访视是否完成 是否有阅片期即可 + //// 项目单重 判断最新的Pd 检查批次是否完成 是否有阅片期即可 //else if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) //{ @@ -1070,11 +1070,11 @@ namespace IRaCIS.Core.Application.Service // if (task == null) // { - // return ResponseOutput.NotOk("当前受试者最新PD访视任务未阅片完成"); + // return ResponseOutput.NotOk("当前患者最新PD检查批次任务未阅片完成"); // } // else // { - // //存在阅片期 那么就是截止访视 + // //存在阅片期 那么就是截止检查批次 // var existReadModule = await _repository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectVisitId == currentLatestPdVisitId && t.ReadingSetType == ReadingSetType.ImageReading) // .FirstOrDefaultAsync(); @@ -1093,11 +1093,11 @@ namespace IRaCIS.Core.Application.Service // } // else // { - // return ResponseOutput.NotOk("当前受试者阅片期任务未阅片完成"); + // return ResponseOutput.NotOk("当前患者阅片期任务未阅片完成"); // } // } - // else//非截止访视 在访视读完后,发送 + // else//非截止检查批次 在检查批次读完后,发送 // { // var filePath = await BaseBusinessScenarioSendEmailAsync(task.Id, true, EmailStoreSendMode.OnlyStoreLocalNotSentEmail, string.Empty); @@ -1199,7 +1199,7 @@ namespace IRaCIS.Core.Application.Service //} else { - throw new BusinessValidationFailedException("不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑"); + throw new BusinessValidationFailedException("不应有 除检查批次、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑"); } if (answer == OverallAssessment.PD.GetEnumInt()) @@ -1238,7 +1238,7 @@ namespace IRaCIS.Core.Application.Service //} else { - throw new BusinessValidationFailedException("不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑"); + throw new BusinessValidationFailedException("不应有 除检查批次、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑"); } if (answer == VisitTumorEvaluation.PD.GetEnumInt()) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs index 9864b1c0..cd5f2de0 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs @@ -392,9 +392,9 @@ namespace IRaCIS.Core.Application.Services ProtocolName = dataset.GetSingleValueOrDefault(DicomTag.ProtocolName, string.Empty), ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty), - AcquisitionTime = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty), - AcquisitionNumber = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty), - TriggerTime = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty), + AcquisitionTime = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionTime, string.Empty), + AcquisitionNumber = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionNumber, string.Empty), + TriggerTime = dataset.GetSingleValueOrDefault(DicomTag.TriggerTime, string.Empty), SiteId = dicomStudy.SiteId, TrialId = dicomStudy.TrialId, diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/ImageShareService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/ImageShareService.cs index e16e0b16..2dfb1773 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/ImageShareService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/ImageShareService.cs @@ -32,7 +32,7 @@ namespace IRaCIS.Core.Application.Services if (imageShareCommand.StudyId == null) { - #region 上传不按照访视上传,基线没传,数据可能出错 + #region 上传不按照检查批次上传,基线没传,数据可能出错 //var subjectVisit1 = _subjectVisitRepository.FirstOrDefault(t => // t.TrialId == imageShareCommand.TrialId && t.SubjectId == imageShareCommand.SubjectId && diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index 48e5f0fa..400cea96 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -345,8 +345,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc /// - /// 获取某个检查的关联检查列表(该受试者在这个想项目下的所有检查) - /// 点击检查检查列表中的一个检查获取对应的序列列表(调用之前的接口:/series/list/,根据StudyId,获取访视的序列列表) + /// 获取某个检查的关联检查列表(该患者在这个想项目下的所有检查) + /// 点击检查检查列表中的一个检查获取对应的序列列表(调用之前的接口:/series/list/,根据StudyId,获取检查批次的序列列表) /// /// [HttpGet("{subjectVisitId:guid}")] @@ -418,21 +418,21 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc if (trialInfo.IsVerifyVisitImageDate) { - //小于当前访视 最近的最晚拍片 + //小于当前检查批次 最近的最晚拍片 var before = visitList.Where(u => u.VisitNum < verifyInfo.VisitNum).Max(k => k.LatestScanDate); if (before != null && waitUploadItem.StudyDate != null && before > waitUploadItem.StudyDate) { - result.Add(new VerifyStudyUploadResult() { ErrorMesseage = $"当前访视检查时间{waitUploadItem.StudyDate?.ToString("yyyy-MM-dd")}不能早于前序访视检查时间{before?.ToString("yyyy-MM-dd")},请核对检查数据是否有误", StudyInstanceUid = waitUploadItem.StudyInstanceUid }); + result.Add(new VerifyStudyUploadResult() { ErrorMesseage = $"当前检查批次检查时间{waitUploadItem.StudyDate?.ToString("yyyy-MM-dd")}不能早于前序检查批次检查时间{before?.ToString("yyyy-MM-dd")},请核对检查数据是否有误", StudyInstanceUid = waitUploadItem.StudyInstanceUid }); return; } - //大于当前访视 最近的最早拍片日期 + //大于当前检查批次 最近的最早拍片日期 var after = visitList.Where(u => u.VisitNum > verifyInfo.VisitNum).Min(k => k.EarliestScanDate); if (after != null && waitUploadItem.StudyDate != null && after < waitUploadItem.StudyDate) { - result.Add(new VerifyStudyUploadResult() { ErrorMesseage = $"当前访视检查时间{waitUploadItem.StudyDate?.ToString("yyyy-MM-dd")}不能晚于该访视之后的检查时间{after?.ToString("yyyy-MM-dd")},请核对检查数据是否有误", StudyInstanceUid = waitUploadItem.StudyInstanceUid }); + result.Add(new VerifyStudyUploadResult() { ErrorMesseage = $"当前检查批次检查时间{waitUploadItem.StudyDate?.ToString("yyyy-MM-dd")}不能晚于该检查批次之后的检查时间{after?.ToString("yyyy-MM-dd")},请核对检查数据是否有误", StudyInstanceUid = waitUploadItem.StudyInstanceUid }); return; } } @@ -468,7 +468,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc result.AllowReUpload = false; result.StudyInstanceUid = studyInstanceUid; - result.ErrorMesseage = "受试者访视结束,不允许上传!"; + result.ErrorMesseage = "患者检查批次结束,不允许上传!"; return result; } @@ -489,12 +489,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //数据库该项目有该检查 看是否支持重传 else { - //是同一个受试者 支持重传 + //是同一个患者 支持重传 if (verifyStudyInfo.SubjectId == SubjectId && verifyStudyInfo.SubjectVisitId == currentSubjectVisitId) { result.AllowReUpload = true; } - //不是同一个受试者 + //不是同一个患者 else { //有默认值,其实不用写,这里为了好理解 @@ -502,7 +502,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc result.AllowReUpload = false; - result.ErrorMesseage = $"此处不可以上传。当前影像检查已经上传给受试者{verifyStudyInfo.SubjectCode}的{verifyStudyInfo.VisitName}"; + result.ErrorMesseage = $"此处不可以上传。当前影像检查已经上传给患者{verifyStudyInfo.SubjectCode}的{verifyStudyInfo.VisitName}"; } } result.StudyInstanceUid = studyInstanceUid; diff --git a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs index 1e4b7cb0..76583419 100644 --- a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs +++ b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs @@ -66,12 +66,12 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO public string SiteName { get; set; } = string.Empty; /// - /// 受试者Code + /// 患者Code /// public string SubjectCode { get; set; } = string.Empty; /// - /// 访视名称 + /// 检查批次名称 /// public string SubjectVisitName { get; set; } = string.Empty; @@ -100,7 +100,7 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO public string Identification { get; set; } = string.Empty; /// - /// 访视计划ID + /// 检查批次计划ID /// public Guid? VisitStageId { get; set; } @@ -302,7 +302,7 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO } #endregion - #region 受试者 + #region 患者 public class InsSubjectCommand : InspectionBase, IInspectionDTO, ISignDTO { public SubjectCommand OptCommand { get; set; } @@ -435,7 +435,7 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO public Guid? SiteId { get; set; } /// - /// 受试者 + /// 患者 /// public string SubjectInfo { get; set; } = string.Empty; diff --git a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs index 96c9037d..30735d78 100644 --- a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs +++ b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs @@ -127,8 +127,6 @@ namespace IRaCIS.Application.Contracts public string UserCode { get; set; } = string.Empty; - public bool IsZhiZhun { get; set; } - public string UserType { get; set; } = string.Empty; public string UserTypeShortName { get; set; } = string.Empty; diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index 2ae546c0..aa0dea79 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -253,11 +253,11 @@ namespace IRaCIS.Application.Services public async Task ResetPassword(Guid userId) { - var pwd = "123456"; + var pwd = AppSettings.DefaultPassword; if (_hostEnvironment.EnvironmentName != "Development") { - pwd = "Extimaging." + new Random().Next(100, 1000); + pwd = "EIImage." + new Random().Next(100, 1000); } @@ -498,13 +498,9 @@ namespace IRaCIS.Application.Services saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User)); - if (saveItem.IsZhiZhun) - { - saveItem.OrganizationName = AppSettings.DefaultInternalOrganizationName; - } - saveItem.Password = MD5Helper.Md5("123456"); + saveItem.Password = MD5Helper.Md5(AppSettings.DefaultPassword); await _userRepository.AddAsync(saveItem); @@ -541,10 +537,7 @@ namespace IRaCIS.Application.Services _mapper.Map(model, user); - if (user.IsZhiZhun) - { - user.OrganizationName = AppSettings.DefaultInternalOrganizationName; - } + var success = await _userRepository.SaveChangesAsync(); return ResponseOutput.Ok(success); diff --git a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs index 8bc59d51..65099885 100644 --- a/IRaCIS.Core.Application/Service/Management/UserTypeService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserTypeService.cs @@ -108,7 +108,9 @@ namespace IRaCIS.Core.Application.Contracts if (userTypeSelectEnum == UserTypeSelectEnum.InnerUser) { - userTypeEnums = new List() { UserTypeEnum.IQC, UserTypeEnum.APM, UserTypeEnum.MIM, UserTypeEnum.QA ,UserTypeEnum.MW}; + //userTypeEnums = new List() { UserTypeEnum.IQC, UserTypeEnum.APM, UserTypeEnum.MIM, UserTypeEnum.QA ,UserTypeEnum.MW}; + + userTypeEnums = new List() { UserTypeEnum.IndependentReviewer, UserTypeEnum.ClinicalResearchCoordinator }; if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin) { diff --git a/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs b/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs index 3404bc92..4f81bcef 100644 --- a/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/QC/ClinicalDataService.cs @@ -9,7 +9,7 @@ using IRaCIS.Core.Application.Service; namespace IRaCIS.Core.Application.Contracts { /// - ///受试者临床信息 + ///患者临床信息 /// [ApiExplorerSettings(GroupName = "Image")] public class ClinicalDataService : BaseService, IClinicalDataService @@ -39,7 +39,7 @@ namespace IRaCIS.Core.Application.Contracts /// - /// 获取访视+受试者级别的数据 + /// 获取检查批次+患者级别的数据 /// /// /// diff --git a/IRaCIS.Core.Application/Service/QC/DTO/PreviousSurgeryViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/PreviousSurgeryViewModel.cs index 56841884..ac53d306 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/PreviousSurgeryViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/PreviousSurgeryViewModel.cs @@ -67,7 +67,7 @@ namespace IRaCIS.Core.Application.Contracts /// - /// 是否是访视 + /// 是否是检查批次 /// public bool? IsVisist { get; set; } @@ -92,7 +92,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid? TrialId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid? SubjectId { get; set; } } @@ -108,7 +108,7 @@ namespace IRaCIS.Core.Application.Contracts public string FileName { get; set; } = string.Empty; /// - /// 是否是访视 + /// 是否是检查批次 /// public bool? IsVisist { get; set; } @@ -133,7 +133,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid? TrialId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid? SubjectId { get; set; } } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index cea16a57..b98f594d 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -29,6 +29,10 @@ namespace IRaCIS.Core.Application.Contracts public string[]? VisitPlanArray { get; set; } + public DateTime? BeginSubmitTime { get; set; } + + public DateTime? EndSubmitTime { get; set; } + } public class GetNextQCInfoInDto @@ -333,7 +337,7 @@ namespace IRaCIS.Core.Application.Contracts ///// - ///// 任务展示访视 读片任务显示是否顺序 + ///// 任务展示检查批次 读片任务显示是否顺序 ///// //public bool IsReadingTaskViewInOrder { get; set; } = true; } @@ -352,7 +356,7 @@ namespace IRaCIS.Core.Application.Contracts //审核状态 public AuditStateEnum AuditState { get; set; } - //阅片期或者访视名 + //阅片期或者检查批次名 public string ReadingPeriodName { get; set; } @@ -406,7 +410,7 @@ namespace IRaCIS.Core.Application.Contracts [Column(TypeName = "decimal(18,2)")] public decimal VisitTaskNum { get; set; } - //访视会有 + //检查批次会有 public bool? Inplan { get; set; } public bool? IsLostVisit { get; set; } @@ -837,12 +841,12 @@ namespace IRaCIS.Core.Application.Contracts public string UserName { get; set; } - [DictionaryTranslateAttribute("ExistDisease", CriterionType.RECIST1Pointt1, nameof(OverallTumorEvaluationExport.IsBaseline), "true")] - [DictionaryTranslateAttribute("OverallAssessment", CriterionType.RECIST1Pointt1, nameof(OverallTumorEvaluationExport.IsBaseline), "false")] + //[DictionaryTranslateAttribute("ExistDisease", CriterionType.RECIST1Pointt1, nameof(OverallTumorEvaluationExport.IsBaseline), "true")] + //[DictionaryTranslateAttribute("OverallAssessment", CriterionType.RECIST1Pointt1, nameof(OverallTumorEvaluationExport.IsBaseline), "false")] - [DictionaryTranslateAttribute("VisitTumorEvaluation", CriterionType.PCWG3)] - //整体肿瘤评估结果 需要翻译 - public string OverallTumorEvaluationResult { get; set; } + //[DictionaryTranslateAttribute("VisitTumorEvaluation", CriterionType.PCWG3)] + ////整体肿瘤评估结果 需要翻译 + //public string OverallTumorEvaluationResult { get; set; } public Guid? JudgeResultTaskId { get; set; } @@ -857,19 +861,19 @@ namespace IRaCIS.Core.Application.Contracts public class RECIST1Point1EvaluationOfTumorEfficacyExport : OverallTumorEvaluationExport { - [DictionaryTranslateAttribute("TargetAssessment", CriterionType.RECIST1Pointt1)] - // 靶病灶评估 - public string TargetlesionEvaluationResult { get; set; } + //[DictionaryTranslateAttribute("TargetAssessment", CriterionType.RECIST1Pointt1)] + //// 靶病灶评估 + //public string TargetlesionEvaluationResult { get; set; } - [DictionaryTranslateAttribute("NoTargetAssessment", CriterionType.RECIST1Pointt1)] - // 非靶病灶评估 - public string NoneTargetlesionEvaluationResult { get; set; } - - // 是否存在新病灶 - [DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.RECIST1Pointt1)] - public string IsExistNewlesionEvaluationResult { get; set; } + //[DictionaryTranslateAttribute("NoTargetAssessment", CriterionType.RECIST1Pointt1)] + //// 非靶病灶评估 + //public string NoneTargetlesionEvaluationResult { get; set; } + //// 是否存在新病灶 + //[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.RECIST1Pointt1)] + //public string IsExistNewlesionEvaluationResult { get; set; } + public string EvaluationSummary { get; set; } } @@ -940,6 +944,9 @@ namespace IRaCIS.Core.Application.Contracts [JsonIgnore] public List LesionList = new List(); + + + //病灶编号 public string LessionCode { get; set; } @@ -1014,6 +1021,7 @@ namespace IRaCIS.Core.Application.Contracts //病灶状态 public string LessionState { get; set; } + } diff --git a/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs b/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs index ad9244d1..3eeb4454 100644 --- a/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/Interface/IQCOperationService.cs @@ -40,6 +40,5 @@ namespace IRaCIS.Core.Application.Image.QA Task VerifyCanQCPassedOrFailed(Guid subjectVisitId); - Task ForwardSVDicomImage(Guid[] subjectVisitIdList); } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/QC/QCCommon.cs b/IRaCIS.Core.Application/Service/QC/QCCommon.cs index c414e915..33be040c 100644 --- a/IRaCIS.Core.Application/Service/QC/QCCommon.cs +++ b/IRaCIS.Core.Application/Service/QC/QCCommon.cs @@ -7,7 +7,7 @@ namespace IRaCIS.Core.Application.Service public static class QCCommon { /// - /// 验证CRC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 + /// 验证IC 是否已提交 已提交 就不允许进行任何操作,如果是IQC 那么还验证是否是当前任务领取人 /// /// /// @@ -24,7 +24,7 @@ namespace IRaCIS.Core.Application.Service if (await _repository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted && (!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)))) { - throw new BusinessValidationFailedException("CRC 已提交影像,不能进行操作。"); + throw new BusinessValidationFailedException("IC 已提交影像,不能进行操作。"); } } } @@ -63,21 +63,21 @@ namespace IRaCIS.Core.Application.Service - //小于当前访视 最近的最晚拍片 + //小于当前检查批次 最近的最晚拍片 var before = visitList.Where(u => u.VisitNum < currentVisitNum).Max(k => k.LatestScanDate); if (before != null && before > imageDate) { - throw new BusinessValidationFailedException($"当前访视检查时间{imageDate.ToString("yyyy-MM-dd")}不能早于前序访视检查时间{before?.ToString("yyyy-MM-dd")},请核对检查数据是否有误"); + throw new BusinessValidationFailedException($"当前检查批次检查时间{imageDate.ToString("yyyy-MM-dd")}不能早于前序检查批次检查时间{before?.ToString("yyyy-MM-dd")},请核对检查数据是否有误"); } - //大于当前访视 最近的最早拍片日期 + //大于当前检查批次 最近的最早拍片日期 var after = visitList.Where(u => u.VisitNum > currentVisitNum).Min(k => k.EarliestScanDate); if (after != null && after < imageDate) { - throw new BusinessValidationFailedException($"当前访视检查时间{imageDate.ToString("yyyy-MM-dd")}不能晚于该访视之后的检查时间{after?.ToString("yyyy-MM-dd")},请核对检查数据是否有误"); + throw new BusinessValidationFailedException($"当前检查批次检查时间{imageDate.ToString("yyyy-MM-dd")}不能晚于该检查批次之后的检查时间{after?.ToString("yyyy-MM-dd")},请核对检查数据是否有误"); } } diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 5ede37c9..e6649857 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -42,9 +42,9 @@ namespace IRaCIS.Core.Application.Image.QA - #region CRC上传、质疑页面 + #region IC上传、质疑页面 /// - /// CRC 访视上传列表 + /// IC 检查批次上传列表 /// /// /// @@ -63,6 +63,8 @@ namespace IRaCIS.Core.Application.Image.QA //.WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo)) .WhereIf(visitSearchDTO.AuditStateArray != null && visitSearchDTO.AuditStateArray?.Length > 0, t => visitSearchDTO.AuditStateArray!.Contains(t.AuditState)) .WhereIf(visitSearchDTO.SubmitState != null, t => t.SubmitState == visitSearchDTO.SubmitState) + .WhereIf(visitSearchDTO.BeginSubmitTime != null, t => t.SubmitTime >= visitSearchDTO.BeginSubmitTime) + .WhereIf(visitSearchDTO.EndSubmitTime != null, t => t.SubmitTime <= visitSearchDTO.EndSubmitTime) .WhereIf(visitSearchDTO.ChallengeState != null, t => t.ChallengeState == visitSearchDTO.ChallengeState) .WhereIf(visitSearchDTO.IsUrgent != null, t => t.IsUrgent == visitSearchDTO.IsUrgent) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) @@ -82,7 +84,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// CRC 质疑列表 + /// IC 质疑列表 /// /// /// @@ -90,7 +92,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task<(PageOutput, TrialSubjectAndSVConfig)> GetCRCChallengeList(ChallengeQuery challengeQuery) { - #region CRC 质疑列表 join连表方式 + #region IC 质疑列表 join连表方式 //var query = from qcChanllenge in _qcChallengeRepository.Find(qcChallengeLambda) // join subjectVisit in _subjectVisitRepository.Find() on qcChanllenge.SubjectVisitId equals subjectVisit.Id // join trialSite in _trialSiteRepository.Find(t => t.TrialId == challengeQuery.TrialId) on subjectVisit.SiteId equals trialSite.SiteId @@ -259,7 +261,7 @@ namespace IRaCIS.Core.Application.Image.QA } /// - /// QC 访视列表 + /// QC 检查批次列表 /// /// /// @@ -297,7 +299,7 @@ namespace IRaCIS.Core.Application.Image.QA //{ // var visitInfo = visitSearchDTO.VisitPlanInfo.Trim(); - // if (visitInfo.Contains('.')) // 包含小数点的是计划外访视 + // if (visitInfo.Contains('.')) // 包含小数点的是计划外检查批次 // { // subjectVisitLambda = subjectVisitLambda.And(t => t.VisitNum.ToString().Contains(".")); // } @@ -464,7 +466,7 @@ namespace IRaCIS.Core.Application.Image.QA #region 一致性核查 转发页面 /// - /// 获取一致性核查列表 CRC/PM 公用 + /// 获取一致性核查列表 IC/PM 公用 /// /// /// @@ -528,7 +530,7 @@ namespace IRaCIS.Core.Application.Image.QA .WhereIf(!string.IsNullOrEmpty(checkQuery.SubjectInfo), t => t.Subject.Code.Contains(checkQuery.SubjectInfo)) .WhereIf(checkQuery.VisitPlanArray != null && checkQuery.VisitPlanArray?.Length > 0, svExpression) //.WhereIf(!string.IsNullOrEmpty(checkQuery.VisitPlanInfo), checkQuery.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(checkQuery.VisitPlanInfo)) - .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//CRC 过滤负责的site + .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//IC 过滤负责的site .ProjectTo(_mapper.ConfigurationProvider); var pageList = await query.ToPagedListAsync(checkQuery.PageIndex, checkQuery.PageSize, checkQuery.SortField, checkQuery.Asc); @@ -574,7 +576,7 @@ namespace IRaCIS.Core.Application.Image.QA .WhereIf(!string.IsNullOrEmpty(forwardQuery.SubjectInfo), t => t.Subject.Code.Contains(forwardQuery.SubjectInfo)) .WhereIf(forwardQuery.VisitPlanArray != null && forwardQuery.VisitPlanArray?.Length > 0, svExpression) //.WhereIf(!string.IsNullOrEmpty(forwardQuery.VisitPlanInfo), forwardQuery.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(forwardQuery.VisitPlanInfo)) - //.WhereIf(_userInfo.UserTypeEnumInt == (int)UserType.ClinicalResearchCoordinator, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//CRC 过滤负责的site + //.WhereIf(_userInfo.UserTypeEnumInt == (int)UserType.ClinicalResearchCoordinator, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))//IC 过滤负责的site .ProjectTo(_mapper.ConfigurationProvider); return await query.ToPagedListAsync(forwardQuery.PageIndex, forwardQuery.PageSize, forwardQuery.SortField, forwardQuery.Asc); @@ -587,10 +589,10 @@ namespace IRaCIS.Core.Application.Image.QA #region QC 具体质控页面 各种列表 /// - /// 获取某次访视 QA界面所有信息 单独每一项都有接口(往下看),这里是一个大接口,方便第一次获取完整的所有的数据 + /// 获取某次检查批次 QA界面所有信息 单独每一项都有接口(往下看),这里是一个大接口,方便第一次获取完整的所有的数据 /// /// - /// 项目配置的针对访视检查是那种审核,0 不审,1 单审,2双审 + /// 项目配置的针对检查批次检查是那种审核,0 不审,1 单审,2双审 /// 当前 QC进入的是那种审核 1 单审,2复审 [HttpGet("{subjectVisitId:guid}/{trialQCProcess:int}/{currentQCType:int}")] @@ -664,11 +666,11 @@ namespace IRaCIS.Core.Application.Image.QA } /// - /// 获取某次访视 QC 问题核对答案 列表 初始化进去的时候是模板项,QC填写了就是对应的内容 + /// 获取某次检查批次 QC 问题核对答案 列表 初始化进去的时候是模板项,QC填写了就是对应的内容 /// /// /// - /// 项目配置的针对访视检查是那种审核,0 不审,1 单审,2双审 + /// 项目配置的针对检查批次检查是那种审核,0 不审,1 单审,2双审 /// 当前 QC进入的是那种审核 1 单审,2复审 [HttpGet("{trialId:guid}/{subjectVisitId:guid}/{trialQCProcess:int}/{currentQCType:int}")] @@ -697,7 +699,7 @@ namespace IRaCIS.Core.Application.Image.QA /// 获次QC 历史质疑列表 不分页 /// /// - /// 项目配置的针对访视检查是那种审核,0 不审,1 单审,2双审 + /// 项目配置的针对检查批次检查是那种审核,0 不审,1 单审,2双审 /// 当前 QC进入的是那种审核 1 单审,2复审 [HttpGet("{subjectVisitId:guid}/{trialQCProcess:int}/{currentQCType:int}")] @@ -713,7 +715,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// 获取访视下的受试者访视、受试者、site信息 + /// 获取检查批次下的患者检查批次、患者、site信息 /// /// /// @@ -728,7 +730,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// 访视下的Study 和Series列表 + /// 检查批次下的Study 和Series列表 /// /// /// @@ -746,7 +748,7 @@ namespace IRaCIS.Core.Application.Image.QA } /// - /// 访视下的检查列表 + /// 检查批次下的检查列表 /// /// /// @@ -784,7 +786,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// CRC/PM 看到某次访视下的所有质疑和聊天内容 包括初审和复审的 。 + /// IC/PM 看到某次检查批次下的所有质疑和聊天内容 包括初审和复审的 。 /// /// /// @@ -854,7 +856,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// 添加计划外访视 下拉框 选择上一次访视 + /// 添加计划外检查批次 下拉框 选择上一次检查批次 /// /// /// @@ -867,7 +869,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// 上传界面 受试者 访视、site 基本信息 + /// 上传界面 患者 检查批次、site 基本信息 /// /// /// diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index f3e781cf..58b2410c 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -6,7 +6,6 @@ using MediatR; using Microsoft.AspNetCore.Mvc; using System.Data; using Microsoft.AspNetCore.Authorization; -using WinSCP; using Newtonsoft.Json; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Application.Service.Inspection.DTO; @@ -100,7 +99,7 @@ namespace IRaCIS.Core.Application.Image.QA { if (await _qcChallengeRepository.AnyAsync(t => t.IsClosed == false && t.SubjectVisitId == qaQuestionCommand.SubjectVisitId && t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)) { - throw new BusinessValidationFailedException("当前访视未关闭的质疑已设置了同意CRC重传影像。请在CRC完成影像重传后,先关闭原质疑,再添加新的质疑。"); + throw new BusinessValidationFailedException("当前检查批次未关闭的质疑已设置了同意IC重传影像。请在IC完成影像重传后,先关闭原质疑,再添加新的质疑。"); } @@ -164,7 +163,7 @@ namespace IRaCIS.Core.Application.Image.QA if (dbQCChallenge.ReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload || dbQCChallenge.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload) { - throw new BusinessValidationFailedException("CRC已申请重传或者QC同意重传,不允许关闭该质疑。请在QC拒绝重传申请或者CRC设置重传影像后,再关闭质疑。"); + throw new BusinessValidationFailedException("IC已申请重传或者QC同意重传,不允许关闭该质疑。请在QC拒绝重传申请或者IC设置重传影像后,再关闭质疑。"); } @@ -264,7 +263,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPost("{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.PM_APM_CRC)] public async Task AddCheckChallengeReply(CheckChallengeDialogCommand checkDialogCommand) { @@ -303,7 +301,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.PM_APM)] public async Task CloseCheckChallenge(CloseCheckChallengeDto input) { @@ -311,7 +308,7 @@ namespace IRaCIS.Core.Application.Image.QA if (sv.RequestBackState == RequestBackStateEnum.CRC_RequestBack) { - ResponseOutput.NotOk("当前访视处于申请回退状态, 不允许关闭质疑。"); + ResponseOutput.NotOk("当前检查批次处于申请回退状态, 不允许关闭质疑。"); } @@ -337,7 +334,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.PM_APM)] [UnitOfWork] public async Task SetCheckPass(SetCheckPassDt data) { @@ -351,7 +347,7 @@ namespace IRaCIS.Core.Application.Image.QA if (sv.RequestBackState == RequestBackStateEnum.PM_AgressBack) { - ResponseOutput.NotOk("当前访视处于回退状态,不允许设置一致性核查通过"); + ResponseOutput.NotOk("当前检查批次处于回退状态,不允许设置一致性核查通过"); } if (sv.CheckChallengeState != CheckChanllengeTypeEnum.Closed && sv.AuditState == AuditStateEnum.QCPassed) @@ -376,13 +372,12 @@ namespace IRaCIS.Core.Application.Image.QA } /// - /// CRC 请求回退 + /// IC 请求回退 /// /// /// [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.CRC)] public async Task CRCRequstCheckBack(Guid subjectVisitId) { var sv = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); @@ -390,7 +385,7 @@ namespace IRaCIS.Core.Application.Image.QA if (sv.CheckState == CheckStateEnum.CVPassed) { - return ResponseOutput.NotOk("当前访视已通过一致性核查,不允许申请回退"); + return ResponseOutput.NotOk("当前检查批次已通过一致性核查,不允许申请回退"); } var QCChallengeId = await _qcChallengeRepository.Where(x => x.SubjectVisitId == subjectVisitId).Select(x => x.Id).FirstOrDefaultAsync(); @@ -399,7 +394,7 @@ namespace IRaCIS.Core.Application.Image.QA { SubjectVisitId = subjectVisitId, UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, - TalkContent = "CRC申请回退" + TalkContent = "IC申请回退" }); @@ -411,7 +406,7 @@ namespace IRaCIS.Core.Application.Image.QA } else { - return ResponseOutput.NotOk("其他CRC已申请处理,请刷新页面"); + return ResponseOutput.NotOk("其他IC已申请处理,请刷新页面"); } @@ -423,7 +418,6 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] - [Authorize(Policy = IRaCISPolicy.PM_APM)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task RejectCheckBack(Guid subjectVisitId) { @@ -456,7 +450,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.PM_APM)] [UnitOfWork] public async Task CheckBack(Guid subjectVisitId) { @@ -470,7 +463,7 @@ namespace IRaCIS.Core.Application.Image.QA if (sv.CheckState == CheckStateEnum.CVPassed || sv.CheckState == CheckStateEnum.ToCheck) { - return ResponseOutput.NotOk("当前访视还未进行核查或者核查已通过,不允许设置回退。"); + return ResponseOutput.NotOk("当前检查批次还未进行核查或者核查已通过,不允许设置回退。"); } //sv.CheckChallengeState = (int)CheckChanllengeTypeEnum.None; @@ -533,7 +526,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPost("{trialId:guid}/{subjectVisitId:guid}/{trialQCProcess:int}/{currentQCType:int}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.IQC)] public async Task AddOrUpdateQCQuestionAnswerList(QCQuestionAnswerCommand[] qcQuestionAnswerCommands, Guid trialId, Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType) { //验证是否能操作 @@ -605,7 +597,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{studyId:guid}/{seriesId:guid}/{state:int}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.IQC)] public async Task SetSeriesState(Guid subjectVisitId, Guid studyId, Guid seriesId, int state) { @@ -672,7 +663,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPost("{trialId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.CRC_IQC)] public async Task UpdateModality(UpdateModalityCommand updateModalityCommand) { if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) @@ -732,7 +722,7 @@ namespace IRaCIS.Core.Application.Image.QA if (await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) { - return ResponseOutput.NotOk("当前访视有质疑未关闭,不允许该操作"); + return ResponseOutput.NotOk("当前检查批次有质疑未关闭,不允许该操作"); } return ResponseOutput.Ok(); } @@ -750,7 +740,6 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPost, Route("{trialId:guid}/{subjectVisitId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [UnitOfWork] - [Authorize(Policy = IRaCISPolicy.CRC_IQC)] public async Task DeleteStudyList(Guid[] ids, Guid subjectVisitId, Guid trialId) { @@ -759,7 +748,7 @@ namespace IRaCIS.Core.Application.Image.QA if (await _subjectVisitRepository.AnyAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.Submitted && (!t.QCChallengeList.Any(u => u.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload)))) { - return ResponseOutput.NotOk("CRC已经提交,不允许删除。"); + return ResponseOutput.NotOk("IC已经提交,不允许删除。"); } var waitDeleteStudyList = await _dicomStudyRepository.Where(x => ids.Contains(x.Id)).ToListAsync(); @@ -862,7 +851,6 @@ namespace IRaCIS.Core.Application.Image.QA /// 替换当前领取人 [HttpPut("{trialId:guid}/{subjectVisitId:guid}")] - [Authorize(Policy = IRaCISPolicy.IQC)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task ReplaceQCTaskActionUser(Guid trialId, Guid subjectVisitId) { @@ -871,7 +859,7 @@ namespace IRaCIS.Core.Application.Image.QA if (dbSubjectVisit.CurrentActionUserId == null && dbSubjectVisit.IsTake == false) { - return ResponseOutput.NotOk("当前访视的影像质控任务已被原领取人释放。您可以通过“领取”获得", ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk("当前检查批次的影像质控任务已被原领取人释放。您可以通过“领取”获得", ApiResponseCodeEnum.NeedTips); } @@ -896,7 +884,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{obtaionOrCancel:bool}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.IQC)] public async Task ObtainOrCancelQCTask(Guid trialId, Guid subjectVisitId, bool obtaionOrCancel) { @@ -914,9 +901,9 @@ namespace IRaCIS.Core.Application.Image.QA { if (dbSubjectVisit.CurrentActionUserId != null && dbSubjectVisit.IsTake) { - //throw new BusinessValidationFailedException("当前访视已被领取,不允许领取"); + //throw new BusinessValidationFailedException("当前检查批次已被领取,不允许领取"); - return ResponseOutput.NotOk("当前访视的影像质控任务已被其他QC领取,不允许领取", ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk("当前检查批次的影像质控任务已被其他QC领取,不允许领取", ApiResponseCodeEnum.NeedTips); } @@ -933,7 +920,7 @@ namespace IRaCIS.Core.Application.Image.QA // )) //{ - // return ResponseOutput.NotOk("您已经领取了其他受试者,完成后才允许领取新的受试者"); + // return ResponseOutput.NotOk("您已经领取了其他患者,完成后才允许领取新的患者"); //} #region 处理验证 @@ -1023,7 +1010,7 @@ namespace IRaCIS.Core.Application.Image.QA else { - return ResponseOutput.NotOk("当前访视影像质控任务没有当前领取人,不能释放。"); + return ResponseOutput.NotOk("当前检查批次影像质控任务没有当前领取人,不能释放。"); } } else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit) @@ -1042,7 +1029,7 @@ namespace IRaCIS.Core.Application.Image.QA else { - return ResponseOutput.NotOk("当前访视影像质控任务没有当前领取人, 不能释放"); + return ResponseOutput.NotOk("当前检查批次影像质控任务没有当前领取人, 不能释放"); } } @@ -1076,7 +1063,7 @@ namespace IRaCIS.Core.Application.Image.QA if (nameList.Count() > 0) { - return ResponseOutput.NotOk($"当前访视要求进行疾病进展确认。请在提交当前访视前,先处理未提交的前序访视:{string.Join('、', nameList)}。", 1, ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk($"当前检查批次要求进行疾病进展确认。请在提交当前检查批次前,先处理未提交的前序检查批次:{string.Join('、', nameList)}。", 1, ApiResponseCodeEnum.NeedTips); } } else @@ -1084,13 +1071,15 @@ namespace IRaCIS.Core.Application.Image.QA if (nameList.Count() > 0) { - return ResponseOutput.NotOk($"在提交当前访视后,请尽快处理尚未提交的前序访视:{string.Join('、', nameList)}。", 0, ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk($"在提交当前检查批次后,请尽快处理尚未提交的前序检查批次:{string.Join('、', nameList)}。", 0, ApiResponseCodeEnum.NeedTips); } } } //同时要根据项目有没有配置Subject 级别临床数据 - if (dbSubjectVisitList.Any(t => t.IsBaseLine && !t.IsHaveClinicalData)) + + + if (dbSubjectVisitList.Any(t => t.IsBaseLine && !t.IsHaveClinicalData) && await _repository.AnyAsync(t=>t.TrialId== cRCRequestToQCCommand.TrialId && t.ClinicalDataLevel==ClinicalLevel.Subject)) { return ResponseOutput.NotOk($"基线没有临床数据,确认提交?", 0, ApiResponseCodeEnum.NeedTips); } @@ -1101,12 +1090,11 @@ namespace IRaCIS.Core.Application.Image.QA } /// - /// CRC RequestToQC 批量提交 [需要签名 不需要对] + /// IC RequestToQC 批量提交 [需要签名 不需要对] /// /// [HttpPost] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.CRC)] public async Task CRCRequestToQC(CRCRequestToQCCommand cRCRequestToQCCommand) { @@ -1131,17 +1119,17 @@ namespace IRaCIS.Core.Application.Image.QA if (dbSubjectVisitList.Any(t => t.SubmitState == SubmitStateEnum.None)) { - return ResponseOutput.NotOk("有访视未上传任何Dicom/非Dicom影像数据,不允许提交"); + return ResponseOutput.NotOk("有检查批次未上传任何Dicom/非Dicom影像数据,不允许提交"); } //单个提交提示信息 if (dbSubjectVisitList.Count() == 1 && dbSubjectVisitList.First().SubmitState == SubmitStateEnum.Submitted) { - return ResponseOutput.NotOk("当前访视的影像数据,已经由其他CRC提交。", 3, ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk("当前检查批次的影像数据,已经由其他IC提交。", 3, ApiResponseCodeEnum.NeedTips); } else if (dbSubjectVisitList.Any(t => t.SubmitState == SubmitStateEnum.Submitted)) { - return ResponseOutput.NotOk("当前批量提交访视的影像数据,其中部分已由其他CRC提交。", 3, ApiResponseCodeEnum.NeedTips); + return ResponseOutput.NotOk("当前批量提交检查批次的影像数据,其中部分已由其他IC提交。", 3, ApiResponseCodeEnum.NeedTips); } //获取确认的临床数据配置 @@ -1154,7 +1142,7 @@ namespace IRaCIS.Core.Application.Image.QA //基线不验证 if (trialConfig.IsHaveFirstGiveMedicineDate && !dbSubjectVisit.IsBaseLine && dbSubjectVisit.Subject.FirstGiveMedicineTime == null) { - return ResponseOutput.NotOk("项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交"); + return ResponseOutput.NotOk("项目配置了需要填写检查批次基准日期。但是患者没有填写检查批次基准日期,不允许提交"); } //基线 且配置了临床数据 @@ -1162,13 +1150,13 @@ namespace IRaCIS.Core.Application.Image.QA { - ////找到需要确认的PDF 临床数据 如果没有CRC 没有上传 那么就添加一条没有文件的记录 + ////找到需要确认的PDF 临床数据 如果没有IC 没有上传 那么就添加一条没有文件的记录 - //var crcNeedConfirmClinicalDataSetList = clinicalDataConfirmList.Where(t => t.UploadRole == UploadRole.CRC && t.ClinicalUploadType == ClinicalUploadType.PDF).ToList(); + //var crcNeedConfirmClinicalDataSetList = clinicalDataConfirmList.Where(t => t.UploadRole == UploadRole.IC && t.ClinicalUploadType == ClinicalUploadType.PDF).ToList(); - //// 找到CRC 已经自己添加的临床PDF数据文件 + //// 找到IC 已经自己添加的临床PDF数据文件 - //var crcAddClinicalDataIdList = _readingClinicalDataRepository.Where(t => t.ReadingId == dbSubjectVisit.Id && t.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && t.ClinicalDataTrialSet.ClinicalUploadType == ClinicalUploadType.PDF) + //var crcAddClinicalDataIdList = _readingClinicalDataRepository.Where(t => t.ReadingId == dbSubjectVisit.Id && t.ClinicalDataTrialSet.UploadRole == UploadRole.IC && t.ClinicalDataTrialSet.ClinicalUploadType == ClinicalUploadType.PDF) // .Select(t => new { t.ClinicalDataTrialSetId }).ToList(); //foreach (var crcNeedConfirmClinicalDataSet in crcNeedConfirmClinicalDataSetList) @@ -1193,7 +1181,7 @@ namespace IRaCIS.Core.Application.Image.QA dbSubjectVisit.IsConfirmedClinicalData = true; - // CRC 上传的基线数据签名 + // IC 上传的基线数据签名 await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == dbSubjectVisit.Id && x.IsSign==false, x => new ReadingClinicalData() { @@ -1226,7 +1214,7 @@ namespace IRaCIS.Core.Application.Image.QA var maxVisit = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.SubmitState == SubmitStateEnum.Submitted) .OrderByDescending(t => t.VisitNum).Select(t => new { t.Id, t.VisitNum }).FirstOrDefaultAsync(); - //修改受试者最新访视 + //修改患者最新检查批次 dbSubjectVisit.Subject.LatestSubjectVisitId = maxVisit == null ? dbSubjectVisit.Id : maxVisit.VisitNum < dbSubjectVisit.VisitNum ? dbSubjectVisit.Id : maxVisit.Id; //var maxVisitNum = maxVisit == null ? dbSubjectVisit.VisitNum : maxVisit.VisitNum < dbSubjectVisit.VisitNum ? dbSubjectVisit.VisitNum : maxVisit.VisitNum; @@ -1234,7 +1222,7 @@ namespace IRaCIS.Core.Application.Image.QA ////判断是否有缺失影像 //dbSubjectVisit.Subject.IsMissingImages = await _subjectVisitRepository.AnyAsync(t => (t.VisitNum < maxVisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false)); - //项目或者Subject IsUrgent 提交时 访视也设置为紧急 + //项目或者Subject IsUrgent 提交时 检查批次也设置为紧急 if (trialConfig.IsUrgent || dbSubjectVisit.Subject.IsUrgent || (dbSubjectVisit.PDState == PDStateEnum.PDProgress && !dbSubjectVisit.IsBaseLine) || (dbSubjectVisit.IsEnrollmentConfirm && dbSubjectVisit.IsBaseLine)) { if (dbSubjectVisit.PDState == PDStateEnum.PDProgress) @@ -1248,7 +1236,7 @@ namespace IRaCIS.Core.Application.Image.QA await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId)&& x.SubjectId == dbSubjectVisit.SubjectId&& - dbSubjectVisit.VisitNum<= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum+0.01m) // 当前的访视 全局 裁判 及之前 全都加急 + dbSubjectVisit.VisitNum<= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum+0.01m) // 当前的检查批次 全局 裁判 及之前 全都加急 && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() { @@ -1258,13 +1246,13 @@ namespace IRaCIS.Core.Application.Image.QA }); await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId - && x.VisitTaskNum < dbSubjectVisit.VisitNum // 当前的访视 全局 裁判 及之前 全都加急 + && x.VisitTaskNum < dbSubjectVisit.VisitNum // 当前的检查批次 全局 裁判 及之前 全都加急 && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() { IsUrgent = true, TaskUrgentType = TaskUrgentType.Other, - TaskUrgentRemake= "后续访视设为pd", + TaskUrgentRemake= "后续检查批次设为pd", IsCanEditUrgentState = false, }); } @@ -1276,7 +1264,7 @@ namespace IRaCIS.Core.Application.Image.QA }); await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && - x.VisitTaskNum>= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 全都加急 + x.VisitTaskNum>= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的检查批次 全局 裁判 全都加急 && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() { @@ -1288,7 +1276,7 @@ namespace IRaCIS.Core.Application.Image.QA else { await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && - x.VisitTaskNum >= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 全都加急 + x.VisitTaskNum >= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的检查批次 全局 裁判 全都加急 && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() { @@ -1300,7 +1288,7 @@ namespace IRaCIS.Core.Application.Image.QA dbSubjectVisit.IsUrgent = true; - //PD确认的紧急会把前面所有未QC完成的访视均标记为紧急 + //PD确认的紧急会把前面所有未QC完成的检查批次均标记为紧急 var previosSVlist = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.VisitNum < dbSubjectVisit.VisitNum && t.IsUrgent == false && t.SubmitState == SubmitStateEnum.Submitted, true).ToListAsync(); @@ -1357,7 +1345,7 @@ namespace IRaCIS.Core.Application.Image.QA dbSubjectVisit.AuditState = AuditStateEnum.ToAudit; } - //非基线设置为PD的话 或者设置为末次访视 根据配置自动生成阅片期 + //非基线设置为PD的话 或者设置为末次检查批次 根据配置自动生成阅片期 if (!dbSubjectVisit.IsBaseLine && (dbSubjectVisit.PDState == PDStateEnum.PDProgress || dbSubjectVisit.IsFinalVisit) ) { @@ -1409,7 +1397,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPost("{trialId:guid}/{subjectVisitId:guid}/{auditState:int}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.IQC)] [UnitOfWork] public async Task QCPassedOrFailed(Guid trialId, Guid subjectVisitId, [FromRoute] AuditStateEnum auditState) { @@ -1425,7 +1412,7 @@ namespace IRaCIS.Core.Application.Image.QA //判断质疑是否都关闭了 if (await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) { - return ResponseOutput.NotOk("当前访视有影像质控质疑未关闭,不能进行此操作。"); + return ResponseOutput.NotOk("当前检查批次有影像质控质疑未关闭,不能进行此操作。"); } } @@ -1499,7 +1486,7 @@ namespace IRaCIS.Core.Application.Image.QA } else { - return ResponseOutput.NotOk("项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。"); + return ResponseOutput.NotOk("项目配置影像质控为单审,当前检查批次影像质控任务不能从当前审核状态变更到 审核通过。"); } @@ -1629,7 +1616,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// 设置、取消 访视紧急 + /// 设置、取消 检查批次紧急 /// /// /// @@ -1674,7 +1661,6 @@ namespace IRaCIS.Core.Application.Image.QA /// [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.IQC)] public async Task SetNeedReupload(Guid trialId, Guid qcChallengeId) { @@ -1696,13 +1682,13 @@ namespace IRaCIS.Core.Application.Image.QA if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.CRCRequestReupload) { - throw new BusinessValidationFailedException("当前重传状态不为CRC申请重传,不允许设置同意重传"); + throw new BusinessValidationFailedException("当前重传状态不为IC申请重传,不允许设置同意重传"); } if (await _qcChallengeRepository.CountAsync(t => t.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload && t.SubjectVisitId == qcChallenge.SubjectVisitId && t.IsClosed == false) >= 1) { - return ResponseOutput.NotOk("当前访视,有一个未关闭的质疑 QC设置了同意重传,CRC还未完成上传,当前不允许再次设置"); + return ResponseOutput.NotOk("当前检查批次,有一个未关闭的质疑 QC设置了同意重传,IC还未完成上传,当前不允许再次设置"); } @@ -1765,13 +1751,12 @@ namespace IRaCIS.Core.Application.Image.QA } /// - /// CRC 设置已经重传完成 [需要签名 不需要对] + /// IC 设置已经重传完成 [需要签名 不需要对] /// /// [HttpPost] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.CRC)] public async Task SetReuploadFinished(CRCReuploadFinishedCommand cRCReuploadFinishedCommand) { @@ -1822,7 +1807,7 @@ namespace IRaCIS.Core.Application.Image.QA QCChallengeId = qcChallenge.Id, - TalkContent = "CRC已重传完成" + TalkContent = "IC已重传完成" }); @@ -1846,7 +1831,6 @@ namespace IRaCIS.Core.Application.Image.QA [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{qcChallengeId:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.CRC)] public async Task CRCRequestReUpload(Guid qcChallengeId) { var qcChallenge = (await _qcChallengeRepository.FirstOrDefaultAsync(t => t.Id == qcChallengeId)).IfNullThrowException(); @@ -1854,7 +1838,7 @@ namespace IRaCIS.Core.Application.Image.QA if (qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.None && qcChallenge.ReuploadEnum != QCChanllengeReuploadEnum.CRCReuploaded) { - throw new BusinessValidationFailedException("当前质疑重传状态不为初始状态|CRC重传完成状态,不允许申请重传"); + throw new BusinessValidationFailedException("当前质疑重传状态不为初始状态|IC重传完成状态,不允许申请重传"); } @@ -1872,7 +1856,7 @@ namespace IRaCIS.Core.Application.Image.QA SubjectVisitId = qcChallenge.SubjectVisitId, UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, QCChallengeId = qcChallenge.Id, - TalkContent = "CRC申请重传/上传影像" + TalkContent = "IC申请重传/上传影像" }); var isSuccess = await _qcChallengeRepository.SaveChangesAsync(); @@ -1884,7 +1868,7 @@ namespace IRaCIS.Core.Application.Image.QA /// - /// 上传界面 更新受试者访视基准日期 是否入组确认,以及访视 是否PD进展 + /// 上传界面 更新患者检查批次基准日期 是否入组确认,以及检查批次 是否PD进展 /// /// /// @@ -1902,13 +1886,13 @@ namespace IRaCIS.Core.Application.Image.QA if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId) .AnyAsync(t => t.SubmitState == SubmitStateEnum.Submitted && t.IsEnrollmentConfirm != command.IsEnrollmentConfirm)) { - return ResponseOutput.NotOk("该访视已提交,不能修改入组确认状态"); + return ResponseOutput.NotOk("该检查批次已提交,不能修改入组确认状态"); } if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId) .AnyAsync(t => t.IsEnrollmentConfirm != command.IsEnrollmentConfirm && t.RequestBackState == RequestBackStateEnum.PM_AgressBack)) { - return ResponseOutput.NotOk("该访视为回退访视,不允许修改PD确认状态"); + return ResponseOutput.NotOk("该检查批次为回退检查批次,不允许修改PD确认状态"); } dbSubjectVisit.IsEnrollmentConfirm = command.IsEnrollmentConfirm.Value; @@ -1926,109 +1910,6 @@ namespace IRaCIS.Core.Application.Image.QA - [HttpPost("{trialId:guid}")] - [Authorize(Policy = IRaCISPolicy.PM_APM)] - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task ForwardSVDicomImage(Guid[] subjectVisitIdList) - { - - bool isSuccess = false; - - - foreach (var subjectVisitId in subjectVisitIdList) - { - - - var info = (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - - - var targetPath = "/IMPORT-IMAGES/" + info.TrialCode + "_" + info.SubjectCode + "_" + info.VisitName; - - var path = FileStoreHelper.GetSubjectVisitDicomFolderPhysicalPath(_hostEnvironment, info.TrialId, info.SiteId, info.SubjectId, info.SubjectVisitId); - - try - { - // 主机及端口信息后面可以改到 配置文件 - SessionOptions sessionOptions = new SessionOptions - { - Protocol = Protocol.Sftp, - PortNumber = 8022, - HostName = "CS-690-sftp.mint-imaging.com", - UserName = "zdong", - Password = "Everest@2021", - SshHostKeyFingerprint = @"ecdsa-sha2-nistp384 384 59gkjJ5lMwv3jsB8Wz2B35tBAIor5pSd8PcJYtoamPo=" - }; - - using (Session session = new Session()) - { - var studyFolders = (new DirectoryInfo(path)).GetDirectories(); - - session.Open(sessionOptions); - - if (!session.FileExists(targetPath)) - { - session.CreateDirectory(targetPath); - } - - - foreach (var studyFolder in studyFolders) - { - var targetFolder = Path.Combine(targetPath, studyFolder.Name); - - if (!session.FileExists(targetFolder)) - { - session.CreateDirectory(targetFolder); - } - - foreach (var file in studyFolder.GetFiles()) - { - if (file.Extension.Contains("dcm", StringComparison.OrdinalIgnoreCase)) - { - string remoteFilePath = - RemotePath.TranslateLocalPathToRemote(file.FullName, studyFolder.FullName, targetFolder); - - var result = session.PutFiles(file.FullName, remoteFilePath, false); - - if (!result.IsSuccess) - { - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, - u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed }); - - return ResponseOutput.NotOk("转发影像失败。" + result.Failures.ToString() + result.ToJson()); - } - } - } - } - - } - await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId, - u => new SubjectVisit() { ForwardState = ForwardStateEnum.Forwarded, ForwardUserId = _userInfo.Id, ForwardTime = DateTime.Now }); - - isSuccess = true; - - } - catch (Exception e) - { - - await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId, - u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed }); - - - return ResponseOutput.NotOk("转发影像失败: " + e.Message); - } - - - } - - - - await _subjectVisitRepository.SaveChangesAsync(); - - return isSuccess ? ResponseOutput.Ok() : ResponseOutput.NotOk("转发影像失败。"); - } - - - - + } } diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index 72668d49..c9db9f81 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -172,20 +172,21 @@ namespace IRaCIS.Core.Application.Service // .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName)) .ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine)) - .ForMember(o => o.OverallTumorEvaluationResult, t => t.MapFrom(u => - criterionType == CriterionType.RECIST1Pointt1 ?( u.SourceSubjectVisit.IsBaseLine==true ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault().Answer: - u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstOrDefault().Answer) - : criterionType == CriterionType.PCWG3 ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstOrDefault().Answer : String.Empty - )) + // .ForMember(o => o.OverallTumorEvaluationResult, t => t.MapFrom(u => + //criterionType == CriterionType.RECIST1Pointt1 ?( u.SourceSubjectVisit.IsBaseLine==true ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault().Answer: + //u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstOrDefault().Answer) + // : criterionType == CriterionType.PCWG3 ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstOrDefault().Answer : String.Empty + // )) .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)); CreateMap().IncludeBase() - .ForMember(o => o.TargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion).FirstOrDefault().Answer)) - .ForMember(o => o.NoneTargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NoTargetLesion).FirstOrDefault().Answer)) - .ForMember(o => o.IsExistNewlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewLesions).FirstOrDefault().Answer)) + //.ForMember(o => o.TargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion).FirstOrDefault().Answer)) + //.ForMember(o => o.NoneTargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NoTargetLesion).FirstOrDefault().Answer)) + //.ForMember(o => o.IsExistNewlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewLesions).FirstOrDefault().Answer)) + .ForMember(o => o.EvaluationSummary, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault().Answer)) //.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) //.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) @@ -220,7 +221,8 @@ namespace IRaCIS.Core.Application.Service //.ForMember(o => o.MeasurementResult, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.Location).FirstOrDefault().Answer)) .ForMember(o => o.LongDiameter, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.MajorAxis).FirstOrDefault().Answer)) .ForMember(o => o.ShortDiameter, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis).FirstOrDefault().Answer)) - .ForMember(o => o.LessionState, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State).FirstOrDefault().Answer)); + .ForMember(o => o.LessionState, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State).FirstOrDefault().Answer) + ); CreateMap().IncludeBase() @@ -324,14 +326,14 @@ namespace IRaCIS.Core.Application.Service CreateMap(); CreateMap().ReverseMap(); - //受试者临床数据 添加编辑 + //患者临床数据 添加编辑 CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); - // 受试者临床数据 视图映射 + // 患者临床数据 视图映射 Guid subjectVisitId = Guid.Empty; CreateMap() .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) @@ -370,7 +372,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.DicomStudyCount, u => u.MapFrom(t => t.StudyList.Count())) .ForMember(d => d.NoneDicomStudyCount, u => u.MapFrom(t => t.NoneDicomStudyList.Count(t => t.NoneDicomFileList.Any()))); - //CRC 上传列表 + //IC 上传列表 CreateMap()/*.IncludeMembers(t=>t.Subject)*/ //.ForMember(d => d.SubjectStatus, u => u.MapFrom(s => s.Subject.Status)) //.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) @@ -421,7 +423,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode)); - //QC 界面 受试者 site 基本信息 展平的属性 比如 SubjectAge => Subject.Age + //QC 界面 患者 site 基本信息 展平的属性 比如 SubjectAge => Subject.Age CreateMap().IncludeMembers(t => t.Subject) .ForMember(d => d.SubjectVisitId, u => u.MapFrom(s => s.Id)) .ForMember(d => d.SubjectName, u => u.MapFrom(s => s.Subject.ShortName)) @@ -493,7 +495,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.CreateUserName, u => u.MapFrom(t => t.User.FirstName + "/" + t.User.LastName)); - //CRC 质疑列表 + //IC 质疑列表 CreateMap() .ForMember(d => d.PreliminaryAuditUserName, u => u.MapFrom(s => s.SubjectVisit.PreliminaryAuditUser.UserName)) .ForMember(d => d.PreliminaryAuditUserId, u => u.MapFrom(s => s.SubjectVisit.PreliminaryAuditUserId)) diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 8ac891b4..aa30e8ed 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -87,7 +87,7 @@ namespace IRaCIS.Application.Services } var clinicalDataTrialSet = (await _clinicalDataTrialSetRepository.Where(x => x.Id == indto.ClinicalDataTrialSetId).FirstOrDefaultAsync()).IfNullThrowException(); - //subject 或者访视级别的 都是在访视传 + //subject 或者检查批次级别的 都是在检查批次传 indto.IsVisit = clinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || clinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit; if (indto.Id == null) @@ -168,10 +168,10 @@ namespace IRaCIS.Application.Services #endregion - #region 临床数据CRC 相关 + #region 临床数据IC 相关 /// - /// 获取CRC上传的文件 + /// 获取IC上传的文件 /// /// /// @@ -235,7 +235,7 @@ namespace IRaCIS.Application.Services /// - /// 添加CRC数据类型 + /// 添加IC数据类型 /// /// private async Task AddCRCClinicalData(GetCRCClinicalDataInDto inDto) @@ -325,7 +325,7 @@ namespace IRaCIS.Application.Services //判断是否基线 if (isBaseLine) { - //CRC 的自动签名 不用管 只用处理PM 的就好 + //IC 的自动签名 不用管 只用处理PM 的就好 needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCritrialId) && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit) && t.UploadRole == UploadRole.PM).Count(); } else @@ -333,11 +333,11 @@ namespace IRaCIS.Application.Services needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCritrialId) && t.ClinicalDataLevel == ClinicalLevel.SubjectVisit && t.UploadRole == UploadRole.PM).Count(); } - //可能仅仅CRC 基线 没有PM + //可能仅仅IC 基线 没有PM if (needSignCount == haveSignedCount /*&& needSignCount != 0*/) { - //将该标准 该subject 该访视 任务临床数据状态变更 + //将该标准 该subject 该检查批次 任务临床数据状态变更 await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCritrialId && t.SourceSubjectVisitId == readingId, u => new VisitTask() { IsClinicalDataSign = true @@ -363,7 +363,7 @@ namespace IRaCIS.Application.Services needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCritrialId) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead).Count(); } - //可能仅仅CRC 基线 没有PM + //可能仅仅IC 基线 没有PM if (needSignCount == haveSignedCount /*&& needSignCount != 0*/) { //将该标准 该subject 该阅片期|肿瘤学 任务临床数据状态变更 @@ -495,7 +495,7 @@ namespace IRaCIS.Application.Services /// - /// 获取访视 阅片或任务临床数据 + /// 获取检查批次 阅片或任务临床数据 /// /// /// @@ -686,7 +686,7 @@ namespace IRaCIS.Application.Services var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId) .Where(x => x.ReadingId == inDto.ReadingId || (x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject)) - //.WhereIf(inDto.UploadRole == UploadRole.CRC, x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC) + //.WhereIf(inDto.UploadRole == UploadRole.IC, x => x.ClinicalDataTrialSet.UploadRole == UploadRole.IC) .Where(x => x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t=>t.TrialReadingCriterionId==inDto.TrialReadingCriterionId)) .Select(x => new GetReadingClinicalDataListOutDto() @@ -717,7 +717,7 @@ namespace IRaCIS.Application.Services }); var result = await resultQuery.ToListAsync(); - //result = result.Where(x => !(x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList(); + //result = result.Where(x => !(x.UploadRole == UploadRole.IC && x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList(); return result; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs index db77c367..d864d83f 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalDataServiceViewModel.cs @@ -195,12 +195,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid TrialId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } /// - /// 访视或者阅片ID + /// 检查批次或者阅片ID /// public Guid VisitOrReadId { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/GetReadModuleDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/GetReadModuleDto.cs index 4118d655..fb390eb6 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/GetReadModuleDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/GetReadModuleDto.cs @@ -20,7 +20,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string? TrialSiteCode { get; set; } /// - /// 受试者Code + /// 患者Code /// public string? SubjectCode { get; set; } @@ -63,7 +63,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public ReadingSetType ReadingSetType { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } @@ -81,17 +81,17 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public DateTime? ExpirationDate { get; set; } /// - /// 截止访视 + /// 截止检查批次 /// public decimal? ExpirationVisitNum { get; set; } /// - /// 访视计划ID + /// 检查批次计划ID /// public Guid? VisitStageId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } @@ -124,12 +124,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid TrialId { get; set; } /// - /// 受试者Id + /// 患者Id /// public Guid SubjectId { get; set; } /// - /// 访视Id + /// 检查批次Id /// public Guid SubjectVisitId { get; set; } @@ -162,13 +162,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public ModuleTypeEnum ModuleType { get; set; } /// - /// 访视ID + /// 检查批次ID /// public Guid? SubjectVisitId { get; set; } /// - /// 访视名称 + /// 检查批次名称 /// public string SubjectVisitName { get; set; } @@ -297,7 +297,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class SubjectVisitPlanView { /// - /// Id(阅片期Id 或者 访视ID) + /// Id(阅片期Id 或者 检查批次ID) /// public Guid Id { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/PreviousPDFViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/PreviousPDFViewModel.cs index 99f29a55..5704da1f 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/PreviousPDFViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/PreviousPDFViewModel.cs @@ -16,12 +16,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid TrialId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } /// - /// 访视或者阅片ID + /// 检查批次或者阅片ID /// public Guid VisitOrReadId { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 71fb881d..7bab26a3 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -30,7 +30,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public decimal PresentSod { get; set; } /// - /// 是否存在靶病灶 (当前访视 至少一个靶病灶的状态为存在) + /// 是否存在靶病灶 (当前检查批次 至少一个靶病灶的状态为存在) /// public bool ExistsTargetLesion { get; set; } @@ -60,22 +60,22 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool SODPercentLess30 { get; set; } /// - /// SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% + /// SOD 百分比 整体检查批次期间SOD最低点SOD相比增加<20% /// public bool LowSODPercentLess20 { get; set; } /// - /// SOD 百分比 比整体访视期间最低点SOD增加≥20% + /// SOD 百分比 比整体检查批次期间最低点SOD增加≥20% /// public bool LowSODPercentBigger20 { get; set; } /// - /// SOD 变化值 比整体访视期间最低点SOD绝对增加值<5 mm + /// SOD 变化值 比整体检查批次期间最低点SOD绝对增加值<5 mm /// public bool LowSODChangeLess5 { get; set; } /// - /// 比整体访视期间最低点SOD绝对增加值≥5 mm + /// 比整体检查批次期间最低点SOD绝对增加值≥5 mm /// public bool LowSODChangeBigger5 { get; set; } @@ -85,12 +85,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool ExixtsNETargetLesion { get; set; } /// - /// 上次访视点整体肿瘤评估 + /// 上次检查批次点整体肿瘤评估 /// public string LastTargetLesionEvaluate { get; set; } /// - /// 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 + /// 当前检查批次点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 /// public bool CurrentMajoreBigger0 { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs index 6ec1ee08..e6eb05d7 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs @@ -21,7 +21,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid TrialId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } @@ -36,7 +36,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid ClinicalDataTrialSetId { get; set; } /// - /// 是否是访视 + /// 是否是检查批次 /// public bool IsVisit { get; set; } @@ -188,7 +188,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } /// - /// 获取访视列表 + /// 获取检查批次列表 /// public class GetReadingClinicalDataListIndto { @@ -205,7 +205,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid TrialId { get; set; } /// - /// 是否是访视 + /// 是否是检查批次 /// public bool IsVisit { get; set; } @@ -241,7 +241,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string FileName { get; set; } /// - /// 是否为访视 + /// 是否为检查批次 /// public bool IsVisit { get; set; } @@ -271,7 +271,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string FileName { get; set; } /// - /// 是否为访视 + /// 是否为检查批次 /// public bool IsVisit { get; set; } } @@ -301,7 +301,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// - /// 访视Id 或者模块Id + /// 检查批次Id 或者模块Id /// public Guid ReadingId { get; set; } @@ -349,7 +349,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string ClinicalUploadTypeName { get; set; } /// - /// 是否为CRC上传 + /// 是否为IC上传 /// public bool IsCRCUpload { get; set; } @@ -443,7 +443,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid? SubjectId { get; set; } /// - /// 是否是访视 + /// 是否是检查批次 /// public bool IsVisit { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index f8cbfe13..8a21c17d 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -574,7 +574,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public decimal TaskNum { get; set; } /// - /// 任务盲态名称 和访视盲态一样 + /// 任务盲态名称 和检查批次盲态一样 /// public string BlindName { get; set; } @@ -1275,7 +1275,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsReadingShowPreviousResults { get; set; } = false; /// - /// 任务展示访视 读片任务显示是否顺序 + /// 任务展示检查批次 读片任务显示是否顺序 /// public bool IsReadingTaskViewInOrder { get; set; } = true; diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingMedicalReviewDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingMedicalReviewDto.cs index fe286c9a..d11057b6 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingMedicalReviewDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingMedicalReviewDto.cs @@ -157,13 +157,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public ReadingTool? ReadingTool { get; set; } /// - /// 任务展示访视 读片任务显示是否顺序 + /// 任务展示检查批次 读片任务显示是否顺序 /// public bool IsReadingTaskViewInOrder { get; set; } = true; /// - /// 阅片是否显示受试者信息 + /// 阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } = false; diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs index 9f3c9f68..2e86e3ca 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs @@ -38,12 +38,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public DateTime? ExpirationDate { get; set; } /// - /// 截止访视 + /// 截止检查批次 /// public decimal? ExpirationVisitNum { get; set; } /// - /// 访视计划ID + /// 检查批次计划ID /// public Guid? VisitStageId { get; set; } @@ -70,7 +70,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid ReadingPeriodSetId { get; set; } /// - /// 访视ID + /// 检查批次ID /// public List SubjectVisitIds { get; set; } } @@ -107,12 +107,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public DateTime? ExpirationDate { get; set; } /// - /// 截止访视 + /// 截止检查批次 /// public decimal? ExpirationVisitNum { get; set; } /// - /// 访视计划ID + /// 检查批次计划ID /// public Guid? VisitStageId { get; set; } @@ -145,17 +145,17 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string TrialSiteCode { get; set; } /// - /// 访视Id + /// 检查批次Id /// public Guid SubjectVisitId { get; set; } /// - /// 受试者Id + /// 患者Id /// public Guid SubjectId { get; set; } /// - /// 受试者名称 + /// 患者名称 /// public string SubjectCode { get; set; } @@ -221,12 +221,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public DateTime? ExpirationDate { get; set; } /// - /// 截止访视 + /// 截止检查批次 /// public decimal? ExpirationVisitNum { get; set; } /// - /// 访视计划ID + /// 检查批次计划ID /// public Guid? VisitStageId { get; set; } @@ -322,7 +322,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { /// - /// 截止访视 + /// 截止检查批次 /// public decimal? ExpirationVisitNum { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs index acb1a7b0..20f2d120 100644 --- a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs +++ b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs @@ -274,7 +274,7 @@ namespace IRaCIS.Core.Application.Service var taskIds = medicalReviewInfo.TaskList.Select(x => x.TaskId).ToList(); - // 找访视 + // 找检查批次 var visitTaskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId) && x.ReadingQuestionTrial.IsJudgeQuestion).Select(x => new JudgeQuestionAnswerInfo { Answer = x.Answer, diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs index a46afeba..492ff324 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs @@ -258,7 +258,7 @@ namespace IRaCIS.Application.Services var globalReadingQuestion = await _readingGlobalTaskInfoRepository.Where(x => x.GlobalTaskId == inDto.VisitTaskId).ToListAsync(); var criterionType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskInfo.TrialReadingCriterionId).Select(x => x.CriterionType).FirstOrDefaultAsync(); - // Before的Answer取自于 上一次全局阅片的结果, 如果没有上一次全局阅片的结果 取访视的答案 + // Before的Answer取自于 上一次全局阅片的结果, 如果没有上一次全局阅片的结果 取检查批次的答案 var lastGlobalTask = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Global && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index e1f4ddce..e9a0fe76 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -438,7 +438,7 @@ namespace IRaCIS.Application.Services } /// - /// 获取阅片的受试者信息 + /// 获取阅片的患者信息 /// /// /// @@ -473,7 +473,7 @@ namespace IRaCIS.Application.Services /// - /// 验证是否为基线访视任务 + /// 验证是否为基线检查批次任务 /// /// /// @@ -519,7 +519,7 @@ namespace IRaCIS.Application.Services #endregion - #region 访视任务 - Dicom 阅片 表格问题相关查询 + #region 检查批次任务 - Dicom 阅片 表格问题相关查询 /// @@ -1038,7 +1038,7 @@ namespace IRaCIS.Application.Services - #region 访视任务 - Dicom 阅片 表格问题 病灶的拆分与合并 + #region 检查批次任务 - Dicom 阅片 表格问题 病灶的拆分与合并 /// @@ -1152,7 +1152,7 @@ namespace IRaCIS.Application.Services - #region 访视任务 - Dicom 阅片 提交、修改 + #region 检查批次任务 - Dicom 阅片 提交、修改 /// /// 保存影像质量 @@ -1375,12 +1375,12 @@ namespace IRaCIS.Application.Services switch (taskinfo.TrialReadingCriterion.CriterionType) { // 对于非靶病灶,如果状态选择为显著增大,请验证: - // 1) 对于非淋巴结病灶,验证当前访视该病灶的长径 > 上一访视该病灶的长径。 - // 约束条件:两次访视该病灶的长径有测量值。 - // 提示语:当前访视该非淋巴结病灶的长径小于上一访视的值,不能设置为显著增大。 - // 2) 对于淋巴结病灶,验证当前访视该病灶的短径 > 上一访视该病灶的短径。 - // 约束条件:两次访视该病灶的短径有测量值。 - // 提示语:当前访视该淋巴结病灶的短径小于上一访视的值,不能设置为显著增大。 + // 1) 对于非淋巴结病灶,验证当前检查批次该病灶的长径 > 上一检查批次该病灶的长径。 + // 约束条件:两次检查批次该病灶的长径有测量值。 + // 提示语:当前检查批次该非淋巴结病灶的长径小于上一检查批次的值,不能设置为显著增大。 + // 2) 对于淋巴结病灶,验证当前检查批次该病灶的短径 > 上一检查批次该病灶的短径。 + // 约束条件:两次检查批次该病灶的短径有测量值。 + // 提示语:当前检查批次该淋巴结病灶的短径小于上一检查批次的值,不能设置为显著增大。 case CriterionType.RECIST1Pointt1: var lastTaskinfo = await _visitTaskRepository .Where(x => x.IsAnalysisCreate == taskinfo.IsAnalysisCreate && @@ -1875,7 +1875,7 @@ namespace IRaCIS.Application.Services /// - /// 验证访视提交 + /// 验证检查批次提交 /// /// /// @@ -2315,7 +2315,7 @@ namespace IRaCIS.Application.Services { // ****** 先生成阅片期 阅片期任务阅片完成之后生成肿瘤学的 如果没有阅片期 直接生成肿瘤学 *********//// #region 建立关系 - // 访视阅完产生 全局 + // 检查批次阅完产生 全局 Dictionary typeChangeDic = new Dictionary(); typeChangeDic.Add(ModuleTypeEnum.InPlanSubjectVisit, ReadingCategory.Visit); typeChangeDic.Add(ModuleTypeEnum.OutPlanSubjectVisit, ReadingCategory.Visit); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index e94290fb..8422e915 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -124,7 +124,7 @@ namespace IRaCIS.Application.Services { case ReadingCategory.Visit: - // 判断是否是全局访视任务 + // 判断是否是全局检查批次任务 if (await VerifyIsGlobalVisitTask(taskList[0].Id)) { @@ -308,7 +308,7 @@ namespace IRaCIS.Application.Services if (criterionType != CriterionType.PCWG3) { - // 加全局是否更新 和访视点注释 PCWG3不要 + // 加全局是否更新 和检查批次点注释 PCWG3不要 judgeReadingQuestion.JudgeQuestionList.Add(new JudgeQuestion() { Answer = item.AfterQuestionList.Any(x => x.IsHaveChange), @@ -349,7 +349,7 @@ namespace IRaCIS.Application.Services if (criterionType != CriterionType.PCWG3) { - // 加全局是否更新 和访视点注释 + // 加全局是否更新 和检查批次点注释 rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion() { Answer = twoItem.AfterQuestionList.Any(x => x.IsHaveChange), @@ -458,7 +458,7 @@ namespace IRaCIS.Application.Services } /// - /// 判断任务是否是全局访视任务 + /// 判断任务是否是全局检查批次任务 /// /// private async Task VerifyIsGlobalVisitTask(Guid visitTaskId) @@ -572,11 +572,11 @@ namespace IRaCIS.Application.Services { switch (visitTask.ReadingCategory) { - // 访视 + // 检查批次 case ReadingCategory.Visit: - // 判断是单访视裁判还是全局访视裁判 - // 查找两个 访视的阅片答案 + // 判断是单检查批次裁判还是全局检查批次裁判 + // 查找两个 检查批次的阅片答案 if (await VerifyIsGlobalVisitTask(visitTask.Id)) { // 找到所有的的任务 @@ -798,7 +798,7 @@ namespace IRaCIS.Application.Services (visitTask.SourceSubjectVisitId != null && criterionInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && criterionInfo.ArbitrationRule == ArbitrationRule.Reading) - // 全局访视任务仲裁 + // 全局检查批次任务仲裁 || (visitTask.SourceSubjectVisitId != null && criterionInfo.ArbitrationRule == ArbitrationRule.Reading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs index 4328fa62..2365fede 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingNoDicomTaskService.cs @@ -16,7 +16,7 @@ namespace IRaCIS.Application.Services public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService { /// - /// 提交访视阅片问题 + /// 提交检查批次阅片问题 /// /// /// diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs index 6a784f08..5e47b9ae 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs @@ -92,7 +92,7 @@ namespace IRaCIS.Application.Services }); - // 找到对应的访视 + // 找到对应的检查批次 List oncologyVisits = await _visitTaskRepository.Where(x => x.TrialId == taskInfo.TrialId && x.SubjectId == taskInfo.SubjectId && diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs index f35bfbe9..d2282882 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs @@ -215,7 +215,7 @@ namespace IRaCIS.Application.Services } /// - /// 添加阅片的时候 获取访视 //标准参数必传 + /// 添加阅片的时候 获取检查批次 //标准参数必传 /// /// /// @@ -271,7 +271,7 @@ namespace IRaCIS.Application.Services if (await _readModuleRepository.AnyAsync(x => x.SubjectVisitId == visit.Id&&x.ModuleType== moduleType && x.TrialReadingCriterionId == dto.TrialReadingCriterionId)) { - throw new BusinessValidationFailedException($"当前访视已经添加过阅片期"); + throw new BusinessValidationFailedException($"当前检查批次已经添加过阅片期"); } var readModuleData = new ReadModule() { @@ -391,7 +391,7 @@ namespace IRaCIS.Application.Services } else { - return ResponseOutput.NotOk("未找到符合要求的访视"); + return ResponseOutput.NotOk("未找到符合要求的检查批次"); } @@ -421,7 +421,7 @@ namespace IRaCIS.Application.Services //增加标准 if (readModule.ModuleType==ModuleTypeEnum.Global&&(await _readModuleRepository.AnyAsync(x=>x.ModuleType==ModuleTypeEnum.Oncology&&x.SubjectVisitId== readModule.SubjectVisitId && x.TrialReadingCriterionId==readModule.TrialReadingCriterionId))) { - throw new BusinessValidationFailedException("当前访视存在肿瘤学阅片,请先删除肿瘤学阅片"); + throw new BusinessValidationFailedException("当前检查批次存在肿瘤学阅片,请先删除肿瘤学阅片"); } if (await _visitTaskRepository.AnyAsync(x => readModuleId==x.SouceReadModuleId)) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadingPeriodSetService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadingPeriodSetService.cs index 7a84f7bf..249f84d2 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadingPeriodSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadingPeriodSetService.cs @@ -422,7 +422,7 @@ namespace IRaCIS.Application.Services pageList.CurrentPageData.ForEach(x => { - x.SubjectVisitName = x.IsGlobal ? "末次访视" : x.SubjectVisitName; + x.SubjectVisitName = x.IsGlobal ? "末次检查批次" : x.SubjectVisitName; }); return pageList; } @@ -441,7 +441,7 @@ namespace IRaCIS.Application.Services } /// - /// 获取阅片期配置的截至访视的下拉框 (增加标准搜索,已修改) + /// 获取阅片期配置的截至检查批次的下拉框 (增加标准搜索,已修改) /// /// /// @@ -492,7 +492,7 @@ namespace IRaCIS.Application.Services .WhereIf(inDto.ReadingScope == ReadingScopeEnum.Site, x => inDto.SiteIds.Contains(x.SiteId)) .Where(x=>!x.IsBaseLine);// 排除基线 - // 已经存在的访视 需要排除 + // 已经存在的检查批次 需要排除 var existsBubjectVisitsQuery = _readModuleRepository.Where(y => y.ReadingSetType == inDto.ReadingSetType && y.TrialId == inDto.TrialId && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Select(x => x.SubjectVisitId); visitQuery = visitQuery.Where(x => !existsBubjectVisitsQuery.Contains(x.Id)) diff --git a/IRaCIS.Core.Application/Service/ReadingAndReport/DTO/ReportDTO.cs b/IRaCIS.Core.Application/Service/ReadingAndReport/DTO/ReportDTO.cs index 81250081..fe881189 100644 --- a/IRaCIS.Core.Application/Service/ReadingAndReport/DTO/ReportDTO.cs +++ b/IRaCIS.Core.Application/Service/ReadingAndReport/DTO/ReportDTO.cs @@ -9,7 +9,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid TUId { get; set; } public int LesionType { get; set; } //病灶类型 public string STUDYID { get; set; } = string.Empty; // 项目ID - public string USUBJID { get; set; } = string.Empty;// 受试者ID + public string USUBJID { get; set; } = string.Empty;// 患者ID public int TUSEQ { get; set; } // 病灶序号 // 病灶分组,主要是用于将分裂或者结合在一起的已经被标识的肿瘤分类 @@ -49,7 +49,7 @@ namespace IRaCIS.Core.Application.Contracts public string TUEVALID { get; set; } = string.Empty;//这个特定的评估者变量是与 TUEVAL一起使用来提供更详 细的信息 public string TUACPTFL { get; set; } = string.Empty; - // 访视信息 + // 检查批次信息 public decimal VISITNUM { get; set; } = 0; public string VISIT { get; set; } = string.Empty; public int VISITDY { get; set; } @@ -102,7 +102,7 @@ namespace IRaCIS.Core.Application.Contracts } public class VisitLesionInfo { - //基线病灶信息及本次访视测量信息 + //基线病灶信息及本次检查批次测量信息 public IList BLLesionList { get; set; } = new List(); // public IList BLVisitLesionList { get; set; } = new List(); //public IList CurrentVisitLesionList { get; set; } = new List(); diff --git a/IRaCIS.Core.Application/Service/ReadingAndReport/Interface/IReportService.cs b/IRaCIS.Core.Application/Service/ReadingAndReport/Interface/IReportService.cs index 42569650..24f5227e 100644 --- a/IRaCIS.Core.Application/Service/ReadingAndReport/Interface/IReportService.cs +++ b/IRaCIS.Core.Application/Service/ReadingAndReport/Interface/IReportService.cs @@ -14,7 +14,7 @@ namespace IRaCIS.Core.Application.Contracts //IList GetBLLesion(string trialCode, string subjectCode); /// - /// 获取访视病灶信息 + /// 获取检查批次病灶信息 /// VisitLesionInfo GetVisitLineLesion(string trialCode, string subjectCode, decimal visitNum,string tpCode); diff --git a/IRaCIS.Core.Application/Service/ReadingAndReport/ReportService.cs b/IRaCIS.Core.Application/Service/ReadingAndReport/ReportService.cs index 396cadbb..8320b17a 100644 --- a/IRaCIS.Core.Application/Service/ReadingAndReport/ReportService.cs +++ b/IRaCIS.Core.Application/Service/ReadingAndReport/ReportService.cs @@ -177,7 +177,7 @@ // return result; // } -// /// 获取其他访视病灶信息 +// /// 获取其他检查批次病灶信息 // [AllowAnonymous] // [HttpGet, Route("getVisitLineLesion/{trialCode}/{subjectCode}/{visitNum:decimal}/{tpCode}")] // public VisitLesionInfo GetVisitLineLesion(string trialCode, string subjectCode, decimal visitNum, string tpCode) @@ -230,7 +230,7 @@ // tempLesion.TUSEQ = tempLesion.CurrentLesion.TUSEQ; // visitLesionInfo.BLLesionList.Add(tempLesion); // } -// // 以往新病灶,病灶类型为5,且访视编号小于当前访视,且不是基线 +// // 以往新病灶,病灶类型为5,且检查批次编号小于当前检查批次,且不是基线 // var previousLesion = list.Where(u => u.VISITNUM < visitNum && u.VISITNUM != 1 && u.LesionType == 5).ToList(); // foreach (var item in previousLesion) // { @@ -308,7 +308,7 @@ // [HttpPost("{tpId:guid}")] // public bool SubmiteReport(Guid tpId) // { -// // 提交报告 同时查询VisitStage(项目访视计划,看是否需要添加全局) +// // 提交报告 同时查询VisitStage(项目检查批次计划,看是否需要添加全局) // var query = from workloadTp in _workloadTPRepository.Where(u => u.Id == tpId) // join subjectVisit in _subjectVisitRepository.AsQueryable() @@ -371,7 +371,7 @@ // Status = (int)WorkloadStatus.Reading // }); -// //序号按照每个项目、每个受试者、每个评估者,一条记录 +// //序号按照每个项目、每个患者、每个评估者,一条记录 // TU lastTu = _tURepository.Where(u => u.STUDYID == addedLesion.STUDYID && u.USUBJID == addedLesion.USUBJID // && u.TUEVAL == addedLesion.TUEVAL).OrderByDescending("TUSEQ").FirstOrDefault(); // int tuSeq = 101; @@ -529,7 +529,7 @@ // } // /// -// /// 添加访视报告信息 +// /// 添加检查批次报告信息 // /// LesionInformation 为新病灶及测量信息(包括分裂及合并产生的) // /// TRList 已经存在的病灶的测量信息 // /// RSList 疗效信息 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs index f790f5ac..bab13fb9 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs @@ -14,7 +14,7 @@ namespace IRaCIS.Core.Application.ViewModel public class VisitStudyTime { /// - /// 访视Id + /// 检查批次Id /// public Guid SubjectVisitId { get; set; } @@ -24,7 +24,7 @@ namespace IRaCIS.Core.Application.ViewModel public class SiteVisitForTumor { /// - /// 访视Id + /// 检查批次Id /// public Guid VisitTaskId { get; set; } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs index bda18fd4..f11afcfb 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs @@ -19,14 +19,14 @@ namespace IRaCIS.Core.Application.Service Task CalculateTask(CalculateTaskInDto inDto); /// - /// 验证访视提交 + /// 验证检查批次提交 /// /// /// Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto); /// - /// 将上一次的访视病灶添加到这一次 + /// 将上一次的检查批次病灶添加到这一次 /// /// /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs index ffe22c60..b1dee544 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs @@ -18,14 +18,14 @@ namespace IRaCIS.Core.Application.Service Task CalculateTask(CalculateTaskInDto inDto); /// - /// 验证访视提交 + /// 验证检查批次提交 /// /// /// Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto); /// - /// 将上一次的访视病灶添加到这一次 + /// 将上一次的检查批次病灶添加到这一次 /// /// /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index 3a3bd28b..193cd288 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -555,13 +555,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 既往新病灶 new ReadingCalculateData (){QuestionType=QuestionType.AlwaysNewLesionsCount,GetIntFun=GetAlwaysNewLesionsCount}, - // 自治疗后第二个访视点以来持续的新骨病变数量 + // 自治疗后第二个检查批次点以来持续的新骨病变数量 new ReadingCalculateData (){QuestionType=QuestionType.NewBoneLesionsCount,GetIntFun=GetNewBoneLesionCount}, // 间隔天数 new ReadingCalculateData (){QuestionType=QuestionType.DaysBetween,GetIntFun=GetNumberOfDaysBetween}, - // 访视点肿瘤评估 + // 检查批次点肿瘤评估 new ReadingCalculateData (){QuestionType=QuestionType.SiteVisitForTumorEvaluation,GetStringFun=GetSiteVisitForTumorEvaluation}, @@ -758,9 +758,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion - #region 自治疗后第二个访视点以来持续的新骨病变数量 + #region 自治疗后第二个检查批次点以来持续的新骨病变数量 /// - /// 自治疗后第二个访视点以来持续的新骨病变数量 + /// 自治疗后第二个检查批次点以来持续的新骨病变数量 /// /// /// @@ -837,9 +837,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate - #region 访视点肿瘤评估 + #region 检查批次点肿瘤评估 /// - /// 访视点肿瘤评估 + /// 检查批次点肿瘤评估 /// /// /// @@ -876,7 +876,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } /// - /// 修改上一次访视结果 + /// 修改上一次检查批次结果 /// /// /// @@ -894,24 +894,24 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (lastTask != null) { - #region 1、基线后第一个访视:新病灶计数≥ 2个;2、基线后第二个访视(应满足访视间隔6周以上,否则顺延)新病灶≥ 2个; - //1、基线后第一个访视:新病灶计数≥ 2个;2、基线后第二个访视(应满足访视间隔6周以上,否则顺延)新病灶≥ 2个; + #region 1、基线后第一个检查批次:新病灶计数≥ 2个;2、基线后第二个检查批次(应满足检查批次间隔6周以上,否则顺延)新病灶≥ 2个; + //1、基线后第一个检查批次:新病灶计数≥ 2个;2、基线后第二个检查批次(应满足检查批次间隔6周以上,否则顺延)新病灶≥ 2个; var firstVisit = taskList.FirstOrDefault(); if (baseLineTask.StudyTime != null) { - //基线后第二个访视(应满足访视间隔6周以上,否则顺延) + //基线后第二个检查批次(应满足检查批次间隔6周以上,否则顺延) var secondVisit = taskList.Where(x => x.VisitTaskNum >= 2 && x.StudyTime >= baseLineTask.StudyTime.Value.AddDays(42)).FirstOrDefault(); if (secondVisit != null) { var firstTaskNewLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstVisit.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); - // 第二访视数量 + // 第二检查批次数量 var secondVisitLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); - // 判断是否是当前访视 当前访视还未入库 + // 判断是否是当前检查批次 当前检查批次还未入库 if (secondVisit.VisitTaskId == inDto.VisitTaskId) { secondVisitLesionsCount = (inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0(); @@ -963,7 +963,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion /// - /// 获取访视日期信息 + /// 获取检查批次日期信息 /// /// /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index 5d43af8a..91717301 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -131,10 +131,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { QuestionId = x.Id, GroupName = x.GroupName, - GroupEnName=x.GroupEnName, + GroupEnName = x.GroupEnName, IsShowInDicom = x.IsShowInDicom, Type = x.Type, - GroupId=x.GroupId, + GroupId = x.GroupId, QuestionType = x.QuestionType, LesionType = x.LesionType, QuestionGenre = x.QuestionGenre, @@ -145,19 +145,19 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate ShowOrder = x.ShowOrder, ValueType = x.ValueType, Unit = x.Unit, - CustomUnit=x.CustomUnit, - ReportLayType= ReportLayType.Group, + CustomUnit = x.CustomUnit, + ReportLayType = ReportLayType.Group, }).ToList(); // 分组 foreach (var item in questions) { - item.Childrens = questionList.Where(x => x.GroupId==item.QuestionId).OrderBy(x => x.ShowOrder).Select(x => new ReadingReportDto() + item.Childrens = questionList.Where(x => x.GroupId == item.QuestionId).OrderBy(x => x.ShowOrder).Select(x => new ReadingReportDto() { GroupName = x.GroupName, QuestionId = x.Id, IsShowInDicom = x.IsShowInDicom, - GroupEnName=x.GroupEnName, + GroupEnName = x.GroupEnName, QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us), LesionType = x.LesionType, QuestionGenre = x.QuestionGenre, @@ -170,7 +170,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate OrderMark = x.OrderMark, ValueType = x.ValueType, Unit = x.Unit, - CustomUnit=x.CustomUnit, + CustomUnit = x.CustomUnit, ReportLayType = ReportLayType.Question, }).ToList(); @@ -184,12 +184,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var answer = answers.Where(x => x.VisitTaskId == task.VisitTaskId && x.ReadingQuestionTrialId == question.QuestionId).FirstOrDefault(); question.Answer.Add(new TaskQuestionAnswer() { - Answer = answer==null?string.Empty:answer.Answer, + Answer = answer == null ? string.Empty : answer.Answer, IsGlobalChange = answer == null ? false : answer.IsGlobalChange, GlobalChangeAnswer = answer == null ? string.Empty : answer.GlobalChangeAnswer, TaskName = task.TaskName, VisitTaskId = task.VisitTaskId, - + }); } @@ -224,7 +224,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Type = x.Type, LesionType = question.LesionType, TableQuestionType = x.TableQuestionType, - RowId=row.RowId, + RowId = row.RowId, IsShowInDicom = question.IsShowInDicom, DataSource = x.DataSource, DictionaryCode = x.DictionaryCode, @@ -261,13 +261,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate switch (tableQuestion.QuestionMark) { case QuestionMark.Organ: - taskQuestionAnswer.Answer= organInfo.TULOCEN; + taskQuestionAnswer.Answer = organInfo.TULOCEN; break; case QuestionMark.Location: if (organInfo.IsCanEditPosition) { - + } else { @@ -278,7 +278,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate case QuestionMark.Part: taskQuestionAnswer.Answer = organInfo.PartEN; - + break; } @@ -294,7 +294,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate case QuestionMark.Location: if (organInfo.IsCanEditPosition) { - + } else { @@ -344,7 +344,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate public async Task TestCalculate(Guid visitTaskId, QuestionType type) { ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(visitTaskId); - await ReadingCalculate(readingData,new List() { type}); + await ReadingCalculate(readingData, new List() { type }); } @@ -384,7 +384,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// /// - public async Task ReadingCalculate(ReadingCalculateDto inDto,List calculateType=null) + public async Task ReadingCalculate(ReadingCalculateDto inDto, List calculateType = null) { #region 计算 这里顺序非常重要 后面计算的值要依赖前面计算的结果 @@ -402,41 +402,45 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate //与基线SOD相比变化量(mm) new ReadingCalculateData (){QuestionType=QuestionType.SODChange,GetDecimalNullFun=GetSODChange}, - //与基线访视相比SOD变化百分比 + //与基线检查批次相比SOD变化百分比 new ReadingCalculateData (){QuestionType=QuestionType.SODPercent,GetDecimalNullFun=GetSODPercent}, - //与整个访视期间SOD最低点相比增加的值(mm) //其他任务需要改 + //与整个检查批次期间SOD最低点相比增加的值(mm) //其他任务需要改 new ReadingCalculateData (){QuestionType=QuestionType.LowestIncrease,GetDecimalNullFun=GetLowestIncrease,/*ChangeAllTaskFun=ChangeAllLowestIncrease*/}, - //与整个访视期间SOD最低点相比增加的百分比 //其他任务需要改 + //与整个检查批次期间SOD最低点相比增加的百分比 //其他任务需要改 new ReadingCalculateData (){QuestionType=QuestionType.LowPercent,GetDecimalNullFun=GetLowPercent,/*ChangeAllTaskFun=ChangeAllLowPercent*/}, - //整个访视期间SOD最低点访视名称 //其他任务需要改 + //整个检查批次期间SOD最低点检查批次名称 //其他任务需要改 new ReadingCalculateData (){QuestionType=QuestionType.LowVisit,GetStringFun=GetLowVisit,/*ChangeAllTaskFun=ChangeAllLowVisitName*/}, //是否存在非淋巴结靶病灶 new ReadingCalculateData (){QuestionType=QuestionType.IsLymphTarget,GetStringFun=GetIsLymphTarget}, - //是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上 + //是否存在淋巴结靶病灶且该病灶比上一检查批次短径增加5MM以上 new ReadingCalculateData (){QuestionType=QuestionType.IsAddFive,GetStringFun=GetIsAddFive}, //被评估为NE的单个靶病灶 new ReadingCalculateData (){QuestionType=QuestionType.NETarget,GetStringFun=GetNETarget}, - //靶病灶评估 - new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate}, - //非靶病灶评估 - new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate}, + #region 疗效不自动计算 + // //靶病灶评估 + // new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate}, - //是否存在新病灶 - new ReadingCalculateData (){QuestionType=QuestionType.NewLesions,GetStringFun=GetNewLesionEvaluate}, + ////非靶病灶评估 + // new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate}, - //整体肿瘤评估 - new ReadingCalculateData (){QuestionType=QuestionType.Tumor,GetStringFun=GetTumor}, + ////是否存在新病灶 + // new ReadingCalculateData (){QuestionType=QuestionType.NewLesions,GetStringFun=GetNewLesionEvaluate}, - //是否存在疾病 - new ReadingCalculateData (){QuestionType=QuestionType.ExistDisease,GetStringFun=GetIsExistDisease}, + // //整体肿瘤评估 + // new ReadingCalculateData (){QuestionType=QuestionType.Tumor,GetStringFun=GetTumor}, + + // //是否存在疾病 + // new ReadingCalculateData (){QuestionType=QuestionType.ExistDisease,GetStringFun=GetIsExistDisease}, + #endregion + }; @@ -457,7 +461,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var isNeedDeleteTypes = calculateList.Where(x => !questionTypes.Contains(x.QuestionType)).Select(x => x.QuestionType).ToList(); - var isNeedDeleteIds = inDto.QuestionInfo.Where(x =>x.QuestionType!=null&& isNeedDeleteTypes.Contains(x.QuestionType.Value)).Select(x => x.QuestionId).ToList(); + var isNeedDeleteIds = inDto.QuestionInfo.Where(x => x.QuestionType != null && isNeedDeleteTypes.Contains(x.QuestionType.Value)).Select(x => x.QuestionId).ToList(); await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && isNeedDeleteIds.Contains(x.ReadingQuestionTrialId), x => new ReadingTaskQuestionAnswer { @@ -469,7 +473,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate calculateList = calculateList.Where(x => questionTypes.Contains(x.QuestionType)).ToList(); - + } @@ -555,7 +559,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } } - + needAddList.Add(new ReadingTaskQuestionAnswer() @@ -622,7 +626,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } /// - /// 验证访视提交 + /// 验证检查批次提交 /// /// /// @@ -695,12 +699,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } - - #region 将上一次的访视病灶添加到这一次 + + #region 将上一次的检查批次病灶添加到这一次 /// - /// 将上一次的访视病灶添加到这一次 + /// 将上一次的检查批次病灶添加到这一次 /// /// /// @@ -721,9 +725,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId && - x.IsAnalysisCreate== taskinfo.IsAnalysisCreate&& + x.IsAnalysisCreate == taskinfo.IsAnalysisCreate && x.DoctorUserId == taskinfo.DoctorUserId && - x.IsSelfAnalysis== taskinfo.IsSelfAnalysis && + x.IsSelfAnalysis == taskinfo.IsSelfAnalysis && x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum ).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync(); @@ -751,7 +755,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate x.SeriesId = null; x.InstanceId = null; x.MeasureData = string.Empty; - x.PicturePath= string.Empty; + x.PicturePath = string.Empty; }); tableRowAnswers.ForEach(x => @@ -781,10 +785,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }); - - var addList= _mapper.Map>(tableRowAnswers); - + + var addList = _mapper.Map>(tableRowAnswers); + await _readingTableAnswerRowInfoRepository.AddRangeAsync(addList); await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers); await _readingTableQuestionAnswerRepository.SaveChangesAsync(); @@ -901,9 +905,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } #endregion - #region 与基线访视相比SOD变化百分比 + #region 与基线检查批次相比SOD变化百分比 /// - /// 与基线访视相比SOD变化百分比 + /// 与基线检查批次相比SOD变化百分比 /// /// /// @@ -929,9 +933,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } #endregion - #region 与整个访视期间SOD最低点相比增加的值(mm) + #region 与整个检查批次期间SOD最低点相比增加的值(mm) /// - /// 与整个访视期间SOD最低点相比增加的值(mm) + /// 与整个检查批次期间SOD最低点相比增加的值(mm) /// /// /// @@ -951,9 +955,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } #endregion - #region 与整个访视期间SOD最低点相比增加的百分比 + #region 与整个检查批次期间SOD最低点相比增加的百分比 /// - /// 与整个访视期间SOD最低点相比增加的百分比 + /// 与整个检查批次期间SOD最低点相比增加的百分比 /// /// /// @@ -983,9 +987,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } #endregion - #region 整个访视期间SOD最低点访视名称 + #region 整个检查批次期间SOD最低点检查批次名称 /// - /// 整个访视期间SOD最低点访视名称 + /// 整个检查批次期间SOD最低点检查批次名称 /// /// /// @@ -1034,9 +1038,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } #endregion - #region 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上 + #region 是否存在淋巴结靶病灶且该病灶比上一检查批次短径增加5MM以上 /// - /// 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上 + /// 是否存在淋巴结靶病灶且该病灶比上一检查批次短径增加5MM以上 /// /// /// @@ -1054,7 +1058,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } /// - /// 获取存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上的病灶 + /// 获取存在淋巴结靶病灶且该病灶比上一检查批次短径增加5MM以上的病灶 /// /// /// @@ -1151,10 +1155,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #region 修改其他标准 - #region 修改与整个访视期间SOD最低点相比增加的值(mm) + #region 修改与整个检查批次期间SOD最低点相比增加的值(mm) /// - /// 修改与整个访视期间SOD最低点相比增加的值(mm) + /// 修改与整个检查批次期间SOD最低点相比增加的值(mm) /// /// /// @@ -1176,10 +1180,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion - #region 修改整个访视期间SOD最低点相比增加的百分比 + #region 修改整个检查批次期间SOD最低点相比增加的百分比 /// - /// 修改整个访视期间SOD最低点相比增加的百分比 + /// 修改整个检查批次期间SOD最低点相比增加的百分比 /// /// /// @@ -1218,9 +1222,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// public async Task ChangeAllLowVisitName(ChangeAllTaskDto inDto) { - // 找到所有访视任务的Id + // 找到所有检查批次任务的Id - var visitTaskIds = await _visitTaskRepository.Where(x => x.IsAnalysisCreate == inDto.IsAnalysisCreate && + var visitTaskIds = await _visitTaskRepository.Where(x => x.IsAnalysisCreate == inDto.IsAnalysisCreate && x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == inDto.calculateDto.TrialReadingCriterionId && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == inDto.calculateDto.ArmEnum).Select(x => x.Id).ToListAsync(); @@ -1237,9 +1241,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #region 通用方法 - #region 修改所有访视任务的答案 + #region 修改所有检查批次任务的答案 /// - /// 修改所有访视任务的答案 + /// 修改所有检查批次任务的答案 /// /// /// @@ -1263,7 +1267,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// private async Task GetBaseLineSOD(ReadingCalculateDto inDto) { - if (await _visitTaskRepository.AnyAsync(x => x.Id == inDto.VisitTaskId && x.SourceSubjectVisit.IsBaseLine && x.IsAnalysisCreate==inDto.IsAnalysisCreate && x.ArmEnum == inDto.ArmEnum)) + if (await _visitTaskRepository.AnyAsync(x => x.Id == inDto.VisitTaskId && x.SourceSubjectVisit.IsBaseLine && x.IsAnalysisCreate == inDto.IsAnalysisCreate && x.ArmEnum == inDto.ArmEnum)) { return 0; } @@ -1272,9 +1276,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var baseLineTaskId = await _visitTaskRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == inDto.TrialReadingCriterionId && - x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect && + x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect && x.IsAnalysisCreate == inDto.IsAnalysisCreate - &&x.DoctorUserId==inDto.DoctorUserId + && x.DoctorUserId == inDto.DoctorUserId && x.IsSelfAnalysis == inDto.IsSelfAnalysis && x.ArmEnum == inDto.ArmEnum) .Select(x => x.Id).FirstOrDefaultAsync(); @@ -1310,9 +1314,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate return taskAnswerList.OrderBy(x => x.SOD).ToList(); } - #region 获取访视任务信息 + #region 获取检查批次任务信息 /// - /// 获取访视任务信息 + /// 获取检查批次任务信息 /// /// /// @@ -1324,7 +1328,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate visitTaskAnswerList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId != inDto.VisitTaskId && x.VisitTask.ReadingCategory == ReadingCategory.Visit && x.VisitTask.IsAnalysisCreate == inDto.IsAnalysisCreate && x.VisitTask.IsSelfAnalysis == inDto.IsSelfAnalysis - &&x.VisitTask.VisitTaskNum new VisitTaskAnswerInfo { @@ -1342,7 +1346,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate visitTaskAnswerList.Add(new VisitTaskAnswerInfo() { VisitTaskId = inDto.VisitTaskId, - BlindName=inDto.TaskBlindName, + BlindName = inDto.TaskBlindName, QuestionId = visitTaskAnswerList[0].QuestionId, VisitName = inDto.VisitName, SOD = (await GetSODData(inDto)).ToString().IsNullOrEmptyReturn0(), @@ -1357,24 +1361,24 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion /// - /// 获取上一个访视任务Id + /// 获取上一个检查批次任务Id /// /// private async Task GetLastVisitTaskId(ReadingCalculateDto inDto) { - // 拿到这一个访视 + // 拿到这一个检查批次 var thisNum = await _subjectVisitRepository.Where(x => x.Id == inDto.SubjectVisitId).Select(x => x.VisitNum).FirstOrDefaultAsync(); - // 先找到上一个访视 + // 先找到上一个检查批次 var lastVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == inDto.SubjectId && !x.IsLostVisit && x.VisitNum < thisNum).OrderByDescending(x => x.VisitNum).Select(x => x.Id).FirstOrDefaultAsync(); - // 找到访视任务Id + // 找到检查批次任务Id var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.TaskState == TaskState.Effect && x.IsAnalysisCreate == inDto.IsAnalysisCreate - && x.SourceSubjectVisitId == lastVisitId && x.ArmEnum==inDto.ArmEnum).Select(x => x.Id).FirstOrDefaultAsync(); + && x.SourceSubjectVisitId == lastVisitId && x.ArmEnum == inDto.ArmEnum).Select(x => x.Id).FirstOrDefaultAsync(); return LastVisitTaskId; } @@ -1416,7 +1420,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// ///if (最低点SOD > 0) ///{ - /// if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) + /// if(比整体检查批次期间最低点SOD增加≥20 % 且与整个检查批次期间最低点相比增加的值≥5 mm) /// { /// 靶病灶疗效为 PD /// @@ -1425,21 +1429,21 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate ///else ///{ /// //进入该分支最低点SOD=0 - /// if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) + /// if (当前检查批次SOD > 0 且与整个检查批次期间最低点相比增加的值≥5 mm) /// { /// 靶病灶疗效为PD /// /// } ///} /// - ///if(上次访视点评估是CR) + ///if(上次检查批次点评估是CR) /// { - /// if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) + /// if (当前检查批次点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) /// { /// 靶病灶疗效为 PD /// /// } - /// if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + /// if (当前检查批次点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) /// { /// 靶病灶疗效为 PD /// @@ -1486,28 +1490,28 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) > -30, - // SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% + // SOD 百分比 整体检查批次期间SOD最低点SOD相比增加<20% LowSODPercentLess20 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 20, - // SOD 百分比 比整体访视期间SOD最低点SOD增加≥20% + // SOD 百分比 比整体检查批次期间SOD最低点SOD增加≥20% LowSODPercentBigger20 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20, - // SOD 变化值 比整体访视期间SOD最低点SOD绝对增加值<5 mm + // SOD 变化值 比整体检查批次期间SOD最低点SOD绝对增加值<5 mm LowSODChangeLess5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 5, - // 比整体访视期间SOD最低点SOD绝对增加值≥5 mm + // 比整体检查批次期间SOD最低点SOD绝对增加值≥5 mm LowSODChangeBigger5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5, // 被评估为NE的单个靶病灶 是否存在状态为不可评估的靶病灶 ExixtsNETargetLesion = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate)), - //// 上次访视点整体肿瘤评估 + //// 上次检查批次点整体肿瘤评估 LastTargetLesionEvaluate = string.Empty, - // 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm + // 当前检查批次点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm CurrentMajoreBigger0 = false, - // 当前访视点淋巴结病灶, 至少一个淋巴结靶病灶短径≥10 mm + // 当前检查批次点淋巴结病灶, 至少一个淋巴结靶病灶短径≥10 mm CurrenShortBigger10 = false, // 靶病灶短径增加值有5mm的Index @@ -1530,7 +1534,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes))) { // 淋巴结非靶病灶状态全部为消失 - resultData.NonTargetStateIsLoss = resultData.NonTargetStateIsLoss&& item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.State).Select(x => x.Answer).FirstOrDefault()== NoTargetState.Loss.GetEnumInt(); + resultData.NonTargetStateIsLoss = resultData.NonTargetStateIsLoss && item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.State).Select(x => x.Answer).FirstOrDefault() == NoTargetState.Loss.GetEnumInt(); } } @@ -1540,10 +1544,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes))) { // 淋巴结的短径 - resultData.DiameterLessThan10 = resultData.DiameterLessThan10&&(item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() < 10; + resultData.DiameterLessThan10 = resultData.DiameterLessThan10 && (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() < 10; var shortIsBigger10 = (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() >= 10; - resultData.CurrenShortBigger10= resultData.CurrenShortBigger10|| shortIsBigger10; + resultData.CurrenShortBigger10 = resultData.CurrenShortBigger10 || shortIsBigger10; if (shortIsBigger10) { @@ -1555,8 +1559,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && !x.Answer.EqEnum(YesOrNoOrNa.Yes))) { - // 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径 - resultData.CurrentMajoreBigger0 = resultData.CurrentMajoreBigger0|| (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() > 0; + // 当前检查批次点非淋巴结病灶至少一个非淋巴结靶病灶的长径 + resultData.CurrentMajoreBigger0 = resultData.CurrentMajoreBigger0 || (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() > 0; } } @@ -1599,7 +1603,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate //if (最低点SOD > 0) if (resultData.LowSod > 0) { - // if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) + // if(比整体检查批次期间最低点SOD增加≥20 % 且与整个检查批次期间最低点相比增加的值≥5 mm) if (resultData.LowSODPercentBigger20 && resultData.LowSODChangeBigger5) { // 靶病灶疗效为 PD @@ -1609,24 +1613,24 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate else { //进入该分支最低点SOD=0 - // if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) + // if (当前检查批次SOD > 0 且与整个检查批次期间最低点相比增加的值≥5 mm) if (resultData.PresentSod > 0 && resultData.LowSODChangeBigger5) { // 靶病灶疗效为PD result = TargetAssessment.PD; } } - //if(上次访视点评估是CR) + //if(上次检查批次点评估是CR) if (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR)) { - //if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) + //if (当前检查批次点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) // 换句话说 就是 短径≥10 的病灶 和 短径增加值≥5的病灶 的交集数量大于0 - if (resultData.ShortBigger10Indexs.Intersect(resultData.AddFiveIndexs).ToList().Count()>0) + if (resultData.ShortBigger10Indexs.Intersect(resultData.AddFiveIndexs).ToList().Count() > 0) { //靶病灶疗效为 PD result = TargetAssessment.PD; } - //if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + //if (当前检查批次点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) if (resultData.CurrentMajoreBigger0) { //靶病灶疗效为 PD @@ -1735,11 +1739,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate result = NoTargetAssessment.NN; } //所有单个病灶/病灶组状态评估状态为“消失” - else if (tableQuestions.Count(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.Loss))== tableQuestions.Count(x=> x.QuestionMark == QuestionMark.State) && tableQuestions.Count(x => x.QuestionMark == QuestionMark.State)>0) + else if (tableQuestions.Count(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.Loss)) == tableQuestions.Count(x => x.QuestionMark == QuestionMark.State) && tableQuestions.Count(x => x.QuestionMark == QuestionMark.State) > 0) { result = NoTargetAssessment.CR; } - + // 基线时没有非靶病灶 else if (tableQuestions.Count() == 0) { @@ -1777,7 +1781,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate - // 当前访视存在至少一个明确新病灶 + // 当前检查批次存在至少一个明确新病灶 if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionState.Exist))) { result = NewLesionAssessment.Yes; @@ -1787,7 +1791,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { result = NewLesionAssessment.NE; } - //当前访视不存在明确新病灶且存在至少一个疑似新病灶 + //当前检查批次不存在明确新病灶且存在至少一个疑似新病灶 else if (!tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionState.Exist)) && tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionState.Suspected)) ) @@ -1795,7 +1799,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate result = NewLesionAssessment.Suspected; } - + else { result = NewLesionAssessment.No; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs index 6331b401..9a9311f5 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/ReadingCalculateService.cs @@ -101,7 +101,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } /// - /// 验证访视提交 + /// 验证检查批次提交 /// /// /// @@ -116,7 +116,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } /// - /// 将上一次的访视病灶添加到这一次 + /// 将上一次的检查批次病灶添加到这一次 /// /// /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs index 7b8c8a8f..f8c2809e 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs @@ -362,7 +362,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion /// - /// 将上一次的访视病灶添加到这一次 + /// 将上一次的检查批次病灶添加到这一次 /// /// /// diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs index db323d43..3a30814d 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs @@ -13,7 +13,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid TrialId { get; set; } /// - /// 受试者编号具体规则 + /// 患者编号具体规则 /// public string SubjectCodeRule { get; set; } = string.Empty; @@ -27,7 +27,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsVerifyVisitImageDate { get; set; } = false; /// - /// 是否 提醒受试者编号规则 + /// 是否 提醒患者编号规则 /// public bool IsNoticeSubjectCodeRule { get; set; } = true; @@ -37,7 +37,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsHaveFirstGiveMedicineDate { get; set; } = true; /// - /// 是否有 受试者年龄 + /// 是否有 患者年龄 /// public bool IsHaveSubjectAge { get; set; } = false; @@ -45,7 +45,7 @@ namespace IRaCIS.Core.Application.Contracts /// - /// 出组后计划外访视名称 + /// 出组后计划外检查批次名称 /// public string OutEnrollmentVisitName { get; set; } = "EOT"; @@ -142,7 +142,7 @@ namespace IRaCIS.Core.Application.Contracts /// - /// 阅片是否显示受试者信息 + /// 阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } = false; @@ -227,7 +227,7 @@ namespace IRaCIS.Core.Application.Contracts //public ReadingMethod ReadingType { get; set; } /// - /// 阅片是否显示受试者信息 + /// 阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } @@ -261,7 +261,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsReadingTaskViewInOrder { get; set; } = true; /// - /// 阅片是否显示受试者信息 + /// 阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } @@ -384,7 +384,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsImageIabeled { get; set; } /// - /// IR阅片是否显示受试者信息 + /// IR阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } = false; @@ -854,7 +854,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsReadingTaskViewInOrder { get; set; } = true; /// - /// IR阅片是否显示受试者信息 + /// IR阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } = false; diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs index 6a9785e1..2a11c228 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs @@ -178,8 +178,8 @@ namespace IRaCIS.Application.Contracts public Guid? SponsorId { get; set; } public Guid? CROId { get; set; } - - + +public string HeadPI { get; set; } = String.Empty; public string ResearchProgramNo { get; set; } = String.Empty; public string ExperimentName { get; set; } = String.Empty; diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs index 75ec6836..1512ffb6 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs @@ -20,6 +20,6 @@ namespace IRaCIS.Application.Interfaces Task TrialConfigSignatureConfirm(SignConfirmDTO signConfirmDTO); - + Task AsyncTrialCriterionDictionary(AsyncTrialCriterionDictionaryInDto inDto); } } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs index ff2193eb..a746f596 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialService.cs @@ -8,7 +8,7 @@ namespace IRaCIS.Application.Interfaces { bool TrialExpeditedChange { get; set; } - Task> AddOrUpdateTrial(TrialCommand trialAddModel); + Task> AddOrUpdateTrial(TrialCommand trialAddModel, ITrialConfigService _ITrialConfigService); Task DeleteTrial(Guid trialId); Task> GetReviewerTrialListByEnrollmentStatus(TrialByStatusQueryDTO param); Task> GetTrialEnrollmentReviewerIds(Guid trialId); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 79a502e5..019be16a 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -192,7 +192,7 @@ namespace IRaCIS.Core.Application [HttpPost] public async Task AsyncTrialCriterionDictionary(AsyncTrialCriterionDictionaryInDto inDto) { - var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync(); + var trialCriterion = await _readingQuestionCriterionTrialRepository.FindAsync(inDto.TrialReadingCriterionId); if (trialCriterion.ReadingQuestionCriterionSystemId != null) { @@ -837,14 +837,14 @@ namespace IRaCIS.Core.Application var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException(); - //项目紧急 当前所有已提交,但未完成的访视,设置为加急。后续提交的访视也设置为加急 (在提交的时候,回去判断 项目加急,Subject加急,是否入组确认,是否Pd,从而设置访视是否加急) + //项目紧急 当前所有已提交,但未完成的检查批次,设置为加急。后续提交的检查批次也设置为加急 (在提交的时候,回去判断 项目加急,Subject加急,是否入组确认,是否Pd,从而设置检查批次是否加急) if (trialConfig.IsUrgent) { await _repository.BatchUpdateAsync(t => t.TrialId == trialInfo.Id && t.SubmitState == SubmitStateEnum.Submitted && t.ForwardState < ForwardStateEnum.Forwarded, s => new SubjectVisit() { IsUrgent = trialConfig.IsUrgent }); } - else //之前设置为加急的访视状态不变。后续提交的访视,为不加急。 + else //之前设置为加急的检查批次状态不变。后续提交的检查批次,为不加急。 { } @@ -862,7 +862,7 @@ namespace IRaCIS.Core.Application var canOPt = await _trialRepository.AnyAsync(trial => trial.Id == trialId && trial.IsTrialBasicLogicConfirmed && trial.IsTrialProcessConfirmed && trial.IsTrialUrgentConfirmed && trial.VisitPlanConfirmed); - return ResponseOutput.Ok(canOPt, msg: canOPt ? "" : "该项目的项目配置(基础配置、流程配置、加急配置) 、访视管理,有配置未确认,不能设置项目状态为启动。"); + return ResponseOutput.Ok(canOPt, msg: canOPt ? "" : "该项目的项目配置(基础配置、流程配置、加急配置) 、检查批次管理,有配置未确认,不能设置项目状态为启动。"); } /// @@ -889,7 +889,7 @@ namespace IRaCIS.Core.Application } else { - return ResponseOutput.NotOk("无法变更项目状态。该项目的项目配置、访视管理中,有未确认项"); + return ResponseOutput.NotOk("无法变更项目状态。该项目的项目配置、检查批次管理中,有未确认项"); } } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs index 02ba57fe..a2c79993 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialMaintenanceService.cs @@ -8,6 +8,7 @@ using IRaCIS.Core.Application.Service; using Microsoft.AspNetCore.Authorization; using IRaCIS.Core.Application.Auth; +using IRaCIS.Core.Domain.Models; namespace IRaCIS.Application.Services { @@ -83,7 +84,7 @@ namespace IRaCIS.Application.Services - /// Setting页面 为 site 勾选CRC用户列表 + /// Setting页面 为 site 勾选IC用户列表 [HttpPost] public async Task> GetSiteCRCScreeningList(SiteCRCQuery param) { @@ -117,11 +118,11 @@ namespace IRaCIS.Application.Services //之前已经选择的用户 不放在列表中,现在又要改回去 废弃 var query = _repository.Where(t => t.UserTypeEnum != UserTypeEnum.SuperAdmin) - //正式或者培训的项目 不能允许测试用户(必须正式用户) 同时必须是内部的用户 - .WhereIf(trialType == TrialType.OfficialTrial || trialType == TrialType.Training, t => t.IsTestUser == false && t.IsZhiZhun) + ////正式或者培训的项目 不能允许测试用户(必须正式用户) 同时必须是内部的用户 + //.WhereIf(trialType == TrialType.OfficialTrial || trialType == TrialType.Training, t => t.IsTestUser == false && t.IsZhiZhun) - //测试项目 可以加入 测试用户 或者内部正式用户 - .WhereIf(trialType == TrialType.NoneOfficial, t => t.IsTestUser == true || (t.IsTestUser == false && t.IsZhiZhun)) + ////测试项目 可以加入 测试用户 或者内部正式用户 + //.WhereIf(trialType == TrialType.NoneOfficial, t => t.IsTestUser == true || (t.IsTestUser == false && t.IsZhiZhun)) @@ -149,7 +150,6 @@ namespace IRaCIS.Application.Services //[TrialAudit(AuditType.TrialAudit, AuditOptType.AddTrialStaff)] [HttpPost] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.PM_APM)] public async Task AddTrialUsers(TrialUserAddCommand[] userTrialCommands) { @@ -157,12 +157,48 @@ namespace IRaCIS.Application.Services var trialUsers = await _trialUseRepository.AddRangeAsync(addArray); + + var trialReadingCriterionId = _repository.Where(t => t.CriterionType == CriterionType.RECIST1Pointt1 && t.TrialId == addArray.First().TrialId).Select(t => t.Id).FirstOrDefault(); + foreach (var item in trialUsers) { item.JoinTime = DateTime.Now; + + + #region 添加IR + + + var trialId = item.TrialId; + var userId=item.UserId; + if (await _repository.AnyAsync(t => t.Id == item.UserId && t.UserTypeRole.UserTypeEnum == UserTypeEnum.IndependentReviewer)) + { + + var enroll = await _repository.AddAsync(new Enroll() { TrialId=trialId,DoctorUserId=userId,DoctorId= userId,EnrollStatus=EnrollStatus.ConfirmIntoGroup }); + + await _repository.AddAsync(new EnrollReadingCategory() { EnrollId = enroll.Id, ReadingCategory = ReadingCategory.Visit, TrialReadingCriterionId = trialReadingCriterionId }); + await _repository.AddAsync(new EnrollReadingCategory() { EnrollId = enroll.Id, ReadingCategory = ReadingCategory.Global, TrialReadingCriterionId = trialReadingCriterionId }); + + //if (!await _repository.AnyAsync(t => t.TrialId == trialId && t.DoctorUserId == userId && t.EnrollId == intoGroupItem.Id, true)) + { + await _repository.AddAsync(new TaskAllocationRule() { TrialId = trialId, DoctorUserId = userId, EnrollId = enroll.Id ,IsEnable=true}); + } + } + + #endregion + + + #region 自动添加CRC 到Site 里 + if (await _repository.AnyAsync(t => t.Id == item.UserId && t.UserTypeRole.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)) + { + await _repository.AddAsync(new TrialSiteUser() { TrialId = trialId, SiteId = Guid.Parse("db83e2f5-1f2e-408f-a45b-08d8e1dcace0"), UserId =item.UserId }); + } + #endregion + } + + var success = await _repository.SaveChangesAsync(); return ResponseOutput.Result(success); @@ -182,10 +218,10 @@ namespace IRaCIS.Application.Services if (updateTrialUserCommand.IsDeleted) { - if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) - { - return ResponseOutput.NotOk("Participant has participated in site maintenance"); - } + //if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) + //{ + // return ResponseOutput.NotOk("Participant has participated in site maintenance"); + //} if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) { @@ -217,10 +253,10 @@ namespace IRaCIS.Application.Services if (trialUser == null) return Null404NotFound(trialUser); - if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) - { - return ResponseOutput.NotOk("Participant has participated in site maintenance"); - } + //if (await _repository.AnyAsync(t => t.UserId == trialUser.UserId && t.TrialId == trialUser.TrialId)) + //{ + // return ResponseOutput.NotOk("Participant has participated in site maintenance"); + //} if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC && isDelete) { diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs index f9fbf7cc..ddf3510d 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialService.cs @@ -9,6 +9,8 @@ using IRaCIS.Core.Infrastructure; using Microsoft.Extensions.Options; using static IRaCIS.Core.Domain.Share.StaticData; using Microsoft.AspNetCore.Authorization; +using IRaCIS.Core.Domain.Models; +using MassTransit; namespace IRaCIS.Application.Services { @@ -48,7 +50,7 @@ namespace IRaCIS.Application.Services var multiCriteriaSelectCount = searchParam.CriterionIds.Count; var multiReviewTypeSelectCount = searchParam.ReviewTypeIds.Count; - var query = _trialRepository.AsQueryable().IgnoreQueryFilters() + var query = _trialRepository.AsQueryable() .WhereIf(!string.IsNullOrEmpty(searchParam.TrialStatusStr), o => o.TrialStatusStr.Contains(searchParam.TrialStatusStr)) .WhereIf(searchParam.SponsorId != null, o => o.SponsorId == searchParam.SponsorId) .WhereIf(searchParam.Expedited != null, o => o.Expedited == searchParam.Expedited) @@ -56,6 +58,8 @@ namespace IRaCIS.Application.Services .WhereIf(!string.IsNullOrWhiteSpace(searchParam.Indication), o => o.Indication.Contains(searchParam.Indication)) .WhereIf(!string.IsNullOrEmpty(searchParam.ResearchProgramNo), o => o.ResearchProgramNo.Contains(searchParam.ResearchProgramNo)) .WhereIf(!string.IsNullOrWhiteSpace(searchParam.ExperimentName), o => o.ExperimentName.Contains(searchParam.ExperimentName)) + .WhereIf(!string.IsNullOrWhiteSpace(searchParam.HeadPI), o => o.HeadPI.Contains(searchParam.HeadPI)) + .WhereIf(searchParam.PhaseId != null, o => o.PhaseId == searchParam.PhaseId) .WhereIf(searchParam.DeclarationTypeId != null, o => o.DeclarationTypeId == searchParam.DeclarationTypeId) .WhereIf(searchParam.IndicationTypeId != null, o => o.IndicationTypeId == searchParam.IndicationTypeId) @@ -131,15 +135,9 @@ namespace IRaCIS.Application.Services /// /// [NonDynamicMethod] - public virtual async Task> AddOrUpdateTrial(TrialCommand trialAddModel) + public virtual async Task> AddOrUpdateTrial(TrialCommand trialAddModel, ITrialConfigService _ITrialConfigService) { - // 到时候 策略授权 统一改 归类 - if (!(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin)) - { - throw new BusinessValidationFailedException("只有PM/APM拥有操作权限!"); - } - //测试用户 只能创建非正式项目 if (_userInfo.IsTestUser && trialAddModel.TrialType != TrialType.NoneOfficial) { @@ -157,14 +155,12 @@ namespace IRaCIS.Application.Services var currentYearMaxCodeNext = dbMaxCode + 1; - //var test = _trialRepository.Where(t => t.CreateTime.Year == DateTime.Now.Year + 1).Select(t => t.Code).DefaultIfEmpty(1).ToList(); var trial = _mapper.Map(trialAddModel); - //trial.Id = NewId.NextGuid(); var yearStr = DateTime.Now.Year.ToString(); trial.Code = currentYearMaxCodeNext; - trial.TrialCode = (trial.TrialType == TrialType.NoneOfficial ? "T0" : yearStr.Substring(yearStr.Length - 2)) + trial.TrialCode + currentYearMaxCodeNext.ToString("D3"); + trial.TrialCode = (trial.TrialType == TrialType.NoneOfficial ? "T0" : yearStr.Substring(yearStr.Length - 2)) + "000" + currentYearMaxCodeNext.ToString("D3"); //多选信息 @@ -179,8 +175,72 @@ namespace IRaCIS.Application.Services //状态变更详细表 trial.ClinicalTrialProjectDetails.Add(new TrialStatusDetail() { TrialId = trial.Id, TrialStatus = (int)TrialEnrollStatus.ChooseDoctor }); + #region 设置默认值 + + trial.IsNoticeSubjectCodeRule = false; + + //临床信息传输 + trial.ClinicalInformationTransmissionEnum = 0; + //影像质控流程 + trial.QCProcessEnum = TrialQCProcess.NotAudit; + + trial.IsImageConsistencyVerification = false; + trial.IsVerifyVisitImageDate = false; + trial.IsTrialProcessConfirmed = true; + trial.IsTrialBasicLogicConfirmed = true; + trial.IsTrialUrgentConfirmed = true; + + trial.VisitPlanConfirmed = true; + + trial.IsHaveFirstGiveMedicineDate = false; + + trial.TrialStatusStr = StaticData.TrialState.TrialOngoing; + + trial.BlindBaseLineName = "Batch 1"; + trial.BlindBaseLineName = "Batch "; + #endregion + + + + trial = await _trialRepository.AddAsync(trial); + + + List needAddCriterionList = + await _repository.Where(x => x.IsEnable && x.CriterionType == CriterionType.RECIST1Pointt1).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + needAddCriterionList.ForEach(x => + { + x.TrialId = trial.Id; + x.ReadingQuestionCriterionSystemId = x.Id; + x.Id = NewId.NextGuid(); + + //手动选择 + x.IsConfirm = true; + x.IsSigned = true; + x.ReadingInfoSignTime = DateTime.Now; + + //阅片平台 + x.ImagePlatform = ImagePlatform.PACS; + x.ReadingTool = ReadingTool.Dicom; + x.ReadingType = ReadingMethod.Single; + + x.IsReadingPeriod = false; + x.IsGlobalReading = false; + x.IsArbitrationReading = false; + x.IsOncologyReading = false; + x.IsReadingTaskViewInOrder = true; + x.ReadingTaskViewEnum = ReadingTaskViewMethod.Subject; + x.IsReadingShowSubjectInfo = true; + x.IsReadingShowPreviousResults = true; + x.DigitPlaces = 1; + x.IseCRFShowInDicomReading = false; + }); + + + var cretrion= await _repository.AddAsync(needAddCriterionList.FirstOrDefault()); + //如果是PM, 则需要将该人员添加到 运维人员表 //添加运维人员PM await _repository.AddAsync(new TrialUser() { TrialId = trial.Id, UserId = _userInfo.Id, JoinTime = DateTime.Now }); @@ -188,14 +248,24 @@ namespace IRaCIS.Application.Services // 添加扩展信息表记录 await _repository.AddAsync(new TrialPaymentPrice() { TrialId = trial.Id }); - //添加访视 - await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 0, BlindName = "B" + 0.ToString("D3"), VisitDay = 0, VisitName = "Baseline", IsBaseLine = true }); - await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 1, BlindName = "B" + 10.ToString("D3"), VisitDay = 30, VisitName = "Visit 1" }); + //添加检查批次 + await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 0, BlindName = "B" + 0.ToString("D3"), VisitDay = 0, VisitName = "Batch 1", IsBaseLine = true,IsConfirmed=true,IsHaveFirstConfirmed=true ,VisitWindowLeft=-3,VisitWindowRight=28 }); + await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 1, BlindName = "B" + 10.ToString("D3"), VisitDay = 30, VisitName = "Batch 2", IsConfirmed = true, IsHaveFirstConfirmed = true, VisitWindowLeft = -3, VisitWindowRight = 3 }); + await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 2, BlindName = "B" + 20.ToString("D3"), VisitDay = 60, VisitName = "Batch 3", IsConfirmed = true, IsHaveFirstConfirmed = true, VisitWindowLeft = -3, VisitWindowRight = 3 }); + await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 3, BlindName = "B" + 30.ToString("D3"), VisitDay = 90, VisitName = "Batch 4", IsConfirmed = true, IsHaveFirstConfirmed = true, VisitWindowLeft = -3, VisitWindowRight = 3 }); + await _repository.AddAsync(new VisitStage { TrialId = trial.Id, VisitNum = 4, BlindName = "B" + 40.ToString("D3"), VisitDay = 120, VisitName = "Batch 5", IsConfirmed = true, IsHaveFirstConfirmed = true, VisitWindowLeft = -3, VisitWindowRight = 3 }); + + + //添加trialSite + await _repository.AddAsync(new TrialSite() { TrialId = trial.Id, TrialSiteAliasName = "MDT Site", TrialSiteCode = "01", SiteId = Guid.Parse("db83e2f5-1f2e-408f-a45b-08d8e1dcace0") }); var success = await _repository.SaveChangesAsync(); - _provider.Set(trial.Id.ToString(), StaticData.TrialState.TrialInitializing, TimeSpan.FromDays(7)); + _provider.Set(trial.Id.ToString(), StaticData.TrialState.TrialOngoing, TimeSpan.FromDays(7)); + + await _ITrialConfigService.AsyncTrialCriterionDictionary(new Core.Application.Contracts.AsyncTrialCriterionDictionaryInDto() { TrialReadingCriterionId = cretrion.Id }); + return ResponseOutput.Ok(trial); } @@ -237,6 +307,7 @@ namespace IRaCIS.Application.Services _mapper.Map(updateModel, trial); var success = await _repository.SaveChangesAsync(); + return ResponseOutput.Ok(trial); } @@ -362,7 +433,7 @@ namespace IRaCIS.Application.Services //if (trial.VisitPlanConfirmed) //{ - // return ResponseOutput.NotOk("Trial访视计划已经确认,无法删除"); + // return ResponseOutput.NotOk("Trial检查批次计划已经确认,无法删除"); //} //if (await _repository.AnyAsync(u => u.TrialId == trialId)) @@ -398,135 +469,134 @@ namespace IRaCIS.Application.Services - var success = await _repository.BatchDeleteAsync(o => o.SubjectVisit.TrialId == trialId) || - await _repository.BatchDeleteAsync(o => o.TrialId == trialId) || - await _repository.BatchDeleteAsync(o => o.TrialId == trialId) || - - - await _repository.BatchDeleteAsync(o => o.TrialReadingCriterion.TrialId == trialId) || - await _repository.BatchDeleteAsync(o => o.TrialReadingCriterion.TrialId == trialId) || + var success = await _repository.BatchDeleteAsync(o => o.SubjectVisit.TrialId == trialId); + await _repository.BatchDeleteAsync(o => o.TrialId == trialId); + await _repository.BatchDeleteAsync(o => o.TrialId == trialId); - await _repository.BatchDeleteAsync(o => o.TrialId == trialId) || + await _repository.BatchDeleteAsync(o => o.TrialReadingCriterion.TrialId == trialId); + await _repository.BatchDeleteAsync(o => o.TrialReadingCriterion.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.Enroll.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(o => o.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.NoneDicomStudy.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.Enroll.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.NoneDicomStudy.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.SubjectVisit.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.QCChallenge.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.QCChallenge.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.ReadingClinicalData.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.ReadingClinicalData.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TaskMedicalReview.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TaskMedicalReview.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TaskMedicalReview.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TaskMedicalReview.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.VisitTask.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.ReadingPeriodSet.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.VisitTask.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.ReadingPeriodSet.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.VisitTask.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.VisitTask.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.Subject.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.Subject.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.InfluenceTask.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.InfluenceTask.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(o => o.Id == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialReadingCriterion.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialReadingCriterion.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialDocument.TrialId == trialId) || + await _repository.BatchDeleteAsync(o => o.Id == trialId); + await _repository.BatchDeleteAsync(t => t.TrialReadingCriterion.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialReadingCriterion.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialDocument.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialDocument.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialDocument.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); - //await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + //await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialEmailNoticeConfig.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialSiteSurvey.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialSiteSurvey.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialSiteSurvey.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialSiteSurvey.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); - await _repository.BatchDeleteAsync(t => t.OriginalReReadingTask.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) || - await _repository.BatchDeleteAsync(t => t.TrialId == trialId) + await _repository.BatchDeleteAsync(t => t.OriginalReReadingTask.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); + await _repository.BatchDeleteAsync(t => t.TrialId == trialId); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs index 07548116..ceb4cb2f 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs @@ -177,7 +177,7 @@ namespace IRaCIS.Core.Application.Services } - /// 获取某一Site下面的负责的CRC列表 + /// 获取某一Site下面的负责的IC列表 [HttpGet, Route("{trialId:guid}/{siteId:guid}")] public async Task> GetTrialSiteCRCList(Guid trialId, Guid siteId) { @@ -250,7 +250,7 @@ namespace IRaCIS.Core.Application.Services //if (await _repository.AnyAsync(t => t.TrialId == trialId && t.SiteId == siteId)) //{ - // return ResponseOutput.NotOk("The site has been associated with CRC, and couldn't be deleted."); + // return ResponseOutput.NotOk("The site has been associated with IC, and couldn't be deleted."); //} if (await _repository.AnyAsync(t => t.SiteId == siteId && t.TrialId == trialId)) @@ -284,7 +284,7 @@ namespace IRaCIS.Core.Application.Services - /// 批量添加Site下 CRC的负责人 + /// 批量添加Site下 IC的负责人 [HttpPost] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [Authorize(Policy = IRaCISPolicy.PM_APM)] @@ -298,7 +298,7 @@ namespace IRaCIS.Core.Application.Services return ResponseOutput.Result(true); } - /// 删除CRC人员 + /// 删除IC人员 [HttpDelete, Route("{id:guid}/{trialId:guid}/{isDelete:bool}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [Authorize(Policy = IRaCISPolicy.PM_APM)] @@ -312,14 +312,14 @@ namespace IRaCIS.Core.Application.Services } /// - /// 获取项目下的 site 下拉框数据 CRC只看到他负责的 + /// 获取项目下的 site 下拉框数据 IC只看到他负责的 /// /// /// [HttpGet("{trialId:guid}")] public async Task> GetTrialSiteSelect(Guid trialId) { - //CRC只看到他负责的 + //IC只看到他负责的 var list = await _trialSiteRepository.Where(t => t.TrialId == trialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.CRCUserList.Any(t => t.UserId == _userInfo.Id)) @@ -332,7 +332,7 @@ namespace IRaCIS.Core.Application.Services public async Task> GetTrialSiteCodeSelect(Guid trialId, bool isIncludeVirtualSite = true) { - //CRC只看到他负责的 + //IC只看到他负责的 var list = await _trialSiteRepository.Where(t => t.TrialId == trialId) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.CRCUserList.Any(t => t.UserId == _userInfo.Id)) @@ -360,7 +360,7 @@ namespace IRaCIS.Core.Application.Services if (await _repository.AnyAsync(t => t.TrialId == trialId && t.SiteId == siteId)) { - return ResponseOutput.NotOk("The site has been associated with CRC, and couldn't be deleted."); + return ResponseOutput.NotOk("The site has been associated with IC, and couldn't be deleted."); } if (await _repository.AnyAsync(t => t.SiteId == siteId && t.TrialId == trialId)) diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs index ad5c5892..a4c83fd7 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs @@ -21,26 +21,25 @@ namespace IRaCIS.Application.Services } /// - /// 添加或更新受试者信息[New] + /// 添加或更新患者信息[New] /// - /// state:1-访视中,2-出组。0-全部 + /// state:1-检查批次中,2-出组。0-全部 /// [TrialAudit(AuditType.SubjectAudit, AuditOptType.AddOrUpdateSubject)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.PM_APM_CRC_QC)] public async Task> AddOrUpdateSubject([FromBody] SubjectCommand subjectCommand) { var svlist = new List(); if (await _repository.AnyAsync(t => t.Id == subjectCommand.TrialId && !t.VisitPlanConfirmed)) { - return ResponseOutput.NotOk("项目访视计划没有确认。请联系项目经理确认项目访视计划后,再添加受试者。"); + return ResponseOutput.NotOk("项目检查批次计划没有确认。请联系项目经理确认项目检查批次计划后,再添加患者。"); } var verifyExp1 = new EntityVerifyExp() { VerifyExp = u => u.Code == subjectCommand.Code && u.TrialId == subjectCommand.TrialId, - VerifyMsg = "已存在具有相关受试者编号的受试者。" + VerifyMsg = "已存在具有相关患者编号的患者。" }; @@ -73,7 +72,6 @@ namespace IRaCIS.Application.Services [HttpPut] [UnitOfWork] - [Authorize(Policy = IRaCISPolicy.PM_APM_CRC_QC)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task UpdateSubjectStatus(SubjectStatusChangeCommand subjectStatusChangeCommand) { @@ -85,13 +83,12 @@ namespace IRaCIS.Application.Services [HttpDelete("{trialId:guid}/{id:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [UnitOfWork] - [Authorize(Policy = IRaCISPolicy.PM_APM_CRC)] public async Task DeleteSubject(Guid id) { if (await _subjectVisitRepository.AnyAsync(u => u.SubjectId == id && u.VisitExecuted == VisitExecutedEnum.Executed)) { - return ResponseOutput.NotOk("该受试者已经有访视已经上传影像,不允许删除。"); + return ResponseOutput.NotOk("该患者已经有检查批次已经上传影像,不允许删除。"); } await _subjectRepository.UpdatePartialFromQueryAsync(id, x => new Subject @@ -108,8 +105,8 @@ namespace IRaCIS.Application.Services return ResponseOutput.Result(isSuccess); } - /// 分页获取受试者列表[New] - /// /// state:1-访视中,2-出组。0-全部 + /// 分页获取患者列表[New] + /// /// state:1-检查批次中,2-出组。0-全部 [HttpPost] public async Task, TrialSubjectConfig>> GetSubjectList(SubjectQueryParam param) { @@ -120,7 +117,7 @@ namespace IRaCIS.Application.Services .WhereIf(!string.IsNullOrWhiteSpace(param.Sex), t => t.Sex.Contains(param.Sex)) .WhereIf(param.Status != null, t => t.Status == param.Status) .WhereIf(param.SiteId != null, t => t.SiteId == param.SiteId) - // CRC 只负责他管理site的受试者 + // IC 只负责他管理site的患者 .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .ProjectTo(_mapper.ConfigurationProvider); @@ -136,7 +133,7 @@ namespace IRaCIS.Application.Services /// - /// 计划外访视 获取受试者选择下拉框列表 + /// 计划外检查批次 获取患者选择下拉框列表 /// [HttpGet("{siteId:guid}/{trialId:guid}")] public List GetSubjectListBySiteId(Guid siteId, Guid trialId) diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs index f1e9dfd6..c0114583 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs @@ -62,27 +62,26 @@ namespace IRaCIS.Core.Application.Services [HttpPost] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [UnitOfWork] - [Authorize(Policy = IRaCISPolicy.CRC)] public async Task> AddOrUpdateSV(SubjectVisitCommand svCommand) { var verifyExp1 = new EntityVerifyExp() { VerifyExp = t => t.VisitNum == svCommand.VisitNum && t.SubjectId == svCommand.SubjectId, - VerifyMsg = "该受试者的访视计划中已经包含一个具有相同访视号的访视。" + VerifyMsg = "该患者的检查批次计划中已经包含一个具有相同检查批次号的检查批次。" }; var verifyExp2 = new EntityVerifyExp() { VerifyExp = t => t.SubjectId == svCommand.SubjectId && t.IsFinalVisit, - VerifyMsg = "该受试者已经有访视设置为末次访视,不允许将当前访视设置为末次访视。", + VerifyMsg = "该患者已经有检查批次设置为末次检查批次,不允许将当前检查批次设置为末次检查批次。", IsVerify = svCommand.IsFinalVisit }; var verifyExp3 = new EntityVerifyExp() { VerifyExp = t => t.SubjectId == svCommand.SubjectId && t.VisitName == svCommand.VisitName, - VerifyMsg = "该受试者的访视计划中已经包含一个具有相同访视名称的访视。" + VerifyMsg = "该患者的检查批次计划中已经包含一个具有相同检查批次名称的检查批次。" }; @@ -97,24 +96,24 @@ namespace IRaCIS.Core.Application.Services if (svCommand.Id == null) { - //设置末次评估后,不允许添加计划外访视 + //设置末次评估后,不允许添加计划外检查批次 if (svCommand.InPlan == false) { if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == svCommand.SubjectId && t.IsFinalVisit)) { - throw new BusinessValidationFailedException("设置末次评估后,不允许添加计划外访视。"); + throw new BusinessValidationFailedException("设置末次评估后,不允许添加计划外检查批次。"); } if (await _repository.AnyAsync(t => t.SubjectId == svCommand.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum > svCommand.VisitNum && t.SignTime != null && t.TrialReadingCriterion.IsReadingTaskViewInOrder)) { - throw new BusinessValidationFailedException("该受试者后续访视已有任务完成阅片(有序阅片标准),不允许在此添加,如果确实需要,请回退"); + throw new BusinessValidationFailedException("该患者后续检查批次已有任务完成阅片(有序阅片标准),不允许在此添加,如果确实需要,请回退"); } } dbBeforeEntity = await _subjectVisitRepository.InsertFromDTOAsync(svCommand, false, verifyExp1, verifyExp2, verifyExp3); - //var cRCClinicalDataIds = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == svCommand.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.SubjectVisit) + //var cRCClinicalDataIds = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == svCommand.TrialId && x.UploadRole == UploadRole.IC && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.SubjectVisit) //.Select(x => x.Id).ToListAsync(); @@ -139,19 +138,19 @@ namespace IRaCIS.Core.Application.Services if (svCommand.PDState != dbBeforeEntity.PDState && dbBeforeEntity.SubmitState == SubmitStateEnum.Submitted) { - throw new BusinessValidationFailedException("当前访视影像提交后,不允许修改PD确认状态。"); + throw new BusinessValidationFailedException("当前检查批次影像提交后,不允许修改PD确认状态。"); } if (svCommand.PDState != dbBeforeEntity.PDState && dbBeforeEntity.RequestBackState == RequestBackStateEnum.PM_AgressBack) { - throw new BusinessValidationFailedException("当前访视为回退的访视,不允许修改PD确认状态。"); + throw new BusinessValidationFailedException("当前检查批次为回退的检查批次,不允许修改PD确认状态。"); } if (svCommand.IsLostVisit) { if (await _subjectVisitRepository.AnyAsync(t => t.Id == svCommand.Id && t.SubmitState == SubmitStateEnum.ToSubmit)) { - throw new BusinessValidationFailedException("当前访视已经有有影像上传,不允许设置为失访。"); + throw new BusinessValidationFailedException("当前检查批次已经有有影像上传,不允许设置为失访。"); } } @@ -159,7 +158,7 @@ namespace IRaCIS.Core.Application.Services } - //更新受试者 访视基准日期 是否入组确认 + //更新患者 检查批次基准日期 是否入组确认 if (svCommand.SubjectFirstGiveMedicineTime != null && svCommand.IsBaseLine) { @@ -183,7 +182,6 @@ namespace IRaCIS.Core.Application.Services [HttpPut("{trialId:guid}/{subjectVisitId:guid}/{isUrgent:bool}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.PM_IQC)] public async Task SetSubjectVisitUrgent(Guid subjectVisitId, bool isUrgent) { await _subjectVisitRepository.UpdatePartialFromQueryAsync(subjectVisitId, u => new SubjectVisit() { IsUrgent = isUrgent }, true); @@ -195,20 +193,19 @@ namespace IRaCIS.Core.Application.Services [HttpDelete, Route("{trialId:guid}/{id:guid}")] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - [Authorize(Policy = IRaCISPolicy.CRC)] public async Task DeleteSV(Guid id) { if (await _repository.AnyAsync(t => t.SubjectVisitId == id)) { - return ResponseOutput.NotOk("当前访视已经有影像上传,不允许删除。"); + return ResponseOutput.NotOk("当前检查批次已经有影像上传,不允许删除。"); } if (await _subjectVisitRepository.AnyAsync(t => t.Id == id && t.InPlan)) { - return ResponseOutput.NotOk("计划内的访视不允许删除。"); + return ResponseOutput.NotOk("计划内的检查批次不允许删除。"); } if (await _subjectVisitRepository.AnyAsync(t => t.OutPlanPreviousVisitId == id)) { - return ResponseOutput.NotOk("当前访视已经被设置为另一访视的上一访视,不允许删除。"); + return ResponseOutput.NotOk("当前检查批次已经被设置为另一检查批次的上一检查批次,不允许删除。"); } await _subjectVisitRepository.DeleteFromQueryAsync(s => s.Id == id, true); @@ -219,7 +216,7 @@ namespace IRaCIS.Core.Application.Services /// - /// 获取访视下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 + /// 获取检查批次下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 /// /// /// @@ -298,7 +295,7 @@ namespace IRaCIS.Core.Application.Services } /// - /// 获取访视下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 + /// 获取检查批次下的Dicom 检查信息 分所有的, 阅片的 不阅片 isReading : 0 查询所有 1 查询仅仅阅片的 /// /// /// @@ -541,7 +538,7 @@ namespace IRaCIS.Core.Application.Services /// - /// 设置受试者访视已执行 也就是将studyUploaded状态置为true 为了那些没有影像 人工设置准备 + /// 设置患者检查批次已执行 也就是将studyUploaded状态置为true 为了那些没有影像 人工设置准备 /// /// /// diff --git a/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs b/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs index ddcc327a..bc4e2634 100644 --- a/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs +++ b/IRaCIS.Core.Application/Service/Visit/VisitPlanService.cs @@ -38,7 +38,7 @@ namespace IRaCIS.Application.Services ///暂时不用 - /// 获取项目访视计划 + /// 获取项目检查批次计划 [HttpPost] public async Task> GetTrialVisitStageList(VisitPlanQueryDTO param) { @@ -51,7 +51,7 @@ namespace IRaCIS.Application.Services } - /// 根据项目Id,获取项目访视计划(不分页)[New] + /// 根据项目Id,获取项目检查批次计划(不分页)[New] [HttpGet("{trialId:guid}")] public async Task GetVisitStageList(Guid trialId) { @@ -86,7 +86,7 @@ namespace IRaCIS.Application.Services } /// - /// 获取访视计划下拉框列表 + /// 获取检查批次计划下拉框列表 /// /// /// @@ -100,7 +100,7 @@ namespace IRaCIS.Application.Services } - /// 添加或更新访视计划某项 + /// 添加或更新检查批次计划某项 [UnitOfWork] [HttpPost] [Authorize(Policy = IRaCISPolicy.PM_APM)] @@ -128,7 +128,7 @@ namespace IRaCIS.Application.Services //比当前 visitNum小的 visitDay的最大值 还小 不允许添加 if (visitPlan.VisitDay <= visitPlanList.Where(t => t.VisitNum < visitPlan.VisitNum).Select(t => t.VisitDay).Max()) { - throw new BusinessValidationFailedException("访视计划中,访视号大的访视,其访视间隔也应该比访视号小的访视大。"); + throw new BusinessValidationFailedException("检查批次计划中,检查批次号大的检查批次,其检查批次间隔也应该比检查批次号小的检查批次大。"); } } @@ -137,7 +137,7 @@ namespace IRaCIS.Application.Services { if (visitPlan.VisitDay >= visitPlanList.Where(t => t.VisitNum > visitPlan.VisitNum).Select(t => t.VisitDay).Min()) { - throw new BusinessValidationFailedException("访视计划中,访视号大的计划访视,其访视间隔也应该比访视号小的计划访视大。"); + throw new BusinessValidationFailedException("检查批次计划中,检查批次号大的计划检查批次,其检查批次间隔也应该比检查批次号小的计划检查批次大。"); } } @@ -148,12 +148,12 @@ namespace IRaCIS.Application.Services if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && (t.VisitName == visitPlan.VisitName || t.VisitNum == visitPlan.VisitNum), true)) { - throw new BusinessValidationFailedException("访视计划中已经存在具有项目访视名称或者访视号的计划访视模板。"); + throw new BusinessValidationFailedException("检查批次计划中已经存在具有项目检查批次名称或者检查批次号的计划检查批次模板。"); } if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && t.IsBaseLine, true) && visitPlan.IsBaseLine) { - throw new BusinessValidationFailedException("访视计划中已经存在基线。"); + throw new BusinessValidationFailedException("检查批次计划中已经存在基线。"); } //不用前端传递的值 @@ -171,12 +171,12 @@ namespace IRaCIS.Application.Services if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && (t.VisitName == visitPlan.VisitName || t.VisitNum == visitPlan.VisitNum) && t.Id != visitPlan.Id, true)) { - throw new BusinessValidationFailedException("访视计划中已经存在具有项目访视名称或者访视号的计划访视模板。"); + throw new BusinessValidationFailedException("检查批次计划中已经存在具有项目检查批次名称或者检查批次号的计划检查批次模板。"); } if (await _visitStageRepository.AnyAsync(t => t.TrialId == visitPlan.TrialId && t.IsBaseLine && t.Id != visitPlan.Id, true) && visitPlan.IsBaseLine) { - throw new BusinessValidationFailedException("访视计划中已经存在基线。"); + throw new BusinessValidationFailedException("检查批次计划中已经存在基线。"); } visitPlan.IsConfirmed = false; @@ -189,7 +189,7 @@ namespace IRaCIS.Application.Services { if (await _repository.Where(t => t.TrialId == visitPlan.TrialId).AnyAsync(v => v.IsBaseLine && v.SubmitState >= SubmitStateEnum.ToSubmit)) { - throw new BusinessValidationFailedException("有受试者的基线已经上传了影像数据,不允许修改基线访视。"); + throw new BusinessValidationFailedException("有患者的基线已经上传了影像数据,不允许修改基线检查批次。"); } } @@ -223,7 +223,7 @@ namespace IRaCIS.Application.Services if (!await _trialRepository.AnyAsync(t => t.Id == trialId && t.IsTrialBasicLogicConfirmed && t.IsTrialProcessConfirmed && t.IsTrialUrgentConfirmed)) { - return ResponseOutput.NotOk("项目配置未确认,不允许确认访视计划"); + return ResponseOutput.NotOk("项目配置未确认,不允许确认检查批次计划"); } var svList = await _visitStageRepository.Where(t => t.TrialId == trialId).Select(u => new { u.VisitDay, u.IsBaseLine }).ToListAsync(); @@ -234,7 +234,7 @@ namespace IRaCIS.Application.Services } - //更新项目访视计划状态为已确认 必定生成更新的sql 通过状态改变 触发操作 + //更新项目检查批次计划状态为已确认 必定生成更新的sql 通过状态改变 触发操作 //await _trialRepository.UpdatePartialNowNoQueryAsync(trialId, t => new Trial() { VisitPlanConfirmed = true }); @@ -246,9 +246,9 @@ namespace IRaCIS.Application.Services trial.VisitPlanConfirmed = true; - #region 统一给Subject 增加访视任务 + #region 统一给Subject 增加检查批次任务 - //首次确认时 IsHaveFirstConfirmed都为false 不需要给Subject 加访视 + //首次确认时 IsHaveFirstConfirmed都为false 不需要给Subject 加检查批次 if (initTrialVisitPlanConfirmed) { List subjectVisits = new List(); @@ -269,7 +269,7 @@ namespace IRaCIS.Application.Services svItem.SiteId = subject.SiteId; svItem.SubjectId = subject.SubjectId; - //设置了末次访视,那么加访视计划的时候,设置为不可用 + //设置了末次检查批次,那么加检查批次计划的时候,设置为不可用 if (subjectSVS.Any(t => t.SubjectId == svItem.SubjectId && t.IsFinalVisit)) { svItem.VisitExecuted = VisitExecutedEnum.Unavailable; @@ -295,9 +295,9 @@ namespace IRaCIS.Application.Services - #region 访视计划修改 影响检查 + #region 检查批次计划修改 影响检查 - //找到访视计划修改的Item + //找到检查批次计划修改的Item var changedList = await _visitStageRepository.Where(t => t.TrialId == trial.Id && t.IsConfirmed == false) .Select(t => new { @@ -320,7 +320,7 @@ namespace IRaCIS.Application.Services foreach (var changedItem in changedList) { - //找到该项目 访视已经执行,并且配置了有首次给药日期 并且更新后超窗的访视,要把超窗之前的值也要查询出来 + //找到该项目 检查批次已经执行,并且配置了有首次给药日期 并且更新后超窗的检查批次,要把超窗之前的值也要查询出来 var qcPassedVisitList = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.VisitExecuted == VisitExecutedEnum.Executed && t.AuditState == AuditStateEnum.QCPassed @@ -432,7 +432,7 @@ namespace IRaCIS.Application.Services - //变更某一访视计划Item 受试者访视相关字段 + //变更某一检查批次计划Item 患者检查批次相关字段 await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.VisitStageId == changedItem.Id, k => new SubjectVisit() { IsBaseLine = changedItem.IsBaseLine, @@ -451,7 +451,7 @@ namespace IRaCIS.Application.Services - //访视计划 整体状态变更为 确认 + //检查批次计划 整体状态变更为 确认 await _visitStageRepository.UpdatePartialFromQueryAsync(u => u.TrialId == trialId && u.IsConfirmed == false, t => new VisitStage() { IsConfirmed = true, IsHaveFirstConfirmed = true }); await _visitStageRepository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Application/Service/WorkLoad/DTO/DoctorWorkLoadViewModel.cs b/IRaCIS.Core.Application/Service/WorkLoad/DTO/DoctorWorkLoadViewModel.cs index fe2a4b76..f5d45090 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/DTO/DoctorWorkLoadViewModel.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/DTO/DoctorWorkLoadViewModel.cs @@ -271,9 +271,9 @@ namespace IRaCIS.Application.Contracts public List CriterionReadingCategoryList { get; set; } //任务阅片状态 - public List ReadingTaskStateList { get; set; } + public List ReadingTaskStateList { get; set; }=new List(); - public List CriterionFileList { get; set; } + public List CriterionFileList { get; set; }=new List(); public List CriterionCategoryList => diff --git a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs index 38a259d4..a7dbde1f 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs @@ -206,8 +206,9 @@ namespace IRaCIS.Application.Services var doctorIntoGroupQueryable = from intoGroup in _enrollRepository.Where(x => x.TrialId == trialId && x.EnrollStatus >= EnrollStatus.ConfirmIntoGroup) - join allocateRule in _taskAllocationRuleRepository.AsQueryable() on intoGroup.Id equals allocateRule.EnrollId - join doctor in _doctorRepository.AsQueryable() on intoGroup.DoctorId equals doctor.Id + join allocateRule in _taskAllocationRuleRepository.AsQueryable() on intoGroup.Id equals allocateRule.EnrollId + + join attachmentItem in _attachmentRepository.AsQueryable() on intoGroup.AttachmentId equals attachmentItem.Id into cc from attachment in cc.DefaultIfEmpty() @@ -222,32 +223,7 @@ namespace IRaCIS.Application.Services CriterionReadingCategoryList =intoGroup.EnrollReadingCategoryList.Select(t=>new TrialCriterionReadingCategory() { EnrollId=t.EnrollId,ReadingCategory=t.ReadingCategory, TrialReadingCriterionId = t.TrialReadingCriterionId }).ToList(), - CriterionFileList = doctor.CriterionFileList.Where(x => x.IsEnable && (x.TrialId==null ||x.TrialId==trialId)).Select(x => new CriterionFile() - { - CriterionType = x.CriterionType, - DoctorId = x.DoctorId, - FileName = x.FileName, - FilePath = x.FilePath, - FileType = x.FileType, - Remark = x.Remark, - TrialReadingCriterionId=x.TrialReadingCriterionId, - Id = x.Id - }).ToList(), - ReadingTaskStateList = doctor.User.VisitTaskList.Where(x => x.TaskState == TaskState.Effect && x.TrialId == trialId).Select(x => new DoctorUserTask() - { - ReadingTaskState = x.ReadingTaskState, - TrialReadingCriterionId=x.TrialReadingCriterionId, - CriterionType = x.TrialReadingCriterion.CriterionType, - - }).ToList(), - - DoctorId = doctor.Id, - Code = doctor.ReviewerCode, - FirstName = doctor.FirstName, - LastName = doctor.LastName, - FullName = doctor.FullName, - ChineseName = doctor.ChineseName, UserName= intoGroup.DoctorUser.UserName, OutEnrollTime = intoGroup.OutEnrollTime, diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 3b9590c2..8e4225f9 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -1,5 +1,4 @@ -using BeetleX.BNR; -using IRaCIS.Core.Application.Service; +using IRaCIS.Core.Application.Service; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using Microsoft.AspNetCore.Authorization; diff --git a/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs b/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs index e7bb0555..468eddfc 100644 --- a/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/AddSubjectTrigger.cs @@ -6,7 +6,7 @@ using MassTransit; namespace IRaCIS.Core.Application.Triggers { /// - /// 添加访视计划 要给改项目下的所有Subject 添加该访视 + /// 添加检查批次计划 要给改项目下的所有Subject 添加该检查批次 /// public class AddSubjectTrigger : IBeforeSaveTrigger { @@ -40,7 +40,7 @@ namespace IRaCIS.Core.Application.Triggers - //添加受试者的时候,获取访视计划列表,添加到受试者访视表。 + //添加患者的时候,获取检查批次计划列表,添加到患者检查批次表。 var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == subject.TrialId && t.IsConfirmed).ToListAsync(); var svList = _mapper.Map>(visitPlanList); @@ -67,8 +67,8 @@ namespace IRaCIS.Core.Application.Triggers await _subjectVisitRepository.SaveChangesAsync(); - #region 在f访视计划确认的时候处理 给subject添加访视计划 - ////已添加受试者 都不存在该新增的计划名称 那么该项目所有受试者都增加一个访视记录 + #region 在f检查批次计划确认的时候处理 给subject添加检查批次计划 + ////已添加患者 都不存在该新增的计划名称 那么该项目所有患者都增加一个检查批次记录 //if (!await _subjectVisitRepository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId)) //{ // var subjectSVS = await _subjectVisitRepository.Where(t => t.TrialId == visitPlan.TrialId).Select(t => new { t.SubjectId, t.SiteId, t.IsFinalVisit }).Distinct().ToListAsync(); @@ -83,7 +83,7 @@ namespace IRaCIS.Core.Application.Triggers // svItem.SubjectId = subject.SubjectId; // svItem.Id = NewId.NextGuid(); - // //设置了末次访视,那么加访视计划的时候,设置为不可用 + // //设置了末次检查批次,那么加检查批次计划的时候,设置为不可用 // if (subjectSVS.Any(t => t.SubjectId == svItem.SubjectId && t.IsFinalVisit)) // { // svItem.VisitExecuted = VisitExecutedEnum.Unavailable; diff --git a/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs b/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs index 24431b77..1ec912f0 100644 --- a/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/ChallengeStateTrigger.cs @@ -4,7 +4,7 @@ using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.Application.Triggers { - //访视 质疑状态 触发修改 + //检查批次 质疑状态 触发修改 public class ChallengeStateTrigger : IAfterSaveTrigger { private readonly IRepository _repository; diff --git a/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs index 7983ca9d..e00a5cdf 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectStateTrigger.cs @@ -43,13 +43,13 @@ namespace IRaCIS.Core.Application.Triggers #region 废弃 - ////如果访视结束了 需要删除计划外未执行的访视 + ////如果检查批次结束了 需要删除计划外未执行的检查批次 //if (mapedSubject.Status == SubjectStatus.EndOfVisit) //{ // await _repository.DeleteFromQueryAsync(t => t.VisitExecuted == VisitExecutedEnum.UnExecuted && t.SubjectId == mapedSubject.Id && t.InPlan == false); //} - ////如果是出组了 将受试者未执行的 设置为不可用 + ////如果是出组了 将患者未执行的 设置为不可用 //if (mapedSubject.Status == SubjectStatus.OutOfEnrollment) //{ // await _repository.UpdateFromQueryAsync(t => t.SubjectId == mapedSubject.Id && t.VisitExecuted == VisitExecutedEnum.UnExecuted, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable }); @@ -67,7 +67,7 @@ namespace IRaCIS.Core.Application.Triggers { throw new BusinessValidationFailedException( - "该受试者已经有访视被设置为末次访视,不允许将当前访视设置为末次访视。"); + "该患者已经有检查批次被设置为末次检查批次,不允许将当前检查批次设置为末次检查批次。"); } var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == dbSubject.FinalSubjectVisitId).IfNullThrowException(); @@ -76,14 +76,14 @@ namespace IRaCIS.Core.Application.Triggers { throw new BusinessValidationFailedException( - "该受试者当前访视后有访视的影像已上传,当前访视不允许设置为末次访视。"); + "该患者当前检查批次后有检查批次的影像已上传,当前检查批次不允许设置为末次检查批次。"); } sv.IsFinalVisit = true; await _subjectVisitRepository.SaveChangesAsync(); - //末次访视后的 访视设置为不可用 + //末次检查批次后的 检查批次设置为不可用 await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable }); } } diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs index 4cd05bdc..1cea4851 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs @@ -9,7 +9,7 @@ using IRaCIS.Core.Infrastructure; namespace IRaCIS.Core.Application.Triggers { /// - /// 处理 访视 末次评估 会影响Subject 状态 + /// 处理 检查批次 末次评估 会影响Subject 状态 /// public class SubjectVisitCheckPassedTrigger : IBeforeSaveTrigger { diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs index 4f966504..f79b2a61 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitFinalVisitTrigger.cs @@ -8,7 +8,7 @@ using MassTransit; namespace IRaCIS.Core.Application.Triggers { /// - /// 处理 访视 末次评估 会影响Subject 状态 + /// 处理 检查批次 末次评估 会影响Subject 状态 /// public class SubjectVisitFinalVisitTrigger : IAfterSaveTrigger { @@ -83,7 +83,7 @@ namespace IRaCIS.Core.Application.Triggers } /// - /// 处理生成阅片期 以及后续访视状态 + /// 处理生成阅片期 以及后续检查批次状态 /// /// /// @@ -94,12 +94,12 @@ namespace IRaCIS.Core.Application.Triggers u => new Subject() { Status = SubjectStatus.OutOfVisit, FinalSubjectVisitId = subjectVisit.Id }); - //末次访视后的 访视设置为不可用 + //末次检查批次后的 检查批次设置为不可用 await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectVisit.SubjectId && t.VisitNum > subjectVisit.VisitNum && t.VisitExecuted == VisitExecutedEnum.UnExecuted, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable }); - #region 末次访视生成阅片器和任务 + #region 末次检查批次生成阅片器和任务 var trialId = subjectVisit.TrialId; @@ -180,7 +180,7 @@ namespace IRaCIS.Core.Application.Triggers if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == subjectVisit.SubjectId && t.VisitNum > subjectVisit.VisitNum && (t.SubmitState == SubmitStateEnum.ToSubmit || t.SubmitState == SubmitStateEnum.Submitted))) { - throw new BusinessValidationFailedException("该受试者已有后续访视已上传影像或已提交,当前访视不允许设置为末次访视。"); + throw new BusinessValidationFailedException("该患者已有后续检查批次已上传影像或已提交,当前检查批次不允许设置为末次检查批次。"); } } diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs index 979c1f77..51d1bede 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs @@ -4,7 +4,7 @@ using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.Application.Triggers { /// - /// 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期 + /// 处理 检查批次 1、提交状态 2、执行状态 3、最早最晚 拍片日期 /// public class SubjectVisitTrigger : IAfterSaveTrigger, IAfterSaveTrigger, IAfterSaveTrigger { @@ -91,7 +91,7 @@ namespace IRaCIS.Core.Application.Triggers public async Task UpdateSubjectVisitSubmitStateAsync(Guid subjectVisitId) { - //一个访视下面有多个检查,所以需要检测 没有的时候才清空 非dicom 是检查文件 不是表记录 + //一个检查批次下面有多个检查,所以需要检测 没有的时候才清空 非dicom 是检查文件 不是表记录 if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList).CountAsync() == 0 && await _subjectVisitRepository.Where(t => t.Id == subjectVisitId) .SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0) diff --git a/IRaCIS.Core.Application/_MediatR/CommandAndQueries/ConsistencyVerificationRequest.cs b/IRaCIS.Core.Application/_MediatR/CommandAndQueries/ConsistencyVerificationRequest.cs index 9e17b0f9..95b00b13 100644 --- a/IRaCIS.Core.Application/_MediatR/CommandAndQueries/ConsistencyVerificationRequest.cs +++ b/IRaCIS.Core.Application/_MediatR/CommandAndQueries/ConsistencyVerificationRequest.cs @@ -77,14 +77,14 @@ namespace IRaCIS.Core.Application.MediatR.CommandAndQueries public string SiteCode { get; set; } = string.Empty; - //[Required(ErrorMessage = "受试者筛选号不能为空")] - [ImporterHeader(Name = "受试者筛选号", AutoTrim = true)] - [ExcelColumnName("受试者筛选号")] + //[Required(ErrorMessage = "患者筛选号不能为空")] + [ImporterHeader(Name = "患者筛选号", AutoTrim = true)] + [ExcelColumnName("患者筛选号")] public string SubjectCode { get; set; } = string.Empty; - //[Required(ErrorMessage = "访视名称不能为空")] - [ImporterHeader(Name = "访视名称", AutoTrim = true)] - [ExcelColumnName("访视名称")] + //[Required(ErrorMessage = "检查批次名称不能为空")] + [ImporterHeader(Name = "检查批次名称", AutoTrim = true)] + [ExcelColumnName("检查批次名称")] public string VisitName { get; set; } = string.Empty; @@ -141,10 +141,10 @@ namespace IRaCIS.Core.Application.MediatR.CommandAndQueries [ExporterHeader(DisplayName = "中心编号")] public string TrialSiteCode { get; set; } = string.Empty; - [ExporterHeader(DisplayName = "受试者")] + [ExporterHeader(DisplayName = "患者")] public string SubjectCode { get; set; } = string.Empty; - [ExporterHeader(DisplayName = "访视名称")] + [ExporterHeader(DisplayName = "检查批次名称")] public string VisitName { get; set; } = string.Empty; [ExporterHeader(DisplayName = "检查时间", Format = "yyyy-mm-dd hh:mm:ss")] diff --git a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs index 927ecf90..a65dc033 100644 --- a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs +++ b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs @@ -88,11 +88,11 @@ namespace IRaCIS.Core.Application.MediatR.Handlers var dbCheckList = _mapper.Map>(dbList); - ////按照数据库数据访视分组 按照数据库的数据 一个个的访视对比 + ////按照数据库数据检查批次分组 按照数据库的数据 一个个的检查批次对比 //var svGroup = dbList.GroupBy(t => new { t.SubjectVisitId, t.SiteCode, t.SubjectCode, t.VisitName }) // .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, g.Key.SubjectVisitId, StudyList = g.ToList() }).ToList(); - //按照Excel数据访视分组 按照数据库的数据 一个个的访视对比 + //按照Excel数据检查批次分组 按照数据库的数据 一个个的检查批次对比 var svExcelGroup = etcList.GroupBy(t => new { t.SiteCode, t.SubjectCode, t.VisitName }) .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, ExcelStudyList = g.ToList() }).ToList(); @@ -100,7 +100,7 @@ namespace IRaCIS.Core.Application.MediatR.Handlers foreach (var sv in svExcelGroup) { - //Excel 的数据 在IRC 中可以找到该访视 + //Excel 的数据 在IRC 中可以找到该检查批次 if (dbCheckList.Any(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName)) { @@ -112,7 +112,7 @@ namespace IRaCIS.Core.Application.MediatR.Handlers StringBuilder dialogMsg = new StringBuilder(); - dialogMsg.Append("您好,根据本系统自动识别,该受试者当前访视在IRC系统中已提交的影像检查情况如下:"); + dialogMsg.Append("您好,根据本系统自动识别,该患者当前检查批次在IRC系统中已提交的影像检查情况如下:"); var num = 0; List paramInfoList = new List(); foreach (var item in dbVisitStudyList) @@ -130,7 +130,7 @@ namespace IRaCIS.Core.Application.MediatR.Handlers var dbSV = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); #region 更换核对的顺序 以Excel 数据为准 注释 - //// 该访视 在EDC Excel中没有任何数据 + //// 该检查批次 在EDC Excel中没有任何数据 //if (etcVisitStudyList.Count == 0) //{ // dialogMsg.AppendLine($"
"); @@ -143,9 +143,9 @@ namespace IRaCIS.Core.Application.MediatR.Handlers // } // dialogMsg.AppendLine($"
"); - // dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); + // dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该检查批次正确的影像检查情况。"); - // dbSV.CheckResult = "当前访视在EDC表中未找到数据,请核对 SubjectCode、 SiteCode 、VisitName 是否和EDC系统保持一致"; + // dbSV.CheckResult = "当前检查批次在EDC表中未找到数据,请核对 SubjectCode、 SiteCode 、VisitName 是否和EDC系统保持一致"; // dbSV.CheckState = CheckStateEnum.CVIng; // dbSV.ForwardState = ForwardStateEnum.ToForward; // dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; @@ -178,7 +178,7 @@ namespace IRaCIS.Core.Application.MediatR.Handlers dialogMsg.AppendLine($"核对EDC数据,完全一致, 审核通过"); - // dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); + // dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该检查批次正确的影像检查情况。"); dbSV.CheckState = CheckStateEnum.CVPassed; dbSV.CheckUserId = _userInfo.Id; dbSV.CheckPassedTime = DateTime.Now; @@ -218,9 +218,9 @@ namespace IRaCIS.Core.Application.MediatR.Handlers } dialogMsg.AppendLine($"
"); - dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); + dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该检查批次正确的影像检查情况。"); - dbSV.CheckResult = "根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:" + String.Join(" | ", dbExceptExcel.Select(t => $"EDC 缺少:{t.StudyDate} {t.Modality} ")) + " | " + dbSV.CheckResult = "根据导入的一致性核查数据,请确认本检查批次以下不一致检查项信息:" + String.Join(" | ", dbExceptExcel.Select(t => $"EDC 缺少:{t.StudyDate} {t.Modality} ")) + " | " + String.Join(" | ", excelExceptDB.Select(t => $"IRC 缺少:{t.StudyDate} {t.Modality}")); //新增一致性核查质疑记录 @@ -228,7 +228,7 @@ namespace IRaCIS.Core.Application.MediatR.Handlers dbSV.CheckState = CheckStateEnum.CVIng; dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; - //讲核查结果发送消息给CRC + //讲核查结果发送消息给IC dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { SubjectVisitId = subjectVisitId, diff --git a/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs b/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs index 2d0cc209..52885dd9 100644 --- a/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs +++ b/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs @@ -4,7 +4,7 @@ namespace IRaCIS.Core.Domain.Share { public enum ReadingCategory { - //访视 + //检查批次 Visit = 1, ////阅片周期 @@ -28,7 +28,7 @@ namespace IRaCIS.Core.Domain.Share public enum GenerateTaskCategory { - //访视 + //检查批次 Visit = 1, ////阅片周期 @@ -238,7 +238,7 @@ namespace IRaCIS.Core.Domain.Share None = 0, /// - /// 访视 + /// 检查批次 /// Visit=1, @@ -265,10 +265,10 @@ namespace IRaCIS.Core.Domain.Share public enum ReadingTaskViewMethod { - //受试者 + //患者 Subject = 0, - //访视/阅片期 + //检查批次/阅片期 ReadingPeriodOrVisit = 2, } @@ -316,7 +316,7 @@ namespace IRaCIS.Core.Domain.Share PDProgress=2, /// - /// 访视加急 + /// 检查批次加急 /// VisitUrgent=3, diff --git a/IRaCIS.Core.Domain.Share/IRaCIS.Core.Domain.Share.csproj b/IRaCIS.Core.Domain.Share/IRaCIS.Core.Domain.Share.csproj index 78fa3b6c..e29721ea 100644 --- a/IRaCIS.Core.Domain.Share/IRaCIS.Core.Domain.Share.csproj +++ b/IRaCIS.Core.Domain.Share/IRaCIS.Core.Domain.Share.csproj @@ -2,12 +2,21 @@ net6.0 + AnyCPU;x64 ..\bin + + ..\bin + + + + ..\bin + + diff --git a/IRaCIS.Core.Domain.Share/QC/CheckChanllengeTypeEnum.cs b/IRaCIS.Core.Domain.Share/QC/CheckChanllengeTypeEnum.cs index d242c1f2..2e4725ee 100644 --- a/IRaCIS.Core.Domain.Share/QC/CheckChanllengeTypeEnum.cs +++ b/IRaCIS.Core.Domain.Share/QC/CheckChanllengeTypeEnum.cs @@ -9,10 +9,10 @@ namespace IRaCIS.Core.Domain.Share //不可用 None = 0, - //CRC 已回复 PM 待回复 + //IC 已回复 PM 待回复 CRCWaitPMReply = 1, - //PM 已回复 CRC 待回复 + //PM 已回复 IC 待回复 PMWaitCRCReply = 2, Closed = 3 diff --git a/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs b/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs index 9ed468f7..17fab1bc 100644 --- a/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs +++ b/IRaCIS.Core.Domain.Share/QC/RequestBackStateEnum.cs @@ -10,10 +10,10 @@ namespace IRaCIS.Core.Domain.Share NotRequest = 0, - //CRC 申请,PM待同意 + //IC 申请,PM待同意 CRC_RequestBack = 1, - //PM 已同意 CRC + //PM 已同意 IC PM_AgressBack = 2, PM_NotAgree=3, diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index 00384e05..98453d74 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -20,7 +20,7 @@ namespace IRaCIS.Core.Domain.Share public enum RelevanceType { /// - /// 关联的访视任务ID (当前任务是访视任务的话会有自己)集合 + /// 关联的检查批次任务ID (当前任务是检查批次任务的话会有自己)集合 /// Related = 0, @@ -686,12 +686,12 @@ namespace IRaCIS.Core.Domain.Share public enum ModuleTypeEnum { /// - /// 计划内访视 + /// 计划内检查批次 /// InPlanSubjectVisit = 0, /// - /// 计划外访视 + /// 计划外检查批次 /// OutPlanSubjectVisit = 1, @@ -803,7 +803,7 @@ namespace IRaCIS.Core.Domain.Share public enum UploadRole { /// - /// CRC + /// IC /// CRC = 0, @@ -914,15 +914,15 @@ namespace IRaCIS.Core.Domain.Share public enum ClinicalLevel { /// - /// 受试者 + /// 患者 /// - [DisplayAttribute(Name = "受试者")] + [DisplayAttribute(Name = "患者")] Subject = 0, /// - /// 访视 + /// 检查批次 /// - [DisplayAttribute(Name = "访视")] + [DisplayAttribute(Name = "检查批次")] SubjectVisit = 1, /// @@ -1039,22 +1039,22 @@ namespace IRaCIS.Core.Domain.Share SODChange = 2, /// - /// 与基线访视相比SOD变化百分比 + /// 与基线检查批次相比SOD变化百分比 /// SODPercent = 3, /// - /// 与整个访视期间SOD最低点相比增加的值(mm) 其他任务需要改 + /// 与整个检查批次期间SOD最低点相比增加的值(mm) 其他任务需要改 /// LowestIncrease = 4, /// - /// 与整个访视期间SOD最低点相比增加的百分比 其他任务需要改 + /// 与整个检查批次期间SOD最低点相比增加的百分比 其他任务需要改 /// LowPercent = 5, /// - /// 整个访视期间SOD最低点访视名称 其他任务需要改 + /// 整个检查批次期间SOD最低点检查批次名称 其他任务需要改 /// LowVisit = 6, @@ -1064,7 +1064,7 @@ namespace IRaCIS.Core.Domain.Share IsLymphTarget = 7, /// - /// 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上 + /// 是否存在淋巴结靶病灶且该病灶比上一检查批次短径增加5MM以上 /// IsAddFive = 8, @@ -1094,7 +1094,8 @@ namespace IRaCIS.Core.Domain.Share Tumor = 13, /// - /// 访视点备注 + /// 检查批次点备注 --注册证环境 评估总结 + /// /// AdjustReason = 14, @@ -1119,7 +1120,7 @@ namespace IRaCIS.Core.Domain.Share AlwaysNewLesionsCount = 18, /// - /// 自治疗后第二个访视点以来持续的新骨病变数量 + /// 自治疗后第二个检查批次点以来持续的新骨病变数量 /// NewBoneLesionsCount = 19, @@ -1129,7 +1130,7 @@ namespace IRaCIS.Core.Domain.Share TherapeuticEffectEvaluationGroup=20, /// - /// 访视点肿瘤评估 + /// 检查批次点肿瘤评估 /// SiteVisitForTumorEvaluation = 21, @@ -1137,10 +1138,12 @@ namespace IRaCIS.Core.Domain.Share /// 间隔天数 ///
DaysBetween = 22, + + } /// - /// 访视点肿瘤评估 + /// 检查批次点肿瘤评估 /// public enum VisitTumorEvaluation { @@ -1187,7 +1190,7 @@ namespace IRaCIS.Core.Domain.Share GlobalChange = 2, /// - /// 访视点注释 + /// 检查批次点注释 /// VisitRemark = 3, } diff --git a/IRaCIS.Core.Domain.Share/User/UserType.cs b/IRaCIS.Core.Domain.Share/User/UserType.cs index 10c1e767..a32ac6fe 100644 --- a/IRaCIS.Core.Domain.Share/User/UserType.cs +++ b/IRaCIS.Core.Domain.Share/User/UserType.cs @@ -8,7 +8,7 @@ //PM ProjectManager=1, - //CRC + //IC ClinicalResearchCoordinator=2, //IQC diff --git a/IRaCIS.Core.Domain/Abandon/WorkloadDistribution.cs b/IRaCIS.Core.Domain/Abandon/WorkloadDistribution.cs index d5972cc0..4fed63af 100644 --- a/IRaCIS.Core.Domain/Abandon/WorkloadDistribution.cs +++ b/IRaCIS.Core.Domain/Abandon/WorkloadDistribution.cs @@ -25,7 +25,7 @@ namespace IRaCIS.Core.Domain.Models public string VisitName { get; set; } - // 项目Id,受试者Id,num 共同决定 Global 关联的所有study, + // 项目Id,患者Id,num 共同决定 Global 关联的所有study, // 暂定设计成这样,后期如有需要,爱用中间表 关联。 public Guid TrialId { get; set; } public Guid SubjectId { get; set; } diff --git a/IRaCIS.Core.Domain/Allocation/SubjectTaskCategory.cs b/IRaCIS.Core.Domain/Allocation/SubjectTaskCategory.cs index b0ff5410..9f3aa4e8 100644 --- a/IRaCIS.Core.Domain/Allocation/SubjectTaskCategory.cs +++ b/IRaCIS.Core.Domain/Allocation/SubjectTaskCategory.cs @@ -23,7 +23,7 @@ namespace IRaCIS.Core.Domain.Models public string TaskBlindName { get; set; } = string.Empty; - //任务来源访视Id 方便回更访视读片状态 + //任务来源检查批次Id 方便回更检查批次读片状态 public Guid? SourceSubjectVisitId { get; set; } [JsonIgnore] diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index 6017ca94..e9e705b9 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -23,7 +23,7 @@ namespace IRaCIS.Core.Domain.Models public string TaskBlindName { get; set; } = string.Empty; - //任务来源访视Id 方便回更访视读片状态 + //任务来源检查批次Id 方便回更检查批次读片状态 public Guid? SourceSubjectVisitId { get; set; } public Guid? SouceReadModuleId { get; set; } @@ -170,7 +170,7 @@ namespace IRaCIS.Core.Domain.Models - //随访任务号 取访视的号 计划外是 访视+0.1 裁判任务在访视任务上+0.002 全局任务在截止访视号上+0.03 肿瘤待定 + //随访任务号 取检查批次的号 计划外是 检查批次+0.1 裁判任务在检查批次任务上+0.002 全局任务在截止检查批次号上+0.03 肿瘤待定 public decimal VisitTaskNum { get; set; } @@ -191,12 +191,12 @@ namespace IRaCIS.Core.Domain.Models public bool IsReadClinicalData { get; set; } = false; /// - /// 关联的访视任务ID (当前任务是访视任务的话会有自己) + /// 关联的检查批次任务ID (当前任务是检查批次任务的话会有自己) /// public string RelatedVisitTaskIds { get; set; } = "[]"; /// - /// 关联的访视任务ID (当前任务是访视任务的话会有自己)集合 + /// 关联的检查批次任务ID (当前任务是检查批次任务的话会有自己)集合 /// [NotMapped] public List RelatedVisitTaskIdList @@ -344,7 +344,7 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] - //对于全局任务而言 才可以用的 关联的访视阅片结果 + //对于全局任务而言 才可以用的 关联的检查批次阅片结果 public List GlobalVisitResultList { get; set; } = new List(); diff --git a/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs b/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs index f3365058..f471319f 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTaskReReading.cs @@ -61,7 +61,7 @@ namespace IRaCIS.Core.Domain.Models public bool IsCopyOrigenalForms { get; set; } - //仅仅包括全局和访视 + //仅仅包括全局和检查批次 public bool IsCopyFollowForms { get; set; } diff --git a/IRaCIS.Core.Domain/IRaCIS.Core.Domain.csproj b/IRaCIS.Core.Domain/IRaCIS.Core.Domain.csproj index 5cbdf014..5158a9e7 100644 --- a/IRaCIS.Core.Domain/IRaCIS.Core.Domain.csproj +++ b/IRaCIS.Core.Domain/IRaCIS.Core.Domain.csproj @@ -2,12 +2,21 @@ net6.0 + AnyCPU;x64 ..\bin + + ..\bin + + + + ..\bin + + diff --git a/IRaCIS.Core.Domain/Management/User.cs b/IRaCIS.Core.Domain/Management/User.cs index ede2ff58..c91ed7e4 100644 --- a/IRaCIS.Core.Domain/Management/User.cs +++ b/IRaCIS.Core.Domain/Management/User.cs @@ -45,7 +45,7 @@ namespace IRaCIS.Core.Domain.Models // ڲû ⲿû - public bool IsZhiZhun { get; set; } + public bool? IsZhiZhun { get; set; } public UserTypeEnum UserTypeEnum { get; set; } diff --git a/IRaCIS.Core.Domain/QC/ClinicalData/PreviousPDF.cs b/IRaCIS.Core.Domain/QC/ClinicalData/PreviousPDF.cs index 00645826..f695ad7a 100644 --- a/IRaCIS.Core.Domain/QC/ClinicalData/PreviousPDF.cs +++ b/IRaCIS.Core.Domain/QC/ClinicalData/PreviousPDF.cs @@ -50,7 +50,7 @@ namespace IRaCIS.Core.Domain.Models /// - /// 是否是访视 + /// 是否是检查批次 /// public bool? IsVisist { get; set; } @@ -75,7 +75,7 @@ namespace IRaCIS.Core.Domain.Models public Guid? TrialId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid? SubjectId { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs index 2cbed9d3..47f97378 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs @@ -20,12 +20,12 @@ namespace IRaCIS.Core.Domain.Models public Guid TrialId { get; set; } /// - /// 访视Id 或者模块Id + /// 检查批次Id 或者模块Id /// public Guid ReadingId { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } @@ -35,7 +35,7 @@ namespace IRaCIS.Core.Domain.Models public Guid ClinicalDataTrialSetId { get; set; } /// - /// 是否为访视 + /// 是否为检查批次 /// xiu public bool IsVisit { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs b/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs index f867001c..afce4ce5 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs @@ -139,7 +139,7 @@ namespace IRaCIS.Core.Domain.Models /// - /// 阅片是否显示受试者信息 + /// 阅片是否显示患者信息 /// public bool IsReadingShowSubjectInfo { get; set; } = true; @@ -197,7 +197,7 @@ namespace IRaCIS.Core.Domain.Models public bool IsOncologyReading { get; set; } /// - /// 任务展示访视 读片任务显示是否顺序 + /// 任务展示检查批次 读片任务显示是否顺序 /// public bool IsReadingTaskViewInOrder { get; set; } = true; @@ -206,7 +206,7 @@ namespace IRaCIS.Core.Domain.Models public TaskAllocateObj TaskAllocateObjEnum { get; set; } - //后续访视任务自动分配 + //后续检查批次任务自动分配 public bool IsFollowVisitAutoAssign { get; set; } = true; //后续全局自动分配 @@ -216,7 +216,7 @@ namespace IRaCIS.Core.Domain.Models public TaskAllocateDefaultState FollowJudgeTaskAutoAssignDefaultState { get; set; } = TaskAllocateDefaultState.Allocated; - //后续访视自动分配默认状态 + //后续检查批次自动分配默认状态 public TaskAllocateDefaultState FollowVisitAutoAssignDefaultState { get; set; } = TaskAllocateDefaultState.Allocated; //后续全局自动分配默认状态 diff --git a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingJudgeInfo.cs b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingJudgeInfo.cs index 668ffabd..5cd55777 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingJudgeInfo.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingJudgeInfo.cs @@ -49,7 +49,7 @@ namespace IRaCIS.Core.Domain.Models public Guid TrialId { get; set; } /// - /// 受试者ID + /// 患者ID /// [Required] public Guid SubjectId { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingOncologyTaskInfo.cs b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingOncologyTaskInfo.cs index 1bd73fab..70852209 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingOncologyTaskInfo.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingOncologyTaskInfo.cs @@ -10,7 +10,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace IRaCIS.Core.Domain.Models { /// - /// 阅片肿瘤学 针对访视任务 添加了一个结果 + /// 阅片肿瘤学 针对检查批次任务 添加了一个结果 /// [Table("ReadingOncologyTaskInfo")] public class ReadingOncologyTaskInfo : Entity, IAuditAdd @@ -22,7 +22,7 @@ namespace IRaCIS.Core.Domain.Models public Guid OncologyTaskId { get; set; } /// - /// 产生肿瘤学阅片任务的 访视类型的阅片任务Id + /// 产生肿瘤学阅片任务的 检查批次类型的阅片任务Id /// public Guid VisitTaskId { get; set; } @@ -52,7 +52,7 @@ namespace IRaCIS.Core.Domain.Models public Guid TrialId { get; set; } /// - /// 受试者Id + /// 患者Id /// public Guid SubjectId { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingTaskQuestionAnswer.cs b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingTaskQuestionAnswer.cs index 38c8fdff..3cba08fc 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingTaskQuestionAnswer.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingFormAnswer/ReadingTaskQuestionAnswer.cs @@ -30,7 +30,7 @@ namespace IRaCIS.Core.Domain.Models public Guid TrialId { get; set; } /// - /// 受试者Id + /// 患者Id /// public Guid SubjectId { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs index aa09506c..4939466d 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs @@ -23,7 +23,7 @@ namespace IRaCIS.Core.Domain.Models public List ModuleTaskList { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } @@ -45,7 +45,7 @@ namespace IRaCIS.Core.Domain.Models public bool? IsUrgent { get; set; } /// - /// 访视ID + /// 检查批次ID /// public Guid SubjectVisitId { get; set; } @@ -98,7 +98,7 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] /// - /// 受试者 + /// 患者 /// [ForeignKey("SubjectId")] @@ -113,7 +113,7 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] /// - /// 访视 + /// 检查批次 /// [ForeignKey("SubjectVisitId")] public SubjectVisit SubjectVisit { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodPlan.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodPlan.cs index b82efd57..4dbcd56e 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodPlan.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodPlan.cs @@ -20,12 +20,12 @@ namespace IRaCIS.Core.Domain.Models public Guid ReadingPeriodSetId { get; set; } /// - /// 访视 + /// 检查批次 /// public Guid SubjectVisitId { get; set; } /// - /// 访视 + /// 检查批次 /// [ForeignKey("SubjectVisitId")] [JsonIgnore] diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodSet.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodSet.cs index d191a632..b8e08faa 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodSet.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadingPeriodSet.cs @@ -38,18 +38,18 @@ namespace IRaCIS.Core.Domain.Models public DateTime? ExpirationDate { get; set; } /// - /// 截止访视 + /// 截止检查批次 /// public decimal? ExpirationVisitNum { get; set; } /// - /// 访视计划ID + /// 检查批次计划ID /// public Guid? VisitStageId { get; set; } [JsonIgnore] /// - /// 访视模板 + /// 检查批次模板 /// [ForeignKey("VisitStageId")] public VisitStage VisitStage { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/View/ReadModuleView.cs b/IRaCIS.Core.Domain/Reading/View/ReadModuleView.cs index 5c968799..86962eb5 100644 --- a/IRaCIS.Core.Domain/Reading/View/ReadModuleView.cs +++ b/IRaCIS.Core.Domain/Reading/View/ReadModuleView.cs @@ -10,7 +10,7 @@ namespace IRaCIS.Core.Domain.Models public class ReadModuleView: Entity { /// - /// Id(阅片期Id 或者 访视ID) + /// Id(阅片期Id 或者 检查批次ID) /// public new Guid Id { get; set; } @@ -26,7 +26,7 @@ namespace IRaCIS.Core.Domain.Models public string Name { get; set; } /// - /// 受试者ID + /// 患者ID /// public Guid SubjectId { get; set; } @@ -41,25 +41,25 @@ namespace IRaCIS.Core.Domain.Models public bool? IsUrgent { get; set; } /// - /// 访视ID + /// 检查批次ID /// public Guid SubjectVisitId { get; set; } /// - /// 访视名称 + /// 检查批次名称 /// public string SubjectVisitName { get; set; } /// - /// 截止访视 + /// 截止检查批次 /// public Guid? CutOffVisitId { get; set; } /// - /// 截止访视名称 + /// 截止检查批次名称 /// public string? CutOffVisitName { get; set; } @@ -81,7 +81,7 @@ namespace IRaCIS.Core.Domain.Models public DateTime CreateTime { get; set; } /// - /// 受试者Code + /// 患者Code /// public string SubjectCode { get; set; } @@ -96,17 +96,17 @@ namespace IRaCIS.Core.Domain.Models public string TrialSiteCode { get; set; } /// - /// 是否为末次访视 + /// 是否为末次检查批次 /// public bool IsFinalVisit { get; set; } = false; /// - /// 上一访视 + /// 上一检查批次 /// public Guid? OutPlanPreviousVisitId { get; set; } /// - /// 上一访视名称 + /// 上一检查批次名称 /// public string OutPlanPreviousVisitName { get; set; } @@ -116,12 +116,12 @@ namespace IRaCIS.Core.Domain.Models public Guid SiteId { get; set; } /// - /// 是否为访视 + /// 是否为检查批次 /// public bool IsVisit { get; set; } /// - /// 访视Num + /// 检查批次Num /// public decimal? VisitNum { get; set; } diff --git a/IRaCIS.Core.Domain/SQLFile/Test.sql b/IRaCIS.Core.Domain/SQLFile/Test.sql index 8c0052b9..3c755841 100644 --- a/IRaCIS.Core.Domain/SQLFile/Test.sql +++ b/IRaCIS.Core.Domain/SQLFile/Test.sql @@ -55,8 +55,8 @@ select * from VisitTask where TrialReadingCriterionId is null update Site set SiteCode= 'S'+ RIGHT('0000'+CAST(Site.Code as varchar(10)),4) --不用同步 -update FrontAuditConfig set ValueCN='任务名称' where Value='TaskName' and ValueCN='访视/阅片期名称' and Code='TaskName' -update FrontAuditConfig set ValueCN='任务盲态标识' where Value='TaskBlindName' and ValueCN='访视盲态名称' and Code='TaskBlindName' +update FrontAuditConfig set ValueCN='任务名称' where Value='TaskName' and ValueCN='检查批次/阅片期名称' and Code='TaskName' +update FrontAuditConfig set ValueCN='任务盲态标识' where Value='TaskBlindName' and ValueCN='检查批次盲态名称' and Code='TaskBlindName' -----------------------------------------之前的------------------------------------------------------------- @@ -208,7 +208,7 @@ inner join Hospital on Hospital.HospitalName=Site.SiteName ---2023 -1-10 ---处理访视 +--处理检查批次 --基线 update VisitTask set IsNeedClinicalDataSign =1 from VisitTask inner join ReadingQuestionCriterionTrial on ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId @@ -270,7 +270,7 @@ inner join ReadModule on VisitTask.SouceReadModuleId=ReadModule.Id -----处理 是否所有临床数据都签名的字段 ---处理访视 +--处理检查批次 --基线 update VisitTask set IsClinicalDataSign =1 from VisitTask inner join ReadingQuestionCriterionTrial on ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId @@ -282,7 +282,7 @@ inner join SubjectVisit on VisitTask.SourceSubjectVisitId=SubjectVisit.Id ) =(select count(*) from ReadingClinicalData inner join ClinicalDataTrialSet on ReadingClinicalData.ClinicalDataTrialSetId =ClinicalDataTrialSet.Id where ReadingClinicalData.TrialId=VisitTask.TrialId and IsSign=1 and ReadingClinicalDataState=3 and ReadingId=VisitTask.SourceSubjectVisitId and ClinicalDataTrialSet.UploadRole=1 - -- 有可能仅仅CRC Subject级别 需要签名 CRC自动签名了 没有PM需要签名的文档 此时应该设置为已签署 + -- 有可能仅仅IC Subject级别 需要签名 IC自动签名了 没有PM需要签名的文档 此时应该设置为已签署 ) --处理基线脏数据 @@ -297,7 +297,7 @@ inner join SubjectVisit on VisitTask.SourceSubjectVisitId=SubjectVisit.Id ) !=(select count(*) from ReadingClinicalData inner join ClinicalDataTrialSet on ReadingClinicalData.ClinicalDataTrialSetId =ClinicalDataTrialSet.Id where ReadingClinicalData.TrialId=VisitTask.TrialId and IsSign=1 and ReadingClinicalDataState=3 and ReadingId=VisitTask.SourceSubjectVisitId and ClinicalDataTrialSet.UploadRole=1 - -- 有可能仅仅CRC Subject级别 需要签名 CRC自动签名了 没有PM需要签名的文档 此时应该设置为已签署 + -- 有可能仅仅IC Subject级别 需要签名 IC自动签名了 没有PM需要签名的文档 此时应该设置为已签署 ) @@ -308,7 +308,7 @@ inner join ReadingQuestionCriterionTrial on ReadingQuestionCriterionTrial.Id=V inner join SubjectVisit on VisitTask.SourceSubjectVisitId=SubjectVisit.Id where VisitTask.ReadingCategory=1 and SubjectVisit.IsBaseLine=0 and VisitTask.IsClinicalDataSign =0 and VisitTask.IsNeedClinicalDataSign=1 - -- 非基线 可能只有CRC 访视级别 PM 没有 + -- 非基线 可能只有IC 检查批次级别 PM 没有 and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%|'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'|%' and ClinicalDataLevel=1 and IsConfirm=1) and (select count(*) from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%|'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'|%' and ClinicalDataLevel=1 and IsConfirm=1 and UploadRole=1 ) =(select count(*) from ReadingClinicalData inner join ClinicalDataTrialSet on ReadingClinicalData.ClinicalDataTrialSetId =ClinicalDataTrialSet.Id @@ -320,7 +320,7 @@ inner join ReadingQuestionCriterionTrial on ReadingQuestionCriterionTrial.Id=V inner join SubjectVisit on VisitTask.SourceSubjectVisitId=SubjectVisit.Id where VisitTask.ReadingCategory=1 and SubjectVisit.IsBaseLine=0 and VisitTask.IsClinicalDataSign =1 and VisitTask.IsNeedClinicalDataSign=1 - -- 非基线 可能只有CRC 访视级别 PM 没有 + -- 非基线 可能只有IC 检查批次级别 PM 没有 and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%|'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'|%' and ClinicalDataLevel=1 and IsConfirm=1) and (select count(*) from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%|'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'|%' and ClinicalDataLevel=1 and IsConfirm=1 and UploadRole=1 ) !=(select count(*) from ReadingClinicalData inner join ClinicalDataTrialSet on ReadingClinicalData.ClinicalDataTrialSetId =ClinicalDataTrialSet.Id @@ -399,7 +399,7 @@ WHERE EXISTS ( update ReadingClinicalData set IsVisit=1 from ReadingClinicalData INNER JOIN ClinicalDataTrialSet on ReadingClinicalData.ClinicalDataTrialSetId = ClinicalDataTrialSet.Id where ClinicalDataTrialSet.ClinicalDataLevel in (0,1) and ReadingClinicalData.IsVisit=0 update VisitTask set IsClinicalDataSign=0 where IsNeedClinicalDataSign=0 and IsClinicalDataSign=1 - -- 判断 访视 和阅片期 是否有脏数据吧 + -- 判断 检查批次 和阅片期 是否有脏数据吧 --查询确认 select V.SubjectId, V.SourceSubjectVisitId, V.TrialReadingCriterionId,V.IsSelfAnalysis, v.DoctorUserId,V.ArmEnum,Count(*) as EffectCount,max(v.CreateTime),max(v.Id) as Id from VisitTask V join ReadingQuestionCriterionTrial on V.TrialReadingCriterionId = ReadingQuestionCriterionTrial.Id @@ -433,7 +433,7 @@ where ReadingQuestionTrial.ReadingQuestionSystemId is not null and ReadingTableQ --------------------维护访视任务 IsSelfAnalysis 为 null 的 ------------------------ +-------------------维护检查批次任务 IsSelfAnalysis 为 null 的 ------------------------ update VisitTask set RelatedVisitTaskIds= iif(STUFF((SELECT ',' + '"'+ CONVERT(nvarchar(80),Id) +'"' FROM VisitTask vt where @@ -560,7 +560,7 @@ where ReadingQuestionTrial.ReadingQuestionSystemId is not null and ReadingTableQ - -----------------------------------维护访视 IsSelfAnalysis 不为null 的 ------------------------ + -----------------------------------维护检查批次 IsSelfAnalysis 不为null 的 ------------------------ diff --git a/IRaCIS.Core.Domain/Trial/DataInspection.cs b/IRaCIS.Core.Domain/Trial/DataInspection.cs index cb7b8320..79316820 100644 --- a/IRaCIS.Core.Domain/Trial/DataInspection.cs +++ b/IRaCIS.Core.Domain/Trial/DataInspection.cs @@ -39,12 +39,12 @@ namespace IRaCIS.Core.Domain.Models public Guid? SiteId { get; set; } /// - /// 受试者 + /// 患者 /// public Guid? SubjectId { get; set; } /// - /// 访视 + /// 检查批次 /// public Guid? SubjectVisitId { get; set; } diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index 30a19d51..059d3203 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -147,57 +147,75 @@ namespace IRaCIS.Core.Domain.Models public bool VisitPlanConfirmed { get; set; } - + /// + /// ߱Ź + /// + public bool IsNoticeSubjectCodeRule { get; set; } = false; /// - /// ߱ž + /// ߱Ÿʽ /// public string SubjectCodeRule { get; set; } = "5λɣǰ2λΪıţ3λΪ˳ţEDC¼ıűһ"; + + /// - /// Ƿ ߱Ź + /// ߵڶ /// - public bool IsNoticeSubjectCodeRule { get; set; } = true; + public bool IsSubjectSecondCodeView { get; set; } = false; + /// - /// Ƿ л׼ʱ䣨״θҩʱ䣩 + /// ɨУ /// - public bool IsHaveFirstGiveMedicineDate { get; set; } = true; + public bool IsVerifyVisitImageDate { get; set; } = false; /// - /// Ƿ + ///λ׼ Ƿ л׼ʱ䣨״θҩʱ䣩 /// - public bool IsHaveSubjectAge { get; set; } = false; - + public bool IsHaveFirstGiveMedicineDate { get; set; } = false; /// - /// Ƿ ȷ + /// Ƿ /// - public bool IsEnrollementQualificationConfirm { get; set; } = false; + public bool IsHaveSubjectAge { get; set; } = true; + public bool IsSubjectSexView { get; set; } = true; /// - /// ƻ + /// ƻĩμ /// public string OutEnrollmentVisitName { get; set; } = "EOT"; - - /// - /// Ƿ ֤Ƭ + /// ӰĿ /// - public bool IsVerifyVisitImageDate { get; set; } = true; + public bool IsImageReplicationAcrossTrial { get; set; } = false; + + public string BodyPartTypes { get; set; } = "ʲ|Բ||ز|/¸|ǻ|ȫ|"; + + public string Modalitys { get; set; } = "CT|MRI|BoneScan|Photograph|PET|X-ray|US"; + + [NotMapped] + public List ModalityList => Modalitys.Split('|', StringSplitOptions.RemoveEmptyEntries).Where(t => !string.IsNullOrEmpty(t)).ToList(); + + + public int ChangeDefalutDays { get; set; } = 5; + + + + + + + //Ƭʽ 1 ҽѧӰ 2 Ƶ 3 ĵ + public int ReadingMode { get; set; } = 1; + /// /// ٴϢ 1ϵͳ¼ 2ϵͳ¼+PDF 0 /// public int ClinicalInformationTransmissionEnum { get; set; } = 1; - /// - /// Ƿ ٴϢ - /// - public bool IsCRAAuditClinicalInformation { get; set; } = false; - /// /// QC 0 1 2˫ /// @@ -208,47 +226,53 @@ namespace IRaCIS.Core.Domain.Models ///
public bool IsImageConsistencyVerification { get; set; } = true; + + + + + + + + /// + /// Ƿ ȷ + /// + public bool IsEnrollementQualificationConfirm { get; set; } = false; + + //PD չǷʾ ü Ƿʾ PDչ (Ӷ״̬) + public bool IsPDProgressView { get; set; } = false; + + + //ĿӼ + public bool IsUrgent { get; set; } = false; + + + //Suject Editҳ Ƿʾ Ӽ + public bool IsSubjectExpeditedView { get; set; } = false; + + + + + + + + + /// + /// Ƿ ٴϢ + /// + public bool IsCRAAuditClinicalInformation { get; set; } = false; + /// /// Ӱ񵼳 /// public bool IsImageExport { get; set; } = false; - public bool IsSubjectSecondCodeView { get; set; } - - - - //Ƭʽ - public int ReadingMode { get; set; } = 1; - - - - public int ChangeDefalutDays { get; set; } = 5; - - /// - /// Ŀ - /// - public bool IsImageReplicationAcrossTrial { get; set; } = false; - - - public string BodyPartTypes { get; set; } = "ʲ|Բ||ز|/¸|ǻ|ȫ|"; - - - - public string Modalitys { get; set; } = "CT|MRI|BoneScan|Photograph|PET|X-ray|US"; - - [NotMapped] - public List ModalityList => Modalitys.Split('|', StringSplitOptions.RemoveEmptyEntries).Where(t => !string.IsNullOrEmpty(t)).ToList(); - - public string PreliminaryAuditReuploadText { get; set; } = string.Empty; public string ReviewAuditReuploadText { get; set; } = string.Empty; - //PD չǷʾ ÷ Ƿʾ PDչ (Ӷ״̬) - public bool IsPDProgressView { get; set; } //о public string ResearchProgramNo { get; set; } @@ -262,7 +286,6 @@ namespace IRaCIS.Core.Domain.Models // PI public string HeadPI { get; set; } - public bool IsUrgent { get; set; } /// /// Ŀ 1 ʽĿ0 ʽĿ 2ѵĿ @@ -280,10 +303,8 @@ namespace IRaCIS.Core.Domain.Models public DateTime? TrialFinishedTime { get; set; } - public bool IsSubjectSexView { get; set; } = false; - //Suject Editҳ Ƿʾ Ӽ - public bool IsSubjectExpeditedView { get; set; } = false; + public bool IsTrialStart { get; set; } = false; @@ -393,7 +414,7 @@ namespace IRaCIS.Core.Domain.Models //// //public TaskAllocateObj TaskAllocateObjEnum { get; set; } - ////Զ + ////Զ //public bool IsFollowVisitAutoAssign { get; set; } = true; ////ȫԶ @@ -403,7 +424,7 @@ namespace IRaCIS.Core.Domain.Models //public TaskAllocateDefaultState FollowJudgeTaskAutoAssignDefaultState { get; set; } = TaskAllocateDefaultState.Allocated; - ////ԶĬ״̬ + ////ԶĬ״̬ //public TaskAllocateDefaultState FollowVisitAutoAssignDefaultState { get; set; } = TaskAllocateDefaultState.Allocated; ////ȫԶĬ״̬ @@ -417,7 +438,7 @@ namespace IRaCIS.Core.Domain.Models //public bool IsReadingTaskViewInOrder { get; set; } = true; ///// - ///// ƬǷʾϢ + ///// ƬǷʾϢ ///// //public bool IsReadingShowSubjectInfo { get; set; } = false; diff --git a/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs b/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs index 3dc6ef9a..03f12b2d 100644 --- a/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs +++ b/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs @@ -36,7 +36,7 @@ namespace IRaCIS.Core.Domain.Models /// - /// Site 下面有多个访视记录 + /// Site 下面有多个检查批次记录 /// [JsonIgnore] public List SubjectVisitList { get; set; } diff --git a/IRaCIS.Core.Domain/Visit/Subject.cs b/IRaCIS.Core.Domain/Visit/Subject.cs index 3fbd74f0..4a643453 100644 --- a/IRaCIS.Core.Domain/Visit/Subject.cs +++ b/IRaCIS.Core.Domain/Visit/Subject.cs @@ -7,7 +7,7 @@ using Newtonsoft.Json; namespace IRaCIS.Core.Domain.Models { /// - /// 受试者 + /// 患者 /// [Table("Subject")] public class Subject : Entity, IAuditAdd, IAuditUpdate, ISoftDelete @@ -66,7 +66,7 @@ namespace IRaCIS.Core.Domain.Models public Guid TrialId { get; set; } = Guid.Empty; public string MedicalNo { get; set; } = string.Empty; - public SubjectStatus Status { get; set; } = SubjectStatus.OnVisit;//1 访视中,2 出组 3 访视结束 + public SubjectStatus Status { get; set; } = SubjectStatus.OnVisit;//1 检查批次中,2 出组 3 检查批次结束 public string Reason { get; set; } = string.Empty; public bool IsEnrollment { get; set; } diff --git a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs index 2b36d9fe..cf320e06 100644 --- a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs +++ b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs @@ -9,7 +9,7 @@ namespace IRaCIS.Core.Domain.Models [Table("SubjectVisit")] public class SubjectVisit : Entity, IAuditUpdate, IAuditAdd, ISoftDelete { - //一个访视 对应有对应Site的 TrialSiteCode 所以 fluentApi中配置 TrialSite 连表用TrialId SiteId 双字段 + //一个检查批次 对应有对应Site的 TrialSiteCode 所以 fluentApi中配置 TrialSite 连表用TrialId SiteId 双字段 [JsonIgnore] public TrialSite TrialSite { get; set; } public Guid TrialId { get; set; } @@ -117,7 +117,7 @@ namespace IRaCIS.Core.Domain.Models public DateTime? CheckPassedTime { get; set; } /// - /// 上一访视 + /// 上一检查批次 /// public Guid? OutPlanPreviousVisitId { get; set; } @@ -199,10 +199,10 @@ namespace IRaCIS.Core.Domain.Models public Subject Subject { get; set; } - //// 一个访视可以被多个参与者 查看 + //// 一个检查批次可以被多个参与者 查看 //public List TrialUsers { get; set; } - ////一个访视 对应该Site下的多个CRC管理 必须加这个 不然生成的sql 会报 TrialSiteUserId 不存在该列名 + ////一个检查批次 对应该Site下的多个IC管理 必须加这个 不然生成的sql 会报 TrialSiteUserId 不存在该列名 //public List TrialSiteUserList { get; set; } [JsonIgnore] diff --git a/IRaCIS.Core.Domain/_Config/_StaticData.cs b/IRaCIS.Core.Domain/_Config/_StaticData.cs index 41f9c6de..94b3ef32 100644 --- a/IRaCIS.Core.Domain/_Config/_StaticData.cs +++ b/IRaCIS.Core.Domain/_Config/_StaticData.cs @@ -19,7 +19,7 @@ public static class StaticData public static class Folder { - public static readonly string IRaCISDataFolder = "IRaCISData"; + public static readonly string IRaCISDataFolder = "EIImageViewerData"; public static readonly string TrialDataFolder = "TrialData"; diff --git a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs index 05ea90c1..17283add 100644 --- a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs +++ b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs @@ -1416,7 +1416,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common } - // 受试者 + // 患者 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Subject))) { var type = GetEntityAuditOpt(item); @@ -1444,7 +1444,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common }); } - // 访视计划 + // 检查批次计划 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(VisitStage))) { @@ -1476,7 +1476,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common } - // 访视 + // 检查批次 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectVisit))) { @@ -1558,9 +1558,9 @@ namespace IRaCIS.Core.Infra.EFCore.Common }, new { //父层级的数据 暂时没有记录稽查 所以这里必须查 - Name = doctor.FullName, - ChineseName = doctor.ChineseName, - Email = doctor.EMail, + Name = doctor?.FullName, + ChineseName = doctor?.ChineseName, + Email = doctor?.EMail, IsUploadedACKSOW = entity.AttachmentId != Guid.Empty, //子层级的数据 记录到父层级 必须查询 不然找上一条时数据不准 @@ -1891,7 +1891,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common //保存影像质量 多条记录,只记录一条稽查 if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingTaskQuestionAnswer))) { - // 保存影像质量 、 修改整体肿瘤评估结果 、 非dicom 保存访视阅片结果 + // 保存影像质量 、 修改整体肿瘤评估结果 、 非dicom 保存检查批次阅片结果 if (_userInfo.RequestUrl == "ReadingImageTask/changeDicomReadingQuestionAnswer" || _userInfo.RequestUrl == "ReadingImageTask/saveImageQuality" || _userInfo.RequestUrl == "ReadingImageTask/saveVisitTaskQuestions" @@ -2196,7 +2196,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common { extraIdentification = "/PCWG3"; - //获取访视的评估结果 也要记录稽查 + //获取检查批次的评估结果 也要记录稽查 var visitAnswerList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => t.VisitTaskId == group.Key &&t.ReadingQuestionTrial.GlobalReadingShowType != GlobalReadingShowType.NotShow).Select(u => new { TaskBlindName = u.VisitTask.TaskBlindName, @@ -2226,7 +2226,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common } else { - //获取访视的评估结果 也要记录稽查 + //获取检查批次的评估结果 也要记录稽查 var visitAnswerList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => t.VisitTaskId == group.Key && questionIdList.Contains(t.ReadingQuestionTrialId)).Select(u => new { TaskBlindName = u.VisitTask.TaskBlindName, @@ -2293,10 +2293,10 @@ namespace IRaCIS.Core.Infra.EFCore.Common var obj = new object() { }; - //访视任务-- 非Dicom 阅片 + //检查批次任务-- 非Dicom 阅片 if (_userInfo.RequestUrl == "ReadingImageTask/SubmitVisitTaskQuestions" && entity.ReadingTaskState != ReadingTaskState.HaveSigned && type == AuditOpt.Update) { - //提交访视任务的时候 会多次更新同一个记录 只记录最后一次 + //提交检查批次任务的时候 会多次更新同一个记录 只记录最后一次 return; } @@ -2735,7 +2735,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common - #region 访视相关 + #region 检查批次相关 // 对话消息区分用户类型 case nameof(CheckChallengeDialog): diff --git a/IRaCIS.Core.Infra.EFCore/Common/Dto/SetDictionaryValueDto.cs b/IRaCIS.Core.Infra.EFCore/Common/Dto/SetDictionaryValueDto.cs index 9aad9d97..4f589b95 100644 --- a/IRaCIS.Core.Infra.EFCore/Common/Dto/SetDictionaryValueDto.cs +++ b/IRaCIS.Core.Infra.EFCore/Common/Dto/SetDictionaryValueDto.cs @@ -132,17 +132,17 @@ namespace IRaCIS.Core.Infra.EFCore.Common.Dto public string SiteName { get; set; } /// - /// 受试者名称 + /// 患者名称 /// public string SubjectCode { get; set; } /// - /// 访视名称 + /// 检查批次名称 /// public string SubjectVisitName { get; set; } /// - /// 盲态访视名 + /// 盲态检查批次名 /// public string BlindName { get; set; } = string.Empty; @@ -171,12 +171,12 @@ namespace IRaCIS.Core.Infra.EFCore.Common.Dto public Guid? SiteId { get; set; } /// - /// 受试者 + /// 患者 /// public Guid? SubjectId { get; set; } /// - /// 访视 + /// 检查批次 /// public Guid? SubjectVisitId { get; set; } @@ -200,12 +200,12 @@ namespace IRaCIS.Core.Infra.EFCore.Common.Dto /// - /// 受试者名称 + /// 患者名称 /// public string SubjectCode { get; set; } /// - /// 访视名称 + /// 检查批次名称 /// public string SubjectVisitName { get; set; } diff --git a/IRaCIS.Core.Infra.EFCore/Context/AuditContext.cs b/IRaCIS.Core.Infra.EFCore/Context/AuditContext.cs index e6504b7d..6bfc50cd 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/AuditContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/AuditContext.cs @@ -20,7 +20,7 @@ namespace IRaCIS.Core.Infra.EFCore protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseSqlServer(_connectionString); - public DbSet SaveChangesAudits { get; set; } + //public DbSet SaveChangesAudits { get; set; } } public class SaveChangesAudit diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs index f43da123..d10f2f35 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectConfigration.cs @@ -18,14 +18,14 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration //.HasForeignKey(s => new { s.TrialId, s.SiteId }) //.HasPrincipalKey(c => new { c.TrialId, c.SiteId }); - // 受试者 在项目中只有一个site 获取 TrialSiteCode 用两个键 + // 患者 在项目中只有一个site 获取 TrialSiteCode 用两个键 builder .HasOne(s => s.TrialSite) .WithMany(c => c.SubjectList) .HasForeignKey(s => new { s.TrialId, s.SiteId }) .HasPrincipalKey(c => new { c.TrialId, c.SiteId }); - //不能同时配置一对多 和一对一 但是有时表要存储多的最新的 比如受试者 最新的访视 在这里要显示配置 + //不能同时配置一对多 和一对一 但是有时表要存储多的最新的 比如患者 最新的检查批次 在这里要显示配置 builder.HasOne(s => s.LatestSubjectVisit); builder.HasOne(s => s.FinalSubjectVisit); builder.HasMany(s => s.SubjectVisitList).WithOne(sv => sv.Subject); diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectVisitConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectVisitConfigration.cs index efe8d6a2..6348b99d 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectVisitConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/SubjectVisitConfigration.cs @@ -19,7 +19,7 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration .HasPrincipalKey(c => new { c.TrialId, c.SiteId }); - // 从 SubjectVisit 到 TrialSiteUserList 会用两个建 这里不行,添加受试者的时候,批量添加访视的时候,siteId trialId 会重复 所以不能这样搞 + // 从 SubjectVisit 到 TrialSiteUserList 会用两个建 这里不行,添加患者的时候,批量添加检查批次的时候,siteId trialId 会重复 所以不能这样搞 // modelBuilder.Entity() //.HasMany(s => s.TrialSiteUserList) //.WithOne(c => c.SubjectVisit) diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteSurveyConfigration .cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteSurveyConfigration .cs index 9e812f19..4b4babdd 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteSurveyConfigration .cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteSurveyConfigration .cs @@ -19,7 +19,7 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration .HasPrincipalKey(c => new { c.TrialId, c.SiteId }); - // 从 SubjectVisit 到 TrialSiteUserList 会用两个建 这里不行,添加受试者的时候,批量添加访视的时候,siteId trialId 会重复 所以不能这样搞 + // 从 SubjectVisit 到 TrialSiteUserList 会用两个建 这里不行,添加患者的时候,批量添加检查批次的时候,siteId trialId 会重复 所以不能这样搞 // modelBuilder.Entity() //.HasMany(s => s.TrialSiteUserList) //.WithOne(c => c.SubjectVisit) diff --git a/IRaCIS.Core.Infra.EFCore/IRaCIS.Core.Infra.EFCore.csproj b/IRaCIS.Core.Infra.EFCore/IRaCIS.Core.Infra.EFCore.csproj index df6df308..84f7ff34 100644 --- a/IRaCIS.Core.Infra.EFCore/IRaCIS.Core.Infra.EFCore.csproj +++ b/IRaCIS.Core.Infra.EFCore/IRaCIS.Core.Infra.EFCore.csproj @@ -2,12 +2,21 @@ net6.0 + AnyCPU;x64 ..\bin + + ..\bin + + + + ..\bin + + diff --git a/IRaCIS.Core.Infrastructure/IRaCIS.Core.Infrastructure.csproj b/IRaCIS.Core.Infrastructure/IRaCIS.Core.Infrastructure.csproj index 15269379..7e465687 100644 --- a/IRaCIS.Core.Infrastructure/IRaCIS.Core.Infrastructure.csproj +++ b/IRaCIS.Core.Infrastructure/IRaCIS.Core.Infrastructure.csproj @@ -2,12 +2,21 @@ net6.0 + AnyCPU;x64 ..\bin + + ..\bin + + + + ..\bin + + diff --git a/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj b/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj index 5f49abc8..d9eb61f5 100644 --- a/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj +++ b/IRaCIS.Core.Test/IRaCIS.Core.Test.csproj @@ -6,12 +6,22 @@ false default + + AnyCPU;x64 ..\bin + + ..\bin + + + + ..\bin + + diff --git a/Install/Install.csproj b/Install/Install.csproj new file mode 100644 index 00000000..bd46bf2f --- /dev/null +++ b/Install/Install.csproj @@ -0,0 +1,21 @@ + + + + Exe + net6.0 + enable + enable + open-box.ico + AnyCPU;x64 + + + + + + + + + + + + diff --git a/Install/Program.cs b/Install/Program.cs new file mode 100644 index 00000000..24dfcaad --- /dev/null +++ b/Install/Program.cs @@ -0,0 +1,137 @@ + +using Renci.SshNet; +using System.Diagnostics; +using System.Text; + +try +{ + + // SCP Settings + string scpHost = "123.56.94.154"; + string scpUsername = "Administrator"; + string scpPassword = "WHxckj2019"; + + // SCP Connection + using (var scpClient = new ScpClient(scpHost, scpUsername, scpPassword)) + { + scpClient.Connect(); + + // Upload File using SCP + using (var fs = new FileStream(@"D:\favicon.png", FileMode.Open)) + { + //默认是C盘根目录 + scpClient.Upload(fs, @"/mytest/favicon.png"); + } + + scpClient.Disconnect(); + } + + + + + + // 创建一个SSH客户端实例 + using (var client = new SshClient("123.56.94.154", "Administrator", "WHxckj2019")) + { + // 连接到远程服务器 + client.Connect(); + + //&& ./IRaCIS_Vue_Web.bat + string command = $@"cd C:\Users\Administrator\VueSourceCode && npm i && npm run build"; + + + using (var cmd = client.CreateCommand(command)) + { + + Console.WriteLine("开始执行"); + + Console.WriteLine(command); + + + var output = cmd.Execute(); + + Console.WriteLine(output); + + + var output3 = cmd.Execute($@"xcopy /Y /Q ""C:\Users\Administrator\VueSourceCode\dist\index.html"" ""D:\Develop\PublishSite\IRaCIS.Vue.Web\dist\"""); + + Console.WriteLine(output); + + Console.WriteLine("发布成功"); + } + + + + + // 断开SSH连接 + client.Disconnect(); + } +} +catch (Exception ex) +{ + Console.WriteLine(ex.Message); +} +Console.ReadLine(); + + +//// See https://aka.ms/new-console-template for more information +//using System.Diagnostics; +//using System.ServiceProcess; + +//string nginxPath = @"D:\test\EIImageViewerWeb\nginx.exe"; +//string command = $"create EI_Nginx binPath= \"{nginxPath} -p D:\\test\\EIImageViewerWeb\\\" start= auto DisplayName= \"EI_Nginx_DisplayName\""; + +//try +//{ +// // 使用SC命令创建Nginx服务 +// using (var process = new System.Diagnostics.Process()) +// { +// process.StartInfo.FileName = "sc"; +// process.StartInfo.Arguments = command; +// process.StartInfo.UseShellExecute = false; +// process.StartInfo.RedirectStandardOutput = true; +// process.Start(); +// process.WaitForExit(); + +// // 检查服务是否已成功创建 +// if (process.ExitCode != 0) +// { +// throw new Exception($"Error creating service: {process.StandardOutput.ReadToEnd()}"); +// } +// } + +// // 启动Nginx服务 +// using (var controller = new ServiceController("EI_Nginx")) +// { +// controller.Start(); +// } + +// Console.WriteLine("Nginx service created and started successfully."); +//} +//catch (Exception ex) +//{ +// Console.WriteLine(ex.Message); +//} + +//Console.ReadLine(); + +//string currentDir = Directory.GetCurrentDirectory(); +//DirectoryInfo dirInfo = new DirectoryInfo(currentDir); + +//foreach (var subdir in dirInfo.GetDirectories()) +//{ +// FileInfo[] files = subdir.GetFiles(); + +// foreach (FileInfo file in files) +// { +// if (file.Name == "Start.exe") +// { +// string startPath = Path.Combine(subdir.FullName, "Start.exe"); +// Process.Start(startPath); +// return; +// } +// } +//} + +//Console.WriteLine("当前目录子文件中未找到Start.exe,程序即将退出..."); +//Console.ReadLine(); \ No newline at end of file diff --git a/Install/open-box.ico b/Install/open-box.ico new file mode 100644 index 00000000..7abae7a6 Binary files /dev/null and b/Install/open-box.ico differ diff --git a/PublishSite/Program.cs b/PublishSite/Program.cs new file mode 100644 index 00000000..6e1a649d --- /dev/null +++ b/PublishSite/Program.cs @@ -0,0 +1,17 @@ +namespace PublishSite +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new PublishForm()); + } + } +} \ No newline at end of file diff --git a/PublishSite/PublishForm.Designer.cs b/PublishSite/PublishForm.Designer.cs new file mode 100644 index 00000000..9a7bc6d1 --- /dev/null +++ b/PublishSite/PublishForm.Designer.cs @@ -0,0 +1,698 @@ +namespace PublishSite +{ + partial class PublishForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + groupBox1 = new GroupBox(); + rb_production = new RadioButton(); + rb_Verify = new RadioButton(); + rb_test = new RadioButton(); + rb_local = new RadioButton(); + groupBox3 = new GroupBox(); + logTBox = new RichTextBox(); + tabControl1 = new TabControl(); + tabPage1 = new TabPage(); + groupBox4 = new GroupBox(); + serviceConfigSaveBtn = new Button(); + servicePortTBox = new TextBox(); + label6 = new Label(); + serviceNameTBox = new TextBox(); + label10 = new Label(); + deleteService_Btn = new Button(); + label11 = new Label(); + createService_Btn = new Button(); + serviceDisplayNameTBox = new TextBox(); + en_TBox = new TextBox(); + label9 = new Label(); + label1 = new Label(); + exePathTbox = new TextBox(); + selectPathBtn = new Button(); + groupBox2 = new GroupBox(); + stopServiceBtn = new Button(); + startServiceBtn = new Button(); + label2 = new Label(); + startOrStopServiceTbox = new TextBox(); + tabPage2 = new TabPage(); + groupBox6 = new GroupBox(); + sshNetCorePublishBtn2 = new Button(); + selectPublishFolderPathBtn = new Button(); + label8 = new Label(); + publishFolderTBox = new TextBox(); + sshNetCorePublishBtn = new Button(); + sshVuePublishBtn = new Button(); + selectPublishFilePathBtn = new Button(); + publishFileTBox = new TextBox(); + label7 = new Label(); + bakConfigSaveBtn = new Button(); + startBakBtn = new Button(); + backExePath = new TextBox(); + label5 = new Label(); + bakDbName = new TextBox(); + label4 = new Label(); + backPathTBox = new TextBox(); + label3 = new Label(); + groupBox5 = new GroupBox(); + netCorePublishBtn = new Button(); + vuePublishBtn = new Button(); + openFileDialog1 = new OpenFileDialog(); + openPublishFileDialog = new OpenFileDialog(); + folderBrowserDialog1 = new FolderBrowserDialog(); + groupBox1.SuspendLayout(); + groupBox3.SuspendLayout(); + tabControl1.SuspendLayout(); + tabPage1.SuspendLayout(); + groupBox4.SuspendLayout(); + groupBox2.SuspendLayout(); + tabPage2.SuspendLayout(); + groupBox6.SuspendLayout(); + groupBox5.SuspendLayout(); + SuspendLayout(); + // + // groupBox1 + // + groupBox1.Controls.Add(rb_production); + groupBox1.Controls.Add(rb_Verify); + groupBox1.Controls.Add(rb_test); + groupBox1.Controls.Add(rb_local); + groupBox1.Location = new Point(12, 175); + groupBox1.Name = "groupBox1"; + groupBox1.Size = new Size(796, 116); + groupBox1.TabIndex = 1; + groupBox1.TabStop = false; + groupBox1.Text = "环境(服务的操作,备份操作作用的主机)"; + // + // rb_production + // + rb_production.AutoSize = true; + rb_production.Location = new Point(434, 53); + rb_production.Name = "rb_production"; + rb_production.Size = new Size(50, 21); + rb_production.TabIndex = 3; + rb_production.Text = "正式"; + rb_production.UseVisualStyleBackColor = true; + rb_production.Click += rb_Env_CheckedChanged; + // + // rb_Verify + // + rb_Verify.AutoSize = true; + rb_Verify.Location = new Point(300, 53); + rb_Verify.Name = "rb_Verify"; + rb_Verify.Size = new Size(50, 21); + rb_Verify.TabIndex = 2; + rb_Verify.Text = "验证"; + rb_Verify.UseVisualStyleBackColor = true; + rb_Verify.Click += rb_Env_CheckedChanged; + // + // rb_test + // + rb_test.AutoSize = true; + rb_test.Location = new Point(164, 53); + rb_test.Name = "rb_test"; + rb_test.Size = new Size(50, 21); + rb_test.TabIndex = 1; + rb_test.Text = "测试"; + rb_test.UseVisualStyleBackColor = true; + rb_test.Click += rb_Env_CheckedChanged; + // + // rb_local + // + rb_local.AutoSize = true; + rb_local.Checked = true; + rb_local.Location = new Point(24, 53); + rb_local.Name = "rb_local"; + rb_local.Size = new Size(50, 21); + rb_local.TabIndex = 0; + rb_local.TabStop = true; + rb_local.Text = "本机"; + rb_local.UseVisualStyleBackColor = true; + rb_local.Click += rb_Env_CheckedChanged; + // + // groupBox3 + // + groupBox3.Controls.Add(logTBox); + groupBox3.Location = new Point(844, 24); + groupBox3.Name = "groupBox3"; + groupBox3.Size = new Size(621, 1048); + groupBox3.TabIndex = 3; + groupBox3.TabStop = false; + groupBox3.Text = "日志"; + // + // logTBox + // + logTBox.Location = new Point(23, 21); + logTBox.Name = "logTBox"; + logTBox.Size = new Size(577, 1013); + logTBox.TabIndex = 1; + logTBox.Text = ""; + // + // tabControl1 + // + tabControl1.Controls.Add(tabPage2); + tabControl1.Controls.Add(tabPage1); + tabControl1.Location = new Point(12, 318); + tabControl1.Name = "tabControl1"; + tabControl1.SelectedIndex = 0; + tabControl1.Size = new Size(796, 764); + tabControl1.TabIndex = 2; + // + // tabPage1 + // + tabPage1.Controls.Add(groupBox4); + tabPage1.Controls.Add(groupBox2); + tabPage1.Location = new Point(4, 26); + tabPage1.Name = "tabPage1"; + tabPage1.Padding = new Padding(3); + tabPage1.Size = new Size(788, 734); + tabPage1.TabIndex = 0; + tabPage1.Text = "服务相关操作"; + tabPage1.UseVisualStyleBackColor = true; + // + // groupBox4 + // + groupBox4.Controls.Add(serviceConfigSaveBtn); + groupBox4.Controls.Add(servicePortTBox); + groupBox4.Controls.Add(label6); + groupBox4.Controls.Add(serviceNameTBox); + groupBox4.Controls.Add(label10); + groupBox4.Controls.Add(deleteService_Btn); + groupBox4.Controls.Add(label11); + groupBox4.Controls.Add(createService_Btn); + groupBox4.Controls.Add(serviceDisplayNameTBox); + groupBox4.Controls.Add(en_TBox); + groupBox4.Controls.Add(label9); + groupBox4.Controls.Add(label1); + groupBox4.Controls.Add(exePathTbox); + groupBox4.Controls.Add(selectPathBtn); + groupBox4.Location = new Point(20, 28); + groupBox4.Name = "groupBox4"; + groupBox4.Size = new Size(738, 430); + groupBox4.TabIndex = 40; + groupBox4.TabStop = false; + groupBox4.Text = "服务创建与删除"; + // + // serviceConfigSaveBtn + // + serviceConfigSaveBtn.Location = new Point(141, 348); + serviceConfigSaveBtn.Name = "serviceConfigSaveBtn"; + serviceConfigSaveBtn.Size = new Size(128, 40); + serviceConfigSaveBtn.TabIndex = 41; + serviceConfigSaveBtn.Text = "服务配置保存"; + serviceConfigSaveBtn.UseVisualStyleBackColor = true; + serviceConfigSaveBtn.Click += serviceConfigSaveBtn_Click; + // + // servicePortTBox + // + servicePortTBox.Location = new Point(141, 220); + servicePortTBox.Name = "servicePortTBox"; + servicePortTBox.Size = new Size(366, 23); + servicePortTBox.TabIndex = 40; + // + // label6 + // + label6.AutoSize = true; + label6.Location = new Point(47, 226); + label6.Name = "label6"; + label6.Size = new Size(80, 17); + label6.TabIndex = 39; + label6.Text = "服务启动端口"; + // + // serviceNameTBox + // + serviceNameTBox.Location = new Point(140, 52); + serviceNameTBox.Name = "serviceNameTBox"; + serviceNameTBox.Size = new Size(366, 23); + serviceNameTBox.TabIndex = 30; + // + // label10 + // + label10.AutoSize = true; + label10.Location = new Point(23, 55); + label10.Name = "label10"; + label10.Size = new Size(104, 17); + label10.TabIndex = 28; + label10.Text = "网站后端服务名称"; + // + // deleteService_Btn + // + deleteService_Btn.Location = new Point(589, 31); + deleteService_Btn.Name = "deleteService_Btn"; + deleteService_Btn.Size = new Size(95, 27); + deleteService_Btn.TabIndex = 38; + deleteService_Btn.Text = "删除服务"; + deleteService_Btn.UseVisualStyleBackColor = true; + deleteService_Btn.Click += deleteService_Btn_Click; + // + // label11 + // + label11.AutoSize = true; + label11.Location = new Point(0, 114); + label11.Name = "label11"; + label11.Size = new Size(128, 17); + label11.TabIndex = 29; + label11.Text = "网站后端服务显示名称"; + // + // createService_Btn + // + createService_Btn.Location = new Point(379, 348); + createService_Btn.Name = "createService_Btn"; + createService_Btn.Size = new Size(128, 40); + createService_Btn.TabIndex = 37; + createService_Btn.Text = "创建服务"; + createService_Btn.UseVisualStyleBackColor = true; + createService_Btn.Click += createService_Btn_Click; + // + // serviceDisplayNameTBox + // + serviceDisplayNameTBox.Location = new Point(141, 111); + serviceDisplayNameTBox.Name = "serviceDisplayNameTBox"; + serviceDisplayNameTBox.Size = new Size(366, 23); + serviceDisplayNameTBox.TabIndex = 31; + // + // en_TBox + // + en_TBox.Location = new Point(140, 274); + en_TBox.Name = "en_TBox"; + en_TBox.Size = new Size(366, 23); + en_TBox.TabIndex = 36; + // + // label9 + // + label9.AutoSize = true; + label9.Location = new Point(47, 172); + label9.Name = "label9"; + label9.Size = new Size(80, 17); + label9.TabIndex = 32; + label9.Text = "程序完整路径"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(35, 280); + label1.Name = "label1"; + label1.Size = new Size(92, 17); + label1.TabIndex = 35; + label1.Text = "服务定义环境名"; + // + // exePathTbox + // + exePathTbox.Location = new Point(141, 168); + exePathTbox.Name = "exePathTbox"; + exePathTbox.Size = new Size(366, 23); + exePathTbox.TabIndex = 33; + // + // selectPathBtn + // + selectPathBtn.Location = new Point(589, 172); + selectPathBtn.Name = "selectPathBtn"; + selectPathBtn.Size = new Size(95, 27); + selectPathBtn.TabIndex = 34; + selectPathBtn.Text = "选择"; + selectPathBtn.UseVisualStyleBackColor = true; + selectPathBtn.Click += selectPathBtn_Click; + // + // groupBox2 + // + groupBox2.Controls.Add(stopServiceBtn); + groupBox2.Controls.Add(startServiceBtn); + groupBox2.Controls.Add(label2); + groupBox2.Controls.Add(startOrStopServiceTbox); + groupBox2.Location = new Point(19, 495); + groupBox2.Name = "groupBox2"; + groupBox2.Size = new Size(739, 219); + groupBox2.TabIndex = 39; + groupBox2.TabStop = false; + groupBox2.Text = "服务停止与启动"; + // + // stopServiceBtn + // + stopServiceBtn.Location = new Point(380, 106); + stopServiceBtn.Name = "stopServiceBtn"; + stopServiceBtn.Size = new Size(128, 40); + stopServiceBtn.TabIndex = 39; + stopServiceBtn.Text = "停止服务"; + stopServiceBtn.UseVisualStyleBackColor = true; + stopServiceBtn.Click += stopServiceBtn_Click; + // + // startServiceBtn + // + startServiceBtn.Location = new Point(142, 106); + startServiceBtn.Name = "startServiceBtn"; + startServiceBtn.Size = new Size(128, 40); + startServiceBtn.TabIndex = 38; + startServiceBtn.Text = "启动服务"; + startServiceBtn.UseVisualStyleBackColor = true; + startServiceBtn.Click += startServiceBtn_Click; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(60, 57); + label2.Name = "label2"; + label2.Size = new Size(56, 17); + label2.TabIndex = 32; + label2.Text = "服务名称"; + // + // startOrStopServiceTbox + // + startOrStopServiceTbox.Location = new Point(141, 54); + startOrStopServiceTbox.Name = "startOrStopServiceTbox"; + startOrStopServiceTbox.Size = new Size(366, 23); + startOrStopServiceTbox.TabIndex = 31; + // + // tabPage2 + // + tabPage2.Controls.Add(groupBox6); + tabPage2.Controls.Add(bakConfigSaveBtn); + tabPage2.Controls.Add(startBakBtn); + tabPage2.Controls.Add(backExePath); + tabPage2.Controls.Add(label5); + tabPage2.Controls.Add(bakDbName); + tabPage2.Controls.Add(label4); + tabPage2.Controls.Add(backPathTBox); + tabPage2.Controls.Add(label3); + tabPage2.Location = new Point(4, 26); + tabPage2.Name = "tabPage2"; + tabPage2.Padding = new Padding(3); + tabPage2.Size = new Size(788, 734); + tabPage2.TabIndex = 1; + tabPage2.Text = "备份与发布"; + tabPage2.UseVisualStyleBackColor = true; + // + // groupBox6 + // + groupBox6.Controls.Add(sshNetCorePublishBtn2); + groupBox6.Controls.Add(selectPublishFolderPathBtn); + groupBox6.Controls.Add(label8); + groupBox6.Controls.Add(publishFolderTBox); + groupBox6.Controls.Add(sshNetCorePublishBtn); + groupBox6.Controls.Add(sshVuePublishBtn); + groupBox6.Controls.Add(selectPublishFilePathBtn); + groupBox6.Controls.Add(publishFileTBox); + groupBox6.Controls.Add(label7); + groupBox6.Location = new Point(3, 292); + groupBox6.Name = "groupBox6"; + groupBox6.Size = new Size(776, 413); + groupBox6.TabIndex = 43; + groupBox6.TabStop = false; + groupBox6.Text = "上传文件到远程服务器发布"; + // + // sshNetCorePublishBtn2 + // + sshNetCorePublishBtn2.Location = new Point(290, 341); + sshNetCorePublishBtn2.Name = "sshNetCorePublishBtn2"; + sshNetCorePublishBtn2.Size = new Size(128, 40); + sshNetCorePublishBtn2.TabIndex = 52; + sshNetCorePublishBtn2.Text = "发布后端"; + sshNetCorePublishBtn2.UseVisualStyleBackColor = true; + sshNetCorePublishBtn2.Click += sshNetCorePublishBtn2_Click; + // + // selectPublishFolderPathBtn + // + selectPublishFolderPathBtn.Location = new Point(606, 282); + selectPublishFolderPathBtn.Name = "selectPublishFolderPathBtn"; + selectPublishFolderPathBtn.Size = new Size(95, 27); + selectPublishFolderPathBtn.TabIndex = 51; + selectPublishFolderPathBtn.Text = "选择"; + selectPublishFolderPathBtn.UseVisualStyleBackColor = true; + selectPublishFolderPathBtn.Click += selectPublishFolderPathBtn_Click; + // + // label8 + // + label8.AutoSize = true; + label8.Location = new Point(14, 245); + label8.Name = "label8"; + label8.Size = new Size(384, 17); + label8.TabIndex = 50; + label8.Text = "方式二: 后端发布程序文件夹(程序自动打成压缩包,上传然后发布)"; + // + // publishFolderTBox + // + publishFolderTBox.Location = new Point(14, 282); + publishFolderTBox.Name = "publishFolderTBox"; + publishFolderTBox.Size = new Size(547, 23); + publishFolderTBox.TabIndex = 49; + // + // sshNetCorePublishBtn + // + sshNetCorePublishBtn.Location = new Point(290, 153); + sshNetCorePublishBtn.Name = "sshNetCorePublishBtn"; + sshNetCorePublishBtn.Size = new Size(128, 40); + sshNetCorePublishBtn.TabIndex = 48; + sshNetCorePublishBtn.Text = "发布后端"; + sshNetCorePublishBtn.UseVisualStyleBackColor = true; + sshNetCorePublishBtn.Click += sshNetCorePublishBtn_Click; + // + // sshVuePublishBtn + // + sshVuePublishBtn.Location = new Point(55, 153); + sshVuePublishBtn.Name = "sshVuePublishBtn"; + sshVuePublishBtn.Size = new Size(128, 40); + sshVuePublishBtn.TabIndex = 47; + sshVuePublishBtn.Text = "发布前端"; + sshVuePublishBtn.UseVisualStyleBackColor = true; + sshVuePublishBtn.Click += sshVuePublishBtn_Click; + // + // selectPublishFilePathBtn + // + selectPublishFilePathBtn.Location = new Point(606, 94); + selectPublishFilePathBtn.Name = "selectPublishFilePathBtn"; + selectPublishFilePathBtn.Size = new Size(95, 27); + selectPublishFilePathBtn.TabIndex = 46; + selectPublishFilePathBtn.Text = "选择"; + selectPublishFilePathBtn.UseVisualStyleBackColor = true; + selectPublishFilePathBtn.Click += selectPublishFilePathBtn_Click; + // + // publishFileTBox + // + publishFileTBox.Location = new Point(14, 98); + publishFileTBox.Name = "publishFileTBox"; + publishFileTBox.Size = new Size(547, 23); + publishFileTBox.TabIndex = 45; + // + // label7 + // + label7.AutoSize = true; + label7.Location = new Point(27, 65); + label7.Name = "label7"; + label7.Size = new Size(368, 17); + label7.TabIndex = 44; + label7.Text = "方式一: 前端发布选择html | 后端发布选择压缩包 (上传后发布)"; + // + // bakConfigSaveBtn + // + bakConfigSaveBtn.Location = new Point(160, 186); + bakConfigSaveBtn.Name = "bakConfigSaveBtn"; + bakConfigSaveBtn.Size = new Size(128, 40); + bakConfigSaveBtn.TabIndex = 42; + bakConfigSaveBtn.Text = "备份配置保存"; + bakConfigSaveBtn.UseVisualStyleBackColor = true; + bakConfigSaveBtn.Click += bakConfigSaveBtn_Click; + // + // startBakBtn + // + startBakBtn.Location = new Point(494, 186); + startBakBtn.Name = "startBakBtn"; + startBakBtn.Size = new Size(128, 40); + startBakBtn.TabIndex = 6; + startBakBtn.Text = "开始备份"; + startBakBtn.UseVisualStyleBackColor = true; + startBakBtn.Click += startBakBtn_Click; + // + // backExePath + // + backExePath.Enabled = false; + backExePath.Location = new Point(160, 125); + backExePath.Name = "backExePath"; + backExePath.Size = new Size(547, 23); + backExePath.TabIndex = 5; + // + // label5 + // + label5.AutoSize = true; + label5.Location = new Point(61, 125); + label5.Name = "label5"; + label5.Size = new Size(56, 17); + label5.TabIndex = 4; + label5.Text = "程序路径"; + // + // bakDbName + // + bakDbName.Location = new Point(160, 28); + bakDbName.Name = "bakDbName"; + bakDbName.Size = new Size(547, 23); + bakDbName.TabIndex = 3; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(85, 28); + label4.Name = "label4"; + label4.Size = new Size(68, 17); + label4.TabIndex = 2; + label4.Text = "备份数据库"; + // + // backPathTBox + // + backPathTBox.Location = new Point(160, 75); + backPathTBox.Name = "backPathTBox"; + backPathTBox.Size = new Size(547, 23); + backPathTBox.TabIndex = 1; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(6, 79); + label3.Name = "label3"; + label3.Size = new Size(152, 17); + label3.TabIndex = 0; + label3.Text = "数据库和发布程序备份路径"; + // + // groupBox5 + // + groupBox5.Controls.Add(netCorePublishBtn); + groupBox5.Controls.Add(vuePublishBtn); + groupBox5.Location = new Point(10, 24); + groupBox5.Name = "groupBox5"; + groupBox5.Size = new Size(798, 129); + groupBox5.TabIndex = 41; + groupBox5.TabStop = false; + groupBox5.Text = "测试环境基于备份代码重新发布(感觉自动发布未发布成功,重新发布一下)"; + // + // netCorePublishBtn + // + netCorePublishBtn.Location = new Point(351, 50); + netCorePublishBtn.Name = "netCorePublishBtn"; + netCorePublishBtn.Size = new Size(128, 40); + netCorePublishBtn.TabIndex = 40; + netCorePublishBtn.Text = "后端发布"; + netCorePublishBtn.UseVisualStyleBackColor = true; + netCorePublishBtn.Click += netCorePublishBtn_Click; + // + // vuePublishBtn + // + vuePublishBtn.Location = new Point(91, 50); + vuePublishBtn.Name = "vuePublishBtn"; + vuePublishBtn.Size = new Size(128, 40); + vuePublishBtn.TabIndex = 39; + vuePublishBtn.Text = "前端发布"; + vuePublishBtn.UseVisualStyleBackColor = true; + vuePublishBtn.Click += vuePublishBtn_Click; + // + // openFileDialog1 + // + openFileDialog1.FileName = "openFileDialog1"; + // + // openPublishFileDialog + // + openPublishFileDialog.FileName = "openFileDialog2"; + // + // PublishForm + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1488, 1094); + Controls.Add(tabControl1); + Controls.Add(groupBox5); + Controls.Add(groupBox3); + Controls.Add(groupBox1); + Name = "PublishForm"; + Text = "PublishForm"; + groupBox1.ResumeLayout(false); + groupBox1.PerformLayout(); + groupBox3.ResumeLayout(false); + tabControl1.ResumeLayout(false); + tabPage1.ResumeLayout(false); + groupBox4.ResumeLayout(false); + groupBox4.PerformLayout(); + groupBox2.ResumeLayout(false); + groupBox2.PerformLayout(); + tabPage2.ResumeLayout(false); + tabPage2.PerformLayout(); + groupBox6.ResumeLayout(false); + groupBox6.PerformLayout(); + groupBox5.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + private GroupBox groupBox1; + private RadioButton rb_production; + private RadioButton rb_Verify; + private RadioButton rb_test; + private RadioButton rb_local; + private GroupBox groupBox3; + private RichTextBox logTBox; + private TabControl tabControl1; + private TabPage tabPage1; + private Button deleteService_Btn; + private Button createService_Btn; + private TextBox en_TBox; + private Label label1; + private Button selectPathBtn; + private TextBox exePathTbox; + private Label label9; + private TextBox serviceDisplayNameTBox; + private TextBox serviceNameTBox; + private Label label11; + private Label label10; + private TabPage tabPage2; + private GroupBox groupBox2; + private Button stopServiceBtn; + private Button startServiceBtn; + private Label label2; + private TextBox startOrStopServiceTbox; + private Label label4; + private TextBox backPathTBox; + private Label label3; + private TextBox bakDbName; + private TextBox backExePath; + private Label label5; + private GroupBox groupBox4; + private Button startBakBtn; + private GroupBox groupBox5; + private Button netCorePublishBtn; + private Button vuePublishBtn; + private TextBox servicePortTBox; + private Label label6; + private OpenFileDialog openFileDialog1; + private Button serviceConfigSaveBtn; + private Button bakConfigSaveBtn; + private GroupBox groupBox6; + private TextBox publishFileTBox; + private Label label7; + private Button selectPublishFilePathBtn; + private Button sshNetCorePublishBtn; + private Button sshVuePublishBtn; + private Button selectPublishFolderPathBtn; + private Label label8; + private TextBox publishFolderTBox; + private Button sshNetCorePublishBtn2; + private OpenFileDialog openPublishFileDialog; + private FolderBrowserDialog folderBrowserDialog1; + } +} \ No newline at end of file diff --git a/PublishSite/PublishForm.cs b/PublishSite/PublishForm.cs new file mode 100644 index 00000000..a3d4bf42 --- /dev/null +++ b/PublishSite/PublishForm.cs @@ -0,0 +1,977 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Management.Automation; +using System.Management.Automation.Runspaces; +using System.Security; +using System.Diagnostics; +using System.Net; +using Renci.SshNet; +using Serilog; +using Newtonsoft.Json.Linq; +using System.ServiceProcess; +using Renci.SshNet.Messages; +using System.Management; +using System.IO; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window; +using System.Management.Automation.Host; +using SharpCompress.Common; +using System.IO.Compression; + +namespace PublishSite +{ + public partial class PublishForm : Form + { + public PublishForm() + { + InitializeComponent(); + + Serilog.Log.Logger = new LoggerConfiguration() + .WriteTo.File("logs\\log.txt", rollingInterval: RollingInterval.Day) + .CreateLogger(); + + } + + public string EnvName = ""; + + public JObject jObjectCofig; + + public string Host = ""; + + public string UserName = ""; + + public string Password = ""; + + private void WinformLog(string message, Color? color = null) + { + if (InvokeRequired) + { + Invoke(new Action(() => WinformLog(message, color))); + return; + } + + + logTBox.SelectionColor = color == null ? Color.Green : (Color)color; + logTBox.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}: {message}" + Environment.NewLine); + Serilog.Log.Information(message); + } + + + #region 切换环境 配置回写 + + private void rb_Env_CheckedChanged(object sender, EventArgs e) + { + + + //本地 + if (rb_local.Checked) + { + EnvName = "本地"; + WinformLog($"当前操作环境切换为: 本地", Color.DarkRed); + + var configJson = File.ReadAllText("appsettings.local.json"); + + jObjectCofig = JObject.Parse(configJson); + + } + //测试 + if (rb_test.Checked) + { + EnvName = "测试"; + WinformLog($"当前操作环境切换为: 测试", Color.DarkRed); + + var configJson = File.ReadAllText("appsettings.Development.json"); + + jObjectCofig = JObject.Parse(configJson); + } + //验证 + if (rb_Verify.Checked) + { + EnvName = "验证"; + WinformLog($"当前操作环境切换为: 验证", Color.DarkRed); + + var configJson = File.ReadAllText("appsettings.Verify.json"); + + jObjectCofig = JObject.Parse(configJson); + } + //生产 + if (rb_production.Checked) + { + EnvName = "生产"; + WinformLog($"当前操作环境切换为: 生产", Color.DarkRed); + + var configJson = File.ReadAllText("appsettings.Production.json"); + + jObjectCofig = JObject.Parse(configJson); + } + + + + #region 界面控件赋值 + + + + Host = rb_local.Checked ? "" : jObjectCofig["Credential"]["Host"].ToString(); + UserName = rb_local.Checked ? "" : jObjectCofig["Credential"]["UserName"].ToString(); + Password = rb_local.Checked ? "" : jObjectCofig["Credential"]["Password"].ToString(); + + + serviceNameTBox.Text = jObjectCofig["DefaultService"]["ServiceName"].ToString(); + serviceDisplayNameTBox.Text = jObjectCofig["DefaultService"]["ServiceDisplayName"].ToString(); + servicePortTBox.Text = jObjectCofig["DefaultService"]["ServicePort"].ToString(); + exePathTbox.Text = jObjectCofig["DefaultService"]["BinPath"].ToString(); + en_TBox.Text = jObjectCofig["DefaultService"]["Env"].ToString(); + + + + startOrStopServiceTbox.Text = jObjectCofig["DefaultService"]["ServiceName"].ToString(); + + + bakDbName.Text = jObjectCofig["BackUp"]["DataBaseName"].ToString(); + backPathTBox.Text = jObjectCofig["BackUp"]["BackPath"].ToString(); + backExePath.Text = jObjectCofig["DefaultService"]["BinPath"].ToString(); + + + var credentialNode = jObjectCofig["Credential"]; + + var defaultServiceNode = jObjectCofig["DefaultService"]; + + var BackUpNode = jObjectCofig["BackUp"]; + + + #endregion + } + + + private void serviceConfigSaveBtn_Click(object sender, EventArgs e) + { + serviceConfigSaveBtn.Enabled = false; + var serviceName = serviceNameTBox.Text; + DialogResult dr = MessageBox.Show($"{EnvName}环境服务配置回写 ?", "保存提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); + + if (dr == DialogResult.OK) + { + var path = string.Empty; + if (rb_local.Checked) + { + path = "appsettings.local.json"; + + } + if (rb_test.Checked) + { + path = "appsettings.Development.json"; + + } + if (rb_Verify.Checked) + { + path = "appsettings.Verify.json"; + + } + if (rb_production.Checked) + { + path = "appsettings.Production.json"; + + } + var configJson = File.ReadAllText(path); + + jObjectCofig = JObject.Parse(configJson); + + jObjectCofig["DefaultService"]["ServiceName"] = serviceNameTBox.Text.Trim(); + jObjectCofig["DefaultService"]["ServiceDisplayName"] = serviceDisplayNameTBox.Text.Trim(); + jObjectCofig["DefaultService"]["ServicePort"] = servicePortTBox.Text.Trim(); + jObjectCofig["DefaultService"]["BinPath"] = exePathTbox.Text.Trim(); + jObjectCofig["DefaultService"]["Env"] = en_TBox.Text.Trim(); + + + File.WriteAllText(path, jObjectCofig.ToString()); + + WinformLog("服务配置回写成功!"); + } + + serviceConfigSaveBtn.Enabled = true; + } + + private void bakConfigSaveBtn_Click(object sender, EventArgs e) + { + bakConfigSaveBtn.Enabled = false; + var serviceName = serviceNameTBox.Text; + DialogResult dr = MessageBox.Show($"{EnvName}环境备份配置回写 ?", "保存提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); + + if (dr == DialogResult.OK) + { + var path = string.Empty; + if (rb_local.Checked) + { + path = "appsettings.local.json"; + + } + if (rb_test.Checked) + { + path = "appsettings.Development.json"; + + } + if (rb_Verify.Checked) + { + path = "appsettings.Verify.json"; + + } + if (rb_production.Checked) + { + path = "appsettings.Production.json"; + + } + var configJson = File.ReadAllText(path); + + jObjectCofig = JObject.Parse(configJson); + + jObjectCofig["BackUp"]["DataBaseName"] = bakDbName.Text.Trim(); + jObjectCofig["BackUp"]["BackPath"] = backPathTBox.Text.Trim(); + + File.WriteAllText(path, jObjectCofig.ToString()); + + WinformLog("备份配置回写成功!"); + bakConfigSaveBtn.Enabled = true; + } + } + + #endregion + + #region 备份 + + + private async void startBakBtn_Click(object sender, EventArgs e) + { + await Task.Run(() => + { + if (rb_local.Checked) + { + WinformLog("本地环境不支持备份操作,懒得开发"); + return; + } + else + { + using (var client = new SshClient(Host, UserName, Password)) + { + // 连接到远程服务器 + client.Connect(); + + try + { + var dbName = bakDbName.Text.Trim(); + var backRootPath = backPathTBox.Text.Trim(); + var serviceName = jObjectCofig["DefaultService"]["ServiceName"].ToString().Trim(); + + var programPath = backExePath.Text.Trim(); + var programFolder = Path.GetDirectoryName(programPath); + + var dbUser = jObjectCofig["BackUp"]["DBUser"].ToString().Trim(); + var dbPwd = jObjectCofig["BackUp"]["DBPwd"].ToString().Trim(); + + + var backupFolderPath = Path.Combine(backRootPath, DateTime.Now.ToString("yyyyMMdd")); + + //创建文件夹 + WinformLog("准备当日备份文件夹..."); + + var command = client.CreateCommand($"if not exist \"{backupFolderPath}\" mkdir \"{backupFolderPath}\""); + command.Execute(); + if (command.ExitStatus != 0) + { + throw new Exception($"Failed to create {backupFolderPath}."); + } + + + //停止服务 + WinformLog($"停止后台服务{serviceName}..."); + + var stopServiceCommand = client.CreateCommand($"sc stop \"{serviceName}\""); + stopServiceCommand.Execute(); + + if (stopServiceCommand.ExitStatus != 0) + { + throw new Exception($"Failed to stop {serviceName}."); + } + + Task.Delay(1000); + //备份后端文件 + + WinformLog($"备份后端文件..."); + string archivePath = $"{backupFolderPath}\\NetCore.zip"; + var compressCommand = client.CreateCommand($"powershell.exe Compress-Archive -Path \"{programFolder}\\*.*\" -DestinationPath \"{archivePath}\" -Force"); + compressCommand.Execute(); + if (compressCommand.ExitStatus != 0) + { + throw new Exception("Failed to compress and move folder contents."); + } + + //启动服务 + WinformLog($"启动后台服务{serviceName}..."); + + var startServiceCommand = client.CreateCommand($"sc start \"{serviceName}\""); + startServiceCommand.Execute(); + + if (startServiceCommand.ExitStatus != 0) + { + throw new Exception($"Failed to start {serviceName}."); + } + + + //备份数据库 + + WinformLog($"开始备份数据库{dbName}..."); + + string databaseBackupPath = $"{backupFolderPath}\\db.bak"; + var sqlcommand = client.CreateCommand($"sqlcmd -S . -U \"{dbUser}\" -P \"{dbPwd}\" -Q \"BACKUP DATABASE [{dbName}] TO DISK='{databaseBackupPath}' WITH INIT\""); + sqlcommand.Execute(); + if (sqlcommand.ExitStatus != 0) + { + throw new Exception("Failed to backup database."); + } + + WinformLog($"备份操作执行结束..."); + } + catch (Exception ex) + { + + WinformLog($"{ex.Message}", Color.Red); + } + } + + } + + }); + } + + + #endregion + + + #region 服务的创建与删除 + + + private string ExecuteCommand(string command) + { + ProcessStartInfo procStartInfo = + new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command); + + procStartInfo.RedirectStandardOutput = true; + procStartInfo.UseShellExecute = false; + procStartInfo.CreateNoWindow = true; + + System.Diagnostics.Process proc = new System.Diagnostics.Process(); + proc.StartInfo = procStartInfo; + proc.Start(); + + return proc.StandardOutput.ReadToEnd(); + } + + private void createService_Btn_Click(object sender, EventArgs e) + { + var serviceName = serviceNameTBox.Text.Trim(); + + var apiBinPath = exePathTbox.Text.Trim(); + + var apiPort = servicePortTBox.Text.Trim(); + + var envName = en_TBox.Text.Trim(); + + var serviceDisplayName = serviceDisplayNameTBox.Text.Trim(); + + + + if (ServiceController.GetServices().Any(t => t.ServiceName == serviceName)) + { + WinformLog($"设置的服务名称已存在,请更换", Color.Red); + + return; + } + + + + + var createTestStr = $"sc create {serviceName} binPath= \"{apiBinPath} --urls=\"http://127.0.0.1:{apiPort}\" --env {envName}\" DisplayName= \"{serviceDisplayName}\" start= auto"; + + WinformLog(createTestStr); + + string output = ExecuteCommand(createTestStr); + + WinformLog(output); + + + WinformLog("服务创建执行结束"); + + } + + private async void deleteService_Btn_Click(object sender, EventArgs e) + { + var serviceName = serviceNameTBox.Text; + DialogResult dr = MessageBox.Show($"{EnvName}环境删除服务:{serviceName}?", "删除提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); + + if (dr == DialogResult.OK) + { + + await Task.Run(() => + { + + if (rb_local.Checked) + { + ProcessStartInfo startInfo = new ProcessStartInfo(); + startInfo.FileName = "cmd.exe"; + startInfo.Arguments = $"/c sc query {serviceName} | find \"STATE\" | find /i \"RUNNING\" && net stop {serviceName} & sc delete {serviceName}"; + + // 在后台运行命令行窗口 + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.CreateNoWindow = true; + + using (Process process = new Process()) + { + process.StartInfo = startInfo; + process.Start(); + + process.WaitForExit(); + + if (process.ExitCode == 0) + { + WinformLog($"{serviceName} 服务已经成功删除!"); + } + else + { + WinformLog($"尝试停止并删除 {serviceName} 服务失败,请检查是否拥有管理员权限或服务是否存在。", Color.Red); + } + } + } + else + { + + using (var client = new SshClient(Host, UserName, Password)) + { + // 连接到远程服务器 + client.Connect(); + + // 停止服务 + string stopCommand = $"sc stop {serviceName}"; + using (var stopCmd = client.CreateCommand(stopCommand)) + { + WinformLog(stopCommand); + var stopOutput = stopCmd.Execute(); + WinformLog(stopOutput); + } + + // 删除服务 + string deleteCommand = $"sc delete {serviceName}"; + using (var deleteCmd = client.CreateCommand(deleteCommand)) + { + WinformLog(deleteCommand); + var deleteOutput = deleteCmd.Execute(); + WinformLog(deleteOutput); + } + + // 断开SSH连接 + client.Disconnect(); + } + + } + + + }); + + + } + + } + + private void selectPathBtn_Click(object sender, EventArgs e) + { + if (rb_local.Checked) + { + + OpenFileDialog dialog = new OpenFileDialog(); + if (dialog.ShowDialog() == DialogResult.OK) + { + exePathTbox.Text = dialog.FileName; + + WinformLog($"部署启动文件选择成功", Color.Green); + } + } + else + { + WinformLog("远程环境不支持直接选择目录", Color.Red); + } + } + + #endregion + + + + #region 测试环境发布 + + private async void vuePublishBtn_Click(object sender, EventArgs e) + { + + vuePublishBtn.Enabled = false; + + await Task.Run(() => + { + + using (var client = new SshClient("123.56.94.154", "Administrator", "WHxckj2019")) + { + // 连接到远程服务器 + client.Connect(); + + //&& ./IRaCIS_Vue_Web.bat + string command = $@"cd C:\Users\Administrator\VueSourceCode && npm i && npm run build"; + + + using (var cmd = client.CreateCommand(command)) + { + + WinformLog("测试环境:开始执行前端发布"); + + WinformLog(command); + + + var output = cmd.Execute(); + + WinformLog(output); + + + var output3 = cmd.Execute($@"xcopy /Y /Q ""C:\Users\Administrator\VueSourceCode\dist\index.html"" ""D:\Develop\PublishSite\IRaCIS.Vue.Web\dist\"""); + + WinformLog(output); + + WinformLog("测试环境:前端发布成功"); + } + + // 断开SSH连接 + client.Disconnect(); + } + + }); + + vuePublishBtn.Enabled = true; + + } + + private async void netCorePublishBtn_Click(object sender, EventArgs e) + { + + netCorePublishBtn.Enabled = false; + await Task.Run(() => + { + + + using (var client = new SshClient("123.56.94.154", "Administrator", "WHxckj2019")) + { + // 连接到远程服务器 + client.Connect(); + + string command = $@"C:\Users\Administrator\bat\IRaCIS_Core_API.bat"; + + + using (var cmd = client.CreateCommand(command)) + { + + WinformLog("测试环境:开始执行后端发布"); + + WinformLog(command); + + var output = cmd.Execute(); + + WinformLog(output); + + WinformLog("测试环境:后端发布成功"); + } + + // 断开SSH连接 + client.Disconnect(); + } + + }); + netCorePublishBtn.Enabled = true; + + } + + #endregion + + + #region 服务的启动与停止 + + private async void startServiceBtn_Click(object sender, EventArgs e) + { + startServiceBtn.Enabled = false; + + await Task.Run(() => + { + if (rb_local.Checked) + { + ServiceController controller = new ServiceController($"{startOrStopServiceTbox.Text}"); + if (controller?.Status == ServiceControllerStatus.Running) + { + controller.Stop(); + controller.WaitForStatus(ServiceControllerStatus.Stopped); + } + else + { + WinformLog("服务不是停止状态", Color.Red); + } + return; + } + + using (var client = new SshClient(Host, UserName, Password)) + { + // 连接到远程服务器 + client.Connect(); + + string command = $@"sc start {startOrStopServiceTbox.Text}"; + + + using (var cmd = client.CreateCommand(command)) + { + WinformLog(command); + + var output = cmd.Execute(); + + WinformLog(output); + } + + // 断开SSH连接 + client.Disconnect(); + } + + + + }); + startServiceBtn.Enabled = true; + } + + private async void stopServiceBtn_Click(object sender, EventArgs e) + { + startServiceBtn.Enabled = false; + await Task.Run(() => + { + if (rb_local.Checked) + { + ServiceController controller = new ServiceController($"{startOrStopServiceTbox.Text}"); + if (controller?.Status == ServiceControllerStatus.Running) + { + controller.Stop(); + controller.WaitForStatus(ServiceControllerStatus.Stopped); + } + else + { + WinformLog("服务不是启动状态", Color.Red); + } + return; + } + + + using (var client = new SshClient(Host, UserName, Password)) + { + // 连接到远程服务器 + client.Connect(); + + string command = $@"sc stop {startOrStopServiceTbox.Text}"; + + + using (var cmd = client.CreateCommand(command)) + { + WinformLog(command); + + var output = cmd.Execute(); + + WinformLog(output); + } + + // 断开SSH连接 + client.Disconnect(); + } + + }); + startServiceBtn.Enabled = true; + } + + #endregion + + + #region 上传文件到远程服务器发布 + + + private void selectPublishFilePathBtn_Click(object sender, EventArgs e) + { + + + OpenFileDialog dialog = new OpenFileDialog(); + if (dialog.ShowDialog() == DialogResult.OK) + { + publishFileTBox.Text = dialog.FileName; + + WinformLog($"远程部署文件选择成功", Color.Green); + } + + } + + private void selectPublishFolderPathBtn_Click(object sender, EventArgs e) + { + FolderBrowserDialog dialog = new FolderBrowserDialog(); + dialog.Description = "选择目录"; + if (dialog.ShowDialog() == DialogResult.OK) + { + publishFolderTBox.Text = dialog.SelectedPath; + + WinformLog($"远程部署后端发布文件夹选择成功", Color.Green); + } + } + + private async void sshVuePublishBtn_Click(object sender, EventArgs e) + { + var desTinationFoder = jObjectCofig["BackUp"]["VuePublishFolder"].ToString(); + + + sshVuePublishBtn.Enabled = false; + var filePath = publishFileTBox.Text; + + var realName = Path.GetFileName(filePath); + + var storeTempName = $"{Guid.NewGuid()}_{realName}"; + + if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) + { + WinformLog($"请选择存在的文件才能开始发布", Color.Red); + return; + } + + + WinformLog($"开始上传前端部署文件{Path.GetFileName(filePath)}..."); + + + await Task.Run(() => + { + + + using (var client = new SshClient(Host, UserName, Password)) + { + client.ConnectionInfo.Encoding = System.Text.Encoding.UTF8; + // 连接到远程服务器 + client.Connect(); + + using (var scpClient = new ScpClient(Host, UserName, Password)) + { + scpClient.Connect(); + + using (var fileStream = new FileStream(filePath, FileMode.Open)) + { + scpClient.Upload(fileStream, @$"/{storeTempName}"); + } + + scpClient.Disconnect(); + + WinformLog($"上传{realName}结束"); + } + + string command = $@"xcopy /Y /Q ""C:\{storeTempName}"" ""{desTinationFoder}"""; + + //拷贝文件到发布文件夹 + using (var cmd = client.CreateCommand(command)) + { + WinformLog(command); + + var output = cmd.Execute(); + + WinformLog(output); + } + + //删除临时文件 + + var delCommand = $"move /Y \"{Path.Combine(desTinationFoder, storeTempName)}\" \"{Path.Combine(desTinationFoder, realName)}\" && del C:\\{storeTempName}"; + using (var cmd = client.CreateCommand(delCommand)) + { + WinformLog(delCommand); + + var output = cmd.Execute(); + + WinformLog(output); + } + + WinformLog($"清除零时文件{storeTempName}完成"); + + // 断开SSH连接 + client.Disconnect(); + + WinformLog($"前端发布成功"); + } + + + }); + + + WinformLog($"前端你发布结束"); + + sshVuePublishBtn.Enabled = true; + + } + + private async void sshNetCorePublishBtn_Click(object sender, EventArgs e) + { + var binPath = jObjectCofig["DefaultService"]["BinPath"].ToString(); + + var desTinationFoder = Path.GetDirectoryName(binPath); + + sshNetCorePublishBtn.Enabled = false; + var filePath = publishFileTBox.Text; + var realName = Path.GetFileName(filePath); + + var storeTempName = $"{Guid.NewGuid()}_{realName}"; + + if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) + { + WinformLog($"请选择存在的文件才能开始发布", Color.Red); + return; + } + + if (!string.Equals(Path.GetExtension(realName), ".zip", StringComparison.OrdinalIgnoreCase)) + { + WinformLog($"后端远程发布的压缩包必须是zip格式,并且不带目录", Color.Red); + return; + } + + WinformLog($"开始上传后端部署文件{realName}..."); + + await NetCoreZipPublishAsync(filePath, desTinationFoder); + + WinformLog($"后端发布结束"); + sshNetCorePublishBtn.Enabled = true; + } + + private async Task NetCoreZipPublishAsync(string filePath, string desTinationFoder) + { + var realName = Path.GetFileName(filePath); + + var storeTempName = $"{Guid.NewGuid()}_{realName}"; + + + + await Task.Run(async () => + { + using (var client = new SshClient(Host, UserName, Password)) + { + client.ConnectionInfo.Encoding = System.Text.Encoding.UTF8; + // 连接到远程服务器 + client.Connect(); + + using (var scpClient = new ScpClient(Host, UserName, Password)) + { + scpClient.Connect(); + + using (var fileStream = new FileStream(filePath, FileMode.Open)) + { + scpClient.Upload(fileStream, @$"/{storeTempName}"); + } + + scpClient.Disconnect(); + + WinformLog($"上传{realName}结束"); + } + + + //后端发布,处理压缩包流程 + + //停止服务 + stopServiceBtn_Click(null, null); + + await Task.Delay(2000); + + //解压到发布的目录 + string expandCommand = $"Expand-Archive -Path '{filePath}' -DestinationPath '{desTinationFoder}' -Force"; + + + using (var cmd = client.CreateCommand($"powershell.exe {expandCommand}")) + { + WinformLog(expandCommand); + + var output = cmd.Execute(); + + WinformLog(output); + } + + //启动服务 + startServiceBtn_Click(null, null); + + + //删除临时文件 + + var delCommand = $" del C:\\{storeTempName}"; + + using (var cmd = client.CreateCommand(delCommand)) + { + WinformLog(delCommand); + + var output = cmd.Execute(); + + WinformLog(output); + } + + WinformLog($"清除零时文件{storeTempName}完成"); + + // 断开SSH连接 + client.Disconnect(); + + + } + }); + } + + + + + private async void sshNetCorePublishBtn2_Click(object sender, EventArgs e) + { + + var binPath = jObjectCofig["DefaultService"]["BinPath"].ToString(); + + var localSourceFolder = publishFolderTBox.Text; + + var desTinationFoder = Path.GetDirectoryName(binPath); + + sshNetCorePublishBtn2.Enabled = false; + + WinformLog($"开始打包该文件夹下的内容..."); + + var filePath = Path.Combine(localSourceFolder, "NetCorePublish.zip"); + + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + + try + { + //将文件夹里的内容打包成压缩包 + ZipFile.CreateFromDirectory(localSourceFolder, filePath); + } + catch (Exception ex) + { + + WinformLog("错误:" + ex.Message, Color.Red); + } + + + + + await NetCoreZipPublishAsync(filePath, desTinationFoder); + + WinformLog($"后端发布结束"); + sshNetCorePublishBtn2.Enabled = true; + } + + #endregion + + + + } +} diff --git a/PublishSite/PublishForm.resx b/PublishSite/PublishForm.resx new file mode 100644 index 00000000..91fcf53d --- /dev/null +++ b/PublishSite/PublishForm.resx @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 165, 17 + + + 349, 17 + + \ No newline at end of file diff --git a/PublishSite/PublishSite.csproj b/PublishSite/PublishSite.csproj new file mode 100644 index 00000000..8882147f --- /dev/null +++ b/PublishSite/PublishSite.csproj @@ -0,0 +1,50 @@ + + + + WinExe + net6.0-windows + enable + true + enable + AnyCPU;x64 + + + + + + + + + + + + PreserveNewest + true + PreserveNewest + + + PreserveNewest + true + PreserveNewest + + + PreserveNewest + true + PreserveNewest + + + PreserveNewest + true + PreserveNewest + + + + + + + + + + + + \ No newline at end of file diff --git a/PublishSite/appsettings.Development.json b/PublishSite/appsettings.Development.json new file mode 100644 index 00000000..8c1fecdf --- /dev/null +++ b/PublishSite/appsettings.Development.json @@ -0,0 +1,23 @@ +{ + "BackUp": { + "DataBaseName": "IRaCIS_New_Tet", + "DBUser": "sa", + "DBPwd": "dev123456DEV", + "BackPath": "D:\\Develop\\PublishSite\\发布备份", + "VuePublishFolder": "D:\\Develop\\PublishSite\\IRaCIS.Vue.Web\\dist", + "ConnectionStrings": "Server=.;Database=IRaCIS;Trusted_Connection=True;TrustServerCertificate=true" + }, + "Credential": { + "Host": "123.56.94.154", + "UserName": "Administrator", + "Password": "WHxckj2019" + }, + "DefaultService": { + "ServiceName": "NetCore.IRaCIS.Api", + "ServiceDisplayName": "CICD_IRaCIS.Core.API", + "ServicePort": "7100", + "BinPath": "D:\\Develop\\PublishSite\\IRaCIS.NetCore.API\\IRaCIS.Core.API.exe", + "Env": "Development" + }, + +} diff --git a/PublishSite/appsettings.Production.json b/PublishSite/appsettings.Production.json new file mode 100644 index 00000000..d898247d --- /dev/null +++ b/PublishSite/appsettings.Production.json @@ -0,0 +1,21 @@ +{ + "BackUp": { + "DataBaseName": "IRaCIS_New_Tet", + "DBUser": "sa", + "DBPwd": "dev123456DEV", + "BackPath": "D:\\Develop\\PublishSite\\发布备份", + "ConnectionStrings": "Server=.;Database=IRaCIS;Trusted_Connection=True;TrustServerCertificate=true" + }, + "Credential": { + "Host": "123.56.94.154", + "UserName": "Administrator", + "Password": "WHxckj2019" + }, + "DefaultService": { + "ServiceName": "NetCore.IRaCIS.Api", + "ServiceDisplayName": "CICD_IRaCIS.Core.API", + "ServicePort": "7100", + "BinPath": "D:\\Develop\\PublishSite\\IRaCIS.NetCore.API\\IRaCIS.Core.API.exe", + "Env": "Development" + } +} diff --git a/PublishSite/appsettings.Verify.json b/PublishSite/appsettings.Verify.json new file mode 100644 index 00000000..d898247d --- /dev/null +++ b/PublishSite/appsettings.Verify.json @@ -0,0 +1,21 @@ +{ + "BackUp": { + "DataBaseName": "IRaCIS_New_Tet", + "DBUser": "sa", + "DBPwd": "dev123456DEV", + "BackPath": "D:\\Develop\\PublishSite\\发布备份", + "ConnectionStrings": "Server=.;Database=IRaCIS;Trusted_Connection=True;TrustServerCertificate=true" + }, + "Credential": { + "Host": "123.56.94.154", + "UserName": "Administrator", + "Password": "WHxckj2019" + }, + "DefaultService": { + "ServiceName": "NetCore.IRaCIS.Api", + "ServiceDisplayName": "CICD_IRaCIS.Core.API", + "ServicePort": "7100", + "BinPath": "D:\\Develop\\PublishSite\\IRaCIS.NetCore.API\\IRaCIS.Core.API.exe", + "Env": "Development" + } +} diff --git a/PublishSite/appsettings.local.json b/PublishSite/appsettings.local.json new file mode 100644 index 00000000..d898247d --- /dev/null +++ b/PublishSite/appsettings.local.json @@ -0,0 +1,21 @@ +{ + "BackUp": { + "DataBaseName": "IRaCIS_New_Tet", + "DBUser": "sa", + "DBPwd": "dev123456DEV", + "BackPath": "D:\\Develop\\PublishSite\\发布备份", + "ConnectionStrings": "Server=.;Database=IRaCIS;Trusted_Connection=True;TrustServerCertificate=true" + }, + "Credential": { + "Host": "123.56.94.154", + "UserName": "Administrator", + "Password": "WHxckj2019" + }, + "DefaultService": { + "ServiceName": "NetCore.IRaCIS.Api", + "ServiceDisplayName": "CICD_IRaCIS.Core.API", + "ServicePort": "7100", + "BinPath": "D:\\Develop\\PublishSite\\IRaCIS.NetCore.API\\IRaCIS.Core.API.exe", + "Env": "Development" + } +} diff --git a/Setup/Setup.vdproj b/Setup/Setup.vdproj new file mode 100644 index 00000000..3af2f835 --- /dev/null +++ b/Setup/Setup.vdproj @@ -0,0 +1,739 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:Setup" +"LanguageId" = "3:2052" +"CodePage" = "3:936" +"UILanguageId" = "3:2052" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\Setup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\Setup.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:FALSE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2" + { + "Name" = "8:Microsoft .NET Framework 4.7.2 (x86 和 x64)" + "ProductCode" = "8:.NETFramework,Version=v4.7.2" + } + } + } + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_82AF8F8B74E245D4ABFA965071D1D4BD" + { + "Name" = "8:.NET Framework" + "Message" = "8:[VSDNETMSG]" + "FrameworkVersion" = "8:.NETFramework,Version=v4.7.2" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=863262" + } + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_9BBAA0CBBBA347BBBC95686B1095EBAE" + { + "Name" = "8:.NET Core" + "Message" = "8:[VSDNETCOREMSG]" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]" + "IsNETCore" = "11:TRUE" + "Architecture" = "2:0" + "Runtime" = "2:0" + } + } + } + "File" + { + } + "FileType" + { + } + "Folder" + { + "{1525181F-901A-416C-8A58-119130FE478E}:_60FA83C992754A1B8BF679093C1C4F14" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + } + } + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_6E9287D3322D4BEBAEB7649868E0D282" + { + "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_B44A76B96ACA4E0AAC6741E90A0CBAC9" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:2052" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:Setup" + "ProductCode" = "8:{64317A3E-23E9-40DF-AD1E-1B6C40D76413}" + "PackageCode" = "8:{B24EEDEC-B603-4438-92D9-A278FEB65C7A}" + "UpgradeCode" = "8:{132CFAC4-0C5E-446B-A2CE-52656960C587}" + "AspNetVersion" = "8:4.0.30319.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:FALSE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:FALSE" + "ProductVersion" = "8:1.0.0" + "Manufacturer" = "8:微软中国" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:" + "Title" = "8:Setup" + "Subject" = "8:" + "ARPCONTACT" = "8:微软中国" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:" + "ARPURLINFOABOUT" = "8:" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A678DC932E604B1CB223970418A53410" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_93385585FF164196A5EE312677B53681" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_37A64A7097AF4D0BAD884D6AAFCD5E70" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B24C858173B8470D9DD14F428E55143E" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + } + "UserInterface" + { + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_028CDFFF1BFD4299898804346A1ED7D3" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_893D5979F5034F7F96354176DEB4E955" + { + "Sequence" = "3:100" + "DisplayName" = "8:已完成" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_0C0B99E397324B1694CC3E3C81D8EA01" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_19FE24FAECEA47C4B2D477DDF7667C05" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7A45C655C46D4F53A48DEA0AF1399EA1" + { + "Sequence" = "3:100" + "DisplayName" = "8:已完成" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_36F5FAFAF79549EAB291788F03583A26" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2200E098CA604C07B0E20180AE7F9403" + { + "Sequence" = "3:300" + "DisplayName" = "8:确认安装" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_DD04E9526B414A28872A019440DC3B94" + { + "Sequence" = "3:200" + "DisplayName" = "8:安装文件夹" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F25568B5A9EF42FEBA0A371EFCD83B34" + { + "Sequence" = "3:100" + "DisplayName" = "8:欢迎使用" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_654072C060B74DB4AD3184CF46E5DBCA" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2E9583B5BDB847A285F55D44BE88A9F3" + { + "Sequence" = "3:100" + "DisplayName" = "8:进度" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_88E15E67E0BC432ABBD9B4BD3105402A" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B327D85D96854C8EA7C683DBCC32457F" + { + "Sequence" = "3:100" + "DisplayName" = "8:进度" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_EA4972BC58A04C21BF04C9420E81DFA3" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_FD87AC69128E41AAA55F5CE03C4D557C" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3E8F4669290C4BB9A3F846811ABBD603" + { + "Sequence" = "3:300" + "DisplayName" = "8:确认安装" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9A0CDD41FA1646D5AD7EF00F9CC26E20" + { + "Sequence" = "3:100" + "DisplayName" = "8:欢迎使用" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D2AD6A2CD5DE44A1B26D9FEEF5E80505" + { + "Sequence" = "3:200" + "DisplayName" = "8:安装文件夹" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_29F0BA7E33EF4A3280289EB0189C3BA5" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_6E9287D3322D4BEBAEB7649868E0D282" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:Release|Any CPU" + "OutputGroupCanonicalName" = "8:PublishItems" + "OutputProjectGuid" = "8:{F15CE209-6039-46A6-AE7F-E81ADA795F28}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_690ED380518A4FA08422BC680CE5986E" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_6E9287D3322D4BEBAEB7649868E0D282" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:Release|Any CPU" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{F15CE209-6039-46A6-AE7F-E81ADA795F28}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +} diff --git a/Start/EI_Image_Viewer_Installer.csproj b/Start/EI_Image_Viewer_Installer.csproj new file mode 100644 index 00000000..51264946 --- /dev/null +++ b/Start/EI_Image_Viewer_Installer.csproj @@ -0,0 +1,67 @@ + + + + WinExe + net6.0-windows + enable + true + enable + AnyCPU;x64 + favicon.ico + + 1.0.0.001 + 武汉行藏科技有限公司版权所有 + 医学影像处理软件安装程序 + 1.0.0.001 + + + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Start/Main.Designer.cs b/Start/Main.Designer.cs new file mode 100644 index 00000000..96294a17 --- /dev/null +++ b/Start/Main.Designer.cs @@ -0,0 +1,499 @@ +namespace Start +{ + partial class Main + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); + groupBox1 = new GroupBox(); + connectButton = new Button(); + passwordTextBox = new TextBox(); + usernameTextBox = new TextBox(); + serverTextBox = new TextBox(); + label3 = new Label(); + label2 = new Label(); + label1 = new Label(); + groupBox2 = new GroupBox(); + nginxServiceDisplayNameTbox = new TextBox(); + nginxServiceNameTbox = new TextBox(); + label12 = new Label(); + label13 = new Label(); + confimDeployBtn = new Button(); + serviceDisplayNameTBox = new TextBox(); + serviceNameTBox = new TextBox(); + label11 = new Label(); + label10 = new Label(); + selectPathBtn = new Button(); + folderPathTbox = new TextBox(); + label9 = new Label(); + dbNameTBox = new TextBox(); + label8 = new Label(); + apiPortTBox = new TextBox(); + nginxPortTBox = new TextBox(); + label4 = new Label(); + label5 = new Label(); + groupBox3 = new GroupBox(); + btnCopy = new Button(); + activeBtn = new Button(); + KeySecreteTextBox = new TextBox(); + machineTextBox = new TextBox(); + machineCodeLB = new Label(); + label6 = new Label(); + label7 = new Label(); + groupBox4 = new GroupBox(); + logTBox = new RichTextBox(); + folderBrowserDialog1 = new FolderBrowserDialog(); + groupBox1.SuspendLayout(); + groupBox2.SuspendLayout(); + groupBox3.SuspendLayout(); + groupBox4.SuspendLayout(); + SuspendLayout(); + // + // groupBox1 + // + groupBox1.Controls.Add(connectButton); + groupBox1.Controls.Add(passwordTextBox); + groupBox1.Controls.Add(usernameTextBox); + groupBox1.Controls.Add(serverTextBox); + groupBox1.Controls.Add(label3); + groupBox1.Controls.Add(label2); + groupBox1.Controls.Add(label1); + groupBox1.Location = new Point(11, 12); + groupBox1.Name = "groupBox1"; + groupBox1.Size = new Size(547, 205); + groupBox1.TabIndex = 0; + groupBox1.TabStop = false; + groupBox1.Text = "第一步:验证数据库"; + // + // connectButton + // + connectButton.Location = new Point(195, 150); + connectButton.Name = "connectButton"; + connectButton.Size = new Size(128, 40); + connectButton.TabIndex = 6; + connectButton.Text = "测试连接"; + connectButton.UseVisualStyleBackColor = true; + connectButton.Click += connectButton_Click; + // + // passwordTextBox + // + passwordTextBox.Location = new Point(154, 113); + passwordTextBox.Name = "passwordTextBox"; + passwordTextBox.PasswordChar = '*'; + passwordTextBox.Size = new Size(271, 23); + passwordTextBox.TabIndex = 5; + // + // usernameTextBox + // + usernameTextBox.Location = new Point(156, 73); + usernameTextBox.Name = "usernameTextBox"; + usernameTextBox.Size = new Size(271, 23); + usernameTextBox.TabIndex = 4; + usernameTextBox.Text = "sa"; + // + // serverTextBox + // + serverTextBox.Location = new Point(156, 33); + serverTextBox.Name = "serverTextBox"; + serverTextBox.Size = new Size(271, 23); + serverTextBox.TabIndex = 3; + serverTextBox.Text = "."; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(107, 113); + label3.Name = "label3"; + label3.Size = new Size(32, 17); + label3.TabIndex = 2; + label3.Text = "密码"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(101, 73); + label2.Name = "label2"; + label2.Size = new Size(44, 17); + label2.TabIndex = 1; + label2.Text = "登录名"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(95, 33); + label1.Name = "label1"; + label1.Size = new Size(56, 17); + label1.TabIndex = 0; + label1.Text = "服务器名"; + // + // groupBox2 + // + groupBox2.Controls.Add(nginxServiceDisplayNameTbox); + groupBox2.Controls.Add(nginxServiceNameTbox); + groupBox2.Controls.Add(label12); + groupBox2.Controls.Add(label13); + groupBox2.Controls.Add(confimDeployBtn); + groupBox2.Controls.Add(serviceDisplayNameTBox); + groupBox2.Controls.Add(serviceNameTBox); + groupBox2.Controls.Add(label11); + groupBox2.Controls.Add(label10); + groupBox2.Controls.Add(selectPathBtn); + groupBox2.Controls.Add(folderPathTbox); + groupBox2.Controls.Add(label9); + groupBox2.Controls.Add(dbNameTBox); + groupBox2.Controls.Add(label8); + groupBox2.Controls.Add(apiPortTBox); + groupBox2.Controls.Add(nginxPortTBox); + groupBox2.Controls.Add(label4); + groupBox2.Controls.Add(label5); + groupBox2.Location = new Point(12, 223); + groupBox2.Name = "groupBox2"; + groupBox2.Size = new Size(546, 468); + groupBox2.TabIndex = 1; + groupBox2.TabStop = false; + groupBox2.Text = "第二步: 部署参数配置"; + // + // nginxServiceDisplayNameTbox + // + nginxServiceDisplayNameTbox.Location = new Point(151, 368); + nginxServiceDisplayNameTbox.Name = "nginxServiceDisplayNameTbox"; + nginxServiceDisplayNameTbox.Size = new Size(259, 23); + nginxServiceDisplayNameTbox.TabIndex = 23; + nginxServiceDisplayNameTbox.Text = "EI_Nginx_Self_Starting"; + // + // nginxServiceNameTbox + // + nginxServiceNameTbox.Location = new Point(151, 322); + nginxServiceNameTbox.Name = "nginxServiceNameTbox"; + nginxServiceNameTbox.Size = new Size(259, 23); + nginxServiceNameTbox.TabIndex = 22; + nginxServiceNameTbox.Text = "EI_Nginx"; + // + // label12 + // + label12.AutoSize = true; + label12.Location = new Point(27, 368); + label12.Name = "label12"; + label12.Size = new Size(111, 17); + label12.TabIndex = 21; + label12.Text = "nginx服务显示名称"; + // + // label13 + // + label13.AutoSize = true; + label13.Location = new Point(51, 322); + label13.Name = "label13"; + label13.Size = new Size(87, 17); + label13.TabIndex = 20; + label13.Text = "nginx服务名称"; + // + // confimDeployBtn + // + confimDeployBtn.Enabled = false; + confimDeployBtn.Location = new Point(195, 409); + confimDeployBtn.Name = "confimDeployBtn"; + confimDeployBtn.Size = new Size(128, 40); + confimDeployBtn.TabIndex = 19; + confimDeployBtn.Text = "确认部署配置"; + confimDeployBtn.UseVisualStyleBackColor = true; + confimDeployBtn.Click += confimDeployBtn_Click; + // + // serviceDisplayNameTBox + // + serviceDisplayNameTBox.Location = new Point(152, 274); + serviceDisplayNameTBox.Name = "serviceDisplayNameTBox"; + serviceDisplayNameTBox.Size = new Size(259, 23); + serviceDisplayNameTBox.TabIndex = 16; + serviceDisplayNameTBox.Text = "EI_Image_Viewer_DisplayName"; + // + // serviceNameTBox + // + serviceNameTBox.Location = new Point(152, 228); + serviceNameTBox.Name = "serviceNameTBox"; + serviceNameTBox.Size = new Size(259, 23); + serviceNameTBox.TabIndex = 15; + serviceNameTBox.Text = "EI_Image_Viewer"; + // + // label11 + // + label11.AutoSize = true; + label11.Location = new Point(11, 277); + label11.Name = "label11"; + label11.Size = new Size(128, 17); + label11.TabIndex = 14; + label11.Text = "网站后端服务显示名称"; + // + // label10 + // + label10.AutoSize = true; + label10.Location = new Point(35, 231); + label10.Name = "label10"; + label10.Size = new Size(104, 17); + label10.TabIndex = 13; + label10.Text = "网站后端服务名称"; + // + // selectPathBtn + // + selectPathBtn.Enabled = false; + selectPathBtn.Location = new Point(429, 43); + selectPathBtn.Name = "selectPathBtn"; + selectPathBtn.Size = new Size(95, 27); + selectPathBtn.TabIndex = 12; + selectPathBtn.Text = "选择"; + selectPathBtn.UseVisualStyleBackColor = true; + selectPathBtn.Click += selectPathBtn_Click; + // + // folderPathTbox + // + folderPathTbox.Enabled = false; + folderPathTbox.Location = new Point(152, 44); + folderPathTbox.Name = "folderPathTbox"; + folderPathTbox.Size = new Size(259, 23); + folderPathTbox.TabIndex = 11; + // + // label9 + // + label9.AutoSize = true; + label9.Location = new Point(83, 48); + label9.Name = "label9"; + label9.Size = new Size(56, 17); + label9.TabIndex = 10; + label9.Text = "部署路径"; + // + // dbNameTBox + // + dbNameTBox.Location = new Point(152, 182); + dbNameTBox.Name = "dbNameTBox"; + dbNameTBox.Size = new Size(259, 23); + dbNameTBox.TabIndex = 9; + dbNameTBox.Text = "IRaCIS"; + // + // label8 + // + label8.AutoSize = true; + label8.Location = new Point(47, 185); + label8.Name = "label8"; + label8.Size = new Size(92, 17); + label8.TabIndex = 8; + label8.Text = "部署数据库名称"; + // + // apiPortTBox + // + apiPortTBox.Location = new Point(152, 136); + apiPortTBox.Name = "apiPortTBox"; + apiPortTBox.Size = new Size(259, 23); + apiPortTBox.TabIndex = 5; + apiPortTBox.Text = "7100"; + // + // nginxPortTBox + // + nginxPortTBox.Location = new Point(152, 90); + nginxPortTBox.Name = "nginxPortTBox"; + nginxPortTBox.Size = new Size(259, 23); + nginxPortTBox.TabIndex = 4; + nginxPortTBox.Text = "9520"; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(11, 140); + label4.Name = "label4"; + label4.Size = new Size(128, 17); + label4.TabIndex = 3; + label4.Text = "网站后端服务启动端口"; + // + // label5 + // + label5.AutoSize = true; + label5.Location = new Point(35, 93); + label5.Name = "label5"; + label5.Size = new Size(104, 17); + label5.TabIndex = 2; + label5.Text = "网站前端访问端口"; + // + // groupBox3 + // + groupBox3.Controls.Add(btnCopy); + groupBox3.Controls.Add(activeBtn); + groupBox3.Controls.Add(KeySecreteTextBox); + groupBox3.Controls.Add(machineTextBox); + groupBox3.Controls.Add(machineCodeLB); + groupBox3.Controls.Add(label6); + groupBox3.Controls.Add(label7); + groupBox3.Location = new Point(11, 714); + groupBox3.Name = "groupBox3"; + groupBox3.Size = new Size(544, 221); + groupBox3.TabIndex = 2; + groupBox3.TabStop = false; + groupBox3.Text = "第三步:激活与部署"; + // + // btnCopy + // + btnCopy.Location = new Point(429, 39); + btnCopy.Name = "btnCopy"; + btnCopy.Size = new Size(93, 27); + btnCopy.TabIndex = 13; + btnCopy.Text = "复制"; + btnCopy.UseVisualStyleBackColor = true; + btnCopy.Click += btnCopy_Click; + // + // activeBtn + // + activeBtn.Enabled = false; + activeBtn.Location = new Point(195, 139); + activeBtn.Name = "activeBtn"; + activeBtn.Size = new Size(128, 40); + activeBtn.TabIndex = 9; + activeBtn.Text = "激活并部署"; + activeBtn.UseVisualStyleBackColor = true; + activeBtn.Click += activeBtn_Click; + // + // KeySecreteTextBox + // + KeySecreteTextBox.Location = new Point(152, 92); + KeySecreteTextBox.Name = "KeySecreteTextBox"; + KeySecreteTextBox.Size = new Size(259, 23); + KeySecreteTextBox.TabIndex = 8; + // + // machineTextBox + // + machineTextBox.Location = new Point(152, 42); + machineTextBox.Name = "machineTextBox"; + machineTextBox.ReadOnly = true; + machineTextBox.Size = new Size(259, 23); + machineTextBox.TabIndex = 7; + // + // machineCodeLB + // + machineCodeLB.AutoSize = true; + machineCodeLB.Location = new Point(163, 44); + machineCodeLB.Name = "machineCodeLB"; + machineCodeLB.Size = new Size(0, 17); + machineCodeLB.TabIndex = 6; + // + // label6 + // + label6.AutoSize = true; + label6.Location = new Point(95, 94); + label6.Name = "label6"; + label6.Size = new Size(44, 17); + label6.TabIndex = 5; + label6.Text = "激活码"; + // + // label7 + // + label7.AutoSize = true; + label7.Location = new Point(95, 44); + label7.Name = "label7"; + label7.Size = new Size(44, 17); + label7.TabIndex = 4; + label7.Text = "机器码"; + // + // groupBox4 + // + groupBox4.Controls.Add(logTBox); + groupBox4.Location = new Point(570, 11); + groupBox4.Name = "groupBox4"; + groupBox4.Size = new Size(391, 825); + groupBox4.TabIndex = 4; + groupBox4.TabStop = false; + groupBox4.Text = "部署日志"; + // + // logTBox + // + logTBox.Location = new Point(6, 22); + logTBox.Name = "logTBox"; + logTBox.Size = new Size(359, 797); + logTBox.TabIndex = 0; + logTBox.Text = ""; + // + // Main + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(977, 944); + Controls.Add(groupBox4); + Controls.Add(groupBox3); + Controls.Add(groupBox2); + Controls.Add(groupBox1); + Icon = (Icon)resources.GetObject("$this.Icon"); + Name = "Main"; + Text = "安装 - EI Image Viewer V1"; + TopMost = true; + Load += Main_Load; + groupBox1.ResumeLayout(false); + groupBox1.PerformLayout(); + groupBox2.ResumeLayout(false); + groupBox2.PerformLayout(); + groupBox3.ResumeLayout(false); + groupBox3.PerformLayout(); + groupBox4.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private GroupBox groupBox1; + private Label label3; + private Label label2; + private Label label1; + private TextBox passwordTextBox; + private TextBox usernameTextBox; + private TextBox serverTextBox; + private Button connectButton; + private GroupBox groupBox2; + private TextBox apiPortTBox; + private TextBox nginxPortTBox; + private Label label4; + private Label label5; + private GroupBox groupBox3; + private Label machineCodeLB; + private Label label6; + private Label label7; + private Button activeBtn; + private TextBox KeySecreteTextBox; + private TextBox machineTextBox; + private GroupBox groupBox4; + private RichTextBox logTBox; + private TextBox dbNameTBox; + private Label label8; + private Button selectPathBtn; + private TextBox folderPathTbox; + private Label label9; + private FolderBrowserDialog folderBrowserDialog1; + private TextBox serviceDisplayNameTBox; + private TextBox serviceNameTBox; + private Label label11; + private Label label10; + private Button confimDeployBtn; + private Button btnCopy; + private TextBox nginxServiceDisplayNameTbox; + private TextBox nginxServiceNameTbox; + private Label label12; + private Label label13; + } +} \ No newline at end of file diff --git a/Start/Main.cs b/Start/Main.cs new file mode 100644 index 00000000..db7656cb --- /dev/null +++ b/Start/Main.cs @@ -0,0 +1,1017 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Net.NetworkInformation; +using System.Windows.Forms; +using System.Net; +using System.Security.Cryptography; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Diagnostics; +using Microsoft.VisualBasic.Logging; +using System.IO.Compression; +using SharpCompress.Archives.Rar; +using SharpCompress.Common; +using SharpCompress.Archives; +using System.Diagnostics.Eventing.Reader; +using System.ServiceProcess; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; +using System.Security.Policy; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolBar; +using System.Data.SqlTypes; +using Serilog; +using System.Xml.Linq; +using System.IO; +using Microsoft.Win32; +using System.Web; + +namespace Start +{ + public partial class Main : Form + { + + private bool isCanDBConfig = true; + + private bool isPortTestOk = false; + + private bool isServiceTestOk = false; + + private bool isDBNameTestOK = false; + + private bool isRuntimeTestOk = false; + + public Main() + { + InitializeComponent(); + + this.MaximizeBox = false; + + var physicalAddressList = NetworkInterface.GetAllNetworkInterfaces().Select(t => t.GetPhysicalAddress().ToString()); + + this.machineTextBox.Text = physicalAddressList.FirstOrDefault()?.ToString(); + + //this.KeySecreteTextBox.Text = Md5($"{this.machineTextBox.Text}_XINGCANG"); + } + + int apiPort = 7100; + int vuePort = 9527; + private async void connectButton_Click(object sender, EventArgs e) + { + string connectionString = $"Server={serverTextBox.Text};User Id={usernameTextBox.Text};Password={passwordTextBox.Text};"; + + + + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + try + { + await Task.Run(() => + { + connection.Open(); + }); + + WinformLog("数据库连接测试成功!", Color.Green); + + isCanDBConfig = false; + serverTextBox.Enabled = isCanDBConfig; + usernameTextBox.Enabled = isCanDBConfig; + passwordTextBox.Enabled = isCanDBConfig; + connectButton.Enabled = false; + + + selectPathBtn.Enabled = true; + //portBtn.Enabled = true; + //testDBBtn.Enabled = true; + //testServicebtn.Enabled = true; + + + } + catch (Exception ex) + { + + WinformLog($"数据库连接测试失败:{ex.Message}", Color.Red); + + } + } + + + + + + + + } + + private void portBtn_Click(object sender, EventArgs e) + { + + if (int.TryParse(nginxPortTBox.Text, out vuePort) == false || int.TryParse(apiPortTBox.Text, out apiPort) == false) + { + WinformLog($"请输入合法的端口", Color.Red); + return; + } + + if (IsPortInUse(vuePort)) + { + WinformLog($"服务设置的前端端口被占用,请选择其他端口", Color.Red); + + return; + } + if (IsPortInUse(apiPort)) + { + WinformLog($"服务设置的后端端口被占用,请选择其他端口", Color.Red); + + return; + } + + + + WinformLog("端口测试成功!", Color.Green); + + isPortTestOk = true; + + + + } + + + + private void testServicebtn_Click(object sender, EventArgs e) + { + if (ServiceController.GetServices().Any(t => t.ServiceName == serviceNameTBox.Text)) + { + WinformLog($"设置的后端服务名称已存在,请更换", Color.Red); + + return; + } + + if (ServiceController.GetServices().Any(t => t.ServiceName == nginxServiceNameTbox.Text)) + { + WinformLog($"设置的nginx服务名称已存在,请更换", Color.Red); + + return; + } + + + WinformLog($"测试服务名称成功", Color.Green); + isServiceTestOk = true; + } + + private async void testNetcoreRuntime() + { + + string runtimeListCommand = "dotnet --list-runtimes"; + Process process = new Process(); + process.StartInfo.FileName = "cmd.exe"; + process.StartInfo.Arguments = "/c " + runtimeListCommand; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardOutput = true; + process.Start(); + + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + + bool isAspNetCoreRuntimeInstalled = false; + bool isNETCoreRuntimeInstalled = false; + + var lineList = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); + + + foreach (string line in lineList) + { + if (line.Contains("Microsoft.AspNetCore.App") && !line.Contains("Preview")) + { + string versionString = line.Split(' ')[1]; + Version version = new Version(versionString); + if (version.Major > 6 || (version.Major == 6 && version.Minor >= 0)) + { + // 大于等于 6.0.0 的 .NET 运行时已安装 + isAspNetCoreRuntimeInstalled = true; + continue; + } + } + + if (line.Contains("Microsoft.NETCore.App") && !line.Contains("Preview")) + { + string versionString = line.Split(' ')[1]; + Version version = new Version(versionString); + if (version.Major > 6 || (version.Major == 6 && version.Minor >= 0)) + { + // 大于等于 6.0.0 的 .NET 运行时已安装 + isNETCoreRuntimeInstalled = true; + continue; + } + } + } + + if (isAspNetCoreRuntimeInstalled && isNETCoreRuntimeInstalled) + { + // 执行逻辑,表示大于等于 6.0.0 的 .NET 运行时已安装 + + WinformLog("当前系统>= 6.0.0 NetCore 运行时已安装", Color.Green); + + isRuntimeTestOk = true; + + } + else + { + + + WinformLog("当前系统>= 6.0.0 NetCore 运行时未安装,请安装后,再运行该程序", Color.Red); + + connectButton.Enabled = false; + + //await Task.Run(() => + // { + // WinformLog("现在为您启动安装Net core 运行时...", Color.Orange); + + // string runtimePath = Path.Combine(AppContext.BaseDirectory, "Resource/NetCoreRuntime/dotnet-hosting-6.0.0-win.exe"); + + // var processInfo = new ProcessStartInfo + // { + // FileName = runtimePath, // 安装程序的文件名 + // Arguments = $"/S /v /qn REINSTALLMODE=vomus", + + // UseShellExecute = false + // }; + + // var otherProcess = new Process { StartInfo = processInfo }; + // otherProcess.Start(); + // otherProcess.WaitForExit(); + + // WinformLog("Net core 6.0.0 运行时安装完成", Color.Green); + // }); + + + } + } + + + private void testDBBtn_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(dbNameTBox.Text)) + { + WinformLog($"请输入部署的数据库名称", Color.Red); + + return; + } + + string connectionString = $"Server={serverTextBox.Text};User Id={usernameTextBox.Text};Password={passwordTextBox.Text};"; + + string sql = $"SELECT COUNT(*) FROM sys.databases WHERE name = '{dbNameTBox.Text.Trim()}';"; + // 创建连接对象和命令对象 + using (SqlConnection connection = new SqlConnection(connectionString)) + using (SqlCommand command = new SqlCommand(sql, connection)) + { + // 打开连接 + connection.Open(); + + // 执行查询,返回结果行数 + int rowCount = (int)command.ExecuteScalar(); + + // 判断结果是否大于0,即是否存在该数据库 + if (rowCount > 0) + { + + WinformLog($"{dbNameTBox.Text.Trim()}该数据库已存在。", Color.Red); + + return; + } + + } + + WinformLog($"数据库名称测试成功", Color.Green); + isDBNameTestOK = true; + + + } + + + + private async void confimDeployBtn_Click(object sender, EventArgs e) + { + + portBtn_Click(null, null); + testServicebtn_Click(null, null); + testDBBtn_Click(null, null); + + + if (string.IsNullOrWhiteSpace(this.folderPathTbox.Text)) + { + WinformLog($"请选择部署路径,测试的端口,数据库名,服务名都成功才可以进行确认", Color.Red); + + return; + } + if (isDBNameTestOK == false || isPortTestOk == false || isServiceTestOk == false) + { + WinformLog($"测试的端口,数据库名,服务名都成功才可以进行确认", Color.Red); + return; + } + + WinformLog($"部署配置确认成功", Color.Green); + + activeBtn.Enabled = true; + + confimDeployBtn.Enabled = false; + + selectPathBtn.Enabled = false; + //portBtn.Enabled = false; + //testDBBtn.Enabled = false; + //testServicebtn.Enabled = false; + + + nginxPortTBox.Enabled = false; + apiPortTBox.Enabled = false; + dbNameTBox.Enabled = false; + serviceNameTBox.Enabled = false; + serviceDisplayNameTBox.Enabled = false; + + nginxServiceNameTbox.Enabled = false; + nginxServiceDisplayNameTbox.Enabled = false; + } + + private static bool IsPortInUse(int port) + { + IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + IPEndPoint[] tcpEndPoints = ipProperties.GetActiveTcpListeners(); + foreach (IPEndPoint endPoint in tcpEndPoints) + { + if (endPoint.Port == port) + { + return true; + } + } + + return false; + } + + public static string Md5(string target) + { + using (MD5 md5 = MD5.Create()) + { // MD5非线程安全 + byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(target)); + StringBuilder sb = new StringBuilder(32); + for (int i = 0; i < bytes.Length; ++i) + sb.Append(bytes[i].ToString("x2")); + return sb.ToString(); + } + } + private void WinformLog(string message, Color color) + { + if (InvokeRequired) + { + Invoke(new Action(() => WinformLog(message, color))); + return; + } + + + logTBox.SelectionColor = color; + logTBox.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}: {message}" + Environment.NewLine); + + Serilog.Log.Information(message); + } + + private async Task ProcessStandardInputAsync(Process process, string cmd, string workDirectory = "") + { + if (!string.IsNullOrWhiteSpace(workDirectory)) + { + process.StartInfo.WorkingDirectory = workDirectory; + } + + await process.StandardInput.WriteLineAsync(cmd); + await process.StandardInput.FlushAsync(); + + //while (!process.StandardOutput.EndOfStream) + //{ + // var output = await process.StandardOutput.ReadLineAsync(); + // if (string.IsNullOrWhiteSpace(output)) + // { + // break; + // } + //} + + } + + private async void activeBtn_Click(object sender, EventArgs e) + { + if (Md5($"{machineTextBox.Text}_XINGCANG") != KeySecreteTextBox.Text.Trim()) + { + WinformLog($"秘钥不正确,请联系供应商", Color.Red); + return; + } + + + + this.activeBtn.Enabled = false; + + + var serviceName = serviceNameTBox.Text; + var serviceDisplayName = serviceDisplayNameTBox.Text; + + var nginxServiceName = nginxServiceNameTbox.Text; + var nginxServiceDesName = nginxServiceDisplayNameTbox.Text; + + + var deployFoder = this.folderPathTbox.Text; + + string nginxExtractName = "EIImageViewerWeb"; + string apiExtractName = "EIImageViewerService"; + + string dataExtraName = "EIImageViewerData"; + + string nginxStartPath = Path.Combine(deployFoder, @$"{nginxExtractName}\"); + var nginxConfigPath = Path.Combine(nginxStartPath, @$"conf\nginx.conf"); + var nginxEXEPath = Path.Combine(nginxStartPath, "nginx.exe"); + string nginxServiceEXEPath = Path.Combine(nginxStartPath, "nginxService.exe"); + string nginxServiceXMLPath = Path.Combine(nginxStartPath, "nginxService.xml"); + + + + var apiBinPath = Path.Combine(deployFoder, "EIImageViewerService/EI_Image_Viewer.exe"); + var apiJsonConfigPath = Path.Combine(deployFoder, "EIImageViewerService/appsettings.CertificateApply.json"); + + string nginxRarFilePath = Path.Combine(AppContext.BaseDirectory, $@"Resource\EIImageViewerWeb.rar"); + string apiRarFilePath = Path.Combine(AppContext.BaseDirectory, "Resource/EIImageViewerService.rar"); + + + string dataRarFilePath = Path.Combine(AppContext.BaseDirectory, "Resource/EIImageViewerData.rar"); + + + + #region 创建进程执行命令 + + var startInfo = new ProcessStartInfo(); + startInfo.FileName = "cmd.exe"; // 指定要启动的应用程序 + startInfo.RedirectStandardInput = true; + startInfo.UseShellExecute = false; + startInfo.CreateNoWindow = true; + + + // 创建新进程并启动 + var process = new Process(); + process.StartInfo = startInfo; + process.Start(); + + #endregion + + + + await Task.Run(async () => + { + + #region 解压nginx 和前端部署的文件 + + WinformLog($"开始解压 nginx 及前端部署压缩文件...", Color.Green); + + string extractPath = Path.Combine(deployFoder, nginxExtractName); + if (!Directory.Exists(extractPath)) + { + Directory.CreateDirectory(extractPath); + } + + using (var archive = RarArchive.Open(nginxRarFilePath)) + { + foreach (var entry in archive.Entries) + { + if (!entry.IsDirectory) + { + entry.WriteToDirectory(extractPath, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); + } + else + { + string directoryPath = Path.Combine(extractPath, entry.Key); + Directory.CreateDirectory(directoryPath); + } + } + + } + + WinformLog($"nginx 及前端部署压缩文件已成功解压缩到: {extractPath}", Color.Green); + + + + #endregion + + #region 修改 nginx 配置文件 启动nginx + + if (!File.Exists(nginxConfigPath)) + { + WinformLog("预设路径不存在nginx", Color.Red); + } + + WinformLog("准备写入nginx配置...", Color.Green); + + var nginxConfig = File.ReadAllText(nginxConfigPath); + + nginxConfig = nginxConfig.Replace("9520", vuePort.ToString()); + nginxConfig = nginxConfig.Replace("7100", apiPort.ToString()); + + File.WriteAllText(nginxConfigPath, nginxConfig); + + WinformLog("nginx部署配置写入完成", Color.Green); + + + #region nginxservice + + WinformLog("准备nginx自启动服务配置文件...", Color.Green); + + var nginxServiceConfig = File.ReadAllText(nginxServiceXMLPath); + + nginxServiceConfig = nginxServiceConfig.Replace("{nginxName}", nginxServiceName); + nginxServiceConfig = nginxServiceConfig.Replace("{nginxDesName}", nginxServiceDesName); + nginxServiceConfig = nginxServiceConfig.Replace("{nginxPath}", nginxEXEPath); + nginxServiceConfig = nginxServiceConfig.Replace("{nginxStartPath}", nginxStartPath); + + + File.WriteAllText(nginxServiceXMLPath, nginxServiceConfig); + + WinformLog("nginx自启动服务配置写入完成", Color.Green); + + #endregion + + + + WinformLog($"准备创建自启动nginx服务...", Color.Green); + + var nginxCreateStr = $@"{nginxServiceEXEPath} install "; + + // 执行 sc create 命令来创建服务 + await ProcessStandardInputAsync(process, nginxCreateStr); + + WinformLog($"服务{nginxServiceName}创建执行结束", Color.Green); + + await Task.Delay(2000); + + #region nginx 服务 + WinformLog($"启动部署的{nginxServiceName}服务...", Color.Green); + + await ProcessStandardInputAsync(process, $"sc start {nginxServiceName}"); + + ServiceController scNginx = new ServiceController(nginxServiceName); + + if (scNginx.Status != ServiceControllerStatus.Running) + { + scNginx.Refresh(); + + await Task.Delay(3000); + + scNginx.Refresh(); + + await Task.Delay(2000); + } + + if (scNginx.Status == ServiceControllerStatus.Running) + { + WinformLog($"nginx服务启动成功", Color.Green); + } + else + { + WinformLog($"nginx服务启动失败", Color.Red); + + } + #endregion + + #region 命令行方式启动 废弃 + + //// 创建ProcessStartInfo对象,指定要启动的可执行文件及其参数 + //ProcessStartInfo psi = new ProcessStartInfo(nginxEXEPath); + //// 指定工作目录,即进入nginx.exe所在的目录 + //psi.WorkingDirectory = nginxStartPath; + + //WinformLog(" 开始启动 nginx 服务...", Color.Green); + //// 启动可执行文件 + //Process.Start(psi); + + + + + //if (Process.GetProcesses().Any(t => t.ProcessName.Contains("nginx") && t.MainModule.FileName.Contains(nginxStartPath))) + //{ + // WinformLog(" nginx 服务启动成功", Color.Green); + //} + //else + //{ + // WinformLog(" nginx 服务启动失败", Color.Red); + // return; + //} + + #endregion + + + #endregion + + + + }); + + await Task.Run(() => + { + #region 解压后端部署的文件 + + WinformLog($"开始解压后端部署压缩文件...", Color.Green); + + string apiExtractPath = Path.Combine(deployFoder, apiExtractName); + + if (!Directory.Exists(apiExtractPath)) + { + Directory.CreateDirectory(apiExtractPath); + } + + + using (var archive = RarArchive.Open(apiRarFilePath)) + { + foreach (var entry in archive.Entries) + { + if (!entry.IsDirectory) + { + entry.WriteToDirectory(apiExtractPath, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); + } + else + { + string directoryPath = Path.Combine(apiExtractPath, entry.Key); + Directory.CreateDirectory(directoryPath); + } + } + } + + + WinformLog($"后端部署压缩文件已成功解压缩到: {apiExtractPath}", Color.Green); + + #endregion + }); + + await Task.Run(() => + { + #region 解压模板文件 + WinformLog($"开始解压部署依赖模板压缩文件...", Color.Green); + string extractPath = Path.Combine(deployFoder, dataExtraName); + + if (!Directory.Exists(extractPath)) + { + Directory.CreateDirectory(extractPath); + } + + + using (var archive = RarArchive.Open(dataRarFilePath)) + { + foreach (var entry in archive.Entries) + { + if (!entry.IsDirectory) + { + entry.WriteToDirectory(extractPath, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); + } + } + } + + + WinformLog($"依赖模板压缩文件已成功解压缩到: {extractPath}", Color.Green); + #endregion + + + #region 文档等资源文件 + + var otherFileFolder = Path.Combine(AppContext.BaseDirectory, $@"Resource"); + + if (Directory.Exists(otherFileFolder)) + { + // 获取源目录下所有文件 + string[] files = Directory.GetFiles(otherFileFolder); + + foreach (string file in files) + { + // 筛选掉文件夹 + if (!File.GetAttributes(file).HasFlag(FileAttributes.Directory)) + { + string extension = Path.GetExtension(file); + if (extension != ".zip" && extension != ".rar" && extension != ".7z" && extension != ".tar" && extension != ".gz") + { + + // 获取文件名 + string fileName = Path.GetFileName(file); + + // 拷贝文件到目标目录 + File.Copy(file, Path.Combine(deployFoder, fileName), true); + } + + + } + } + } + WinformLog($"文档资源释放成功", Color.Green); + + #endregion + }); + + + + await Task.Run(() => + { + + + + + #region 激活 + + try + { + string directoryPath = @"C:\ProgramData\.xingcang"; + if (!Directory.Exists(directoryPath)) + { + Directory.CreateDirectory(directoryPath); + } + + var configObj = new + { + key = this.machineTextBox.Text, + value = this.KeySecreteTextBox.Text.Trim(), + user = usernameTextBox.Text, + server = serverTextBox.Text, + password = passwordTextBox.Text, + dbName = dbNameTBox.Text, + deployFolder = deployFoder, + nginxStartPath = nginxStartPath, + serviceName = serviceName, + nginxServiceName = nginxServiceName, + nginxServiceEXEPath = nginxServiceEXEPath + }; + + File.WriteAllText(Path.Combine(directoryPath, "config.json"), JsonConvert.SerializeObject(configObj)); + + WinformLog("写入激活秘钥完成", Color.Green); + } + catch (Exception ex) + { + WinformLog("写入激活秘钥失败,请用管理员方式启动该程序,保证程序可以", Color.Red); + } + + #endregion + + }); + + + + + await Task.Run(async () => + { + + + #region 创建服务 + + WinformLog($"开始创建服务{serviceName}...", Color.Green); + + var createTestStr = $"sc create {serviceName} binPath= \"{apiBinPath} --urls=\"http://127.0.0.1:{apiPort}\" --env CertificateApply\" DisplayName= \"{serviceDisplayName}\" start= auto"; + + var createStr = $@"sc create {serviceName} binPath= ""{apiBinPath} --urls=""http://127.0.0.1:{apiPort}"" --env CertificateApply"" DisplayName= ""{serviceDisplayName}"" start= auto"; + + // 执行 sc create 命令来创建服务 + await ProcessStandardInputAsync(process, createStr); + + WinformLog($"服务{serviceName}创建执行结束", Color.Green); + + #endregion + + + + + #region 初始化数据库脚本 + + WinformLog($"执行初始化数据库脚本...", Color.Green); + //执行数据库脚本 + + + await ProcessStandardInputAsync(process, $@" SQLCMD -v dbName = ""{dbNameTBox.Text}"" -i ""{AppContext.BaseDirectory}Resource\Data\dbo.sql"" "); + + await ProcessStandardInputAsync(process, $@" SQLCMD -v dbName = ""{dbNameTBox.Text}"" -i ""{AppContext.BaseDirectory}Resource\Data\data.sql"" "); + + + WinformLog($"初始化数据库脚本执行结束", Color.Green); + + #endregion + + + #region 部署网站配置文件写入 + + WinformLog("开始写入部署网站服务配置文件...", Color.Green); + + var appsettingsJson = File.ReadAllText(apiJsonConfigPath); + + // 解析 JSON 字符串 + var jObject = JObject.Parse(appsettingsJson); + + // 获取 UpdateConfig 属性所在的节点 + var updateConfigNode = jObject["ConnectionStrings"]; + + + var connectionString = $"Server={serverTextBox.Text};Database={dbNameTBox.Text};User ID={usernameTextBox.Text};Password={passwordTextBox.Text};TrustServerCertificate=true"; + + updateConfigNode["RemoteNew"] = connectionString; + + try + { + using (var connection = new SqlConnection(connectionString)) + { + connection.Open(); + + File.WriteAllText(apiJsonConfigPath, jObject.ToString()); + + } + } + catch (SqlException) + { + + WinformLog($"连接字符串错误", Color.Red); + + return; + } + + + WinformLog("部署网站服务配置文件写入并测试OK", Color.Green); + + #endregion + + }); + + + + await Task.Run(async () => + { + + + + + + #region 启动后端服务 + + WinformLog($"启动部署的后端服务...", Color.Green); + + await ProcessStandardInputAsync(process, $"sc start {serviceName}"); + + // 关闭进程流并等待进程退出 + process.StandardInput.Close(); + process.WaitForExit(); + + + + ServiceController sc = new ServiceController(serviceName); + + if (sc.Status != ServiceControllerStatus.Running) + { + sc.Refresh(); + + await Task.Delay(3000); + + sc.Refresh(); + + await Task.Delay(2000); + } + + + if (sc.Status == ServiceControllerStatus.Running) + { + WinformLog($"后端服务启动成功", Color.Green); + + + WinformLog($"部署工作已完成", Color.Green); + + try + { + WinformLog($"现在准备打开浏览器...", Color.Green); + // Use ProcessStartInfo class + var start = new ProcessStartInfo($"http://127.0.0.1:{vuePort}") + { + UseShellExecute = true, + Verb = "open" + }; + var urlProcess= Process.Start(start); + + urlProcess.WaitForExit(); // 等待进程结束 + } + catch (Exception ex) + { + // Handle exception + MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + else + { + WinformLog($"后端服务启动失败,您可手动启动{serviceDisplayName}尝试,如若手动尝试还是无法启动,请联系技术人员确认部署环境", Color.Red); + } + + #endregion + + await Task.Delay(10000); + Application.Exit(); + + }); + + + + + + + + + + + + + + } + + private async void selectPathBtn_Click(object sender, EventArgs e) + { + FolderBrowserDialog dialog = new FolderBrowserDialog(); + if (dialog.ShowDialog() == DialogResult.OK) + { + folderPathTbox.Text = dialog.SelectedPath; + + confimDeployBtn.Enabled = true; + + WinformLog($"部署路径选择成功", Color.Green); + + + } + } + + private void btnCopy_Click(object sender, EventArgs e) + { + Clipboard.SetText(machineTextBox.Text); + + WinformLog("机器码拷贝到剪切板成功!", Color.Green); + } + + private void Main_Load(object sender, EventArgs e) + { + Serilog.Log.Logger = new LoggerConfiguration() + .WriteTo.File("logs\\log.txt", rollingInterval: RollingInterval.Day) + .CreateLogger(); + + // 检查是否安装了 SQL Server + bool isSqlServerInstalled = false; + RegistryKey key = null; + + try + { + key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"); + if (key != null) + isSqlServerInstalled = true; + } + finally + { + key?.Close(); + } + + if (isSqlServerInstalled) + { + // 获取 SQL Server 实例列表 + key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"); + if (key != null) + { + foreach (var instanceName in key.GetValueNames()) + { + WinformLog($"当前系统SQL Server 已安装实例: {instanceName}", Color.Green); + } + } + } + else + { + WinformLog("SQL Server 未安装,请安装后再运行该部署程序", Color.Red); + + } + + key?.Close(); + + + + //// Check if any version of SQL Server is installed + //RegistryKey sqlServerKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server"); + + //if (sqlServerKey != null) + //{ + // WinformLog("当前系统SQL Server 已安装", Color.Green); + //} + //else + //{ + // WinformLog("SQL Server 未安装,请安装后再运行该部署程序", Color.Red); + //} + + + + testNetcoreRuntime(); + + this.TopMost = true; + this.Activate(); + + + } + + + } +} diff --git a/Start/Main.resx b/Start/Main.resx new file mode 100644 index 00000000..1ceed754 --- /dev/null +++ b/Start/Main.resx @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAEAAAAAAAEAIAC4HgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAHn9J + REFUeNrtnXucXVWV57/3VoW837wSEBCo8AoECJEoNDIgEBUQWp20Ts84n344tDP46HGmR4fYj0LtGW0/ + PaP2QIvdraOOiEpDi11qAwLyECEQEh4SSAAhgJgEyDv1uPPHb5/ck1v33nNuVd06t875fT+f86nHPefc + dfZee+2119p7nxJmRPT09gGcBXwOmJy1PKYlysBXgGuAofWrVgw7IdTvJOCzwPnAUNZCt4PurAWY4MwC + lgBTsxbEtEQJWBh+Jp13NHAqUMla6HZgAzB6SiQrkpm4lGp+5opy1gIYY7LDBsCYAmMDYEyBsQEwpsDY + AIyOXAaGCkLaust1HTsLMDpeAm4GDshaENMSZeBRklN7Q8C94TynAc0wHgU+Ss57iZyyneTJPYPA3wJf + z1pYY4wxxhhjjDHGGGOMGRHjHr0OyyxnoJV0xmTFtnDQZDlwCZhDjld7ZpUGvAy4Ek9EMtlQBq4DrqV5 + KrAb+CRwHt4PYEw5BFgKdGVdAKawHEa6/QCOBU7PWth24R7YmAJjA2BMgbEBMKbA2AAYU2BsAIwpMFkZ + AK+eM6YDyCoNeDvwcWwITDaUgPtItxz474C78H4AY8rDwCNZP7wpNIMkN+pB4J+BvqyFNcYYY4wxxhhj + jDHGmBHhNNwI2XT1StBa8ePwhKqJRgn4FfA8UFl41fXDTojtB7AImJe1wO3C24KPjjcD3yXHG0bklBLw + aeBPUaqvEZOAzwKX43kApgF+PXi+8evBjTH5xAbAmAJjA2BMgbEBMKbA2AAYU2CcBRgdFZRGGhztjcy4 + 0kX6tN5QONfbgpthrAWuwNubTzRKwBqSG/UA8EXgZjwPwNRhE/DtrIUwI6JCcqMeAu4kp3MAjDHGGGOM + McYYY4wxBSDz6GZYV9+N3sB6OGOfbikBW1A0d6je2u84YR34gcAytMw3l+mfglMCngAeByrrV60YdkLQ + gzLSg8PIqR50ShpwKnpPwHvbdP/7gbNJP5njZLQf/KFZF4xpG58BPkXzSVzdwCeAd2UtbLvolKnAnWZd + O00eM/akreNc60KnGABjTAbYABhTYGwAjCkwNgDGFBgbAGMKTKekAQH2Av1oCeZYP+OeFq8ZAnaF63K5 + DrzgdJFez/aQYz3oFAOwG/gCWlrbjolAW2lt045HgQ8CU9ogj8meErCedPsBfA74BjnVg8wNwMKrrmfT + 1SsHgIfC0S5aqcDNwK2ZFoxpNxWAerMAYwwBq7MW1BhjjDHGGGOMMcYYY0ZMqae3753AUVkLYjJlL3Ab + 8HRCVLwwhP0AuoALgWPIcRrwQ8A7shbEZMp24A+Ap7MWpMPoQu99uDRrQdpFmZzOcDItEb3hyAwn1+3D + awGMKTA2AMYUGBsAYwqMDYAxBcYGwERkvkW8GX+60cq3TeQ0z2kSKQHbgJ1ZC9KBVFD7eJGcZgO6gT+i + A5YFm0yp0PqmKUWgH7gS+FjWghhjjDHGGGOMMcYYY8yISJX7Da/wLgEz6NyMwW5gV6PXf8de9zy9g5/B + jB+70dbvNHk9OEjnJ2UtbLtopSFMRimRxXTmnIGbgesTzpkXnmEROc3rmlSUge8D36O5HnQDfwgsozN1 + ftS0YgAmARcA52YtdAOeJ9kATAcuAs7MWliTORuQEWhGGel7rvcDSEuFzu0108pWIaeW3LRMWj3oVJ0f + E7wWwJgCYwNgTIGxATCmwNgAGFNgWjUAnbpmvNTBspnOJK2+5FqvWkkDDgFPAQfReZHRCtrTIIn+8Awz + OvAZzPhRRmv8kzIBFWAjsI6c6ksrBmAn2jugUy1imgp6Efj3HfwMZvwYIlln+oGPY30xxhhjjDHGGGOM + McZMVDKNboY1191omW5X1oVhCsV2tB16s/0ASsAcYErWwraLTtgYYwFwNXAYOc21mo6jDHwT+BrNda4L + +DBwNjldRdoJBmAaKuCjsxbEFIqfk+wBl4HTgbdlLWy78FoAU1S8HwA2AMYUGhsAYwqMDYAxBcYGwJgC + YwNgikraOTC5biOdkAbcCfwMrbvOdcTVdAxltC9EUiZgCFiNUtW5nAdgjDHGGGOMMcYYY4wxxpi8kqvd + TjddvRKUsjmEnOdvzajZCmwBWHjV8JdKx/YDOAS9VTqXdMI8gLHmVODTwCycuzX1KQPXAdfQfO5JN9oW + /DxyOkcljwZgDnAaMDtrQUxHcxjJHnAJOBbpUy7Jo5tcwT2/SSatjuRal/JoAIwxKbEBMKbA2AAYU2Bs + AIwpMHnMAgwCu9Be7rkO4JgR0wUMpDx3TzicBpwgPA18HpiKDYCpTwntQZHUqAeBG4C1WJeMMcYYY4wx + xhhjjDHGGDOhKPX09p0DLMxaEGPGkRLwKCG9t37VimEnhP0AysBbgDeQ0zRgN/BB4KK8PqAxdegC/gpY + R3O97wb+ALiYHE8Emg0cmLUgxowz00i3I9ZsYH7WwrYLrwUwpsDYABhTYGwAjCkwNgDGFBgbAGMKTDd6 + Pfc2nAY0xaELrfFPo/M7ge3kOA34VeBfshbEmHGkBKwm2QAMAP8A3JHiXGOMMcYYY4wxxhhjjDHGmA4i + zWqolth09UrQGupTmZi50zLwAHB/vffGR4T14kcAFzLxt1fvB24HNtRbG19EYvsBXAAcTU7TgO1S3EuA + Pwb2Zv2AI2AS8Fng/hTnHg98Br2DYKJSQhPBPgRsyFqYDqMb+ADwLiZmZ5bqAdvBAbFjIpJW7i5gBhPb + AICUuytrITqUqWjvgFzitQDGFBgbAGMKjA2AMQXGBsCYAmMDMDrGPI2aIdaF+uSpjofRrizAC2jL5f6s + H3AEdAObUp77GrAGmJy10KOghNa7b8lakA6kgl43vwanAVviO8CdTMzJEyXgxZTnrkP584neew4Cz2Yt + RAcyAPwN8K2sBTHGGGOMMcYYY4wxxpgRkWmOMyy5BC1EmeiRdDOxGCSk9pq8HhyUKcvtXIBOWMdeAlai + JZfGjAdl4LvADTTP73cDHwXexMRMaSfSKQZgMfCerAUxhaEMPIGMQNJ5bwEuxxOB2koJDwHM+JLWrY/O + y6V+5vKhjDHpsAEwpsDYABhTYGwAjCkwnWIAcptnNR1Lq0HAXNIJWYAK2o76jqwFMYWhjHQuKbdfAdYC + c1OcOyHpFAPwffRiCmPGiy0k5/aj/QC+nrWwxhhjjDHGGGOMMcYYMyL25Thjr0OeSufMDzCmXewF9kDi + fgBT6YxsWVuofbD56HXXbySneU9jUAf3DeBrJO8H8CfA2eS0PdQagCnAcrQ+P5cPbAzyfO8leZZfGTgF + OJ+ctod6rk2p5qcxRSbX7cFjfWMKjA2AMQXGBsCYAmMDYEyBqTUAJXIa7DCmBu8HwPAswE7gVuApcpr2 + MAZ1fI+RrONDwH3ICOSyPdQagK1ALzApa8GMaTPbSN4PYBC4Fu8HYIwxxhhjjDHGGGOMmajkOsfZTjZd + vRJgMjAHl+NEZHs4WHjV9cM+DPsBlIDZaJVsLsntRgfjxFLgL5EhMBOHMvBV4G9J3g/gE8B5+PXgpg6z + gTPQrjFmYvEjkj23ErAI1XEu8VoAYwqMDYAxBcYGwJgCYwNgTIGxATCmwNgAjA7n/ycu3g8ApwFHy+PA + J3E5TjSibcHTLAf+e+BuCrIfgGmNZ4AvZy2EGRGDJDfqQeAW4IdZC2uMMcYYY4wxxhhjjDEjItc5znYS + 1ovPAY7F8ykmGiXghXBU1q9aMeyE2H4AxwJzsxa4XTgNODreDNyAlwNPNMrA1cCfoVRfIyYB/wO4HO8H + YBpQxh7ARKTVmYC5rONcPpQxJh02AMYUGBsAYwqMDYAxBcYGwJgC4yzA6BkipymiHFMm/fLeoZqfucIG + YHSsBf4I6MpaENMSJWANyY16AC33/gHeD8DU4QXgW1kLYUZEheRGPQT8FM+YNcYYY4wxxhhjjDHGGGOM + McYYY4wxxhhjjDHGGGOMMcYYY4wxxow/XufcZsIbZrqBKWh9+W5gqN7baExnMlHrMMgNMBm95GRvOIhk + L8VOXACcHk5sRj9wL7Al/D0VWA7MRhssrAGeiRdOuP98YBkwDdgG3AnsAU4IR9otl0rARuCR2DVlYAlw + FM03eSgBm4DVQH8kY5BvObAQvSlmLbChzjMALAJOCt9zL/ByrSLEzp0OvAVYChwWym4DcD/wMLC3wbVv + AE4NdbEBeHj9qhXRZ8cDJ4Zn3wA80uTVVoeE754CvAzcs37Vikqsvs9MUd4DwB3AtjQKH+59aPjeycDz + wP1N9GFqKJfVwKYmz3Io8KZQ14NIf15rJFOda4ZCfb3SwnNEdbEslPnB4bufAe4DHmpSh5OAc4GZoex/ + ET83nFMGzgHmAbuAB2rli91raaiz7eE5tic8ezfSlTchnZ0erv0lcA/wFDAU3xFoCfC/gVk0bkQlYCvw + u0iJo4d4L7AyFPLXgP8S3SNWkOcDXwgV3gfcHf7/LuBPghKkoRv4B+ATyIBEBfTvgH9Lc0NSBm4Brqzz + fVcC70AK/3Xgqp7evl01hVwC3gn89/A97w+VW4/DgD8G3gMcEfv/IPA48E3gmp7evlfrVORy4PPIqH4V + GYuItwJ/EZ75JuD3mtTXeeE+k4FvIMWJzj0N+ArJu+LsAC5ERjstS4C/Bg4Cvk9VV+IsAv4nMroDoUy/ + 2tPbRwPFvhjoRduv7QbeDryWIMcloay6wnd8DLg+SfhY4zwf+DAy4vNipwwBjwH/F9Xh63Vkngp8Ojzn + rcAfUu00I7qBTwJnhGf6FHBdnTKYBvyn8MxPAe9DjbmR7NOAD4RjCeoAInaF+vhfwE3xXYEnAweG46AG + R/R53EvYAdwVHuZA4CLgmFjDB1mfy1CjmAHcDuyMfTanyXfWHnORVa0dvsxEvUqza+eH76q3G/Ls8NmB + wG8j61mPabHvOaC28MNzz0YK/WGqjT/agqoLWAysCsfMmrKK18XsUF5xNoZnnwucDCyovT72YsvFqIHN + Rb3WUJ3vSCrvA2l9z8O4/LManDMplON85KmcHcq23rOUgQtQj54oU+z5z4ldswD4V0CpTnnXu/bdwJeQ + wY8af1SH5VC2VyGjMqXOPcvhukivGg2354ZjAWrYB9Y5pxzuMy8cdbfyCzJMCTJ9Bnl4UeOPDP1U1Il8 + Hnh/oz0BX0M9fS0l4FVkrYi5pbeiXuocZPHOBZ6KFUpPKHzQEOHW2D23or31oh65gpT+oPD3NmQ5owfo + An5D857r18gw1RZ6GfXYzV4ICWq0l4ZnGslmkOcD/wZV1ADwNLAeGYxFyBBOQ4bmK8ATLdz7ceCVUD6H + AsegYU0tc4BTwu+7gQeb3LO2jOPsIL13FpFmv71aliPlf67OZ0ehYWIrHELViA8ivTkllEs93Y57q0vR + i0MXxcrvOVSH3UifD0edzsXIY9zYonz1OBO1oe83KNN6v8dlL6GO9mPhOUFt+QngRWRETkK6czRwaaP3 + AlyLepfFNcdJyB16uOb8Xwehh5CSX0r1lcql8PdBQfCfoN4o4kvAcbHvOB65zhH/D42Ho89PCJWzh8b8 + x3CfWvlPRK7+dppTRhW7sFlv0YBJyO2Per5/RkOL94RyuAgpzGvAt9E4vhVeQm4gyAD0wH7KGxF5CKBx + 33NN7vkdNCRYXOd4E2Oj3EkcQY3XFXumE1GDa4WTwz0raKxeCfdIMiQzgCti5/0GDV3PQ17BZcDbUB1u + QcOAZ8eoDKYDvwNMa0XvYueegIbG81FbXAN8MMj+PuTNfAANv58GvtLIA+hHlr+SFDCJeQE/RhbyOOQB + LAv/OwqNxbqAXwHfq7nvvshk7GF2x75iIMjS3yRAVMtuFHDZS+vsRi7sYmQErm3RCEyiqsibgWsIjTyU + 1ZPAf0bDpruoE0RKoB8FcaIyPZ6qpxHnjShoBeoBNje5Z1TGrcoyVgwh1/R8pDNxymiMPDec1zRzVdMY + Dkbe0j+izmsh8gLuaRJrOA3FpUpIL/8K+BwwGAvgbUTu/wMoDjMWGYE9SO/OQd7QbS3qXdTRRl7fRjQE + vROqUf+e3r4+5DEeA9w+ltuCrwf+CRmAmci9/TGqvKgnugN4dAy/sx28inrn48IzfA/1Aq0QxUg2o+HN + vgoIP19DwdKR8nMUQ5mOynYmw93a06jGKNaS7PVkyQso2n46MKsmqDYbeSEgxZ1H8hutpqLgF8j4/QJ5 + qUeG8ppMYw/yEqrj8DuAvyPW+GFfHb6MPOWx4qnwvYegnvouWht6zQmyg4Y8XwN+FpM3Lvsj4RibV4OF + mw4ANxIUHgV1TkVWfTJyl75Nc9e9E9hCtRd6SzhGyiE0dtFbJlaRm5A3BVLofYG22FjwNKrxktU113cS + /Sg+UQGOZbiLfggyDFuRq52UpgZ5C6eH3zegIVAUZ1nO/hH9eLnNpGps9iB9/vU4lcMTVDNjlyEPrhWO + o+p5bgRuJkVqvZEBGOlbUB6MPUQPShdeGPvsfuhYRYzoB/4FjbVnoDFZGqWLGKTaOGcDH0deUPdYGIHA + yygYCFL2k2o+n09VgX5DcpAxy7feVEJ5vYTG7CfAfgZzeXiel8JzTEoh7+EoyAVq/M8iDxVkZI5ocN3R + KEAL6siG9aBtZBpKj+9Cw+Z/3eL1i6lmUdagMX6i7I2GAAcTJrvUKO0eNLFjd4Mb70G9/MVBmN9DVnUv + Gh68Mh4liSr4uJ7evtrn20qDySYxZqLKfwjlXX8L9Qp3k449KPB3QSjfM1GQ7QvALT29fc9R41KOgNdQ + r3458q5OBX4Y+3wR1aDZ0ygC3Iz5KNDWH6vvEoqHPEuD+MsY0Y304xEUID0H5ep3BRl+K5yzDuleGs5E + w6NXqRq/x8P3TAuf/7zOdQuoRs9fYXyCn/Fy+Akq7+PRMODrNA/exjmGasrvSVIO+RoZgHejXGGcMhqn + fDR8wX7EgoH3huN8qpmAx1GwZLys6SdRtD8eMCqhhvgpkmcLbkdZjfNRQ7oUKcxAk+viZXAzivqfEz56 + I5oY8x40NvtRT29fkiFK+o51SMHnoMBPV09vX5TePAZlCEABw6Sx5AVozBwvly7UeK6gOqxrB2UUK1mH + DMAZ4Zl2Ifc/GhLcRzWoWZdQLl3Am8PPzag3jMprSyiXNwNf7untqzXE05FBBRnN3bHyLqHOoZ43uINY + anyEdCEv54fIACxFqfO0saLIc9kb7hPXla4g+7C5E40MQDRBo5ahWAE14iXkQr81dv8+knuhseSwBv8/ + NOX1lfAMa1FFXAZcR9WNTOJZZIT+EjgLKU9XKJMzwr2/2NPbdxspMi0NiBuAo8KzvRC+5wSqc79/QbLL + PIdqzxdnN+Pz/shB1Gm8jozliUhfTkbezA5kjI5Oca+FyM0H9eCR8VqHxvOHhs8XUh2qRcym6kZvrym3 + aDbeGew/j6SCgoG3MjqmoR78JpSyW4Bm195Ia0O0vQz3tA9G+riQmrhAoxjAIHJl48dAuHmSMJOC8N01 + /xvPhUf9deTfS0IPXlMuz6BhyxDqUX87zYWxxnwP8B/QjKvNsXKbjtJMf42GGKURxgaeR9NRQV7KUeH3 + GVRTQc+F85J6ptHU91hQQobqxSB/NGlsMeqI1iLj21CHatJ/kaG4j6r3sy1WXpGRqQ3OTqHaS9Z+1wFo + OHI58uTiR6sBu3pMRrrxACH2gDyV5VTrIg0Vhuv5TGAF0uH9ZG9kAK5DUeRTY8fJqCes2wvWLJZ5e83H + l6BGNF58GMUw4vIvAf6c1hT6JtSIusIzRIuFmrJ+1QrWr1pRQQr356HcbmT/+fSL0aSNI5Lu14A9SMEJ + ckVKPzvcG5RyTeN5fRfN24iX1ylIScbDcyuhwObq8PcS1GstD3+vQYYsTdbqJGQ0KsgTm4Wi/jOpBk7n + MzxwCjLU0RT1Wne5gjyiPVRd/rE0jpVQDjvR8HMH8sreR3UGa9L1oM52Ts1ng+G+u8N99xmIRu5dFDke + iXt6EXKxdgah34Bc8suAJ3p6+0bq8rbC88DTY/A9j6LhyxXIAC6jhUBmGIPtQAHENaj3+AgyriUUjDoP + +PsRyFZBDWYA1eOp6FXlx1Advq1Bw4QktqJoeVYTgUAN616k8EciI7YExQJ+Rrqc+HTkooPK9yNokVjU + m8eHgGeE83fE/rc79j0LUeYmMvi70JyA28I5S9CsuqltKIufoNm2Z6Fh44kkewBR0G8yw4e6m9FkpjnI + GLwfpenHZh5AjINR2qyEFOqzSLm6kQE4sg2F1U76Ue+4FfUkF5LCA4gT8wa2oaju7yM3D2Stz6LFeog1 + 0l9RjRKfiMaRpyKl3OfypmjUnbIvRDRh5whkGA9CgbsHU8o4FxnpiMXIbT87HMfGPlvG8PkAv6a6wvBA + QkMK5bcH+AGaun5N+L1dc1o2o9WiA2h48dYUz78xnF9CXng87fxquN+Xgf+D4iHAGBmA2BetoBq1vQOl + c6L02cmEsd0Y5sPHgweBn4bf34aMWNq9C/YRa4QPo8hu5IYdzcjr4VmqlbkIuf+nIPd1C0plTiSeRunA + 2WgOyazwfM+QzgAcjzIHIKV/ruZ4luowLL5YKOJXVJfsHk7MmESGPBjz8eB2qinMd5Csc49Q9Wb2pYGD + 3A1lH0sPYA7q5Wegwv9HFNX9DrKUU5F7N3ckN8+QV6mOyd6AxqWv1zsxWg7c09s3pae3b3pseTCwnxF4 + JnaPKYyc16iOa+ehWYtRQOoJ0ufNO4VXqC40OxJ5jrdTnROQxFlorL8H9XQrkc5Fx0q0uKyC3P+zaq5/ + mWqjm4ViWdMz6rCeRPNJQLP8Tkk4/zGqsxajRXuJne1YGoDTqOa970ORW1D+POqlliGXbEJ4AbEG24fi + AVORK9ms0R6AZv/9N2qCMbFnjvZFABmDlnuVmGyPonjLFDR5ZGH4/8Okd1GznAlYy31Ue+ntpPBiQrlO + RcOfEjKMtwD3rV+14p7oQLr4U2TMy0hnp8YWBvWjzE803n4n0tdyA31ty9ApyDKEYjqb0ND67ITLXkHp + ZZBx+wgyHE3bWqMg4HTkIlUaXLwd2BGbaNCNdgWaHwrxh1RdqQ0ocLIUNYh3o5zpDtrHHGBeT29fvUkb + FTTGamU23mY0nDmD4Rt0UFPI56HlyHPROPJvwuqxHcg4nIhmSB4QZHmMFuMKNdyPyvpw5CpOR8qzuoX7 + TkNK1t+gvrcBO8cpQPhz1JPNRB1H2r0SjqI6xt9M4zkbD4TymhGuOQLFqyLuREbnTNQGPo9W/t3R09v3 + OqqzeWioewDt5UkUEPwAyfNv9qCFa+9GdbkM7Uj0F8DGnt6+7aidLiAWJGxkAC6i8frrCnBDOCJOojrn + P2rw8ZlIN6Ex3QI0u+4U4N4mSzJHyxUobVfPw9mJtiB7qYX7VZAX8PuE/HEDSmja8MHhu69AlvsnyFU/ + DLmV0dhyI1U3b6S8gGZoHk51FdszhNmaKcv3bLRFVL1x5hAKXt4ySjnTshlF/Q9FXsymZifXpJ+jVPNq + Gm8XtgnFA44Ix5HAL2P3eR74Imrgs5BuX4vqKVq0dA6aPTk1/N1yTCglO1H6+BLqLGCKqJmF+z2kdyWq + O1vdiozc7CD3Pm+ikQGINuqsxxBS5htihfZ2qhNR7mK41X4oCPG7qBG8C1n6dhXcWU0+ex3tLZeKWOH+ + EhmBE6jj+oXzKihecFYo6GhbrsV1br0bzbdYy+jYjbyAc2P/e4Lhs9yacTSNZ9kNIrd8vAzAHtQAbwtl + k2byVhl1KlFK7mEaD3/2hs/PRp7iEsLqz1hd3xjud2W458FU99irZT3VCUZjRkyWu9CksotTnL8zlN2R + KCBfRgbspAaX3R03ABVU2UM0HxMOsb9ruRBZmjJyFW9kuHu9E6VNLkVW9R1I+Z9q8B2V2JHWSAylPH+w + yfXUuz4U7iCyrr+DeqdG216tQ1syfRQNi2Yx3GC8gnqV66ife4/qApLH5wOoZ9qLov9dqPffknBdVFZJ + 9490ohXi9TDU5JzBcFSicg7nP0hsC7NYRxPdq7YOp1GdNPQ6Ya17A6IdiKPNRZaG63fGztmJNizdhOqx + Nn0dldk9wNWRrDX1mKYM4s8yrC6C3m1Bncrb0DAgqS4eR/r3Egp6TmV//aug4ei3gC/FDcAjaKeayTRX + igr77y83hPKik8KN76nzEKDgy4eoRmmbWfaHwrmgBpU0lh1Aec7VJCt0vbnSoKhxH4r6NxoerEazDKPt + zfbb3CT2rI+hWX43IqO3FDXMUijnb7J/sKuW+1ElTiaWs60l9n13I7cvUpAHSZ7EtSZWxs2Itj9vhbUo + EDqNxmPxp9D89OnUX5lXywBaaboO1WF8gVI/Gqb8E2q8a6LyacCP0S69B6BJb/v0K7ZzzmZkpO9BHdy5 + 4fwSGkL8KNxnQ4Oy3gX8KYoFPUf9mNcAMjSHogzEqw3k/QHqYCeFc+ruURCT/Ungv6Kh93upDlsroW5u + QHW69f8D447Kbv4U1JoAAAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/Start/Program.cs b/Start/Program.cs new file mode 100644 index 00000000..b2c8b184 --- /dev/null +++ b/Start/Program.cs @@ -0,0 +1,17 @@ +namespace Start +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Main()); + } + } +} \ No newline at end of file diff --git a/Start/Resource/Data/data.sql b/Start/Resource/Data/data.sql new file mode 100644 index 00000000..74fb20f2 Binary files /dev/null and b/Start/Resource/Data/data.sql differ diff --git a/Start/Resource/Data/dbo.sql b/Start/Resource/Data/dbo.sql new file mode 100644 index 00000000..8a3bbdb1 Binary files /dev/null and b/Start/Resource/Data/dbo.sql differ diff --git a/Start/Resource/EIImageViewerData.rar b/Start/Resource/EIImageViewerData.rar new file mode 100644 index 00000000..77da95e4 Binary files /dev/null and b/Start/Resource/EIImageViewerData.rar differ diff --git a/Start/Resource/EIImageViewerService.rar b/Start/Resource/EIImageViewerService.rar new file mode 100644 index 00000000..1e088962 Binary files /dev/null and b/Start/Resource/EIImageViewerService.rar differ diff --git a/Start/Resource/EIImageViewerWeb.rar b/Start/Resource/EIImageViewerWeb.rar new file mode 100644 index 00000000..015d9c5e Binary files /dev/null and b/Start/Resource/EIImageViewerWeb.rar differ diff --git a/Start/Resource/UnInstall.exe b/Start/Resource/UnInstall.exe new file mode 100644 index 00000000..fcaefa21 Binary files /dev/null and b/Start/Resource/UnInstall.exe differ diff --git a/Start/Resource/医学影像处理软件用户手册.pdf b/Start/Resource/医学影像处理软件用户手册.pdf new file mode 100644 index 00000000..e8398ee3 Binary files /dev/null and b/Start/Resource/医学影像处理软件用户手册.pdf differ diff --git a/Start/favicon.ico b/Start/favicon.ico new file mode 100644 index 00000000..70e9d37f Binary files /dev/null and b/Start/favicon.ico differ diff --git a/UnInstall/Ncrow-Mega-Pack-2-Uninstall-Tool.256.ico b/UnInstall/Ncrow-Mega-Pack-2-Uninstall-Tool.256.ico new file mode 100644 index 00000000..ee28e750 Binary files /dev/null and b/UnInstall/Ncrow-Mega-Pack-2-Uninstall-Tool.256.ico differ diff --git a/UnInstall/Program.cs b/UnInstall/Program.cs new file mode 100644 index 00000000..fad90993 --- /dev/null +++ b/UnInstall/Program.cs @@ -0,0 +1,224 @@ +// See https://aka.ms/new-console-template for more information + +using Newtonsoft.Json.Linq; +using Serilog; +using System.Data.SqlTypes; +using System.Diagnostics; +using System.Drawing; +using static System.Net.Mime.MediaTypeNames; + +async Task ProcessStandardInputAsync(Process process, string cmd, string workDirectory = "") +{ + if (!string.IsNullOrWhiteSpace(workDirectory)) + { + process.StartInfo.WorkingDirectory = workDirectory; + } + + await process.StandardInput.WriteLineAsync(cmd); + await process.StandardInput.FlushAsync(); + + while (!process.StandardOutput.EndOfStream) + { + var output = await process.StandardOutput.ReadLineAsync(); + if (string.IsNullOrWhiteSpace(output)) + { + break; + } + } +} + +void DeleteFolderContents(string path) +{ + DirectoryInfo directory = new DirectoryInfo(path); + + foreach (FileInfo file in directory.GetFiles()) + { + if (file.FullName.Contains("UnInstall")) + { + continue; + } + + try + { + file.Attributes = FileAttributes.Normal; + file.Delete(); + } + catch (IOException ex) + { + // 处理文件被占用的异常 + MyLog($"File {file.FullName} is being used and cannot be deleted. {ex.Message}"); + } + catch (UnauthorizedAccessException ex) + { + + try + { + File.Delete(file.FullName); + } + catch (Exception ex2) + { + + MyLog($"File {file.FullName} cannot be deleted. {ex2.Message}"); + } + + + } + + + + + } + + foreach (DirectoryInfo subDirectory in directory.GetDirectories()) + { + subDirectory.Delete(true); + } +} + + +void MyLog(string message) +{ + Console.WriteLine(message); + //Serilog.Log.Information(message); +} + + +//Serilog.Log.Logger = new LoggerConfiguration() +// .WriteTo.File("logs\\UninstallLog.txt", rollingInterval: RollingInterval.Day) +// .CreateLogger(); + + + +var startProList = Process.GetProcesses().Where(t => t.ProcessName.Contains("EI_Image_Viewer_Installer")).ToList(); +foreach (var item in startProList) +{ + item.Kill(); +} + + +var configFolder = $@"C:\ProgramData\.xingcang\"; + +var configPath = Path.Combine(configFolder, "config.json"); +if (!File.Exists(configPath)) +{ + MyLog("当前系统未部署影像系统,无须卸载"); + Console.ReadLine(); +} +else +{ + Console.ForegroundColor = ConsoleColor.Red; + MyLog(""); + MyLog("警告:卸载EI Image Viewer 服务,会将后台服务、数据库、网站文件以及运行的所有数据记录清除,请慎重操作。在卸载前,请确保数据已经备份。"); + MyLog(" 您确定要继续卸载该服务吗?(Y/N)"); + Console.ResetColor(); + + string confirm = Console.ReadLine(); + if (confirm.ToUpper() == "Y") + { + // 执行卸载操作 + try + { + MyLog("开始读取激活信息..."); + + var appsettingsJson = File.ReadAllText(configPath); + + // 解析 JSON 字符串 + var jObject = JObject.Parse(appsettingsJson); + + + var configObj = new + { + key = jObject["key"].ToString(), + value = jObject["value"].ToString(), + user = jObject["user"].ToString(), + server = jObject["server"].ToString(), + password = jObject["password"].ToString(), + dbName = jObject["dbName"].ToString(), + deployFolder = jObject["deployFolder"].ToString(), + nginxStartPath = jObject["nginxStartPath"].ToString(), + //apiPath = jObject["apiPath"].ToString(), + serviceName = jObject["serviceName"].ToString(), + nginxServiceName = jObject["nginxServiceName"]?.ToString(), + nginxServiceEXEPath = jObject["nginxServiceEXEPath"]?.ToString(), + }; + MyLog("激活信息读取完毕,开始准备卸载..."); + + Process process = new Process(); + process.StartInfo.FileName = "cmd.exe"; + process.StartInfo.RedirectStandardInput = true; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardOutput = true; + + //process.StartInfo.CreateNoWindow = false; // 不创建新窗口 + + process.Start(); + + MyLog("停止并卸载nginx服务..."); + await ProcessStandardInputAsync(process, $" {configObj.nginxServiceEXEPath} uninstall ", configObj.nginxStartPath); + await ProcessStandardInputAsync(process, $"sc stop {configObj.nginxServiceName}"); + await ProcessStandardInputAsync(process, $"sc delete {configObj.nginxServiceName}"); + + await Task.Delay(2000); + + + var proList = Process.GetProcesses().Where(t => ((t.ProcessName.Contains("nginx") || t.ProcessName.Contains("nginxService")) && t.MainModule.FileName.Contains(configObj.nginxStartPath))).ToList(); + + foreach (var item in proList) + { + item.Kill(); + } + + + + + MyLog("停止并卸载后端服务..."); + + await ProcessStandardInputAsync(process, $"sc stop {configObj.serviceName}"); + await ProcessStandardInputAsync(process, $"sc delete {configObj.serviceName}"); + + + MyLog("数据库若被其他进程或者连接正在使用,将会删除失败,您可以卸载完后手动删除遗留的数据库"); + MyLog("执行删除数据库命令..."); + await ProcessStandardInputAsync(process, $@" SQLCMD -S {configObj.server} -U {configObj.user} -P {configObj.password} -Q ""DROP DATABASE {configObj.dbName}"" "); + + + process.StandardInput.Close(); + process.WaitForExit(); + + await Task.Delay(3000); + + MyLog($"删除部署文件夹{configObj.deployFolder}下可删除的所有内容..."); + DeleteFolderContents(configObj.deployFolder); + + + MyLog("删除激活信息..."); + DeleteFolderContents(configFolder); + MyLog("EI Image Viewer 服务卸载完成。"); + MyLog("3s 后自动退出..."); + await Task.Delay(3000); + + string cmdArgs = $"/C ping 127.0.0.1 -n 3 & rmdir /s /q \"{configObj.deployFolder}\""; + ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", cmdArgs); + psi.WindowStyle = ProcessWindowStyle.Hidden; + psi.CreateNoWindow = true; + Process.Start(psi); + + Environment.Exit(0); + + } + catch (Exception ex) + { + + MyLog("卸载过程遇到问题:" + ex.Message + " 请检查是否有其他程序占用了相关资源,请确认后再重新卸载。"); + Console.ReadLine(); + } + + + } + + + + +} + + diff --git a/UnInstall/UnInstall.csproj b/UnInstall/UnInstall.csproj new file mode 100644 index 00000000..8c3d4396 --- /dev/null +++ b/UnInstall/UnInstall.csproj @@ -0,0 +1,21 @@ + + + + Exe + net6.0 + enable + enable + Ncrow-Mega-Pack-2-Uninstall-Tool.256.ico + AnyCPU;x64 + + + + + + + + + + + +