浏览代码

Z991239-4302 #comment 同步win改动:跨机细化

oilyang 2 年之前
父节点
当前提交
ceda195f30

+ 50 - 45
Module/mod_CardReadAdapter/CardReadAdapterFSM.cpp

@@ -354,83 +354,83 @@ unsigned int CCardReadAdapterFSM::s2_on_event(FSMEvent* pEvt)
 		break;
 	case USER_EVT_SAM_IC_COMMAND:
 	{
-									 pEvt->SetHandled();
-									 SAMICCommandEvent* samice = dynamic_cast<SAMICCommandEvent*>(pEvt);
-									 SAMICCommandTask* task = new SAMICCommandTask(this);
-									 task->ctx = samice->ctx;
-									 GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		SAMICCommandEvent* samice = dynamic_cast<SAMICCommandEvent*>(pEvt);
+		SAMICCommandTask* task = new SAMICCommandTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_QUERY_PRINTER_STATUS:
 	{
-									pEvt->SetHandled();
-									QueryPrinterStatusEvent* samice = dynamic_cast<QueryPrinterStatusEvent*>(pEvt);
-									QueryPrinterStatusTask* task = new QueryPrinterStatusTask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		QueryPrinterStatusEvent* samice = dynamic_cast<QueryPrinterStatusEvent*>(pEvt);
+		QueryPrinterStatusTask* task = new QueryPrinterStatusTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_PRINT:
 	{
-									pEvt->SetHandled();
-									PrintEvent* samice = dynamic_cast<PrintEvent*>(pEvt);
-									PrintTask* task = new PrintTask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		PrintEvent* samice = dynamic_cast<PrintEvent*>(pEvt);
+		PrintTask* task = new PrintTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_QUERY_SCILIST:
 	{
-									pEvt->SetHandled();
-									QuerySCIListEvent* samice = dynamic_cast<QuerySCIListEvent*>(pEvt);
-									QuerySCIListTask* task = new QuerySCIListTask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		QuerySCIListEvent* samice = dynamic_cast<QuerySCIListEvent*>(pEvt);
+		QuerySCIListTask* task = new QuerySCIListTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_BIND_SCI:
 	{
-									pEvt->SetHandled();
-									BindSCIEvent* samice = dynamic_cast<BindSCIEvent*>(pEvt);
-									BindSCITask* task = new BindSCITask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		BindSCIEvent* samice = dynamic_cast<BindSCIEvent*>(pEvt);
+		BindSCITask* task = new BindSCITask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_PREONLINE_ON_STORE:
 	{
-									pEvt->SetHandled();
-									PreOnlineOnStoreEvent* samice = dynamic_cast<PreOnlineOnStoreEvent*>(pEvt);
-									PreOnlineOnStoreTask* task = new PreOnlineOnStoreTask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		PreOnlineOnStoreEvent* samice = dynamic_cast<PreOnlineOnStoreEvent*>(pEvt);
+		PreOnlineOnStoreTask* task = new PreOnlineOnStoreTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_GET_ADD_CARD_INFO:
 	{
-									pEvt->SetHandled();
-									GetAddCardInfoEvent* samice = dynamic_cast<GetAddCardInfoEvent*>(pEvt);
-									GetAddCardInfoTask* task = new GetAddCardInfoTask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		GetAddCardInfoEvent* samice = dynamic_cast<GetAddCardInfoEvent*>(pEvt);
+		GetAddCardInfoTask* task = new GetAddCardInfoTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_NOTIFY_PREONLINE:
 	{
-									pEvt->SetHandled();
-									NotifyPreonlineEvent* samice = dynamic_cast<NotifyPreonlineEvent*>(pEvt);
-									NotifyPreOnlineTask* task = new NotifyPreOnlineTask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		NotifyPreonlineEvent* samice = dynamic_cast<NotifyPreonlineEvent*>(pEvt);
+		NotifyPreOnlineTask* task = new NotifyPreOnlineTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_QUERY_CARD_INFO_ON_STORE:
 	{
-									pEvt->SetHandled();
-									QueryCardInfoOnStoreEvent* samice = dynamic_cast<QueryCardInfoOnStoreEvent*>(pEvt);
-									QueryCardInfoOnStoreTask* task = new QueryCardInfoOnStoreTask(this);
-									task->ctx = samice->ctx;
-									GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+		QueryCardInfoOnStoreEvent* samice = dynamic_cast<QueryCardInfoOnStoreEvent*>(pEvt);
+		QueryCardInfoOnStoreTask* task = new QueryCardInfoOnStoreTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
 	case USER_EVT_CROSS_TERM_CALL:
@@ -863,6 +863,7 @@ int CCardReadAdapterFSM::CardIssuerRead(SpReqAnsContext<CardReadAdapterService_R
 			else
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadCard, the final errCode:%d,status:%d,dwUsrErrCode:%d", eErr, ctx->Ans.status, dwUsrErrCode);
+				Sleep(300);//oilyang@20230202 for hardware entity to trans FSM state
 				ctx->Answer(eErr, dwUsrErrCode);
 			}
 		}
@@ -1385,6 +1386,7 @@ int CCardReadAdapterFSM::PostOnline(SpReqAnsContext<CardReadAdapterService_PostO
 int CCardReadAdapterFSM::EjectCard(SpReqAnsContext<CardReadAdapterService_Eject_Req, CardReadAdapterService_Eject_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
+	Sleep(100);//oilyang@20230202 for hardware entity to trans FSM state
 	ErrorCodeEnum eErr = Error_Unexpect;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before eject card,req.module %d,card in %d", ctx->Req.module,m_busCtx.eCardFromWhich);
 	DWORD dwUsrErrCode = 0;
@@ -1443,6 +1445,7 @@ int CCardReadAdapterFSM::EjectCard(SpReqAnsContext<CardReadAdapterService_Eject_
 int CCardReadAdapterFSM::CaptureCard(SpReqAnsContext<CardReadAdapterService_Capture_Req, CardReadAdapterService_Capture_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
+	Sleep(100);//oilyang@20230202 for hardware entity to trans FSM state
 	ErrorCodeEnum eErr = Error_Unexpect;
 	DWORD dwUsrErrCode = 0;
 	if (IsTheEntity(ctx->Req.module, Module_CardIssuer) && IsCardIssuerSessionOK() && m_busCtx.eCardFromWhich == Card_In_CardIssuer)
@@ -2279,6 +2282,8 @@ int CCardReadAdapterFSM::PreOnlineOnStore(SpReqAnsContext<CardReadAdapterService
 			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DupCallPreOnline_WhileInWorking);
 		else if (eErr == Error_ReplyTimeOut)
 			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardStore_Reply_TooLong);
+		else if (eErr == Error_DevNotAvailable)
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine);
 		else {
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("PreOnlineOnStore, CardIssuer PreOnlineOnStore failed return:%d", eErr));
 			ctx->Answer(eErr);

+ 9 - 0
Module/mod_CardReadAdapter/CardReadAdapterFSM.h

@@ -118,9 +118,18 @@ enum CardFromWhichEntity//卡片信息从哪个实体返回
 	Card_In_ContactlessCard,
 	Card_In_CardSwiper,
 };
+enum CardProcStage//stage of card process
+{
+	Card_ProcStage_Idle,
+	Card_ProcStage_WaitForCard,
+	Card_ProcStage_Read,
+	Card_ProcStage_Eject,
+	Card_ProcStage_Capture,
+};
 struct BusinessContext
 {
 	CardFromWhichEntity eCardFromWhich;
+	CardProcStage eCardProcStage;
 };
 enum MachineType
 {

+ 21 - 6
Module/mod_cardissuer/CardIssuerFSM.cpp

@@ -2391,14 +2391,14 @@ int CCardIssuerFSM::UnAcceptCard()
 			else
 				m_captureReason = "0000";
 			if (m_issueStatus){
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z01").setResultCode("RTA230X")("读卡器打开时,卡机有卡片,吞卡");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z01").setResultCode("RTA23A1")("读卡器打开时,卡机有卡片,吞卡");
 				errMsg = CSimpleStringA::Format("读卡器有卡(吞卡):%d, CardNoLength:%d, CardNo:%s****%s",
 					m_issueStatus, m_currCardNo.GetLength(), preFixNo.GetData(), suffixNo.GetData());
 				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_ByTerminal, errMsg.GetData());
 				return CaptureCard(NULL);
 			}
 			else{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z01").setResultCode("RTA230Y")("读卡器打开时,卡机有卡片,吐卡");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z01").setResultCode("RTA23A2")("读卡器打开时,卡机有卡片,吐卡");
 				errMsg = CSimpleStringA::Format("读卡器有卡(吐卡):%d, CardNoLength:%d, CardNo:%s****%s",
 					m_issueStatus, m_currCardNo.GetLength(), preFixNo.GetData(), suffixNo.GetData());
 				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_EjectCard_ByTerminal, errMsg.GetData());
@@ -6476,20 +6476,35 @@ void CCardIssuerFSM::NotifyPreOnline(unsigned long errCode, unsigned long findCa
 			m_crossCtx->Ans.result = data;
 			CSimpleStringA outParam = CSimpleStringA::Format("NotifyPreOnline, cardPos:%d, findCard:%d, errCode:%d", cardPos, findCard, errCode);
 			LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreOnline_ParamInfo, outParam.GetData());
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("<NotifyPreOnline>, notify result:%d, cardPos:%d, findCard:%d",errCode, cardPos, findCard));
-			if (errCode == Error_Duplication)//THE CardStore is called by other VTM
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("<NotifyPreOnline>, notify result:%d, cardPos:%d, findCard:%d", errCode, cardPos, findCard));
+			if (errCode == Error_Duplication)//THE CardStore is issuing card
 			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Q")("卡库正在被其他机器跨机使用中");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Q")("卡库正在使用中");
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_Issuing, "卡库正在使用中");
 				m_crossCtx->Answer(Error_Duplication);
 			}
 			else if (errCode == Error_TimeOut)//CardStore process cost too long!
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230W")("跨机时卡库处理耗时过长");
+				LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardStore_Reply_TooLong, "跨机时卡库处理耗时过长");
 				m_crossCtx->Answer(Error_ReplyTimeOut);
 			}
