| 
						 | 
						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<ChargeRequestPlugInsOut> 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<HisMecSaveDataItemInput>()                   {                       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<ChargeRequestPlugInsOut> 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")            {                //-1 申请单未找到
                if(!(result.MsgHeader.Detail.Contains("未查到开单信息")))                {
                    var payStatus = await GetPayStatus(chargeRequestForPlugIns.ChargeRequestNo, chargeRequestForPlugIns.HisChargeNo);                    if (payStatus == "1")                    {                        throw new Exception("his已缴费");                    }                    else if (payStatus == "2")                    {                        throw new Exception("his已作废");                    }                    else if (payStatus == "3")                    {                        throw new Exception("his已退费");                    }                }                            }            await SetAppChargeRequestFlagAsync(chargeRequestForPlugIns, ChargeRequestFlag.AlreadyCancelCharge);            return new ChargeRequestPlugInsOut();        }
        public override async Task DoWorkAsync()        {            throw new Exception("格尔木DoWorkAsync。。。");            //return base.DoWorkAsync();
        }        public override async Task<ChargeRequestPlugInsOut> 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")            {                var payStatus = await GetPayStatus(chargeRequestForPlugIns.ChargeRequestNo, chargeRequestForPlugIns.HisChargeNo);                if (payStatus != "3")                {                    throw new Exception("允许退费申请失败" + result.MsgHeader.Detail);                }                           }            await SetAppChargeRequestFlagAsync(chargeRequestForPlugIns, ChargeRequestFlag.RefundRequest);            return new ChargeRequestPlugInsOut();        }        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)            {                try                {                  var result =   SyncChargeRequestFlagFromInterfaceAsync(chargeRequest.ChargeRequestId);                }                catch(Exception ex)                {
                }                             }            return base.DoWork();        }
        public override async Task SyncChargeRequestFlagFromInterfaceAsync(Guid chargeRequestId)        {           var chargeRequest = await GetChargeRequestAsync(chargeRequestId);
            var payStatus = await GetPayStatus(chargeRequest.ChargeRequestNo, chargeRequest.HisChargeNo);                        //1:已支付,2.已作废3.已退费, 其他:未支付
            char charRequstFlag;            if (payStatus == "1" && chargeRequest.ChargeRequestFlag != ChargeRequestFlag.RefundRequest)            {                charRequstFlag = ChargeRequestFlag.AlreadyCharge;                SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);
            }            else if (payStatus == "2")            {                charRequstFlag = ChargeRequestFlag.AlreadyCancelCharge;                SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);            }            else if (payStatus == "3")            {                charRequstFlag = ChargeRequestFlag.AlreadyRefund;                SetAppChargeRequestFlagAsync(chargeRequest, charRequstFlag);            }            else            {                //throw new Exception("查询支付状态不支持的收费标志" + result.MsgHeader.ErrCode);
            }        }                private async Task<string>  GetPayStatus(string chargeRequestNo, string hisChargeNo)        {            var hisInput = new HisPayStatusInput()            {                Data = new HisPayStatusDataInput()                {                    MsgHeader = new HisMsgHeaderInput()                    {                        Sender = "PEIS",                        MsgType = "SVR_ODS_6105",                        MsgVersion = "3.1",                    },                    Item = new HisPayStatusDataItemInput()                    {                        Yjxh = hisChargeNo,                        ExamRequestNo = chargeRequestNo,                    }                }            };            var result = await PayStatus(hisInput);            if (result.MsgHeader.Status != "true")            {                throw new Exception("查询支付状态失败" + result.MsgHeader.Detail);            }            //1:已支付,2.已作废3.已退费, 其他:未支付
            return result.MsgHeader.ErrCode;        }        public async Task<HisPatientQueryOut> 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<HisPatientQueryOut>(resultStr);                return result;            }        }
        public async Task<HisMecSaveOut> 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<HisMecSaveOut>(resultStr);                return result;            }        }
        public async Task<HisOutBase> 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<HisOutBase>(resultStr);                return result;            }        }
        public async Task<HisOutBase> 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<HisOutBase>(resultStr);                return result;            }        }
        public async Task<HisOutBase> 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<HisOutBase>(resultStr);                return result;            }        }        private bstjPortTypeClient CreateClient()        {            return new bstjPortTypeClient(EndpointConfiguration.bstjHttpSoap11Endpoint,                _endpointAddress);        }
    }}
  |