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

📄 cj97.cpp

📁 电信语音系统源码
💻 CPP
字号:
//----------------------------------------------------------------------------
// 语音系统 - (C) Copyright 1997, 1997 by SCGT
//   Yy\Cj.cpp
//   源程序
//----------------------------------------------------------------------------
#include <owl\owlpch.h>

#include "Util.h"   // 工具
#include "Dbase.h"  // 数据库
#include "Oracle.h"

#include "Tele.h"
#include "Yy97.h"

enum
{
   cjDialing,
   cjPlaySentence,
   cjStartWait,
   cjWaiting,
   cjSeekNext,
};

enum
{
   tpPrivate = 0,
   tpPublic,
   tpNull,
};

const int MaxCjTimes = 5, CjPauseTime = 15;
static char sCjQfSQL[] = "select * from VCjQf";
static char sCjSySQL[] = "select * from VCjSy";
static char sCjCxQfSQL[] = "select * from VCjQf where Hm=:sHm"; //
static char sCjCxSySQL[] = "select * from VCjSy where Hm=:sHm"; //
//static DBase *dbfCjLog;
static TTable* tblCj;
static TParam CxParam;  //
static TTable* tblCjCx; //
static WORD wStatus, wCount, wLoopCount, wCjOk, nLastDay;
/*
// CJLOG.DBF
static char
   FDCJLOG_TEL[]   = "TEL",
   FDCJLOG_DATE[]  = "DATE",
   FDCJLOG_TIME[]  = "TIME",
   FDCJLOG_TIMES[] = "TIMES";
*/
static char* szCj[] =
{
     //0         1         2
     //012345678901234567890
/*00*/"  已循环99999次",
/*01*/"──────────",
/*02*/"欠费用户99999个",
/*03*/"  已催缴99999个",
/*04*/"    还剩99999个",
/*05*/"──────────",
/*06*/"当前催缴用户",
/*07*/"──────────",
/*08*/"电话号码:1234567    ",
/*09*/"  合同号:123456     ",
/*10*/"用户类别:单位       ",
/*11*/"  共欠费:123456.12元",
      NULL
};

static void RefreshCj()
{
   struct dosdate_t d;
   _dos_getdate(&d);
   BOOL bCjSy = (d.day >= config.nCjDay1 && d.day <= config.nCjDay2);
   char* sCjSQL = bCjSy ? sCjSySQL : sCjQfSQL;
   tblCj->Refresh(sCjSQL);
   wCount = (WORD)tblCj->GetRecCount(bCjSy ? "VCjSy" : "VCjQf");
   char* sCjCxSQL = bCjSy ? sCjCxSySQL : sCjCxQfSQL;  //
   tblCjCx->SetSQL(sCjCxSQL);                         //
   wLoopCount ++;
}

void ResetCj()
{
   /*MsgBox( "正在初始化..." );
   for( dbfCjLog->GoTop(); !dbfCjLog->IsEof(); dbfCjLog->Skip() )
      dbfCjLog->Replace( FDCJLOG_TIMES, 0 );
   dbfCjLog->Save();
   DelMsgBox();
   */
   RefreshCj();
   wCjOk = 0;
   wLoopCount = 0;
   wStatus = cjStartWait;
}

static int TimeCmp( struct time& curTime, int nHour, int nMinute )
{
   if( curTime.ti_hour < nHour) return -1;
   else if( curTime.ti_hour == nHour )
   {
      if( curTime.ti_min < nMinute ) return -1;
      else if( curTime.ti_min == nMinute ) return 0;
      else return 1;
   }
   else return 1;
}

static BOOL IsCjFree(char* sTel)
{
   CxParam.SetValue(sTel);  //
   tblCjCx->Refresh();       //
   if(dbfCjFree->Seek(sTel) || tblCjCx->IsEof()) //
   {
      //dbfCjLog->Replace(FDCJLOG_TIMES, MaxCjTimes);
      wCjOk ++;
      return TRUE;
   }
   else return FALSE;
}

static int HzCmp( const void *p1, const void *p2 )
{
   return memcmp( p1, p2, 2 );
}

static int GetUserType()
{
   static char szFirstNameTable[] =
     "安白包毕博卜财菜蔡残曹常长陈程储从崔戴代淡邓丁董杜段范方冯扶"
     "付甘高龚公苟辜古谷官郭桂国韩郝何贺侯胡黄吉简姜江蒋焦金晋康考柯赖"
     "兰雷冷黎李梁粱寥廖林凌刘柳龙隆卢鲁路陆吕罗马毛倪聂宁欧潘彭蒲"
     "普齐秦卿邱冉饶任邵申沈施石史舒宋苏孙谭汤唐陶田童涂万汪王韦未"
     "魏温文翁巫吴伍夏乡项向肖谢幸熊徐许薛严颜杨阳姚药叶易殷阴尹应"
     "尤游于虞余俞喻袁岳云曾詹章张赵郑钟周朱祝卓邹左佘胥嬴濮缪晏滕";
   char sName[41];
   tblCj->GetStr("Yhm", sName, sizeof(sName));
   RightTrim(sName);
   int nLen = strlen(sName);
   if(nLen > 6) return tpPublic;
   else if(nLen < 2) return tpPrivate;
   else if(bsearch(sName, szFirstNameTable, 182, 2, HzCmp)) return tpPrivate;
   else return tpPublic;
}

static void FillCjTable()
{
   FormatNumber( wLoopCount, szCj[ 0 ] + 8, 5 ); //
   FormatNumber( wCount, szCj[ 2 ] + 8, 5 ); //
   FormatNumber( wCjOk, szCj[ 3 ] + 8, 5 ); //
   FormatNumber( wCount - wCjOk, szCj[ 4 ] + 8, 5 ); //
}

static BOOL CjHook( MMsg& msg )
{
   static char szTypeName[ 2 ][ 5 ] = { "个人", "单位" };
   static char sMoney[ 10 ], nCjTimes;
   if( msg.lParam != config.nChCj ) return TRUE;

   extern BOOL bCjPause;  // Defined in Yy.cpp
   if( bCjPause )
   {
      ShowCjStatus( "暂停..." );
      HangUp( config.nChCj );
      wStatus = cjStartWait;
      return FALSE;
   }

   switch( msg.uMsg )
   {
      case WM_NULL:

        static DWORD dwTime;
        switch( wStatus )
        {
           case cjStartWait:

             HangUp( config.nChCj );
             ShowCjStatus( "等待1秒钟..." );
             dwTime = GetDosTime();
             wStatus = cjWaiting;
             break;

           case cjWaiting:

             static int nCjType;
             if( GetDosTime() - dwTime >= CjPauseTime )
             {
                struct dosdate_t curDate;
                _dos_getdate( &curDate );
                if( curDate.dayofweek != nLastDay )
                {
                   nLastDay = curDate.dayofweek;
                   if(wCjOk >= wCount) ResetCj();
                }
                struct time curTime;
                gettime( &curTime );
                if( ( curDate.dayofweek == 6 || // Sat.
                      curDate.dayofweek == 0    // Sun.
                    ) &&
                    ( ( TimeCmp( curTime, config.nCTSHour1, config.nCTSMin1 ) >= 0 &&
                        TimeCmp( curTime, config.nCTSHour2, config.nCTSMin2 ) <= 0
                      ) ||
                      ( TimeCmp( curTime, config.nCTSHour3, config.nCTSMin3 ) >= 0 &&
                        TimeCmp( curTime, config.nCTSHour4, config.nCTSMin4 ) <= 0
                      ) // 7:00 - 23:00
                    )
                  ) nCjType = tpPrivate;
                else if( ( TimeCmp( curTime, config.nCTGHour1, config.nCTGMin1 ) >= 0 &&
                           TimeCmp( curTime, config.nCTGHour2, config.nCTGMin2 ) <= 0 ) || // 7:00 - 8:00
                         ( TimeCmp( curTime, config.nCTGHour3, config.nCTGMin3 ) >= 0 &&
                           TimeCmp( curTime, config.nCTGHour4, config.nCTGMin4 ) <= 0 ) // 18:00 - 23:00
                       ) nCjType = tpPrivate;
                else if( ( TimeCmp( curTime, config.nCTDHour1, config.nCTDMin1 ) >= 0 &&
                           TimeCmp( curTime, config.nCTDHour2, config.nCTDMin2 ) <= 0 ) || // 8:00 - 12:00
                         ( TimeCmp( curTime, config.nCTDHour3, config.nCTDMin3 ) >= 0 &&
                           TimeCmp( curTime, config.nCTDHour4, config.nCTDMin4 ) <= 0 ) // 14:00 - 18:00
                       ) nCjType = tpPublic;
                else nCjType = tpNull;

                char* p[] = {szCj[0], szCj[1], szCj[2], szCj[3], szCj[4], szCj[5], NULL, szCj[7], NULL };
                if( nCjType != tpNull )
                {
                   static char szMsg[] = "搜索个人用户";
                   memcpy( szMsg + 4, szTypeName[ nCjType ], 4 );
                   p[ 6 ] = szMsg;
                   if(wCjOk >= wCount) wStatus = cjStartWait;
                   else wStatus = cjSeekNext;
                }
                else
                {
                   p[ 6 ] = "休息时间";
                   wStatus = cjStartWait;
                }
                FillCjTable();
                ShowCjTable( p );
             }
             break;

           case cjSeekNext:

             static char sTel[ flTel + 1 ];
             strcpy(sTel, tblCj->GetStr("Hm"));
             /*if(dbfCjLog->Seek(sTel))
                nCjTimes = dbfCjLog->GetInt(FDCJLOG_TIMES);
             else
             {
                dbfCjLog->AppendStart();
                dbfCjLog->Replace(FDCJLOG_TEL, sTel);
                dbfCjLog->Replace(FDCJLOG_TIMES, 0);
                dbfCjLog->Append();
                nCjTimes = 0;
             }*/
             nCjTimes = 0;

             if(nCjTimes < MaxCjTimes && GetUserType() == nCjType && !IsCjFree(sTel))
             {
                FillCjTable();
                memset(szCj[ 8 ] + 9, ' ', flTel);  //Clear
                memcpy(szCj[ 8 ] + 9, sTel, strlen(sTel));
                memcpy(szCj[ 9 ] + 9, tblCj->GetStr("Zh"), config.nCNoLen); //
                memcpy( szCj[ 10 ] + 9, szTypeName[ nCjType ], 4 );
                FormatMoney(tblCj->GetDouble("Zj"), sMoney);
                sMoney[9] = 0;
                memcpy(szCj[ 11 ] + 9, sMoney, 9);
                ShowCjTable( szCj );

                char str[ 15 ];
                //sprintf( str, "拨号: %s", sTel );
                sprintf( str, "拨:%s", sTel );
                ShowCjStatus( str );
                Dialing( config.nChCj, sTel );
                wStatus = cjDialing;
             }
             else wStatus = cjStartWait;
             tblCj->Next();
             if(tblCj->IsEof()) RefreshCj();
             break;
        }
        return FALSE;

      case WM_MESSAGE:

        switch( msg.wParam )
        {
           case tmDialingOK:

             ShowCjStatus( "您已欠费..." );
             PlaySentence( config.nChCj, "CJ1.VOC", sMoney, "CJ2.VOC", NULL );
             wStatus = cjPlaySentence;
             return FALSE;

           case tmPlaySentenceOK:

             //dbfCjLog->Replace(FDCJLOG_DATE, GetDate());
             //char sTime[9]; GetTime(sTime);
             //dbfCjLog->Replace(FDCJLOG_TIME, sTime);
             //dbfCjLog->Replace(FDCJLOG_TIMES, MaxCjTimes);
             wCjOk ++;
             wStatus = cjStartWait;
             return FALSE;

           case tmDialingError:
           case tmPlaySentenceError:

             //dbfCjLog->Replace(FDCJLOG_TIMES, nCjTimes + 1);
             //if(nCjTimes + 1 == MaxCjTimes)
               wCjOk ++;
             wStatus = cjStartWait;
             return FALSE;

           default:

             return TRUE;
        }
   }
   return TRUE;
}

void InitCj()
{
   //dbfCjLog = new DBase("CjLog.dbf", FDCJLOG_TEL);
   tblCj = new TTable(sCjQfSQL);
   CxParam = TTable::AddParam("sHm");  //
   tblCjCx = new TTable(sCjCxQfSQL);   //
   ResetCj();

   struct dosdate_t d;
   _dos_getdate( &d );
   nLastDay = d.dayofweek;
   SetTeleHook( config.nChCj, CjHook );
}

void CloseCj()
{
   ResetTeleHook( config.nChCj );
   delete tblCj;
   //delete dbfCjLog;
}

⌨️ 快捷键说明

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