/******************************************************************************
 * 文件名称: HisMainBusiness.cs
 * 文件说明: HIS主体交易的封装
 * 当前版本: V1.0
 * 创建日期: 2022-06-20
 *
 * * 2020-06-20: 增加 HisMainBusiness 类
 * *****  2020-06-20: 增加 CardReader 方法,获取URL地址,USER信息,地方版SSCard.dll使用
 * *****  2020-06-20: 增加 CardReader 方法重载,国家版电子凭证使用
 * *****  2020-06-20: 增加 Init 方法,SSCard环境初始化
 * *****  2020-06-20: 增加 ReadCardBas 方法,读社保卡
 * *****  2020-06-20: 增加 VerifyPIN 方法,验证密码
 * *****  2020-06-20: 增加 ChangePIN 方法,修改密码
 * *****  2020-06-20: 增加 ReadSFZ 方法,读身份证
 * *****  2020-06-20: 增加 GetQRBase 方法,读二维码
 * *****  2020-06-20: 增加 NationEcTrans 方法,读电子凭证(国家版)
******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PTMedicalInsurance.Common;
using PTMedicalInsurance.Helper;
using PTMedicalInsurance.Variables;
using PTMedicalInsurance.Forms;
using System.Data;
using System.Reflection;
using System.IO;
using System.IO.Compression;
using System.Xml;
using MedicareComLib;
using System.Runtime.InteropServices;
using System.Threading;
using System.Text.RegularExpressions;
namespace PTMedicalInsurance.Business
{
    class HisMainBusiness
    {
        private InvokeHelper invoker = new InvokeHelper();
        private HisIrisServices hIS = new HisIrisServices();
        private MIIrisServices mIS = new MIIrisServices();
        private CenterBusiness cBus = new CenterBusiness();
        private InsuServices rIS = new InsuServices();
        AnalysisXML AnXML = new AnalysisXML();
        ReadCardClass rcl = new ReadCardClass();
        MedOrdersShareClass MOS = new MedOrdersShareClass();
        FileHandle comp = new FileHandle();
        OutpatientClass hObj = new OutpatientClass();     
        /// 
        /// 获取HIS的IRIS配置信息
        /// 
        /// 
        public void getHisConfingue(out IrisConfigue con)
        {
            IniFile ini = new IniFile(Global.curEvt.path + @"\INSUConfigure.ini");
            con.ip = ini.ReadValue("HIS", "ip");
            con.url = ini.ReadValue("HIS", "url");
            con.authorization = ini.ReadValue("HIS", "authorization");            
        }
        /// 
        /// 获取医保平台的iris配置信息
        /// 
        /// 
        public void getInsuConfingue(out IrisConfigue con)
        {
            IniFile ini = new IniFile(Global.curEvt.path + @"\INSUConfigure.ini");
            con.ip = ini.ReadValue("INSU", "ip");
            con.url = ini.ReadValue("INSU", "url");
            con.authorization = ini.ReadValue("INSU", "authorization");
        }
        /// 
        /// 获取Session信息(目前只获取操作员信息)
        /// 
        /// 
        public void getSessionInfo(JObject joSession)
        {
            Global.user.ID = JsonHelper.getDestValue(joSession, "userCode");
            Global.user.name = JsonHelper.getDestValue(joSession, "userName");
            Global.user.type = "3";
            Global.user.officeID = JsonHelper.getDestValue(joSession, "locID");
            Global.user.officeName = JsonHelper.getDestValue(joSession, "locDesc");
        }
        /// 
        /// 根据壳程序传入的入参设置全局接口变量
        /// 
        /// 
        /// 
        public void setGlobalInterface(JObject joInpar,out  InterfaceInfo inf)
        {
            inf = new InterfaceInfo();
            inf.hospitalDr = int.Parse(JsonHelper.getDestValue(joInpar, "HospitalDr"));
            inf.hisHospitalDr = int.Parse(JsonHelper.getDestValue(joInpar, "hisHospitalDr"));
            inf.hospitalName = JsonHelper.getDestValue(joInpar, "HospitalName");
            inf.interfaceDr = int.Parse(JsonHelper.getDestValue(joInpar, "ID"));
            inf.interfaceID = JsonHelper.getDestValue(joInpar, "InterfaceID");
            //inf.oper = "3";
            inf.centerURL = JsonHelper.getDestValue(joInpar, "CenterURL");
            inf.ecURL = JsonHelper.getDestValue(joInpar, "CenterURL2");
            inf.areaCode = JsonHelper.getDestValue(joInpar, "AreaCode");
            inf.dllName = JsonHelper.getDestValue(joInpar, "DLLName");
            inf.hospitalNO = JsonHelper.getDestValue(joInpar, "HospitalNO");
            inf.version = "v1.0";
            inf.signatureType = "SM3";
            inf.recivedSystem = "YBXT";
            inf.AK = "";
            inf.SK = "";
            inf.dev_safe_info = "";
            inf.dev_no = Global.curEvt.mac;
            inf.cardURL = inf.centerURL;                    
            inf.cainfo = "";
        }
        /// 
        /// 根据壳程序传入的入参设置全局接口变量
        /// 
        /// 
        /// 
        public void setGlobalInterface_Plat(JObject joInpar, out InterfaceInfo inf)
        {
            inf = new InterfaceInfo();            
            inf.hospitalDr = int.Parse(JsonHelper.getDestValue(joInpar, "hospitalID"));            
            inf.hisHospitalDr = int.Parse(JsonHelper.getDestValue(joInpar, "hisHospitalDr"));            
            inf.hospitalName = JsonHelper.getDestValue(joInpar, "hospitalName");
            inf.interfaceDr = int.Parse(JsonHelper.getDestValue(joInpar, "medInsuInterfaceID"));            
            inf.interfaceID = JsonHelper.getDestValue(joInpar, "interfaceNO");
            //inf.oper = "3";
            inf.centerURL = JsonHelper.getDestValue(joInpar, "centerURL");
            inf.ecURL = JsonHelper.getDestValue(joInpar, "centerURL2");
            inf.areaCode = JsonHelper.getDestValue(joInpar, "areaCode");
            inf.dllName = JsonHelper.getDestValue(joInpar, "dLLName");
            inf.hospitalNO = JsonHelper.getDestValue(joInpar, "hospitalNO");
            inf.version = "v1.0";
            inf.signatureType = "SM3";
            inf.recivedSystem = "YBXT";
            inf.AK = "";
            inf.SK = "";
            inf.dev_safe_info = "";
            inf.dev_no = Global.curEvt.mac;
            inf.cardURL = inf.centerURL;
            inf.cainfo = "";
        }
        /// 
        /// 初始化环境
        /// 
        /// 
        /// 
        public  int initEnvironment(string inParam,out string error)
        {
            error = string.Empty;
            try
            {              
                //获取HIS和医保平台的IRIS配置信息
                getHisConfingue(out Global.hisConfig);
                
                getInsuConfingue(out Global.insuConfig);
                JObject joInparam = JObject.Parse(inParam);
                JObject JoSession = JObject.Parse(JsonHelper.getDestValue(joInparam, "session[0]"));
                string  hisHospitalDr = JsonHelper.getDestValue(JoSession, "hospID");
                JObject joInterface = JObject.Parse(JsonHelper.getDestValue(joInparam, "interfaceinfo"));
                joInterface.Add("hisHospitalDr", hisHospitalDr); 
                if (joInterface != null)
                {
                    //获取当前接口详细信息
                    if (Global.businessType == "P1")
                    {                        
                        setGlobalInterface_Plat(joInterface, out Global.inf);  
                    }
                    else
                    {                        
                        setGlobalInterface(joInterface, out Global.inf);
                    }
                    
                    JObject joSession = JObject.Parse(JsonHelper.getDestValue(joInparam, "session[0]"));
                    if (joSession != null)
                    {
                        //获取当前用户信息                        
                        getSessionInfo(joSession);
                        return 0;
                    }
                    else
                    {
                        error = "初始化环境失败:session获取失败!";
                        return -1;
                    }
                }
                else
                {
                    error = "初始化环境失败:interfaceinfo获取失败!";
                    return -1;
                }                
            }
            catch (Exception ex)
            {
                error ="初始化环境失败:" + ex.Message;
                return -1;
            }
            
        }
        /// 
        /// 读卡
        /// 
        /// 
        public int readCard_New(out string outParam)
        {
            string FunName, Appmsg, AppRtnMsg, OutMsg, OutMsg_Close = string.Empty, OutMsg_Open = string.Empty;
            Global.pat.mdtrtarea_admvs = "110105";
            JObject joCardInfo = new JObject();
            ChooseCard cc = new ChooseCard();
            try
            {
                if (cc.ShowDialog() == DialogResult.OK)
                {
                    Global.pat.cardType = cc.sL_CardType;
                    //【社保卡】
                    if (cc.sL_CardType == 0)
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "";
                        Global.pat.mdtrtcertType = "03";
                        Global.pat.mdtrtcertNO = "";
                    }
                    else  //【医保电子凭证】
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "" +
                                 "" + cc.QrCode + "" +
                                 "" + cc.sYMYWLX + "" +
                                 "" + Global.curEvt.mac.Replace("-", string.Empty) + "" +
                                 "" + Global.curEvt.ip + "" +
                                 "" + Global.user.ID + "" +
                                 "" + Global.user.name + "" +
                                 "" + Global.user.officeID + "" +
                                 "" + Global.user.officeName + "";
                        Global.pat.mdtrtcertType = "01";
                        Global.pat.mdtrtcertNO = cc.QrCode;
                    }
                    Global.pat.medType = cc.sYLLB;
                    //读卡前先Open
                    hObj.Open(out OutMsg_Open);
                    //获取人员类别信息
                    Appmsg = JsonHelper.GetinPar(Appmsg, 0);
                    hObj.GetPersonClass_Multimedia(Appmsg, out AppRtnMsg);
                    JObject joRtn = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joRtn, "root.state.success") != "true")
                    {
                        outParam = "调用【GetPersonClass_Multimedia】获取参保人员类别信息失败,中心返回信息:" + AppRtnMsg + "\r\n"
                                 + "调用【Open】打开读卡设备输出:" + OutMsg_Open;
                        return -1;
                    }
                    else
                    {
                        //1:本市;2:异地
                        if (JsonHelper.getDestValue(joRtn, "root.output.ic.card_class") == "2")
                        {
                            //【社保卡-异地】
                            FunName = "GetPersonInfoNation_Multimedia";
                            Global.pat.iOtherProvLocal = 1;
                            hObj.GetPersonInfoNation_Multimedia(Appmsg, out AppRtnMsg);
                        }
                        else
                        {
                            //【社保卡-本地】
                            FunName = "GetPersonInfo_Multimedia";
                            Global.pat.iOtherProvLocal = 0;
                            hObj.GetPersonInfo_Multimedia(Appmsg, out AppRtnMsg);
                        }
                    }
                    //读卡结束Close
                    hObj.Close(out OutMsg_Close);
                    joCardInfo = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joCardInfo, "root.state.success") != "true")
                    {
                        outParam = "调用【" + FunName + "】获取参保信息失败,中心返回信息:" + AppRtnMsg + "\r\n"
                                 + "调用【Open】打开读卡设备输出:" + OutMsg_Open + "\r\n"
                                 + "调用【Close】关闭读卡设备输出:" + OutMsg_Close;
                        return -1;
                    }
                    else
                    {
                        Global.pat.GetPersonInfoFunName = FunName;
                        Global.pat.GetPersonInfoInParam = Appmsg;
                        outParam = AppRtnMsg;
                        return 0;
                    }
                }
                else
                {
                    outParam = "收款员取消读卡!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                hObj.Close(out OutMsg_Close);
                outParam = "异常:" + ex.Message;
                return -1;
            }
            finally
            {
                IDisposable disposable = hObj as IDisposable;
                if (disposable != null)
                    disposable.Dispose();
            }
        }
        /// 
        /// 读卡
        /// 
        /// 
        public int readCard_DLL(out string outParam)
        {
            string FunName, Appmsg, AppRtnMsg, OutMsg, OutMsg_Close = string.Empty, OutMsg_Open = string.Empty;
            Global.pat.mdtrtarea_admvs = "110105";
            JObject joCardInfo = new JObject();
            ChooseCard cc = new ChooseCard();
            CardReaderCom crc = new CardReaderCom();
            try
            {
                if (cc.ShowDialog() == DialogResult.OK)
                {
                    Global.pat.cardType = cc.sL_CardType;
                    //【社保卡】
                    if (cc.sL_CardType == 0)
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "";
                        Global.pat.mdtrtcertType = "03";
                        Global.pat.mdtrtcertNO = "";
                    }
                    else  //【医保电子凭证】
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "" +
                                 "" + cc.QrCode + "" +
                                 "" + cc.sYMYWLX + "" +
                                 "" + Global.curEvt.mac.Replace("-", string.Empty) + "" +
                                 "" + Global.curEvt.ip + "" +
                                 "" + Global.user.ID + "" +
                                 "" + Global.user.name + "" +
                                 "" + Global.user.officeID + "" +
                                 "" + Global.user.officeName + "";
                        Global.pat.mdtrtcertType = "01";
                        Global.pat.mdtrtcertNO = cc.QrCode;
                    }
                    Global.pat.medType = cc.sYLLB;
                    //读卡前先Open
                    crc.Open(out OutMsg_Open);        
                    //获取人员类别信息
                    Appmsg = JsonHelper.GetinPar(Appmsg, 0);
                    crc.GetPersonClass_Multimedia(Appmsg, out AppRtnMsg);
                    JObject joRtn = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joRtn, "root.state.success") != "true")
                    {
                        outParam = "调用【GetPersonClass_Multimedia】获取参保人员类别信息失败,中心返回信息:" + AppRtnMsg + "\r\n"
                                 + "调用【Open】打开读卡设备输出:" + OutMsg_Open;
                        return -1;
                    }
                    else
                    {
                        //1:本市;2:异地
                        if (JsonHelper.getDestValue(joRtn, "root.output.ic.card_class") == "2")
                        {
                            //【社保卡-异地】
                            FunName = "GetPersonInfoNation_Multimedia";
                            Global.pat.iOtherProvLocal = 1;
                            crc.GetPersonInfoNation_Multimedia(Appmsg, out AppRtnMsg);
                        }
                        else
                        {
                            //【社保卡-本地】
                            FunName = "GetPersonInfo_Multimedia";
                            Global.pat.iOtherProvLocal = 0;
                            crc.GetPersonInfo_Multimedia(Appmsg, out AppRtnMsg);
                        }
                    }
                    //读卡结束Close
                    crc.Close(out OutMsg_Close);
                    joCardInfo = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joCardInfo, "root.state.success") != "true")
                    {
                        outParam = "调用【" + FunName + "】获取参保信息失败,中心返回信息:" + AppRtnMsg + "\r\n"
                                 + "调用【Open】打开读卡设备输出:" + OutMsg_Open + "\r\n"
                                 + "调用【Close】关闭读卡设备输出:" + OutMsg_Close;
                        return -1;
                    }
                    else
                    {
                        Global.pat.GetPersonInfoFunName = FunName;
                        Global.pat.GetPersonInfoInParam = Appmsg;
                        outParam = AppRtnMsg;
                        return 0;
                    }
                }
                else
                {
                    outParam = "收款员取消读卡!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                crc.Close(out OutMsg_Close);
                outParam = "异常:" + ex.Message;
                return -1;
            }
        }   
        /// 
        /// 读卡
        /// 
        /// 
        public int readCard(out string outParam)
        {
            string FunName, Appmsg, AppRtnMsg, OutMsg, OutMsg_Close = string.Empty, OutMsg_Open = string.Empty;
            Global.pat.mdtrtarea_admvs = "110105";
            JObject joCardInfo = new JObject();
            ChooseCard cc = new ChooseCard();
            //结算业务用
            System.Type ComType = null;
            object ComInstance = null;
            try
            {
                if (cc.ShowDialog() == DialogResult.OK)
                {
                    Global.pat.cardType = cc.sL_CardType;
                    //【社保卡】
                    if (cc.sL_CardType == 0)
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "";
                        Global.pat.mdtrtcertType = "03";
                        Global.pat.mdtrtcertNO = "";
                    }
                    else  //【医保电子凭证】
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "" +
                                 "" + cc.QrCode + "" +
                                 "" + cc.sYMYWLX + "" +
                                 "" + Global.curEvt.mac.Replace("-", string.Empty) + "" +
                                 "" + Global.curEvt.ip + "" +
                                 "" + Global.user.ID + "" +
                                 "" + Global.user.name + "" +
                                 "" + Global.user.officeID + "" +
                                 "" + Global.user.officeName + "";
                        Global.pat.mdtrtcertType = "01";
                        Global.pat.mdtrtcertNO = cc.QrCode;
                    }
                    Global.pat.medType = cc.sYLLB;              
                    //创建首信医保Com实例
                    if (rcl.CreateBusinessObj(out ComType, out ComInstance) != 0)
                    {
                        outParam = "实例创建失败!";
                        return -1;
                    }               
                    //读卡前先Open
                    rcl.Open(ComType, ComInstance, out OutMsg_Open);
                    Appmsg = JsonHelper.GetinPar(Appmsg, 0);
                    //获取人员类别信息
                    rcl.ReadCardObj("GetPersonClass_Multimedia", Appmsg, ComType, ComInstance, out AppRtnMsg);
                    JObject joRtn = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joRtn, "root.state.success") != "true")
                    {
                        outParam = "调用【GetPersonClass_Multimedia】获取参保人员类别信息失败,中心返回信息:" + AppRtnMsg + "\r\n"
                                 + "调用【Open】打开读卡设备输出:" + OutMsg_Open;
                        return -1;
                    }
                    else
                    {
                        //1:本市;2:异地
                        if (JsonHelper.getDestValue(joRtn, "root.output.ic.card_class") == "2")
                        {
                            //【社保卡-异地】
                            FunName = "GetPersonInfoNation_Multimedia";
                            Global.pat.iOtherProvLocal = 1;
                        }
                        else
                        {
                            //【社保卡-本地】
                            FunName = "GetPersonInfo_Multimedia";
                            Global.pat.iOtherProvLocal = 0;
                        }
                    }                     
                    rcl.ReadCardObj(FunName, Appmsg, ComType, ComInstance, out AppRtnMsg);
                    rcl.Close(ComType, ComInstance, out OutMsg_Close);         
                    joCardInfo = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joCardInfo, "root.state.success") != "true")
                    {
                        outParam = "调用【" + FunName + "】获取参保信息失败,中心返回信息:" + AppRtnMsg + "\r\n"
                                 + "调用【Open】打开读卡设备输出:" + OutMsg_Open + "\r\n"
                                 + "调用【Close】关闭读卡设备输出:" + OutMsg_Close;
                        return -1;
                    }
                    else
                    {
                        Global.pat.GetPersonInfoFunName = FunName;
                        Global.pat.GetPersonInfoInParam = Appmsg;  
                        outParam = AppRtnMsg;
                        return 0;
                    }                
                }
                else
                {
                    outParam = "收款员取消读卡!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                if ((ComInstance != null) && (cc.sL_CardType == 0))
                    rcl.Close(ComType, ComInstance, out OutMsg_Close);
                outParam = "异常:" + ex.Message;
                return -1;
            }
            finally
            {
                // 释放资源
                (ComInstance as IDisposable)?.Dispose();
                (ComType as IDisposable)?.Dispose();
                //GC.Collect();
                //if (ComInstance is IDisposable disposable)
                //{
                //    disposable.Dispose();
                //}                
                //if (ComInstance != null)
                //{
                //    MessageBox.Show("还没释放:"+ ComInstance.ToString());
                //    //IDisposable disp = ComInstance as IDisposable;
                //    //disp.Dispose();                  
                //}
                //else
                //{
                //    MessageBox.Show("释放啦");
                //}
            }
        }
        /// 
        /// 读卡
        /// 
        /// 
        public int readCard(System.Type InComType, object InComInstance, out string outParam)
        {
            string FunName, Appmsg, AppRtnMsg, OutMsg, OutMsg_Close = string.Empty;
            Global.pat.mdtrtarea_admvs = "110100";
            JObject joCardInfo = new JObject();
            ChooseCard cc = new ChooseCard();
            try
            {
                if (cc.ShowDialog() == DialogResult.OK)
                {
                    //【医保电子凭证】
                    if (cc.sL_CardType == 1)
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "" +
                                 "" + cc.QrCode + "" +
                                 "" + cc.sYMYWLX + "" +
                                 "" + Global.curEvt.mac.Replace("-", string.Empty) + "" +
                                 "" + Global.curEvt.ip + "" +
                                 "" + Global.user.ID + "" +
                                 "" + Global.user.name + "" +
                                 "" + Global.user.officeID + "" +
                                 "" + Global.user.officeName + "";
                        Global.pat.mdtrtcertType = "01";
                        Global.pat.mdtrtcertNO = cc.QrCode;
                    }
                    else
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "";
                        Global.pat.mdtrtcertType = "03";
                        Global.pat.mdtrtcertNO = "";
                    }
                    Appmsg = JsonHelper.GetinPar(Appmsg, 0);
                    //获取人员类别信息
                    rcl.ReadCardObj("GetPersonClass_Multimedia", Appmsg, InComType, InComInstance, out AppRtnMsg);
                    JObject joRtn = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joRtn, "root.state.success") != "true")
                    {
                        outParam = "调用【GetPersonClass_Multimedia】获取参保人员类别信息失败,中心返回信息:" + AppRtnMsg;
                        return -1;
                    }
                    else
                    {
                        //1:本市;2:异地
                        if (JsonHelper.getDestValue(joRtn, "root.output.ic.card_class") == "2")
                        {
                            //【社保卡-异地】
                            FunName = "GetPersonInfoNation_Multimedia";
                            Global.pat.iOtherProvLocal = 1;
                        }
                        else
                        {
                            //【社保卡-本地】
                            FunName = "GetPersonInfo_Multimedia";
                            Global.pat.iOtherProvLocal = 0;
                        }
                    }                  
                    
                    rcl.BussniessObj(FunName, Appmsg, InComType, InComInstance, out AppRtnMsg);
                    joCardInfo = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joCardInfo, "root.state.success") != "true")
                    {
                        outParam = "调用【" + FunName + "】获取参保信息失败,中心返回信息:" + AppRtnMsg;
                        return -1;
                    }
                    else
                    {
                        outParam = AppRtnMsg;
                        return 0;
                    }
                }
                else
                {
                    outParam = "收款员取消读卡!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                outParam = "异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 读卡-结算
        /// 
        /// 
        public int readCardSettle(out System.Type InComType,out object InComInstance, out string outParam)
        {
            string FunName, Appmsg, AppRtnMsg, OutMsg, OutMsg_Close = string.Empty;
            Global.pat.mdtrtarea_admvs = "110100";
            JObject joCardInfo = new JObject();
            InComType = null;
            InComInstance = null;
            ChooseCard cc = new ChooseCard();
            try
            {
                if (cc.ShowDialog() == DialogResult.OK)
                {
                    //【医保电子凭证】
                    if (cc.sL_CardType == 1)
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "" +
                                 "" + cc.QrCode + "" +
                                 "" + cc.sYMYWLX + "" +
                                 "" + Global.curEvt.mac.Replace("-", string.Empty) + "" +
                                 "" + Global.curEvt.ip + "" +
                                 "" + Global.user.ID + "" +
                                 "" + Global.user.name + "" +
                                 "" + Global.user.officeID + "" +
                                 "" + Global.user.officeName + "";
                        Global.pat.mdtrtcertType = "01";
                        Global.pat.mdtrtcertNO = cc.QrCode;
                    }
                    else
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "";
                        Global.pat.mdtrtcertType = "03";
                        Global.pat.mdtrtcertNO = "";
                    }
                    //1.创建首信医保Com实例
                    if (rcl.CreateBusinessObj(out InComType, out InComInstance) != 0)
                    {
                        outParam = "实例创建失败";
                        return -1;
                    }
                    
                    //2.读卡前先Open             
                    rcl.Open(InComType, InComInstance, out outParam);
                    Appmsg = JsonHelper.GetinPar(Appmsg, 0);
                    //获取人员类别信息
                    rcl.ReadCardObj("GetPersonClass_Multimedia", Appmsg, InComType, InComInstance, out AppRtnMsg);
                    JObject joRtn = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joRtn, "root.state.success") != "true")
                    {
                        outParam = "调用【GetPersonClass_Multimedia】获取参保人员类别信息失败,中心返回信息:" + AppRtnMsg + "\r\n"
                                 + "调用【Open】打开读卡设备输出:" + outParam;
                        return -1;
                    }
                    else
                    {
                        //1:本市;2:异地
                        if (JsonHelper.getDestValue(joRtn, "root.output.ic.card_class") == "2")
                        {
                            //【社保卡-异地】
                            FunName = "GetPersonInfoNation_Multimedia";
                            Global.pat.iOtherProvLocal = 1;
                        }
                        else
                        {
                            //【社保卡-本地】
                            FunName = "GetPersonInfo_Multimedia";
                            Global.pat.iOtherProvLocal = 0;
                        }
                    }                    
                    //3.调用业务
                    rcl.BussniessObj(FunName, Appmsg, InComType, InComInstance, out AppRtnMsg);
                    joCardInfo = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joCardInfo, "root.state.success") != "true")
                    {
                        outParam = "调用【" + FunName + "】获取参保信息失败,中心返回信息:" + AppRtnMsg;
                        return -1;
                    }
                    else
                    {
                        outParam = AppRtnMsg;
                        return 0;
                    }
                }
                else
                {
                    outParam = "收款员取消读卡!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                outParam = "异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 读卡-撤销结算
        /// 
        /// 
        public int readCardCancelSettle(System.Type InComType, dynamic InComInstance, out string outParam)
        {
            string FunName, Appmsg, AppRtnMsg, OutMsg, OutMsg_Close = string.Empty;
            Global.pat.mdtrtarea_admvs = "110100";
            JObject joCardInfo = new JObject();
            ChooseCard cc = new ChooseCard();
            try
            {
                if (cc.ShowDialog() == DialogResult.OK)
                {
                    //【医保电子凭证】
                    if (cc.sL_CardType == 1)
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "" +
                                 "" + cc.QrCode + "" +
                                 "" + cc.sYMYWLX + "" +
                                 "" + Global.curEvt.mac.Replace("-", string.Empty) + "" +
                                 "" + Global.curEvt.ip + "" +
                                 "" + Global.user.ID + "" +
                                 "" + Global.user.name + "" +
                                 "" + Global.user.officeID + "" +
                                 "" + Global.user.officeName + "";
                        Global.pat.mdtrtcertType = "01";
                        Global.pat.mdtrtcertNO = cc.QrCode;
                    }
                    else
                    {
                        Appmsg = "" + (cc.sL_CardType + 1) + "";
                        Global.pat.mdtrtcertType = "03";
                        Global.pat.mdtrtcertNO = "";
                    }
                    Appmsg = JsonHelper.GetinPar(Appmsg, 0);
                    //获取人员类别信息
                    rcl.ReadCardObj("GetPersonClass_Multimedia", Appmsg, InComType, InComInstance, out AppRtnMsg);
                    JObject joRtn = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joRtn, "root.state.success") != "true")
                    {
                        outParam = "调用【GetPersonClass_Multimedia】获取参保人员类别信息失败,中心返回信息:" + AppRtnMsg;
                        return -1;
                    }
                    else
                    {
                        //1:本市;2:异地
                        if (JsonHelper.getDestValue(joRtn, "root.output.ic.card_class") == "2")
                        {
                            //【社保卡-异地】
                            FunName = "GetPersonInfoNation_Multimedia";
                            Global.pat.iOtherProvLocal = 1;
                        }
                        else
                        {
                            //【社保卡-本地】
                            FunName = "GetPersonInfo_Multimedia";
                            Global.pat.iOtherProvLocal = 0;
                        }
                    }                                    
                  
                    rcl.BussniessObj(FunName, Appmsg, InComType, InComInstance, out AppRtnMsg);
                    joCardInfo = ConvertXMLToObject(AppRtnMsg);
                    if (JsonHelper.getDestValue(joCardInfo, "root.state.success") != "true")
                    {
                        outParam = "调用【" + FunName + "】获取参保信息失败,中心返回信息:" + AppRtnMsg;
                        return -1;
                    }
                    else
                    {
                        outParam = AppRtnMsg;
                        return 0;
                    }                     
                }
                else
                {
                    outParam = "收款员取消读卡!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                outParam = "异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 展示患者信息界面,转换相关编码为中文,并获取操作员选中的信息
        /// 
        /// 
        /// 
        /// 
        public int showPatInfo(JObject joPatInfo, out string outparam)
        {
            outparam = "";
            //弹框展示参保信息
            ReadCardInfo frmPatientInfo = new ReadCardInfo(joPatInfo, Global.pat.iOtherProvLocal);
            frmPatientInfo.StartPosition = FormStartPosition.CenterScreen;
            try
            {
                if (frmPatientInfo.ShowDialog() != DialogResult.OK)
                {
                    outparam = JsonHelper.setExceptionJson(-1, "门诊读卡", "收款员取消读卡").ToString();
                    return -1;
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                outparam = "异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 展示患者信息界面,转换相关编码为中文,并获取操作员选中的信息
        /// 
        /// 
        /// 
        /// 
        public int showPatInfoNew(String patInfo, out string outparam)
        {
            outparam = "";
            //弹框展示参保信息
            ReadCardInfo frmPatientInfo = new ReadCardInfo(patInfo, Global.pat.iOtherProvLocal);
            frmPatientInfo.StartPosition = FormStartPosition.CenterScreen;
            try
            {
                if (frmPatientInfo.ShowDialog() != DialogResult.OK)
                {
                    outparam = "收款员取消读卡";
                    return -1;
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                outparam = "异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 患者读卡并获取中心信息(1101)后设置PAT结构体
        /// 
        /// 
        /// 
        /// 
        public int setGlobalPatAfaterShowPatInfo(string patInfo,out string errMsg)
        {
            errMsg = "";
            try
            {
                //解析返回值
                XmlDocument xmlDoc = AnXML.GetXmlDoc(patInfo);
                XmlNode dataNodeIC = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output/ic");
                
                //基本信息
                if (Global.pat.iOtherProvLocal == 0)
                {
                    XmlNode dataNodeNet = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output/net");
                    Global.pat.psn_no = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "ic_no", 0); //医保应用号
                    Global.pat.insuplc_admdvs = "110100";
                    Global.pat.psn_type = AnXML.FormatXMLElement(xmlDoc, dataNodeNet, "persontype", 0); //人员类别
                    Global.pat.isinredlist = AnXML.FormatXMLElement(xmlDoc, dataNodeNet, "isinredlist", 0); //是否在红名单
                    Global.pat.isspecifiedhosp = AnXML.FormatXMLElement(xmlDoc, dataNodeNet, "isspecifiedhosp", 0);  //本人定点医院状态 0:本地红名单,默认为本人定点医院; 1:是本人定点医院、A类医院、专科医院、中医医院;2:不是本人定点医院 3:转诊
                    Global.pat.ischronichosp = AnXML.FormatXMLElement(xmlDoc, dataNodeNet, "ischronichosp", 0); //是否本人慢病定点医院
                    Global.pat.balc = AnXML.FormatXMLElement(xmlDoc, dataNodeNet, "personcount", 1);  //账户余额
                    Global.pat.DiseasecCode = AnXML.FormatXMLElement(xmlDoc, dataNodeNet, "chroniccode", 0);   //慢病编码
                    if (AnXML.FormatXMLElement(xmlDoc, dataNodeNet, "chroniccode", 0) == "false")
                        Global.pat.cvlserv_flag = "0";
                    else
                        Global.pat.cvlserv_flag = "1";
                    Global.pat.fromhospdate = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "fromhospdate", 0);  //转诊时限
                    Global.pat.fromhosp = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "fromhosp", 0);  //转诊医院编码
                          
                    Global.pat.isyt = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "isyt", 0);  //预提人员标示
                    Global.pat.jclevel = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "jclevel", 0); //军残等级                  
                }
                else
                {
                    Global.pat.psn_no= AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "Person_manage", 0);
                    Global.pat.servantFlag = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "ServantFlag ", 0); //参加公务员医疗补助标识
                    Global.pat.poorFlag = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "PoorFlag ", 0); //低保对象标识
                    Global.pat.inHospitalNumber = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "InHospitalNumber ", 0); //本年度住院次数
                    Global.pat.insuplc_admdvs = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "AreaCode", 0); //参保地行政区划代码
                }
                Global.pat.name = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "personname", 0); //姓名
                Global.pat.card.NO = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "card_no", 0); //社保卡号
                Global.pat.certNO = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "id_no", 0);  //公民身份号码
                Global.pat.gend = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "sex", 0);
                Global.pat.hospflag = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "hospflag", 0); //在院标示
                Global.pat.insuType = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "fundtype", 0);  //险种类型
                string brdy = AnXML.FormatXMLElement(xmlDoc, dataNodeIC, "birthday", 0);
                Global.pat.brdy = brdy.Trim().Substring(0, 4) + "-" + brdy.Trim().Substring(4, 2) + "-" + brdy.Trim().Substring(6, 2); //出生日期
                Global.pat.age = (int.Parse(DateTime.Now.ToString("yyyyMMdd")) - int.Parse(brdy) + 1).ToString();
                if (Global.pat.mdtrtcertType == "03")
                    Global.pat.mdtrtcertNO = Global.pat.card.NO;
                //北京首信医保接口读卡不返回参保地信息 这里给默认北京市区划代码
                Global.pat.mdtrtarea_admvs = "110105";
                return 0;
            }
            catch (Exception ex)
            {
                errMsg = "获取患者信息发生异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 患者读卡并获取参保信息后设置PAT结构体
        /// 
        /// 
        /// 
        /// 
        public int setGlobalPatAfaterShowPatInfo(JObject joPatInfo, out JObject joRtn, out string errMsg)
        {
            errMsg = "";
            joRtn = null;
            //解析返回值
            try
            {
                //基本信息-本地
                if (Global.pat.iOtherProvLocal == 0)
                {
                    Global.pat.insuplc_admdvs = "110100";
                    Global.pat.psn_no = JsonHelper.getDestValue(joPatInfo, "root.output.ic.ic_no"); //医保应用号      
                    Global.pat.psn_type = JsonHelper.getDestValue(joPatInfo, "root.output.net.persontype"); //人员类别
                    Global.pat.isinredlist = JsonHelper.getDestValue(joPatInfo, "root.output.net.isinredlist"); //是否在红名单
                    Global.pat.isspecifiedhosp = JsonHelper.getDestValue(joPatInfo, "root.output.net.isspecifiedhosp");  //本人定点医院状态 0:本地红名单,默认为本人定点医院; 1:是本人定点医院、A类医院、专科医院、中医医院;2:不是本人定点医院 3:转诊
                    Global.pat.ischronichosp = JsonHelper.getDestValue(joPatInfo, "root.output.net.ischronichosp"); //是否本人慢病定点医院
                    Global.pat.balc = JsonHelper.getDestValue(joPatInfo, "root.output.net.personcount");  //账户余额
                    Global.pat.DiseasecCode = JsonHelper.getDestValue(joPatInfo, "root.output.net.chroniccode");   //慢病编码
                    Global.pat.fromhospdate = JsonHelper.getDestValue(joPatInfo, "root.output.ic.fromhospdate");  //转诊时限
                    Global.pat.fromhosp = JsonHelper.getDestValue(joPatInfo, "root.output.ic.fromhosp");  //转诊医院编码
                    Global.pat.isyt = JsonHelper.getDestValue(joPatInfo, "root.output.ic.isyt");  //预提人员标示
                    Global.pat.jclevel = JsonHelper.getDestValue(joPatInfo, "root.output.ic.jclevel"); //军残等级
                                                                                                 
                    if (Global.pat.DiseasecCode == "false")
                        Global.pat.cvlserv_flag = "0";
                    else
                        Global.pat.cvlserv_flag = "1";
                }
                else //基本信息-异地
                {
                    Global.pat.psn_no = JsonHelper.getDestValue(joPatInfo, "root.output.ic.Person_manage");
                    Global.pat.psn_type = JsonHelper.getDestValue(joPatInfo, "root.output.ic.persontype"); //人员类别
                    Global.pat.servantFlag = JsonHelper.getDestValue(joPatInfo, "root.output.ic.ServantFlag"); //参加公务员医疗补助标识
                    Global.pat.poorFlag = JsonHelper.getDestValue(joPatInfo, "root.output.ic.PoorFlag"); //低保对象标识
                    Global.pat.inHospitalNumber = JsonHelper.getDestValue(joPatInfo, "root.output.ic.InHospitalNumber"); //本年度住院次数
                    Global.pat.insuplc_admdvs = JsonHelper.getDestValue(joPatInfo, "root.output.ic.AreaCode"); //参保地行政区划代码
                }
                Global.pat.name = JsonHelper.getDestValue(joPatInfo, "root.output.ic.personname"); //姓名
                Global.pat.card.NO = JsonHelper.getDestValue(joPatInfo, "root.output.ic.card_no"); //社保卡号
                Global.pat.certNO = JsonHelper.getDestValue(joPatInfo, "root.output.ic.id_no");  //公民身份号码
                Global.pat.gend = JsonHelper.getDestValue(joPatInfo, "root.output.ic.sex");
                Global.pat.hospflag = JsonHelper.getDestValue(joPatInfo, "root.output.ic.hospflag"); //在院标示
                Global.pat.insuType = JsonHelper.getDestValue(joPatInfo, "root.output.ic.fundtype");  //险种类型
                string brdy = JsonHelper.getDestValue(joPatInfo, "root.output.ic.birthday");
                Global.pat.brdy = brdy.Trim().Substring(0, 4) + "-" + brdy.Trim().Substring(4, 2) + "-" + brdy.Trim().Substring(6, 2); //出生日期
                Global.pat.age = (int.Parse(DateTime.Now.ToString("yyyy")) - int.Parse(brdy.Substring(0,4)) + 1).ToString();
                if (Global.pat.mdtrtcertType == "03")
                    Global.pat.mdtrtcertNO = Global.pat.card.NO;
                //北京首信医保接口读卡不返回参保地信息 这里给默认北京市区划代码
                Global.pat.mdtrtarea_admvs = "110105";
                //重新组织参保信息返回给前端
                JObject joInsuPatInfo = new JObject();
                joInsuPatInfo.Add("card_no", Global.pat.card.NO);
                joInsuPatInfo.Add("id_no", Global.pat.certNO);
                joInsuPatInfo.Add("personname", Global.pat.name);
                joInsuPatInfo.Add("sex", Global.pat.gend);
                joInsuPatInfo.Add("hospflag", Global.pat.hospflag);
                joInsuPatInfo.Add("fundtype", Global.pat.insuType);
                joInsuPatInfo.Add("ic_no", Global.pat.psn_no);
                joInsuPatInfo.Add("persontype", Global.pat.psn_type);
                joInsuPatInfo.Add("isinredlist", Global.pat.isinredlist);
                joInsuPatInfo.Add("isspecifiedhosp", Global.pat.isspecifiedhosp);
                joInsuPatInfo.Add("ischronichosp", Global.pat.ischronichosp);
                joInsuPatInfo.Add("personcount", Global.pat.balc);
                joInsuPatInfo.Add("chroniccode", Global.pat.DiseasecCode);
                joInsuPatInfo.Add("fromhospdate", Global.pat.fromhospdate);
                joInsuPatInfo.Add("fromhosp", Global.pat.fromhosp);
                joInsuPatInfo.Add("isyt", Global.pat.isyt);
                joInsuPatInfo.Add("jclevel", Global.pat.jclevel);
                joInsuPatInfo.Add("ServantFlag", Global.pat.servantFlag);
                joInsuPatInfo.Add("PoorFlag", Global.pat.poorFlag);
                joInsuPatInfo.Add("InHospitalNumber", Global.pat.inHospitalNumber);
                joInsuPatInfo.Add("AreaCode", Global.pat.insuplc_admdvs);
                joInsuPatInfo.Add("birthday", Global.pat.brdy);
                joInsuPatInfo.Add("iOtherProvLocal", Global.pat.iOtherProvLocal);
                //封装成基线版接口返参
                JObject joOutput = new JObject();
                //组织baseInfo,否则HIS读卡建档无法获取数据
                JObject joBaseInfo = new JObject();
                joBaseInfo.Add("psn_name", Global.pat.name);
                joBaseInfo.Add("certno", Global.pat.certNO); //Global.pat.certNO
                joBaseInfo.Add("gend", Global.pat.gend);
                joBaseInfo.Add("age", Global.pat.age);
                joBaseInfo.Add("brdy", Global.pat.brdy);
                joBaseInfo.Add("psn_no", Global.pat.psn_no);
                joBaseInfo.Add("insutype", Global.pat.insuType);
                joBaseInfo.Add("insuplc_admdvs", Global.pat.insuplc_admdvs);
                joBaseInfo.Add("psn_type", Global.pat.psn_type);
                joBaseInfo.Add("card_no", Global.pat.card.NO);
                joBaseInfo.Add("mdtrtcertType", "03");
                joBaseInfo.Add("mdtrtcertNO", Global.pat.certNO);
                joBaseInfo.Add("iOtherProvLocal", Global.pat.iOtherProvLocal);
                joOutput.Add("baseinfo", joBaseInfo);
                JObject joSelected = new JObject();
                joSelected.Add("output", joOutput);
                errMsg = joSelected.ToString();
                joRtn = joSelected; //这里返回跟基线版读卡返回的参保信息格式一致 为了建档登记时带出参保信息
                errMsg = joInsuPatInfo.ToString();
                //joRtn = joInsuPatInfo;
                return 0;
            }
            catch (Exception ex)
            {
                errMsg = "获取患者信息发生异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 显示住院患者登记面板,返回登记入参-北京首信医保
        /// 
        /// 
        /// 
        public int GetInPatRegisterFormNew(out string regInfo)
        {
            //调用服务获取住院诊断信息
            string diagnoses;
            if (hIS.getPatDiagnoses(Global.pat, out diagnoses) != 0)
            {
                regInfo = JsonHelper.setExceptionJson(-1, "getPatDiagnoses", diagnoses).ToString();
                return -1;
            }
            JObject joHisRtnInfo = JObject.Parse(diagnoses);
           
            //组织登记入参
            JObject joReg = new JObject();
            try
            {
                string operationCode = "", operationDesc = "";
                JArray jaDiagnoses = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "diseinfo"));
                //JArray jaOperation = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.operationInfo.operationArr"));
                JArray jaOperation = new JArray();
                if (JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.operationInfo.operationArr") != "")
                {
                    jaOperation = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.operationInfo.operationArr"));
                    for (int i = 0; i < jaOperation.Count; i++)
                    {
                        operationCode = operationCode + JsonHelper.getDestValue((JObject)jaOperation[i], "operationCode") + ";";
                        operationDesc = operationDesc + JsonHelper.getDestValue((JObject)jaOperation[i], "operationDesc") + ";";
                    }
                }
                              
                string dscg_maindiag_code = "", dscg_maindiag_name = "";
                //对诊断数组进行转换 转换下主要诊断
                JArray jaConvertedDiagnoses = new JArray();
                JArray jaInPatDiagnoses = new JArray();
                JArray jaOutPatDiagnoses = new JArray();
                                
                for (int i = 0; i < jaDiagnoses.Count; i++)
                {
                    string diag_type = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_type");
                    switch (diag_type)
                    {
                        case "1":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医主要诊断";
                                break;
                            }
                        case "2":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医其他诊断";
                                break;
                            }
                        case "3":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主病诊断";
                                break;
                            }
                        case "4":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主证诊断";
                                break;
                            }
                    }
                    if (jaDiagnoses[i]["diaTypeCode"].ToString() == "ADD") //ADD 入院 OPD 门诊 DIS出院
                    {
                        jaInPatDiagnoses.Add(jaDiagnoses[i]);
                    }
                    if (jaDiagnoses[i]["diaTypeCode"].ToString() == "OPD") //ADD 入院 OPD 门诊 DIS出院
                    {
                        jaOutPatDiagnoses.Add(jaDiagnoses[i]);
                    }
                }
                if (jaInPatDiagnoses.Count > 0)
                {
                    jaConvertedDiagnoses = (JArray)jaInPatDiagnoses.DeepClone();
                }
                else
                {
                    jaConvertedDiagnoses = (JArray)jaOutPatDiagnoses.DeepClone();
                }
                for (int i = 0; i < jaConvertedDiagnoses.Count; i++)
                {
                    jaConvertedDiagnoses[i]["diag_srt_no"] = i + 1;
                    if (jaConvertedDiagnoses[i]["maindiag_flag"].ToString() == "1")
                    {
                        dscg_maindiag_code = jaConvertedDiagnoses[i]["diag_code"].ToString();
                        dscg_maindiag_name = jaConvertedDiagnoses[i]["diag_name"].ToString();
                    }
                }
                //登记面板实例
                OutpatientRegistration frmReg = new OutpatientRegistration();
                DataTable dtInsuType = (DataTable)frmReg.dblkcbxInsuranceType.DataSource;
                int selectedIndex = 0;
                for (int i = 0; i < dtInsuType.Rows.Count; i++)
                {
                    if (dtInsuType.Rows[i]["Code"].ToString() == Global.pat.insuType)
                    {
                        selectedIndex = i;
                        frmReg.dblkcbxInsuranceType.Text = dtInsuType.Rows[i]["Name"].ToString();
                        frmReg.insuType = dtInsuType.Rows[i]["Code"].ToString();
                    }
                }
                DataTable dtMedType = (DataTable)frmReg.dblkcbxMedicalType.DataSource;
                for (int i = 0; i < dtMedType.Rows.Count; i++)
                {
                    if (dtMedType.Rows[i]["Code"].ToString() == "21")
                    {
                        frmReg.dblkcbxMedicalType.Text = dtMedType.Rows[i]["Name"].ToString();
                        frmReg.med_type = dtMedType.Rows[i]["Code"].ToString();
                    }
                }
                frmReg.DtDiagnose = (DataTable)jaConvertedDiagnoses.ToObject(typeof(DataTable));
                DataTable DT = (DataTable)jaConvertedDiagnoses.ToObject(typeof(DataTable));
                string diseCodg = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_code");
                string diseName = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_name");
                Global.pat.disCode = diseCodg;
                Global.pat.disName = diseName;
                Global.pat.OperationCode = operationCode;
                Global.pat.OperationName = operationDesc;
                JObject joMdtrtinfo = new JObject();
                joMdtrtinfo.Add("psn_no", Global.pat.psn_no);          //人员编号
                joMdtrtinfo.Add("insutype", Global.pat.insuType);          //险种类型
                joMdtrtinfo.Add("coner_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.coner_name"));          //联系人姓名
                joMdtrtinfo.Add("tel", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.tel"));          //联系电话
                joMdtrtinfo.Add("begntime", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.begntime"));          //开始时间
                joMdtrtinfo.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);          //就诊凭证类型
                joMdtrtinfo.Add("mdtrt_cert_no", Global.pat.mdtrtcertNO);          //就诊凭证编号
                joMdtrtinfo.Add("med_type", "21");          //医疗类别
                joMdtrtinfo.Add("ipt_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.ipt_no"));          //住院号
                joMdtrtinfo.Add("medrcdno", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.medrcdno"));          //病历号
                joMdtrtinfo.Add("atddr_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no"));          //主治医生编码
                joMdtrtinfo.Add("chfpdr_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name"));          //主诊医师姓名
                joMdtrtinfo.Add("adm_diag_dscr", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_diag_dscr"));          //入院诊断描述
                joMdtrtinfo.Add("adm_dept_codg", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg"));          //入院科室编码
                joMdtrtinfo.Add("adm_dept_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name"));          //入院科室名称
                joMdtrtinfo.Add("adm_bed", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_bed"));          //入院床位
                joMdtrtinfo.Add("dscg_maindiag_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_code"));          //住院主诊断代码
                joMdtrtinfo.Add("dscg_maindiag_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_name"));          //住院主诊断名称
                joMdtrtinfo.Add("main_cond_dscr", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.main_cond_dscr"));          //主要病情描述
                joMdtrtinfo.Add("dise_codg", "");          //病种编码
                joMdtrtinfo.Add("dise_name", "");          //病种名称
                joMdtrtinfo.Add("oprn_oprt_code", operationCode);     //手术操作代码
                joMdtrtinfo.Add("oprn_oprt_name", operationDesc);     //手术操作名称
                joMdtrtinfo.Add("fpsc_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fpsc_no"));          //计划生育服务证号
                joMdtrtinfo.Add("matn_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.matn_type"));          //生育类别
                joMdtrtinfo.Add("birctrl_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_type"));          //计划生育手术类别
                joMdtrtinfo.Add("latechb_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.latechb_flag"));          //晚育标志
                joMdtrtinfo.Add("geso_val", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.geso_val"));          //孕周数
                joMdtrtinfo.Add("fetts", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetts"));          //胎次
                joMdtrtinfo.Add("fetus_cnt", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetus_cnt"));          //胎儿数
                joMdtrtinfo.Add("pret_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.pret_flag"));          //早产标志
                joMdtrtinfo.Add("birctrl_matn_date", "");          //计划生育手术或生育日期 JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_matn_date") 20230228医保中心校验传正确时间或空
                joMdtrtinfo.Add("dise_type_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dise_type_code"));          //病种类型
                joMdtrtinfo.Add("exp_content", "");          //字段扩展
                joMdtrtinfo.Add("insuplc_admdvs", Global.pat.insuplc_admdvs);          //参保地医保区划
                joMdtrtinfo.Add("mdtrtarea_admvs", Global.inf.areaCode);          //就医地医保区划
                joReg.Add("mdtrtinfo", joMdtrtinfo);
                joReg.Add("diseinfo", jaConvertedDiagnoses);
                regInfo = joReg.ToString();
                return 0;
            }
            catch (Exception ex)
            {
                regInfo = "住院登记界面弹框异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 显示住院患者登记面板,返回登记入参
        /// 
        /// 
        /// 
        public int showInPatRegisterForm(out string regInfo)
        {
            //调用服务获取门诊诊断信息
            string diagnoses;
            if (hIS.getPatDiagnoses(Global.pat, out diagnoses) != 0)
            {
                regInfo = JsonHelper.setExceptionJson(-1, "getPatDiagnoses", diagnoses).ToString();
                return -1;
            }
            JObject joHisRtnInfo = JObject.Parse(diagnoses);
            //组织登记入参
            JObject joReg = new JObject();
            try
            {
                JArray jaDiagnoses = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "diseinfo"));
                string dscg_maindiag_code  = "",dscg_maindiag_name = "";
                //  对诊断数组进行转换 转换下主要诊断
                JArray jaConvertedDiagnoses = new JArray();
                JArray jaInPatDiagnoses = new JArray();
                JArray jaOutPatDiagnoses = new JArray();
                for (int i = 0; i < jaDiagnoses.Count; i++)
                {
                  
                    string diag_type = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_type");
                    switch (diag_type)
                    {
                        case "1":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医主要诊断";
                                break;
                            }
                        case "2":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医其他诊断";
                                break;
                            }
                        case "3":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主病诊断";
                                break;
                            }
                        case "4":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主证诊断";
                                break;
                            }
                    }
                    
                    //if (jaDiagnoses[i]["diaTypeCode"].ToString() == "ADD") //ADD 入院 OPD 门诊
                    //{
                    //    jaConvertedDiagnoses.Add(jaDiagnoses[i]);
                    //}
                    if (jaDiagnoses[i]["diaTypeCode"].ToString() == "ADD") //ADD 入院 OPD 门诊
                    {
                        jaInPatDiagnoses.Add(jaDiagnoses[i]);
                    }
                    if (jaDiagnoses[i]["diaTypeCode"].ToString() == "OPD") //ADD 入院 OPD 门诊
                    {
                        jaOutPatDiagnoses.Add(jaDiagnoses[i]);
                    }
                }
                if (jaInPatDiagnoses.Count > 0)
                {
                    jaConvertedDiagnoses = (JArray)jaInPatDiagnoses.DeepClone();
                }
                else 
                {
                    jaConvertedDiagnoses = (JArray)jaOutPatDiagnoses.DeepClone();
                }
                for (int i = 0; i < jaConvertedDiagnoses.Count; i++)
                {
                    jaConvertedDiagnoses[i]["diag_srt_no"] = i + 1;
                    if (jaConvertedDiagnoses[i]["maindiag_flag"].ToString() == "1")
                    {
                        dscg_maindiag_code = jaConvertedDiagnoses[i]["diag_code"].ToString();
                        dscg_maindiag_name = jaConvertedDiagnoses[i]["diag_name"].ToString();
                    }
                }                
                //登记面板实例
                OutpatientRegistration frmReg = new OutpatientRegistration();
     
                DataTable dt = (DataTable)frmReg.dblkcbxInsuranceType.DataSource;
                int selectedIndex = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i]["Code"].ToString() == Global.pat.insuType)
                    {
                        selectedIndex = i;
                        frmReg.dblkcbxInsuranceType.Text = dt.Rows[i]["Name"].ToString();
                        frmReg.insuType = dt.Rows[i]["Code"].ToString();
                    }
                }
                DataTable dtMedType = (DataTable)frmReg.dblkcbxMedicalType.DataSource;
                for (int i = 0; i < dtMedType.Rows.Count; i++)
                {
                    if (dtMedType.Rows[i]["Code"].ToString() == "21")
                    {
                        frmReg.dblkcbxMedicalType.Text = dtMedType.Rows[i]["Name"].ToString();
                        frmReg.med_type = dtMedType.Rows[i]["Code"].ToString();
                    }
                }
                frmReg.DtDiagnose = (DataTable)jaConvertedDiagnoses.ToObject(typeof(DataTable));
                //展示登记面板
                if (frmReg.ShowDialog() == DialogResult.OK)
                {
                    string diseCodg ="",diseName = "";
                    diseCodg = frmReg.diseCodg;
                    diseName = frmReg.diseName;
                    JObject joMdtrtinfo = new JObject();
                    joMdtrtinfo.Add("psn_no", Global.pat.psn_no);          //人员编号
                    joMdtrtinfo.Add("insutype", Global.pat.insuType);          //险种类型
                    joMdtrtinfo.Add("coner_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.coner_name"));          //联系人姓名
                    joMdtrtinfo.Add("tel", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.tel"));          //联系电话
                    joMdtrtinfo.Add("begntime", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.begntime"));          //开始时间
                    joMdtrtinfo.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);          //就诊凭证类型
                    joMdtrtinfo.Add("mdtrt_cert_no", Global.pat.mdtrtcertNO);          //就诊凭证编号
                    joMdtrtinfo.Add("med_type", frmReg.med_type);          //医疗类别
                    joMdtrtinfo.Add("ipt_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.ipt_no"));          //住院号
                    joMdtrtinfo.Add("medrcdno", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.medrcdno"));          //病历号
                    joMdtrtinfo.Add("atddr_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no"));          //主治医生编码
                    joMdtrtinfo.Add("chfpdr_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name"));          //主诊医师姓名
                    joMdtrtinfo.Add("adm_diag_dscr", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_diag_dscr"));          //入院诊断描述
                    joMdtrtinfo.Add("adm_dept_codg", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg"));          //入院科室编码
                    joMdtrtinfo.Add("adm_dept_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name"));          //入院科室名称
                    joMdtrtinfo.Add("adm_bed", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_bed"));          //入院床位
                    joMdtrtinfo.Add("dscg_maindiag_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_code"));          //住院主诊断代码
                    joMdtrtinfo.Add("dscg_maindiag_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_name"));          //住院主诊断名称
                    //joMdtrtinfo.Add("dscg_maindiag_code", dscg_maindiag_code);          //住院主诊断代码
                    //joMdtrtinfo.Add("dscg_maindiag_name", dscg_maindiag_name);          //住院主诊断名称
                    joMdtrtinfo.Add("main_cond_dscr", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.main_cond_dscr"));          //主要病情描述
                    joMdtrtinfo.Add("dise_codg", diseCodg);          //病种编码
                    joMdtrtinfo.Add("dise_name", diseName);          //病种名称
                    joMdtrtinfo.Add("oprn_oprt_code", frmReg.oprn_oprt_code);          //手术操作代码
                    joMdtrtinfo.Add("oprn_oprt_name", frmReg.oprn_oprt_name);          //手术操作名称
                    joMdtrtinfo.Add("fpsc_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fpsc_no"));          //计划生育服务证号
                    joMdtrtinfo.Add("matn_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.matn_type"));          //生育类别
                    joMdtrtinfo.Add("birctrl_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_type"));          //计划生育手术类别
                    joMdtrtinfo.Add("latechb_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.latechb_flag"));          //晚育标志
                    joMdtrtinfo.Add("geso_val", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.geso_val"));          //孕周数
                    joMdtrtinfo.Add("fetts", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetts"));          //胎次
                    joMdtrtinfo.Add("fetus_cnt", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetus_cnt"));          //胎儿数
                    joMdtrtinfo.Add("pret_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.pret_flag"));          //早产标志
                    joMdtrtinfo.Add("birctrl_matn_date", "");          //计划生育手术或生育日期 JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_matn_date") 20230228医保中心校验传正确时间或空
                    joMdtrtinfo.Add("dise_type_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dise_type_code"));          //病种类型
                    joMdtrtinfo.Add("exp_content", "");          //字段扩展
                    joMdtrtinfo.Add("insuplc_admdvs", Global.pat.insuplc_admdvs);          //参保地医保区划
                    joMdtrtinfo.Add("mdtrtarea_admvs", Global.inf.areaCode);          //就医地医保区划
                    joReg.Add("mdtrtinfo", joMdtrtinfo);
                    joReg.Add("diseinfo", jaConvertedDiagnoses);
                    Global.pat.disCode = diseCodg;
                    Global.pat.disName = diseName;
                    Global.pat.medType = frmReg.med_type;
                    regInfo = joReg.ToString();
                    return 0;
                }
                else
                {
                    regInfo = "收费员取消操作!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                regInfo = "登记界面显示异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 校验HIS信息与医保参保信息姓名是否一致
        /// 
        /// 
        /// 
        /// 
        public int checkName(string insuName, out string errMsg)
        {
            try
            {
                errMsg = "";
                string hisPatBaseInfo = "";
                if (hIS.GetHisPatBaseInfo(out hisPatBaseInfo) != 0)
                {
                    errMsg = hisPatBaseInfo;
                    return -1;
                }
                string hisPatName = JsonHelper.getDestValue(JObject.Parse(hisPatBaseInfo), "result.patName");
                if (hisPatName != insuName)
                {
                    errMsg = "患者姓名(" + hisPatName + ")与参保人姓名(" + insuName + ")不一致,请检查!";
                    return -1;
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                errMsg = "核对HIS与医保平台姓名一致性发生异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 显示出院登记界面,返回出院登记和结算的入参
        /// 
        /// 
        /// 
        /// 
        public int showDischargeRegisterForm(string funNO, JObject joSumFee, JObject joHisRtnInfo, out string outParam)
        {
            outParam = "";
            string errMsg;
            try
            {
                JArray jaDiagnoses = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "diseinfo"));
                //选择结算方式等
                OutpatientRegistration frmReg = new OutpatientRegistration();
                frmReg.dblkcbxInsuranceType.Enabled = true;
                DataTable dt = (DataTable)frmReg.dblkcbxInsuranceType.DataSource;
                int selectedIndex = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i]["Code"].ToString() == Global.pat.insuType)
                    {
                        selectedIndex = i;
                        frmReg.dblkcbxInsuranceType.Text = dt.Rows[i]["Name"].ToString();
                        frmReg.insuType = dt.Rows[i]["Code"].ToString();
                    }
                }
                dt = (DataTable)frmReg.dblkcbxMedicalType.DataSource;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i]["Code"].ToString() == Global.pat.medType)
                    {
                        frmReg.dblkcbxMedicalType.Text = dt.Rows[i]["Name"].ToString();
                        frmReg.med_type = dt.Rows[i]["Code"].ToString();
                    }
                }
                if (Global.pat.RYorCY == "1")
                {
                    DataTable dtMedType = (DataTable)frmReg.dblkcbxMedicalType.DataSource;
                    for (int i = 0; i < dtMedType.Rows.Count; i++)
                    {
                        if (dtMedType.Rows[i]["Code"].ToString() == "21")
                        {
                            frmReg.dblkcbxMedicalType.Text = dtMedType.Rows[i]["Name"].ToString();
                            frmReg.med_type = dtMedType.Rows[i]["Code"].ToString();
                        }
                    }
                }
                if (frmReg.dblkcbxInsuranceType.Text != "")
                    frmReg.dblkcbxInsuranceType.Enabled = false;
                if (frmReg.dblkcbxMedicalType.Text != "")
                    frmReg.dblkcbxMedicalType.Enabled = false;
                //  对诊断数组进行转换 转换下主要诊断
                JArray jaConvertedDiagnoses = new JArray();
                string dscg_maindiag_code = "", dscg_maindiag_name = "";
                for (int i = 0; i < jaDiagnoses.Count; i++)
                {
                    string diag_type = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_type");
                    switch (diag_type)
                    {
                        case "1":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医主要诊断";
                                break;
                            }
                        case "2":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医其他诊断";
                                break;
                            }
                        case "3":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主病诊断";
                                break;
                            }
                        case "4":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主证诊断";
                                break;
                            }
                    }
                    if (jaDiagnoses[i]["diaTypeCode"].ToString() == "ADD") //ADD 入院 OPD 门诊
                    {
                        jaConvertedDiagnoses.Add(jaDiagnoses[i]);
                    }
                }
                for (int i = 0; i < jaConvertedDiagnoses.Count; i++)
                {
                    jaConvertedDiagnoses[i]["diag_srt_no"] = i + 1;
                    if (jaConvertedDiagnoses[i]["maindiag_flag"].ToString() == "1")
                    {
                        dscg_maindiag_code = jaConvertedDiagnoses[i]["diag_code"].ToString();
                        dscg_maindiag_name = jaConvertedDiagnoses[i]["diag_name"].ToString();
                    }
                    //增加就诊ID
                    jaConvertedDiagnoses[i]["mdtrt_id"] = new JObject();
                    jaConvertedDiagnoses[i]["mdtrt_id"] = Global.pat.mdtrtID;
                }
                frmReg.DtDiagnose = (DataTable)jaConvertedDiagnoses.ToObject(typeof(DataTable));
                if (frmReg.ShowDialog() == DialogResult.OK)
                {
                    string diseCodg = "", diseName = "";
                    //哈尔滨要求必须传病种。普通疾病传主诊断
                    if (string.IsNullOrEmpty(frmReg.diseCodg))
                    {
                        diseCodg = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_code");
                    };
                    if (string.IsNullOrEmpty(frmReg.diseName))
                    {
                        diseName = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_name");
                    };
                    //出院登记入参
                    //单病种出院登记 病种信息取入院登记入参
                    if (Global.pat.RYorCY == "2")
                    {
                        if (Global.pat.medType == "26")
                        {
                            diseCodg = Global.pat.DiseasecCode;
                            diseName = Global.pat.DiseasecName;
                        }
                        else
                        {
                            frmReg.insuType = Global.pat.insuType;                            
                        }                        
                    }
                    JObject joDscgInfo = new JObject();
                    joDscgInfo.Add("mdtrt_id", Global.pat.mdtrtID);
                    joDscgInfo.Add("psn_no", Global.pat.psn_no);          //人员编号
                    joDscgInfo.Add("insutype", frmReg.insuType);          //险种类型
                    //joDscgInfo.Add("coner_name", JsonHelper.getJsonValue(joHisPatInfo, "coner_name"));          //联系人姓名
                    //joDscgInfo.Add("tel", JsonHelper.getJsonValue(joHisPatInfo, "tel"));          //联系电话
                    joDscgInfo.Add("endtime", Global.Set.hisDischargeTime);          //结束时间DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                    joDscgInfo.Add("dise_codg", diseCodg);          //病种编码
                    joDscgInfo.Add("dise_name", diseName);          //病种名称
                    joDscgInfo.Add("oprn_oprt_code", frmReg.oprn_oprt_code);          //手术操作代码
                    joDscgInfo.Add("oprn_oprt_name", frmReg.oprn_oprt_name);          //手术操作名称
                    joDscgInfo.Add("fpsc_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fpsc_no"));          //计划生育服务证号
                    joDscgInfo.Add("matn_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.matn_type"));          //生育类别
                    joDscgInfo.Add("birctrl_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_type"));          //计划生育手术类别
                    joDscgInfo.Add("latechb_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.latechb_flag"));          //晚育标志
                    joDscgInfo.Add("geso_val", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.geso_val"));          //孕周数
                    joDscgInfo.Add("fetts", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetts"));          //胎次
                    joDscgInfo.Add("fetus_cnt", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.fetus_cnt"));          //胎儿数
                    joDscgInfo.Add("pret_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.pret_flag"));          //早产标志
                    joDscgInfo.Add("birctrl_matn_date", "");          //计划生育手术或生育日期 JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_matn_date") 20230228医保中心校验传正确时间或空
                    joDscgInfo.Add("cop_flag", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dise_type_code"));          //伴有并发症标志
                    joDscgInfo.Add("dscg_dept_codg", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg"));          //出院科室编码
                    joDscgInfo.Add("dscg_dept_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name"));          //出院科室名称
                    joDscgInfo.Add("dscg_bed", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_bed"));          //出院床位
                    joDscgInfo.Add("dscg_way", "1");          //离院方式
                    joDscgInfo.Add("die_date", "");          //死亡日期
                    joDscgInfo.Add("exp_content", "");          //字段扩展
                    joDscgInfo.Add("insuplc_admdvs", Global.pat.insuplc_admdvs);          //参保地医保区划
                    joDscgInfo.Add("mdtrtarea_admvs", Global.inf.areaCode);          //就医地医保区划
                    JObject joRegInpar = new JObject();
                    joRegInpar.Add("dscginfo", joDscgInfo);
                    joRegInpar.Add("diseinfo", jaConvertedDiagnoses);
                    //结算入参
                    JObject joSetlInpar = new JObject();
                    joSetlInpar.Add("psn_no", Global.pat.psn_no);
                    joSetlInpar.Add("chrg_bchno", Global.pat.adm_Dr.ToString());
                    joSetlInpar.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);
                    joSetlInpar.Add("mdtrt_cert_no", Global.pat.mdtrtcertNO);
                    joSetlInpar.Add("med_type", Global.pat.medType);
                    joSetlInpar.Add("medfee_sumamt", JsonHelper.getDestValue(joSumFee, "data.Sumamt"));
                    joSetlInpar.Add("psn_setlway", frmReg.psn_setlway); //结算方式
                    joSetlInpar.Add("mdtrt_id", Global.pat.mdtrtID);
                    joSetlInpar.Add("acct_used_flag", frmReg.personAccountUsedFlag);//个人账户使用标志
                    joSetlInpar.Add("insutype", frmReg.insuType);//险种类型
                    //joSetlInpar.Add("insuplc_admdvs", Global.pat.insuplc_admdvs);
                    //joSetlInpar.Add("mdtrtarea_admvs", Global.inf.areaCode);
                    joSetlInpar.Add("invono", "");
                    joSetlInpar.Add("mid_setl_flag", "0");
                    joSetlInpar.Add("fulamt_ownpay_amt", JsonHelper.getDestValue(joSumFee, "data.FullOwnPayAmount"));
                    joSetlInpar.Add("overlmt_selfpay", JsonHelper.getDestValue(joSumFee, "data.OverLimitAmount"));
                    joSetlInpar.Add("preselfpay_amt", JsonHelper.getDestValue(joSumFee, "data.PreSelfPayAmount"));
                    joSetlInpar.Add("dscgTime", Global.Set.hisDischargeTime);
                    JObject joDataExp = new JObject();
                    joDataExp.Add("acct_payamt", "0.00");
                    joDataExp.Add("cla_trt_flag", "");
                    joSetlInpar.Add("exp_content", joDataExp); //11111
                    JObject joOut = new JObject();
                    joOut.Add("DischargeRegister", joRegInpar);
                    joOut.Add("Settlement", joSetlInpar);
                    joOut.Add("errorCode", 0);
                    outParam = joOut.ToString();
                    return 0;
                }
                else
                {
                    outParam = "收款员取消结算";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                outParam = "showDischargeRegisterForm 异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 门诊登记-北京市医保接口
        /// 
        /// 
        /// 
        public int showOutPatRegisterForm(out string regInfo,out string presInfo)
        {
            presInfo = "";
            //调用服务获取门诊诊断信息
            string diagnoses;
            if (hIS.getPatDiagnoses(Global.pat, out diagnoses) != 0)
            {
                regInfo = JsonHelper.setExceptionJson(-1, "getPatDiagnoses", diagnoses).ToString();
                return -1;
            }
                                  
            //组织入参
            JObject joReg = new JObject();
            try
            {
                JObject joHisRtnInfo = JObject.Parse(diagnoses);
                JArray jaDiagnoses = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "diseinfo"));
                JArray jaSubstituteInfo = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "substituteInfo")); //处方信息
                //登记面板实例
                OutpatientRegistration frmReg = new OutpatientRegistration();
                //frmReg.dblkcbxSettelmentWay.Enabled = false;
                //险种类型
                DataTable dtInsuType = (DataTable)frmReg.dblkcbxInsuranceType.DataSource;
                for (int i = 0; i < dtInsuType.Rows.Count; i++)
                {
                    if (dtInsuType.Rows[i]["Code"].ToString() == Global.pat.insuType) //默认病人的险种类型
                    {
                        frmReg.dblkcbxInsuranceType.Text = dtInsuType.Rows[i]["Name"].ToString();
                        frmReg.insuType = dtInsuType.Rows[i]["Code"].ToString();
                    }
                }
                //医疗类别 operationType RegisterOP 门诊挂号 SettlementOP门诊收费
                string cureType;
                if (Global.inf.operationType == "RegisterOP")
                {
                    cureType = "17";                    
                }
                else
                {
                    cureType = "11";
                    if (jaSubstituteInfo.Count == 0)
                    {
                        regInfo = JsonHelper.setExceptionJson(-1, "", "05110014返回处方信息为空").ToString();
                        return -1;
                    }
                }
                DataTable dtMedType = (DataTable)frmReg.dblkcbxMedicalType.DataSource;
                for (int i = 0; i < dtMedType.Rows.Count; i++)
                {
                    if (dtMedType.Rows[i]["Code"].ToString() == cureType) //默认医疗类别-普通挂号
                    {
                        frmReg.dblkcbxMedicalType.Text = dtMedType.Rows[i]["Name"].ToString();
                        frmReg.med_type = dtMedType.Rows[i]["Code"].ToString();
                        frmReg.med_type_name = dtMedType.Rows[i]["Name"].ToString();
                    }
                }             
                //转换下主要诊断
                for (int i = 0; i < jaDiagnoses.Count; i++)
                {
                    string diag_type = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_type");
                    switch (diag_type)
                    {
                        case "1":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医主要诊断";
                                break;
                            }
                        case "2":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医其他诊断";
                                break;
                            }
                        case "3":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主病诊断";
                                break;
                            }
                        case "4":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主证诊断";
                                break;
                            }
                    }
                }
                frmReg.DtDiagnose = (DataTable)jaDiagnoses.ToObject(typeof(DataTable));
                //展示登记面板
                if (frmReg.ShowDialog() == DialogResult.OK)
                {
                    string diseCodg = "", diseName = "";
                
                    if (string.IsNullOrEmpty(frmReg.diseCodg))
                    {
                        diseCodg = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_code");
                    }
                    if (string.IsNullOrEmpty(frmReg.diseName))
                    {
                        diseName = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_name");
                    }
                    Global.Set.clearingOrgan = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg");
                    string LocName = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name");
                    string DocLvDesc = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.doclv");   //医师职称
                    string doclv = "";
                    if ((DocLvDesc.Contains("主治")) ||(DocLvDesc.Contains("住院")))
                        doclv = "01";
                    else if (DocLvDesc.Contains("副主任"))
                        doclv = "02";
                    else if (DocLvDesc.Contains("主任"))
                        doclv = "03";
                    else if (DocLvDesc.Contains("专家"))
                        doclv = "04";
                    //组织处方明细参数
                    string sCFXX = string.Empty;
                    if (frmReg.med_type_name.Contains("挂号"))
                    {
                        string prescNo = JsonHelper.getDestValue((JObject)jaSubstituteInfo[0], "prescNo");
                        sCFXX = "" +
                                "1" +
                                ""+ prescNo + "" +  // name="处方序号"
                                "" + DateTime.Now.ToString("yyyyMMddHHmmss") + "" + // name="处方日期时间" /
                                "" +// name="诊断名称" /
                                "" + //  name="诊断编码" /
                                "" + // name="病历信息" /
                                "10" +// name="就诊科别代码" /
                                "眼科" +// name="his就诊科别名称" /
                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name") + "" + //本院科别名称
                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no") + "" +  // name="医师编号" /
                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name") + "" + // name="医师姓名" /
                                "1" + //  name="处方类别(1:医保内处方 2:医保外处方)" /
                                "0" + // name="代开药标识"/
                                "" + //name='代开药人员姓名'
                                "" + //name='代开药人员证件类型'
                                "" + //name='代开药人员证件号码
                                "" +//挂号确认流水号   确认挂号时传空 Global.pat.mdtrtID
                                "1" + //单据类型(1-挂号;2-西药或中成药处方;4-中草药处方;5-检验治疗;)
                                ""+ doclv + "" + //医师等级 01主治医师 02副主任医师 03主任医师 04专家  异地必传参数
                                "";
                    }
                    else 
                    {
                        //查询患者当日挂号结算数据
                        string sqlStr = " SELECT top 1 * FROM  BS_MedInsuSettlement "
                                      + " WHERE billType=1 And ValidFlag=1 and MedicalType in ('17','18')"
                                      + " and Hospital_Dr=" + Global.inf.hospitalDr
                                      + " and PersonnelNO='" + Global.pat.psn_no + "'"
                                      + " and CertificateNO='" + Global.pat.certNO + "'"
                                     // + " and ClearingOrgan='" + Global.Set.clearingOrgan + "'"   院内存在不同科室之间频繁转诊情况 不能判断科室
                                      + " and DateDiff(day,SettlementDateTime,getdate())=0"
                                      + " Order By ID DESC ";
                        JObject joSql = new JObject();
                        joSql.Add("sqlStr", sqlStr);
                        JObject joSettlInfo = mIS.QuerySettlementInfo(joSql);
                        Global.pat.SettID_HISJSB = JsonHelper.getDestValue(joSettlInfo, "result.data[0].SettlementID");
                        if (Global.pat.SettID_HISJSB == "")
                        {
                            regInfo = JsonHelper.setExceptionJson(-1, "", "未找到该患者当日【" + LocName + "】有效的挂号信息").ToString();
                            return -1;
                        }
                        //多处方信息
                        for (int i = 0; i < jaSubstituteInfo.Count; i++)
                        {
                            string prescNo = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "prescNo"); //处方序号
                            string presDateTime = DateTime.Parse(JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "presDateTime")).ToString("yyyyMMddHHmmss"); //
                            string agentName = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "agentName"); //代开药人姓名
                            string agentIDCardNo = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "agentIDCardNo"); //代开药人证件号码
                            string recipetype = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "recipeType").ToString(); //"处方类别(1:医保内处方 2:医保外处方)" 
                            string billstype = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "billstype").ToString(); //单据类型 (1-挂号;2-西药或中成药处方;4-中草药处方;5-检验治疗;
                            string helpmedicineflag = "0", idtype = "";
                            if ((billstype == "0") || (billstype == ""))
                                billstype = "5";
                            if (agentName != "")
                            {
                                helpmedicineflag = "1";
                                idtype = "1";
                            }
                            sCFXX = sCFXX + "" +
                                    "1" +
                                    "" + prescNo + "" +  // name="处方序号"
                                    "" + presDateTime + "" + // name="处方日期时间" /
                                    "" + diseName + "" +// name="诊断名称" /
                                    "" + diseCodg + "" + //  name="诊断编码" /
                                    "" + // name="病历信息" /
                                    "10" +// name="就诊科别代码" /
                                    "眼科" +// name="his就诊科别名称" /
                                    "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name") + "" + //本院科别名称
                                    "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no") + "" +  // name="医师编号" /
                                    "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name") + "" + // name="医师姓名" /
                                    ""+ recipetype + "" + //  name="处方类别(1:医保内处方 2:医保外处方)" /
                                    ""+ helpmedicineflag + "" + // name='代开药标识'/
                                    ""+ agentName + "" + //name='代开药人员姓名'
                                    ""+ idtype + "" + //name='代开药人员证件类型'
                                    ""+ agentIDCardNo + "" + //name='代开药人员证件号码'
                                    "" + Global.pat.SettID_HISJSB + "" +//挂号确认流水号  收费必传 查病人当日挂号结算流水号
                                    ""+ billstype + "" + //单据类型 (1-挂号;2-西药或中成药处方;4-中草药处方;5-检验治疗;
                                    "" + doclv + "" + //医师等级 01主治医师 02副主任医师 03主任医师 04专家  异地必传参数
                                    "";
                        }
                    }
                    presInfo = sCFXX;
                    //组织挂号入参
                    JObject joRegInpar = new JObject();
                    string occurTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    joRegInpar.Add("psn_no", Global.pat.psn_no);
                    joRegInpar.Add("insutype", frmReg.insuType);
                    joRegInpar.Add("begntime", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.begntime")); //挂号时间  这里之所以不取当前时间是因为就诊信息上传会关联判断挂号的时间DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                    joRegInpar.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);
                    joRegInpar.Add("mdtrt_cert_no", Global.pat.mdtrtcertNO);
                    joRegInpar.Add("ipt_otp_no", Global.pat.adm_Dr);
                    joRegInpar.Add("atddr_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no"));
                    joRegInpar.Add("dr_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name"));
                    joRegInpar.Add("dept_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg"));
                    joRegInpar.Add("dept_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name"));
                    joRegInpar.Add("exp_content", "");
                    joRegInpar.Add("caty", "72");
                    joReg.Add("data", joRegInpar);
                    //组织就诊信息入参
                    JObject joMdtrtinfo = new JObject();
                    for (int i = 0; i < jaDiagnoses.Count; i++)
                    {
                        jaDiagnoses[i]["vali_flag"] = new JObject();
                        jaDiagnoses[i]["vali_flag"] = "1";
                    }
                    joMdtrtinfo.Add("mdtrt_id", Global.pat.mdtrtID);
                    joMdtrtinfo.Add("psn_no", Global.pat.psn_no);          //人员编号
                    Global.pat.medType = frmReg.med_type;
                    joMdtrtinfo.Add("med_type", frmReg.med_type);          //医疗类别
                    joMdtrtinfo.Add("begntime", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.begntime"));          //开始时间
                    joMdtrtinfo.Add("main_cond_dscr", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.main_cond_dscr"));          //主要病情描述
                    joMdtrtinfo.Add("dise_codg", diseCodg);          //病种编码
                    joMdtrtinfo.Add("dise_name", diseName);          //病种名称
                    joMdtrtinfo.Add("birctrl_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_type"));          //计划生育手术类别
                    joMdtrtinfo.Add("birctrl_matn_date", "");          //计划生育手术或生育日期 JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_matn_date") 20230228医保中心校验传正确时间或空
                    joMdtrtinfo.Add("matn_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.matn_type"));          //生育类别
                    joMdtrtinfo.Add("geso_val", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.geso_val"));            //孕周数
                    joMdtrtinfo.Add("exp_content", "");          //字段扩展
                    //组织结算入参
                    JObject joSetlInpar = new JObject();
                    joSetlInpar.Add("psn_no", Global.pat.psn_no);
                    joSetlInpar.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);
                    joSetlInpar.Add("mdtrt_cert_no", Global.pat.mdtrtcertNO);
                    joSetlInpar.Add("med_type", Global.pat.medType);
                    joSetlInpar.Add("medfee_sumamt", "");
                    joSetlInpar.Add("psn_setlway", frmReg.psn_setlway); //结算方式
                    joSetlInpar.Add("mdtrt_id", Global.pat.mdtrtID);
                    joSetlInpar.Add("chrg_bchno", Global.pat.adm_Dr.ToString());
                    joSetlInpar.Add("acct_used_flag", frmReg.personAccountUsedFlag);//个人账户使用标志
                    joSetlInpar.Add("insutype", frmReg.insuType);//险种类型
                    joSetlInpar.Add("pub_hosp_rfom_flag", "");
                    joSetlInpar.Add("exp_content", "");
                    joReg.Add("mdtrtinfo", joMdtrtinfo);
                    joReg.Add("diseinfo", jaDiagnoses);
                    joReg.Add("settlement", joSetlInpar);
                    regInfo = joReg.ToString();
                    return 0;
                }
                else
                {
                    regInfo = "收费员取消操作!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                regInfo = "登记界面显示异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 门诊登记-北京市医保接口
        /// 
        /// 
        /// 
        public int showOutPatRegisterFormNew(JObject jo, out string regInfo, out string presInfo)
        {
            presInfo = "";
            //调用服务获取门诊诊断信息
            string diagnoses;
            if (hIS.getPatDiagnoses(Global.pat, out diagnoses) != 0)
            {
                regInfo = JsonHelper.setExceptionJson(-1, "getPatDiagnoses", diagnoses).ToString();
                return -1;
            }
            //组织入参
            JObject joReg = new JObject();
            try
            {
                JObject joHisRtnInfo = JObject.Parse(diagnoses);
                JArray jaDiagnoses = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "diseinfo"));
                JArray jaSubstituteInfo = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "substituteInfo")); //处方信息
    
                //登记面板实例
                OutpatientRegistrationRegisterOP frmReg = new OutpatientRegistrationRegisterOP(jo, Global.pat.iOtherProvLocal);
                //frmReg.dblkcbxSettelmentWay.Enabled = false;
                //险种类型
                DataTable dtInsuType = (DataTable)frmReg.dblkcbxInsuranceType.DataSource;
                for (int i = 0; i < dtInsuType.Rows.Count; i++)
                {
                    if (dtInsuType.Rows[i]["Code"].ToString() == Global.pat.insuType) //默认病人的险种类型
                    {
                        frmReg.dblkcbxInsuranceType.Text = dtInsuType.Rows[i]["Name"].ToString();
                        frmReg.insuType = dtInsuType.Rows[i]["Code"].ToString();
                    }
                }
                //医疗类别 operationType RegisterOP 门诊挂号 SettlementOP门诊收费
                string cureType;
                if (Global.inf.operationType == "RegisterOP")
                {
                    cureType = "17";
                }
                else
                {
                    cureType = "11";
                    if (jaSubstituteInfo.Count == 0)
                    {
                        regInfo = JsonHelper.setExceptionJson(-1, "", "05110014返回处方信息为空").ToString();
                        return -1;
                    }
                }
                DataTable dtMedType = (DataTable)frmReg.dblkcbxMedicalType.DataSource;
                for (int i = 0; i < dtMedType.Rows.Count; i++)
                {
                    if (dtMedType.Rows[i]["Code"].ToString() == cureType) //默认医疗类别-普通挂号
                    {
                        frmReg.dblkcbxMedicalType.Text = dtMedType.Rows[i]["Name"].ToString();
                        frmReg.med_type = dtMedType.Rows[i]["Code"].ToString();
                        frmReg.med_type_name = dtMedType.Rows[i]["Name"].ToString();
                    }
                }
                //转换下主要诊断
                for (int i = 0; i < jaDiagnoses.Count; i++)
                {
                    string diag_type = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_type");
                    switch (diag_type)
                    {
                        case "1":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医主要诊断";
                                break;
                            }
                        case "2":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "西医其他诊断";
                                break;
                            }
                        case "3":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主病诊断";
                                break;
                            }
                        case "4":
                            {
                                jaDiagnoses[i]["diag_type_name"] = new JObject();
                                jaDiagnoses[i]["diag_type_name"] = "中医主证诊断";
                                break;
                            }
                    }
                }
                frmReg.DtDiagnose = (DataTable)jaDiagnoses.ToObject(typeof(DataTable));
                //展示登记面板
                if (frmReg.ShowDialog() == DialogResult.OK)
                {
                    string diseCodg = "", diseName = "";
                    if (string.IsNullOrEmpty(frmReg.diseCodg))
                    {
                        diseCodg = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_code");
                    }
                    if (string.IsNullOrEmpty(frmReg.diseName))
                    {
                        diseName = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.dscg_maindiag_name");
                    }
                    Global.Set.clearingOrgan = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg");
                    string LocName = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name");
                    string DocLvDesc = JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.doclv");   //医师职称
                    string doclv = "";
                    if ((DocLvDesc.Contains("主治")) || (DocLvDesc.Contains("住院")))
                        doclv = "01";
                    else if (DocLvDesc.Contains("副主任"))
                        doclv = "02";
                    else if (DocLvDesc.Contains("主任"))
                        doclv = "03";
                    else if (DocLvDesc.Contains("专家"))
                        doclv = "04";
                    //组织处方明细参数
                    string sCFXX = string.Empty;
                    if (frmReg.med_type_name.Contains("挂号"))
                    {
                        string prescNo = JsonHelper.getDestValue((JObject)jaSubstituteInfo[0], "prescNo");
                        sCFXX = "" +
                                "1" +
                                "" + prescNo + "" +  // name="处方序号"
                                "" + DateTime.Now.ToString("yyyyMMddHHmmss") + "" + // name="处方日期时间" /
                                "" +// name="诊断名称" /
                                "" + //  name="诊断编码" /
                                "" + // name="病历信息" /
                                "10" +// name="就诊科别代码" /
                                "眼科" +// name="his就诊科别名称" /
                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name") + "" + //本院科别名称
                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no") + "" +  // name="医师编号" /
                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name") + "" + // name="医师姓名" /
                                "1" + //  name="处方类别(1:医保内处方 2:医保外处方)" /
                                "0" + // name="代开药标识"/
                                "" + //name='代开药人员姓名'
                                "" + //name='代开药人员证件类型'
                                "" + //name='代开药人员证件号码
                                "" +//挂号确认流水号   确认挂号时传空 Global.pat.mdtrtID
                                "1" + //单据类型(1-挂号;2-西药或中成药处方;4-中草药处方;5-检验治疗;)
                                "" + doclv + "" + //医师等级 01主治医师 02副主任医师 03主任医师 04专家  异地必传参数
                                "";
                    }
                    else
                    {
                        //查询患者当日挂号结算数据
                        string sqlStr = " SELECT top 1 * FROM  BS_MedInsuSettlement "
                                      + " WHERE billType=1 And ValidFlag=1 and MedicalType in ('17','18')"
                                      + " and Hospital_Dr=" + Global.inf.hospitalDr
                                      + " and PersonnelNO='" + Global.pat.psn_no + "'"
                                      + " and CertificateNO='" + Global.pat.certNO + "'"
                                      // + " and ClearingOrgan='" + Global.Set.clearingOrgan + "'"   院内存在不同科室之间频繁转诊情况 不能判断科室
                                      + " and DateDiff(day,SettlementDateTime,getdate())=0"
                                      + " Order By ID DESC ";
                        JObject joSql = new JObject();
                        joSql.Add("sqlStr", sqlStr);
                        JObject joSettlInfo = mIS.QuerySettlementInfo(joSql);
                        Global.pat.SettID_HISJSB = JsonHelper.getDestValue(joSettlInfo, "result.data[0].SettlementID");
                        if (Global.pat.SettID_HISJSB == "")
                        {
                            regInfo = JsonHelper.setExceptionJson(-1, "", "未找到该患者当日【" + LocName + "】有效的挂号信息").ToString();
                            return -1;
                        }
                        //多处方信息
                        for (int i = 0; i < jaSubstituteInfo.Count; i++)
                        {
                            string prescNo = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "prescNo"); //处方序号
                            string presDateTime = DateTime.Parse(JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "presDateTime")).ToString("yyyyMMddHHmmss"); //
                            string agentName = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "agentName"); //代开药人姓名
                            string agentIDCardNo = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "agentIDCardNo"); //代开药人证件号码
                            string recipetype = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "recipeType").ToString(); //"处方类别(1:医保内处方 2:医保外处方)" 
                            string billstype = JsonHelper.getDestValue((JObject)jaSubstituteInfo[i], "billstype").ToString(); //单据类型 (1-挂号;2-西药或中成药处方;4-中草药处方;5-检验治疗;
                            string helpmedicineflag = "0", idtype = "";
                            if ((billstype == "0") || (billstype == ""))
                                billstype = "5";
                            if (agentName != "")
                            {
                                helpmedicineflag = "1";
                                idtype = "1";
                            }
                            //sCFXX = sCFXX + "" +
                            //                "1" +
                            //                "" + prescNo + "" +  // name="处方序号"
                            //                "" + presDateTime + "" + // name="处方日期时间" /
                            //                "" + diseName + "" +// name="诊断名称" /
                            //                "" + diseCodg + "" + //  name="诊断编码" /
                            //                "" + // name="病历信息" /
                            //                "10" +// name="就诊科别代码" /
                            //                "眼科" +// name="his就诊科别名称" /
                            //                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name") + "" + //本院科别名称
                            //                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no") + "" +  // name="医师编号" /
                            //                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name") + "" + // name="医师姓名" /
                            //                "" + recipetype + "" + //  name="处方类别(1:医保内处方 2:医保外处方)" /
                            //                "" + helpmedicineflag + "" + // name='代开药标识'/
                            //                "" + agentName + "" + //name='代开药人员姓名'
                            //                "" + idtype + "" + //name='代开药人员证件类型'
                            //               "" + agentIDCardNo + "" + //name='代开药人员证件号码'
                            //               "" + Global.pat.SettID_HISJSB + "" +//挂号确认流水号  收费必传 查病人当日挂号结算流水号
                            //               "" + billstype + "" + //单据类型 (1-挂号;2-西药或中成药处方;4-中草药处方;5-检验治疗;
                            //               "" + doclv + "" + //医师等级 01主治医师 02副主任医师 03主任医师 04专家  异地必传参数
                            //               "";
                            //诊断信息
                            for (int j = 0; j < jaDiagnoses.Count; j++)
                            {
                                string diag_srt_no = JsonHelper.getDestValue((JObject)jaDiagnoses[j], "diag_srt_no").ToString();
                                string diag_code = JsonHelper.getDestValue((JObject)jaDiagnoses[j], "diag_code").ToString();
                                string diag_name = JsonHelper.getDestValue((JObject)jaDiagnoses[j], "diag_name").ToString();
                                sCFXX = sCFXX + "" +
                                                ""+ diag_srt_no + "" +
                                                "" + prescNo + "" +  // name="处方序号"
                                                "" + presDateTime + "" + // name="处方日期时间" /
                                                "" + diag_name + "" +// name="诊断名称" /
                                                "" + diag_code + "" + //  name="诊断编码" /
                                                "" + // name="病历信息" /
                                                "10" +// name="就诊科别代码" /
                                                "眼科" +// name="his就诊科别名称" /
                                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name") + "" + //本院科别名称
                                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no") + "" +  // name="医师编号" /
                                                "" + JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name") + "" + // name="医师姓名" /
                                                "" + recipetype + "" + //  name="处方类别(1:医保内处方 2:医保外处方)" /
                                                "" + helpmedicineflag + "" + // name='代开药标识'/
                                                "" + agentName + "" + //name='代开药人员姓名'
                                                "" + idtype + "" + //name='代开药人员证件类型'
                                                "" + agentIDCardNo + "" + //name='代开药人员证件号码'
                                                "" + Global.pat.SettID_HISJSB + "" +//挂号确认流水号  收费必传 查病人当日挂号结算流水号
                                                "" + billstype + "" + //单据类型 (1-挂号;2-西药或中成药处方;4-中草药处方;5-检验治疗;
                                                "" + doclv + "" + //医师等级 01主治医师 02副主任医师 03主任医师 04专家  异地必传参数
                                                "";
                            }
                                
                        }
                    }
                    presInfo = sCFXX;
                    //组织挂号入参
                    JObject joRegInpar = new JObject();
                    string occurTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    joRegInpar.Add("psn_no", Global.pat.psn_no);
                    joRegInpar.Add("insutype", frmReg.insuType);
                    joRegInpar.Add("begntime", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.begntime")); //挂号时间  这里之所以不取当前时间是因为就诊信息上传会关联判断挂号的时间DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                    joRegInpar.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);
                    joRegInpar.Add("mdtrt_cert_no", Global.pat.mdtrtcertNO);
                    joRegInpar.Add("ipt_otp_no", Global.pat.adm_Dr);
                    joRegInpar.Add("atddr_no", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.atddr_no"));
                    joRegInpar.Add("dr_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.chfpdr_name"));
                    joRegInpar.Add("dept_code", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_codg"));
                    joRegInpar.Add("dept_name", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.adm_dept_name"));
                    joRegInpar.Add("exp_content", "");
                    joRegInpar.Add("caty", "72");
                    joReg.Add("data", joRegInpar);
                    //组织就诊信息入参
                    JObject joMdtrtinfo = new JObject();
                    for (int i = 0; i < jaDiagnoses.Count; i++)
                    {
                        jaDiagnoses[i]["vali_flag"] = new JObject();
                        jaDiagnoses[i]["vali_flag"] = "1";
                    }
                    joMdtrtinfo.Add("mdtrt_id", Global.pat.mdtrtID);
                    joMdtrtinfo.Add("psn_no", Global.pat.psn_no);          //人员编号
                    Global.pat.medType = frmReg.med_type;
                    joMdtrtinfo.Add("med_type", frmReg.med_type);          //医疗类别
                    joMdtrtinfo.Add("begntime", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.begntime"));          //开始时间
                    joMdtrtinfo.Add("main_cond_dscr", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.main_cond_dscr"));          //主要病情描述
                    joMdtrtinfo.Add("dise_codg", diseCodg);          //病种编码
                    joMdtrtinfo.Add("dise_name", diseName);          //病种名称
                    joMdtrtinfo.Add("birctrl_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_type"));          //计划生育手术类别
                    joMdtrtinfo.Add("birctrl_matn_date", "");          //计划生育手术或生育日期 JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.birctrl_matn_date") 20230228医保中心校验传正确时间或空
                    joMdtrtinfo.Add("matn_type", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.matn_type"));          //生育类别
                    joMdtrtinfo.Add("geso_val", JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.geso_val"));            //孕周数
                    joMdtrtinfo.Add("exp_content", "");          //字段扩展
                    //组织结算入参
                    JObject joSetlInpar = new JObject();
                    joSetlInpar.Add("psn_no", Global.pat.psn_no);
                    joSetlInpar.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);
                    joSetlInpar.Add("mdtrt_cert_no", Global.pat.mdtrtcertNO);
                    joSetlInpar.Add("med_type", Global.pat.medType);
                    joSetlInpar.Add("medfee_sumamt", "");
                    joSetlInpar.Add("psn_setlway", frmReg.psn_setlway); //结算方式
                    joSetlInpar.Add("mdtrt_id", Global.pat.mdtrtID);
                    joSetlInpar.Add("chrg_bchno", Global.pat.adm_Dr.ToString());
                    joSetlInpar.Add("acct_used_flag", frmReg.personAccountUsedFlag);//个人账户使用标志
                    joSetlInpar.Add("insutype", frmReg.insuType);//险种类型
                    joSetlInpar.Add("pub_hosp_rfom_flag", "");
                    joSetlInpar.Add("exp_content", "");
                    joReg.Add("mdtrtinfo", joMdtrtinfo);
                    joReg.Add("diseinfo", jaDiagnoses);
                    joReg.Add("settlement", joSetlInpar);
                    regInfo = joReg.ToString();
                    return 0;
                }
                else
                {
                    regInfo = "收费员取消操作!";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                regInfo = "登记界面显示异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 上传费用到中心
        /// 
        /// 
        /// 
        /// 
        /// 
        public int  uploadFee(string funNO,int singleCount,out string outParam)
        {
            outParam = "";
            //获取IS费用
            if (hIS.getHisFee(Global.pat, out outParam) != 0)
            {
                return -1;
            }
            //调用医保平台转换HIS费用(转换医保编码等)
            JObject joHisFee = JObject.Parse(outParam);
            if (mIS.convertHisFeeWithInsuCode(joHisFee, out outParam) != 0)
            {
                return -2;
            }
            JArray jaFeeDetail = JArray.Parse(JsonHelper.getDestValue(JObject.Parse(outParam), "data"));
            //按指定条数分割后上传,保存,更新
            if (uploadFeeToCenter(funNO, singleCount, jaFeeDetail, out outParam) != 0)
            {
                return -3;
            }
            else
            {
                outParam = "成功";
                return 0;
            }            
        }
        /// 
        /// 组织费用明细参数
        /// 
        /// 
        /// 
        public int setFeeInParam(out string outParam)
        {
            outParam = "";
            //获取IS费用
            if (hIS.getHisFee(Global.pat, out outParam) != 0)
            {
                return -1;
            }
            //调用医保平台转换HIS费用(转换医保编码等)
            JObject joHisFee = JObject.Parse(outParam);
            if (mIS.convertHisFeeWithInsuCode(joHisFee, out outParam) != 0)
            {
                return -2;
            }
            JArray jaFeeDetail = JArray.Parse(JsonHelper.getDestValue(JObject.Parse(outParam), "data"));
            //组织费用明细参数
            if (writeFeeToFile(jaFeeDetail, out outParam) != 0)
            {
                return -3;
            }
            else
            {
                return 0;
            }
        }
        /// 
        /// 组织首信医保诊断数据
        /// 
        /// 
        /// 
        /// 
        public int writeDisToFile(out string outParam)
        {
            outParam = "";
            string sText = string.Empty;
            //调用服务获取住院诊断信息
            string diagnoses;
            if (hIS.getPatDiagnoses(Global.pat, out diagnoses) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "getPatDiagnoses", diagnoses).ToString();
                return -1;
            }
            JObject joHisRtnInfo = JObject.Parse(diagnoses);
            //手术信息处理
            string operationCode = "", operationDesc = "", operationDate = "";
            JArray jaOperation = new JArray();
            if (JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.operationInfo.operationArr") != "")
            {
                jaOperation = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.operationInfo.operationArr"));
                operationDate = DateTime.Parse(JsonHelper.getDestValue(joHisRtnInfo, "mdtrtinfo.operationInfo.actualStartDate")).ToString("yyyyMMdd");
                for (int i = 0; i < jaOperation.Count; i++)
                {
                    operationCode = operationCode + JsonHelper.getDestValue((JObject)jaOperation[i], "operationCode") + ";";
                    operationDesc = operationDesc + JsonHelper.getDestValue((JObject)jaOperation[i], "operationDesc") + ";";
                }
            }
            
            //诊断信息处理
            JArray jaDiagnoses = JArray.Parse(JsonHelper.getDestValue(joHisRtnInfo, "diseinfo"));
            string disCodeOther = "", disNameOther = "";
            for (int i = 0; i < jaDiagnoses.Count; i++)
            {
                string diag_type = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_type");    //诊断类型1西医主要诊断2西医其他诊断3中医主病诊断4中医主证诊断
                string maindiag_flag = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "maindiag_flag");
                string diaTypeCode = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diaTypeCode"); //ADD 入院 OPD 门诊 DIS出院
                string diag_code = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_code"); //诊断编码
                string diag_name = JsonHelper.getDestValue((JObject)jaDiagnoses[i], "diag_name"); //诊断名称
                if ((diag_type == "1") && (diaTypeCode == "DIS") && (maindiag_flag == "1"))
                {
                    Global.pat.disCode = diag_code;
                    Global.pat.disName = diag_name;
                }
                else if (diaTypeCode == "DIS")               
                {
                    disCodeOther = disCodeOther + diag_code + ";";
                    disNameOther = disNameOther + diag_name + ";";
                }            
            }
            sText = comp.SetParamsAHS(Global.pat.adm_Dr.ToString(), 1) + //住院流水号
                    comp.SetParamsAHS("10", 1) +                         //出院科别编码
                    comp.SetParamsAHS(Global.pat.disName, 1) +           //主要诊断
                    comp.SetParamsAHS(Global.pat.disCode, 1) +           //主要疾病编码
                    comp.SetParamsAHS(operationDesc, 1) +     //手术名称
                    comp.SetParamsAHS(operationCode, 1) +     //手术名称编码
                    comp.SetParamsAHS("", 1) +                           //出院情况编码
                    comp.SetParamsAHS(disNameOther, 1) + //其他诊断
                    comp.SetParamsAHS("", 1) + //诊断类别
                    comp.SetParamsAHS(operationDate, 1) + //手术日期
                    comp.SetParamsAHS("", 1) + //终止妊娠前怀孕周数
                    comp.SetParamsAHS("", 1) + //终止妊娠前怀孕零星天数
                    comp.SetParamsAHS("", 1) + //分娩方式
                    comp.SetParamsAHS("", 1) + //生育胎儿数
                    comp.SetParamsAHS("", 1) + //分娩活婴数
                    ""; //分娩死胎数  
            outParam = sText;
            return 0;
        }      
        /// 
        /// 解析基线版费用明细数据,组织首信医保费用明细数据
        /// 
        /// 
        /// 
        /// 
        public int writeFeeToFile(JArray jaFeeDetail, out string outParam)
        {
            outParam = "";
            string sText = string.Empty;
            try
            {
                for (int i = 0; i < jaFeeDetail.Count; i++)
                {
                    string recipeno= jaFeeDetail[i]["recipeno"].ToString();
                    string serialNO = jaFeeDetail[i]["serialNO"].ToString();
                    string feedetl_sn = jaFeeDetail[i]["feedetl_sn"].ToString();
                    string init_feedetl_sn = jaFeeDetail[i]["init_feedetl_sn"].ToString();
                    string mdtrt_id = jaFeeDetail[i]["mdtrt_id"].ToString();
                    string drord_no = jaFeeDetail[i]["drord_no"].ToString();
                    string psn_no = jaFeeDetail[i]["psn_no"].ToString();
                    string med_type = jaFeeDetail[i]["med_type"].ToString();
                    string fee_ocur_time = jaFeeDetail[i]["fee_ocur_time"].ToString();
                    string med_list_name = jaFeeDetail[i]["med_list_name"].ToString();
                    string medins_list_codg = jaFeeDetail[i]["medins_list_codg"].ToString();
                    string medins_list_desc = jaFeeDetail[i]["medins_list_desc"].ToString();
                    string det_item_fee_sumamt = jaFeeDetail[i]["det_item_fee_sumamt"].ToString();
                    string cnt = jaFeeDetail[i]["cnt"].ToString();
                    string pric = jaFeeDetail[i]["pric"].ToString();
                    string bilg_dept_codg = jaFeeDetail[i]["bilg_dept_codg"].ToString();
                    string bilg_dept_name = jaFeeDetail[i]["bilg_dept_name"].ToString();
                    string bilg_dr_codg = jaFeeDetail[i]["bilg_dr_codg"].ToString(); 
                    string bilg_dr_name = jaFeeDetail[i]["bilg_dr_name"].ToString();
                    string bilg_dr_ID = jaFeeDetail[i]["bilg_dr_ID"].ToString();
                    string acord_dept_codg = jaFeeDetail[i]["acord_dept_codg"].ToString();
                    string acord_dept_name = jaFeeDetail[i]["acord_dept_name"].ToString();
                    string orders_dr_code = jaFeeDetail[i]["orders_dr_code"].ToString();
                    string orders_dr_name = jaFeeDetail[i]["orders_dr_name"].ToString();
                    string orders_dr_ID = jaFeeDetail[i]["orders_dr_ID"].ToString();
                    string hosp_appr_flag = jaFeeDetail[i]["hosp_appr_flag"].ToString();
                    string tcmdrug_used_way = jaFeeDetail[i]["tcmdrug_used_way"].ToString();
                    string etip_flag = jaFeeDetail[i]["etip_flag"].ToString();
                    string etip_hosp_code = jaFeeDetail[i]["etip_hosp_code"].ToString();
                    string dscg_tkdrug_flag = jaFeeDetail[i]["dscg_tkdrug_flag"].ToString();
                    string matn_fee_flag = jaFeeDetail[i]["matn_fee_flag"].ToString();
                    string comb_no = jaFeeDetail[i]["comb_no"].ToString();
                    string expContent = jaFeeDetail[i]["expContent"].ToString();
                    string rx_circ_flag = jaFeeDetail[i]["rx_circ_flag"].ToString();
                    string chrg_bchno = jaFeeDetail[i]["chrg_bchno"].ToString();
                    string validFlag = jaFeeDetail[i]["validFlag"].ToString();
                    string med_list_codg = jaFeeDetail[i]["med_list_codg"].ToString();        
                    string feeType= jaFeeDetail[i]["fee_Type"].ToString(); //收费类别
                    string hisType = jaFeeDetail[i]["hisType"].ToString(); //项目类别 0药品 1诊疗项目和服务设施 3耗材
                    if (hisType == "1")
                        hisType = "0";
                    else 
                    if (hisType == "2")
                        hisType = "1";
                    string nationalCode= jaFeeDetail[i]["NationalCode"].ToString(); //国家项目代码
                    string spec = jaFeeDetail[i]["spec"].ToString(); //规格
                    string dose = jaFeeDetail[i]["dose"].ToString(); //剂型 AKA070
                    string unit = jaFeeDetail[i]["unit"].ToString(); //单位
                    string howtouse = jaFeeDetail[i]["howtouse"].ToString(); //用法(用药频次)参见字典BKC229药品非空,诊疗服务设施、耗材可空取值须在字典范围内,且严禁使用汉字
                    string dosage = jaFeeDetail[i]["dosage"].ToString(); //单次用量
                    string packaging = jaFeeDetail[i]["packaging"].ToString(); //包装单位
                    string minpackage = jaFeeDetail[i]["minpackage"].ToString(); //最小单位
                    string conversion = jaFeeDetail[i]["conversion"].ToString(); //转换率
                    string days = jaFeeDetail[i]["days"].ToString(); //用药天数
                    string drugapprovalnumber = jaFeeDetail[i]["drugapprovalnumber"].ToString(); //药品批准文号       
                    drugapprovalnumber = Regex.Replace(drugapprovalnumber, "[^A-Za-z0-9]", ""); //去除批准文号中的中文
                    if (hisType == "0")
                    {
                        double number = double.Parse(days);
                        //string strNumber = number.ToString();
                        //中成药和颗粒剂:用药天数=数量*换算率/单次用量
                        //其它药品:用药天数=数量*换算率/(单次用量*用法)
                        days = Math.Floor(number).ToString();                        
                    }
                    //如果是挂号 处方号传来的是空值 
                    if ((Global.inf.operationType == "RegisterOP") && (recipeno == ""))                    
                        recipeno = serialNO.Trim().Replace("||", "-");
                    if (Global.pat.admType == 1) //门诊费用组织
                    {
                        sText = sText + "  ";
                    }
                    else //住院费用组织
                    {
                        sText = sText + comp.SetParamsAHS(serialNO, 1) +           //项目序号
                                        comp.SetParamsAHS(medins_list_codg, 1) +   //HIS系统项目代码
                                        comp.SetParamsAHS("", 1) +   //医保项目代码   北京首信医保 住院费用 不传医保项目代码
                                        comp.SetParamsAHS(medins_list_desc, 1) + //项目名称
                                        comp.SetParamsAHS(hisType, 1) +            //项目类别
                                        comp.SetParamsAHS(feeType, 1) +              //收费类别
                                        comp.SetParamsAHS(dose, 1) +                 //剂型
                                        comp.SetParamsAHS(spec, 1) +                 //规格
                                        comp.SetParamsAHS(unit, 1) +                 //单位
                                        comp.SetParamsAHS(Math.Round(double.Parse(pric), 4).ToString(), 1) + //单价
                                        comp.SetParamsAHS(cnt, 1) + //数量
                                        comp.SetParamsAHS(Math.Round(double.Parse(det_item_fee_sumamt), 4).ToString(), 1) + //金额
                                        comp.SetParamsAHS(DateTime.Parse(fee_ocur_time).ToString("yyyyMMddHHmmss"), 1) + //费用发生时间
                                        comp.SetParamsAHS(dscg_tkdrug_flag, 1) + //是否出院带药 0-是,1-否
                                        comp.SetParamsAHS("0", 1) + //特需标识
                                        comp.SetParamsAHS(drugapprovalnumber, 1) + //药品批准文号
                                        comp.SetParamsAHS("0", 1) + //外院费用标记
                                        comp.SetParamsAHS("", 1) + //药品包装标识
                                        comp.SetParamsAHS(nationalCode, 1) + //国家收费项目编码
                                        "0" + "\r\n";  //特殊用药标识
                    }
                }
                if (Global.pat.admType == 2)
                {
                    sText = comp.SetParamsAHS(Global.pat.adm_Dr.ToString(), 1) + //住院流水号
                            comp.SetParamsAHS(Global.pat.name, 1) +              //姓名
                            comp.SetParamsAHS(Global.pat.gend, 1) +              //性别
                            Global.pat.certNO + "\r\n" + sText;                  //身份证号
                }
                outParam = sText;
                return 0;
            }
            catch (Exception ex)
            {
                outParam = "uploadFee 异常:" + ex.Message;
                return -1;
            }
        }
        public int uploadFeeToCenter(string funNO,int singleCount,JArray jaFeeDetail, out string outParam)
        {
            outParam = "";
            string errMsg;
            try
            {
                JArray jaTmp = new JArray();
                for (int i = 0; i < jaFeeDetail.Count; i++)
                {
                    jaFeeDetail[i]["chrg_bchno"] = Global.pat.adm_Dr.ToString();
                    jaFeeDetail[i]["med_type"] = Global.pat.medType;
                    if (jaFeeDetail[i]["validFlag"].ToString() == "N") continue;
                    jaTmp.Add(jaFeeDetail[i]);
                    if (((i + 1) % singleCount == 0) || ((i + 1) == jaFeeDetail.Count))
                    {
                        JObject joFeeDetail = new JObject();
                        joFeeDetail.Add("feedetail", jaTmp);
                        JObject joRtn = invoker.invokeCenterService(funNO, JsonHelper.setCenterInpar(funNO, joFeeDetail.ToString()));
                        if (JsonHelper.parseCenterRtnValue(joRtn, out errMsg) != 0)
                        {
                            outParam = errMsg;
                            return -1;
                        }
                        else
                        {
                            //成功后插入医保平台
                            if (mIS.insertFee(jaTmp, out errMsg) != 0)
                            {
                                outParam = outParam + errMsg;
                                return -1;
                            }
                            //更新2301返回的数据
                            if (mIS.updateFee(JArray.Parse(JsonHelper.getDestValue(joRtn, "output.result")), out errMsg) != 0)
                            {
                                outParam = outParam + errMsg;
                                return -1;
                            }
                        }
                        jaTmp = new JArray();
                    }
                }
                return 0;
            }
            catch (Exception ex)
            {
                outParam = "uploadFee 异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 获取登记时候传入的信息,并赋值给patients结构体
        /// 
        /// 
        /// 
        /// 
        public void GetRegPatInfo(string businessType, JObject joInparam,out Patients pat)
        {
            pat = new Patients();
            try
            {                
                switch (businessType)
                {
                    case "M2"://门诊登记
                        {
                            break;
                        }
                    case "M2C"://门诊登记撤销
                        {
                            break;
                        }
                    case "Z0"://住院修改
                        {
                            break;
                        }
                    case "Z2"://入院登记
                        {
                            //pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].admID"));
                            //pat.psn_no = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.ic.ic_no");
                            //pat.insuType = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.ic.fundtype");
                            //pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.ic.id_no").Substring(0,6);
                            //pat.name = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.ic.personname");
                            //pat.psn_type = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.net.persontype");
                            //pat.certType = "01";
                            //pat.certNO = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.ic.id_no");
                            //pat.card.SN = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.ic.card_no");
                            //pat.mdtrtcertType = "03";
                            //pat.mdtrtcertNO = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.root.output.ic.id_no");
                            //pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                            //本地解析
                            //pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].admID"));
                            //pat.psn_no = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.ic_no");
                            //pat.insuType = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.fundtype");
                            //pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.id_no").Substring(0, 6);
                            //pat.name = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.personname");
                            //pat.psn_type = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.persontype");
                            //pat.certType = "01";
                            //pat.certNO = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.id_no");
                            //pat.card.SN = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.card_no");
                            //pat.mdtrtcertType = "03";
                            //pat.mdtrtcertNO = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.id_no");
                            //pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                            //pat.gend = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.sex");
                            //异地解析
                            pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].admID"));
                            pat.psn_no = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.psn_no");
                            pat.insuType = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.insutype");
                            pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.insuplc_admdvs").Substring(0, 6);
                            pat.name = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.psn_name");
                            pat.psn_type = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.psn_type");
                            pat.certType = "01";
                            pat.certNO = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.card_no");
                            pat.card.SN = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.card_no");
                            pat.mdtrtcertType = "03";
                            pat.mdtrtcertNO = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.mdtrtcertNO");
                            pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                            pat.gend = JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.gend");
                            pat.iOtherProvLocal = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].patientInfo.output.baseinfo.iOtherProvLocal"));
                            break;
                        }
                    case "Z2C"://入院登记取消
                        {
                            pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].admID"));
                            pat.psn_no = JsonHelper.getDestValue(joInparam, "params[0].psn_no");
                            pat.mdtrtID = JsonHelper.getDestValue(joInparam, "params[0].mdtrt_id");
                            //pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "params[0].insuplc_admdvs");
                            pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                            break;
                        }
                    case "Z6"://出院登记
                        {
                            Global.Set.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                            break;
                        }
                    case "Z6C"://出院登记取消
                        {
                            pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                            pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                            pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                            break;
                        }
                    default:
                        {
                            break;
                        }
                }
            }
            catch (Exception ex)
            {
                Global.writeLog("GetRegPatInfo(" + businessType + ")", JsonHelper.Compress(joInparam),"PAT结构体设置异常:" + ex.Message);
            }
        }
        /// 
        /// 获取费用上传时前端传入的信息,并赋值给patients结构体
        /// 
        /// 
        /// 
        /// 
        public void GetFeeHisInfo(string businessType, JObject joInparam, out Patients pat)
        {
            pat = new Patients();
            try
            {
                switch (businessType)
                {
                    case "M3"://门诊费用上传
                        {
                            break;
                        }
                    case "M3C"://门诊费用撤销
                        {
                            break;
                        }
                    case "Z3"://入院费用上传
                        {
                            pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.admID"));
                            pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                            pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                            pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                            pat.name = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_name");
                            pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                            pat.certNO = JsonHelper.getDestValue(joInparam, "insuAdmObj.idNo");
                            pat.recordID = "";
                            break;
                        }
                    case "Z3C"://住院费用上传取消
                        {
                            pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.admID"));
                            pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                            pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                            pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                            break;
                        }
                    default:
                        {
                            break;
                        }
                }
                //如果患者异地的则就医地需要该为369900
                if (Global.pat.insuplc_admdvs != "")
                {
                    if (Global.pat.insuplc_admdvs.Substring(0, 4) != Global.inf.areaCode.Substring(0, 4))
                    {
                        Global.inf.areaCode = "369900";
                    }
                }
            }
            catch (Exception ex)
            {
                Global.writeLog("GetFeeHisInfo(" + businessType + ")", JsonHelper.Compress(joInparam), "PAT结构体设置异常:" + ex.Message);
            }
        }
        /// 
        ///  获取结算时前端传入的信息,并赋值给patients结构体
        /// 
        /// 
        /// 
        /// 
        public void GetSettlementHisInfo(string businessType, JObject joInparam, out Patients pat)
        {
            pat = new Patients();
            switch (businessType)
            {
                case "M4"://门诊预结算
                    {
                        break;
                    }
                case "M4C"://门诊预结算撤销
                    {
                        break;
                    }
                case "M5"://门诊结算
                    {
                        pat.admType = 1;
                        Global.pat.partialFlag = JsonHelper.getDestValue(joInparam, "partialFlag");
                        Global.inf.operationType = JsonHelper.getDestValue(joInparam, "operationType");
                        pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].admID"));
                        pat.recordID = JsonHelper.getDestValue(joInparam, "params[0].recordID");
                        pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                        Global.pat.insuplc_admdvs = "";
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays")))
                        {
                            Global.Set.hospitalizationsDays = 0;
                        }
                        else
                        {
                            Global.Set.hospitalizationsDays = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays"));
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes")))
                        {
                            Global.Set.hospitalizationsTimes = 0;
                        }
                        else
                        {
                            Global.Set.hospitalizationsTimes = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes"));
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime")))
                        {
                            Global.Set.hisAdmTime = "";
                        }
                        else
                        {
                            Global.Set.hisAdmTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")))
                        {
                            Global.Set.hisDischargeTime = "";
                        }
                        else
                        {
                            Global.Set.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        //Global.settl.hospitalizationsDays = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays"));
                        //Global.settl.hospitalizationsTimes = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes"));
                        //Global.settl.hisAdmTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime"));
                        //Global.settl.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime"));
                        Global.writeLog(Global.Set.hospitalizationsDays.ToString());
                        Global.writeLog(Global.Set.hospitalizationsTimes.ToString());
                        Global.writeLog(Global.Set.hisAdmTime.ToString());
                        Global.writeLog(Global.Set.hisDischargeTime.ToString());
                        break;
                    }
                case "M5C"://门诊结算撤销
                    {                      
                        pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                        pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                        pat.settlID = JsonHelper.getDestValue(joInparam, "insuAdmObj.setl_id");
                        pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                        if (JsonHelper.getDestValue(joInparam, "params[0].admID") == "")
                        {
                            pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.admID"));    
                        }
                        else
                        {
                            pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].admID"));
                        }
                        pat.recordID = JsonHelper.getDestValue(joInparam, "params[0].recordID");     
                        pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");                     
                        Global.inf.operationType= JsonHelper.getDestValue(joInparam, "operationType");
                        Global.pat.partialFlag = JsonHelper.getDestValue(joInparam, "partialFlag");
                        break;
                    }
                case "Z4"://住院预结算
                    {
                        pat.admType = 2;
                        pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.admID"));
                        pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                        pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                        pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                        pat.name = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_name");
                        pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays")))
                        {
                            Global.Set.hospitalizationsDays = 0;
                        }
                        else
                        {
                            Global.Set.hospitalizationsDays = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays"));
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes")))
                        {
                            Global.Set.hospitalizationsTimes = 0;
                        }
                        else
                        {
                            Global.Set.hospitalizationsTimes = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes"));
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime")))
                        {
                            Global.Set.hisAdmTime = "";
                        }
                        else
                        {
                            Global.Set.hisAdmTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")))
                        {
                            Global.Set.hisDischargeTime = "";
                        }
                        else
                        {
                            Global.Set.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        //Global.settl.hospitalizationsDays = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays"));
                        //Global.settl.hospitalizationsTimes = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes"));
                        //Global.settl.hisAdmTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime"));
                        //Global.settl.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime"));
                        Global.writeLog(Global.Set.hospitalizationsDays.ToString());
                        Global.writeLog(Global.Set.hospitalizationsTimes.ToString());
                        Global.writeLog(Global.Set.hisAdmTime.ToString());
                        Global.writeLog(Global.Set.hisDischargeTime.ToString());
                        break;
                    }
                case "Z4C"://住院预结算撤销
                    {
                        pat.admType = 2;
                        pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                        pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                        pat.settlID = JsonHelper.getDestValue(joInparam, "insuAdmObj.setl_id");                        
                        pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                        pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "params[0].admID"));
                        pat.recordID = JsonHelper.getDestValue(joInparam, "params[0].recordID");
                        pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                        break;
                    }
                case "Z5"://住院结算
                    {
                        pat.RYorCY = "2";
                        pat.admType = 2;
                        pat.hisSumAmt = JsonHelper.getDestValue(joInparam, "insuAdmObj.totalAmt");  //HIS总金额
                        pat.hisPrePayment = JsonHelper.getDestValue(joInparam, "insuAdmObj.deposit");  //HIS预交金
                        pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.admID"));
                        pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                        pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                        pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                        pat.name = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_name");
                        pat.certNO = JsonHelper.getDestValue(joInparam, "insuAdmObj.idNo");
                        pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                        Global.Set.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays")))
                        {
                            Global.Set.hospitalizationsDays = 0;
                        }
                        else
                        {
                            Global.Set.hospitalizationsDays = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays"));
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes")))
                        {
                            Global.Set.hospitalizationsTimes = 0;
                        }
                        else
                        {
                            Global.Set.hospitalizationsTimes = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes"));
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime")))
                        {
                            Global.Set.hisAdmTime = "";
                        }
                        else
                        {
                            Global.Set.hisAdmTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        if (string.IsNullOrEmpty(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")))
                        {
                            Global.Set.hisDischargeTime = "";
                        }
                        else
                        {
                            Global.Set.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime")).ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        //Global.settl.hospitalizationsDays = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inDays"));
                        //Global.settl.hospitalizationsTimes = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.inTimes"));
                        //Global.settl.hisAdmTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.admDateTime"));
                        //Global.settl.hisDischargeTime = Convert.ToDateTime(JsonHelper.getDestValue(joInparam, "insuAdmObj.disDateTime"));
                        Global.writeLog(Global.Set.hospitalizationsDays.ToString());
                        Global.writeLog(Global.Set.hospitalizationsTimes.ToString());
                        Global.writeLog(Global.Set.hisAdmTime.ToString());
                        Global.writeLog(Global.Set.hisDischargeTime.ToString());
                        break;
                    }
                case "Z5C"://住院结算撤销
                    {
                        pat.RYorCY = "2";
                        pat.admType = 2;
                        pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joInparam, "insuAdmObj.admID"));
                        pat.psn_no = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_no");
                        pat.mdtrtID = JsonHelper.getDestValue(joInparam, "insuAdmObj.mdtrt_id");
                        pat.insuplc_admdvs = JsonHelper.getDestValue(joInparam, "insuAdmObj.insuplc_admdvs");
                        pat.name = JsonHelper.getDestValue(joInparam, "insuAdmObj.psn_name");
                        pat.billID = JsonHelper.getDestValue(joInparam, "params[0].billID");
                        pat.settlID = JsonHelper.getDestValue(joInparam, "insuAdmObj.setl_id");
                        pat.SettID_HISJSB = pat.settlID;  //这里是通过09010059交易获取到的结算ID
                        break;
                    }
                default:
                    {
                        break;
                    }
            }
            //如果患者异地的则就医地需要该为369900
            //if (Global.pat.insuplc_admdvs != "")
            //{
            //    if (Global.pat.insuplc_admdvs.Substring(0, 4) != Global.inf.areaCode.Substring(0, 4))
            //    {
            //        Global.inf.areaCode = "369900";
            //    }
            //}
            
        }
        ///对目录下载业务的封装
        ///
        public JObject DownloadDirectory(string funNO,string inParam)
        {
            string errorMessage = "", sRtn = "";
            JObject joRtn = new JObject();
            try
            {
                JObject joCenterRtn = cBus.DownDirecotry(funNO,inParam);
                if (JsonHelper.parseCenterRtnValue(joCenterRtn,out errorMessage) != 0)
                {
                    joRtn = JsonHelper.setExceptionJson(-100, "下载异常", errorMessage);
                    return joRtn;
                }
                string filename = JsonHelper.getDestValue(joCenterRtn, "output.filename");
                //MessageBox.Show("1306查询目录文件号返回:"+ joCenterRtn.ToString());
                JObject jo9102Rtn = cBus.SaveFile(joCenterRtn);
                if (JsonHelper.parseIrisRtnValue(jo9102Rtn,out errorMessage) != 0)
                {
                    joRtn = JsonHelper.setExceptionJson(-100, "保存文件异常", errorMessage);
                    return joRtn;
                }
                //解压缩
                string zipFilePath = jo9102Rtn["filePath"].ToString();
                string txtFileDir = System.Environment.CurrentDirectory + "\\Download";
                string txtFilePath = txtFileDir + "\\" + filename.Substring(0, filename.Length - 4);
                //string txtFilePath = Global.curEvt.path + "\\Download\\" + filename;
                //MessageBox.Show("解压缩的txtFilePath:"+ zipFilePath+"|解压到目标路径:"+ txtFileDir+"|文件解析路径:"+ txtFilePath);
                //昆明下载下来的文件是解压后的TXT
                if (tools.ExtractFile(zipFilePath, txtFileDir, out errorMessage) != 0)
                {
                    joRtn = JsonHelper.setExceptionJson(-100, "提取文件", errorMessage);
                    return joRtn;
                }
                joRtn = (JObject)jo9102Rtn.DeepClone();
                joRtn["filePath"] = txtFilePath;
                return joRtn;
            }
            catch (Exception ex)
            {
                joRtn = JsonHelper.setExceptionJson(-100, "下载中心目录", errorMessage);
                return joRtn;
            }
            finally
            {
                Global.writeLog("HisMainBusiness.DownloadDirectory", inParam, joRtn.ToString());
            }
        }
        /// 
        /// 字典下载
        /// 
        /// 
        /// 
        public string downDictionary(string inParam)
        {
            JObject joCenterRtn = invoker.invokeCenterService("1901", inParam);
            return joCenterRtn.ToString();
        }
        /// 
        /// 展示结算信息界面
        /// 
        /// 
        /// 
        /// 
        public int showSettlementFormOP(JObject joRtn, out string outParam)
        {
            outParam = "";
            string errMsg;
            try
            {
                //相关信息转换到结算信息面板
                SettlementInfo frmSettlment = new SettlementInfo(joRtn, Global.pat.iOtherProvLocal);
                if (frmSettlment.ShowDialog() == DialogResult.OK)
                {
                    return 0;
                }
                else
                {
                    outParam = "收款员取消";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                outParam = "showSettlementFormNew 异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 展示结算信息界面
        /// 
        /// 
        /// 
        /// 
        public int showSettlementFormOPNew(XmlDocument xmlDoc, out string outParam)
        {
            outParam = "";
            string errMsg;
            try
            {
                //相关信息转换到结算信息面板
                SettlementInfo frmSettlment = new SettlementInfo(xmlDoc);
                if (frmSettlment.ShowDialog() == DialogResult.OK)
                {
                    return 0;
                }
                else
                {
                    outParam = "收款员取消";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                outParam = "showSettlementFormNew 异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 展示结算信息界面
        /// 
        /// 
        /// 
        /// 
        public int showSettlementForm(JObject joSettlement, out string outParam)
        {
            outParam = "";
            string errMsg;
            try
            {
                SettlementInfo frmSettlment = new SettlementInfo();
                //相关信息转换到结算信息面板
                if (frmSettlment.ShowDialog() == DialogResult.OK)
                {
                    return 0;
                }
                else
                {
                    outParam = "收款员取消";
                    return -1;
                }
            }
            catch (Exception ex)
            {
                outParam = "showSettlementForm 异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 门诊预结算封装,返回正式结算的入参
        /// 
        /// 
        /// 
        /// 
        public int preSettlement_OutPat( JObject joSettlement, out string outParam)
        {
            outParam = "";
            //预结算  
            JObject jo2206Data = new JObject();
            jo2206Data.Add("data", joSettlement);
            JObject jo2206Rtn = invoker.invokeCenterService("2206", JsonHelper.setCenterInpar("2206", jo2206Data));
            if (JsonHelper.parseCenterRtnValue(jo2206Rtn, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "出院预结算", outParam).ToString();
                return -1;
            }
            //返回给HIS进行预结算判断
            JObject joSetlinfo = JObject.Parse(JsonHelper.getDestValue(jo2206Rtn, "output.setlinfo"));
            if (hIS.preSettlement(joSettlement, joSetlinfo, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "返回结算信息给HIS", outParam).ToString();
                return -1;
            }
            //编码转换
            if (mIS.convertSettlementWithInsuCode(jo2206Rtn, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "结算信息转换", outParam).ToString();
                return -1;
            }
            JObject joSumFee = new JObject();
            string errMsg = "";
            //判断勾稽关系是否平
            if (hIS.sumInsuRtnSettlInfo(JObject.Parse(JsonHelper.getDestValue(jo2206Rtn, "output.setlinfo")), out joSumFee, out errMsg) != 0)
            {
                outParam = "勾稽关系不符合标准,请联系管理员!" + errMsg;
                return -1;
            }
            //展示结算信息
            JObject joConverted = JObject.Parse(outParam);
            if (showSettlementForm(joConverted, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "结算信息展示", outParam).ToString();
                return -1;
            }
            else
            {
                return 0;
            }
        }
        /// 
        /// 门诊预结算封装,返回预结算结果展示
        /// 
        /// 
        /// 
        /// 
        public int preSettlementOutPatOP(System.Type InComType, dynamic InComInstance, string sCFXX,string sMXXX, out string outParam)
        {
            outParam = "";
            string sContrl_XML = string.Empty, sData_XML = string.Empty, AppRtnMsg = string.Empty, OutMsg = string.Empty;
            string FunName;
            //组织预结算入参
            sContrl_XML = "  " +
                          " " + Global.pat.medType + " " +  //name="就诊类型,11门诊,19急诊,17门诊挂号,18急诊挂号"
                          " 0 " + //name="就诊方式 0普通 其他未启用"
                          " " + Global.pat.recordID + " " +      //name="收费单据号" HIS自定义
                          " " + Global.pat.personAccountUsedFlag.ToString() + " " + //使用账户支付
                          " " + Global.user.ID + " "; // name="收费员"
            //异地门诊结算
            if (Global.pat.iOtherProvLocal == 1)
            {
                sContrl_XML = sContrl_XML + "" + Global.pat.recordID + ""
                                          + "" + Global.pat.trumflag.ToString() + ""
                                          + "" + Global.pat.relttpflag.ToString() + ""
                                          + "" + Global.pat.mdtrtgrptype + "";
                //异地退费重收预结算
                if (Global.pat.partialFlag == "Y")
                {
                    //查询医保平台结算信息表中 已红冲的结算记录
                    string sqlStr = " SELECT Top 1 * FROM BS_MedInsuSettlement "+
                                    " WHERE ClearingWay = 1 and billType = -1 and ValidFlag = 0 " + //AND ExpContent='Y'
                                    " AND Interface_Dr=" + Global.inf.interfaceDr +
                                    " AND Hospital_Dr=" + Global.inf.hospitalDr + 
                                    " AND Adm_Dr ='" + Global.pat.adm_Dr + "'" +                                    
                                    " Order By ID DESC ";
                    JObject joSql = new JObject();
                    joSql.Add("sqlStr", sqlStr);
                    JObject joSettlInfo = mIS.QuerySettlementInfo(joSql);
                    if (JsonHelper.getDestValue(joSettlInfo, "result.data[0].OrganSettlementID") != "")
                        Global.Set.OrganSettlementID = JsonHelper.getDestValue(joSettlInfo, "result.data[0].OrganSettlementID");
                    Global.Set.BackTradeNo = Global.Set.OrganSettlementID + "-1";
                    //组织退费重收预结算信息
                    sContrl_XML = "  " +
                                  " " + Global.Set.BackTradeNo + "" + //已红冲的HIS交易流水号
                                  " " + Global.pat.recordID + "" + //红冲后本次重收的HIS交易流水号
                                  " " + Global.user.ID + " " + //收费员
                                  " " + Global.pat.recordID + " "; //收费单据号
                }
            }
            sContrl_XML = sContrl_XML + "";
            sData_XML = sContrl_XML +
                      " " + sCFXX + " " +
                      " " + sMXXX + " ";
            sData_XML = JsonHelper.GetinPar(sData_XML, 2);
            try
            {
                if (Global.pat.iOtherProvLocal == 0)
                {
                    FunName = "divide";
                }
                else
                {
                    FunName = "DivideNation";
                    if (Global.pat.partialFlag == "Y")
                        FunName = "RePartDivideNation";
                }
                rcl.BussniessObj(FunName, sData_XML, InComType, InComInstance, out AppRtnMsg);
                //解析门诊预结算返回值                
                XmlDocument xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                Boolean bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                if (bPass == false)
                {                    
                    //门诊异地预结算失败调用挂起回退
                    if (Global.pat.iOtherProvLocal == 1)
                    {
                        sData_XML = "" + Global.pat.recordID + "";
                        sData_XML = JsonHelper.GetinPar(sData_XML, 0);                        
                        rcl.BussniessObj("CommitTradeStateNation", sData_XML, InComType, InComInstance, out AppRtnMsg);                        
                    }
                    outParam = "医保返回:" + OutMsg;
                    return -1;
                }
                else
                {
                    Global.Set.SettleStr = AppRtnMsg;
                    JObject joAppRtnMsg = ConvertXMLToObject(AppRtnMsg);
                    Global.Set.settlID = JsonHelper.getDestValue(joAppRtnMsg, "root.output.tradeinfo.tradeno"); //预结算成功返回交易流水号
                    Global.Set.acctPay = JsonHelper.getDestValue(joAppRtnMsg, "root.output.sumpay.personcountpay"); //个人帐户支付
                    //返回给HIS进行预结算判断
                    //if (hIS.preSettlementOPNew(xmlDoc, out outParam) != 0)
                    if (hIS.preSettlementOP(joAppRtnMsg, out outParam) != 0)
                    {
                        outParam = JsonHelper.setExceptionJson(-1, "返回结算信息给HIS", outParam).ToString();
                        return -1;
                    }
                    if (OutMsg != "")
                        MessageBox.Show("divide费用分解/DivideNation异地门诊收费预结算,中心返回警告信息如下:" + OutMsg);
                    //门诊挂号不需要展示预结算信息 
                    if (Global.inf.operationType != "RegisterOP")
                    {
                        //展示结算信息,门诊预结算成功展示报销金额信息        
                        if (showSettlementFormOP(joAppRtnMsg, out outParam) != 0)
                        {
                            outParam = JsonHelper.setExceptionJson(-1, "结算信息展示", outParam).ToString();
                            return -1;
                        }
                        else
                        {
                            outParam = AppRtnMsg;
                            return 0;
                        }
                    }
                    else
                    {
                        outParam = AppRtnMsg;
                        return 0;
                    }
                }
            }
            catch (Exception ex)
            {
                //rcl.Close(InComType, InComInstance, out outParam);
                outParam = "异常:" + ex.Message;
                return -1;
            }         
        }
        /// 
        /// 门诊正式结算封装,返回结算结果
        /// 
        /// 
        /// 
        /// 
        /// 
        public int SettlementOPOutPat(System.Type InComType, dynamic InComInstance, string sCFXX, string sMXXX, out string outParam)
        {
            outParam = "";
            string sContrl_XML = string.Empty, sData_XML = string.Empty, AppRtnMsg = string.Empty, OutMsg = string.Empty, CloseMsg = string.Empty;
            string FunName;
            try
            {
                //正式结算
                //异地门诊结算-TradeNation异地门诊正式结算
                if (Global.pat.iOtherProvLocal == 1)
                {
                    sContrl_XML = ""
                                + "" + Global.pat.medType + ""  // name="就诊类型,11门诊,19急诊,17门诊挂号,18急诊挂号"
                                + "0"   // name="就诊方式 0普通 其他未启用"
                                + ""   //慢特病病种
                                + "" + Global.pat.recordID + ""       // name="收费单据号"
                                + "" + Global.user.ID + ""   // name="收费员"
                                + "" + Global.pat.recordID + ""
                                + "" + Global.pat.trumflag.ToString() + ""  //外伤标志
                                + "" + Global.pat.relttpflag.ToString() + ""  //涉及第三方标志
                                + "" + Global.pat.mdtrtgrptype + ""  //就诊人群类型
                                + "";
                    //异地退费重收预结算
                    if (Global.pat.partialFlag == "Y")
                    {
                        //查询医保平台结算信息表中 已红冲的结算记录
                        //组织退费重收预结算信息
                        sContrl_XML = "  " +
                                      " "+ Global.Set.BackTradeNo + "" + //已红冲的HIS交易流水号
                                      " " + Global.pat.recordID + "" + //红冲后本次重收的HIS交易流水号
                                      " " + Global.user.ID + " " + //收费员
                                      " " + Global.pat.recordID + " " + //收费单据号
                                      " ";
                    }
                    sData_XML = sContrl_XML
                              + "" + sCFXX + ""
                              + "" + sMXXX + "";
                    sData_XML = JsonHelper.GetinPar(sData_XML, 2);
                    if (Global.pat.partialFlag == "Y")                        
                        rcl.BussniessObj("RePartTradeNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                    else
                        rcl.BussniessObj("TradeNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                    //解析异地门诊正式结算返回值
                    XmlDocument xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                    Boolean bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                    if (bPass == false)
                    {
                        outParam = "异地门诊正式结算失败,医保返回提示:" + OutMsg;
                        //门诊异地正式结算失败调用挂起回退
                        sData_XML = "" + Global.pat.recordID + "";
                        sData_XML = JsonHelper.GetinPar(sData_XML, 0);
                        rcl.BussniessObj("CommitTradeStateNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                        xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                        bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                        if (bPass == false)
                            outParam = outParam + "!调用挂起回退交易CommitTradeStateNation失败,医保返回提示:" + OutMsg;        
                        else             
                            outParam = outParam + "!调用挂起回退交易CommitTradeStateNation成功!";
                 
                        return -1;
                    }
                    else 
                    {
                        //异地门诊结算返回值取 正式结算TradeNation返回值为准
                        Global.Set.SettleStr = AppRtnMsg;
                        //异地门诊正式结算成功后继续调用 异地门诊结算实时对账交易
                        sData_XML = "" + Global.pat.recordID + "";
                        sData_XML = JsonHelper.GetinPar(sData_XML, 2);
                        //Global.writeLog("TradeCheckNation异地门诊交易实时对账入参:" + sData_XML);
                        rcl.BussniessObj("TradeCheckNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                        //Global.writeLog("TradeCheckNation异地门诊交易实时对账出参:", sData_XML, AppRtnMsg);
                        //解析异地门诊交易实时对账返回值
                        xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                        bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                        if (bPass == false)
                        {
                            outParam = "异地门诊正式结算成功,调用异地门诊交易实时对账失败,医保返回提示:" + OutMsg;
                            //异地门诊交易实时对账失败调用挂起回退
                            sData_XML = "" + Global.pat.recordID + "";
                            sData_XML = JsonHelper.GetinPar(sData_XML, 0);
                            rcl.BussniessObj("CommitTradeStateNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                            xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                            bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                            if (bPass == false)
                                outParam = outParam + "!调用挂起回退交易CommitTradeStateNation失败,医保返回提示:" + OutMsg;
                            else
                                outParam = outParam + "!调用挂起回退交易CommitTradeStateNation成功!";
     
                            return -1;
                        }
                        outParam = AppRtnMsg;
                        return 0;
                    }
                }
                else   //本地门诊结算-Trade结算确认
                {
                    try
                    {
                        //MessageBox.Show("即将中断程序,需要手工挂起回退!");
                        //return -1;
                        rcl.Trade(InComType, InComInstance, out AppRtnMsg);          
                        //Global.writeLog("Trade门诊结算确认出参:", sData_XML, AppRtnMsg);
                        //解析门诊结算确认返回值
                        XmlDocument xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                        Boolean bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                        if (bPass == false)
                        {       
                            outParam = "调用Trade门诊结算确认失败,此次交易中心已挂起," + OutMsg;
                            if (TradeBack(1, Global.pat.tradeNo, InComType, InComInstance, out OutMsg) != 0)                            
                                outParam = outParam + "调用TradeRollBack交易回退失败!" + OutMsg;
                            else
                                outParam = outParam + "调用Trade门诊结算确认失败,调用TradeRollBack交易回退成功!";             
                            return -1;
                        }
                        else
                        {                    
                            if (OutMsg != "")
                            {
                                MessageBox.Show("门诊交易确认中心返回警告信息如下:"+ OutMsg);
                            }                            
                            //结算确认成功返回个人账户余额
                            XmlNode dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output");
                            string blac = AnXML.FormatXMLElement(xmlDoc, dataNode, "personcountaftersub", 1);
                            //实时个人账户余额=读卡返回个人账户余额-本次结算账户支付金额
                            //Tarde交易确认返回账户余额与实时个人账户余额比对是否相同
                            /*
                            if (Global.pat.personAccountUsedFlag == 1)
                            {
                                if (decimal.Parse(Global.pat.balc) - decimal.Parse(Global.pat.acctPayAmt) != decimal.Parse(blac))
                                {
                                    if (TradeBack(2, Global.pat.tradeNo, InComType, InComInstance, out OutMsg) != 0)
                                        outParam = "【交易确认Trade返回医保账户余额" + blac + "】不等于【医保读卡返回账户余额" + Global.pat.balc + "】减去【本次结算账户支付金额" + Global.pat.acctPayAmt + "】"
                                                 + "调用TradeRollBack交易挂起回退失败,请重新结算!";
                                    else
                                        outParam = "【交易确认Trade返回医保账户余额" + blac + "】不等于【医保读卡返回账户余额" + Global.pat.balc + "】减去【本次结算账户支付金额" + Global.pat.acctPayAmt + "】"
                                                 + "调用TradeRollBack交易挂起回退成功,请重新结算!";
                                    return -1;
                                }
                            }
                            */
                            //取最新的医保账户余额
                            Global.pat.balc = blac;
                            //HISFinishedNotice本地门诊交易完成通知
                            sData_XML = "" + Global.Set.settlID + ""; //取divide费用分解出参 tradeno
                            sData_XML = JsonHelper.GetinPar(sData_XML, 0);
                            //Global.writeLog("HISFinishedNotice本地门诊交易完成通知(本地对账)入参:" + sData_XML);
                            rcl.BussniessObj("HISFinishedNotice", sData_XML, InComType, InComInstance, out AppRtnMsg);
                            //Global.writeLog("HISFinishedNotice本地门诊交易完成通知(本地对账)出参:", sData_XML, AppRtnMsg);
                            xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                            bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                            dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output");
                            string receivestate = AnXML.FormatXMLElement(xmlDoc, dataNode, "receivestate", 0);  //接收状态: 1:成功,0:失败
                            string failreason = AnXML.FormatXMLElement(xmlDoc, dataNode, "failreason", 0);      //失败原因
                            //门诊交易完成通知(本地对账)失败 必须回滚
                            if ((bPass == false) || (receivestate != "1"))                            
                            {
                                outParam = "调用Trade结算确认成功,调用HISFinishedNotice门诊交易完成通知(本地对账)失败:" + OutMsg;
                                if (TradeBack(2, Global.pat.tradeNo, InComType, InComInstance, out OutMsg) != 0)
                                    outParam = outParam + "!调用TradeRollBack交易挂起回退失败,请重新结算!";
                                else
                                    outParam = outParam + "!调用TradeRollBack交易挂起回退成功,请重新结算!";                                                                                                    
                                return -1;
                            }
                        }
                        outParam = AppRtnMsg;
                        return 0;
                    }
                    catch (Exception ex)
                    {
                        outParam = "调用Trade门诊结算确认失败,此次交易中心已挂起," + OutMsg;
                        if (DialogResult.Yes != MessageBox.Show(outParam, " 是否继续? ", MessageBoxButtons.YesNo))
                        {
                            return -1;
                        }
                        if (TradeBack(1, Global.pat.tradeNo, InComType, InComInstance, out outParam) != 0)
                        {
                            outParam = "调用Trade交易出现异常:交易回退失败!" + outParam;
                        }
                        else
                        {
                            outParam = "调用Trade交易出现异常:交易回退成功!";
                        }
                        Global.writeLog(outParam);
                        return -1;
                    }
                }
                //rcl.Close(ComType, ComInstance, out OutMsg);
            }
            catch (Exception ex)
            {
                //rcl.Close(InComType, InComInstance, out CloseMsg);
                outParam = "Settlement_OutPatNew异常:" + ex.Message;
                return -1;
            }         
        }
        /// 
        /// 本地门诊结算异常回滚
        /// 
        /// 
        /// 
        /// 
        public int TradeBack(int iLX, string tradeno, System.Type InComType, object InComInstance, out string outParam)
        {
            outParam = "";
            string Appmsg = string.Empty, AppRtnMsg = string.Empty, OutMsg = string.Empty;
            string sData_XML = string.Empty;
            if (iLX == 3)
            {
                sData_XML = "1"            // name="交易类型" 0收费交易;1全部退费,2部分退费
                          + "" + tradeno + ""  // name="收费交易流水号"   结算返回的交易流水号
                          + ""         // name="退费交易流水号"
                          + "";  // name="重收交易流水号"
            }
            else
            {
                sData_XML = "0"  // name="交易类型" 0收费交易;1全部退费,2部分退费
                          + "" + tradeno + ""
                          + ""
                          + "";
            }
            sData_XML = JsonHelper.GetinPar(sData_XML, 0);
            //Global.writeLog("TradeRollBack交易挂起回退入参:" + sData_XML);
            rcl.BussniessObj("TradeRollBack", sData_XML, InComType, InComInstance, out AppRtnMsg);
            //Global.writeLog("TradeRollBack交易挂起回退出参:" + AppRtnMsg);
            XmlDocument xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
            Boolean bPass = AnXML.CheckState(xmlDoc, out OutMsg);
            if (bPass == false)
            {
                outParam = "交易挂起回退失败:" + OutMsg;
                return -1;
            }
            else
            {
                if (OutMsg != "")
                {
                    outParam = "交易挂起回退返回警告信息如下:" + OutMsg;
                }
                string sTradeState, forbidreason;
                XmlNode dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output");
                sTradeState = dataNode.SelectNodes("tradestate")[0].InnerText;
                forbidreason = dataNode.SelectNodes("forbidreason")[0].InnerText;
                if (sTradeState != "cancel")
                {
                    outParam = "交易挂起回退返回:" + sTradeState + ",中心为禁止撤销状态,请您重新进行费用分解及确认!禁止撤销原因为:" + forbidreason;
                    return -1;
                }
                return 0;
            }
        }
        /// 
        /// 门诊退费-首信医保
        /// 
        /// 
        /// 
        /// 
        public int cancelSettleMentRecord(out string outParam)
        {
            outParam = "";
            string FunName, sLocal;
            string sData_XML, OutMsg, AppRtnMsg, tradeno, CloseMsg;
            System.Type InComType = null;
            dynamic InComInstance = "";
            try
            {
                //outParam = "041100020B240417300036";
                //return 0;
                //查询HIS医保结算记录表是否存在
                string sqlStr = "SELECT * FROM BS_MedInsuSettlement WHERE billType = 1 and ValidFlag = 1 ";
                sqlStr = sqlStr + " AND Hospital_Dr=" + Global.inf.hospitalDr + " AND Interface_Dr=" + Global.inf.interfaceDr;
                sqlStr = sqlStr + " AND SettlementID ='" + Global.pat.settlID + "'";
                JObject joSql = new JObject();
                joSql.Add("sqlStr", sqlStr);
                JObject joSettlInfo = mIS.QuerySettlementInfo(joSql);
                if (Global.pat.settlID != JsonHelper.getDestValue(joSettlInfo, "result.data[0].SettlementID"))
                    Global.pat.settlID = JsonHelper.getDestValue(joSettlInfo, "result.data[0].SettlementID");
                if (JsonHelper.getDestValue(joSettlInfo, "result.data[0].OrganSettlementID") != "")
                    Global.Set.OrganSettlementID = JsonHelper.getDestValue(joSettlInfo, "result.data[0].OrganSettlementID");
                if (JsonHelper.getDestValue(joSettlInfo, "result.data[0].MdtrtID") != "")
                    Global.pat.mdtrtID = JsonHelper.getDestValue(joSettlInfo, "result.data[0].MdtrtID");
                if (JsonHelper.getDestValue(joSettlInfo, "result.data[0].msgid") != "")
                    Global.pat.feeNo = JsonHelper.getDestValue(joSettlInfo, "result.data[0].msgid");
                if (JsonHelper.getDestValue(joSettlInfo, "result.data[0].Adm_Dr") != "")
                    Global.pat.adm_Dr = int.Parse(JsonHelper.getDestValue(joSettlInfo, "result.data[0].Adm_Dr"));
                if (JsonHelper.getDestValue(joSettlInfo, "result.data[0].RecordID") != "")
                    Global.pat.recordID = JsonHelper.getDestValue(joSettlInfo, "result.data[0].RecordID");
                string histradeno = Global.Set.OrganSettlementID + "-1";
                //创建首信医保Com实例
                if (rcl.CreateBusinessObj(out InComType, out InComInstance) != 0)
                {
                    outParam = "实例创建CreateBusinessObj失败:" + outParam;
                    return -1;
                }
                //读卡前先Open             
                rcl.Open(InComType, InComInstance, out outParam);
                //1.打开读卡窗口,操作员选择读卡类型后进行读卡器读卡,再进行1101获取参保信息
                if (readCardCancelSettle(InComType, InComInstance, out outParam) != 0)                
                {
                    rcl.Close(InComType, InComInstance, out CloseMsg);
                    outParam = "读卡readCard失败:" + outParam;
                    return -1;
                }
                else
                {
                    //展示患者信息界面
                    if (showPatInfoNew(outParam, out outParam) != 0)
                    {
                        rcl.Close(InComType, InComInstance, out CloseMsg);
                        outParam = "展示参保人员信息showPatInfoNew失败:" + outParam;
                        return -1;
                    }
                }
                //退费-本地
                if (Global.pat.iOtherProvLocal == 0)
                {
                    //1.RefundmentDivideAll退费分解
                    sData_XML = ""
                              + "" + Global.pat.settlID + "" // name="交易流水号"
                              + "" + Global.user.ID + "" // name="收费员"
                              + "0" // name="退费方式,0全部退费,1部分退费"
                              + "" + Global.Set.OrganSettlementID + "" // name="收费单据号"
                              + "";
                    sData_XML = JsonHelper.GetinPar(sData_XML, 2);
                    rcl.BussniessObj("RefundmentDivideAll", sData_XML, InComType, InComInstance, out AppRtnMsg);
                    //解析返回值
                    XmlDocument xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                    Boolean bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                    XmlNode dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output/fulltrade/tradeinfo");
                    if (bPass == false)
                    {
                        outParam = "调用RefundmentDivideAll退费分解失败:" + OutMsg;
                        return -1;
                    }
                    else
                    {
                        if (OutMsg != "")
                        {
                            MessageBox.Show("调用RefundmentDivideAll退费分解成功,但中心返回警告信息如下:" + OutMsg);
                        }
                        tradeno = AnXML.FormatXMLElement(xmlDoc, dataNode, "tradeno", 0);  //退费分解成功返回退费流水号
                        //2.TradeALL退费确认
                        rcl.TradeAll(InComType, InComInstance, out AppRtnMsg);
                        //Global.writeLog("TradeALL退费确认出参:", sData_XML, AppRtnMsg);
                        xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                        bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                        if (bPass == false)
                        {
                            outParam = "调用RefundmentDivideAll退费分解成功,调用TradeAll退费确认失败," + OutMsg;
                            if (TradeBack(3, Global.pat.settlID, InComType, InComInstance, out OutMsg) != 0)
                            {
                                outParam = outParam + "调用TradeRollBack交易挂起回退失败:请手动执行回退退费交易,本次退费失败!" + OutMsg;
                            }
                            else
                            {
                                outParam = outParam + "调用TradeRollBack交易挂起回退成功,本次退费失败!";
                            }
                            Global.writeLog("TradeNo:" + Global.pat.settlID + outParam + OutMsg);
                            return -1;
                        }
                        else
                        {
                            if (OutMsg != "")
                            {
                                MessageBox.Show("调用RefundmentDivideAll退费分解成功,调用TradeALL退费确认成功,返回警告信息:" + OutMsg);
                            }
                            //3.HISFinishedNotice门诊退费交易完成通知
                            //sData_XML = "" + Global.pat.settlID + "";
                            sData_XML = "" + tradeno + "";
                            sData_XML = JsonHelper.GetinPar(sData_XML, 0);
                            //Global.writeLog("HISFinishedNotice门诊退费交易完成通知入参:" + sData_XML);
                            rcl.BussniessObj("HISFinishedNotice", sData_XML, InComType, InComInstance, out AppRtnMsg);
                            //Global.writeLog("HISFinishedNotice门诊退费交易完成通知出参:", sData_XML, AppRtnMsg);
                            xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                            bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                            dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output");
                            string receivestate = AnXML.FormatXMLElement(xmlDoc, dataNode, "receivestate", 0);  //接收状态: 1:成功,0:失败
                            if ((bPass == false) || (receivestate != "1"))
                            {
                                outParam = "调用RefundmentDivideAll退费分解成功,调用TradeALL退费确认成功,调用HISFinishedNotice退费交易完成通知失败!" + OutMsg;
                                if (TradeBack(3, Global.pat.settlID, InComType, InComInstance, out OutMsg) != 0)
                                {
                                    outParam = outParam + "调用TradeRollBack交易挂起回退异常:交易回退失败,请手动执行回退退费交易,本次退费失败!" + OutMsg;
                                }
                                else
                                {
                                    outParam = outParam + "调用TradeRollBack交易挂起回退成功,本次退费失败!";
                                }
                                Global.writeLog("TradeNo:" + Global.pat.settlID + outParam + OutMsg);
                                return -1;
                            }
                            else
                            {
                                if (OutMsg != "")
                                    MessageBox.Show("调用HISFinishedNotice门诊退费交易完成通知成功,返回警告信息如下:" + OutMsg);
                                outParam = tradeno;                               
                            }
                        }
                    }
                }
                else
                {                   
                    //1.RefundmentTradeAllNation异地门诊退费结算
                    sData_XML = "" + histradeno + ""  //本次红冲交易流水号
                              + "" + Global.Set.OrganSettlementID + ""  //被退交易流水号
                              + "" + Global.user.ID + "" //退费操作员的姓名或者工号,可为空
                              + ""; //重收交易对应的收据号,由财政局、税务局和部队统一制定;有重收交易时必填;(2021年1月1日起,由票据代码与票据号码拼接后填写)
                    sData_XML = JsonHelper.GetinPar(sData_XML, 2);    
                    rcl.BussniessObj("RefundmentTradeAllNation", sData_XML, InComType, InComInstance, out AppRtnMsg);        
                    //解析返回值
                    XmlDocument xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                    Boolean bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                    XmlNode dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output/tradeinfo");
                    if (bPass == false)
                    {
                        outParam = "调用RefundmentTradeAllNation门诊退费结算失败,中心返回错误信息:" + OutMsg;
                        sData_XML = "" + histradeno + "";
                        sData_XML = JsonHelper.GetinPar(sData_XML, 0);
                        rcl.BussniessObj("CommitTradeStateNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                        //解析返回值
                        xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                        bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                        if (bPass == false)
                            outParam = outParam + "!调用挂起回退交易CommitTradeStateNation失败!中心返回错误信息:" + OutMsg + ",本次异地门诊退费失败!";
                        else
                            outParam = outParam + "!调用挂起回退交易CommitTradeStateNation成功!本次异地门诊退费失败!";
                        Global.writeLog("histradeno:" + histradeno + outParam + OutMsg);
                        return -1;
                    }
                    else
                    {
                        tradeno = dataNode.SelectNodes("tradeno")[0].InnerText; //门诊退费结算成功返回退费流水号
                        //2.TradeCheckNation异地门诊退费结算实时对账
                        sData_XML = "" + histradeno + "";
                        sData_XML = JsonHelper.GetinPar(sData_XML, 2);
                        rcl.BussniessObj("TradeCheckNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                        //解析返回值
                        xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                        bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                        dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output");
                        //string checkflag = dataNode.SelectNodes("checkflag")[0].InnerText; //对账标志 1-对账成功;2-无效交易
                        string checkflag = AnXML.FormatXMLElement(xmlDoc, dataNode, "checkflag", 0);  //对账标志 1-对账成功;2-无效交易
                        if ((bPass == false) || (checkflag != "1"))
                        {
                            outParam = " 调用RefundmentTradeAllNation异地门诊退费结算成功,调用TradeCheckNation异地门诊退费结算实时对账失败,中心返回失败原因:" + OutMsg;
                            sData_XML = "" + histradeno + "";
                            sData_XML = JsonHelper.GetinPar(sData_XML, 0);        
                            rcl.BussniessObj("CommitTradeStateNation", sData_XML, InComType, InComInstance, out AppRtnMsg);
                            //解析返回值
                            xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                            bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                            if (bPass == false)
                                outParam = outParam + "调用CommitTradeStateNation门诊挂起回退失败!中心返回错误信息:" + OutMsg + ",本次异地门诊退费失败!";
                            else
                                outParam = outParam + "调用CommitTradeStateNation门诊挂起回退成功!本次异地门诊退费失败!";
                            Global.writeLog("histradeno:" + histradeno + outParam + OutMsg);
                            return -1;
                        }
                    }
                }
                #region【退费打印发票】
                string sYWLSH = "HIS05155009" + DateTime.Now.ToString("yyMMddHHmmss"); //自定义业务流水号
                string AdmID = Global.pat.adm_Dr.ToString();       
                string OrganSettlementID = Global.pat.feeNo; //门诊结算返回feeno收费单据号存在结算表msgid字段
                string RecordID = Global.pat.recordID;
                if (Global.pat.iOtherProvLocal == 0)
                {
                    //本地收据打印PrintInvoice
                    sData_XML = "" + tradeno + ""  // name = "交易流水号"
                              + "" + OrganSettlementID + ""   // name = "收费单据号" feeno
                              + "" + sYWLSH + ""   // name ="业务流水号"
                              + "盈利性一级专科"       // name="医疗机构类型"
                              + "" + RecordID + ""   // name="票据代码"   HIS结算完成后 生成票据代码 传给DLL 
                              + " " + AdmID + "";
                    FunName = "PrintInvoice";
                    sLocal = "本地收据打印PrintInvoice:";
                }
                else
                {
                    //异地收据打印PrintInvoiceNation
                    sData_XML = "" + histradeno + ""  // name = "交易流水号"
                              + "" + OrganSettlementID + ""   // name = "收费单据号"
                              + "" + sYWLSH + ""   // name ="业务流水号"
                              + "盈利性一级专科"       // name="医疗机构类型"
                              + "" + RecordID + ""   // name="票据代码"
                              + " " + RecordID + "";
                    FunName = "PrintInvoiceNation";
                    sLocal = "异地收据打印PrintInvoiceNation:";
                }
                sData_XML = JsonHelper.GetinPar(sData_XML, 2);
                rcl.BussniessObj(FunName, sData_XML, InComType, InComInstance, out AppRtnMsg);
                outParam = tradeno;
                #endregion
                return 0;
            }
            catch (Exception ex)
            {
                //rcl.Close(InComType, InComInstance, out CloseMsg);
                outParam = "门诊退费异常:" + ex.Message;
                return -1;
            }
            finally
            {
                rcl.Close(InComType, InComInstance, out CloseMsg);
            }
        
        }
        /// 
        /// XML转换JSON对象
        /// 
        /// 
        /// 
        /// 
        public JObject ConvertXMLToObject(string sXML)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(sXML);
            string jsonStr = JsonConvert.SerializeXmlNode(xmlDoc);
            jsonStr = jsonStr.Replace("@", "").ToString();
            //MessageBox.Show(jsonStr);
            return JObject.Parse(jsonStr);
        }
        /// 
        /// 展示门诊结算返回的费用明细信息
        /// 
        /// 
        /// 
        public int showMedInsuFeeOP(string sXML,out string outParam)
        {
            outParam = "";
            if (sXML == "")
            {
                outParam = "传入的结算返回值XML为空!";
                return -1;
            }
            try
            {
                JObject joFee = ConvertXMLToObject(sXML); //XML转换成JSON数组  当返回的feeitemarray为单一行数据时 这里没有转换成JSON数组
                MedInsuFee frmFee = new MedInsuFee();
                int iCount = tools.CountOccurrences(sXML, "itemno");
                //根据返回值中的费用记录行来分别处理
                if (iCount > 1)
                {
                    frmFee.DtFee = (DataTable)joFee["root"]["output"]["feeitemarray"]["feeitem"].ToObject(typeof(DataTable));
                }
                else
                {
                    JArray jaFee = new JArray(JObject.Parse(JsonHelper.getDestValue(joFee, "root.output.feeitemarray.feeitem")));
                    //jaFee.Add(JObject.Parse(getDestValue(joRtn, "root.output.feeitemarray.feeitem")));
                    frmFee.DtFee = (DataTable)jaFee.ToObject(typeof(DataTable));
                }
                frmFee.ShowDialog();
                return 0;
            }
            catch (Exception ex)
            {
                outParam = "解析门诊结算费用明细返回值异常:" + ex.Message;
                return -1;
            }         
        }
        /// 
        /// 弹框手工录入本次住院医保支付金额
        /// 
        /// 
        /// 
        /// 
        /// 
        public int InputInsuAmt(string hisAmt,string hisPreAmt, out string outParam)
        {
            outParam = "";
            if ((hisAmt == "") || (decimal.Parse(hisAmt) <= 0))            
            {
                outParam = "传入的his总金额" + hisAmt + "无效!";
                return -1;
            }
            if ((hisPreAmt == "") || (decimal.Parse(hisPreAmt) < 0))            
            {
                outParam = "传入的HIS预交金额" + hisPreAmt + "无效!";
                return -1;
            }
            try
            {
                SettlementInfoIP frmSetl = new SettlementInfoIP(hisAmt, hisPreAmt);
                if (frmSetl.ShowDialog() != DialogResult.OK)
                {
                    outParam = "收费员取消操作!";
                    return -1;
                }
                else
                {                    
                    Global.pat.hisSumAmt = frmSetl.hisSumAmt.ToString();
                    Global.pat.hisPrePayment = frmSetl.hisPreAmt.ToString();
                    Global.pat.insuAmt = frmSetl.insuAmt.ToString();
                    Global.pat.cashpayAmt = frmSetl.cashpayAmt.ToString();
                    Global.pat.acctPayAmt = frmSetl.acctPayAmt.ToString();
                    return 0;
                }                             
            }
            catch (Exception ex)
            {
                outParam = "住院结算金额汇总异常:" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 预结算封装,返回正式结算的入参
        /// 
        /// 
        /// 
        /// 
        public int preSettlement(string funNO,out JObject joSettlement, out string outParam)
        {
            joSettlement = new JObject();
            outParam = "";
            string outPar = "";
            //调用IRIS获取医保各项金额
            if (mIS.getSumFee(out outPar) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "获取医保费用各项汇总金额", outPar).ToString();
                return -1;
            }
            JObject joSumFee = JObject.Parse(outPar);
            if ((JsonHelper.getDestValue(joSumFee, "data.Sumamt") == "") || (JsonHelper.getDestValue(joSumFee, "data.Sumamt") == "0"))
            {
                outParam = "请先右击选择【医保费用上传】!";
                return -1;
            }
            //从云医保平台获取患者详细的医保登记信息
            int type;
            if (funNO == "2206")
            {
                type = 3;  //门诊预结算
            }
            else
            {
                type = 1;  //住院预结算
            }
            if (mIS.queryRegisterInfo(type, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "查询患者云平台登记信息", outParam).ToString();
                return -1;
            }
            JObject joReg = JObject.Parse(outParam);
            Global.pat.medType = JsonHelper.getDestValue(joReg, "data.MedicalType");
            Global.pat.insuType = JsonHelper.getDestValue(joReg, "data.InsuType");
            if ((Global.pat.mdtrtcertType == "") || (Global.pat.mdtrtcertNO == ""))
            {
                Global.pat.mdtrtcertType = JsonHelper.getDestValue(joReg, "data.CertificateType");
                Global.pat.mdtrtcertNO = JsonHelper.getDestValue(joReg, "data.CertificateNO");
            }
            //Global.pat.mdtrtcertType = JsonHelper.getDestValue(joReg, "data.CertificateType");
            //Global.pat.mdtrtcertNO = JsonHelper.getDestValue(joReg, "data.CertificateNO");
            Global.pat.certType = JsonHelper.getDestValue(joReg, "data.CertificateType");
            Global.pat.certNO = JsonHelper.getDestValue(joReg, "data.CertificateNO");
            Global.pat.insuplc_admdvs = JsonHelper.getDestValue(joReg, "data.InsuranceAreaCode");
            Global.pat.psn_type = Global.pat.insuType;   //后面再改
            if ((Global.pat.RYorCY == "2") && (Global.pat.medType == "26"))
            {
                Global.pat.DiseasecCode = JsonHelper.getDestValue(joReg, "data.DiseasecCode");
                Global.pat.DiseasecName = JsonHelper.getDestValue(joReg, "data.DiseasecName");
            }
            //昆明结算前读卡核验身份
            //string patInfo = "";
            //if (readCard(out patInfo) != 0)
            //{
            //    outParam = JsonHelper.setExceptionJson(-1, "readCard", patInfo).ToString();
            //    return -1;
            //}
            //调用服务获取门诊诊断信息
            string diagnoses;
            if (hIS.getPatDiagnoses(Global.pat, out diagnoses) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "getPatDiagnoses", diagnoses).ToString();
                return -1;
            }
            JObject joDiagnoses = JObject.Parse(diagnoses);
            //展示出院登记界面,选择结算方式等
            if (showDischargeRegisterForm(funNO, joSumFee, joDiagnoses, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "展示出院预结算界面", outParam).ToString();
                return -1;
            }           
            JObject joRtn = JObject.Parse(outParam);
            JObject jo2303Inpar = JObject.Parse(JsonHelper.getDestValue(joRtn, "Settlement"));
            JObject jo2402Inpar = JObject.Parse(JsonHelper.getDestValue(joRtn, "DischargeRegister"));
            //昆明出院登记放再预结算之前
            JObject jo2402Rtn = invoker.invokeCenterService("2402", JsonHelper.setCenterInpar("2402", jo2402Inpar));
            string errMsg;
            if (JsonHelper.parseCenterRtnValue(jo2402Rtn, out errMsg) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "预结算失败:出院登记失败", errMsg).ToString();
                return -1;
            }
            //预结算 
            JObject jo2303Data = new JObject();
            jo2303Data.Add("data", jo2303Inpar);
            JObject jo2303Rtn = invoker.invokeCenterService(funNO, JsonHelper.setCenterInpar(funNO, jo2303Data));
            if (JsonHelper.parseCenterRtnValue(jo2303Rtn, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "出院预结算", outParam).ToString();
                return -1;
            }
            //预结算结果传给HIS进行HIS判断 
            if (funNO == "2303")
            {
                //返回给HIS
                JObject joSetlinfo = JObject.Parse(JsonHelper.getDestValue(jo2303Rtn, "output.setlinfo"));
                JObject joParam = new JObject();
                joParam.Add("admID", Global.pat.adm_Dr);
                joParam.Add("recordID", Global.pat.recordID);
                joParam.Add("billID", Global.pat.billID);
                if (hIS.preSettlementInfo(joParam, joSetlinfo, out outParam) != 0)
                {
                    outParam = JsonHelper.setExceptionJson(-1, "出院预结算", outParam).ToString();
                    return -1;
                }
            }
            
            //编码转换
            if (mIS.convertSettlementWithInsuCode(jo2303Rtn, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "结算信息转换", outParam).ToString();
                return -1;
            }
            //展示结算信息
            JObject joConverted = JObject.Parse(outParam);
            if (showSettlementForm(joConverted, out outParam) != 0)
            {
                outParam = JsonHelper.setExceptionJson(-1, "结算信息展示", outParam).ToString();
                return -1;
            }
            else
            {
                joSettlement = (JObject)joRtn.DeepClone();
                return 0;
            }
        }
        public int returnToFrontEndAfterSettlementOP(string AppRtnMsg, int iOtherProvLocal, JObject joHisServieRtn, out string outParam)
        {
            outParam = "";
            JObject joSetlInfo = new JObject();
            JObject joOutPutInfo = new JObject();
            try
            {
                if (mIS.GetSettlementRtnValue(AppRtnMsg, iOtherProvLocal, out string errMsg) != 0)
                {
                    outParam = errMsg;
                    return -1;
                }
                string fQTJJZF = "0";
                //decimal fQTJJZF = decimal.Parse(Global.Set.bcpay)
                //                + decimal.Parse(Global.Set.jcbz)
                //                + decimal.Parse(Global.Set.txbz)
                //                + decimal.Parse(Global.Set.offi_true)
                //                + decimal.Parse(Global.Set.big_ill_pay)
                //                + decimal.Parse(Global.Set.civil_pay)
                //                + decimal.Parse(Global.Set.ExServicePay);
                Global.pat.feeNo = Global.Set.feeno;
                Global.pat.settlID = Global.Set.tradeno;
                ////明细信息(feeitem)
                //XmlNode FeeTtemArrayNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output/feeitemarray");
                //string recipeno = FeeTtemArrayNode.SelectNodes("feeitem")[0].Attributes["recipeno"].InnerText; //处方序号
                //MessageBox.Show("解析XML结果:\r\n交易流水号:" + tradeno + "\r\n收费单据号:" + feeno + "\r\n处方号:" + recipeno);
                //按照基线版医保接口结算返回值格式和字段重新组织首信医保接口结算返回值
                JObject joSetl = new JObject();
                if (iOtherProvLocal == 0)
                {
                    joSetl.Add("setl_id", Global.Set.tradeno);      //结算ID
                    joSetl.Add("setl_time", Global.Set.tradedate);      //结算时间
                    joSetl.Add("cvlserv_pay", 0);      //公务员医疗补助资金支出
                    joSetl.Add("hifdm_pay", Global.Set.jcbz);      //伤残人员医疗保障基金支出
                    joSetl.Add("cvlserv_flag", "");      //公务员标志
                    joSetl.Add("med_type", Global.pat.medType);      //医疗类别
                    joSetl.Add("exp_content", "");      //字段扩展
                    joSetl.Add("brdy", Global.pat.brdy);      //出生日期
                    joSetl.Add("naty", Global.pat.naty);      //民族
                    joSetl.Add("psn_cash_pay", Global.Set.cash);      //个人现金支出
                    joSetl.Add("certno", Global.pat.certNO);      //证件号码
                    joSetl.Add("hifmi_pay", Global.Set.big_ill_pay);      //居民大病保险资金支出
                    joSetl.Add("psn_no", Global.pat.psn_no);      //人员编号
                    joSetl.Add("act_pay_dedc", Global.Set.mzpayfirst);      //实际支付起付线
                    joSetl.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);      //就诊凭证类型
                    joSetl.Add("balc", Global.pat.balc);      //余额
                    joSetl.Add("medins_setl_id", Global.Set.feeno);      //医药机构结算ID
                    joSetl.Add("psn_cert_type", Global.pat.certType);      //人员证件类型
                    joSetl.Add("acct_mulaid_pay", "");      //个人账户共济支付金额
                    joSetl.Add("clr_way", Global.pat.iOtherProvLocal);         //清算方式 0本地 1异地
                    joSetl.Add("hifob_pay", Global.Set.mzbigpay);      //职工大额医疗费用补助基金支出
                    joSetl.Add("oth_pay", fQTJJZF);      //其他支出
                    joSetl.Add("medfee_sumamt", Global.Set.feeall);      //医疗费总额
                    joSetl.Add("hifes_pay", Global.Set.offi_true);      //企业补充医疗保险基金支出
                    joSetl.Add("gend", Global.pat.gend);      //性别
                    joSetl.Add("mdtrt_id", Global.pat.mdtrtID);      //就诊ID
                    joSetl.Add("acct_pay", Global.Set.personcountpay);      //个人账户支出
                    joSetl.Add("fund_pay_sumamt", Global.Set.fund);      //基金支付总额
                    joSetl.Add("fulamt_ownpay_amt", Global.Set.mzfeeout);      //全自费金额
                    joSetl.Add("hosp_part_amt", 0);      //医院负担金额          
                    joSetl.Add("inscp_scp_amt", Global.Set.mzfeein);      //符合政策范围金额
                    joSetl.Add("insutype", Global.pat.insuType);      //险种类型
                    joSetl.Add("maf_pay", Global.Set.civil_pay);      //医疗救助基金支出
                    joSetl.Add("psn_name", Global.pat.name);      //人员姓名
                    joSetl.Add("psn_part_amt", decimal.Parse(Global.Set.cash) + decimal.Parse(Global.Set.personcountpay));      //个人负担总金额
                    joSetl.Add("clr_optins", Global.Set.clearingOrgan);      //清算经办机构
                    joSetl.Add("pool_prop_selfpay", "");      //基本医疗保险统筹基金支付比例
                    joSetl.Add("psn_type", Global.pat.psn_type);      //人员类别
                    joSetl.Add("hifp_pay", Global.Set.fund);      //基本医疗保险统筹基金支出
                    joSetl.Add("overlmt_selfpay", Global.Set.mzoutofbig);      //超限价金额
                    joSetl.Add("preselfpay_amt", "");      //先行自付金额
                    joSetl.Add("age", Global.pat.age);      //年龄
                    joSetl.Add("clr_type", "");      //清算类别
                }
                else
                {
                    joSetl.Add("setl_id", Global.Set.tradeno);      //结算ID
                    joSetl.Add("setl_time", Global.Set.tradedate);      //结算时间
                    joSetl.Add("cvlserv_pay", Global.Set.GwybzPay);      //公务员医疗补助资金支出
                    joSetl.Add("hifdm_pay", Global.Set.jcbz);      //伤残人员医疗保障基金支出
                    joSetl.Add("cvlserv_flag", Global.Set.SelfPayFlag);      //公务员标志
                    joSetl.Add("med_type", Global.pat.medType);      //医疗类别
                    joSetl.Add("exp_content", "");      //字段扩展
                    joSetl.Add("brdy", Global.pat.brdy);      //出生日期
                    joSetl.Add("naty", Global.pat.naty);      //民族
                    joSetl.Add("psn_cash_pay", Global.Set.cash);      //个人现金支出
                    joSetl.Add("certno", Global.pat.certNO);      //证件号码
                    joSetl.Add("hifmi_pay", Global.Set.mzbigpay);      //居民大病保险资金支出
                    joSetl.Add("psn_no", Global.pat.psn_no);      //人员编号
                    joSetl.Add("act_pay_dedc", Global.Set.mzpayfirst);      //实际支付起付线
                    joSetl.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);      //就诊凭证类型
                    joSetl.Add("balc", Global.pat.balc);      //余额
                    joSetl.Add("medins_setl_id", Global.Set.feeno);      //医药机构结算ID
                    joSetl.Add("psn_cert_type", Global.pat.certType);      //人员证件类型
                    joSetl.Add("acct_mulaid_pay", 0);      //个人账户共济支付金额
                    joSetl.Add("clr_way", iOtherProvLocal);      //清算方式
                    joSetl.Add("hifob_pay", Global.Set.mzbigpay);      //职工大额医疗费用补助基金支出
                    joSetl.Add("oth_pay", fQTJJZF);      //其他支出
                    joSetl.Add("medfee_sumamt", Global.Set.feeall);      //医疗费总额
                    joSetl.Add("hifes_pay", Global.Set.bcpay);      //企业补充医疗保险基金支出
                    joSetl.Add("gend", Global.pat.gend);      //性别
                    joSetl.Add("mdtrt_id", Global.pat.mdtrtID);      //就诊ID
                    joSetl.Add("acct_pay", Global.Set.personcountpay);      //个人账户支出
                    joSetl.Add("fund_pay_sumamt", Global.Set.fund);      //基金支付总额
                    joSetl.Add("fulamt_ownpay_amt", Global.Set.mzfeeout);      //全自费金额
                    joSetl.Add("hosp_part_amt", 0);      //医院负担金额          
                    joSetl.Add("inscp_scp_amt", Global.Set.mzfeein);      //符合政策范围金额
                    joSetl.Add("insutype", Global.pat.insuType);      //险种类型
                    joSetl.Add("maf_pay", Global.Set.MzbzPay);      //医疗救助基金支出
                    joSetl.Add("psn_name", Global.pat.name);      //人员姓名
                    joSetl.Add("psn_part_amt", decimal.Parse(Global.Set.cash) + decimal.Parse(Global.Set.personcountpay));      //个人负担总金额
                    joSetl.Add("clr_optins", Global.Set.clearingOrgan);      //清算经办机构
                    joSetl.Add("pool_prop_selfpay", "");      //基本医疗保险统筹基金支付比例
                    joSetl.Add("psn_type", Global.pat.psn_type);      //人员类别
                    joSetl.Add("hifp_pay", Global.Set.fund);      //基本医疗保险统筹基金支出
                    joSetl.Add("overlmt_selfpay", Global.Set.OVERLMT_SELFPAY);      //超限价金额
                    joSetl.Add("preselfpay_amt", Global.Set.selfPayFirst);      //先行自付金额
                    joSetl.Add("age", Global.pat.age);      //年龄
                    joSetl.Add("clr_type", "");      //清算类别
                }
                //joSetlInfo = new JObject();
                //joSetlInfo.Add("settleInfo", joSetl);
                joOutPutInfo = new JObject();
                joOutPutInfo.Add("output", joSetl);
                JObject johisInsuInfo = JObject.Parse(JsonHelper.getDestValue(joHisServieRtn, "result"));
                johisInsuInfo.Add("setl_id", JsonHelper.getDestValue(joOutPutInfo, "output.setlinfo.setl_id"));
                JObject joTmp = (JObject)joOutPutInfo.DeepClone();
                joTmp.Add("hisInsuInfo", johisInsuInfo);
                outParam = joTmp.ToString();
                return 0;
            }
            catch (Exception ex)
            {
                outParam = "returnToFrontEndAfterSettlementOP:" + ex.Message;
                return -1;
            }
        }
        public int returnToFrontEndAfterSettlementNewIP(JObject joHisServieRtn, out string outParam)
        {
            outParam = "";
            JObject joSetlInfo = new JObject();
            JObject joOutPutInfo = new JObject();
            try
            {                
                //按照基线版医保接口结算返回值格式和字段重新组织首信医保接口结算返回值
                JObject joSetl = new JObject();
                joSetl.Add("setl_id", Global.Set.settlID);      //结算ID
                joSetl.Add("setl_time", Global.Set.hisDischargeTime);      //结算时间
                joSetl.Add("cvlserv_pay", 0);      //公务员医疗补助资金支出
                joSetl.Add("hifdm_pay", 0);      //伤残人员医疗保障基金支出
                joSetl.Add("cvlserv_flag", "");      //公务员标志
                joSetl.Add("med_type", Global.pat.medType);      //医疗类别
                joSetl.Add("exp_content", "");      //字段扩展
                joSetl.Add("brdy", Global.pat.brdy);      //出生日期
                joSetl.Add("naty", Global.pat.naty);      //民族
                joSetl.Add("psn_cash_pay", Global.pat.cashpayAmt);      //个人现金支出
                joSetl.Add("certno", Global.pat.certNO);      //证件号码
                joSetl.Add("hifmi_pay", 0);      //居民大病保险资金支出
                joSetl.Add("psn_no", Global.pat.psn_no);      //人员编号
                joSetl.Add("act_pay_dedc", 0);      //实际支付起付线
                joSetl.Add("mdtrt_cert_type", Global.pat.mdtrtcertType);      //就诊凭证类型
                joSetl.Add("balc", Global.pat.balc);      //余额
                joSetl.Add("medins_setl_id", Global.pat.billID);      //医药机构结算ID
                joSetl.Add("psn_cert_type", Global.pat.certType);      //人员证件类型
                joSetl.Add("acct_mulaid_pay", "");      //个人账户共济支付金额
                joSetl.Add("clr_way", "");      //清算方式
                joSetl.Add("hifob_pay", 0);      //职工大额医疗费用补助基金支出
                joSetl.Add("oth_pay", 0);      //其他支出
                joSetl.Add("medfee_sumamt", Global.pat.hisSumAmt);      //医疗费总额
                joSetl.Add("hifes_pay", 0);      //企业补充医疗保险基金支出
                joSetl.Add("gend", Global.pat.gend);      //性别
                joSetl.Add("mdtrt_id", Global.pat.mdtrtID);      //就诊ID
                joSetl.Add("acct_pay", Global.pat.acctPayAmt);      //个人账户支出
                joSetl.Add("fund_pay_sumamt", Global.pat.insuAmt);      //基金支付总额
                joSetl.Add("fulamt_ownpay_amt", 0);      //全自费金额
                joSetl.Add("hosp_part_amt", 0);      //医院负担金额          
                joSetl.Add("inscp_scp_amt", 0);      //符合政策范围金额
                joSetl.Add("insutype", Global.pat.insuType);      //险种类型
                joSetl.Add("maf_pay", Global.pat.insuAmt);      //医疗救助基金支出
                joSetl.Add("psn_name", Global.pat.name);      //人员姓名
                joSetl.Add("psn_part_amt", decimal.Parse(Global.pat.cashpayAmt) + decimal.Parse(Global.pat.acctPayAmt));      //个人负担总金额
                joSetl.Add("clr_optins", "");      //清算经办机构
                joSetl.Add("pool_prop_selfpay", "");      //基本医疗保险统筹基金支付比例
                joSetl.Add("psn_type", Global.pat.psn_type);      //人员类别
                joSetl.Add("hifp_pay", Global.pat.insuAmt);      //基本医疗保险统筹基金支出
                joSetl.Add("overlmt_selfpay", 0);      //超限价金额
                joSetl.Add("preselfpay_amt", "");      //先行自付金额
                joSetl.Add("age", Global.pat.age);      //年龄
                joSetl.Add("clr_type", "");      //清算类别
                JObject joSetldetail = new JObject();
                joSetldetail.Add("fund_pay_type", "310100");
                joSetldetail.Add("fund_payamt", Global.pat.insuAmt);
                joSetldetail.Add("setl_proc_info", "");
                joSetldetail.Add("crt_payb_lmt_amt", "0.00");
                joSetldetail.Add("inscp_scp_amt", Global.pat.insuAmt);
                joSetldetail.Add("fund_pay_type_name", "基本医疗保险统筹基金");
                JObject joSetldetail2 = new JObject();
                joSetldetail2.Add("fund_pay_type", "310200");
                joSetldetail2.Add("fund_payamt", Global.pat.acctPayAmt);
                joSetldetail2.Add("setl_proc_info", "");
                joSetldetail2.Add("crt_payb_lmt_amt", "0.00");
                joSetldetail2.Add("inscp_scp_amt", Global.pat.acctPayAmt);
                joSetldetail2.Add("fund_pay_type_name", "基本医疗保险个人账户基金");
                JArray jaSetldetail = new JArray();
                jaSetldetail.Add(joSetldetail);
                jaSetldetail.Add(joSetldetail2);
                joSetlInfo = new JObject();
                joSetlInfo.Add("setlinfo", joSetl);
                joSetlInfo.Add("setldetail", jaSetldetail);
                joOutPutInfo = new JObject();
                joOutPutInfo.Add("output", joSetlInfo);
                joOutPutInfo.Add("infcode", 0);
                joOutPutInfo.Add("warn_msg", "");
                joOutPutInfo.Add("cainfo", "");
                joOutPutInfo.Add("err_msg", "");
                joOutPutInfo.Add("refmsg_time", "");
                joOutPutInfo.Add("signtype", "");
                joOutPutInfo.Add("respond_time", "");
                joOutPutInfo.Add("inf_refmsgid", "");
                JObject johisInsuInfo = JObject.Parse(JsonHelper.getDestValue(joHisServieRtn, "result"));
                johisInsuInfo.Add("setl_id", Global.Set.settlID);
                JObject joTmp = (JObject)joOutPutInfo.DeepClone();
                joTmp.Add("hisInsuInfo", johisInsuInfo);
                outParam = joTmp.ToString();
                return 0;
            }
            catch (Exception ex)
            {
                outParam = "returnToFrontEndAfterSettlementNew_ZY:" + ex.Message;
                return -1;
            }
        }
        public int returnToFrontEndAfterSettlement(JObject joCenterRtn,JObject joHisServieRtn, out string outParam)
        {
            outParam = "";
            try
            {
                JObject johisInsuInfo = JObject.Parse(JsonHelper.getDestValue(joHisServieRtn, "result"));
                johisInsuInfo.Add("setl_id", JsonHelper.getDestValue(joCenterRtn, "output.setlinfo.setl_id"));
                JObject joTmp = (JObject)joCenterRtn.DeepClone();              
                joTmp.Add("hisInsuInfo", johisInsuInfo);
                outParam = joTmp.ToString();
                return 0;
            }
            catch (Exception ex)
            {
                outParam = "returnToFrontEndAfterSettlement:" + ex.Message;
                return -1;
            }
        }
        public int printBill(System.Type InComType, dynamic InComInstance, out string outParam)
        {
            outParam = "";
            string sData_XML, FunName, AppRtnMsg, sLocal;
            string sYWLSH = "HIS05155009" + DateTime.Now.ToString("yyMMddHHmmss"); //自定义业务流水号
            string AdmID = Global.pat.adm_Dr.ToString();
            string SettlementID = Global.pat.settlID;
            string OrganSettlementID = Global.pat.feeNo; //门诊结算返回feeno收费单据号存在结算表msgid字段
            string RecordID = Global.pat.recordID;
            if (Global.pat.iOtherProvLocal == 0)
            {
                //本地收据打印PrintInvoice
                sData_XML = "" + SettlementID + ""  // name = "交易流水号"
                          + "" + OrganSettlementID + ""   // name = "收费单据号" feeno
                          + "" + sYWLSH + ""   // name ="业务流水号"
                          + "盈利性一级专科"       // name="医疗机构类型"
                          + "" + RecordID + ""   // name="票据代码"   HIS结算完成后 生成票据代码 传给DLL 
                          + " " + AdmID + "";
                FunName = "PrintInvoice";
                sLocal = "本地收据打印PrintInvoice:";
            }
            else
            {
                //异地收据打印PrintInvoiceNation
                sData_XML = "" + OrganSettlementID + ""  // name = "交易流水号"
                          + "" + OrganSettlementID + ""   // name = "收费单据号"
                          + "" + sYWLSH + ""   // name ="业务流水号"
                          + "盈利性一级专科"       // name="医疗机构类型"
                          + "" + RecordID + ""   // name="票据代码"
                          + " " + RecordID + "";
                FunName = "PrintInvoiceNation";
                sLocal = "异地收据打印PrintInvoiceNation:";
            }
            try
            {
                sData_XML = JsonHelper.GetinPar(sData_XML, 2);
                rcl.BussniessObj(FunName, sData_XML, InComType, InComInstance, out AppRtnMsg);
                //Global.writeLog(sLocal, sData_XML, AppRtnMsg);
                return 0;
            }
            catch (Exception ex)
            {
                outParam = sLocal + "异常" + ex.Message;
                return -1;
            }
        }
        /// 
        /// 插入患者该次就诊参保信息
        /// 
        /// 
        /// 
        /// 
        /// 
        public int insertPatCurInsuInfo(String patInfo, out string outparam)
        {
            Global.writeLog(" " + patInfo);
            outparam = "";
            try
            {
                JObject joPatInfo = JObject.Parse(patInfo);
                JObject joBaseInfo = JObject.Parse(JsonHelper.getDestValue(joPatInfo, "output.baseinfo"));
                JObject joInsuInfo = JObject.Parse(JsonHelper.getDestValue(joPatInfo, "selectedInsuInfo"));
                JObject joIdetInfo = JObject.Parse(JsonHelper.getDestValue(joPatInfo, "selectedIdInfo"));
                if (mIS.insertPatCurInsuInfo(joBaseInfo, joInsuInfo, joIdetInfo, out outparam) != 0)
                {
                    return -1;
                }
                else
                {
                    return 0;
                }
                
            }
            catch (Exception e)
            {
                outparam =  "插入患者该次就诊参保信息失败:" + e.Message;
                return -1;
            }
        }
        /// 
        /// 医嘱共享接口调用
        /// 
        /// 00:查询门诊历史交易 01:参保人照片
        /// 
        /// 
        /// 
        public int MedInsuOrderShareInfo(string type, out JObject joRtn, out string outparam)        
        {
            joRtn = new JObject();
            outparam = "";
            string FunName, Appmsg, AppRtnMsg, OutMsg;
            string infotype;
            System.Type ComTypeByMedOrder;
            object ComInstanceByMedOrder;
            try
            {
                if (Global.pat.psn_no == "")
                {
                    outparam = "医保个人编码不能为空,请先读卡!";
                    return -1;
                }               
                //1.创建实例
                if (MOS.GetMedOrdersShareObj(out ComTypeByMedOrder, out ComInstanceByMedOrder) != 0)
                {
                    outparam = "医嘱共享实例创建失败!";
                    return -1;
                }
                //2.初始化
                MOS.ConnectServer(ComTypeByMedOrder, ComInstanceByMedOrder, out AppRtnMsg);
                //解析返回值
                XmlDocument xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                Boolean bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                if (bPass == false)
                {
                    outparam = "医嘱共享实例创建成功,但初始化失败" + OutMsg;
                    return -1;
                }
                //3.业务调用
                infotype = type; //00:查询门诊历史交易 01:参保人照片
                FunName = "GetClinicHistoryTrade";
                Appmsg = "" + (Global.pat.psn_no) + "" +
                         "" +
                         "" + (infotype) + "";
                Appmsg = JsonHelper.GetinPar(Appmsg, 0);        
                MOS.MedOrdersShareObj(FunName, Appmsg, ComTypeByMedOrder, ComInstanceByMedOrder, out AppRtnMsg);
                //解析返回值
                xmlDoc = AnXML.GetXmlDoc(AppRtnMsg);
                bPass = AnXML.CheckState(xmlDoc, out OutMsg);
                XmlNode dataNode = AnXML.GetNodeFromPath(xmlDoc.DocumentElement, "output");
                if (bPass)
                {
                    joRtn = new JObject(JObject.Parse(JsonHelper.getDestValue(ConvertXMLToObject(AppRtnMsg), "root.output")));
                    if (type == "00")
                    {
                        //历史处方信息字典值转换
                        if (ConvertOrderShareInfo(joRtn, out JObject joOut, out outparam) != 0)
                        {
                            outparam = "调用医嘱共享信息下载历史处方成功,但转换字典数据失败!" + outparam;
                            //return -1;
                        }
                        joRtn = joOut;
                    }
             
                    return 0;
                }
                else
                {
                    outparam = "调用医嘱共享信息失败" + OutMsg;
                    return -1;
                }
            }
            catch (Exception e)
            {
                outparam = "调用医嘱共享信息异常:" + e.Message;
                return -1;
            }
        }
        /// 
        /// 转换医嘱共享信息中的字典数据
        /// 
        /// 
        /// 
        /// 
        /// 
        public int ConvertOrderShareInfo(JObject joInput, out JObject joRtn,out string outParam)
        {
            outParam = "";
            string tradecuretype = "";
            string tradefundtype = "";
            joRtn = new JObject();
            JArray jaTradeinfo = new JArray();
            JArray jaFeeItemarray = new JArray();
            try
            {              
                //sysinfo
                JObject joSysinfo = JObject.Parse(JsonHelper.getDestValue(joInput, "sysinfo"));
                //tradearray.tradeinfo
                JArray jaTradearray = JArray.Parse(JsonHelper.getDestValue(joInput, "tradearray.tradeinfo"));
                for (int i = 0; i < jaTradearray.Count; i++)
                {
                    //recipearray
                    JToken jtRecipearray = JToken.Parse(jaTradearray[i]["recipearray"].ToString());
                    if (jtRecipearray["recipe"].ToString().Contains("[") != true)                    
                    {
                        JArray ja = new JArray();
                        ja.Add(jtRecipearray["recipe"]);
                        JObject jo = new JObject();
                        jo.Add("recipe", ja);
                        jtRecipearray = jo;
                    }
                    //tradearray.tradeinfo
                    string tradeno = jaTradearray[i]["tradeno"].ToString();
                    string tradeoldno = jaTradearray[i]["tradeoldno"].ToString();
                    string tradedate = jaTradearray[i]["tradedate"].ToString();
                    string trademicode = ""; 
                    string tradefee = jaTradearray[i]["tradefee"].ToString();
                    //trademicode医疗机构信息
                    trademicode = rIS.getSpecDictionaryValue(Global.inf.interfaceDr.ToString(), "JGBM", jaTradearray[i]["trademicode"].ToString());
                    jaTradearray[i]["trademicode"] = trademicode;
                    //tradecuretype医疗类别
                    if (jaTradearray[i]["tradecuretype"].ToString() == "11")
                        tradecuretype = "普通门诊";
                    else
                    if (jaTradearray[i]["tradecuretype"].ToString() == "19")
                        tradecuretype = "普通急诊";
                    else
                        tradecuretype = jaTradearray[i]["tradecuretype"].ToString();
                    jaTradearray[i]["tradecuretype"] = tradecuretype;
                    //tradefundtype险种类型
                    if (jaTradearray[i]["tradefundtype"].ToString() == "3")
                        tradefundtype = "城镇职工";
                    else
                    if (jaTradearray[i]["tradefundtype"].ToString() == "4")
                        tradefundtype = "工伤保险";
                    else
                    if (jaTradearray[i]["tradefundtype"].ToString() == "31")
                        tradefundtype = "离休统筹";
                    else
                    if (jaTradearray[i]["tradefundtype"].ToString() == "32")
                        tradefundtype = "公疗医照";
                    else
                    if (jaTradearray[i]["tradefundtype"].ToString() == "91")
                        tradefundtype = "城镇居民基本医疗保险_学生儿童";
                    else
                    if (jaTradearray[i]["tradefundtype"].ToString() == "92")
                        tradefundtype = "城镇居民基本医疗保险_无保障老年人";
                    else
                    if (jaTradearray[i]["tradefundtype"].ToString() == "93")
                        tradefundtype = "城镇居民基本医疗保险_无业";
                    else
                    if (jaTradearray[i]["tradefundtype"].ToString() == "33")
                        tradefundtype = "征地超转人员";
                    else
                        tradefundtype = jaTradearray[i]["tradefundtype"].ToString();
                    jaTradearray[i]["tradefundtype"] = tradefundtype;
                    //feeitemarray.feeitem
                    JObject joFeeitem = new JObject();
                    string itemtype = "", fee_type = "", dose = "", howtouse = "";
                    if (jaTradearray[i]["feeitemarray"]["feeitem"].ToString().Contains("[") == true)
                    {
                        JArray jaFeeitemarray = JArray.Parse(JsonHelper.getDestValue(JObject.Parse(jaTradearray[i].ToString()), "feeitemarray.feeitem"));
                        for (int j = 0; j < jaFeeitemarray.Count; j++)
                        {                            
                            //转换费用明细医保字典数据
                            if (jaFeeitemarray[j]["itemtype"].ToString() == "0")
                                itemtype = "药品";
                            else
                            if (jaFeeitemarray[j]["itemtype"].ToString() == "1")
                                itemtype = "诊疗项目";
                            else
                            if (jaFeeitemarray[j]["itemtype"].ToString() == "2")
                                itemtype = "服务设施";
                            else
                                itemtype = jaFeeitemarray[j]["itemtype"].ToString();
                            fee_type = rIS.getSpecDictionaryValue(Global.inf.interfaceDr.ToString(), "AKA063", jaFeeitemarray[j]["fee_type"].ToString());
                            dose = rIS.getSpecDictionaryValue(Global.inf.interfaceDr.ToString(), "AKA070", jaFeeitemarray[j]["dose"].ToString());
                            howtouse = rIS.getSpecDictionaryValue(Global.inf.interfaceDr.ToString(), "BKC229", jaFeeitemarray[j]["howtouse"].ToString());
                            jaFeeitemarray[j]["itemtype"] = itemtype;
                            jaFeeitemarray[j]["fee_type"] = fee_type;
                            jaFeeitemarray[j]["dose"] = dose;
                            jaFeeitemarray[j]["howtouse"] = howtouse;                          
                        }
                        joFeeitem.Add("feeitem", jaFeeitemarray);
                    }
                    else 
                    {
                        JObject joFeeitemarray = JObject.Parse(JsonHelper.getDestValue(JObject.Parse(jaTradearray[i].ToString()), "feeitemarray.feeitem"));                        
                        
                        //转换费用明细医保字典数据
                        if (joFeeitemarray["itemtype"].ToString() == "0")
                            itemtype = "药品";
                        else
                        if (joFeeitemarray["itemtype"].ToString() == "1")
                            itemtype = "诊疗项目";
                        else
                        if (joFeeitemarray["itemtype"].ToString() == "2")
                            itemtype = "服务设施";
                        else
                            itemtype = joFeeitemarray["itemtype"].ToString();
                        fee_type = rIS.getSpecDictionaryValue(Global.inf.interfaceDr.ToString(), "AKA063", joFeeitemarray["fee_type"].ToString());
                        dose = rIS.getSpecDictionaryValue(Global.inf.interfaceDr.ToString(), "AKA070", joFeeitemarray["dose"].ToString());
                        howtouse = rIS.getSpecDictionaryValue(Global.inf.interfaceDr.ToString(), "BKC229", joFeeitemarray["howtouse"].ToString());
                        JObject joItem = new JObject
                        {
                             {"tradeno", joFeeitemarray["tradeno"].ToString()},
                             {"recipeno", joFeeitemarray["recipeno"].ToString()},
                             {"itemno", joFeeitemarray["itemno"].ToString()},
                             {"itemcode", joFeeitemarray["itemcode"].ToString()},
                             {"itemname", joFeeitemarray["itemname"].ToString()},
                             {"itemtype", itemtype},
                             {"dose", dose},
                             {"specification", joFeeitemarray["specification"].ToString()},
                             {"unit", joFeeitemarray["unit"].ToString()},
                             {"unitprice", joFeeitemarray["unitprice"].ToString()},
                             {"count", joFeeitemarray["count"].ToString()},
                             {"howtouse", howtouse},
                             {"dosage", joFeeitemarray["dosage"].ToString()},
                             {"packaging", joFeeitemarray["packaging"].ToString()},
                             {"minpackage", joFeeitemarray["minpackage"].ToString()},
                             {"conversion", joFeeitemarray["conversion"].ToString()},
                             {"days", joFeeitemarray["days"].ToString()},
                             {"fee", joFeeitemarray["fee"].ToString()},
                             {"feein", joFeeitemarray["feein"].ToString()},
                             {"feeout", joFeeitemarray["feeout"].ToString()},
                             {"fee_type", fee_type}
                        };
                        JArray jaItem = new JArray();
                        jaItem.Add(joItem);
                        joFeeitem.Add("feeitem", jaItem);
                    }
                    JObject joTrade = new JObject
                        {
                            {"tradeno", tradeno},
                            {"tradeoldno", tradeoldno},
                            {"tradedate", tradedate},
                            {"trademicode", trademicode},
                            {"tradecuretype", tradecuretype},
                            {"tradefee", tradefee},
                            {"tradefundtype", tradefundtype},
                            {"recipearray", jtRecipearray},
                            {"feeitemarray", joFeeitem} 
                        };
                    jaTradeinfo.Add(joTrade); 
                }
                JObject joTradearray = new JObject();
                joTradearray.Add("tradeinfo", jaTradeinfo);
                joRtn.Add("sysinfo", joSysinfo);
                joRtn.Add("tradearray", joTradearray);
   
                return 0;
            }
            catch (Exception ex)
            {
                outParam = "ConvertOrderShareInfo转换医嘱共享信息中的字典数据 异常:" + ex.Message;
                return -1;
            }
            finally
            {
                Global.writeLog("(ConvertOrderShareInfo转换医嘱共享信息中的字典数据)", JsonHelper.Compress(joInput), JsonHelper.Compress(joRtn));
            }
        }
    }
}