#ifndef HTTPDATADEF_H
#define HTTPDATADEF_H

#include <QString>
#include <QStringList>
#include <map>
#include <QDateTime>
enum class HttpParamType
{
    hptUrl = 1, //放到url后面
    hptCustomBody,//自定义body
    hptBody,   //放到body里面
	hptFormdata
};

enum class HttpType
{
    htPost = 1,
    htGet,
    htGetUrl,//get固定url
    htPut,
	htDownload
};

enum class RequestType
{
	rtUndefine = 0,
	rtUpgrade,//客户端版本升级接口
    rtGetSoftwareConfig,//获取检测黑名单
	rtAgreement,//获取隐私协议接口
	rtStudentClientConfig, //获取当前机构的客户端环境信息接口
	rtSysNotice,//平台通知接口
	rtLoginLimit,//登录限流接口
	rtLogin,//登录
	rtLogout,//退出登录接口
	rtEditPassword, //修改密码
	rtGetStudentClientMenu,//获取菜单列表
	rtGetStudentInfoBySession,//	获取考生信息
	rtOnlineSignal,//学生在线状态
	rtSpecialtyNameList,//查询考生的专业列表
	rtGetUserNoticeList,//获取用户公告列表
	rtUpdateNoticeReadStatus,//更新通知状态为已读
	rtAppDownLoadUrl,//app下载地址
	rtAppEnabled,//查询机构是否开放APP
	rtQueryBatchList,// 取考试批次列表 queryByNameLike
	rtGetExamProperty,//查询某考生的考试属性
	rtQueryExamList,//获取在线考试待考列表
	rtQueryExamEndList,//获取在线考试已结束列表
	rtQueryObjectiveScoreList,//根据examStudentId获取客观分信息
	rtQueryHomeworkList,//获取在线作业待考列表
	rtQueryPracticeCourseList,//练习课程列表
	rtQueryPracticeRecordList,//课程练习记录详情
	rtGetPracticeDetailInfo, //单次练习答题情况统计
	rtFindExamRecordDataEntity,//获取当前考试记录信息
	rtGetExamRecordQuestions,//获取交卷之后的所有试题作答信息
	rtGetOfflineCourse,//获取离线考试列表
	rtGetOffLineExamAnswerSheet,//下载离线考试答题纸接口
	rtStartOfflineExam,//离线考试 : 开始考试	
	rtGetOffLineExamPaper, //离线考试 – 下载试卷
	rtPreviewOffLineExamPaper,//离线考试 – 查看试卷	
	rtSubmitOfflinePaper,//离线考试:交卷 submitPaper
	rtStartExamLimit,//开始考试限流	
	rtIpLimit,//检查考试是否IP限制
	rtCheckExamInProgress,//断点续考:检查正在进行中的考试
	rtStartExam,//开始考试
	rtFaceCheckEnabled,//检查考试是否支持人脸识别
	rtLivenessEnabled,//考试是否支持活体检测	
	rtWeiXinAnswerEnabled, //考试是否可以微信作答
    rtGetCourseInfo,//获取课程名称
	rtGetExamById,//按ID获取考试信息接口
	rtStartAnswer,//开始答题
	rtGetQuestionContent,//取某个试题信息-考中
	rtGetQuestion,//取某个试题信息-考后
	rtSubmitQuestionAnswer,//考试过程中-考生试题作答				
	rtEndExam,//结束考试：交卷
	rtGetEndExamInfo, //获取考试记录信息-交卷后获取考试分数
	rtExamHeartbeat,//考试心跳
	rtFindExamQuestionList,//考试过程中-获取已做答试题列表
	rtGetExamRecordPaperStruct,//获取考试记录试卷结构
    rtDownLoadFile, //下载文件
	rtGetWXQrCode,//获取微信二维码
	rtSaveUploadedFileAcknowledgeStatus,//修改上传音频或图片结果推送状态
//	rtProcessUpload, //文件上传
	rtSaveFaceCompareResult,//保存人脸识别比对验证结果
	rtSaveFaceCaptureResult,//保存人脸抓拍比对验证结果
	rtSaveFaceLiveVerifyResult,//保存人脸活体验证结果
	rtStartFaceLiveVerify,//开始人脸活体验证接口，如：活检次数，活检开始时间等	
    rtGetOrgPropertiesByGroupWithoutCache,//获取活检配置参数接口
    rtClientExamProcessUploadSign,//文件上传签名信息
    rtUploadFileToAliyun,
    rtExamControlCheckTime, //交卷冻结时间检查
};

class CHttpRequestPackage
{
public:
    RequestType nRequestType;
    HttpType nHttpType;
    QString sUri;
    QString sCommonStr;
    QString sCommonStr1;
	QString sAdditionStr;
    HttpParamType eParamType;
    QStringList sParamList;
    QStringList sHeadList;
    int nRetryCount;
    bool bNoHostPrefix;//不需要加http://host:port
    CHttpRequestPackage()
    {
        nRequestType = RequestType::rtUndefine;
        nHttpType = HttpType::htPost;
        eParamType = HttpParamType::hptUrl;
        sUri = "";
        sCommonStr = "";
        sCommonStr1 = "";
		sAdditionStr = "";
        nRetryCount = 0;
        bNoHostPrefix = false;
    }
};

