فهرست منبع

完成统计界面。

JeffWang 3 سال پیش
والد
کامیت
910398d13b

+ 112 - 1
Source/OGCAssistTool/OGCAssistTool/DataImpl.cpp

@@ -300,6 +300,59 @@ INT CDataImpl::QueryOrder(std::string strOrder, TB_ORDER &order)
 	return nRow;
 }
 
+
+INT CDataImpl::QueryOrders(std::vector<TB_ORDER> &vtOrders, std::string strWhere)
+{
+	if ( m_psqlite3 == NULL )
+		return -1;
+
+	INT nRow = 0;
+	INT nCol = 0;
+
+	char** pazResult = NULL;
+	char* psqlite_error = NULL;
+	std::string strSql = _SELECT_ORDER_;
+	if ( strWhere.size() )
+	{
+		strSql.append(" WHERE ");
+		strSql.append(strWhere);
+	}
+	strSql.append(";");
+	int sqlite_error = sqlite3_get_table(m_psqlite3, strSql.c_str(), &pazResult, &nRow, &nCol, &psqlite_error);
+	if ( sqlite_error != SQLITE_OK)
+	{
+		GLOBAL::WriteTextLog(_T("sqlite3 error:%s,%s"),strSql.c_str(), psqlite_error);
+		FREE_MSG;
+		return -1;
+	}
+
+	vtOrders.resize(nRow);
+	std::vector<TB_ORDER>::iterator it = vtOrders.begin();
+	for(int i = 1; i <= nRow; i++, it++)
+	{
+#ifndef USE_UTF8
+		it->strOrder = pazResult[i*nCol+0];
+		it->strDeltaEType = pazResult[i*nCol+1];
+		it->strDeltaEValue = pazResult[i*nCol+2];
+		it->strMode = pazResult[i*nCol+3];
+		it->nMode = atoi(it->strMode.c_str());
+		it->strCreateTime = pazResult[i*nCol+4];
+#else
+		// 由Native for SQLite3插入的数据,都是utf8格式;
+		it->strOrder = CharEncoding::UTF82ASCII(pazResult[i*nCol+0]);
+		it->strDeltaEType = CharEncoding::UTF82ASCII(pazResult[i*nCol+1]);
+		it->strDeltaEValue = CharEncoding::UTF82ASCII(pazResult[i*nCol+2]);
+		it->strMode = CharEncoding::UTF82ASCII(pazResult[i*nCol+3]);
+		it->nMode = atoi(it->strMode.c_str());
+		it->strCreateTime = CharEncoding::UTF82ASCII(pazResult[i*nCol+4]);
+#endif
+	}
+
+	sqlite3_free_table(pazResult);
+
+	return nRow;
+}
+
 INT CDataImpl::QueryOrders(std::vector<TB_ORDER> &vtOrders, std::string strBeginTime, std::string EndTime)
 {
 	if ( m_psqlite3 == NULL )
@@ -555,8 +608,8 @@ INT CDataImpl::QuerySNData(std::vector<TB_SN> &vtSNData, std::string strWhere)
 	{
 		strSql.append(" WHERE ");
 		strSql.append(strWhere);
-		strSql.append(";");
 	}
+	strSql.append(";");
 	int sqlite_error = sqlite3_get_table(m_psqlite3, strSql.c_str(), &pazResult, &nRow, &nCol, &psqlite_error);
 	if ( sqlite_error != SQLITE_OK)
 	{
@@ -606,6 +659,64 @@ INT CDataImpl::QuerySNData(std::vector<TB_SN> &vtSNData, std::string strWhere)
 	return nRow;
 }
 
+INT CDataImpl::StatisticalQuery(std::vector<TB_STATIS> &vtStatis, std::string strWhere /* = "" */)
+{
+	if ( m_psqlite3 == NULL )
+		return -1;
+
+	INT nRow = 0;
+	INT nCol = 0;
+
+	char** pazResult = NULL;
+	char* psqlite_error = NULL;
+	std::string strSql = _STATIS_;
+	if ( strWhere.size() )
+	{
+		strSql.append(" WHERE ");
+		strSql.append(strWhere);
+	}
+	strSql.append(";");
+	int sqlite_error = sqlite3_get_table(m_psqlite3, strSql.c_str(), &pazResult, &nRow, &nCol, &psqlite_error);
+	if ( sqlite_error != SQLITE_OK)
+	{
+		GLOBAL::WriteTextLog(_T("sqlite3 error:%s,%s"),strSql.c_str(), psqlite_error);
+		FREE_MSG;
+		return -1;
+	}
+
+	vtStatis.resize(nRow);
+	std::vector<TB_STATIS>::iterator it = vtStatis.begin();
+	for(int i = 1; i <= nRow; i++, it++)
+	{
+#ifndef USE_UTF8
+		it->strCreateTime = pazResult[i*nCol+0];
+		it->strOrderID = pazResult[i*nCol+1];
+		it->strMode = pazResult[i*nCol+2];
+		it->strTotalCount = pazResult[i*nCol+3];
+		it->strPassCount = pazResult[i*nCol+4];
+		it->strPassRate = pazResult[i*nCol+5];
+		it->strAvgElapsed = pazResult[i*nCol+6];
+		it->strTotalElapsed = pazResult[i*nCol+7];
+		it->strDeltaEValue = pazResult[i*nCol+8];
+#else
+		// 由Native for SQLite3插入的数据,都是utf8格式;
+		it->strCreateTime = CharEncoding::UTF82ASCII(pazResult[i*nCol+0]);
+		it->strOrderID = CharEncoding::UTF82ASCII(pazResult[i*nCol+1]);
+		it->strMode = CharEncoding::UTF82ASCII(pazResult[i*nCol+2]);
+		it->strTotalCount = CharEncoding::UTF82ASCII(pazResult[i*nCol+3]);
+		it->strPassCount = CharEncoding::UTF82ASCII(pazResult[i*nCol+4]);
+		it->strPassRate = CharEncoding::UTF82ASCII(pazResult[i*nCol+5]);
+		it->strAvgElapsed = CharEncoding::UTF82ASCII(pazResult[i*nCol+6]);
+		it->strTotalElapsed = CharEncoding::UTF82ASCII(pazResult[i*nCol+7]);
+		it->strDeltaEValue = CharEncoding::UTF82ASCII(pazResult[i*nCol+8]);
+#endif
+	}
+
+	sqlite3_free_table(pazResult);
+
+	return nRow;
+}
+
 BOOL CDataImpl::UpdateOrder(TB_ORDER &order)
 {
 	return UpdateOrder(order.strOrder, order.strDeltaEType, order.strDeltaEValue, order.nMode);

+ 2 - 0
Source/OGCAssistTool/OGCAssistTool/DataImpl.h

@@ -85,11 +85,13 @@ public:
 	INT InsertSN(std::string strOrder, std::string strLine, std::string strSN, std::string strTesttTime, int nElapsed, int nTestResult, DOUBLE dDeltaAVGEValue, DOUBLE dDeltaEValue, std::string strDetails );
 
 	INT QueryOrder(std::string strOrder, TB_ORDER &order);
+	INT QueryOrders(std::vector<TB_ORDER> &vtOrders, std::string strWhere="");
 	INT QueryOrders(std::vector<TB_ORDER> &vtOrders, std::string strBeginTime, std::string EndTime);
 	INT QuerySNData(std::string strSN, TB_SN &sn_data);
 	INT QuerySNData(std::string strOrder, std::vector<TB_SN> &vtSNdata);
 	INT QuerySNData(std::vector<TB_SN> &vtSNData, std::string strBeginTime, std::string EndTime);
 	INT QuerySNData(std::vector<TB_SN> &vtSNData, std::string strWhere);
+	INT StatisticalQuery(std::vector<TB_STATIS> &vtStatis, std::string strWhere = "");
 
 	BOOL UpdateOrder(TB_ORDER &order);
 	BOOL UpdateOrder(std::string strOrder, std::string strDeltaEType, std::string strDeltaEValue, int nMode);

+ 11 - 2
Source/OGCAssistTool/OGCAssistTool/OGCAssistTool.rc

@@ -168,6 +168,15 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
 EXSTYLE WS_EX_STATICEDGE
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
+    CONTROL         "创建时间",CHECK_TEST_TIME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,22,48,10
+    CONTROL         "",IDC_DATETIMEPICKER1,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,67,20,76,15
+    CONTROL         "",IDC_DATETIMEPICKER2,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,156,20,76,15
+    PUSHBUTTON      "查询",BTN_QUERY,662,20,50,14
+    LTEXT           "至",IDC_STATIC,146,23,9,8
+    COMBOBOX        COMBO_ORDER,281,20,105,150,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "设置",IDC_STATIC,7,7,715,36
+    CONTROL         "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,7,47,715,270
+    CONTROL         "批次号",CHECK_BATCH_NUM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,22,33,10
 END
 
 PAGE_CONFIG DIALOGEX 0, 0, 732, 322
@@ -268,9 +277,9 @@ BEGIN
     PAGE_STATISTICS, DIALOG
     BEGIN
         LEFTMARGIN, 7
-        RIGHTMARGIN, 493
+        RIGHTMARGIN, 722
         TOPMARGIN, 7
-        BOTTOMMARGIN, 236
+        BOTTOMMARGIN, 315
     END
 
     PAGE_CONFIG, DIALOG

+ 2 - 2
Source/OGCAssistTool/OGCAssistTool/PageLog.cpp

@@ -44,8 +44,8 @@ BOOL CPageLog::OnInitDialog()
 	// TODO:  在此添加额外的初始化
 	SetBackgroundColor(RGB(200,200,200));
 
-	m_dtStartTime.SetFormat(_T("MM/dd HH:mm:ss"));
-	m_dtEndTime.SetFormat(_T("MM/dd HH:mm:ss"));
+	m_dtStartTime.SetFormat(_T("MM/dd HH:mm"));
+	m_dtEndTime.SetFormat(_T("MM/dd HH:mm"));
 	// 设置开始时间为前一天;
 	CTime tm1 = CTime::GetCurrentTime();
 	CTimeSpan tsp = CTimeSpan(3,0,0,0);

+ 174 - 1
Source/OGCAssistTool/OGCAssistTool/PageStatistics.cpp

@@ -23,10 +23,18 @@ CPageStatistics::~CPageStatistics()
 void CPageStatistics::DoDataExchange(CDataExchange* pDX)
 {
 	CDialogEx::DoDataExchange(pDX);
+	DDX_Control(pDX, IDC_LIST1, m_ctrlList);
+	DDX_Control(pDX, IDC_DATETIMEPICKER1, m_dtStartTime);
+	DDX_Control(pDX, IDC_DATETIMEPICKER2, m_dtEndTime);
+	DDX_Control(pDX, COMBO_ORDER, m_ctrlCombobox);
 }
 
 
 BEGIN_MESSAGE_MAP(CPageStatistics, CDialogEx)
+	ON_WM_CTLCOLOR()
+	ON_BN_CLICKED(CHECK_BATCH_NUM, &CPageStatistics::OnBnClickedBatchNum)
+	ON_BN_CLICKED(BTN_QUERY, &CPageStatistics::OnBnClickedQuery)
+	ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST1, &CPageStatistics::OnNMCustomdrawList1)
 END_MESSAGE_MAP()
 
 
@@ -37,7 +45,172 @@ BOOL CPageStatistics::OnInitDialog()
 	CDialogEx::OnInitDialog();
 
 	// TODO:  在此添加额外的初始化
-	SetBackgroundColor(RGB(255,255,255));
+	SetBackgroundColor(RGB(200,200,200));
+
+	m_dtStartTime.SetFormat(_T("MM/dd HH:mm"));
+	m_dtEndTime.SetFormat(_T("MM/dd HH:mm"));
+	// 设置开始时间为前一天;
+	CTime tm1 = CTime::GetCurrentTime();
+	CTimeSpan tsp = CTimeSpan(3,0,0,0);
+	tm1 -= tsp;
+	m_dtStartTime.SetTime(&tm1);
+
+	m_ctrlList.SetListFont(_T("新宋体"), 11, TRUE);
+	m_ctrlList.SetHeadings(
+		_T("创建时间,120"),
+		_T("批次号,120"),
+		_T("模式,80"),
+		_T("SN数量,90"),
+		_T("成功数量,90"),
+		_T("成功率,90"),
+		_T("平均耗时,90"),
+		_T("总耗时,90"),
+		_T("标准▲E值,90"),
+		NULL
+		);	
+
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 异常: OCX 属性页应返回 FALSE
 }
+
+HBRUSH CPageStatistics::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
+
+	// TODO:  在此更改 DC 的任何属性
+	switch ( pWnd->GetDlgCtrlID() ) 
+	{
+	case CHECK_TEST_TIME:
+	case CHECK_TEST_RESULT:
+	case CHECK_SN:
+	case CHECK_BATCH_NUM:
+		{
+#if 1 // 透明控件处理;
+			pDC->SetBkMode(TRANSPARENT);
+
+			CRect rc;
+			pWnd->GetWindowRect(&rc);
+			ScreenToClient(&rc);
+
+			CDC* dc = GetDC();
+			pDC->BitBlt(0,0,rc.Width(),rc.Height(),dc,rc.left,rc.top,SRCCOPY);  //把父窗口背景图片先画到按钮上
+
+			ReleaseDC(dc);
+			hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);
+#endif
+		}
+		break;
+	default:
+		break; 
+	}
+	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
+	return hbr;
+}
+
+void CPageStatistics::OnBnClickedBatchNum()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	BOOL bCheck = ((CButton*)GetDlgItem(CHECK_BATCH_NUM))->GetCheck();
+	if ( bCheck )
+	{
+		// 更新下拉框;
+		std::vector<TB_ORDER> vtOrders;
+		GLOBAL::g_db.QueryOrders(vtOrders);
+		m_ctrlCombobox.ResetContent();
+		for (std::vector<TB_ORDER>::iterator it = vtOrders.begin(); it != vtOrders.end(); it++ )
+		{
+			m_ctrlCombobox.AddString(CharEncoding::ASCII2UNICODE(it->strOrder.c_str()));
+		}
+
+		m_ctrlCombobox.SetCurSel(-1);
+	}
+}
+
+void CPageStatistics::OnBnClickedQuery()
+{
+	// TODO: 在此添加控件通知处理程序代码
+	BOOL bCheckDate = ((CButton*)GetDlgItem(CHECK_TEST_TIME))->GetCheck();
+	BOOL bCheckBatchNum = ((CButton*)GetDlgItem(CHECK_BATCH_NUM))->GetCheck();
+
+	if ( !(bCheckDate || bCheckBatchNum ) )
+	{
+		MessageBox(_T("必须勾选某一项才能查询数据!"), _T("提示"), MB_ICONWARNING);
+		return;
+	}
+
+	std::string strWhere;
+	if ( bCheckDate )
+	{
+		CTime tStart;
+		CTime tEnd;
+		m_dtStartTime.GetTime(tStart);
+		m_dtEndTime.GetTime(tEnd);
+
+		strWhere.append("CreateTime >= '");
+		strWhere.append(CharEncoding::UNICODE2ASCII((LPWCH)tStart.Format(_T("%Y-%m-%d %H:%M:%S")).GetString()));
+		strWhere.append("' and CreateTime <='");
+		strWhere.append(CharEncoding::UNICODE2ASCII((LPWCH)tEnd.Format(_T("%Y-%m-%d %H:%M:%S")).GetString()));
+		strWhere.append("'");
+	}
+
+	if ( bCheckBatchNum )
+	{
+		CString strOrder;
+		GetDlgItemText(EDIT_BATCH_NUM, strOrder);
+		if ( strWhere.size() )
+			strWhere.append(" and DebugSN.OrderID='");
+		else
+			strWhere.append(" DebugSN.OrderID='");
+		strWhere.append(CharEncoding::UNICODE2ASCII((LPWCH)strOrder.GetString()));
+		strWhere.append("'");
+	}
+
+	std::vector<TB_STATIS> vtStatis;
+	if ( GLOBAL::g_db.StatisticalQuery(vtStatis, strWhere) != -1 )
+	{
+		UpdateList(vtStatis);
+	}
+}
+
+void CPageStatistics::UpdateList(std::vector<TB_STATIS> &vtStatis)
+{
+	int nIndex = 0;
+	CString strValue;
+	m_ctrlList.RemoveAll();
+	m_ctrlList.m_AryList.SetSize(vtStatis.size(), 1);
+	for (std::vector<TB_STATIS>::iterator it = vtStatis.begin(); it != vtStatis.end(); it++)
+	{
+		CStringArray arryString;
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strCreateTime.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strOrderID.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strMode.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strTotalCount.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strPassCount.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strPassRate.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strAvgElapsed.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strTotalElapsed.c_str()));
+		arryString.Add(CharEncoding::ASCII2UNICODE(it->strDeltaEValue.c_str()));
+
+		//arryString.Add(strValue);
+		m_ctrlList.m_AryList.ElementAt(nIndex++).Copy(arryString);
+	}
+	//m_ctrlList.m_AryList.SetSize(vtRGB.size(), 1);
+	m_ctrlList.SetItemCountEx(vtStatis.size());
+}
+void CPageStatistics::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
+{
+	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
+	*pResult = 0;
+	if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
+	{
+		*pResult = CDRF_NOTIFYITEMDRAW;
+	}
+	else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
+	{
+		if ( pLVCD->nmcd.dwItemSpec % 2 )
+			pLVCD->clrTextBk = RGB(204,204,204);
+		else 
+			pLVCD->clrTextBk = RGB(190,190,190);
+		*pResult = CDRF_DODEFAULT;
+	}
+}

+ 13 - 1
Source/OGCAssistTool/OGCAssistTool/PageStatistics.h

@@ -1,5 +1,8 @@
 #pragma once
-
+#include "afxcmn.h"
+#include "afxdtctl.h"
+#include "ListSortCtrl.h"
+#include "afxwin.h"
 
 // CPageStatistics ¶Ô»°¿ò
 
@@ -20,4 +23,13 @@ protected:
 	DECLARE_MESSAGE_MAP()
 public:
 	virtual BOOL OnInitDialog();
+	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
+	CListSortCtrl m_ctrlList;
+	CDateTimeCtrl m_dtStartTime;
+	CDateTimeCtrl m_dtEndTime;
+	afx_msg void OnBnClickedBatchNum();
+	CComboBox m_ctrlCombobox;
+	afx_msg void OnBnClickedQuery();
+	void UpdateList(std::vector<TB_STATIS> &vtStatis);
+	afx_msg void OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult);
 };

+ 22 - 0
Source/OGCAssistTool/OGCAssistTool/TableInfo.h

@@ -29,6 +29,19 @@ typedef struct __TB_SN__
 	std::string strDetails;
 }TB_SN, *LPTB_SN;
 
+typedef struct __TB_STATIS__
+{
+	std::string strCreateTime;
+	std::string strOrderID;
+	std::string strMode;
+	std::string strTotalCount;
+	std::string strPassCount;
+	std::string strPassRate;
+	std::string strAvgElapsed;
+	std::string strTotalElapsed;
+	std::string strDeltaEValue;
+}TB_STATIS, *LPTB_STATIS;
+
 // ´´½¨±í;
 #define _CREATE_ORDER_ "CREATE TABLE DebugOrders(\
 OrderID TEXT(32) NOT NULL, \
@@ -61,6 +74,15 @@ PRIMARY KEY(SN));"
 // ²éѯ±í;
 #define _SELECT_ORDER_ "SELECT OrderID, DEType, DEValue, Mode, CreateTime FROM DebugOrders"
 #define _SELECT_SN_ "SELECT OrderID, SN,Line,TestTime,ElapsedTime,TestResult,DEAvgValue,DEValue,Outcome FROM DebugSN"
+#define _STATIS_ "select CreateTime, DebugSN.OrderID, \
+case Mode when '1' then 'Online' else 'Offlien' end as 'Mode', \
+count(1) as 'TotalCount', \
+count(case TestResult when '1' then 'pass' end) as 'PassCount', \
+(count(case TestResult when '1' then 'pass' end)*1.0/count(1)) as 'PassRate', \
+avg(ElapsedTime) as 'AvgElapsed', \
+sum(ElapsedTime) as 'TotalElapsed', \
+DebugOrders.DEValue \
+from DebugSN INNER JOIN DebugOrders ON DebugSN.OrderID = DebugOrders.OrderID" 
 
 // ɾ³ý¼Ç¼;
 #define _DELETE_ORDER_ ""

+ 3 - 2
Source/OGCAssistTool/OGCAssistTool/resource.h

@@ -50,14 +50,15 @@
 #define CHECK_SN                        1022
 #define IDC_DATETIMEPICKER2             1023
 #define IDC_LIST1                       1024
+#define COMBO_ORDER                     1025
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        135
+#define _APS_NEXT_RESOURCE_VALUE        136
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1025
+#define _APS_NEXT_CONTROL_VALUE         1026
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif