/// <summary>
        /// 住院医保查询
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public QueryMedicalInsuranceDetailInfoDto QueryMedicalInsuranceDetail(
            QueryMedicalInsuranceUiParam param)
        {
            var resultData = new QueryMedicalInsuranceDetailInfoDto();
            var userBase   = GetUserBaseInfo(param.UserId);
            var queryData  = _medicalInsuranceSqlRepository.QueryMedicalInsuranceResidentInfo(
                new QueryMedicalInsuranceResidentInfoParam()
            {
                OrganizationCode = userBase.OrganizationCode,
                BusinessId       = param.BusinessId
            });

            if (queryData == null)
            {
                throw new Exception("当前病人未办理医保入院!!!");
            }
            if (string.IsNullOrWhiteSpace(queryData.AdmissionInfoJson))
            {
                throw new Exception("当前病人没有入参参数记录!!!");
            }
            if (queryData.InsuranceType == "310")
            {
                resultData = QueryWorkerMedicalInsuranceDetail(queryData.AdmissionInfoJson);
            }
            if (queryData.InsuranceType == "342")
            {
                resultData = QueryResidentMedicalInsuranceDetail(queryData.AdmissionInfoJson);
            }
            resultData.Id = queryData.Id;
            resultData.MedicalInsuranceHospitalizationNo = queryData.MedicalInsuranceHospitalizationNo;
            resultData.InsuranceType = queryData.InsuranceType;
            userBase.TransKey        = param.TransKey;

            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取住院病人信息
            var inpatientData = GetInpatientInfo(infoData);

            resultData.DiagnosisList = inpatientData.DiagnosisList;

            return(resultData);
        }
        /// <summary>
        /// 获取his住院结算
        /// </summary>
        /// <param name="param"></param>
        public PatientLeaveHospitalInfoDto GetHisHospitalizationSettlement(GetInpatientInfoParam param)
        {
            var resultData = new PatientLeaveHospitalInfoDto();
            var xmlData    = new MedicalInsuranceXmlDto();

            xmlData.BusinessId        = param.BusinessId;
            xmlData.HealthInsuranceNo = "41";
            xmlData.TransactionId     = param.User.TransKey;
            xmlData.AuthCode          = param.User.AuthCode;
            xmlData.UserId            = param.User.UserId;
            xmlData.OrganizationCode  = param.User.OrganizationCode;
            var jsonParam = JsonConvert.SerializeObject(xmlData);
            var data      = _webServiceBasic.HIS_Interface("39", jsonParam);
            HisHospitalizationSettlementJsonDto dataValue = JsonConvert.DeserializeObject <HisHospitalizationSettlementJsonDto>(data.Msg);
            var dataValueFirst = dataValue.LeaveHospitalInfoData.FirstOrDefault();

            //实体转换
            if (dataValueFirst != null)
            {
                resultData.LeaveHospitalBedNumber        = dataValueFirst.LeaveHospitalBedNumber;
                resultData.LeaveHospitalDate             = dataValueFirst.LeaveHospitalDate;
                resultData.LeaveHospitalDepartmentId     = dataValueFirst.LeaveHospitalDepartmentId;
                resultData.LeaveHospitalDepartmentName   = dataValueFirst.LeaveHospitalDepartmentName;
                resultData.LeaveHospitalDiagnosticDoctor = dataValueFirst.LeaveHospitalDiagnosticDoctor;
                resultData.LeaveHospitalOperator         = dataValueFirst.LeaveHospitalOperator;
            }
            var diagnosisList = dataValue.DiagnosisJson.Select(c => new InpatientDiagnosisDto()
            {
                DiseaseCoding   = c.DiseaseCoding,
                DiseaseName     = c.DiagnosisName,
                ProjectCode     = c.DiagnosisMedicalInsuranceCode,
                IsMainDiagnosis = c.IsMainDiagnosis == "是" ? true : false,
            }).ToList();

            resultData.DiagnosisList = diagnosisList;
            return(resultData);
        }
        /// <summary>
        /// 职工生育结算
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public WorkerHospitalizationPreSettlementDto WorkerBirthSettlement(WorkerBirthSettlementUiParam param)
        {
            //获取操作人员信息
            var userBase = _serviceBasicService.GetUserBaseInfo(param.UserId);

            userBase.TransKey = param.TransKey;
            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取his结算
            var hisSettlement      = _serviceBasicService.GetHisHospitalizationSettlement(infoData);
            var queryResidentParam = new QueryMedicalInsuranceResidentInfoParam()
            {
                BusinessId       = param.BusinessId,
                OrganizationCode = userBase.OrganizationCode
            };
            //获取医保病人信息
            var residentData = _medicalInsuranceSqlRepository.QueryMedicalInsuranceResidentInfo(queryResidentParam);

            if (residentData.MedicalInsuranceState == MedicalInsuranceState.HisSettlement)
            {
                throw new Exception("当前病人已办理医保结算,不能办理预结算!!!");
            }
            if (residentData.MedicalInsuranceState != MedicalInsuranceState.MedicalInsurancePreSettlement)
            {
                throw new Exception("当前病人未办理预结算,不能办理结算!!!");
            }
            var inpatientInfoParam = new QueryInpatientInfoParam()
            {
                BusinessId = param.BusinessId
            };
            //获取住院病人
            var inpatientInfoData = _hisSqlRepository.QueryInpatientInfo(inpatientInfoParam);

            if (inpatientInfoData == null)
            {
                throw new Exception("该病人未在中心库中,请检查是否办理医保入院!!!");
            }

            var infoParam = new WorkerBirthSettlementParam()
            {
                LeaveHospitalInpatientState = param.LeaveHospitalInpatientState,
                FetusNumber     = param.FetusNumber,
                MedicalCategory = param.MedicalCategory,
                Operator        = userBase.UserName,
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceHospitalizationNo,
                LeaveHospitalDate = Convert.ToDateTime(hisSettlement.LeaveHospitalDate).ToString("yyyyMMdd"),
            };
            //获取诊断
            var diagnosisData = CommonHelp.GetDiagnosis(param.DiagnosisList);

            infoParam.AdmissionMainDiagnosisIcd10 = diagnosisData.AdmissionMainDiagnosisIcd10;
            infoParam.DiagnosisIcd10Two           = diagnosisData.DiagnosisIcd10Two;
            infoParam.DiagnosisIcd10Three         = diagnosisData.DiagnosisIcd10Three;
            infoParam.AdmissionMainDiagnosis      = diagnosisData.DiagnosisDescribe;

            // 医保
            var resultData = _workerMedicalInsuranceRepository.WorkerBirthSettlement(infoParam);
            //报销金额 =统筹支付+补充医疗保险支付金额+专项基金支付金额+
            //公务员补贴+公务员补助+其它支付金额
            decimal reimbursementExpenses = resultData.BasicOverallPay + resultData.SupplementPayAmount + resultData.SpecialFundPayAmount
                                            + resultData.CivilServantsSubsidies + resultData.CivilServantsSubsidy + resultData.OtherPaymentAmount;

            resultData.ReimbursementExpenses = reimbursementExpenses;
            var updateData = new UpdateMedicalInsuranceResidentSettlementParam()
            {
                UserId = userBase.UserId,
                ReimbursementExpensesAmount = CommonHelp.ValueToDouble(reimbursementExpenses),
                SelfPayFeeAmount            = resultData.CashPayment,
                OtherInfo    = JsonConvert.SerializeObject(resultData),
                Id           = residentData.Id,
                SettlementNo = resultData.DocumentNo,
                MedicalInsuranceAllAmount = resultData.TotalAmount,
                SettlementTransactionId   = userBase.UserId,
                MedicalInsuranceState     = MedicalInsuranceState.MedicalInsuranceSettlement
            };

            //存入中间层
            _medicalInsuranceSqlRepository.UpdateMedicalInsuranceResidentSettlement(updateData);
            //添加日志
            var logParam = new AddHospitalLogParam()
            {
                JoinOrOldJson   = JsonConvert.SerializeObject(param),
                ReturnOrNewJson = JsonConvert.SerializeObject(resultData),
                User            = userBase,
                Remark          = "职工住院结算",
                RelationId      = residentData.Id,
            };
            //存入基层
            var userInfoData = _residentMedicalInsuranceRepository.GetUserInfo(new ResidentUserInfoParam()
            {
                IdentityMark = residentData.IdentityMark,
                AfferentSign = residentData.AfferentSign,
            });

            // 回参构建
            var xmlData = new HospitalSettlementXml()
            {
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceHospitalizationNo,
                CashPayment      = resultData.CashPayment,
                SettlementNo     = resultData.DocumentNo,
                PaidAmount       = resultData.PaidAmount,
                AllAmount        = resultData.TotalAmount,
                PatientName      = userInfoData.PatientName,
                AccountBalance   = userInfoData.WorkersInsuranceBalance,
                AccountAmountPay = resultData.AccountPayment,
            };


            var strXmlBackParam = XmlSerializeHelper.HisXmlSerialize(xmlData);
            var saveXml         = new SaveXmlDataParam()
            {
                User = userBase,
                MedicalInsuranceBackNum = resultData.DocumentNo,
                MedicalInsuranceCode    = "41",
                BusinessId = param.BusinessId,
                BackParam  = strXmlBackParam
            };

            //结算存基层
            _webBasicRepository.SaveXmlData(saveXml);

            var updateParamData = new UpdateMedicalInsuranceResidentSettlementParam()
            {
                UserId = param.UserId,
                Id     = residentData.Id,
                MedicalInsuranceState = MedicalInsuranceState.HisSettlement,
                IsHisUpdateState      = true
            };

            //  更新中间层
            _medicalInsuranceSqlRepository.UpdateMedicalInsuranceResidentSettlement(updateParamData);


            //结算后保存信息
            var saveParam = AutoMapper.Mapper.Map <SaveInpatientSettlementParam>(hisSettlement);

            saveParam.Id   = (Guid)inpatientInfoData.Id;
            saveParam.User = userBase;
            saveParam.LeaveHospitalDiagnosisJson = JsonConvert.SerializeObject(param.DiagnosisList);
            _hisSqlRepository.SaveInpatientSettlement(saveParam);
            return(resultData);
        }
        /// <summary>
        /// 职工生育预结算
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public WorkerHospitalizationPreSettlementDto WorkerBirthPreSettlement(WorkerBirthPreSettlementUiParam param)
        {
            //获取操作人员信息
            var userBase = _serviceBasicService.GetUserBaseInfo(param.UserId);

            userBase.TransKey = param.TransKey;
            var queryResidentParam = new QueryMedicalInsuranceResidentInfoParam()
            {
                BusinessId       = param.BusinessId,
                OrganizationCode = userBase.OrganizationCode
            };
            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取his结算
            var settlementData = _serviceBasicService.GetHisHospitalizationSettlement(infoData);

            //获取医保病人信息
            var residentData = _medicalInsuranceSqlRepository.QueryMedicalInsuranceResidentInfo(queryResidentParam);

            if (string.IsNullOrWhiteSpace(settlementData.LeaveHospitalDate))
            {
                throw new Exception("当前病人在基层中未办理出院,不能办理医保预结算!!!");
            }

            var preSettlement = new WorkerBirthPreSettlementParam()
            {
                MedicalCategory = param.MedicalCategory,
                FetusNumber     = param.FetusNumber,
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceHospitalizationNo,
                LeaveHospitalDate = Convert.ToDateTime(settlementData.LeaveHospitalDate).ToString("yyyyMMdd"),
            };
            //获取诊断
            var diagnosisData = CommonHelp.GetDiagnosis(param.DiagnosisList);

            preSettlement.AdmissionMainDiagnosisIcd10 = diagnosisData.AdmissionMainDiagnosisIcd10;
            preSettlement.DiagnosisIcd10Two           = diagnosisData.DiagnosisIcd10Two;
            preSettlement.DiagnosisIcd10Three         = diagnosisData.DiagnosisIcd10Three;
            //医保结算
            var resultData = _workerMedicalInsuranceRepository.WorkerBirthPreSettlement(preSettlement);

            //报销金额 =统筹支付+补充医疗保险支付金额+专项基金支付金额+
            //公务员补贴+公务员补助+其它支付金额
            decimal reimbursementExpenses = resultData.BasicOverallPay + resultData.SupplementPayAmount + resultData.SpecialFundPayAmount
                                            + resultData.CivilServantsSubsidies + resultData.CivilServantsSubsidy + resultData.OtherPaymentAmount;
            var updateParam = new UpdateMedicalInsuranceResidentSettlementParam()
            {
                ReimbursementExpensesAmount = CommonHelp.ValueToDouble(reimbursementExpenses),
                SelfPayFeeAmount            = resultData.CashPayment,
                OtherInfo    = JsonConvert.SerializeObject(resultData),
                Id           = residentData.Id,
                UserId       = userBase.UserId,
                SettlementNo = resultData.DocumentNo,
                MedicalInsuranceAllAmount  = resultData.TotalAmount,
                PreSettlementTransactionId = userBase.TransKey,
                MedicalInsuranceState      = MedicalInsuranceState.MedicalInsurancePreSettlement
            };

            //存入中间库
            _medicalInsuranceSqlRepository.UpdateMedicalInsuranceResidentSettlement(updateParam);
            var logParam = new AddHospitalLogParam()
            {
                JoinOrOldJson   = JsonConvert.SerializeObject(param),
                ReturnOrNewJson = JsonConvert.SerializeObject(resultData),
                User            = userBase,
                Remark          = "职工生育住院病人预结算"
            };

            _systemManageRepository.AddHospitalLog(logParam);

            return(resultData);
        }
        /// <summary>
        /// 职工生育入院登记
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public WorkerBirthHospitalizationRegisterDto WorkerBirthHospitalizationRegister(WorkerBirthHospitalizationRegisterUiParam param)
        {
            var userBase = _serviceBasicService.GetUserBaseInfo(param.UserId);

            userBase.TransKey = param.TransKey;
            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取病人
            var inpatientData = _serviceBasicService.GetInpatientInfo(infoData);

            if (inpatientData == null)
            {
                throw new Exception("获取基层病人失败!!!");
            }
            var paramIni = GetWorkerHospitalizationWorkerBirth(inpatientData, param);
            var data     = _workerMedicalInsuranceRepository.WorkerBirthHospitalizationRegister(paramIni);

            if (data == null)
            {
                throw new Exception("职工生育入院登记未反馈数据!!!");
            }

            var saveData = new MedicalInsuranceDto
            {
                AdmissionInfoJson = JsonConvert.SerializeObject(paramIni),
                BusinessId        = param.BusinessId,
                Id                                = Guid.NewGuid(),
                IsModify                          = false,
                InsuranceType                     = 310,
                MedicalInsuranceState             = MedicalInsuranceState.MedicalInsuranceHospitalized,
                MedicalInsuranceHospitalizationNo = data.MedicalInsuranceInpatientNo,
                IsBirthHospital                   = 1,
                IdentityMark                      = param.IdentityMark,
                AfferentSign                      = param.AfferentSign
            };

            ////存中间库
            _medicalInsuranceSqlRepository.SaveMedicalInsurance(userBase, saveData);
            //回参构建
            var xmlData = new HospitalizationRegisterXml()
            {
                MedicalInsuranceType = "1",
                MedicalInsuranceHospitalizationNo = data.MedicalInsuranceInpatientNo,
                InsuranceNo = null,
            };
            var strXmlBackParam = XmlSerializeHelper.HisXmlSerialize(xmlData);
            var saveXml         = new SaveXmlDataParam()
            {
                User = userBase,
                MedicalInsuranceBackNum = "zydj",
                MedicalInsuranceCode    = "21",
                BusinessId = param.BusinessId,
                BackParam  = strXmlBackParam
            };

            //存基层
            _webBasicRepository.SaveXmlData(saveXml);
            saveData.MedicalInsuranceState = MedicalInsuranceState.HisHospitalized;
            //更新中间库
            _medicalInsuranceSqlRepository.SaveMedicalInsurance(userBase, saveData);
            //保存入院数据
            infoData.IsSave = true;
            _serviceBasicService.GetInpatientInfo(infoData);
            return(data);
        }
        /// <summary>
        /// 职工住院预结算
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public WorkerHospitalizationPreSettlementDto WorkerHospitalizationPreSettlement(UiBaseDataParam param)
        {
            //获取操作人员信息
            var userBase = _serviceBasicService.GetUserBaseInfo(param.UserId);

            userBase.TransKey = param.TransKey;
            var queryResidentParam = new QueryMedicalInsuranceResidentInfoParam()
            {
                BusinessId       = param.BusinessId,
                OrganizationCode = userBase.OrganizationCode
            };
            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取his预结算
            var hisPreSettlementData = _serviceBasicService.GetHisHospitalizationPreSettlement(infoData);
            var preSettlementData    = hisPreSettlementData.PreSettlementData.FirstOrDefault();
            //获取医保病人信息
            var residentData = _medicalInsuranceSqlRepository.QueryMedicalInsuranceResidentInfo(queryResidentParam);
            //获取医院等级
            var gradeData = _systemManageRepository.QueryHospitalOrganizationGrade(userBase.OrganizationCode);

            if (string.IsNullOrWhiteSpace(preSettlementData.EndDate))
            {
                throw new Exception("当前病人在基层中未办理出院,不能办理医保预结算!!!");
            }
            //获取医保账号
            var userData = _systemManageRepository.QueryHospitalOperator(
                new QueryHospitalOperatorParam()
            {
                UserId = param.UserId
            });
            var preSettlement = new WorkerHospitalizationPreSettlementParam()
            {
                User       = userBase,
                Id         = residentData.Id,
                BusinessId = param.BusinessId,
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceHospitalizationNo,
                LeaveHospitalDate          = Convert.ToDateTime(preSettlementData.EndDate).ToString("yyyyMMdd"),
                AdministrativeArea         = gradeData.AdministrativeArea,
                Operators                  = preSettlementData.Operator,
                IsHospitalizationFrequency = "0",
                OrganizationCode           = gradeData.MedicalInsuranceAccount,
            };
            //医保结算
            var resultData = _workerMedicalInsuranceRepository.WorkerHospitalizationPreSettlement(preSettlement);

            //报销金额 =统筹支付+补充医疗保险支付金额+专项基金支付金额+
            //公务员补贴+公务员补助+其它支付金额
            decimal reimbursementExpenses = resultData.BasicOverallPay + resultData.SupplementPayAmount + resultData.SpecialFundPayAmount
                                            + resultData.CivilServantsSubsidies + resultData.CivilServantsSubsidy + resultData.OtherPaymentAmount;
            var updateParam = new UpdateMedicalInsuranceResidentSettlementParam()
            {
                ReimbursementExpensesAmount = CommonHelp.ValueToDouble(reimbursementExpenses),
                SelfPayFeeAmount            = resultData.CashPayment,
                OtherInfo    = JsonConvert.SerializeObject(resultData),
                Id           = residentData.Id,
                UserId       = userBase.UserId,
                SettlementNo = resultData.DocumentNo,
                MedicalInsuranceAllAmount  = resultData.TotalAmount,
                PreSettlementTransactionId = userBase.TransKey,
                MedicalInsuranceState      = MedicalInsuranceState.MedicalInsurancePreSettlement
            };

            //存入中间库
            _medicalInsuranceSqlRepository.UpdateMedicalInsuranceResidentSettlement(updateParam);
            var logParam = new AddHospitalLogParam()
            {
                JoinOrOldJson   = JsonConvert.SerializeObject(param),
                ReturnOrNewJson = JsonConvert.SerializeObject(resultData),
                User            = userBase,
                Remark          = "职工住院病人预结算"
            };

            _systemManageRepository.AddHospitalLog(logParam);

            return(resultData);
        }
        /// <summary>
        /// 获取his住院预结算
        /// </summary>
        /// <param name="param"></param>
        public HisHospitalizationPreSettlementJsonDto GetHisHospitalizationPreSettlement(GetInpatientInfoParam param)
        {
            var xmlData = new MedicalInsuranceXmlDto();

            xmlData.BusinessId        = param.BusinessId;
            xmlData.HealthInsuranceNo = "43";
            xmlData.TransactionId     = param.User.TransKey;
            xmlData.AuthCode          = param.User.AuthCode;
            xmlData.UserId            = param.User.UserId;
            xmlData.OrganizationCode  = param.User.OrganizationCode;
            var jsonParam = JsonConvert.SerializeObject(xmlData);
            var data      = _webServiceBasic.HIS_Interface("39", jsonParam);
            HisHospitalizationPreSettlementJsonDto dataValue = JsonConvert.DeserializeObject <HisHospitalizationPreSettlementJsonDto>(data.Msg);

            return(dataValue);
        }
        /// <summary>
        /// 获取住院病人信息
        /// </summary>
        /// <param name="infoParam"></param>
        /// <returns></returns>
        public InpatientInfoDto GetInpatientInfo(GetInpatientInfoParam param)
        {
            var resultData = new InpatientInfoDto();
            var xmlData    = new MedicalInsuranceXmlDto();

            xmlData.BusinessId        = param.BusinessId;
            xmlData.HealthInsuranceNo = "21";
            xmlData.TransactionId     = param.User.TransKey;
            xmlData.AuthCode          = param.User.AuthCode;
            xmlData.UserId            = param.User.UserId;
            xmlData.OrganizationCode  = param.User.OrganizationCode;
            var data = _webServiceBasic.HIS_Interface("39", JsonConvert.SerializeObject(xmlData));
            InpatientInfoJsonDto dataValue = JsonConvert.DeserializeObject <InpatientInfoJsonDto>(data.Msg);

            if (dataValue != null && dataValue.InpatientInfoJsonData != null)
            {
                var diagnosisList = dataValue.DiagnosisJson.Select(c => new InpatientDiagnosisDto()
                {
                    DiseaseCoding   = c.DiseaseCoding,
                    DiseaseName     = c.DiseaseName,
                    IsMainDiagnosis = c.IsMainDiagnosis == "是" ? true : false,
                    ProjectCode     = c.ProjectCode,
                }).ToList();
                resultData = new InpatientInfoDto()
                {
                    DiagnosisList               = diagnosisList,
                    HospitalizationId           = dataValue.InpatientInfoJsonData.HospitalizationId,
                    BusinessId                  = param.BusinessId,
                    DiagnosisJson               = JsonConvert.SerializeObject(dataValue.DiagnosisJson),
                    AdmissionBed                = dataValue.InpatientInfoJsonData.AdmissionBed,
                    AdmissionDate               = dataValue.InpatientInfoJsonData.AdmissionDate,
                    AdmissionDiagnosticDoctor   = dataValue.InpatientInfoJsonData.AdmissionDiagnosticDoctor,
                    AdmissionDiagnosticDoctorId = dataValue.InpatientInfoJsonData.AdmissionDiagnosticDoctorId,
                    AdmissionMainDiagnosis      = dataValue.InpatientInfoJsonData.AdmissionMainDiagnosis,
                    AdmissionMainDiagnosisIcd10 = dataValue.InpatientInfoJsonData.AdmissionMainDiagnosisIcd10,
                    AdmissionOperateTime        = dataValue.InpatientInfoJsonData.AdmissionOperateTime,
                    AdmissionOperator           = dataValue.InpatientInfoJsonData.AdmissionOperator,
                    AdmissionWard               = dataValue.InpatientInfoJsonData.AdmissionWard,
                    FamilyAddress               = dataValue.InpatientInfoJsonData.FamilyAddress,
                    IdCardNo          = dataValue.InpatientInfoJsonData.IdCardNo,
                    PatientName       = dataValue.InpatientInfoJsonData.PatientName,
                    PatientSex        = dataValue.InpatientInfoJsonData.PatientSex,
                    ContactName       = dataValue.InpatientInfoJsonData.ContactName,
                    ContactPhone      = dataValue.InpatientInfoJsonData.ContactPhone,
                    Remark            = dataValue.InpatientInfoJsonData.Remark,
                    HospitalName      = param.User.OrganizationName,
                    HospitalizationNo = dataValue.InpatientInfoJsonData.HospitalizationNo,
                    TransactionId     = param.User.TransKey,
                    InDepartmentName  = dataValue.InpatientInfoJsonData.InDepartmentName,
                    InDepartmentId    = dataValue.InpatientInfoJsonData.InDepartmentId,
                    DocumentNo        = dataValue.InpatientInfoJsonData.DocumentNo,
                };
                if (param.IsSave == true)
                {
                    //删除以前记录
                    var deleteData = _hisSqlRepository.DeleteDatabase(new DeleteDatabaseParam()
                    {
                        User      = param.User,
                        Field     = "BusinessId",
                        Value     = param.BusinessId,
                        TableName = "Inpatient"
                    });
                    //添加病人信息
                    var inpatientEntity = new InpatientEntity();
                    var insertEntity    = AutoMapper.Mapper.Map <InpatientEntity>(resultData);
                    insertEntity.Id = Guid.NewGuid();

                    inpatientBaseService.Insert(insertEntity, param.User);
                }
            }

            return(resultData);
        }
        /// <summary>
        /// 入院登记
        /// </summary>
        /// <returns></returns>
        public void HospitalizationRegister(ResidentHospitalizationRegisterUiParam param)
        { //his登陆
            var userBase = _webserviceBasicService.GetUserBaseInfo(param.UserId);

            userBase.TransKey = param.TransKey;
            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取医保病人
            var inpatientData = _webserviceBasicService.GetInpatientInfo(infoData);
            var registerParam = GetResidentHospitalizationRegisterParam(param, inpatientData);
            var residentData  = _residentMedicalInsuranceRepository.HospitalizationRegister(registerParam);
            var saveData      = new MedicalInsuranceDto
            {
                AdmissionInfoJson = JsonConvert.SerializeObject(registerParam),
                BusinessId        = param.BusinessId,
                Id            = Guid.NewGuid(),
                InsuranceType = 342,
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceInpatientNo,
                MedicalInsuranceState             = MedicalInsuranceState.MedicalInsuranceHospitalized,
                AfferentSign = param.AfferentSign,
                IdentityMark = param.IdentityMark
            };

            //保存中间库
            _medicalInsuranceSqlRepository.SaveMedicalInsurance(userBase, saveData);
            //回参构建
            var xmlData = new HospitalizationRegisterXml()
            {
                MedicalInsuranceType = "10",
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceInpatientNo,
                InsuranceNo = null,
            };
            var strXmlBackParam = XmlSerializeHelper.HisXmlSerialize(xmlData);
            var saveXml         = new SaveXmlDataParam()
            {
                User = userBase,
                MedicalInsuranceBackNum = "CXJB002",
                MedicalInsuranceCode    = "21",
                BusinessId = param.BusinessId,
                BackParam  = strXmlBackParam
            };

            //存基层
            _webBasicRepository.SaveXmlData(saveXml);
            //更新中间库
            saveData.MedicalInsuranceState = MedicalInsuranceState.HisHospitalized;
            _medicalInsuranceSqlRepository.SaveMedicalInsurance(userBase, saveData);
            //日志
            var logParam = new AddHospitalLogParam
            {
                User            = userBase,
                RelationId      = saveData.Id,
                JoinOrOldJson   = JsonConvert.SerializeObject(param),
                ReturnOrNewJson = JsonConvert.SerializeObject(residentData),
                BusinessId      = param.BusinessId,
                Remark          = "医保入院登记;TransactionId:" + userBase.TransKey
            };

            _systemManageRepository.AddHospitalLog(logParam);
            //保存入院数据
            infoData.IsSave = true;
            _webserviceBasicService.GetInpatientInfo(infoData);
        }
        /// <summary>
        /// 居民住院结算
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public HospitalizationPresettlementDto LeaveHospitalSettlement(LeaveHospitalSettlementUiParam param)
        {
            // 获取操作人员信息
            var userBase           = _webserviceBasicService.GetUserBaseInfo(param.UserId);
            var queryResidentParam = new QueryMedicalInsuranceResidentInfoParam()
            {
                BusinessId       = param.BusinessId,
                OrganizationCode = userBase.OrganizationCode
            };

            userBase.TransKey = param.TransKey;
            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取his结算
            var hisSettlement = _webserviceBasicService.GetHisHospitalizationSettlement(infoData);
            //获取医保病人信息
            var residentData = _medicalInsuranceSqlRepository.QueryMedicalInsuranceResidentInfo(queryResidentParam);

            if (residentData.MedicalInsuranceState != MedicalInsuranceState.MedicalInsurancePreSettlement)
            {
                throw new Exception("当前病人未办理预结算,不能办理结算!!!");
            }
            if (residentData.MedicalInsuranceState == MedicalInsuranceState.HisSettlement)
            {
                throw new Exception("当前病人已办理医保结算,不能办理再次结算!!!");
            }

            var inpatientInfoParam = new QueryInpatientInfoParam()
            {
                BusinessId = param.BusinessId
            };
            //获取住院病人
            var inpatientInfoData = _hisSqlRepository.QueryInpatientInfo(inpatientInfoParam);

            if (inpatientInfoData == null)
            {
                throw new Exception("该病人未在中心库中,请检查是否办理医保入院!!!");
            }

            var settlementParam = new LeaveHospitalSettlementParam()
            {
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceHospitalizationNo,
                LeaveHospitalDate           = Convert.ToDateTime(hisSettlement.LeaveHospitalDate).ToString("yyyyMMdd"),
                UserId                      = hisSettlement.LeaveHospitalOperator,
                LeaveHospitalInpatientState = param.LeaveHospitalInpatientState,
            };
            //获取诊断
            var diagnosisData = CommonHelp.GetDiagnosis(param.DiagnosisList);

            settlementParam.LeaveHospitalMainDiagnosisIcd10  = diagnosisData.AdmissionMainDiagnosisIcd10;
            settlementParam.LeaveHospitalDiagnosisIcd10Two   = diagnosisData.DiagnosisIcd10Two;
            settlementParam.LeaveHospitalDiagnosisIcd10Three = diagnosisData.DiagnosisIcd10Three;
            settlementParam.LeaveHospitalMainDiagnosis       = diagnosisData.DiagnosisDescribe;
            var infoParam = new LeaveHospitalSettlementInfoParam()
            {
                User        = userBase,
                Id          = residentData.Id,
                InsuranceNo = residentData.InsuranceNo,
                BusinessId  = inpatientInfoData.BusinessId,
                IdCardNo    = inpatientInfoData.IdCardNo,
            };
            //医保执行
            var data = _residentMedicalInsuranceRepository.LeaveHospitalSettlement(settlementParam, infoParam);

            if (data == null)
            {
                throw new Exception("居民住院结算反馈失败");
            }
            var updateData = new UpdateMedicalInsuranceResidentSettlementParam()
            {
                UserId = userBase.UserId,
                ReimbursementExpensesAmount = CommonHelp.ValueToDouble(data.ReimbursementExpenses),
                SelfPayFeeAmount            = data.CashPayment,
                OtherInfo    = JsonConvert.SerializeObject(data),
                Id           = residentData.Id,
                SettlementNo = data.DocumentNo,
                MedicalInsuranceAllAmount = data.TotalAmount,
                SettlementTransactionId   = userBase.UserId,
                MedicalInsuranceState     = MedicalInsuranceState.MedicalInsuranceSettlement
            };

            //存入中间层
            _medicalInsuranceSqlRepository.UpdateMedicalInsuranceResidentSettlement(updateData);
            //添加日志
            var logParam = new AddHospitalLogParam()
            {
                JoinOrOldJson   = JsonConvert.SerializeObject(param),
                ReturnOrNewJson = JsonConvert.SerializeObject(data),
                User            = userBase,
                Remark          = "居民住院结算",
                RelationId      = residentData.Id,
                BusinessId      = param.BusinessId,
            };


            var userInfoData = _residentMedicalInsuranceRepository.GetUserInfo(new ResidentUserInfoParam()
            {
                IdentityMark = residentData.IdentityMark,
                AfferentSign = residentData.AfferentSign,
            });

            // 回参构建
            var xmlData = new HospitalSettlementXml()
            {
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceHospitalizationNo,
                CashPayment      = data.CashPayment,
                SettlementNo     = data.DocumentNo,
                PaidAmount       = data.PaidAmount,
                AllAmount        = data.TotalAmount,
                PatientName      = userInfoData.PatientName,
                AccountBalance   = userInfoData.WorkersInsuranceBalance,
                AccountAmountPay = 0,
            };


            var strXmlBackParam = XmlSerializeHelper.HisXmlSerialize(xmlData);
            var saveXml         = new SaveXmlDataParam()
            {
                User = userBase,
                MedicalInsuranceBackNum = data.DocumentNo,
                MedicalInsuranceCode    = "41",
                BusinessId = param.BusinessId,
                BackParam  = strXmlBackParam
            };

            //结算存基层
            _webBasicRepository.SaveXmlData(saveXml);


            var updateParamData = new UpdateMedicalInsuranceResidentSettlementParam()
            {
                UserId = param.UserId,
                Id     = residentData.Id,
                MedicalInsuranceState = MedicalInsuranceState.HisSettlement,
                IsHisUpdateState      = true
            };

            //  更新中间层
            _medicalInsuranceSqlRepository.UpdateMedicalInsuranceResidentSettlement(updateParamData);
            //结算后保存信息
            var saveParam = AutoMapper.Mapper.Map <SaveInpatientSettlementParam>(hisSettlement);

            saveParam.Id   = (Guid)inpatientInfoData.Id;
            saveParam.User = userBase;
            saveParam.LeaveHospitalDiagnosisJson = JsonConvert.SerializeObject(param.DiagnosisList);
            _hisSqlRepository.SaveInpatientSettlement(saveParam);
            return(data);
        }
        //public void PrescriptionUploadAll(UploadAllParam param)
        //{
        //    //更新费用
        //}

        /// <summary>
        /// 居民住院预结算
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public HospitalizationPresettlementDto HospitalizationPreSettlement(UiBaseDataParam param)
        {
            HospitalizationPresettlementDto resultData = null;
            //获取操作人员信息
            var userBase = _webserviceBasicService.GetUserBaseInfo(param.UserId);

            userBase.TransKey = param.TransKey;
            var queryResidentParam = new QueryMedicalInsuranceResidentInfoParam()
            {
                BusinessId       = param.BusinessId,
                OrganizationCode = userBase.OrganizationCode
            };
            var infoData = new GetInpatientInfoParam()
            {
                User       = userBase,
                BusinessId = param.BusinessId,
            };
            //获取his预结算
            var hisPreSettlementData = _webserviceBasicService.GetHisHospitalizationPreSettlement(infoData);
            var preSettlementData    = hisPreSettlementData.PreSettlementData.FirstOrDefault();
            //获取医保病人信息
            var residentData = _medicalInsuranceSqlRepository.QueryMedicalInsuranceResidentInfo(queryResidentParam);

            if (string.IsNullOrWhiteSpace(preSettlementData.EndDate))
            {
                throw new Exception("当前病人在基层中未办理出院,不能办理医保预结算!!!");
            }
            //医保执行
            var data = _residentMedicalInsuranceRepository.HospitalizationPreSettlement(new HospitalizationPresettlementParam()
            {
                LeaveHospitalDate = Convert.ToDateTime(preSettlementData.EndDate).ToString("yyyyMMdd"),
                MedicalInsuranceHospitalizationNo = residentData.MedicalInsuranceHospitalizationNo,
            });

            resultData = data ?? throw new Exception("居民预结算返回结果有误!!!");
            //报销金额 =统筹支付+补充险支付+生育补助+民政救助+民政重大疾病救助+精准扶贫+民政优抚+其它支付
            decimal reimbursementExpenses =
                data.BasicOverallPay + data.SupplementPayAmount + data.BirthAAllowance +
                data.CivilAssistancePayAmount + data.CivilAssistanceSeriousIllnessPayAmount +
                data.AccurateAssistancePayAmount + data.CivilServicessistancePayAmount +
                data.OtherPaymentAmount;

            resultData.ReimbursementExpenses = reimbursementExpenses;
            var updateParam = new UpdateMedicalInsuranceResidentSettlementParam()
            {
                ReimbursementExpensesAmount = CommonHelp.ValueToDouble(reimbursementExpenses),
                SelfPayFeeAmount            = data.CashPayment,
                OtherInfo    = JsonConvert.SerializeObject(data),
                Id           = residentData.Id,
                UserId       = param.UserId,
                SettlementNo = data.DocumentNo,
                MedicalInsuranceAllAmount  = data.TotalAmount,
                PreSettlementTransactionId = param.TransKey,
                MedicalInsuranceState      = MedicalInsuranceState.MedicalInsurancePreSettlement
            };

            //存入中间库
            _medicalInsuranceSqlRepository.UpdateMedicalInsuranceResidentSettlement(updateParam);
            var logParam = new AddHospitalLogParam()
            {
                JoinOrOldJson   = JsonConvert.SerializeObject(param),
                ReturnOrNewJson = JsonConvert.SerializeObject(data),
                User            = userBase,
                BusinessId      = param.BusinessId,
                Remark          = "居民住院病人预结算"
            };

            _systemManageRepository.AddHospitalLog(logParam);
            return(resultData);
        }