HolderContextFSM.h 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025
  1. #pragma once
  2. #include "SpBase.h"
  3. #include "SpFSM.h"
  4. #include "SpSecureClient.h"
  5. #include "HolderContext_msg_g.h"
  6. #include "..\mod_counterconnector\CounterConnector_client_g.h"
  7. #include <list.h>
  8. #include<string.h>
  9. #include<vector>
  10. #include<iostream>
  11. #include <sstream>
  12. #include<stack>
  13. using namespace std;
  14. using namespace HolderContext;
  15. using namespace CounterConnector;
  16. #define USER_EVT_JMP_IDENTIFIED EVT_USER+1
  17. #define USER_EVT_JMP_STANDBY EVT_USER+2
  18. #define USER_EVT_JMP_RINGING EVT_USER+3
  19. #define USER_EVT_JMP_ONLINE EVT_USER+4
  20. #define USER_EVT_JMP_DEALING EVT_USER+5
  21. #define USER_EVT_JMP_EDIT EVT_USER+6
  22. #define USER_EVT_JMP_DISCONNECT EVT_USER+7
  23. #define USER_EVT_JMP_LOCAL EVT_USER+8
  24. #define USER_EVT_JMP_WORKING EVT_USER+9
  25. #define USER_EVT_JMP_UNSERVICE EVT_USER+10
  26. #define USER_EVT_JMP_NOTHELD EVT_USER+11
  27. #define USER_EVT_JMP_BUSY EVT_USER+12
  28. #define USER_EVT_JMP_EDITEND EVT_USER+13
  29. #define USER_EVT_JMP_NONE EVT_USER+14
  30. #define USER_EVT_HOLDERSTATE_ANS EVT_USER+15
  31. #define USER_EVT_MESSAGE_ANS EVT_USER+16
  32. #define USER_EVT_HOLDERSKILL_ANS EVT_USER+17
  33. //用户类型
  34. #define USER_TYPE_MAINTAIN 00 //维护用户
  35. #define USER_TYPE_MATERIAL_MANAGER 01 //物料管理用户
  36. #define USER_TYPE_CUSTOMER_MANAGER 02 //客户经理
  37. #define USER_TYPE_AGENT3 03 //Agent3用户
  38. #define USER_TYPE_FINANCING_MANAGER 04 //理财经理
  39. //机型
  40. #define MACHINETYPE_STAND2S "RVC.Stand2S" //站立式双屏
  41. #define MACHINETYPE_STAND1S "RVC.Stand1S" //站立式单屏
  42. #define MACHINETYPE_WALL "RVC.Wall" //挂墙式
  43. #define MACHINETYPE_EMBED2S "RVC.Embed2S" //嵌墙式双屏
  44. #define MACHINETYPE_EMBED1S "RVC.Embed1S" //嵌墙式单屏
  45. #define MACHINETYPE_PAD "RVC.PAD" //携带式移动终端
  46. //场所
  47. #define SIT_LIB "cmb.LIB" //银行大堂内
  48. #define SIT_SSB "cmb.SSB" //自助营业网点
  49. #define SIT_FLB "cmb.FLB" //离行机器,银行业务为主界面,如企业,商场
  50. #define SIT_LSS "cmb.LSS" //面向生活销售机,一般部署在小区,面向销售广告
  51. #define SIT_SMM "cmb.SMM" //商场销售门户,放置在商场,多商户门户
  52. #define ERR_NO_CONNECTRIGHT 901 //没有远程服务权限
  53. #define ERR_CONNECTSERVICE_FROM_CENTER 902 //根据集中配置连接指令服务失败
  54. #define ERR_CONNECT 903 //网络异常,无法连接指令服务
  55. #define ERR_SEND_REQ 904
  56. #define ERR_RECIEVE_ANS 905
  57. #define ERR_INVALID_ANS 906
  58. //add code by @wb
  59. #define FIX_UPLOAD_TIMER 17000 //固定上报时间
  60. #define FIX_CHECK_LIST_TIMER 2000 //固定状态list检查时间
  61. #define FIX_DWTICK_TIMER 6000 // 固定超时检测时间
  62. #define FIX_SETSTATE_TIMER 1000 //固定设置状态后的等待时间
  63. #define FIX_SETSTATE_TIMER_1 2000
  64. //定义list中package最大数量
  65. #define PACKAGE_MAX_NUM 3
  66. //定义recvState最大数量
  67. #define RECV_MAX_NUM 600
  68. // [StructName("HolderState")]
  69. struct HolderState
  70. {
  71. CSimpleStringA HolderID; //持有者AgentID
  72. CSimpleStringA TerminalNo; //终端号
  73. CSimpleStringA State; //持有者状态
  74. //CSimpleStringA HolderPosition; //持有者位置
  75. //CSimpleStringA HolderSkill; //持有者技能
  76. };
  77. // [StructName("HolderStateReqEx")]
  78. struct HolderStateReqEx
  79. {
  80. char HolderID[16];
  81. char TerminalNo[10];
  82. char State[1];
  83. char BranceNo[4];
  84. char IP[16];
  85. char Port[8];
  86. //add code by @wb
  87. char nSkillSets[1];
  88. char SerialNumber[64]; //确认序列号(唯一标识)
  89. char SerialID[1]; //确认ID
  90. char dwNow[16]; //时间戳
  91. };
  92. //add code by @wb
  93. //用于状态上报
  94. //struct HandleReqState
  95. //{
  96. // //struct list_head entry;
  97. // //CSmartPointer<IPackage> package;
  98. // HolderStateReqEx *hsReq;
  99. //};
  100. //extern struct list_head hdStateList_head;
  101. // [StructName("HolderStateAnsEx")]
  102. struct HolderStateAnsEx
  103. {
  104. int nRet;
  105. //add code by @wb
  106. char SerialNumber[64]; //确认序列号(唯一标识)
  107. char SerialID[1]; //确认ID
  108. char dwNow[16]; //时间戳
  109. };
  110. //[StructName("StateAnsEx")]
  111. //新增用于总行状态的确认回复
  112. struct HdStaAns
  113. {
  114. int nRet;
  115. char HolderID[16];
  116. char TerminalNo[10];
  117. char State[1];
  118. char SerialNumber[64]; //确认序列号(唯一标识)
  119. char SerialID[1]; //确认ID
  120. char dwNow[16]; //时间戳
  121. };
  122. //add code by @wb
  123. //[StructName("InsReqEx")]
  124. struct InstrReqEx
  125. {
  126. char InstrucID[64]; //指令唯一标识
  127. char InstrucCSeq[64];
  128. char InstrucGenarateTime[32];
  129. char InstrucLastSendTime[32];
  130. char HolderID[16]; //持有人ID
  131. int EvtCode; //指令序列号
  132. char InstrType[1]; //指令类型,连线指令为"O"
  133. unsigned char CommandParam[256]; //指令内容
  134. };
  135. //add code by @wb
  136. //[StructName("InstrPushAns")]
  137. struct InstrAnsEx
  138. {
  139. char InstrucID[64]; //指令唯一标识
  140. int EvtCode; //指令序列号
  141. int Errmsg; //错误消息
  142. };
  143. struct HolderStateAnsEvent : public FSMEvent
  144. {
  145. HolderStateAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_HOLDERSTATE_ANS)
  146. {
  147. memcpy(&m_reply, pBuf, sizeof(HolderStateAnsEx));
  148. }
  149. virtual ~HolderStateAnsEvent() {}
  150. HolderStateAnsEx m_reply;
  151. };
  152. // [StructName("MessageReq")]
  153. struct MessageReq
  154. {
  155. char AgentID[16]; //用户号
  156. char MessageID[8]; //消息号,上个最大号,如果都要就填0
  157. };
  158. // [StructName("MessageAns")]
  159. struct MessageAns
  160. {
  161. char MessageID[8]; //当前消息编号s
  162. char ExpireTime[20]; //消息失效时间,如果当前时间大于失效时间,消息丢弃
  163. char MessageType[1]; //消息类型
  164. char ImportantLevel[1]; //重要级别
  165. char Competitive[1]; //是否竞争性任务
  166. char ContinuinglyFlag[1]; //续传标志位
  167. char ServiceCode[32]; //业务类型码
  168. char Data[1024]; //消息内容,可以是信息,流程入口和参数,变长数据
  169. };
  170. struct MessageAnsEvent : public FSMEvent
  171. {
  172. MessageAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_MESSAGE_ANS)
  173. {
  174. memcpy(&m_reply, pBuf, sizeof(MessageAns));
  175. }
  176. virtual ~MessageAnsEvent() {}
  177. MessageAns m_reply;
  178. };
  179. // [StructName("HolderSkillReq")]
  180. struct HolderSkillReq
  181. {
  182. char AgentID[10]; //用户号
  183. };
  184. // [StructName("HolderSkillAns")]
  185. struct HolderSkillAns
  186. {
  187. char HolderSkill[128]; //持有者技能
  188. };
  189. struct HolderSkillAnsEvent : public FSMEvent
  190. {
  191. HolderSkillAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_HOLDERSKILL_ANS)
  192. {
  193. memcpy(&m_reply, pBuf, sizeof(HolderSkillAns));
  194. }
  195. virtual ~HolderSkillAnsEvent() {}
  196. HolderSkillAns m_reply;
  197. };
  198. class instructionsServerConnection;
  199. class HolderContextFSM : public FSMImpl<HolderContextFSM>, public IFSMStateHooker
  200. {
  201. public:
  202. enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12};
  203. BEGIN_FSM_STATE(HolderContextFSM)
  204. FSM_STATE_ENTRY(s0,"None",s0_on_entry,s0_on_exit,s0_on_event)
  205. FSM_STATE_ENTRY(s1,"Identified",s1_on_entry,s1_on_exit,s1_on_event)
  206. FSM_STATE_ENTRY(s2,"Unservice",s2_on_entry,s2_on_exit,s2_on_event)
  207. FSM_STATE_ENTRY(s3,"Standby",s3_on_entry,s3_on_exit,s3_on_event)
  208. FSM_STATE_ENTRY(s4,"NotHeld",s4_on_entry,s4_on_exit,s4_on_event)
  209. FSM_STATE_ENTRY(s5,"Busy",s5_on_entry,s5_on_exit,s5_on_event)
  210. FSM_STATE_ENTRY(s6,"Local",s6_on_entry,s6_on_exit,s6_on_event)
  211. FSM_STATE_ENTRY(s7,"Working",s7_on_entry,s7_on_exit,s7_on_event)
  212. FSM_STATE_ENTRY(s8,"Ringing",s8_on_entry,s8_on_exit,s8_on_event)
  213. FSM_STATE_ENTRY(s9,"Online",s9_on_entry,s9_on_exit,s9_on_event)
  214. FSM_STATE_ENTRY(s10,"Dealing",s10_on_entry,s10_on_exit,s10_on_event)
  215. FSM_STATE_ENTRY(s11,"Edit",s11_on_entry,s11_on_exit,s11_on_event)
  216. FSM_STATE_ENTRY(s12,"Disconnect",s12_on_entry,s12_on_exit,s12_on_event)
  217. END_FSM_STATE()
  218. BEGIN_FSM_RULE(HolderContextFSM,s0)
  219. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_JMP_IDENTIFIED)
  220. FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_JMP_UNSERVICE)
  221. FSM_RULE_ENTRY_ANY(s0, s3, USER_EVT_JMP_STANDBY)
  222. //add s0转s5
  223. FSM_RULE_ENTRY_ANY(s0, s5, USER_EVT_JMP_BUSY)
  224. FSM_RULE_ENTRY_ANY(s1, s0, EVT_TIMER)
  225. FSM_RULE_ENTRY_ANY(s2, s0, EVT_TIMER)
  226. FSM_RULE_ENTRY_ANY(s3, s4, USER_EVT_JMP_NOTHELD)//待确认
  227. FSM_RULE_ENTRY_ANY(s3, s12, USER_EVT_JMP_DISCONNECT)
  228. FSM_RULE_ENTRY_ANY(s3, s5, USER_EVT_JMP_BUSY)//界面点示忙
  229. FSM_RULE_ENTRY_ANY(s3, s6, USER_EVT_JMP_LOCAL)
  230. FSM_RULE_ENTRY_ANY(s3, s8, USER_EVT_JMP_RINGING)
  231. FSM_RULE_ENTRY_ANY(s3, s0, EVT_TIMER)
  232. FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_JMP_NONE)//点签出
  233. FSM_RULE_ENTRY_ANY(s4, s0, EVT_TIMER)
  234. FSM_RULE_ENTRY_ANY(s5, s0, EVT_TIMER)
  235. //add by zl 2017.12.08
  236. FSM_RULE_ENTRY_ANY(s5, s0, USER_EVT_JMP_NONE)
  237. FSM_RULE_ENTRY_ANY(s5, s3, USER_EVT_JMP_STANDBY)
  238. FSM_RULE_ENTRY_ANY(s6, s3, USER_EVT_JMP_STANDBY)
  239. FSM_RULE_ENTRY_ANY(s6, s0, EVT_TIMER)
  240. FSM_RULE_ENTRY_ANY(s8, s3, USER_EVT_JMP_STANDBY)//待确认
  241. FSM_RULE_ENTRY_ANY(s8, s5, USER_EVT_JMP_BUSY)
  242. FSM_RULE_ENTRY_ANY(s8, s9, USER_EVT_JMP_ONLINE)
  243. FSM_RULE_ENTRY_ANY(s8, s10, USER_EVT_JMP_DEALING)
  244. FSM_RULE_ENTRY_ANY(s8, s0, EVT_TIMER)
  245. FSM_RULE_ENTRY_ANY(s9, s10, USER_EVT_JMP_DEALING)
  246. FSM_RULE_ENTRY_ANY(s9, s11, USER_EVT_JMP_EDIT)
  247. FSM_RULE_ENTRY_ANY(s9, s0, EVT_TIMER)
  248. FSM_RULE_ENTRY_ANY(s10, s11, USER_EVT_JMP_EDIT)
  249. FSM_RULE_ENTRY_ANY(s10, s0, EVT_TIMER)
  250. FSM_RULE_ENTRY_ANY(s11, s0, EVT_TIMER)
  251. FSM_RULE_ENTRY_ANY(s11, s3, USER_EVT_JMP_EDITEND)
  252. FSM_RULE_ENTRY_ANY(s12, s3, USER_EVT_JMP_STANDBY)
  253. FSM_RULE_ENTRY_ANY(s12, s0, EVT_TIMER)
  254. END_FSM_RULE()
  255. HolderContextFSM();
  256. ~HolderContextFSM();
  257. virtual void OnStateTrans(int iSrcState, int iDstState);
  258. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  259. virtual ErrorCodeEnum OnInit();
  260. virtual ErrorCodeEnum OnExit();
  261. void s0_on_entry();
  262. void s0_on_exit();
  263. unsigned int s0_on_event(FSMEvent* event);
  264. void s1_on_entry();
  265. void s1_on_exit();
  266. unsigned int s1_on_event(FSMEvent* event);
  267. void s2_on_entry();
  268. void s2_on_exit();
  269. unsigned int s2_on_event(FSMEvent* event);
  270. void s3_on_entry();
  271. void s3_on_exit();
  272. unsigned int s3_on_event(FSMEvent* event);
  273. void s4_on_entry();
  274. void s4_on_exit();
  275. unsigned int s4_on_event(FSMEvent* event);
  276. void s5_on_entry();
  277. void s5_on_exit();
  278. unsigned int s5_on_event(FSMEvent* event);
  279. void s6_on_entry();
  280. void s6_on_exit();
  281. unsigned int s6_on_event(FSMEvent* event);
  282. void s7_on_entry();
  283. void s7_on_exit();
  284. unsigned int s7_on_event(FSMEvent* event);
  285. void s8_on_entry();
  286. void s8_on_exit();
  287. unsigned int s8_on_event(FSMEvent* event);
  288. void s9_on_entry();
  289. void s9_on_exit();
  290. unsigned int s9_on_event(FSMEvent* event);
  291. void s10_on_entry();
  292. void s10_on_exit();
  293. unsigned int s10_on_event(FSMEvent* event);
  294. void s11_on_entry();
  295. void s11_on_exit();
  296. unsigned int s11_on_event(FSMEvent* event);
  297. void s12_on_entry();
  298. void s12_on_exit();
  299. unsigned int s12_on_event(FSMEvent* event);
  300. BOOL GetCallState();
  301. BOOL GetHolderState();
  302. BOOL SetHolderState(CSimpleStringA strState);
  303. BOOL GetHolderRights();//获取当前持有者是否有在线服务权限,Agent3数据库查询
  304. BOOL GetHolderMsg(CSimpleStringA strHolderInfo);
  305. //add code by @wb
  306. //上报持有者状态
  307. BOOL UploadHolderState();
  308. //BOOL TimerUploadHolderState();
  309. //add code by @wb
  310. //重传持有者状态确认包
  311. BOOL ReTransmissReq(HolderStateReqEx req);
  312. //DWORD HandleInstrution(const char *pszInstraction);
  313. //BOOL GetConnectTaskFromInstrationServer();
  314. //add code by @wb
  315. //关闭终端到分行服务连接
  316. void Disconnect();
  317. //重连操作
  318. void Reconnect();
  319. BOOL SendConnectTask();
  320. BOOL HangupTask();
  321. DWORD CheckHolderRights();
  322. DWORD QueryHolderSkill();
  323. BOOL GetEntityState(CSimpleStringA strEntityName, int &nState);
  324. DWORD FindSubStr(const char* source, const char* target);
  325. void SetErrMsg(DWORD dwErrcode, CSimpleStringA strErrmsg);
  326. CSimpleStringA m_strCallstate;
  327. HolderState m_HolderState;
  328. CSimpleStringA m_strHolderInfo;
  329. char m_cTaskData[1024]; //任务内容
  330. char m_cHolderSkill[128]; //技能内容
  331. BOOL m_bLogon;//持有者是否签入,0(未签入);1(签入)
  332. CSimpleStringA m_strErrmsg;
  333. DWORD m_nErrcode;
  334. BOOL m_bHolderBusy;//终端业务界面点击示忙,此时不响应callsate的状态变化,直至点示闲才响应callsate的状态。
  335. BOOL m_bMenu; //是否在首页状态
  336. CSimpleStringA m_CurCallState; //当前通话状态
  337. BOOL m_bIncomeHangup; //接通前客户主动挂断标志
  338. //定义vector来存储上报状态
  339. std::vector<HolderStateReqEx>reqStateVec;
  340. //定义vector用于总行上报状态的确认
  341. std::vector<HolderStateReqEx>hdStateReqVec;
  342. //定义vector用于总行确认个数统计确认
  343. std::vector<char>StateAnsNum;
  344. //设置一个状态恢复的vector
  345. std::vector<char>recvState;
  346. CRITICAL_SECTION cs;
  347. private:
  348. //读配置文件
  349. ErrorCodeEnum LoadRootConfig();
  350. ErrorCodeEnum LoadCenterConfig();
  351. CSimpleStringA m_StringVerifyKey,m_StringConsoleName;
  352. CSimpleStringA m_strMachineType, m_strSite;
  353. ErrorCodeEnum AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData);
  354. ErrorCodeEnum AsyncStopEntity(const char *entity_name, void *pData);
  355. instructionsServerConnection *m_pConnection;
  356. CSimpleStringA m_strTerminalNo; //终端号
  357. unsigned int m_RecordNum; //当前终端号对应的任务记录数
  358. ConnectService_ClientBase *m_pConnectService;
  359. protected:
  360. };
  361. class instructionsServerConnection : public SpSecureClient
  362. {
  363. public:
  364. instructionsServerConnection(CEntityBase *pEntity, HolderContextFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM) {}
  365. virtual ~instructionsServerConnection() {}
  366. void SendHolderStateReq()
  367. {
  368. HolderStateReqEx req={0};
  369. //标识用于重传的标识ID
  370. int countID = 1;
  371. // 压力测试
  372. // for(int i = 0; i < 100; ++ i)
  373. // {
  374. //增加HolderID不为空以及空格的判断
  375. if(m_pFSM->m_HolderState.HolderID.GetLength() > 2)
  376. {
  377. memcpy(req.HolderID, m_pFSM->m_HolderState.HolderID, m_pFSM->m_HolderState.HolderID.GetLength());
  378. Dbg("@wb req.HolderID%s", req.HolderID);
  379. memcpy(req.TerminalNo, m_pFSM->m_HolderState.TerminalNo, 10);
  380. memcpy(req.State,m_pFSM->m_HolderState.State, 1);
  381. //add code by @wb
  382. //获取唯一的序列号
  383. CUUID m_uid = CUUID::Create(m_uid);
  384. memcpy(req.SerialNumber, m_uid.ToString(), strlen( m_uid.ToString()));
  385. Dbg("@wb req.SerialNumber%s", req.SerialNumber);
  386. char ID[4] = {0};
  387. sprintf(ID, "%d", countID);
  388. memcpy(req.SerialID, ID, strlen(ID));
  389. Dbg("SerialID %s", req.SerialID);
  390. ////获取时间戳
  391. char time[16] = {0};
  392. long tc = GetTickCount();
  393. //sprintf(time, "%dl", tc);
  394. ltoa(tc, time, 10);
  395. memcpy(req.dwNow, time, strlen(time));
  396. Dbg("@wb req.dwNow%s ", req.dwNow);
  397. CSmartPointer<IPackage> pkt = CreateNewPackage("StaReqEx");
  398. pkt->AddStruct("HolderStateReqEx", false, false, (LPBYTE)&req, sizeof(HolderStateReqEx));
  399. if (SendPackage(pkt) == "")
  400. {
  401. Dbg("SendPackage failed, send [%s] sate[%s] failed", req.HolderID, req.State);
  402. m_pFSM->SetErrMsg(ERR_SEND_REQ,"上报持有者状态失败");
  403. return;
  404. }
  405. else
  406. {
  407. Dbg("send holder[%s] sate[%s] success", req.HolderID, req.State);
  408. EnterCriticalSection(&m_pFSM->cs);
  409. Dbg("push the req to reqStateVec");
  410. m_pFSM->reqStateVec.push_back(req);
  411. if(_strnicmp(req.State, "N", strlen("N")) != 0)
  412. {
  413. Dbg("push the req to hdStateReqVec");
  414. m_pFSM->hdStateReqVec.push_back(req);
  415. }
  416. LeaveCriticalSection(&m_pFSM->cs);
  417. Dbg("tmp->hsReq %s",req.SerialNumber);
  418. Dbg("send holder[%s] sate[%s] success", req.HolderID, req.State);
  419. }
  420. }
  421. // }
  422. }
  423. void reSendHdStateReq(HolderStateReqEx req)
  424. {
  425. CSmartPointer<IPackage> pkt = CreateNewPackage("StaReqEx");
  426. pkt->AddStruct("HolderStateReqEx", false, false, (LPBYTE)&req, sizeof(HolderStateReqEx));
  427. //reSend上报状态
  428. if (SendPackage(pkt) == "")
  429. {
  430. Dbg("reSendPackage failed, send [%s] sate[%s] failed", req.HolderID, req.State);
  431. m_pFSM->SetErrMsg(ERR_SEND_REQ,"重新上报持有者状态失败");
  432. return;
  433. }
  434. else
  435. {
  436. EnterCriticalSection(&m_pFSM->cs);
  437. Dbg("push the req to reqStateVec");
  438. m_pFSM->reqStateVec.push_back(req);
  439. if(_strnicmp(req.State, "N", strlen("N")) != 0)
  440. {
  441. Dbg("push the req to hdStateReqVec");
  442. m_pFSM->hdStateReqVec.push_back(req);
  443. }
  444. LeaveCriticalSection(&m_pFSM->cs);
  445. Dbg("reSend holder[%s] sate[%s] SerialNumber[%s] success", req.HolderID, req.State, req.SerialNumber);
  446. Dbg("m_pFSM->reqStateVec.size() %d", m_pFSM->reqStateVec.size());
  447. }
  448. }
  449. void SendMessageReq()
  450. {
  451. MessageReq req = {0};
  452. Dbg("SendMessageReq, HolderID:%s", m_pFSM->m_HolderState.HolderID);
  453. memcpy(req.AgentID, m_pFSM->m_HolderState.HolderID, m_pFSM->m_HolderState.HolderID.GetLength());
  454. //memcpy(req.MessageID, 0, 8);//消息ID设为0,全部取 TODO:为什么此处会导致lost
  455. CSmartPointer<IPackage> pkt = CreateNewPackage("MesReq");
  456. pkt->AddStruct("MessageReq", false, false, (LPBYTE)&req, sizeof(MessageReq));
  457. if (SendPackage(pkt) == "")
  458. {
  459. Dbg("SendPackage failed, send [%s] MesReq failed", req.AgentID);
  460. m_pFSM->SetErrMsg(ERR_SEND_REQ,"发送连线任务请求失败");
  461. return;
  462. }
  463. else
  464. {
  465. Dbg("send holder[%s] MesReq success", req.AgentID);
  466. }
  467. }
  468. DWORD SendHolderSkillReq()
  469. {
  470. HolderSkillReq req = {0};
  471. //消息ID设为0,全部取
  472. CSimpleStringA strAgentID = "SP";
  473. strAgentID += m_pFSM->m_HolderState.HolderID;
  474. memcpy(req.AgentID, strAgentID, strAgentID.GetLength());
  475. CSmartPointer<IPackage> pkt = CreateNewPackage("HdSkiReq");
  476. pkt->AddStruct("HolderSkillReq", false, false, (LPBYTE)&req, sizeof(HolderSkillReq));
  477. if (SendPackage(pkt) == "")
  478. {
  479. Dbg("SendPackage failed, send holder skill req failed");
  480. m_pFSM->SetErrMsg(ERR_SEND_REQ,"发送资质查询请求失败");
  481. return ERR_SEND_REQ;
  482. }
  483. else
  484. {
  485. Dbg("send holder skill req success");
  486. }
  487. auto pRetPkg = ReceivePackage(5);
  488. if (pRetPkg == NULL)
  489. {
  490. Dbg("ReceivePackage failed, don't revceive holder skill ans");
  491. m_pFSM->SetErrMsg(ERR_RECIEVE_ANS,"接收资质查询响应失败");
  492. return ERR_RECIEVE_ANS;
  493. }
  494. ErrorCodeEnum rc = Error_Succeed;
  495. DWORD dwSysCode, dwUserCode;
  496. string strErrMsg;
  497. CSimpleStringA strRetErrMsg;
  498. if (pRetPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  499. {
  500. rc = (ErrorCodeEnum)dwSysCode;
  501. LogError(Severity_Middle, rc, dwUserCode, strErrMsg.c_str());
  502. strRetErrMsg = strErrMsg.c_str();
  503. m_pFSM->SetErrMsg(rc, strRetErrMsg);
  504. return rc;
  505. }
  506. int nLen = pRetPkg->GetStructLen("HolderSkillAns");
  507. if (nLen > 0)
  508. {
  509. BYTE *pBuf = new BYTE[nLen];
  510. memset(pBuf, 0, nLen);
  511. int nArrayNum = 0;
  512. if (pRetPkg->GetStructData("HolderSkillAns", pBuf, &nLen, &nArrayNum))
  513. {
  514. Dbg("收到HolderSkillAns");
  515. FSMEvent *evt = new HolderSkillAnsEvent(pBuf, nLen);
  516. HolderSkillAnsEvent *ans = (HolderSkillAnsEvent *)evt;
  517. memcpy(m_pFSM->m_cHolderSkill,ans->m_reply.HolderSkill,128);
  518. /*CSimpleStringA strSkill = m_pFSM->m_cHolderSkill;
  519. Dbg("[%s]技能列表[%s]",strAgentID,strSkill.GetData());*/
  520. delete evt;
  521. }
  522. else
  523. {
  524. m_pFSM->SetErrMsg(ERR_INVALID_ANS,"无效的资质查询响应");
  525. Dbg("get invalid HolderSkillAns packet!");
  526. return ERR_INVALID_ANS;
  527. }
  528. delete pBuf;
  529. return Error_Succeed;
  530. }
  531. else
  532. {
  533. Dbg("get GetStructLen len failed!");
  534. return ERR_INVALID_ANS;
  535. }
  536. }
  537. void HandleHolderStateAns(const CSmartPointer<IPackage> &pRecvPkg)
  538. {
  539. ErrorCodeEnum rc = Error_Succeed;
  540. DWORD dwSysCode, dwUserCode;
  541. string strErrMsg;
  542. CSimpleStringA strRetErrMsg;
  543. Dbg("start recieve ans");
  544. char SerialNum[64];
  545. //struct HandleReqState tp;
  546. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  547. {
  548. rc = (ErrorCodeEnum)dwSysCode;
  549. LogError(Severity_Middle, rc, dwUserCode, strErrMsg.c_str());
  550. strRetErrMsg = strErrMsg.c_str();
  551. m_pFSM->SetErrMsg(rc, strRetErrMsg);
  552. return;
  553. }
  554. int nLen = pRecvPkg->GetStructLen("HolderStateAnsEx");
  555. Dbg("start GetStructLen ans");
  556. if (nLen > 0)
  557. {
  558. BYTE *pBuf = new BYTE[nLen];
  559. memset(pBuf, 0, nLen);
  560. int nArrayNum = 0;
  561. Dbg("start GetStructLen ans >0");
  562. if (pRecvPkg->GetStructData("HolderStateAnsEx", pBuf, &nLen, &nArrayNum))
  563. {
  564. FSMEvent *evt = new HolderStateAnsEvent(pBuf, nLen);
  565. HolderStateAnsEvent *ans = (HolderStateAnsEvent *)evt;
  566. Dbg("start GetStruct nRet %s", ans->m_reply.nRet);
  567. if (0 == ans->m_reply.nRet)
  568. {
  569. Dbg("HolderStateAnsEx return ok!");
  570. //处理分行服务端的回包 ,将reqStateVec中对应的发包进行删除
  571. memcpy(SerialNum, ans->m_reply.SerialNumber, 64);
  572. Dbg("SerialNum is %s", SerialNum);
  573. EnterCriticalSection(&m_pFSM->cs);
  574. Dbg("m_pFSM->reqStateVec.size() %d", m_pFSM->reqStateVec.size());
  575. int m_size = m_pFSM->reqStateVec.size();
  576. for (int i = m_size-1; i >= 0; i --)
  577. {
  578. if(strncmp((m_pFSM->reqStateVec)[i].SerialNumber, SerialNum, 64) == 0)
  579. {
  580. Dbg("(m_pFSM->reqStateVec)[i].hsReq->SerialNumber %s", (m_pFSM->reqStateVec)[i].SerialNumber);
  581. (m_pFSM->reqStateVec).erase((m_pFSM->reqStateVec).begin()+i);
  582. Dbg("m_pFSM->reqStateVec %d", m_pFSM->reqStateVec.size());
  583. //m_size --;
  584. }
  585. }
  586. LeaveCriticalSection(&m_pFSM->cs);
  587. }
  588. else
  589. {
  590. Dbg("HolderStateAnsEx return failed!");
  591. }
  592. delete evt;
  593. }
  594. else
  595. {
  596. Dbg("get invalid HolderStateAnsEx packet!");
  597. }
  598. delete pBuf;
  599. // return;
  600. }
  601. return;
  602. }
  603. void HandleIncomeHangupTask()
  604. {
  605. m_pFSM->HangupTask();
  606. //add广播客户端主动挂断eMsg_incomeHangup消息
  607. Connecting e;
  608. SpSendBroadcast(m_pEntity->GetFunction(),eMsg_incomeHangup , eMsgSig_incomeHangup, e);
  609. Dbg("SpSendBroadcast eMsg_incomeHangup");
  610. }
  611. //add code by @wb
  612. //接收分行推送指令处理
  613. void RecieveInstruction(const CSmartPointer<IPackage> &pRecvPkg)
  614. {
  615. ErrorCodeEnum rc = Error_Succeed;
  616. DWORD dwSysCode, dwUserCode;
  617. string strErrMsg;
  618. CSimpleStringA strRetErrMsg;
  619. InstrReqEx m_req;
  620. InstrAnsEx ans = {0};
  621. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  622. {
  623. rc = (ErrorCodeEnum)dwSysCode;
  624. LogError(Severity_Middle, rc, dwUserCode, strErrMsg.c_str());
  625. strRetErrMsg = strErrMsg.c_str();
  626. m_pFSM->SetErrMsg(rc, strRetErrMsg);
  627. return;
  628. }
  629. //获取指令Req
  630. int nLen = pRecvPkg->GetStructLen("InsReqEx");
  631. if (nLen > 0)
  632. {
  633. BYTE *pBuf = new BYTE[nLen];
  634. memset(pBuf, 0, nLen);
  635. int nArrayNum = 0;
  636. if (pRecvPkg->GetStructData("InsReqEx", pBuf, &nLen, &nArrayNum))
  637. {
  638. memcpy(&m_req, pBuf, sizeof(InstrReqEx));
  639. if (_strnicmp(m_req.InstrType, "O", strlen("O")) == 0)
  640. {
  641. //连线任务(O)
  642. Dbg("收到连线任务");
  643. memcpy(m_pFSM->m_cTaskData, m_req.CommandParam, 256);
  644. m_pFSM->SetHolderState("R");//进入振铃状态
  645. m_pFSM->m_bIncomeHangup = FALSE;
  646. }
  647. else if (_strnicmp(m_req.InstrType, "I", strlen("I")) == 0)
  648. {
  649. //用户信息(I)
  650. Dbg("收到用户信息");
  651. }
  652. else if (_strnicmp(m_req.InstrType, "L", strlen("L")) == 0)
  653. {
  654. //现场求助任务(L)
  655. Dbg("收到现场求助任务指令");
  656. }
  657. else if (_strnicmp(m_req.InstrType, "T", strlen("T")) == 0)
  658. {
  659. //现场转移任务(T)
  660. Dbg("收到现场转移任务");
  661. }
  662. else if (_strnicmp(m_req.InstrType, "F", strlen("F")) == 0)
  663. {
  664. //流程任务(F)
  665. Dbg("收到流程任务");
  666. }
  667. else if (_strnicmp(m_req.InstrType, "C", strlen("C")) == 0)
  668. {
  669. //取消任务(C)
  670. Dbg("收到取消任务");
  671. m_pFSM->m_bIncomeHangup = TRUE;
  672. //执行挂断操作
  673. HandleIncomeHangupTask();
  674. }
  675. else if (_strnicmp(m_req.InstrType, "S", strlen("S")) == 0)
  676. {
  677. //框架指令(S)
  678. Dbg("收到框架指令");
  679. }
  680. else if (_strnicmp(m_req.InstrType, "N", strlen("N")) == 0)
  681. {
  682. //没有任务(N)
  683. Dbg("当前用户没有任务");
  684. }
  685. else
  686. {
  687. Dbg("收到指令类型无法识别,[%s]", m_req.InstrType);
  688. }
  689. //Sleep(5000);
  690. memcpy(ans.InstrucID, m_req.InstrucID, strlen(m_req.InstrucID));
  691. ans.EvtCode = m_req.EvtCode;
  692. CSmartPointer<IPackage> pkt = CreateNewPackage("InsAnsEx");
  693. pkt->AddStruct("InsAnsEx", false, false, (LPBYTE)&ans, sizeof(InstrAnsEx));
  694. //发送指令回复包
  695. if (SendPackage(pkt) == "")
  696. {
  697. Dbg("SendPackage failed, send InstrPush ans failed");
  698. m_pFSM->SetErrMsg(ERR_SEND_REQ,"发送收到指令数据包失败");
  699. }
  700. else
  701. {
  702. Dbg("send InstrPush ans success");
  703. }
  704. }
  705. else
  706. {
  707. Dbg("get invalid RecieveInstruction packet!");
  708. }
  709. delete pBuf;
  710. }
  711. return;
  712. }
  713. //接收到总行直接回复的状态确认包
  714. void RecieveStateAns(const CSmartPointer<IPackage> &pRecvPkg)
  715. {
  716. ErrorCodeEnum rc = Error_Succeed;
  717. DWORD dwSysCode, dwUserCode;
  718. string strErrMsg;
  719. CSimpleStringA strRetErrMsg;
  720. HdStaAns m_ans = {0};
  721. char SerialNum[64];
  722. char State_value[10] = {0};
  723. char Recover_state[10] = {0};
  724. int m_size = m_pFSM->hdStateReqVec.size();
  725. Dbg("hdStateReqVec size is %d ", m_size);
  726. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  727. {
  728. rc = (ErrorCodeEnum)dwSysCode;
  729. LogError(Severity_Middle, rc, dwUserCode, strErrMsg.c_str());
  730. strRetErrMsg = strErrMsg.c_str();
  731. m_pFSM->SetErrMsg(rc, strRetErrMsg);
  732. return;
  733. }
  734. //获取总行状态回复HdStaAns
  735. int nLen = pRecvPkg->GetStructLen("HdStaAns");
  736. if (nLen > 0)
  737. {
  738. BYTE *pBuf = new BYTE[nLen];
  739. memset(pBuf, 0, nLen);
  740. int nArrayNum = 0;
  741. if (pRecvPkg->GetStructData("HdStaAns", pBuf, &nLen, &nArrayNum))
  742. {
  743. //同步总行状态
  744. memcpy(&m_ans, pBuf, sizeof(HdStaAns));
  745. //获取唯一标识
  746. memcpy(SerialNum, m_ans.SerialNumber, 64);
  747. Dbg("HdStaAns SerialNum is %s", SerialNum);
  748. memcpy(State_value, m_ans.State, 1);
  749. Dbg("HdStaAns state is %s", State_value);
  750. if(_strnicmp(State_value, "N", strlen("N")) != 0)
  751. {
  752. m_pFSM->recvState.push_back(State_value[0]);
  753. }
  754. int n_size = m_pFSM->recvState.size();
  755. Dbg("recvState size %d", n_size);
  756. EnterCriticalSection(&m_pFSM->cs);
  757. Dbg("StateAnsNum size%d", m_pFSM->StateAnsNum.size());
  758. if(m_pFSM->StateAnsNum.size() == 0)
  759. {
  760. Dbg("push the state %s for StateAnsNum!", State_value);
  761. EnterCriticalSection(&m_pFSM->cs);
  762. m_pFSM->StateAnsNum.push_back(State_value[0]);
  763. LeaveCriticalSection(&m_pFSM->cs);
  764. }
  765. else
  766. {
  767. Dbg("compare the state%c", State_value[0]);
  768. Dbg("compare the StateAnsNum state%c", (m_pFSM->StateAnsNum)[0]);
  769. if(State_value[0] == ((m_pFSM->StateAnsNum)[0]))
  770. {
  771. //避免数组出现越界
  772. if(_strnicmp(State_value, "N", strlen("N")) == 0)
  773. {
  774. if(n_size > 0)
  775. {
  776. //恢复成离线前的状态
  777. Dbg("Recover_state state is %c", (m_pFSM->recvState)[n_size-1]);
  778. Dbg("Recover State from central server and Set HolderState to %c state!", (m_pFSM->recvState)[n_size-1]);
  779. char tmp[2];
  780. tmp[0] = (m_pFSM->recvState)[n_size-1];
  781. tmp[1] = '\0';
  782. m_pFSM->SetHolderState(tmp);
  783. EnterCriticalSection(&m_pFSM->cs);
  784. m_pFSM->recvState.clear();
  785. LeaveCriticalSection(&m_pFSM->cs);
  786. }
  787. else
  788. {
  789. m_pFSM->SetHolderState("S");
  790. }
  791. }
  792. else
  793. {
  794. Dbg("Update State from central server and Set HolderState to %s state!", State_value);
  795. m_pFSM->SetHolderState(State_value);
  796. }
  797. }
  798. //有无同步状态都需要清空StateAnsNum存储的state value
  799. m_pFSM->StateAnsNum.clear();
  800. }
  801. //说明与总行连接没有问题,直接清空所有积累的包
  802. //m_pFSM->hdStateReqVec.clear();
  803. Dbg("hdStateReqVec size is %d", m_size);
  804. //说明和总行连接没有问题,删除所有拥有相同state的数据包
  805. for (int i = m_size-1; i >= 0; i --)
  806. {
  807. if(strncmp((m_pFSM->hdStateReqVec)[i].State, State_value, 1) == 0)
  808. {
  809. Dbg("(Remove m_pFSM->hdStateReqVec)[i].State is %s", (m_pFSM->hdStateReqVec)[i].State);
  810. (m_pFSM->hdStateReqVec).erase((m_pFSM->hdStateReqVec).begin()+i);
  811. }
  812. }
  813. LeaveCriticalSection(&m_pFSM->cs);
  814. }
  815. delete pBuf;
  816. }
  817. return;
  818. }
  819. //add code by @wb
  820. //断开分行服务连接
  821. void handleDisconnect()
  822. {
  823. this->Close();
  824. this->DecRefCount();
  825. }
  826. protected:
  827. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  828. {
  829. string serviceCode = pRecvPkg->GetServiceCode();
  830. Dbg("start OnReceivePackage, serviceCode[%s]",serviceCode.c_str());
  831. if (serviceCode == "StaReqEx")
  832. {
  833. HandleHolderStateAns(pRecvPkg);
  834. }
  835. //add code by @wb
  836. //处理指令req
  837. else if(serviceCode == "InsReqEx")
  838. {
  839. RecieveInstruction(pRecvPkg);
  840. }
  841. else if(serviceCode == "HdStaAns")
  842. {
  843. RecieveStateAns(pRecvPkg);
  844. }
  845. else
  846. {
  847. Dbg("unknown service code!");
  848. //OnDisconnect();
  849. }
  850. };
  851. virtual void OnReceivePackage(IPackage *pRecvPkg)
  852. {
  853. }
  854. private:
  855. HolderContextFSM *m_pFSM;
  856. };