wangyaojie 2 years ago
parent
commit
a5b73bb85f

+ 366 - 147
client/answerWidget.cpp

@@ -17,30 +17,33 @@ answerWidget::answerWidget(QWidget *parent) :
 
     setStyleSheet(g_appInfoPtr->m_sQssStr);
 
+	
 	m_sRemoteList
-		<< "qq"
-        <<"teamviewer"
-        <<"lookmypc"
-        <<"xt"
-        <<"winaw32"
-        <<"pcaquickconnect"
-        <<"sessioncontroller"
-        <<"sunloginclient"
-        <<"sunloginremote"
+		<< "teamviewer"
+		<< "lookmypc"
+        //<< "xt"
+		<< "winaw32"
+		<< "pcaquickconnect"
+		<< "sessioncontroller"
+        << "sunlogin";
+//		<< "sunloginremote";
+	/*	<< "qq"
         <<"wechat"
-        <<"wemeetapp";
-
-    m_sRemoteTipList<<"QQ"
-        <<"TeamViewer"
-        <<"LookMyPC"
-        << QString::fromLocal8Bit("协通")
-        <<"Symantec PCAnywhere"
-        <<"Symantec PCAnywhere"
-        <<"Symantec PCAnywhere"
-        << QString::fromLocal8Bit("向日葵")
-        << QString::fromLocal8Bit("向日葵")
+        <<"wemeetapp";*/
+
+	m_sRemoteTipList
+		<< "TeamViewer"
+		<< "LookMyPC"
+        //<< QString::fromLocal8Bit("协通")
+		<< "Symantec PCAnywhere"
+		<< "Symantec PCAnywhere"
+		<< "Symantec PCAnywhere"
+        << QString::fromLocal8Bit("向日葵");
+    //	<< QString::fromLocal8Bit("向日葵");
+	/*
+		<< "QQ"
         << QString::fromLocal8Bit("微信")
-        << QString::fromLocal8Bit("腾讯会议");
+        << QString::fromLocal8Bit("腾讯会议");*/
 
     qRegisterMetaType<CGetExamById>("CGetExamById");
     connect(g_httpBllPtr.get(), &CHttpBll::sgnGetExamById, this, &answerWidget::onGetExamById);
@@ -80,45 +83,48 @@ answerWidget::answerWidget(QWidget *parent) :
 	m_nHeartBreatFailedCount = 0;
 	bShowLeftHint = false;
 
-	CHttpRequestPackage hrp;
-	hrp.sUri = QString("/api/ecs_exam_work/exam/getExamPropertyFromCacheByStudentSession/%1/%2")
-		.arg(g_appInfoPtr->m_oExamInfo.nExamId).arg("SNAPSHOT_INTERVAL,PRACTICE_TYPE,FREEZE_TIME,PRACTICE_TYPE");
-	hrp.nRequestType = RequestType::rtGetExamProperty;
-	hrp.sCommonStr = "SNAPSHOT_INTERVAL,PRACTICE_TYPE,FREEZE_TIME";
-	g_httpBllPtr->get(hrp);
 
-    {
-        CHttpRequestPackage hrp;
-        hrp.sUri = QString("/api/ecs_exam_work/exam/%1").arg(g_appInfoPtr->m_oExamInfo.nExamId);
-        hrp.nRequestType = RequestType::rtGetExamById;
+    GetExamProperty();
+//	CHttpRequestPackage hrp;
+//	hrp.sUri = QString("/api/ecs_exam_work/exam/getExamPropertyFromCacheByStudentSession/%1/%2")
+//		.arg(g_appInfoPtr->m_oExamInfo.nExamId).arg("SNAPSHOT_INTERVAL,PRACTICE_TYPE,FREEZE_TIME,PRACTICE_TYPE");
+//	hrp.nRequestType = RequestType::rtGetExamProperty;
+//	hrp.sCommonStr = "SNAPSHOT_INTERVAL,PRACTICE_TYPE,FREEZE_TIME";
+//	g_httpBllPtr->get(hrp);
 
-        g_httpBllPtr->get(hrp);
-    }
 
-	CHttpRequestPackage hrp1;
-	hrp1.sUri = "/api/ecs_oe_student/client/exam/process/getExamRecordPaperStruct";
-	hrp1.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
-	hrp1.nRequestType = RequestType::rtGetExamRecordPaperStruct;
-	hrp1.eParamType = HttpParamType::hptUrl;
-	g_httpBllPtr->post(hrp1);
+//    {
+//        CHttpRequestPackage hrp;
+//        hrp.sUri = QString("/api/ecs_exam_work/exam/%1").arg(g_appInfoPtr->m_oExamInfo.nExamId);
+//        hrp.nRequestType = RequestType::rtGetExamById;
 
-	{
-		CHttpRequestPackage hrp;
-		hrp.sUri = "/api/ecs_oe_student/client/exam/process/findExamQuestionList";		
-		hrp.nRequestType = RequestType::rtFindExamQuestionList;
+//        g_httpBllPtr->get(hrp);
+//    }
+
+//	CHttpRequestPackage hrp1;
+//	hrp1.sUri = "/api/ecs_oe_student/client/exam/process/getExamRecordPaperStruct";
+//	hrp1.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
+//	hrp1.nRequestType = RequestType::rtGetExamRecordPaperStruct;
+//	hrp1.eParamType = HttpParamType::hptUrl;
+//	g_httpBllPtr->post(hrp1);
+
+//	{
+//		CHttpRequestPackage hrp;
+//		hrp.sUri = "/api/ecs_oe_student/client/exam/process/findExamQuestionList";
+//		hrp.nRequestType = RequestType::rtFindExamQuestionList;
 		
-		g_httpBllPtr->post(hrp);
-	}
+//		g_httpBllPtr->post(hrp);
+//	}
 
 
-	{
-		CHttpRequestPackage hrp;
-		hrp.sUri = QString("/api/ecs_exam_work/exam/weixinAnswerEnabled/%1")
-			.arg(g_appInfoPtr->m_oExamInfo.nExamId);
-        hrp.sParamList.push_back(QString::fromLocal8Bit("courseCode,%1").arg(g_appInfoPtr->m_oExamInfo.sCourseCode));
-		hrp.nRequestType = RequestType::rtWeiXinAnswerEnabled;
-		g_httpBllPtr->get(hrp);
-	}	
+//	{
+//		CHttpRequestPackage hrp;
+//		hrp.sUri = QString("/api/ecs_exam_work/exam/weixinAnswerEnabled/%1")
+//			.arg(g_appInfoPtr->m_oExamInfo.nExamId);
+//        hrp.sParamList.push_back(QString::fromLocal8Bit("courseCode,%1").arg(g_appInfoPtr->m_oExamInfo.sCourseCode));
+//		hrp.nRequestType = RequestType::rtWeiXinAnswerEnabled;
+//		g_httpBllPtr->get(hrp);
+//	}
 
     m_pCountDownTimer = std::make_shared<QTimer>();
     m_pCountDownTimer->setInterval(1000);
@@ -177,7 +183,7 @@ answerWidget::answerWidget(QWidget *parent) :
                         else
                         {
                             //交卷
-                            handinPaper();
+                            handinPaper(true);
                         }
                     });
 
@@ -232,6 +238,54 @@ answerWidget::~answerWidget()
     delete ui;
 }
 
+void answerWidget::GetExamProperty()
+{
+    CHttpRequestPackage hrp;
+    hrp.sUri = QString("/api/ecs_exam_work/exam/getExamPropertyFromCacheByStudentSession/%1/%2")
+        .arg(g_appInfoPtr->m_oExamInfo.nExamId).arg("SNAPSHOT_INTERVAL,PRACTICE_TYPE,FREEZE_TIME,PRACTICE_TYPE");
+    hrp.nRequestType = RequestType::rtGetExamProperty;
+    hrp.sCommonStr = "SNAPSHOT_INTERVAL,PRACTICE_TYPE,FREEZE_TIME";
+    g_httpBllPtr->get(hrp);
+}
+
+void answerWidget::GetExamById()
+{
+    CHttpRequestPackage hrp;
+    hrp.sUri = QString("/api/ecs_exam_work/exam/%1").arg(g_appInfoPtr->m_oExamInfo.nExamId);
+    hrp.nRequestType = RequestType::rtGetExamById;
+
+    g_httpBllPtr->get(hrp);
+}
+
+void answerWidget::GetExamRecordPaperStruct()
+{
+    CHttpRequestPackage hrp1;
+    hrp1.sUri = "/api/ecs_oe_student/client/exam/process/getExamRecordPaperStruct";
+    hrp1.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
+    hrp1.nRequestType = RequestType::rtGetExamRecordPaperStruct;
+    hrp1.eParamType = HttpParamType::hptUrl;
+    g_httpBllPtr->post(hrp1);
+}
+
+void answerWidget::FindExamQuestionList()
+{
+    CHttpRequestPackage hrp;
+    hrp.sUri = "/api/ecs_oe_student/client/exam/process/findExamQuestionList";
+    hrp.nRequestType = RequestType::rtFindExamQuestionList;
+
+    g_httpBllPtr->post(hrp);
+}
+
+void answerWidget::WeiXinAnswerEnabled()
+{
+    CHttpRequestPackage hrp;
+    hrp.sUri = QString("/api/ecs_exam_work/exam/weixinAnswerEnabled/%1")
+        .arg(g_appInfoPtr->m_oExamInfo.nExamId);
+    hrp.sParamList.push_back(QString::fromLocal8Bit("courseCode,%1").arg(g_appInfoPtr->m_oExamInfo.sCourseCode));
+    hrp.nRequestType = RequestType::rtWeiXinAnswerEnabled;
+    g_httpBllPtr->get(hrp);
+}
+
 void answerWidget::onGetSoftwareConfig(CGetSoftwareConfig getSoftwareConfig)
 {
 	if (getSoftwareConfig.nCode == 200)
@@ -376,19 +430,32 @@ void answerWidget::onGetExamById(CGetExamById getExamById)
 {
 	if (getExamById.nCode == 200)
 	{
+        m_nRetryCount = 0;
 		g_appInfoPtr->m_oExamInfo.nExamId = getExamById.nId;
 		g_appInfoPtr->m_oExamInfo.sExamType = getExamById.sExamType;
-        g_appInfoPtr->m_oExamInfo.nDuration = getExamById.nDuration;        
+        g_appInfoPtr->m_oExamInfo.nDuration = getExamById.nDuration;
+
+        GetExamRecordPaperStruct();
 	}
 	else
 	{
-        if(getExamById.sMessage.isEmpty())
+//        if(getExamById.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("获取考试信息出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(getExamById.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("获取考试信息出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(getExamById.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            GetExamById();
         }
 	}
 }
@@ -397,6 +464,7 @@ void answerWidget::onGetExamRecordPaperStruct(CGetExamRecordPaperStruct getExamR
 {
 	if (getExamRecordPaperStruct.nCode == 200)
 	{
+        m_nRetryCount = 0;
 		m_vPaperGroupStruct.swap(getExamRecordPaperStruct.vPaperGroupStruct);
 		int nSize = m_vPaperGroupStruct.size();
 
@@ -432,17 +500,29 @@ void answerWidget::onGetExamRecordPaperStruct(CGetExamRecordPaperStruct getExamR
             QSize size = pItem->sizeHint();
             size.setHeight(nHeight);
             pItem->setSizeHint(size);
-		}							
+        }
+
+        WeiXinAnswerEnabled();
 	}
 	else
 	{
-        if(getExamRecordPaperStruct.sMessage.isEmpty())
+//        if(getExamRecordPaperStruct.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("获取考试结构出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(getExamRecordPaperStruct.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("获取考试结构出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(getExamRecordPaperStruct.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            GetExamRecordPaperStruct();
         }
 	}
 }
@@ -462,6 +542,7 @@ void answerWidget::onFindExamQuestionList(CFindExamQuestionList findExamQuestion
 {
 	if (findExamQuestionList.nCode == 200)
 	{		
+        m_nRetryCount = 0;
 		int nTotal = 0;
 		int nAnswered = 0;
 		int nMarked = 0;
@@ -546,47 +627,78 @@ void answerWidget::onFindExamQuestionList(CFindExamQuestionList findExamQuestion
 		ui->pgb_answerProgress->setValue(nAnswered);
 		refreshStatus();
         //开始答题
-        CHttpRequestPackage hrp1;
-        hrp1.sUri = "/api/ecs_oe_student/client/exam/process/startAnswer";
-        hrp1.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
-        hrp1.nRequestType = RequestType::rtStartAnswer;
-        hrp1.eParamType = HttpParamType::hptUrl;
-        g_httpBllPtr->post(hrp1);
+
+        startAnwer();
 	}
 	else
 	{
-        if(findExamQuestionList.sMessage.isEmpty())
+//        if(findExamQuestionList.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("获取题目信息出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(findExamQuestionList.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("获取题目信息出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(findExamQuestionList.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            FindExamQuestionList();
         }
 	}
 }
 
+void answerWidget::startAnwer()
+{
+    CHttpRequestPackage hrp1;
+    hrp1.sUri = "/api/ecs_oe_student/client/exam/process/startAnswer";
+    hrp1.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
+    hrp1.nRequestType = RequestType::rtStartAnswer;
+    hrp1.eParamType = HttpParamType::hptUrl;
+    g_httpBllPtr->post(hrp1);
+}
+
+
 void answerWidget::onGetExamProperty(CGetExamProperty getExamProperty)
 {
 	if (getExamProperty.nCode == 200)
 	{
+        m_nRetryCount = 0;
 		if (getExamProperty.sType == "SNAPSHOT_INTERVAL,PRACTICE_TYPE,FREEZE_TIME")
 		{
 			m_nSnapshotInterval = getExamProperty.nSnapshotInterval;
 			g_appInfoPtr->m_oExamInfo.sPracticeType = getExamProperty.sPracticeType;
 			m_nFreezeTime = getExamProperty.nFreezeTime;
 		}
+
+        GetExamById();
 	}
 	else
 	{
-        if(getExamProperty.sMessage.isEmpty())
+//        if(getExamProperty.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("获取考试信息出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(getExamProperty.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("获取考试信息出错"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(getExamProperty.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+             GetExamProperty();
         }
+
 	}
 }
 
@@ -594,17 +706,29 @@ void answerWidget::onWeiXinAnswerEnabled(CWeiXinAnswerEnabled weiXinAnswerEnable
 {
 	if (weiXinAnswerEnabled.nCode == 200)
 	{
+        m_nRetryCount = 0;
 		g_appInfoPtr->m_bWeiXinAnswerEnabled = weiXinAnswerEnabled.bEnabled;
+        FindExamQuestionList();
 	}
 	else
 	{
-        if(weiXinAnswerEnabled.sMessage.isEmpty())
+//        if(weiXinAnswerEnabled.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("获取考试信息失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(weiXinAnswerEnabled.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("获取考试信息失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(weiXinAnswerEnabled.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            WeiXinAnswerEnabled();
         }
 	}
 }
@@ -938,6 +1062,7 @@ void answerWidget::onStartAnswer(CStartAnswer startAnswer)
 {
     if(startAnswer.nCode == 200)
     {        
+        m_nRetryCount = 0;
         m_nUsedExamSeconds = startAnswer.nUsedExamSeconds;
 		m_pHeartbeatTimer->start();
 		heartBreat();      
@@ -945,64 +1070,111 @@ void answerWidget::onStartAnswer(CStartAnswer startAnswer)
 		//获取活体参数
 		if (g_appInfoPtr->m_oExamInfo.bLivenessCheck)
 		{
-			CHttpRequestPackage hrp;
-			hrp.sUri = QString("/api/ecs_core/org/getOrgPropertiesByGroupWithoutCache/%1/config4Edit1")
-				.arg(g_appInfoPtr->m_sRootOrgId);
-			hrp.nRequestType = RequestType::rtGetOrgPropertiesByGroupWithoutCache;
-			g_httpBllPtr->get(hrp);
+            GetOrgPropertiesByGroupWithoutCache();
+//			CHttpRequestPackage hrp;
+//			hrp.sUri = QString("/api/ecs_core/org/getOrgPropertiesByGroupWithoutCache/%1/config4Edit1")
+//				.arg(g_appInfoPtr->m_sRootOrgId);
+//			hrp.nRequestType = RequestType::rtGetOrgPropertiesByGroupWithoutCache;
+//			g_httpBllPtr->get(hrp);
 
 			{
-				CHttpRequestPackage hrp;
-				hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/startFaceLiveVerify")
-					.arg(g_appInfoPtr->m_sRootOrgId);
-				hrp.nRequestType = RequestType::rtStartFaceLiveVerify;
-				hrp.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
-				hrp.eParamType = HttpParamType::hptUrl;
-				g_httpBllPtr->post(hrp);
+//				CHttpRequestPackage hrp;
+//				hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/startFaceLiveVerify")
+//					.arg(g_appInfoPtr->m_sRootOrgId);
+//				hrp.nRequestType = RequestType::rtStartFaceLiveVerify;
+//				hrp.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
+//				hrp.eParamType = HttpParamType::hptUrl;
+//				g_httpBllPtr->post(hrp);
 
 			}
 		}
     }
     else
     {
-        if(startAnswer.sMessage.isEmpty())
+//        if(startAnswer.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("开始作答失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(startAnswer.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("开始作答失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(startAnswer.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            startAnwer();
         }
+
     }
 }
 
+void answerWidget::GetOrgPropertiesByGroupWithoutCache()
+{
+    CHttpRequestPackage hrp;
+    hrp.sUri = QString("/api/ecs_core/org/getOrgPropertiesByGroupWithoutCache/%1/config4Edit1")
+        .arg(g_appInfoPtr->m_sRootOrgId);
+    hrp.nRequestType = RequestType::rtGetOrgPropertiesByGroupWithoutCache;
+    g_httpBllPtr->get(hrp);
+
+}
+
 void answerWidget::onGetOrgPropertiesByGroupWithoutCache(CGetOrgPropertiesByGroupWithoutCache orgProperties)
 {
     if(orgProperties.nCode == 200)
     {		
+        m_nRetryCount = 0;
         g_appInfoPtr->m_oExamInfo.nActionNum = orgProperties.nActionNum;
         g_appInfoPtr->m_oExamInfo.sActionOptions = orgProperties.sActionOptions;
         g_appInfoPtr->m_oExamInfo.sActionOrder = orgProperties.sActionOrder;
         g_appInfoPtr->m_oExamInfo.nActionDuration = orgProperties.nActionDuration;
-        g_appInfoPtr->m_oExamInfo.nActionAlert = orgProperties.nActionAlert;		
+        g_appInfoPtr->m_oExamInfo.nActionAlert = orgProperties.nActionAlert;
+
+        StartFaceLiveVerify();
     }
     else
     {
-        if(orgProperties.sMessage.isEmpty())
+//        if(orgProperties.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("获取考试信息失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(orgProperties.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("获取考试信息失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(orgProperties.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            GetOrgPropertiesByGroupWithoutCache();
         }
     }
 }
 
+void answerWidget::StartFaceLiveVerify()
+{
+    CHttpRequestPackage hrp;
+    hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/startFaceLiveVerify")
+        .arg(g_appInfoPtr->m_sRootOrgId);
+    hrp.nRequestType = RequestType::rtStartFaceLiveVerify;
+    hrp.sParamList.push_back(QString("examRecordDataId,%1").arg(g_appInfoPtr->m_oExamInfo.nExamRecordDataId));
+    hrp.eParamType = HttpParamType::hptUrl;
+    g_httpBllPtr->post(hrp);
+}
+
 void answerWidget::onStartFaceLiveVerify(CStartFaceLiveVerify startFaceLiveVerify)
 {
     if(startFaceLiveVerify.nCode == 200)
     {
+        m_nRetryCount = 0;
         g_appInfoPtr->m_oExamInfo.nFaceLiveVerifyId = startFaceLiveVerify.nFaceLiveVerifyId;
         g_appInfoPtr->m_oExamInfo.nFaceVerifyTimes = startFaceLiveVerify.nTimes;
         g_appInfoPtr->m_oExamInfo.nFaceVerifyDoMinute = startFaceLiveVerify.nStartMinute;
@@ -1010,13 +1182,23 @@ void answerWidget::onStartFaceLiveVerify(CStartFaceLiveVerify startFaceLiveVerif
     }
     else
     {
-        if(startFaceLiveVerify.sMessage.isEmpty())
+//        if(startFaceLiveVerify.sMessage.isEmpty())
+//        {
+//            ShowMsg(QString::fromLocal8Bit("开启活体验证失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+//        else
+//        {
+//            ShowMsg(startFaceLiveVerify.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+//        }
+
+        if(++m_nRetryCount > 3)
         {
-            ShowMsg(QString::fromLocal8Bit("开启活体验证失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            //退出
+            exitExamTip();
         }
         else
         {
-            ShowMsg(startFaceLiveVerify.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
+            StartFaceLiveVerify();
         }
     }
 }
@@ -1076,28 +1258,29 @@ void answerWidget::onExamHeartbeat(CExamHeartbeat examHeartbeat)
 		
 		if (m_nHeartBreatFailedCount >= m_nHeartBreatFailedExitCount)
 		{
+            exitExamTip();
 			//退出
-			awTimeLeftTips *wExitExam = new awTimeLeftTips(MASK_POP_WIDGET_TYPE::wt_exitExam, (QWidget*)(this->parent()));
-			connect(wExitExam, &awTimeLeftTips::timeLeftConfirm, this, [this, wExitExam]() {
-				if (m_pNetWorkErrorTimerPtr)
-				{
-					m_pNetWorkErrorTimerPtr->stop();
-				}
-				delete wExitExam;
-                emit gobackLogin();
-			});
-			wExitExam->show();
-			if (m_pNetWorkErrorTimerPtr == nullptr)
-			{
-				m_pNetWorkErrorTimerPtr = std::make_shared<QTimer>();
-				m_pNetWorkErrorTimerPtr->setInterval(30 * 1000);
-				connect(m_pNetWorkErrorTimerPtr.get(), &QTimer::timeout, [this, wExitExam]() {
-					m_pNetWorkErrorTimerPtr->stop();
-					delete wExitExam;
-                    emit gobackLogin();
-				});
-			}
-			m_pNetWorkErrorTimerPtr->start();
+//			awTimeLeftTips *wExitExam = new awTimeLeftTips(MASK_POP_WIDGET_TYPE::wt_exitExam, (QWidget*)(this->parent()));
+//			connect(wExitExam, &awTimeLeftTips::timeLeftConfirm, this, [this, wExitExam]() {
+//				if (m_pNetWorkErrorTimerPtr)
+//				{
+//					m_pNetWorkErrorTimerPtr->stop();
+//				}
+//				delete wExitExam;
+//                emit gobackLogin();
+//			});
+//			wExitExam->show();
+//			if (m_pNetWorkErrorTimerPtr == nullptr)
+//			{
+//				m_pNetWorkErrorTimerPtr = std::make_shared<QTimer>();
+//				m_pNetWorkErrorTimerPtr->setInterval(30 * 1000);
+//				connect(m_pNetWorkErrorTimerPtr.get(), &QTimer::timeout, [this, wExitExam]() {
+//					m_pNetWorkErrorTimerPtr->stop();
+//					delete wExitExam;
+//                    emit gobackLogin();
+//				});
+//			}
+//			m_pNetWorkErrorTimerPtr->start();
 								
 		}
 
@@ -1112,6 +1295,32 @@ void answerWidget::onExamHeartbeat(CExamHeartbeat examHeartbeat)
 	}
 }
 
+void answerWidget::exitExamTip()
+{
+    //退出
+    awTimeLeftTips *wExitExam = new awTimeLeftTips(MASK_POP_WIDGET_TYPE::wt_exitExam, (QWidget*)(this->parent()));
+    connect(wExitExam, &awTimeLeftTips::timeLeftConfirm, this, [this, wExitExam]() {
+        if (m_pNetWorkErrorTimerPtr)
+        {
+            m_pNetWorkErrorTimerPtr->stop();
+        }
+        delete wExitExam;
+        emit gobackLogin();
+    });
+    wExitExam->show();
+    if (m_pNetWorkErrorTimerPtr == nullptr)
+    {
+        m_pNetWorkErrorTimerPtr = std::make_shared<QTimer>();
+        m_pNetWorkErrorTimerPtr->setInterval(30 * 1000);
+        connect(m_pNetWorkErrorTimerPtr.get(), &QTimer::timeout, [this, wExitExam]() {
+            m_pNetWorkErrorTimerPtr->stop();
+            delete wExitExam;
+            emit gobackLogin();
+        });
+    }
+    m_pNetWorkErrorTimerPtr->start();
+}
+
 void answerWidget::on_btn_handInPaper_clicked()
 {
     if(m_nFreezeTime*60  > m_nUsedExamSeconds + m_nEnterExamTime - m_nLeftSeconds)
@@ -1169,7 +1378,7 @@ bool answerWidget::checkAnswer()
 	return bRet;
 }
 
-void answerWidget::handinPaper()
+void answerWidget::handinPaper(bool bForce)
 {
     m_pCountDownTimer->stop();
 
@@ -1192,11 +1401,12 @@ void answerWidget::handinPaper()
 
 	if (checkAnswer())
 	{
-		CHttpRequestPackage hrp;
-		hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/endExam");
-        hrp.sCommonStr = __FILE__;
-		hrp.nRequestType = RequestType::rtEndExam;
-		g_httpBllPtr->post(hrp);
+//		CHttpRequestPackage hrp;
+//		hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/endExam");
+//        hrp.sCommonStr = __FILE__;
+//		hrp.nRequestType = RequestType::rtEndExam;
+//		g_httpBllPtr->post(hrp);
+        doEndExam(bForce);
 	}
 	else
 	{
@@ -1206,19 +1416,35 @@ void answerWidget::handinPaper()
 			m_pHandinPaperTimer->setInterval(10 * 1000);
 			connect(m_pHandinPaperTimer.get(), &QTimer::timeout, this, [&]() {
 				if (checkAnswer())
-				{
+				{                    
                     m_pHandinPaperTimer->stop();
-					CHttpRequestPackage hrp;
-					hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/endExam");
-                    hrp.sCommonStr = __FILE__;
-					hrp.nRequestType = RequestType::rtEndExam;
-					g_httpBllPtr->post(hrp);
+                    doEndExam(bForce);
+//					CHttpRequestPackage hrp;
+//					hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/endExam");
+//                    hrp.sCommonStr = __FILE__;
+//					hrp.nRequestType = RequestType::rtEndExam;
+//					g_httpBllPtr->post(hrp);
 				}
 			});
 		}
 	}
 }
 
+void answerWidget::doEndExam(bool bForce)
+{
+    CHttpRequestPackage hrp;
+    hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/endExam");
+    if(bForce)
+    {
+        hrp.sParamList.push_back(QString("force,%1").arg(bForce));
+        hrp.eParamType = HttpParamType::hptUrl;
+    }
+    hrp.sCommonStr = __FILE__;
+    hrp.sAdditionStr = bForce ? "1" : "0";
+    hrp.nRequestType = RequestType::rtEndExam;
+    g_httpBllPtr->post(hrp);
+}
+
 void answerWidget::onEndExam(CEndExam endExam)
 {
     if(endExam.sModuleName == __FILE__)
@@ -1246,23 +1472,16 @@ void answerWidget::onEndExam(CEndExam endExam)
         }
         else
         {
-            QTimer::singleShot(5*1000, this, [](){
-                CHttpRequestPackage hrp;
-                hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/endExam");
-                hrp.sCommonStr = __FILE__;
-                hrp.nRequestType = RequestType::rtEndExam;
-                g_httpBllPtr->post(hrp);
+            QTimer::singleShot(5*1000, this, [&](){
+//                CHttpRequestPackage hrp;
+//                hrp.sUri = QString("/api/ecs_oe_student/client/exam/process/endExam");
+//                hrp.sCommonStr = __FILE__;
+//                hrp.nRequestType = RequestType::rtEndExam;
+//                g_httpBllPtr->post(hrp);
+
+                doEndExam(endExam.bForce);
             });
 
-            /*
-            if(endExam.sMessage.isEmpty())
-            {
-                ShowMsg(QString::fromLocal8Bit("交卷失败"), g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
-            }
-            else
-            {
-                ShowMsg(endExam.sMessage, g_appInfoPtr->m_pAnsBgWidget, MSG_ICON_TYPE::mit_error);
-            }*/
         }
     }
 }

+ 13 - 1
client/answerWidget.h

@@ -73,8 +73,18 @@ private:
 	void heartBreat();
     void uploadAnswer(int nIndex, QString sAnswer);
     void showQuestionByOrder(int nOrder);
-    void handinPaper();
+    void handinPaper(bool bForce = false);
+    void doEndExam(bool bForce);
     void refreshStatus();
+    void GetExamProperty();
+    void GetExamById();
+    void GetExamRecordPaperStruct();
+    void FindExamQuestionList();
+    void WeiXinAnswerEnabled();
+    void startAnwer();
+    void GetOrgPropertiesByGroupWithoutCache();
+    void StartFaceLiveVerify();
+    void exitExamTip();
 	bool checkAnswer();
     void startCapture();
     void stopCapture();
@@ -120,6 +130,8 @@ private:
 	
 	QStringList m_sRemoteList;
 	QStringList m_sRemoteTipList;
+
+    int m_nRetryCount = 0;
 };
 
 #endif // ANSWERWIDGET_H

+ 2 - 1
client/clOnlineExam.cpp

@@ -172,6 +172,7 @@ void clOnlineExam::onQueryExamList(CQueryExamList queryExamList)
 			clOperation *clo = new clOperation(i, ui->tablewt_examList);
 			clo->setUI(ui->tablewt_examList->columnWidth(6), ui->tablewt_examList->rowHeight(i), CL_OPERATION_TYPE::cot_online_exam);
             clo->setBtn1Enable(bIsInWeek && bIsInTimeRange && bIsInExamTime && eci.nAllowExamCount>0);
+            clo->setBtn2Enable(eci.bIsObjScoreView);
 			ui->tablewt_examList->setCellWidget(i, 6, clo);
             connect(clo, &clOperation::enterExam, this, [&](CL_OPERATION_TYPE cot, int nRow){
                 if (cot == CL_OPERATION_TYPE::cot_online_exam )
@@ -264,7 +265,7 @@ void clOnlineExam::onQueryExamEndList(CQueryExamEndList queryExamEndList)
 			ui->tablew_finishExamList->setItem(i, 5, new QTableWidgetItem(QString::number(eci.nAllowExamCount)));
 			clOperation *clo = new clOperation(i, ui->tablew_finishExamList);
 			clo->setUI(ui->tablew_finishExamList->columnWidth(6), ui->tablew_finishExamList->rowHeight(i), CL_OPERATION_TYPE::cot_online_finish_exam);
-			
+            clo->setBtn1Enable(eci.bIsObjScoreView);
 			ui->tablew_finishExamList->setCellWidget(i, 6, clo);
 
             connect(clo, &clOperation::showObjectiveScore, this, [&](CL_OPERATION_TYPE cot, int nRow) {

+ 1 - 0
client/clOnlineHomework.cpp

@@ -222,6 +222,7 @@ void clOnlineHomework::onQueryHomeworkList(CQueryHomeworkList queryHomeworkList)
 
 			clo->setUI(ui->tablewt_examList->columnWidth(6), ui->tablewt_examList->rowHeight(i), CL_OPERATION_TYPE::cot_online_homework);
 			clo->setBtn1Enable(bIsInWeek && bIsInTimeRange && bIsInExamTime);
+            clo->setBtn2Enable(eci.bIsObjScoreView);
 			ui->tablewt_examList->setCellWidget(i, 6, clo);
 		}
         m_vHomeworkExamList.swap(queryHomeworkList.vHomeworkExamList);

+ 1 - 0
client/client.pro

@@ -10,6 +10,7 @@ CONFIG += c++17
 # deprecated API in order to know how to port your code away from it.
 DEFINES += QT_DEPRECATED_WARNINGS
 
+QMAKE_LFLAGS_RELEASE+=/MAP
 QMAKE_CXXFLAGS_RELEASE += -O2 -GL
 QMAKE_CXXFLAGS_DEBUG += -Zi
 

+ 1 - 0
client/courseList.cpp

@@ -952,6 +952,7 @@ void courseList::onGetStudentInfoBySession(CGetStudentInfoBySession getStudentIn
         {
             ShowMsg(getStudentInfoBySession.sMessage, this, MSG_ICON_TYPE::mit_error);
         }
+        courseList::getStudentInfoBySession();
 	}
 }
 

+ 10 - 20
client/main.cpp

@@ -8,7 +8,9 @@
 #include <DbgHelp.h>
 #include "CLogTrack.h"
 #include "client/windows/handler/exception_handler.h"
-/*
+
+
+
 long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
 {
     //创建 Dump 文件
@@ -55,11 +57,11 @@ long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
                           QString::fromLocal8Bit("<FONT size=4><div><b>对于发生的错误,表示诚挚的歉意</b><br/></div>")+
         QString::fromLocal8Bit("<div>错误代码:%1</div><div>错误地址:%2</div></FONT>").arg(errCode).arg(errAdr),
         QMessageBox::Ok);
-    myDebug()<<QString::fromLocal8Bit("程序崩溃,错误代码:%1,错误地址:%2").arg(errCode).arg(errAdr);
+    myServerLog()<<QString::fromLocal8Bit("程序崩溃,错误代码:%1,错误地址:%2").arg(errCode).arg(errAdr);
 
     return 0;
 }
-*/
+
 bool callback(const wchar_t *dump_path, const wchar_t *id,
 	void *context, EXCEPTION_POINTERS *exinfo,
 	MDRawAssertionInfo *assertion,
@@ -84,23 +86,13 @@ bool callback(const wchar_t *dump_path, const wchar_t *id,
 
 	return succeeded;
 }
-/*
-int mydiv(int x, int y)
-{
-	int *z=0;
-	*z = x / y;
-	return *z;
-}
-*/
 
 int main(int argc, char *argv[])
 {    
 	QApplication a(argc, argv);
 
 	
-	//::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);
-
-	
+    ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);
 
 	g_appInfoPtr = std::make_shared<CAppInfo>();	
 
@@ -113,12 +105,10 @@ int main(int argc, char *argv[])
 
 	qInstallMessageHandler(CustomOutputMessage);
 
-	google_breakpad::ExceptionHandler eh(
-		L".", NULL, callback, NULL,
-		google_breakpad::ExceptionHandler::HANDLER_ALL);
+//	google_breakpad::ExceptionHandler eh(
+//		L".", NULL, callback, NULL,
+//		google_breakpad::ExceptionHandler::HANDLER_ALL);
 		
-//	printf("9/3=%d\n", mydiv(9, 3));
-	//printf("9/0=%d\n", mydiv(9, 0));  //程序将在此崩溃
 	
     login w;
     w.show();
@@ -128,7 +118,7 @@ int main(int argc, char *argv[])
 		QString sParam = argv[1];
 		if (sParam == "updateLauncher")
 		{
-			QString sSourceFile = g_appInfoPtr->m_sCacheFileDir + "launcher.exe";
+            QString sSourceFile = g_appInfoPtr->m_sCacheFileDir + "uptemp/launcher.exe";
 			QString sDestFileName = "launcher.exe";
 
 			QFile file(sSourceFile);

+ 5 - 2
client/privacyWidget.cpp

@@ -197,7 +197,9 @@ void privacyWidget::initAgreement(QString sContent)
                 {
                     QImage img;
                     img = QImage::fromData(QByteArray::fromBase64(CCommonTools::getImageRawBase64Str(sImage).toLatin1()));
-                    if(blocks["blocks"][j]["param"].isMember("width"))
+                    if(blocks["blocks"][j]["param"].isMember("width")
+                            && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                            !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                     {
                         img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                 QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
@@ -209,7 +211,8 @@ void privacyWidget::initAgreement(QString sContent)
                 else
                 {
                     QImage img(sImage);
-                    if(blocks["blocks"][j]["param"].isMember("width"))
+                    if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                            !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                     {
                         img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                 QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),

File diff suppressed because it is too large
+ 1013 - 769
common/CHttpBll.cpp


+ 2 - 0
common/httpDataDef.h

@@ -1185,9 +1185,11 @@ class CEndExam : public CBaseResponsePackage
 {
 public:
     QString sModuleName;
+    bool bForce;
     CEndExam()
     {
         sModuleName = "";
+        bForce = false;
     }
 };
 

+ 11 - 5
component/clOperation.cpp

@@ -147,14 +147,14 @@ bool clOperation::eventFilter(QObject *obj, QEvent *ev)
         if(m_operationType == CL_OPERATION_TYPE::cot_online_exam ||
 			m_operationType == CL_OPERATION_TYPE::cot_online_homework)
         {
-            if(obj == ui->btn2)
+            if(obj == ui->btn2 && ui->btn2->isEnabled())
             {
                 emit showObjectiveScore(m_operationType, m_nRow);
             }
         }
         else if(m_operationType == CL_OPERATION_TYPE::cot_online_finish_exam)
         {
-            if(obj == ui->btn1)
+            if(obj == ui->btn1 && ui->btn1->isEnabled())
             {
                 emit showObjectiveScore(m_operationType, m_nRow);
             }
@@ -184,14 +184,20 @@ bool clOperation::eventFilter(QObject *obj, QEvent *ev)
 
 void clOperation::setBtn1Enable(bool bEnable)
 {
-	if (m_operationType == CL_OPERATION_TYPE::cot_online_exam
-		|| m_operationType == CL_OPERATION_TYPE::cot_online_practice
-		|| m_operationType == CL_OPERATION_TYPE::cot_online_homework)
+//	if (m_operationType == CL_OPERATION_TYPE::cot_online_exam
+//		|| m_operationType == CL_OPERATION_TYPE::cot_online_practice
+//		|| m_operationType == CL_OPERATION_TYPE::cot_online_homework)
 	{
 		ui->btn1->setEnabled(bEnable);
 	}
 }
 
+void clOperation::setBtn2Enable(bool bEnable)
+{
+    ui->btn2->setEnabled(bEnable);
+}
+
+
 void clOperation::on_btn1_clicked()
 {
     if(m_operationType == CL_OPERATION_TYPE::cot_online_exam

+ 1 - 0
component/clOperation.h

@@ -41,6 +41,7 @@ public:
     void setUI(const int nWidth, const int nHeight, CL_OPERATION_TYPE cot);
 	void setOperationType(CL_OPERATION_TYPE cot);
 	void setBtn1Enable(bool bEnable);
+    void setBtn2Enable(bool bEnable);
 private slots:
     void on_btn1_clicked();
 

+ 15 - 2
face/CFaceRecProc.cpp

@@ -464,8 +464,16 @@ bool CFaceRecProc::setBaseImage(cv::Mat baseMat)
 
 bool CFaceRecProc::setBaseImage(QString sBaseImge)
 {
-    cv::Mat matBaseImg = cv::imread(sBaseImge.toLocal8Bit().toStdString());
-    return setBaseImage(matBaseImg);
+	try
+	{
+		cv::Mat matBaseImg = cv::imread(sBaseImge.toLocal8Bit().toStdString());
+		return setBaseImage(matBaseImg);
+	}
+	catch (const std::exception &e)
+	{
+		m_sErrMsg = QString::fromLocal8Bit("设置底照失败,%1").arg(e.what());
+		return false;
+	}
 }
 
 bool CFaceRecProc::compareWithBase(cv::Mat faceMat, int &nfaceCount, float &fScore)
@@ -922,3 +930,8 @@ float* CFaceRecProc::getFeature()
 {
     return  m_baseFeaturePtr.get();
 }
+
+bool CFaceRecProc::hasBaseImage()
+{
+    return m_baseFeaturePtr != nullptr;
+}

+ 1 - 0
face/CFaceRecProc.h

@@ -65,6 +65,7 @@ public:
     bool compareWithBaseRealness(cv::Mat faceMat, int &nfaceCount, float &fScore, bool &bRealness);    
     bool getMaxFaceScoreWithBase(cv::Mat faceMat, int &nfaceCount, float &fScore,  bool &bRealness, int &nTime);
 
+    bool hasBaseImage();
     float* getFeature();
     void setBaseFeature(float *feature);
 private:

+ 79 - 44
face/faceCompare.cpp

@@ -164,18 +164,8 @@ void faceCompare::on_btn_fc_compare_clicked()
 
         if (!g_appInfoPtr->m_sStudentPhotoPath.isEmpty())
         {
-            QString sFileName = g_appInfoPtr->m_sStudentPhotoPath.right(g_appInfoPtr->m_sStudentPhotoPath.length() - g_appInfoPtr->m_sStudentPhotoPath.lastIndexOf("/") - 1);
-            sFileName = g_appInfoPtr->m_sCacheFileDir + sFileName;
-            if(!QFile::exists(sFileName))
-            {
-                ShowMsg(QString::fromLocal8Bit("底照下载失败,请检查网络"), this, MSG_ICON_TYPE::mit_error);
-                return;
-            }
-			QFileInfo filePath(sFileName);
-			
-            if(!g_faceRecProcPtr->setBaseImage(filePath.absoluteFilePath()))
+            if(!setBaseImage())
             {
-                ShowMsg(g_faceRecProcPtr->errorMsg(), this, MSG_ICON_TYPE::mit_error);
                 return;
             }
         }
@@ -186,10 +176,39 @@ void faceCompare::on_btn_fc_compare_clicked()
             return;
         }
     }
+
+    if(!g_faceRecProcPtr->hasBaseImage())
+    {
+        if(!setBaseImage())
+        {
+            return;
+        }
+    }
+
     m_bStartCompare = true;
 	ui->btn_fc_compare->setEnabled(false);
 }
 
+bool faceCompare::setBaseImage()
+{
+    QString sFileName = g_appInfoPtr->m_sStudentPhotoPath.right(g_appInfoPtr->m_sStudentPhotoPath.length() - g_appInfoPtr->m_sStudentPhotoPath.lastIndexOf("/") - 1);
+    sFileName = g_appInfoPtr->m_sCacheFileDir + sFileName;
+    if(!QFile::exists(sFileName))
+    {
+        ShowMsg(QString::fromLocal8Bit("底照下载失败,请检查网络"), this, MSG_ICON_TYPE::mit_error);
+        return false;
+    }
+    QFileInfo filePath(sFileName);
+
+    if(!g_faceRecProcPtr->setBaseImage(filePath.absoluteFilePath()))
+    {
+        //g_faceRecProcPtr->errorMsg()
+        ShowMsg(QString::fromLocal8Bit("底照不符合要求,请更换照片"), this, MSG_ICON_TYPE::mit_error);
+        return false;
+    }
+    return true;
+}
+
 void faceCompare::on_btn_fc_close_clicked()
 {
     m_bIsRun = false;
@@ -273,58 +292,74 @@ void faceCompare::threadProc()
 //文件上传
 void faceCompare::onProcessUpload(CProcessUpload processUpload)
 {
-    if(processUpload.sCommonStr == __FILE__)
+    try
     {
-        if(processUpload.nCode == 200)
+        if(processUpload.sCommonStr == __FILE__)
         {
-            CHttpRequestPackage hrp;
-            hrp.sUri = "/api/ecs_oe_student/client/exam/process/saveFaceCompareResult";
-            hrp.nRequestType = RequestType::rtSaveFaceCompareResult;
-            Json::Value jBody = Json::Value::null;
-            jBody["faceCompareResult"] = QString::number(m_fScore).toStdString();
-            jBody["fileUrl"] = processUpload.sFileUrl.toStdString();
-            jBody["pass"] = true;
-            jBody["processTime"] = m_nTime;
-            jBody["stranger"] = m_nFaceCount > 1;
-            hrp.sParamList.push_back(QString("CustomBody,%1").arg(jBody.toStyledString().c_str()));
-            hrp.eParamType = HttpParamType::hptCustomBody;
-
-            g_httpBllPtr->post(hrp);
-        }
-        else
-        {
-            if(processUpload.sMessage.isEmpty())
+            if(processUpload.nCode == 200)
             {
-                ShowMsg(QString::fromLocal8Bit("上传照片失败"), this, MSG_ICON_TYPE::mit_error);
+                CHttpRequestPackage hrp;
+                hrp.sUri = "/api/ecs_oe_student/client/exam/process/saveFaceCompareResult";
+                hrp.nRequestType = RequestType::rtSaveFaceCompareResult;
+                Json::Value jBody = Json::Value::null;
+                jBody["faceCompareResult"] = QString::number(m_fScore).toStdString();
+                jBody["fileUrl"] = processUpload.sFileUrl.toStdString();
+                jBody["pass"] = true;
+                jBody["processTime"] = m_nTime;
+                jBody["stranger"] = m_nFaceCount > 1;
+                hrp.sParamList.push_back(QString("CustomBody,%1").arg(jBody.toStyledString().c_str()));
+                hrp.eParamType = HttpParamType::hptCustomBody;
+
+                g_httpBllPtr->post(hrp);
             }
             else
             {
-                ShowMsg(processUpload.sMessage, this, MSG_ICON_TYPE::mit_error);
+                if(processUpload.sMessage.isEmpty())
+                {
+                    ShowMsg(QString::fromLocal8Bit("上传照片失败"), this, MSG_ICON_TYPE::mit_error);
+                }
+                else
+                {
+                    ShowMsg(processUpload.sMessage, this, MSG_ICON_TYPE::mit_error);
+                }
             }
         }
     }
+    catch (const std::exception &e)
+    {
+        ShowMsg(QString::fromLocal8Bit("上传照片失败"), this, MSG_ICON_TYPE::mit_error);
+        myServerLog()<<"exception error"<<e.what();
+    }
 }
 
 //保存人脸识别比对验证结果
 void faceCompare::onSaveFaceCompareResult(CBaseResponsePackage res)
 {
-    if(res.nCode == 200)
+    try
     {
-        ShowMsg(QString::fromLocal8Bit("人脸比对成功"), this, MSG_ICON_TYPE::mit_succeed);
-        QTimer::singleShot(3000, this, [&](){
-            emit faceComparePass();
-        });
-
-    }
-    else
-    {
-        if(res.sMessage.isEmpty())
+        if(res.nCode == 200)
         {
-            ShowMsg(QString::fromLocal8Bit("保存人脸识别信息失败"), this, MSG_ICON_TYPE::mit_error);
+            ShowMsg(QString::fromLocal8Bit("人脸比对成功"), this, MSG_ICON_TYPE::mit_succeed);
+            QTimer::singleShot(3000, this, [&](){
+                emit faceComparePass();
+            });
+
         }
         else
         {
-            ShowMsg(res.sMessage, this, MSG_ICON_TYPE::mit_error);
+            if(res.sMessage.isEmpty())
+            {
+                ShowMsg(QString::fromLocal8Bit("保存人脸识别信息失败"), this, MSG_ICON_TYPE::mit_error);
+            }
+            else
+            {
+                ShowMsg(res.sMessage, this, MSG_ICON_TYPE::mit_error);
+            }
         }
     }
+    catch (const std::exception &e)
+    {
+        ShowMsg(QString::fromLocal8Bit("保存人脸识别信息失败"), this, MSG_ICON_TYPE::mit_error);
+        myServerLog()<<"exception error"<<e.what();
+    }
 }

+ 2 - 0
face/faceCompare.h

@@ -39,6 +39,8 @@ private slots:
 private:
     void onRenderVideoFrame(const char* userId, TRTCVideoStreamType streamType, TRTCVideoFrame* frame);
     void initUI();
+    bool setBaseImage();
+
     Ui::faceCompare *ui;
 
 	

+ 47 - 11
face/faceLiveness.cpp

@@ -5,7 +5,7 @@
 
 #include <QDesktopWidget>
 #include <QFile>
-
+#include <QFileInfo>
 #include "awMsgBox.h"
 #include "logproc.h"
 #include "CCommonTools.h"
@@ -415,6 +415,26 @@ void faceLiveness::on_btn_fc_close_clicked()
 
 }
 
+bool faceLiveness::setBaseImage()
+{
+    QString sFileName = g_appInfoPtr->m_sStudentPhotoPath.right(g_appInfoPtr->m_sStudentPhotoPath.length() - g_appInfoPtr->m_sStudentPhotoPath.lastIndexOf("/") - 1);
+    sFileName = g_appInfoPtr->m_sCacheFileDir + sFileName;
+    if(!QFile::exists(sFileName))
+    {
+        ShowMsg(QString::fromLocal8Bit("底照下载失败,请检查网络"), this, MSG_ICON_TYPE::mit_error);
+        return false;
+    }
+    QFileInfo filePath(sFileName);
+
+    if(!g_faceRecProcPtr->setBaseImage(filePath.absoluteFilePath()))
+    {
+        //g_faceRecProcPtr->errorMsg()
+        ShowMsg(QString::fromLocal8Bit("底照不符合要求,请更换照片"), this, MSG_ICON_TYPE::mit_error);
+        return false;
+    }
+    return true;
+}
+
 void faceLiveness::on_btn_fl_startVerify_clicked()
 {
     if(g_faceRecProcPtr == nullptr)
@@ -423,19 +443,27 @@ void faceLiveness::on_btn_fl_startVerify_clicked()
 
         if (!g_appInfoPtr->m_sStudentPhotoPath.isEmpty())
         {
-            QString sFileName = g_appInfoPtr->m_sStudentPhotoPath.right(g_appInfoPtr->m_sStudentPhotoPath.length() - g_appInfoPtr->m_sStudentPhotoPath.lastIndexOf("/") - 1);
-            sFileName = g_appInfoPtr->m_sCacheFileDir + sFileName;
-            if(!QFile::exists(sFileName))
+            if(!g_faceRecProcPtr->hasBaseImage())
             {
-                ShowMsg(QString::fromLocal8Bit("底照下载失败,请检查网络"), this, MSG_ICON_TYPE::mit_error);
-                return;
+                if(!setBaseImage())
+                {
+                    return;
+                }
             }
 
-            if(!g_faceRecProcPtr->setBaseImage(sFileName))
-            {
-                ShowMsg(g_faceRecProcPtr->errorMsg(), this, MSG_ICON_TYPE::mit_error);
-                return;
-            }
+//            QString sFileName = g_appInfoPtr->m_sStudentPhotoPath.right(g_appInfoPtr->m_sStudentPhotoPath.length() - g_appInfoPtr->m_sStudentPhotoPath.lastIndexOf("/") - 1);
+//            sFileName = g_appInfoPtr->m_sCacheFileDir + sFileName;
+//            if(!QFile::exists(sFileName))
+//            {
+//                ShowMsg(QString::fromLocal8Bit("底照下载失败,请检查网络"), this, MSG_ICON_TYPE::mit_error);
+//                return;
+//            }
+
+//            if(!g_faceRecProcPtr->setBaseImage(sFileName))
+//            {
+//                ShowMsg(g_faceRecProcPtr->errorMsg(), this, MSG_ICON_TYPE::mit_error);
+//                return;
+//            }
         }
         else
         {
@@ -445,6 +473,14 @@ void faceLiveness::on_btn_fl_startVerify_clicked()
     }
 
 
+    if(!g_faceRecProcPtr->hasBaseImage())
+    {
+        if(!setBaseImage())
+        {
+            return;
+        }
+    }
+
     m_bStartCompare = true;
     m_fMaxYaw = 0;
     m_fMinYaw = 0;

+ 1 - 0
face/faceLiveness.h

@@ -90,6 +90,7 @@ private:
     void saveLivenessResult();
     void verifyAction(cv::Mat matImage);
     void onRenderVideoFrame(const char* userId, TRTCVideoStreamType streamType, TRTCVideoFrame* frame);
+    bool setBaseImage();
 
     Ui::faceLiveness *ui;
 

+ 13 - 12
launcher/envCheck.cpp

@@ -60,29 +60,30 @@ envCheck::envCheck(QWidget *parent) :
       <<"Citrix HDX Web Camera";
 
     m_sRemoteList
-		<< "qq"
         <<"teamviewer"
         <<"lookmypc"
-        <<"xt"
+  //      <<"xt"
         <<"winaw32"
         <<"pcaquickconnect"
         <<"sessioncontroller"
-        <<"sunloginclient"
-        <<"sunloginremote"
-        <<"wechat"
-        <<"wemeetapp";
+        <<"sunlogin";
+        //<<"sunloginremote";
+    //		<< "qq"
+//        <<"wechat"
+//        <<"wemeetapp";
 
-    m_sRemoteTipList<<"QQ"
+    m_sRemoteTipList
         <<"TeamViewer"
         <<"LookMyPC"
-        << QString::fromLocal8Bit("协通")
+  //      << QString::fromLocal8Bit("协通")
         <<"Symantec PCAnywhere"
         <<"Symantec PCAnywhere"
         <<"Symantec PCAnywhere"
-        << QString::fromLocal8Bit("向日葵")
-        << QString::fromLocal8Bit("向日葵")
-        << QString::fromLocal8Bit("微信")
-        << QString::fromLocal8Bit("腾讯会议");
+        << QString::fromLocal8Bit("向日葵");
+     //   << QString::fromLocal8Bit("向日葵");
+    //        <<"QQ"
+//        << QString::fromLocal8Bit("微信")
+//        << QString::fromLocal8Bit("腾讯会议");
 
     qRegisterMetaType<CSysNotice>("CSysNotice");
     connect(g_httpBllPtr.get(), &CHttpBll::sgnSysNotice, this, &envCheck::onSysNotice);

+ 1 - 1
launcher/launcher.cpp

@@ -18,7 +18,7 @@
 #include <QProcess>
 
 launcher::launcher(QWidget *parent)
-    : base(parent)
+    : QWidget(parent)
     , ui(new Ui::launcher)
 {
     ui->setupUi(this);

+ 1 - 1
launcher/launcher.h

@@ -8,7 +8,7 @@ QT_BEGIN_NAMESPACE
 namespace Ui { class launcher; }
 QT_END_NAMESPACE
 
-class launcher : public base
+class launcher : public QWidget
 {
     Q_OBJECT
 

+ 4 - 2
question/fbFillBlankBody.cpp

@@ -121,7 +121,8 @@ int fbFillBlankBody::setUI(const int nWidth)
                 {
                     QImage img;
                     img = QImage::fromData(QByteArray::fromBase64(CCommonTools::getImageRawBase64Str(sImage).toLatin1()));
-                    if(blocks["blocks"][j]["param"].isMember("width"))
+                    if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                            !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                     {
                         img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                 QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
@@ -133,7 +134,8 @@ int fbFillBlankBody::setUI(const int nWidth)
                 else
                 {
                     QImage img(sImage);
-                    if(blocks["blocks"][j]["param"].isMember("width"))
+                    if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                            !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                     {
                         img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                 QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),

+ 6 - 2
question/optionBody.cpp

@@ -3,6 +3,8 @@
 
 #include "CAppInfo.h"
 #include "CCommonTools.h"
+#include "logproc.h"
+
 optionBody::optionBody(Json::Value jBody, QWidget *parent) :
     QWidget(parent),
     ui(new Ui::optionBody)
@@ -89,8 +91,10 @@ int optionBody::setUI(const int nWidth)
                 {
                     QImage img;
                     img = QImage::fromData(QByteArray::fromBase64(CCommonTools::getImageRawBase64Str(sImage).toLatin1()));
-                    if(blocks["blocks"][j]["param"].isMember("width"))
-                    {
+                    if(blocks["blocks"][j]["param"].isMember("width") &&
+						!QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+						!QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
+                    {					
                         img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                 QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
                                 Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

+ 4 - 2
question/questionBody.cpp

@@ -154,7 +154,8 @@ int questionBody::setUI(const int nWidth, const int nNum)
                 {
                     QImage img;
                     img = QImage::fromData(QByteArray::fromBase64(CCommonTools::getImageRawBase64Str(sImage).toLatin1()));
-                    if(blocks["blocks"][j]["param"].isMember("width"))
+                    if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                            !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                     {
                         img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                 QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
@@ -166,7 +167,8 @@ int questionBody::setUI(const int nWidth, const int nNum)
                 else
                 {
                     QImage img(sImage);
-                    if(blocks["blocks"][j]["param"].isMember("width"))
+                    if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                            !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                     {
                         img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                 QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),

+ 4 - 2
question/standardAnswer.cpp

@@ -136,7 +136,8 @@ void standardAnswer::initAnswer()
                         {
                             QImage img;
                             img = QImage::fromData(QByteArray::fromBase64(CCommonTools::getImageRawBase64Str(sImage).toLatin1()));
-                            if(blocks["blocks"][j]["param"].isMember("width"))
+                            if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                                    !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                             {
                                 img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                         QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),
@@ -148,7 +149,8 @@ void standardAnswer::initAnswer()
                         else
                         {
                             QImage img(sImage);
-                            if(blocks["blocks"][j]["param"].isMember("width"))
+                            if(blocks["blocks"][j]["param"].isMember("width") && !QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).isEmpty() &&
+                                    !QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).isEmpty())
                             {
                                 img = img.scaled(QString(blocks["blocks"][j]["param"]["width"].asString().c_str()).toInt(),
                                         QString(blocks["blocks"][j]["param"]["height"].asString().c_str()).toInt(),

Some files were not shown because too many files changed in this diff