CardIssuerFSM.h 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. #ifndef __CARD_ISSUER_FSM_H
  2. #define __CARD_ISSUER_FSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "CardIssuer_server_g.h"
  6. //#include "GUIConsole_client_g.h"
  7. #include "HeartBeat_client_g.h"
  8. #include "AccessAuthorization_client_g.h"
  9. #include "DevFSMCommBase.hpp"
  10. #include "CardIssuerClass.h"
  11. #include "CardAssist.h"
  12. #include "ICDataElement.h"
  13. #include "IHttpFunc.h"
  14. //#include "publicFunExport.h"
  15. #ifdef RVC_OS_WIN
  16. #include "json.h"
  17. #else
  18. #include "json/json.h"
  19. #endif //RVC_OS_WIN
  20. #define REFLECTION(var) #var
  21. using namespace CardIssuer;
  22. //using namespace GUIConsole;
  23. using namespace HeartBeat;
  24. using namespace AccessAuthorization;
  25. enum EvtType
  26. {
  27. USER_EVT_TEST = EVT_USER+1,
  28. USER_EVT_QUIT,
  29. USER_EVT_INIT,
  30. USER_EVT_INITFINISHED,
  31. USER_EVT_ACCEPT,
  32. USER_EVT_ACCEPT_CANCEL,
  33. USER_EVT_ACCEPTFINISHED,
  34. USER_EVT_ISSUE,
  35. USER_EVT_ISSUE_FINISHED,
  36. USER_EVT_EJECT,
  37. USER_EVT_CAPTURE,
  38. USER_EVT_EJECTFINISHED,
  39. USER_EVT_WAITFINISHED,
  40. USER_EVT_CAPTUREFINISHED,
  41. USER_EVT_WAITFETCHINGTIMEOUT,
  42. USER_EVT_PREONLINE,
  43. USER_EVT_POSTONLINE,
  44. USER_EVT_PREONLINEFINISHED,
  45. USER_EVT_POSTONLINEFINISHED,
  46. USER_EVT_RESET,
  47. USER_EVT_RESETFINISHED,
  48. USER_EVT_EXIT,
  49. USER_EVT_READ,
  50. USER_EVT_READ_FINISHED,
  51. USER_EVT_WRITE,
  52. USER_EVT_WRITE_FINISHED,
  53. USER_EVT_GET_MATERIAL_EX,
  54. USER_EVT_SET_MATERIAL_EX,
  55. USER_EVT_ISSUE_EX,
  56. USER_EVT_ISSUE_EX_FINISHED,
  57. USER_EVT_SAM_IC,
  58. USER_EVT_SAM_IC_FINISHED,
  59. USER_EVT_BACK_TO_INIT,
  60. };
  61. enum SAMICCommandType
  62. {
  63. //SAM
  64. SAMICCommand_SAM_Select = 0,
  65. SAMICCommand_SAM_Active,
  66. SAMICCommand_SAM_Deactivate,
  67. SAMICCommand_SAM_WarmReset,
  68. SAMICCommand_SAM_QueryStatus,
  69. SAMICCommand_SAM_Command,
  70. //IC
  71. SAMICCommand_IC_Active = 100,
  72. SAMICCommand_IC_Deactivate,
  73. SAMICCommand_IC_WarmReset,
  74. SAMICCommand_IC_Command,
  75. SAMICCommand_RFIC_Active,
  76. SAMICCommand_RFIC_Deactivate,
  77. SAMICCommand_RFIC_Command,
  78. };
  79. typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
  80. typedef int(*lpCMBdecodeEx)( char* MagData, char * type, char * data);
  81. typedef ErrorCodeEnum (*lpCreateDevCom)(DeviceBaseClass *&baseObj);
  82. typedef ErrorCodeEnum (*lpReleaseDevCom)(DeviceBaseClass *&pBaseObj);
  83. typedef int(__stdcall *pfEncryptDukptHSM)(unsigned char* EncryptedData, unsigned char* bdk, unsigned char* curksn, unsigned char* DecryptedData);
  84. typedef int(__stdcall *pfGetEncrypedData)(unsigned char* BDK, unsigned char* KSN, unsigned char*random, unsigned char* result);
  85. class CCardIssuerEntity;
  86. class CCardIssuerFSM;
  87. const int ONE_K = 1024;
  88. const int HOPPER_NUM = 12;
  89. struct Track2Data
  90. {
  91. int status;
  92. CSimpleStringA t2Account;
  93. CSimpleStringA t2Region;
  94. CSimpleStringA t2CardSerial;
  95. CSimpleStringA t2CVC;
  96. CSimpleStringA t2ExpireDate;
  97. };
  98. struct CMBBin
  99. {
  100. CSimpleStringA bin;//6 byte long
  101. bool bIC;//IC:true or mag:false
  102. bool bDC;//debit:true,credit:false
  103. };
  104. struct SCIRecord
  105. {
  106. CSimpleStringA name;
  107. CSimpleStringA remoteMac;
  108. };
  109. class CardInitFinishedEvent : public FSMEvent
  110. {
  111. public:
  112. CardInitFinishedEvent() : FSMEvent(USER_EVT_INITFINISHED){}
  113. ~CardInitFinishedEvent(){}
  114. SpReqAnsContext<CardIssuerService_Insert_Req,CardIssuerService_Insert_Ans>::Pointer ctx;
  115. protected:
  116. private:
  117. };
  118. class CardAcceptEvent : public FSMEvent
  119. {
  120. public:
  121. CardAcceptEvent() : FSMEvent(USER_EVT_ACCEPT) {}
  122. ~CardAcceptEvent() {}
  123. SpReqAnsContext<CardIssuerService_Insert_Req, CardIssuerService_Insert_Ans>::Pointer ctx;
  124. virtual void OnUnhandled()
  125. {
  126. if (ctx != NULL)
  127. {
  128. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card accept unhandled");
  129. ctx->Answer(Error_InvalidState);
  130. }
  131. }
  132. };
  133. class CardIssueEvent : public FSMEvent
  134. {
  135. public:
  136. CardIssueEvent() : FSMEvent(USER_EVT_ISSUE) {}
  137. ~CardIssueEvent() {}
  138. SpReqAnsContext<CardIssuerService_Issue_Req, CardIssuerService_Issue_Ans>::Pointer ctx;
  139. virtual void OnUnhandled()
  140. {
  141. if (ctx != NULL)
  142. {
  143. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card issue unhandled");
  144. ctx->Answer(Error_InvalidState);
  145. }
  146. }
  147. };
  148. class CancelAcceptEvent : public FSMEvent
  149. {
  150. public:
  151. CancelAcceptEvent() : FSMEvent(USER_EVT_ACCEPT_CANCEL) {}
  152. ~CancelAcceptEvent() {}
  153. virtual void OnUnhandled()
  154. {
  155. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card cancel accept unhandled");
  156. }
  157. };
  158. class CardReadEvent : public FSMEvent
  159. {
  160. public:
  161. CardReadEvent() : FSMEvent(USER_EVT_READ) {}
  162. ~CardReadEvent() {}
  163. SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx;
  164. virtual void OnUnhandled()
  165. {
  166. if (ctx != NULL)
  167. {
  168. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled");
  169. ctx->Answer(Error_InvalidState);
  170. }
  171. }
  172. protected:
  173. private:
  174. };
  175. class CardReadFinishedEvent : public FSMEvent
  176. {
  177. public:
  178. CardReadFinishedEvent() : FSMEvent(USER_EVT_READ_FINISHED) {}
  179. ~CardReadFinishedEvent() {}
  180. SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx;
  181. virtual void OnUnhandled()
  182. {
  183. if (ctx != NULL)
  184. {
  185. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled(new)");
  186. }
  187. }
  188. protected:
  189. private:
  190. };
  191. class ResetDeviceEvent : public FSMEvent
  192. {
  193. public:
  194. ResetDeviceEvent() : FSMEvent(USER_EVT_RESET){}
  195. ~ResetDeviceEvent(){}
  196. protected:
  197. private:
  198. };
  199. class ResetFinishedEvent : public FSMEvent
  200. {
  201. public:
  202. ResetFinishedEvent() : FSMEvent(USER_EVT_RESETFINISHED){}
  203. ~ResetFinishedEvent(){}
  204. protected:
  205. private:
  206. };
  207. class PreOnlineEvent : public FSMEvent
  208. {
  209. public:
  210. PreOnlineEvent() : FSMEvent(USER_EVT_PREONLINE){}
  211. ~PreOnlineEvent(){}
  212. SpReqAnsContext<CardIssuerService_PreOnline_Req,CardIssuerService_PreOnline_Ans>::Pointer ctx;
  213. virtual void OnUnhandled()
  214. {
  215. if (ctx != NULL)
  216. ctx->Answer(Error_InvalidState);
  217. }
  218. protected:
  219. private:
  220. };
  221. class PostOnlineEvent : public FSMEvent
  222. {
  223. public:
  224. PostOnlineEvent() : FSMEvent(USER_EVT_POSTONLINE){}
  225. ~PostOnlineEvent(){}
  226. SpReqAnsContext<CardIssuerService_PostOnline_Req,CardIssuerService_PostOnline_Ans>::Pointer ctx;
  227. virtual void OnUnhandled()
  228. {
  229. if (ctx != NULL)
  230. ctx->Answer(Error_InvalidState);
  231. }
  232. protected:
  233. private:
  234. };
  235. class CardCaptureEvent : public FSMEvent
  236. {
  237. public:
  238. CardCaptureEvent() : FSMEvent(USER_EVT_CAPTURE){}
  239. ~CardCaptureEvent(){}
  240. SpReqAnsContext<CardIssuerService_Capture_Req,CardIssuerService_Capture_Ans>::Pointer ctx;
  241. virtual void OnUnhandled()
  242. {
  243. if (ctx != NULL)
  244. ctx->Answer(Error_InvalidState);
  245. }
  246. protected:
  247. private:
  248. };
  249. class CardEjectEvent : public FSMEvent
  250. {
  251. public:
  252. CardEjectEvent() : FSMEvent(USER_EVT_EJECT){}
  253. ~CardEjectEvent(){}
  254. SpReqAnsContext<CardIssuerService_Eject_Req,CardIssuerService_Eject_Ans>::Pointer ctx;
  255. virtual void OnUnhandled()
  256. {
  257. if (ctx != NULL)
  258. ctx->Answer(Error_InvalidState);
  259. }
  260. protected:
  261. private:
  262. };
  263. class CardWriteEvent : public FSMEvent
  264. {
  265. public:
  266. CardWriteEvent() : FSMEvent(USER_EVT_WRITE){}
  267. ~CardWriteEvent(){}
  268. SpReqAnsContext<CardIssuerService_WriteTrack_Req,CardIssuerService_WriteTrack_Ans>::Pointer ctx;
  269. virtual void OnUnhandled()
  270. {
  271. if (ctx != NULL)
  272. {
  273. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled");
  274. ctx->Answer(Error_InvalidState);
  275. }
  276. }
  277. protected:
  278. private:
  279. };
  280. class CardWriteFinishedEvent : public FSMEvent
  281. {
  282. public:
  283. CardWriteFinishedEvent() : FSMEvent(USER_EVT_WRITE_FINISHED){}
  284. ~CardWriteFinishedEvent(){}
  285. SpReqAnsContext<CardIssuerService_WriteTrack_Req,CardIssuerService_WriteTrack_Ans>::Pointer ctx;
  286. virtual void OnUnhandled()
  287. {
  288. if (ctx != NULL)
  289. {
  290. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled(new)");
  291. }
  292. }
  293. protected:
  294. private:
  295. };
  296. class GetMaterialExEvent : public FSMEvent
  297. {
  298. public:
  299. GetMaterialExEvent() : FSMEvent(USER_EVT_GET_MATERIAL_EX) {}
  300. ~GetMaterialExEvent() {}
  301. SpReqAnsContext<CardIssuerService_GetMaterialCountEx_Req, CardIssuerService_GetMaterialCountEx_Ans>::Pointer ctx;
  302. virtual void OnUnhandled()
  303. {
  304. if (ctx != NULL)
  305. ctx->Answer(Error_InvalidState);
  306. }
  307. protected:
  308. private:
  309. };
  310. class SetMaterialExEvent : public FSMEvent
  311. {
  312. public:
  313. SetMaterialExEvent() : FSMEvent(USER_EVT_SET_MATERIAL_EX){}
  314. ~SetMaterialExEvent(){}
  315. SpReqAnsContext<CardIssuerService_SetMaterialCountEx_Req, CardIssuerService_SetMaterialCountEx_Ans>::Pointer ctx;
  316. virtual void OnUnhandled()
  317. {
  318. if (ctx != NULL)
  319. ctx->Answer(Error_InvalidState);
  320. }
  321. protected:
  322. private:
  323. };
  324. class CardIssueExEvent : public FSMEvent
  325. {
  326. public:
  327. CardIssueExEvent() : FSMEvent(USER_EVT_ISSUE_EX){}
  328. ~CardIssueExEvent(){}
  329. SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx;
  330. virtual void OnUnhandled()
  331. {
  332. if (ctx != NULL)
  333. {
  334. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card issue ex unhandled");
  335. ctx->Answer(Error_InvalidState);
  336. }
  337. }
  338. };
  339. class SAMICCommandEvent : public FSMEvent
  340. {
  341. public:
  342. SAMICCommandEvent() : FSMEvent(USER_EVT_SAM_IC){}
  343. ~SAMICCommandEvent(){}
  344. SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx;
  345. virtual void OnUnhandled()
  346. {
  347. if (ctx != NULL)
  348. {
  349. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sam/ic unhandled");
  350. ctx->Answer(Error_InvalidState);
  351. }
  352. }
  353. };
  354. typedef struct EacQueryByEac_X1 {
  355. string xEacNbr;
  356. string xCltNbr;
  357. string xIacNbr;
  358. } EacQueryByEac_X1;
  359. typedef struct CQueryCardTypeReq : CHTTPReq {
  360. struct HEAD {
  361. int xHdrLen;
  362. string xIsuCnl;
  363. string xRtnCod;
  364. }HEAD;
  365. struct BODY {
  366. EacQueryByEac_X1 x1;
  367. }BODY;
  368. int X1Count;
  369. CQueryCardTypeReq() {
  370. X1Count = 1;
  371. }
  372. string ToJson() {
  373. Json::Value allElm,x1Arr;
  374. allElm[REFLECTION(HEAD)][REFLECTION(xHdrLen)] = HEAD.xHdrLen;
  375. allElm[REFLECTION(HEAD)][REFLECTION(xIsuCnl)] = HEAD.xIsuCnl;
  376. allElm[REFLECTION(HEAD)][REFLECTION(xRtnCod)] = HEAD.xRtnCod;
  377. for (int i = 0; i < X1Count; i++) {
  378. Json::Value x1Elm;
  379. Json::FastWriter fwX1Elm;//写入对象
  380. x1Elm[REFLECTION(xEacNbr)] = BODY.x1.xEacNbr.c_str();
  381. x1Elm[REFLECTION(xCltNbr)] = BODY.x1.xCltNbr.c_str();
  382. x1Elm[REFLECTION(xIacNbr)] = BODY.x1.xIacNbr.c_str();
  383. //string x1JsonStr = fwX1Elm.write(x1Elm);
  384. x1Arr[i] = x1Elm;
  385. }
  386. allElm[REFLECTION(BODY)][REFLECTION(EacQueryByEac_X1)] = x1Arr;
  387. Json::FastWriter writer;
  388. string ret = writer.write(allElm);
  389. return ret;
  390. }
  391. } CQueryCardTypeReq;
  392. typedef struct EacQueryByEac_Z1 {
  393. string zEacNbr;
  394. string zEacSts;
  395. string zEacTyp;
  396. string zEacNam;
  397. string zEacNik;
  398. string zEacCod;
  399. string zCltNbr;
  400. string zIacNbr;
  401. string zKeySeq;
  402. string zFndClt;
  403. string zFndIac;
  404. string zFndCpb;
  405. string zFndAtp;
  406. string zFpnClt;
  407. string zFpnIac;
  408. string zCtfCnr;
  409. string zCtfTyp;
  410. string zPsbTag;
  411. string zPsbFac;
  412. string zPsbNbr;
  413. string zPsbCod;
  414. string zPsbSeq;
  415. string zPsbMdm;
  416. string zCvcCod;
  417. string zCvcCd2;
  418. string zCvcIcd;
  419. string zMapBus;
  420. string zMapCnl;
  421. string zMapDpn;
  422. string zMapPwd;
  423. string zMapAut;
  424. string zWrmFlg;
  425. string zBlsFlg;
  426. string zNamFlg;
  427. string zActFlg;
  428. string zSlpFlg;
  429. string zFkcFlg;
  430. string zSnmFlg;
  431. string zWrfAll;
  432. string zWrfNdk;
  433. string zWrfZft;
  434. string zWrfDsk;
  435. string zPayLck;
  436. string zQryTag;
  437. string zFncTag;
  438. string zWdwTag;
  439. string zPayTag;
  440. string zTmpTag;
  441. string zExtTag;
  442. string zCtfTag;
  443. string zMskTag;
  444. string zStfFlg;
  445. string zSlaFlg;
  446. string zBatFlg;
  447. string zAgtFlg;
  448. string zAmgTag;
  449. string zCurTag;
  450. string zImgIdt;
  451. string zGrpFlg;
  452. string zOpnDat;
  453. string zOpnUsr;
  454. string zOpnChk;
  455. string zOpnAut;
  456. string zActDat;
  457. string zClsDat;
  458. string zClsUsr;
  459. string zClsChk;
  460. string zClsAut;
  461. string zDatEft;
  462. string zDatExp;
  463. string zBbkNbr;
  464. string zBrnNbr;
  465. string zBrnMng;
  466. string zCtyCod;
  467. }EacQueryByEac_Z1;
  468. typedef struct CQueryCardTypeRet : CHTTPRet {
  469. struct HEAD {
  470. string xTypCod;
  471. string xHdrLen;
  472. string xSysCod;
  473. string xDskSys;
  474. string xWkeCod;
  475. string xKeyVal;
  476. string xIsuCnl;
  477. string xEncCod;
  478. string xDalCod;
  479. string xCmmTyp;
  480. string xOrgIsu;
  481. string xPreIsu;
  482. string xEntUsr;
  483. string xUsrPwd;
  484. string xIsuDat;
  485. string xIsuTim;
  486. string xMacCod;
  487. string xRtnLvl;
  488. string xRtnCod;
  489. string xDevNbr;
  490. string xTlrNbr;
  491. string xRqsNbr;
  492. string xCmmRsv;
  493. string xDocSiz;
  494. string xItvTms;
  495. string xMsgFlg;
  496. string xAppRsv;
  497. }HEAD;
  498. struct BODY {
  499. EacQueryByEac_Z1 z1;
  500. }BODY;
  501. int Z1Count;
  502. CQueryCardTypeRet() : Z1Count(1) {
  503. }
  504. bool Parse(string strData) {
  505. Json::Value root,tmpZ1;
  506. Json::Reader reader;
  507. Json::Value::UInt index;
  508. if (!reader.parse(strData, root, false))
  509. {
  510. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("reader.parse false");//又不能打印,有什么太大意义?
  511. return false;
  512. }
  513. index = 0;
  514. HEAD.xRtnCod = root["HEAD"][REFLECTION(xRtnCod)].asCString();
  515. if (HEAD.xRtnCod.compare("SUC0000") == 0)
  516. {
  517. tmpZ1 = root["BODY"][REFLECTION(EacQueryByEac_Z1)];
  518. BODY.z1.zPsbMdm = tmpZ1[index][REFLECTION(zPsbMdm)].asCString();
  519. BODY.z1.zEacNbr = tmpZ1[index][REFLECTION(zEacNbr)].asCString();
  520. BODY.z1.zPsbSeq = tmpZ1[index][REFLECTION(zPsbSeq)].asCString();
  521. return true;
  522. }
  523. else
  524. return false;
  525. }
  526. } CQueryCardTypeRet;
  527. typedef struct CRegistSwallowCardReq : CHTTPReq {
  528. string cardNo;
  529. string cardType;
  530. string channel;
  531. string clearInstanceId;
  532. string deviceSciNo;
  533. string bankNo;
  534. string editTime;
  535. string editor;
  536. string fromFlag;
  537. string idKey;
  538. string informType;
  539. string psbCode;
  540. string reasonCode;
  541. string state;
  542. string structId;
  543. string swallowDate;
  544. string swallowTime;
  545. string terminalNo;
  546. string terminalType;
  547. string uuid;
  548. string ToJson() {
  549. Json::Value allElm, x1Arr;
  550. allElm[REFLECTION(cardNo)] = cardNo;
  551. allElm[REFLECTION(deviceSciNo)] = deviceSciNo;
  552. allElm[REFLECTION(reasonCode)] = reasonCode;
  553. allElm[REFLECTION(swallowDate)] = swallowDate;
  554. allElm[REFLECTION(swallowTime)] = swallowTime;
  555. allElm[REFLECTION(terminalNo)] = terminalNo;
  556. allElm[REFLECTION(terminalType)] = terminalType;
  557. Json::FastWriter writer;
  558. string ret = writer.write(allElm);
  559. return ret;
  560. }
  561. } CRegistSwallowCardReq;
  562. typedef struct CRegistSwallowCardRet : CHTTPRet {
  563. struct returnInfo {
  564. string returnCode;
  565. string errorMsg;
  566. }returnInfo;
  567. struct data {
  568. }data;
  569. bool Parse(string strData) {
  570. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(strData.c_str());
  571. Json::Value root, tmpZ1;
  572. Json::Reader reader;
  573. if (!reader.parse(strData, root, false))
  574. {
  575. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("reader.parse false");//又不能打印,有什么太大意义?
  576. return false;
  577. }
  578. if (!root["returnInfo"].isNull()) {
  579. returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString();
  580. return true;
  581. }
  582. else {
  583. return false;//报文结构不对,解析失败
  584. }
  585. //returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString();
  586. }
  587. } CRegistSwallowCardRet;
  588. // 同步卡库计数到后台服务实体类
  589. struct SyncMaterialCountInfo
  590. {
  591. CSimpleStringA strDeviceNo;
  592. unsigned int dwCardBoxNum;
  593. CAutoArray<bool> arrMaintainFlag;
  594. CAutoArray<CSimpleStringA> arrMaintainer;
  595. CAutoArray<unsigned int> arrMaintainTime;
  596. CAutoArray<CSimpleStringA> arrCardBoxNo;
  597. CAutoArray<CSimpleStringA> arrPsbCode;
  598. CAutoArray<CSimpleStringA> arrPsbName;
  599. CAutoArray<unsigned int> arrCardInit;
  600. CAutoArray<unsigned int> arrCardRemains;
  601. CAutoArray<unsigned int> arrCardIssued;
  602. CAutoArray<unsigned int> arrCardMixed;
  603. CAutoArray<unsigned int> arrCardPercent;
  604. };
  605. struct SyncMaterialCountReq1
  606. {
  607. char TerminalNo[16];
  608. char DeviceNo[16];
  609. char Material[16];
  610. DWORD CardBoxNum;
  611. };
  612. struct SyncMaterialCountReq2
  613. {
  614. bool bMaintain;
  615. char Maintainer[16];
  616. DWORD MaintainTime;
  617. char CardBoxNo[20];
  618. char PsbCode[8];
  619. char PsbName[128];
  620. DWORD CardInit;
  621. DWORD CardRemains;
  622. DWORD CardIssued;
  623. DWORD CardMixed;
  624. DWORD CardPercent;
  625. };
  626. struct SyncMaterialCountHTTPReq : CHTTPReq {
  627. SyncMaterialCountHTTPReq() { m_timeOut = 30; }
  628. SyncMaterialCountReq1 reqInfo;
  629. std::vector<SyncMaterialCountReq2> reqData;
  630. virtual string ToJson() {
  631. Json::Value root;
  632. Json::Value arrayObj;
  633. root["terminalNo"] = reqInfo.TerminalNo;
  634. root["deviceNo"] = reqInfo.DeviceNo;
  635. root["materiel"] = reqInfo.Material;
  636. root["cardBoxNum"] = (int)reqInfo.CardBoxNum;
  637. for (int i = 0; i <= reqInfo.CardBoxNum; i++)
  638. {
  639. Json::Value item;
  640. item["CardBoxNo"] = reqData[i].CardBoxNo;
  641. item["PsbCode"] = reqData[i].PsbCode;
  642. item["PsbName"] = reqData[i].PsbName;
  643. item["CardInit"] = (int)reqData[i].CardInit;
  644. item["CardRemains"] = (int)reqData[i].CardRemains;
  645. item["CardIssued"] = (int)reqData[i].CardIssued;
  646. item["CardMixed"] = (int)reqData[i].CardMixed;
  647. item["CardPercent"] = (int)reqData[i].CardPercent;
  648. item["Maintainer"] = reqData[i].Maintainer;
  649. if (reqData[i].MaintainTime == 0)
  650. item["MaintainTime"] = "";
  651. else {
  652. item["MaintainTime"] = CSmallDateTime::GetNow().ToTimeString().GetData();
  653. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MaintainTime:%d", (DWORD)CSmallDateTime::GetNow());
  654. }
  655. item["bMaintain"] = reqData[i].bMaintain;
  656. arrayObj.append(item);
  657. }
  658. root["cardIssueList"] = arrayObj;
  659. return root.toStyledString();
  660. }
  661. };
  662. struct SyncMaterialCountHTTPRet : CHTTPRet {
  663. string m_retStr;
  664. bool Parse(string strData) {
  665. m_retStr = strData;
  666. return true;
  667. }
  668. };
  669. class CCardIssuerFSM : public CCommDevFSM<CCardIssuerFSM, CardIssuerClass>
  670. {
  671. public:
  672. enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s14};
  673. BEGIN_FSM_STATE(CCardIssuerFSM)
  674. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  675. FSM_STATE_ENTRY(s1,"Initializing",s1_on_entry,s1_on_exit,s1_on_event)
  676. FSM_STATE_ENTRY(s2,"Idle",s2_on_entry,s2_on_exit,s2_on_event)
  677. FSM_STATE_ENTRY(s3,"Accepting",s3_on_entry,s3_on_exit,s3_on_event)
  678. FSM_STATE_ENTRY(s4,"Hold",s4_on_entry,s4_on_exit,s4_on_event)
  679. FSM_STATE_ENTRY(s5,"Reading",s5_on_entry,s5_on_exit,s5_on_event)
  680. FSM_STATE_ENTRY(s6,"Ejecting",s6_on_entry,s6_on_exit,s6_on_event)
  681. FSM_STATE_ENTRY(s7,"WaitFetching",s7_on_entry,s7_on_exit,s7_on_event)
  682. FSM_STATE_ENTRY(s8,"Capturing",s8_on_entry,s8_on_exit,s8_on_event)
  683. FSM_STATE_ENTRY(s9,"Failed",s9_on_entry,s9_on_exit,s9_on_event)
  684. FSM_STATE_ENTRY(s10,"Issuing",s10_on_entry,s10_on_exit,s10_on_event)
  685. FSM_STATE_ENTRY(s11,"Writing",s11_on_entry,s11_on_exit,s11_on_event)
  686. FSM_STATE_ENTRY(s14, "SAMIC", s14_on_entry, s14_on_exit, s14_on_event)
  687. END_FSM_STATE()
  688. BEGIN_FSM_RULE(CCardIssuerFSM,s0)
  689. FSM_RULE_ENTRY(s0, s2, USER_EVT_TEST, 0)
  690. FSM_RULE_ENTRY(s0,s1,USER_EVT_INIT,0)
  691. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  692. FSM_RULE_ENTRY(s1,s2,USER_EVT_INITFINISHED,0)
  693. FSM_RULE_ENTRY(s1,s9,USER_EVT_INITFINISHED,1)
  694. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  695. FSM_RULE_ENTRY(s2,s3,USER_EVT_ACCEPT,0)
  696. // FSM_RULE_ENTRY(s2,s9,USER_EVT_ACCEPT,1)
  697. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  698. FSM_RULE_ENTRY(s2,s10,USER_EVT_ISSUE,0)
  699. FSM_RULE_ENTRY(s2, s10, USER_EVT_ISSUE_EX, 0)
  700. FSM_RULE_ENTRY(s3,s4,USER_EVT_ACCEPTFINISHED,0)
  701. FSM_RULE_ENTRY(s3,s9,USER_EVT_ACCEPTFINISHED,1)
  702. FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,2)
  703. FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,3)
  704. FSM_RULE_ENTRY(s3,s7,USER_EVT_ACCEPTFINISHED,4)
  705. FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  706. FSM_RULE_ENTRY(s4,s5,USER_EVT_READ,0)
  707. FSM_RULE_ENTRY(s4,s6,USER_EVT_EJECT,0)
  708. FSM_RULE_ENTRY(s4,s6,USER_EVT_EXIT,0)
  709. FSM_RULE_ENTRY(s4,s8,USER_EVT_ACCEPT,0)
  710. FSM_RULE_ENTRY(s4,s8,USER_EVT_EXIT,1)
  711. FSM_RULE_ENTRY(s4,s8,USER_EVT_CAPTURE,0)
  712. FSM_RULE_ENTRY(s4,s11,USER_EVT_WRITE,0)
  713. FSM_RULE_ENTRY(s4, s14, USER_EVT_SAM_IC, 0)
  714. FSM_RULE_ENTRY(s4, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  715. FSM_RULE_ENTRY(s4, s2, USER_EVT_ISSUE_EX_FINISHED, 2)
  716. FSM_RULE_ENTRY(s4, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  717. FSM_RULE_ENTRY(s4, s5, USER_EVT_PREONLINE, 0)
  718. FSM_RULE_ENTRY(s4, s5, USER_EVT_POSTONLINE, 0)
  719. FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,0)
  720. FSM_RULE_ENTRY(s5,s9,USER_EVT_READ_FINISHED,1)
  721. FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,2)
  722. FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  723. FSM_RULE_ENTRY(s5, s4, USER_EVT_EXIT, 0)
  724. FSM_RULE_ENTRY(s5, s4, USER_EVT_PREONLINEFINISHED, 0)
  725. FSM_RULE_ENTRY(s5, s4, USER_EVT_POSTONLINEFINISHED, 0)
  726. FSM_RULE_ENTRY(s6,s7,USER_EVT_EJECTFINISHED,0)
  727. FSM_RULE_ENTRY(s6,s9,USER_EVT_EJECTFINISHED,1)
  728. FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  729. FSM_RULE_ENTRY(s7,s2,USER_EVT_WAITFINISHED,0)
  730. FSM_RULE_ENTRY(s7,s9,USER_EVT_WAITFINISHED,1)
  731. FSM_RULE_ENTRY(s7,s8,USER_EVT_WAITFINISHED,2)
  732. FSM_RULE_ENTRY(s7, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  733. FSM_RULE_ENTRY(s8,s2,USER_EVT_CAPTUREFINISHED,0)
  734. FSM_RULE_ENTRY(s8,s9,USER_EVT_CAPTUREFINISHED,1)
  735. FSM_RULE_ENTRY(s8, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  736. FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 0)
  737. FSM_RULE_ENTRY(s9, s0, USER_EVT_RESETFINISHED, 2)
  738. FSM_RULE_ENTRY(s9, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  739. FSM_RULE_ENTRY(s10,s4,USER_EVT_ISSUE_FINISHED,0)
  740. FSM_RULE_ENTRY(s10,s9,USER_EVT_ISSUE_FINISHED,1)
  741. FSM_RULE_ENTRY(s10,s2,USER_EVT_ISSUE_FINISHED,2)
  742. FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  743. FSM_RULE_ENTRY(s10, s4, USER_EVT_ISSUE_EX_FINISHED, 0)
  744. FSM_RULE_ENTRY(s10, s9, USER_EVT_ISSUE_EX_FINISHED, 1)
  745. FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 2)
  746. FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  747. FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 8)
  748. FSM_RULE_ENTRY(s10, s2, USER_EVT_EXIT, 0)
  749. FSM_RULE_ENTRY(s11,s4,USER_EVT_WRITE_FINISHED,0)
  750. FSM_RULE_ENTRY(s11,s4,USER_EVT_WRITE_FINISHED,1)
  751. FSM_RULE_ENTRY(s14, s4, USER_EVT_SAM_IC_FINISHED, 0)
  752. END_FSM_RULE()
  753. CCardIssuerFSM() : m_bCancelAccept(false),m_bWaitingAccept(false),
  754. m_bWaitAccepteMore(false),m_bExit(false),m_resetTimes(0),m_testResult(Error_Succeed)
  755. //,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
  756. ,m_bCDA(false),m_pDataToARQC(NULL),m_bIssuingExit(false)
  757. ,m_bCardIssued(false),m_issueStatusFromFile(1),m_issueStatus(1),m_currCardNo("")
  758. , m_captureReason(""), m_machineType(1), m_currentHopper(1), m_hopperNum(1)
  759. , m_bSettingMaterial(false) , m_addCardNo(""), m_addCardSerial(""), m_hasCardWhileDevOpen(false)
  760. , m_bChannelOK(false), m_bCancelByRFIC(false), m_devOpenFailedCount(0)
  761. , m_iInWhatPage(PageType_Other), m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
  762. , m_bCardFromHopper(true), m_bStopUseRF(false),m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("")
  763. {
  764. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
  765. cmdDecodeMag2 = NULL;
  766. cmdDecodeEx = NULL;
  767. m_aidList.Init(3);
  768. m_aidList[0] = "A000000333";
  769. m_aidList[1] = "A0000000108888";
  770. m_aidList[2] = "A000000790";
  771. }
  772. ~CCardIssuerFSM(){}
  773. virtual ErrorCodeEnum OnInit();
  774. virtual ErrorCodeEnum OnExit();
  775. void s0_on_entry();
  776. void s0_on_exit();
  777. unsigned int s0_on_event(FSMEvent* event);
  778. void s1_on_entry();
  779. void s1_on_exit();
  780. unsigned int s1_on_event(FSMEvent* event);
  781. void s2_on_entry();
  782. void s2_on_exit();
  783. unsigned int s2_on_event(FSMEvent* event);
  784. void s3_on_entry();
  785. void s3_on_exit();
  786. unsigned int s3_on_event(FSMEvent* event);
  787. void s4_on_entry();
  788. void s4_on_exit();
  789. unsigned int s4_on_event(FSMEvent* event);
  790. void s5_on_entry();
  791. void s5_on_exit();
  792. unsigned int s5_on_event(FSMEvent* event);
  793. void s6_on_entry();
  794. void s6_on_exit();
  795. unsigned int s6_on_event(FSMEvent* event);
  796. void s7_on_entry();
  797. void s7_on_exit();
  798. unsigned int s7_on_event(FSMEvent* event);
  799. void s8_on_entry();
  800. void s8_on_exit();
  801. unsigned int s8_on_event(FSMEvent* event);
  802. void s9_on_entry();
  803. void s9_on_exit();
  804. unsigned int s9_on_event(FSMEvent* event);
  805. void s10_on_entry();
  806. void s10_on_exit();
  807. unsigned int s10_on_event(FSMEvent* event);
  808. void s11_on_entry();
  809. void s11_on_exit();
  810. unsigned int s11_on_event(FSMEvent* event);
  811. void s14_on_entry();
  812. void s14_on_exit();
  813. unsigned int s14_on_event(FSMEvent* event);
  814. void Load();
  815. ErrorCodeEnum OpenDevice(BYTE btOpenType, const char *pDevSN);
  816. int Initial();
  817. bool GetDevStatus(bool bPrint=true);
  818. int UnAcceptCard();
  819. int CaptureCard(SpReqAnsContext<CardIssuerService_Capture_Req,CardIssuerService_Capture_Ans>::Pointer ctx);
  820. int EjectCard(SpReqAnsContext<CardIssuerService_Eject_Req,CardIssuerService_Eject_Ans>::Pointer ctx);
  821. int WaitFetchingCard();
  822. int ReadCard(SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx);
  823. int PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req, CardIssuerService_PreOnline_Ans>::Pointer ctx);
  824. int PostOnline(SpReqAnsContext<CardIssuerService_PostOnline_Req, CardIssuerService_PostOnline_Ans>::Pointer ctx);
  825. int ReadCard_Contact(SpReqAnsContext<CardIssuerService_Read_Req,CardIssuerService_Read_Ans>::Pointer ctx, bool& bICOK);
  826. int PreOnline_Contact(SpReqAnsContext<CardIssuerService_PreOnline_Req,CardIssuerService_PreOnline_Ans>::Pointer ctx, bool& bICOK);
  827. int PostOnline_Contact(SpReqAnsContext<CardIssuerService_PostOnline_Req,CardIssuerService_PostOnline_Ans>::Pointer ctx, bool& bICOK);
  828. int ReadCard_RF(SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx);
  829. int PreOnline_RF(SpReqAnsContext<CardIssuerService_PreOnline_Req, CardIssuerService_PreOnline_Ans>::Pointer ctx);
  830. int PostOnline_RF(SpReqAnsContext<CardIssuerService_PostOnline_Req, CardIssuerService_PostOnline_Ans>::Pointer ctx);
  831. int Reset();
  832. int InternalAcceptCard();
  833. int AcceptCard(SpReqAnsContext<CardIssuerService_Insert_Req, CardIssuerService_Insert_Ans>::Pointer ctx);
  834. int IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardIssuerService_Issue_Ans>::Pointer ctx, SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctxEx);
  835. int WriteCard(SpReqAnsContext<CardIssuerService_WriteTrack_Req,CardIssuerService_WriteTrack_Ans>::Pointer ctx);
  836. bool GetWaitFlag(){return m_bWaitingAccept;}
  837. void SetWaitMore(){m_bWaitAccepteMore = true;}
  838. void SetExitFlag(bool bFlag=true){m_bExit = bFlag;}
  839. bool FSMSetIssueFlag(int value=1);
  840. void FrontSetIssueFlag(bool bValue = true){ FSMSetIssueFlag(bValue); }
  841. int QueryIssueFlag(){ return m_issueStatus; }
  842. bool SetCardCaptured(const int num,bool bNewClear=false);
  843. bool SetCardIssued(const int num,const int hopper);
  844. bool SetCardRemains(const int num, const int hopper,bool bInit = false);
  845. bool SetCardMixed(const int num, const int hopper);
  846. ErrorCodeEnum MachineMoveCardBackNotHold();
  847. ErrorCodeEnum MachineMoveCardFrontGate(bool bInBussiness=false);
  848. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  849. DevStateEnum GetDevState()
  850. {
  851. if ((m_eDevState == DEVICE_STATUS_NORMAL)
  852. && ((m_bHasHopper[0] && m_mixedEx[0] >= 3) || !m_bHasHopper[0])
  853. && ((m_bHasHopper[1] && m_mixedEx[1] >= 3) || !m_bHasHopper[1])
  854. && ((m_bHasHopper[2] && m_mixedEx[2] >= 3) || !m_bHasHopper[2]))
  855. return DEVICE_STATUS_MAINTAINCE;
  856. else
  857. return m_eDevState;
  858. }
  859. int QueryCardInfo();
  860. int SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend = true);
  861. int UpdateLocalRunCfg(CAutoArray<int> hopperArr);
  862. int SyncDataToDB(bool bMaintain[12],bool bSetCaptured=true);//同步物料计数
  863. void SetHopperNum(int hopperNum);
  864. void DoExitWhenIdle();
  865. int SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx);
  866. bool WriteCardInfo(CSmartPointer<IConfigInfo> &cfgRun, const char *acc, const char* serial, int slot, bool bClear = false, bool bHasCard = false);
  867. bool ReadCardInfo(CSmartPointer<IConfigInfo> &cfgRun, CSimpleStringA &acc, CSimpleStringA &serial, int slot);
  868. void DecodeTracksData(const char *track2, DWORD dwT2size, const char *track3, DWORD dwT3size,char *&magData,bool bT2OK=true,bool bT3OK=true);
  869. int GetFSMState()
  870. {
  871. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_currentFSMState:%d", m_currentFSMState));
  872. return m_currentFSMState;
  873. }
  874. void GetCardInfo(int &findCard, int &cardPos)
  875. {
  876. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("<GetCardInfo>, findCard:%d, cardPos:%d", findCard, cardPos));
  877. findCard = m_findCard;
  878. cardPos = m_cardPos;
  879. }
  880. int SplitDevModelInfo();
  881. void SetCancelByRFICFlag(bool bCancel = true) { m_bCancelByRFIC = bCancel; }
  882. CSimpleStringA GetPreOnlineICCardNo() { return m_currCardNo; }
  883. void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false);
  884. bool GetDevInitFlag() { return m_bOpened; }
  885. void SetInWhatPage(int bValue) { m_iInWhatPage = bValue; }
  886. void WaitCardActive();
  887. static void HttpsLogCallBack(const char* logtxt);
  888. int JudgeCardType(CSimpleStringA cardno, bool &bMismatch);
  889. void QueryCIStatus(SpReqAnsContext<CardIssuerService_QueryCIStatus_Req, CardIssuerService_QueryCIStatus_Ans>::Pointer ctx);
  890. bool RegistCardWhileCaptureCard(CSimpleStringA cardno);
  891. bool SyncMaterialCount(IHttpFunc* client,SyncMaterialCountInfo syncInfo);
  892. protected:
  893. int m_iInsertTries;
  894. int m_resetTries;
  895. int m_ejectTries;
  896. private:
  897. ///
  898. int m_resetTimes;
  899. lpCMBdecodeMag2 cmdDecodeMag2;
  900. lpCMBdecodeEx cmdDecodeEx;
  901. bool m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore, m_bExit
  902. , m_bCDA, m_bIssuingExit, m_bCardIssued, m_bHasHopper[HOPPER_NUM]
  903. , m_bSettingMaterial, m_hasCardWhileDevOpen, m_bChannelOK, m_bCancelByRFIC
  904. , m_bCardActiveNotify, m_bCardFromHopper, m_bUseCardnoMismatch, m_bStopUseRF;
  905. bool m_bUseRFTillNext;//if ReadCard by RF,the following PreOnline & PostOnline always use RF till the next card(insert/issue)
  906. ErrorCodeEnum m_testResult;
  907. int m_CardCaptured,m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
  908. int m_issueStatusFromFile, m_issueStatus/*the status maybe changed by Business call*/;
  909. //1:default, 2:SCI, 3:no cfg
  910. int m_machineType;
  911. WORD m_majorVerion, m_minorVerion;
  912. int m_port,m_baudRate,m_currentHopper,m_devOpenFailedCount;
  913. int m_maxSlot,m_findCard,m_cardPos,m_currentFSMState,m_maxRetainCount, m_eacQueryFlag/*accout query*/
  914. ,m_ICRetryTimes;
  915. CSimpleStringA m_CardBoxNoEx[HOPPER_NUM], m_PsbCodeEx[HOPPER_NUM], m_PsbNameEx[HOPPER_NUM], m_MaintainerEx[HOPPER_NUM],m_csMaintainTimeEx[HOPPER_NUM];
  916. int m_CardInitEx[HOPPER_NUM], m_CardPercentEx[HOPPER_NUM], m_remainsEx[HOPPER_NUM], m_issuedEx[HOPPER_NUM], m_mixedEx[HOPPER_NUM],m_hopperNum;
  917. DWORD m_MaintainTimeEx[HOPPER_NUM];
  918. BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2];
  919. CardIssuerStatus m_devStatus;
  920. DevStateEnum m_eDevState;
  921. CCardProcess *m_pCardProcess;
  922. CAutoArray<CSimpleStringA> m_aidList;
  923. ErrorPackage m_errPkg;
  924. char *m_pDataToARQC;
  925. long xxTest;
  926. CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite, m_terminalNo, m_addCardNo, m_addCardSerial
  927. , m_csCM, m_rfVendorList, m_csDevSN, m_csRF;
  928. char m_AuthCode[2];
  929. vector<CMBBin> m_vBin;
  930. int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
  931. bool JustReadCardNo();
  932. bool IsValidCardNo(const char*,int);
  933. void GetVendorDllName(CSimpleStringA &dllName);
  934. bool AccountExchange(const char *origAcc, CSimpleStringA &acc,int dir=1);
  935. bool LoadCMBPrint(CSimpleStringA csBinPath);
  936. DevCategoryInfo m_devCat;
  937. void ToLogWarnInfoAboutTermCustom();
  938. bool ToRegistCaptureCardInfo();
  939. bool IfUseRf();
  940. //0:unknow(havn't access microservice or access failed),1:both mag & ic ,2:mag only,3:ic only
  941. //int JudgeCardType();
  942. CSimpleStringA m_csAlarmMsg,m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
  943. MagTracks m_magTracks;
  944. bool IsInBusiness()
  945. {
  946. return m_iInWhatPage == PageType_Other;
  947. }
  948. };
  949. struct InitTask : public ITaskSp
  950. {
  951. CCardIssuerFSM* fsm;
  952. InitTask(CCardIssuerFSM* f) : fsm(f) {}
  953. void Process()
  954. {
  955. FSMEvent *e = new FSMEvent(USER_EVT_INITFINISHED);
  956. e->param1 = fsm->Initial();
  957. fsm->PostEventFIFO(e);
  958. }
  959. };
  960. struct AcceptTask : public ITaskSp
  961. {
  962. CCardIssuerFSM* fsm;
  963. SpReqAnsContext<CardIssuerService_Insert_Req, CardIssuerService_Insert_Ans>::Pointer ctx;
  964. AcceptTask(CCardIssuerFSM* f) : fsm(f) {}
  965. void Process()
  966. {
  967. LOG_FUNCTION();
  968. FSMEvent *e = new FSMEvent(USER_EVT_ACCEPTFINISHED);
  969. e->param1 = fsm->AcceptCard(ctx);
  970. fsm->PostEventFIFO(e);
  971. }
  972. };
  973. struct IssueTask : public ITaskSp
  974. {
  975. CCardIssuerFSM* fsm;
  976. SpReqAnsContext<CardIssuerService_Issue_Req, CardIssuerService_Issue_Ans>::Pointer ctx;
  977. SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctxEx;
  978. IssueTask(CCardIssuerFSM* f) : fsm(f) {}
  979. void Process()
  980. {
  981. LOG_FUNCTION();
  982. FSMEvent *e;
  983. if (ctx != NULL)
  984. e = new FSMEvent(USER_EVT_ISSUE_FINISHED);
  985. else if (ctxEx != NULL)
  986. e = new FSMEvent(USER_EVT_ISSUE_EX_FINISHED);
  987. else
  988. {
  989. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IssueTask:ctx is null");
  990. return;
  991. }
  992. e->param1 = fsm->IssueCard(ctx,ctxEx);
  993. fsm->PostEventFIFO(e);
  994. }
  995. };
  996. struct ReadTask : public ITaskSp
  997. {
  998. SpReqAnsContext<CardIssuerService_Read_Req,CardIssuerService_Read_Ans>::Pointer ctx;
  999. CCardIssuerFSM* fsm;
  1000. ReadTask(CCardIssuerFSM* f) : fsm(f) {}
  1001. void Process()
  1002. {
  1003. CardReadFinishedEvent *e = new CardReadFinishedEvent();
  1004. e->ctx = ctx;
  1005. e->param1 = fsm->ReadCard(ctx);
  1006. fsm->PostEventFIFO(e);
  1007. }
  1008. };
  1009. struct PreOnlineTask : public ITaskSp
  1010. {
  1011. SpReqAnsContext<CardIssuerService_PreOnline_Req,CardIssuerService_PreOnline_Ans>::Pointer ctx;
  1012. CCardIssuerFSM* fsm;
  1013. PreOnlineTask(CCardIssuerFSM* f) : fsm(f) {}
  1014. void Process()
  1015. {
  1016. FSMEvent *e = new FSMEvent(USER_EVT_PREONLINEFINISHED);
  1017. e->param1 = fsm->PreOnline(ctx);//oilyang@20220611 实际上,为简化处理,PreOnline函数默认返回0
  1018. fsm->PostEventFIFO(e);
  1019. }
  1020. };
  1021. struct PostOnlineTask : public ITaskSp
  1022. {
  1023. SpReqAnsContext<CardIssuerService_PostOnline_Req,CardIssuerService_PostOnline_Ans>::Pointer ctx;
  1024. CCardIssuerFSM* fsm;
  1025. PostOnlineTask(CCardIssuerFSM* f) : fsm(f) {}
  1026. void Process()
  1027. {
  1028. FSMEvent *e = new FSMEvent(USER_EVT_POSTONLINEFINISHED);
  1029. e->param1 = fsm->PostOnline(ctx);
  1030. fsm->PostEventFIFO(e);
  1031. }
  1032. };
  1033. struct CaptureTask : public ITaskSp
  1034. {
  1035. CCardIssuerFSM* fsm;
  1036. SpReqAnsContext<CardIssuerService_Capture_Req,CardIssuerService_Capture_Ans>::Pointer ctx;
  1037. CaptureTask(CCardIssuerFSM* f) : fsm(f) {}
  1038. void Process()
  1039. {
  1040. FSMEvent *e = new FSMEvent(USER_EVT_CAPTUREFINISHED);
  1041. e->param1 = fsm->CaptureCard(ctx);
  1042. fsm->PostEventFIFO(e);
  1043. }
  1044. };
  1045. struct EjectTask : public ITaskSp
  1046. {
  1047. SpReqAnsContext<CardIssuerService_Eject_Req,CardIssuerService_Eject_Ans>::Pointer ctx;
  1048. CCardIssuerFSM* fsm;
  1049. EjectTask(CCardIssuerFSM* f) : fsm(f) {}
  1050. void Process()
  1051. {
  1052. FSMEvent *e = new FSMEvent(USER_EVT_EJECTFINISHED);
  1053. e->param1 = fsm->EjectCard(ctx);
  1054. fsm->PostEventFIFO(e);
  1055. }
  1056. };
  1057. struct WaitFetchingTask : public ITaskSp
  1058. {
  1059. CCardIssuerFSM* fsm;
  1060. WaitFetchingTask(CCardIssuerFSM* f) : fsm(f) {}
  1061. void Process()
  1062. {
  1063. FSMEvent *e = new FSMEvent(USER_EVT_WAITFINISHED);
  1064. e->param1 = fsm->WaitFetchingCard();
  1065. fsm->PostEventFIFO(e);
  1066. }
  1067. };
  1068. struct ResetTask : public ITaskSp
  1069. {
  1070. CCardIssuerFSM* fsm;
  1071. ResetTask(CCardIssuerFSM* f) : fsm(f) {}
  1072. void Process()
  1073. {
  1074. ResetFinishedEvent *e = new ResetFinishedEvent();
  1075. e->param1 = fsm->Reset();
  1076. fsm->PostEventFIFO(e);
  1077. }
  1078. };
  1079. struct WriteTask : public ITaskSp
  1080. {
  1081. SpReqAnsContext<CardIssuerService_WriteTrack_Req,CardIssuerService_WriteTrack_Ans>::Pointer ctx;
  1082. CCardIssuerFSM* fsm;
  1083. WriteTask(CCardIssuerFSM* f) : fsm(f) {}
  1084. void Process()
  1085. {
  1086. CardWriteFinishedEvent *e = new CardWriteFinishedEvent();
  1087. e->ctx = ctx;
  1088. e->param1 = fsm->WriteCard(ctx);
  1089. fsm->PostEventFIFO(e);
  1090. }
  1091. };
  1092. struct DoExitWhenIdleTask : public ITaskSp
  1093. {
  1094. CCardIssuerFSM* fsm;
  1095. DoExitWhenIdleTask(CCardIssuerFSM* f) : fsm(f) {}
  1096. void Process()
  1097. {
  1098. fsm->DoExitWhenIdle();
  1099. }
  1100. };
  1101. struct SAMICCommandTask : public ITaskSp
  1102. {
  1103. CCardIssuerFSM* fsm;
  1104. SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx;
  1105. SAMICCommandTask(CCardIssuerFSM* f) : fsm(f) {}
  1106. void Process()
  1107. {
  1108. FSMEvent* e = new FSMEvent(USER_EVT_SAM_IC_FINISHED);
  1109. e->param1 = fsm->SAMICCommand(ctx);
  1110. fsm->PostEventFIFO(e);
  1111. }
  1112. };
  1113. struct RegistCaptureCardInfoTask : public ITaskSp
  1114. {
  1115. CCardIssuerFSM* fsm;
  1116. CSimpleStringA cardno;
  1117. RegistCaptureCardInfoTask(CCardIssuerFSM* f, CSimpleStringA cardno) : fsm(f),cardno(cardno) {}
  1118. void Process()
  1119. {
  1120. fsm->RegistCardWhileCaptureCard(cardno);
  1121. }
  1122. };
  1123. struct SyncMaterialCountTask : public ITaskSp
  1124. {
  1125. CCardIssuerFSM* fsm;
  1126. SyncMaterialCountInfo syncInfo;
  1127. SyncMaterialCountTask(CCardIssuerFSM* f, SyncMaterialCountInfo syncMaterialInfo){
  1128. fsm = f;
  1129. syncInfo = syncMaterialInfo;
  1130. }
  1131. void Process()
  1132. {
  1133. LOG_FUNCTION();
  1134. //同步物料信息
  1135. IHttpFunc* client;
  1136. client = create_http(fsm->HttpsLogCallBack);
  1137. bool ret = fsm->SyncMaterialCount(client,syncInfo);
  1138. client->Destory();
  1139. }
  1140. };
  1141. #endif //__CARD_ISSUER_FSM_H