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

📄 dosj.cpp

📁 DOS下一个完整的大型程序源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   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 && *bOk == 'T' )
         {
            szReprint = "[补]";
            PrintBill();
         }
      }
      else if( event.what == evCommand )
      {
         szReprint = "  ";
         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 ) || defined( PengShui ) || defined( XiTuo )
                  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 == nCNoLen
            #if defined( ShiZhu )
              && ( *szNumber == '4' || *szNumber == '8' ||
                   ( *szNumber == '9' && ( szNumber[1] == '6' || szNumber[1] == '8' ) ) )
            #elif defined( XiTuo )
              && ( *szNumber == '0' || *szNumber == '1' )
            #elif !defined( PengShui )
              || nLen == nCNoLen + 1
            #else
            #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 if( nLen == nTelLen || nLen == 6
                #if defined( ShiZhu ) || defined( XiTuo )
                  || nLen == 3 || nLen == 4 || nLen == 5 || nLen == 6 || nLen == 7 || nLen == 8
                #elif defined( YouYang )
                  || nLen == 7
                #endif
                   )
            {
               uCurRec = SearchTel( szNumber );
               if( uCurRec != 0xffff )
               {
                  char szCNo[ flCNo + 1 ];
                  dbfSJ->GetField( uCurRec, fdCNo, szCNo );
                  long lRec = dbfSJ->Search( szCNo, fdCNo );
                  if( lRec >= 0 )
                  {
                     long lTmp = lRec + 1;
                     while( lTmp < dbfSJ->GetRecordNum() )
                     {
                        dbfSJ->GetField( lTmp, fdCNo, str );
                        if( memcmp( szCNo, str, flCNo ) != 0 ) break;
                        lTmp ++;
                     }
                     lRec = lTmp - lRec;
                     if( lRec > 1 ) ShowMessage( "该电话号码的合同号下有多个用户" );
                  }
               }

               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 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
                     || nLen == nCNoLen + 1
                   )
               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 + -