⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datahandle.cpp

📁 移动拨测的语音数据检测
💻 CPP
字号:
// DataHandle.cpp: implementation of the CDataHandle class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Analyse.h"
#include "DataHandle.h"

#include "StructDef.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ParamSet TempParam[16];
int SetNum; //设置的模块数
int count[16]={0};
int EveryGroupRegNum[16]={0};  //每组中的接入次数
EveryGroupRegisteRate TempRegisteRate[100];

CDataHandle::CDataHandle()
{
/*	for(int n=0;n<16;n++)
	{
		Group[n]=0;
		RegisteTotalNumber[n]=0;
		RegisteNumber[n]=0;
		CallingTotalNumber[n]=0;
		ConnectNumber[n]=0;
		DropoffNumber[n]=0;
		SingleConnectNumber[n]=0;
		DuanxuNumber[n]=0;
		ConnectTime[n]=0;
		DialTime[n]=0;
		TotalDialTime[n]=0;
		TotalConnectTime[n]=0;
	}
	IsClosed=true;*/
}

CDataHandle::~CDataHandle()
{

}


void CDataHandle::OpenFile()  //
{
	char TempRecordFileName[512];
	char DialTimeAndConnectTimeFileName[512];
	char EveryGroupRegNumFileName[512];
	ParamSet TempParam1;
	int ModuleNum;
//	ParamSet TempParam3;

	for(int n=0;n<16;n++)
	{
		Group[n]=0;
		RegisteTotalNumber[n]=0;
		RegisteNumber[n]=0;
		CallingTotalNumber[n]=0;
		ConnectNumber[n]=0;
		DropoffNumber[n]=0;
		SingleConnectNumber[n]=0;
		DuanxuNumber[n]=0;
		ConnectTime[n]=0;
		DialTime[n]=0;
		TotalDialTime[n]=0;
		TotalConnectTime[n]=0;
	}
	IsClosed=true;


	if(!ParamFile.Open("D:\\SL400Data\\DataTemp\\ParamSet.prm",CFile::shareDenyNone|CFile::modeRead))
		TRACE0("不能打开参数设置文件!!");
	ModuleNum=(ParamFile.GetLength()-250)/sizeof(ParamSet);
//	SetNum=1;
	for(int a=0;a<ModuleNum;a++)
	{
		ParamFile.Seek(250+a*sizeof(ParamSet),CFile::begin);
		ParamFile.Read(&TempParam1,sizeof(ParamSet));
		if(TempParam1.Actived==1)
		{
			ParamFile.Seek(250+a*sizeof(ParamSet),CFile::begin);
			ParamFile.Read(&TempParam[SetNum],sizeof(ParamSet));
			SetNum+=1;
		}
	}

	if(!ResultFile.Open("D:\\SL400Data\\DataTemp\\TestResult.dat",CFile::shareDenyWrite | CFile::modeCreate | CFile::modeReadWrite))
		TRACE0("不能生成测试结果文件!!");
	for(int m=0;m<SetNum;m++)
	{
//		ParamFile.Seek(250+m*sizeof(ParamSet),CFile::begin);
//		ParamFile.Read(&TempParam1,sizeof(ParamSet));

		sprintf(TempRecordFileName,"D:\\SL400Data\\DataTemp\\TestRecord%02d.dat",TempParam[m].ModuleID);
		sprintf(DialTimeAndConnectTimeFileName,"D:\\SL400Data\\DataTemp\\DialDelayConTime%02d.dat",TempParam[m].ModuleID);
		sprintf(EveryGroupRegNumFileName,"D:\\SL400Data\\DataTemp\\GroupRegRate%02d.dat",TempParam[m].ModuleID);

//		if(!TestFile[TempParam1.ModuleID].Open(TempRecordFileName,CFile::shareDenyNone|CFile::modeCreate|CFile::modeReadWrite))
//			AfxMessageBox("不能打开测试记录文件!!");
//TestFile[TempParam1.ModuleID].Open(TempRecordFileName,CFile::shareDenyNone|CFile::modeReadWrite);
//AfxMessageBox("准备打开测试记录文件!!");
		while(!TestFile[TempParam[m].ModuleID].Open(TempRecordFileName,CFile::shareDenyNone|CFile::modeReadWrite)) {;}
//AfxMessageBox("已经打开测试记录文件!!");
//DWORD abc=GetLastError();
//CString str;
//str.Format("%d",abc);
//AfxMessageBox(str);

		if(TempParam[m].TestItem==0x01)
		{
			if(!GroupRegNumFile[TempParam[m].ModuleID].Open(EveryGroupRegNumFileName,CFile::shareDenyWrite | CFile::modeCreate | CFile::modeReadWrite))
				AfxMessageBox("不能生成每组接入率存储文件!!!");
		}
		else
		{
			if(!DialTimeConTimeFile[TempParam[m].ModuleID].Open(DialTimeAndConnectTimeFileName,CFile::shareDenyWrite | CFile::modeCreate | CFile::modeReadWrite))
				TRACE0("不能生成拨号后时延与通话时长存储文件");
		}
		IsClosed=false;
	}
	ParamFile.Close();

}

void CDataHandle::CloseFile()
{
	if(IsClosed==false)
	{
//		ParamSet TempParam2;
		for(int k=0;k<SetNum;k++)
		{
/*			ParamFile.Seek(250+k*sizeof(ParamSet),CFile::begin);
			ParamFile.Read(&TempParam2,sizeof(ParamSet));
			TestFile[TempParam2.ModuleID].Close();
			if(TempParam2.TestItem==0x01)
				GroupRegNumFile[TempParam2.ModuleID].Close();
			else
				DialTimeConTimeFile[TempParam2.ModuleID].Close();
*/
			TestFile[TempParam[k].ModuleID].Close();
			if(TempParam[k].TestItem==0x01)
				GroupRegNumFile[TempParam[k].ModuleID].Close();
			else
				DialTimeConTimeFile[TempParam[k].ModuleID].Close();
		}
//		ParamFile.Close();
		ResultFile.Close();
		IsClosed=true;
	}
	else 
	{
//		AfxMessageBox("Files have been closed!!");
		return;
	}

}

void CDataHandle::FinalResult()
{
	ResultType TempResult;
	TempResult.ConnectRate=0;
	TempResult.ConnectTime=0;
	TempResult.DialDelay=0;
	TempResult.DropoffRate=0;
	TempResult.DuanxuRate=0;
	TempResult.RegisteRate=0;
	TempResult.SingleConnectRate=0;

	for(int j=0;j<SetNum;j++)
	{
		if(RegisteTotalNumber[TempParam[j].ModuleID]!=0)
		{
			TempResult.RegisteRate=((double)RegisteNumber[TempParam[j].ModuleID]/(double)RegisteTotalNumber[TempParam[j].ModuleID])*100;
			TempResult.TestActualNum=RegisteTotalNumber[TempParam[j].ModuleID];
		}
		else 
		{
			if(CallingTotalNumber[TempParam[j].ModuleID]!=0)
			{
				TempResult.ConnectRate=((double)ConnectNumber[TempParam[j].ModuleID]/(double)CallingTotalNumber[TempParam[j].ModuleID])*100;
				TempResult.DialDelay=TotalDialTime[TempParam[j].ModuleID]/(double)CallingTotalNumber[TempParam[j].ModuleID];
				TempResult.ConnectTime=TotalConnectTime[TempParam[j].ModuleID]/(double)CallingTotalNumber[TempParam[j].ModuleID];
				TempResult.TestActualNum=CallingTotalNumber[TempParam[j].ModuleID];
				if(ConnectNumber!=0)
				{
					TempResult.DropoffRate=((double)DropoffNumber[TempParam[j].ModuleID]/(double)ConnectNumber[TempParam[j].ModuleID])*100;
					TempResult.DuanxuRate=((double)DuanxuNumber[TempParam[j].ModuleID]/(double)ConnectNumber[TempParam[j].ModuleID])*100;
					TempResult.SingleConnectRate=((double)SingleConnectNumber[TempParam[j].ModuleID]/(double)ConnectNumber[TempParam[j].ModuleID])*100;
				}
				else
				{
					TRACE0("接通率为0 !!!");
				}
			}
			else 
			{
				TRACE0("测试记录有错!!");
				return;
			}
		}
		strncpy(TempResult.CalledNumber,TempParam[j].CalledNumber,20);
		strncpy(TempResult.SelfNumber,TempParam[j].CallNumber,20);
		TempResult.ModuleID=TempParam[j].ModuleID;
		CopyTime(TempResult.TestStartTime,TempStartTime[TempParam[j].ModuleID]);
		CopyTime(TempResult.TestEndTime,TempEndTime[TempParam[j].ModuleID]);
		ResultFile.Seek(j*sizeof(ResultType),CFile::begin);
		ResultFile.Write(&TempResult,sizeof(ResultType));
	}
//	AfxMessageBox("Analyze is over!!");
}

void CDataHandle::StatisticResult()
{
//	char TempTestFileName[512];
	int TempFileLen;  //临时文件长度
	SingleTestRecord TempTestRecord;
//	ResultType TempResult;

	for(int i=0;i<SetNum;i++)
	{
//		ParamFile.Seek(250+i*sizeof(ParamSet),CFile::begin);
//		ParamFile.Read(&TempParam[i],sizeof(ParamSet));
		BYTE AAA=TempParam[i].TestItem;
		TempFileLen=TestFile[TempParam[i].ModuleID].GetLength();
//		TestNum=(TempTestRecord-sizeof(ParamSet))/sizeof(SingleTestRecord);
		if(AAA==0x01)  //接入率的的计算,因为接入率和其它六项是互斥的
		{
//			EveryGroupRegisteRate TempRegisteRate[50];
//			RegisteTotalNumber=TestNum;  //总的接入率测试次数
			for(int l=0;l<20;l++)
			{
				if((sizeof(ParamSet)+(count[TempParam[i].ModuleID])*sizeof(SingleTestRecord))>=(unsigned)TempFileLen) break;
				TestFile[TempParam[i].ModuleID].Seek((sizeof(ParamSet)+count[TempParam[i].ModuleID]*sizeof(SingleTestRecord)),CFile::begin);
				TestFile[TempParam[i].ModuleID].Read(&TempTestRecord,sizeof(SingleTestRecord));
				if(count[TempParam[i].ModuleID]%TempParam[i].TestTimes==0)	
				{
					if(count[TempParam[i].ModuleID]==0)
					{
						Group[TempParam[i].ModuleID]=1;
						EveryGroupRegNum[TempParam[i].ModuleID]=0;
						CopyTime(TempRegisteRate[Group[TempParam[i].ModuleID]].TestStartTime,TempTestRecord.TestStartMoment);
					}
					else
					{
						TempRegisteRate[Group[TempParam[i].ModuleID]].GroupNumber=Group[TempParam[i].ModuleID];
						TempRegisteRate[Group[TempParam[i].ModuleID]].EveryRegisteRate=((double)EveryGroupRegNum[TempParam[i].ModuleID]/(double)TempParam[i].TestTimes)*100;
						GroupRegNumFile[TempParam[i].ModuleID].Seek((Group[TempParam[i].ModuleID]-1)*sizeof(EveryGroupRegisteRate),CFile::begin);
						GroupRegNumFile[TempParam[i].ModuleID].Write(&TempRegisteRate[Group[TempParam[i].ModuleID]],sizeof(EveryGroupRegisteRate));
					
						Group[TempParam[i].ModuleID]+=1;
						EveryGroupRegNum[TempParam[i].ModuleID]=0;
						CopyTime(TempRegisteRate[Group[TempParam[i].ModuleID]].TestStartTime,TempTestRecord.TestStartMoment);//接入率测试的开始时间
					}
				}
				if(count[TempParam[i].ModuleID]==0&&l==0)
					CopyTime(TempStartTime[TempParam[i].ModuleID],TempTestRecord.TestStartMoment);//整个测试的开始时间
				CopyTime(TempRegisteRate[Group[TempParam[i].ModuleID]].TestEndTime,TempTestRecord.TestEndMoment);//接入率测试的结束时间
				CopyTime(TempEndTime[TempParam[i].ModuleID],TempTestRecord.TestEndMoment);//整个测试的结束时间
				if(TempTestRecord.IfRegisted==1)
				{
					EveryGroupRegNum[TempParam[i].ModuleID]+=1;
					RegisteNumber[TempParam[i].ModuleID]+=1; //总的接入次数
				}
				count[TempParam[i].ModuleID]++;
			}
			TempRegisteRate[Group[TempParam[i].ModuleID]].GroupNumber=Group[TempParam[i].ModuleID];
			int residue;
			residue=count[TempParam[i].ModuleID]%TempParam[i].TestTimes;
			if(residue!=0)
				TempRegisteRate[Group[TempParam[i].ModuleID]].EveryRegisteRate=((double)EveryGroupRegNum[TempParam[i].ModuleID]/(double)residue)*100;
			else 
			{
				if(count[TempParam[i].ModuleID]!=0)
					TempRegisteRate[Group[TempParam[i].ModuleID]].EveryRegisteRate=((double)EveryGroupRegNum[TempParam[i].ModuleID]/(double)TempParam[i].TestTimes)*100;
				else TempRegisteRate[Group[TempParam[i].ModuleID]].EveryRegisteRate=0;
			}
			GroupRegNumFile[TempParam[i].ModuleID].Seek((Group[TempParam[i].ModuleID]-1)*sizeof(EveryGroupRegisteRate),CFile::begin);
			GroupRegNumFile[TempParam[i].ModuleID].Write(&TempRegisteRate[Group[TempParam[i].ModuleID]],sizeof(EveryGroupRegisteRate));
			RegisteTotalNumber[TempParam[i].ModuleID]=count[TempParam[i].ModuleID];
		}
		else
		{
			EveryDialDelayAndConnectTime TempDialDelayAndConnectTime;
//			CallingTotalNumber=TestNum;  //总的呼叫测试次数
			for(int p=0;p<20;p++)
			{
				if((sizeof(ParamSet)+(count[TempParam[i].ModuleID])*sizeof(SingleTestRecord))>=(unsigned)TempFileLen) break;
				TestFile[TempParam[i].ModuleID].Seek((sizeof(ParamSet)+count[TempParam[i].ModuleID]*sizeof(SingleTestRecord)),CFile::begin);
				TestFile[TempParam[i].ModuleID].Read(&TempTestRecord,sizeof(SingleTestRecord));
				if(TempTestRecord.IsReturnRing==1)  ConnectNumber[TempParam[i].ModuleID]+=1;
				if(TempTestRecord.IfDropoff==1)    DropoffNumber[TempParam[i].ModuleID]+=1;
				if(TempTestRecord.IfSingleConnect==1)  SingleConnectNumber[TempParam[i].ModuleID]+=1;
				if(TempTestRecord.IfDuanXu==1)  DuanxuNumber[TempParam[i].ModuleID]+=1;
				CopyTime(TempDialDelayAndConnectTime.TestStartTime,TempTestRecord.TestStartMoment);//每次测试的开始时间
				CopyTime(TempDialDelayAndConnectTime.ConnectStartTime,TempTestRecord.ReturnOkMoment);//每次通话开始时间
				CopyTime(TempDialDelayAndConnectTime.TestEndTime,TempTestRecord.TestEndMoment);//每次测试的结束时间
				if(count[TempParam[i].ModuleID]==0) 
					CopyTime(TempStartTime[TempParam[i].ModuleID],TempTestRecord.TestStartMoment);// 整个测试的开始时间
				CopyTime(TempEndTime[TempParam[i].ModuleID],TempTestRecord.TestEndMoment);//整个测试的结束时间
				TempDialDelayAndConnectTime.EveryDialDelay=TempTestRecord.DialDelay;//每次呼叫的拨号后时延
				TotalDialTime[TempParam[i].ModuleID]+=TempDialDelayAndConnectTime.EveryDialDelay;//拨号后时延的累加  TotalDialTime
				TempDialDelayAndConnectTime.EveryConnectTime=TempTestRecord.ConnectTime;//每次的通话时长
				TotalConnectTime[TempParam[i].ModuleID]+=TempDialDelayAndConnectTime.EveryConnectTime;//通话时长的累加  TotalConnectTime
				TempDialDelayAndConnectTime.TestNum=count[TempParam[i].ModuleID]+1;
				DialTimeConTimeFile[TempParam[i].ModuleID].Seek(count[TempParam[i].ModuleID]*sizeof(EveryDialDelayAndConnectTime),CFile::begin);
				DialTimeConTimeFile[TempParam[i].ModuleID].Write(&TempDialDelayAndConnectTime,sizeof(EveryDialDelayAndConnectTime));
				count[TempParam[i].ModuleID]++;
			}
			CallingTotalNumber[TempParam[i].ModuleID]=count[TempParam[i].ModuleID];  //总的呼叫测试次数
		}
		FinalResult();

	}
}


void CDataHandle::CopyTime(SYSTEMTIME& TM1,SYSTEMTIME TM2)
{
	TM1.wDay=TM2.wDay;
	TM1.wDayOfWeek=TM2.wDayOfWeek;
	TM1.wHour=TM2.wHour;
	TM1.wMilliseconds=TM2.wMilliseconds;
	TM1.wMinute=TM2.wMinute;
	TM1.wMonth=TM2.wMonth;
	TM1.wSecond=TM2.wSecond;
	TM1.wYear=TM2.wYear;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -