Пример #1
0
        private void BeginRefund(Hashtable htParams)
        {
            try
            {
                #region 组织请求入参
                Dictionary <string, string> dic = new Dictionary <string, string>();
                dic.Add("TransCode", "09");
                dic.Add("TransMoney", CheckMoney(htParams, "MONEY"));
                dic.Add("TransNo", PadRight("", 6));
                dic.Add("MachineID", PadRight("", 10));
                dic.Add("OperatorID", PadRight(SysOperatorInfo.OperatorID, 10));
                dic.Add("ReferenceNo", PadRight(htParams["REFERENCENO"].ToString(), 15));
                dic.Add("AuthNo", PadRight("", 6));
                dic.Add("OldTransDate", Convert.ToDateTime(htParams["OPERATETIME"]).ToString("YYYYMMDD"));
                dic.Add("CardType", "H");
                dic.Add("IndexNo", PadRight(htParams["POSNO"].ToString(), 76));
                dic.Add("Track2", PadRight("", 37));
                dic.Add("Track3", PadRight("", 104));
                dic.Add("OldTransCode", PadRight("", 2));
                dic.Add("OldTerminalID", PadRight("", 15));
                dic.Add("OldAuthNo", PadRight("", 15));
                dic.Add("PayAccountID", PadRight("", 3));
                dic.Add("StoreID", PadRight("", 20));
                dic.Add("ReceiptID", PadRight("", 30));
                dic.Add("OrderID", PadRight("", 15));
                dic.Add("OldBatchNo", PadRight("", 6));
                dic.Add("OldTransTime", PadRight("", 6));
                dic.Add("OldTransMoney", PadRight("", 12));
                dic.Add("ServerIP", PadRight("", 15));
                dic.Add("ListenPort", PadRight("", 6));
                string strInput = dic.GetValueString();
                #endregion

                #region 平台接口调用
                LogService.GlobalInfoMessage("退货交易调用入参:" + strInput);
                StringBuilder sb = new StringBuilder(1000);
                //int iResult = SingleeMethods.CardTransCBK(strInput, sb, null, IntPtr.Zero);
                int    iResult   = SingleeMethods.CardTransDllWin(strInput, sb);
                string strOutput = sb.ToString();
                LogService.GlobalInfoMessage("退货交易调用出参:" + strOutput);
                #endregion

                #region 解析请求出参
                byte[] bytes   = System.Text.Encoding.Default.GetBytes(strOutput);
                string retCode = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 0, 6));
                string retMsg  = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 6, 40));

                #endregion

                #region 交易结果处理
                if (retCode == "000000")
                {
                    string transNo          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 46, 6));
                    string authNo           = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 52, 6));
                    string batchNo          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 58, 6));
                    string bankCardID       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 64, 19));
                    string expDate          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 83, 4));
                    string bankNo           = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 87, 2));
                    string referenceNo      = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 89, 12));
                    string terminalNo       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 101, 15));
                    string merchantID       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 116, 15));
                    string transMoney       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 131, 12));
                    string indexNo          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 143, 16));
                    string customField      = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 159, 74));
                    string sendCardBankCode = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 234, 7));
                    string bankDate         = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 241, 8));
                    string bankTime         = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 249, 6));

                    #region 交易成功
                    LogService.GlobalInfoMessage("退货交易调用成功。" + retMsg);

                    #region 把交易数据写入数据库
                    string seqNo      = htParams["SEQNO"].ToString();
                    string diagnoseID = htParams["DIAGNOSEID"].ToString();
                    string cardID     = htParams["CARDID"].ToString();

                    DateTime dtn;
                    string   strDate = string.Empty;
                    if (!string.IsNullOrEmpty(bankDate.Trim()))
                    {
                        strDate = bankDate.Substring(0, 4) + "-" + bankDate.Substring(4, 2) + "-" + bankDate.Substring(6, 2) + " " + bankTime.Substring(0, 2) + ":" + bankTime.Substring(2, 2);
                    }
                    DateTime payDateTime = DateTime.TryParse(strDate, out dtn) ? dtn : DateTime.Now;
                    decimal  payMoney    = decimal.Parse(transMoney.TrimStart('0'));

                    TBankhisexchangeTransData dataPayment = new TBankhisexchangeTransData()
                    {
                        Hisseqno     = seqNo + "R",
                        Hisstate     = "0",
                        Bankseqno    = transNo,
                        Bankstate    = "1",
                        DIAGNOSEID   = diagnoseID,
                        Hisid        = cardID,
                        Usetype      = "退款",
                        DataSources  = "自助",
                        BusinessType = "POS退款",
                        Operatorid   = SysOperatorInfo.OperatorID,
                        Operatetime  = payDateTime,
                        TerminalNo   = terminalNo,
                        Trfamt       = "-" + payMoney.ToString("0.##"),
                        ITEM1        = bankCardID,
                        ITEM2        = batchNo,
                        ITEM3        = string.Empty,
                        Ohisseqno    = referenceNo,
                        MerchantID   = merchantID,
                    };

                    TBankhisexchangeTransFacade facBankTrans = new TBankhisexchangeTransFacade();
                    facBankTrans.Insert(dataPayment);
                    LogService.GlobalInfoMessage("退款交易数据保存完成。");
                    #endregion
                    #endregion
                }
                else
                {
                    #region 交易失败
                    LogService.GlobalInfoMessage("退货交易调用失败。" + retMsg);
                    throw new Exception(retMsg);
                    #endregion
                }
                #endregion
            }
            catch (Exception e)
            {
                LogService.GlobalInfoMessage("银行退款失败。" + e.Message);
                throw;
            }
        }
Пример #2
0
        private void BeginPay(Hashtable htParams)
        {
            String strErrorMsg = string.Empty;

            try
            {
                #region 组织请求入参
                Dictionary <string, string> dic = new Dictionary <string, string>();
                dic.Add("TransCode", "01");
                dic.Add("TransMoney", CheckMoney(htParams, "MONEY"));
                dic.Add("TransNo", PadRight("", 6));
                dic.Add("MachineID", PadRight("", 10));
                dic.Add("OperatorID", PadRight(SysOperatorInfo.OperatorID, 10));
                dic.Add("ReferenceNo", PadRight("", 15));
                dic.Add("AuthNo", PadRight("", 6));
                dic.Add("OldTransDate", PadRight("", 8));
                dic.Add("CardType", "H");
                dic.Add("IndexNo", PadRight(htParams["POSNO"].ToString(), 76));
                dic.Add("Track2", PadRight("", 37));
                dic.Add("Track3", PadRight("", 104));
                dic.Add("OldTransCode", PadRight("", 2));
                dic.Add("OldTerminalID", PadRight("", 15));
                dic.Add("OldAuthNo", PadRight("", 15));
                dic.Add("PayAccountID", PadRight("", 3));
                dic.Add("StoreID", PadRight("", 20));
                dic.Add("ReceiptID", PadRight("", 30));
                dic.Add("OrderID", PadRight("", 15));
                dic.Add("OldBatchNo", PadRight("", 6));
                dic.Add("OldTransTime", PadRight("", 6));
                dic.Add("OldTransMoney", PadRight("", 12));
                dic.Add("ServerIP", PadRight("", 15));
                dic.Add("ListenPort", PadRight("", 6));
                string strInput = dic.GetValueString();
                #endregion

                #region 平台接口调用
                LogService.GlobalInfoMessage("消费交易调用入参:" + strInput);
                StringBuilder sb = new StringBuilder(1000);
                //int iResult = SingleeMethods.CardTransCBK(strInput, sb, new SingleeMethods.EnterPasswordCallBack(EnterPasswordHandler), frmPwd.Handle);
                int    iResult   = SingleeMethods.CardTransDllWin(strInput, sb);
                string strOutput = sb.ToString();
                LogService.GlobalInfoMessage("消费交易调用出参:" + strOutput);
                #endregion

                #region 解析请求出参

                byte[] bytes   = System.Text.Encoding.Default.GetBytes(strOutput);
                string retCode = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 0, 6));
                string retMsg  = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 6, 40));

                #endregion

                #region 交易结果处理
                if (retCode == "000000")
                {
                    string transNo          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 46, 6));
                    string authNo           = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 52, 6));
                    string batchNo          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 58, 6));
                    string bankCardID       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 64, 19));
                    string expDate          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 83, 4));
                    string bankNo           = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 87, 2));
                    string referenceNo      = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 89, 12));
                    string terminalNo       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 101, 15));
                    string merchantID       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 116, 15));
                    string transMoney       = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 131, 12));
                    string indexNo          = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 143, 16));
                    string customField      = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 159, 74));
                    string sendCardBankCode = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 234, 7));
                    string bankDate         = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 241, 8));
                    string bankTime         = System.Text.Encoding.Default.GetString(SingleeMethods.SubByte(bytes, 249, 6));

                    #region 交易成功
                    LogService.GlobalInfoMessage("消费交易调用成功。" + retMsg);

                    #region 广播出参
                    htParams.Add("REFERENCENO", referenceNo);
                    htParams.Add("BANKCARDID", bankCardID);
                    htParams.Add("BANKSEQNO", transNo);
                    #endregion


                    #region 把交易数据写入数据库
                    string seqNo      = htParams["SEQNO"].ToString();
                    string diagnoseID = htParams["DIAGNOSEID"].ToString();
                    string cardID     = htParams["CARDID"].ToString();

                    //string strDateTime = DateTime.Now.ToString();
                    //if (!string.IsNullOrEmpty(bankDate.Trim()))
                    //{
                    //    strDateTime=bankDate.Substring(0, 4) + "-" + bankDate.Substring(4, 2) + "-" + bankDate.Substring(6, 2) + " " + bankTime.Substring(0, 2) + ":" + bankTime.Substring(2, 2) + ":" + bankTime.Substring(4, 2);

                    //}
                    //DateTime payDateTime = Convert.ToDateTime(strDateTime);
                    try
                    {
                        DateTime dtn;
                        string   strDate = string.Empty;
                        if (!string.IsNullOrEmpty(bankDate.Trim()))
                        {
                            strDate = bankDate.Substring(0, 4) + "-" + bankDate.Substring(4, 2) + "-" + bankDate.Substring(6, 2) + " " + bankTime.Substring(0, 2) + ":" + bankTime.Substring(2, 2);
                        }
                        DateTime payDateTime = DateTime.TryParse(strDate, out dtn) ? dtn : DateTime.Now;

                        decimal payMoney = decimal.Parse(transMoney.TrimStart('0'));

                        TBankhisexchangeTransData dataPayment = new TBankhisexchangeTransData()
                        {
                            InterfaceName = "锡盟新利银医接口",
                            Hisseqno      = seqNo,
                            Hisstate      = "0",
                            Bankseqno     = transNo,
                            Bankstate     = "1",
                            DIAGNOSEID    = diagnoseID,
                            Hisid         = cardID,
                            Usetype       = "消费",
                            DataSources   = "自助",
                            BusinessType  = "POS扣款",
                            Operatorid    = SysOperatorInfo.OperatorID,
                            Operatetime   = payDateTime,
                            TerminalNo    = terminalNo,
                            Trfamt        = payMoney.ToString("0.##"),
                            ITEM1         = bankCardID,
                            ITEM2         = batchNo,
                            ITEM3         = string.Empty,
                            Ohisseqno     = referenceNo,
                            MerchantID    = merchantID,
                        };

                        TBankhisexchangeTransFacade facBankTrans = new TBankhisexchangeTransFacade();
                        facBankTrans.Insert(dataPayment);
                        LogService.GlobalInfoMessage("消费交易数据保存完成。");
                    }
                    catch (Exception ex)
                    {
                        LogService.GlobalInfoMessage("消费交易数据保存失败");
                        #region 打印交易凭证
                        //PrintInfo(htParams);
                        SkynetMessage.MsgInfo("预交金充值失败,需要撤销银行交易,请按POS机提示操作,点击确定后,请重新插入银行卡");
                        Revoke(htParams);
                        #endregion
                        //throw new Exception(string.Format("消费交易数据保存失败!已调用撤销方法!,错误:{0}",ex.Message));
                        throw new Exception(string.Format("银行交易失败,充值金额已退回卡,请重新充值!"));
                    }

                    #endregion
                    #endregion
                }
                #region 交易失败
                else if (retCode == "C41003")
                {
                    strErrorMsg = "取消交易,请重新操作!";
                }
                else if (retCode == "C85006")
                {
                    strErrorMsg = "密码错误,请重新操作!";
                }
                else if (retCode == "C40006")
                {
                    strErrorMsg = "读卡错误,请检查卡片是否插错!";
                }
                else if (retCode == "C99999")
                {
                    strErrorMsg = "银行卡余额不足,交易失败!";
                }
                else
                {
                    strErrorMsg = string.Format("消费交易调用失败:{0}", retMsg);
                }
                if (!string.IsNullOrEmpty(strErrorMsg))
                {
                    LogService.GlobalInfoMessage(strErrorMsg);
                    //SkynetMessage.MsgInfo(strErrorMsg);

                    //Voice voice = new Voice();
                    //voice.PlayText(strErrorMsg);
                    //voice.EndJtts();
                    throw new Exception(strErrorMsg);
                }
                #endregion
                #endregion
            }
            catch (Exception e)
            {
                LogService.GlobalInfoMessage(e.Message);
                //SkynetMessage.MsgInfo(e.Message);
                throw new Exception(string.Format("{0}", e.Message));
            }
        }
Пример #3
0
        /// <summary>
        /// 交易方法
        /// </summary>
        /// <param name="TranType">交易类型,1为消费,2消费确认,-2取消消费,5签到,6结算</param>
        /// <param name="htParams">交易参数,HIS流水号,病人ID,金额</param>
        /// <returns></returns>
        public override int Trans(string TranType, Hashtable htParams)
        {
            base.Trans(TranType, htParams);

            #region 消费
            if (TranType == "1")
            {
                #region 组织参数
                PosInOutputData thePosInOutputData = new PosInOutputData();

                DateTime dtCurrenTime = new CommonFacade().GetServerDateTime();
                thePosInOutputData.TransType = "01";

                //获取交易金额,根据是12位的字符串,没有小数点到小数点后两位
                string strMoney = CheckMoney(htParams, "MONEY");
                thePosInOutputData.TransAmount = strMoney;
                thePosInOutputData.TransDate   = dtCurrenTime.ToString("yyyyMMdd");
                thePosInOutputData.TransTime   = dtCurrenTime.ToString("HHmmss");
                string Seqno = Check(htParams, "SEQNO");
                thePosInOutputData.HISLSH = Seqno;

                string strDiagnoseID = Check(htParams, "DIAGNOSEID");
                string CardID        = Check(htParams, "CARDID");

                #endregion

                #region 调用POS接口
                StringBuilder   sbInput       = new StringBuilder(thePosInOutputData.GetInput());
                StringBuilder   sbOutPut      = new StringBuilder(256);
                PosInOutputData theOutputData = null;

                try
                {
                    //调用银行交易的第一次调用
                    int intResult = Pos_ECRCOMM(sbInput, sbOutPut);
                    if (intResult != 1)
                    {
                        if (intResult == -37 || intResult == -38 || intResult == -44)
                        {
                            thePosInOutputData.TransType = "03";
                            sbInput = new StringBuilder(thePosInOutputData.GetInput());

                            //如果第二次调用
                            intResult = Pos_ECRCOMM(sbInput, sbOutPut);

                            if (intResult != 1)
                            {
                                if (intResult == -37 || intResult == -38 || intResult == -44)
                                {
                                    //第三次调用
                                    intResult = Pos_ECRCOMM(sbInput, sbOutPut);
                                    if (intResult != 1)
                                    {
                                        throw new Exception("调用银行POS机接口失败,返回错误代码:" + intResult);
                                    }
                                }
                            }
                        }
                        else
                        {
                            throw new Exception("调用银行POS机接口失败,返回错误代码:" + intResult);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("调用银行交易方法ECRCOMM失败:" + ex.Message);
                    throw ex;
                }

                try
                {
                    theOutputData = new PosInOutputData(sbOutPut);
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("调用银行交易方法成功,解析银行返回字符串失败:" + ex.Message);
                    throw ex;
                }
                #endregion

                #region 保存POS结算结果

                try
                {
                    TBankhisexchangeTransData data = new TBankhisexchangeTransData();

                    //银行行号+批次号+授权号
                    data.Remark = theOutputData.CardType + "|" + theOutputData.BatchNo + "|" + theOutputData.ApprovalCode;

                    //银行卡号
                    data.ITEM1 = theOutputData.CardNumber;

                    //凭证号
                    data.Bankseqno = theOutputData.ReceiptNo;

                    //金额
                    data.Trfamt = Check(htParams, "MONEY");

                    //商户号
                    data.Buscd = theOutputData.MerchantID;

                    //终端号
                    data.TerminalNo = theOutputData.TerminalID;

                    //批次号
                    data.ITEM2 = theOutputData.BatchNo;

                    //交易日期
                    data.Operatetime = theOutputData.YHJYSJ;
                    data.Operatorid  = SysOperatorInfo.OperatorID;

                    //交易参考号
                    data.Ohisseqno = theOutputData.RefNo;

                    data.Usetype    = "充值";
                    data.Hisid      = CardID;
                    data.DIAGNOSEID = strDiagnoseID;
                    data.Hisseqno   = Seqno;

                    data.DataSources  = "自助";
                    data.BusinessType = "POS充值";
                    data.Bankstate    = "0";
                    data.Hisstate     = "0";

                    TBankhisexchangeTransFacade facade = new TBankhisexchangeTransFacade();
                    facade.Insert(data);
                    LogService.GlobalInfoMessage("调用银行支付交易成功,写入数据库成功!");
                    htParams.Add("CARDNO", theOutputData.CardNumber);
                    htParams.Add("BANKSEQNO", theOutputData.RefNo + "|" + theOutputData.ReceiptNo);
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("保存POS直联记录表T_BANKHISEXCHANGE_TRANS失败:" + ex.Message);
                    DeleteBankTran(thePosInOutputData, theOutputData);
                    throw ex;
                }
                #endregion
            }

            #endregion

            #region 消费确认
            if (TranType == "2")
            {
                //更新交易中间层的记录标识T_BANKHISEXCHANGE_RECORD
                TBankhisexchangeTransFacade facade = new TBankhisexchangeTransFacade();
                string Seqno = Check(htParams, "SEQNO");
                facade.UpdateState(Seqno, "HISSTATE", "1");
            }
            #endregion

            #region 消费撤消
            if (TranType == "-2")
            {
                //根据交易流水号查询HIS中已经存在的交易记录
                string Seqno         = Check(htParams, "SEQNO");
                string strDiagnoseID = Check(htParams, "DIAGNOSEID");
                string CardID        = Check(htParams, "CARDID");

                TBankhisexchangeTransFacade            facade = new TBankhisexchangeTransFacade();
                EntityList <TBankhisexchangeTransData> list   = facade.Get("HISSEQNO = '" + Seqno + "'");
                if (list.Count > 0)
                {
                    #region 如果已经存在,则调用撤消方法

                    #region 组织相关参数
                    LogService.GlobalInfoMessage("HIS处理失败,请用银行的撤消交易开始!");


                    PosInOutputData thePosInOutputData = new PosInOutputData();

                    DateTime dtCurrenTime = new CommonFacade().GetServerDateTime();
                    thePosInOutputData.TransType = "02";

                    //获取交易金额,根据是12位的字符串,没有小数点到小数点后两位

                    decimal decMoney = 0;
                    decimal.TryParse(list[0].Trfamt, out decMoney);

                    string strMoney = GetMoneyString(list[0].Trfamt);
                    thePosInOutputData.TransAmount = strMoney;
                    thePosInOutputData.TransDate   = dtCurrenTime.ToString("yyyyMMdd");
                    thePosInOutputData.TransTime   = dtCurrenTime.ToString("HHmmss");
                    Seqno = list[0].Hisseqno + "R";
                    thePosInOutputData.HISLSH    = Seqno;
                    thePosInOutputData.ReceiptNo = list[0].Bankseqno;

                    #endregion

                    #region 调用POS接口
                    StringBuilder   sbInput       = new StringBuilder(thePosInOutputData.GetInput());
                    StringBuilder   sbOutPut      = new StringBuilder(150);
                    PosInOutputData theOutputData = null;

                    try
                    {
                        //调用银行交易
                        int intResult = Pos_ECRCOMM(sbInput, sbOutPut);
                        if (intResult != 1)
                        {
                            throw new Exception("调用银行POS机接口失败,返回错误代码:" + intResult);
                        }
                    }
                    catch (Exception ex)
                    {
                        LogService.GlobalInfoMessage("调用银行交易方法ECRCOMM失败:" + ex.Message);
                        throw ex;
                    }

                    try
                    {
                        theOutputData = new PosInOutputData(sbOutPut);
                    }
                    catch (Exception ex)
                    {
                        LogService.GlobalInfoMessage("调用银行交易方法成功,解析银行返回字符串失败:" + ex.Message);
                        throw ex;
                    }
                    #endregion

                    #region 保存POS结算结果

                    try
                    {
                        TBankhisexchangeTransData data = new TBankhisexchangeTransData();

                        //银行行号+批次号+授权号
                        data.Remark = theOutputData.CardType + "|" + theOutputData.BatchNo + "|" + theOutputData.ApprovalCode;

                        //银行卡号
                        data.ITEM1 = theOutputData.CardNumber;

                        //凭证号
                        data.Bankseqno = theOutputData.ReceiptNo;

                        //金额
                        data.Trfamt = (decMoney * (-1)).ToString();

                        //商户号
                        data.Buscd = theOutputData.MerchantID;

                        //终端号
                        data.TerminalNo = theOutputData.TerminalID;

                        //批次号
                        data.ITEM2 = theOutputData.BatchNo;

                        //交易日期
                        data.Operatetime = theOutputData.YHJYSJ;
                        data.Operatorid  = SysOperatorInfo.OperatorID;

                        //交易参考号
                        data.Ohisseqno = theOutputData.RefNo;

                        data.Usetype    = "充值冲正";
                        data.Hisid      = CardID;
                        data.DIAGNOSEID = strDiagnoseID;
                        data.Hisseqno   = Seqno;

                        data.DataSources  = "自助";
                        data.BusinessType = "POS冲正";
                        data.Bankstate    = "1";
                        data.Hisstate     = "1";

                        facade.Insert(data);
                        LogService.GlobalInfoMessage("调用银行支付交易成功,写入数据库成功!");
                        //htParams.Add("CARDNO", theOutputData.CardNumber);
                        //htParams.Add("BANKSEQNO", theOutputData.RefNo + "|" + theOutputData.ReceiptNo);
                    }
                    catch (Exception ex)
                    {
                        LogService.GlobalInfoMessage("保存POS直联记录表T_BANKHISEXCHANGE_TRANS失败:" + ex.Message);
                        //DeleteBankTran(thePosInOutputData, theOutputData);
                        throw ex;
                    }
                    #endregion

                    #endregion
                }
                else
                {
                    LogService.GlobalInfoMessage("HIS结算失败,调用银行冲正查询数据未找到,条件:" + "HISSEQNO = '" + Seqno + "'");
                }
            }
            #endregion

            #region 签到
            if (TranType == "5")
            {
            }
            #endregion

            #region 结算
            if (TranType == "6")
            {
            }
            #endregion

            return(0);
        }
Пример #4
0
        public void NetPay(string hisno, string payMethod)
        {
            this.AnsyWorker(ui =>
            {
                ui.UpdateTitle("正在缴费中,请稍等...");

                ui.SynUpdateUI(() =>
                {
                    #region 验证缴费处方信息

                    DataTable dtMain = dsRecipe.Tables[0].DefaultView.ToTable();

                    IEnumerable <string> _CLINICRECIPEIDs = dtMain.AsEnumerable().Where(b => b.Field <bool>("PITCHON1") == true).Select(a => a.Field <string>("CLINICRECIPEID")).Distinct();
                    if (_CLINICRECIPEIDs.Count() == 0)
                    {
                        SkyComm.ShowMessageInfo("请选择要缴费的处方!");
                        return;
                    }
                    this.ucTime1.timer1.Stop();
                    //选中处方的金额
                    decimal sumMoney = DecimalRound.Round(Convert.ToDecimal(dtMain.Compute("SUM(TOTALMONEY)", "PITCHON1 = true")), 2);

                    ClinicPhysicianRecipeFacade clinicPhysicianRecipeFacade = new ClinicPhysicianRecipeFacade();
                    DataSet dsTemp = clinicPhysicianRecipeFacade.FindRecipeDetailByDiagnoseID(SkyComm.DiagnoseID, string.Empty, "3");

                    DataSet ds = dsTemp.Clone();
                    foreach (DataRow row in dsTemp.Tables[0].Rows)
                    {
                        if (_CLINICRECIPEIDs.Contains(row["CLINICRECIPEID"].ToString()))
                        {
                            ds.Tables[0].ImportRow(row);
                        }
                    }
                    if (ds.Tables[0].Rows.Count < 1)
                    {
                        SkyComm.ShowMessageInfo("没有找到可进行缴费的处方记录,请检查处方号");
                        this.ucTime1.Sec = 60;
                        this.ucTime1.timer1.Start();
                        return;
                    }
                    //调用大通审方系统
                    if (!CheckDTPass(ds))
                    {
                        return;
                    }
                    #endregion

                    #region 组织缴费处方信息
                    CommonFacade commonFacade = new CommonFacade();
                    DateTime ServerTime       = commonFacade.GetServerDateTime();

                    LeechdomCharge charge = new LeechdomCharge(SkyComm.DiagnoseID, SysOperatorInfo.OperatorID);
                    charge.AddRecipeCharge(ds);

                    decimal decHisMoney = DecimalRound.Round(Convert.ToDecimal(charge.detailAccountData.Tables[0].Compute("SUM(MONEY)", "")), 2);

                    if (decHisMoney != sumMoney)
                    {
                        charge.detailAccountData.Clear();
                        charge.ecipeMedicineData.Clear();
                        SkyComm.ShowMessageInfo("选择的处方金额不正确,请在门诊窗口进行缴费!");
                        this.ucTime1.Sec = 60;
                        this.ucTime1.timer1.Start();
                        return;
                    }


                    #endregion

                    #region 缴费
                    try
                    {
                        //验证西北妇幼高值耗材
                        if (!CheckHValueMaterial(charge.detailAccountData))
                        {
                            throw new Exception("缴费信息中有高值耗材,请在门诊窗口进行缴费!");
                        }

                        DetailAccountFacade detailAccountFacade = new DetailAccountFacade();


                        DataSet data = new DataSet();

                        Hashtable hashtable = new Hashtable();

                        hashtable.Add("@HISSEQNO", hisno);

                        string mSql = "SELECT * FROM T_BANKHISEXCHANGE_TRANS where HISSEQNO = @HISSEQNO";// and BANKSTATE = '1'

                        QuerySolutionFacade querySolutionFacade = new QuerySolutionFacade();

                        data = querySolutionFacade.ExeQuery(mSql, hashtable);

                        TBankhisexchangeTransData transData = new TBankhisexchangeTransData();

                        transData.Bankseqno    = data.Tables[0].Rows[0]["BANKSEQNO"].ToString();
                        transData.Hisseqno     = data.Tables[0].Rows[0]["HISSEQNO"].ToString();
                        transData.Ohisseqno    = data.Tables[0].Rows[0]["OHISSEQNO"].ToString();
                        transData.Bankstate    = data.Tables[0].Rows[0]["BANKSTATE"].ToString();
                        transData.Hisstate     = data.Tables[0].Rows[0]["HISSTATE"].ToString();
                        transData.Buscd        = data.Tables[0].Rows[0]["BUSCD"].ToString();
                        transData.Hisid        = data.Tables[0].Rows[0]["HISID"].ToString();
                        transData.Trfamt       = data.Tables[0].Rows[0]["TRFAMT"].ToString();
                        transData.Usetype      = data.Tables[0].Rows[0]["USETYPE"].ToString();
                        transData.Operatorid   = data.Tables[0].Rows[0]["OPERATORID"].ToString();
                        transData.Operatetime  = Convert.ToDateTime(data.Tables[0].Rows[0]["OPERATETIME"].ToString());
                        transData.Diagnoseid   = data.Tables[0].Rows[0]["DIAGNOSEID"].ToString();
                        transData.BusinessType = data.Tables[0].Rows[0]["BUSINESSTYPE"].ToString();
                        transData.DataSources  = data.Tables[0].Rows[0]["DATASOURCES"].ToString();
                        transData.DataSources  = data.Tables[0].Rows[0]["DATASOURCES"].ToString();
                        transData.RefundType   = Convert.ToInt32(data.Tables[0].Rows[0]["REFUNDTYPE"].ToString());
                        transData.RefundMoney  = Convert.ToDecimal(data.Tables[0].Rows[0]["REFUNDMONEY"].ToString());
                        transData.Remark       = "_FromPayForRecipeForm";


                        foreach (DataRow Row in charge.detailAccountData.Tables[0].Rows)
                        {
                            Row.BeginEdit();

                            Row["ISBANKCARD"]          = 1;
                            Row["BALANCEMODE"]         = payMethod;
                            Row["BANKTRANSNO"]         = transData.Hisseqno;
                            Row["IS_FEECHARGING_CARD"] = "1";
                            Row.EndEdit();
                            decHisMoney += Convert.ToDecimal(Row["MONEY"]);
                        }



                        DataSet dads = detailAccountFacade.insertEntityNoInvoiceZZZD(charge.detailAccountData, ref charge.ecipeMedicineData, transData);

                        //DataSet dads = detailAccountFacade.insertEntityNoInvoice(charge.detailAccountData, ref charge.ecipeMedicineData);
                        SkyComm.GetCardBalance();
                        SkyComm.ShowMessageInfo("缴费成功!");

                        //根据“药房自动配药接口类型”配置为2时,调用西北妇幼的派昂接口 19797
                        string AutoDoseConfig = SystemInfo.SystemConfigs["药房自动配药接口类型"].DefaultValue;
                        string strCK          = string.Empty;
                        if (AutoDoseConfig == "2" && charge.ecipeMedicineData.Tables[0].Rows.Count > 0)
                        {
                            strCK = UploadAngPaiData(dads, charge.ecipeMedicineData, dsTemp);
                        }

                        PrintReport(dads, strCK, dsRecipe);//打印交费凭证
                    }
                    catch (Exception err)
                    {
                        charge.detailAccountData.Clear();
                        charge.ecipeMedicineData.Clear();
                        Skynet.LoggingService.LogService.GlobalInfoMessage(SkyComm.DiagnoseID + "缴费失败:" + err.Message);
                        SkyComm.ShowMessageInfo("缴费失败:" + err.Message);
                        this.ucTime1.Sec = 60;
                        this.ucTime1.timer1.Start();
                        return;
                    }

                    dsRecipe = GetRecipeInfo();
                    if (dsRecipe == null || dsRecipe.Tables[0].Rows.Count == 0)
                    {
                        SkyComm.CloseWin(this);
                    }
                    else
                    {
                        this.gdcMain.DataSource = dsRecipe.Tables[0].DefaultView;

                        lblYE.Text = SkyComm.cardBlance.ToString();

                        refreshUI();
                    }
                    #endregion
                });
            });
        }
Пример #5
0
        /// <summary>
        /// 交易方法
        /// </summary>
        /// <param name="TranType">交易类型,1为消费,2消费确认,-2取消消费,5签到,6结算</param>
        /// <param name="htParams">交易参数,HIS流水号,病人ID,金额</param>
        /// <returns></returns>
        public override int Trans(string TranType, Hashtable htParams)
        {
            base.Trans(TranType, htParams);

            #region 消费
            if (TranType == "1")
            {
                #region 组织参数
                //POS机号使用自助机的编号
                string strInput = Check(htParams, "POSNO").Trim().PadRight(8, ' ').Substring(0, 8);

                //POS机操作员
                strInput += SysOperatorInfo.OperatorCode.Trim().PadRight(8, ' ');

                //交易类型
                strInput += "00";

                //获取交易金额,根据是12位的字符串,没有小数点到小数点后两位
                string strMoney = CheckMoney(htParams, "MONEY");
                strInput += strMoney;

                //原交易日期
                strInput += "".PadRight(8, ' ');

                //原交易参考号
                strInput += "".PadRight(12, ' ');

                //原凭证号
                strInput += "".PadRight(6, ' ');

                //LRC校验
                Random rm    = new Random();
                int    intrm = rm.Next(100, 999);
                strInput += intrm.ToString();

                string strDiagnoseID = Check(htParams, "DIAGNOSEID");
                string Seqno         = Check(htParams, "SEQNO");
                string CardID        = Check(htParams, "CARDID");

                #endregion

                #region 调用POS接口
                StringBuilder sbInput       = new StringBuilder(strInput);
                StringBuilder sbOutPut      = new StringBuilder(150);
                OutputData    theOutputData = null;

                try
                {
                    //调用银行交易
                    Pos_BankAll(sbInput, sbOutPut);

                    theOutputData = new OutputData(sbOutPut);
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("调用银行交易方法bankall失败:" + ex.Message);
                    throw ex;
                }
                #endregion

                #region 保存POS结算结果

                try
                {
                    DateTime ServerDate            = new CommonFacade().GetServerDateTime();
                    TBankhisexchangeTransData data = new TBankhisexchangeTransData();

                    //银行行号+批次号+授权号
                    data.Remark = theOutputData.BankCode + "|" + theOutputData.BatchNo + "|" + theOutputData.LicenseNo;

                    //银行卡号
                    data.ITEM1 = theOutputData.CardNo;

                    //凭证号
                    data.Bankseqno = theOutputData.VoucherNo;

                    //金额
                    data.Trfamt = theOutputData.TranMoney.ToString();

                    //商户号
                    data.Buscd = theOutputData.MchId;

                    //终端号
                    data.TerminalNo = theOutputData.TerminalNo;

                    //批次号
                    data.ITEM2 = theOutputData.BatchNo;

                    //交易日期
                    data.Operatetime = theOutputData.YHJYSJ;
                    data.Operatorid  = SysOperatorInfo.OperatorID;

                    //交易参考号
                    data.Ohisseqno = theOutputData.RefNo;

                    data.Usetype    = "充值";
                    data.Hisid      = CardID;
                    data.DIAGNOSEID = strDiagnoseID;
                    data.Hisseqno   = Seqno;

                    data.DataSources  = "自助";
                    data.BusinessType = "POS充值";
                    data.Bankstate    = "0";
                    data.Hisstate     = "0";

                    TBankhisexchangeTransFacade facade = new TBankhisexchangeTransFacade();
                    facade.Insert(data);
                    LogService.GlobalInfoMessage("调用银行支付交易成功,写入数据库成功!");
                    htParams.Add("CARDNO", theOutputData.CardNo);
                    htParams.Add("BANKSEQNO", theOutputData.RefNo + "|" + theOutputData.VoucherNo);
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("保存POS直联记录表T_BANKHISEXCHANGE_TRANS失败:" + ex.Message);
                    DeleteBankTran(htParams, theOutputData.VoucherNo);
                    throw ex;
                }
                #endregion
            }

            #endregion

            #region 消费确认
            if (TranType == "2")
            {
                //更新交易中间层的记录标识T_BANKHISEXCHANGE_RECORD
                TBankhisexchangeTransFacade facade = new TBankhisexchangeTransFacade();
                string Seqno = Check(htParams, "SEQNO");
                facade.UpdateState(Seqno, "HISSTATE", "1");
            }
            #endregion

            #region 消费撤消
            if (TranType == "-2")
            {
                //根据交易流水号查询HIS中已经存在的交易记录
                string Seqno         = Check(htParams, "SEQNO");
                string strDiagnoseID = Check(htParams, "DIAGNOSEID");
                string CardID        = Check(htParams, "CARDID");

                TBankhisexchangeTransFacade            facade = new TBankhisexchangeTransFacade();
                EntityList <TBankhisexchangeTransData> list   = facade.Get("HISSEQNO = '" + Seqno + "'");
                if (list.Count > 0)
                {
                    #region 如果已经存在,则调用撤消方法

                    #region 组织相关参数
                    LogService.GlobalInfoMessage("HIS处理失败,请用银行的撤消交易开始!");
                    //POS机号使用自助机的编号
                    string strInput = Check(htParams, "POSNO").Trim().PadRight(8, ' ').Substring(0, 8);

                    //POS机操作员
                    strInput += SysOperatorInfo.OperatorCode.Trim().PadRight(8, ' ');

                    //交易类型
                    strInput += "01";

                    //获取交易金额,根据是12位的字符串,没有小数点到小数点后两位
                    string strMoney = CheckMoney(htParams, "MONEY");
                    strInput += strMoney;

                    //原交易日期
                    strInput += "".PadRight(8, ' ');

                    //原交易参考号
                    strInput += "".PadRight(12, ' ');

                    //原凭证号
                    strInput += list[0].Bankseqno;

                    //LRC校验
                    Random rm    = new Random();
                    int    intrm = rm.Next(100, 999);
                    strInput += intrm.ToString();

                    #endregion

                    #region 调用POS接口
                    StringBuilder sbInput       = new StringBuilder(strInput);
                    StringBuilder sbOutPut      = new StringBuilder(150);
                    OutputData    theOutputData = null;

                    try
                    {
                        //调用银行交易
                        Pos_BankAll(sbInput, sbOutPut);

                        theOutputData = new OutputData(sbOutPut);
                    }
                    catch (Exception ex)
                    {
                        LogService.GlobalInfoMessage("调用银行交易方法bankall失败:" + ex.Message);
                        throw ex;
                    }
                    #endregion

                    #region 保存POS结算结果
                    try
                    {
                        facade.UpdateState(Seqno, "HISSTATE", "-1");

                        DateTime ServerDate            = new CommonFacade().GetServerDateTime();
                        TBankhisexchangeTransData data = new TBankhisexchangeTransData();

                        //银行行号+批次号+授权号
                        data.Remark = theOutputData.BankCode + "|" + theOutputData.BatchNo + "|" + theOutputData.LicenseNo;

                        //银行卡号
                        data.ITEM1 = theOutputData.CardNo;

                        //凭证号
                        data.Bankseqno = theOutputData.VoucherNo;

                        //金额
                        data.Trfamt = (theOutputData.TranMoney * -1).ToString();

                        //商户号
                        data.Buscd = theOutputData.MchId;

                        //终端号
                        data.TerminalNo = theOutputData.TerminalNo;

                        //批次号
                        data.ITEM2 = theOutputData.BatchNo;

                        //交易日期
                        data.Operatetime = theOutputData.YHJYSJ;
                        data.Operatorid  = SysOperatorInfo.OperatorID;

                        //交易参考号
                        data.Ohisseqno = theOutputData.RefNo;

                        data.Usetype    = "冲正";
                        data.Hisid      = CardID;
                        data.DIAGNOSEID = strDiagnoseID;

                        data.Hisseqno = Seqno + "R";

                        data.DataSources  = "自助";
                        data.BusinessType = "POS充值";
                        data.Bankstate    = "0";
                        data.Hisstate     = "-2";

                        facade.Insert(data);
                        LogService.GlobalInfoMessage("调用银行支付交易成功,写入数据库成功!");
                    }
                    catch (Exception ex)
                    {
                        LogService.GlobalInfoMessage("保存POS直联记录表T_BANKHISEXCHANGE_TRANS失败:" + ex.Message);
                        throw ex;
                    }
                    #endregion

                    #endregion
                }
                else
                {
                    LogService.GlobalInfoMessage("HIS结算失败,调用银行冲正查询数据未找到,条件:" + "HISSEQNO = '" + Seqno + "'");
                }
            }
            #endregion

            #region 签到
            if (TranType == "5")
            {
                string PosNo = Check(htParams, "POSNO").Trim();
                //判断当天是否已经进行签到,如果签到不再进行签到
                DateTime ServerDate = new CommonFacade().GetServerDateTime();
                string   Currdate   = ServerDate.ToString("yyyyMMdd");
                HealthCardAuthkeyFacade theAuthKeyfacade = new HealthCardAuthkeyFacade();
                HealthCardAuthkeyData   theEntitydata    = theAuthKeyfacade.GetByPrimaryKey(PosNo, Currdate);
                if (theEntitydata != null)
                {
                    return(0);
                }
                try
                {
                    Trans("6", htParams);
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("调用 POS结算业务失败:" + ex.Message);
                }
                #region 组织参数
                //POS机号使用自助机的编号
                string strInput = Check(htParams, "POSNO").Trim().PadRight(8, ' ').Substring(0, 8);

                //POS机操作员
                strInput += SysOperatorInfo.OperatorCode.Trim().PadRight(8, ' ');

                //交易类型
                strInput += "05";

                //获取交易金额
                strInput += "000000000000";

                //原交易日期
                strInput += "".PadRight(8, ' ');

                //原交易参考号
                strInput += "".PadRight(12, ' ');

                //原凭证号
                strInput += "".PadRight(6, ' ');

                //LRC校验
                Random rm    = new Random();
                int    intrm = rm.Next(100, 999);
                strInput += intrm.ToString();

                #endregion

                #region 调用POS接口
                StringBuilder sbInput       = new StringBuilder(strInput);
                StringBuilder sbOutPut      = new StringBuilder(150);
                OutputData    theOutputData = null;

                try
                {
                    //调用银行交易
                    Pos_BankAll(sbInput, sbOutPut);

                    theOutputData = new OutputData(sbOutPut);

                    theEntitydata          = new HealthCardAuthkeyData();
                    theEntitydata.Orgcode  = PosNo;
                    theEntitydata.Username = Currdate;
                    theEntitydata.Authkey  = theOutputData.MchId + "|" + theOutputData.TranTime;
                    theAuthKeyfacade.Insert(theEntitydata);

                    LogService.GlobalInfoMessage("调用银行交易方法bankall签到交易成功!");
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("调用银行交易方法bankall签到失败:" + ex.Message);
                    throw ex;
                }
                #endregion
            }
            #endregion

            #region 结算
            if (TranType == "6")
            {
                #region 组织参数
                //POS机号使用自助机的编号
                string strInput = Check(htParams, "POSNO").Trim().PadRight(8, ' ').Substring(0, 8);

                //POS机操作员
                strInput += SysOperatorInfo.OperatorCode.Trim().PadRight(8, ' ');

                //交易类型
                strInput += "06";

                //获取交易金额
                strInput += "000000000000";

                //原交易日期
                strInput += "".PadRight(8, ' ');

                //原交易参考号
                strInput += "".PadRight(12, ' ');

                //原凭证号
                strInput += "".PadRight(6, ' ');

                //LRC校验
                Random rm    = new Random();
                int    intrm = rm.Next(100, 999);
                strInput += intrm.ToString();

                #endregion

                #region 调用POS接口
                StringBuilder sbInput       = new StringBuilder(strInput);
                StringBuilder sbOutPut      = new StringBuilder(150);
                OutputData    theOutputData = null;

                try
                {
                    //调用银行交易
                    Pos_BankAll(sbInput, sbOutPut);

                    theOutputData = new OutputData(sbOutPut);
                    LogService.GlobalInfoMessage("调用银行交易方法bankall结算交易成功!");
                }
                catch (Exception ex)
                {
                    LogService.GlobalInfoMessage("调用银行交易方法bankall结算失败:" + ex.Message);
                    throw ex;
                }
                #endregion
            }
            #endregion

            return(0);
        }