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

📄 dosj1.cpp

📁 DOS下一个完整的大型程序源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      dbfSJ->GetField( lSjRec, fdTel, szTel );
      lQfRec[ i ] = dbfQf->Search( szTel, fdQfTel );
      uTotQfRec[ i ] = 0;
      double dAChg = 0.0,
             dQf   = 0.0;
      long lRec = lQfRec[ i ];
      if( lRec >= 0 )
      {
         int nQfMon = 0;
         while( lRec < dbfQf->GetRecordNum() )
         {
            dbfQf->GetField( lRec, fdQfDate, szQfMon[ nQfMon ] );
            int nDay = ElapsedDay( szQfMon[ nQfMon ] );

            double dQfRChg = dbfQf->GetDouble( lRec, fdQfRChg );
            dQfMon[ nQfMon ] += dQfRChg;

            double dTmp = ( double )nDay * dQfRChg * config.fAChgRate;
            dAChg += dTmp;
            dQf   += dQfRChg;

            uTotQfRec[ i ] ++;
            lRec ++;
            nQfMon ++;
            if( nQfMon == maxQfMon ) Error( "对不起,该用户早该停机了" );

            dbfQf->GetField( lRec, fdQfTel, str );
            if( memcmp( szTel, str, flQfTel ) != 0 ) break;
         }
      }
      dbfSJ->GetField( lSjRec, fdOk, str );
      if( *str == 'T' ) dAChg = dbfSJ->GetDouble( lSjRec, fdAChg );

      dTotAChg += dAChg;
      dTotQf   += dQf;

      double dRChg = dbfSJ->GetDouble( lSjRec, fdRChg );
      dTheRChg += dRChg;

      dRChg += dAChg;
      dTotRChg += dRChg;

      dRChg += dQf;
      dTotChg += dRChg;

      if( *str == 'F' )
      {
         dbfSJ->Replace( lSjRec, fdAChg, dAChg );   // AChg
         dbfSJ->Replace( lSjRec, fdTotChg, dRChg ); // TotChg
      }
   }

   FormatMoney( dTotChg, str, flRChg );
   DxMoney( str, szSj[ 4 ] + 14 );             // DxMoney

   LeftTrim( str );
   memcpy( szSj[ 4 ] + 62, str, flRChg );     // TotChg

   for( i = 0; i < maxChg; i ++ )
     FormatMoney( dChg[ i ], szSj[ map[ i ].nRow ] + map[ i ].nCol, flChg );
   FormatMoney( dTotAChg, szSj[ 20 ] + AChgCol, flChg ); // AChg

   int nLine = 8;
   for( i = 0; i < maxQfMon; i ++, nLine += 2 )
   {
      if( szQfMon[ i ][ 0 ] == 0 ) break;

      memcpy( szSj[ nLine ] + 54, szQfMon[ i ], 2 );
      memcpy( szSj[ nLine ] + 56, "年", 2 );
      memcpy( szSj[ nLine ] + 58, szQfMon[ i ] + 3, 2 );
      if( szSj[ nLine ][ 58 ] == '0' ) szSj[ nLine ][ 58 ] = ' ';
      memcpy( szSj[ nLine ] + 60, "月", 2 );

      FormatMoney( dQfMon[ i ], szSj[ nLine ] + 64, flRChg ); // QfRChg
   }
   for( ; nLine <= 18; nLine += 2 )
   {
      memset( szSj[ nLine ] + 54, ' ', 8 );
      memset( szSj[ nLine ] + 64, ' ', flRChg );
   }
   FormatMoney( dTotQf, szSj[ 20 ] + 64, flRChg ); // TotQf

   memcpy( szSj[ 22 ] + 44, szDutyNum, flDuty );  // DutyNum
   GetTime( szSj[ 22 ] + 67 );  // Time

   ShowBill( FALSE );
}

int SJ::CheckNumber( char *szNumber )
{
   char *p = szNumber;
   int nLen = 0;
   while( *p ++ != ' ' ) nLen ++;

   for( int i = 0; i < nLen; i ++, szNumber ++ )
   {
      if( *szNumber < '0' || *szNumber > '9' ) return 0;
   }
   return nLen;
}

