📄 cmsmang.sqc
字号:
/******************************************************* ** 源码文件名称 : cmsmang.SQC ** 所属子系统 : 卡管理 ** 功能描述 : 对卡帐户的关联和解除关联,卡挂失和解挂,销户等 ** 进行处理 ** 当前文件版本 : 4.0.0.0 ** 作 者 : Feng ** 版本创建日期 : 2004/09/15 ** 修改记录 : ** 修改人 修改日期 修改位置 ** Feng 2006/01/07 905行 ** Feng 2006/01/07 910行 ** Feng 2006/01/07 945行*******************************************************/#include "sysdefine.h"#include "code.h"#include "attrdef.h"#include "pubcom.h"#include "cmscode.h"#include "cmsacctm.h"#include "cmscardinfo.h"#include "cmscardkind.h"#include "cmstbsreginf.h"#include "ciscustomerinfo.h"#include "glssubtranslog.h"#define ZEROSTR "0" /* 分录流水缺省标志 */#define CASHSTR "1" /* 分录流水缺省标志 */#define DEBITSTR "D" /* 分录流水缺省标志 */EXEC SQL INCLUDE SQLCA;/******************************************************* ** 函数名称:cmsApiCardAssociateAcct ** 功能描述:卡关联帐户 ** 输入参数: ** pstPubCom ---- 公共PUBCOM ** pcCardNo ---- 卡号 ** pcAcctNo ---- 客户账号 ** pcSubAcct ---- 款项代码 ** pcCcy ---- 币种 ** pcPrdCod ---- 产品代码 ** pcCustNo ---- 客户号 ** cAcctOwner ---- 帐户属主 ** '0':属于附卡 ** '1':属于主卡 ** cCardBookFlag ---- 卡折标志 ** '0':帐户无折 ** '1':帐户有折(卡折共享) ** pcSubSys ---- 子系统编号 ** 输出参数: ** pcAcctSeqNo ---- 账号序号 ** 返回结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsApiCardAssociateAcct( pstPubCom, pcCardNo, pcAcctNo, pcSubAcct, pcCcy, \ pcPrdCod, pcCustNo, cAcctOwner, cCardBookFlag, pcSubSys, pcAcctSeqNo )struct pubcom * pstPubCom; /* 公共PUBCOM */char * pcCardNo; /* 卡号 */char * pcAcctNo; /* 客户账号 */char * pcSubAcct; /* 款项代码 */char * pcCcy; /* 币种 */char * pcPrdCod; /* 产品代码 */char * pcCustNo; /* 客户号 */char cAcctOwner; /* 帐户属主 */char cCardBookFlag; /* 卡折标志 */char * pcSubSys; /* 子系统编号 */char * pcAcctSeqNo; /* 帐户序号 */{ /* 定义 局部变量 */ struct cmsacctm stCmsAcctM; /* 卡帐户对照表结构 */ struct cmscardinfo stCmsCardInfo; /* 卡片信息表 */ char acCardStat[ BIT21_LEN ][BIT11_LEN]; /* 卡状态检查标志 */ int iRtn; /* 函数返回值 */ int iNumx; /* 数组计数器 */ int iNumy; /* 数组计数器 */ sprintf( g_acTrcMsg, "cmsApiCardAssociateAcct begin " ); TRCLOG2 /* 初始化卡帐户对照表结构 */ memset( &stCmsAcctM, 0x00, sizeof( struct cmsacctm ) ); memset( &stCmsCardInfo, 0x00, sizeof( struct cmscardinfo ) ); /* 卡检查状态数组除首位外全置为不检查 */ for ( iNumx = 0; iNumx < BIT21_LEN; iNumx ++ ) for ( iNumy = 0; iNumy < BIT11_LEN; iNumy ++ ) { if ( iNumy == 0 ) acCardStat[iNumx][iNumy] = CHECK_YES; else acCardStat[iNumx][iNumy] = CHECK_NO; } sprintf( g_acTrcMsg, "CardNo=[%s]", pcCardNo ); TRCLOG1 sprintf( g_acTrcMsg, "pcAcctNo=[%s]", pcAcctNo ); TRCLOG1 sprintf( g_acTrcMsg, "pcSubAcct=[%s]", pcSubAcct ); TRCLOG1 sprintf( g_acTrcMsg, "pcCcy=[%s]", pcCcy ); TRCLOG1 sprintf( g_acTrcMsg, "pcPrdCod=[%s]", pcPrdCod ); TRCLOG1 sprintf( g_acTrcMsg, "pcCustNo=[%s]", pcCustNo ); TRCLOG1 sprintf( g_acTrcMsg, "cAcctOwner=[%c]", cAcctOwner ); TRCLOG1 sprintf( g_acTrcMsg, "cCardBookFlag=[%c]", cCardBookFlag ); TRCLOG1 sprintf( g_acTrcMsg, "pcSubSys=[%s]", pcSubSys ); TRCLOG1 strcpy( stCmsCardInfo.cardno, pcCardNo ); /* 获取卡片信息表 */ strcpy( stCmsCardInfo.cardno, pcCardNo ); iRtn = pubReadCmscardinfo( &stCmsCardInfo ); if ( iRtn ) { if ( SQLCODE == SQLNOTFOUND ) { strcpy(g_acRspCode,"CMS302"); pubCrtRspInfo( pcCardNo ); } ERRLOG return FAILED; } /* 检查卡状态是否正常 */ iRtn = cmsApiChkCardStatIsNormal( &stCmsCardInfo, acCardStat ); if ( iRtn ) { ERRLOG return FAILED; } strcpy( g_acTrcMsg, "检查卡状态是否正finish" ); TRCLOG1 /* 有折卡不能开立新的账户 * if ( stCmsCardInfo.hasbankbook[ BIT1_LEN ] == BANKBOOK ) { strcpy( g_acRspCode, "CMS1D2" ); * 有折卡不能开立其它账户 * pubCrtRspInfo( ); ERRLOG return FAILED; } */ /* 检查卡内同币种同一产品代码的账户是否超限 */ iRtn = cmsApiChkCardAcctNumExceed( pcCardNo, stCmsCardInfo.cardkind, pcCcy, pcPrdCod ); if ( iRtn ) { ERRLOG return FAILED; } /* 生成卡内帐户序号 */ iRtn = cmsApiGetSeqNoInCard( pcCardNo, stCmsAcctM.acctseqno ); /* 生成卡内帐户序号错 */ if ( iRtn ) { ERRLOG return FAILED; } /* 按产品代码获取业务种类 */ iRtn = cmsApiGetBussKindByPrdCod( pcPrdCod, stCmsAcctM.busskind ); /* 获取业务种类错 */ if ( iRtn ) { if ( SQLCODE == SQLNOTFOUND ) sprintf( g_acRspMsg, "该产品[%s]不允许在卡内开户", pcPrdCod ); ERRLOG return FAILED; } /* 为卡帐户对照表结构赋值 */ strcpy( stCmsAcctM.cardno, pcCardNo ); strcpy( stCmsAcctM.acctno, pcAcctNo ); strcpy( stCmsAcctM.prdcod, pcPrdCod ); strcpy( stCmsAcctM.ccy, pcCcy ); strcpy( stCmsAcctM.subacct, pcSubAcct ); strcpy( stCmsAcctM.custno, pcCustNo ); strcpy( stCmsAcctM.subsys, pcSubSys ); stCmsAcctM.accowner[ 0 ] = cAcctOwner; strcpy( stCmsAcctM.issuedate, pstPubCom->acTranDate ); strcpy( stCmsAcctM.issuebrc, pstPubCom->acBrc ); strcpy( stCmsAcctM.issueteller, pstPubCom->acTeller ); stCmsAcctM.cardbookflag[ 0 ] = cCardBookFlag; /* 正常 */ stCmsAcctM.status[ 0 ] = NORMAL_STS; /* 插入卡帐户对照表 */ iRtn = pubInstCmsacctm( &stCmsAcctM ); /* 数据库插入错 */ if ( iRtn ) { ERRLOG return FAILED; } /* 为输出参数附值 */ strcpy( pcAcctSeqNo, stCmsAcctM.acctseqno ); sprintf( g_acTrcMsg, "cmsApiCardAssociateAcct end " ); TRCLOG2 return SUCCESS;}/******************************************************* ** 函数名称:cmsApiCardDisassociateAcct ** 功能描述:卡解除关联帐户 ** 输入参数: ** pstPubCom ---- 公共PUBCOM ** pcCardNo ---- 卡号 ** pcAcctSeqNo ---- 账号序号 ** cTranFlag ---- 解除方式 ** '1':销户 ** '2':移出 ** '3':已换卡 ** cCloseType ---- 销卡标志 ** '0':只销户 ** '1':同时销卡 ** 输出参数: ** pcAcctNo ---- 客户账号 ** pcSubAcct ---- 款项代码 ** pcCcy ---- 币种 ** pcPrdCod ---- 产品代码 ** 返回结果:int ** 0 ---- 成功 ** -1 ---- 失败*******************************************************/int cmsApiCardDisassociateAcct( pstPubCom, pcCardNo, pcAcctSeqNo, \ cTranFlag, cCloseType, pcAcctNo, pcSubAcct, pcCcy, pcPrdCod )struct pubcom * pstPubCom; /* 公共PUBCOM */char * pcCardNo; /* 卡号 */char * pcAcctSeqNo; /* 帐户序号 */char cTranFlag; /* 解除方式 */char cCloseType; /* 销卡标志 */char * pcAcctNo; /* 客户账号 */char * pcSubAcct; /* 款项代码 */char * pcCcy; /* 币种 */char * pcPrdCod; /* 产品代码 */{ /* 定义 局部变量 */ struct cmsacctm stCmsAcctM; /* 卡帐户对照表结构 */ int iRtn; /* 函数返回值 */ sprintf( g_acTrcMsg, "cmsApiCardDisassociateAcct begin " ); TRCLOG2 /* 初始化卡帐户对照表结构 */ memset( &stCmsAcctM, 0x00, sizeof( struct cmsacctm ) ); sprintf( g_acTrcMsg, "CardNo=[%s]", pcCardNo ); TRCLOG1 sprintf( g_acTrcMsg, "AcctSeqNo=[%s]", pcAcctSeqNo ); TRCLOG1 sprintf( g_acTrcMsg, "pcAcctNo=[%s]", pcAcctNo ); TRCLOG1 sprintf( g_acTrcMsg, "pcSubAcct=[%s]", pcSubAcct ); TRCLOG1 sprintf( g_acTrcMsg, "pcCcy=[%s]", pcCcy ); TRCLOG1 sprintf( g_acTrcMsg, "pcPrdCod=[%s]", pcPrdCod ); TRCLOG1 sprintf( g_acTrcMsg, "cTranFlag=[%c]", cTranFlag ); TRCLOG1 sprintf( g_acTrcMsg, "cCloseType=[%c]", cCloseType ); TRCLOG1 /* 如果是主帐户 */ if ( !strcmp( pcAcctSeqNo, MAINACCTSEQNO ) ) { if ( cCloseType == '0' ) /* 只销户 */ { strcpy( g_acRspCode, "CMS1C9" ); pubCrtRspInfo( ); ERRLOG return FAILED; } /* 不能存在其他账户 */ /* 检查是否存在主账户以外的账户 */ iRtn = cmsApiChkCardNoHasOtherAcct( pcCardNo ); if ( iRtn ) { ERRLOG return FAILED; } } /* 将维一索引数据赋给结构 */ strcpy( stCmsAcctM.cardno, pcCardNo ); strcpy( stCmsAcctM.acctseqno, pcAcctSeqNo ); /* 从卡帐户对照表获取纪录并锁住纪录 */ pubStoVCmsacctm( &stCmsAcctM ); EXEC SQL DECLARE AcctM_l_cur CURSOR FOR SELECT * FROM CMSACCTM WHERE cardno = :cmsacctm_cardno AND acctseqno = :cmsacctm_acctseqno; /* FOR UPDATE; */ /* 定义游标出错 if ( SQLCODE ) { strcpy( g_acRspCode, "CMS110" ); pubCrtRspInfo( "cmsacctm", SQLCODE ); ERRLOG return FAILED; } */ SQLOPENCUR(AcctM_l_cur,"AcctM_l_cur") /* 打开游表出错 */ if ( SQLCODE ) { strcpy( g_acRspCode, "CMS111" ); pubCrtRspInfo( "cmsacctm", SQLCODE ); ERRLOG return FAILED; } pubInitCmsacctm(); EXEC SQL FETCH AcctM_l_cur INTO R_CMSACCTM ; /* 取游表出错 */ if ( SQLCODE && SQLCODE != SQLNOTFOUND ) { strcpy( g_acRspCode, "CMS112" ); pubCrtRspInfo( "cmsacctm", SQLCODE ); ERRLOG SQLCLOSECUR(AcctM_l_cur,"AcctM_l_cur") return FAILED; } /* 记录不存在 */ else if ( SQLCODE == SQLNOTFOUND ) { strcpy( g_acRspCode, "CMS113" ); pubCrtRspInfo( "cmsacctm", SQLCODE ); ERRLOG SQLCLOSECUR(AcctM_l_cur,"AcctM_l_cur") return FAILED; } pubVtoSCmsacctm( &stCmsAcctM ); SQLCLOSECUR(AcctM_l_cur,"AcctM_l_cur") /* 检查帐户状态是否正常 */ /* 帐户已经不属于卡, 帐户序号已无效 */ if ( stCmsAcctM.status[ BIT1_LEN ] != NORMAL_STS ) { strcpy( g_acRspCode, "CMS197" ); pubCrtRspInfo( pcCardNo, pcAcctSeqNo ); ERRLOG return FAILED; } /* 帐户销户时,检查卡折标志是否有折 被过云更改,在这不检查帐户是否有折单 20041103 if ( cTranFlag == CANCEL_STS ) { 账户是否未捆绑折单 iRtn = cmsApiChkAcctNotResideCard( &stCmsAcctM ); if ( iRtn ) { ERRLOG return FAILED; } } */ /* 为修改卡帐户对照表准备数据 */ strcpy( stCmsAcctM.closedate, pstPubCom->acTranDate ); strcpy( stCmsAcctM.closebrc, pstPubCom->acBrc ); strcpy( stCmsAcctM.closeteller, pstPubCom->acTeller ); stCmsAcctM.status[ BIT1_LEN ] = cTranFlag; iRtn = pubModiCmsacctm( &stCmsAcctM ); if ( iRtn ) { ERRLOG return FAILED; } /* pubStoVCmsacctm( &stCmsAcctM ); * 修改卡帐户对照表记录 * EXEC SQL UPDATE CMSACCTM SET closedate = :cmsacctm_closedate, closebrc = :cmsacctm_closebrc, closeteller = :cmsacctm_closeteller, status = :cmsacctm_status WHERE CURRENT OF AcctM_l_cur; * 修改出错 * if ( SQLCODE ) { strcpy( g_acRspCode, "CMS114" ); pubCrtRspInfo( "cmsacctm", SQLCODE ); ERRLOG SQLCLOSECUR(AcctM_l_cur,"AcctM_l_cur") return FAILED; } SQLCLOSECUR(AcctM_l_cur,"AcctM_l_cur") */ /* 为输出参数附值 */ strcpy( pcAcctNo, stCmsAcctM.acctno ); strcpy( pcSubAcct, stCmsAcctM.subacct ); strcpy( pcCcy, stCmsAcctM.ccy ); strcpy( pcPrdCod, stCmsAcctM.prdcod ); sprintf( g_acTrcMsg, "cmsApiCardDisassociateAcct end " ); TRCLOG2 return SUCCESS;}/******************************************************* ** 函数名称:cmsApiCardReportLoss ** 功能描述:卡挂失,如果是检查查询密码,则只能进行口挂和密码口挂, ** 检查查询密码时,如果卡存在电话银行签约,则检查电话银行 ** 签约用户登记表中密码,否则检查卡片信息中查询密码。 ** 输入参数: ** pcCardNo ---- 卡号 ** pcPasswd ---- 密码 ** iPlace ---- 检查密码标志 ** 0:卡密码 ** 1:查询密码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -