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

📄 settle.ec

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



    	EXEC SQL SELECT * INTO :sys FROM sys_param;
    	if (SQLCODE) return (-1);
    	del_st_space("sys_param", &sys);
	memcpy(sy, &sys, sizeof(sys));

	return (0);
}



int	get_settle_info(char *card_type, char *field_name, char *s_date, char *e_date)
{
	char	date_fname[80],logic_date[9];
	S_sys_param	sys;


	if(readtab("SETTLE_CONFIG",card_type,"SETTLE_DATE",field_name) < 0){
		daylog(ERROR,"SETTLE_CONFIG文件中没有[%s]下的SETTLE_DATE配置.",
			card_type);
		return (-1);
	}
	if(readtab("SETTLE_CONFIG",card_type,"DATE_FILE",date_fname) < 0) {
		daylog(ERROR,"SETTLE_CONFIG文件中没有[%s]下的DATE_FILE配置.",
			card_type);
		return (-1);
	}
	if(readtab("SETTLE_CONFIG",card_type,"CUR_SETTLE_DATE",s_date) < 0){
		daylog(ERROR,"SETTLE_CONFIG文件中没有[%s]下的LST_SETTLE_DATE配置.", card_type);
		return (-1);
	}


	if(!strcmp(field_name, "local_sys_date") && date_fname[0] == 'N') 
		getdatef(e_date, "");
	else if(!strcmp(field_name,"snd_settle_date") && date_fname[0]=='N') { 
		if(get_nas_sysparam(&sys) < 0) {
			daylog(ERROR, "取NAS本地参数表失败.");
			return (-1);
		}
		strcpy(e_date, sys.logic_date);
	}
	else {
		if(date_fname[0] == 'N') {
			daylog(ERROR, "SETTLE_CONFIG文件中[%s]下清算日期字段为%s,清算日期文件必须指定.", card_type, field_name);
			return (-1);
		}
		if(get_date(date_fname, e_date) < 0) return (-1);
	}
	
	return (0);
}



int	update_settle_date(char *card_type, char *s_date, char *e_date)
{
	if(writetab("SETTLE_CONFIG",card_type,"LST_SETTLE_DATE",s_date) < 0){
		daylog(ERROR,"更新SETTLE_CONFIG文件中[%s]下的LST_SETTLE_DATE配置.", card_type);
		return (-1);
	}
	if(writetab("SETTLE_CONFIG",card_type,"CUR_SETTLE_DATE",e_date) < 0){
		daylog(ERROR,"更新SETTLE_CONFIG文件中[%s]下的CUR_SETTLE_DATE配置.", card_type);
		return (-1);
	}
	
	return (0);
}

int	get_acq_bank(char *card_type, S_sys_param *sys, char *acq_bank)
{
	char	tmp[10], buff[10], buffer[40], acq_str[100];
	char	bank[3][10]={"GOLD", "HOST", "NAPH"};
	int	i;


	memset( acq_str, 0, sizeof( acq_str ) );
	memset(tmp, 0, sizeof(tmp));
	if(readtab("SETTLE_CONFIG", card_type, "ACQ_BANK", tmp) < 0) {
		daylog(ERROR, "SETTLE_CONFIG文件中没有[%s]下的ACQ_BANK配置.",
			card_type);
		return (-1);
	}

	sprintf( acq_str, " '%s' ",  sys->bank_id );
	for(i = 0; tmp[i] != '\0' && i < 10; i++) {
		if(tmp[i] == '1') {
			strcat( acq_str, ", " );
			sprintf( buff, " '%s' ", bank[i]);
			strcat( acq_str, buff );
		}
	}
	strcpy( acq_bank, acq_str );
	
	return (0);
}


int	get_tran_type(char *card_type, char *tran_type)
{
	char	tmp[10], buff[10];
	int	type[6]={PURCHASE,CONFIRM,OFFLINE,WITHDRAWAL,DEPOSIT,TRANS_OUT};
	int	i;


	memset(tmp, 0, sizeof(tmp));
	if(readtab("SETTLE_CONFIG", card_type, "TRAN_TYPE", tmp) < 0) {
		daylog(ERROR, "SETTLE_CONFIG文件中没有[%s]下的TRAN_TYPE配置.",
			card_type);
		return (-1);
	}
	for(i = 0; tmp[i] != '\0' && i < 10; i++) {
		if(tmp[i] == '1') {
			sprintf(buff, "%d", type[i]);
			if(tran_type[0] == '\0')
				sprintf(tran_type, "%d", type[i]);
			else {
				sprintf(buff, ",%d", type[i]);
				strcat(tran_type, buff);
			}
		}
	}
	
	return (0);
}




int	insert_into_settle(card_type, card_name, s_date, e_date, sys)
	char	*card_type;
	char	*card_name;
	char	*s_date;
	char	*e_date;
	S_sys_param 	*sys;
{	
	EXEC SQL BEGIN DECLARE SECTION;

	char		date[9], l_date[9], sql_str[1024];
	char		settle_mode[2];
	S_tran_ls	tran_ls;

	EXEC SQL END DECLARE SECTION;
	char	tran_type[50], field_name[40], acq_bank[40], bank_type[10]; 
	char	cardtype[30], logic_date[11];



	memset(field_name, 0, sizeof(field_name));
	memset(tran_type, 0, sizeof(tran_type));

	if(get_settle_info(card_type, field_name, s_date, e_date) < 0) {
		daylog(ERROR, "取%s清算日期错!", card_name);
		return -1;
	}
	if(get_acq_bank(card_type, sys, acq_bank ) < 0 ) {
		daylog(ERROR, "取%s收单行错!", card_name );
		return -1;
	}
	if(get_tran_type(card_type, tran_type) < 0)  {
		daylog(ERROR, "取%s交易类型错!", card_name);
		return (-1);
	}
	if(!memcmp(card_type, "50", 2))
		strcpy(cardtype, "'51', '52', '53', '54', '55'");
	else
		sprintf(cardtype, "'%s'", card_type);
	dateadd(sys->logic_date, -1, l_date);
	getdatef(date, "");
	
	if(!memcmp(card_type, "03", 2)) 
		sprintf(sql_str, "select * from cur_tran_ls \
		where acq_bank_id in ( %s ) and acq_host_id = '%s' \
		and bank_type not in('04', '51', '52', '53', '54', '55') \
		and (%s >= '%s' and %s < '%s') \
		and saf_flag = '0' and tran_flag in ('0', '4') \
		and resp_code  = '00' and tran_type in (%s) \
		and terminal_id[1,3] not in ('TRM','TEL','TLX','VOC') \
		for update of snd_settle_flag, snd_settle_date ", acq_bank,
		sys->host_id, field_name, s_date, field_name, e_date,tran_type);
	else 
		sprintf(sql_str, "select * from cur_tran_ls \
		where acq_bank_id in ( %s ) and acq_host_id = '%s' \
		and card_type in (%s) \
		and bank_type in('04', '51', '52', '53', '54', '55') \
		and (%s >= '%s' and %s < '%s') \
		and saf_flag = '0' and tran_flag in ('0', '4') \
		and resp_code  = '00' and tran_type in (%s) \
		and terminal_id[1,3] not in ('TRM', 'TEL', 'TLX', 'VOC') \
		for update of snd_settle_flag, snd_settle_date ", acq_bank,
		sys->host_id, cardtype, field_name, s_date, field_name, e_date, 		tran_type);

	EXEC SQL prepare s_sql from :sql_str;
	if (SQLCODE) {
		daylog(ERROR, "Unable prepare sql_str[%s]![%d]", 
			sql_str, SQLCODE);
		return -1;
	}

	EXEC SQL declare settle_cur cursor for s_sql;
	if (SQLCODE) {
		daylog(ERROR, "Unable declare settle_cur![%d]", SQLCODE);
		return -1;
	}

	EXEC SQL open settle_cur;
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable open cursor settle_cur![%d]", SQLCODE);
		return -1;
	}
	while(1) {
		EXEC SQL fetch settle_cur into :tran_ls;
		if (SQLCODE == 100)	break;
		if (SQLCODE) {
			daylog(ERROR, "Unable fetch cur_tran_ls![%d]", SQLCODE);
			EXEC SQL close settle_cur;
			return -1;
		}
		del_st_space("cur_tran_ls", &tran_ls);

		memcpy( tran_ls.snd_settle_date, date, 9 );
		strcpy( tran_ls.snd_settle_flag, "Y" );

		EXEC SQL select settle_mode into :settle_mode from merchant_base
			where merchant_id = :tran_ls.merchant_id;
		if(SQLCODE) {
			daylog(ERROR, "Unable select settle_mode from merchant_base. merchant_id=[%s]![%d]", tran_ls.merchant_id, SQLCODE);
			EXEC SQL close settle_cur; 
			return (-1);
		}

		if(memcmp(settle_mode, "Y", 1)) continue;

		EXEC SQL insert into cur_settle_ls values ( :tran_ls) ;
		if (SQLCODE) {
			daylog(ERROR, "Unable insert cur_settle_ls![%d]", SQLCODE);
			EXEC SQL close settle_cur;
			return -1;
		}
		EXEC SQL update cur_tran_ls set snd_settle_flag='Y',
			snd_settle_date=$l_date where current of settle_cur;
		if(SQLCODE) {
			daylog(ERROR, "Unable update settle_cur of cur_tran_ls![%d]", SQLCODE);
			EXEC SQL close settle_cur;
			return -1;
		}
	}
	if(update_settle_date(card_type, s_date, e_date) <  0) {
		EXEC SQL close settle_cur;
		return -1;
	}

	EXEC SQL close settle_cur;

	return 0;

}


int	errtran_to_errsettle(S_sys_param *sys)
{
	$char	date[9], l_date[9];
	

	getdatef(date, "");
	dateadd(sys->logic_date, -1, l_date);

	EXEC SQL update err_tran_ls set snd_settle_date = $date 
		where snd_settle_date = $l_date;
	if (SQLCODE) {
		daylog(ERROR, "Unable update snd_settle_date of err_tran_ls![%d]", SQLCODE);
		return -1;
	}

	EXEC SQL insert into err_settle_ls select * from err_tran_ls
		where snd_settle_date = $date and tran_type not in (4,12) ;

	if (SQLCODE) {
		daylog(ERROR, "Unable insert err_tran_ls to err_settle_ls![%d]", SQLCODE);
		return -1;
	}

	EXEC SQL insert into his_err_tran_ls select * from err_tran_ls
		where snd_settle_date = $date and tran_type not in(4,12);
	if (SQLCODE) {
		daylog(ERROR, "Unable insert err_tran_ls to his_err_tran_ls![%d]", SQLCODE);
		return -1;
	}

	EXEC SQL delete from err_tran_ls where snd_settle_date = $date;

	if (SQLCODE) {
		daylog(ERROR, "Unable delete err_tran_ls![%d]", SQLCODE);
		return -1;
	}

	return (0);

}





/*
 * 传流水记录到当日清算流水表中
 */
int 	tran_to_settle()
{

	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[4]={"01", "02", "03", "50"};
	char		*card_name[4]={"信用卡", "借记卡", "它行卡", "外卡"};
	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 < 4; i++) {
		if(insert_into_settle(card_type[i], card_name[i], 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], 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);
    	}

	$set lock mode to wait 60;

	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(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() < 0) {
		EXEC SQL rollback work;

⌨️ 快捷键说明

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