UploadFSM.h 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #ifndef RVC_MOD_UPLOAD_UPLOADFSM_H_
  2. #define RVC_MOD_UPLOAD_UPLOADFSM_H_
  3. #include "SpBase.h"
  4. #include "SpFSM.h"
  5. #include "SpSecureClient.h"
  6. #include "upload.h"
  7. #include <list>
  8. #include <set>
  9. #include "IHttpFunc.h"
  10. #ifdef RVC_OS_WIN
  11. #include <io.h>
  12. #else
  13. #include "SpUtility.h"
  14. #endif
  15. #include <map>
  16. #include "json/json.h"
  17. #include "Upload_UserErrorCode.h"
  18. #define USER_EVT_JMP_DISABLE EVT_USER+1
  19. #define USER_EVT_JMP_ENABLE EVT_USER+2
  20. #define USER_EVT_JMP_CONNECT EVT_USER+3
  21. #define USER_EVT_DISCONNECT EVT_USER+4
  22. #define USER_EVT_UPLOAD_ANS EVT_USER+5
  23. #define USER_EVT_BLOCK_ANS EVT_USER+6
  24. #define USER_EVT_JMP_UPLOAD EVT_USER+7
  25. #define USER_EVT_JMP_OLD_SCAN EVT_USER+8
  26. #define USER_EVT_JMP_NEW_SCAN EVT_USER+9
  27. #define USER_EVT_JMP_NEW_UPLOAD EVT_USER+10
  28. #define USER_EVT_JMP_NEW_DISABLE EVT_USER+11
  29. #define USER_EVT_UPLOAD_SUCC EVT_USER+12
  30. #define USER_EVT_UPLOAD_FAIL EVT_USER+13
  31. using namespace std;
  32. enum CenterModelEnum
  33. {
  34. branchModel = 0, //分行模式
  35. mixModel = 1, //混合模式
  36. centerModel = 2, //总行模式
  37. };
  38. struct CenterUrl
  39. {
  40. string queryPlanUrl; //上传策略查询接口
  41. string queryTempFileUrl; //查询临时计划文件状态接口
  42. string updateStateUrl; //更新上传状态接口
  43. string addUploadFailUrl; //增加失败流水接口
  44. //string uploadCenterUrl; //终端总行上传文件接口
  45. };
  46. //上传接口
  47. struct UploadFileReq : CHTTPUploadReq {
  48. };
  49. struct UploadFileRet : CHTTPUploadRet {
  50. };
  51. struct UploadDataRet{
  52. int uploaded_length;
  53. bool upload_finish;
  54. string branchFilePath;
  55. string strBody;
  56. };
  57. //上传策略查询接口
  58. struct UploadQueryPlanReq : CHTTPReq {
  59. string m_reqStr;
  60. string ToJson() {
  61. return m_reqStr;
  62. }
  63. };
  64. struct UploadQueryPlanRet : CHTTPRet {
  65. string m_retStr;
  66. bool Parse(string strData) {
  67. m_retStr=strData;
  68. return true;
  69. }
  70. };
  71. //查询临时计划文件状态接口
  72. struct UploadQueryTempFileReq : CHTTPReq {
  73. string m_reqStr;
  74. string ToJson() {
  75. return m_reqStr;
  76. }
  77. };
  78. struct UploadQueryTempFileRet : CHTTPRet {
  79. string m_retStr;
  80. bool Parse(string strData) {
  81. m_retStr=strData;
  82. return true;
  83. }
  84. };
  85. //更新上传状态接口
  86. struct UploadUpdateStateReq : CHTTPReq {
  87. string m_reqStr;
  88. string ToJson() {
  89. return m_reqStr;
  90. }
  91. };
  92. struct UploadUpdateStateRet : CHTTPRet {
  93. string m_retStr;
  94. bool Parse(string strData) {
  95. m_retStr=strData;
  96. return true;
  97. }
  98. };
  99. //增加失败流水接口
  100. struct UploadUploadFailReq : CHTTPReq {
  101. string m_reqStr;
  102. string ToJson() {
  103. return m_reqStr;
  104. }
  105. };
  106. struct UploadUploadFailRet : CHTTPRet {
  107. string m_retStr;
  108. bool Parse(string strData) {
  109. m_retStr=strData;
  110. return true;
  111. }
  112. };
  113. ////增加终端路径保存接口
  114. //struct SaveDirPathReq : CHTTPReq {
  115. // string m_reqStr;
  116. // string ToJson() {
  117. // return m_reqStr;
  118. // }
  119. //};
  120. //
  121. //struct SaveDirPathRet : CHTTPRet {
  122. // string m_retStr;
  123. // bool Parse(string strData) {
  124. // m_retStr = strData;
  125. // return true;
  126. // }
  127. //};
  128. struct UploadPlan{
  129. string plan_id;//计划ID
  130. string branch_no;//分行号
  131. string plan_type;//计划类型 T-临时计划(Temp) P-永久计划(Permanent)
  132. string file_type;//文件类型 V-录像文件(Vedio) O-其他文件(Other)
  133. string path_type;//路径类型(R-相对路径,A-绝对路径)
  134. string path_name;//路径
  135. string file_name;//文件名通配符(*表示任意0个或N个字符,如*.* *xx xx*)
  136. string file_regex;//文件名正则表达式(通用的正则表达式,上面文件名通配符已够用,一般不使用)
  137. string before_deal_type; //上传前处理类型(Z压缩...)
  138. string after_deal_type;//上传后处理类型(D删除|M移动|N不动)
  139. string after_deal_text;//上传后处理操作(如 移动路径)
  140. int file_limit;//(文件路径下最大扫描出文件个数,默认256)
  141. int file_length_limit;//(扫描出文件最大长度限制,单位M)
  142. int max_silent;//(文件最新修改时间流失间隔,用于热点文件隔离)
  143. string upload_address_env;//上传文件地址环境:DMZ: 行外,BIZ:行内
  144. };
  145. struct UploadFileInfo:UploadPlan{
  146. string filePath; //文件绝对路径(用于读取本地文件)
  147. string fileUploadPath;//上传给总行的绝对路径(不能超过900字符)
  148. //string fileUploadRelativePath;//上传给总行的路径(不超过900字符,不包含文件名称)
  149. string fileName; //文件名称
  150. string BranchFilePath;//分行文件路径(含IP)
  151. long fileLen;// 文件长度
  152. long decFileLen;//解密后的长度
  153. string decHeadJson;//解密后自定义头
  154. string editTime;//文件最后修改时间
  155. string firstMD5Str;//开始传的MD5值
  156. string lastMD5Str;//最后传的MD5值
  157. };
  158. struct UploadReport{
  159. int sum;//一批上传文件个数
  160. int succ;//上传成功文件个数
  161. int fail;//上传失败文件个数
  162. int uploadFail;//上传失败次数
  163. int decodeFail;//解密失败次数
  164. int updateState;//上传登记失败次数
  165. int operateFileFail;//上传完处理文件失败次数
  166. int queryTempFail;//查询临时文件失败次数
  167. bool isBreak;//批次是否被中断
  168. };
  169. class UploadFSM : public FSMImpl<UploadFSM>, public IFSMStateHooker, public ISysVarListener
  170. {
  171. public:
  172. enum {s0,s1,s2,s3,s4,s5,s6,s7};
  173. BEGIN_FSM_STATE(UploadFSM)
  174. FSM_STATE_ENTRY(s0,"Starting",s0_on_entry,s0_on_exit,s0_on_event)
  175. FSM_STATE_ENTRY(s1, "Disable",s1_on_entry,s1_on_exit,s1_on_event)
  176. FSM_STATE_ENTRY(s2, "Enable", s2_on_entry, s2_on_exit, s2_on_event)
  177. FSM_STATE_ENTRY(s3, "Connect", s3_on_entry, s3_on_exit, s3_on_event)
  178. FSM_STATE_ENTRY(s4, "Upload", s4_on_entry, s4_on_exit, s4_on_event)
  179. FSM_STATE_ENTRY(s5, "Release", s5_on_entry, s5_on_exit, s5_on_event)
  180. FSM_STATE_ENTRY(s6, "DisConnect", s6_on_entry, s6_on_exit, s6_on_event)//添加断连等待时间状态
  181. FSM_STATE_ENTRY(s7, "NewUpload", s7_on_entry, s7_on_exit, s7_on_event)//添加新模式上传状态
  182. END_FSM_STATE()
  183. BEGIN_FSM_RULE(UploadFSM,s0)
  184. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_JMP_DISABLE)
  185. FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_JMP_ENABLE)
  186. FSM_RULE_ENTRY_ANY(s1, s2, USER_EVT_JMP_ENABLE)
  187. FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_JMP_CONNECT)//旧上传模式
  188. FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_JMP_DISABLE)
  189. FSM_RULE_ENTRY_ANY(s2, s7, USER_EVT_JMP_NEW_UPLOAD)//新上传模式
  190. FSM_RULE_ENTRY_ANY(s3, s4, USER_EVT_JMP_UPLOAD)
  191. FSM_RULE_ENTRY_ANY(s3, s1, USER_EVT_JMP_DISABLE)
  192. FSM_RULE_ENTRY(s4, s5, USER_EVT_UPLOAD_ANS, 1)
  193. FSM_RULE_ENTRY(s4, s6, USER_EVT_DISCONNECT, 1)//断连时跳转到S6
  194. FSM_RULE_ENTRY(s4, s5, USER_EVT_BLOCK_ANS, 1)
  195. FSM_RULE_ENTRY_ANY(s4, s5, EVT_TIMER)
  196. FSM_RULE_ENTRY_ANY(s4, s1, USER_EVT_JMP_DISABLE)
  197. FSM_RULE_ENTRY_ANY(s5, s2, EVT_TIMER)
  198. FSM_RULE_ENTRY_ANY(s5, s2, USER_EVT_DISCONNECT)
  199. FSM_RULE_ENTRY_ANY(s5, s1, USER_EVT_JMP_DISABLE)
  200. FSM_RULE_ENTRY_ANY(s6, s2, EVT_TIMER)//等待一段时间进入S2
  201. FSM_RULE_ENTRY_ANY(s6, s1, USER_EVT_JMP_DISABLE)
  202. FSM_RULE_ENTRY_ANY(s7, s2, EVT_TIMER)//等待一段时间进入s2,重新开始扫描文件
  203. FSM_RULE_ENTRY_ANY(s7, s1, USER_EVT_JMP_NEW_DISABLE)//等待一段时间进入s2
  204. END_FSM_RULE()
  205. UploadFSM();
  206. ~UploadFSM();
  207. virtual void OnStateTrans(int iSrcState, int iDstState);
  208. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  209. virtual ErrorCodeEnum OnInit();
  210. virtual ErrorCodeEnum OnExit();
  211. void s0_on_entry();
  212. void s0_on_exit();
  213. unsigned int s0_on_event(FSMEvent* event);
  214. void s1_on_entry();
  215. void s1_on_exit();
  216. unsigned int s1_on_event(FSMEvent* event);
  217. void s2_on_entry();
  218. void s2_on_exit();
  219. unsigned int s2_on_event(FSMEvent* event);
  220. void s3_on_entry();
  221. void s3_on_exit();
  222. unsigned int s3_on_event(FSMEvent* event);
  223. void s4_on_entry();
  224. void s4_on_exit();
  225. unsigned int s4_on_event(FSMEvent* event);
  226. void s5_on_entry();
  227. void s5_on_exit();
  228. unsigned int s5_on_event(FSMEvent* event);
  229. void s6_on_entry();
  230. void s6_on_exit();
  231. unsigned int s6_on_event(FSMEvent* event);
  232. void s7_on_entry();
  233. void s7_on_exit();
  234. unsigned int s7_on_event(FSMEvent* event);
  235. public:
  236. bool queryPlan();//查询上传策略(true表示新模式,false表示旧模式)
  237. void scanFile();//扫描文件
  238. void scanDirfresh(UploadPlan* plan,const char* path);
  239. static void HttpsLogCallBack(const char* logtxt);
  240. bool IsFileMatch(const char *pszFilter, const char *pszFileName);//通配符过滤
  241. ErrorCodeEnum SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub);//文件获取SM3
  242. ErrorCodeEnum SM3_Str(CSimpleStringA &strSM3,BYTE * SM3Byte,bool isSub);//获取SM3字符串
  243. bool getFileContent(FILE* file,unsigned char* content,int beginPos, int contentLen);//从文件中获取内容
  244. bool test_zero_ref(const char *path);
  245. bool GetFileLength(const char* filePath,long &fileLen);//获取文件长度
  246. void reportBatchMsg();//报告批次消息
  247. //void insertUploadedList(string filePath) {
  248. // m_uploadedFileList.insert(filePath);
  249. //}
  250. //int deleteUploadedList(string filePath) {
  251. // return m_uploadedFileList.erase(filePath);
  252. //}
  253. //bool ifExistInUploadedList(string filePath) {
  254. // if (m_uploadedFileList.count(filePath)){
  255. // return true;
  256. // }
  257. // else {
  258. // return false;
  259. // }
  260. //}
  261. private:
  262. bool m_isOffLine;//是否坐席空闲
  263. int m_centerModel;//上传模式 (0:分行模式 1:混合模式 2:总行模式)
  264. bool m_uploadModel; //上传文件模式 (false:分行模式 ,true:总行模式)
  265. list<UploadFileInfo*>* m_uploadList; //新模式下待上传文件列表
  266. list<UploadPlan*>* m_uploadPlanList; //新模式策略列表
  267. list<string>* m_overLenFileList;//超过上传文件大小的列表
  268. // set<string> m_uploadedFileList;//已上传文件名列表
  269. bool findOverLenWarn(const char* fileName);
  270. public:
  271. CenterUrl m_centerUrl;//访问总行的url地址集合
  272. string m_rootPath ;//系统根路径,例如:windows: C: linux:/opt
  273. UploadFileInfo* m_currUploadFile;//正在上传的文件指针
  274. map<int,string> m_branchIpList;//新模式下分行服务器列表
  275. int m_eachUploadLen;//每次上传数据的最大长度,单位K
  276. UploadReport m_uploadReport;//每批次上传告警统计
  277. int m_uploadMaxNum;//待上传最大告警数目阈值
  278. bool m_printPlan;//打印扫描计划
  279. };
  280. #endif // RVC_MOD_UPLOAD_UPLOADFSM_H_