123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- #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 <list>
- #include <set>
- #include "IHttpFunc.h"
- #ifdef RVC_OS_WIN
- #include <io.h>
- #else
- #include "SpUtility.h"
- #endif
- #include <map>
- #include "json/json.h"
- #include "Upload_UserErrorCode.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
- 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;//文件最后修改时间
- string firstMD5Str;//开始传的MD5值
- string lastMD5Str;//最后传的MD5值
- };
- struct UploadReport{
- int sum;//一批上传文件个数
- int succ;//上传成功文件个数
- int fail;//上传失败文件个数
- int uploadFail;//上传失败次数
- int decodeFail;//解密失败次数
- int updateState;//上传登记失败次数
- int operateFileFail;//上传完处理文件失败次数
- int queryTempFail;//查询临时文件失败次数
- bool isBreak;//批次是否被中断
- };
-
- class UploadFSM : public FSMImpl<UploadFSM>, 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<UploadFileInfo*>* m_uploadList; //新模式下待上传文件列表
- list<UploadPlan*>* m_uploadPlanList; //新模式策略列表
- list<string>* m_overLenFileList;//超过上传文件大小的列表
- // set<string> m_uploadedFileList;//已上传文件名列表
- bool findOverLenWarn(const char* fileName);
-
- public:
- CenterUrl m_centerUrl;//访问总行的url地址集合
- string m_rootPath ;//系统根路径,例如:windows: C: linux:/opt
- UploadFileInfo* m_currUploadFile;//正在上传的文件指针
- map<int,string> m_branchIpList;//新模式下分行服务器列表
- int m_eachUploadLen;//每次上传数据的最大长度,单位K
- UploadReport m_uploadReport;//每批次上传告警统计
- int m_uploadMaxNum;//待上传最大告警数目阈值
- bool m_printPlan;//打印扫描计划
- };
- #endif // RVC_MOD_UPLOAD_UPLOADFSM_H_
|