📄 cardpwd.sqc
字号:
/******************************************************* ** 源码文件名称 : cardpwd.SQC ** 所属子系统 : 卡管理 ** 功能描述 : 对卡密码的处理 ** 当前文件版本 : 4.0.0.0 ** 作 者 : Feng ** 版本创建日期 : 2004/09/15 ** 修改记录 : ** 修改人 修改日期 修改位置*******************************************************/#include "sysdefine.h"#include "code.h"#include "attrdef.h"#include "pubcom.h"#include "cmscode.h"#include "cmscardinfo.h"#include "cmscardkind.h"#include "cmslockm.h"EXEC SQL INCLUDE SQLCA;/******************************************************* ** 函数名称:cmsApiProPwdError ** 功能描述:卡密码错误的处理, 但是要在回滚事务后,平台控制 ** 根据卡号、业务发生地和响应码来修改卡片信息表的 ** 密码错误次数、密码错误总次数和卡状态,并且按照 ** 是否超出限制而登记锁卡登记簿 ** 输入参数: ** lSerSeqNo ---- 主机流水号 ** pcTranDate ---- 交易日期 ** pcCardNo ---- 卡号 ** pcHappenPlace ---- 业务发生地 ** pcTranCode ---- 交易代码 ** 输出参数: ** 返回结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsApiProPwdError( lSerSeqNo, pcTranDate, pcCardNo, pcHappenPlace, pcTranCode )long lSerSeqNo; /* 主机流水号 */char * pcTranDate; /* 交易日期 */char * pcCardNo; /* 卡号 */char * pcHappenPlace; /* 业务发生地 */char * pcTranCode; /* 交易代码 */{ /* 定义 局部变量 */ struct cmscardinfo stCmsCardInfo; /* 卡片信息表结构 */ struct cmslockm stCmsLockM; /* 锁卡登记簿结构 */ struct cmscardkind stCmsCardKind; /* 卡片种类表结构 */ int iRtn; /* 函数返回值 */ sprintf( g_acTrcMsg, "cmsApiProPwdError begin " ); TRCLOG2 /* 初始化结构 */ memset( &stCmsCardKind, 0x00, sizeof( struct cmscardkind ) ); memset( &stCmsCardInfo, 0x00, sizeof( struct cmscardinfo ) ); memset( &stCmsLockM, 0x00, sizeof( struct cmslockm ) ); /* 将输入参数赋值给结构 */ strcpy ( stCmsCardInfo.cardno, pcCardNo ); /* 从卡片信息表获取记录并锁住记录 */ pubStoVCmscardinfo( &stCmsCardInfo ); EXEC SQL DECLARE Info_l_cur CURSOR FOR SELECT * FROM CMSCARDINFO WHERE cardno = :cmscardinfo_cardno FOR UPDATE; /* 定义游标错误 if ( SQLCODE ) { strcpy( g_acRspCode, "CMS110" ); pubCrtRspInfo( "cmscardinfo", SQLCODE ); ERRLOG return FAILED; } */ SQLOPENCUR(Info_l_cur,"Info_l_cur") if ( SQLCODE ) { /* 打开游标错误 */ strcpy( g_acRspCode, "CMS111" ); pubCrtRspInfo( "cmscardinfo", SQLCODE ); ERRLOG return FAILED; } pubInitCmscardinfo(); EXEC SQL FETCH Info_l_cur INTO R_CMSCARDINFO ; if ( SQLCODE && SQLCODE != SQLNOTFOUND ) { /* 取游标错误 */ strcpy( g_acRspCode, "CMS112" ); pubCrtRspInfo( "cmscardinfo", SQLCODE ); ERRLOG SQLCLOSECUR(Info_l_cur,"Info_l_cur") return FAILED; } else if ( SQLCODE == SQLNOTFOUND ) { /* 记录不存在 */ strcpy( g_acRspCode, "CMS113" ); sprintf( g_acRspMsg, "卡号[%s]不存在", pcCardNo ); ERRLOG SQLCLOSECUR(Info_l_cur,"Info_l_cur") return FAILED; } pubVtoSCmscardinfo( &stCmsCardInfo ); sprintf( g_acTrcMsg, "Get CardInfo End " ); TRCLOG2 /* 按卡片种类获取卡片种类表 */ iRtn = cmsApiGetCmsCardKind( stCmsCardInfo.cardkind, &stCmsCardKind ); if ( iRtn ) { SQLCLOSECUR(Info_l_cur,"Info_l_cur") ERRLOG return FAILED; } sprintf( g_acTrcMsg, "Get CardKind End " ); TRCLOG2 sprintf( g_acTrcMsg, "Happen[%s] ", pcHappenPlace ); TRCLOG2 /* 累计密码错误总次数 */ stCmsCardInfo.errnumtot ++; /* 累计ATM密码错误次数 */ if ( !strcmp ( pcHappenPlace, CHANNALID_UNIONATM ) /* 银联ATM */ || !strcmp ( pcHappenPlace, CHANNALID_ATM ) /* 本行ATM */ || !strcmp ( pcHappenPlace, CHANNALID_CBATM ) /* 建行ATM */ || !strcmp ( pcHappenPlace, CHANNALID_HKATM ) /* 港澳ATM */ || !strcmp ( pcHappenPlace, CHANNALID_HXATM ) )/* 华夏ATM */ stCmsCardInfo.errnum ++; /* 判断卡ATM密码错误次数是否超过卡片种类的规定 */ /* 或者判断卡密码错误总次数是否超过卡片种类的规定, */ /* 如果超过,登记锁卡片信息表,修改卡状态为锁定 */ if ( ( stCmsCardKind.atmerrnum != PWDERRNOTLIMIT \ && stCmsCardInfo.errnum >= stCmsCardKind.atmerrnum ) \ || ( stCmsCardKind.totalerrnum != PWDERRNOTLIMIT \ && stCmsCardInfo.errnumtot >= stCmsCardKind.totalerrnum ) ) { sprintf( g_acTrcMsg, "cardstat[%s]", stCmsCardInfo.cardstat ); TRCLOG2 if ( stCmsCardInfo.cardstat[ BIT9_LEN ] == BIT9_CARDOK ) { /* 为锁卡登记簿赋值 */ strcpy ( stCmsLockM.cardno, pcCardNo ); /* 卡号 */ strcpy ( stCmsLockM.lockdate, pcTranDate ); /* 锁卡日期 */ stCmsLockM.serseqno = lSerSeqNo; /* 流水号 */ strcpy ( stCmsLockM.vouchno, pcTranDate ); /* 登记簿编号 */ /* 去掉分隔符 */ cmsDelDelimiter( stCmsLockM.vouchno, DATE_SPT_MINUS ); sprintf( stCmsLockM.vouchno, "%s%0*ld", stCmsLockM.vouchno, \ SERSEQNO_LEN, lSerSeqNo ); strcpy ( stCmsLockM.issuebrc, stCmsCardInfo.issuebrc );/* 发卡机构*/ strcpy ( stCmsLockM.teller, stCmsCardInfo.teller ); /* 发卡柜员 */ strcpy ( stCmsLockM.cardkind, stCmsCardInfo.cardkind );/* 卡片种类*/ strcpy ( stCmsLockM.reason, pcTranCode ); /* 锁卡原因 */ stCmsLockM.lockstat[ 0 ] = LOCKSTAT; /* 锁卡状态 */ /* 登记锁卡登记簿 */ iRtn = pubInstCmslockm( &stCmsLockM ); if ( iRtn ) { ERRLOG SQLCLOSECUR(Info_l_cur,"Info_l_cur") return FAILED; } /* 修改卡片信息表卡状态 */ stCmsCardInfo.cardstat[ BIT9_LEN ] = BIT9_CARDLOCK; } } strcpy( stCmsCardInfo.chgdate, pcTranDate ); strcpy( stCmsCardInfo.lastdate, pcTranDate ); sprintf( g_acTrcMsg, "chgdate[%s]", stCmsCardInfo.chgdate ); TRCLOG2 sprintf( g_acTrcMsg, "cardstat[%s]", stCmsCardInfo.cardstat ); TRCLOG2 sprintf( g_acTrcMsg, "errnumtot[%d]", stCmsCardInfo.errnumtot ); TRCLOG2 sprintf( g_acTrcMsg, "errnum[%d]", stCmsCardInfo.errnum ); TRCLOG2 /* 修改卡片信息表记录 */ pubStoVCmscardinfo( &stCmsCardInfo ); EXEC SQL UPDATE cmscardinfo SET cardstat = :cmscardinfo_cardstat, errnum = :cmscardinfo_errnum, errnumtot = :cmscardinfo_errnumtot, chgdate = :cmscardinfo_chgdate, lastdate = :cmscardinfo_lastdate WHERE CURRENT OF Info_l_cur; if ( SQLCODE ) { /* 修改出错 */ strcpy( g_acRspCode, "CMS114" ); pubCrtRspInfo( "cmscardinfo", SQLCODE ); ERRLOG SQLCLOSECUR(Info_l_cur,"Info_l_cur") return FAILED; } sprintf( g_acTrcMsg, "SQCLODE[%d]", SQLCODE ); TRCLOG2 SQLCLOSECUR(Info_l_cur,"Info_l_cur") sprintf( g_acTrcMsg, "cmsApiProPwdError end " ); TRCLOG2 return SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -