using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cosmos.UserFrame;
using Cosmos.Common;
using System.Runtime.InteropServices;
/*-----------------------------------------------------------------------------------------------*/
// 설 명 : CAT 단말기 제어
// 작 성 자 :
// 변경 이력 :
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.OLEDevice
{
///
/// CAT 단말기 제어 CLASS
///
public class DeviceCatTerminal : ICatTerminalUs
{
///
/// 단말기와 승인/취소 통신을 처리하는 함수
///
///
///
///
///
///
[DllImport("SPCNSecuCAT.dll")]
public static extern int SPCNSecuCAT_Payment(int comport, int baud, byte[] input_msg, byte[] output_msg);
///
/// 단말기에 저장된 미전송 내역을 받아오는 함수
///
///
///
///
///
[DllImport("SPCNSecuCAT.dll")]
public static extern int SPCNSecuCAT_GetRemain(int comport, int baud, byte[] output_msg);
///
/// 중국 - 샨더 단말기와 승인/취소 통신을 처리하는 함수
///
///
///
///
[DllImport("LibSand.dll")]
public static extern void card_trans(int comport, byte[] input_msg, byte[] output_msg);
///
/// 중국 - 은련 단말기와 승인/취소 통신을 처리하는 함수
///
///
///
///
[DllImport("posinf.dll")]
public static extern int bankall(byte[] request, byte[] response);
///
/// StateServer Object (StateServer 객체)
///
public StateServer StateObject = (StateServer)StateServer.GetInstance();
///
/// Device 상태 정보 객체
///
public DeviceStatus m_cdevStatus = null;
///
/// Pos 상태 정보 객체
///
public PosStatus m_cPosStatus = null;
///
/// 생성자
///
public DeviceCatTerminal()
{
try
{
m_cPosStatus = (PosStatus)StateObject.POS;
m_cdevStatus = (DeviceStatus)StateObject.DEVICE;
}
catch (Exception ex)
{
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
ex.Message);
}
}
#region 연결확인
///
/// 연결확인(가동시 체크)
///
public bool SPCNSecuCatStatus()
{
bool bRet = false;
string sSendData = string.Empty;
string sRecvData = string.Empty;
try
{
if (m_cPosStatus.Base.OlePosCATModel == PosConst.CAT_MODEL_DIV._KOR_SPCN)
{
sSendData = CmUtil.RPadH("Z0A0 000000000000000000000000000", 360);
if (SPCNSecuCatApprove(sSendData, ref sRecvData) > 0)
bRet = true;
}
else if (m_cPosStatus.Base.OlePosCATModel == PosConst.CAT_MODEL_DIV._CHN_SAND || m_cPosStatus.Base.OlePosCATModel == PosConst.CAT_MODEL_DIV._CHN_UNION)
{
// 중국산은 상태 체크 없어 패스
//if (SPCNSecuCatApprove(sSendData, ref sRecvData) >= 0)
bRet = true;
}
}
catch (Exception ex)
{
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
ex.Message);
}
return bRet;
}
#endregion
#region 연결 상태 확인 및 CAT 단말기 정보 확인
///
/// 연결 상태 및 CAT 단말기 정보 확인
///
public int SPCNSecuCatInfo(string sSendData, ref string sRecvData)
{
int nReturn = -99;
try
{
nReturn = SPCNSecuCatApprove(sSendData, ref sRecvData);
}
catch (Exception ex)
{
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
ex.Message);
}
return nReturn;
}
#endregion
#region 승인/취소 요청
///
/// 승인/취소 요청
///
///
///
///
public int SPCNSecuCatApprove(string sSendData, ref string sRecvData)
{
int nReturn = -99;
try
{
byte[] bytInputMsg = null;
byte[] bytOutput = new byte[4096];
sRecvData = string.Empty;
Array.Clear(bytOutput, 0, bytOutput.Length);
bytInputMsg = Encoding.Default.GetBytes(sSendData);
switch (m_cPosStatus.Base.OlePosCATModel)
{
case PosConst.CAT_MODEL_DIV._KOR_SPCN:
{
nReturn = SPCNSecuCAT_Payment(CmUtil.IntParse(m_cPosStatus.Base.OlePosCATSerialPortNumber.Replace("COM", "")), (int)m_cPosStatus.Base.OlePosCATSerialBaudRate, bytInputMsg, bytOutput); // 승인조회
if (nReturn < 0) //승인실퍠
{
//실패경우
sRecvData = ErrCodeToMsg(nReturn);
}
else
{
sRecvData = ByteToString(bytOutput);
}
break;
}
case PosConst.CAT_MODEL_DIV._CHN_SAND:
{
// 중국 샨더 단말기
card_trans(CmUtil.IntParse(m_cPosStatus.Base.OlePosCATSerialPortNumber.Replace("COM", "")), bytInputMsg, bytOutput); // 승인조회
sRecvData = ByteToString(bytOutput);
if (sRecvData.Length > 0) nReturn = 0;
break;
}
case PosConst.CAT_MODEL_DIV._CHN_UNION:
{
// 중국 은련 단말기
bankall(bytInputMsg, bytOutput); // 승인조회
sRecvData = ByteToString(bytOutput);
if (sRecvData.Length > 0) nReturn = 0;
break;
}
}
}
catch (Exception ex)
{
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
ex.Message);
}
return nReturn;
}
#endregion
#region 승인/취소 요청
///
/// 단말기에 저장된 미전송 내역을 받아오는 함수
///
///
///
public int SPCNSecuCatRemain(ref string sRecvData)
{
int nReturn = -99;
try
{
byte[] bytOutput = new byte[4096];
sRecvData = string.Empty;
Array.Clear(bytOutput, 0, bytOutput.Length);
nReturn = SPCNSecuCAT_GetRemain(CmUtil.IntParse(m_cPosStatus.Base.OlePosCATSerialPortNumber.Replace("COM", "")), (int)m_cPosStatus.Base.OlePosCATSerialBaudRate, bytOutput);
if (nReturn < 0) //승인실퍠
{
//실패경우
sRecvData = ErrCodeToMsg(nReturn);
}
else
{
sRecvData = ByteToString(bytOutput);
}
}
catch (Exception ex)
{
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
ex.Message);
}
return nReturn;
}
#endregion
///
/// Byte배열을 string으로 변환 (Byte배열의 null(0x00)값 제거)
///
///
///
private string ByteToString(byte[] data)
{
int inx = Array.FindIndex(data, 0, (x) => x == 0x0);
if (inx >= 0)
{
return Encoding.Default.GetString(data, 0, inx);
}
else
{
return Encoding.Default.GetString(data);
}
}
///
/// 응답코드
///
///
///
private string ErrCodeToMsg(int nErrCode)
{
string sMsg = string.Empty;
try
{
switch (nErrCode)
{
case -101: sMsg = "시리얼포트번호오류"; break;
case -102: sMsg = "통신속도오류"; break;
case -103: sMsg = "전문길이오류"; break;
case -210: sMsg = "할부개월오류"; break;
case -211: sMsg = "금액봉사료세금오류"; break;
case -212: sMsg = "원거래일자오류"; break;
case -213: sMsg = "포인트거래구분오류"; break;
case -301: sMsg = "거래중카드제거"; break;
case -302: sMsg = "단말기 사용자 강제종료"; break;
case -303: sMsg = "기타단말기오류"; break;
case -304: sMsg = "카드삽입되어있음"; break;
case -305: sMsg = "사용자강제취소"; break;
case -401: sMsg = "시리얼포트오픈오류"; break;
case -402: sMsg = "시리얼쓰기오류"; break;
case -403: sMsg = "시리얼읽기오류"; break;
case -404: sMsg = "시리얼닫기오류"; break;
case -405: sMsg = "시리얼타임아웃"; break;
case -411: sMsg = "미전송내역없음"; break;
default: sMsg = "정의되어 있지 않은 메세지" + "[" + nErrCode + "]"; break;
}
}
catch { }
return sMsg;
}
}
}