using Dapper; using log4net.Repository.Hierarchy; using Npgsql; using ServiceReferenceHzcyHis; using Shentun.Peis.Enums; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.ServiceModel; using System.Text; using System.Threading.Tasks; using static ServiceReferenceHzcyHis.bstjPortTypeClient; namespace Shentun.Peis.PlugIns.Gem { public class ChargeRequestPlugInsGem : ChargeRequestPlugInsBase { private string _endpointAddress = ""; public ChargeRequestPlugInsGem(string parmValue) : base(parmValue) { _endpointAddress = InterfaceConfig.GetSection("Interface").GetSection("EndpointAddress").Value; } public override async Task SendChargeRequestAsync(ChargeRequestPlugInsInput input) { //建立人员档案 var patientRegisterForPlugIns = await GetPatientRegisterAsync(input.ChargeRequestId); var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId); if(chargeRequestForPlugIns == null) { throw new Exception("没有申请单信息"); } if (!chargeRequestForPlugIns.Asbitems.Any()) { throw new Exception("申请单没有组合项目信息"); } if (patientRegisterForPlugIns.BirthDate == null) { throw new Exception("出生日期不能为空"); } var hisPatientQueryInput = new HisPatientQueryInput() { Data = new HisPatientQueryDataInput() { MsgHeader = new HisMsgHeaderInput() { Sender = "PEIS", MsgType = "SVR_ODS_1101", MsgVersion = "3.1", }, Patient = new HisPatientQueryPatientInput() { IdCard = patientRegisterForPlugIns.IdNo, IdCardCode = "01", Name = patientRegisterForPlugIns.PatientName, Sex = "1", BirthDate = ((DateTime)patientRegisterForPlugIns.BirthDate).ToString("yyyy-MM-dd", System.Globalization.DateTimeFormatInfo.InvariantInfo), PatientPhone = patientRegisterForPlugIns.MobileTelephone, EthnicGroupCode = "01", WorkUnit = patientRegisterForPlugIns.CustomerOrgName, Address = patientRegisterForPlugIns.Address, } } }; var result = await PatientQuery(hisPatientQueryInput); if (result.MsgHeader.Status != "true") { throw new Exception("建立HIS档案失败"+ result.MsgHeader.Detail); } //更新人员登记信息 using (DbConnection conn = new NpgsqlConnection(AppConnctionStr)) { conn.Execute(@"update patient_register set his_patient_id = @HisPatientId where id = @PatientRegisterId", new { HisPatientId = result.Patient.PatientId, PatientRegisterId = patientRegisterForPlugIns.PatientRegisterId }); } //发送项目 var hisInput = new HisMecSaveInput() { Data = new HisMecSaveDataInput() { MsgHeader = new HisMsgHeaderInput() { Sender = "PEIS", MsgType = "SVR_ODS_6101", MsgVersion = "3.1", }, Items = new List() { new HisMecSaveDataItemInput() { ExamRequestNo =chargeRequestForPlugIns.ChargeRequestNo, FeeType = "1", EmpId = result.Patient.PatientId, DeptId = "", DoctId = "", ExeDeptId = "", Tjunit = patientRegisterForPlugIns.CustomerOrgName, Tjfee = chargeRequestForPlugIns.Asbitems.Sum(o=>o.Charges).ToString(), Ztxm = "", Remark = "体检科" }, } } }; var mecSaveResult = await MecSave(hisInput); if (mecSaveResult.MsgHeader.Status != "true") { throw new Exception("建立HIS档案失败" + mecSaveResult.MsgHeader.Detail); } //更新申请单信息 using (DbConnection conn = new NpgsqlConnection(AppConnctionStr)) { conn.Execute(@"update charge_request set his_charge_no = @HisChargeNo where id = @ChargeRequestId", new { HisChargeNo = mecSaveResult.MsgHeader.Yjxh, ChargeRequestId = input.ChargeRequestId }); } return new ChargeRequestPlugInsOut(); } public override async Task CancelChargeRequestAsync(ChargeRequestPlugInsInput input) { var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId); if (chargeRequestForPlugIns == null) { throw new Exception("没有申请单信息"); } var hisInput = new HisCancelQrCodeInput() { Data = new HisCancelQrCodeDataInput() { MsgHeader = new HisMsgHeaderInput() { Sender = "PEIS", MsgType = "SVR_ODS_6105", MsgVersion = "3.1", }, Item = new HisCancelQrCodeDataItemInput() { Yjxh = chargeRequestForPlugIns.HisChargeNo, ExamRequestNo = chargeRequestForPlugIns.ChargeRequestNo } } }; var result = await CancelQrCode(hisInput); if (result.MsgHeader.Status != "true") { throw new Exception("作废申请单失败" + result.MsgHeader.Detail); } await SetAppChargeRequestFlagAsync(input.ChargeRequestId, ChargeRequestFlag.AlreadyCancelCharge); return new ChargeRequestPlugInsOut(); } public override async Task DoWorkAsync() { throw new Exception("格尔木DoWorkAsync。。。"); //return base.DoWorkAsync(); } public override Task DoWork() { var queryDaysStr = InterfaceConfig.GetSection("Scheduler").GetSection("QueryDays").Value; if (string.IsNullOrWhiteSpace(queryDaysStr)) { queryDaysStr = "1"; } if(!int.TryParse(queryDaysStr,out int days)) { days = 1; } var chargeRequests = GetRequests(days).Result; foreach (var chargeRequest in chargeRequests) { SyncChargeRequestFlagFromInterfaceAsync(chargeRequest.ChargeRequestId); } return base.DoWork(); } public override async Task SyncChargeRequestFlagFromInterfaceAsync(Guid chargeRequestId) { var chargeRequest = await GetChargeRequestAsync(chargeRequestId); var hisInput = new HisPayStatusInput() { Data = new HisPayStatusDataInput() { MsgHeader = new HisMsgHeaderInput() { Sender = "PEIS", MsgType = "SVR_ODS_6105", MsgVersion = "3.1", }, Item = new HisPayStatusDataItemInput() { Yjxh = chargeRequest.HisChargeNo, ExamRequestNo = chargeRequest.ChargeRequestNo, } } }; var result = PayStatus(hisInput).Result; if (result.MsgHeader.Status != "true") { throw new Exception("查询支付状态失败" + result.MsgHeader.Detail); } //1:已支付,2.已作废3.已退费, 其他:未支付 char charRequstFlag; if (result.MsgHeader.ErrCode == "1") { charRequstFlag = ChargeRequestFlag.AlreadyCharge; SetAppChargeRequestFlagAsync(chargeRequest.ChargeRequestId, charRequstFlag); } else if (result.MsgHeader.ErrCode == "2") { charRequstFlag = ChargeRequestFlag.AlreadyCancelCharge; SetAppChargeRequestFlagAsync(chargeRequest.ChargeRequestId, charRequstFlag); } else if (result.MsgHeader.ErrCode == "3") { charRequstFlag = ChargeRequestFlag.AlreadyRefund; SetAppChargeRequestFlagAsync(chargeRequest.ChargeRequestId, charRequstFlag); } else { //throw new Exception("查询支付状态不支持的收费标志" + result.MsgHeader.ErrCode); } } public override async Task RefundRequestAsync(ChargeRequestPlugInsInput input) { var chargeRequestForPlugIns = await GetChargeRequestAsync(input.ChargeRequestId); if (chargeRequestForPlugIns == null) { throw new Exception("没有申请单信息"); } var hisInput = new HisAgreeRefundInput() { Data = new HisAgreeRefundDataInput() { MsgHeader = new HisMsgHeaderInput() { Sender = "PEIS", MsgType = "SVR_ODS_6105", MsgVersion = "3.1", }, Item = new HisAgreeRefundDataItemInput() { Yjxh = chargeRequestForPlugIns.HisChargeNo, ExamRequestNo = chargeRequestForPlugIns.ChargeRequestNo } } }; var result = await AgreeRefund(hisInput); if (result.MsgHeader.Status != "true") { throw new Exception("允许退费申请失败" + result.MsgHeader.Detail); } await SetAppChargeRequestFlagAsync(input.ChargeRequestId, ChargeRequestFlag.RefundRequest); return new ChargeRequestPlugInsOut(); } public async Task PatientQuery(HisPatientQueryInput input) { using (var client = CreateClient()) { input.SeviceBaseArg.Service = "patientQuery"; var data = XmlHelper.SerializeToXml(input.Data); var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service, input.SeviceBaseArg.Urid, input.SeviceBaseArg.Pwd, data)).@return; var result = XmlHelper.DeserializeXml(resultStr); return result; } } public async Task MecSave(HisMecSaveInput input) { using (var client = CreateClient()) { input.SeviceBaseArg.Service = "mecSave"; var data = XmlHelper.SerializeToXml(input.Data); var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service, input.SeviceBaseArg.Urid, input.SeviceBaseArg.Pwd, data)).@return; var result = XmlHelper.DeserializeXml(resultStr); return result; } } public async Task CancelQrCode(HisCancelQrCodeInput input) { using (var client = CreateClient()) { input.SeviceBaseArg.Service = "cancelQrCode"; var data = XmlHelper.SerializeToXml(input.Data); var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service, input.SeviceBaseArg.Urid, input.SeviceBaseArg.Pwd, data)).@return; var result = XmlHelper.DeserializeXml(resultStr); return result; } } public async Task PayStatus(HisPayStatusInput input) { using (var client = CreateClient()) { input.SeviceBaseArg.Service = "payStatus"; var data = XmlHelper.SerializeToXml(input.Data); var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service, input.SeviceBaseArg.Urid, input.SeviceBaseArg.Pwd, data)).@return; var result = XmlHelper.DeserializeXml(resultStr); return result; } } public async Task AgreeRefund(HisAgreeRefundInput input) { using (var client = CreateClient()) { input.SeviceBaseArg.Service = "agreeRefund"; var data = XmlHelper.SerializeToXml(input.Data); var resultStr = (await client.invokeAsync(input.SeviceBaseArg.Service, input.SeviceBaseArg.Urid, input.SeviceBaseArg.Pwd, data)).@return; var result = XmlHelper.DeserializeXml(resultStr); return result; } } private bstjPortTypeClient CreateClient() { return new bstjPortTypeClient(EndpointConfiguration.bstjHttpSoap11Endpoint, _endpointAddress); } } }