#pragma once #include "scan_common.h" #include "basic_struct.h" #include "basic_struct_result.h" #include "..\Schema\schema_struct.h" #include "DataBaseManagerHolder.h" #include #include #include "../Identifier/schema_struct_auto.h" #include "../Identifier/schema_struct.h" #include "../Identifier/OnLineCardSchemaStruct.h" #include "rapidjson/document.h" #include #include #include #include #include #include #include "ScoreCounter.h" using namespace std; class CImgUploader; class CResultUploader; class CIdentifyService; #include "UploadManager.h" #include "NetOperator.h" #ifdef _DEBUG #pragma comment(lib,"LibHJIPC_d.lib") #else #pragma comment(lib,"LibHJIPC.lib") #endif // DEBUG class CBatchService :public IService, public CDataBaseManagerHolder, public INetNotify { public: CBatchService(bool bOnlineCard, int nSubjectID, int nOnlineScanType); ~CBatchService(void); public: /************************************************************************/ /* 注册窗口,识别模块遇到问题将向该窗口发送消息 */ /************************************************************************/ int SetHandlerWnd(HWND hwnd); /************************************************************************/ /* 准备扫描 */ /************************************************************************/ int ReadyScan(FEEDER_TYPE feederType, const ScanParam & param); int PreErrorHandleRestoreSite(bool bcontinue, int scan_type, FEEDER_TYPE feederType, const ScanParam & param); int QueryExceptionPaper(const long exception_type, vector& studentList); int QueryPaperDetail(const int paper_id, PAPER_DETAIL &paper_detail, vector &pageList, vector &questionList); int UpdatePaperStudent(const int paper_id, const std::string examinee_id, const std::string student_code, const std::string studentName, const long schoolId, const std::string stuCode = "", const std::string stuSchoolCode = "", const std::string className = "", const std::string gradeName = "", bool bReIdentify = false); int ReIdentify(const int paper_id, const std::string& stu_code, const std::vector& params); int loadDuXueFirstMode(); string GetBatchCode(); //清除数据 int ClearDbTemp(); //忽略试卷 int IgnorePaper(const int paper_id); //忽略异常 int IgnoreException(const long exceptions); // 覆盖试卷 int ReplacePaper(const int paper_id, int &paper_id_ret); void CoverdAllKaohaochongtu(); // 全部覆盖试卷 int ReplaceAllKaoHaoChongTu(vector &paper_id_List); //开始上传 int StartUploadPaper(HWND hWnd, int student_paper_id = -1,bool bErrorPaper=false); //放弃本次扫描结果 int GiveUpCurrentBatch(); virtual BOOL SupportPause(void); /*从文件夹扫描继续扫描时设置扫描路径*/ int SetFolderScanDir(const std::string& img_dir); virtual BOOL Stop(void); //查询异常卷总数 int QueryExptionPaperCount(int & exc_count, int & total_count); //查询异常类型信息 int QueryExptionTypeInfo(vector & infos); int LoadSchema(long long examId, std::string examName, long examCourseId, std::string courseName, std::string schemaPath, std::string rule = ""); vector GetAllConfictPaper(int student_paper_id, string student_id);//获取冲突试卷 const boost::shared_ptr& GeSchema(){ return m_schema; } int SetCookie(CString path, CString name, CString value); void saveQuestionStd(long long examId, std::string examName, long examCourseId, std::string courseName, std::vector &questions,std::string rule = ""); void Online_saveQuestionStd(long long examId, std::string examName, long examCourseId, std::string courseName, std::string rule = ""); int QueryNormalPaper(vector & studentList); int QueryMubanImgPath(int page_index, std::string& imgPath); int QueryMubanImgCount(int& page_count); int SetLocalServerCookie(CString name, CString value); const boost::shared_ptr& GetHandleInfo(); void getCurScanExam(std::string exam_code, std::vector> &stuInfo); void getCoverStuInfoByExamCode(std::string examCode, std::vector &stuInfo); void RestoreErrorHandleSite(const std::string& task_id, const std::string&type, const std::string& strPath); int UpateErrorStudentData(const std::string&task_id); void SetErrorHandle(bool bErrorHandle); void InitUploadManager(bool bEanble, bool bCountiue, bool bErrorHanle, bool bOnlineCard, IUploudNotify*pNotify); void OnScanListFilter(bool bsuccess, int nUploadState); int UploadOnScanCmd(int nCmd, const char*param, void*ret); void QuickHandle(bool bGetPath, char*path_nor, int nor_len, char*path_exc, int exc_len); int BatchServiceCmd(int cmd, void*param, void*ret); boost::shared_ptr GetRstUploaderPtr(){ return m_result_uploader; } HANDLE GetEventZXHXCreateDB(){ return m_eventZXHXCreateDB; } void leaveCurrentBatch(); int ExamineThisScan(PAPER_DETAIL &paper_detail); int SetAbsentExam(PAPER_DETAIL &paper_detail, int absent); int QueryKeGuanTiYiChang(const int paper_id, std::vector& keguantiList); int UpdateKeGuanTiYiChang(const int paper_id, std::vector& keguantiList); private: // 返回 paper_id int RestoreStudentPaper(const std::string task_id,const std::string&task_type, rapidjson::Value&doc); void RestoreFile(int paper_id, const std::string&path,const std::string&path_ori); std::map RestorePages(int paper_id,const std::string&path, rapidjson::Value&value); void RestoreResult(int paper_id, rapidjson::Value&value, const std::map&mapPageID); void RestoreException(int paper_id, rapidjson::Value&value, const std::map&mapPageID); void RestoreStudent(rapidjson::Value&value); protected: virtual ServiceState OnStarting( void ); virtual ServiceState OnRunning( void ); virtual ServiceState OnStoping(void); virtual ServiceState OnPausing(void); virtual ServiceState OnResuming(void); private: HANDLE m_eventZXHXCreateDB; boost::shared_ptr m_result_uploader;//成绩上传服务 FEEDER_TYPE m_feeder_type;//当前图像送入器类型 RTL_CRITICAL_SECTION bantch_db_lock; CppSQLite3DB bantch_db; HWND m_hwnd; //批次号 CString m_bantch_code; //当前批次的数据库的ID int m_database_id; CString m_bantch_dir; //本次扫描原始图像存放目录 CString m_norimg_dir; CString m_excimg_dir; CString m_img_clips_dir; CString m_img_alynasis_dir; CString m_img_alynasis_result_dir; CString m_img_down_load_dir; std::string m_muban_img_dir; bool m_bErrorHandle; //标记是否非正常关闭 BOOL m_abnormal_stop; CString m_paper_code; boost::shared_ptr m_schema; boost::shared_ptr m_handleInfo; //主任务 boost::shared_ptr mainService; vector> subService; schema::SCHEMA m_schema0; OnLineCard::PaperTemplate* m_onlineCardTemplate; bool ParseTemplateFromJson(const std::string&fileName); bool ParseTemplateFromJsonAll(const std::string&fileName);//全学科在线答题卡 long m_examCourseId; long long m_examId; std::string m_examName; std::string m_courseName; int m_bantch_state; char m_db_file_name[520]; bool m_bOnlineCard; int m_nSubjectID; int m_nOnlineScanType; UploadManager m_upload_manager; std::future m_coverd_all_kaohaochongtu; CScoreCounterEx m_scoreCounter; std::map m_mapKeguantiNickName; // 客观题题号重模板中获取 public: void getStdAnswerAndScore(); CString MarkHttpHeaderData(); bool readPaperId(CString& strPaperId); void logForDbg(string strLog); void recordBarcodeFlag(int nFlag); virtual void OnNetNotify(const char*data) override; };