📄 settle.ec.old
字号:
S_sys_param sys;
EXEC SQL END DECLARE SECTION;
char s_date[11], e_date[11], logic_date[11];
char *card_type[3]={"01", "02", "50"};
char *card_name[3]={"信用卡", "借记卡", "外卡"};
int i;
if(get_nas_sysparam(&sys) < 0) {
daylog(ERROR, "取NAS本地参数表失败.");
return (-1);
}
dateadd(sys.logic_date, -1, logic_date);
daylog(ERROR, "日终清算处理时NAS逻辑日: [%s]", logic_date);
for(i = 0; i < 3; i++) {
if(insert_into_settle(card_type[i], card_name[i], bank_flag, s_date, e_date, &sys) < 0) {
daylog(ERROR, "%s交易流水转清算流水失败! s_date=[%s], e_date=[%s].", card_name[i], s_date, e_date);
return -1;
}
daylog(ERROR, "%s交易流水转清算流水成功. s_date=[%s], e_date=[%s],", card_name[i], s_date, e_date);
}
if(errtran_to_errsettle(&sys) < 0) {
daylog(ERROR, "当日异常批次转清算异常批次失败!");
return -1;
}
daylog(ERROR, "当日异常批次转清算异常批次成功!");
return 0;
}
/*
* 日终清算处理
*/
int chg_logic_date()
{
EXEC SQL BEGIN DECLARE SECTION;
S_sys_param sys;
EXEC SQL END DECLARE SECTION;
char auto_flag[2], bank_flag[2], screen[128];
sprintf(screen, "/tmp/.chg_logic_date.%d", getpid());
scr_dump(screen);
disp_below("日终清算处理");
clear_wline(stdscr, LINES-1);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
line = COL_LEE;
if (strcmp(G_cen_bankid, G_bankid)) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "[%s]行柜员无权进行日终处理, 统一由省行进行日终处理", G_bankid);
daylog(ERROR, "[%s]行柜员无权进行日终处理", G_bankid);
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return -1;
}
if (yorn(my_win, line, " 是否进行日终清算处理?", "1.是", "0.否", 1, 0)) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
if(readtab("SETTLE_CONFIG", "ALL", "AUTO_SETTLE", auto_flag) < 0) {
disp_log_day(DISP_LOG, ERROR, "SETTLE_CONFIG文件中[ALL]下没有AUTO_SETTLE配置.");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return (-1);
}
if(readtab("SETTLE_CONFIG", "ALL", "OTHER_BANK", bank_flag) < 0) {
disp_log_day(DISP_LOG, ERROR, "SETTLE_CONFIG文件中[ALL]下没有OTHER_BANK配置.");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return (-1);
}
if(auto_flag[0] == 'Y') {
disp_log_day(DISP_LOG, ERROR, "系统目前配置为自动清算方式.");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
if(get_nas_sysparam(&sys) < 0) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "取本地逻辑日失败, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
dateadd(sys.logic_date, 1, sys.logic_date);
EXEC SQL UPDATE sys_param SET logic_date = :sys.logic_date;
if (SQLCODE) {
line = PGS_LEE;
disp_log_day(DISP_LOG,ERROR,"切换本地逻辑日失败, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
act_set_reload_num();
daylog(ERROR, "切换NAS系统本地逻辑日成功.");
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "正在进行清算处理, 请稍候 ...");
EXEC SQL begin work;
/*
* 清算处理成功后,转当前交易流水表中收单记录到清算流水表中
*/
if (tran_to_settle(bank_flag) < 0) {
EXEC SQL rollback work;
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "清算处理失败, 请立即联系系统管理员!");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
EXEC SQL commit work;
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "日终清算处理成功, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return (0);
}
/*
* 上传清算文件
*/
int settle_up()
{
char filename[256];
$S_sys_param sys;
$select * into :sys from sys_param;
if (SQLCODE) {
daylog(ERROR, "Unable select sys_param table!");
return(-1);
}
del_st_space("sys_param", &sys);
if ((!strcmp(sys.bank_id, sys.adm_bank_id)) && (!strcmp(sys.host_id, sys.adm_host_id))) return(0);
sprintf(filename, "/tmp/.settle_up.%d", getpid());
scr_dump(filename);
disp_below("上传清算文件");
clear_wline(stdscr, LINES-1);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
line = COL_LEE;
disp_log_day(DISP_LOG, DEBUG, "正在上传清算文件, 请稍候 ...");
if (up_settle_file()) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "上传失败, 按任意键继续");
} else {
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG, "已转交后台邮件系统处理, 按任意键继续");
}
getch();
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
/*
* 下传清算文件
*/
int settle_down()
{
char filename[256];
$S_sys_param sys;
$select * into :sys from sys_param;
if (SQLCODE) {
daylog(ERROR, "Unable select sys_param table!");
return(-1);
}
del_st_space("sys_param", &sys);
sprintf(filename, "select count(*) from bank_info where adm_bank_id = \'%s\' and adm_host_id = \'%s\'", sys.bank_id,sys.host_id);
if (!query_count(filename)) return(0);
sprintf(filename, "/tmp/.settle_down.%d", getpid());
scr_dump(filename);
disp_below("下传清算文件");
clear_wline(stdscr, LINES-1);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
line = COL_LEE;
disp_log_day(DISP_LOG, DEBUG, "正在下传清算文件, 请稍候 ...");
if (down_settle_file()) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "下传失败, 按任意键继续");
} else {
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG, "已转交后台邮件系统处理, 按任意键继续");
}
getch();
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
/*
* 分行上传文件汇总
*/
int settle_get_up()
{
char filename[256];
$S_sys_param sys;
$select * into :sys from sys_param;
if (SQLCODE) {
daylog(ERROR, "Unable select sys_param table!");
return(-1);
}
del_st_space("sys_param", &sys);
sprintf(filename, "select count(*) from bank_info where adm_bank_id = \'%s\' and adm_host_id = \'%s\'", sys.bank_id,sys.host_id);
if (!query_count(filename)) return(0);
sprintf(filename, "/tmp/.settle_get_up.%d", getpid());
scr_dump(filename);
disp_below("分行上传文件汇总");
clear_wline(stdscr, LINES-1);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
line = COL_LEE;
disp_log_day(DISP_LOG, DEBUG, "正在进行分行上传文件汇总, 请稍候 ...");
line++;
if (load_settle_file(0)) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "汇总失败, 按任意键继续");
} else {
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG, "汇总成功, 按任意键继续");
}
getch();
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
/*
* 中心下传文件汇总
*/
int settle_get_down()
{
char filename[256];
$S_sys_param sys;
$select * into :sys from sys_param;
if (SQLCODE) {
daylog(ERROR, "Unable select sys_param table!");
return(-1);
}
del_st_space("sys_param", &sys);
if ((!strcmp(sys.bank_id, sys.adm_bank_id)) && (!strcmp(sys.host_id, sys.adm_host_id))) return(0);
sprintf(filename, "/tmp/.settle_get_down.%d", getpid());
scr_dump(filename);
disp_below("中心下传文件汇总");
clear_wline(stdscr, LINES-1);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
line = COL_LEE;
disp_log_day(DISP_LOG, DEBUG, "正在进行中心下传文件汇总, 请稍候 ...");
line++;
if (load_settle_file(1)) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "汇总失败, 按任意键继续");
} else {
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG, "汇总成功, 按任意键继续");
}
getch();
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
/*
* 清算流水转出
*/
int bd_stl_out()
{
char filename[256], path[256];
sprintf(filename, "/tmp/.bd_stl_out.%d", getpid());
scr_dump(filename);
disp_below("清算流水转出");
clear_wline(stdscr, LINES-1);
my_win = newwin(18, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
line = COL_LEE;
disp_log_day(DISP_LOG, DEBUG, "正在进行清算流水转出, 请稍候 ...");
line++;
if (down_bd_stl_file()) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "清算流水转出失败, 按任意键继续");
} else {
sprintf(path, "%s/box/mx/local", getenv("WORKDIR"));
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG, "清算流水成功转出至路径 %s 下, 按任意键继续", path);
}
getch();
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
static int disp_log_day(flag, logfile, logline, type, format, va_alist)
int flag;
char *logfile;
int logline;
int type;
char *format;
va_dcl
{
va_list args;
char str[128];
va_start(args);
if (flag != DISP_ONLY)
daylog(logfile, logline, type, format, args);
if (flag != LOG_ONLY) {
vsprintf(str, format, args);
if (line > PGS_LEE) {
clear_screen(my_win);
line = COL_LEE;
}
h_winprompt(my_win, line++, ROW_LEE, str, 0, 0);
}
va_end(args);
return(0);
}
/*
* 锁定EDC批次,以使该批交易暂不参加清算
*/
int lock_edc_batch()
{
WINDOW *my_win;
char rpt[128], filename[128], logic_date[11];
char batch_no[10];
$char term_id[10];
$int b_no;
int ret;
sprintf(filename, "/tmp/.lock_edc_batch.%d", getpid());
scr_dump(filename);
disp_below("锁定 EDC 批次");
clear_wline(stdscr, LINES-1);
h_prompt(LINES-1, 1, " < ESC 退出 > ", 0, 0);
h_prompt(LINES-1, 1, "锁定 EDC 批次", 0, 0);
my_win = newwin(19, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
set_prompt(PROMPT_OFF);
sprintf(term_id, "%8.8s", " ");
mvwprintw(my_win, 2, 4, "请输入 EDC 号: [%s]", term_id);
if (in_item(my_win, "", 2, 20, term_id, 8, NULL, NULL, 0, 0) != ENTER)
goto end_lock_edc;
if (term_id[0] == '\0' || term_id[0] == ' ')
goto end_lock_edc;
sprintf(batch_no, "%6.6s", " ");
mvwprintw(my_win, 3, 4, "请输入批次号: [%s]", batch_no);
if (in_item(my_win, "", 3, 19, batch_no, 6, NULL, NULL, 0, 0) != ENTER)
goto end_lock_edc;
if (batch_no[0] == '\0' || batch_no[0] == ' ')
goto end_lock_edc;
mvwprintw(my_win, 4, 4, "正在锁定批次, 请稍候 ...");
wrefresh(my_win);
b_no = atoi(batch_no);
/* 暂置EDC错帐标志为'1'(EDC多此笔交易) */
$update cur_settle_ls set edc_err_flag = '1'
where terminal_id = $term_id and batch_no = $b_no and edc_err_flag='0';
if (SQLCODE) {
mvwprintw(my_win, 5, 4, "锁定批次失败!");
wrefresh(my_win);
daylog(ERROR, "Unable lock edc batch![%s][%d]", term_id, b_no);
getch();
goto end_lock_edc;
}
mvwprintw(my_win, 5, 4, "锁定批次 %d / %d 笔交易成功!",
b_no, sqlca.sqlerrd[2]);
wrefresh(my_win);
getch();
end_lock_edc:
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
/*
* 解锁EDC批次
*/
int unlock_edc_batch()
{
WINDOW *my_win;
char filename[128];
char batch_no[10];
$char term_id[10];
$int b_no;
int ret;
sprintf(filename, "/tmp/.unlock_edc_batch.%d", getpid());
scr_dump(filename);
disp_below("解锁 EDC 批次");
clear_wline(stdscr, LINES-1);
h_prompt(LINES-1, 1, " < ESC 退出 > ", 0, 0);
h_prompt(LINES-1, 1, "解锁 EDC 批次", 0, 0);
my_win = newwin(19, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
wrefresh(my_win);
set_prompt(PROMPT_OFF);
sprintf(term_id, "%8.8s", " ");
mvwprintw(my_win, 2, 4, "请输入 EDC 号: [%s]", term_id);
if (in_item(my_win, "", 2, 20, term_id, 8, NULL, NULL, 0, 0) != ENTER)
goto end_unlock_edc;
if (term_id[0] == '\0' || term_id[0] == ' ')
goto end_unlock_edc;
sprintf(batch_no, "%6.6s", " ");
mvwprintw(my_win, 3, 4, "请输入批次号: [%s]", batch_no);
if (in_item(my_win, "", 3, 19, batch_no, 6, NULL, NULL, 0, 0) != ENTER)
goto end_unlock_edc;
mvwprintw(my_win, 4, 4, "正在解锁批次, 请稍候 ...");
wrefresh(my_win);
if (batch_no[0] == '\0' || batch_no[0] == ' ')
goto end_unlock_edc;
b_no = atoi(batch_no);
$update cur_settle_ls set edc_err_flag = '0'
where terminal_id = $term_id and batch_no = $b_no and edc_err_flag='1';
if (SQLCODE) {
mvwprintw(my_win, 5, 4, "解锁批次失败!");
wrefresh(my_win);
daylog(ERROR, "Unable lock edc batch![%s][%d]", term_id, b_no);
getch();
goto end_unlock_edc;
}
mvwprintw(my_win, 5, 4, "解锁批次 %d / %d 笔交易成功!",
b_no, sqlca.sqlerrd[2]);
wrefresh(my_win);
getch();
end_unlock_edc:
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
/*******************************************************************
功能:
根据日终结算结果文件判断,清算报表使用当前清算流水表(cur_settle_ls)
还是使用历史清算流水表(his_settle_ls)
输入:
char *start_date 起始日期
char *end_date 结束日期
输出:
0 使用cur_settle_ls
1 使用his_settle_ls
-1 操作失败
*********************************************************************/
int check_which_table(char *start_date, char *end_date)
{
SETTLE_RESULT s_r;
FILE *fp;
char tmp_str[128];
int ret = 0;
sprintf(tmp_str, "%s/etc/settle_result", getenv("WORKDIR"));
if ((fp = fopen(tmp_str, "r")) == NULL) {
daylog(ERROR, "打开日终清算结果文件失败,[%d]", errno);
return -1;
}
if ((fread(&s_r, sizeof(SETTLE_RESULT), 1, fp)) != 1) {
daylog(ERROR, "读日终清算结果文件失败,[%d]", errno);
ret = -1;
}
if ((strcmp(s_r.settle_date, start_date) >= 0 &&
strcmp(s_r.settle_date, end_date) <= 0) ||
strcmp(s_r.settle_date, start_date) == 0) {
if (s_r.result == 0) {
ret = 0;
}
else {
ret = -1;
}
}
if (strcmp(s_r.settle_date, start_date) > 0) {
ret = 1;
}
fclose(fp);
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -