CardIssuerStandFSM.h 35 KB

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