Explorar el Código

!10872 ReadJS返回逻辑改为如果一路(磁道orIC),异常直接报错,如果两路(磁道+ic),默认返回成功,在返回字段给出结果;去掉已废弃,没必要的逻辑
Merge pull request !10872 from 80174847/oilyang_fixed_everything

杨诗友80174847 hace 1 mes
padre
commit
e828ddc619

+ 5 - 1
Module/mod_CardIssuerStand/CardIssuerStand.xml

@@ -289,9 +289,13 @@
 				<param name="magStatus" type="int" />
 				<!--磁道数据<json格式>	track1:磁道1	track2:磁道1	track3:磁道3 -->
 				<param name="magData" type="string"/>
+        <!--magStatus非0的情况下,可能会有RTAxxxx的说明 -->
+        <param name="magMsg" type="string"/>
 				<!--读IC结果 0成功 1失败 2未执行-->
 				<param name="icStatus" type="int"/>
-				<!--读IC成功时,所用的通讯方式 0接触 1非接;不成功,值无意义-->
+        <!--icStatus非0的情况下,可能会有RTAxxxx的说明 -->
+        <param name="icMsg" type="string"/>
+        <!--读IC成功时,所用的通讯方式 0接触 1非接;不成功,值无意义-->
 				<param name="icMode" type="int"/>
 				<!--IC读取的数据<json格式>
 					ACTION:行为代码	ATC_CODE:交易计数器code	ARQC_CODE:授权请求code

+ 217 - 376
Module/mod_CardIssuerStand/CardIssuerStandFSM.cpp

@@ -1509,27 +1509,13 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 	spConfig->WriteConfigValueInt("1", "CardPercent", m_CardPercentEx[0]);
 	spEntityFunction->OpenConfig(Config_CenterSetting, spConfigCS);
 
-	int tmpCardnoMismatch = 0, tmpICRetryTimes = 1, tmpStopUseRF = 0, tmpCheckInterval = 200;
+	int tmpCheckInterval = 200;
 
-	spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "EacQueryFlag", m_eacQueryFlag);
-	spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UseCardnoMismatch", tmpCardnoMismatch);
-	spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ICRetryTimes", tmpICRetryTimes);
-	spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "StopUseRF", tmpStopUseRF);
 	spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "CheckCardInInterval", tmpCheckInterval);
 	spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "RFVendorList", m_rfVendorList);
 	spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "SwallowCardUrl", m_csSwallowCardUrl);
 	spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "SyncMaterialUrl", m_csSyncMaterialUrl);
-	spConfigCS->ReadConfigValue("Common", "EacQueryHost", m_EacQueryHost);
 
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("EacQueryFlag:%d,EacQueryHost:%s,UseCardnoMismatch:%d,ICRetryTimes:%d,StopUseRF:%d"
-		, m_eacQueryFlag, m_EacQueryHost.GetData(), tmpCardnoMismatch, tmpICRetryTimes, tmpStopUseRF);
-
-	if (tmpCardnoMismatch == 1)
-		m_bUseCardnoMismatch = true;
-	if (tmpICRetryTimes > 0 && tmpICRetryTimes < 4)
-		m_ICRetryTimes = tmpICRetryTimes;
-	if (tmpStopUseRF == 1)
-		m_bStopUseRF = true;
 	if (tmpCheckInterval >= 100 && tmpCheckInterval <= 1000)
 		m_iCheckCardInInterval = tmpCheckInterval;
 
@@ -2379,101 +2365,75 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerStandService_Read
 	}
 	else
 	{
-		int cardTypeFromHost = 0;
-		bool bMismatch = false;
-		if (m_eacQueryFlag == 1)
-			cardTypeFromHost = JudgeCardType(m_currCardNo, bMismatch);
-		if (cardTypeFromHost > 0 && cardTypeFromHost != 2)//户口系统返回非纯磁条介质类型
+		l_beginTime = GetTickCountRVC();
+		bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
+		l_endTime = GetTickCountRVC();
+
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<ReadCard::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());
+		}
+		if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
 		{
-			ctx->Ans.ICType = cardTypeFromHost;
-			if (m_bUseCardnoMismatch && bMismatch)
+			if (bIC)
+				ctx->Ans.ICType = 1;
+			else
 			{
-				bICOK = true;
-				return 2;
+				ctx->Ans.ICType = 2;
 			}
 		}
-		else//未访问户口系统或户口系统访问失败或户口未告知介质类型(包括插反卡)
+		else
 		{
-			int icRetryTimes = 0;
-			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)("<ReadCard::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());
-			}
-			if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
+			if (bIC)
 			{
-				if (bIC)
-					ctx->Ans.ICType = 1;
-				else
-				{
-					ctx->Ans.ICType = 2;
-				}
+				bReadCardInfo = true;
+				ctx->Ans.ICType = 3;
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("maybe ic only.");
 			}
 			else
 			{
-				if (bIC)
-				{
-					bReadCardInfo = true;
-					ctx->Ans.ICType = 3;
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("maybe ic only.");
+				//既没有读到磁条,又不是IC,很大概率是插反了
+				if (m_issueStatus) {
+					LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<ReadCard>, 既没读到磁条,又没检测到IC,可能插反了,m_issueStatus=1");
 				}
-				else
+				else {
+					LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<ReadCard>, 既没读到磁条,又没检测到IC,可能插反了,m_issueStatus=0");
+				}
+				if (m_issueStatus)
 				{
-					//既没有读到磁条,又不是IC,很大概率是插反了
-					if (m_issueStatus) {
-						LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<ReadCard>, 既没读到磁条,又没检测到IC,可能插反了,m_issueStatus=1");
-					}
-					else {
-						LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<ReadCard>, 既没读到磁条,又没检测到IC,可能插反了,m_issueStatus=0");
-					}
-					if (m_issueStatus)
-					{
-						m_mixedEx[m_currentHopper - 1]++;
-						SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
-					}
+					m_mixedEx[m_currentHopper - 1]++;
+					SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
 				}
 			}
-			if (bIC)
-			{
-				l_beginTime = GetTickCountRVC();
-				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, "", "ReadCard_Contact::DeactivateICCard err");
-				}
-				else {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_Contact::DeactivateICCard");
-				}
+		}
+		if (bIC)
+		{
+			l_beginTime = GetTickCountRVC();
+			eErr = m_hDevHelper->DeactivateICCard();
+			l_endTime = GetTickCountRVC();
 
-				l_beginTime = GetTickCountRVC();
-				eErr = m_hDevHelper->ReleaseIC();
-				l_endTime = GetTickCountRVC();
+			if (eErr != Error_Succeed) {
+				SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "ReadCard_Contact::DeactivateICCard err");
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_Contact::DeactivateICCard");
+			}
 
-				if (eErr != Error_Succeed) {
-					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "ReadCard_Contact::ReleaseIC err");
-				}
-				else {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("ReadCard_Contact::ReleaseIC");
-				}
+			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, "", "ReadCard_Contact::ReleaseIC err");
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("ReadCard_Contact::ReleaseIC");
 			}
 		}
 	}
@@ -2654,78 +2614,55 @@ int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext<CardIssuerStandService_Read_Req,
 	}
 	else
 	{
-		int cardTypeFromHost = 0;
-		bool bMismatch = false;
-		if (m_eacQueryFlag == 1)
-			cardTypeFromHost = JudgeCardType(m_currCardNo, bMismatch);
-		if (cardTypeFromHost > 0)//户口系统有返回卡片类型
-		{
-			ctx->Ans.ICType = cardTypeFromHost;
-			if (m_bUseCardnoMismatch && bMismatch)
-				return 2;
+		l_beginTime = GetTickCountRVC();
+		bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, m_hDevHelper, activeCardType);
+		l_endTime = GetTickCountRVC();
+
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<ReadCard::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("RTA23C6")(csErrMsgWithReturnCode.GetData());
+			LogWarn(Severity_Middle, Error_Unexpect, 0x20300017, alarmMsg.GetData());
 		}
-		else//未访问户口系统或户口系统访问失败(包括插反卡)
+		if (!(bIC && activeCardType == 'A'))
+			bIC = false;
+		if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
 		{
-			int icRetryTimes = 0;
-			while (1)
-			{//for poor mag only card,we always retry...
-				l_beginTime = GetTickCountRVC();
-				bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, 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)("<ReadCard::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("RTA23C6")(csErrMsgWithReturnCode.GetData());
-				LogWarn(Severity_Middle, Error_Unexpect, 0x20300017, alarmMsg.GetData());
+			if (bIC)
+				ctx->Ans.ICType = 1;
+			else
+			{
+				ctx->Ans.ICType = 2;
 			}
-			if (!(bIC && activeCardType == 'A'))
-				bIC = false;
-			if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
+		}
+		else
+		{
+			if (bIC)
 			{
-				if (bIC)
-					ctx->Ans.ICType = 1;
-				else
-				{
-					ctx->Ans.ICType = 2;
-				}
+				bReadCardInfo = true;
+				ctx->Ans.ICType = 3;
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("maybe ic only.");
 			}
 			else
 			{
-				if (bIC)
-				{
-					bReadCardInfo = true;
-					ctx->Ans.ICType = 3;
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("maybe ic only.");
-				}
-				else
-				{
 
-				}
 			}
-			if (bIC)
-			{
-				l_beginTime = GetTickCountRVC();
-				eErr = m_hDevHelper->DeactContactlessICCard();
-				l_endTime = GetTickCountRVC();
-				
-				if (eErr != Error_Succeed) {
-					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "ReadCard_RF::DeactContactlessICCard err");
-				}
-				else {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_RF::DeactContactlessICCard");
-				}
+		}
+		if (bIC)
+		{
+			l_beginTime = GetTickCountRVC();
+			eErr = m_hDevHelper->DeactContactlessICCard();
+			l_endTime = GetTickCountRVC();
+
+			if (eErr != Error_Succeed) {
+				SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "ReadCard_RF::DeactContactlessICCard err");
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_RF::DeactContactlessICCard");
 			}
 		}
 	}
@@ -2775,20 +2712,9 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerStandService_Pre
 	if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
 	{
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<PreOnline>, the front BusinessData han't 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;
-		}
+		l_beginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
+		l_endTime = GetTickCountRVC();
 	}
 	else {
 		char* pAIDTmp = new char[64];
@@ -2798,20 +2724,10 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerStandService_Pre
 		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;
-		}
+		l_beginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
+		l_endTime = GetTickCountRVC();
+
 		if (pAIDTmp != NULL)
 			delete[]pAIDTmp;
 	}
@@ -3153,20 +3069,9 @@ int CCardIssuerFSM::PreOnline_RF(SpReqAnsContext<CardIssuerStandService_PreOnlin
 	if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
 	{
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<PreOnline_RF>, the front BusinessData han't 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;
-		}
+		l_beginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
+		l_endTime = GetTickCountRVC();
 	}
 	else {
 		char* pAIDTmp = new char[64];
@@ -3176,20 +3081,9 @@ int CCardIssuerFSM::PreOnline_RF(SpReqAnsContext<CardIssuerStandService_PreOnlin
 		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;
-		}
+		l_beginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
+		l_endTime = GetTickCountRVC();
 		if (pAIDTmp != NULL)
 			delete[]pAIDTmp;
 	}
@@ -4854,66 +4748,6 @@ void CCardIssuerFSM::CloseAndClearDevObj(bool bCheckConnecting, bool bCloseOnly)
 	}
 }
 
-int CCardIssuerFSM::JudgeCardType(CSimpleStringA cardno, bool& bMismatch)
-{
-	if (cardno.GetLength() < 8)
-		return 0;
-	int cardType = 0;
-	IHttpFunc* client;
-	client = create_http(HttpsLogCallBack);
-	CQueryCardTypeReq qCardTypeReq;
-	CQueryCardTypeRet qCardTypeRet;
-	//qCardTypeReq.m_printDbg = true;//oiltest
-	qCardTypeReq.m_timeOut = 3;//3 second
-
-	qCardTypeReq.m_url = m_EacQueryHost.GetData();
-	//qCardTypeReq.m_url = "http://55.13.170.50:8080/defa-gateway/dee1/EacQuery/queryByEac";
-	qCardTypeReq.HEAD.xHdrLen = 203;
-	qCardTypeReq.HEAD.xIsuCnl = "X86";
-	qCardTypeReq.HEAD.xRtnCod = "SUC0000";
-	qCardTypeReq.BODY.x1.xCltNbr = "";
-	qCardTypeReq.BODY.x1.xEacNbr = cardno.GetData();
-	qCardTypeReq.BODY.x1.xIacNbr = "";
-	long beg = GetTickCountRVC();
-	PROCESS_LINK_CONTEXT("LR0402203CardType")
-	bool ret = client->Post(qCardTypeReq, qCardTypeRet, &nextLink);
-	long end = GetTickCountRVC();
-	if (ret)
-	{
-		bool bParse = qCardTypeRet.Parse(qCardTypeRet.m_resultData.c_str());
-		if (bParse)
-		{
-			if (qCardTypeRet.BODY.z1.zPsbMdm.compare("C") == 0)
-				cardType = 2;
-			else if (qCardTypeRet.BODY.z1.zPsbMdm.compare("I") == 0)
-				cardType = 3;
-			else if (qCardTypeRet.BODY.z1.zPsbMdm.compare("M") == 0)
-				cardType = 1;
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("Query card type from host is:%s,zPsbSeq:%s"
-				, qCardTypeRet.BODY.z1.zPsbMdm.c_str(), qCardTypeRet.BODY.z1.zPsbSeq.c_str()));
-			int eacLen = qCardTypeRet.BODY.z1.zEacNbr.length();
-			if (eacLen > 7 && cardno.Compare(qCardTypeRet.BODY.z1.zEacNbr.c_str()) != 0)
-			{
-				bMismatch = true;
-				LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Account_EAC_Mismatch,
-					CSimpleStringA::Format("cardno:%s****%s EAC:%s****%s", cardno.SubString(0,6).GetData(), cardno.SubString(cardno.GetLength()-4, 4).GetData()
-						, qCardTypeRet.BODY.z1.zEacNbr.substr(0, 6).c_str(), qCardTypeRet.BODY.z1.zEacNbr.substr(eacLen - 4, 4).c_str()));
-			}
-		}
-		else
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("Query card type return false:%s",qCardTypeRet.HEAD.xRtnCod.c_str()));//也没必要知道什么错 oilyang@20220829 在功能可用之前,还是有必要的
-	}
-	else {
-	}
-	client->Destory();
-	//oiltest for stupid http component!!!
-	//if (cardno.IsStartWith("622580") || cardno.IsStartWith("622588") || cardno.IsStartWith("622609")
-	//	|| cardno.IsStartWith("410062"))
-	//	return 3;
-	return cardType;
-}
-
-
 void CCardIssuerFSM::HttpsLogCallBack(const char* logtxt) {
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", logtxt);
 }
@@ -4965,9 +4799,6 @@ bool CCardIssuerFSM::ToRegistCaptureCardInfo()
 }
 void CCardIssuerFSM::CheckSupportRf()
 {
-	if (m_bStopUseRF)
-		m_bSupportRF = false;
-
 	//加入szmodel非接字段属性判断
 	if (m_csRF.Compare("Y") == 0) {
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("szModel,RF=%s", m_csRF.GetData());
@@ -5495,11 +5326,19 @@ void CCardIssuerFSM::ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req,
 		//oiltmp what's this???
 		if (m_issueStatus)
 			SetDevState(DEVICE_STATUS_NORMAL);//设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时
+		if (m_bSingleMagOrIC)
+			ctx->Answer(Error_Succeed);
 	}
 	else {
-		SetErrorAndLog(eMagReadErr, MEC_DEVAPI_CARDISSUER_MagRead, "DevAdapter::MagRead", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "", "ReadMag::MagRead fail");
-		ctx->Ans.magStatus = 1;
-		ctx->Ans.magData = "";
+		DWORD dwCode = SetErrorAndLog(eMagReadErr, MEC_DEVAPI_CARDISSUER_MagRead, "DevAdapter::MagRead", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "", "ReadMag::MagRead fail");
+		if (m_bSingleMagOrIC)
+			ctx->Answer(Error_Unexpect, dwCode);
+		else
+		{
+			ctx->Ans.magStatus = 1;
+			ctx->Ans.magData = "";
+			ctx->Ans.magMsg = GetErrMsgByCode(dwCode);
+		}
 	}
 	return;
 }
@@ -5508,6 +5347,7 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 {
 	LOG_FUNCTION();
 	ctx->Ans.icStatus = 1;
+	ctx->Ans.icMode = 0;
 	m_ullBeginTime = GetTickCountRVC();
 	ErrorCodeEnum eErr = m_hDevHelper->MoveCard(CI_MOVECARD_IC_POSITION);
 	m_ullEndTime = GetTickCountRVC();
@@ -5516,11 +5356,15 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 	}
 	else {
 		DWORD dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220340");
+		ctx->Ans.icMsg = GetErrMsgByCode(dwTmpUserErrCode);
 		if (bContinue)
 			return -1;
 		else
 		{
-			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+			if (m_bSingleMagOrIC)
+				ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+			else
+				ctx->Answer(Error_Succeed);
 			return -1;
 		}
 	}
@@ -5537,20 +5381,9 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 	if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
 	{
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, the front BusinessData have not provide aid data.");
-		int icRetryTimes = 0;
-		while (1)
-		{
-			m_ullBeginTime = GetTickCountRVC();
-			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
-			m_ullEndTime = GetTickCountRVC();
-			if (retDetectAndRead == -1)//only retry for active ic card failed!
-				icRetryTimes++;
-			else
-				break;
-			Sleep(500);
-			if (icRetryTimes >= m_ICRetryTimes)
-				break;
-		}
+		m_ullBeginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
+		m_ullEndTime = GetTickCountRVC();
 	}
 	else {
 		char* pAIDTmp = new char[64];
@@ -5560,20 +5393,10 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 		CAutoArray<CSimpleString> preAIDs;
 		preAIDs.Init(1);
 		preAIDs[0] = (CSimpleStringA)pAIDTmp;
-		int icRetryTimes = 0;
-		while (1)
-		{
-			m_ullBeginTime = GetTickCountRVC();
-			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
-			m_ullEndTime = GetTickCountRVC();
-			if (retDetectAndRead == -1)//only retry for active ic card failed!
-				icRetryTimes++;
-			else
-				break;
-			Sleep(500);
-			if (icRetryTimes >= m_ICRetryTimes)
-				break;
-		}
+
+		m_ullBeginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
+		m_ullEndTime = GetTickCountRVC();
 		if (pAIDTmp != NULL)
 			delete[]pAIDTmp;
 	}
@@ -5589,7 +5412,7 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 
 		if (bContinue) {
 			if (retDetectAndRead == -1) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败 bContinue");
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败 to continue");
 				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
 
 				if (m_issueStatus) {
@@ -5600,7 +5423,7 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 				}
 			}
 			else if (retDetectAndRead == -2) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败 bContinue");
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败 to continue");
 				if (m_issueStatus) {
 					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "读取IC数据失败");
 				}
@@ -5609,7 +5432,7 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 				}
 			}
 			else if (retDetectAndRead == -3) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败 bContinue");
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败 to continue");
 				if (m_issueStatus) {
 					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "retDetectAndRead = -3");
 				}
@@ -5619,6 +5442,7 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 			}
 		}
 		else {
+			DWORD dwTmpUserErrCode = 0;
 			if (retDetectAndRead == -1) {
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败");
 				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
@@ -5632,11 +5456,14 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
 						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, alarmMsg.GetData());
 					}
-					//oilyang@20250822 if read mag successfully, we should return magData
-					if (ctx->Ans.magStatus != 0)
+					if (m_bSingleMagOrIC)
 						ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
 					else
+					{
+						//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+						ctx->Ans.icMsg = GetErrMsgByCode(CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
 						ctx->Answer(Error_Succeed);
+					}
 				}
 				else {
 					if (IsInBusiness()) {
@@ -5647,27 +5474,32 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
 						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, alarmMsg.GetData());
 					}
-					//oilyang@20250822 if read mag successfully, we should return magData
-					if (ctx->Ans.magStatus != 0)
-						ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed);
+					if (m_bSingleMagOrIC)
+						ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
 					else
+					{
+						//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+						ctx->Ans.icMsg = GetErrMsgByCode(CardIssuer_UserErrorCode_ActiveICCard_Failed);
 						ctx->Answer(Error_Succeed);
+					}
 				}
 			}
 			else if (retDetectAndRead == -2) {
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败");
-				DWORD dwTmpUserErrCode = 0;
 				if (m_issueStatus) {
 					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220320", "读取IC数据失败");
 				}
 				else {
 					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220303", "读取IC数据失败");
 				}
-				//oilyang@20250822 if read mag successfully, we should return magData
-				if (ctx->Ans.magStatus != 0)
-					ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+				if (m_bSingleMagOrIC)
+					ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
 				else
+				{
+					//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+					ctx->Ans.icMsg = GetErrMsgByCode(dwTmpUserErrCode);
 					ctx->Answer(Error_Succeed);
+				}
 			}
 			else if (retDetectAndRead == -3) {
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
@@ -5678,11 +5510,14 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 				else {
 					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220303", "retDetectAndRead =-3");
 				}
-				//oilyang@20250822 if read mag successfully, we should return magData
-				if (ctx->Ans.magStatus != 0)
-					ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+				if (m_bSingleMagOrIC)
+					ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
 				else
+				{
+					//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+					ctx->Ans.icMsg = GetErrMsgByCode(dwTmpUserErrCode);
 					ctx->Answer(Error_Succeed);
+				}
 			}
 		}
 		return -1;
@@ -5707,7 +5542,6 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 		break;
 	}
 	ctx->Ans.pbocData = taaResult;
-	ctx->Ans.icMode = 0;
 	return 0;
 }
 
@@ -5715,6 +5549,7 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 {
 	LOG_FUNCTION();
 	ctx->Ans.icStatus = 1;
+	ctx->Ans.icMode = 1;
 	m_ullBeginTime = GetTickCountRVC();
 	ErrorCodeEnum eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
 	m_ullEndTime = GetTickCountRVC();
@@ -5723,11 +5558,15 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 	}
 	else {
 		DWORD dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220340");
+		ctx->Ans.icMsg = GetErrMsgByCode(dwTmpUserErrCode);
 		if (bContinue)
 			return -1;
 		else
 		{
-			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+			if (m_bSingleMagOrIC)
+				ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+			else
+				ctx->Answer(Error_Succeed);
 			return -1;
 		}
 	}
@@ -5743,20 +5582,9 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 	if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
 	{
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, the front BusinessData have not provide aid data.");
-		int icRetryTimes = 0;
-		while (1)
-		{
-			m_ullBeginTime = GetTickCountRVC();
-			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
-			m_ullEndTime = GetTickCountRVC();
-			if (retDetectAndRead == -1)//only retry for active ic card failed!
-				icRetryTimes++;
-			else
-				break;
-			Sleep(500);
-			if (icRetryTimes >= m_ICRetryTimes)
-				break;
-		}
+		m_ullBeginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
+		m_ullEndTime = GetTickCountRVC();
 	}
 	else {
 		char* pAIDTmp = new char[64];
@@ -5766,20 +5594,9 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 		CAutoArray<CSimpleString> preAIDs;
 		preAIDs.Init(1);
 		preAIDs[0] = (CSimpleStringA)pAIDTmp;
-		int icRetryTimes = 0;
-		while (1)
-		{
-			m_ullBeginTime = GetTickCountRVC();
-			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
-			m_ullEndTime = GetTickCountRVC();
-			if (retDetectAndRead == -1)//only retry for active ic card failed!
-				icRetryTimes++;
-			else
-				break;
-			Sleep(500);
-			if (icRetryTimes >= m_ICRetryTimes)
-				break;
-		}
+		m_ullBeginTime = GetTickCountRVC();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
+		m_ullEndTime = GetTickCountRVC();
 		if (pAIDTmp != NULL)
 			delete[]pAIDTmp;
 	}
@@ -5792,11 +5609,11 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 		CSimpleStringA ApiName = "";
 		CSimpleStringA alarmMsg = "";
 		CSimpleStringA csErrMsgWithReturnCode = "";
-
+		DWORD dwTmpUserErrCode = 0;
 		if (bContinue)
 		{
 			if (retDetectAndRead == -1) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败(非接)bContinue");
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败(非接)to continue");
 				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
 
 				if (m_issueStatus) {
@@ -5808,24 +5625,22 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 			}
 			else if (retDetectAndRead == -2) {
 
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败 bContinue");
-				DWORD dwTmpUserErrCode = 0;
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败 to continue");
 				if (m_issueStatus) {
-					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "读取IC数据失败");
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "读取IC数据失败");
 				}
 				else {
-					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220303", "读取IC数据失败");
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220303", "读取IC数据失败");
 				}
 			}
 			else if (retDetectAndRead == -3) {
 
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败 bContinue");
-				DWORD dwTmpUserErrCode = 0;
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败 to continue");
 				if (m_issueStatus) {
-					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "retDetectAndRead=-3");
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "retDetectAndRead=-3");
 				}
 				else {
-					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220303", "retDetectAndRead=-3");
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220303", "retDetectAndRead=-3");
 				}
 			}
 		}
@@ -5845,11 +5660,14 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220320").setResultCode("RTA2327")(csErrMsgWithReturnCode.GetData());
 						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, alarmMsg.GetData());
 					}
-					//oilyang@20250822 if read mag successfully, we should return magData
-					if (ctx->Ans.magStatus != 0)
+					if (m_bSingleMagOrIC)
 						ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed);
 					else
+					{
+						//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+						ctx->Ans.icMsg = GetErrMsgByCode(CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed);
 						ctx->Answer(Error_Succeed);
+					}
 				}
 				else {
 					if (IsInBusiness())
@@ -5862,44 +5680,51 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220303").setResultCode("RTA2326")(csErrMsgWithReturnCode.GetData());
 						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
 					}
-					//oilyang@20250822 if read mag successfully, we should return magData
-					if (ctx->Ans.magStatus != 0)
+					if (m_bSingleMagOrIC)
 						ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed);
 					else
+					{
+						//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+						ctx->Ans.icMsg = GetErrMsgByCode(CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed);
 						ctx->Answer(Error_Succeed);
+					}
 				}
 			}
 			else if (retDetectAndRead == -2) {
 
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败");
-				DWORD dwTmpUserErrCode = 0;
 				if (m_issueStatus) {
 					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220320", "读取IC数据失败");
 				}
 				else {
 					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220303", "读取IC数据失败");
 				}
-				//oilyang@20250822 if read mag successfully, we should return magData
-				if (ctx->Ans.magStatus != 0)
+				if (m_bSingleMagOrIC)
 					ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
 				else
+				{
+					//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+					ctx->Ans.icMsg = GetErrMsgByCode(dwTmpUserErrCode);
 					ctx->Answer(Error_Succeed);
+				}
 			}
 			else if (retDetectAndRead == -3) {
 
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
-				DWORD dwTmpUserErrCode = 0;
 				if (m_issueStatus) {
 					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220320", "retDetectAndRead=-3");
 				}
 				else {
 					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220303", "retDetectAndRead=-3");
 				}
-				//oilyang@20250822 if read mag successfully, we should return magData
-				if (ctx->Ans.magStatus != 0)
+				if (m_bSingleMagOrIC)
 					ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
 				else
+				{
+					//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+					ctx->Ans.icMsg = GetErrMsgByCode(dwTmpUserErrCode);
 					ctx->Answer(Error_Succeed);
+				}
 			}
 		}
 		return -1;//上电读卡失败
@@ -5924,7 +5749,6 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 		break;
 	}
 	ctx->Ans.pbocData = taaResult;
-	ctx->Ans.icMode = 1;
 	LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_ReadByRF, CSimpleStringA::Format("PreOnline_RF ok.iIssue:%d ", m_issueStatus));
 
 	return 0;
@@ -6113,14 +5937,17 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 	ctx->Ans.magStatus = 2;
 	ctx->Ans.icStatus = 2;
 	ctx->Ans.icMode = -1;
+	ctx->Ans.magMsg = "";
+	ctx->Ans.icMsg = "";
 	switch (ctx->Req.mode)
 	{
 	case ReadMode_MagOnly:
+		m_bSingleMagOrIC = true;
 		ReadMag(ctx);
-		ctx->Answer(Error_Succeed);
 		break;
 	case ReadMode_ICOnly_ContactICFirst:
 	{
+		m_bSingleMagOrIC = true;
 		//read via contact, if failed and support RF,to read via RF
 		int ret = PreOnlineJS_ReadViaContact(ctx, m_bSupportRF);
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ret:%d, m_bSupportRF:%d", ret, m_bSupportRF);
@@ -6132,6 +5959,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 		break;
 	case ReadMode_ICOnly_RFFirst:
 	{
+		m_bSingleMagOrIC = true;
 		//if support RF, read via RF, if failed then read via contact
 		int ret = -1;
 		if (m_bSupportRF)
@@ -6144,6 +5972,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 		break;
 	case ReadMode_ICOnly_RFOnly:
 	{
+		m_bSingleMagOrIC = true;
 		if (m_bSupportRF)
 		{
 			if (PreOnlineJS_ReadViaRF(ctx, false) == 0)
@@ -6155,6 +5984,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 		break;
 	case ReadMode_MagIC_ContactICFirst:
 	{
+		m_bSingleMagOrIC = false;
 		//first read mag, then read via contact, if failed and support RF,to read via RF
 		ReadMag(ctx);
 		int ret = PreOnlineJS_ReadViaContact(ctx, m_bSupportRF);
@@ -6167,6 +5997,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 		break;
 	case ReadMode_MagIC_RFFirst:
 	{
+		m_bSingleMagOrIC = false;
 		//first read mag, if support RF, read via RF, if failed then read via contact
 		int ret = -1;
 		ReadMag(ctx);
@@ -6180,6 +6011,7 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 		break;
 	case ReadMode_MagIC_RFOnly:
 	{
+		m_bSingleMagOrIC = false;
 		int ret = -1;
 		ReadMag(ctx);
 		if (m_bSupportRF)
@@ -6188,7 +6020,10 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, Ca
 				PreOnlineJS_ICDataProcess(ctx);
 		}
 		else
+		{
+			ctx->Ans.icMsg = GetErrMsgByCode(CardIssuer_UserErrorCode_NotSupportRF);
 			ctx->Answer(Error_Succeed);
+		}
 	}
 		break;
 	default:
@@ -6520,4 +6355,10 @@ void CCardIssuerFSM::FSMEventDefaultProcess(FSMEvent* pEvt, DWORD dwUserCode)
 		break;
 	}
 	return;
+}
+CSimpleStringA CCardIssuerFSM::GetErrMsgByCode(DWORD dwCode)
+{
+	CSimpleStringA tmpRTA(true), tmpDesc(true);
+	GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA);
+	return CSimpleStringA::Format("[%s]%s", tmpRTA.GetData(), tmpDesc.GetData());
 }

+ 7 - 189
Module/mod_CardIssuerStand/CardIssuerStandFSM.h

@@ -311,185 +311,6 @@ public:
 
 #pragma endregion JS接口 event
 
-
-typedef struct EacQueryByEac_X1 {
-	string xEacNbr;
-	string xCltNbr;
-	string xIacNbr;
-} EacQueryByEac_X1;
-
-typedef struct CQueryCardTypeReq : CHTTPReq {
-	struct HEAD {
-		int xHdrLen;
-		string xIsuCnl;
-		string xRtnCod;
-	}HEAD;
-	struct BODY {
-		EacQueryByEac_X1 x1;
-	}BODY;
-	int X1Count;
-	CQueryCardTypeReq() {
-		X1Count = 1;
-	}
-	string ToJson() {
-		Json::Value allElm,x1Arr;
-		allElm[REFLECTION(HEAD)][REFLECTION(xHdrLen)] = HEAD.xHdrLen;
-		allElm[REFLECTION(HEAD)][REFLECTION(xIsuCnl)] = HEAD.xIsuCnl;
-		allElm[REFLECTION(HEAD)][REFLECTION(xRtnCod)] = HEAD.xRtnCod;
-
-		for (int i = 0; i < X1Count; i++) {
-			Json::Value x1Elm;
-			Json::FastWriter fwX1Elm;//写入对象
-			x1Elm[REFLECTION(xEacNbr)] = BODY.x1.xEacNbr.c_str();
-			x1Elm[REFLECTION(xCltNbr)] = BODY.x1.xCltNbr.c_str();
-			x1Elm[REFLECTION(xIacNbr)] = BODY.x1.xIacNbr.c_str();
-			//string x1JsonStr = fwX1Elm.write(x1Elm);
-			x1Arr[i] = x1Elm;
-		}
-		allElm[REFLECTION(BODY)][REFLECTION(EacQueryByEac_X1)] = x1Arr;
-
-		Json::FastWriter writer;
-		string ret = writer.write(allElm);
-
-
-		return ret;
-	}
-} CQueryCardTypeReq;
-typedef struct EacQueryByEac_Z1 {
-	string zEacNbr;
-	string zEacSts;
-	string zEacTyp;
-	string zEacNam;
-	string zEacNik;
-	string zEacCod;
-	string zCltNbr;
-	string zIacNbr;
-	string zKeySeq;
-	string zFndClt;
-	string zFndIac;
-	string zFndCpb;
-	string zFndAtp;
-	string zFpnClt;
-	string zFpnIac;
-	string zCtfCnr;
-	string zCtfTyp;
-	string zPsbTag;
-	string zPsbFac;
-	string zPsbNbr;
-	string zPsbCod;
-	string zPsbSeq;
-	string zPsbMdm;
-	string zCvcCod;
-	string zCvcCd2;
-	string zCvcIcd;
-	string zMapBus;
-	string zMapCnl;
-	string zMapDpn;
-	string zMapPwd;
-	string zMapAut;
-	string zWrmFlg;
-	string zBlsFlg;
-	string zNamFlg;
-	string zActFlg;
-	string zSlpFlg;
-	string zFkcFlg;
-	string zSnmFlg;
-	string zWrfAll;
-	string zWrfNdk;
-	string zWrfZft;
-	string zWrfDsk;
-	string zPayLck;
-	string zQryTag;
-	string zFncTag;
-	string zWdwTag;
-	string zPayTag;
-	string zTmpTag;
-	string zExtTag;
-	string zCtfTag;
-	string zMskTag;
-	string zStfFlg;
-	string zSlaFlg;
-	string zBatFlg;
-	string zAgtFlg;
-	string zAmgTag;
-	string zCurTag;
-	string zImgIdt;
-	string zGrpFlg;
-	string zOpnDat;
-	string zOpnUsr;
-	string zOpnChk;
-	string zOpnAut;
-	string zActDat;
-	string zClsDat;
-	string zClsUsr;
-	string zClsChk;
-	string zClsAut;
-	string zDatEft;
-	string zDatExp;
-	string zBbkNbr;
-	string zBrnNbr;
-	string zBrnMng;
-	string zCtyCod;
-}EacQueryByEac_Z1;
-typedef struct CQueryCardTypeRet : CHTTPRet {
-	struct HEAD {
-		string xTypCod;
-		string xHdrLen;
-		string xSysCod;
-		string xDskSys;
-		string xWkeCod;
-		string xKeyVal;
-		string xIsuCnl;
-		string xEncCod;
-		string xDalCod;
-		string xCmmTyp;
-		string xOrgIsu;
-		string xPreIsu;
-		string xEntUsr;
-		string xUsrPwd;
-		string xIsuDat;
-		string xIsuTim;
-		string xMacCod;
-		string xRtnLvl;
-		string xRtnCod;
-		string xDevNbr;
-		string xTlrNbr;
-		string xRqsNbr;
-		string xCmmRsv;
-		string xDocSiz;
-		string xItvTms;
-		string xMsgFlg;
-		string xAppRsv;
-	}HEAD;
-	struct BODY {
-		EacQueryByEac_Z1 z1;
-	}BODY;
-	int Z1Count;
-	CQueryCardTypeRet() : Z1Count(1) {
-	}
-	bool Parse(string strData) {
-		Json::Value root,tmpZ1;
-		Json::Reader reader;
-		Json::Value::UInt index;
-		if (!reader.parse(strData, root, false))
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("reader.parse false");
-			return false;
-		}
-		index = 0;
-		HEAD.xRtnCod = root["HEAD"][REFLECTION(xRtnCod)].asCString();
-		if (HEAD.xRtnCod.compare("SUC0000") == 0)
-		{
-			tmpZ1 = root["BODY"][REFLECTION(EacQueryByEac_Z1)];
-			BODY.z1.zPsbMdm = tmpZ1[index][REFLECTION(zPsbMdm)].asCString();
-			BODY.z1.zEacNbr = tmpZ1[index][REFLECTION(zEacNbr)].asCString();
-			BODY.z1.zPsbSeq = tmpZ1[index][REFLECTION(zPsbSeq)].asCString();
-			return true;
-		}
-		else
-			return false;
-	}
-} CQueryCardTypeRet;
 typedef struct CRegistSwallowCardReq : CHTTPReq {
 	string cardNo;
 	string cardType;
@@ -744,9 +565,8 @@ public:
 		, m_bCardIssued(false), m_issueStatus(1), m_currCardNo("")
 		, m_captureReason(""), m_machineType(1), m_currentHopper(1), m_hopperNum(1)
 		, m_bSettingMaterial(false), m_addCardSerial("")
-		, m_bCancelByRFIC(false), m_devOpenFailedCount(0)
-		, m_EacQueryHost(""), m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
-		, m_bCardFromHopper(true), m_bStopUseRF(false), m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("")
+		, m_bCancelByRFIC(false), m_devOpenFailedCount(0), m_bSingleMagOrIC(false)
+		, m_bCardFromHopper(true), m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("")
 		, m_bCancelInsert(false), m_iCheckCardInInterval(200), m_bMainPageWhileWorking(false)
 	{
 		HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
@@ -872,8 +692,6 @@ public:
 	void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false);
 
 	static void HttpsLogCallBack(const char* logtxt);
-	//0:unknow(havn't access microservice or access failed),1:both mag & ic ,2:mag only,3:ic only
-	int JudgeCardType(CSimpleStringA cardno, bool& bMismatch);
 	void QueryCIStatus(SpReqAnsContext<CardIssuerStandService_QueryCIStatus_Req, CardIssuerStandService_QueryCIStatus_Ans>::Pointer ctx);
 	bool RegistCardWhileCaptureCard(CSimpleStringA cardno);
 	bool SyncMaterialCount(IHttpFunc* client, SyncMaterialCountInfo syncInfo);
@@ -888,8 +706,8 @@ private:
 	lpCMBdecodeEx cmdDecodeEx;
 	bool m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore, m_bExit
 		, m_bCDA, m_bCardIssued, m_bHasHopper[HOPPER_NUM]
-		, m_bSettingMaterial, m_bCancelByRFIC
-		, m_bCardActiveNotify, m_bCardFromHopper, m_bUseCardnoMismatch, m_bStopUseRF, m_bMainPageWhileWorking/*Accepting、Read(JS)ing、Issue(JS)ing*/;
+		, m_bSettingMaterial, m_bCancelByRFIC, m_bSingleMagOrIC
+		, m_bCardActiveNotify, m_bCardFromHopper, m_bMainPageWhileWorking/*Accepting、Read(JS)ing、Issue(JS)ing*/;
 	bool m_bSupportRF, m_bUseRFTillNext;//if ReadCard by RF,the following PreOnline & PostOnline always use RF till the next card(insert/issue)
 	ErrorCodeEnum m_testResult;
 
@@ -898,8 +716,7 @@ private:
 	//1:default, 2:SCI, 3:no cfg
 	int m_machineType;
 	int m_currentHopper, m_devOpenFailedCount;
-	int m_maxSlot, m_findCard, m_cardPos, m_maxRetainCount, m_eacQueryFlag/*accout query*/
-		, m_ICRetryTimes, m_iCheckCardInInterval;
+	int m_maxSlot, m_findCard, m_cardPos, m_maxRetainCount, m_iCheckCardInInterval;
 	CSimpleStringA m_CardBoxNoEx[HOPPER_NUM], m_PsbCodeEx[HOPPER_NUM], m_PsbNameEx[HOPPER_NUM], m_MaintainerEx[HOPPER_NUM], m_csMaintainTimeEx[HOPPER_NUM];
 	int m_CardInitEx[HOPPER_NUM], m_CardPercentEx[HOPPER_NUM], m_remainsEx[HOPPER_NUM], m_issuedEx[HOPPER_NUM], m_mixedEx[HOPPER_NUM], m_hopperNum;
 	DWORD m_MaintainTimeEx[HOPPER_NUM];
@@ -922,7 +739,7 @@ private:
 	DevCategoryInfo m_devCat;
 	bool ToRegistCaptureCardInfo();
 	void CheckSupportRf();
-	CSimpleStringA m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
+	CSimpleStringA m_csSwallowCardUrl, m_csSyncMaterialUrl;
 	MagTracks m_magTracks;
 public:
 	int EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx);
@@ -967,6 +784,7 @@ private:
 	ULLINT m_ullBeginTime, m_ullEndTime;
 	BYTE m_btCID/*9f27*/;
 	void FSMEventDefaultProcess(FSMEvent* pEvt, DWORD dwUserCode);
+	CSimpleStringA GetErrMsgByCode(DWORD dwCode);
 };
 
 class ReadJSEvent : public FSMEvent

+ 3 - 1
Module/mod_CardIssuerStand/CardIssuerStand_def_g.h

@@ -646,7 +646,9 @@ struct CardIssuerStandService_ReadJS_Ans
 {
 	int magStatus;
 	CSimpleStringA magData;
+	CSimpleStringA magMsg;
 	int icStatus;
+	CSimpleStringA icMsg;
 	int icMode;
 	CSimpleStringA pbocData;
 	CAutoArray<int> reserved1;
@@ -654,7 +656,7 @@ struct CardIssuerStandService_ReadJS_Ans
 
 	void Serialize(SpBuffer &Buf)
 	{
-		auto & buf = Buf & magStatus & magData & icStatus & icMode & pbocData & reserved1 & reserved2;
+		auto & buf = Buf & magStatus & magData & magMsg & icStatus & icMsg & icMode & pbocData & reserved1 & reserved2;
 	}
 
 };