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

📄 dataproc.cpp

📁 停车场用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -