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

📄 settle.qxh.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
📖 第 1 页 / 共 3 页
字号:
int 	tran_to_settle(char *bank_flag)
{

	EXEC SQL BEGIN DECLARE SECTION;

	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, "系统目前配置为自动清算方式.");
		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);
    	}
    	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 + -