📄 dosj1.cpp
字号:
#if !defined( __STRING_H )
#include <String.h>
#endif // __STRING_H
#if !defined( __STDLIB_H )
#include <StdLib.h>
#endif // __STDLIB_H
#if !defined( __DOS_H )
#include <Dos.h>
#endif // __DOS_H
#if !defined( __GRAPHICS_H )
#include <Graphics.h>
#endif // __GRAPHICS_H
#define Uses_DBase
#define Uses_Window
#define Uses_Menu
#define Uses_Field
#define Uses_Button
#include <ly.h>
#include "sj.h"
#include "sjcfg.h"
#include "sjdbf.h"
#if defined( ShiZhu )
#define XIAN "石柱县"
#elif defined( PengShui )
#define XIAN "彭水县"
#elif defined( YouYang )
#define XIAN "酉阳县"
#elif defined( XiuShan )
#define XIAN "秀山县"
#endif
struct Map
{
char nField;
char szName[ 11 ];
char nRow, nCol;
};
#if defined( BIN )
const maxChg = 7;
const AChgCol = 34;
const chgOff = 20,
chgLen = 10;
static Map map[] =
{
fdLCTChg, "市内电话费", 6, 34, // 1 0
fdLDTChg, "程控长话费", 8, 34, // 2 1
fdMLTChg, "人工长话费", 10, 34, // 3 2
fdTGTChg, "电 报 费", 12, 34, // 4 3
fdSBTChg, "月 租 费", 14, 34, // 5 4
#if defined( ShiZhu )
fdTOMChg, "包 农 费", 16, 34, // 6 5
#else
fdTOMChg, "农 话 费", 16, 34, // 6 5
#endif
fdOTChg, "其 它", 18, 34, // 7 6
};
static char *szSj[] =
{
//0 1 2 3 4 5 6 7
//0123456789012345678901234567890123456789012345678901234567890123456789012345
/*00*/" 缴费时间 月 日 ─ 月 日 电话号码 № ",
/*01*/"┏━━━━━┯━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━┓",
/*02*/"┃ 用户名称 │ │缴费合同号│ ┃",
/*03*/"┠─────┼───────────────────┼─────┴────┨",
/*04*/"┃金额(大写)│ │(小写)¥ ┃",//$
/*05*/"┠─────┼─────┬─────────────┼────┬─────┨",
/*06*/"┃ │ │ │月 份│ 欠费金额 ┃",
/*07*/"┃ ├─────┼─────────────┼────┼─────┨",
/*08*/"┃ │ │ │ │ ┃",
/*09*/"┃ ├─────┼─────────────┼────┼─────┨",
/*10*/"┃ 其 │ │ │ │ ┃",
/*11*/"┃ ├─────┼─────────────┼────┼─────┨",
/*12*/"┃ │ │ │ │ ┃",
/*13*/"┃ ├─────┼─────────────┼────┼─────┨",
/*14*/"┃ │ │ │ │ ┃",
/*15*/"┃ ├─────┼─────────────┼────┼─────┨",
/*16*/"┃ 中 │ │ │ │ ┃",
/*17*/"┃ ├─────┼─────────────┼────┼─────┨",
/*18*/"┃ │ │ │ │ ┃",
/*19*/"┃ ├─────┼─────────────┼────┼─────┨",
/*20*/"┃ │滞 纳 金│ │共 欠 费│ ┃",
/*21*/"┗━━━━━┷━━━━━┷━━━━━━━━━━━━━┷━━━━┷━━━━━┛",
/*22*/" 收款员: 收款时间: 12:12:12",
};
#else
const AChgCol = 44;
const chgOff = 10,
chgLen = 8;
#if defined( XiuShan )
const maxChg = 15;
static Map map[] =
{
5, "市话月租", 6, 24, /*1*/ 19, "电报挂号", 6, 44, // 9
7, "市话计次", 8, 24, /*2*/ 22, "市话租线", 8, 44, //10
8, "长 话 费", 10, 24, /*3*/ 15, "农话租维", 10, 44, //11
17, "移动电话", 12, 24, /*4*/ 12, "农话月租", 12, 44, //12
21, "代 维 费", 14, 24, /*5*/ 13, "农话计次", 14, 44, //13
11, "长途出租", 16, 24, /*6*/ 14, "农话会议", 16, 44, //14
16, "无线寻呼", 18, 24, /*7*/ 6, "信息费用", 18, 44, //15
18, "电 报 费", 20, 24, /*8*/
};
#elif defined( PengShui )
const maxChg = 14;
static Map map[] =
{
5, "市话月租", 6, 24, /*1*/ 17, "线路维护", 6, 44, // 9
7, "市话计次", 8, 24, /*2*/ 18, "出租电路", 8, 44, //10
8, "长 话 费", 10, 24, /*3*/ 13, "市话租维", 10, 44, //11
15, "移动电话", 12, 24, /*4*/ 10, "农话月租", 12, 44, //12
19, "代 维 费", 14, 24, /*5*/ 11, "农话计次", 14, 44, //13
9, "租 线 费", 16, 24, /*6*/ 12, "农话会议", 16, 44, //14
14, "无线寻呼", 18, 24, /*7*/ // 6, "信息费用", 18, 44, //15
16, "电 报 费", 20, 24, /*8*/
};
#endif
static char *szSj[] =
{
//0 1 2 3 4 5 6 7
//0123456789012345678901234567890123456789012345678901234567890123456789012345
/*00*/" 缴费时间 月 日 ─ 月 日 电话号码 № ",
/*01*/"┏━━━━━┯━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━┓",
/*02*/"┃ 用户名称 │ │缴费合同号│ ┃",
/*03*/"┠─────┼───────────────────┼─────┴────┨",
/*04*/"┃金额(大写)│ │(小写)¥ ┃",//$
/*05*/"┠─────┼────┬────┬────┬────┼────┬─────┨",
/*06*/"┃ │ │ │ │ │月 份│ 欠费金额 ┃",
/*07*/"┃ ├────┼────┼────┼────┼────┼─────┨",
/*08*/"┃ │ │ │ │ │ │ ┃",
/*09*/"┃ ├────┼────┼────┼────┼────┼─────┨",
/*10*/"┃ 其 │ │ │ │ │ │ ┃",
/*11*/"┃ ├────┼────┼────┼────┼────┼─────┨",
/*12*/"┃ │ │ │ │ │ │ ┃",
/*13*/"┃ ├────┼────┼────┼────┼────┼─────┨",
/*14*/"┃ │ │ │ │ │ │ ┃",
/*15*/"┃ ├────┼────┼────┼────┼────┼─────┨",
/*16*/"┃ 中 │ │ │ │ │ │ ┃",
/*17*/"┃ ├────┼────┼────┼────┼────┼─────┨",
/*18*/"┃ │ │ │ │ │ │ ┃",
/*19*/"┃ ├────┼────┼────┼────┼────┼─────┨",
/*20*/"┃ │ │ │滞 纳 金│ │共 欠 费│ ┃",
/*21*/"┗━━━━━┷━━━━┷━━━━┷━━━━┷━━━━┷━━━━┷━━━━━┛",
#if defined( XiuShan )
/*22*/" 邮局帐号: 县工行 2210033─153 收款员: 收款时间: ",
#elif defined( PengShui )
/*22*/" 邮局帐号: 收款员: 收款时间: ",
#endif
};
#endif
static char szTrue[] = "已交费",
szFalse[] = "未交费";
const
winWidth = 640 - 8,
winHeight = 425,
winLeft = 320 - winWidth / 2,
winRight = winLeft + winWidth,
winTop = 24,
winBottom = winTop + winHeight,
sjWidth = 76 * 8,
sjLeft = 320 - sjWidth / 2,
sjTop = winTop + 16,
ttTelLeft = sjLeft + 8, // tt: tytle
ttTelTop = winBottom - 15 - 20 - 17,
fdTelLeft = ttTelLeft,
fdTelTop = ttTelTop + 17,
fdTelWidth = 8 * 16 + 2,
fdOkWidth = 50,
fdOkLeft = fdTelLeft + fdTelWidth,
fdOkTop = fdTelTop,
ttInputLeft = fdOkLeft + fdOkWidth + 63 - 26,
ttInputTop = ttTelTop,
fdInputLeft = ttInputLeft,
fdInputTop = fdTelTop,
fdInputWidth = 86,
ttOutputLeft = fdInputLeft + fdInputWidth + 51 - 26,
ttOutputTop = ttTelTop,
fdOutputLeft = ttOutputLeft,
fdOutputTop = fdTelTop,
fdOutputWidth = fdInputWidth,
btnOkWidth = 97,
btnOkHeight = 37,
btnOkLeft = sjLeft + sjWidth - 8 - btnOkWidth,
btnOkTop = ttTelTop;
void ShowBill( BOOL bShowTable )
{
HideCursor();
CMHZ::setcolor( 2, 15 );
if( bShowTable )
{
for( int i = 0; i < maxChg; i ++ )
memcpy( szSj[ map[ i ].nRow ] + map[ i ].nCol - chgOff,
map[ i ].szName, chgLen );
}
int nIteration = 2 - bShowTable,
nYIteration = 16 * nIteration;
for( int i = 0, y = sjTop; i < 22; i += nIteration, y += nYIteration )
CMHZ::showhz( sjLeft, y, szSj[ i ] );
ShowCursor();
}
void DxMoney( char *szMoney, char *str )
{
static char szNumber[] = "零壹贰叁肆伍陆柒捌玖";
static char szUnit[] = "万仟佰拾元角分";
const cnDxMoneyLen = 32;
memset( str, ' ', cnDxMoneyLen );
# if( flRChg == 10 )
szMoney ++;
#endif
char ch = *szMoney ++;
if( ch != ' ' )
{
if( ch != '1' )
{
memcpy( str, szNumber + ( ch - '0' ) * 2, 2 );
str += 2;
}
memcpy( str, szUnit + 6, 2 ); // 拾
str += 2;
}
BOOL bAfterDot = FALSE;
for( int nUnit = 0; nUnit < 14; )
{
ch = *szMoney ++;
if( ch >= '0' && ch <= '9')
{
memcpy( str, szNumber + ( ch - '0' ) * 2, 2 );
str += 2;
if( bAfterDot || ( !bAfterDot && ch != '0' ) )
{
memcpy( str, szUnit + nUnit, 2 );
str += 2;
}
}
if( ch != '.' ) nUnit += 2;
else bAfterDot = TRUE;
}
}
void LeftTrim( char *szMoney )
{
char szTmp[ flRChg ];
memcpy( szTmp, szMoney, flRChg );
char *p = szTmp;
while( *p == ' ' ) p ++;
memset( szMoney, ' ', flRChg );
memcpy( szMoney, p, flRChg - ( p - szTmp ) );
}
int ElapsedDay( date& d1, date& d2 )
{
static char nMonthDay[] =
{
31, 30, 31, 30, // 1 2 3 4
31, 30, 31, 31, // 5 6 7 8
30, 31, 30, 31 // 9 10 11 12
};
int nDay;
if( d1.da_year == d2.da_year && d1.da_mon == d2.da_mon )
nDay = d2.da_day - d1.da_day + 1;
else
{
nDay = nMonthDay[ d1.da_mon - 1 ] - d1.da_day + 1;
if( d1.da_year == d2.da_year )
for( int i = d1.da_mon; i < d2.da_mon - 1; i ++ ) nDay += nMonthDay[ i ];
else
{
for( int i = d1.da_mon; i < 12; i ++ ) nDay += nMonthDay[ i ];
nDay += ( d2.da_year - d1.da_year - 1 ) * 365;
for( i = 0; i < d2.da_mon - 1; i ++ ) nDay += nMonthDay[ i ];
}
nDay += d2.da_day;
}
return nDay;
}
int SJ::ElapsedDay( char *szDate )
{
struct date d1, d2;
getdate( &d2 );
szDate[ 2 ] = 0;
szDate[ 5 ] = 0;
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 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"邮电局 用户缴费单据"
" (%02u年%2u月: %1.2lf元)\n\n",
d.da_year - 1900, 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();
}
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, config.nDayStart,
config.nDataMonth == 12 ? 1 : config.nDataMonth + 1,
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 );
#if defined( BIN )
dbfSJ->GetField( lSjRec, fdName, str );
memcpy( szSj[ 2 ] + 14, str, 38 ); // Name
dbfSJ->GetField( lSjRec, fdCNo, str );
memcpy( szSj[ 2 ] + 66, str, 8 ); // CNo
#else
dbfSJ->GetField( lSjRec, fdName, szSj[ 2 ] + 14 );
dbfSJ->GetField( lSjRec, fdCNo, szSj[ 2 ] + 66 );
#endif
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;
const maxQfMon = 6;
char szQfMon[ maxQfMon ][ flQfDate ];
double dQfMon[ maxQfMon ];
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 ];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -