Преглед изворни кода

Z991239-6441 #comment feat:调整ReadJS的返回字段,统一为json格式

oilyang пре 1 месец
родитељ
комит
a80912a3cc

+ 14 - 32
Module/mod_CardIssuerStand/CardIssuerStand.xml

@@ -287,7 +287,7 @@
 		<!--9、读卡失败,读取IC数据失败(非接) errorCode为Error_Unexpect(2147483646),rtaCode为RTA23C9-->
 		<twoway name="ReadJS" overlap="true" method_id="40" jsflag="true">
 			<req>
-        <!--读取模式:1 读磁、2 接触IC优先、3 非接IC优先、4 非接IC、5 读磁+接触IC优先、6 读磁+非接IC优先、7 读磁+非接IC-->
+        <!--读取模式:1 读磁、2 读芯,接触优先、3 读芯,非接优先、4 读芯,只走非接、5 读磁读芯,接触优先、6 读磁读芯非接优先、7 读磁读芯,只走非接-->
         <param name="mode" type="int" />
         <!--Aid列表-->
 				<param name="aid" type="string"/>
@@ -299,40 +299,22 @@
 			<res>
 				<!--读磁条结果 0成功 1失败 2未执行-->
 				<param name="magStatus" type="int" />
-				<!--磁道1数据-->
-				<param name="track1" type="string"/>
-				<!--磁道2数据-->
-				<param name="track2" type="string"/>
-				<!--磁道3数据-->
-				<param name="track3" type="string"/>
-				<!--磁道1数据长度-->
-				<param name="track1Size" type="int"/>
-				<!--磁道2数据长度-->
-				<param name="track2Size" type="int"/>
-				<!--磁道3数据长度-->
-				<param name="track3Size" type="int"/>
-				<!--磁道1数据状态 0成功 1无效-->
-				<param name="track1Status" type="int"/>
-				<!--磁道2数据状态 0成功 1无效-->
-				<param name="track2Status" type="int"/>
-				<!--磁道3数据状态 0成功 1无效-->
-				<param name="track3Status" type="int"/>
-				<!--读IC结果 0成功 1失败-->
-				<param name="icState" type="int"/>
-				<!--读IC成功下接触方式 0接触 1非接 2未执行-->
+        <!--磁道数据<json格式>
+					track1:磁道1
+          track2:磁道1
+          track3:磁道3
+				-->
+				<param name="magData" type="string"/>
+				<!--读IC结果 0成功 1失败 2未执行-->
+				<param name="icStatus" type="int"/>
+				<!--读IC成功下接触方式 0接触 1非接-->
 				<param name="icMode" type="int"/>
 				<!--IC读取的数据<json格式>
-					ACTION:行为代码
-					ATC_CODE:交易计数器code
-					ARQC_CODE:授权请求code
-					MAC:安全报文鉴别码
-					ARQC_SIZE:授权请求长度
-					ARQC_DATA:授权请求数据
-					T2TRACK2_DATA:磁道2数据
-					EXPIRE_DATE:卡片失效日期
-					IC_TAGS:基础IC数据
+					ACTION:行为代码					ATC_CODE:交易计数器code					ARQC_CODE:授权请求code
+					MAC:安全报文鉴别码					ARQC_SIZE:授权请求长度					ARQC_DATA:授权请求数据
+					IC_TRACK2:等效二磁道2数据(Tag:57)				EXPIRE_DATE:卡片中的应用失效日期(Tag:5F24)					IC_TAGS:基础IC数据
 				-->
-				<param name="result" type="string"/>
+				<param name="pbocData" type="string"/>
 				<param name="reserved1" type="array_int"/>
 				<param name="reserved2" type="array_string"/>
 			</res>

+ 67 - 299
Module/mod_CardIssuerStand/CardIssuerStandFSM.cpp

@@ -191,6 +191,7 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
 	case USER_EVT_EXIT:
 	case EVT_MAINPAGE_DISPLAY:
 	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive event of enter to main page");
 		m_captureReason = "4001";
 		m_bExit = true;
 		pEvt->SetHandled();
@@ -455,12 +456,13 @@ unsigned int CCardIssuerFSM::s3_on_event(FSMEvent* pEvt)
 		}
 		break;
 	case EVT_MAINPAGE_DISPLAY:
-		{
-			m_captureReason = "4001";
-			m_bExit = true;
-			pEvt->SetHandled();
-			ret = 0;
-		}
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive event of enter to main page");
+		m_captureReason = "4001";
+		m_bExit = true;
+		pEvt->SetHandled();
+		ret = 0;
+	}
 		break;
 	default:
 		FSMEventDefaultProcess(pEvt, CardIssuer_UserErrorCode_PROCESS_ACCEPT);
@@ -1116,8 +1118,11 @@ void CCardIssuerFSM::s9_on_entry()
 	LOG_FUNCTION();
 	m_currentFSMState = 9;
 	SetDevState(DEVICE_STATUS_FAULT);
-	QueryCardPosTask* pTask = new QueryCardPosTask(this);
-	ErrorCodeEnum err = GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+	if (GetDevInitFlag())
+	{
+		QueryCardPosTask* pTask = new QueryCardPosTask(this);
+		ErrorCodeEnum err = GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+	}
 }
 void CCardIssuerFSM::s9_on_exit()
 {
@@ -1233,7 +1238,7 @@ unsigned int CCardIssuerFSM::s11_on_event(FSMEvent* pEvt)
 	break;
 	case EVT_MAINPAGE_DISPLAY:
 	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S15 receive exit to main page");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive event of enter to main page");
 		pEvt->SetHandled();
 		m_captureReason = "4001";
 		m_bReturnMainPage = true;
@@ -1284,7 +1289,7 @@ unsigned int CCardIssuerFSM::s12_on_event(FSMEvent* pEvt)
 	break;
 	case EVT_MAINPAGE_DISPLAY:
 	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S16 receive exit to main page");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive event of enter to main page");
 		pEvt->SetHandled();
 		m_captureReason = "4001";
 		m_bReturnMainPage = true;
@@ -1578,7 +1583,6 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		if (eErrDev == Error_Succeed)
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpenEx").setCostTime(l_endTime - l_beginTime)("OpenDevice::DevOpenEx succ, port:%d, baudRate:%d, openType:%d, connectType:%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(),btOpenType, m_connectType);
-			SetDevInitFlag(true);
 			m_devOpenFailedCount = 0;
 			ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
 			ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType));
@@ -1718,7 +1722,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		if (m_issueStatusFromFile == 0)
 			m_bCardFromHopper = false;
 
-		ret = UnAcceptCard();
+		ret = CheckIfHasCardOnOpenOrMainPage();
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ret: %d, isIssue: %d, m_hasCardWhileDevOpen:%d, m_issueStatusFromFile:%d",
 			ret, isIssue, m_hasCardWhileDevOpen, m_issueStatusFromFile);
 
@@ -1750,7 +1754,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 					m_maxRetainCount = 3;
 				if (cis.eRetainBin == CI_RETAINBIN_FULL)
 				{
-					LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_RETAIN_BIN_IS_FULL_SENSOR, "(sensor)retain bin is full!回收箱满了,请及时清理!");
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA23B8")("sensor say:retain bin is full!回收箱满了,请及时清理!");
 				}
 			}
 			LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Open_Success, "读卡器打开成功");
@@ -1758,7 +1762,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		}
 		else
 		{
-			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Open_Failed, "启动后检查卡机状态失败");
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Open_Failed, "启动后检查是否有卡或处理吞卡失败");
 			return Error_Unexpect;
 		}
 	}
@@ -1774,11 +1778,13 @@ int CCardIssuerFSM::Initial()
 		CloseAndClearDevObj(false);
 		SetDevInitFlag(false);
 	}
+	else
+		SetDevInitFlag(true);
 	m_bOpening = false;
 	return errCode;
 }
 
-int CCardIssuerFSM::UnAcceptCard()
+int CCardIssuerFSM::CheckIfHasCardOnOpenOrMainPage()
 {
 	LOG_FUNCTION();
 	ErrorCodeEnum eErr;
@@ -1804,7 +1810,7 @@ int CCardIssuerFSM::UnAcceptCard()
 			else
 				m_captureReason = "0000";
 			//oilyang@20230313 根据卡片异常处理沟通会议(业务、深圳开发),实体启动发现有卡,一律吞卡
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z01").setResultCode("RTA23A1")("读卡器打开时,卡机有卡片,吞卡");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z01").setResultCode("RTA23A1")("非业务状态时卡机有卡片,吞卡");
 			errMsg = CSimpleStringA::Format("读卡器有卡(吞卡):%d, CardNoLength:%d, CardNo:%s****%s",
 				m_issueStatus, m_currCardNo.GetLength(), preFixNo.GetData(), suffixNo.GetData());
 			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_EntityOnStart, errMsg.GetData());
@@ -2079,13 +2085,6 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerStandService_Issue_Req,
 	//LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_MoveCard_FromHopper, "MoveCard from hopper suc.");
 	m_issuedEx[m_currentHopper - 1]++;
 	m_remainsEx[m_currentHopper - 1]--;
-	//oilyang@20180809 增加对单卡槽多卡槽机器的使用及闲置的适配
-	if ((!m_bHasHopper[0] || m_CardPercentEx[0] == 0 || m_CardInitEx[0] == 0 || (100 * m_remainsEx[0] < m_CardPercentEx[0] * m_CardInitEx[0]))
-		&& (!m_bHasHopper[1] || m_CardPercentEx[1] == 0 || m_CardInitEx[1] == 0 || (100 * m_remainsEx[1] < m_CardPercentEx[1] * m_CardInitEx[1]))
-		&& (!m_bHasHopper[2] || m_CardPercentEx[2] == 0 || m_CardInitEx[2] == 0 || (100 * m_remainsEx[2] < m_CardPercentEx[2] * m_CardInitEx[2])))
-	{
-		LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_FEW_CARD_REMAINS, "Few card remains.");
-	}
 	m_bSettingMaterial = true;//oilyang 借用于延迟同步,紧接着设置remains时更新到后台数据库
 	if (!SetCardIssued(m_issuedEx[m_currentHopper - 1], m_currentHopper))
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IssueCard, Set card issued failed.");
@@ -2281,17 +2280,16 @@ int CCardIssuerFSM::InternalAcceptCard()
 					err = 3;
 					goto Err;
 				}
-				//hr = m_pIDCard->IDC_Accept(IDC_ALL_CARD,&lpCardData);
 				if (!m_bCancelAccept && !bHasSetCardInType) {
 					l_beginTime = GetTickCountRVC();
 					eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_ALL);
 					l_endTime = GetTickCountRVC();
-					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalAcceptCard::SetCardInType CI_CARD_IN_TYPE_ALL");
-
 				}
 				if (Error_Succeed != eErr) {
 					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("InternalAcceptCard::SetCardInType CI_CARD_IN_TYPE_ALL err");
-					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "InternalAcceptCard::SetCardInType CI_CARD_IN_TYPE_ALL err");
+					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "", "InternalAcceptCard::SetCardInType CI_CARD_IN_TYPE_ALL err");
+					err = 1;
+					goto Err;
 
 				}
 				else {
@@ -3884,8 +3882,7 @@ int CCardIssuerFSM::WriteCard(SpReqAnsContext<CardIssuerStandService_WriteTrack_
 }
 void CCardIssuerFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
 {
-	//for simple
-	pTransactionContext->SendAnswer(m_testResult);
+	OnHardwareShakeHand(pTransactionContext);
 }
 
 bool CCardIssuerFSM::FSMSetIssueFlag(int value)
@@ -4321,39 +4318,6 @@ void CCardIssuerFSM::SetHopperNum(int hopperNum)
 	m_hopperNum = hopperNum;
 }
 
-void CCardIssuerFSM::DoExitWhenIdle()
-{
-	ErrorCodeEnum eErr;
-	CSimpleStringA errMsg(true);
-	long l_beginTime, l_endTime;
-	l_beginTime = GetTickCountRVC();
-	eErr = m_hDevHelper->GetDevStatus(m_devStatus);
-	l_endTime = GetTickCountRVC();
-
-	if (eErr == Error_Succeed)
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("DoExitWhenIdle::GetDevStatus");
-		if (m_devStatus.eMedia == CI_MEDIA_PRESENT || m_devStatus.eMedia == CI_MEDIA_ENTERING)
-		{
-			JustReadCardNo();
-			m_captureReason = "4001";
-			errMsg = CSimpleStringA::Format("DoExitWhenIdle, has card in machine, to capture card, CardNo:%s****%s",
-					m_currCardNo.SubString(0, 6).GetData(), m_currCardNo.SubString(m_currCardNo.GetLength()-4, 4).GetData());
-			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_IdleExit, errMsg.GetData());
-
-			eErr = MachineMoveCardBackNotHold();
-			if (eErr == Error_Succeed)
-			{
-				bool bCaptured = ToRegistCaptureCardInfo();
-				m_CardCaptured++;
-				bool bSetCapture = SetCardCaptured(m_CardCaptured);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("DoExitWhenIdle, to capture card. result:%d, m_CardCaptured:%d, bSetCapture:%d",
-						bCaptured, m_CardCaptured, bSetCapture));
-			}
-		}
-	}
-}
-
 bool CCardIssuerFSM::JustReadCardNo()
 {
 	ErrorCodeEnum eErr = Error_Unexpect;
@@ -4477,11 +4441,10 @@ bool CCardIssuerFSM::JustReadCardNo()
 		}
 	}
 	if (m_currCardNo.GetLength() > 8)
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("JustReadCardNo, record the account (%d):%s****%s", m_currCardNo.GetLength(),
-				m_currCardNo.SubString(0, 6).GetData(), m_currCardNo.SubString(m_currCardNo.GetLength() - 4, 4).GetData()));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("JustReadCardNo, record the account (%d):%s", m_currCardNo.GetLength(),
+			SP::Module::Util::DataMask(SP::Module::Util::DataMask_CardAccount, m_currCardNo).GetData()));
 	else{
 		CSimpleStringA errMsg = CSimpleStringA::Format("JustReadCardNo, AccountNo maybe wrong:%s(len:%d)", m_currCardNo.GetData(), m_currCardNo.GetLength());
-		LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardNo_Maybe_Wrong, errMsg.GetData());
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(errMsg.GetData());
 	}
 	return true;
@@ -5867,234 +5830,38 @@ void CCardIssuerFSM::ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req,
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MagRead").setCostTime(m_ullEndTime - m_ullBeginTime)("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);
 		ctx->Ans.magStatus = 0;
-		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;
+		//json格式返回
+		std::map<std::string, std::string> magInfo;
+		if (magTracks.track[0].eStatus == CI_DATA_OK)
+			magInfo["track1"] = (char*)magTracks.track[0].data;
+		else
+			magInfo["track1"] = "";
+		if (magTracks.track[1].eStatus == CI_DATA_OK)
+			magInfo["track2"] = (char*)magTracks.track[1].data;
+		else
+			magInfo["track2"] = "";
+		if (magTracks.track[2].eStatus == CI_DATA_OK)
+			magInfo["track3"] = (char*)magTracks.track[2].data;
+		else
+			magInfo["track3"] = "";
+
+
+		std::pair<bool, std::string> strResult;
+		strResult = generateJsonStr(magInfo);
+		ctx->Ans.magData = strResult.second.c_str();
+
+		//oiltmp what's this???
 		if (m_issueStatus)
 			SetDevState(DEVICE_STATUS_NORMAL);//设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时
 	}
 	else {
 		SetErrorAndLog(eMagReadErr, MEC_DEVAPI_CARDISSUER_MagRead, "DevAdapter::MagRead", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "", "ReadMag::MagRead fail");
 		ctx->Ans.magStatus = 1;
-		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;
+		ctx->Ans.magData = "";
 	}
 	return;
 }
 
-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_DEBUG, 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_DEBUG, LOG_TYPE_SYSTEM)("<CheckCardType>, begin query host to check cardType");
-			cardTypeFromHost = JudgeCardType(cardNo, bMismatch);//0:失败 1:复合 2:磁条 3:ic
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<CheckCardType>, cardTypeFromHost=%d", cardTypeFromHost);
-		}
-		if (cardTypeFromHost > 0 && cardTypeFromHost != 2)//户口系统返回非纯磁条介质类型
-		{
-			ICtype = cardTypeFromHost;
-			//卡号不同则直接返回报错
-			if (m_bUseCardnoMismatch && bMismatch)
-			{
-				return 1;//账户和户口系统的最新账户不匹配
-			}
-		}
-		else {
-			DbgWithLink(LOG_LEVEL_DEBUG, 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...
-				l_beginTime = GetTickCountRVC();
-				bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
-				l_endTime = GetTickCountRVC();
-				if (!bIC)
-					icRetryTimes++;
-				else
-					break;
-				Sleep(500);
-				if (icRetryTimes >= m_ICRetryTimes)
-					break;
-			}
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard>, bIC:%d", bIC);
-			if (!bIC) {
-				ErrorCodeEnum eErrCode = Error_Unexpect;
-				CSimpleStringA ApiName = "";
-				CSimpleStringA alarmMsg = "";
-				CSimpleStringA csErrMsgWithReturnCode = "";
-				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setResultCode("RTA23CT")(csErrMsgWithReturnCode.GetData());
-				LogWarn(Severity_Middle, Error_Unexpect, 0x2030000a, alarmMsg.GetData());
-			}
-
-			//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_DEBUG, LOG_TYPE_SYSTEM)("CheckCardType::DeactivateICCard err");
-					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "CheckCardType::DeactivateICCard err");
-				}
-				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_DEBUG, LOG_TYPE_SYSTEM)("CheckCardType::ReleaseIC err");
-					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "CheckCardType::ReleaseIC err");
-				}
-				else {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("CheckCardType::ReleaseIC");
-				}
-			}
-			else {
-				//判断是否支持非接
-				if (!m_bSupportRF) {
-					m_bUseRFTillNext = false;//无非接
-					if (bReadMag) {
-						ICtype = 2;
-					}
-					else {
-						ICtype = 0;
-						//既没有读到磁条,又不是IC,很大概率是插反了
-						LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<CheckCardType>, 既没读到磁条,又没检测到IC,可能插反了");
-					}
-				}
-				else {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, begin useRF detect cardType");
-					m_bUseRFTillNext = true;//使用非接
-
-					l_beginTime = GetTickCountRVC();
-					eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
-					l_endTime = GetTickCountRVC();
-
-					if (eErr != Error_Succeed)
-					{
-						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CheckCardType::MoveCard err");
-						SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "CheckCardType::MoveCard err");
-					}
-					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...
-						l_beginTime = GetTickCountRVC();
-						bICRF = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, m_hDevHelper, activeCardType);
-						l_endTime = GetTickCountRVC();
-						if (!bICRF)
-							icRetryTimes++;
-						else
-							break;
-						Sleep(500);
-						if (icRetryTimes >= m_ICRetryTimes)
-							break;
-					}
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard_RF>, bIC:%d", bICRF);
-					if (!bICRF) {
-						ErrorCodeEnum eErrCode = Error_Unexpect;
-						CSimpleStringA ApiName = "";
-						CSimpleStringA alarmMsg = "";
-						CSimpleStringA csErrMsgWithReturnCode = "";
-						GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setResultCode("RTA23C6")(csErrMsgWithReturnCode.GetData());
-						LogWarn(Severity_Middle, Error_Unexpect, 0x20300017, alarmMsg.GetData());
-					}
-
-					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_DEBUG, LOG_TYPE_SYSTEM)("CheckCardType::DeactContactlessICCard err");
-							SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactContactlessICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "CheckCardType::DeactContactlessICCard err");
-						}
-						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());
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(cardType.GetData());
-	return 0;
-}
-
 int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool bContinue)
 {
 	//oiltmp TODO? need to judge if need movecard to the position?
@@ -6267,7 +6034,7 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 	default:
 		break;
 	}
-	ctx->Ans.result = taaResult;
+	ctx->Ans.pbocData = taaResult;
 	return 0;
 }
 
@@ -6465,21 +6232,21 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 	default:
 		break;
 	}
-	ctx->Ans.result = taaResult;
+	ctx->Ans.pbocData = taaResult;
 	return 0;
 }
 int CCardIssuerFSM::PreOnlineJS_ICDataProcess(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	if (ctx->Ans.result.GetLength() == 0)
+	if (ctx->Ans.pbocData.GetLength() == 0)
 	{
-		ctx->Ans.icState = 0;
+		ctx->Ans.icStatus = 0;
 		ctx->Answer(Error_Succeed);
 		return 0;
 	}
 
 	string tmpResult, actionType, result = "", baseICData = "";
-	tmpResult = ctx->Ans.result;
+	tmpResult = ctx->Ans.pbocData;
 	char* pSomeICData = new char[ONE_K];
 	ZeroMemory(pSomeICData, ONE_K);
 	int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6, 4).c_str(), m_pDataToARQC, pSomeICData);
@@ -6614,7 +6381,7 @@ int CCardIssuerFSM::PreOnlineJS_ICDataProcess(SpReqAnsContext<CardIssuerStandSer
 	msgInfo["ARQC_SIZE"] = arqcLenStr.GetData();
 	CSimpleStringA arqcData = m_pDataToARQC;
 	msgInfo["ARQC_DATA"] = arqcData.GetData();
-	msgInfo["T2TRACK2_DATA"] = t2ICTrack2;
+	msgInfo["IC_TRACK2"] = t2ICTrack2;
 	msgInfo["EXPIRE_DATE"] = csExpireDate;
 	msgInfo["IC_TAGS"] = baseICData.c_str();
 
@@ -6643,8 +6410,8 @@ int CCardIssuerFSM::PreOnlineJS_ICDataProcess(SpReqAnsContext<CardIssuerStandSer
 		m_pDataToARQC = NULL;
 	}
 
-	ctx->Ans.result = result.c_str();
-	ctx->Ans.icState = 0;
+	ctx->Ans.pbocData = result.c_str();
+	ctx->Ans.icStatus = 0;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220306")();
 	ctx->Answer(Error_Succeed);
 	return 0;
@@ -6660,7 +6427,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 		ReadMag(ctx);
 		ctx->Answer(Error_Succeed);
 		break;
-	case ReadMode_ContactICFirst:
+	case ReadMode_ICOnly_ContactICFirst:
 	{
 		//read via contact, if failed and support RF,to read via RF
 		int ret = PreOnlineJS_ReadViaContact(ctx, m_bSupportRF);
@@ -6671,7 +6438,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 			PreOnlineJS_ICDataProcess(ctx);
 	}
 		break;
-	case ReadMode_ContactlessICFirst:
+	case ReadMode_ICOnly_RFFirst:
 	{
 		//if support RF, read via RF, if failed then read via contact
 		int ret = -1;
@@ -6683,7 +6450,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 			PreOnlineJS_ICDataProcess(ctx);
 	}
 		break;
-	case ReadMode_ContactlessICOnly:
+	case ReadMode_ICOnly_RFOnly:
 	{
 		if (m_bSupportRF)
 		{
@@ -6694,7 +6461,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 			ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_NotSupportRF);
 	}
 		break;
-	case ReadMode_Mag_ContactICFirst:
+	case ReadMode_MagIC_ContactICFirst:
 	{
 		//first read mag, then read via contact, if failed and support RF,to read via RF
 		ReadMag(ctx);
@@ -6706,7 +6473,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 			PreOnlineJS_ICDataProcess(ctx);
 	}
 		break;
-	case ReadMode_Mag_ContactlessICFirst:
+	case ReadMode_MagIC_RFFirst:
 	{
 		//first read mag, if support RF, read via RF, if failed then read via contact
 		int ret = -1;
@@ -6719,7 +6486,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 			PreOnlineJS_ICDataProcess(ctx);
 	}
 		break;
-	case ReadMode_Mag_ContactlessICOnly:
+	case ReadMode_MagIC_RFOnly:
 	{
 		int ret = -1;
 		ReadMag(ctx);
@@ -6846,8 +6613,9 @@ int CCardIssuerFSM::InternalInsert()
 							bHasSetCardInType = true;
 						}
 						else {
-							DbgWithLink(LOG_LEVEL_DEBUG, 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, "", "InternalInsert::SetCardInType CI_CARD_IN_TYPE_ALL err");
+							SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "", "InternalInsert::SetCardInType CI_CARD_IN_TYPE_ALL err");
+							errRet = 1;
+							break;
 						}
 					}	
 				}

+ 8 - 10
Module/mod_CardIssuerStand/CardIssuerStandFSM.h

@@ -91,12 +91,12 @@ enum ReadMode
 { 
 	//<!--读取模式:1 读磁、2 接触IC优先、3 非接IC优先、4 非接IC、5 读磁+接触IC优先、6 读磁+非接IC优先、7 读磁+非接IC-->
 	ReadMode_MagOnly = 1,
-	ReadMode_ContactICFirst = 2,
-	ReadMode_ContactlessICFirst = 3,
-	ReadMode_ContactlessICOnly = 4,
-	ReadMode_Mag_ContactICFirst = 5,
-	ReadMode_Mag_ContactlessICFirst = 6,
-	ReadMode_Mag_ContactlessICOnly = 7,
+	ReadMode_ICOnly_ContactICFirst = 2,
+	ReadMode_ICOnly_RFFirst = 3,
+	ReadMode_ICOnly_RFOnly = 4,
+	ReadMode_MagIC_ContactICFirst = 5,
+	ReadMode_MagIC_RFFirst = 6,
+	ReadMode_MagIC_RFOnly = 7,
 };
 
 typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
@@ -819,7 +819,7 @@ public:
 	ErrorCodeEnum OpenDevice(BYTE btOpenType, const char *pDevSN);
 	int Initial();
 	bool GetDevStatus(bool bPrint=true);
-	int UnAcceptCard();
+	int CheckIfHasCardOnOpenOrMainPage();
 	int CaptureCard(SpReqAnsContext<CardIssuerStandService_Capture_Req,CardIssuerStandService_Capture_Ans>::Pointer ctx);
 	int EjectCard(SpReqAnsContext<CardIssuerStandService_Eject_Req,CardIssuerStandService_Eject_Ans>::Pointer ctx);
 	int WaitFetchingCard();
@@ -867,7 +867,6 @@ public:
 	int UpdateLocalRunCfg(CAutoArray<int> hopperArr);
 	int SyncDataToDB(bool bMaintain[12],bool bSetCaptured=true);//同步物料计数
 	void SetHopperNum(int hopperNum);
-	void DoExitWhenIdle();
 	int SAMICCommand(SpReqAnsContext<CardIssuerStandService_SAMICCommand_Req, CardIssuerStandService_SAMICCommand_Ans>::Pointer ctx);
 
 	bool WriteCardInfo(CSmartPointer<IConfigInfo> &cfgRun, const char *acc, const char* serial, int slot, bool bClear = false, bool bHasCard = false);
@@ -964,7 +963,6 @@ public:
 	int PostOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx);
 
 	void ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
-	int CheckCardType(CSimpleStringA cardNo, bool bReadMag, int& ICtype);
 	int PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool bContinue);
 	int PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool bContinue);
 	int PreOnlineJS_ICDataProcess(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
@@ -1139,7 +1137,7 @@ struct DoExitWhenIdleTask : public ITaskSp
 	DoExitWhenIdleTask(CCardIssuerFSM* f) : fsm(f) {}
 	void Process()
 	{
-		fsm->DoExitWhenIdle();
+		fsm->CheckIfHasCardOnOpenOrMainPage();
 		fsm->SetDoExitFlag(false);
 	}
 };

+ 4 - 12
Module/mod_CardIssuerStand/CardIssuerStand_def_g.h

@@ -679,24 +679,16 @@ struct CardIssuerStandService_ReadJS_Req
 struct CardIssuerStandService_ReadJS_Ans
 {
 	int magStatus;
-	CSimpleStringA track1;
-	CSimpleStringA track2;
-	CSimpleStringA track3;
-	int track1Size;
-	int track2Size;
-	int track3Size;
-	int track1Status;
-	int track2Status;
-	int track3Status;
-	int icState;
+	CSimpleStringA magData;
+	int icStatus;
 	int icMode;
-	CSimpleStringA result;
+	CSimpleStringA pbocData;
 	CAutoArray<int> reserved1;
 	CAutoArray<CSimpleStringA> reserved2;
 
 	void Serialize(SpBuffer &Buf)
 	{
-		auto & buf = Buf & magStatus & track1 & track2 & track3 & track1Size & track2Size & track3Size & track1Status & track2Status & track3Status & icState & icMode & result & reserved1 & reserved2;
+		auto & buf = Buf & magStatus & magData & icStatus & icMode & pbocData & reserved1 & reserved2;
 	}
 
 };

+ 0 - 1
Module/mod_CardIssuerStand/mod_cardissuerStand.h

@@ -103,7 +103,6 @@ public:
 		LOG_FUNCTION();
 		if(!m_fsm.GetDevInitFlag()){
 			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
-			LogWarn(Severity_Middle, Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed, "Insert but DevOpen failed.");
 		}else{
 			m_bNewSessionInit = false;
 			m_fsm.SetExitFlag(false);