📄 cmslimit.sqc
字号:
/******************************************************* ** 源码文件名称 : 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 + -