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

📄 router.ec

📁 界面库
💻 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 + -