+			else if (errCode == Error_NotExist)//heartbeat service can't find the dest terminal
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Y")("跨机时卡库不在线");
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine, "跨机时卡库不在线");
+				m_crossCtx->Answer(Error_DevNotAvailable);
+			}
+			else if (errCode == Error_DevNotAvailable)//CardStore maybe called by OTHER VTM
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2310")("卡库正在被其他VTM跨机调用");
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther, "卡库正在被其他VTM跨机调用");
+				m_crossCtx->Answer(Error_Duplication);
+			}
 			else
 				m_crossCtx->Answer((ErrorCodeEnum)errCode);
-		}else{
+		}
+		else {
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2310")("超时后,才收到卡库返回");
 			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreonline_Wait_TooLong, "CardStore return after timeout.");
 		}

+ 1 - 2
Module/mod_cardissuer/CardIssuerFSM.h

@@ -852,7 +852,7 @@ public:
 
 		END_FSM_RULE()
 
-		CCardIssuerFSM() : m_pCardIssuer(NULL), m_bCancelAccept(false), m_bWaitingAccept(false),
+		CCardIssuerFSM() : m_bCancelAccept(false), m_bWaitingAccept(false),
 		m_bWaitAccepteMore(false), m_bExit(false), m_resetTimes(0), m_testResult(Error_Succeed)
 		//,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
 	,m_bCDA(false),m_pDataToARQC(NULL),m_bIssuingExit(false)
@@ -1106,7 +1106,6 @@ private:
 	DWORD m_MaintainTimeEx[HOPPER_NUM];
 	BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2], m_bdk[64], m_ksn[64];
 	CardIssuerStatus m_devStatus;
-	CardIssuerClass* m_pCardIssuer;
 	DevStateEnum m_eDevState;
 	CCardProcess* m_pCardProcess;
 	CAutoArray<CSimpleStringA> m_aidList;

+ 6 - 0
Module/mod_cardissuer/CardIssuer_UserErrorCode.h

@@ -177,4 +177,10 @@
 #define CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed		(CardIssuer_UserErrorCode_Start + 161)	//发卡时,DetectIfICCard调用ActiveICCard失败
 #define CardIssuer_UserErrorCode_Account_EAC_Mismatch				(CardIssuer_UserErrorCode_Start + 162)	//账户和户口系统的最新账户不匹配
 #define CardIssuer_UserErrorCode_CardStore_Reply_TooLong			(CardIssuer_UserErrorCode_Start + 163)	//跨机时卡库处理耗时过长
+#define CardIssuer_UserErrorCode_HopperCardMixed					(CardIssuer_UserErrorCode_Start + 164)	//卡箱中的卡片放置不对
+#define CardIssuer_UserErrorCode_CardActive_CardStore_OffLine		(CardIssuer_UserErrorCode_Start + 165)	//跨机时卡库不在线
+#define CardIssuer_UserErrorCode_ReadByRF							(CardIssuer_UserErrorCode_Start + 166)	//非接读取成功
+#define CardIssuer_UserErrorCode_CardActive_CardStore_Issuing		(CardIssuer_UserErrorCode_Start + 167)	//跨机时卡库正在本地领卡
+#define CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther	(CardIssuer_UserErrorCode_Start + 168)	//跨机时卡库正在其他VTM调用
+#define CardIssuer_UserErrorCode_ReadAccount_Cost_Time				(CardIssuer_UserErrorCode_Start + 169)	//ReadAccount耗时
 #endif //_CARDISSUER_USER_ERRORCODE_H

+ 38 - 21
Module/mod_cardissuer/mod_cardissuer.h

@@ -168,23 +168,28 @@ public:
 	void PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req, CardIssuerService_PreOnline_Ans>::Pointer ctx)
 	{
 		LOG_FUNCTION();
-		if (ctx->Req.reserved1.GetLength() > 0 && strnicmp("kaku#", (const char*)ctx->Req.reserved1, 5) == 0)
-		{
-			int state = m_fsm.GetFSMState();
-			if (state == 9)
-			{
-				ctx->Answer(Error_BridgeNotOK);
-				return;
-			}
-			else if (state != 2)
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable);
+		}
+		else {
+			if (ctx->Req.reserved1.GetLength() > 0 && strnicmp("kaku#", (const char*)ctx->Req.reserved1, 5) == 0)
 			{
-				ctx->Answer(Error_InvalidState);
-				return;
+				int state = m_fsm.GetFSMState();
+				if (state == 9)
+				{
+					ctx->Answer(Error_BridgeNotOK);
+					return;
+				}
+				else if (state != 2)
+				{
+					ctx->Answer(Error_InvalidState);
+					return;
+				}
 			}
+			PreOnlineEvent* e = new PreOnlineEvent();
+			e->ctx = ctx;
+			m_fsm.PostEventFIFO(e);
 		}
-		PreOnlineEvent* e = new PreOnlineEvent();
-		e->ctx = ctx;
-		m_fsm.PostEventFIFO(e);
 	}
 	void PostOnline(SpReqAnsContext<CardIssuerService_PostOnline_Req, CardIssuerService_PostOnline_Ans>::Pointer ctx)
 	{
@@ -306,10 +311,16 @@ public:
 	}
 	void IssueEx(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx)
 	{
-		m_bNewSessionInit = false;
-		CardIssueExEvent *pEvt = new CardIssueExEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable);
+		}
+		else {
+			m_bNewSessionInit = false;
+			CardIssueExEvent* pEvt = new CardIssueExEvent();
+			pEvt->ctx = ctx;
+			m_fsm.PostEventFIFO(pEvt);
+		}
 	}
 	void OpenSafeLock(SpReqAnsContext<CardIssuerService_OpenSafeLock_Req, CardIssuerService_OpenSafeLock_Ans>::Pointer ctx)
 	{
@@ -360,9 +371,15 @@ public:
 	}
 	void QueryCardInfoOnStore(SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req, CardIssuerService_QueryCardInfoOnStore_Ans>::Pointer ctx)
 	{
-		QueryCardInfoOnStoreEvent *pEvt = new QueryCardInfoOnStoreEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable);
+		}
+		else
+		{
+			QueryCardInfoOnStoreEvent* pEvt = new QueryCardInfoOnStoreEvent();
+			pEvt->ctx = ctx;
+			m_fsm.PostEventFIFO(pEvt);
+		}
 	}
 	void GetAddCardInfo(SpReqAnsContext<CardIssuerService_GetAddCardInfo_Req, CardIssuerService_GetAddCardInfo_Ans>::Pointer ctx)
 	{