class CBaseResponsePackage
{
public:
    int nCode;
    QString sMessage;
    CBaseResponsePackage()
    {
        nCode = 0;
        sMessage = "";
    }
};

class CGetSoftwareConfig : public CBaseResponsePackage
{
public:
    QString sSoftwareConfig;
    CGetSoftwareConfig()
    {
        sSoftwareConfig = "";
    }
};

class CUpgrade : public CBaseResponsePackage
{
public:
    QString sVersion;
    int nBuild;
    QString sContent;
    bool bForce;
    QString sUpgradeUrl;
    CUpgrade()
    {
        sVersion = "";
        nBuild = 0;
        sContent = "";
        bForce = true;
        sUpgradeUrl = "";
    }
};

class CAgreement : public CBaseResponsePackage
{
public:
    QString sTitle;
    int nStaySeconds;
    QString sContent;
    CAgreement()
    {
        sTitle = "";
        nStaySeconds = 15;
        sContent = "";
    }
};

class CStudentClientConfig : public CBaseResponsePackage
{
public:
	QString sCusMenuLogoFileUrl;
	QString sIdentityNumberLoginAlias;//身份证号登录34s
	bool bIsCustomMenuLogo;// : "false",
	bool bStudentCodeLogin;
	bool bIdentifyNumberLogin;	
	QString sLogoFileUrl;//" : "https://ecs-test-static.qmth.com.cn/org_logo/0/1613800689888.png",
	QString sStudentClientBgPictureUrl;
	QString sOeStudentSysName;//" : "网考 - 33d34sss3d",
	bool bDisableMutiScreen;
	bool bDisableRemoteAssistance;
    bool bDisableVirtualMachine;
	bool bFullScreenTop; 	
	bool bDisableVirtualCamera;
	QString sRootOrgId;// " : "0",
	bool bShowQmthLogo;// " : "false",
	bool bShowStudentClientAppQrcode;// " : "true",				
	QString sStudentCodeLoginAlias;// " : "学号登录34s"

    bool bShowStudentName;
    bool bShowStudentCode;
    bool bShowStudentIdentity;

	CStudentClientConfig()
	{
		sCusMenuLogoFileUrl = "";
		sIdentityNumberLoginAlias = "";
		bIsCustomMenuLogo = false;
		bStudentCodeLogin  = false;
		bIdentifyNumberLogin = false;
		sLogoFileUrl = "";
		sStudentClientBgPictureUrl = "";
		sOeStudentSysName = "";
        bDisableMutiScreen = false;
        bDisableRemoteAssistance = false;
        bDisableVirtualMachine = false;
        bFullScreenTop = false;
        bDisableVirtualCamera = false;
		sRootOrgId = "";// " : "0",
		bShowQmthLogo = false;// " : "false",
		bShowStudentClientAppQrcode = false;// " : "true",				
		sStudentCodeLoginAlias = ""; // " : "学号登录34s"

        bShowStudentName = true;
        bShowStudentCode = true;
        bShowStudentIdentity = true;
	}
};

class CSysNotice : public CBaseResponsePackage
{
public:
	__int64 nId;// 1,
	__int64 nRootOrgId;//-1,  //顶级机构ID，-1代表所有机构
	QString sContent;//"平台将于今天下午1点停服升级，请知悉！",
	QString sStartTime;// "2021 - 08 - 11 00:00 : 00", //生效开始时间
	QString sEndTime;//"2021 - 08 - 12 00:00 : 00", //生效截止开始时间
	QString sTitle;//"升级通知",
	bool bEnable;// false  //是否启用
	CSysNotice()
	{
		nId = 0;
		nRootOrgId = -1;
		sContent = "";
		sStartTime = "";
		sEndTime = "";
		sTitle = "";
		bEnable = false;
	}
};

class CLoginLimit : public CBaseResponsePackage
{
public:
	int nCount;
	bool bPass; // true代表未限制
	CLoginLimit()
	{
		nCount = 0;
		bPass = false;
	}
};

class CLoginInfo : public CBaseResponsePackage
{
public:
	QString sUserType;// "STUDENT",
	__int64 nUserId;// 4,
	QString sDisplayName;// "张三",
	__int64 nRootOrgId;// 0,
	QString sRootOrgName;// 启明泰和",
	QString sCreationTime;//"2021 - 08 - 26 17:23 : 15",		
	QString sClientIp;//"192.168.10.126",
	__int64 nSessionTimeout;// 7200,
	bool bPasswordWeak;// " : false

    CLoginInfo()
    {
		sUserType = "";
		nUserId = 0;
		sDisplayName = "";
		nRootOrgId = 0;
		sRootOrgName = "";
		sCreationTime = "";
		sClientIp = "";
		nSessionTimeout = 0;
		bPasswordWeak = false;
    }
};

class CLogout : public CBaseResponsePackage
{
public:

};

class CEditPassword : public CBaseResponsePackage
{
public:

};

class CStudentClientMenu
{
public:
	__int64 nId;
	QString sCode;
	QString sName;
};

class CGetStudentClientMenu : public CBaseResponsePackage
{
public:
	std::vector<CStudentClientMenu> vMenus;
};

class CGetStudentInfoBySession : public CBaseResponsePackage
{
public:
	__int64 nId;
	QString sName;
	__int64 nOrgId;
	QString sOrgCode;
	QString sOrgName;
	QString sStudentCode;
	QString sIdentityNumber;
	QString sPhotoPath;
	bool bEnable;
	CGetStudentInfoBySession()
	{
		nId = 0;
		sName = "";
		nOrgId = 0;
		sOrgCode = "";
		sOrgName = "";
		sStudentCode = "";
		sIdentityNumber = "";
		sPhotoPath = "";
		bEnable = false;
	}
};

class CDownLoadFileInfo : public CBaseResponsePackage
{
public:
    QString sFileName;
	QString sModuleName;
    QString sAdditionStr;
    CDownLoadFileInfo()
    {
        sFileName = "";
        sModuleName = "";
        sAdditionStr = "";
    }
};

class CSpecialtyNameList : public CBaseResponsePackage
{
public:
	QString sSpecialtyName;
	CSpecialtyNameList()
	{
		sSpecialtyName = "";
	}
};

class CNoticeInfo
{
public:
	__int64 nId;// 11,
	QString sTitle;
	QString sContent;
	QString sPublisher;
	QString sPublishTime;// " : "2021 - 08 - 27 16:22 : 29",
	bool bHasRead;// : false,
	bool bHasRecalled;
	CNoticeInfo()
	{
		nId = 0;
		sTitle = "";
		sContent = "";
		sPublisher = "";
		sPublishTime = "";
		bHasRead = false;
		bHasRecalled = false;
	}
};

class CGetUserNoticeList : public CBaseResponsePackage
{
public:
	std::vector<CNoticeInfo> vNoticeList;
};

class CUpdateNoticeReadStatus : public CBaseResponsePackage
{
public:
    QString sIds;
    CUpdateNoticeReadStatus()
    {
        sIds = "";
    }
};

class CAppDownLoadUrl : public CBaseResponsePackage
{
public:
	QString sUrl;
	CAppDownLoadUrl()
	{
		sUrl = "";
	}
};

class CAppEnabled : public CBaseResponsePackage
{
public:
	bool bEnable;
	CAppEnabled()
	{
		bEnable = false;
	}
};
class CBatchInfo
{
public:
	__int64 nId;
	QString sName;
	QString sExamType;
	CBatchInfo()
	{
		nId = 0;
		sName = "";
		sExamType = "";
	}
};

class CQueryBatchList : public CBaseResponsePackage
{
public:
	std::vector<CBatchInfo> vBatchList;
};

class CGetExamProperty : public CBaseResponsePackage
{
public:
	QString sType;
	QString sBeforeExamRemark;//考前说明
	bool bCheckEnvironment;//环境监测
//    int nFaceThreshold;//预警阈值
	bool bIsFaceCheck;//进入考试是否验证人脸识别(强制、非强制)
	int nSnapshotInterval;//抓拍间隔时间
	int nFaceVerifyStartMinute;//活体检测开始分钟数
	int nFaceVerifyEndMinute;//活体检测结束分钟数
	bool bIsStrangerEnable;//是否启用陌生人检测
	
	QString sPracticeType;//AFTER_PRACTICE 在线练习-结束统一显示答案
	//IN_PRACTICE 在线练习-边答边显示答案
	//NO_ANSWER 在线练习-不显示答案
	int nFreezeTime;//冻结时间
	QString sAfterExamRemark;//考后说明
	bool bIsObjScoreView;//是否显示客观题成绩
	bool bShowCheatingRemark;//是否展示作弊
	QString sCheatingRemark;//作弊说明	
	std::vector<QString> vOfflineUploadFileType;

    bool bIsLivenessBefore;//考前活体检测

    bool bMutipleAnserCountTips;

	CGetExamProperty()
	{
		sType = "";
		sBeforeExamRemark = "";
		bCheckEnvironment = false;
//        nFaceThreshold = 50;//预警阈值
		bIsFaceCheck = false;//进入考试是否验证人脸识别(强制、非强制)
		nSnapshotInterval = 0;
		nFaceVerifyStartMinute = 0;//活体检测开始分钟数
		nFaceVerifyEndMinute = 0;//活体检测结束分钟数
		bIsStrangerEnable = false;//是否启用陌生人检测
		
		sPracticeType = "";
		nFreezeTime = 0;
		sAfterExamRemark = "";
		bIsObjScoreView = false;
		bShowCheatingRemark = false;
		sCheatingRemark = "";
        bIsLivenessBefore = false;

        bMutipleAnserCountTips = false;
	}
};

class CStartExamLimit : public CBaseResponsePackage
{
public:
	int nCount;
	bool bPass;
	CStartExamLimit()
	{
		nCount = 0;
		bPass = false;
	}
};

class CIpLimit : public CBaseResponsePackage
{
public:
	bool bLimited;
	CIpLimit()
	{
		bLimited = false;
	}
};

class CStartExam : public CBaseResponsePackage
{
public:
	QString sCourseCode;// ,
	QString sCourseName;// ,
	__int64 nExamRecordDataId;// 0,
	int nFaceVerifyMinute;// 0,
	QString sStudentCode;// ,
	QString sStudentName;// 
	CStartExam()
	{
		sCourseCode = "";
		sCourseName = "";
		nExamRecordDataId = 0;
		nFaceVerifyMinute = 0;
		sStudentCode = "";
		sStudentName = "";
	}
};

class CFaceCheckEnabled : public CBaseResponsePackage
{
public:
	bool bEnabled;
	CFaceCheckEnabled()
	{
		bEnabled = false;
	}
};
class CLivenessEnabled : public CBaseResponsePackage
{
public:
	bool bEnabled;
	CLivenessEnabled()
	{
		bEnabled = false;
	}
};

class CWeiXinAnswerEnabled : public CBaseResponsePackage
{
public:
	bool bEnabled;
	CWeiXinAnswerEnabled()
	{
		bEnabled = false;
	}
};

class CGetExamById : public CBaseResponsePackage
{
public:
	__int64 nId;
	QString sCode;
	__int64 nRootOrgId;
	QString sBeginTime;
	QString sEndTime;
	QString sName;
	QString sExamType;
	int nDuration;
	bool bEnable;
	bool bStarted;
	bool bExamLimit;
	bool bIpLimitSettingsEnabled;

	CGetExamById()
	{
		nId = 0;
		sCode = "";
		nRootOrgId = 0;
		sBeginTime = "";
		sEndTime = "";
		sName = "";
		sExamType = "";
		nDuration = 0;
		bEnable = false;
		bStarted = false;
		bExamLimit = false;
		bIpLimitSettingsEnabled = false;
	}
};

class CStartAnswer : public CBaseResponsePackage
{
public:
	__int64 nDuration;
	__int64 nExamRecordDataId;
    __int64 nUsedExamSeconds;
	CStartAnswer()
	{
		nDuration = 0;
		nExamRecordDataId = 0;
        nUsedExamSeconds = 0;
	}
};

class COption
{
public:
	QString sBody;
	COption()
	{
		sBody = "";
	}
};

class CSubQuestion
{
public:
	QString sQuestionType;
	QString sBody;
	std::vector<int> voptionPermutation;
	std::vector<COption> vOptions;
	std::vector<QString> vRightAnswer;
	QString sAnswerType;
	CSubQuestion()
	{
		sQuestionType = "";
		sBody = "";
		sAnswerType = "";
	}
};

class CGetQuestionContent : public CBaseResponsePackage
{
public:
    QString sOrder;
	QString sQuestionId;
	QString sBody;
	QString sVersion;
	bool bhasAudios;
	std::vector<CSubQuestion> vSubQuestion;
	CGetQuestionContent()
	{
		sQuestionId = "";
        sOrder = "";
		sBody = "";
		sVersion = "";
		bhasAudios = false;
	}
};

class CGetQuestion : public CBaseResponsePackage
{
public:
	QString sId;
	QString sBody;
	QString sVersion;
	bool bhasAudios;
	std::vector<CSubQuestion> vSubQuestion;
	CGetQuestion()
	{
		sId = "";
		sBody = "";
		sVersion = "";
		bhasAudios = false;
	}
};

class CSubmitQuestionAnswer : public CBaseResponsePackage
{
public:
    int nOrder;
    int nVersion;
    CSubmitQuestionAnswer()
    {
        nOrder = 0;
    }
};

class COfflineFileInfo
{
public:
	__int64 nExamRecordDataId;// 0,
	QString sFileType;// ,
	__int64 nId;// 0,
	QString sOfflineFileName;// ,
	QString sOfflineFileUrl;// ,
	QString sOriginalFileName;// ,
	QString sProperties;// ,
	QString sSuffix;// 
    QString sLocalFileName;
	COfflineFileInfo()
	{
		nExamRecordDataId = 0;
		sFileType = "";
		nId = 0;
		sOfflineFileName = "";
		sOfflineFileUrl = "";
		sOriginalFileName = "";
		sProperties = "";
		sSuffix = ""; 
        sLocalFileName = "";
	}
};

class COfflineCourseInfo
{
public:
	QString sCourseCode;// ,
	QString sCourseLevel;// ,
	QString sCourseName;// ,
	QString sEndTime;// ,
	__int64 nExamId;// 0,
	QString sStartTime;// ,
	QString sExamName;// ,
	__int64 nExamRecordDataId;// 0,
	__int64 nExamStudentId;// 0,
	bool bIsvalid;// true,
	QString sOrgName;// ,
	QString sPaperId;// ,
	QString sSpecialtyName;// ,	
	QString sStatus;// ,
	QString sStudentCode;// ,
	QString sStudentName;// 	
	std::vector<COfflineFileInfo> vOfflineFileInfo;
	COfflineCourseInfo()
	{
		sCourseCode = "";// ,
		sCourseLevel = "";// ,
		sCourseName = "";// ,
		sEndTime = "";// ,
		nExamId = 0;// 0,
		sStartTime = "";// ,
		sExamName = "";// ,
		nExamRecordDataId = 0;// 0,
		nExamStudentId = 0;// 0,
		bIsvalid = false;
		sOrgName = "";// ,
		sPaperId = "";// ,
		sSpecialtyName = "";// ,	
		sStatus = "";// ,
		sStudentCode = "";// ,
		sStudentName = "";//		
	}
};

class CWeekTransform
{
public:
	static QString getWeekCycles(std::vector<int> vWeek)
	{
		QStringList weekList;
		for (int nWeek : vWeek)
		{
            weekList << mWeekCycle.at(nWeek-1);
		}
		return weekList.join(QString::fromLocal8Bit("，"));
	}

	static bool isInTimeRange(QTime tCurrent, QStringList sExamCycleTimeRange)
	{
		bool bRet = false;		
		for (QString sTimeRange : sExamCycleTimeRange)
		{						
			QStringList list = sTimeRange.split("~");
			if(list.count() == 2)
			{
				QTime sStart = QTime::fromString(list[0], "hh:mm");
				QTime sEnd = QTime::fromString(list[1], "hh:mm");
				if (sStart < tCurrent && tCurrent < sEnd)
				{
					bRet = true;					
				}				
			}						
		}
		return bRet;
	}
private:

    inline static std::vector<QString> mWeekCycle = {
            QString::fromLocal8Bit("周一"),
            QString::fromLocal8Bit("周二"),
            QString::fromLocal8Bit("周三"),
            QString::fromLocal8Bit("周四"),
            QString::fromLocal8Bit("周五"),
            QString::fromLocal8Bit("周六"),
            QString::fromLocal8Bit("周日"),
        };
};



class CExamCourseInfo
{
public:
	int nAllowExamCount;// 0,
	bool bAppExamEnabled;// true,
	QString sCourseCode;// ,
	__int64 nCourseId;// 0,
	QString sCourseLevel;// ,
	QString sCourseName;// ,
	QString sEndTime;// ,
	bool bExamCycleEnabled;// true,
    QStringList sExamCycleTimeRange;// [],
    std::vector<int> vExamCycleWeek;// [],
	__int64 nExamId;// 0,
	QString sExamName;// ,
	QString sExamStatus;// ,
	__int64 nExamStudentId;// 0,
	bool bFaceCheck;// true,
	bool bFaceEnable;// true,
	QString sIdentityNumber;// ,
	bool bIsFinished;// ,
	bool bIsObjScoreView;// true,
	bool bIsPhotoUpload;// ,
	__int64 nOrgId;// 0,
	QString sOrgName;// ,
	int nPaperMins;// 0,
	__int64 nRootOrgId;// 0,
	QString sSpecialtyLevel;// ,
	QString sSpecialtyName;// ,
	QString sStartTime;// ,
	QString sStudentCode;// ,
	QString sStudentName;// 
	CExamCourseInfo()
	{
		nAllowExamCount = 0;
		bAppExamEnabled = false;
		sCourseCode = "";// ,
		nCourseId = 0;// 0,
		sCourseLevel = "";// ,
		sCourseName = "";// ,
		sEndTime = "";// ,
		bExamCycleEnabled = false;// true,

		nExamId = 0;// 0,
		sExamName = "";// ,
		sExamStatus = "";// ,
		nExamStudentId = 0;// 0,
		bFaceCheck = false;// true,
		bFaceEnable = false;// true,
		sIdentityNumber = "";// ,
		bIsFinished = "";// ,
		bIsObjScoreView = false;
		bIsPhotoUpload = "";// ,
		nOrgId = 0;// 0,
		sOrgName = "";// ,
		nPaperMins = 0;// 0,
		nRootOrgId = 0;// 0,
		sSpecialtyLevel = "";// 
		sSpecialtyName = "";// ,
		sStartTime = "";// ,
		sStudentCode = "";// ,
		sStudentName = "";// 
	}
};

class CQueryExamList : public CBaseResponsePackage
{
public:
	std::vector<CExamCourseInfo> vOnlieExamList;
};
	
class CQueryExamEndList : public CBaseResponsePackage
{
public:
	std::vector<CExamCourseInfo> vOnlieEndExamList;
};

class CObjectiveScore
{
public:
	QString sEndTime;// ,
	int nExamOrder;// 0,
	__int64 nExamRecordDataId;// 0,
	bool bIsAuditing;// true,
	bool bIsExamEnded;// true,
	bool bIsIllegality;// true,
	double fObjectiveScore;// 0,
	QString sStartTime;// 
	CObjectiveScore()
	{
		sEndTime = "";
		nExamOrder = 0;
		nExamRecordDataId = 0;
		bIsAuditing = 0;
		bIsExamEnded = 0; 
		bIsIllegality = 0;
		fObjectiveScore = 0;
		sStartTime = "";
	}
};
class CQueryObjectiveScoreList : public CBaseResponsePackage
{
public:
	QString sExamStudentId;
	std::vector<CObjectiveScore> vObjectiveScore;
	CQueryObjectiveScoreList()
	{	
		sExamStudentId = "";
	}
};

class CQueryHomeworkList : public CBaseResponsePackage
{
public:
	std::vector<CExamCourseInfo> vHomeworkExamList;
};

class CPracticeCourseInfo
{
public:
	double fAveObjectiveAccuracy;// 0,
	QString sCourseCode;// ,
	QString sCourseName;// ,
	QString sEndTime;// ,
	bool bExamCycleEnabled;// true,
    QStringList sExamCycleTimeRange;// [],
    std::vector<int> vExamCycleWeek;// [],
	__int64 nExamId;// 0,
	QString sExamName;// ,
	__int64 nExamStudentId;// 0,
	QString sExamType;// ,
	double fMaxObjectiveAccuracy;// 0,
	int nPracticeCount;// 0,
	double fRecentObjectiveAccuracy;// 0,
	QString sStartTime;// ,
	QString sStudentCode;// ,
	QString sStudentName;// 
	CPracticeCourseInfo()
	{
		fAveObjectiveAccuracy = 0;
		sCourseCode = "";// ,
		sCourseName = "";// ,
		sEndTime = "";// ,
		bExamCycleEnabled = false;
		nExamId = 0;// 0,
		sExamName = "";// ,
		nExamStudentId = 0;// 0,
		sExamType = "";// ,
		fMaxObjectiveAccuracy = 0;// 0,
		nPracticeCount = 0;
		fRecentObjectiveAccuracy = 0;
		sStartTime = "";//
		sStudentCode = "";
		sStudentName = "";
	}
};
class CQueryPracticeCourseList : public CBaseResponsePackage
{
public:
	std::vector<CPracticeCourseInfo> vPracticeCourseInfo;
};

class CPracticeRecord
{
public:
	QString sCourseCode;// ,
	QString sCourseName;// ,
	QString sEndTime;// ,
	QString sExamName;// ,
	int nFailQuestionNum;// 0,
	__int64 nId;// 0,
	int nNotAnsweredCount;// 0,
	double fObjectiveAccuracy;// 0,
	int nObjectiveNum;// 0,
	QString sStartTime;// ,
	int nSuccQuestionNum;// 0,
	int nTotalQuestionCount;// 0,
	__int64 nUsedExamTime;// 0
	CPracticeRecord()
	{
		sCourseCode = "";
		sCourseName = "";
		sEndTime = "";
		sExamName = "";
		nFailQuestionNum = 0;
		nId = 0;
		nNotAnsweredCount = 0;
		fObjectiveAccuracy = 0;
		nObjectiveNum = 0;
		sStartTime = "";
		nSuccQuestionNum = 0;
		nTotalQuestionCount = 0;
		nUsedExamTime = 0;
	}
};
//课程练习记录详情
class CQueryPracticeRecordList : public CBaseResponsePackage
{
public:
	std::vector<CPracticeRecord> vPracticeRecordList;
};

class CPracticePaperStructInfo
{
public:
	int nCount;
	int nFailQuestionNum;
	int nIndex;
	int nNotAnsweredCount;
	int nQuestionCount;
	QString sQuestionType;
	QString sScore;
	int nSuccQuestionNum;
	QString sTitle;
	double fTotalScore;
	CPracticePaperStructInfo()
	{
		nCount = 0;
		nFailQuestionNum = 0;
		nIndex = 0;
		nNotAnsweredCount = 0;
		nQuestionCount = 0;
		sQuestionType = "";
		sScore = "";
		nSuccQuestionNum = 0;
		sTitle = "";
		fTotalScore = 0;
	}
};
//单次练习答题情况统计
class CGetPracticeDetailInfo : public CBaseResponsePackage
{
public:
	QString sCourseCode;
	QString sCourseName;
	__int64 nId;
	double fObjectiveAccuracy;
	std::vector<CPracticePaperStructInfo> vPracticePaperStructList;
	CGetPracticeDetailInfo()
	{
		sCourseCode = "";
		sCourseName = "";
		nId = 0;
		fObjectiveAccuracy = 0;
	}
};

//获取当前考试记录信息


class CFindExamRecordDataEntity : public CBaseResponsePackage
{
public:
	__int64 nExamId;
	QString sPaperType;
	CFindExamRecordDataEntity()
	{
		nExamId = 0;
		sPaperType = "";
	}
};

//获取交卷之后的所有试题作答信息
class CAnsweredQuestion
{
public:	
    QString sAnswerType;// ,
    QString sAudioPlayTimes;// ,
    QString sCorrectAnswer;// ,
    QString sExamQuestionTempId;// ,
    __int64 nExamRecordDataId;// 0,
    bool bIsAnswer;// true,
    bool bIsInMongo;// true,
    bool bIsSign;// true,
    int nMainNumber;// 0,
    std::vector<int> vOptionPermutation;// [],
    int nOrder;// 0,
    QString sQuestionId;// ,
    double fQuestionScore;// 0,
    QString sQuestionType;// ,
    QString sStudentAnswer;// ,
    double fStudentScore;// 0
	bool bHasQuestonInfo;	
    CAnsweredQuestion()
    {
        sAnswerType = "";
        sAudioPlayTimes = "";
        sCorrectAnswer = "";
        sExamQuestionTempId = "";
        nExamRecordDataId = 0;
        bIsAnswer = false;
        bIsInMongo = false;
        bIsSign = false;
        nMainNumber = 0;
        nOrder = 0;
        sQuestionId = "";
        fQuestionScore = 0;
        sQuestionType = "";
        sStudentAnswer = "";
        fStudentScore = 0; 
    }
};

class CGetExamRecordQuestions : public CBaseResponsePackage
{
public:
	std::vector<CAnsweredQuestion> vExamRecordQuestions;
};


class CGetOfflineCourse : public CBaseResponsePackage
{
public:
	std::vector<COfflineCourseInfo> vOfflineCourseInfo;
};

class CGetOffLineExamAnswerSheet : public CBaseResponsePackage
{
public:
	QString sAnswerSheetUrl;
	CGetOffLineExamAnswerSheet()
	{
		sAnswerSheetUrl = "";
	}
};//下载离线考试答题纸接口

class CGetOffLineExamPaper : public CBaseResponsePackage
{
public:
	QString sPaperUrl;
	int nRow;
	CGetOffLineExamPaper()
	{
		sPaperUrl = "";
		nRow = 0;
	}
};

class CPreviewOffLineExamPaper : public CBaseResponsePackage
{
public:
	QString sUrl;
	int nRow;
	CPreviewOffLineExamPaper()
	{
		sUrl = "";
		nRow = -1;
	}
};

class CStartOfflineExam : public CBaseResponsePackage
{
public:
	int nRow;
	CStartOfflineExam()
	{
		nRow = 0;
	}
};

class CSubmitOfflinePaper : public CBaseResponsePackage
{
public:
};

namespace EXAM_INPROGRESS_ENTER_TYPE 
{
	const QString EIET_COURSE_LIST = "COURSE_LIST";
	const QString EIET_ENTER_EXAM = "ENTER_EXAM";
}

class CCheckExamInProgress : public CBaseResponsePackage
{
public:
	bool bHasExamInProgress;
	int nInterruptNum;
	int nMaxInterruptNum;
	bool bIsExceed;
	__int64 nExamRecordDataId;
	__int64 nExamId;
	__int64 nUsedTime;
	int nFaceVerifyMinute;
	QString sExamType;
	QString sEnterType;
	CCheckExamInProgress()
	{
		bHasExamInProgress = false;
		nInterruptNum = 0;
		nMaxInterruptNum = 0;
		bIsExceed = false;
		nExamRecordDataId = 0;
		nExamId = 0;
		nUsedTime = 0;
		nFaceVerifyMinute = 0;
		sExamType = "";
	}
};

class CGetCourseInfo : public CBaseResponsePackage
{
public:
    QString sCourseCode;
	QString sCourseName;
    CGetCourseInfo()
	{
        sCourseCode = "";
		sCourseName = "";
	}
};

class CEndExam : public CBaseResponsePackage
{
public:
    QString sModuleName;
    bool bForce;
    CEndExam()
    {
        sModuleName = "";
        bForce = false;
    }
};

class CGetEndExamInfo : public CBaseResponsePackage
{
public:	
	__int64 nExamRecordDataId;
	bool bIsWarn;
	double fObjectiveAccuracy;
	double fObjectiveScore;
	bool bIsCalculate;
	CGetEndExamInfo()
	{
		nExamRecordDataId = 0;
		bIsWarn = false;
		fObjectiveAccuracy = 0;
		fObjectiveScore = 0;
		bIsCalculate = false;
	}
};

class CExamHeartbeat : public CBaseResponsePackage
{
public:
	__int64 nLeftTime;//毫秒
	CExamHeartbeat()
	{
		nLeftTime = 0;
	}
};

class CFindExamQuestionList : public CBaseResponsePackage
{
public:
	std::vector<CAnsweredQuestion> vAnsweredQuestion;
};

namespace QUESTION_TYPE
{
	const QString SingleChoice = "SINGLE_CHOICE";
	const QString MultipleChoice = "MULTIPLE_CHOICE";
	const QString TrueOrFalse = "TRUE_OR_FALSE";
	const QString FillUp = "FILL_UP";
	const QString Essay = "ESSAY";
};

class CSubQuestionStruct
{
public:
	std::vector<int> voptionPermutation;
	double fQuestionScore;
	QString sQuestionType;
	QString sAnswerType;
	bool bMarked;
	bool bAnswered;
    int nVersion;
    bool bUpload;
    QString sSubjectiveTempAns;
	QString sUploadAnswer;
    bool bCurrent;
	QString sStudentAnswer;
	int nShowNumber;
	int nOrder;
	QString sBody;
	std::vector<COption> vOptions;
	std::vector<QString> vRightAnswer;
	int nLimitedPlayTimes;
	CSubQuestionStruct()
	{
		fQuestionScore = 0;
		sQuestionType = "";
		sAnswerType = "";
		bMarked = false;
        bAnswered = false;
        nVersion = 0;
        bUpload = true;
		sUploadAnswer = "";
        sSubjectiveTempAns = "";
        bCurrent = false;
		nShowNumber = 0;
		nOrder = 0;
		sBody = "";
		nLimitedPlayTimes = 0;
	}
};

class CQuestionStruct
{
public:
	QString sQuestionId;
	QString sVersion;
	double fQuestionScore;
	int nLimitedPlayTimes;
	int nPlayedTimes;
	int nTimeLimit;
	bool bHasContent;
	QString sBody;
	bool bhasAudios;
	std::vector<CSubQuestionStruct> vSubQuestionStruct;
    CQuestionStruct()
    {
        sQuestionId = "";
        sVersion = "";
        fQuestionScore = 0;
        nLimitedPlayTimes = 0;
        nPlayedTimes = 0;
        nTimeLimit = 0;
		sBody = "";
		sVersion = "";
		bhasAudios = false;
		bHasContent = false;
    }
};
class CPaperGroupStruct
{
public:
	QString sGroupName;
	double fGroupScore;
	int nNumber;
	int nTotalSubquestion;	
	int nAnsweredCount;
	std::vector<CQuestionStruct> vQuestionStruct;
    CPaperGroupStruct()
    {
        sGroupName = "";
        fGroupScore = 0;
		nNumber = 0;
		nTotalSubquestion = 0;
		nAnsweredCount = 0;
    }
};

class CGetExamRecordPaperStruct : public CBaseResponsePackage
{
public:
	QString sPaperId;
	QString sPaperName;
	bool bFullyObjective;
	std::vector<CPaperGroupStruct> vPaperGroupStruct;
    CGetExamRecordPaperStruct()
    {
        sPaperId = "";
        sPaperName = "";
    }
};

class CGetWXQrCode : public CBaseResponsePackage
{
public:
	QString sUrl;
	CGetWXQrCode()
	{
		sUrl = "";
	}
};

class CSaveUploadedFileAcknowledgeStatus : public CBaseResponsePackage
{
public:
    QString sFileUrl;
    CSaveUploadedFileAcknowledgeStatus()
    {
        sFileUrl = "";
    }
};

//class CProcessUpload : public CBaseResponsePackage
//{
//public:
//	QString sFileUrl;
//    QString sCommonStr;
//	CProcessUpload()
//	{
//		sFileUrl = "";
//	}
//};


class CGetOrgPropertiesByGroupWithoutCache : public CBaseResponsePackage
{
public:
	int nActionNum;
	QString sActionOptions;//SHAKE,BLINK,NOD
	QString sActionOrder;//FIXED
	int nActionDuration;//单个动作最大时长
	int nActionAlert;//指定动作检测提醒N秒后开始检测
    int nAllActionDuration;//整体动作时长
    int nFaceThreshold; //人脸比对阈值

	CGetOrgPropertiesByGroupWithoutCache()
	{
		nActionNum = 0;
		sActionOptions = "";
		sActionOrder = "";
		nActionDuration = 0;
        nActionAlert = 15;
        nAllActionDuration = 120;
        nFaceThreshold = 50;
	}
};

class CStartFaceLiveVerify : public CBaseResponsePackage
{
public:
	__int64 nFaceLiveVerifyId;
	int nStartMinute;
	int nTimes;
	CStartFaceLiveVerify()
	{
		nFaceLiveVerifyId = 0;
		nStartMinute = 0;
		nTimes = 0;
	}
};

class CClientExamProcessUploadSign : public CBaseResponsePackage
{
public:
    QString sCommonStr = "";
    QString sFilePath = "";
    QString sType = "";
    QString sAccessUrl = "";
    QString sSignIdentifier = "";
    QString sFormUrl = "";
    QString sOssAcessKeyId = "";
    QString sSignature = "";
    QString sKey = "";
    QString sPolicy = "";

};

class CUploadFileToAliyun : public CBaseResponsePackage
{
public:
    QString sCommonStr = "";
    QString sFileUrl = "";
};

#endif // HTTPDATADEF_H
