Browse Source

Z991239-5550 #comment feat: 联机处理后JS接口实现

Signed-Off-By: commit-hook
刘文涛80174520 1 year ago
parent
commit
d867448f88

+ 84 - 0
Module/mod_cardissuerstore/CardIssuerFSM.cpp

@@ -456,6 +456,15 @@ unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt)
 				pEvt->SetHandled();
 				return 0;
 			}
+		case USER_EVT_JS_POSTONLINE:
+			{
+				PostOnlineJSEvent* pjs = dynamic_cast<PostOnlineJSEvent*>(pEvt);
+				PostOnlineJSTask* task = new PostOnlineJSTask(this);
+				task->ctx = pjs->ctx;
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+				pEvt->SetHandled();
+				return 0;
+			}
 		case USER_EVT_READ:
 			{
 				CardReadEvent* crne = dynamic_cast<CardReadEvent*>(pEvt);
@@ -718,6 +727,12 @@ unsigned int CCardIssuerFSM::s5_on_event(FSMEvent* pEvt)
 	int ret = 0;
 	switch(pEvt->iEvt)
 	{
+	case USER_EVT_JS_POSTONLINE_FINISHED:
+		{
+			pEvt->SetHandled();
+			ret = 0;
+		}
+		break;
 	case USER_EVT_READ_FINISHED:
 		{
 			pEvt->SetHandled();
@@ -8586,6 +8601,21 @@ int CCardIssuerFSM::SAMICCommandJS(SpReqAnsContext<CardIssuerStoreService_SAMICC
 	return 0;
 }
 
+int CCardIssuerFSM::PostOnlineJS(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx)
+{
+	if (m_bUseRFTillNext) {
+		return PostOnlineJS_RF(ctx);
+	}
+	bool bCtOK = false;
+	int ret = PostOnlineJS_Contact(ctx, bCtOK);
+	if (!bCtOK && IfUseRf()) {
+		return PostOnlineJS_RF(ctx);
+	}
+	else {
+		return ret;
+	}
+}
+
 DWORD CCardIssuerFSM::GetFsmStateErrCode()
 {
 	int state = GetFSMState();
@@ -8642,3 +8672,57 @@ CSimpleStringA CCardIssuerFSM::MaskCardno(const char* cardno)
 
 	return maskCardno;
 }
+
+int CCardIssuerFSM::PostOnlineJS_Contact(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx, bool& bICOK)
+{
+	LOG_FUNCTION();
+	m_pCardProcess->DataInit();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PostOnlineJS_Contact>, postOnLine data[%s]", ctx->Req.data.GetData());
+	m_pCardProcess->SplitOnlineReplyData(ctx->Req.data.GetData(), strlen(ctx->Req.data));
+	int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER_STORE, m_hDevHelper);
+	CSimpleStringA csTransEnd;
+	if (issBnkAuth == 0)
+	{
+		int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER_STORE, m_hDevHelper, m_bCDA);
+		if (transEnd == 0) {
+			csTransEnd = "TRANSEND,0";
+		}
+		else if (transEnd == 1) {
+			csTransEnd = "TRANSEND,1";
+		}
+	}
+	else {
+		csTransEnd = "TRANSEND,1";
+	}
+	ctx->Ans.result = csTransEnd;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR040222041")("<PostOnlineJS_Contact>, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
+	ctx->Answer(Error_Succeed);
+	return 0;
+}
+
+int CCardIssuerFSM::PostOnlineJS_RF(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	m_pCardProcess->DataInit();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PostOnlineJS_RF>, postOnLine data[%s]", ctx->Req.data.GetData());
+	m_pCardProcess->SplitOnlineReplyData(ctx->Req.data.GetData(), strlen(ctx->Req.data));
+	int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER_STORE_RF, m_hDevHelper);
+	CSimpleStringA csTransEnd;
+	if (issBnkAuth == 0)
+	{
+		int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER_STORE_RF, m_hDevHelper, m_bCDA);
+		if (transEnd == 0) {
+			csTransEnd = "TRANSEND,0";
+		}
+		else if (transEnd == 1) {
+			csTransEnd = "TRANSEND,1";
+		}
+	}
+	else {
+		csTransEnd = "TRANSEND,1";
+	}
+	ctx->Ans.result = csTransEnd;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR040222041")("<PostOnlineJS_RF>, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
+	ctx->Answer(Error_Succeed);
+	return 0;
+}

+ 38 - 0
Module/mod_cardissuerstore/CardIssuerFSM.h

@@ -77,6 +77,8 @@ enum EvtType
 	USER_EVT_JS_PRINT_CARD_FINISHED,
 	USER_EVT_JS_SAM_IC_COMMAND,
 	USER_EVT_JS_SAM_IC_COMMAND_FINISHED,
+	USER_EVT_JS_POSTONLINE,
+	USER_EVT_JS_POSTONLINE_FINISHED
 };
 enum SAMICCommandType
 {
@@ -895,6 +897,22 @@ public:
 	}
 };
 
+class PostOnlineJSEvent : public FSMEvent
+{
+public:
+	PostOnlineJSEvent() : FSMEvent(USER_EVT_JS_POSTONLINE) {}
+	~PostOnlineJSEvent() {}
+	SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Operate unhandled");
+			ctx->Answer(Error_Unexpect, CardIssuerStore_UserErrorCode_EntityInStateCannotProcess);
+		}
+	}
+};
+
 struct AddCardInfo
 {
 	int slot;
@@ -959,6 +977,7 @@ public:
 		FSM_RULE_ENTRY(s4, s11, USER_EVT_JS_WRITE_TRACK, 0)//JS 写卡
 		FSM_RULE_ENTRY(s4, s14, USER_EVT_JS_SAM_IC_COMMAND, 0)//JS ic交互
 		FSM_RULE_ENTRY(s4, s18, USER_EVT_JS_PRINT_CARD, 0)//JS 打印
+		FSM_RULE_ENTRY(s4, s5, USER_EVT_JS_POSTONLINE, 0)//JS 联机后处理
 		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,0)
 		FSM_RULE_ENTRY(s5,s9,USER_EVT_READ_FINISHED,1)
 		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,2)
@@ -966,6 +985,7 @@ public:
 		FSM_RULE_ENTRY(s5, s4, USER_EVT_EXIT, 0)
 		FSM_RULE_ENTRY(s5, s4, USER_EVT_PREONLINEFINISHED, 0)
 		FSM_RULE_ENTRY(s5, s4, USER_EVT_POSTONLINEFINISHED, 0)
+		FSM_RULE_ENTRY_ANY(s5, s4, USER_EVT_JS_POSTONLINE_FINISHED)//JS
 		FSM_RULE_ENTRY(s6,s7,USER_EVT_EJECTFINISHED,0)
 		FSM_RULE_ENTRY(s6,s9,USER_EVT_EJECTFINISHED,1)
 		FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
@@ -1317,11 +1337,15 @@ public:
 	int PrintCardImmediatelyJS(SpReqAnsContext<CardIssuerStoreService_PrintCardImmediatelyJS_Req, CardIssuerStoreService_PrintCardImmediatelyJS_Ans>::Pointer ctx);
 
 	int SAMICCommandJS(SpReqAnsContext<CardIssuerStoreService_SAMICCommandJS_Req, CardIssuerStoreService_SAMICCommandJS_Ans>::Pointer ctx);
+
+	int PostOnlineJS(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx);
 #pragma endregion JS接口具体实现方法
 
 #pragma region JS新增接口
 	DWORD GetFsmStateErrCode();
 	CSimpleStringA MaskCardno(const char* cardno);
+	int PostOnlineJS_Contact(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx, bool& bICOK);
+	int PostOnlineJS_RF(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx);
 #pragma endregion JS新增接口
 
 };
@@ -1672,6 +1696,20 @@ struct SAMICCommandJSTask : public ITaskSp
 	}
 };
 
+//IC交互
+struct PostOnlineJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx;
+	PostOnlineJSTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_POSTONLINE_FINISHED);
+		e->param1 = fsm->PostOnlineJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
 
 
 #pragma endregion JS接口 工作线程

+ 9 - 0
Module/mod_cardissuerstore/mod_cardissuer.cpp

@@ -251,6 +251,15 @@ void CardIssuerStoreServerSession::Handle_SAMICCommandJS(SpReqAnsContext<CardIss
 	m_pEntity->SAMICCommandJS(ctx);
 }
 
+//联机后处理
+void CardIssuerStoreServerSession::Handle_PostOnlineJS(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("Invoke PostOnlineJS");
+	m_pEntity->PostOnlineJS(ctx);
+}
+
 #pragma endregion JS接口实现
 void CCardIssuerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
 {

+ 21 - 1
Module/mod_cardissuerstore/mod_cardissuer.h

@@ -32,7 +32,7 @@ public:
 	virtual void Handle_GetDevInfo(SpReqAnsContext<CardIssuerStoreService_GetDevInfo_Req, CardIssuerStoreService_GetDevInfo_Ans>::Pointer ctx);
 	//JS接口定义
 //	virtual void Handle_ReadJS(SpReqAnsContext<CardIssuerStoreService_ReadJS_Req, CardIssuerStoreService_ReadJS_Ans>::Pointer ctx);
-//	virtual void Handle_PostOnlineJS(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx);
+	virtual void Handle_PostOnlineJS(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx);
 	virtual void Handle_EjectJS(SpReqAnsContext<CardIssuerStoreService_EjectJS_Req, CardIssuerStoreService_EjectJS_Ans>::Pointer ctx);
 	virtual void Handle_CaptureJS(SpReqAnsContext<CardIssuerStoreService_CaptureJS_Req, CardIssuerStoreService_CaptureJS_Ans>::Pointer ctx);
 	virtual void Handle_QueryInternalHasCardJS(SpReqAnsContext<CardIssuerStoreService_QueryInternalHasCardJS_Req, CardIssuerStoreService_QueryInternalHasCardJS_Ans>::Pointer ctx);
@@ -522,6 +522,26 @@ public:
 		}
 	}
 
+	void PostOnlineJS(SpReqAnsContext<CardIssuerStoreService_PostOnlineJS_Req, CardIssuerStoreService_PostOnlineJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuerStore_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Hold") != 0) {
+			//不符合请求调用,告知具体错误流程
+			DWORD errCode = m_fsm.GetFsmStateErrCode();
+			int state = m_fsm.GetFSMState();
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PostOnlineJS req is unhandled ,CurrState=%d", state);
+			ctx->Answer(Error_Unexpect, errCode);
+		}
+		else {
+			PostOnlineJSEvent* pEvt = new PostOnlineJSEvent();
+			pEvt->ctx = ctx;
+			m_fsm.PostEventFIFO(pEvt);
+		}
+	}
+
 	virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
 	virtual bool IsService()const{return true;}
 	virtual bool IsMultiThread()const{return true;}