|
@@ -188,12 +188,16 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
|
|
|
}
|
|
|
break;
|
|
|
case USER_EVT_EXIT:
|
|
|
+ case EVT_MAINPAGE_DISPLAY:
|
|
|
{
|
|
|
m_captureReason = "4001";
|
|
|
m_bExit = true;
|
|
|
pEvt->SetHandled();
|
|
|
- DoExitWhenIdleTask *task = new DoExitWhenIdleTask(this);
|
|
|
- GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ if (!m_bDoExit) {
|
|
|
+ SetDoExitFlag(true);
|
|
|
+ DoExitWhenIdleTask* task = new DoExitWhenIdleTask(this);
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
case USER_EVT_QUIT:
|
|
@@ -344,6 +348,35 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
+ case USER_EVT_JS_INSERT:
|
|
|
+ {
|
|
|
+ InsertJSEvent* ise = dynamic_cast<InsertJSEvent*>(pEvt);
|
|
|
+ m_bCancelInsert = false;
|
|
|
+ m_bExit = false;
|
|
|
+ InsertJSTask* task = new InsertJSTask(this);
|
|
|
+ task->ctx = ise->ctx;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case USER_EVT_JS_ISSUE_FROM_BOX:
|
|
|
+ {
|
|
|
+ IssueFromBoxJSTask* task = new IssueFromBoxJSTask(this);
|
|
|
+ IssueFromBoxJSEvent* ife = dynamic_cast<IssueFromBoxJSEvent*>(pEvt);;
|
|
|
+ task->ctx = ife->ctx;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case USER_EVT_JS_CAPTURE:
|
|
|
+ {
|
|
|
+ CaptureJSEvent* cje = dynamic_cast<CaptureJSEvent*>(pEvt);
|
|
|
+ CaptureJSTask* task = new CaptureJSTask(this);
|
|
|
+ task->ctx = cje->ctx;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ }
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -396,6 +429,38 @@ unsigned int CCardIssuerFSM::s3_on_event(FSMEvent* pEvt)
|
|
|
case USER_EVT_QUIT:
|
|
|
pEvt->SetHandled();
|
|
|
break;
|
|
|
+ case USER_EVT_JS_INSERT_FINISHED:
|
|
|
+ {
|
|
|
+ ret = pEvt->param1;
|
|
|
+ if (ret == 1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("插卡时查询设备状态故障");
|
|
|
+ setQuickSelfCheck();
|
|
|
+ }
|
|
|
+ else if (ret == 4) {
|
|
|
+ //吐卡
|
|
|
+ EjectJSEvent* eje = dynamic_cast<EjectJSEvent*>(pEvt);
|
|
|
+ EjectJSTask* task = new EjectJSTask(this);
|
|
|
+ task->ctx = NULL;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ }
|
|
|
+ pEvt->SetHandled();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case USER_EVT_JS_INSERT_CANCEL:
|
|
|
+ {
|
|
|
+ m_bCancelInsert = true;
|
|
|
+ pEvt->SetHandled();
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case EVT_MAINPAGE_DISPLAY:
|
|
|
+ {
|
|
|
+ m_captureReason = "4001";
|
|
|
+ m_bExit = true;
|
|
|
+ pEvt->SetHandled();
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -416,6 +481,62 @@ unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt)
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s4 evt (%d,%d)", pEvt->iEvt, pEvt->param1));
|
|
|
|
|
|
switch(pEvt->iEvt){
|
|
|
+ case USER_EVT_JS_READ:
|
|
|
+ {
|
|
|
+ ReadJSEvent* rje = dynamic_cast<ReadJSEvent*>(pEvt);
|
|
|
+ ReadJSTask* task = new ReadJSTask(this);
|
|
|
+ task->ctx = rje->ctx;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ case USER_EVT_JS_POSTONLINE:
|
|
|
+ {
|
|
|
+ PostOnlineJSEvent* poe = dynamic_cast<PostOnlineJSEvent*>(pEvt);
|
|
|
+ PostOnlineJSTask* task = new PostOnlineJSTask(this);
|
|
|
+ task->ctx = poe->ctx;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ case USER_EVT_JS_EJECT:
|
|
|
+ {
|
|
|
+ EjectJSEvent* eje = dynamic_cast<EjectJSEvent*>(pEvt);
|
|
|
+ EjectJSTask* task = new EjectJSTask(this);
|
|
|
+ task->ctx = eje->ctx;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ case USER_EVT_JS_CAPTURE:
|
|
|
+ {
|
|
|
+ CaptureJSEvent* cje = dynamic_cast<CaptureJSEvent*>(pEvt);
|
|
|
+ CaptureJSTask* task = new CaptureJSTask(this);
|
|
|
+ task->ctx = cje->ctx;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ case USER_EVT_JS_EXIT_MIAN_PAGE:
|
|
|
+ {
|
|
|
+ if (m_issueStatus) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S4 receive exception exit to main page, begin capture card");
|
|
|
+ m_captureReason = "4001";
|
|
|
+ CaptureJSTask* task = new CaptureJSTask(this);
|
|
|
+ task->ctx = NULL;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S4 receive exception exit to main page,begin eject card");
|
|
|
+ EjectJSTask* task = new EjectJSTask(this);
|
|
|
+ task->ctx = NULL;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
case USER_EVT_READ:
|
|
|
{
|
|
|
CardReadEvent* crne = dynamic_cast<CardReadEvent*>(pEvt);
|
|
@@ -745,6 +866,20 @@ unsigned int CCardIssuerFSM::s6_on_event(FSMEvent* pEvt)
|
|
|
pEvt->SetHandled();
|
|
|
return 0;
|
|
|
}
|
|
|
+ else if (pEvt->iEvt == USER_EVT_JS_EJECT_FINISHED) {
|
|
|
+ pEvt->SetHandled();
|
|
|
+ if (pEvt->param1 == 0) {
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_STORE_OP, "CardIssuer op.");
|
|
|
+ m_currCardNo = "";
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("客户取走卡片");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else if (pEvt->param1 == 1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("取卡时设备故障");
|
|
|
+ setQuickSelfCheck();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
//Waiting fetch
|
|
@@ -955,6 +1090,16 @@ unsigned int CCardIssuerFSM::s8_on_event(FSMEvent* pEvt)
|
|
|
return 0;
|
|
|
else
|
|
|
return 1;
|
|
|
+ }
|
|
|
+ else if (pEvt->iEvt == USER_EVT_JS_CAPTURE_FINISHED) {
|
|
|
+ pEvt->SetHandled();
|
|
|
+ if (pEvt->param1 == 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ setQuickSelfCheck();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
}else if (pEvt->iEvt == USER_EVT_QUIT) {
|
|
|
pEvt->SetHandled();
|
|
|
return 0;
|
|
@@ -966,10 +1111,19 @@ void CCardIssuerFSM::s9_on_entry()
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
|
m_currentFSMState = 9;
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to reset.");
|
|
|
SetDevState(DEVICE_STATUS_FAULT);
|
|
|
- FSMEvent *e = new FSMEvent(USER_EVT_RESET);
|
|
|
- PostEventFIFO(e);
|
|
|
+ if (m_quickSelfcheck) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to quickSelfcheck.");
|
|
|
+ m_testResult = Error_InvalidState;
|
|
|
+ QuickSelfcheckTask* task = new QuickSelfcheckTask(this);
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to reset.");
|
|
|
+ FSMEvent* e = new FSMEvent(USER_EVT_RESET);
|
|
|
+ PostEventFIFO(e);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
void CCardIssuerFSM::s9_on_exit()
|
|
|
{
|
|
@@ -1128,6 +1282,112 @@ unsigned int CCardIssuerFSM::s14_on_event(FSMEvent* pEvt)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+void CCardIssuerFSM::s15_on_entry()
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ m_currentFSMState = 15;
|
|
|
+ m_bReturnMainPage = false;
|
|
|
+}
|
|
|
+
|
|
|
+void CCardIssuerFSM::s15_on_exit()
|
|
|
+{
|
|
|
+ if (m_bReturnMainPage) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S15 exit, send exit main page event");
|
|
|
+ this->PostEventFIFO(new FSMEvent(USER_EVT_JS_EXIT_MIAN_PAGE));
|
|
|
+ }
|
|
|
+ LOG_FUNCTION();
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int CCardIssuerFSM::s15_on_event(FSMEvent* pEvt)
|
|
|
+{
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s15 evt (%d,%d)", pEvt->iEvt, pEvt->param1);
|
|
|
+ int ret = 0;
|
|
|
+ switch (pEvt->iEvt)
|
|
|
+ {
|
|
|
+ case USER_EVT_JS_POSTONLINE_FINISHED:
|
|
|
+ {
|
|
|
+ pEvt->SetHandled();
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case USER_EVT_JS_READ_FINISHED:
|
|
|
+ {
|
|
|
+ pEvt->SetHandled();
|
|
|
+ if (pEvt->param1 == 0) {
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ else if (pEvt->param1 == 1) {
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case EVT_MAINPAGE_DISPLAY:
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S15 receive exit to main page");
|
|
|
+ pEvt->SetHandled();
|
|
|
+ m_captureReason = "4001";
|
|
|
+ m_bReturnMainPage = true;
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+void CCardIssuerFSM::s16_on_entry()
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ m_currentFSMState = 16;
|
|
|
+ m_bReturnMainPage = false;
|
|
|
+}
|
|
|
+
|
|
|
+void CCardIssuerFSM::s16_on_exit()
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+}
|
|
|
+
|
|
|
+unsigned int CCardIssuerFSM::s16_on_event(FSMEvent* pEvt)
|
|
|
+{
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s16 evt (%d,%d)", pEvt->iEvt, pEvt->param1));
|
|
|
+ int ret = 0;
|
|
|
+ switch (pEvt->iEvt)
|
|
|
+ {
|
|
|
+ case USER_EVT_JS_ISSUE_FROM_BOX_FINISHED:
|
|
|
+ {
|
|
|
+ pEvt->SetHandled();
|
|
|
+ ret = pEvt->param1;
|
|
|
+ if (ret == 2) {
|
|
|
+ setQuickSelfCheck();
|
|
|
+ }
|
|
|
+ else if (ret == 1) {
|
|
|
+ if (m_bReturnMainPage) {
|
|
|
+
|
|
|
+ CaptureJSEvent* cje = dynamic_cast<CaptureJSEvent*>(pEvt);
|
|
|
+ CaptureJSTask* task = new CaptureJSTask(this);
|
|
|
+ task->ctx = NULL;
|
|
|
+ GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
|
|
|
+ pEvt->SetHandled();
|
|
|
+ ret = 3;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case EVT_MAINPAGE_DISPLAY:
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S16 receive exit to main page");
|
|
|
+ pEvt->SetHandled();
|
|
|
+ m_captureReason = "4001";
|
|
|
+ m_bReturnMainPage = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
ErrorCodeEnum CCardIssuerFSM::OnInit()
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
@@ -1544,6 +1804,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
|
|
|
spEntityFunction->OpenConfig(Config_CenterSetting, spConfigCS);
|
|
|
|
|
|
int tmpCardnoMismatch = 0, tmpICRetryTimes = 1, tmpStopUseRF = 0;
|
|
|
+ int tmpSelfcheckSleepTime = 0;
|
|
|
|
|
|
spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "EacQueryFlag", m_eacQueryFlag);
|
|
|
spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UseCardnoMismatch", tmpCardnoMismatch);
|
|
@@ -1558,6 +1819,9 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
|
|
|
if (0 != m_csSyncMaterialUrl.GetLength()) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_csSyncMaterialUrl:%s", m_csSyncMaterialUrl.GetData());
|
|
|
}
|
|
|
+ spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SelfcheckSleepTime", tmpSelfcheckSleepTime);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("tmpSelfcheckSleepTime:%d", tmpSelfcheckSleepTime);
|
|
|
+
|
|
|
|
|
|
spConfigCS->ReadConfigValue("Common", "EacQueryHost", m_EacQueryHost);
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EacQueryFlag:%d,EacQueryHost:%s,UseCardnoMismatch:%d,ICRetryTimes:%d"
|
|
@@ -1572,6 +1836,10 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
|
|
|
m_issueStatusFromFile = m_issueStatus = isIssue;
|
|
|
if (m_issueStatusFromFile == 0)
|
|
|
m_bCardFromHopper = false;
|
|
|
+ if (tmpSelfcheckSleepTime == 0) {
|
|
|
+ m_SelfcheckSleepTime = 10000;//默认10s
|
|
|
+ }
|
|
|
+
|
|
|
ret = UnAcceptCard();
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ret: %d, isIssue: %d, m_hasCardWhileDevOpen:%d, m_issueStatusFromFile:%d",
|
|
|
ret, isIssue, m_hasCardWhileDevOpen, m_issueStatusFromFile);
|
|
@@ -5213,4 +5481,2023 @@ bool CCardIssuerFSM::IfUseRf()
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
-}
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("吐卡开始");
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ Sleep(300);//oilyang@20230106 for keba said "maybe we need stay for machine to prepare..."
|
|
|
+ int ret = 0;
|
|
|
+ ErrorCodeEnum eErr;
|
|
|
+ m_pCardProcess->DataInit();
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->MoveCard(CI_MOVECARD_FRONT_GATE);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ DWORD dwTmpUserErrCode = 0;
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::MoveCard(CI_MOVECARD_FRONT_GATE) err");
|
|
|
+ if (m_bCardFromHopper) {
|
|
|
+ if (IsInBusiness() && ctx != NULL) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FRONT_GATE, "DevAdapter::MoveCard", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FRONT_GATE, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (IsInBusiness() && ctx != NULL) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(eErr, CardIssuer_UserErrorCode_MoveCardToGate_Failed, "DevAdapter::MoveCard", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(eErr, CardIssuer_UserErrorCode_MoveCardToGate_Failed, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ctx != NULL) {
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ return 1;//S9
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220342")("EjectCard, ret: %d", ret);
|
|
|
+ //等待取卡
|
|
|
+ DWORD dwStart, dwEnd;
|
|
|
+ dwStart = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum errState = Error_Succeed;
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ DWORD dwTmpUserErrCode = 0;
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON, "CardReader(fetch) warning on");
|
|
|
+ do {
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ errState = m_hDevHelper->GetDevStatus(m_devStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (Error_Succeed == errState) {
|
|
|
+ dwEnd = GetTickCountRVC();
|
|
|
+ if (m_devStatus.eMedia == CI_MEDIA_ENTERING) {
|
|
|
+ Sleep(WAIT_INTERVAL);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN) err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("EjectJS::SetCardInType");
|
|
|
+ }
|
|
|
+
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader(fetch) warning off");
|
|
|
+ if (ctx != NULL) {
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ }
|
|
|
+ return 0;//成功取走
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader(fetch) warning off");
|
|
|
+
|
|
|
+ if (IsInBusiness() && ctx != NULL) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(errState, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(errState, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ctx != NULL)
|
|
|
+ {
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ return 1;//S9
|
|
|
+ }
|
|
|
+ } while ((dwEnd - dwStart) < 55 * 1000);//预留5秒给吞卡操作
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader(fetch) warning off");
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("客户未取卡超时");
|
|
|
+
|
|
|
+ //超时未取卡进行吞卡操作
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr == Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("EjectJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD)");
|
|
|
+ m_CardCaptured++;
|
|
|
+ m_captureReason = "4998";//超时未取卡引起吞卡
|
|
|
+ ToRegistCaptureCardInfo();//登记吞卡记录
|
|
|
+ m_currCardNo = m_addCardNo = "";
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErrSet = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErrSet != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::SetCardInType err");
|
|
|
+ SetErrorAndLog(eErrSet, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("EjectJS::SetCardInType");
|
|
|
+ }
|
|
|
+ //超时吞卡成功
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Succ, "forget fetch card ,capture succ");
|
|
|
+ if (ctx != NULL) {
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Succ);
|
|
|
+ }
|
|
|
+ return 0;//超时吞卡成功
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD) err");
|
|
|
+ if (ctx != NULL) {
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
|
|
|
+ }
|
|
|
+ //超时吞卡失败
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Fail, "forget fetch card ,capture fail");
|
|
|
+ if (ctx != NULL) {
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Fail);
|
|
|
+ }
|
|
|
+ return 1;//S9 超时吞卡失败
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("吞卡开始");
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ int ret = 0;
|
|
|
+ if (ctx != NULL) {
|
|
|
+ if (!ctx->Req.captureCode.IsNullOrEmpty()) {
|
|
|
+ m_captureReason = ctx->Req.captureCode;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ m_captureReason = "9999";//默认值,未分类的业务吞卡
|
|
|
+ }
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_FromBusiness, CSimpleStringA::Format("CaptureCard called from Business. captureReason=%s", ctx->Req.captureCode.GetData()));
|
|
|
+ }
|
|
|
+ m_pCardProcess->DataInit();
|
|
|
+
|
|
|
+ //判断是否无卡
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(m_devStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr == Error_Succeed) {
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CaptureJS::GetDevStatus succ,m_devStatus.eMedia=%d", (int)m_devStatus.eMedia);
|
|
|
+ if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT) {
|
|
|
+ //读卡器无卡
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErrSet = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErrSet != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::SetCardInType err");
|
|
|
+ SetErrorAndLog(eErrSet, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("CaptureJS::SetCardInType");
|
|
|
+ }
|
|
|
+ CSimpleStringA maskCardno = MaskCardno(m_currCardNo.GetData());
|
|
|
+ m_currCardNo = m_addCardNo = "";
|
|
|
+ if (ctx != NULL) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::GetDevStatus succ, No card found in cardReader, m_currCardNo=%s", maskCardno.GetData());
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Capture_NoCard_Failed, "Capture card, No card found in cardReader");
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Capture_NoCard_Failed);//读卡器无卡
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CaptureJS::GetDevStatus succ, No card found in cardReader");
|
|
|
+ }
|
|
|
+ return 0;//回到无卡状态
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ DWORD dwTmpUserErrCode = 0;
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr == Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("CaptureJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD)");
|
|
|
+ m_CardCaptured++;
|
|
|
+ ToRegistCaptureCardInfo();//登记吞卡记录
|
|
|
+ m_currCardNo = m_addCardNo = "";
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErrSet = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErrSet != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::SetCardInType err");
|
|
|
+ SetErrorAndLog(eErrSet, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("CaptureJS::SetCardInType");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD) err");
|
|
|
+ if (ctx != NULL && IsInBusiness()) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, "DevAdapter::MoveCard", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220343", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
|
|
|
+ }
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+ //业务返回
|
|
|
+ if (ctx != NULL) {
|
|
|
+ if (Error_Succeed == eErr) {
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CapturedJS, ret:%d", ret);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+void CCardIssuerFSM::QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ int ret = 0;
|
|
|
+ if (m_hDevHelper == nullptr) {
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_DevOpen_Failed);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ErrorCodeEnum errCode;
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ errCode = m_hDevHelper->GetDevStatus(m_devStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (Error_Succeed == errCode)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("QueryHasCardJS::GetDevStatus, m_devStatus.eMedia:%d", m_devStatus.eMedia);
|
|
|
+ //ret = (m_devStatus.eMedia == CI_MEDIA_PRESENT) ? 1 : 0;
|
|
|
+ ret = (int)m_devStatus.eMedia;
|
|
|
+ ctx->Ans.position = ret;
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DWORD dwTmpUserErrCode = SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("卡箱发卡");
|
|
|
+ CSimpleStringA errMsg(true);
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+
|
|
|
+ //Req.hopper
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssueCard, issue hopper:%d", ctx->Req.hopper);
|
|
|
+ ctx->Ans.reserved1.Init(2);
|
|
|
+
|
|
|
+ //param Req.hopper is wrong
|
|
|
+ if (ctx->Req.hopper < 1 || ctx->Req.hopper > 6) {
|
|
|
+ errMsg = CSimpleStringA::Format("Issuer Card, the hopperNo(%d) is wrong!!!", ctx->Req.hopper);
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Invalid_Hopper, errMsg.GetData());
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA23CW")(errMsg.GetData());
|
|
|
+ ctx->Answer(Error_Param, CardIssuer_UserErrorCode_Invalid_Hopper);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ m_currentHopper = ctx->Req.hopper;//设置发送的卡箱号
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssueCard, current hopper:%d", m_currentHopper);
|
|
|
+ m_pCardProcess->DataInit();
|
|
|
+
|
|
|
+ ErrorCodeEnum errCode;
|
|
|
+ CardIssuerStatus cis;
|
|
|
+ memset(&cis, 0, sizeof(CardIssuerStatus));
|
|
|
+ bool bEmpty = false;
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ errCode = m_hDevHelper->GetDevStatus(cis);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed) {
|
|
|
+ SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("IssueFromBoxJS::GetDevStatus");
|
|
|
+ if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY || cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP) {
|
|
|
+ bEmpty = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (bEmpty)
|
|
|
+ {
|
|
|
+ //卡箱无卡时返回错误信息
|
|
|
+ CSimpleStringA warnInfo = CSimpleStringA::Format("IssuerCard, hopper%d no more cards to issue. Vendor return:NoCard(%d), CardCount(%d)",
|
|
|
+ cis.eIssuerBin[m_currentHopper - 1], cis.dwIssuerCount[m_currentHopper - 1]);
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_No_More_Card_Issue, warnInfo.GetData());
|
|
|
+
|
|
|
+ DWORD dwUsrErrCode = 0;
|
|
|
+ if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP)
|
|
|
+ {
|
|
|
+ if (m_currentHopper == 1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230B")("未检测到卡箱1,请检测卡箱1是否放好");
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper1;
|
|
|
+ }
|
|
|
+ else if (m_currentHopper == 2)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230C")("未检测到卡箱2,请检测卡箱2是否放好");
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper2;
|
|
|
+ }
|
|
|
+ else if (m_currentHopper == 3)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230D")("未检测到卡箱3,请检测卡箱3是否放好");
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper3;
|
|
|
+ }
|
|
|
+ else if (m_currentHopper == 4)
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper4;
|
|
|
+ else if (m_currentHopper == 5)
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper5;
|
|
|
+ else if (m_currentHopper == 6)
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper6;
|
|
|
+ }
|
|
|
+ else if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY)
|
|
|
+ {
|
|
|
+ if (m_currentHopper == 1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230E")("卡箱1未检测到卡片,请检测卡箱1中卡片是否放好或卡片余量过低");
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper1;
|
|
|
+ }
|
|
|
+ else if (m_currentHopper == 2)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230F")("卡箱2未检测到卡片,请检测卡箱2中卡片是否放好或卡片余量过低");
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper2;
|
|
|
+ }
|
|
|
+ else if (m_currentHopper == 3)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230G")("卡箱3未检测到卡片,请检测卡箱3中卡片是否放好或卡片余量过低");
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper3;
|
|
|
+ }
|
|
|
+ else if (m_currentHopper == 4)
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper4;
|
|
|
+ else if (m_currentHopper == 5)
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper5;
|
|
|
+ else if (m_currentHopper == 6)
|
|
|
+ dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper6;
|
|
|
+ }
|
|
|
+ ctx->Answer(Error_DevNotAvailable, dwUsrErrCode);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //forbid front enter
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ errCode = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("IssueFromBoxJS::SetCardInType");
|
|
|
+ }
|
|
|
+
|
|
|
+ FSMSetIssueFlag(1);
|
|
|
+ //move card to holder
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ errCode = m_hDevHelper->MoveCard(CI_MOVECARD_FROM_HOPPER, m_currentHopper);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ m_bCardFromHopper = true;//用于区分吐卡报错不同
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssueFromBoxJS::MoveCard err, m_currentHopper:%d", m_currentHopper);
|
|
|
+ FSMSetIssueFlag(2);
|
|
|
+ DWORD dwTmpUserErrCode = SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FROM_HOPPER, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220345", "");
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ return 2;//S9
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220345")("IssueCard::MoveCard succ, m_currentHopper:%d", m_currentHopper);
|
|
|
+ }
|
|
|
+ LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_MoveCard_FromHopper, "MoveCard from hopper succ.");
|
|
|
+
|
|
|
+ m_bUseRFTillNext = false;
|
|
|
+ Sleep(1000);
|
|
|
+ ctx->Ans.reserved1[0] = ctx->Ans.reserved1[1] = 0;
|
|
|
+
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::PostOnlineJS(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ if (m_bUseRFTillNext) {
|
|
|
+ return PostOnlineJS_RF(ctx);
|
|
|
+ }
|
|
|
+ bool bCtOK = false;
|
|
|
+ int ret = PostOnlineJS_Contact(ctx, bCtOK);
|
|
|
+ if (!bCtOK && IfUseRf()) {
|
|
|
+ return PostOnlineJS_RF(ctx);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::PostOnlineJS_Contact(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx, bool& bICOK)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PostOnlineJS_Contact) 联机后IC接触处理");
|
|
|
+ m_pCardProcess->DataInit();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PostOnlineJS_Contact>, postOnLine data[%s]", ctx->Req.data.GetData());
|
|
|
+ m_pCardProcess->SplitOnlineReplyData(ctx->Req.data.GetData(), strlen(ctx->Req.data));
|
|
|
+ int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER, m_hDevHelper);
|
|
|
+ CSimpleStringA csTransEnd;
|
|
|
+ if (issBnkAuth == 0)
|
|
|
+ {
|
|
|
+ int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER, m_hDevHelper, m_bCDA);
|
|
|
+ if (transEnd == 0) {
|
|
|
+ csTransEnd = "TRANSEND,0";
|
|
|
+ }
|
|
|
+ else if (transEnd == 1) {
|
|
|
+ csTransEnd = "TRANSEND,1";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ csTransEnd = "TRANSEND,1";
|
|
|
+ }
|
|
|
+ ctx->Ans.result = csTransEnd;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220341")("<PostOnlineJS_Contact>, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::PostOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PostOnlineJS_RF) 联机后IC非接处理");
|
|
|
+ m_pCardProcess->DataInit();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PostOnlineJS_RF>, postOnLine data[%s]", ctx->Req.data.GetData());
|
|
|
+ m_pCardProcess->SplitOnlineReplyData(ctx->Req.data.GetData(), strlen(ctx->Req.data));
|
|
|
+ int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER_RF, m_hDevHelper);
|
|
|
+ CSimpleStringA csTransEnd;
|
|
|
+ if (issBnkAuth == 0)
|
|
|
+ {
|
|
|
+ int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_bCDA);
|
|
|
+ if (transEnd == 0) {
|
|
|
+ csTransEnd = "TRANSEND,0";
|
|
|
+ }
|
|
|
+ else if (transEnd == 1) {
|
|
|
+ csTransEnd = "TRANSEND,1";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ csTransEnd = "TRANSEND,1";
|
|
|
+ }
|
|
|
+ ctx->Ans.result = csTransEnd;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220341")("<PostOnlineJS_RF>, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool& bReadCardInfo, bool& bReadMag, CSimpleStringA& t2Account)
|
|
|
+{
|
|
|
+ m_currCardNo = "";
|
|
|
+ ctx->Ans.magStatus = 0; //读磁硬件状态默认值
|
|
|
+
|
|
|
+ ErrorCodeEnum eErr, eMagReadErr;
|
|
|
+ int activeCardType;
|
|
|
+ bool bIC(false);
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ CSimpleString errMsg("");
|
|
|
+ errMsg = CSimpleString::Format("ReadCard, inParam: m_issueStatus:%d, m_currentHopper:%d", m_issueStatus, m_currentHopper);
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_ReadCard_Process, errMsg.GetData());
|
|
|
+
|
|
|
+ MagTracks magTracks;
|
|
|
+ memset(magTracks.track[0].data, 0, sizeof(magTracks.track[0].data));
|
|
|
+ memset(magTracks.track[1].data, 0, sizeof(magTracks.track[1].data));
|
|
|
+ memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data));
|
|
|
+ magTracks.eRange = CI_TRACK_RANGE_2_3;
|
|
|
+
|
|
|
+ int readTries = 0;
|
|
|
+ do {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eMagReadErr = m_hDevHelper->MagRead(magTracks);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (Error_Succeed == eMagReadErr) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MagRead").setCostTime(l_endTime - l_beginTime)("ReadMag::MagRead t1Status:%d, t2Status:%d, t3Status:%d, t1Len:%d, t2Len:%d, t3Len:%d",
|
|
|
+ magTracks.track[0].eStatus, magTracks.track[1].eStatus, magTracks.track[2].eStatus, magTracks.track[0].dwSize, magTracks.track[1].dwSize, magTracks.track[2].dwSize);
|
|
|
+ bReadMag = true;//读卡成功
|
|
|
+ ctx->Ans.magStatus = 1;//成功
|
|
|
+ ctx->Ans.track1 = (char*)magTracks.track[0].data;
|
|
|
+ ctx->Ans.track2 = (char*)magTracks.track[1].data;
|
|
|
+ ctx->Ans.track3 = (char*)magTracks.track[2].data;
|
|
|
+ ctx->Ans.track1Size = magTracks.track[0].dwSize;
|
|
|
+ ctx->Ans.track2Size = magTracks.track[1].dwSize;
|
|
|
+ ctx->Ans.track3Size = magTracks.track[2].dwSize;
|
|
|
+ ctx->Ans.track1Status = (int)magTracks.track[0].eStatus;
|
|
|
+ ctx->Ans.track2Status = (int)magTracks.track[1].eStatus;
|
|
|
+ ctx->Ans.track3Status = (int)magTracks.track[2].eStatus;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadMag::MagRead fail");
|
|
|
+ SetErrorAndLog(eMagReadErr, MEC_DEVAPI_CARDISSUER_MagRead, "DevAdapter::MagRead", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ bReadMag = false;//读卡失败
|
|
|
+ ctx->Ans.magStatus = 0;//失败
|
|
|
+ ctx->Ans.track1 = "";
|
|
|
+ ctx->Ans.track2 = "";
|
|
|
+ ctx->Ans.track3 = "";
|
|
|
+ ctx->Ans.track1Size = 0;
|
|
|
+ ctx->Ans.track2Size = 0;
|
|
|
+ ctx->Ans.track3Size = 0;
|
|
|
+ ctx->Ans.track1Status = 1;
|
|
|
+ ctx->Ans.track2Status = 1;
|
|
|
+ ctx->Ans.track3Status = 1;
|
|
|
+ }
|
|
|
+ readTries++;
|
|
|
+
|
|
|
+ //判断返回值长度
|
|
|
+ if (magTracks.track[1].dwSize > sizeof(magTracks.track[1].data) || magTracks.track[2].dwSize > sizeof(magTracks.track[2].data))
|
|
|
+ {
|
|
|
+ errMsg = CSimpleString::Format("MagRead, trackSize maybe wrong:t2Size:%d(%d), t3Size:%d(%d)",
|
|
|
+ magTracks.track[1].dwSize, sizeof(magTracks.track[1].data),
|
|
|
+ magTracks.track[2].dwSize, sizeof(magTracks.track[2].data));
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_TrackSize_Wrong, errMsg.GetData());
|
|
|
+ bReadMag = false;//读卡失败
|
|
|
+ ctx->Ans.magStatus = 0;//失败
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
|
|
|
+ {
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op.");
|
|
|
+ if (magTracks.track[1].dwSize > 40)
|
|
|
+ {
|
|
|
+ errMsg = CSimpleString::Format("MagRead, track2Size maybe wrong:t2Size:%d", magTracks.track[1].dwSize);
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Track2Size_Wrong, errMsg.GetData());
|
|
|
+ //ctx->Ans.magStatus = 0;//失败
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //ctx->Ans.track2 = (char*)magTracks.track[1].data;
|
|
|
+ bool bT3OK = false;
|
|
|
+ if (magTracks.track[2].eStatus == CI_DATA_OK)
|
|
|
+ {
|
|
|
+ bT3OK = true;
|
|
|
+ //ctx->Ans.track3 = (char*)magTracks.track[2].data;
|
|
|
+ }
|
|
|
+ Track2Data track2Data;
|
|
|
+ track2Data.status = 0;
|
|
|
+ track2Data.t2Account = "";
|
|
|
+ char* tmpMag2 = new char[256];
|
|
|
+ ZeroMemory(tmpMag2, 256);
|
|
|
+ DecodeTracksData((const char*)magTracks.track[1].data, magTracks.track[1].dwSize, (const char*)magTracks.track[2].data, magTracks.track[2].dwSize, tmpMag2, true, bT3OK);
|
|
|
+
|
|
|
+ int pos = 0;
|
|
|
+ for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos)
|
|
|
+ {
|
|
|
+ if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e || magTracks.track[1].data[i] == 0x44)// fixpoint (3d是=,3e是 >), 运通卡要考虑分隔符为D的情况
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleString::Format("<ReadMag::MagRead>, split pos:%d", pos));
|
|
|
+ if (pos <= 0 || pos == magTracks.track[1].dwSize)
|
|
|
+ {
|
|
|
+ //ctx->Ans.magStatus = 0;//失败
|
|
|
+ if (tmpMag2 != NULL)
|
|
|
+ {
|
|
|
+ delete[]tmpMag2;
|
|
|
+ tmpMag2 = NULL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ char* ddd = new char[40];
|
|
|
+ memset(ddd, 0, 40);
|
|
|
+ memcpy(ddd, magTracks.track[1].data, pos);
|
|
|
+
|
|
|
+ if (SplitTrack2(tmpMag2, track2Data) == 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ //ctx->Ans.magStatus = 1;//成功
|
|
|
+ //ctx->Ans.t2Account = track2Data.t2Account;
|
|
|
+ //ctx->Ans.t2Region = track2Data.t2Region;
|
|
|
+ //ctx->Ans.t2CardSerial = track2Data.t2CardSerial;
|
|
|
+ //ctx->Ans.t2CVC = track2Data.t2CVC;
|
|
|
+ //ctx->Ans.t2ExpireDate = track2Data.t2ExpireDate;
|
|
|
+ bReadCardInfo = true;//成功
|
|
|
+ m_currCardNo = track2Data.t2Account;
|
|
|
+ t2Account = track2Data.t2Account;
|
|
|
+ if (m_issueStatus)
|
|
|
+ {
|
|
|
+ //设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时
|
|
|
+ SetDevState(DEVICE_STATUS_NORMAL);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8))
|
|
|
+ {
|
|
|
+
|
|
|
+ //ctx->Ans.magStatus = 1;//成功
|
|
|
+ //ctx->Ans.t2Account = (char*)ddd;
|
|
|
+ //ctx->Ans.t2Region = "";
|
|
|
+ //ctx->Ans.t2CardSerial = "";
|
|
|
+ //ctx->Ans.t2CVC = "";
|
|
|
+ //ctx->Ans.t2ExpireDate = "";
|
|
|
+ bReadCardInfo = true;//成功
|
|
|
+ m_currCardNo = (char*)ddd;
|
|
|
+ t2Account = (char*)ddd;
|
|
|
+ delete[]ddd;
|
|
|
+
|
|
|
+ }
|
|
|
+ if (tmpMag2 != NULL)
|
|
|
+ {
|
|
|
+ delete[]tmpMag2;
|
|
|
+ tmpMag2 = NULL;
|
|
|
+ }
|
|
|
+ CSimpleString maskCardno = MaskCardno(m_currCardNo.GetData());
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<ReadCard::MagRead>, t2Account len:%d, %s", m_currCardNo.GetLength(), maskCardno.GetData());
|
|
|
+
|
|
|
+ CSimpleStringA cardInfo(true);
|
|
|
+ cardInfo = CSimpleStringA::Format("cardBin:%s", maskCardno.GetData());
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardBin, cardInfo.GetData());
|
|
|
+
|
|
|
+ if (!ctx->Ans.track2.IsNullOrEmpty() && (pos + 8) < magTracks.track[1].dwSize)
|
|
|
+ {
|
|
|
+ cardInfo = CSimpleStringA::Format("cardServiceCode:%s", (ctx->Ans.track2.SubString(pos + 1, 7)).GetData());
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Track2_ServiceCode, cardInfo.GetData());
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } while (readTries < READ_TRY_NUM);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::CheckCardType(CSimpleStringA cardNo, bool bReadMag, int& ICtype)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ ErrorCodeEnum eErr;
|
|
|
+ //oilyang@20230331
|
|
|
+ //1、发卡且读磁成功,不再继续检测IC,一律ICType=1,以便读取IC
|
|
|
+ //2、其他情况(发卡未读到磁条或前端插卡),先查询户口系统进行卡片介质判定:
|
|
|
+ // 2a:户口系统返回非纯磁条介质类型,ICType以户口为准(ICType影响后续IC读取,即:都会读IC)
|
|
|
+ // 2b:其他情况(户口系统访问错(未走户口系统查或访问微服务失败或未返回介质类型或返回纯磁条卡),一律探测是否芯片卡
|
|
|
+ if (m_issueStatus && bReadMag)//发卡默认给芯片卡,且读到磁道(考虑卡片放错)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, issueStatus is true and read mag OK");
|
|
|
+ ICtype = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ int cardTypeFromHost = 0;
|
|
|
+ bool bMismatch = false;
|
|
|
+ //开关控制是否主机查询cardtype
|
|
|
+ if (m_eacQueryFlag == 1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, begin query host to check cardType");
|
|
|
+ cardTypeFromHost = JudgeCardType(cardNo, bMismatch);//0:失败 1:复合 2:磁条 3:ic
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, cardTypeFromHost=%d", cardTypeFromHost);
|
|
|
+ }
|
|
|
+ if (cardTypeFromHost > 0 && cardTypeFromHost != 2)//户口系统返回非纯磁条介质类型
|
|
|
+ {
|
|
|
+ ICtype = cardTypeFromHost;
|
|
|
+ //卡号不同则直接返回报错
|
|
|
+ if (m_bUseCardnoMismatch && bMismatch)
|
|
|
+ {
|
|
|
+ return 1;//账户和户口系统的最新账户不匹配
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, begin detect cardType");
|
|
|
+ //主动探测
|
|
|
+ int activeCardType;
|
|
|
+ int icRetryTimes = 0;
|
|
|
+ bool bIC(false);
|
|
|
+ while (1)
|
|
|
+ {//for poor mag only card,we always retry...
|
|
|
+ bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
|
|
|
+ if (!bIC)
|
|
|
+ icRetryTimes++;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ Sleep(500);
|
|
|
+ if (icRetryTimes >= m_ICRetryTimes)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard>, bIC:%d", bIC);
|
|
|
+
|
|
|
+ //ic探测成功,0.无磁条IC 1.复合 2.磁条 3.纯IC
|
|
|
+ if (bIC) {
|
|
|
+ if (bReadMag) {
|
|
|
+ ICtype = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ICtype = 3;
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, "<CheckCardType>, maybe IC only.");
|
|
|
+ }
|
|
|
+ //释放资源
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->DeactivateICCard();
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::DeactivateICCard err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("CheckCardType::DeactivateICCard");
|
|
|
+ }
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->ReleaseIC();
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::ReleaseIC err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("CheckCardType::ReleaseIC");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //判断是否支持非接
|
|
|
+ if (!IfUseRf()) {
|
|
|
+ m_bUseRFTillNext = false;//无非接
|
|
|
+ if (bReadMag) {
|
|
|
+ ICtype = 2;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ICtype = 0;
|
|
|
+ //既没有读到磁条,又不是IC,很大概率是插反了
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<CheckCardType>, 既没读到磁条,又没检测到IC,可能插反了");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ m_bUseRFTillNext = true;//使用非接
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::MoveCard err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("CheckCardType::MoveCard, (CI_MOVECARD_RF_POSITION)");
|
|
|
+ }
|
|
|
+
|
|
|
+ icRetryTimes = 0;
|
|
|
+ bool bICRF(false);
|
|
|
+ while (1)
|
|
|
+ {//for poor mag only card,we always retry...
|
|
|
+ bICRF = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, m_hDevHelper, activeCardType);
|
|
|
+ if (!bICRF)
|
|
|
+ icRetryTimes++;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ Sleep(500);
|
|
|
+ if (icRetryTimes >= m_ICRetryTimes)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard_RF>, bIC:%d", bICRF);
|
|
|
+ if (!(bICRF && activeCardType == 'A')) {
|
|
|
+ bICRF = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (bICRF) {
|
|
|
+ if (bReadMag) {
|
|
|
+ ICtype = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ICtype = 3;
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, "<CheckCardType>, maybe IC only.");
|
|
|
+ }
|
|
|
+ //释放资源
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->DeactContactlessICCard();
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::DeactContactlessICCard err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactContactlessICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_RF::DeactContactlessICCard");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (bReadMag) {
|
|
|
+ ICtype = 2;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ICtype = 0;
|
|
|
+ //既没有读到磁条,又不是IC,很大概率是插反了
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<CheckCardType>, 既没读到磁条,又没检测到IC,可能插反了");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ CSimpleStringA cardType = CSimpleStringA::Format("cardType:%d", ICtype);
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardType, cardType.GetData());
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::PreOnlineJS_Contact(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool& bICOK, bool& bContinue)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PreOnlineJS_Contact) IC接触读卡");
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnlineJS_Contact, aid[%s], business data[%s]", ctx->Req.aid.GetData(), ctx->Req.businessData.GetData());
|
|
|
+
|
|
|
+ m_pCardProcess->DataInit();
|
|
|
+ //数据已读出,开始pmoc流程
|
|
|
+ m_pCardProcess->SplitBusinessData(ctx->Req.businessData, ctx->Req.businessData.GetLength());
|
|
|
+ m_pCardProcess->SplitBusinessData("DF690101", strlen("DF690101"));
|
|
|
+ int activeCardType;
|
|
|
+ //oilyang@20201014 add emv card support
|
|
|
+ int retDetectAndRead = -1;
|
|
|
+ ICData aidFromBus(false, 0x4f, 0x00);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, the front BusinessData have not provide aid data.");
|
|
|
+ int icRetryTimes = 0;
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (retDetectAndRead == -1)//only retry for active ic card failed!
|
|
|
+ icRetryTimes++;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ Sleep(500);
|
|
|
+ if (icRetryTimes >= m_ICRetryTimes)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ char* pAIDTmp = new char[64];
|
|
|
+ memset(pAIDTmp, 0, 64);
|
|
|
+ HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, the aid from business is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
|
|
|
+ CAutoArray<CSimpleString> preAIDs;
|
|
|
+ preAIDs.Init(1);
|
|
|
+ preAIDs[0] = (CSimpleStringA)pAIDTmp;
|
|
|
+ int icRetryTimes = 0;
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (retDetectAndRead == -1)//only retry for active ic card failed!
|
|
|
+ icRetryTimes++;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ Sleep(500);
|
|
|
+ if (icRetryTimes >= m_ICRetryTimes)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (pAIDTmp != NULL)
|
|
|
+ delete[]pAIDTmp;
|
|
|
+ }
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType);
|
|
|
+
|
|
|
+ if (retDetectAndRead < 0)
|
|
|
+ {
|
|
|
+ ErrorCodeEnum eErrCode = Error_Unexpect;
|
|
|
+ CSimpleStringA ApiName = "";
|
|
|
+ CSimpleStringA alarmMsg = "";
|
|
|
+ CSimpleStringA csErrMsgWithReturnCode = "";
|
|
|
+
|
|
|
+ if (IfUseRf()) {
|
|
|
+ bContinue = true; //继续后面的非接流程
|
|
|
+ if (retDetectAndRead == -1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败");
|
|
|
+ GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
|
|
|
+
|
|
|
+ if (m_issueStatus) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (retDetectAndRead == -2) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("读取IC数据失败");
|
|
|
+ if (m_issueStatus) {
|
|
|
+ SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220320", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220303", "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (retDetectAndRead == -3) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
|
|
|
+ if (m_issueStatus) {
|
|
|
+ SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220320", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220303", "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (retDetectAndRead == -1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败");
|
|
|
+ GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
|
|
|
+
|
|
|
+ if (m_issueStatus) {
|
|
|
+ if (IsInBusiness()) {
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (IsInBusiness()) {
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (retDetectAndRead == -2) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("读取IC数据失败");
|
|
|
+ DWORD dwTmpUserErrCode = 0;
|
|
|
+ if (m_issueStatus) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
|
|
|
+ }
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ else if (retDetectAndRead == -3) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
|
|
|
+ DWORD dwTmpUserErrCode = 0;
|
|
|
+ if (m_issueStatus) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
|
|
|
+ }
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ bICOK = false;
|
|
|
+ return 0;//上电读卡失败
|
|
|
+ }
|
|
|
+
|
|
|
+ m_pCardProcess->TermRiskManage();
|
|
|
+ CSimpleStringA taaResult;
|
|
|
+ BYTE bt9f27 = 0;
|
|
|
+ int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_ISSUER, m_hDevHelper, taaResult, true, m_bCDA, bt9f27);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, TermActionAnalyze, retTAA:%d, taaResult:%s", retTAA, taaResult.GetData());
|
|
|
+ switch (retTAA)
|
|
|
+ {//to be added oiltmp 20140929
|
|
|
+ case -1: //some data may be wrong
|
|
|
+ break;
|
|
|
+ case 1: //terminal trans
|
|
|
+ break;
|
|
|
+ case 2: //to do trans end "TransEnd"
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ ctx->Ans.result = taaResult;
|
|
|
+
|
|
|
+ if (ctx->Ans.result.GetLength() == 0)
|
|
|
+ {
|
|
|
+ if (IfUseRf()) {
|
|
|
+ bContinue = true; //继续后面的非接流程
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>,TermActionAnalyze result len = 0");
|
|
|
+ ctx->Ans.icState = 0;
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ string tmpResult, actionType, result = "", baseICData = "";
|
|
|
+ tmpResult = ctx->Ans.result;
|
|
|
+ char* pSomeICData = new char[ONE_K];
|
|
|
+ ZeroMemory(pSomeICData, ONE_K);
|
|
|
+ int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6, 4).c_str(), m_pDataToARQC, pSomeICData);
|
|
|
+ baseICData = pSomeICData;
|
|
|
+ if (pSomeICData != NULL) {
|
|
|
+ delete[]pSomeICData;
|
|
|
+ }
|
|
|
+ char arqcLen[8];
|
|
|
+ ZeroMemory(arqcLen, sizeof(arqcLen));
|
|
|
+ _itoa(lenRet, arqcLen, 10);
|
|
|
+
|
|
|
+ ICData track2(false, 0x57, 0x00), ICCardSerial(false, 0x5f, 0x34), appExpiryDate(false, 0x5f, 0x24);
|
|
|
+ ErrorCodeEnum eErr = Error_Unexpect;
|
|
|
+ string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType("0"), t2ICExpireDate("");
|
|
|
+
|
|
|
+ char* pExpireDate = new char[12];//获取ic有效期
|
|
|
+ ZeroMemory(pExpireDate, 12);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, appExpiryDate, false, 0) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, can't find expire date");
|
|
|
+ if (IfUseRf()) {
|
|
|
+ bContinue = true; //继续后面的非接流程
|
|
|
+ delete[] pExpireDate;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ HexBuf2StrBuf(appExpiryDate.value, &pExpireDate, appExpiryDate.lenth);
|
|
|
+ t2ICExpireDate = pExpireDate;
|
|
|
+ }
|
|
|
+ delete[] pExpireDate;
|
|
|
+
|
|
|
+
|
|
|
+ char* pICCardSerial = new char[4];//获取ic序号
|
|
|
+ ZeroMemory(pICCardSerial, 4);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, ICCardSerial, false) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, can't find card serial.");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ HexBuf2StrBuf(ICCardSerial.value, &pICCardSerial, ICCardSerial.lenth);
|
|
|
+ t2ICCardSerial = pICCardSerial;
|
|
|
+ }
|
|
|
+ delete[] pICCardSerial;
|
|
|
+
|
|
|
+
|
|
|
+ char* pICTrack2 = new char[128];//获取等效磁条2
|
|
|
+ ZeroMemory(pICTrack2, 128);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineCrossJS_Contact>, ic no track2 data");
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->ReleaseIC();
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("PreOnlineJS_Contact::ReleaseIC");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
|
|
|
+ t2ICTrack2 = pICTrack2;
|
|
|
+
|
|
|
+ int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth);
|
|
|
+ pICTrack2[37] = '\0';
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, ic.track2, split pos:%d", pos);
|
|
|
+ char* ddd = new char[40];
|
|
|
+ memset(ddd, 0, 40);
|
|
|
+ memcpy(ddd, pICTrack2, pos - 1);
|
|
|
+
|
|
|
+ char icTrack2Data[128];
|
|
|
+ ZeroMemory(icTrack2Data, sizeof(icTrack2Data));
|
|
|
+
|
|
|
+ Track2Data track2Data;
|
|
|
+ track2Data.status = 0;
|
|
|
+ track2Data.t2Account = "";
|
|
|
+ cmdDecodeMag2(pICTrack2, icTrack2Data);
|
|
|
+ if (SplitTrack2(icTrack2Data, track2Data) == 0)
|
|
|
+ {
|
|
|
+ t2ICAccount = track2Data.t2Account;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_Split_ICTrack2_Failed, CSimpleStringA::Format("<PreOnlineJS_Contact> SplitTrack2 fail,ic pTrack2.len:%d", strlen(icTrack2Data)));
|
|
|
+ }
|
|
|
+ if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)))
|
|
|
+ {
|
|
|
+ t2ICAccount = (char*)ddd;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
|
|
|
+ }
|
|
|
+ delete[]ddd;
|
|
|
+ }
|
|
|
+ delete[]pICTrack2;
|
|
|
+
|
|
|
+ //80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000
|
|
|
+ if (m_pCardProcess->GetP1() == 0x1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, actionType:%s", actionType.c_str());
|
|
|
+ actionType = "ARQC";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ actionType = "";
|
|
|
+ //【55域】
|
|
|
+ // 基本域:
|
|
|
+ // 9F26 8b 应用密文AC
|
|
|
+ // 9F27 1b 密文信息数据
|
|
|
+ // 9F10 max.32b 发卡行应用数据IAD
|
|
|
+ // 9F37 4b 不可预知数
|
|
|
+ // 9F36 2b 应用交易计数器ATC
|
|
|
+ // 95 5b 终端验证结果TVR
|
|
|
+ // 9A 3cn 交易日期(6位有效数字,YYMMDD)
|
|
|
+ // 9C 1cn 交易类型(2位有效数字)
|
|
|
+ // 9F02 6cn 授权金额(12位有效数字)
|
|
|
+ // 5F2A 2cn 交易货币代码(3位有效数字)
|
|
|
+ // 82 2b 应用交互特征AIP
|
|
|
+ // 9F1A 2cn 终端国家代码(3位有效数字)
|
|
|
+ // 9F03 6cn 其他金额(12位有效数字)
|
|
|
+ // 9F33 3b 终端性能 "E0C900"
|
|
|
+
|
|
|
+ // 可选域:
|
|
|
+ //添加9F26,9F27,9F10,9F33的数据
|
|
|
+ char* pCID = new char[4];
|
|
|
+ ZeroMemory(pCID, 4);
|
|
|
+ HexBuf2StrBuf(&bt9f27, &pCID, 1);
|
|
|
+ char* pIssueBankLen = new char[4];
|
|
|
+ ZeroMemory(pIssueBankLen, 4);
|
|
|
+ int len9f10 = tmpResult.length() - 26 - 4;
|
|
|
+ int lenHigh, lenLow;
|
|
|
+ len9f10 = len9f10 / 2;
|
|
|
+ lenHigh = len9f10 / 16;
|
|
|
+ lenLow = len9f10 % 16;
|
|
|
+ BYTE bt9f10;
|
|
|
+ bt9f10 = (lenHigh << 4) + lenLow;
|
|
|
+ HexBuf2StrBuf(&bt9f10, &pIssueBankLen, 1);
|
|
|
+ baseICData += "9F2608" + tmpResult.substr(10, 16) + "9F2701" + pCID + "9F10" + pIssueBankLen + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "9F3303" + "E0C900";
|
|
|
+
|
|
|
+
|
|
|
+ //result = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
|
|
|
+ // + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|"
|
|
|
+ // + "ARQCDATA," + m_pDataToARQC + "|EXPIREDATE," + pExpireDate + "|T2ACCOUNT," + t2ICAccount + "|T2CARDSERIAL," + t2ICCardSerial
|
|
|
+ // + "|T2CVC," + t2ICCVC + "|T2TRACK2," + t2ICTrack2 + "|CARDCAT," + cardType + "|ICTAGS," + baseICData + "|MAGT2," + (const char*)csMagT2Track
|
|
|
+ // + "|MAGT3," + (const char*)csMagT3Track + "|MAGACCOUNT," + (const char*)csMagAccout + "|MAGREGION," + (const char*)csMagRegion
|
|
|
+ // + "|MAGCARDSERIAL," + (const char*)csMagCardSerial + "|MAGCVC," + (const char*)csMagCVC + "|MAGEXPIREDATAE," + (const char*)csMagExpireDate;
|
|
|
+
|
|
|
+ //json格式返回
|
|
|
+ std::map<std::string, std::string> msgInfo;
|
|
|
+ msgInfo["ACTION"] = actionType.c_str();
|
|
|
+ msgInfo["ATC_CODE"] = tmpResult.substr(6, 4).c_str();
|
|
|
+ msgInfo["ARQC_CODE"] = tmpResult.substr(10, 16).c_str();
|
|
|
+ msgInfo["MAC"] = tmpResult.substr(26, tmpResult.length() - 26 - 4).c_str();
|
|
|
+ CSimpleStringA arqcLenStr = arqcLen;
|
|
|
+ msgInfo["ARQC_SIZE"] = arqcLenStr.GetData();
|
|
|
+ CSimpleStringA arqcData = m_pDataToARQC;
|
|
|
+ msgInfo["ARQC_DATA"] = arqcData.GetData();
|
|
|
+ msgInfo["T2TRACK2_DATA"] = t2ICTrack2.c_str();
|
|
|
+ msgInfo["EXPIRE_DATE"] = t2ICExpireDate.c_str();
|
|
|
+ msgInfo["T2CARD_SERIAL"] = t2ICCardSerial.c_str();
|
|
|
+ msgInfo["CARD_CAT"] = cardType.c_str();
|
|
|
+ msgInfo["IC_TAGS"] = baseICData.c_str();
|
|
|
+
|
|
|
+ std::pair<bool, std::string> strResult;
|
|
|
+ strResult = generateJsonStr(msgInfo);
|
|
|
+ result = strResult.second.c_str();
|
|
|
+
|
|
|
+ //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("data to host result=%s,len=%d", result.c_str(), result.length());
|
|
|
+
|
|
|
+ string txtresult = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
|
|
|
+ + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|ARQCDATA, " + m_pDataToARQC + "|"
|
|
|
+ + "T2TRACK2(len)," + CSimpleStringA::Format("%d", t2ICTrack2.length()).GetData() + "|"
|
|
|
+ + "EXPIREDATE(len)," + CSimpleStringA::Format("%d", t2ICExpireDate.length()).GetData() + "|"
|
|
|
+ + "T2CARDSERIAL(len), " + CSimpleStringA::Format("%d", t2ICCardSerial.length()).GetData() + "|"
|
|
|
+ + "CARDCAT, " + cardType + "|"
|
|
|
+ + "ICTAGS, " + CSimpleStringA::Format("%d", baseICData.length()).GetData();
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, data to host(less)[%s]", txtresult.c_str());
|
|
|
+
|
|
|
+ m_currCardNo = t2ICAccount.c_str();
|
|
|
+ //LogWarn(Severity_Low, Error_Unexpect, CardIssuerStore_UserErrorCode_CardBin, cardInfo.GetData());
|
|
|
+
|
|
|
+ if (pCID != NULL)
|
|
|
+ delete[]pCID;
|
|
|
+ if (pIssueBankLen != NULL)
|
|
|
+ delete[]pIssueBankLen;
|
|
|
+
|
|
|
+ if (m_pDataToARQC != NULL)
|
|
|
+ {
|
|
|
+ delete[]m_pDataToARQC;
|
|
|
+ m_pDataToARQC = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ ctx->Ans.result = result.c_str();
|
|
|
+ ctx->Ans.icState = 1;//成功
|
|
|
+ bICOK = true;
|
|
|
+ bContinue = false;
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220306")();
|
|
|
+ return 0;//不再继续后面的非接流程
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::PreOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PreOnlineJS_RF) IC非接读卡");
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (eErr == Error_Succeed) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("PreOnlineJS_RF::MoveCard, (CI_MOVECARD_RF_POSITION)");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220340", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnlineJS_RF, aid[%s], business data[%s]", ctx->Req.aid.GetData(), ctx->Req.businessData.GetData());
|
|
|
+
|
|
|
+ m_pCardProcess->DataInit();
|
|
|
+ //数据已读出,开始pmoc流程
|
|
|
+ m_pCardProcess->SplitBusinessData(ctx->Req.businessData, ctx->Req.businessData.GetLength());
|
|
|
+ m_pCardProcess->SplitBusinessData("DF690101", strlen("DF690101"));
|
|
|
+
|
|
|
+ int activeCardType;
|
|
|
+ //oilyang@20201014 add emv card support
|
|
|
+ int retDetectAndRead = -1;
|
|
|
+ ICData aidFromBus(false, 0x4f, 0x00);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, the front BusinessData have not provide aid data.");
|
|
|
+ int icRetryTimes = 0;
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (retDetectAndRead == -1)//only retry for active ic card failed!
|
|
|
+ icRetryTimes++;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ Sleep(500);
|
|
|
+ if (icRetryTimes >= m_ICRetryTimes)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ char* pAIDTmp = new char[64];
|
|
|
+ memset(pAIDTmp, 0, 64);
|
|
|
+ HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, the aid from business is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
|
|
|
+ CAutoArray<CSimpleString> preAIDs;
|
|
|
+ preAIDs.Init(1);
|
|
|
+ preAIDs[0] = (CSimpleStringA)pAIDTmp;
|
|
|
+ int icRetryTimes = 0;
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (retDetectAndRead == -1)//only retry for active ic card failed!
|
|
|
+ icRetryTimes++;
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ Sleep(500);
|
|
|
+ if (icRetryTimes >= m_ICRetryTimes)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (pAIDTmp != NULL)
|
|
|
+ delete[]pAIDTmp;
|
|
|
+ }
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType);
|
|
|
+
|
|
|
+ if (retDetectAndRead < 0)
|
|
|
+ {
|
|
|
+ ErrorCodeEnum eErrCode = Error_Unexpect;
|
|
|
+ CSimpleStringA ApiName = "";
|
|
|
+ CSimpleStringA alarmMsg = "";
|
|
|
+ CSimpleStringA csErrMsgWithReturnCode = "";
|
|
|
+
|
|
|
+ if (retDetectAndRead == -1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败(非接)");
|
|
|
+ GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
|
|
|
+
|
|
|
+ if (m_issueStatus) {
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA2327")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA2327")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (IsInBusiness())
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA2326")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA2326")(csErrMsgWithReturnCode.GetData());
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
|
|
|
+ }
|
|
|
+
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (retDetectAndRead == -2) {
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("读取IC数据失败");
|
|
|
+ DWORD dwTmpUserErrCode = 0;
|
|
|
+ if (m_issueStatus) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
|
|
|
+ }
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ else if (retDetectAndRead == -3) {
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
|
|
|
+ DWORD dwTmpUserErrCode = 0;
|
|
|
+ if (m_issueStatus) {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
|
|
|
+ }
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ return 0;//上电读卡失败
|
|
|
+ }
|
|
|
+
|
|
|
+ m_pCardProcess->TermRiskManage();
|
|
|
+ CSimpleStringA taaResult;
|
|
|
+ BYTE bt9f27 = 0;
|
|
|
+ int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_ISSUER_RF, m_hDevHelper, taaResult, true, m_bCDA, bt9f27);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, TermActionAnalyze, retTAA:%d, taaResult:%s", retTAA, taaResult.GetData());
|
|
|
+ switch (retTAA)
|
|
|
+ {//to be added oiltmp 20140929
|
|
|
+ case -1: //some data may be wrong
|
|
|
+ break;
|
|
|
+ case 1: //terminal trans
|
|
|
+ break;
|
|
|
+ case 2: //to do trans end "TransEnd"
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ ctx->Ans.result = taaResult;
|
|
|
+
|
|
|
+ if (ctx->Ans.result.GetLength() == 0)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>,TermActionAnalyze result len = 0");
|
|
|
+ ctx->Ans.icState = 0;
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ string tmpResult, actionType, result = "", baseICData = "";
|
|
|
+ tmpResult = ctx->Ans.result;
|
|
|
+ char* pSomeICData = new char[ONE_K];
|
|
|
+ ZeroMemory(pSomeICData, ONE_K);
|
|
|
+ int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6, 4).c_str(), m_pDataToARQC, pSomeICData);
|
|
|
+ baseICData = pSomeICData;
|
|
|
+ if (pSomeICData != NULL)
|
|
|
+ delete[]pSomeICData;
|
|
|
+ char arqcLen[8];
|
|
|
+ ZeroMemory(arqcLen, sizeof(arqcLen));
|
|
|
+ _itoa(lenRet, arqcLen, 10);
|
|
|
+
|
|
|
+
|
|
|
+ ICData track2(false, 0x57, 0x00), ICCardSerial(false, 0x5f, 0x34), appExpiryDate(false, 0x5f, 0x24);
|
|
|
+ string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType("0"), t2ICExpireDate("");
|
|
|
+
|
|
|
+ char* pExpireDate = new char[12];//获取ic有效期
|
|
|
+ ZeroMemory(pExpireDate, 12);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, appExpiryDate, false, 0) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, can't find expire date");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ HexBuf2StrBuf(appExpiryDate.value, &pExpireDate, appExpiryDate.lenth);
|
|
|
+ t2ICExpireDate = pExpireDate;
|
|
|
+ }
|
|
|
+ delete[] pExpireDate;
|
|
|
+
|
|
|
+
|
|
|
+ char* pICCardSerial = new char[4];//获取ic序号
|
|
|
+ ZeroMemory(pICCardSerial, 4);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, ICCardSerial, false) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, can't find card serial.");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ HexBuf2StrBuf(ICCardSerial.value, &pICCardSerial, ICCardSerial.lenth);
|
|
|
+ t2ICCardSerial = pICCardSerial;
|
|
|
+ }
|
|
|
+ delete[] pICCardSerial;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ char* pICTrack2 = new char[128];//获取等效磁条2
|
|
|
+ ZeroMemory(pICTrack2, 128);
|
|
|
+ if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, ic no track2 data");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
|
|
|
+ t2ICTrack2 = pICTrack2;
|
|
|
+
|
|
|
+ int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth);
|
|
|
+ pICTrack2[37] = '\0';
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("<PreOnlineJS_RF>, ic.track2, split pos:%d", pos));
|
|
|
+ char* ddd = new char[40];
|
|
|
+ memset(ddd, 0, 40);
|
|
|
+ memcpy(ddd, pICTrack2, pos - 1);
|
|
|
+
|
|
|
+ char icTrack2Data[128];
|
|
|
+ ZeroMemory(icTrack2Data, sizeof(icTrack2Data));
|
|
|
+
|
|
|
+ Track2Data track2Data;
|
|
|
+ track2Data.status = 0;
|
|
|
+ track2Data.t2Account = "";
|
|
|
+ cmdDecodeMag2(pICTrack2, icTrack2Data);
|
|
|
+ if (SplitTrack2(icTrack2Data, track2Data) == 0)
|
|
|
+ {
|
|
|
+ t2ICAccount = track2Data.t2Account;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_Split_ICTrack2_Failed, CSimpleStringA::Format("<PreOnlineJS_RF> SplitTrack2 fail,ic pTrack2.len:%d", strlen(icTrack2Data)));
|
|
|
+ }
|
|
|
+ if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)))
|
|
|
+ {
|
|
|
+ t2ICAccount = (char*)ddd;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
|
|
|
+ }
|
|
|
+ delete[]ddd;
|
|
|
+ }
|
|
|
+ delete[]pICTrack2;
|
|
|
+
|
|
|
+ //80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000
|
|
|
+ if (m_pCardProcess->GetP1() == 0x1) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, actionType:%s", actionType.c_str());
|
|
|
+ actionType = "ARQC";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ actionType = "";
|
|
|
+ //【55域】
|
|
|
+ // 基本域:
|
|
|
+ // 9F26 8b 应用密文AC
|
|
|
+ // 9F27 1b 密文信息数据
|
|
|
+ // 9F10 max.32b 发卡行应用数据IAD
|
|
|
+ // 9F37 4b 不可预知数
|
|
|
+ // 9F36 2b 应用交易计数器ATC
|
|
|
+ // 95 5b 终端验证结果TVR
|
|
|
+ // 9A 3cn 交易日期(6位有效数字,YYMMDD)
|
|
|
+ // 9C 1cn 交易类型(2位有效数字)
|
|
|
+ // 9F02 6cn 授权金额(12位有效数字)
|
|
|
+ // 5F2A 2cn 交易货币代码(3位有效数字)
|
|
|
+ // 82 2b 应用交互特征AIP
|
|
|
+ // 9F1A 2cn 终端国家代码(3位有效数字)
|
|
|
+ // 9F03 6cn 其他金额(12位有效数字)
|
|
|
+ // 9F33 3b 终端性能 "E0C900"
|
|
|
+
|
|
|
+ // 可选域:
|
|
|
+ //添加9F26,9F27,9F10,9F33的数据
|
|
|
+ char* pCID = new char[4];
|
|
|
+ ZeroMemory(pCID, 4);
|
|
|
+ HexBuf2StrBuf(&bt9f27, &pCID, 1);
|
|
|
+ char* pIssueBankLen = new char[4];
|
|
|
+ ZeroMemory(pIssueBankLen, 4);
|
|
|
+ int len9f10 = tmpResult.length() - 26 - 4;
|
|
|
+ int lenHigh, lenLow;
|
|
|
+ len9f10 = len9f10 / 2;
|
|
|
+ lenHigh = len9f10 / 16;
|
|
|
+ lenLow = len9f10 % 16;
|
|
|
+ BYTE bt9f10;
|
|
|
+ bt9f10 = (lenHigh << 4) + lenLow;
|
|
|
+ HexBuf2StrBuf(&bt9f10, &pIssueBankLen, 1);
|
|
|
+ baseICData += "9F2608" + tmpResult.substr(10, 16) + "9F2701" + pCID + "9F10" + pIssueBankLen + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "9F3303" + "E0C900";
|
|
|
+
|
|
|
+ //result = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
|
|
|
+ // + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|"
|
|
|
+ // + "ARQCDATA," + m_pDataToARQC + "|EXPIREDATE," + pExpireDate + "|T2ACCOUNT," + t2ICAccount + "|T2CARDSERIAL," + t2ICCardSerial
|
|
|
+ // + "|T2CVC," + t2ICCVC + "|T2TRACK2," + t2ICTrack2 + "|CARDCAT," + cardType + "|ICTAGS," + baseICData + "|MAGT2," + (const char*)csMagT2Track
|
|
|
+ // + "|MAGT3," + (const char*)csMagT3Track + "|MAGACCOUNT," + (const char*)csMagAccout + "|MAGREGION," + (const char*)csMagRegion
|
|
|
+ // + "|MAGCARDSERIAL," + (const char*)csMagCardSerial + "|MAGCVC," + (const char*)csMagCVC + "|MAGEXPIREDATAE," + (const char*)csMagExpireDate;
|
|
|
+
|
|
|
+ //json格式返回
|
|
|
+ std::map<std::string, std::string> msgInfo;
|
|
|
+ msgInfo["ACTION"] = actionType.c_str();
|
|
|
+ msgInfo["ATC_CODE"] = tmpResult.substr(6, 4).c_str();
|
|
|
+ msgInfo["ARQC_CODE"] = tmpResult.substr(10, 16).c_str();
|
|
|
+ msgInfo["MAC"] = tmpResult.substr(26, tmpResult.length() - 26 - 4).c_str();
|
|
|
+ CSimpleStringA arqcLenStr = arqcLen;
|
|
|
+ msgInfo["ARQC_SIZE"] = arqcLenStr.GetData();
|
|
|
+ CSimpleStringA arqcData = m_pDataToARQC;
|
|
|
+ msgInfo["ARQC_DATA"] = arqcData.GetData();
|
|
|
+ msgInfo["T2TRACK2_DATA"] = t2ICTrack2.c_str();
|
|
|
+ msgInfo["EXPIRE_DATE"] = t2ICExpireDate.c_str();
|
|
|
+ msgInfo["T2CARD_SERIAL"] = t2ICCardSerial.c_str();
|
|
|
+ msgInfo["CARD_CAT"] = cardType.c_str();
|
|
|
+ msgInfo["IC_TAGS"] = baseICData.c_str();
|
|
|
+
|
|
|
+ std::pair<bool, std::string> strResult;
|
|
|
+ strResult = generateJsonStr(msgInfo);
|
|
|
+ result = strResult.second.c_str();
|
|
|
+
|
|
|
+ //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("data to host result=%s,len=%d", result.c_str(), result.length());
|
|
|
+
|
|
|
+ string txtresult = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
|
|
|
+ + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|ARQCDATA, " + m_pDataToARQC + "|"
|
|
|
+ + "T2TRACK2(len)," + CSimpleStringA::Format("%d", t2ICTrack2.length()).GetData() + "|"
|
|
|
+ + "EXPIREDATE(len)," + CSimpleStringA::Format("%d", t2ICExpireDate.length()).GetData() + "|"
|
|
|
+ + "T2CARDSERIAL(len), " + CSimpleStringA::Format("%d", t2ICCardSerial.length()).GetData() + "|"
|
|
|
+ + "CARDCAT, " + cardType + "|"
|
|
|
+ + "ICTAGS, " + CSimpleStringA::Format("%d", baseICData.length()).GetData();
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, data to host(less)[%s]", txtresult.c_str());
|
|
|
+
|
|
|
+ m_currCardNo = t2ICAccount.c_str();
|
|
|
+
|
|
|
+ if (pCID != NULL)
|
|
|
+ delete[]pCID;
|
|
|
+ if (pIssueBankLen != NULL)
|
|
|
+ delete[]pIssueBankLen;
|
|
|
+
|
|
|
+ if (m_pDataToARQC != NULL)
|
|
|
+ {
|
|
|
+ delete[]m_pDataToARQC;
|
|
|
+ m_pDataToARQC = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ ctx->Ans.result = result.c_str();
|
|
|
+ ctx->Ans.icState = 1;//成功
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_ReadByRF, CSimpleStringA::Format("PreOnline_RF ok.iIssue:%d ", m_issueStatus));
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220306")();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ //判断是否有卡,无卡则报错
|
|
|
+ LOG_FUNCTION();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("读卡开始");
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum errCode = m_hDevHelper->GetDevStatus(m_devStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (Error_Succeed == errCode)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("ReadJS::GetDevStatus, m_devStatus.eMedia:%d", m_devStatus.eMedia);
|
|
|
+ if (m_devStatus.eMedia != CI_MEDIA_PRESENT) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS read fail , has no card.");
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Read_NoCard_Failed);//无卡
|
|
|
+ return 1;//跳转到无卡状态?
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS::GetDevStatus err");
|
|
|
+ DWORD dwTmpUserErrCode = SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //有卡读磁,返回读磁操作和磁条解析结果。
|
|
|
+ bool bReadCardInfo(false), bReadMag(false);
|
|
|
+ CSimpleStringA t2Account("");
|
|
|
+ ReadMag(ctx, bReadCardInfo, bReadMag, t2Account);//读卡
|
|
|
+
|
|
|
+ //判定卡片ICtype
|
|
|
+ int ICtype = 0;//0:失败 1:复合 2:磁条 3:ic
|
|
|
+ m_bUseRFTillNext = false;//默认初始值
|
|
|
+ int ret = CheckCardType(t2Account, bReadMag, ICtype);
|
|
|
+
|
|
|
+ if (ret == 0) {
|
|
|
+ if (ICtype == 3) {
|
|
|
+ ctx->Ans.magStatus = 0;//单IC设置磁条为空,后续进行ic上电
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ICtype == 0) {
|
|
|
+ ctx->Ans.magStatus = 0;
|
|
|
+ ctx->Ans.icState = 0;
|
|
|
+ ctx->Ans.icMode = -1;
|
|
|
+ ctx->Ans.result = "";
|
|
|
+ ctx->Answer(Error_Succeed);//无磁无IC直接返回
|
|
|
+ }
|
|
|
+ else if (ICtype == 2) {
|
|
|
+ ctx->Ans.magStatus = 1;
|
|
|
+ ctx->Ans.icState = 0;
|
|
|
+ ctx->Ans.icMode = -1;
|
|
|
+ ctx->Ans.result = "";
|
|
|
+ ctx->Answer(Error_Succeed);//单磁条直接返回
|
|
|
+ }
|
|
|
+ else if (ICtype == 1 || ICtype == 3) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to PreOnline");//联机上电
|
|
|
+ ctx->Ans.icState = 0;//默认值
|
|
|
+ ctx->Ans.icMode = -1;//默认值
|
|
|
+ if (m_bUseRFTillNext) {
|
|
|
+ ctx->Ans.icMode = 1;
|
|
|
+ PreOnlineJS_RF(ctx);
|
|
|
+ PowerOffIC(1);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //先接触上电,有条件进行非接上电
|
|
|
+ bool bCtOK = false;
|
|
|
+ bool bContinue = false;//是否继续非接流程
|
|
|
+ ctx->Ans.icMode = 0;
|
|
|
+ PreOnlineJS_Contact(ctx, bCtOK, bContinue);
|
|
|
+ PowerOffIC(0);
|
|
|
+ if (bContinue) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnlineJS_Contact 用非接兜底");
|
|
|
+ ctx->Ans.icMode = 1;
|
|
|
+ PreOnlineJS_RF(ctx);
|
|
|
+ PowerOffIC(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Account_EAC_Mismatch);//账户和户口系统的最新账户不匹配
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ m_pCardProcess->DataInit();//??是否需要此处就初始化
|
|
|
+ //m_bCancelByRFIC = false;//??无用变量
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON, "CardReader warning on");
|
|
|
+ m_bWaitAccepteMore = false;//是否还继续使用
|
|
|
+ //查询插卡前卡机是否有卡
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ ErrorCodeEnum eErr = Error_Unexpect;
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->GetDevStatus(m_devStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (Error_Succeed == eErr) {
|
|
|
+ if (m_devStatus.eMedia == CI_MEDIA_PRESENT) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("InsertJS::InternalInsert,internal has card before insert");
|
|
|
+ ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Insert_Card_HasCard_Failed);
|
|
|
+ return 5;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DWORD dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, 10, "QLR040220303", "");
|
|
|
+ return 1;
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ //等待插卡
|
|
|
+ int rc = InternalInsert();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("InsertJS::InternalInsert, result:%d", rc));
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader warning off");
|
|
|
+ if (rc == 0) {
|
|
|
+ FSMSetIssueFlag(0);
|
|
|
+ m_bCardFromHopper = false;
|
|
|
+ LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_InsertCardSucceed, "InsertJS, insert succeed");
|
|
|
+ m_bUseRFTillNext = false;
|
|
|
+ ctx->Answer(Error_Succeed);
|
|
|
+ }
|
|
|
+ else if (rc == 2)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("InsertJS, insert timeout");
|
|
|
+ ctx->Answer(Error_TimeOut,CardIssuer_UserErrorCode_Insert_Card_TimeOut);
|
|
|
+ }
|
|
|
+ else if (rc == 3 || rc == 4)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertJS, insert cancel");
|
|
|
+ ctx->Answer(Error_Cancel, CardIssuer_UserErrorCode_Insert_Card_Cancel);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DWORD dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, 10, "QLR040220303", "");
|
|
|
+ ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
|
|
|
+ }
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::InternalInsert()
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ ErrorCodeEnum eErr = Error_Unexpect;
|
|
|
+ int acceptTries = 0, errRet = 0;//0成功,1查询状态失败 2超时 3取消 4取消有卡
|
|
|
+ //m_bWaitingAccept = true;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("InternalInsert, m_bExit:%d, m_bCancelInsert:%d, m_bWaitAccepteMore:%d",m_bExit, m_bCancelInsert, m_bWaitAccepteMore));
|
|
|
+ bool bHasSetCardInType = false;
|
|
|
+ DWORD64 dwStart = GetTickCountRVC();
|
|
|
+ DWORD64 dwEnd = dwStart;
|
|
|
+
|
|
|
+ errRet = 2;//默认是超时
|
|
|
+ do {
|
|
|
+ if (m_bExit)
|
|
|
+ { //页面退到首页
|
|
|
+ m_bCancelInsert = true;
|
|
|
+ errRet = 3;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (m_bCancelInsert)
|
|
|
+ { //取消插卡
|
|
|
+ errRet = 3;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->GetDevStatus(m_devStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (Error_Succeed == eErr)
|
|
|
+ {
|
|
|
+ //成功
|
|
|
+ if (m_devStatus.eMedia == CI_MEDIA_PRESENT)
|
|
|
+ {
|
|
|
+ LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op.");
|
|
|
+ errRet = 0;
|
|
|
+ break;//插卡成功
|
|
|
+ }
|
|
|
+ else if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT)
|
|
|
+ {
|
|
|
+ //无卡
|
|
|
+ Sleep(ACCEPT_TRY_INTERVAL);
|
|
|
+ //打开进口
|
|
|
+ if (!m_bCancelInsert) {
|
|
|
+ if (!bHasSetCardInType) {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_ALL);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (Error_Succeed == eErr) {
|
|
|
+ bHasSetCardInType = true;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_ALL err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //失败
|
|
|
+ Sleep(ACCEPT_TRY_INTERVAL*3);
|
|
|
+ errRet = 1;
|
|
|
+ break;//查询硬件状态失败。???要退吗
|
|
|
+ }
|
|
|
+
|
|
|
+ dwEnd = GetTickCountRVC();
|
|
|
+ } while ((dwEnd - dwStart) < 58 * 1000);
|
|
|
+
|
|
|
+ m_bExit = false;
|
|
|
+
|
|
|
+ if (errRet == 0 || errRet ==1) {
|
|
|
+ //关闭进口
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (Error_Succeed != eErr)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //2和3情况
|
|
|
+ if (m_bCancelInsert) {
|
|
|
+ //判定是否有卡,有卡则走吐卡流程
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->GetDevStatus(m_devStatus);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (Error_Succeed == eErr) {
|
|
|
+ if (m_devStatus.eMedia == CI_MEDIA_PRESENT) {
|
|
|
+ errRet = 4;//取消时有卡
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ errRet = 3;//取消无卡
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ errRet = 1;//查询硬件状态失败。???要退吗
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ errRet = 2;//正常超时
|
|
|
+ }
|
|
|
+
|
|
|
+ if (errRet != 4) {
|
|
|
+ //关闭进口
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+ if (Error_Succeed != eErr)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN err");
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return errRet;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+DWORD CCardIssuerFSM::GetFsmStateErrCode()
|
|
|
+{
|
|
|
+ int state = GetFSMState();
|
|
|
+ switch (state)
|
|
|
+ {
|
|
|
+ case 2:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_IDLE;
|
|
|
+ case 3:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_ACCEPT;
|
|
|
+ case 4:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_HOLD;
|
|
|
+ case 5:
|
|
|
+ case 15:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_READ;
|
|
|
+ case 6:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_EJECT;
|
|
|
+ case 7:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_WAIT_FETCH;
|
|
|
+ case 8:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_CAPTURE;
|
|
|
+ case 9:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_FAULT;
|
|
|
+ case 10:
|
|
|
+ case 16:
|
|
|
+ return CardIssuer_UserErrorCode_PROCESS_ISSUE;
|
|
|
+ default:
|
|
|
+ return CardIssuer_UserErrorCode_EntityInStateCannotProcess;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+CSimpleStringA CCardIssuerFSM::MaskCardno(const char* cardno)
|
|
|
+{
|
|
|
+ CSimpleStringA maskCardno = "";
|
|
|
+
|
|
|
+ if (cardno == NULL) {
|
|
|
+ maskCardno = "(null)****(null)";
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ CSimpleStringA xTestStr(cardno);
|
|
|
+ if (xTestStr.GetLength() == 0) {
|
|
|
+ maskCardno = "(null)****(null)";
|
|
|
+ }
|
|
|
+ else if (xTestStr.GetLength() > 6) {
|
|
|
+ maskCardno = CSimpleStringA::Format("%s****%s", xTestStr.SubString(0, 6).GetData(), xTestStr.SubString(xTestStr.GetLength() - 4, 4).GetData());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ maskCardno = CSimpleStringA::Format("%s****", xTestStr.GetData());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return maskCardno;
|
|
|
+}
|
|
|
+
|
|
|
+void CCardIssuerFSM::GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& ApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode)
|
|
|
+{
|
|
|
+ if (m_pCardProcess == NULL) {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetCardProcessLastErr m_pCardProcess is null");
|
|
|
+ eErrCode = Error_Null;
|
|
|
+ ApiName = "";
|
|
|
+ alarmMsg = "";
|
|
|
+ csErrMsgWithReturnCode = "";
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ErrorCodeEnum lastErrCode = Error_Succeed;
|
|
|
+ CSimpleStringA lastErrMsg = "";
|
|
|
+ CSimpleStringA lastApiName = "";
|
|
|
+ m_pCardProcess->getCardAssistLastErr(lastErrCode, lastErrMsg, lastApiName);
|
|
|
+
|
|
|
+ const CSimpleStringA alarmMsgStr = CSimpleStringA::Format("{\"Function\":\"%s\", \"DevApi\":\"%s\", \"ReturnCode\":\"%s\", \"Msg\":\"%s\", \"Context\":\"%s\"}"
|
|
|
+ , __FUNCTION__, lastApiName.GetData(), SpStrError(lastErrCode), lastErrMsg.GetData(), "");
|
|
|
+
|
|
|
+ std::map<std::string, std::string> msgInfo;
|
|
|
+ msgInfo["ReturnCode"] = SpStrError(lastErrCode);
|
|
|
+ msgInfo["ErrMsg"] = lastErrMsg.GetData();
|
|
|
+ msgInfo["Context"] = "";
|
|
|
+ std::pair<bool, std::string> strResult;
|
|
|
+ strResult = generateJsonStr(msgInfo);
|
|
|
+ CSimpleStringA csErrMsgWithReturnCodeStr = strResult.second.c_str();
|
|
|
+
|
|
|
+ eErrCode = lastErrCode;
|
|
|
+ ApiName = lastApiName;
|
|
|
+ alarmMsg = alarmMsgStr.GetData();
|
|
|
+ csErrMsgWithReturnCode = csErrMsgWithReturnCodeStr.GetData();
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::QuickSelfCheckImpl()
|
|
|
+{
|
|
|
+ //通知健康快速自检
|
|
|
+ LOG_FUNCTION();
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("快速自检开始");
|
|
|
+ int ret = 0;//失败
|
|
|
+ ErrorCodeEnum eErr = Error_Unexpect;
|
|
|
+ HealthManager::HealthManagerService_ClientBase* pClient = new HealthManager::HealthManagerService_ClientBase(GetEntityBase());
|
|
|
+ eErr = pClient->Connect();
|
|
|
+ if (eErr == Error_Succeed)
|
|
|
+ {
|
|
|
+ HealthManager::HealthManagerService_RealCheck_Req req1 = {};
|
|
|
+ HealthManager::HealthManagerService_RealCheck_Ans ans1 = {};
|
|
|
+ req1.name = "CardIssuerStand";
|
|
|
+ if (Error_Succeed == (*pClient)(EntityResource::getLink().upgradeLink())->RealCheck(req1, ans1, 10000))
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("RealCheck success");
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("RealCheck fail");
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ pClient->GetFunction()->CloseSession();
|
|
|
+ pClient->SafeDelete();
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("connect to HealthManager fail,err=%d", (int)eErr);
|
|
|
+ pClient->SafeDelete();
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int CCardIssuerFSM::PowerOffIC(int type)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+ long l_beginTime, l_endTime;
|
|
|
+ if (type == 0) {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErr = m_hDevHelper->DeactivateICCard();
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("PowerOffIC::DeactivateICCard");
|
|
|
+ }
|
|
|
+
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ eErr = m_hDevHelper->ReleaseIC();
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("PowerOffIC::ReleaseIC");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ l_beginTime = GetTickCountRVC();
|
|
|
+ ErrorCodeEnum eErr = m_hDevHelper->DeactContactlessICCard();
|
|
|
+ l_endTime = GetTickCountRVC();
|
|
|
+
|
|
|
+ if (eErr != Error_Succeed) {
|
|
|
+ SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactContactlessICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("PowerOffIC::DeactContactlessICCard");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|