📄 router.ec
字号:
/*=============================================================
功能: 内部路由模块
作者:
最后修改人:
最后修改日期:
===============================================================*/
#include <stdio.h>
#include <math.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include "all.h"
#include "macro_def.h"
$include "db_struct.h"
$include sqlca;
extern S_default_route G_default_router;
extern S_sys_param G_sys_param;
/***************************************************************
功能:
根据卡号和交易类型从内存卡段路由、交易路由、缺省路由、
转账路由等路由表中查找交易路由
ENTRY:
public 结构
RETURN:
0 SUCC 程序模板号=>moduleid中
-1 FAIL
****************************************************************/
int search_router(PUBLIC *cli, long *moduleid)
{
S_card_route loc;
S_tran_route tran_loc;
S_adv_route adv_loc;
S_bankcard_route bankcard_loc;
S_bank_base bank_base;
int i, type, cardlen;
unsigned long addr;
char card_type[3];
char buffer[16];
type = cli->Tran_type;
//撤销,冲正时取原交易类型
if (type == POS_VOID || type == REVERSAL){
type = cli->Void_tran_type;
if (type == POS_VOID)
type = cli->Void_old_tran_type;
}
//湖南[6955(00)]金卡ATM收单的中行信用卡交易的特殊路由处理
if (!strcmp(cli->Acq_bank_id, "GOLD") &&
!strcmp(G_sys_param.bank_id, "6955") &&
!strcmp(G_sys_param.host_id, "00") &&
!strcmp(cli->Card_type, CREDIT_CARD)){
switch(type){
case INQUERY:
if (!strcmp(cli->Pos_condition_code, "02")){
if (readtab("sysparam.tab", "SPECIAL_ROUTE",
"INQUERY", buffer)<0) {
strcpy(cli->Resp_code, SYS_FAIL);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
strcpy(cli->Rcv_bank_id, G_sys_param.bank_id);
strcpy(cli->Rcv_host_id, G_sys_param.host_id);
*moduleid = atoi(buffer);
return 0;
}
else
break;
case WITHDRAWAL:
if (!strcmp(cli->Pos_condition_code, "02")){
if (readtab("sysparam.tab", "SPECIAL_ROUTE",
"WITHDRAWAL", buffer)<0) {
strcpy(cli->Resp_code, SYS_FAIL);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
strcpy(cli->Rcv_bank_id, G_sys_param.bank_id);
strcpy(cli->Rcv_host_id, G_sys_param.host_id);
*moduleid = atoi(buffer);
return 0;
}
else
break;
case REVERSAL:
if (cli->Void_tran_type == WITHDRAWAL){
if (readtab("sysparam.tab", "SPECIAL_ROUTE",
"WITHDRAWAL", buffer)<0) {
strcpy(cli->Resp_code, SYS_FAIL);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
strcpy(cli->Rcv_bank_id, G_sys_param.bank_id);
strcpy(cli->Rcv_host_id, G_sys_param.host_id);
*moduleid = atoi(buffer);
return 0;
}
else
break;
default:
break;
}
}
switch (type) {
case ACQ_ADVICE:
case ACQ_REV_ADVICE:
strcpy(card_type, cli->Card_type);
if (select_adv_router(&adv_loc, type, card_type) < 0) {
errcall(ERROR, "取收单行通知路由错!!");
strcpy(cli->Resp_code, ROUTER_ERR);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
*moduleid = (long)adv_loc.module_id;
strcpy(cli->Rcv_bank_id, adv_loc.rcv_bank_id);
strcpy(cli->Rcv_host_id, adv_loc.rcv_host_id);
strcpy(bank_base.bank_id, adv_loc.rcv_bank_id);
strcpy(bank_base.host_id, adv_loc.rcv_host_id);
//根据联行行号和主机号取联行技术资料
if (select_bank(&bank_base) < 0){
errcall(ERROR, "取联行技术资料错[%s(%s)]",
bank_base.bank_id, bank_base.host_id);
strcpy(cli->Resp_code, ROUTER_ERR);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
//如果接收行非本行, 签到状态为'O', 返回系统暂停错
if (strcmp(bank_base.bank_id, G_sys_param.bank_id) ||
strcmp(bank_base.host_id, G_sys_param.host_id)){
//且非签到交易
if (bank_base.login_stat[0] == 'O' &&
(cli->Tran_type == NET_LOGIN)) {
errcall(ERROR, "主机签到状态不正常[%s(%s)]",
bank_base.bank_id, bank_base.host_id);
strcpy(cli->Resp_code, SYS_PAUSE);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
}
strcpy(cli->Rcv_ip_addr1, bank_base.tran_ip_addr1);
strcpy(cli->Rcv_ip_addr2, bank_base.tran_ip_addr2);
cli->Time_out = bank_base.time_out;
memcpy(cli->Nas_version, bank_base.nas_version, 4);
return 0;
default:
break;
} //end of switch(type)
switch (type) {
case CHECK_WB:
case AUTH_PUR:
case OFFLINE:
case POS_LOGIN:
case POS_LOGOUT:
case POS_SETTLE:
case POS_BATCH_UP:
case POS_SETTLE_2:
case CUT_START:
case CUT_END:
case NET_SETTLE:
case NET_LOGIN:
case NET_LOGOUT:
case NET_CHGKEY:
case TEST_TRAN:
//这些特殊交易,取交易路由
if (select_tran_router(&tran_loc, "tran_route", type) < 0)
{
errcall(ERROR, "取交易路由错!!(%d)", type);
strcpy(cli->Resp_code, ROUTER_ERR);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
*moduleid = (long)tran_loc.module_id;
strcpy(cli->Rcv_bank_id, tran_loc.rcv_bank_id);
strcpy(cli->Rcv_host_id, tran_loc.rcv_host_id);
strcpy(bank_base.bank_id, tran_loc.rcv_bank_id);
strcpy(bank_base.host_id, tran_loc.rcv_host_id);
//根据联行行号和主机号取联行技术资料
if (select_bank(&bank_base) < 0){
errcall(ERROR, "取联行技术资料错[%s(%s)]",
bank_base.bank_id, bank_base.host_id);
strcpy(cli->Resp_code, ROUTER_ERR);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
//如果接收行非本行, 签到状态为'O', 返回系统暂停错
if (strcmp(bank_base.bank_id, G_sys_param.bank_id) ||
strcmp(bank_base.host_id, G_sys_param.host_id)){
//且非签到交易
if (bank_base.login_stat[0] == 'O' &&
(cli->Tran_type == NET_LOGIN)) {
errcall(ERROR, "主机签到状态不正常[%s(%s)]",
bank_base.bank_id, bank_base.host_id);
strcpy(cli->Resp_code, SYS_PAUSE);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
}
strcpy(cli->Rcv_ip_addr1, bank_base.tran_ip_addr1);
strcpy(cli->Rcv_ip_addr2, bank_base.tran_ip_addr2);
cli->Time_out = bank_base.time_out;
memcpy(cli->Nas_version, bank_base.nas_version, 4);
return 0;
} //end of switch(type)
if ((cardlen = strlen(cli->Card_no)) > 19)
cardlen = 19;
strncpy(loc.first_card_no, cli->Card_no, cardlen);
loc.first_card_no[cardlen] = '\0';
//根据卡类型,交易类型查询卡段交易路由
if (select_card_router(&loc, type, "card_route", cli->Card_type) < 0) {
#ifdef wyz020813_mod
errcall(DEBUG, "没有找到卡段交易路由, 使用缺省路由");
//如果卡段交易路由表中没有,则取缺省路由
loc.module_id = G_default_router.module_id;
strcpy(loc.rcv_bank_id, G_default_router.rcv_bank_id);
strcpy(loc.rcv_host_id, G_default_router.rcv_host_id);
#else
/*** 如果没有找到卡段交易路由则在查找银行卡路由 ****/
if (select_bankcard_router(&bankcard_loc, cli->Bank_type, cli->Card_type) < 0) {
errcall(DEBUG, "没有找到银行卡交易路由, 使用缺省路由");
//如果卡段交易路由表中没有,且没有银行卡交易路由, 则取缺省路由
loc.module_id = G_default_router.module_id;
strcpy(loc.rcv_bank_id, G_default_router.rcv_bank_id);
strcpy(loc.rcv_host_id, G_default_router.rcv_host_id);
}
else {
loc.module_id = bankcard_loc.module_id;
strcpy(loc.rcv_bank_id, bankcard_loc.rcv_bank_id);
strcpy(loc.rcv_host_id, bankcard_loc.rcv_host_id);
}
#endif
}
*moduleid = (long)loc.module_id;
strcpy(cli->Rcv_bank_id, loc.rcv_bank_id);
strcpy(cli->Rcv_host_id, loc.rcv_host_id);
strcpy(bank_base.bank_id, loc.rcv_bank_id);
strcpy(bank_base.host_id, loc.rcv_host_id);
if (select_bank(&bank_base) < 0) {
errcall(ERROR, "取联行技术资料错[%s(%s)]",
bank_base.bank_id, bank_base.host_id);
strcpy(cli->Resp_code, ROUTER_ERR);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
//如果接收行非本行, 签到状态为'O', 返回系统暂停错
if (strcmp(bank_base.bank_id, G_sys_param.bank_id) ||
strcmp(bank_base.host_id, G_sys_param.host_id)) {
if (bank_base.login_stat[0] == 'O') {
errcall(ERROR, "主机签到状态不正常[%s(%s)]",
bank_base.bank_id, bank_base.host_id);
strcpy(cli->Resp_code, SYS_PAUSE);
strcpy(cli->Resp_bank_id, G_sys_param.bank_id);
strcpy(cli->Resp_host_id, G_sys_param.host_id);
return -1;
}
}
strcpy(cli->Rcv_ip_addr1, bank_base.tran_ip_addr1);
strcpy(cli->Rcv_ip_addr2, bank_base.tran_ip_addr2);
cli->Time_out = bank_base.time_out;
memcpy(cli->Nas_version, bank_base.nas_version, 4);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -