瀏覽代碼

!10890 修改读卡异常的处理逻辑(含卡机公共库)
Merge pull request !10890 from 80174847/oilyang_fixed_everything

杨诗友80174847 3 月之前
父節點
當前提交
c14f6a0b9b

+ 29 - 148
DevAdapter/include/CardAssist.cpp

@@ -372,9 +372,8 @@ void CCardProcess::DataInit()
 	//m_bCDA = false;
 
 }
-bool CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, int &cardType, bool bIssue)
+int CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, int &cardType, bool bIssue)
 {
-	//DbgInfo("<DetectIfICCard>, to detect card type.");
 	long l_beginTime, l_endTime;
 	cardType = 0;
 	ErrorCodeEnum eErr;
@@ -386,22 +385,13 @@ bool CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, i
 		eErr = pCardI->ContactIC();
 		l_endTime = GetTickCount();
 
-		if(eErr != Error_Succeed){
-			QueryLastErr(eType, errMsg);
-			setCardAssistLastErr(eErr,errMsg,"DevAdapter::ContactIC");
-			errMsg = CSimpleStringA::Format("DetectIfICCard::ContactIC failed(%s):%s", SpStrError(eErr), errMsg.GetData());
-			//if (eType == CARD_MACHINE_ISSUER) {
-			//	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ContactIC").setCostTime(l_endTime - l_beginTime).setResultCode("RTA23C7")("DetectIfICCard::ContactIC err=%s", SpStrError(eErr));
-			//	LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ContactIC_Failed, errMsg.GetData());
-			//}
-			//else {
-			//	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ContactIC").setCostTime(l_endTime - l_beginTime).setResultCode("RTA2WC7")("DetectIfICCard::ContactIC err=%s", SpStrError(eErr));
-			//	LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_ContactIC_Failed, errMsg.GetData());
-			//}
+		if(eErr != Error_Succeed)
+		{
+			pCardI->ReleaseIC();
+			return -1;
 		}
-		else {
+		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ContactIC").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ContactIC");
-		}
 
 		l_beginTime = GetTickCount();
 		eErr = pCardI->ActiveICCard();
@@ -409,30 +399,9 @@ bool CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, i
 
 		if (eErr != Error_Succeed)
 		{
-			QueryLastErr(eType, errMsg);
-			setCardAssistLastErr(eErr,errMsg,"DevAdapter::ActiveICCard");
-			errMsg = CSimpleStringA::Format("DetectIfICCard::ActiveICCard failed(%s):%s", SpStrError(eErr), errMsg.GetData());
-			//if (eType == CARD_MACHINE_ISSUER) {
-			//	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveICCard").setCostTime(l_endTime - l_beginTime).setResultCode("RTA23CT")("DetectIfICCard::ActiveICCard err=%s", SpStrError(eErr));
-			//	if (bIssue) {
-			//		LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, errMsg.GetData());
-			//	}
-			//	else {
-			//		LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, errMsg.GetData());
-			//	}
-			//}
-			//else {
-			//	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveICCard").setCostTime(l_endTime - l_beginTime).setResultCode("RTA2WCT")("DetectIfICCard::ActiveICCard err=%s", SpStrError(eErr));
-			//	if (bIssue) {
-			//		LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_IssueCard_ActiveICCard_Failed, errMsg.GetData());
-			//	}
-			//	else {
-			//		LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_ActiveICCard_Failed, errMsg.GetData());
-			//	}
-			//}
 			pCardI->DeactivateICCard();
 			pCardI->ReleaseIC();
-			return false;
+			return -2;
 		}
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveICCard").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ActiveICCard");
@@ -447,17 +416,9 @@ bool CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, i
 		l_endTime = GetTickCount();
 
 		if (eErr != Error_Succeed)
-		{
-			//DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DetectIfICCard::ActiveContactlessICCard err=%s", SpStrError(eErr));
-			//QueryLastErr(eType, errMsg);
-			//setCardAssistLastErr(eErr,errMsg, "DevAdapter::ActiveContactlessICCard");
-			//errMsg = CSimpleStringA::Format("DetectIfICCard::ActiveContactlessICCard failed(%s):%s", SpStrError(eErr), errMsg.GetData());
-			//LogWarn(Severity_Middle, Error_Unexpect, ContactlessCard_UserErrorCode_ActiveContactlessICCard_Failed, errMsg.GetData());
-			return false;
-		}
-		else {
+			return -3;
+		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ActiveContactlessICCard,Detect contactless card type %d", ch);
-		}
 		cardType = ch;
 		
 	}
@@ -470,27 +431,14 @@ bool CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, i
 		l_endTime = GetTickCount();
 		
 		if (eErr != Error_Succeed)
-		{
-			QueryLastErr(eType, errMsg);
-			setCardAssistLastErr(eErr,errMsg,"DevAdapter::ActiveContactlessICCard");
-			errMsg = CSimpleStringA::Format("DetectIfICCard::ActiveContactlessICCard failed(%s):%s", SpStrError(eErr), errMsg.GetData());
-			//if (eType == CARD_MACHINE_ISSUER_RF) {
-			//	LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, errMsg.GetData());
-			//	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime).setResultCode("RTA23C6")("DetectIfICCard::ActiveContactlessICCard err=%s", SpStrError(eErr));
-			//}
-			//else {
-			//	LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_ActiveContactlessICCard_Failed, errMsg.GetData());
-			//	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime).setResultCode("RTA2WC6")("DetectIfICCard::ActiveContactlessICCard err=%s", SpStrError(eErr));
-			//}
-			return false; 
-		}
+			return -3; 
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ActiveContactlessICCard,Detect contactless card type %d", ch);
 		}
 		cardType = ch;
 		
 	}
-	return true;
+	return 0;
 }
 ErrorCodeEnum CCardProcess::BuildSupportedAppList(CardReadType eType,DeviceBaseClass *pCardX,vector<AIDData>& vAIDFromTerm)
 {
@@ -509,7 +457,7 @@ ErrorCodeEnum CCardProcess::BuildSupportedAppList(CardReadType eType,DeviceBaseC
 	char *pse1 = "1PAY.SYS.DDF01";
 	char *pse2 = "2PAY.SYS.DDF01";//oiltmp 20160107 should change to "2PAY.SYS.DDF01"
 	
-	if (eType == CARD_MACHINE_ISSUER || eType == CARD_MACHINE_ISSUER_STORE || eType == CARD_MACHINE_SWIPER)
+	if (eType == CARD_MACHINE_ISSUER || eType == CARD_MACHINE_ISSUER_STORE)
 	{
 		tmpPse1 = strlen(pse1);
 		pData = new BYTE[tmpPse1+1];
@@ -517,7 +465,7 @@ ErrorCodeEnum CCardProcess::BuildSupportedAppList(CardReadType eType,DeviceBaseC
 		memcpy(pData, pse1, tmpPse1);
 		ConstructAPDU(cls, ins, p1, p2, tmpPse1, pData, &le);
 	}
-	else if (eType == CARD_MACHINE_RFIC || eType == CARD_MACHINE_SWIPER_RF || eType == CARD_MACHINE_ISSUER_RF || eType == CARD_MACHINE_ISSUER_STORE_RF)
+	else if (eType == CARD_MACHINE_RFIC || eType == CARD_MACHINE_ISSUER_RF || eType == CARD_MACHINE_ISSUER_STORE_RF)
 	{
 		tmpPse2 = strlen(pse2);
 		pData = new BYTE[tmpPse2+1];
@@ -1212,34 +1160,8 @@ ErrorCodeEnum CCardProcess::AppSelected(CardReadType eType,DeviceBaseClass *pCar
 					}
 				}
 			}
-			else{
-
-				if (eType == CARD_MACHINE_ISSUER)
-				{
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AppSelected::ICCommand err=%s", SpStrError(eErr));
-				}
-				else if (eType == CARD_MACHINE_ISSUER_STORE)
-				{
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AppSelected::ICCommand err=%s", SpStrError(eErr));
-				}
-				else if (eType == CARD_MACHINE_ISSUER_RF)
-				{
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AppSelected::RFTypeABCommand err=%s", SpStrError(eErr));
-				}
-				else if (eType == CARD_MACHINE_ISSUER_STORE_RF)
-				{
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AppSelected::RFTypeABCommand err=%s", SpStrError(eErr));
-				}
-				else if (eType == CARD_MACHINE_RFIC)
-				{
-					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::RFTypeABCommand").setCostTime(l_endTime - l_beginTime).setResultCode("RTA2J02")("AppSelected::RFTypeABCommand err=%s", SpStrError(eErr));
-				}
-
-				QueryLastErr(eType, errMsg);
-				errMsg = CSimpleStringA::Format("AppSelected::ICCommand 2 failed(%d):%s", eErr, errMsg.GetData());
-				LogWarn(Severity_Middle, Error_Unexpect, errICCommand, errMsg.GetData());
+			else
 				return Error_Interact;
-			}
 		}
 		else {
 			switch(eType)
@@ -1266,32 +1188,7 @@ ErrorCodeEnum CCardProcess::AppSelected(CardReadType eType,DeviceBaseClass *pCar
 		}
 	}
 	else
-	{
-		if (eType == CARD_MACHINE_ISSUER)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("BuildSupportedAppList::ICCommand err=%s", SpStrError(eErr));
-		}
-		else if (eType == CARD_MACHINE_ISSUER_STORE)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("BuildSupportedAppList::ICCommand err=%s", SpStrError(eErr));
-		}
-		else if (eType == CARD_MACHINE_ISSUER_RF)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("BuildSupportedAppList::RFTypeABCommand err=%s", SpStrError(eErr));
-		}
-		else if (eType == CARD_MACHINE_ISSUER_STORE_RF)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("BuildSupportedAppList::RFTypeABCommand err=%s", SpStrError(eErr));
-		}
-		else if (eType == CARD_MACHINE_RFIC)
-		{
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::RFTypeABCommand").setCostTime(l_endTime - l_beginTime).setResultCode("RTA2J02")("BuildSupportedAppList::RFTypeABCommand err=%s", SpStrError(eErr));
-		}
-		QueryLastErr(eType, errMsg);
-		errMsg = CSimpleStringA::Format("AppSelected::ICCommand failed(%d):%s", eErr, errMsg.GetData());
-		LogWarn(Severity_Middle, Error_Unexpect, errICCommand, errMsg.GetData());
 		return Error_Interact;
-	}
 	return Error_Succeed;
 }
 ErrorCodeEnum CCardProcess::ReadData(CardReadType eType,DeviceBaseClass *pCardX,LPBYTE data,DWORD len)
@@ -2680,40 +2577,26 @@ int CCardProcess::SplitOnlineReplyData(const char *pData,int size)
 int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCardX, CAutoArray<CSimpleStringA>pAIDs, int &cardType, bool bIssue)
 {
 	LOG_FUNCTION();
-	bool bIC = DetectIfICCard(eType,pCardX,cardType,bIssue);
-	if (!bIC)
-	{
-		DbgWarn("<DetectIfICCard>, not ic card.");
-		return -1;
-	}
-	else {
-		//兼容发卡非接上电有的厂商非IC卡也返回成功,直接返回上电失败
-		if (eType == CARD_MACHINE_ISSUER_RF || eType == CARD_MACHINE_ISSUER_STORE_RF) {
-			if ( bIssue && cardType != 'A' && cardType != 'B' && cardType != 'M') {
-				CSimpleStringA errMsg = CSimpleStringA::Format("{\"ErrCode\":2147483646,\"Description\":\"<DetectIfICCard>, not ic card,cardType=%d\"}", cardType);
-				setCardAssistLastErr(Error_Exception, errMsg.GetData(), "DevAdapter::ActiveContactlessICCard");
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<DetectIfICCard>, not ic card.");
-				return -1;
-			}
-		}
-	}
-	int bGetICData = -3;
+	int retDetect = DetectIfICCard(eType,pCardX,cardType,bIssue);
+	if (retDetect != 0)
+		return retDetect;
 
-	bGetICData = GetICDataFromCard(eType,pCardX,pAIDs);
+	bool bGetICData = GetICDataFromCard(eType,pCardX,pAIDs);
 
-	if (bGetICData != 0)
+	if (!bGetICData)
 	{
-		CSimpleStringA errMsg = CSimpleStringA::Format("GetICDataFromCard failed(%d)", bGetICData);
-		DbgWarn(errMsg.GetData());
-		return bGetICData;
+		if (eType == CARD_MACHINE_ISSUER || eType == CARD_MACHINE_ISSUER_STORE)
+			return -4;
+		else if (eType == CARD_MACHINE_RFIC || eType == CARD_MACHINE_ISSUER_RF || eType == CARD_MACHINE_ISSUER_STORE_RF)
+			return -5;
 	}
 
-	GetBaseInfoNotInRecord(eType,pCardX);
+	GetBaseInfoNotInRecord(eType,pCardX);//oiltmp ???
 
 	return 0;
 }
 
-int CCardProcess::GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX, CAutoArray<CSimpleStringA> pAIDs)
+bool CCardProcess::GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX, CAutoArray<CSimpleStringA> pAIDs)
 {
 	LOG_FUNCTION();
 	CSimpleStringA errMsg(true);
@@ -2763,25 +2646,23 @@ int CCardProcess::GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX,
 			QueryLastErr(eType, errMsg);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("BuildSupportedAppList failed(%d):%s.", eErr, errMsg.GetData());
 			if(eErr == Error_Interact)
-				return -2;
+				return false;
 			else
 				continue;
 		}
 		//Dbg("[%s]",testIC);
 		eErr = AppSelected(eType,pCardX,vAIDs.at(0).aid,vAIDs.at(0).len);
 		if (eErr == Error_Succeed)
-			return 0;
+			return true;
 		else
 		{
-			QueryLastErr(eType, errMsg);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("AppSelected failed(%d):%s.", eErr, errMsg.GetData());
 			if(eErr == Error_Interact)
-				return -2;
+				return false;
 			else
 				continue;
 		}
 	}
-	return -3;
+	return false;
 }
 
 int CCardProcess::ConstructARQCData(const char *pATC, char *&pDataToARQC, char *&pSomeICData)

+ 16 - 5
DevAdapter/include/CardAssist.h

@@ -15,9 +15,7 @@ using namespace std;
 enum CardReadType
 {
 	CARD_MACHINE_ISSUER = 0,
-	CARD_MACHINE_SWIPER,
 	CARD_MACHINE_RFIC,
-	CARD_MACHINE_SWIPER_RF,
 	CARD_MACHINE_ISSUER_RF,
 	CARD_MACHINE_ISSUER_STORE,
 	CARD_MACHINE_ISSUER_STORE_RF
@@ -65,8 +63,21 @@ public:
 	}
 	~CCardProcess();
 	void DataInit();
-	bool DetectIfICCard(CardReadType eType, DeviceBaseClass* pCardX, int& cardType, bool bIssue = false);//cardType:0x41'A',type A; 0x42'B',type B; 0x4d'M',type M
-	int GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX,CAutoArray<CSimpleStringA> pAIDs);
+	//0: success
+	//-1ŁşContactIC failed
+	//-2ŁşActiveICCard failed
+	//-3ŁşActiveContactlessICCard failed
+	int DetectIfICCard(CardReadType eType, DeviceBaseClass* pCardX, int& cardType, bool bIssue = false);//cardType:0x41'A',type A; 0x42'B',type B; 0x4d'M',type M
+	
+	//0: success
+	//-1ŁşContactIC failed
+	//-2ŁşActiveICCard failed
+	//-3ŁşActiveContactlessICCard failed
+	//-4ŁşICCommand failed
+	//-5ŁşRFTypeABCommand failed
+	int DetectAndReadICData(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA>pAIDs, int& cardType, bool bIssue = false);
+
+	bool GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX,CAutoArray<CSimpleStringA> pAIDs);
 	//int  SplitICData(vector<ICData>& vResult,LPBYTE* origData,int start,int dataLen,int level);
 	ErrorCodeEnum BuildSupportedAppList(CardReadType eType,DeviceBaseClass *pCardX,vector<AIDData>& vAIDFromTerm);
 	ErrorCodeEnum BuildAppListByAIDs(CardReadType eType,DeviceBaseClass *pCardX,vector<AIDData>& vAIDFromTerm);
@@ -83,7 +94,7 @@ public:
 	void SplitBusinessData(const char *pData,int size);
 	int SplitOnlineReplyData(const char *pData,int size);
 	void GetBaseInfoNotInRecord(CardReadType eType,DeviceBaseClass *pCardX);
-	int DetectAndReadICData(CardReadType eType,DeviceBaseClass *pCardX,CAutoArray<CSimpleStringA>pAIDs,int &cardType, bool bIssue = false);
+	
 	int ConstructARQCData(const char *pATC,char *&pDataToARQC,char *&pSomeICData);
 	int FindTagValue(TagVectorType eType,ICData& data,bool bLevel,int start=0,int end=0);
 	int ToFindTagValue(vector<ICData>& vData,ICData& data,bool bLevel,int start,int end);

+ 11 - 4
DevAdapter/simulator/idcer.1.1/idcer_httpans.h

@@ -115,10 +115,11 @@ typedef struct IDCerDevAns
         int dwSize;
         JSONCONVERT2OBJECT_MEMEBER_REGISTER(data, dwSize)
     }reserved5;
+    int headPhotoFlag;
     
     JSONCONVERT2OBJECT_MEMEBER_REGISTER(name, sex, nation, birthday, address, idno, department, startDate, endDate,
         photoPath, newAddress, englishName, nationality, idVersion, idType, reserved, reserved, txzCode, issuedSN, reserved2,
-        reserved3, reserved4, reserved5)
+        reserved3, reserved4, reserved5, headPhotoFlag)
     
    /* std::string sex;
     std::string nation;
@@ -151,8 +152,14 @@ typedef struct IDCerDevAns
 
 
 typedef struct QueryCardPosAns {
-    int errNum;
     int pos;
 
-    JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, pos)
-}QueryCardPosAns;
+    JSONCONVERT2OBJECT_MEMEBER_REGISTER(pos)
+}QueryCardPosAns;
+
+typedef struct ScanIDAndSaveImgAns {
+    int frontPhotoFlag;
+    int backPhotoFlag;
+
+    JSONCONVERT2OBJECT_MEMEBER_REGISTER(frontPhotoFlag, backPhotoFlag)
+}ScanIDAndSaveImgAns;

+ 13 - 11
DevAdapter/simulator/idcer.1.1/idcer_impl.cpp

@@ -173,6 +173,11 @@ ErrorCodeEnum IDCerClassImpl::ex2HttpFunction(IDCerInfoEx2& idCerInfoEx2)
             return Error_Unexpect;
         }
 
+        if (idCerRet.headPhotoFlag)
+        {
+            GenerateBmpFile("zp.bmp");
+        }
+
 #ifdef _MSC_VER
         ConvertGBKToUtf8(idCerRet.name.data);
         ConvertGBKToUtf8(idCerRet.sex.data);
@@ -372,19 +377,21 @@ ErrorCodeEnum IDCerClassImpl::ForceIDEject()
 ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
 {
     ErrorCodeEnum err = Error_NotImpl;
-    err = SimulatorHttpFunction(EntityName, "ScanIDAndSaveImage");
+    ScanIDAndSaveImgAns ans;
+    err = SimulatorHttpFunction(EntityName, "ScanIDAndSaveImage", ans);
     LOG4VTM(INFO, "ScanIDAndSaveImage err = " << err);
 
     if (err == Error_Succeed)
     {
-        bool flag1 = GenerateBmpFile("idfront.bmp");
-        bool flag2 = GenerateBmpFile("idback.bmp");
-        if (!(flag1 & flag2))
+        if (ans.frontPhotoFlag)
+        {
+            GenerateBmpFile("idfront.bmp");
+        }
+        if (ans.backPhotoFlag)
         {
-            err = Error_Bug;
+            GenerateBmpFile("idback.bmp");
         }
     }
-
     return err;
 }
 
@@ -461,11 +468,6 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx2(IDCerInfoEx2& idCerInfoEx2)
     ErrorCodeEnum err = Error_Succeed;
     memset(&idCerInfoEx2, 0, sizeof(IDCerInfoEx2));
     err = ex2HttpFunction(idCerInfoEx2);
-    bool flag = GenerateBmpFile("zp.bmp");
-    if (!flag)
-    {
-        err = Error_Bug;
-    }
 
     LOG4VTM(INFO, "IDCerGetDataEx2 err = " << err);
     return err;

+ 27 - 30
Module/mod_CardIssuerStand/CardIssuerStand.xml

@@ -222,8 +222,8 @@
 			</res>			
 		</twoway>
 		<!--查询卡机设备状态接口 -->
-		<!--1、卡库打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
-		<!--2、卡库正在打开中, errorCode为Error_NotInit(769),rtaCode为RTA2311-->		
+		<!--1、卡机未成功打开, rtaCode为RTA2311-->
+		<!--2、卡库正在打开中, rtaCode为RTA2311-->		
 		<twoway name="GetDevInfo" overlap="true" method_id="65535" jsflag="true">
 			<req>
 			</req>
@@ -231,14 +231,14 @@
 				<param name="type" type="string" />
 				<param name="model" type="string" />
 				<param name="version" type="string" />
-				<!--卡机状态 0设备未打开 1 正常运行 2卡箱未准备好需要维护 3卡机异常不可工作-->
+				<!--卡机状态, JS之后只需要关注:2 卡箱未准备好需要维护-->
 				<param name="state" type="int" />
 			</res>			
 		</twoway>							
 	
 		
 		<!--读卡接口 -->
-		<!--卡机打开失败, rtaCode为RTA2311-->
+		<!--卡机未成功打开, rtaCode为RTA2311-->
     <!--为了把读卡情况完整的反馈,返回规则如下:-->
     <!--1、对于单路(只读磁或只读芯)的请求,失败则返回报错-->
     <!--2、对于双路的请求,一律返回成功,增加magMsg、icMsg字段,分别在对应通路异常时填充“[RTAxxxx]描述信息”-->
@@ -279,7 +279,7 @@
 		</twoway>
 		
 		<!--联机后处理接口-->
-		<!--1、卡机打开失败, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2311-->
+		<!--1、卡机未成功打开, rtaCode为RTA2311-->
 		<twoway name="PostOnlineJS" overlap="true" method_id="41" jsflag="true">
 			<req>
 				<!--联机后处理数据-->
@@ -292,11 +292,10 @@
 		</twoway>
 		
 		<!--吐卡接口-->
-		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
-		<!--2、卡机吐卡失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2308-->
-		<!--3、超时未取卡,已吞卡 errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CU-->
-		<!--4、超时未取卡,吞卡失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CV-->
-		<!--5、查询卡机状态失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2W22-->
+		<!--1、卡机未成功打开, rtaCode为RTA2311-->
+		<!--2、卡机吐卡失败, rtaCode为RTA2308-->
+		<!--3、超时未取卡,已吞卡, rtaCode为RTA23CU-->
+		<!--4、超时未取卡,吞卡失败, rtaCode为RTA23CV-->
 		<twoway name="EjectJS" overlap="true" method_id="42" jsflag="true">
 			<req>
 			</req>
@@ -305,9 +304,8 @@
 		</twoway>
 		
 		<!--吞卡接口-->
-		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
-		<!--2、吞卡失败, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2307-->
-		<!--3、吞卡时卡机无卡, errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CS-->
+		<!--1、卡机未成功打开, rtaCode为RTA2311-->
+		<!--2、吞卡失败, rtaCode为RTA2307-->
 		<twoway name="CaptureJS" overlap="true" method_id="43" jsflag="true">
 			<req>
 				<!--吞卡原因码-->
@@ -318,8 +316,8 @@
 		</twoway>
 		
 		<!--查询卡机是否有卡接口-->
-		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
-		<!--2、查询卡机状态失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2322-->
+		<!--1、卡机未成功打开, rtaCode为RTA2311-->
+		<!--2、查询卡机状态失败, rtaCode为RTA2322-->
 		<twoway name="QueryHasCardJS" overlap="true" method_id="44" jsflag="true">
 			<req>
 			</req>
@@ -332,15 +330,15 @@
 		</twoway>		
 		
 		<!--卡箱发卡接口-->
-		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
-		<!--2、卡箱1未检测到 errorCode为Error_DevMedia(2054),rtaCode为RTA230B-->
-		<!--3、卡箱2未检测到 errorCode为Error_DevMedia(2054),rtaCode为RTA230C-->
-		<!--4、卡箱3未检测到 errorCode为Error_DevMedia(2054),rtaCode为RTA230D-->
-		<!--5、卡箱1未检测到卡片 errorCode为Error_DevNotAvailable(2050),rtaCode为RTA230E-->
-		<!--6、卡箱2未检测到卡片 errorCode为Error_DevNotAvailable(2050),rtaCode为RTA230F-->
-		<!--7、卡箱3未检测到卡片 errorCode为Error_DevNotAvailable(2050),rtaCode为RTA230G-->
-		<!--8、从卡箱移动卡片到读卡器失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2306-->
-		<!--9、发卡箱号参数错误 errorCode为Error_Param(102),rtaCode为RTA23CW-->
+		<!--1、卡机未成功打开, rtaCode为RTA2311-->
+		<!--2、卡箱1未检测到, rtaCode为RTA230B-->
+		<!--3、卡箱2未检测到, rtaCode为RTA230C-->
+		<!--4、卡箱3未检测到, rtaCode为RTA230D-->
+		<!--5、卡箱1未检测到卡片, rtaCode为RTA230E-->
+		<!--6、卡箱2未检测到卡片, rtaCode为RTA230F-->
+		<!--7、卡箱3未检测到卡片, rtaCode为RTA230G-->
+		<!--8、从卡箱移动卡片到读卡器失败, rtaCode为RTA2306-->
+		<!--9、卡箱号不是1-3, rtaCode为RTA23CW-->
 		<twoway name="IssueFromBoxJS" overlap="true" method_id="45" jsflag="true">
 			<req>
 				<!--卡箱号-->
@@ -355,12 +353,11 @@
 		</twoway>	
 		
 		<!--前端插卡接口-->
-		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
-		<!--2、查询卡机状态失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2322-->
-		<!--3、卡机未插卡时,内部已存在卡片 errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CN-->
-		<!--4、卡机插卡超时 errorCode为Error_TimeOut(1792),rtaCode为RTA23CP-->
-		<!--5、卡机插卡取消 errorCode为Error_Cancel(1026),rtaCode为RTA23CQ-->
-		
+		<!--1、卡机未成功打开, rtaCode为RTA2311-->
+		<!--2、调用卡机API失败, rtaCode为RTA2322/RTA23B5-->
+		<!--3、卡机插卡超时, rtaCode为RTA23CP-->
+		<!--4、卡机插卡取消, rtaCode为RTA23CQ-->
+    <!--5、卡机实体无法处理此命令, rtaCode由实体当前状态决定-->
 		<twoway name="InsertJS" overlap="true" method_id="47" jsflag="true">
 			<req>
 				<param name="reserved1" type="array_int"/>

+ 135 - 503
Module/mod_CardIssuerStand/CardIssuerStandFSM.cpp

@@ -1565,7 +1565,7 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerStandService_IssueEx_Req
 		ctxEx->Ans.reserved1.Init(2);
 		
 		//param Req.hopper is wrong
-		if (ctxEx->Req.hopper < 1 || ctxEx->Req.hopper > 6){
+		if (ctxEx->Req.hopper < 1 || ctxEx->Req.hopper > 3){
 			errMsg = CSimpleStringA::Format("Issuer Card, the hopperNo(%d) is wrong!!!", ctxEx->Req.hopper);
 			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Invalid_Hopper, errMsg.GetData());
 			return Error_Param;
@@ -2246,19 +2246,19 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerStandService_Read
 	else
 	{
 		l_beginTime = GetTickCountRVC();
-		bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
+		int retDetect = 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 (retDetect == 0)//oiltmp for simple to not change bIC
+			bIC = true;
+		else
+		{
+			bIC = false;
+			CSimpleStringA csDevApi("");
+			DWORD dwDevApi = 0;
+			GetDevApiCodeAndName(retDetect, dwDevApi, csDevApi);
+			SetErrorAndLog(Error_Unexpect, dwDevApi, csDevApi, __FUNCTION__, bContinue && IsInBusiness(), l_endTime - l_beginTime);
 		}
+		
 		if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
 		{
 			if (bIC)
@@ -2504,18 +2504,18 @@ int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext<CardIssuerStandService_Read_Req,
 	else
 	{
 		l_beginTime = GetTickCountRVC();
-		bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, m_hDevHelper, activeCardType);
+		int retDetect = 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());
+		if (retDetect == 0)//oiltmp for simple to not change bIC
+			bIC = true;
+		else
+		{
+			bIC = false;
+			CSimpleStringA csDevApi("");
+			DWORD dwDevApi = 0;
+			GetDevApiCodeAndName(retDetect, dwDevApi, csDevApi);
+			SetErrorAndLog(Error_Unexpect, dwDevApi, csDevApi, __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime);
 		}
 		if (!(bIC && activeCardType == 'A'))
 			bIC = false;
@@ -2629,105 +2629,20 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerStandService_Pre
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<PreOnline>, After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType);
 	if (retDetectAndRead < 0)
 	{
-		CSimpleStringA xCardName("");
-		if (m_issueStatus && m_currentHopper - 1 >= 0)
-			xCardName = m_PsbNameEx[m_currentHopper - 1];
-		if (retDetectAndRead == -1)
+		DWORD dwDevApiCode = 0;
+		CSimpleStringA csDevApiName(""), csLogCode("");
+		CSimpleStringA csIssueContext = CSimpleStringA::Format("{\"InIssue\":%d}", m_issueStatus);//oiltmp
+		GetDevApiCodeAndName(retDetectAndRead, dwDevApiCode, csDevApiName);
+		if (m_issueStatus)
+			csLogCode = CardIssuerStandService_LogCode_IssueEx;
+		else
+			csLogCode = CardIssuerStandService_LogCode_Read;
+		if (m_bSupportRF) //support RF, to continue read by RF
+			SetErrorAndLog(Error_Unexpect, dwDevApiCode, csDevApiName, __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, csLogCode, csIssueContext);
+		else
 		{
-			ErrorCodeEnum eErrCode = Error_Unexpect;
-			CSimpleStringA ApiName = "";
-			CSimpleStringA alarmMsg = "";
-			CSimpleStringA csErrMsgWithReturnCode = "";
-			GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败");
-			if (!m_bSupportRF)
-			{
-				if (IsInBusiness())
-				{
-					if (m_issueStatus)
-					{
-						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());
-						ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
-					}
-					else
-					{
-						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());
-						ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed);
-					}
-				}
-				else
-				{
-					if (m_issueStatus)
-					{
-						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
-					{
-						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 (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){
-			if (!m_bSupportRF)
-			{
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败");
-				if (m_issueStatus) {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
-				}
-				else {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
-				}
-				ctx->Answer(Error_Unexpect, GetAlarmDEC());
-			}
-			else //非终态,还有非接兜底
-			{
-				DbgWithLink(LOG_LEVEL_DEBUG, 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){
-			if (!m_bSupportRF)
-			{
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
-				if (m_issueStatus) {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
-				}
-				else {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
-				}
-				ctx->Answer(Error_Unexpect, GetAlarmDEC());
-				
-			}
-			else //非终态,还有非接兜底
-			{
-				DbgWithLink(LOG_LEVEL_DEBUG, 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", "");
-				}
-			}
+			DWORD dwCode = SetErrorAndLog(Error_Unexpect, dwDevApiCode, csDevApiName, __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, csLogCode, csIssueContext);
+			ctx->Answer(Error_Unexpect, dwCode);
 		}
 		bICOK = false;
 		return 0;
@@ -2986,73 +2901,20 @@ int CCardIssuerFSM::PreOnline_RF(SpReqAnsContext<CardIssuerStandService_PreOnlin
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<PreOnline_RF>, After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType);
 	if (retDetectAndRead < 0)
 	{
-		CSimpleStringA xCardName("");
-		if (m_issueStatus && m_currentHopper - 1 >= 0)
-			xCardName = m_PsbNameEx[m_currentHopper - 1];
-		if (retDetectAndRead == -1) {
-			ErrorCodeEnum eErrCode = Error_Unexpect;
-			CSimpleStringA ApiName = "";
-			CSimpleStringA alarmMsg = "";
-			CSimpleStringA csErrMsgWithReturnCode = "";
-			GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败(非接)");
-
-			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_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败");
-			if (m_issueStatus) {
-				SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
-			}
-			else {
-				SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
-			}
-			ctx->Answer(Error_Unexpect, GetAlarmDEC());
-
-		}
-		else if (retDetectAndRead == -3) {
+		DWORD dwDevApiCode = 0;
+		CSimpleStringA csDevApiName(""), csLogCode("");
+		CSimpleStringA csIssueContext = CSimpleStringA::Format("{\"InIssue\":%d}", m_issueStatus);//oiltmp
+		GetDevApiCodeAndName(retDetectAndRead, dwDevApiCode, csDevApiName);
+		if (m_issueStatus)
+			csLogCode = CardIssuerStandService_LogCode_IssueEx;
+		else
+			csLogCode = CardIssuerStandService_LogCode_Read;
 
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
-			if (m_issueStatus) {
-				SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
-			}
-			else {
-				SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
-			}
-			ctx->Answer(Error_Unexpect, GetAlarmDEC());
-		}
+		DWORD dwCode = SetErrorAndLog(Error_Unexpect, dwDevApiCode, csDevApiName, __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, csLogCode, csIssueContext);
+		ctx->Answer(Error_Unexpect, dwCode);
 		return 0;
 	}
-
+	
 	m_pCardProcess->TermRiskManage();
 	CSimpleStringA taaResult;
 	BYTE bt9f27 = 0;
@@ -3699,18 +3561,15 @@ bool CCardIssuerFSM::JustReadCardNo()
 	bool bHasAccount = false;
 	int activeCardType;
 	l_beginTime = GetTickCountRVC();
-	bool bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
+	int retDetect = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
 	l_endTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("DetectIfICCard, bIC:%d, activeCardType:%d", bIC, activeCardType));
-
-	if (bIC)
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("retDetect:%d, activeCardType:%d", retDetect, activeCardType);
+	if (retDetect == 0)//oiltmp for simple to not change bIC
 	{
 		//oilyang@20201014 add emv support
-		int bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList);
-		if(bGetICData != 0)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("<JustReadCardNo::GetICDataFromCard> faile(%d)", bGetICData));
-		}
+		bool bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList);
+		if (bGetICData != 0)
+			SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime);
 		ICData track2(false, 0x57, 0x00);
 		string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
 		if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
@@ -3720,19 +3579,19 @@ bool CCardIssuerFSM::JustReadCardNo()
 		else
 		{
 			int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth);
-			char *pICTrack2 = new char[128];
+			char* pICTrack2 = new char[128];
 			ZeroMemory(pICTrack2, 128);
 			HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
 			pICTrack2[37] = '\0';
 
-			char *ddd = new char[128];
+			char* ddd = new char[128];
 			memset(ddd, 0, 128);
 			memcpy(ddd, pICTrack2, pos - 1);
 			m_currCardNo = ddd;
 			if (m_currCardNo.GetLength() > 1)
 				bHasAccount = true;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("<JustReadCardNo>, FindHexCharPosition, pos:%d, track2.lenth:%d, m_currCardNo.Len:%d",
-											pos, track2.lenth, m_currCardNo.GetLength()));
+				pos, track2.lenth, m_currCardNo.GetLength()));
 
 			delete[]ddd;
 			delete[]pICTrack2;
@@ -3741,8 +3600,8 @@ bool CCardIssuerFSM::JustReadCardNo()
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->DeactivateICCard();
 		l_endTime = GetTickCountRVC();
-		
-		if (eErr != Error_Succeed){
+
+		if (eErr != Error_Succeed) {
 			SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
 		}
 		else {
@@ -3752,24 +3611,23 @@ bool CCardIssuerFSM::JustReadCardNo()
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->ReleaseIC();
 		l_endTime = GetTickCountRVC();
-		
 
-		if (eErr != Error_Succeed){
+
+		if (eErr != Error_Succeed) {
 			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)("JustReadCardNo::ReleaseIC");
 		}
 	}
-	else {
-		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());
+	else
+	{
+		CSimpleStringA csDevApi("");
+		DWORD dwDevApi = 0;
+		GetDevApiCodeAndName(retDetect, dwDevApi, csDevApi);
+		SetErrorAndLog(Error_Unexpect, dwDevApi, csDevApi, __FUNCTION__, false, l_endTime - l_beginTime);
 	}
+
 	if (!bHasAccount)
 	{
 		MagTracks magTracks;
@@ -4301,35 +4159,8 @@ int CCardIssuerFSM::CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_R
 	}
 	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).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("CaptureJS::GetDevStatus succ,m_devStatus.eMedia=%d", (int)m_devStatus.eMedia);
-		if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT) {
-			if (ctx != NULL) {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR040220343").setResultCode("RTA23CS")
-					("CaptureJS::GetDevStatus succ, No card found in cardReader");
-				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_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR040220343").setResultCode("RTA23CS")("CaptureJS::GetDevStatus succ, No card found in cardReader");
-			}
-			return 0;//回到无卡状态
-		}
-	}
-	else {
-		dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220343", "");
-		ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
-		return 1;
-	}
-
-	l_beginTime = GetTickCountRVC();
-	eErr = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
+	ErrorCodeEnum eErr = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
 	l_endTime = GetTickCountRVC();
 
 	if (eErr == Error_Succeed) {
@@ -4689,119 +4520,24 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandSe
 
 	if (retDetectAndRead < 0)
 	{
-		ErrorCodeEnum eErrCode = Error_Unexpect;
-		CSimpleStringA ApiName = "";
-		CSimpleStringA alarmMsg = "";
-		CSimpleStringA csErrMsgWithReturnCode = "";
-
-		if (bContinue) {
-			if (retDetectAndRead == -1) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败 to continue");
-				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-
-				if (m_issueStatus) {
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
-				}
-				else {
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
-				}
-			}
-			else if (retDetectAndRead == -2) {
-				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数据失败");
-				}
-				else {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220303", "读取IC数据失败");
-				}
-			}
-			else if (retDetectAndRead == -3) {
-				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");
-				}
-				else {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220303", "retDetectAndRead = -3");
-				}
-			}
-		}
-		else {
-			DWORD dwTmpUserErrCode = 0;
-			if (retDetectAndRead == -1) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败");
-				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-
-				if (m_issueStatus) {
-					if (IsInBusiness()) {
-						DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).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(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
-						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, alarmMsg.GetData());
-					}
-					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()) {
-						DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).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(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
-						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, alarmMsg.GetData());
-					}
-					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数据失败");
-				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数据失败");
-				}
-				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卡建立应用列表失败");
-				DWORD dwTmpUserErrCode = 0;
-				if (m_issueStatus) {
-					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220320", "retDetectAndRead =-3");
-				}
-				else {
-					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, "QLR040220303", "retDetectAndRead =-3");
-				}
-				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);
-				}
+		DWORD dwDevApiCode = 0;
+		CSimpleStringA csDevApiName(""), csLogCode("");
+		CSimpleStringA csIssueContext = CSimpleStringA::Format("{\"InIssue\":%d}", m_issueStatus);//oiltmp
+		GetDevApiCodeAndName(retDetectAndRead, dwDevApiCode, csDevApiName);
+		if (m_issueStatus)
+			csLogCode = CardIssuerStandService_LogCode_IssueEx;
+		else
+			csLogCode = CardIssuerStandService_LogCode_Read;
+		DWORD dwCode = SetErrorAndLog(Error_Unexpect, dwDevApiCode, csDevApiName, __FUNCTION__, !bContinue && IsInBusiness(), m_ullEndTime - m_ullBeginTime, csLogCode, csIssueContext);
+		if (!bContinue) //no need continue
+		{
+			if (m_bSingleMagOrIC)
+				ctx->Answer(Error_Unexpect, dwCode);
+			else
+			{
+				//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+				ctx->Ans.icMsg = GetErrMsgByCode(dwCode);
+				ctx->Answer(Error_Succeed);
 			}
 		}
 		return -1;
@@ -4889,129 +4625,27 @@ int CCardIssuerFSM::PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService
 
 	if (retDetectAndRead < 0)
 	{
-		ErrorCodeEnum eErrCode = Error_Unexpect;
-		CSimpleStringA ApiName = "";
-		CSimpleStringA alarmMsg = "";
-		CSimpleStringA csErrMsgWithReturnCode = "";
-		DWORD dwTmpUserErrCode = 0;
-		if (bContinue)
-		{
-			if (retDetectAndRead == -1) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败(非接)to continue");
-				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-
-				if (m_issueStatus) {
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220320").setResultCode("RTA2327")(csErrMsgWithReturnCode.GetData());
-				}
-				else {
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220303").setResultCode("RTA2326")(csErrMsgWithReturnCode.GetData());
-				}
-			}
-			else if (retDetectAndRead == -2) {
-
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("读取IC数据失败 to continue");
-				if (m_issueStatus) {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "读取IC数据失败");
-				}
-				else {
-					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卡建立应用列表失败 to continue");
-				if (m_issueStatus) {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220320", "retDetectAndRead=-3");
-				}
-				else {
-					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, "QLR040220303", "retDetectAndRead=-3");
-				}
-			}
-		}
+		DWORD dwDevApiCode = 0;
+		CSimpleStringA csDevApiName(""), csLogCode("");
+		CSimpleStringA csIssueContext = CSimpleStringA::Format("{\"InIssue\":%d}", m_issueStatus);//oiltmp
+		GetDevApiCodeAndName(retDetectAndRead, dwDevApiCode, csDevApiName);
+		if (m_issueStatus)
+			csLogCode = CardIssuerStandService_LogCode_IssueEx;
 		else
+			csLogCode = CardIssuerStandService_LogCode_Read;
+		DWORD dwCode = SetErrorAndLog(Error_Unexpect, dwDevApiCode, csDevApiName, __FUNCTION__, !bContinue && IsInBusiness(), m_ullEndTime - m_ullBeginTime, csLogCode, csIssueContext);
+		if (!bContinue) //no need continue
 		{
-			if (retDetectAndRead == -1) {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败(非接)");
-				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
-
-				if (m_issueStatus) {
-					if (IsInBusiness())
-					{
-						DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).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(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220320").setResultCode("RTA2327")(csErrMsgWithReturnCode.GetData());
-						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, alarmMsg.GetData());
-					}
-					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())
-					{
-						DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(m_ullEndTime - m_ullBeginTime).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(m_ullEndTime - m_ullBeginTime).setLogCode("QLR040220303").setResultCode("RTA2326")(csErrMsgWithReturnCode.GetData());
-						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
-					}
-					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数据失败");
-				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数据失败");
-				}
-				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卡建立应用列表失败");
-				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");
-				}
-				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);
-				}
+			if (m_bSingleMagOrIC)
+				ctx->Answer(Error_Unexpect, dwCode);
+			else
+			{
+				//oilyang@20250828 return ErrorSucceed so that the caller can know the failed reason of both mag&ic
+				ctx->Ans.icMsg = GetErrMsgByCode(dwCode);
+				ctx->Answer(Error_Succeed);
 			}
 		}
-		return -1;//上电读卡失败
+		return -1;
 	}
 
 	m_pCardProcess->TermRiskManage();
@@ -5446,12 +5080,12 @@ int CCardIssuerFSM::InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req
 		break;
 	case 2:
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AcceptCard, insert timeout");
-		ctx->Answer(Error_TimeOut);
+		ctx->Answer(Error_TimeOut, CardIssuer_UserErrorCode_Insert_Card_TimeOut);
 		break;
 	case 3:
 	case 4:
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AcceptCard, insert cancel");
-		ctx->Answer(Error_Cancel);
+		ctx->Answer(Error_Cancel, CardIssuer_UserErrorCode_Insert_Card_Cancel);
 		break;
 	default:
 		break;
@@ -5481,39 +5115,6 @@ CSimpleStringA CCardIssuerFSM::MaskCardno(const char* cardno)
 	return maskCardno;
 }
 
-void CCardIssuerFSM::GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& ApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode)
-{
-	if (m_pCardProcess == NULL) {
-		DbgWithLink(LOG_LEVEL_DEBUG, 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();
-}
-
 void CCardIssuerFSM::OnStateTrans(int iSrcState, int iDstState)
 {
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("trans from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
@@ -5575,4 +5176,35 @@ 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());
+}
+void CCardIssuerFSM::GetDevApiCodeAndName(int retValue, DWORD& dwDevApiCode, CSimpleStringA& csDevApiName)
+{
+	switch (retValue)
+	{
+	case -1:
+		dwDevApiCode = MEC_DEVAPI_CARDISSUER_ContactIC;
+		csDevApiName = "DevAdapter::ContactIC";
+		break;
+	case -2:
+		dwDevApiCode = MEC_DEVAPI_CARDISSUER_ActiveICCard;
+		csDevApiName = "DevAdapter::ActiveICCard";
+		break;
+	case -3:
+		dwDevApiCode = MEC_DEVAPI_CARDISSUER_ActiveContactlessICCard;
+		csDevApiName = "DevAdapter::ActiveContactlessICCard";
+		break;
+	case -4:
+		dwDevApiCode = MEC_DEVAPI_CARDISSUER_ICCommand;
+		csDevApiName = "DevAdapter::ICCommand";
+		break;
+	case -5:
+		dwDevApiCode = MEC_DEVAPI_CARDISSUER_RFTypeABCommand;
+		csDevApiName = "DevAdapter::RFTypeABCommand";
+		break;
+	default:
+		dwDevApiCode = DEC_NO_E_CARDISSUER_START;
+		csDevApiName = "DevAdapter::SthWrong";
+		break;
+	}
+	return;
 }

+ 1 - 1
Module/mod_CardIssuerStand/CardIssuerStandFSM.h

@@ -732,7 +732,6 @@ public:
 	int PreOnlineJS_ICDataProcess(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
 
 	CSimpleStringA MaskCardno(const char* cardno);
-	void GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& lastApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode);
 
 	void SetDoExitFlag(bool bFlag) { m_bDoExit = bFlag; }
 	virtual void OnStateTrans(int iSrcState, int iDstState);
@@ -750,6 +749,7 @@ private:
 	BYTE m_btCID/*9f27*/;
 	void FSMEventDefaultProcess(FSMEvent* pEvt, DWORD dwUserCode);
 	CSimpleStringA GetErrMsgByCode(DWORD dwCode);
+	void GetDevApiCodeAndName(int retValue, DWORD& dwDevApiCode, CSimpleStringA& csDevApiName);
 };
 
 class ReadJSEvent : public FSMEvent

+ 4 - 4
Module/mod_CardIssuerStand/mod_cardissuerStand.h

@@ -269,20 +269,20 @@ public:
 		
 
 		if (m_fsm.GetDevInitingFlag()) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevInfo device is opening,state return 0");
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetDevInfo device is opening,state return 0");
 			ctx->Ans.state = DEVICE_STATUS_NOT_READY;
-			ctx->Answer(Error_NotInit, CardIssuer_UserErrorCode_DevOpen_Failed);
+			ctx->Answer(Error_NotInit, CardIssuer_UserErrorCode_DeviceOpening);
 		}
 		else {
 			//设备未正常打开时,直接报state=0;
 			if (!m_fsm.GetDevInitFlag()) {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevInfo device is not open,state return 0");
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetDevInfo device is not open,state return 0");
 				ctx->Ans.state = DEVICE_STATUS_NOT_READY;
 				ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
 			}
 			else {
 				if (ctx->Ans.state != DEVICE_STATUS_NORMAL) {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevInfo state=%d", ctx->Ans.state);
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetDevInfo state=%d", ctx->Ans.state);
 				}
 				ctx->Answer(Error_Succeed);
 			}

+ 74 - 9
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -515,6 +515,10 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 	m_bCancelRead = false;
 	m_bReading = true;
 	m_bExit = false;
+	m_bGetHeadPhotoFailed = false;
+	m_bHeadPhotoTimeError = false;
+	m_bFrontPhotoTimeError = false;
+	m_bBackPhotoTimeError = false;
 
 	LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on");
 	while (elapsed < IDCER_READ_TIMEOUT && (errReadEx2 != Error_Succeed) && !m_bCancelRead)
@@ -585,6 +589,10 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 
 					//转换数据并赋值至传出字段
 					CopyIDCerDataToCtx(idInfoEx2, ctx);
+					if (m_bGetHeadPhotoFailed)
+					{
+						break;
+					}
 					ctx->Ans.photodata = ctx->Ans.headphoto; //现接口继续保持复制图片,JS接口下掉photodata字段 - 2025.6.17
 
 					ctx->Ans.hasscan = 0;
@@ -635,7 +643,30 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 
 	if (errReadEx2 == Error_Succeed)
 	{
-		ctx->Answer(Error_Succeed);
+		if (m_bGetHeadPhotoFailed) //头像图片获取失败
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211B")("Get Headphoto failed!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_GetHeadPhotoFailed);
+		}
+		else if (m_bHeadPhotoTimeError) //头像图片修改时间异常
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211C")("Headphoto time error!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_HeadPhotoTimeError);
+		}
+		else if (m_bFrontPhotoTimeError) //正面扫描件修改时间异常
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211D")("Frontphoto time error!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_FrontPhotoTimeError);
+		}
+		else if (m_bBackPhotoTimeError) //背面扫描件修改时间异常
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211E")("Backphoto time error!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_BackPhotoTimeError);
+		}
+		else
+		{
+			ctx->Answer(Error_Succeed);
+		}
 	}
 	else if (m_bCancelRead)
 	{
@@ -647,14 +678,14 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 			if (errReadEx2 != Error_Succeed) {
 
 				SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
-					true, IDCerGetDataEx2Time, IDCertService_LogCode_IDCerGetDataEx2);
+					IsInBusiness(), IDCerGetDataEx2Time, IDCertService_LogCode_IDCerGetDataEx2);
 				ctx->Answer(Error_TimeOut, GetAlarmDEC()); //RTA2109
 			}
 		}
 		else if (errRfOpen != Error_Succeed)
 		{
 			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
-				true, OpenRFControlTime, IDCertService_LogCode_OpenIDCerRFControl);
+				IsInBusiness(), OpenRFControlTime, IDCertService_LogCode_OpenIDCerRFControl);
 			ctx->Answer(Error_TimeOut, GetAlarmDEC());
 		}
 		else
@@ -727,6 +758,10 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 	m_bCancelRead = false;
 	m_bReading = true;
 	m_bExit = false;
+	m_bGetHeadPhotoFailed = false;
+	m_bHeadPhotoTimeError = false;
+	m_bFrontPhotoTimeError = false;
+	m_bBackPhotoTimeError = false;
 
 	LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on");
 	while (elapsed < IDCER_READ_TIMEOUT && (errReadEx2 != Error_Succeed) && !m_bCancelRead)
@@ -790,6 +825,10 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 				//转换数据并赋值至传出字段
 				CopyIDCerDataToCtx(idInfoEx2, ctx);
+				if (m_bGetHeadPhotoFailed)
+				{
+					break;
+				}
 
 				ctx->Ans.hasscan = 0;
 				if (igestionVer == TRUE) //吸入式设备才调用正反扫描功能
@@ -838,7 +877,30 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 	if (errReadEx2 == Error_Succeed)
 	{
-		ctx->Answer(Error_Succeed);
+		if (m_bGetHeadPhotoFailed) //头像图片获取失败
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211B")("Get Headphoto failed!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_GetHeadPhotoFailed);
+		}
+		else if (m_bHeadPhotoTimeError) //头像图片修改时间异常
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211C")("Headphoto time error!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_HeadPhotoTimeError);
+		}
+		else if (m_bFrontPhotoTimeError) //正面扫描件修改时间异常
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211D")("Frontphoto time error!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_FrontPhotoTimeError);
+		}
+		else if (m_bBackPhotoTimeError) //背面扫描件修改时间异常
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setResultCode("RTA211E")("Backphoto time error!");
+			ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_BackPhotoTimeError);
+		}
+		else
+		{
+			ctx->Answer(Error_Succeed);
+		}
 	}
 	else if (m_bCancelRead)
 	{
@@ -850,14 +912,14 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 			if (errReadEx2 != Error_Succeed) {
 
 				SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
-					true, IDCerGetDataEx2Time, IDCertService_LogCode_IDCerGetDataEx2);
+					IsInBusiness(), IDCerGetDataEx2Time, IDCertService_LogCode_IDCerGetDataEx2);
 				ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109
 			}
 		}
 		else if (errRfOpen != Error_Succeed)
 		{
 			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
-				true, OpenRFControlTime, IDCertService_LogCode_OpenIDCerRFControl);
+				IsInBusiness(), OpenRFControlTime, IDCertService_LogCode_OpenIDCerRFControl);
 			ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2106
 		}
 		else
@@ -972,6 +1034,7 @@ ErrorCodeEnum CIDCertFSM::GetPngBlobEx(CBlob &data, CSimpleStringA fileNamePrefi
 			errInfo["description"] = disecription.GetData();
 			tErrStr = generateJsonStr(errInfo).second.c_str();
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(imgRTACode).setAPI("DeleteFileIfExisted")(tErrStr.GetData());
+			m_bGetHeadPhotoFailed = true;
 		}
 
 		errMsg = CSimpleStringA::Format("read file %s.bmp failed.err:%d", (const char*)strPath, GetLastError());
@@ -1770,9 +1833,11 @@ void CIDCertFSM::WarnImgCreateTime()
 	CSimpleStringA fileTimeWarn = CSimpleStringA::Format("头像图片时间:[%s], 正面图片时间:[%s],背面图片时间:[%s]",
 		headPhotoTimeStr.GetData(), frontPhotoTimeStr.GetData(), backPhotoTimeStr.GetData());
 	SeverityLevelEnum ImgTimeWarnLevel = Severity_Low;
-	if ((headPhotoTime > 0 && headPhotoTime < currentSysTime) ||
-		(frontPhotoTime > 0 && frontPhotoTime < currentSysTime) ||
-		(backPhotoTime > 0 && backPhotoTime < currentSysTime))
+	m_bHeadPhotoTimeError = headPhotoTime > 0 && headPhotoTime < currentSysTime;
+	m_bFrontPhotoTimeError = frontPhotoTime > 0 && frontPhotoTime < currentSysTime;
+	m_bBackPhotoTimeError = backPhotoTime > 0 && backPhotoTime < currentSysTime;
+
+	if (m_bHeadPhotoTimeError || m_bFrontPhotoTimeError || m_bBackPhotoTimeError)
 	{
 		ImgTimeWarnLevel = Severity_Middle;			//若生成图片的时间早于本次交易时间,则告LEVEL2
 	}

+ 4 - 2
Module/mod_IDCertificate/IDCertFSM.h

@@ -97,6 +97,7 @@ enum BmpType
 
 #pragma region forsonar
 typedef IDCertificate::IDCertService_CancelRead_Info IDCert_CancelRead_Info;
+typedef IDCertificate::IDCertService_Exit_Info IDCert_Exit_Info;
 typedef IDCertificate::IDCertService_ReadAndScanUTF8_Req IDCert_ReadAndScanUTF8_Req; //ex2
 typedef IDCertificate::IDCertService_ReadAndScanUTF8_Ans IDCert_ReadAndScanUTF8_Ans;
 typedef IDCertificate::IDCertService_ReadAndScanUTF8JS_Req IDCert_ReadAndScanUTF8JS_Req; //js ReadAndScanUTF8
@@ -229,7 +230,8 @@ public:
 	END_FSM_RULE()
 
 		CIDCertFSM() :m_bCancelRead(false), m_bReading(false),
-		m_bExit(false), m_testResult(Error_Succeed), m_getDevCategory(Error_Unexpect),transImgMsg("")
+		m_bExit(false), m_bGetHeadPhotoFailed(false), m_bHeadPhotoTimeError(false), m_bFrontPhotoTimeError(false), m_bBackPhotoTimeError(false),
+		m_testResult(Error_Succeed), m_getDevCategory(Error_Unexpect), transImgMsg("")
 	{
 		ZeroMemory(&m_adapterInfo, sizeof(m_adapterInfo));
 		HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x201);
@@ -305,7 +307,7 @@ private:
 public:
 		std::string checkImgURL;
 private:
-	bool m_bCancelRead, m_bReading, m_bExit;
+	bool m_bCancelRead, m_bReading, m_bExit, m_bGetHeadPhotoFailed, m_bHeadPhotoTimeError, m_bFrontPhotoTimeError, m_bBackPhotoTimeError;
 	ErrorCodeEnum m_testResult;
 	ErrorCodeEnum m_getDevCategory;
 	DevCategoryInfo m_devCatInfo;

+ 2 - 0
Module/mod_IDCertificate/IDCertificate.xml

@@ -3,6 +3,8 @@
 	<class name="IDCertService" overlap="true" exclusive="false">
 		<oneway name="CancelRead" overlap="true" method_id="1">
 		</oneway>
+		<oneway name="Exit" overlap="true" method_id="3">
+		</oneway>
 		<!-- 1、设备未打开,errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2105 -->
 		<twoway name="GetDevInfo" overlap="true" jsflag="true" method_id="65535">
 			<req>

+ 4 - 0
Module/mod_IDCertificate/IDCertificate_UserErrorCode.h

@@ -27,6 +27,10 @@
 #define IDCertificate_UserErrorCode_FindFile_in_DepBak			0x20100220 //旧dep目录下获取到厂商文件
 #define IDCertificate_UserErrorCode_Timeout_NoCard			0x20100221 //超时未插卡
 #define IDCertificate_UserErrorCode_Timeout_OtherCard		0x20100222 //插入其他卡片(非身份证)
+#define IDCertificate_UserErrorCode_ReadAndScan_GetHeadPhotoFailed	0x20100223 //获取芯片头像图片失败
+#define IDCertificate_UserErrorCode_ReadAndScan_HeadPhotoTimeError	0x20100224 //头像图片时间异常
+#define IDCertificate_UserErrorCode_ReadAndScan_FrontPhotoTimeError	0x20100225 //正面扫描件时间异常
+#define IDCertificate_UserErrorCode_ReadAndScan_BackPhotoTimeError	0x20100226 //背面扫描件时间异常
 
 #define IDCertificate_UserErrorCode_GetImgFileTime			0x20100230 //图片文件的最近修改时间
 

+ 14 - 0
Module/mod_IDCertificate/IDCertificate_client_g.h

@@ -72,6 +72,20 @@ public:
 		return ret;
 	}
 
+	ErrorCodeEnum Exit()
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->OnewayCall(IDCertService_Method_Exit, IDCertService_MethodSignature_Exit, m_context);
+		m_context.clear();
+		return ret;
+	}
+
 	ErrorCodeEnum GetDevInfo(IDCertService_GetDevInfo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
 	{
 		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();

+ 12 - 0
Module/mod_IDCertificate/IDCertificate_def_g.h

@@ -13,18 +13,21 @@ namespace IDCertificate {
 //
 
 #define IDCertService_Method_CancelRead 1
+#define IDCertService_Method_Exit 3
 #define IDCertService_Method_GetDevInfo 65535
 #define IDCertService_Method_ReadAndScanUTF8 9
 #define IDCertService_Method_ReadAndScanUTF8JS 10
 #define IDCertService_Method_CancelReadJS 11
 
 #define IDCertService_MethodSignature_CancelRead -342104338
+#define IDCertService_MethodSignature_Exit -1158854104
 #define IDCertService_MethodSignature_GetDevInfo 296205965
 #define IDCertService_MethodSignature_ReadAndScanUTF8 1171255469
 #define IDCertService_MethodSignature_ReadAndScanUTF8JS 1636770944
 #define IDCertService_MethodSignature_CancelReadJS -1728083983
 
 #define IDCertService_LogCode_CancelRead "QLR040220101"
+#define IDCertService_LogCode_Exit "QLR040220103"
 #define IDCertService_LogCode_GetDevInfo "QLR040220199"
 #define IDCertService_LogCode_ReadAndScanUTF8 "QLR040220109"
 #define IDCertService_LogCode_ReadAndScanUTF8JS "QLR040220110"
@@ -39,6 +42,15 @@ struct IDCertService_CancelRead_Info
 
 };
 
+struct IDCertService_Exit_Info
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
 struct IDCertService_GetDevInfo_Req
 {
 

+ 27 - 0
Module/mod_IDCertificate/IDCertificate_server_g.h

@@ -37,6 +37,13 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case IDCertService_Method_Exit:
+			if (dwSignature == IDCertService_MethodSignature_Exit) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		case IDCertService_Method_GetDevInfo:
 			if (dwSignature == IDCertService_MethodSignature_GetDevInfo) {
 				bOverlap = true;
@@ -81,6 +88,11 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case IDCertService_Method_Exit:
+			if (dwSignature != IDCertService_MethodSignature_Exit) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		case IDCertService_Method_GetDevInfo:
 			if (dwSignature != IDCertService_MethodSignature_GetDevInfo) {
 				Error = Error_MethodSignatureFailed;
@@ -113,6 +125,11 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_Exit(SpOnewayCallContext<IDCertService_Exit_Info>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void Handle_GetDevInfo(SpReqAnsContext<IDCertService_GetDevInfo_Req, IDCertService_GetDevInfo_Ans>::Pointer ctx)
 	{
 	/// override by user
@@ -159,6 +176,16 @@ public:
 						Handle_CancelRead(ctx);
 					}
 					break;
+				case IDCertService_Method_Exit:
+					{
+						SpOnewayCallContext<IDCertService_Exit_Info>::Pointer ctx;
+						ctx.Attach(new SpOnewayCallContext<IDCertService_Exit_Info>());
+						SpBuffer2Object(Buf, ctx->Info);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_Exit(ctx);
+					}
+					break;
 				case IDCertService_Method_GetDevInfo:
 					{
 						SpReqAnsContext<IDCertService_GetDevInfo_Req,IDCertService_GetDevInfo_Ans>::Pointer ctx;

+ 8 - 0
Module/mod_IDCertificate/mod_IDCertificate.cpp

@@ -16,6 +16,14 @@ void IDCertServerSession::Handle_CancelReadJS(SpReqAnsContext<IDCert_CancelReadJ
 	m_pEntity->CancelReadJS(ctx);
 }
 
+
+void IDCertServerSession::Handle_Exit(SpOnewayCallContext<IDCert_Exit_Info>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("Handle_Exit");
+	m_pEntity->Exit(ctx);
+}
+
 void IDCertServerSession::Handle_GetDevInfo(SpReqAnsContext<IDCert_GetDevInfo_Req, IDCert_GetDevInfo_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();

+ 7 - 0
Module/mod_IDCertificate/mod_IDCertificate.h

@@ -19,6 +19,7 @@ public:
 	virtual ~IDCertServerSession(){}
 	virtual void Handle_CancelRead(SpOnewayCallContext<IDCert_CancelRead_Info>::Pointer ctx);
 	virtual void Handle_CancelReadJS(SpReqAnsContext<IDCert_CancelReadJS_Req, IDCert_CancelReadJS_Ans>::Pointer ctx);
+	virtual void Handle_Exit(SpOnewayCallContext<IDCert_Exit_Info>::Pointer ctx);
 	virtual void Handle_GetDevInfo(SpReqAnsContext<IDCert_GetDevInfo_Req, IDCert_GetDevInfo_Ans>::Pointer ctx);
 	virtual void Handle_ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCert_ReadAndScanUTF8_Ans>::Pointer ctx); //ex1
 	virtual void Handle_ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req, IDCert_ReadAndScanUTF8JS_Ans>::Pointer ctx);
@@ -92,6 +93,12 @@ public:
 		ctx->Answer(Error_Succeed);
 	}
 
+	void Exit(SpOnewayCallContext<IDCert_Exit_Info>::Pointer ctx)
+	{
+		FSMEvent* evt = new FSMEvent(USER_EVT_EXIT);
+		m_fsm.PostEventFIFO(evt);
+	}
+
 	void ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCert_ReadAndScanUTF8_Ans>::Pointer ctx) //ex2
 	{
 		if (!m_fsm.GetDevInitFlag())