📄 linkabis.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 + -