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