📄 dataproc.cpp
字号:
#include <vcl.h>
#include "DataProc.h"
#include "bdbf.h"
#include "dido.h"
#include "servermodule.h"
#include "param.h"
#include "datetool.h"
#include "option.h"
#include "CBuilder.h"
#include "dynamic.h"
#include "source.h"
#include "Capture.h"
#include "status.h"
//默认处理数据过程
static int DefaultDataProc(void *pIORec);
//处理车到数据
static int IODataComeProc(IODATA *t);
//处理车走数据
static int IODataGoneProc(IODATA *t);
//处理刷卡数据
static int IODataCardProc(IODATA *t);
//生成入场记录
static int CreateOneParkin(PARKREC *pParkin,IODATA *pIORec,
CARDDATA *pCard,USERDATA *pUser);
//生成停车记录
static int CreateOneParkrec(PARKREC *pParkrec,IODATA *pIORec,
CARDDATA *pCard,USERDATA *pUser);
//入场数据处理
static int InCardDataProc(IODATA *pIORec,CARDDATA *pCard);
//外出数据处理
static int OutCardDataProc(IODATA *pIORec,CARDDATA *pCard);
//计算停车时间和收费
static int GetParkTime(PARKREC *pParkrec);
//计算停车收费(nPaidDate=上次付款日期)
static float GetParkPrice(PARKREC *pParkrec,DWORD nPaidDate);
//用户付款
static int UserPayMoney(USERDATA *pUser,float fPrice,int nNowDate);
//增加进入数
static int IncParkinNum(int n);
//增加外出数
static int IncParkoutNum(int n);
static IODATAPROC DoDataProc=NULL;
//设置刷卡记录处理过程
void *SetIODataProc(IODATAPROC pProc)
{
void *pCur;
pCur = DoDataProc;
DoDataProc=(IODATAPROC)pProc;
return(pCur);
}
//处理IOData数据
int IODataProc(void *pIORec)
{
int rc;
if(pIORec==NULL)return(FALSE);
rc=FALSE;
if(DoDataProc!=NULL){//先经其它方式处理数据
rc=DoDataProc(pIORec);
if(rc)//已经处理,则答复
SendCommandToSource(((IODATA *)pIORec)->pCR,rc,NULL);
}
if(rc==FALSE)//数据未经处理,则用默认方式
rc=DefaultDataProc(pIORec);
return(rc);
}
//默认处理数据过程
int DefaultDataProc(void *pIORec)
{
IODATA *t;
int nDataType,rc;
t = (IODATA *)pIORec;
nDataType = t->nDataType;
if(t->pRoad==NULL)rc=PARK_WARNON; //无车道数据,则丢弃
else if(nDataType==IODATA_CARDDATA) //刷卡资料
rc=IODataCardProc(t);
else if(nDataType==IODATA_CARCOME)//车到
rc=IODataComeProc(t);
else if(nDataType==IODATA_CARGONE)//车走
rc=IODataGoneProc(t);
else rc=0;
return(rc);
}
//处理车到数据
int IODataComeProc(IODATA *t)
{
int rc;
ROADWAY *pRoad;
pRoad = (ROADWAY *)t->pRoad;
SetRoadHaveCarFlag(pRoad,TRUE);
/* 准备摄像 */
CaptureRoadPhoto(pRoad);//捕捉车道的图象
SendCommandToSource(t->pCR,PARK_WARNOFF,(long)pRoad);//解除警报
return(rc);
}
//处理车走数据
int IODataGoneProc(IODATA *t)
{
ROADWAY *pRoad;
int rc;
rc=0;
pRoad = (ROADWAY *)t->pRoad;
if(GetRoadHaveDataFlag(pRoad)==FALSE)//未刷卡或无卡
rc=PARK_INVALIDCARD;
if(rc!=0){
SendCommandToSource(t->pCR,PARK_WARNON,(long)pRoad);//警报
SendCommandToSource(t->pCR,rc,NULL);//发送答复
}
//清除标志
SetRoadHaveDataFlag(pRoad,FALSE);
SetRoadHaveCarFlag(pRoad,FALSE);
DeleteBlobData(pRoad->pPhoto);//释放BLOB缓冲区
pRoad->pPhoto=NULL;
return(rc);
}
//处理刷卡数据
int IODataCardProc(IODATA *t)
{
CARDDATA CardRec;
int rc,nRoadType;
rc=0;
SaveOneIOData(t);
rc=ReadCardRecordWithNo(&CardRec,t->nCardNo,t->nCardID);
if(rc==FALSE)//无效卡片
rc=PARK_INVALIDCARD;
if(GetCardPauseFlag(&CardRec))//此卡挂失
rc = PARK_CARDLOSS;
else if(!GetCardEffectiveFlag(&CardRec))//此卡未生效
rc = PARK_INVALIDCARD;
else if(GetCardExpireFlag(&CardRec))//此卡过期
rc = PARK_OVERDATE;
else rc = PARK_WAITING;
if(rc!=PARK_WAITING){
SendCommandToSource(t->pCR,PARK_WARNON,(long)t->pRoad);//警报
SendCommandToSource(t->pCR,rc,NULL);
}
else{
nRoadType = ((ROADWAY *)t->pRoad)->nType;
if(nRoadType==ROADTYPE_IN) //进入
rc = InCardDataProc(t,&CardRec);
else if(nRoadType==ROADTYPE_OUT)//外出
rc = OutCardDataProc(t,&CardRec);
}
return(rc);
}
//入场数据处理
int InCardDataProc(IODATA *pIORec,CARDDATA *pCard)
{
PARKREC Parkin;
PARKREC Parkrec;
USERDATA UserRec;
int rc;
rc=ReadParkinRecordWithCardNo(&Parkin,pCard->nCardNo,FALSE);
if(rc) rc=PARK_HAVEPARKIN;//此卡已在场
else{ //根据持卡者编号读取用户资料
ReadUserRecordWithHolderNo(&UserRec,pCard->nHolderNo);
CreateOneParkin(&Parkin,pIORec,pCard,&UserRec);
SaveOneParkin(&Parkin);
rc=PARK_VALIDCARD;
}
DeleteBlobData(Parkin.pInPhoto);//删除图片数据
if(rc!=PARK_VALIDCARD)
SendCommandToSource(pIORec->pCR,PARK_WARNON,(long)pIORec->pRoad);//警报
SendCommandToSource(pIORec->pCR,rc,NULL);
return(rc);
}
//外出数据处理
int OutCardDataProc(IODATA *pIORec,CARDDATA *pCard)
{
PARKREC Parkrec;
USERDATA UserRec;
int rc,nManual;
//读取入场记录并删除之
rc=ReadParkinRecordWithCardNo(&Parkrec,pCard->nCardNo,TRUE);
if(rc==FALSE){
SendCommandToSource(pIORec->pCR,PARK_WARNON,(long)pIORec->pRoad);//警报
rc = PARK_NOPARKIN; //此卡未入场
}
else{
ReadUserRecordWithHolderNo(&UserRec,pCard->nHolderNo);
CreateOneParkrec(&Parkrec,pIORec,pCard,&UserRec);
GetParkTime(&Parkrec); //计算停车时间
GetParkPrice(&Parkrec,UserRec.nPaidDate); //计算停车收费
//用户付款
rc=UserPayMoney(&UserRec,Parkrec.fParkPrice,Parkrec.nOutDate);
nManual = ((ROADWAY*)pIORec->pRoad)->nPhotoDeal; //人工比对图像
if(rc){//已付款
if(nManual==ROADPHOTO_MANUAL)rc=PARK_WAITING;//人工比对图像
else rc=PARK_VALIDCARD;
}
else rc=PARK_NOTPAID;//未付款
if(rc==PARK_VALIDCARD)//有效卡
SaveOneParkrec(&Parkrec);
else SaveParkrecToManaul(&Parkrec);//保存停车记录到链表中等候人工比对
DeleteBlobData(Parkrec.pInPhoto);
DeleteBlobData(Parkrec.pOutPhoto);
}
SendCommandToSource(pIORec->pCR,rc,NULL);
return(rc);
}
//生成入场记录
int CreateOneParkin(PARKREC *pParkin,IODATA *pIORec,
CARDDATA *pCard,USERDATA *pUser)
{
int rc;
ROADWAY *pRoad;
ZeroMemory(pParkin,sizeof(PARKREC));
if(pUser->nHolderNo!=0){ //存在该用户
pParkin->nHolderNo = pUser->nHolderNo; //持卡者编号
lstrcpyn(pParkin->szUserName,pUser->szUserName,sizeof(pParkin->szUserName));//车主名
lstrcpyn(pParkin->szCarTag,pUser->szCarTag,sizeof(pParkin->szCarTag)); //车牌
lstrcpyn(pParkin->szCarType,pUser->szCarType,sizeof(pParkin->szCarType)); //车型
lstrcpyn(pParkin->szCarColor,pUser->szCarColor,sizeof(pParkin->szCarColor));//车身颜色
pParkin->nUserType=pUser->nUserType; //用户类型
}
pParkin->nCardNo = pCard->nCardNo; //卡号
pParkin->nInTime=pIORec->nTime; //进入时间
pParkin->nInDate=pIORec->nDate; //进入日期
pParkin->nInRoadNo=pIORec->nRoadNo; //进入车道
pRoad = (ROADWAY *)pIORec->pRoad;
if(pRoad!=NULL){
pParkin->pInPhoto=pRoad->pPhoto;
pRoad->pPhoto=NULL;
}
return(TRUE);
}
//生成停车记录
int CreateOneParkrec(PARKREC *pParkrec,IODATA *pIORec,
CARDDATA *pCard,USERDATA *pUser)
{
int rc;
int nDate,nTime;
ROADWAY *pRoad;
ZeroMemory(pParkrec,sizeof(PARKREC));
if(pUser->nHolderNo!=0){ //存在该用户
pParkrec->nHolderNo = pUser->nHolderNo; //持卡者编号
lstrcpyn(pParkrec->szUserName,pUser->szUserName,sizeof(pParkrec->szUserName));//车主名
lstrcpyn(pParkrec->szCarTag,pUser->szCarTag,sizeof(pParkrec->szCarTag)); //车牌
lstrcpyn(pParkrec->szCarType,pUser->szCarType,sizeof(pParkrec->szCarType)); //车型
lstrcpyn(pParkrec->szCarColor,pUser->szCarColor,sizeof(pParkrec->szCarColor));//车身颜色
pParkrec->nUserType=pUser->nUserType; //用户类型
}
pParkrec->nCardNo=pCard->nCardNo; //卡号
pParkrec->nOutTime=pIORec->nTime;
pParkrec->nOutDate=pIORec->nDate;
pParkrec->nOutRoadNo=pIORec->nRoadNo;
pRoad = (ROADWAY *)pIORec->pRoad;
if(pRoad!=NULL){ //外出图象(包括图象大小)
pParkrec->pOutPhoto=pRoad->pPhoto;
pRoad->pPhoto=NULL;
}
return(TRUE);
}
//计算停车时间和收费
int GetParkTime(PARKREC *pParkrec)
{
int nTime,nDate;
//计算时间差值(s)
nTime = GetTimeDiff(pParkrec->nOutTime,pParkrec->nInTime);
nTime /= 60; //折算成分钟
if(pParkrec->nOutDate>pParkrec->nInDate)//计算日期差(天)
nDate = GetDateDiff(pParkrec->nOutDate,pParkrec->nInDate);
else nDate=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -