Chr☆s Kwok 的技术笔记

.NET, C#, WPF, WCF, WF, .NetCore & LINQ ... I know how it works because I know why it works ...

博客园 首页 新随笔 订阅 管理

ChronicDiseaseManagementHelper.PostHttp(Log log, string url, string data, string methodName)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml.Serialization;
using JetSun.DomainModel;
using JetSun.Infrastructure;

namespace JetSun.PatientAdministration.Presentation
{
    public class ChronicDiseaseManagementHelper
    {
        public static ChronicDiseaseManagementHelper Instance = new ChronicDiseaseManagementHelper();
        string _baseUri = ChronicDiseaseManagementParameter.BaseURL;
        string _userId = ChronicDiseaseManagementParameter.UserId;
        string _password = ChronicDiseaseManagementParameter.Password;

        /// <summary>
        /// 推送患者到慢病管理
        /// </summary>
        /// <param name="entity"></param>
        public void addPatient(CDMResult entity)
        {
            bool ret = this.checkInNCD(entity) != ChronicRecordStatuEnum.NOT_CREATED;
            if (ret) return;

            string msg = null;
            Specialist[] list = this.findSpecialist(entity, msg);
            if (list.Count() == 0)
            {
                MessageHelper.ShowDialog($"患者【{entity.Patientname}】没有符合条件的病种列表", "提示");
                return;
            }
            SpecialistView view = new SpecialistView();
            view.ShowView(entity, list);

            if (view.Specialist != null)
                ChronicDiseaseManagementHelper.Instance.addPatient(entity, view.Specialist);
        }

        /// <summary>
        /// 3.11.3.1查询此病人是否已在慢病建档
        /// </summary>
        /// <returns></returns>
        public ChronicRecordStatuEnum checkInNCD(CDMResult entity)
        {
            using (var log = Log.Create("checkInNCD"))
            {
                try
                {
                    string url = _baseUri + "/checkInNCD";

                    string request = @"<Request>"
                                         + @"<EmpiId>" + entity.PersonId + "</EmpiId>"
                                            + @"<PatientId>" + entity.EncounterId + "</PatientId>"
                                            + @"<Type>" + entity.Encounterkindcodeid + "</Type>"
                                            + @"<PatientName>" + entity.Patientname + "</PatientName>"
                                           + @"<PatientCardId>" + entity.IdCard + "</PatientCardId>"
                                           + @"<UserId>" + _userId + "</UserId>"
                                           + @"<Password>" + _password + "</Password>"
                                          + @"<ClientIp>" + ClientContext.Instance.IPAddress + "</ClientIp>"
                                        + @"</Request>";
                    log.Write($"入参:{request}");
                    string ret = PostHttp(log, url, request, "checkInNCD");
                    log.Write($"出参:{ret}");
                    if (!ret.IsNullOrWhiteSpace())
                    {
                        Response responseObj = ParseXmlToObject(ret);
                        //返回大于0表示已存在慢病系统中,结束本次推送
                        if (responseObj.IsSuccess)
                        {
                            if (responseObj.Result == 1)
                                return ChronicRecordStatuEnum.CREATED;
                            else if (responseObj.Result == 2)
                                return ChronicRecordStatuEnum.REQUIRED_CHECKED;
                            else
                                return ChronicRecordStatuEnum.NOT_CREATED;
                        }
                    }
                }
                catch (Exception ex)
                {
                    log.Write("慢病管理报错:" + ex.Message);
                    throw ex;
                }
            }
            return ChronicRecordStatuEnum.NOT_CREATED;
        }
        /// <summary>
        /// 3.11.3.3获取病人符合的专科列表
        /// </summary>
        /// <returns></returns>
        Specialist[] findSpecialist(CDMResult entity, string msg)
        {
            msg = null;
            using (var log = Log.Create("findSpecialist"))
            {
                try
                {
                    string url = _baseUri + "/findSpecialist";

                    string request = @"<Request>"
                                        + @"<UserId>" + _userId + "</UserId>"
                                        + @"<Password>" + _password + "</Password>"
                                        + @"<ClientIp>" + ClientContext.Instance.IPAddress + "</ClientIp>"
                                        + @"<Patient>"
                                            + @"<EmpiId>" + entity.PersonId + "</EmpiId>"
                                            + @"<PatientId>" + entity.EncounterId + "</PatientId>"
                                            + @"<PatientName>" + entity.Patientname + "</PatientName>"
                                            + @"<Type>" + entity.Encounterkindcodeid + "</Type>"
                                            + @"<PatientName>" + entity.Patientname + "</PatientName>"
                                            + @"<PatientCardId>" + entity.IdCard + "</PatientCardId>"
                                       + @" </Patient>"
                                       + @"<Diagnosises>";

                    if (!entity.Icdcodes.IsNullOrWhiteSpace())
                    {
                        int orderNo = 0;
                        foreach (var item in entity.Icdcodes.Split(',').Take(3))
                        {
                            request = request
                               + @"<Diagnosis>"
                               + @"<DiagnosisOrderNo>" + orderNo + 1 + "</DiagnosisOrderNo>"
                               + @"<DiagnosisICD>" + item + "</DiagnosisICD>"
                               + @"<DiagnosisName>" + entity.Diseasenames.Split(',')[orderNo] + "</DiagnosisName>"
                               + @"</Diagnosis>";
                            orderNo++;
                        }
                    }
                    request = request + "</Diagnosises></Request>";

                    log.Write($"入参:{request}");
                    string ret = PostHttp(log, url, request, "findSpecialist");
                    log.Write($"出参:{ret}");
                    if (!ret.IsNullOrWhiteSpace())
                    {
                        Response responseObj = ParseXmlToObject(ret);
                        if (responseObj.IsSuccess)
                            return responseObj.specialists ?? new Specialist[] { };
                        else if (!responseObj.ResultMsg.IsNullOrWhiteSpace())
                        {
                            msg = responseObj.ResultMsg;
                            MessageHelper.ShowDialog(msg, "病种列表");
                        }
                    }
                }
                catch (Exception ex)
                {
                    log.Write("慢病管理报错:" + ex.Message);
                    throw ex;
                }
            }
            return new Specialist[] { };
        }


        /// <summary>
        /// 3.11.3.4推送病人到慢病系统
        /// </summary>
        /// <returns></returns>
        internal void addPatient(CDMResult entity, Specialist specia)
        {
            using (var log = Log.Create("addPatient"))
            {
                try
                {
                    string url = _baseUri + "/addPatient";

                    string request = @"<Request>"
                                         + @"<EmpiId>" + entity.PersonId + "</EmpiId>"
                                         + @"<PatientId>" + entity.EncounterId + "</PatientId>"
                                         + @"<Type>" + entity.Encounterkindcodeid + "</Type>"
                                         + @"<PatientName>" + entity.Patientname + "</PatientName>"
                                         + @"<PatientCardId>" + entity.IdCard + "</PatientCardId>"
                                         + @"<SpecialistId>" + specia.SpecialistId + "</SpecialistId>"
                                         + @"<SpecialistName>" + specia.SpecialistName + "</SpecialistName>"
                                         + @"<PatientMobile>" + entity.PatientMobile + " </PatientMobile>"
                                         + @"<PatientAddress>" + entity.PatientAddress + "</PatientAddress>"
                                         + @"<Recommended>" + "" + "</Recommended>"
                                         + @"<DoctorName>" + ClientContext.Instance.Employee().Name + "</DoctorName>"
                                         + @"<DoctorSpecialist>" + ClientContext.Instance.LogOnOrganization().Name + "</DoctorSpecialist>"
                                         + @"<UserId>" + _userId + "</UserId>"
                                         + @"<Password>" + _password + "</Password>"
                                         + @"<ClientIp>" + ClientContext.Instance.IPAddress + "</ClientIp>"
                                         + "<Diagnosises>";

                    if (!entity.Icdcodes.IsNullOrWhiteSpace())
                    {
                        int orderNo = 0;
                        foreach (var item in entity.Icdcodes.Split(',').Take(3))
                        {
                            request = request
                               + @"<Diagnosis>"
                               + @"<DiagnosisOrderNo>" + (orderNo + 1) + "</DiagnosisOrderNo>"
                               + @"<DiagnosisICD>" + item + "</DiagnosisICD>"
                               + @"<DiagnosisName>" + entity.Diseasenames.Split(',')[orderNo] + "</DiagnosisName>"
                               + @"</Diagnosis>";
                            orderNo++;
                        }
                    }
                    request = request + "</Diagnosises></Request>";

                    log.Write($"入参:{request}");
                    string ret = PostHttp(log, url, request, "addPatient");
                    log.Write($"出参:{ret}");
                    if (!ret.IsNullOrWhiteSpace())
                    {
                        Response responseObj = ParseXmlToObject(ret);
                        string success = responseObj.Result == 0 ? "成功" : "失败";
                        log.Write($"personid={entity.PersonId},encounterid ={entity.EncounterId} 推送病人{success}");
                        if (responseObj.Result == 0)
                            MessageHelper.ShowDialog("推送病人到慢病系统成功", "提示");
                        else if (!responseObj.ResultMsg.IsNullOrWhiteSpace()) //0返回正常; 1.返回错误;
                            MessageHelper.ShowDialog(responseObj.ResultMsg, "推送病人到慢病系统");

                        //addSpecialist(entity, specia);
                    }
                }
                catch (Exception ex)
                {
                    log.Write("慢病管理报错:" + ex.Message);
                    throw ex;
                }
            }
            return;
        }

        static Response ParseXmlToObject(string xmlString)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Response));

            using (StringReader reader = new StringReader(xmlString))
            {
                return (Response)serializer.Deserialize(reader);
            }
        }

        public static string PostHttp(Log log, string url, string data, string methodName)
        {
            try
            {
                log.Write($"url:{url}");

                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);

                httpWebRequest.ContentType = "text/plain";
                httpWebRequest.Method = "POST";
                httpWebRequest.Timeout = 30 * 1000;

                byte[] buf = Encoding.UTF8.GetBytes(data);
                httpWebRequest.ContentLength = buf.Length;

                //解决报错:基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。
                ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;

                //发送请求
                Stream stream = httpWebRequest.GetRequestStream();
                stream.Write(buf, 0, buf.Length);
                stream.Close();

                HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
                string returnXml = streamReader.ReadToEnd();

                httpWebResponse.Close();
                streamReader.Close();
                httpWebRequest.Abort();
                httpWebResponse.Close();

                return returnXml;
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("调用接口{0}超时,请检查网络!>>{1}", methodName, ex.Message));
            }
        }

        private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
    }

    public class CDMResult
    {
        public int Encounterkindcodeid { get; set; }
        public int EncounterId { get; set; }
        public int PersonId { get; set; }
        public string IdCard { get; set; }

        public string PatientMobile { get; set; }
        public string PatientAddress { get; set; }

        public string Seqnotext { get; set; }
        public string Patientname { get; set; }
        public string Admitorgname { get; set; }
        public DateTime Admitdateon { get; set; }
        public DateTime? Dischargeon { get; set; }
        public DateTime? Settlementtime { get; set; }
        public string Diseaseids { get; set; }
        public string Diseasenames { get; set; }
        public string Icdcodes { get; set; }

        public IList<int> Diseases { get; set; }
    }

    [XmlRoot("response")]
    public class Response
    {
        public bool IsSuccess { get { return ResultCode == "0" && Result > 0; } }

        [XmlElement("resultCode")]
        public string ResultCode { get; set; }

        [XmlElement("resultMsg")]
        public string ResultMsg { get; set; }

        [XmlElement("result")]
        public int Result { get; set; }

        [XmlArray("specialists")]
        [XmlArrayItem("specialist")]
        public Specialist[] specialists { get; set; }
    }

    [XmlRoot("specialist")]
    public class Specialist
    {
        //<SpecialistId>2268</SpecialistId>
        //<SpecialistName>慢性肾脏病</SpecialistName>
        [XmlElement("specialistId")]
        public string SpecialistId { get; set; }
        [XmlElement("specialistName")]
        public string SpecialistName { get; set; }
    }

    public enum ChronicRecordStatuEnum
    {
        /// <summary>
        /// 未建档
        /// </summary>
        NOT_CREATED = 0,
        /// <summary>
        /// 已建档
        /// </summary>
        CREATED = 1,
        /// <summary>
        /// 需年检
        /// </summary>
        REQUIRED_CHECKED = 2
    }
}

 

posted on 2026-08-19 10:11  Chr☆s  阅读(2)  评论(0)    收藏  举报