Эх сурвалжийг харах

Merge branch 'master' of http://git.ius.plus:88/Project-Wing/WingCloudServer

denny 8 сар өмнө
parent
commit
f08fa550cb

+ 0 - 10
Publish.ps1

@@ -89,17 +89,7 @@ BuildService "WingRecognitionService" 1 0 "../WingCloudServer/src/WingRecognitio
 Copy-Item -recurse -Force ../WingCloudServer/src/WingRecognitionService/bin/Debug/net6.0/publish/IDCardRecognition ../WingCloudServer/src/bin/Debug/net6.0
 Copy-Item -recurse -Force ../WingCloudServer/src/WingRecognitionService/bin/Debug/net6.0/publish/IDCardRecognition/Networks ../WingCloudServer/src/bin/Debug/net6.0
 
-BuildService "WingVinnoIOTService" 1 0 "../WingCloudServer/src/WingVinnoIOTService"
 
-BuildService "VitalMixtureService" 1 0 "../WingCloudServer/src/VitalMixtureService"
-
-BuildService "VitalRegisterService" 1 0 "../WingCloudServer/src/VitalRegisterService"
-
-BuildService "HealthExamBookingService" 1 0 "../WingCloudServer/src/HealthExamBookingService"
-
-BuildService "WingResearchEditionService" 1 0 "../WingCloudServer/src/WingResearchEditionService"
-
-BuildService "WingTaskService" 1 0 "../WingCloudServer/src/WingTaskService"
 
 Write-Host 'Finished!' -NoNewline
 $null = [Console]::ReadKey('?')

+ 45 - 4
src/ElectrocardiogramService/ElectrocardiogramService.cs

@@ -4,6 +4,7 @@ using System.IO;
 using System.Linq;
 using System.Net.Http;
 using System.Threading.Tasks;
+using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using WingInterfaceLibrary.DTO.Vital;
 using WingInterfaceLibrary.Enum.VitalEnum;
@@ -30,6 +31,7 @@ public class ElectrocardiogramService : JsonRpcService, IVitalElectrocardiogramS
     private IVitalOrganizationDBService _vitalOrganizationDBService;
     private IReportDBService _reportDBService;
     private IUltrasoundReportService _ultrasoundReportService;
+    private IVitalFacturyPostHistoryService _vitalFacturyPostHistoryService { get; set; }
 
     /// <summary>
     /// 初始化注册
@@ -76,6 +78,7 @@ public class ElectrocardiogramService : JsonRpcService, IVitalElectrocardiogramS
         _vitalOrganizationDBService = GetProxy<IVitalOrganizationDBService>();
         _reportDBService = GetProxy<IReportDBService>();
         _ultrasoundReportService = GetProxy<IUltrasoundReportService>();
+        _vitalFacturyPostHistoryService = GetProxy<IVitalFacturyPostHistoryService>();
     }
 
     private async Task<string> GetClientIdByTokenAsync(string token)
@@ -198,6 +201,15 @@ public class ElectrocardiogramService : JsonRpcService, IVitalElectrocardiogramS
             if (string.IsNullOrEmpty(record?.OrganizationName))
             {
                 record.OrganizationName = orgInfo.OrganizationName;
+            }
+            EcgExamDataModel ecgExamData = null;
+            try
+            {
+                ecgExamData = JsonConvert.DeserializeObject<EcgExamDataModel>(request.ExamData);
+            }
+            catch
+            {
+
             }
             if (!string.IsNullOrEmpty(userReport?.ReportCode))
             {
@@ -208,10 +220,15 @@ public class ElectrocardiogramService : JsonRpcService, IVitalElectrocardiogramS
                     PatientName = userInfo.UserName,
                     ReportTemplateCode = reportTemplateCode,
                     ReportCode = userReport.ReportCode,
-                    Token = request.Token
+                    Token = request.Token,
+                    HealthDiagnosis = ecgExamData?.HealthDiagnosis ?? 0,
                 };
                 //修改报告
                 res = await _ultrasoundReportService.VitalModifyEcgReportAsync(modifyRequest);
+                if (res)
+                {
+                    await CreateJingQiReportPostHistoryAsync(request.Token, userReport.ReportCode);
+                }
             }
             else
             {
@@ -221,16 +238,40 @@ public class ElectrocardiogramService : JsonRpcService, IVitalElectrocardiogramS
                     ReportDatasJson = request.ExamData,
                     PatientName = userInfo.UserName,
                     ReportTemplateCode = reportTemplateCode,
-                    Token = request.Token
+                    Token = request.Token,
+                    HealthDiagnosis = ecgExamData?.HealthDiagnosis ?? 0,
                 };
                 //新增报告
-                var result = await _ultrasoundReportService.VitalAddEcgReportAsync(addRequest);
-                if (!string.IsNullOrWhiteSpace(result))
+                var reportCode = await _ultrasoundReportService.VitalAddEcgReportAsync(addRequest);
+                if (!string.IsNullOrWhiteSpace(reportCode))
                 {
                     res = true;
+                    await CreateJingQiReportPostHistoryAsync(request.Token, reportCode);
                 }
             }
         }
         return res;
     }
+
+    private async Task<bool> CreateJingQiReportPostHistoryAsync(string token, string reportCode)
+    {
+        try
+        {
+            return await _vitalFacturyPostHistoryService.CreateJingQiReportPostHistoryAsync(new CreateJingQiReportPostHistoryRequest
+            {
+                Token = token,
+                ReportCode = reportCode,
+            });
+        }
+        catch (Exception ex)
+        {
+            Logger.WriteLineWarn($"ElectrocardiogramService CreateJingQiReportPostHistoryAsync error, ex:{ex}");
+        }
+        return false;
+    }
+
+    public class EcgExamDataModel
+    {
+        public int HealthDiagnosis { get; set; }
+    }
 }

+ 22 - 12
src/HealthExamBookingService/HealthExamBookingService.cs

@@ -431,7 +431,7 @@ public partial class HealthExamBookingService : JsonRpcService, IVitalHealthExam
         var userInfo = await GetUserInfoByTokenAsync(token);
         var dto = request.MappingTo<RegisterInfoDTO>();
         var idCardNo = request.IDCardNo;
-        
+
         if (string.IsNullOrEmpty(request.Name))
         {
             ThrowCustomerException(CustomerRpcCode.PatientNameIsEmpty, "Patient name is empty");
@@ -540,26 +540,36 @@ public partial class HealthExamBookingService : JsonRpcService, IVitalHealthExam
         if (registerInfo != null && registerInfo.JingQiExamInfos != null && registerInfo.JingQiExamInfos.Any()
             && registerInfo.JingQiExamInfos.ContainsKey("PhyId") && !string.IsNullOrWhiteSpace(registerInfo.JingQiExamInfos["PhyId"]))
         {
-            try
+            var jingQiRes = await _vitalFacturyUserService.FacturyExamDeleteAsync(new FacturyExamDeleteRequest
+            {
+                Token = request.Token,
+                PhyId = registerInfo.JingQiExamInfos["PhyId"],
+                Identity = registerInfo.IDCardNo,
+                PatientName = registerInfo.Name,
+            });
+            if (jingQiRes.Status != "0")
             {
-                var jingQiRes = await _vitalFacturyUserService.FacturyExamDeleteAsync(new FacturyExamDeleteRequest
+                Logger.WriteLineError($"HealthExamBookingService DeleteRegiterInfoAsync failed, cardNo:{registerInfo.IDCardNo}, Status:{jingQiRes.Status}, ErroMsg:{jingQiRes.ErroMsg}");
+                if (jingQiRes.Status == "")
                 {
-                    Token = request.Token,
-                    PhyId = registerInfo.JingQiExamInfos["PhyId"],
-                    Identity = registerInfo.IDCardNo,
-                    PatientName = registerInfo.Name,
-                });
-                if (jingQiRes.Status != "0")
+                    ThrowCustomerException(CustomerRpcCode.JingQiException, "JingQiException");
+                }
+                else if (jingQiRes.Status == "2")
                 {
-                    Logger.WriteLineError($"HealthExamBookingService DeleteRegiterInfoAsync failed, cardNo:{registerInfo.IDCardNo}, Status:{jingQiRes.Status}, ErroMsg:{jingQiRes.ErroMsg}");
+                    ThrowCustomerException(CustomerRpcCode.JingQiNonArea, "JingQiNonArea");
+                }
+                else if (jingQiRes.Status == "3")
+                {
+                    ThrowCustomerException(CustomerRpcCode.JingQiExamedInYear, "JingQiExamedInYear");
                 }
                 else
                 {
-                    Logger.WriteLineInfo($"HealthExamBookingService DeleteRegiterInfoAsync success, cardNo:{registerInfo.IDCardNo}, Status:{jingQiRes.Status}, ErroMsg:{jingQiRes.ErroMsg}");
+                    ThrowCustomerException(CustomerRpcCode.JingQiApiFailed, jingQiRes.ErroMsg);
                 }
             }
-            catch (Exception ex)
+            else
             {
+                Logger.WriteLineInfo($"HealthExamBookingService DeleteRegiterInfoAsync success, cardNo:{registerInfo.IDCardNo}, Status:{jingQiRes.Status}, ErroMsg:{jingQiRes.ErroMsg}");
             }
         }
         return await _registerInfoDBService.DeleteRegisterInfoAsync(registerCode);

+ 3 - 2
src/VitalMixtureService/DBService/Service/FacturyPostHistoryDBService.cs

@@ -105,8 +105,9 @@ namespace VitalService.Service
         public async Task<List<FacturyPostHistoryDTO>> GetNonPostHistoryDBAsync(GetNonPostHistoryDBRequest request)
         {
             var filter = Builders<FacturyPostHistoryEntity>.Filter.Eq(f => f.Status, 1);
-            var result = await _facturyPostHistoryDBRepository.FindAllAsync(filter);
-            return result.MappingTo<List<FacturyPostHistoryDTO>>();
+            var entities = await _facturyPostHistoryDBRepository.FindAllAsync(filter);
+            entities = entities.OrderBy(x => x.CreateTime).ToList();
+            return entities.MappingTo<List<FacturyPostHistoryDTO>>();
         }
 
         /// <summary>

+ 28 - 0
src/VitalMixtureService/Factury/BaseApiHelper.cs

@@ -42,6 +42,34 @@ namespace VitalService.Factury
             return string.Empty;
         }
 
+        /// <summary>
+        /// 下载文件
+        /// </summary>
+        /// <param name="url"></param>
+        /// <param name="savePath"></param>
+        /// <returns></returns>
+        public async Task<string> DownloadFileAsync(string url)
+        {
+            try
+            {
+                if (!string.IsNullOrWhiteSpace(url))
+                {
+                    HttpResponseMessage response = await _httpClient.GetAsync(url);
+                    if (response.IsSuccessStatusCode)
+                    {
+                        byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();
+                        string base64String = Convert.ToBase64String(fileBytes);
+                        return base64String;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"VitalMixtureService BaseApiHelper DownloadFileAsync error, url:{url}, ex:{ex}");
+            }
+            return string.Empty;
+        }
+
         public void Dispose()
         {
             _httpClient?.Dispose();

+ 28 - 20
src/VitalMixtureService/Factury/FacturyManage.cs

@@ -8,24 +8,27 @@ namespace VitalService.Factury
     public class FacturyManage
     {
         private BaseApiHelper _baseApiHelper;
+        private Func<string, FacturyPostHistoryDTO> OnGetFacturyPostHistory;
         private Action<string, bool, DateTime, string> OnUpdateHistoryStatus;
         private Func<List<FacturyPostHistoryDTO>> OnGetNonPostHistory;
-        private readonly SequenceExecutor<FacturyPostHistoryDTO> _sequenceExecutor = new SequenceExecutor<FacturyPostHistoryDTO>("FacturySequenceExecutor");
+        private readonly SequenceExecutor<string> _sequenceExecutor = new SequenceExecutor<string>("FacturySequenceExecutor");
 
-        public FacturyManage(Action<string, bool, DateTime, string> funUpdateHistoryStatus
+        public FacturyManage(Func<string, FacturyPostHistoryDTO> funGetFacturyPostHistory
+            , Action<string, bool, DateTime, string> funUpdateHistoryStatus
             , Func<List<FacturyPostHistoryDTO>> funGetNonPostHistory)
         {
             _baseApiHelper = new BaseApiHelper(60);
+            OnGetFacturyPostHistory = funGetFacturyPostHistory;
             OnUpdateHistoryStatus = funUpdateHistoryStatus;
             OnGetNonPostHistory = funGetNonPostHistory;
             SendNonPostHistory();
         }
 
-        public void Add(FacturyPostHistoryDTO history)
+        public void Add(string code)
         {
-            if (history.Status == 1 && !_sequenceExecutor.GetRestWorkers().Any(x => x.Parameter.Code == history.Code))
+            if (!_sequenceExecutor.GetRestWorkers().Any(x => x.Parameter == code))
             {
-                _sequenceExecutor.Add(DoPost, history);
+                _sequenceExecutor.Add(DoPost, code);
             }
         }
 
@@ -37,31 +40,36 @@ namespace VitalService.Factury
             {
                 foreach (var record in nonPostRecords)
                 {
-                    Add(record);
+                    Add(record.Code);
                 }
             }
         }
 
-        private bool DoPost(FacturyPostHistoryDTO history)
+        private bool DoPost(string code)
         {
-            var idCardNo = history.IDCardNo;
+            var idCardNo = string.Empty;
             var postTime = DateTime.UtcNow;
             try
             {
-                Logger.WriteLineInfo($"VitalMixtureService FacturyManage DoPost start, idCardNo:{idCardNo}");
-                var res = GetResult(history.FacturyUrl, history.Content, history.Headers, idCardNo).Result;
-
-                var success = res.Item1;
-                var rpcRes = res.Item2;
-                if (success)
-                {
-                    Logger.WriteLineInfo($"VitalMixtureService FacturyManage DoPost success, idCardNo:{idCardNo}, res:{rpcRes}");
-                }
-                else
+                var history = OnGetFacturyPostHistory?.Invoke(code);
+                if (history != null && history.Status == 1)
                 {
-                    Logger.WriteLineError($"VitalMixtureService FacturyManage DoPost failed, idCardNo:{idCardNo}, res:{rpcRes}");
+                    idCardNo = history.IDCardNo;
+                    Logger.WriteLineInfo($"VitalMixtureService FacturyManage DoPost start, idCardNo:{idCardNo}");
+                    var res = GetResult(history.FacturyUrl, history.Content, history.Headers, idCardNo).Result;
+
+                    var success = res.Item1;
+                    var rpcRes = res.Item2;
+                    if (success)
+                    {
+                        Logger.WriteLineInfo($"VitalMixtureService FacturyManage DoPost success, idCardNo:{idCardNo}, res:{rpcRes}");
+                    }
+                    else
+                    {
+                        Logger.WriteLineError($"VitalMixtureService FacturyManage DoPost failed, idCardNo:{idCardNo}, res:{rpcRes}");
+                    }
+                    OnUpdateHistoryStatus?.Invoke(history.Code, success, postTime, rpcRes);
                 }
-                OnUpdateHistoryStatus?.Invoke(history.Code, success, postTime, rpcRes);
             }
             catch (Exception ex)
             {

+ 509 - 3
src/VitalMixtureService/Factury/JingQiApiHelper.cs

@@ -1,17 +1,27 @@
+using System.Collections.Concurrent;
 using Newtonsoft.Json;
+using WingInterfaceLibrary.DTO.Report;
+using WingInterfaceLibrary.DTO.Vital;
+using WingServerCommon.Config;
+using WingServerCommon.Config.Parameters;
 using WingServerCommon.Log;
 
 namespace VitalService.Factury
 {
     public class JingQiApiHelper : BaseApiHelper
     {
+        private ConcurrentDictionary<string, FacturyOrgModel> _facturyOrgInfos = new ConcurrentDictionary<string, FacturyOrgModel>();
+
+        private Func<string, FacturyOrgModel> OnGetFacturyOrgInfo;
+        private List<string> _jingQiHealthKeywords = new List<string>();
+
         private string _serverUrl;
 
         public string RegisterUrl
         {
             get
             {
-                return $"{_serverUrl}/phyreginf";
+                return $"{_serverUrl}/api/phyreginf";
             }
         }
 
@@ -19,14 +29,33 @@ namespace VitalService.Factury
         {
             get
             {
-                return $"{_serverUrl}/phyregmod";
+                return $"{_serverUrl}/api/phyregmod";
             }
         }
 
-        public JingQiApiHelper(string serverUrl, double seconds = 60) : base(seconds)
+        public JingQiApiHelper(string serverUrl, Func<string, FacturyOrgModel> funGetFacturyOrgInfo, double seconds = 60) : base(seconds)
         {
             _serverUrl = serverUrl?.Trim('/') ?? string.Empty;
+            OnGetFacturyOrgInfo = funGetFacturyOrgInfo;
             Logger.WriteLineInfo($"VitalMixtureService JingQiApiHelper init, serverUrl:{_serverUrl}, seconds:{seconds}");
+            var jingQiHealthKeywords = EnvironmentConfigManager.GetParammeter<StringParameter>("Vital", "JingQiHealthKeywords").Value;
+            if (!string.IsNullOrWhiteSpace(jingQiHealthKeywords))
+            {
+                _jingQiHealthKeywords = jingQiHealthKeywords.Split(';').ToList();
+            }
+        }
+
+        public FacturyOrgModel GetFacturyInfo(string token)
+        {
+            if (!_facturyOrgInfos.TryGetValue(token, out FacturyOrgModel facturyInfo))
+            {
+                facturyInfo = OnGetFacturyOrgInfo.Invoke(token);
+                if (facturyInfo != null)
+                {
+                    _facturyOrgInfos.TryAdd(token, facturyInfo);
+                }
+            }
+            return facturyInfo;
         }
 
         /// <summary>
@@ -53,6 +82,466 @@ namespace VitalService.Factury
             return await GetJingQiResult<JingQiExamDeleteResult>(DeleteRegisterUrl, JsonConvert.SerializeObject(request), headers, idCardNo);
         }
 
+        /// <summary>
+        /// 转换中医体质结果
+        /// </summary>
+        /// <param name="examInfo"></param>
+        /// <param name="registerInfo"></param>
+        /// <param name="url"></param>
+        /// <returns></returns>
+        public string GetZYPostContentAsync(RegisterPersonInfoDTO registerInfo, FacturyOrgModel facturyInfo, Dictionary<string, string> examData, DateTime examTime, out string url)
+        {
+            url = $"{_serverUrl}/api/phychn";
+
+            var jingQiInfos = registerInfo.JingQiExamInfos;
+            var pyhId = GetValue(jingQiInfos, "pyhid");
+
+            var dic = new Dictionary<string, string>();
+            dic.Add("pyhid", pyhId);
+            dic.Add("personId", GetValue(jingQiInfos, "PatientID"));
+            dic.Add("identificationAge", GetInt(jingQiInfos, "PATAGE").ToString());
+            dic.Add("q1Jlcp", GetValue(examData, "qusition1"));
+            dic.Add("q2Rypb", GetValue(examData, "qusition2"));
+            dic.Add("q3Ryjd", GetValue(examData, "qusition3"));
+            dic.Add("q4Sywl", GetValue(examData, "qusition4"));
+            dic.Add("q5Qxdc", GetValue(examData, "qusition5"));
+            dic.Add("q6Jlba", GetValue(examData, "qusition6"));
+            dic.Add("q7Gdsl", GetValue(examData, "qusition7"));
+            dic.Add("q8Hpsj", GetValue(examData, "qusition8"));
+            dic.Add("q9Bmi", GetValue(examData, "qusition9"));
+            dic.Add("q10Yjgs", GetValue(examData, "qusition10"));
+            dic.Add("q11Sjfl", GetValue(examData, "qusition11"));
+            dic.Add("q12Stpl", GetValue(examData, "qusition12"));
+            dic.Add("q13Nshl", GetValue(examData, "qusition13"));
+            dic.Add("q14Rygm", GetValue(examData, "qusition14"));
+            dic.Add("q15Gmlt", GetValue(examData, "qusition15"));
+            dic.Add("q16Kndh", GetValue(examData, "qusition16"));
+            dic.Add("q17Rygm", GetValue(examData, "qusition17"));
+            dic.Add("q18Ryxmz", GetValue(examData, "qusition18"));
+            dic.Add("q19Qzyb", GetValue(examData, "qusition19"));
+            dic.Add("q20Rczh", GetValue(examData, "qusition20"));
+            dic.Add("q21Fcgz", GetValue(examData, "qusition21"));
+            dic.Add("q22Ztmm", GetValue(examData, "qusition22"));
+            dic.Add("q23Mbyn", GetValue(examData, "qusition23"));
+            dic.Add("q24Mkha", GetValue(examData, "qusition24"));
+            dic.Add("q25Pfsz", GetValue(examData, "qusition25"));
+            dic.Add("q26Kgyz", GetValue(examData, "qusition26"));
+            dic.Add("q27Kqyw", GetValue(examData, "qusition27"));
+            dic.Add("q28Fbfd", GetValue(examData, "qusition28"));
+            dic.Add("q29Ylbs", GetValue(examData, "qusition29"));
+            dic.Add("q30Dbnz", GetValue(examData, "qusition30"));
+            dic.Add("q31Dbgz", GetValue(examData, "qusition31"));
+            dic.Add("q32Sthn", GetValue(examData, "qusition32"));
+            dic.Add("q33Sxjmyz", GetValue(examData, "qusition33"));
+
+            var physicalConclusion = GetValue(examData, "PhysicalConclusion");
+            var healthGuidance = GetHealthGuidance(GetValue(examData, "HealthGuidance"));
+            // 气虚质
+            var qiScoreValue = GetValue(examData, "Qi_Score");
+            if (!string.IsNullOrWhiteSpace(qiScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(qiScoreValue);
+                dic.Add("qxzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("qxzDf", score.Value.ToString());
+                if (physicalConclusion == "Qi_Score")
+                {
+                    dic.Add("qxzZd", healthGuidance);
+                }
+            }
+            // 阳虚质
+            var yangScoreValue = GetValue(examData, "Yang_Score");
+            if (!string.IsNullOrWhiteSpace(yangScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(yangScoreValue);
+                dic.Add("yaxzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("yaxzDf", score.Value.ToString());
+                if (physicalConclusion == "Yang_Score")
+                {
+                    dic.Add("yaxzZd", healthGuidance);
+                }
+            }
+            // 阴虚质
+            var yinScoreValue = GetValue(examData, "Yin_Score");
+            if (!string.IsNullOrWhiteSpace(yinScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(yinScoreValue);
+                dic.Add("yixzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("yixzDf", score.Value.ToString());
+                if (physicalConclusion == "Yin_Score")
+                {
+                    dic.Add("yixzZd", healthGuidance);
+                }
+            }
+            // 痰湿质
+            var tanScoreValue = GetValue(examData, "Tan_Score");
+            if (!string.IsNullOrWhiteSpace(tanScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(tanScoreValue);
+                dic.Add("tszSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("tszDf", score.Value.ToString());
+                if (physicalConclusion == "Tan_Score")
+                {
+                    dic.Add("tszZd", healthGuidance);
+                }
+            }
+            // 湿热质
+            var shiScoreValue = GetValue(examData, "Shi_Score");
+            if (!string.IsNullOrWhiteSpace(shiScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(shiScoreValue);
+                dic.Add("srzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("srzDf", score.Value.ToString());
+                if (physicalConclusion == "Shi_Score")
+                {
+                    dic.Add("srzZd", healthGuidance);
+                }
+            }
+            // 血瘀质
+            var xueScoreValue = GetValue(examData, "Xue_Score");
+            if (!string.IsNullOrWhiteSpace(xueScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(xueScoreValue);
+                dic.Add("xyzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("xyzDf", score.Value.ToString());
+                if (physicalConclusion == "Xue_Score")
+                {
+                    dic.Add("xyzZd", healthGuidance);
+                }
+            }
+            // 气郁质
+            var qiYuScoreValue = GetValue(examData, "Qiyu_Score");
+            if (!string.IsNullOrWhiteSpace(qiYuScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(qiYuScoreValue);
+                dic.Add("qyzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("qyzDf", score.Value.ToString());
+                if (physicalConclusion == "Qiyu_Score")
+                {
+                    dic.Add("qyzZd", healthGuidance);
+                }
+            }
+            // 特禀质
+            var teScoreValue = GetValue(examData, "Te_Score");
+            if (!string.IsNullOrWhiteSpace(teScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(teScoreValue);
+                dic.Add("tbzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("tbzDf", score.Value.ToString());
+                if (physicalConclusion == "Te_Score")
+                {
+                    dic.Add("tbzZd", healthGuidance);
+                }
+            }
+            // 平和质
+            var pingScoreValue = GetValue(examData, "Ping_Score");
+            if (!string.IsNullOrWhiteSpace(pingScoreValue))
+            {
+                var score = JsonConvert.DeserializeObject<ZYTZModel>(pingScoreValue);
+                dic.Add("phzSf", GetZYTZValue(score.Result).ToString());
+                dic.Add("phzDf", score.Value.ToString());
+                if (physicalConclusion == "Ping_Score")
+                {
+                    dic.Add("phzZd", healthGuidance);
+                }
+            }
+            dic.Add("cpjg", GetPhysicalConclusion(physicalConclusion));// 测评结果
+            dic.Add("entryCode", facturyInfo.FacturyUserCode);
+            dic.Add("entryName", facturyInfo.FacturyUserName);
+            dic.Add("entryTime", examTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            dic.Add("createCode", facturyInfo.FacturyUserCode);
+            dic.Add("createName", facturyInfo.FacturyUserName);
+            dic.Add("createTime", examTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            dic.Add("updateCode", facturyInfo.FacturyUserCode);
+            dic.Add("updateName", facturyInfo.FacturyUserName);
+            dic.Add("updateTime", examTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            dic.Add("updateOrganzationCode", facturyInfo.FacturyOrgCode);
+            dic.Add("updateOrganzationName", facturyInfo.FacturyOrgName);
+            return JsonConvert.SerializeObject(dic);
+        }
+
+        /// <summary>
+        /// 转换老年人自理能力评估结果
+        /// </summary>
+        /// <param name="examInfo"></param>
+        /// <param name="registerInfo"></param>
+        /// <param name="url"></param>
+        /// <returns></returns>
+        public string GetLNRPostContentAsync(RegisterPersonInfoDTO registerInfo, FacturyOrgModel facturyInfo, Dictionary<string, string> examData, DateTime examTime, out string url)
+        {
+            url = $"{_serverUrl}/api/phyoldassess";
+
+            var jingQiInfos = registerInfo.JingQiExamInfos;
+            var pyhId = GetValue(jingQiInfos, "pyhid");
+
+            var dic = new Dictionary<string, string>();
+            dic.Add("pyhid", pyhId);
+            dic.Add("personId", GetValue(jingQiInfos, "PatientID"));
+            dic.Add("no", GetValue(jingQiInfos, "NO"));
+            dic.Add("idNo", registerInfo.IDCardNo);
+
+            dic.Add("createCode", facturyInfo.FacturyUserCode);
+            dic.Add("createName", facturyInfo.FacturyUserName);
+            dic.Add("createOrganizationCode", facturyInfo.FacturyOrgCode);
+            dic.Add("createOrganizationName", facturyInfo.FacturyOrgName);
+            dic.Add("updateCode", facturyInfo.FacturyUserCode);
+            dic.Add("updateName", facturyInfo.FacturyUserName);
+            dic.Add("updateOrganizationCode", facturyInfo.FacturyOrgCode);
+            dic.Add("updateOrganizationName", facturyInfo.FacturyOrgName);
+
+            dic.Add("oldTotal", GetValue(examData, "SelfCareScore"));
+            dic.Add("assessType", GetAssessType(GetValue(examData, "SelfCareConclusion")));
+            dic.Add("assessTime", examTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            dic.Add("assessName", facturyInfo.FacturyUserName);
+            dic.Add("assessCode", facturyInfo.FacturyUserCode);
+            // 进餐
+            var oldEating = GetValue(examData, "qusition1");
+            dic.Add("oldEating", oldEating);
+            dic.Add("oldEatingType", oldEating == "0" ? "1" : oldEating == "3" ? "3" : oldEating == "5" ? "4" : "1");
+            // 梳洗
+            var oldWash = GetValue(examData, "qusition2");
+            dic.Add("oldWash", oldWash);
+            dic.Add("oldWashType", oldWash == "0" ? "1" : oldWash == "1" ? "2" : oldWash == "3" ? "3" : oldWash == "7" ? "4" : "1");
+            // 穿衣
+            var oldDress = GetValue(examData, "qusition3");
+            dic.Add("oldDress", oldDress);
+            dic.Add("oldDressType", oldDress == "0" ? "1" : oldDress == "3" ? "3" : oldDress == "5" ? "4" : "1");
+            // 如厕
+            var oldToilet = GetValue(examData, "qusition4");
+            dic.Add("oldToilet", oldToilet);
+            dic.Add("oldToiletType", oldToilet == "0" ? "1" : oldToilet == "1" ? "2" : oldToilet == "5" ? "3" : oldToilet == "10" ? "4" : "1");
+            // 活动
+            var oldActivity = GetValue(examData, "qusition5");
+            dic.Add("oldActivity", oldActivity);
+            dic.Add("oldActivityType", oldActivity == "0" ? "1" : oldActivity == "1" ? "2" : oldActivity == "5" ? "3" : oldActivity == "10" ? "4" : "1");
+
+            return JsonConvert.SerializeObject(dic);
+        }
+
+        /// <summary>
+        /// 转换心电报告
+        /// </summary>
+        /// <param name="examInfo"></param>
+        /// <param name="registerInfo"></param>
+        /// <param name="url"></param>
+        /// <returns></returns>
+        public string GetEcgReportPostContentAsync(RegisterPersonInfoDTO registerInfo, FacturyOrgModel facturyInfo, WingInterfaceLibrary.DTO.Report.ReportDTO reportInfo, out string url)
+        {
+            url = $"{_serverUrl}/api/ecginf";
+
+            var jingQiInfos = registerInfo.JingQiExamInfos;
+            var pyhId = GetValue(jingQiInfos, "pyhid");
+
+            var dic = new Dictionary<string, string>();
+            dic.Add("pyhid", pyhId);
+
+            var reportVaules = reportInfo.ReportDatasJson;
+
+            dic.Add("barcode", reportInfo.ReportCode);
+            dic.Add("chkdoctor", "");// 检验医生
+            dic.Add("exchkdoctor", "");// 审核医生
+            dic.Add("repdt", reportInfo.CreateTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            dic.Add("exdt", reportInfo.UpdateTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            // 检验医生
+            dic.Add("chkdoctorbasesign", DownloadFileAsync(GetReportElementValue(reportVaules, "DigitalSignature")).Result);
+            // 审核医生
+            dic.Add("exdoctorbasesign", DownloadFileAsync(GetReportElementValue(reportVaules, "ReportPhysician")).Result);
+            dic.Add("diagnosis", GetReportElementValue(reportVaules, "PatientEcgDiagnosticResult"));
+            dic.Add("result", reportInfo.HealthDiagnosis == 1 ? "正常" : "异常");
+            var imageList = GetReportElementArray(reportVaules, "PatientECGImage");
+            if (imageList.Count >= 1)
+            {
+                dic.Add("pic1base64", DownloadFileAsync(imageList[0]).Result);
+            }
+            else
+            {
+                dic.Add("pic1base64", "");
+            }
+
+            return JsonConvert.SerializeObject(dic);
+        }
+
+        /// <summary>
+        /// 转换超声报告
+        /// </summary>
+        /// <param name="examInfo"></param>
+        /// <param name="registerInfo"></param>
+        /// <param name="url"></param>
+        /// <returns></returns>
+        public string GetUSReportPostContentAsync(RegisterPersonInfoDTO registerInfo, FacturyOrgModel facturyInfo, WingInterfaceLibrary.DTO.Report.ReportDTO reportInfo, out string url)
+        {
+            url = $"{_serverUrl}/api/ultinf";
+
+            var jingQiInfos = registerInfo.JingQiExamInfos;
+            var pyhId = GetValue(jingQiInfos, "pyhid");
+
+            var dic = new Dictionary<string, string>();
+            dic.Add("pyhid", pyhId);
+
+            var reportVaules = reportInfo.ReportDatasJson;
+
+            dic.Add("barcode", reportInfo.ReportCode);
+            dic.Add("chkdoctor", GetReportElementValue(reportVaules, "InspectionPhysician"));
+            dic.Add("exchkdoctor", GetReportElementValue(reportVaules, "ReportPhysician"));
+            dic.Add("repdt", reportInfo.CreateTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            dic.Add("exdt", reportInfo.UpdateTime.ToLocalTime().ToString("yyyy-MM-dd"));
+            // 检验医生
+            dic.Add("chkdoctorbasesign", DownloadFileAsync(GetReportElementValue(reportVaules, "DigitalSignature")).Result);
+            // 审核医生
+            // dic.Add("exdoctorbasesign", DownloadFileAsync(GetReportElementValue(reportVaules, "ReportPhysician")).Result);
+            dic.Add("describe", GetReportElementValue(reportVaules, "ReportDescription"));
+
+            var reportSummary = GetReportElementValue(reportVaules, "ReportSummary");
+            dic.Add("diagnosis", reportSummary);
+            var health = false;
+            // 超声结论里关键字匹配
+            foreach (var item in _jingQiHealthKeywords)
+            {
+                if (reportSummary.Contains(item))
+                {
+                    health = true;
+                    break;
+                }
+            }
+            dic.Add("result", health ? "正常" : "异常");
+
+            var imageList = GetReportElementArray(reportVaules, "ReportImages");
+            if (imageList.Count >= 1)
+            {
+                dic.Add("pic1base64", DownloadFileAsync(imageList[0]).Result);
+            }
+            else
+            {
+                dic.Add("pic1base64", "");
+            }
+            if (imageList.Count >= 2)
+            {
+                dic.Add("pic2base64", DownloadFileAsync(imageList[1]).Result);
+            }
+            else
+            {
+                dic.Add("pic2base64", "");
+            }
+
+            return JsonConvert.SerializeObject(dic);
+        }
+
+        private string GetValue(Dictionary<string, string> dic, string key)
+        {
+            foreach (var k in dic.Keys)
+            {
+                if (k.ToLower() == key.ToLower())
+                {
+                    var value = dic[k];
+                    return string.IsNullOrWhiteSpace(value) ? "" : value;
+                }
+            }
+            return "";
+        }
+
+        private int GetInt(Dictionary<string, string> dic, string key)
+        {
+            var val = GetValue(dic, key);
+            if (int.TryParse(val, out int res))
+            {
+                return res;
+            }
+            return 0;
+        }
+
+        private int GetZYTZValue(string result)
+        {
+            return result == "是" ? 1 : result == "倾向是" ? 3 : 0;
+        }
+
+        private string GetHealthGuidance(string result)
+        {
+            try
+            {
+                var guidanceInfos = JsonConvert.DeserializeObject<List<string>>(result);
+                return string.Join(";", guidanceInfos);
+            }
+            catch (Exception ex)
+            {
+
+            }
+            return string.Empty;
+        }
+
+        private string GetPhysicalConclusion(string physicalConclusion)
+        {
+            switch (physicalConclusion)
+            {
+                case "Qi_Score":
+                    return "02";
+                case "Yang_Score":
+                    return "03";
+                case "Yin_Score":
+                    return "04";
+                case "Tan_Score":
+                    return "05";
+                case "Shi_Score":
+                    return "06";
+                case "Xue_Score":
+                    return "07";
+                case "Qiyu_Score":
+                    return "082";
+                case "Te_Score":
+                    return "09";
+                case "Ping_Score":
+                    return "01";
+                default:
+                    return "";
+            }
+        }
+
+        private string GetAssessType(string selfCareConclusion)
+        {
+            switch (selfCareConclusion)
+            {
+                case "可自理":
+                    return "1";
+                case "轻度依赖":
+                    return "2";
+                case "中度依赖":
+                    return "3";
+                case "不能自理":
+                    return "4";
+                default:
+                    return "";
+            }
+        }
+
+        private string GetReportElementValue(string reportElementValues, string name)
+        {
+            try
+            {
+                var list = JsonConvert.DeserializeObject<List<ReportElementStringDTO>>(reportElementValues);
+                return list.FirstOrDefault(x => x.Name == name)?.Value?.ToString() ?? string.Empty;
+            }
+            catch (Exception ex)
+            {
+                return string.Empty;
+            }
+        }
+
+        private List<string> GetReportElementArray(string reportElementValues, string name)
+        {
+            try
+            {
+                var list = JsonConvert.DeserializeObject<List<ReportElementArrayDTO>>(reportElementValues);
+                var result = list.FirstOrDefault(x => x.Name == name)?.Value;
+                if (result != null && result is List<string> array)
+                {
+                    return array?.ToList() ?? new List<string>();
+                }
+                return new List<string>();
+            }
+            catch (Exception ex)
+            {
+                return new List<string>();
+            }
+        }
+
         private async Task<JingQiResult<TResult>> GetJingQiResult<TResult>(string url, string request, Dictionary<string, string> headers, string idCardNo)
         {
             try
@@ -92,6 +581,23 @@ namespace VitalService.Factury
 
     }
 
+    public class FacturyOrgModel
+    {
+        public string Token { get; set; }
+        public string UserCode { get; set; }
+        public string FacturyOrgCode { get; set; }
+        public string FacturyUserCode { get; set; }
+        public string FacturyOrgName { get; set; }
+        public string FacturyUserName { get; set; }
+        public Dictionary<string, string> FacturyData { get; set; }
+    }
+
+    public class ZYTZModel
+    {
+        public int Value { get; set; }
+        public string Result { get; set; }
+    }
+
     public class JingQiResult<TResult>
     {
         public string status { get; set; }

+ 6 - 2
src/VitalMixtureService/FrontService/Service/BaseService.cs

@@ -76,10 +76,12 @@ namespace VitalService.Service
         private IVitalOrganizationDBService _vitalOrganizationDBService;
         private IVitalFacturyUserDBService _vitalFacturyUserDBService;
         private IVitalFacturyPostHistoryDBService _vitalFacturyPostHistoryDBService;
+        private IRecordsInfoDBService _recordsInfoDBService;
         private PigeonUpload _pigeonUpload;
         private List<string> _appsettingCrowdLabels = new List<string>();
         private JingQiApiHelper _jingQiApiHelper;
         private FacturyManage _facturyManage;
+        private IReportDBService _wingReportDBService;
         /// <summary>
         /// Init service
         /// </summary>
@@ -134,6 +136,8 @@ namespace VitalService.Service
             _vitalFacturyUserDBService = GetProxy<IVitalFacturyUserDBService>();
             _vitalFacturyPostHistoryDBService = GetProxy<IVitalFacturyPostHistoryDBService>();
             _prescriptionDBService = GetProxy<IVitalPrescriptionDBService>();
+            _wingReportDBService = GetProxy<IReportDBService>();
+            _recordsInfoDBService = GetProxy<IRecordsInfoDBService>();
             AnalyzeStrategy.StorageHandler = UploadData;
             StartApi();
             LoadResourceInfos();
@@ -154,9 +158,9 @@ namespace VitalService.Service
                 var jingQiServerUrl = EnvironmentConfigManager.GetParammeter<StringParameter>("Vital", "JingQiServerUrl").Value;
                 if (!string.IsNullOrWhiteSpace(jingQiServerUrl))
                 {
-                    _jingQiApiHelper = new JingQiApiHelper(jingQiServerUrl);
+                    _jingQiApiHelper = new JingQiApiHelper(jingQiServerUrl, OnGetFacturyOrgInfo);
                 }
-                _facturyManage = new FacturyManage(OnUpdateHistoryStatus, OnGetNonPostHistory);
+                _facturyManage = new FacturyManage(OnGetFacturyPostHistory, OnUpdateHistoryStatus, OnGetNonPostHistory);
             }
             catch (Exception ex)
             {

+ 18 - 3
src/VitalMixtureService/FrontService/Service/ExamService.cs

@@ -66,6 +66,21 @@ namespace VitalService.Service
             Logger.WriteLineInfo($"CreateExamAsync Mix Start, request: {JsonConvert.SerializeObject(request)}");
             if (!string.IsNullOrWhiteSpace(result) && !string.IsNullOrWhiteSpace(request.PhysicalExamNumber))
             {
+                try
+                {
+                    await CreateJingQiExamPostHistoryAsync(new CreateJingQiExamPostHistoryRequest
+                    {
+                        Token = request.Token,
+                        ExamKey = dbRequest.Key,
+                        PhysicalExamNumber = dbRequest.PhysicalExamNumber,
+                        ExamData = JsonConvert.DeserializeObject<Dictionary<string, string>>(request.ExamData),
+                        ExamTime = DateTime.UtcNow,
+                    });
+                }
+                catch (Exception ex)
+                {
+                    Logger.WriteLineWarn($"IVitalExamService CreateExamAsync CreateJingQiExamPostHistoryAsync error, ex:{ex}");
+                }
                 try
                 {
                     //更新登记信息
@@ -122,7 +137,7 @@ namespace VitalService.Service
                         }
                     }
                     if (request.Key == "HEIECG")
-                    { 
+                    {
                         if (!request.IsRemoteEcgExam)//如果是体检系统生成的。走这边,远程心电的不处理,不走这边
                         {
                             var userInfo = await _userDBService.GetUserDetailAsync(new GetUserDBRequest
@@ -134,8 +149,8 @@ namespace VitalService.Service
                             record.ExamData = request.ExamData;
                             record.ExamDoctor = userCode;
                             record.ExamState = ExamStateEnum.Inspected;
-                            record.DeviceCode =userInfo.EcgCode;//心电code                       
-                       
+                            record.DeviceCode = userInfo.EcgCode;//心电code                       
+
                             _vitalElectrocardiogramDBService.UpdateExamElectrocardiogramDBAsync(record);
                         }
                     }

+ 144 - 2
src/VitalMixtureService/FrontService/Service/FacturyPostHistoryService.cs

@@ -5,6 +5,7 @@ using WingInterfaceLibrary.Request.DBVitalRequest;
 using WingInterfaceLibrary.DTO.Vital;
 using WingInterfaceLibrary.Request;
 using WingServerCommon.Log;
+using WingInterfaceLibrary.Enum;
 
 namespace VitalService.Service
 {
@@ -49,6 +50,15 @@ namespace VitalService.Service
             return await _vitalFacturyPostHistoryDBService.GetFacturyPostHistoryDBAsync(dbRequest);
         }
 
+        private FacturyPostHistoryDTO OnGetFacturyPostHistory(string code)
+        {
+            var dbRequest = new GetFacturyPostHistoryDBRequest
+            {
+                Code = code,
+            };
+            return _vitalFacturyPostHistoryDBService.GetFacturyPostHistoryDBAsync(dbRequest).Result;
+        }
+
         /// <summary>
         /// 分页获取厂商推送记录
         /// </summary>
@@ -102,13 +112,145 @@ namespace VitalService.Service
                     Result = "",
                     Status = 1,
                 });
-                history = await _vitalFacturyPostHistoryDBService.GetFacturyPostHistoryDBAsync(new GetFacturyPostHistoryDBRequest { Code = history.Code });
-                _facturyManage.Add(history);
+                _facturyManage.Add(history.Code);
                 return true;
             }
             return false;
         }
 
+        /// <summary>
+        /// 晶奇数据推送 中医体质、老年人自理能力评估
+        /// </summary>
+        /// <returns></returns>
+        public async Task<bool> CreateJingQiExamPostHistoryAsync(CreateJingQiExamPostHistoryRequest request)
+        {
+            var token = request.Token;
+            var physicalExamNumber = request.PhysicalExamNumber;
+            var examKey = request.ExamKey;
+            var examData = request.ExamData;
+            var examTime = request.ExamTime;
+
+            if (_jingQiApiHelper != null)
+            {
+                var facturyInfo = _jingQiApiHelper.GetFacturyInfo(token);
+                if (facturyInfo != null)
+                {
+                    if (!string.IsNullOrWhiteSpace(physicalExamNumber) && examData != null && examData.Any())
+                    {
+                        var registerInfo = await _registerInfoDBService.GetRegisterPersonInfoByPhysicalExamNumberDBAsync(new GetRegisterPersonRequest
+                        {
+                            PhysicalExamNumber = physicalExamNumber,
+                        });
+                        if (registerInfo.JingQiExamInfos != null && registerInfo.JingQiExamInfos.Any())
+                        {
+                            var xyUrl = string.Empty;
+                            var rpcContent = string.Empty;
+                            if (examKey == "HEITCMC")
+                            {
+                                rpcContent = _jingQiApiHelper.GetZYPostContentAsync(registerInfo, facturyInfo, examData, examTime, out xyUrl);
+                            }
+                            else if (examKey == "LNRZLNLPG")
+                            {
+                                rpcContent = _jingQiApiHelper.GetLNRPostContentAsync(registerInfo, facturyInfo, examData, examTime, out xyUrl);
+                            }
+                            if (!string.IsNullOrWhiteSpace(rpcContent))
+                            {
+                                var postHistoryCode = await _vitalFacturyPostHistoryDBService.CreateFacturyPostHistoryDBAsync(new CreateFacturyPostHistoryDBRequest
+                                {
+                                    // FacturyUniqueCode = request.FacturyUniqueCode,
+                                    ApiType = examKey,
+                                    FacturyUrl = xyUrl,
+                                    IDCardNo = registerInfo.IDCardNo,
+                                    PatientName = registerInfo.Name,
+                                    Status = 1,
+                                    Headers = facturyInfo.FacturyData,
+                                    Content = rpcContent,
+                                    Result = string.Empty,
+                                });
+                                _facturyManage.Add(postHistoryCode);
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 晶奇数据推送 超声、心电报告
+        /// </summary>
+        /// <returns></returns>
+        public async Task<bool> CreateJingQiReportPostHistoryAsync(CreateJingQiReportPostHistoryRequest request)
+        {
+            var token = request.Token;
+            var reportCode = request.ReportCode;
+
+            if (_jingQiApiHelper != null)
+            {
+                var facturyInfo = _jingQiApiHelper.GetFacturyInfo(token);
+                if (facturyInfo != null)
+                {
+                    var reportInfo = await _wingReportDBService.GetReportByCodeAsync(new WingInterfaceLibrary.DB.Request.GetReportByCodeDBRequest
+                    {
+                        ReportCode = reportCode,
+                    });
+                    if (reportInfo == null)
+                    {
+                        return false;
+                    }
+                    var physicalExamNumber = string.Empty;
+                    if (reportInfo.ReportType == ReportTypeEnum.RemoteECG)
+                    {
+                        var recordInfo = await _vitalElectrocardiogramDBService.GetExamElectrocardiogramDBAsync(reportInfo.RecordCode);
+                        physicalExamNumber = recordInfo?.PhysicalExamNumber;
+                    }
+                    else if (reportInfo.ReportType == ReportTypeEnum.RemoteDiagnosis)
+                    {
+                        var recordInfo = await _recordsInfoDBService.FindRecordInfoByCodeAsync(reportInfo.RecordCode);
+                        physicalExamNumber = recordInfo?.DevicePatientID;
+                    }
+                    if (!string.IsNullOrWhiteSpace(physicalExamNumber))
+                    {
+                        var registerInfo = await _registerInfoDBService.GetRegisterPersonInfoByPhysicalExamNumberDBAsync(new GetRegisterPersonRequest
+                        {
+                            PhysicalExamNumber = physicalExamNumber,
+                        });
+                        if (registerInfo.JingQiExamInfos != null && registerInfo.JingQiExamInfos.Any())
+                        {
+                            var xyUrl = string.Empty;
+                            var rpcContent = string.Empty;
+                            if (reportInfo.ReportType == ReportTypeEnum.RemoteECG)
+                            {
+                                rpcContent = _jingQiApiHelper.GetEcgReportPostContentAsync(registerInfo, facturyInfo, reportInfo, out xyUrl);
+                            }
+                            else if (reportInfo.ReportType == ReportTypeEnum.RemoteDiagnosis)
+                            {
+                                rpcContent = _jingQiApiHelper.GetUSReportPostContentAsync(registerInfo, facturyInfo, reportInfo, out xyUrl);
+                            }
+                            if (!string.IsNullOrWhiteSpace(rpcContent))
+                            {
+                                await _vitalFacturyPostHistoryDBService.CreateFacturyPostHistoryDBAsync(new CreateFacturyPostHistoryDBRequest
+                                {
+                                    // FacturyUniqueCode = request.FacturyUniqueCode,
+                                    ApiType = reportInfo.ReportType.ToString(),
+                                    FacturyUrl = xyUrl,
+                                    IDCardNo = registerInfo.IDCardNo,
+                                    PatientName = registerInfo.Name,
+                                    Status = 1,
+                                    Headers = facturyInfo.FacturyData,
+                                    Content = rpcContent,
+                                    Result = string.Empty,
+                                });
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+            return false;
+        }
+
         private void OnUpdateHistoryStatus(string code, bool success, DateTime postTime, string rpcResult)
         {
             try

+ 96 - 100
src/VitalMixtureService/FrontService/Service/FacturyUserService.cs

@@ -6,6 +6,7 @@ using WingInterfaceLibrary.DTO.Vital;
 using WingInterfaceLibrary.Request;
 using WingInterfaceLibrary.Enum;
 using Newtonsoft.Json;
+using VitalService.Factury;
 
 namespace VitalService.Service
 {
@@ -137,74 +138,53 @@ namespace VitalService.Service
         /// <returns></returns>
         public async Task<FacturyExamRegisterResult> FacturyExamRegisterAsync(FacturyExamRegisterRequest request)
         {
-            var userCode = await GetClientIdByTokenAsync(request.Token);
-            var userInfo = await _userDBService.GetUserDetailAsync(new GetUserDBRequest
-            {
-                Code = userCode,
-            });
-            if (userInfo == null || string.IsNullOrWhiteSpace(userInfo.FacturyUserCode) || _jingQiApiHelper == null)
+            if (_jingQiApiHelper == null)
             {
                 // 不推送晶奇系统
                 ThrowRpcException((int)CustomerRpcCode.JingQiNotRequired, "JingQiNotRequired", "");
             }
-            else
+            var facturyInfo = _jingQiApiHelper.GetFacturyInfo(request.Token);
+            if (facturyInfo == null)
             {
-                var facturyUser = await _vitalFacturyUserDBService.GetFacturyUserDBAsync(new GetFacturyUserDBRequest
-                {
-                    Code = userInfo.FacturyUserCode,
-                });
-                var facturyOrg = await _vitalFacturyUserDBService.GetFacturyUserDBAsync(new GetFacturyUserDBRequest
-                {
-                    Code = facturyUser.FatherCode,
-                });
-                if (facturyUser == null || string.IsNullOrWhiteSpace(facturyUser.FacturyCode)
-                    || facturyOrg == null || string.IsNullOrWhiteSpace(facturyOrg.FacturyCode))
-                {
-                    // 不推送晶奇系统
-                    ThrowRpcException((int)CustomerRpcCode.JingQiNotRequired, "JingQiNotRequired", "");
-                }
-                else
-                {
-                    var jingQiReq = new Factury.JingQiExamRegisterRequest
-                    {
-                        identity = request.Identity,
-                        orgcode = facturyOrg.FacturyCode,
-                        usrcode = facturyUser.FacturyCode,
-                        phydatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
-                    };
-                    var jingQiRes = await _jingQiApiHelper.ExamRegisterAsync(jingQiReq, facturyOrg.FacturyData, request.Identity);
-                    await _vitalFacturyPostHistoryDBService.CreateFacturyPostHistoryDBAsync(new CreateFacturyPostHistoryDBRequest
-                    {
-                        ApiType = "ExamRegisterAsync",
-                        FacturyUrl = _jingQiApiHelper.RegisterUrl,
-                        IDCardNo = request.Identity,
-                        PatientName = request.PatientName,
-                        Status = jingQiRes.status == "0" ? 2 : 3,
-                        PostTime = DateTime.UtcNow,
-                        Headers = facturyOrg.FacturyData,
-                        Content = JsonConvert.SerializeObject(jingQiReq),
-                        Result = JsonConvert.SerializeObject(jingQiRes),
-                    });
-                    return new FacturyExamRegisterResult
-                    {
-                        Status = jingQiRes.status,
-                        ErroMsg = jingQiRes.ErroMsg,
-                        PhyId = jingQiRes.data?.phyid,
-                        PatName = jingQiRes.data?.PATNAME,
-                        Gender = jingQiRes.data?.GRENDER,
-                        PatAge = jingQiRes.data?.PATAGE,
-                        Phone = jingQiRes.data?.PHONE,
-                        OrgName = jingQiRes.data?.ORGNAME,
-                        Address = jingQiRes.data?.adress,
-                        LisClu = jingQiRes.data?.lisclu,
-                        PhyDate = jingQiRes.data?.PHYDATE,
-                        PatientID = jingQiRes.data?.PatientID,
-                        No = jingQiRes.data?.NO,
-                    };
-                }
-
+                // 不推送晶奇系统
+                ThrowRpcException((int)CustomerRpcCode.JingQiNotRequired, "JingQiNotRequired", "");
             }
-            return null;
+            var jingQiReq = new JingQiExamRegisterRequest
+            {
+                identity = request.Identity,
+                orgcode = facturyInfo.FacturyOrgCode,
+                usrcode = facturyInfo.FacturyUserCode,
+                phydatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+            };
+            var jingQiRes = await _jingQiApiHelper.ExamRegisterAsync(jingQiReq, facturyInfo.FacturyData, request.Identity);
+            await _vitalFacturyPostHistoryDBService.CreateFacturyPostHistoryDBAsync(new CreateFacturyPostHistoryDBRequest
+            {
+                ApiType = "ExamRegisterAsync",
+                FacturyUrl = _jingQiApiHelper.RegisterUrl,
+                IDCardNo = request.Identity,
+                PatientName = request.PatientName,
+                Status = jingQiRes.status == "0" ? 2 : 3,
+                PostTime = DateTime.UtcNow,
+                Headers = facturyInfo.FacturyData,
+                Content = JsonConvert.SerializeObject(jingQiReq),
+                Result = JsonConvert.SerializeObject(jingQiRes),
+            });
+            return new FacturyExamRegisterResult
+            {
+                Status = jingQiRes.status,
+                ErroMsg = jingQiRes.ErroMsg,
+                PhyId = jingQiRes.data?.phyid,
+                PatName = jingQiRes.data?.PATNAME,
+                Gender = jingQiRes.data?.GRENDER,
+                PatAge = jingQiRes.data?.PATAGE,
+                Phone = jingQiRes.data?.PHONE,
+                OrgName = jingQiRes.data?.ORGNAME,
+                Address = jingQiRes.data?.adress,
+                LisClu = jingQiRes.data?.lisclu,
+                PhyDate = jingQiRes.data?.PHYDATE,
+                PatientID = jingQiRes.data?.PatientID,
+                No = jingQiRes.data?.NO,
+            };
         }
 
         /// <summary>
@@ -214,60 +194,76 @@ namespace VitalService.Service
         /// <returns></returns>
         public async Task<FacturyExamDeleteResult> FacturyExamDeleteAsync(FacturyExamDeleteRequest request)
         {
-            var userCode = await GetClientIdByTokenAsync(request.Token);
-            var userInfo = await _userDBService.GetUserDetailAsync(new GetUserDBRequest
+            if (_jingQiApiHelper == null)
             {
-                Code = userCode,
-            });
-            if (userInfo == null || string.IsNullOrWhiteSpace(userInfo.FacturyUserCode) || _jingQiApiHelper == null)
+                // 不推送晶奇系统
+                ThrowRpcException((int)CustomerRpcCode.JingQiNotRequired, "JingQiNotRequired", "");
+            }
+            var facturyInfo = _jingQiApiHelper.GetFacturyInfo(request.Token);
+            if (facturyInfo == null)
             {
                 // 不推送晶奇系统
                 ThrowRpcException((int)CustomerRpcCode.JingQiNotRequired, "JingQiNotRequired", "");
             }
-            else
+            var jingQiReq = new JingQiExamDeleteRequest
             {
-                var facturyUser = await _vitalFacturyUserDBService.GetFacturyUserDBAsync(new GetFacturyUserDBRequest
+                phyid = request.PhyId,
+            };
+            var jingQiRes = await _jingQiApiHelper.ExamDeleteAsync(jingQiReq, facturyInfo.FacturyData, request.Identity);
+            await _vitalFacturyPostHistoryDBService.CreateFacturyPostHistoryDBAsync(new CreateFacturyPostHistoryDBRequest
+            {
+                ApiType = "ExamDeleteAsync",
+                FacturyUrl = _jingQiApiHelper.DeleteRegisterUrl,
+                IDCardNo = request.Identity,
+                PatientName = request.PatientName,
+                Status = jingQiRes.status == "0" ? 2 : 3,
+                PostTime = DateTime.UtcNow,
+                Headers = facturyInfo.FacturyData,
+                Content = JsonConvert.SerializeObject(jingQiReq),
+                Result = JsonConvert.SerializeObject(jingQiRes),
+            });
+            return new FacturyExamDeleteResult
+            {
+                Status = jingQiRes.status,
+                ErroMsg = jingQiRes.ErroMsg,
+            };
+        }
+
+        private FacturyOrgModel OnGetFacturyOrgInfo(string token)
+        {
+            var userCode = GetClientIdByTokenAsync(token).Result;
+            var userInfo = _userDBService.GetUserDetailAsync(new GetUserDBRequest
+            {
+                Code = userCode,
+            }).Result;
+            if (userInfo != null && !string.IsNullOrWhiteSpace(userInfo.FacturyUserCode) && _jingQiApiHelper != null)
+            {
+                var facturyUser = _vitalFacturyUserDBService.GetFacturyUserDBAsync(new GetFacturyUserDBRequest
                 {
                     Code = userInfo.FacturyUserCode,
-                });
-                var facturyOrg = await _vitalFacturyUserDBService.GetFacturyUserDBAsync(new GetFacturyUserDBRequest
+                }).Result;
+                var facturyOrg = _vitalFacturyUserDBService.GetFacturyUserDBAsync(new GetFacturyUserDBRequest
                 {
                     Code = facturyUser.FatherCode,
-                });
-                if (facturyUser == null || string.IsNullOrWhiteSpace(facturyUser.FacturyCode)
-                    || facturyOrg == null || string.IsNullOrWhiteSpace(facturyOrg.FacturyCode))
-                {
-                    // 不推送晶奇系统
-                    ThrowRpcException((int)CustomerRpcCode.JingQiNotRequired, "JingQiNotRequired", "");
-                }
-                else
+                }).Result;
+                if (facturyUser != null && !string.IsNullOrWhiteSpace(facturyUser.FacturyCode)
+                    && facturyOrg != null && !string.IsNullOrWhiteSpace(facturyOrg.FacturyCode))
                 {
-                    var jingQiReq = new Factury.JingQiExamDeleteRequest
+                    return new FacturyOrgModel
                     {
-                        phyid = request.PhyId,
-                    };
-                    var jingQiRes = await _jingQiApiHelper.ExamDeleteAsync(jingQiReq, facturyOrg.FacturyData, request.Identity);
-                    await _vitalFacturyPostHistoryDBService.CreateFacturyPostHistoryDBAsync(new CreateFacturyPostHistoryDBRequest
-                    {
-                        ApiType = "ExamDeleteAsync",
-                        FacturyUrl = _jingQiApiHelper.DeleteRegisterUrl,
-                        IDCardNo = request.Identity,
-                        PatientName = request.PatientName,
-                        Status = jingQiRes.status == "0" ? 2 : 3,
-                        PostTime = DateTime.UtcNow,
-                        Headers = facturyOrg.FacturyData,
-                        Content = JsonConvert.SerializeObject(jingQiReq),
-                        Result = JsonConvert.SerializeObject(jingQiRes),
-                    });
-                    return new FacturyExamDeleteResult
-                    {
-                        Status = jingQiRes.status,
-                        ErroMsg = jingQiRes.ErroMsg,
+                        Token = token,
+                        UserCode = userCode,
+                        FacturyOrgCode = facturyOrg.FacturyCode,
+                        FacturyUserCode = facturyUser.FacturyCode,
+                        FacturyOrgName = facturyOrg.FacturyName,
+                        FacturyUserName = facturyUser.FacturyName,
+                        FacturyData = facturyOrg.FacturyData,
                     };
                 }
-
             }
             return null;
         }
+
+
     }
 }

+ 4 - 0
src/VitalMixtureService/FrontService/Service/UserService.cs

@@ -71,6 +71,10 @@ namespace VitalService.Service
             {
                 result.IsExistSubordinate = true;
             }
+            if (_jingQiApiHelper == null)
+            {
+                result.FacturyUserCode = string.Empty;
+            }
             return result;
 
         }

+ 2 - 1
src/appsettings.json

@@ -216,7 +216,8 @@
     "DoctorStatisticsSetting":"230382",
     "DoctorStatisticsSeconds" : 600,
     "IsNeedImageReport": true,
-    "JingQiServerUrl": ""
+    "JingQiServerUrl": "",
+    "JingQiHealthKeywords": ""
   },
   "HealthExamBooking":{
     "GroupExamWebUrl": "http://127.0.0.1:8408/#/groupExam?code={0}",