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

📄 linkabis.cpre

📁 商业银行前置系统
💻 CPRE
字号:
/* * This is a part of the Application Preconsole * - Service Provide - ABIS. * Copyright (C) 2000-2000 ABC.SDC. * All rights reserved. * * This source code is only intended as a supplement to the * Application Preconsole Reference and related * electronic documentation provided with the library. * See these sources for detailed information regarding the * Application Preconsole product.  * * Update record: * 2001-08-02 HLW           - create implementation file for *            Xiaomin Chen    abis linking function * 2001-08-27 R.Cao         - add LinkAbis and ConvRespCode  *                            function */#include "ap.h"#include "apsc.h"#include "apsp.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "abis.h";EXEC SQL INCLUDE "abisext.h";/* * Abis linking function */RESULT ConvRespCode(PSTR pszRespCode, PCSTR pszAbisRespCode){    EXEC SQL BEGIN DECLARE SECTION;    char szAbisRespCode[LEN_RESPCODE + 1];    char szRespCode[AP_LEN_RESPCODE + 1];    EXEC SQL END DECLARE SECTION;    bufclr(szAbisRespCode);    strncpy(szAbisRespCode, pszAbisRespCode, LEN_RESPCODE);    PrintLog(stderr,"Abis response code is %4s.", szAbisRespCode);     EXEC SQL SELECT respcode INTO :szRespCode             FROM abisrespcode WHERE abisrespcode = :szAbisRespCode;    if (sqlca.sqlcode == SQLCODE_NORMAL)    {        strcpy(pszRespCode, szRespCode);        return NORMAL;    }        ASSERT_SQL(SQLCODE_NOTFOUND);    strcpy(pszRespCode, AP_RESPCODE_REJECT);    return NORMAL;}RESULT ConvCurrType(PSTR pszCurrType, PCSTR pszAbisCurrCode){    EXEC SQL BEGIN DECLARE SECTION;    char szCurrType[AP_LEN_CURRTYPE + 1];    char szAbisCurrCode[LEN_CURRCODE + 1];    EXEC SQL END DECLARE SECTION;    strcpy(szAbisCurrCode, pszAbisCurrCode);    EXEC SQL SELECT currtype INTO :szCurrType             FROM abiscurrcode WHERE abiscurrcode = :szAbisCurrCode;    ASSERT_SQL_NORMAL();    strcpy(pszCurrType, szCurrType);    return NORMAL;}void LinkAbis(PCXMLSTRU pxmlstruReq, PXMLSTRU pxmlstruResp,               PTIASTRU ptiastru, PTOASTRU ptoastru){    EXEC SQL BEGIN DECLARE SECTION;    char szTeller[LEN_TELLER + 1];    char szTerm[LEN_TERM + 1];    char szReqId[LEN_ID + 1];    ABISDSTRU abisdstru;    EXEC SQL END DECLARE SECTION;    char szReqType[AP_LEN_REQTYPE + 1];    char szMsgType[AP_LEN_MSGTYPE + 1];    char szJrnNo[AP_LEN_JRNNO + 1];    char szAmt[AP_LEN_AMT + 1];    char szRespCode[AP_LEN_RESPCODE + 1];    char szChargeDevA[AP_LEN_DEV + 1];    char szChargeDevB[AP_LEN_DEV + 1];    char szSeqNo[AP_LEN_SEQNO + 1];        CIASTRU ciastru;    char cCommArea[3000];    unsigned long lRespCode;    /*     * 在TIA 中填写所有ABIS交易所需的公共域。填写过程中,如果发现缺     * 乏关键域,则认为TSA 有逻辑错误。     */    AP_DEMAND(AP_PATH_REQTYPE, szReqType);        if (strcmp(szReqType, AP_REQTYPE_TERM) == 0)    {        /*         * 报文序列号是否需填写有待核实。         */                strcpy(ptiastru->szFrom, "TERM");                AP_DEMAND(AP_PATH_CHARGEA, ptiastru->szChargeA);        AP_DEMAND(AP_PATH_CHARGEB, ptiastru->szChargeB);        AP_DEMAND(AP_PATH_CHARGEPWDA, ptiastru->szChargePwdA);        AP_DEMAND(AP_PATH_CHARGEPWDB, ptiastru->szChargePwdB);        AP_DEMAND(AP_PATH_AUTHLEVEL, ptiastru->szAuthLevel);                AP_DEMAND(AP_PATH_CHARGEDEVA, szChargeDevA);        AP_DEMAND(AP_PATH_CHARGEDEVB, szChargeDevB);        ptiastru->cChargeDevA = szChargeDevA[0];        ptiastru->cChargeDevB = szChargeDevB[0];                        if (!VERIFY_NORMAL(AP_DEMAND(AP_PATH_TELLER, ptiastru->szTeller)) ||            !VERIFY_NORMAL(AP_DEMAND(AP_PATH_TERM, ptiastru->szTerm)) ||            !VERIFY_NORMAL(AP_DEMAND(AP_PATH_LASTJRNNO, szJrnNo)))        {            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR);            return;        }                    ptiastru->nLastJrnNo = atoi(szJrnNo);    }    else    {        if (strcmp(szReqType, AP_REQTYPE_ATM) == 0)            strcpy(ptiastru->szFrom, "ATMP");                    else if (strcmp(szReqType, AP_REQTYPE_POS) == 0)            strcpy(ptiastru->szFrom, "POSP");                else if (strcmp(szReqType, AP_REQTYPE_ISI) == 0)            strcpy(ptiastru->szFrom, "SWWD");                else if (strcmp(szReqType, AP_REQTYPE_DSI) == 0)            strcpy(ptiastru->szFrom, "SWWG");                else        {            VERIFY(FALSE);                        ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR);            return;        }        AP_DEMAND(AP_PATH_REQID, szReqId);    	AP_DEMAND(AP_PATH_SEQNO, szSeqNo);                EXEC SQL select teller, term into :szTeller, :szTerm                 from abisteller where reqid = :szReqId;               if (!VERIFY_SQL_NORMAL())        {            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_REQID_NOTELLER);            return;        }        #ifdef ABISV20        strcpy(ptiastru->szTeller, szTeller);        strcpy(ptiastru->szTerm, szTerm);#else		if (strcmp(szTeller, "****") == 0)		{			if (strcmp(szReqType, AP_REQTYPE_ISI) == 0)			{		        strcpy(ptiastru->szTeller, "ISI");		        strcpy(ptiastru->szTerm, "ISI");			}			else if (strcmp(szReqType, AP_REQTYPE_DSI) == 0)			{		        strcpy(ptiastru->szTeller, "DSI");		        strcpy(ptiastru->szTerm, "DSI");			}			strcat(ptiastru->szTeller, szSeqNo + 11);			strcat(ptiastru->szTerm, szSeqNo + 11);		}		else		{	        strcpy(ptiastru->szTeller, szTeller);	        strcpy(ptiastru->szTerm, szTerm);        }#endif    }        /*     * 填写CIA 并准备COMMAREA。CIA 中金额域与帐户域不是必需的。填写     * 过程中,如果发现关键域有错,则认为TSA 有逻辑错误。     */        memset(&ciastru, 0, sizeof(ciastru));        AP_DEMAND(AP_PATH_MSGTYPE, szMsgType);    AP_DEMAND(AP_PATH_SEQNO, ciastru.szReqSeqNo);    if (strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0)     {        ciastru.nTransFlag = 1;        ptiastru->nTransCode = 99;#ifdef ABISV20                InitString(ptiastru->szDataA, '0', 21);#else        memset(&abisdstru, 0, sizeof(ABISDSTRU));        strcpy(abisdstru.szSeqNo, ciastru.szReqSeqNo);                EXEC SQL SELECT * FROM abisd INTO :abisdstru                 WHERE seqno = :abisdstru.szSeqNo;                if (!VERIFY_SQL_NORMAL())        {            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR);            return;        }                if (!VERIFY(abisdstru.nJrnNo > 0))        {            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION);            return;        }                tprintf(ptiastru->szDataA, "%7ld%8s%4ld", abisdstru.nJrnNo,                abisdstru.szVchNo, abisdstru.nTransCode);#endif    }            else if (strcmp(szMsgType, AP_MSGTYPE_SUBMITREQ) == 0)         ciastru.nTransFlag = 0;        else    {        ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR);        return;    }            AP_DEMAND(AP_PATH_AMT, szAmt);        if (strcmp(szAmt, "") == 0)        ciastru.dAmt = 0;    else        sscanf(szAmt, "%19.2lf", &ciastru.dAmt);    AP_DEMAND(AP_PATH_ACCNO, ciastru.szAccNo);    AP_DEMAND(AP_PATH_REQDATE, ciastru.szReqDate);    AP_DEMAND(AP_PATH_REQTIME, ciastru.szReqTime);    AP_DEMAND(AP_PATH_REQID, ciastru.szReqId);    bufclr(cCommArea);    tprintf(cCommArea, FMT_TIA, VAR_TIA);    tprintf(cCommArea + strlen(cCommArea), FMT_CIA, VAR_CIA);    /*     * 调用ABIS总控S052,在ABIS告之明确错误的情形下,自动转换     * ABIS的应答码并立即返回。否则,转换其他返回信息。     */    memset(&abisdstru, 0, sizeof(abisdstru));    AP_DEMAND_EXT(AP_PATH_RESPSEQNO, abisdstru.szRespSeqNo);    AP_DEMAND(AP_PATH_SEQNO, abisdstru.szSeqNo);    abisdstru.nTransCode = ptiastru->nTransCode;    EXEC SQL INSERT INTO abisd VALUES (:abisdstru);    if (sqlca.sqlcode != SQLCODE_DUPKEY)    {        if (!VERIFY_SQL_NORMAL())        {            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_SYSERR);            return;        }    }        PrintLog(stderr, "Linking ABIS...");    EXEC CICS ADDRESS EIB(dfheiptr);    EXEC CICS LINK PROGRAM("S052") COMMAREA(cCommArea)              LENGTH(sizeof(cCommArea)) SYNCONRETURN RESP(lRespCode);                 if (!VERIFY(lRespCode != DFHRESP(ROLLEDBACK)))    {        ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION);        return;    }    if (!VERIFY(lRespCode == DFHRESP(NORMAL)))    {        ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_SYSERR);        return;    }    tscanf(cCommArea, FMT_TOA, VAR_TOA);    if (ptoastru->cRespType != 'N')    {        if (ptoastru->cRespType == 'A')        {            if (!VERIFY_NORMAL(AP_INSERT(AP_PATH_AUTHLEVEL,                                         ptoastru->szAuthLevel)))                ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION);            return;        }        if (!VERIFY_NORMAL(AP_INSERT(AP_PATH_ABISRESPCODE, ptoastru->szData)))        {            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION);            return;        }                if (!VERIFY_NORMAL(ConvRespCode(szRespCode, ptoastru->szData)))            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_SYSERR);                else            ApUpdateRespCode(pxmlstruResp, szRespCode);                return;    }            if (strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0)     {        ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_ACCEPT);        return;    }    /*     * 如果在转换其他返回信息时,发生异常,则应当把应答码修正为     * AP_RESPCODE_EXCEPTION ,以促使总控能够发起冲正。     */         sprintf(szJrnNo, "%09ld", ptoastru->nJrnNo);    if (!VERIFY_NORMAL(AP_INSERT(AP_PATH_ACCDATE, ptoastru->szAccDate)) ||        !VERIFY_NORMAL(AP_INSERT(AP_PATH_VCHNO, ptoastru->szVchNo)) ||        !VERIFY_NORMAL(AP_INSERT(AP_PATH_JRNNO, szJrnNo)) ||        !VERIFY_NORMAL(AP_INSERT(AP_PATH_AUTHLEVEL, ptoastru->szAuthLevel)))    {            ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION);            return;    }    /*     * 根据ABIS的返回记录部分跟踪信息,为以后撤消提供所需数据。     */         strcpy(abisdstru.szAccDate, ptoastru->szAccDate);                       strcpy(abisdstru.szVchNo, ptoastru->szVchNo);    abisdstru.nJrnNo = ptoastru->nJrnNo;    EXEC SQL UPDATE abisd SET accdate = :abisdstru.szAccDate,                              vchno = :abisdstru.szVchNo,                              jrnno = :abisdstru.nJrnNo             WHERE seqno = :abisdstru.szSeqNo;    VERIFY_SQL_NORMAL();        ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_ACCEPT);    return;}/* End of this file */

⌨️ 快捷键说明

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