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

📄 terminal.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
字号:
/************************************************************
 *	产生最大EDC终端号, 为新增EDC终端号时自动生成一个号码
		 get_max_terminal_id(term_id, mer_id)
 *	对帐分析 DispEdcList()
 *	EDC 密钥管理 (目前已不使用此函数 ) edc_key()
 *
 * 最后修改:	周国祥 2001/08/26
 ************************************************************/
#include <stdio.h>
#include <curses.h>
#include "mytools.h"
#include "tool.h"
#include "mult.h"
#include "macro_def.h"

$include "db_struct.h";

#define NT_KEY "55565557"

EXEC SQL INCLUDE sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;


/*
 * 产生最大EDC终端号, 为新增EDC终端号时自动生成一个号码
 */
int get_max_terminal_id(term_id, mer_id)
char *term_id;
char *mer_id;
{
	$char merchant_id[16];
	$char terminal_id[9];
	$short indi;
	int maxid;
	char que_str[1024];

	strncpy(merchant_id, mer_id, 15);
	merchant_id[15] = '\0';

	EXEC SQL SELECT max(terminal_id) 
	INTO :terminal_id:indi
	FROM edc_terminal
	WHERE merchant_id = :merchant_id;

	maxid = (indi == -1) ? 0 : atoi(&terminal_id[5]);

	/*
	 * 顺序查找一个空闲的EDC终端号
	 */
	while (++maxid) {
		if (maxid >= 1000) {
			term_id[0] = '\0';
			return(-1);
		}
#ifdef wyz020507_mod
		sprintf(term_id, "%5.5s%03d", merchant_id, maxid);
#else
		DelSpace(merchant_id);
		if (strlen(merchant_id) == 10) 
			sprintf(term_id, "%5.5s%03d", merchant_id, maxid);
		else
			sprintf(term_id, "%5.5s%03d", merchant_id+3, maxid);
#endif
		sprintf(que_str,
			"select count(*) from edc_terminal  \
				where terminal_id=\'%s\'", term_id);
		if (query_count(que_str) == 0)
			break;
	}

	return (0);
}

/*
 * 根据EDC终端号获取终端设备类型
 */
int get_terminal_name(char *id, char *type)
{
	$char terminal_id[9];
	$char edc_type[31];

	type[0] = 0;

	strcpy(terminal_id, id);

	EXEC SQL DECLARE edc_type_cur CURSOR FOR
	SELECT edc_type
	FROM edc_terminal
	WHERE terminal_id = :terminal_id;

	EXEC SQL OPEN edc_type_cur;

	EXEC SQL FETCH edc_type INTO :edc_type;
	if (sqlca.sqlcode == 0) {
		DelSpace(edc_type);
		strcpy(type, edc_type);
	}
	EXEC SQL CLOSE edc_type_cur;
	return(sqlca.sqlcode);
}

/*
 * 根据终端号获取商户号
 */
int get_merchant_id(char *term_id, char *mer_id)
{
	$char terminal_id[9];
	$char merchant_id[16];

	mer_id[0] = 0;

	strncpy(terminal_id, term_id, 8);
	terminal_id[8] = '\0';

	EXEC SQL DECLARE edc_mer_cur CURSOR FOR
	SELECT merchant_id
	FROM edc_terminal
	WHERE terminal_id = :terminal_id;

	EXEC SQL OPEN edc_mer_cur;

	EXEC SQL FETCH edc_mer_cur INTO :merchant_id;
	if (sqlca.sqlcode == 0) {
		DelSpace(merchant_id);
		sprintf(mer_id, "%-15.15s", merchant_id);
	}
	EXEC SQL CLOSE edc_mer_cur;
	return(sqlca.sqlcode);
}

/*
 * 根据终端号获取RMB及外卡的商户类型
 */
int get_terminal_mcc(char *r_mcc, char *f_mcc, char *id)
{
	$char rmbc_mcc[5], foreign_mcc[5], terminal_id[9];
	$char merchant_id[16], bank_type[5];

	r_mcc[0] = 0;
	f_mcc[0] = 0;

	strcpy(terminal_id, id, 8);
	terminal_id[8] = '\0';

	get_merchant_id(terminal_id, merchant_id);

	EXEC SQL SELECT mcc
	INTO :rmbc_mcc
	FROM merchant_base
	WHERE merchant_id = :merchant_id;
	if (sqlca.sqlcode == 0) {
		DelSpace(rmbc_mcc);
		strcpy(r_mcc, rmbc_mcc);
	}

	/* 外卡商户类型以VISA卡为准 */
	strcpy(bank_type, VISA_CARD);

	EXEC SQL SELECT oth_mcc
	INTO :foreign_mcc
	FROM merchant_switch
	WHERE merchant_id = :merchant_id AND bank_type = :bank_type;

	if (sqlca.sqlcode == 0) {
		DelSpace(foreign_mcc);
		strcpy(f_mcc, foreign_mcc);
	}

	return(sqlca.sqlcode);
}

/*
 * 对帐分析
 */
int DispEdcList()
{
	char filename[128], str[80], merchant_name[41], old_id[16];
	$char merchant_id[16], terminal_id[9], tran_sys_date[11], tmp[11];
	$S_sys_param sys;
	long today, day;
	int start_day, end_day, flag = 0;
	WINDOW *my_win;

	strcpy(audit_title,"对帐分析");

	sprintf(filename, "/tmp/.DispEdcList.%d", getpid());
	scr_dump(filename);

	disp_below("对帐分析");
	h_prompt(LINES-1, 1, "																 < ESC 退出 > ", 0, 0);
	h_prompt(LINES-1, 1, "对帐分析", 0, 0);
	my_win = newwin(19, 80, 3, 0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);

	set_prompt(PROMPT_OFF);
	strcpy(tmp, "1");
	mvwprintw(my_win, 2, 25, "未对帐天数: [   ] 到 [   ] 天");
	if (in_item(my_win, "", 2, 38, tmp, 3, NULL, NULL, 0, 0) !=
		ENTER) goto end;
	DelSpace(tmp);
	start_day = atoi(tmp);
	sprintf(tmp, "%-3d", start_day);
	mvwprintw(my_win, 2, 38, tmp);
	if (in_item(my_win, "", 2, 47, tmp, 3, NULL, NULL, 0, 0) !=
		ENTER) goto end;
	DelSpace(tmp);
	end_day = atoi(tmp);
	sprintf(tmp, "%-3d", end_day);
	mvwprintw(my_win, 2, 47, tmp);

	mvwprintw(my_win, 4, 25, "处理中, 请稍候 ...");
	wrefresh(my_win);

	if ( select_sys_param(&sys) ) {
		errcall(ERROR, "查本地参数表错误[%d]!",SQLCODE);
		goto end;
	}

	EXEC SQL DECLARE edc_cur CURSOR FOR
	SELECT terminal_id, merchant_id, min(local_sys_date)
	FROM cur_tran_ls
	WHERE acq_bank_id = :sys.bank_id AND acq_host_id = :sys.host_id
	AND terminal_id NOT IN ('TEL_AUTH', 'TLX_AUTH', 'VOC_AUTH')
	AND snd_settle_flag = 'N'
	GROUP BY terminal_id, merchant_id;

	EXEC SQL OPEN edc_cur;
	if (SQLCODE) {
		errcall(ERROR, "Open edc_cur error!");
		h_winprompt(my_win, 17, 4, "数据库操作错误!", 1, 0);
		goto end;
	}

	old_id[0] = 0;

	getdatef(tran_sys_date, "/");
	sprintf(tmp, "%2.2s%2.2s%4.4s",
		tran_sys_date + 5, tran_sys_date + 8, tran_sys_date);
	rstrdate(tmp, &today);


	sprintf(str, "%-15s%-18s%-11s%10s",
		"商户编号", "商户名称", "EDC 编号", "未结帐天数");
	CreateList(16, 74, 6, 3, str);

	while (1) {
		EXEC SQL FETCH edc_cur
		INTO :terminal_id, :merchant_id, :tran_sys_date;
		if (SQLCODE == 100)
			break;
		if (SQLCODE) {
			FreeList();
			EXEC SQL CLOSE edc_cur;
			errcall(ERROR, "Fetch edc_cur error!");
			h_winprompt(my_win, 17, 4, "数据库操作错误!", 1, 0);
			goto end;
		}

		sprintf(tmp, "%2.2s%2.2s%4.4s",
			tran_sys_date + 4, tran_sys_date + 6, tran_sys_date);
		rstrdate(tmp, &day);
		day = today - day;
		if ((start_day <= day) && (day <= end_day)) {
			if (strcmp(merchant_id, old_id)) {
				get_merchant_name(merchant_id, merchant_name);
				strcpy(old_id, merchant_id);
			}
			sprintf(str, "%-15s%-18s%-11s%10d",
				merchant_id, merchant_name, terminal_id, day);
			AddListItem(str, 0);
			flag = 1;
		}
	}

	EXEC SQL CLOSE edc_cur;

	if (!flag)
		AddListItem("没有满足条件的 EDC 交易资料!", 1);
	clear_wline(stdscr, LINES-1);
	h_wpromptr(stdscr, LINES-1, "上移: Home PgUp ↑ 下移: End PgDn ↓ 打印:CTRL_P  返回: ESC", 0, 0);
	DispList(0);
	FreeList();
end:
	delwin(my_win);
	clear_wline ( stdscr, LINES-1 );
	scr_restore(filename);
	unlink(filename);

	return(0);
}

/*
 * EDC 密钥管理 (目前已不使用此函数 )
 */
int edc_key(int item_no)
{
	WINDOW *my_win;
	$char key1[17], key2[17];
	char master[17], slave[17];
	char ch, filename[128], str[128];
	int l;

	if (func_enable("HSM_KEY") || func_enable("POS_KEY"))
		return(0);

	sprintf(filename, "/tmp/.edc_key.%d", getpid());
	scr_dump(filename);

	disp_below("EDC 密钥管理");
	h_prompt(LINES-1, 1, "																 < ESC 退出 > ", 0, 0);
	h_prompt(LINES-1, 1, "EDC 密钥管理", 0, 0);
	my_win = newwin(18, 80, 3, 0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);

	set_prompt(PROMPT_OFF);

	l = 2;
	master[0] = slave[0] = 0;
	if (!yorn(my_win, l, "	是否修改主密钥?", "1.是", "0.否", 0, 0)) {
		key1[0] = 0;
		mvwprintw(my_win, l, 4, "请输入主密钥: [%16s]", " ");
		ch = in_item(my_win, "", l, 19, key1, 16, NULL, NULL, 2, 1);
		if (ch != ENTER)
			goto quit;
		DelSpace(key1);
		if (strlen(key1) != 16) {
			h_winprompt(my_win, 17, 4, "主密钥长度必须为十六位!", 1, 0);
			goto quit;
		}
		l += 2;
		key2[0] = 0;
		mvwprintw(my_win, l, 4, "请再次输入主密钥: [%16s]", " ");
		ch = in_item(my_win, "", l, LINES-1, key2, 16, NULL, NULL, 2, 1);
		if (ch != ENTER)
			goto quit;
		DelSpace(key2);
		if (strcmp(key1, key2)) {
			h_winprompt(my_win, 17, 4, "主密钥核查有误!", 1, 0);
			goto quit;
		}
		asc_to_bcd(key1, key2, 16, 0);
		DES(NT_KEY, key1, key2);
		bcd_to_asc(master, key2, 16, 0);
		master[16] = 0;
		l += 2;
	}
	if (!yorn(my_win, l, "	是否修改工作密钥?", "1.是", "0.否", 0, 0)) {
		key1[0] = 0;
		mvwprintw(my_win, l, 4, "请输入工作密钥: [%16s]", " ");
		ch = in_item(my_win, "", l, 21, key1, 16, NULL, NULL, 2, 1);
		if (ch != ENTER)
			goto quit;
		DelSpace(key1);
		if (strlen(key1) != 16) {
			h_winprompt(my_win, 17, 4, "工作密钥长度必须为十六位!", 1, 0);
			goto quit;
		}
		l += 2;
		key2[0] = 0;
		mvwprintw(my_win, l, 4, "请再次输入工作密钥: [%16s]", " ");
		ch = in_item(my_win, "", l, 25, key2, 16, NULL, NULL, 2, 1);
		if (ch != ENTER)
			goto quit;
		DelSpace(key2);
		if (strcmp(key1, key2)) {
			h_winprompt(my_win, 17, 4, "工作密钥核查有误!", 1, 0);
			goto quit;
		}
		strcpy(slave, key1);
	}

	if (!master[0] && !slave[0])
		goto quit;

	$select master into :key1 from hn_key;
	if (SQLCODE < 0) {
		h_winprompt(my_win, 17, 4, "数据库操作错误!", 1, 0);
		goto quit;
	}
	if (SQLCODE == 100) {
		if (!master[0] || !slave[0]) {
			h_winprompt(my_win, 17, 4, "主密钥或工作密钥不允许为空!", 1, 0);
			goto quit;
		}
		sprintf(str, "insert into hn_key values ('%s', '%s')",
			master, slave);
	} else {
		if (!master[0])
			sprintf(str, "update hn_key set slave = '%s'", slave);
		else if (!slave[0])
			sprintf(str, "update hn_key set master = '%s'", master);
		else
			sprintf(str, "update hn_key set master = '%s', slave = '%s'",
			master, slave);
	}

	begin_tran();

	if (sql_run(str)) {
		rollback_tran();
		h_winprompt(my_win, 17, 4, "数据库操作错误!", 1, 0);
		goto quit;
	}

	if (misc_audit(str, my_win, 17, 4)) {
		rollback_tran();
		wgetch(my_win);
		goto quit;
	}

	commit_tran();

	h_winprompt(my_win, 17, 4, "密钥修改成功!", 0, 0);
	if (master[0])
		h_winprompt(my_win, 17, 18, "请重新启动系统!", 0, 0);
	wgetch(my_win);
quit:
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);

	return (0);
}


/*
 * 根据终端号获取的商户类型
 */
int get_term_mcc(char *id, char *r_mcc)
{
	$char rmbc_mcc[5], terminal_id[9];
	$char merchant_id[16];

	r_mcc[0] = 0;

	strcpy(terminal_id, id);
	DelSpace(terminal_id);

	get_merchant_id(terminal_id, merchant_id);
	DelSpace(merchant_id);
	EXEC SQL SELECT mcc
	INTO :rmbc_mcc
	FROM merchant_base
	WHERE merchant_id = :merchant_id;
	if (sqlca.sqlcode == 0) {
		DelSpace(rmbc_mcc);
		strcpy(r_mcc, rmbc_mcc);
	}

	return(sqlca.sqlcode);
}


/*
 * 根据商户号获取的商户类型
 */
int get_merch_mcc(char *id, char *r_mcc)
{
	$char rmbc_mcc[5];
	$char merchant_id[16];

	r_mcc[0] = 0;

	strcpy(merchant_id, id);
	DelSpace(merchant_id);

	EXEC SQL SELECT mcc
	INTO :rmbc_mcc
	FROM merchant_base
	WHERE merchant_id = :merchant_id;
	if (sqlca.sqlcode == 0) {
		DelSpace(rmbc_mcc);
		strcpy(r_mcc, rmbc_mcc);
	}

	return(sqlca.sqlcode);
}
/*
 * 根据商户号获取的网点类型
 */
int get_merch_custom(char *id, char *cus_type)
{
	char rmbc_mcc[2], merchant_id[16];

	int mcc_int = 0;


	strcpy(merchant_id, id);
	DelSpace(merchant_id);
	get_merch_mcc(merchant_id,rmbc_mcc);
	DelSpace(rmbc_mcc);
	mcc_int = atoi(rmbc_mcc);
	
	switch(mcc_int)
	{
		case 3261:   /* 中国航空 */
		case 4511:   /* 其他航空公司 */
		case 5309:   /* 免税商店 */
		case 5311:   /* 百货商店 */
		case 5812:   /* 餐饮     */
		case 5999:   /* 其他商店 */
		case 7997:   /* 俱乐部   */
		case 7999:   /* 娱乐服务 */
		case 8062:   /* 医院     */
		case 7399:   /* 商业服务 */
		case 5912:   /* 药店     */
		case 4814:   /* 电信服务 */
			strcpy(cus_type,"0"); /* 商场 */
			break;
		case 3501:	/* 假日酒店 */
		case 3504:	/* 希尔顿酒店 */
		case 3640:	/* 凯悦酒店 */
		case 3505:	/* 喜来登酒店 */
                case 3545:	/* 香格里拉酒店 */
                case 7011:	/* 其他酒店 */
                case 4722:	/* 旅行社 */
			strcpy(cus_type,"1"); /* 酒店 */
			break;
		case 6010:	/* 现金支付机构 */
			strcpy(cus_type,"2"); /* 网点 */
			break;
			
		default:
			strcpy(cus_type,"0"); /* 商场 */
			break;
	}
				
	return(0);
}

/*
 * 根据终端号获取的商户类型
 */
int get_term_mode(char *custom)
{
	$char custom_type[2];
	$int mode_int = 0;

	strcpy(custom_type, custom);
	DelSpace(custom_type);
	
	EXEC SQL select max(mode_type) into :mode_int from edc_dl_param where custom_type = :custom_type ;
	if ((sqlca.sqlcode != 0) || (mode_int == 0))
	{
		mode_int = 1 ;	/* 下装模板号 */
	}

	return(mode_int);
}

⌨️ 快捷键说明

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