CardIssuerStandFSM.h 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. #ifndef __CARD_ISSUER_FSM_H
  2. #define __CARD_ISSUER_FSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "CardIssuerStand_server_g.h"
  6. #include "HeartBeat_client_g.h"
  7. #include "AccessAuthorization_client_g.h"
  8. #include "HealthManager_client_g.h"
  9. #include "DevFSMCommBase.hpp"
  10. #include "CommEntityUtil.hpp"
  11. #include "CardIssuerClass.h"
  12. #include "CardAssist.h"
  13. #include "ICDataElement.h"
  14. #include "IHttpFunc.h"
  15. #include "json/json.h"
  16. #define REFLECTION(var) #var
  17. using namespace CardIssuerStand;
  18. //using namespace GUIConsole;
  19. using namespace HeartBeat;
  20. using namespace AccessAuthorization;
  21. enum EvtType
  22. {
  23. USER_EVT_TEST = EVT_USER+1,
  24. USER_EVT_QUIT,
  25. USER_EVT_INIT,
  26. USER_EVT_INITFINISHED,
  27. USER_EVT_ACCEPT,
  28. USER_EVT_ACCEPT_CANCEL,
  29. USER_EVT_ACCEPTFINISHED,
  30. USER_EVT_EJECT,
  31. USER_EVT_CAPTURE,
  32. USER_EVT_EJECTFINISHED,
  33. USER_EVT_WAITFINISHED,
  34. USER_EVT_CAPTUREFINISHED,
  35. USER_EVT_WAITFETCHINGTIMEOUT,
  36. USER_EVT_PREONLINE,
  37. USER_EVT_POSTONLINE,
  38. USER_EVT_PREONLINEFINISHED,
  39. USER_EVT_POSTONLINEFINISHED,
  40. USER_EVT_RESET,
  41. USER_EVT_RESETFINISHED,
  42. USER_EVT_EXIT,
  43. USER_EVT_READ,
  44. USER_EVT_READ_FINISHED,
  45. USER_EVT_GET_MATERIAL_EX,
  46. USER_EVT_SET_MATERIAL_EX,
  47. USER_EVT_ISSUE_EX,
  48. USER_EVT_ISSUE_EX_FINISHED,
  49. USER_EVT_BACK_TO_INIT,
  50. //新定义JS状态机事件枚举
  51. USER_EVT_JS_CAPTURE,
  52. USER_EVT_JS_CAPTURE_FINISHED,
  53. USER_EVT_JS_EJECT,
  54. USER_EVT_JS_EJECT_FINISHED,
  55. USER_EVT_JS_POSTONLINE,
  56. USER_EVT_JS_POSTONLINE_FINISHED,
  57. USER_EVT_JS_ISSUE_FROM_BOX,
  58. USER_EVT_JS_ISSUE_FROM_BOX_FINISHED,
  59. USER_EVT_JS_READ,
  60. USER_EVT_JS_READ_FINISHED,
  61. USER_EVT_JS_INSERT,
  62. USER_EVT_JS_INSERT_FINISHED,
  63. USER_EVT_JS_INSERT_CANCEL,
  64. USER_EVT_JS_EXIT_MIAN_PAGE,
  65. USER_EVT_CHECK_CARD_FINISHED
  66. };
  67. enum ReadMode
  68. {
  69. //<!--读取模式:1 读磁、2 接触IC优先、3 非接IC优先、4 非接IC、5 读磁+接触IC优先、6 读磁+非接IC优先、7 读磁+非接IC-->
  70. ReadMode_MagOnly = 1,
  71. ReadMode_ICOnly_ContactICFirst = 2,
  72. ReadMode_ICOnly_RFFirst = 3,
  73. ReadMode_ICOnly_RFOnly = 4,
  74. ReadMode_MagIC_ContactICFirst = 5,
  75. ReadMode_MagIC_RFFirst = 6,
  76. ReadMode_MagIC_RFOnly = 7,
  77. };
  78. enum CheckCardCase
  79. {
  80. CheckCard_OnOpen = 0,
  81. CheckCard_OnFail,
  82. CheckCard_OnMainPage,
  83. };
  84. typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
  85. typedef int(*lpCMBdecodeEx)( char* MagData, char * type, char * data);
  86. typedef int(__stdcall *pfEncryptDukptHSM)(unsigned char* EncryptedData, unsigned char* bdk, unsigned char* curksn, unsigned char* DecryptedData);
  87. typedef int(__stdcall *pfGetEncrypedData)(unsigned char* BDK, unsigned char* KSN, unsigned char*random, unsigned char* result);
  88. class CCardIssuerEntity;
  89. class CCardIssuerFSM;
  90. const int ONE_K = 1024;
  91. const int HOPPER_NUM = 12;
  92. struct Track2Data
  93. {
  94. int status;
  95. CSimpleStringA t2Account;
  96. CSimpleStringA t2Region;
  97. CSimpleStringA t2CardSerial;
  98. CSimpleStringA t2CVC;
  99. CSimpleStringA t2ExpireDate;
  100. };
  101. struct CMBBin
  102. {
  103. CSimpleStringA bin;//6 byte long
  104. bool bIC;//IC:true or mag:false
  105. bool bDC;//debit:true,credit:false
  106. };
  107. class CardInitFinishedEvent : public FSMEvent
  108. {
  109. public:
  110. CardInitFinishedEvent() : FSMEvent(USER_EVT_INITFINISHED){}
  111. ~CardInitFinishedEvent(){}
  112. SpReqAnsContext<CardIssuerStandService_Insert_Req,CardIssuerStandService_Insert_Ans>::Pointer ctx;
  113. protected:
  114. private:
  115. };
  116. class CardAcceptEvent : public FSMEvent
  117. {
  118. public:
  119. CardAcceptEvent() : FSMEvent(USER_EVT_ACCEPT) {}
  120. ~CardAcceptEvent() {}
  121. SpReqAnsContext<CardIssuerStandService_Insert_Req, CardIssuerStandService_Insert_Ans>::Pointer ctx;
  122. };
  123. class CancelAcceptEvent : public FSMEvent
  124. {
  125. public:
  126. CancelAcceptEvent() : FSMEvent(USER_EVT_ACCEPT_CANCEL) {}
  127. ~CancelAcceptEvent() {}
  128. };
  129. class CardReadEvent : public FSMEvent
  130. {
  131. public:
  132. CardReadEvent() : FSMEvent(USER_EVT_READ) {}
  133. ~CardReadEvent() {}
  134. SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx;
  135. protected:
  136. private:
  137. };
  138. class CardReadFinishedEvent : public FSMEvent
  139. {
  140. public:
  141. CardReadFinishedEvent() : FSMEvent(USER_EVT_READ_FINISHED) {}
  142. ~CardReadFinishedEvent() {}
  143. SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx;
  144. protected:
  145. private:
  146. };
  147. class ResetDeviceEvent : public FSMEvent
  148. {
  149. public:
  150. ResetDeviceEvent() : FSMEvent(USER_EVT_RESET){}
  151. ~ResetDeviceEvent(){}
  152. protected:
  153. private:
  154. };
  155. class ResetFinishedEvent : public FSMEvent
  156. {
  157. public:
  158. ResetFinishedEvent() : FSMEvent(USER_EVT_RESETFINISHED){}
  159. ~ResetFinishedEvent(){}
  160. protected:
  161. private:
  162. };
  163. class PreOnlineEvent : public FSMEvent
  164. {
  165. public:
  166. PreOnlineEvent() : FSMEvent(USER_EVT_PREONLINE){}
  167. ~PreOnlineEvent(){}
  168. SpReqAnsContext<CardIssuerStandService_PreOnline_Req,CardIssuerStandService_PreOnline_Ans>::Pointer ctx;
  169. protected:
  170. private:
  171. };
  172. class PostOnlineEvent : public FSMEvent
  173. {
  174. public:
  175. PostOnlineEvent() : FSMEvent(USER_EVT_POSTONLINE){}
  176. ~PostOnlineEvent(){}
  177. SpReqAnsContext<CardIssuerStandService_PostOnline_Req,CardIssuerStandService_PostOnline_Ans>::Pointer ctx;
  178. protected:
  179. private:
  180. };
  181. class CardCaptureEvent : public FSMEvent
  182. {
  183. public:
  184. CardCaptureEvent() : FSMEvent(USER_EVT_CAPTURE){}
  185. ~CardCaptureEvent(){}
  186. SpReqAnsContext<CardIssuerStandService_Capture_Req,CardIssuerStandService_Capture_Ans>::Pointer ctx;
  187. protected:
  188. private:
  189. };
  190. class CardEjectEvent : public FSMEvent
  191. {
  192. public:
  193. CardEjectEvent() : FSMEvent(USER_EVT_EJECT){}
  194. ~CardEjectEvent(){}
  195. SpReqAnsContext<CardIssuerStandService_Eject_Req,CardIssuerStandService_Eject_Ans>::Pointer ctx;
  196. protected:
  197. private:
  198. };
  199. class GetMaterialExEvent : public FSMEvent
  200. {
  201. public:
  202. GetMaterialExEvent() : FSMEvent(USER_EVT_GET_MATERIAL_EX) {}
  203. ~GetMaterialExEvent() {}
  204. SpReqAnsContext<CardIssuerStandService_GetMaterialCountEx_Req, CardIssuerStandService_GetMaterialCountEx_Ans>::Pointer ctx;
  205. protected:
  206. private:
  207. };
  208. class SetMaterialExEvent : public FSMEvent
  209. {
  210. public:
  211. SetMaterialExEvent() : FSMEvent(USER_EVT_SET_MATERIAL_EX){}
  212. ~SetMaterialExEvent(){}
  213. SpReqAnsContext<CardIssuerStandService_SetMaterialCountEx_Req, CardIssuerStandService_SetMaterialCountEx_Ans>::Pointer ctx;
  214. protected:
  215. private:
  216. };
  217. class CardIssueExEvent : public FSMEvent
  218. {
  219. public:
  220. CardIssueExEvent() : FSMEvent(USER_EVT_ISSUE_EX){}
  221. ~CardIssueExEvent(){}
  222. SpReqAnsContext<CardIssuerStandService_IssueEx_Req, CardIssuerStandService_IssueEx_Ans>::Pointer ctx;
  223. };
  224. #pragma region JS接口 event
  225. //JS接口
  226. class EjectJSEvent : public FSMEvent
  227. {
  228. public:
  229. EjectJSEvent() : FSMEvent(USER_EVT_JS_EJECT) {}
  230. ~EjectJSEvent() {}
  231. SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx;
  232. };
  233. class CaptureJSEvent : public FSMEvent
  234. {
  235. public:
  236. CaptureJSEvent() : FSMEvent(USER_EVT_JS_CAPTURE) {}
  237. ~CaptureJSEvent() {}
  238. SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx;
  239. };
  240. class PostOnlineJSEvent : public FSMEvent
  241. {
  242. public:
  243. PostOnlineJSEvent() : FSMEvent(USER_EVT_JS_POSTONLINE) {}
  244. ~PostOnlineJSEvent() {}
  245. SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx;
  246. };
  247. class IssueFromBoxJSEvent : public FSMEvent
  248. {
  249. public:
  250. IssueFromBoxJSEvent() : FSMEvent(USER_EVT_JS_ISSUE_FROM_BOX) {}
  251. ~IssueFromBoxJSEvent() {}
  252. SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx;
  253. };
  254. class InsertJSEvent : public FSMEvent
  255. {
  256. public:
  257. InsertJSEvent() : FSMEvent(USER_EVT_JS_INSERT) {}
  258. ~InsertJSEvent() {}
  259. SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx;
  260. };
  261. class CancelInsertJSEvent : public FSMEvent
  262. {
  263. public:
  264. CancelInsertJSEvent() : FSMEvent(USER_EVT_JS_INSERT_CANCEL) {}
  265. ~CancelInsertJSEvent() {}
  266. };
  267. #pragma endregion JS接口 event
  268. typedef struct CRegistSwallowCardReq : CHTTPReq {
  269. string cardNo;
  270. string cardType;
  271. string channel;
  272. string clearInstanceId;
  273. string deviceSciNo;
  274. string bankNo;
  275. string editTime;
  276. string editor;
  277. string fromFlag;
  278. string idKey;
  279. string informType;
  280. string psbCode;
  281. string reasonCode;
  282. string state;
  283. string structId;
  284. string swallowDate;
  285. string swallowTime;
  286. string terminalNo;
  287. string terminalType;
  288. string uuid;
  289. string ToJson() {
  290. Json::Value allElm, x1Arr;
  291. allElm[REFLECTION(cardNo)] = cardNo;
  292. allElm[REFLECTION(deviceSciNo)] = deviceSciNo;
  293. allElm[REFLECTION(reasonCode)] = reasonCode;
  294. allElm[REFLECTION(swallowDate)] = swallowDate;
  295. allElm[REFLECTION(swallowTime)] = swallowTime;
  296. allElm[REFLECTION(terminalNo)] = terminalNo;
  297. allElm[REFLECTION(terminalType)] = terminalType;
  298. Json::FastWriter writer;
  299. string ret = writer.write(allElm);
  300. return ret;
  301. }
  302. } CRegistSwallowCardReq;
  303. typedef struct CRegistSwallowCardRet : CHTTPRet {
  304. struct returnInfo {
  305. string returnCode;
  306. string errorMsg;
  307. }returnInfo;
  308. struct data {
  309. }data;
  310. bool Parse(string strData) {
  311. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(strData.c_str());
  312. Json::Value root, tmpZ1;
  313. Json::Reader reader;
  314. if (!reader.parse(strData, root, false))
  315. {
  316. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("reader.parse false");
  317. return false;
  318. }
  319. if (!root["returnInfo"].isNull()) {
  320. returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString();
  321. return true;
  322. }
  323. else {
  324. return false;//报文结构不对,解析失败
  325. }
  326. //returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString();
  327. }
  328. } CRegistSwallowCardRet;
  329. // 同步卡库计数到后台服务实体类
  330. struct SyncMaterialCountInfo
  331. {
  332. CSimpleStringA strDeviceNo;
  333. unsigned int dwCardBoxNum;
  334. CAutoArray<bool> arrMaintainFlag;
  335. CAutoArray<CSimpleStringA> arrMaintainer;
  336. CAutoArray<unsigned int> arrMaintainTime;
  337. CAutoArray<CSimpleStringA> arrCardBoxNo;
  338. CAutoArray<CSimpleStringA> arrPsbCode;
  339. CAutoArray<CSimpleStringA> arrPsbName;
  340. CAutoArray<unsigned int> arrCardInit;
  341. CAutoArray<unsigned int> arrCardRemains;
  342. CAutoArray<unsigned int> arrCardIssued;
  343. CAutoArray<unsigned int> arrCardMixed;
  344. CAutoArray<unsigned int> arrCardPercent;
  345. };
  346. struct SyncMaterialCountReq1
  347. {
  348. char TerminalNo[16];
  349. char DeviceNo[16];
  350. char Material[16];
  351. DWORD CardBoxNum;
  352. };
  353. struct SyncMaterialCountReq2
  354. {
  355. bool bMaintain;
  356. char Maintainer[16];
  357. DWORD MaintainTime;
  358. char CardBoxNo[20];
  359. char PsbCode[8];
  360. char PsbName[128];
  361. DWORD CardInit;
  362. DWORD CardRemains;
  363. DWORD CardIssued;
  364. DWORD CardMixed;
  365. DWORD CardPercent;
  366. };
  367. struct SyncMaterialCountHTTPReq : CHTTPReq {
  368. SyncMaterialCountHTTPReq() { m_timeOut = 30; }
  369. SyncMaterialCountReq1 reqInfo;
  370. std::vector<SyncMaterialCountReq2> reqData;
  371. virtual string ToJson() {
  372. Json::Value root;
  373. Json::Value arrayObj;
  374. root["terminalNo"] = reqInfo.TerminalNo;
  375. root["deviceNo"] = reqInfo.DeviceNo;
  376. root["materiel"] = reqInfo.Material;
  377. root["cardBoxNum"] = (int)reqInfo.CardBoxNum;
  378. for (int i = 0; i <= reqInfo.CardBoxNum; i++)
  379. {
  380. Json::Value item;
  381. item["CardBoxNo"] = reqData[i].CardBoxNo;
  382. item["PsbCode"] = reqData[i].PsbCode;
  383. item["PsbName"] = reqData[i].PsbName;
  384. item["CardInit"] = (int)reqData[i].CardInit;
  385. item["CardRemains"] = (int)reqData[i].CardRemains;
  386. item["CardIssued"] = (int)reqData[i].CardIssued;
  387. item["CardMixed"] = (int)reqData[i].CardMixed;
  388. item["CardPercent"] = (int)reqData[i].CardPercent;
  389. item["Maintainer"] = reqData[i].Maintainer;
  390. if (reqData[i].MaintainTime == 0)
  391. item["MaintainTime"] = "";
  392. else {
  393. item["MaintainTime"] = CSmallDateTime::GetNow().ToTimeString().GetData();
  394. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MaintainTime:%d", (DWORD)CSmallDateTime::GetNow());
  395. }
  396. item["bMaintain"] = reqData[i].bMaintain;
  397. arrayObj.append(item);
  398. }
  399. root["cardIssueList"] = arrayObj;
  400. return root.toStyledString();
  401. }
  402. };
  403. struct SyncMaterialCountHTTPRet : CHTTPRet {
  404. string m_retStr;
  405. bool Parse(string strData) {
  406. m_retStr = strData;
  407. return true;
  408. }
  409. };
  410. class CCardIssuerFSM : public CCommDevFSM<CCardIssuerFSM, CardIssuerClass>, public IFSMStateHooker
  411. {
  412. public:
  413. enum { s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12 };
  414. BEGIN_FSM_STATE(CCardIssuerFSM)
  415. FSM_STATE_ENTRY(s0, "Init", s0_on_entry, s0_on_exit, s0_on_event)
  416. FSM_STATE_ENTRY(s1, "Initializing", s1_on_entry, s1_on_exit, s1_on_event)
  417. FSM_STATE_ENTRY(s2, "Idle", s2_on_entry, s2_on_exit, s2_on_event)
  418. FSM_STATE_ENTRY(s3, "Accepting", s3_on_entry, s3_on_exit, s3_on_event)
  419. FSM_STATE_ENTRY(s4, "Hold", s4_on_entry, s4_on_exit, s4_on_event)
  420. FSM_STATE_ENTRY(s5, "Reading", s5_on_entry, s5_on_exit, s5_on_event)
  421. FSM_STATE_ENTRY(s6, "Ejecting", s6_on_entry, s6_on_exit, s6_on_event)
  422. FSM_STATE_ENTRY(s7, "WaitFetching", s7_on_entry, s7_on_exit, s7_on_event)
  423. FSM_STATE_ENTRY(s8, "Capturing", s8_on_entry, s8_on_exit, s8_on_event)
  424. FSM_STATE_ENTRY(s9, "Failed", s9_on_entry, s9_on_exit, s9_on_event)
  425. FSM_STATE_ENTRY(s10, "Issuing", s10_on_entry, s10_on_exit, s10_on_event)
  426. FSM_STATE_ENTRY(s11, "ReadJSing", s11_on_entry, s11_on_exit, s11_on_event)
  427. FSM_STATE_ENTRY(s12, "IssueJSing", s12_on_entry, s12_on_exit, s12_on_event)
  428. END_FSM_STATE()
  429. BEGIN_FSM_RULE(CCardIssuerFSM, s0)
  430. FSM_RULE_ENTRY(s0, s2, USER_EVT_TEST, 0)
  431. FSM_RULE_ENTRY(s0, s1, USER_EVT_INIT, 0)
  432. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  433. FSM_RULE_ENTRY(s1, s2, USER_EVT_INITFINISHED, 0)
  434. FSM_RULE_ENTRY(s1, s9, USER_EVT_INITFINISHED, 1)
  435. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  436. FSM_RULE_ENTRY(s2, s3, USER_EVT_ACCEPT, 0)
  437. // FSM_RULE_ENTRY(s2,s9,USER_EVT_ACCEPT,1)
  438. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  439. FSM_RULE_ENTRY(s2, s10, USER_EVT_ISSUE_EX, 0)
  440. FSM_RULE_ENTRY(s2, s3, USER_EVT_JS_INSERT, 0)//JS 插卡
  441. FSM_RULE_ENTRY(s2, s12, USER_EVT_JS_ISSUE_FROM_BOX, 0)//JS 卡箱发卡
  442. FSM_RULE_ENTRY(s3, s4, USER_EVT_ACCEPTFINISHED, 0)
  443. FSM_RULE_ENTRY(s3, s9, USER_EVT_ACCEPTFINISHED, 1)//设置进卡报错
  444. FSM_RULE_ENTRY(s3, s2, USER_EVT_ACCEPTFINISHED, 2)
  445. FSM_RULE_ENTRY(s3, s2, USER_EVT_ACCEPTFINISHED, 3)
  446. FSM_RULE_ENTRY(s3, s7, USER_EVT_ACCEPTFINISHED, 4)
  447. FSM_RULE_ENTRY(s3, s9, USER_EVT_ACCEPTFINISHED, 5)//查询硬件报错
  448. FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  449. FSM_RULE_ENTRY(s3, s4, USER_EVT_JS_INSERT_FINISHED, 0)//JS 插卡成功
  450. FSM_RULE_ENTRY(s3, s9, USER_EVT_JS_INSERT_FINISHED, 1)//JS 设置进卡报错
  451. FSM_RULE_ENTRY(s3, s2, USER_EVT_JS_INSERT_FINISHED, 2)//JS 超时
  452. FSM_RULE_ENTRY(s3, s2, USER_EVT_JS_INSERT_FINISHED, 3)//JS 取消
  453. FSM_RULE_ENTRY(s3, s6, USER_EVT_JS_INSERT_FINISHED, 4)//JS 取消时有卡,吐卡
  454. FSM_RULE_ENTRY(s3, s9, USER_EVT_JS_INSERT_FINISHED, 5)//JS 查询硬件报错
  455. FSM_RULE_ENTRY(s4, s5, USER_EVT_READ, 0)
  456. FSM_RULE_ENTRY(s4, s6, USER_EVT_EJECT, 0)
  457. FSM_RULE_ENTRY(s4, s8, USER_EVT_ACCEPT, 0)//???
  458. FSM_RULE_ENTRY(s4, s8, USER_EVT_CAPTURE, 0)
  459. FSM_RULE_ENTRY(s4, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  460. FSM_RULE_ENTRY(s4, s5, USER_EVT_PREONLINE, 0)
  461. FSM_RULE_ENTRY(s4, s5, USER_EVT_POSTONLINE, 0)
  462. FSM_RULE_ENTRY(s4, s11, USER_EVT_JS_READ, 0)//JS 读卡
  463. FSM_RULE_ENTRY(s4, s11, USER_EVT_JS_POSTONLINE, 0)//JS 联机后
  464. FSM_RULE_ENTRY(s4, s6, USER_EVT_JS_EJECT, 0)//JS 吐卡
  465. FSM_RULE_ENTRY(s4, s8, USER_EVT_JS_CAPTURE, 0)//JS 吞卡
  466. FSM_RULE_ENTRY(s4, s2, USER_EVT_CHECK_CARD_FINISHED, 0)
  467. FSM_RULE_ENTRY(s4, s9, USER_EVT_CHECK_CARD_FINISHED, 1)
  468. FSM_RULE_ENTRY(s4, s6, EVT_MAINPAGE_DISPLAY, 0)
  469. FSM_RULE_ENTRY(s4, s8, EVT_MAINPAGE_DISPLAY, 1)
  470. FSM_RULE_ENTRY(s5, s4, USER_EVT_READ_FINISHED, 0)
  471. FSM_RULE_ENTRY(s5, s9, USER_EVT_READ_FINISHED, 1)
  472. FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  473. FSM_RULE_ENTRY(s5, s4, USER_EVT_PREONLINEFINISHED, 0)
  474. FSM_RULE_ENTRY(s5, s4, USER_EVT_POSTONLINEFINISHED, 0)
  475. FSM_RULE_ENTRY(s6, s7, USER_EVT_EJECTFINISHED, 0)
  476. FSM_RULE_ENTRY(s6, s9, USER_EVT_EJECTFINISHED, 1)
  477. FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  478. FSM_RULE_ENTRY(s6, s2, USER_EVT_JS_EJECT_FINISHED, 0)//JS 吐卡取卡成功,取卡超时吞卡成功
  479. FSM_RULE_ENTRY(s6, s9, USER_EVT_JS_EJECT_FINISHED, 1)//JS 吐卡失败,取卡超时吞卡失败
  480. FSM_RULE_ENTRY(s7, s2, USER_EVT_WAITFINISHED, 0)
  481. FSM_RULE_ENTRY(s7, s9, USER_EVT_WAITFINISHED, 1)
  482. FSM_RULE_ENTRY(s7, s8, USER_EVT_WAITFINISHED, 2)
  483. FSM_RULE_ENTRY(s7, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  484. FSM_RULE_ENTRY(s8, s2, USER_EVT_CAPTUREFINISHED, 0)
  485. FSM_RULE_ENTRY(s8, s9, USER_EVT_CAPTUREFINISHED, 1)
  486. FSM_RULE_ENTRY(s8, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  487. FSM_RULE_ENTRY(s8, s2, USER_EVT_JS_CAPTURE_FINISHED, 0)//JS 吞卡成功
  488. FSM_RULE_ENTRY(s8, s9, USER_EVT_JS_CAPTURE_FINISHED, 1)//JS 吞卡失败
  489. FSM_RULE_ENTRY(s9, s2, USER_EVT_CHECK_CARD_FINISHED, 0)
  490. FSM_RULE_ENTRY(s9, s4, USER_EVT_CHECK_CARD_FINISHED, 2)
  491. FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  492. FSM_RULE_ENTRY(s10, s4, USER_EVT_ISSUE_EX_FINISHED, 0)
  493. FSM_RULE_ENTRY(s10, s9, USER_EVT_ISSUE_EX_FINISHED, 1)
  494. FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 2)
  495. FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  496. FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 8)
  497. FSM_RULE_ENTRY(s11, s4, USER_EVT_JS_READ_FINISHED, 0)//JS 读卡结果返回
  498. FSM_RULE_ENTRY(s11, s4, USER_EVT_JS_POSTONLINE_FINISHED, 0)//JS
  499. FSM_RULE_ENTRY(s12, s4, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 0)//JS 发卡成功
  500. FSM_RULE_ENTRY(s12, s2, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 1)//JS 发卡失败
  501. FSM_RULE_ENTRY(s12, s9, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 2)//JS 发卡故障
  502. FSM_RULE_ENTRY(s12, s8, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 3)//JS 退回首页进行吞卡
  503. END_FSM_RULE()
  504. CCardIssuerFSM() : m_bCancelAccept(false), m_bWaitingAccept(false),
  505. m_bWaitAccepteMore(false), m_bExit(false), m_resetTimes(0), m_testResult(Error_Succeed)
  506. //,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
  507. , m_bCDA(false), m_pDataToARQC(NULL)
  508. , m_bCardIssued(false), m_issueStatus(1), m_currCardNo("")
  509. , m_captureReason(""), m_machineType(1), m_currentHopper(1), m_hopperNum(1)
  510. , m_bSettingMaterial(false), m_addCardSerial("")
  511. , m_bCancelByRFIC(false), m_devOpenFailedCount(0), m_bSingleMagOrIC(false)
  512. , m_bCardFromHopper(true), m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("")
  513. , m_bCancelInsert(false), m_iCheckCardInInterval(200), m_bMainPageWhileWorking(false)
  514. {
  515. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
  516. cmdDecodeMag2 = NULL;
  517. cmdDecodeEx = NULL;
  518. m_aidList.Init(3);
  519. m_aidList[0] = "A000000333";
  520. m_aidList[1] = "A0000000108888";
  521. m_aidList[2] = "A000000790";
  522. }
  523. ~CCardIssuerFSM() {}
  524. virtual ErrorCodeEnum OnInit();
  525. virtual ErrorCodeEnum OnExit();
  526. void s0_on_entry();
  527. void s0_on_exit();
  528. unsigned int s0_on_event(FSMEvent* event);
  529. void s1_on_entry();
  530. void s1_on_exit();
  531. unsigned int s1_on_event(FSMEvent* event);
  532. void s2_on_entry();
  533. void s2_on_exit();
  534. unsigned int s2_on_event(FSMEvent* event);
  535. void s3_on_entry();
  536. void s3_on_exit();
  537. unsigned int s3_on_event(FSMEvent* event);
  538. void s4_on_entry();
  539. void s4_on_exit();
  540. unsigned int s4_on_event(FSMEvent* event);
  541. void s5_on_entry();
  542. void s5_on_exit();
  543. unsigned int s5_on_event(FSMEvent* event);
  544. void s6_on_entry();
  545. void s6_on_exit();
  546. unsigned int s6_on_event(FSMEvent* event);
  547. void s7_on_entry();
  548. void s7_on_exit();
  549. unsigned int s7_on_event(FSMEvent* event);
  550. void s8_on_entry();
  551. void s8_on_exit();
  552. unsigned int s8_on_event(FSMEvent* event);
  553. void s9_on_entry();
  554. void s9_on_exit();
  555. unsigned int s9_on_event(FSMEvent* event);
  556. void s10_on_entry();
  557. void s10_on_exit();
  558. unsigned int s10_on_event(FSMEvent* event);
  559. void s11_on_entry();
  560. void s11_on_exit();
  561. unsigned int s11_on_event(FSMEvent* event);
  562. void s12_on_entry();
  563. void s12_on_exit();
  564. unsigned int s12_on_event(FSMEvent* event);
  565. ErrorCodeEnum OpenDevice(BYTE btOpenType, const char* pDevSN);
  566. int Initial();
  567. int CheckIfHasCardOnCase(CheckCardCase eCase);
  568. int CaptureCard(SpReqAnsContext<CardIssuerStandService_Capture_Req, CardIssuerStandService_Capture_Ans>::Pointer ctx);
  569. int EjectCard(SpReqAnsContext<CardIssuerStandService_Eject_Req, CardIssuerStandService_Eject_Ans>::Pointer ctx);
  570. int WaitFetchingCard();
  571. int ReadCard(SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx);
  572. int PreOnline(SpReqAnsContext<CardIssuerStandService_PreOnline_Req, CardIssuerStandService_PreOnline_Ans>::Pointer ctx);
  573. int PostOnline(SpReqAnsContext<CardIssuerStandService_PostOnline_Req, CardIssuerStandService_PostOnline_Ans>::Pointer ctx);
  574. int ReadCard_Contact(SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx, bool bContinue);
  575. int PreOnline_Contact(SpReqAnsContext<CardIssuerStandService_PreOnline_Req, CardIssuerStandService_PreOnline_Ans>::Pointer ctx, bool& bICOK);
  576. int PostOnline_Contact(SpReqAnsContext<CardIssuerStandService_PostOnline_Req, CardIssuerStandService_PostOnline_Ans>::Pointer ctx, bool& bICOK);
  577. int ReadCard_RF(SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx);
  578. int PreOnline_RF(SpReqAnsContext<CardIssuerStandService_PreOnline_Req, CardIssuerStandService_PreOnline_Ans>::Pointer ctx);
  579. int PostOnline_RF(SpReqAnsContext<CardIssuerStandService_PostOnline_Req, CardIssuerStandService_PostOnline_Ans>::Pointer ctx);
  580. int InternalAcceptCard(SpReqAnsContext<CardIssuerStandService_Insert_Req, CardIssuerStandService_Insert_Ans>::Pointer ctx);
  581. int AcceptCard(SpReqAnsContext<CardIssuerStandService_Insert_Req, CardIssuerStandService_Insert_Ans>::Pointer ctx);
  582. int IssueCard(SpReqAnsContext<CardIssuerStandService_IssueEx_Req, CardIssuerStandService_IssueEx_Ans>::Pointer ctxEx);
  583. bool GetWaitFlag() { return m_bWaitingAccept; }
  584. void SetWaitMore() { m_bWaitAccepteMore = true; }
  585. void SetExitFlag(bool bFlag = true) { m_bExit = bFlag; }
  586. void FSMSetIssueFlag(int value) { m_issueStatus = value; }
  587. int QueryIssueFlag() { return m_issueStatus; }
  588. bool SetCardCaptured(const int num, bool bNewClear = false);
  589. bool SetCardIssued(const int num, const int hopper);
  590. bool SetCardRemains(const int num, const int hopper, bool bInit = false);
  591. bool SetCardMixed(const int num, const int hopper);
  592. ErrorCodeEnum MachineMoveCardBackNotHold();
  593. ErrorCodeEnum MachineMoveCardFrontGate(bool bInBussiness = false);
  594. void SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext);
  595. DevStateEnum GetDevState() const
  596. {
  597. if ((m_eDevState == DEVICE_STATUS_NORMAL)
  598. && ((m_bHasHopper[0] && m_mixedEx[0] >= 3) || !m_bHasHopper[0])
  599. && ((m_bHasHopper[1] && m_mixedEx[1] >= 3) || !m_bHasHopper[1])
  600. && ((m_bHasHopper[2] && m_mixedEx[2] >= 3) || !m_bHasHopper[2]))
  601. return DEVICE_STATUS_MAINTAINCE;
  602. else
  603. return m_eDevState;
  604. }
  605. int QueryCardPos();
  606. int UpdateLocalRunCfg(CAutoArray<int> hopperArr);
  607. int SyncDataToDB(bool bMaintain[12], bool bSetCaptured = true);//同步物料计数
  608. void SetHopperNum(int hopperNum);
  609. void DecodeTracksData(const char* track2, DWORD dwT2size, const char* track3, DWORD dwT3size, char*& magData, bool bT2OK = true, bool bT3OK = true);
  610. void GetCardInfo(int& findCard, int& cardPos)
  611. {
  612. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("<GetCardInfo>, findCard:%d, cardPos:%d", findCard, cardPos));
  613. findCard = m_findCard;
  614. cardPos = m_cardPos;
  615. }
  616. int SplitDevModelInfo();
  617. void SetCancelByRFICFlag(bool bCancel = true) { m_bCancelByRFIC = bCancel; }
  618. CSimpleStringA GetPreOnlineICCardNo() { return m_currCardNo; }
  619. void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false);
  620. static void HttpsLogCallBack(const char* logtxt);
  621. void QueryCIStatus(SpReqAnsContext<CardIssuerStandService_QueryCIStatus_Req, CardIssuerStandService_QueryCIStatus_Ans>::Pointer ctx);
  622. bool RegistCardWhileCaptureCard(CSimpleStringA cardno);
  623. bool SyncMaterialCount(IHttpFunc* client, SyncMaterialCountInfo syncInfo);
  624. protected:
  625. int m_iInsertTries;
  626. int m_resetTries;
  627. int m_ejectTries;
  628. private:
  629. ///
  630. int m_resetTimes;
  631. lpCMBdecodeMag2 cmdDecodeMag2;
  632. lpCMBdecodeEx cmdDecodeEx;
  633. bool m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore, m_bExit
  634. , m_bCDA, m_bCardIssued, m_bHasHopper[HOPPER_NUM]
  635. , m_bSettingMaterial, m_bCancelByRFIC, m_bSingleMagOrIC
  636. , m_bCardActiveNotify, m_bCardFromHopper, m_bMainPageWhileWorking/*Accepting、Read(JS)ing、Issue(JS)ing*/;
  637. bool m_bSupportRF, m_bUseRFTillNext;//if ReadCard by RF,the following PreOnline & PostOnline always use RF till the next card(insert/issue)
  638. ErrorCodeEnum m_testResult;
  639. int m_CardCaptured;
  640. int m_issueStatus/*the status maybe changed by Business call*/;
  641. //1:default, 2:SCI, 3:no cfg
  642. int m_machineType;
  643. int m_currentHopper, m_devOpenFailedCount;
  644. int m_maxSlot, m_findCard, m_cardPos, m_maxRetainCount, m_iCheckCardInInterval;
  645. CSimpleStringA m_CardBoxNoEx[HOPPER_NUM], m_PsbCodeEx[HOPPER_NUM], m_PsbNameEx[HOPPER_NUM], m_MaintainerEx[HOPPER_NUM], m_csMaintainTimeEx[HOPPER_NUM];
  646. int m_CardInitEx[HOPPER_NUM], m_CardPercentEx[HOPPER_NUM], m_remainsEx[HOPPER_NUM], m_issuedEx[HOPPER_NUM], m_mixedEx[HOPPER_NUM], m_hopperNum;
  647. DWORD m_MaintainTimeEx[HOPPER_NUM];
  648. BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2];
  649. CardIssuerStatus m_devStatus;
  650. CCardProcess* m_pCardProcess;
  651. CAutoArray<CSimpleStringA> m_aidList;
  652. char* m_pDataToARQC;
  653. long xxTest;
  654. CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_terminalNo, m_addCardSerial, m_rfVendorList, m_csRF;
  655. char m_AuthCode[2];
  656. vector<CMBBin> m_vBin;
  657. int SplitTrack2(CSimpleStringA pTrack2, Track2Data& decodeData);
  658. bool JustReadCardNo();
  659. bool IsValidCardNo(const char*, int);
  660. void GetVendorDllName(CSimpleStringA& dllName);
  661. bool LoadCMBPrint(CSimpleStringA csBinPath);
  662. DevCategoryInfo m_devCat;
  663. bool ToRegistCaptureCardInfo();
  664. void CheckSupportRf();
  665. CSimpleStringA m_csSwallowCardUrl, m_csSyncMaterialUrl;
  666. MagTracks m_magTracks;
  667. public:
  668. int EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx);
  669. int CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx);
  670. void QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx);
  671. int PostOnlineJS(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx);
  672. int IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx);
  673. int ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
  674. int InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx);
  675. int PostOnlineJS_Contact(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx, bool& bICOK);
  676. int PostOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx);
  677. void ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
  678. int PreOnlineJS_ReadViaContact(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool bContinue);
  679. int PreOnlineJS_ReadViaRF(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool bContinue);
  680. int PreOnlineJS_ICDataProcess(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
  681. CSimpleStringA MaskCardno(const char* cardno);
  682. void SetDoExitFlag(bool bFlag) { m_bDoExit = bFlag; }
  683. virtual void OnStateTrans(int iSrcState, int iDstState);
  684. CSimpleStringA getRTACode(DWORD dwUserCode) {
  685. CSimpleStringA rtaMsg = this->GetEntityBase()->GetFunction()->UserCodeToRTACode(dwUserCode);
  686. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("rtaMsg=%s", rtaMsg.GetData());
  687. return rtaMsg;
  688. }
  689. private:
  690. bool m_bCancelInsert;
  691. bool m_bDoExit;
  692. ULLINT m_ullBeginTime, m_ullEndTime;
  693. BYTE m_btCID/*9f27*/;
  694. void FSMEventDefaultProcess(FSMEvent* pEvt, DWORD dwUserCode);
  695. CSimpleStringA GetErrMsgByCode(DWORD dwCode);
  696. void GetDevApiCodeAndName(int retValue, DWORD& dwDevApiCode, CSimpleStringA& csDevApiName);
  697. };
  698. class ReadJSEvent : public FSMEvent
  699. {
  700. public:
  701. ReadJSEvent() : FSMEvent(USER_EVT_JS_READ){}
  702. ~ReadJSEvent() {}
  703. SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx;
  704. };
  705. struct InitTask : public ITaskSp
  706. {
  707. CCardIssuerFSM* fsm;
  708. InitTask(CCardIssuerFSM* f) : fsm(f) {}
  709. void Process()
  710. {
  711. FSMEvent *e = new FSMEvent(USER_EVT_INITFINISHED);
  712. e->param1 = fsm->Initial();
  713. fsm->PostEventFIFO(e);
  714. }
  715. };
  716. struct AcceptTask : public ITaskSp
  717. {
  718. CCardIssuerFSM* fsm;
  719. SpReqAnsContext<CardIssuerStandService_Insert_Req, CardIssuerStandService_Insert_Ans>::Pointer ctx;
  720. AcceptTask(CCardIssuerFSM* f) : fsm(f) {}
  721. void Process()
  722. {
  723. LOG_FUNCTION();
  724. FSMEvent *e = new FSMEvent(USER_EVT_ACCEPTFINISHED);
  725. e->param1 = fsm->AcceptCard(ctx);
  726. fsm->PostEventFIFO(e);
  727. }
  728. };
  729. struct IssueTask : public ITaskSp
  730. {
  731. CCardIssuerFSM* fsm;
  732. SpReqAnsContext<CardIssuerStandService_IssueEx_Req, CardIssuerStandService_IssueEx_Ans>::Pointer ctxEx;
  733. IssueTask(CCardIssuerFSM* f) : fsm(f) {}
  734. void Process()
  735. {
  736. LOG_FUNCTION();
  737. FSMEvent *e = new FSMEvent(USER_EVT_ISSUE_EX_FINISHED);
  738. e->param1 = fsm->IssueCard(ctxEx);
  739. fsm->PostEventFIFO(e);
  740. }
  741. };
  742. struct ReadTask : public ITaskSp
  743. {
  744. SpReqAnsContext<CardIssuerStandService_Read_Req,CardIssuerStandService_Read_Ans>::Pointer ctx;
  745. CCardIssuerFSM* fsm;
  746. ReadTask(CCardIssuerFSM* f) : fsm(f) {}
  747. void Process()
  748. {
  749. CardReadFinishedEvent *e = new CardReadFinishedEvent();
  750. e->ctx = ctx;
  751. e->param1 = fsm->ReadCard(ctx);
  752. fsm->PostEventFIFO(e);
  753. }
  754. };
  755. struct PreOnlineTask : public ITaskSp
  756. {
  757. SpReqAnsContext<CardIssuerStandService_PreOnline_Req,CardIssuerStandService_PreOnline_Ans>::Pointer ctx;
  758. CCardIssuerFSM* fsm;
  759. PreOnlineTask(CCardIssuerFSM* f) : fsm(f) {}
  760. void Process()
  761. {
  762. FSMEvent *e = new FSMEvent(USER_EVT_PREONLINEFINISHED);
  763. e->param1 = fsm->PreOnline(ctx);//oilyang@20220611 实际上,为简化处理,PreOnline函数默认返回0
  764. fsm->PostEventFIFO(e);
  765. }
  766. };
  767. struct PostOnlineTask : public ITaskSp
  768. {
  769. SpReqAnsContext<CardIssuerStandService_PostOnline_Req,CardIssuerStandService_PostOnline_Ans>::Pointer ctx;
  770. CCardIssuerFSM* fsm;
  771. PostOnlineTask(CCardIssuerFSM* f) : fsm(f) {}
  772. void Process()
  773. {
  774. FSMEvent *e = new FSMEvent(USER_EVT_POSTONLINEFINISHED);
  775. e->param1 = fsm->PostOnline(ctx);
  776. fsm->PostEventFIFO(e);
  777. }
  778. };
  779. struct CaptureTask : public ITaskSp
  780. {
  781. CCardIssuerFSM* fsm;
  782. SpReqAnsContext<CardIssuerStandService_Capture_Req,CardIssuerStandService_Capture_Ans>::Pointer ctx;
  783. CaptureTask(CCardIssuerFSM* f) : fsm(f) {}
  784. void Process()
  785. {
  786. FSMEvent *e = new FSMEvent(USER_EVT_CAPTUREFINISHED);
  787. e->param1 = fsm->CaptureCard(ctx);
  788. fsm->PostEventFIFO(e);
  789. }
  790. };
  791. struct EjectTask : public ITaskSp
  792. {
  793. SpReqAnsContext<CardIssuerStandService_Eject_Req,CardIssuerStandService_Eject_Ans>::Pointer ctx;
  794. CCardIssuerFSM* fsm;
  795. EjectTask(CCardIssuerFSM* f) : fsm(f) {}
  796. void Process()
  797. {
  798. FSMEvent *e = new FSMEvent(USER_EVT_EJECTFINISHED);
  799. e->param1 = fsm->EjectCard(ctx);
  800. fsm->PostEventFIFO(e);
  801. }
  802. };
  803. struct WaitFetchingTask : public ITaskSp
  804. {
  805. CCardIssuerFSM* fsm;
  806. WaitFetchingTask(CCardIssuerFSM* f) : fsm(f) {}
  807. void Process()
  808. {
  809. FSMEvent *e = new FSMEvent(USER_EVT_WAITFINISHED);
  810. e->param1 = fsm->WaitFetchingCard();
  811. fsm->PostEventFIFO(e);
  812. }
  813. };
  814. struct DoCheckCardTask : public ITaskSp
  815. {
  816. CCardIssuerFSM* fsm;
  817. CheckCardCase eCase;
  818. DoCheckCardTask(CCardIssuerFSM* f, CheckCardCase eCase) : fsm(f) {}
  819. void Process()
  820. {
  821. FSMEvent* e = new FSMEvent(USER_EVT_CHECK_CARD_FINISHED);
  822. e->param1 = fsm->CheckIfHasCardOnCase(eCase);
  823. fsm->PostEventFIFO(e);
  824. }
  825. };
  826. struct RegistCaptureCardInfoTask : public ITaskSp
  827. {
  828. CCardIssuerFSM* fsm;
  829. CSimpleStringA cardno;
  830. RegistCaptureCardInfoTask(CCardIssuerFSM* f, CSimpleStringA cardno) : fsm(f),cardno(cardno) {}
  831. void Process()
  832. {
  833. fsm->RegistCardWhileCaptureCard(cardno);
  834. }
  835. };
  836. struct SyncMaterialCountTask : public ITaskSp
  837. {
  838. CCardIssuerFSM* fsm;
  839. SyncMaterialCountInfo syncInfo;
  840. SyncMaterialCountTask(CCardIssuerFSM* f, SyncMaterialCountInfo syncMaterialInfo){
  841. fsm = f;
  842. syncInfo = syncMaterialInfo;
  843. }
  844. void Process()
  845. {
  846. LOG_FUNCTION();
  847. //同步物料信息
  848. IHttpFunc* client;
  849. client = create_http(fsm->HttpsLogCallBack);
  850. bool ret = fsm->SyncMaterialCount(client,syncInfo);
  851. client->Destory();
  852. }
  853. };
  854. #pragma region JS接口 工作线程
  855. //吐卡
  856. struct EjectJSTask : public ITaskSp
  857. {
  858. CCardIssuerFSM* fsm;
  859. SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx;
  860. EjectJSTask(CCardIssuerFSM* f) : fsm(f) {}
  861. void Process()
  862. {
  863. FSMEvent* e = new FSMEvent(USER_EVT_JS_EJECT_FINISHED);
  864. e->param1 = fsm->EjectJS(ctx);
  865. fsm->PostEventFIFO(e);
  866. }
  867. };
  868. //吞卡
  869. struct CaptureJSTask : public ITaskSp
  870. {
  871. CCardIssuerFSM* fsm;
  872. SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx;
  873. CaptureJSTask(CCardIssuerFSM* f) : fsm(f) {}
  874. void Process()
  875. {
  876. FSMEvent* e = new FSMEvent(USER_EVT_JS_CAPTURE_FINISHED);
  877. e->param1 = fsm->CaptureJS(ctx);
  878. fsm->PostEventFIFO(e);
  879. }
  880. };
  881. //联机后处理
  882. struct PostOnlineJSTask : public ITaskSp
  883. {
  884. CCardIssuerFSM* fsm;
  885. SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx;
  886. PostOnlineJSTask(CCardIssuerFSM* f) : fsm(f) {}
  887. void Process()
  888. {
  889. FSMEvent* e = new FSMEvent(USER_EVT_JS_POSTONLINE_FINISHED);
  890. e->param1 = fsm->PostOnlineJS(ctx);
  891. fsm->PostEventFIFO(e);
  892. }
  893. };
  894. //卡箱发卡
  895. struct IssueFromBoxJSTask : public ITaskSp
  896. {
  897. CCardIssuerFSM* fsm;
  898. SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx;
  899. IssueFromBoxJSTask(CCardIssuerFSM* f) : fsm(f) {}
  900. void Process()
  901. {
  902. FSMEvent* e = new FSMEvent(USER_EVT_JS_ISSUE_FROM_BOX_FINISHED);
  903. e->param1 = fsm->IssueFromBoxJS(ctx);
  904. fsm->PostEventFIFO(e);
  905. }
  906. };
  907. //读卡
  908. struct ReadJSTask : public ITaskSp
  909. {
  910. CCardIssuerFSM* fsm;
  911. SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx;
  912. ReadJSTask(CCardIssuerFSM* f) : fsm(f) {}
  913. void Process()
  914. {
  915. FSMEvent* e = new FSMEvent(USER_EVT_JS_READ_FINISHED);
  916. e->param1 = fsm->ReadJS(ctx);
  917. fsm->PostEventFIFO(e);
  918. }
  919. };
  920. struct InsertJSTask : public ITaskSp
  921. {
  922. CCardIssuerFSM* fsm;
  923. SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx;
  924. InsertJSTask(CCardIssuerFSM* f) : fsm(f) {}
  925. void Process()
  926. {
  927. LOG_FUNCTION();
  928. FSMEvent* e = new FSMEvent(USER_EVT_JS_INSERT_FINISHED);
  929. e->param1 = fsm->InsertJS(ctx);
  930. fsm->PostEventFIFO(e);
  931. }
  932. };
  933. #pragma endregion JS接口 工作线程
  934. #endif //__CARD_ISSUER_FSM_H