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

📄 dosj.cpp

📁 DOS下一个完整的大型程序源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   d1.da_year = atoi( szDate );
   if( d1.da_year >= 96 ) d1.da_year += 1900; // Centry
   else d1.da_year += 2000;
   d1.da_mon  = atoi( szDate + 3 ),
   d1.da_day  = config.nDayEnd + 1;
   d1.da_mon ++;
   if( d1.da_mon == 13 )
   {
      d1.da_mon = 1;
      d1.da_year ++;
   }
   int nDay = ::ElapsedDay( d1, d2 );
   for( int i = 0; i < nZnjFree; i ++ )
   {
       int nCmp11, nCmp12, nCmp21, nCmp22;
       nCmp11 = DateCmp( dZnjFree1[ i ], d1 );
       nCmp12 = DateCmp( dZnjFree1[ i ], d2 );
       nCmp21 = DateCmp( dZnjFree2[ i ], d1 );
       nCmp22 = DateCmp( dZnjFree2[ i ], d2 );
       //         |-------------|
       // |---| |-3-|  |-2-|  |-4-| |---|
       //      |---------1---------|
       if( nCmp11 <= 0 && nCmp22 >= 0 ) nDay = 0;  // 1
       else if( nCmp11 > 0 && nCmp22 < 0 )       // 2
         nDay -= ::ElapsedDay( dZnjFree1[ i ], dZnjFree2[ i ] );
       else if( nCmp11 <= 0 && nCmp21 > 0 && nCmp22 < 0 )  // 3
         nDay -= ::ElapsedDay( d1, dZnjFree2[ i ] );
       else if( nCmp22 >= 0 && nCmp12 < 0 && nCmp11 > 0 )  // 4
         nDay -= ::ElapsedDay( dZnjFree1[ i ], d2 );
   }
   return nDay;
}

static double dTheRChg = 0.0;
static double dTotRChg = 0.0;
static double dTotChg = 0.0;
static long *lQfRec = NULL;
static unsigned *uTotQfRec = NULL;
static BOOL bGetPart = FALSE;
static double dInput, dOutput;
static char* szReprint;

const maxQfMon = 60;
int nQfMon;
char szQfMon[ maxQfMon ][ flQfDate ];
double dQfMon[ maxQfMon ];
static void DelQfPara()
{
   if( lQfRec != NULL )
   {
      delete lQfRec;
      lQfRec = NULL;
   }

   if( uTotQfRec != NULL )
   {
      delete uTotQfRec;
      uTotQfRec = NULL;
   }
}

void PrintBill()
{
   if( !PrnReady() ) return;

   struct date d;
   getdate( &d );
   if( config.nDataMonth == 12 ) d.da_year --;
   fprintf( stdprn, "                        "XIAN"  用户缴费单据"
                    "%s   (%u月小计: %1.2lf元)\n\n",
                    szReprint, config.nDataMonth, dTheRChg );
   for( int i = 0; i < 23; i ++ )
   {
      fprintf( stdprn, "%s\n", szSj[ i ] );
      if( HardError() ) return;
   }

   int nSpaceLine = 5;
   if( dOutput < 0 )
   {
      nSpaceLine --;
      fprintf( stdprn, " 现收到%1.2lf元,还欠%1.2lf元\n", dInput, -dOutput );
   }
   for( i = 0; i < nSpaceLine; i ++  ) NewLine();

   if( nQfMon <= 6 ) return;
   fprintf( stdprn, szQfFb[ 0 ] );
   fprintf( stdprn, szQfFb[ 1 ] );
   for( i = 6; i < nQfMon; i ++ )
   {
      fprintf( stdprn, szQfFb[ 2 ] );
      memcpy( szQfFb[ 3 ] + 54, szQfMon[ i ], 2 );
      memcpy( szQfFb[ 3 ] + 56, "年", 2 );
      memcpy( szQfFb[ 3 ] + 58, szQfMon[ i ] + 3, 2 );
      if( szQfFb[ 3 ][ 58 ] == '0' ) szQfFb[ 3 ][ 58 ] = ' ';
      memcpy( szQfFb[ 3 ] + 60, "月", 2 );
      FormatMoney( dQfMon[ i ], szQfFb[ 3 ] + 64, flRChg ); // QfRChg
      fprintf( stdprn, szQfFb[ 3 ] );
   }
   fprintf( stdprn, szQfFb[ 4 ] );
   NewPage();
   nQfMon = 0;
}

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

void SJ::FillBill( long lSjRec, unsigned uTotSjRec )
{
   if( lSjRec < 0 || lSjRec >= dbfSJ->GetRecordNum() )
     Error( "系统错误:记录号越界" );

   DelQfPara();
   lQfRec = new long[ uTotSjRec ];
   uTotQfRec = new unsigned[ uTotSjRec ];
   char str[ 81 ];

//#if !defined( PengShui )
   sprintf( str, "%2u月%2u日 ─ %2u月%2u日",
		 config.nDataMonth == 1 ? 12 : config.nDataMonth - 1,
                 config.nDayStart,
		 config.nDataMonth,
                 config.nDayEnd );
   memcpy( szSj[ 0 ] + 10, str, 20 );  // Month
//#endif
   if( uTotSjRec == 1 )
      dbfSJ->GetField( lSjRec, fdTel, szSj[ 0 ] + 42 ); // Tel
   else
   {
      sprintf( str, "共%4u个", uTotSjRec );
      memcpy( szSj[ 0 ] + 42, str, flTel );
   }
   sprintf( str, "%06lu", config.lBillNo );
   memcpy( szSj[ 0 ] + 56, str, 6 );  // Sj Number
   struct date d; getdate( &d );
   sprintf( szSj[ 0 ] + 65, "%04u.%02u.%02u", d.da_year, d.da_mon, d.da_day );

   dbfSJ->GetField( lSjRec, fdName, szSj[ 2 ] + 14 );
   dbfSJ->GetField( lSjRec, fdCNo, szSj[ 2 ] + 66 );

   double dChg[ maxChg ],
          dTotAChg = 0.0,
          dTotQf   = 0.0;
   for( unsigned i = 0; i < maxChg; i ++ ) dChg[ i ] = 0.0;

   dTheRChg = 0.0;
   dTotRChg = 0.0;
   dTotChg = 0.0;
   for( i = 0; i < maxQfMon; i ++ )
   {
      szQfMon[ i ][ 0 ] = 0;
      dQfMon[ i ] = 0.0;
   }

   for( i = 0; i < uTotSjRec; i ++, lSjRec ++ )
   {
      for( int j = 0; j < maxChg; j ++ )
        dChg[ j ] += dbfSJ->GetDouble( lSjRec, map[ j ].nField );

      char szTel[ flTel ];
      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 )
      {
         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 );
    #if defined( ShiZhu ) || defined( XiTuo )
      int nLen = FieldLen( szTel, flTel );
      if( nLen <= 5 || ( nLen == 7 && memcmp( szTel, "87", 2) == 0 ) )
        dAChg = 0.0;
    #endif

      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 < 6; 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;
}

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 );

⌨️ 快捷键说明

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