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