int FieldLen( char *str, int nMaxLen )
{
   int nLen = 0;
   while( *str != ' ' && nLen < nMaxLen )
   {
      str ++;
      nLen ++;
   }
   return nLen;
}

static char *szHelp[] =
{
   "■输入正确的电话号码或合同号后按Enter,",
   "  系统会显示话费收据及该用户是否已交费",
   "■电话号码为 0 位数, 合同号为   位数  ",
   "■现在光标位于<现收到>栏, 输入正确的现",
   "  收到金额后按Enter,系统会显示应找金额",
   "■现在可以收讫, 找完钱后按Enter,打印机",
   "  立即打印出收据, 收讫成功            ",
   "■现在光标回到<电话号码或合同号>栏, 可",
   "  以收下一个                          ",
   NULL
};

void ShowSJStatus()
{
   ::ShowStatus( "~CF1~0帮助 ~CF2~0交班 ~CF4~0补打收据 ~CESC~0退出 ~CF3~0->" );
}

char *szTelIdx = NULL;
void SJ::LoadIndex( BOOL bMakeIndex )
{
   unsigned uCount  = dbfSJ->GetRecordNum(),
            uIdxLen = uCount * 5;
   if( szTelIdx != NULL ) delete szTelIdx;
   FILE *fpTelIdx = fopen( fnTelIdx, "rb" );
   if( fpTelIdx == NULL || bMakeIndex )
   {
      MakeIndex();
      fpTelIdx = fopen( fnTelIdx, "rb" );
   }
   szTelIdx = new char[ uIdxLen ];
   fread( szTelIdx, uIdxLen, 1, fpTelIdx );
   fclose( fpTelIdx );
}

void SJ::CloseIndex()
{
   delete szTelIdx;
   szTelIdx = NULL;
}

unsigned SJ::SearchTel( char *szTel )
{
   long lTel = atol( szTel );
   extern int LCmp( const void *p1, const void *p2 );
   unsigned uCount = dbfSJ->GetRecordNum();
   char *p = ( char * )bsearch( &lTel, szTelIdx, uCount, 5, LCmp );
   if( p != NULL ) return *( ( unsigned * )( p  + 3 ) );
   else return 0xffff;
}

BOOL SJ::DoSJ()
{
   if( !CheckIn() ) return FALSE;

   Window *winDoSJ = new Window( winTop, winWidth, winHeight, NULL, tpNoSave );
   ShowBill( TRUE );

   winDoSJ->DrawTytle( ttTelLeft, ttTelTop, "电话号码或合同号", 0 );
   const flNumber = 16;
   static char szNumber[ flNumber + 1 ];
   memset( szNumber, ' ', flNumber );
   szNumber[ flNumber ] = 0;
   Field *fdNumber = new Field( fdTelLeft, fdTelTop, fdTelWidth, szNumber, flNumber );

   const flOk = 6;
   char szOk[ flOk + 1 ];
   memset( szOk, ' ', flOk );
   szOk[ flOk ] = 0;
   Field *fdOkFlag = new Field( fdOkLeft, fdOkTop, fdOkWidth, szOk, flOk );

   winDoSJ->DrawTytle( ttInputLeft, ttInputTop, "现收到", 0 );
   char szInput[ flRChg + 1 ];
   memset( szInput, ' ', flRChg );
   szInput[ flRChg ] = 0;
   Field *fdInput = new Field( fdInputLeft, fdInputTop, fdInputWidth, szInput, flRChg );
   winDoSJ->DrawTytle( fdInputLeft + fdInputWidth + 2, fdInputTop + 4, "元", 0 );

   winDoSJ->DrawTytle( ttOutputLeft, ttOutputTop, "应找出", 0 );
   char szOutput[ flRChg + 1 ];
   memset( szOutput, ' ', flRChg );
   szOutput[ flRChg ] = 0;
   Field *fdOutput = new Field( fdOutputLeft, fdOutputTop, fdOutputWidth, szOutput, flRChg );
   winDoSJ->DrawTytle( fdOutputLeft + fdOutputWidth + 2, fdOutputTop + 4, "元", 0 );

   const WORD cmDoSJ = 0x9999;
   Button *btnOk = new Button( btnOkLeft, btnOkTop, "", cmDoSJ, btnOkWidth, btnOkHeight );
   HideCursor();
   extern char okIcon[];
   putimage( btnOkLeft + btnOkWidth / 2 - 28, btnOkTop + btnOkHeight / 2 - 11, okIcon, 0 );
   setcolor( 0, 7 );
   outtextxy( btnOkLeft + btnOkWidth / 2 - 2, btnOkTop + btnOkHeight / 2 - 7, "收讫" );
   ShowCursor();

   winDoSJ->Insert( fdNumber, fdInput, btnOk, NULL );

   unsigned uRecNum = dbfSJ->GetRecordNum();
   char str[ flNumber ];
   dbfSJ->GetField( uRecNum / 2, fdTel, str );
   nTelLen = FieldLen( str, flTel );
   szHelp[ 2 ][ 13 ] = '0' + nTelLen;
   dbfSJ->GetField( uRecNum / 2, fdCNo, str );
   nCNoLen = FieldLen( str, flCNo );
   if( nCNoLen == 0 ) nCNoLen = 4;
   szHelp[ 2 ][ 30 ] = '0' + nCNoLen;

   LoadIndex();
   DBase *dbfCj = new DBase( fnCjDbf, tpNoLoad );

   ShowSJStatus();
   unsigned uCurRec = 0xffff,
            uTotSjRec = 1;
   char bOk[ flBool ];
   BOOL bResult = FALSE;
   dInput = 0.0;
   for(;;)
   {
      Event event;
      while( !GetEvent( event ) );

      winDoSJ->HandleEvent( event );
      sjWin->HandleEvent( event  );

      if( event.what == evKeyboard )
      {
         if( event.key == kbF2 )
         {
            Shift();
            ShowSJStatus();
         }
         else if( event.key == kbF3 )
         {
            bResult = TRUE;
            break;
         }
         else if( event.key == kbF4 ) PrintBill();
      }
      else if( event.what == evCommand )
      {
         if( event.command == cmOk )
         {
            if( winDoSJ->object == fdInput )
            {
               if( *szInput == ' ' || uCurRec == 0xffff ) continue;

               dInput  = atof( szInput );
               dOutput = dInput - dTotChg;

               if( dInput == 0.0 ) ShowError( "现收到金额输入错误" );
               else if( dOutput < -0.005 )
               {
#if defined( ShiZhu )
                  ShowError( "现收到金额少于应收金额" );
                  bGetPart =  FALSE;
#else
                  if( dInput - dTotRChg < -0.005 )
                  {
                     char szError[ 76 - 41 - 5 + 9 + 1 ];
                     sprintf( szError, "现收到金额少于当月应收金额(%1.2lf元)", dTotRChg );
                     ShowError( szError );
                     bGetPart = FALSE;
                  }
                  else bGetPart = Query( "收缴", "现收到金额少于应收金额,确定收取吗?" );
#endif
               }
               else bGetPart =  FALSE;

               if( dOutput >= 0.0 || bGetPart )
               {
                  char szMoney[ flRChg + 1 ];
                  sprintf( szMoney, "%1.2lf", dOutput );
                  fdOutput->Update( szMoney );
                  winDoSJ->Reselect( btnOk );
               }
               continue;
            }
            else if( *szNumber == ' ' ) continue;

            uCurRec = 0xffff;
            unsigned nLen = CheckNumber( szNumber );
            if( nLen == nTelLen )
            {
               uCurRec = SearchTel( szNumber );
               if( uCurRec == 0xffff &&
                   dbfQf->Search( szNumber, fdQfTel ) >= 0 )
               {
                  dbfSJ->AppendRecord();
                  dbfSJ->Replace( uRecNum, fdTel, szNumber );
                  dbfSJ->Replace( uRecNum, fdCNo, "不知道" );
                  dbfSJ->Replace( uRecNum, fdOk, "F" );
                  uCurRec = uRecNum;
                  uRecNum ++;
                  LoadIndex( TRUE );
               }
               uTotSjRec = 1;
            }
            else if( nLen == nCNoLen
                   #if defined( DBF )
                     || nLen == nCNoLen + 1
                   #endif
                   )
            {
               long lRec = dbfSJ->Search( szNumber, fdCNo );
               if( lRec >= 0 )
               {
                  uCurRec = lRec;

                  long lTmp = lRec + 1;
                  while( lTmp < dbfSJ->GetRecordNum() )
                  {
                     dbfSJ->GetField( lTmp, fdCNo, str );
                     if( memcmp( szNumber, str, flCNo ) != 0 ) break;
                     lTmp ++;
                  }
                  uTotSjRec = lTmp - uCurRec;
               }
            }
            else ShowError( "错误的电话号码或合同号" );

            if( uCurRec != 0xffff )
            {
               FillBill( uCurRec, uTotSjRec );
               dbfSJ->GetField( uCurRec, fdOk, bOk );
               fdOkFlag->Update( *bOk == 'T' ? szTrue : szFalse );
               if( *bOk == 'F' ) winDoSJ->Reselect( fdInput );
               continue;
            }
            else if( nLen == nTelLen || nLen == nCNoLen
                   #if defined( DBF )
                     || nLen == nCNoLen + 1
                   #endif
                   )
               ShowError( "本局没有这个电话号码或合同号" );

            fdNumber->Clear();
            winDoSJ->Reselect( fdNumber );
         }
         else if( event.command == cmDoSJ )
         {
            if( uCurRec != 0xffff )
            {
               if( *bOk == 'T' ) ShowError( "该用户已交费" );
               else
               {
                  fdOkFlag->Update( szTrue );
                  *bOk = 'T';

                  if( dInput == 0 || dOutput > 0 ) dOutput = 0;
                  double dAverySub = dOutput / ( double )uTotSjRec,
                         dGetQf    = dInput - dTotRChg;
                  long *lCjRec = new long[ uTotSjRec ];
                  unsigned uTotCjRec = 0;
                  for( unsigned i = 0; i < uTotSjRec; i ++, uCurRec ++ )
                  {
                     dbfSJ->Replace( uCurRec, fdOk, "T" );
                     AddLog( uCurRec, dAverySub );

                     char szTel[ flTel ];
                     dbfSJ->GetField( uCurRec, fdTel, szTel );
                     long lRec = dbfCj->Search( szTel, fdCjTel );
                     if( lRec >= 0 )
                     {
                        dbfCj->DeleteRecord( lRec );
                        lCjRec[ uTotCjRec ++ ] = lRec;
                     }

                     for( unsigned j = 0; j < uTotQfRec[ i ]; j ++, lQfRec[ i ] ++ )
                     {
                        long lRec = lQfRec[ i ];
                        if( !bGetPart ) dbfQf->DeleteRecord( lRec );
                        else
                        {
                           double dQf = dbfQf->GetDouble( lRec, fdQfRChg );
                           if( dGetQf >= dQf )
                           {
                              dGetQf -= dQf;
                              dbfQf->DeleteRecord( lRec );
                           }
                           else if( dGetQf > 0 )
                           {
                              dQf -= dGetQf;
                              dGetQf = 0.0;
                              dbfQf->Replace( lRec, fdQfRChg, dQf );
                           }
                        }
                     }
                  }
                  ChangeYyCjDbf( lCjRec, uTotCjRec );
                  delete lCjRec;

                  dbfSJ->SaveData();
                  dbfQf->SaveData();
                  dbfCj->SaveData();

                  PrintBill();
                  config.lBillNo ++;
               }
               fdNumber->Clear();
               fdInput->Clear();
               dInput = 0.0;
               fdOutput->Clear();
               winDoSJ->Reselect( fdNumber );
            }
         }
         else if( event.command == cmHelp ) ShowHelp( szHelp );
         else if( event.command == cmCancel ) break;
         else if( event.command == cmClose )
         {
            bResult = TRUE;
            break;
         }
      }
   }

   DelQfPara();
   CloseIndex();
   delete dbfCj;
   delete fdOkFlag;
   delete fdOutput;
   delete winDoSJ;
   sjMenu->Draw();
   ClearDutyNum();

   if( bRequireSend )
     ShowError( "网络故障,要求检查后重新启动并发送语音数据" );
   return bResult;
}

⌨️ 快捷键说明

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