#ifndef RVC_MOD_UPLOAD_UPLOADFSM_H_ #define RVC_MOD_UPLOAD_UPLOADFSM_H_ #include "SpBase.h" #include "SpFSM.h" #include "SpSecureClient.h" #include "upload.h" #include #include #include "IHttpFunc.h" #ifdef RVC_OS_WIN #include #else #include "SpUtility.h" #endif #include #include "json/json.h" #define USER_EVT_JMP_DISABLE EVT_USER+1 #define USER_EVT_JMP_ENABLE EVT_USER+2 #define USER_EVT_JMP_CONNECT EVT_USER+3 #define USER_EVT_DISCONNECT EVT_USER+4 #define USER_EVT_UPLOAD_ANS EVT_USER+5 #define USER_EVT_BLOCK_ANS EVT_USER+6 #define USER_EVT_JMP_UPLOAD EVT_USER+7 #define USER_EVT_JMP_OLD_SCAN EVT_USER+8 #define USER_EVT_JMP_NEW_SCAN EVT_USER+9 #define USER_EVT_JMP_NEW_UPLOAD EVT_USER+10 #define USER_EVT_JMP_NEW_DISABLE EVT_USER+11 #define USER_EVT_UPLOAD_SUCC EVT_USER+12 #define USER_EVT_UPLOAD_FAIL EVT_USER+13 #define LOG_WARN_UPLOAD_MAX_ERROR 0x10400006 //查询扫描待上传文件个数超过阈值告警 using namespace std; enum CenterModelEnum { branchModel = 0, //分行模式 mixModel = 1, //混合模式 centerModel = 2, //总行模式 }; struct CenterUrl { string queryPlanUrl; //上传策略查询接口 string queryTempFileUrl; //查询临时计划文件状态接口 string updateStateUrl; //更新上传状态接口 string addUploadFailUrl; //增加失败流水接口 //string uploadCenterUrl; //终端总行上传文件接口 }; //上传接口 struct UploadFileReq : CHTTPUploadReq { }; struct UploadFileRet : CHTTPUploadRet { }; struct UploadDataRet{ int uploaded_length; bool upload_finish; string branchFilePath; string strBody; }; //上传策略查询接口 struct UploadQueryPlanReq : CHTTPReq { string m_reqStr; string ToJson() { return m_reqStr; } }; struct UploadQueryPlanRet : CHTTPRet { string m_retStr; bool Parse(string strData) { m_retStr=strData; return true; } }; //查询临时计划文件状态接口 struct UploadQueryTempFileReq : CHTTPReq { string m_reqStr; string ToJson() { return m_reqStr; } }; struct UploadQueryTempFileRet : CHTTPRet { string m_retStr; bool Parse(string strData) { m_retStr=strData; return true; } }; //更新上传状态接口 struct UploadUpdateStateReq : CHTTPReq { string m_reqStr; string ToJson() { return m_reqStr; } }; struct UploadUpdateStateRet : CHTTPRet { string m_retStr; bool Parse(string strData) { m_retStr=strData; return true; } }; //增加失败流水接口 struct UploadUploadFailReq : CHTTPReq { string m_reqStr; string ToJson() { return m_reqStr; } }; struct UploadUploadFailRet : CHTTPRet { string m_retStr; bool Parse(string strData) { m_retStr=strData; return true; } }; ////增加终端路径保存接口 //struct SaveDirPathReq : CHTTPReq { // string m_reqStr; // string ToJson() { // return m_reqStr; // } //}; // //struct SaveDirPathRet : CHTTPRet { // string m_retStr; // bool Parse(string strData) { // m_retStr = strData; // return true; // } //}; struct UploadPlan{ string plan_id;//计划ID string branch_no;//分行号 string plan_type;//计划类型 T-临时计划(Temp) P-永久计划(Permanent) string file_type;//文件类型 V-录像文件(Vedio) O-其他文件(Other) string path_type;//路径类型(R-相对路径,A-绝对路径) string path_name;//路径 string file_name;//文件名通配符(*表示任意0个或N个字符,如*.* *xx xx*) string file_regex;//文件名正则表达式(通用的正则表达式,上面文件名通配符已够用,一般不使用) string before_deal_type; //上传前处理类型(Z压缩...) string after_deal_type;//上传后处理类型(D删除|M移动|N不动) string after_deal_text;//上传后处理操作(如 移动路径) int file_limit;//(文件路径下最大扫描出文件个数,默认256) int file_length_limit;//(扫描出文件最大长度限制,单位M) int max_silent;//(文件最新修改时间流失间隔,用于热点文件隔离) string upload_address_env;//上传文件地址环境:DMZ: 行外,BIZ:行内 }; struct UploadFileInfo:UploadPlan{ string filePath; //文件绝对路径(用于读取本地文件) string fileUploadPath;//上传给总行的绝对路径(不能超过900字符) //string fileUploadRelativePath;//上传给总行的路径(不超过900字符,不包含文件名称) string fileName; //文件名称 string BranchFilePath;//分行文件路径(含IP) long fileLen;// 文件长度 long decFileLen;//解密后的长度 string decHeadJson;//解密后自定义头 string editTime;//文件最后修改时间 // UploadPlan* plan;//对应的计划指针 }; struct UploadReport{ int sum;//一批上传文件个数 int succ;//上传成功文件个数 int fail;//上传失败文件个数 int uploadFail;//上传失败次数 int decodeFail;//解密失败次数 int updateState;//上传登记失败次数 int operateFileFail;//上传完处理文件失败次数 int queryTempFail;//查询临时文件失败次数 bool isBreak;//批次是否被中断 }; class UploadFSM : public FSMImpl, public IFSMStateHooker, public ISysVarListener { public: enum {s0,s1,s2,s3,s4,s5,s6,s7}; BEGIN_FSM_STATE(UploadFSM) FSM_STATE_ENTRY(s0,"Starting",s0_on_entry,s0_on_exit,s0_on_event) FSM_STATE_ENTRY(s1, "Disable",s1_on_entry,s1_on_exit,s1_on_event) FSM_STATE_ENTRY(s2, "Enable", s2_on_entry, s2_on_exit, s2_on_event) FSM_STATE_ENTRY(s3, "Connect", s3_on_entry, s3_on_exit, s3_on_event) FSM_STATE_ENTRY(s4, "Upload", s4_on_entry, s4_on_exit, s4_on_event) FSM_STATE_ENTRY(s5, "Release", s5_on_entry, s5_on_exit, s5_on_event) FSM_STATE_ENTRY(s6, "DisConnect", s6_on_entry, s6_on_exit, s6_on_event)//添加断连等待时间状态 FSM_STATE_ENTRY(s7, "NewUpload", s7_on_entry, s7_on_exit, s7_on_event)//添加新模式上传状态 END_FSM_STATE() BEGIN_FSM_RULE(UploadFSM,s0) FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_JMP_DISABLE) FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_JMP_ENABLE) FSM_RULE_ENTRY_ANY(s1, s2, USER_EVT_JMP_ENABLE) FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_JMP_CONNECT)//旧上传模式 FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_JMP_DISABLE) FSM_RULE_ENTRY_ANY(s2, s7, USER_EVT_JMP_NEW_UPLOAD)//新上传模式 FSM_RULE_ENTRY_ANY(s3, s4, USER_EVT_JMP_UPLOAD) FSM_RULE_ENTRY_ANY(s3, s1, USER_EVT_JMP_DISABLE) FSM_RULE_ENTRY(s4, s5, USER_EVT_UPLOAD_ANS, 1) FSM_RULE_ENTRY(s4, s6, USER_EVT_DISCONNECT, 1)//断连时跳转到S6 FSM_RULE_ENTRY(s4, s5, USER_EVT_BLOCK_ANS, 1) FSM_RULE_ENTRY_ANY(s4, s5, EVT_TIMER) FSM_RULE_ENTRY_ANY(s4, s1, USER_EVT_JMP_DISABLE) FSM_RULE_ENTRY_ANY(s5, s2, EVT_TIMER) FSM_RULE_ENTRY_ANY(s5, s2, USER_EVT_DISCONNECT) FSM_RULE_ENTRY_ANY(s5, s1, USER_EVT_JMP_DISABLE) FSM_RULE_ENTRY_ANY(s6, s2, EVT_TIMER)//等待一段时间进入S2 FSM_RULE_ENTRY_ANY(s6, s1, USER_EVT_JMP_DISABLE) FSM_RULE_ENTRY_ANY(s7, s2, EVT_TIMER)//等待一段时间进入s2,重新开始扫描文件 FSM_RULE_ENTRY_ANY(s7, s1, USER_EVT_JMP_NEW_DISABLE)//等待一段时间进入s2 END_FSM_RULE() UploadFSM(); ~UploadFSM(); virtual void OnStateTrans(int iSrcState, int iDstState); virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName); virtual ErrorCodeEnum OnInit(); virtual ErrorCodeEnum OnExit(); void s0_on_entry(); void s0_on_exit(); unsigned int s0_on_event(FSMEvent* event); void s1_on_entry(); void s1_on_exit(); unsigned int s1_on_event(FSMEvent* event); void s2_on_entry(); void s2_on_exit(); unsigned int s2_on_event(FSMEvent* event); void s3_on_entry(); void s3_on_exit(); unsigned int s3_on_event(FSMEvent* event); void s4_on_entry(); void s4_on_exit(); unsigned int s4_on_event(FSMEvent* event); void s5_on_entry(); void s5_on_exit(); unsigned int s5_on_event(FSMEvent* event); void s6_on_entry(); void s6_on_exit(); unsigned int s6_on_event(FSMEvent* event); void s7_on_entry(); void s7_on_exit(); unsigned int s7_on_event(FSMEvent* event); public: bool queryPlan();//查询上传策略(true表示新模式,false表示旧模式) void scanFile();//扫描文件 void scanDirfresh(UploadPlan* plan,const char* path); static void HttpsLogCallBack(const char* logtxt); bool IsFileMatch(const char *pszFilter, const char *pszFileName);//通配符过滤 ErrorCodeEnum SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub);//文件获取SM3 ErrorCodeEnum SM3_Str(CSimpleStringA &strSM3,BYTE * SM3Byte,bool isSub);//获取SM3字符串 bool getFileContent(FILE* file,unsigned char* content,int beginPos, int contentLen);//从文件中获取内容 bool test_zero_ref(const char *path); bool GetFileLength(const char* filePath,long &fileLen);//获取文件长度 void reportBatchMsg();//报告批次消息 //void insertUploadedList(string filePath) { // m_uploadedFileList.insert(filePath); //} //int deleteUploadedList(string filePath) { // return m_uploadedFileList.erase(filePath); //} //bool ifExistInUploadedList(string filePath) { // if (m_uploadedFileList.count(filePath)){ // return true; // } // else { // return false; // } //} private: bool m_isOffLine;//是否坐席空闲 int m_centerModel;//上传模式 (0:分行模式 1:混合模式 2:总行模式) bool m_uploadModel; //上传文件模式 (false:分行模式 ,true:总行模式) list* m_uploadList; //新模式下待上传文件列表 list* m_uploadPlanList; //新模式策略列表 list* m_overLenFileList;//超过上传文件大小的列表 // set m_uploadedFileList;//已上传文件名列表 bool findOverLenWarn(const char* fileName); public: CenterUrl m_centerUrl;//访问总行的url地址集合 string m_rootPath ;//系统根路径,例如:windows: C: linux:/opt UploadFileInfo* m_currUploadFile;//正在上传的文件指针 map m_branchIpList;//新模式下分行服务器列表 int m_eachUploadLen;//每次上传数据的最大长度,单位K UploadReport m_uploadReport;//每批次上传告警统计 int m_uploadMaxNum;//待上传最大告警数目阈值 //int m_continueUpload;//重启后是否支持续传 bool m_printPlan;//打印扫描计划 }; #endif // RVC_MOD_UPLOAD_UPLOADFSM_H_