📄 dosj.cpp
字号:
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 + -