📄 unitrecord.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UnitRecord.h"
#include "UnitMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define LENGTHOFLINE 108 //正常通话记录长度
TModuleRecord *ModuleRecord;
//---------------------------------------------------------------------------
__fastcall TModuleRecord::TModuleRecord(TComponent* Owner)
: TDataModule(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TModuleRecord::FileRecord(AnsiString CallTicket)
{
//是否为通话记录?因可能为联络信号
TDateTime DT;
if(CallTicket.Length()!=LENGTHOFLINE)
{
ErrorRecord("通话记录长度不符",CallTicket);
return;
}
if(!StringToDateTime(CallTicket.SubString(4,8),&DT))
{
ErrorRecord("日期时间格式不符",CallTicket);
return;
}
//找到匹配的计费种类,路由、被叫号码字冠匹配
AnsiString Route1,Route2,No2p,status;
Route1=CallTicket.SubString(26,7).Trim();
Route2=CallTicket.SubString(33,7).Trim();
No2p=CallTicket.SubString(41,18).Trim();
status=CallTicket.SubString(24,1);
//--此法要求“城区市话”必须排为Query4的最后一项,优先级最低可保证此点
Query4->First();
for(int i=0;i<Query4->RecordCount-1;i++)
{
if((Query4->FieldByName("ztxx")->AsString.IsEmpty()
||Query4->FieldByName("xtxx")->AsString==status)&&
(Query4->FieldByName("ly1")->AsString.IsEmpty()
||Query4->FieldByName("ly1")->AsString==Route1)&&
(Query4->FieldByName("ly2")->AsString.IsEmpty()
||Query4->FieldByName("ly2")->AsString==Route2)&&
(No2p.AnsiPos(Query4->FieldByName("Article")->AsString)==1))
{
goto ExLoop;//定位到匹配项,否则定位到最后一项即“城区市话”
}
Query4->Next();
}
if(!((Query4->FieldByName("ztxx")->AsString.IsEmpty()
||Query4->FieldByName("xtxx")->AsString==status)&&
(Query4->FieldByName("ly1")->AsString.IsEmpty()
||Query4->FieldByName("ly1")->AsString==Route1)&&
(Query4->FieldByName("ly2")->AsString.IsEmpty()
||Query4->FieldByName("ly2")->AsString==Route2)))
return;
//计算话费
//0.1分即6秒为基本单位的通话时长
ExLoop:
float fee=0;
int interval=CallTicket.SubString(13,4).ToInt();
//"城区市话"外基本话费
if(Query4->FieldByName("Variety")->AsString!="城区市话")
{
int i=Query4->FieldByName("Unit")->AsInteger;
if(i==0)i=1;
fee=((int)(interval+1-1)/i)*Query4->FieldByName("Price")->AsFloat;
}
//"城区市话"或“信息”基本话费
if(Query4->FieldByName("Variety")->AsString=="城区市话"||
Query4->FieldByName("Variety")->AsString=="信息")
{
//前3分钟
fee+=Query4->FieldByName("Price")->AsFloat;
//3分钟后
if(interval>30)
{
interval-=30;
int i=10;
fee+=((int)(interval+1-1)/i)*Query4->FieldByName("SecPrc")->AsFloat;
}
}
//一次性附加费(非比例部分)
fee+=Query4->FieldByName("Addi")->AsFloat;
//一次性附加费(比例部分)
fee+=fee*Query4->FieldByName("AddiPerc")->AsFloat;
//填充累计表
AnsiString CallNo=CallTicket.SubString(59,6).Trim();
FillUserTab(CallNo,Query4->FieldByName("Variety")->AsString,fee);
//填充详细话单
Table1->Append();
Table1->FieldByName("variety")->AsString=Query4->FieldByName("Kind")->AsString;
Table1->FieldByName("fee")->AsFloat=fee;
Table1->FieldByName("Dt")->AsDateTime=DT;
Table1->FieldByName("Tm")->AsDateTime=DT;
Table1->FieldByName("thsc")->AsString=CallTicket.SubString(13,4);
Table1->FieldByName("bjhm")->AsString=No2p;
Table1->FieldByName("zjhm")->AsString=CallNo;
Table1->Post();
}
bool __fastcall TModuleRecord::StringToDateTime(AnsiString DataTimeP, TDateTime * DateTime)
{
unsigned short year,month;
Now().DecodeDate(&year,&month,&month);
AnsiString str=IntToStr(year).SubString(3,2)+"-"+
DataTimeP.SubString(1,2)+"-"+
DataTimeP.SubString(3,2)+" "+
DataTimeP.SubString(5,2)+":"+
DataTimeP.SubString(7,2)+":00";
try
{
*DateTime=StrToDateTime(str);
}
catch(Exception &ce)
{
return false;
}
return true;
}
void __fastcall TModuleRecord::ErrorRecord(AnsiString ErrorKind, AnsiString CallTicket)
{
AnsiString FileName=GetCurrentDir()+AnsiString("\\Data\\JFError.log");
TFileStream * FileStream=new TFileStream(FileName,fmOpenWrite);
AnsiString s=Now();
s+=" 错误类型:"+ErrorKind;
s+="\r\n";
CallTicket+="\r\n";
FileStream->Seek(0,soFromEnd);
FileStream->Write(s.c_str(),s.Length());
FileStream->Write(CallTicket.c_str(),CallTicket.Length());
delete FileStream;
}
//填充用户累计表
bool __fastcall TModuleRecord::FillUserTab(AnsiString CallNo,AnsiString kind, float fee)
{
int i=Table3->RecNo;
AnsiString haoma=Table3->FieldByName("Num")->AsString;
DataSource3->Enabled=false;
//该表以电话号码升序排序,首项为总计,Num字段设置保证为首项
Table3->First();
//查用户是否存在
while (!Table3->Eof)
{
if(Table3->FieldByName("Num")->AsString==CallNo)
{
Table3->Edit();
break;
}
Table3->Next();
}
if(Table3->Eof)//未找到,追加新记录
{
Table3->Append();
Table3->FieldByName("Num")->AsString=CallNo;
}
if(kind=="国际长途")
{
//用户记录修改
Table3->FieldByName("Gjc")->AsInteger++;
Table3->FieldByName("Gjf")->AsFloat+=fee;
Table3->FieldByName("Zj")->AsFloat+=fee;
Table3->FieldByName("Jy")->AsFloat-=fee;
Table3->Post();
//总计项修改
Table3->First();
Table3->Edit();
Table3->FieldByName("Gjc")->AsInteger++;
Table3->FieldByName("Gjf")->AsFloat+=fee;
Table3->FieldByName("Zj")->AsFloat+=fee;
Table3->FieldByName("Jy")->AsFloat-=fee;
Table3->Post();
}
else if(kind=="国内长途")
{
//用户记录修改
Table3->FieldByName("Gnc")->AsInteger++;
Table3->FieldByName("Gnf")->AsFloat+=fee;
Table3->FieldByName("Zj")->AsFloat+=fee;
Table3->FieldByName("Jy")->AsFloat-=fee;
Table3->Post();
//总计项修改
Table3->First();
Table3->Edit();
Table3->FieldByName("Gnc")->AsInteger++;
Table3->FieldByName("Gnf")->AsFloat+=fee;
Table3->FieldByName("Zj")->AsFloat+=fee;
Table3->FieldByName("Jy")->AsFloat-=fee;
Table3->Post();
}
else
{
//用户记录修改,市话、信息情况
Table3->FieldByName("Shc")->AsInteger++;
Table3->FieldByName("Shf")->AsFloat+=fee;
Table3->FieldByName("Zj")->AsFloat+=fee;
Table3->FieldByName("Jy")->AsFloat-=fee;
Table3->Post();
//总计项修改
Table3->First();
Table3->Edit();
Table3->FieldByName("Shc")->AsInteger++;
Table3->FieldByName("Shf")->AsFloat+=fee;
Table3->FieldByName("Zj")->AsFloat+=fee;
Table3->FieldByName("Jy")->AsFloat-=fee;
Table3->Post();
}
DataSource3->Enabled=true;
Table3->First();
Table3->MoveBy(i-1);
if(Table3->FieldByName("Num")->AsString!=haoma)
Table3->Next();
return true;
}
void __fastcall TModuleRecord::LocateUser(AnsiString nmornm)
{
int i=0;
DataSource3->Enabled=false;
Table3->First();
//查用户是否存在
while (!Table3->Eof)
{
if(Table3->FieldByName("Num")->AsString.AnsiPos(nmornm)==1||
Table3->FieldByName("Name")->AsString.AnsiPos(nmornm)!=0)
{
i=Table3->RecNo;
break;
}
Table3->Next();
}
DataSource3->Enabled=true;
Table3->First();
if (i!=0)
Table3->MoveBy(i-1);
}
void __fastcall TModuleRecord::DataSource2StateChange(TObject *Sender)
{
FormMain->Button13->Enabled = (DataSource2->State == dsEdit || DataSource2->State == dsInsert);
FormMain->Button14->Enabled = FormMain->Button13->Enabled;
}
//---------------------------------------------------------------------------
void __fastcall TModuleRecord::DataSource2DataChange(TObject *Sender,
TField *Field)
{
FormMain->Button11->Enabled=Table2->RecordCount;
}
//---------------------------------------------------------------------------
void __fastcall TModuleRecord::DataSource3DataChange(TObject *Sender,
TField *Field)
{
FormMain->Button16->Enabled=Table3->RecordCount;
}
//---------------------------------------------------------------------------
void __fastcall TModuleRecord::DataSource3StateChange(TObject *Sender)
{
FormMain->Button7->Enabled = (DataSource3->State == dsEdit || DataSource3->State == dsInsert);
FormMain->Button17->Enabled = FormMain->Button7->Enabled;
}
//---------------------------------------------------------------------------
void __fastcall TModuleRecord::Table3AfterScroll(TDataSet *DataSet)
{
FormMain->GetClass(ModuleRecord->Table3->FieldByName("ClsA")->AsInteger);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -