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

📄 cmslimit.sqc

📁 一整套完整的银行卡系统源代码
💻 SQC
📖 第 1 页 / 共 4 页
字号:
/******************************************************* **   源码文件名称 : cmslimit.SQC **   所属子系统   : 卡管理 **   功能描述     : 对卡限额检查的处理 **   当前文件版本 : 4.0.0.0 **   作        者 : Feng  **   版本创建日期 : 2004/09/15 **   修改记录     : **   修改人       修改日期     修改位置 **   Feng         2006-02-25   cmsApiChkCardKindTranLimitAmt								增加入口参数pcTranType,pcMid,pcMctmcc*******************************************************/#include "sysdefine.h"#include "code.h"#include "attrdef.h"#include "pubcom.h"#include "cmscode.h"#include "errlog.h"#include "revglob.h"#include "cmscardinfo.h"#include "cmsttotal.h"#include "cmsktlimt.h"#include "cmstlimt.h"#include "cmslimitreg.h"EXEC SQL	INCLUDE SQLCA;/******************************************************* **	  函数名称:cmsApiChkCardKindTranLimitAmt **   中文名称:检查卡片种类和卡片的交易限额并统计卡交易 **   功能描述:根据输入参数检查不同交易类型,卡片种类交易限额, **   			并进行统计 **   输入参数: **   			pcCardNo		----	卡号 **   			pcCardKind		----	卡片种类 **   			pcTranDevType	----	业务发生地类型 **										"01" 银联中心atm **										"02" 银联中心cdm **										"03" 银联中心pos **										"04" 银联中心crs存取款一体机 **										"05" 银联中心自助查询终端 **										"06" 银联中心柜台 **										"07" 银联中心网上银行 **										"08" 银联中心手机银行 **										"09" 银联中心电话银行 **										"10" 银联中心圈存圈提设备 **										"11" 银联中心移动pos **										"12" 本行柜台 **										"13" 本行atm **										"14" 本行pos **										"15" 本行cdm **										"16" 本行电话银行 **										"17" 本行网上银行 **										"18" 本行手机银行 **										"19" 本行自助查询终端 **										"20" 本行呼叫中心 **										"21" 本行crs存取款一体机 **										"22" 银联商务pos **										"23" 建行atm **										"24" 建行pos设备 **										"25" 华夏银行atm **										"26" 港澳通atm **										"27" 港澳通pos **				pcTranType		----	交易类型 **   									"001":本行借记卡开主帐户 **   									"002":本行借记卡正常销户 **   									"003":本行借记卡存款 **   									"004":本行借记卡取款 **   									"005":本行借记卡转本行借记卡 **   									"006":本行借记卡消费 **   									"007":本行借记卡退货 **   									"008":圈存 **   									"009":圈提 **   									"010":本行借记卡贷款发放 **   									"011":本行借记卡贷款还款 **   									"012":中间业务 **   									"013":本行借记卡预授权 **   									"014":本行借记卡预授权完成 **   									"015":本行借记卡修改密码 **   									"016":本行借记卡查询 **   									"017":撤消 **   									"018":冲正 **   									"019":撤消冲正 **   									"020":本行借记卡存款确认 **   									"021":本行借记卡挂失 **   									"022":本行贷记卡预借现金 **   									"023":本行借记卡转银联卡 **   									"024":银联卡转本行借记卡 **   									"025":本行借记卡开多帐户 **   									"026":本行借记卡保号换卡 **   									"027":本行借记卡申请副卡 **   									"028":本行借记卡挂失销户 **   									"029":本行借记卡转本行贷记卡 **   									"030":本行贷记卡转本行借记卡 **   									"031":本行贷记卡转本行贷记卡 **   									"032":银联卡转银联卡 **   									"033":本行借记卡自助缴费 **   									"034":本行贷记卡存款 **   									"035":本行贷记卡消费 **   									"036":银联卡存款 **   									"037":银联卡取款 **   									"038":本行贷记卡预授权 **   									"039":本行贷记卡预授权完成 **   									"040":本行贷记卡修改密码 **   									"041":本行贷记卡查询 **   									"042":本行贷记卡存款确认 **   									"043":本行贷记卡挂失 **   									"097":转出(中间业务代收业务赋此项) **   									"098":转入(中间业务代付业务赋此项) **   									"099":其他(中间业务和外围做其他业务时赋此项) **   			dAmt					交易金额 **   			pcCCY					币种 **   			cMode					交易类型 **   									'1':取款 **   									'2':存款 **   									'3':消费 **   									'4':转出 **   									'5':转入 **										'6':其他 **   			pcTranDate				交易日期 **				lSerSeqNo				交易流水号 **             pcMid                   商户代码 **             pcMctmcc                商户类型 **   			cFlag					交易标志 **   									'0':正常交易 **   									'1':抹帐交易 **   输出参数: **   返回结果:int **   			0				----	成功 **   			-1				----	失败*******************************************************/int	cmsApiChkCardKindTranLimitAmt( pcCardNo, pcCardKind, pcTranDevType,\		pcTranType, dAmt, pcCCY, cMode, pcTranDate, pcMid, pcMctmcc, \		lSerSeqNo, cFlag )char                        *   pcCardNo;		/* 卡号				*/char                        *   pcCardKind;		/* 卡片种类			*/char                        *   pcTranDevType;	/* 业务发生地类型	*/char						*	pcTranType;		/* 卡交易类型		*/double                      	dAmt;			/* 交易金额			*/char                        *   pcCCY;			/* 币种				*/char							cMode;			/* 交易类型			*/char						*	pcTranDate;		/* 交易日期			*/char   				        *   pcMid;          /* 商户代码         */char          				*   pcMctmcc;       /* 商户类型         */long							lSerSeqNo;		/* 交易流水号		*/char                        	cFlag;			/* 交易标志			*/{	struct	cmsttotal	stCmsTTotal;			/* 卡交易统计表		*/	struct	cmsktlimt	stCmsKTLimt;			/* 卡片种类交易限额	*/	struct	cmstlimt	stCmsTLimt;				/* 卡片交易限额表	*/	struct	cmslimitreg	stCmsLimitReg;			/* 卡交易限额日志表	*/	int					iRtn;					/* 函数返回值		*/	/* 下面为临时变量 */	double				dCashLimitAmt;			/* 周期取现限额		*/	double				dDepoLimitAmt;			/* 周期存款限额		*/	double				dConLimitAmt;			/* 周期消费限额		*/	double				dTranOutLimitAmt;		/* 周期转出限额		*/	int					iCashLimitTime;			/* 周期取现次数		*/	int					iDepoLimitTime;			/* 周期存款次数		*/	int					iConLimitTime;			/* 周期消费次数		*/	int					iTranOutLimitTime;		/* 周期转出次数		*/	long				lStartDate;				/* 周期起始日期		*/	long				lEndDate;				/* 周期结束日期		*/	long				lCurDate;				/* 当前业务日期		*/	int					iCurDateNum;			/* 当前日期记录数	*/	char                caSameTranDevType[3];   /* 统一业务发生地类型 */	sprintf( g_acTrcMsg, "cmsApiChkCardKindTranLimitAmt begin " );	TRCLOG2	/* 初始化卡号顺序号文件结构 */	memset( &stCmsTTotal,	0x00, sizeof( struct cmsttotal ) );	memset( &stCmsKTLimt,	0x00, sizeof( struct cmsktlimt ) );	memset( &stCmsTLimt,	0x00, sizeof( struct cmstlimt ) );	memset( &stCmsLimitReg,	0x00, sizeof( struct cmslimitreg ) );	memset( caSameTranDevType, 0, sizeof( caSameTranDevType ));	/* 将输入参数赋值给结构 */	strcpy ( stCmsKTLimt.cardkind,		pcCardKind		);	strcpy ( stCmsKTLimt.trandevtype,	pcTranDevType	);	strcpy ( stCmsKTLimt.ccy,			pcCCY			);	sprintf( g_acTrcMsg, "cmsktlimt_trandevtype[%s]",pcTranDevType );	TRCLOG4	/* 从卡片种类交易限额表获取记录 */	pubStoVCmsktlimt( &stCmsKTLimt );	EXEC SQL	SELECT	distinct(sametrandevtype)				INTO    :cmsktlimt_sametrandevtype				FROM	cmsktlimt				WHERE	cardkind = :cmsktlimt_cardkind				AND		trandevtype = :cmsktlimt_trandevtype				AND		ccy = :cmsktlimt_ccy;	/* 定义游标错 */	if ( SQLCODE && SQLCODE != SQLNOTFOUND )	{		strcpy( g_acRspCode, "CMS110" );		pubCrtRspInfo( "cmsktlimt", SQLCODE );		ERRLOG		return FAILED;	}	strcpy( caSameTranDevType, cmsktlimt_sametrandevtype );	sprintf( g_acTrcMsg, "cmsktlimt_sametrandevtype[%s]",cmsktlimt_sametrandevtype );	TRCLOG4	EXEC SQL	DECLARE KTlmt_l_cur CURSOR FOR				SELECT	*				FROM	cmsktlimt				WHERE	cardkind = :cmsktlimt_cardkind				AND		trandevtype = :cmsktlimt_sametrandevtype				AND		ccy = :cmsktlimt_ccy				ORDER BY period;	/* 定义游标错 	if ( SQLCODE )	{		strcpy( g_acRspCode, "CMS110" );		pubCrtRspInfo( "cmsktlimt", SQLCODE );		ERRLOG		return FAILED;	}	*/	SQLOPENCUR(KTlmt_l_cur,"KTlmt_l_cur")	/* 打开游标错 */	if ( SQLCODE )	{		strcpy( g_acRspCode, "CMS111" );		pubCrtRspInfo( "cmsktlimt", SQLCODE );		ERRLOG		return FAILED;	}	while ( 1 )	{		/* 获取卡片种类的每种交易限额标准 */		pubInitCmsktlimt();		EXEC SQL	FETCH KTlmt_l_cur INTO R_CMSKTLIMT;		/* 取游标错误 */		if ( SQLCODE && SQLCODE != SQLNOTFOUND )		{			strcpy( g_acRspCode, "CMS112" );			pubCrtRspInfo( "cmsktlimt", SQLCODE );			ERRLOG	SQLCLOSECUR(KTlmt_l_cur,"KTlmt_l_cur")			return FAILED;		}		else if ( SQLCODE == SQLNOTFOUND )			break;		pubVtoSCmsktlimt( &stCmsKTLimt );		/* 正常情况下进行限额的分析,抹帐情况直接跳过 */		if ( cFlag == FLAG_NORMAL )		{			/* 将卡片种类交易限额表的数据赋值给临时变量 */			dCashLimitAmt = stCmsKTLimt.cashlimitamt;			dDepoLimitAmt = stCmsKTLimt.depolimitamt;			dConLimitAmt = stCmsKTLimt.conlimitamt;			dTranOutLimitAmt = stCmsKTLimt.tranoutlimitamt;			iCashLimitTime = stCmsKTLimt.cashlimittime;			iDepoLimitTime = stCmsKTLimt.depolimittime;			iConLimitTime = stCmsKTLimt.conlimittime;			iTranOutLimitTime = stCmsKTLimt.tranoutlimittime;				/* 获取相应周期长度的卡片交易限额表 */			memset( &stCmsTLimt,	0x00, sizeof( struct cmstlimt ) );			strcpy ( stCmsTLimt.cardno,			pcCardNo		);			strcpy ( stCmsTLimt.trandevtype,	pcTranDevType	);			strcpy ( stCmsTLimt.ccy,			pcCCY			);			stCmsTLimt.period = stCmsKTLimt.period;			iRtn = pubReadCmstlimt( &stCmsTLimt );			/* 数据库错误 */			if ( SQLCODE && SQLCODE != SQLNOTFOUND )			{				ERRLOG	SQLCLOSECUR(KTlmt_l_cur,"KTlmt_l_cur")				return FAILED;			}			/* 未找到记录 */			else if ( SQLCODE == SQLNOTFOUND )			{				/* 不修改临时变量的数值 */				strcpy( g_acRspCode, SUCCESS );				strcpy( g_acRspCode, "" );				strcpy( g_acRspMsg, "" );			}			/* 存在记录 */			else 			{				/* 修改临时变量的数值 */				/* 如果卡片交易限额存在,且非不限制 								将卡片的交易限额赋值给临时变量 */				if ( fabs( stCmsTLimt.cashlimitamt - ZEROS ) > 0.005 )					dCashLimitAmt = stCmsTLimt.cashlimitamt;				if ( fabs( stCmsTLimt.depolimitamt - ZEROS ) > 0.005 )					dDepoLimitAmt = stCmsTLimt.depolimitamt;				if ( fabs( stCmsTLimt.conlimitamt - ZEROS ) > 0.005 )					dConLimitAmt = stCmsTLimt.conlimitamt;				if ( fabs( stCmsTLimt.tranoutlimitamt - ZEROS ) > 0.005 )					dTranOutLimitAmt = stCmsTLimt.tranoutlimitamt;				if ( stCmsTLimt.cashlimittime != ZEROS )					iCashLimitTime = stCmsTLimt.cashlimittime;				if ( stCmsTLimt.depolimittime != ZEROS )					iDepoLimitTime = stCmsTLimt.depolimittime;				if ( stCmsTLimt.conlimittime != ZEROS )					iConLimitTime = stCmsTLimt.conlimittime;				if ( stCmsTLimt.tranoutlimittime != ZEROS )					iTranOutLimitTime = stCmsTLimt.tranoutlimittime;			}		}	/* 正常情况的交易限额分析结束 */			sprintf( g_acTrcMsg, "cFlag[%c] mode[%c] period[%d] dAmt[%lf] dCashLimitAmt[%lf] dDepoLimitAmt[%lf] dConLimitAmt[%lf] dTranOutLimitAmt[%lf] iCashLimitTime[%d] iDepoLimitTime[%d] iConLimitTime[%d] iTranOutLimitTime[%d]",cFlag,cMode,stCmsKTLimt.period, dAmt, dCashLimitAmt, dDepoLimitAmt, dConLimitAmt, dTranOutLimitAmt, iCashLimitTime, iDepoLimitTime, iConLimitTime, iTranOutLimitTime );		TRCLOG4		/* 周期长度为ZEROS=0,表示单笔限制,不需要检查和进行累计 */		if ( stCmsKTLimt.period == ZEROS )		{			/* 正常情况进行检查 */			if ( cFlag == FLAG_NORMAL )			{				/* 判断交易类型, 下面ZEROS=0表示对金额不限制 */				switch ( cMode )				{					/* 取款 */					case MODE_WITHDRAW:						/* 取款金额超过取款限额 */		sprintf( g_acTrcMsg, "11dCashLimitAmt - dAmt[%lf] fabs( dCashLimitAmt - ZEROS )[%lf]",dCashLimitAmt - dAmt,fabs( dCashLimitAmt - ZEROS ) );		TRCLOG4						if ( ( dCashLimitAmt - dAmt ) < -0.005 							&& ( fabs( dCashLimitAmt - ZEROS ) > 0.005 ) )						{

⌨️ 快捷键说明

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