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

📄 settle.ec.0704

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 0704
📖 第 1 页 / 共 5 页
字号:
			disp_log_day ( DISP_ONLY , ERROR ,\
			"装入%13.13s失败!(联行号=%4.4s-%2.2s)" ,\
			mx_log.file_name , mx_log.sd_bankid, mx_log.sd_hostid);
			continue;
		}
		
		if ( head_flag == 0 ) {
			$update mx_logtab set proc_flag='1'
			where current of load_settle0;
		}
		else {
			$update mx_logtab set proc_flag='1'
			where current of load_settle1;
		}
		
		if ( SQLCODE ) {
			daylog ( ERROR , \
			"Unable update mx_logtab's proc_flag to '1' ( file_name = %s ) !" , mx_log.file_name );

			disp_log_day ( DISP_ONLY, ERROR , "装入%13.13s失败!(联行号=%4.4s-%2.2s)" , \
			mx_log.file_name , mx_log.sd_bankid, mx_log.sd_hostid);
			continue;
		}

		disp_log_day ( DISP_ONLY , DEBUG, "装入%13.13s成功!(联行号=%4.4s-%2.2s)" ,\
		mx_log.file_name , mx_log.sd_bankid, mx_log.sd_hostid);
	}
	
	if ( head_flag == 0 ) 
		$close load_settle0;
	else
		$close load_settle1;
	
	disp_log_day ( DISP_ONLY, DEBUG, "共装入%d个交易明细!" , cnt );

	$commit work;

	$delete from mx_logtab 
	where proc_flag='1';
	
	if ( SQLCODE ) {
		daylog ( ERROR, "Unable delete mx_logtab!" );
	}
	
	return 0;
}

/*
 * 下传清算文件
 */
/* send the reconciliation file to the branch */

int down_settle_file ()
{
$char datebuf[12];
$char ipaddr[21];
$char head[12]; 
$char file_name[200],tmpfile[50];
$char file_name2[200];
$ S_bank_base bank_base;
$ S_sys_param sys;
char buf[1024];
time_t t;
struct tm *tm;

	$select * into $sys from sys_param;

	if ( SQLCODE ) {
		daylog ( ERROR , "Select sys_param table error !");
		return -1;
	}
	
	del_st_space("sys_param", &sys);

	time ( &t );
	tm = localtime ( &t );

	$declare downcur cursor for 
	select bank_id, host_id from bank_info x
	where (adm_bank_id != bank_id)
	and   adm_bank_id = $sys.bank_id and adm_host_id = $sys.host_id
	and exists (
		select bank_id, host_id from bank_info
		where ( (bank_id = x.bank_id and host_id = x.host_id) or
			bank_id in ( select bank_id from bank_info
				    where adm_bank_id = x.bank_id ))
		and   ( bank_id in ( select bank_id from bank_base
				    where settle_flag = '1' ))
	);
	if ( SQLCODE ) {
		daylog ( ERROR ,"Unable declare  downcur!" );
		return (-1) ;
	}

	$open downcur;
	if ( SQLCODE ) {
		daylog ( ERROR ,"Unable open downcur !" );
		return (-1);
	}
	
	while (1) {
		$fetch downcur into $bank_base.bank_id, $bank_base.host_id;
		if ( SQLCODE && SQLCODE != 100 ) {
			daylog ( ERROR ,"Unable fetch downcur !" );
			$close downcur;
			return (-1) ;
		} else if ( SQLCODE == 100 ){
			$close downcur;
			return (0);
		}
		DelSpace(bank_base.bank_id);
		DelSpace(bank_base.host_id);
		
		sprintf ( file_name , "%s/box/mx/S/%11.11s.%02d%02d%02d" , \
		getenv("WORKDIR"), bank_base.bank_id, tm->tm_year , tm->tm_mon+1 , \
		tm->tm_mday );

		sprintf ( file_name2 , "%s/box/mx/R/%4.4s.%02d%02d%02d" , \
		getenv("WORKDIR"), sys.bank_id , tm->tm_year , tm->tm_mon+1 , \
		tm->tm_mday );

		sprintf(buf, "dbaccess - - 2>/dev/null >/dev/null <<!\ndatabase %s;\nunload to '%s' select * from cur_settle_ls where card_type='%s' and (iss_bank_id='%s' or iss_bank_id in (select bank_id from bank_info where adm_bank_id='%s')) and (iss_bank_id in (select bank_id from bank_base where settle_flag='1')) and tran_type not in (%d, %d) and saf_flag='0' and tran_flag='0';\n!", getenv("DBNAME"), file_name, CREDIT_CARD, bank_base.bank_id, bank_base.bank_id, POS_VOID, PRE_AUTH);

		system ( buf);

		$select settle_ip_addr into $ipaddr from bank_base 
		where bank_id=$bank_base.bank_id
		and   host_id=$bank_base.host_id;
		DelSpace(ipaddr);

		if ( mail(sys.bank_id, bank_base.bank_id, ipaddr, 
			    MX_RECV_PORT , file_name , "c",file_name2 )) {
			disp_log_day ( DISP_ONLY, ERROR , "下传%s联行失败!" , bank_base.bank_id );
			$close downcur;
			daylog ( ERROR , "Unable mail %s to %s!",sys.bank_id,bank_base.bank_id);
			return ( -1 );
		}
		
		disp_log_day ( DISP_ONLY, DEBUG, "下传%s联行成功!" , bank_base.bank_id );
	}
}

/*
 * 转入历史流水
 */
int day_end()
{
	char filename[128], screen[128];
	$char s_date[15], e_date[15];
	int ret;

	sprintf(screen, "/tmp/.day_end.%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;

	getdatef(s_date, "");
	dateadd(s_date, -1, s_date);
	mvwprintw(my_win, 2, 4, "请输入起始清算日期: [%s]", s_date);
	ret = in_item(my_win, "", 2, 25, s_date, 8, NULL, NULL, 0, 0);
	if (ret != ENTER) {
		delwin(my_win);
		scr_restore(screen);
		unlink(screen);
		return(-1);
	}
	
	strcpy(e_date, s_date);

	//mvwprintw(my_win, 2, 41, "请输入结束清算日期: [%s]", e_date);
	//ret = in_item(my_win, "", 2, 62, e_date, 8, NULL, NULL, 0, 0);
	mvwprintw(my_win, 3, 4, "请输入结束清算日期: [%s]", e_date);
	ret = in_item(my_win, "", 3, 25, e_date, 8, NULL, NULL, 0, 0);
	if (ret != ENTER) {
		delwin(my_win);
		scr_restore(screen);
		unlink(screen);
		return(-1);
	}

#ifdef wyz_mod_011229
#else
	if (strcmp(s_date, e_date) >0 ){
		line = PGS_LEE;
		disp_log_day(DISP_LOG, ERROR,
		"起始日期大于结束日期, 操作失败, 按任意键继续");
		getch();
		delwin(my_win);
		scr_restore(screen);
		unlink(screen);
		return(-1);
	}
#endif

	line = line+3;
	disp_log_day(DISP_LOG, DEBUG, "警告: 转入历史流水后将无法处理当日报表!  请确认已进行过日终报表处理!");
	line++;
	if (yorn(my_win, line, "    是否继续?", "1.是", "0.否", 1, 0)) {
		delwin(my_win);
		scr_restore(screen);
		unlink(screen);
		return(0);
	}

	disp_log_day(DISP_LOG, DEBUG, "警告: 转入历史流水后将无法传送当日清算文件! 请确认已进行过清算文件传送!");
	line++;
	if (yorn(my_win, line, "    是否继续?", "1.是", "0.否", 1, 0)) {
		delwin(my_win);
		scr_restore(screen);
		unlink(screen);
		return(0);
	}

	disp_log_day(DISP_LOG, DEBUG, "转入历史流水, 请稍候 ...");

	EXEC SQL INSERT INTO his_settle_ls
		SELECT * FROM cur_settle_ls
		WHERE snd_settle_date >= $s_date
		AND snd_settle_date <= $e_date
		AND edc_err_flag = '0';

	if (SQLCODE) {
		line = PGS_LEE;
		disp_log_day(DISP_LOG, ERROR, "备份表 settle_ls 出错, 请立即联系系统管理员! 按任意键继续");
		getch();
		delwin(my_win);
		scr_restore(screen);
		unlink(screen);
		return(0);
	}

	EXEC SQL DELETE FROM cur_settle_ls
		WHERE snd_settle_date >= $s_date
		AND snd_settle_date <= $e_date
		AND edc_err_flag = '0';

	if (SQLCODE) {
		line = PGS_LEE;
		disp_log_day(DISP_LOG, ERROR, "清理表 settle_ls 出错, 请立即联系系统管理员! 按任意键继续");
		getch();
		delwin(my_win);
		scr_restore(screen);
		unlink(screen);
		return(0);
	}

	line = PGS_LEE;
	disp_log_day(DISP_LOG, DEBUG, "转入历史流水成功, 按任意键继续");
	getch();
	delwin(my_win);
	scr_restore(screen);
	unlink(screen);
	return(0);
}

/*
 * 传流水记录到当日清算流水表中
 */
int posls_to_settle()
{
FILE		*fp;
SETTLE_RESULT	s_r;
char 		filename[80];
char 		buf[1024];
int		sys_ret;
$char 		l_date[20];
$char		e_date[9], e_time[7];
$char		sqlstr[512];
$char		tmp_merch[16];
$char		tmp_sttl_mode[2];
$char		tmp_sign_bankid[12];
char		tmp_settle_flag[64];
int		i=0;

daylog(ERROR, "posls_to_settle() begin.");

	getdatef(e_date, "");
	gettimef(e_time, "");

#ifdef wyz020704_mod
	dateadd(sys.logic_date, -1, l_date);
#else
	sprintf(filename, "%s/etc/settle_result", getenv("WORKDIR"));
	if ((fp = fopen(filename, "r")) == NULL) {
		daylog(ERROR, "posls_to_settle fopen failed");
		fclose(fp);
		return -1;
	}
	if (fread(&s_r, sizeof(SETTLE_RESULT), 1, fp) != 1){
		daylog(ERROR, "posls_to_settle fread failed");
		fclose(fp);
		return -1;
	}
	if (s_r.result == 0 || s_r.result == -1) {
		dateadd(sys.logic_date, -1, l_date);
	else 	
		strcpy(l_date, s_r.logic_date);
	fclose(fp);
#endif

/*
	$set isolation to cursor stability;
	$set isolation to dirty read;
*/

$ifdef wyz020628_mod;
$else;
	/*将当前流水表中所有商户取入内存中*/
	memset(tmp_sign_bankid, '\0', sizeof(tmp_sign_bankid));
	memset(tmp_settle_flag, '\0', sizeof(tmp_settle_flag));

	G_total_merch = 0;
	EXEC SQL SELECT count(DISTINCT merchant_id) INTO :G_total_merch FROM merchant_base;
	if (SQLCODE) {
		daylog(ERROR, "取当前交易流水中商户号数错误[%d]", SQLCODE);
		return -1;
	}
	
	G_merchant_id_array = (struct MERCH_STRUCT *)malloc(G_total_merch * sizeof(struct MERCH_STRUCT));
	if (G_merchant_id_array == NULL) {
		daylog(ERROR, "申请空间失败");
		return -1;
	}

	memset(G_merchant_id_array, 0, G_total_merch * sizeof(struct MERCH_STRUCT));

	sprintf(sqlstr, "SELECT DISTINCT merchant_id, sign_bank_id, settle_mode FROM merchant_base");

	EXEC SQL PREPARE get_merchant_id FROM :sqlstr;
	EXEC SQL DECLARE get_merchant_cur CURSOR WITH HOLD FOR get_merchant_id;
	
	EXEC SQL OPEN get_merchant_cur;
	if (SQLCODE < 0) {
		daylog(ERROR, "OPEN Cursor Failed[%ld]", SQLCODE);
		free(G_merchant_id_array);
		return(-1);
	}

	i = 0;
	while(i < G_total_merch) {
		//循环查找流水记录
		EXEC SQL FETCH get_merchant_cur INTO :tmp_merch, :tmp_sign_bankid, :tmp_sttl_mode; 
		if (SQLCODE < 0) {
			daylog(ERROR, "取商户号失败!![%ld]", SQLCODE);
			EXEC SQL CLOSE get_merchant_cur;
			free(G_merchant_id_array);
			return(-1);
		}
	
		if (SQLCODE == SQLNOTFOUND) {
			EXEC SQL CLOSE get_merchant_cur;
			break;
		}
		
		DelSpace(tmp_merch);
		DelSpace(tmp_sign_bankid);

#ifdef wyz020704_mod
		/* tmp 20020704 */
		if (strcmp(tmp_sign_bankid, "4933") 	&&
		    strcmp(tmp_sign_bankid, "4904")) 
			continue;
		/********/
#else
		if (readtab("SETTLE_BANK", "SETTLE_BANK", tmp_sign_bankid, tmp_settle_flag) == 0) {
			if (tmp_settle_flag[0] == 'N' ||
			    tmp_settle_flag[0] == 'n') 
				continue;
		}
#endif

		tmp_sttl_mode[1] = '\0';
		strcpy(G_merchant_id_array[i].merch_id, tmp_merch);
		G_merchant_id_array[i].sttl_mode[0] = tmp_sttl_mode[0];
		i ++;
	}
$endif;

	/*按照商户分批地转流水*/
	G_total_merch = i;
	i = 0;
	memset(tmp_merch, 0, sizeof(tmp_merch));

	while(i < G_total_merch) {
		strcpy(tmp_merch, G_merchant_id_array[i].merch_id);
		tmp_sttl_mode[0] = G_merchant_id_array[i].sttl_mode[0];
		tmp_sttl_mode[1] = '\0';

		DelSpace(tmp_merch);
		daylog(DEBUG, "Merchant_id=%s[%s]", tmp_merch, tmp_sttl_mode);


		/* 将当前流水中收单行或发卡行为本行的交易
		   且已清算清算日期等于当前日期的正常交易
		   且不是PRE_AUTH和POS_VOID交易转入cur_settle_ls中
		*/

		$begin work;

		/*手工清算商户,不进清算流水,直接清入历史流水*/
		/* 删除当前交易流水已清算的记录 */
		if (tmp_sttl_mode[0] == 'N'	||
		    tmp_sttl_mode[0] == 'n') {
			daylog(DEBUG, "手工清算商户[%s],不进清算流水,直接清入历史流水", tmp_merch);

			EXEC SQL INSERT INTO his_tran_ls
			SELECT * from cur_tran_ls
			where acq_bank_id = $sys.bank_id
			and snd_settle_flag = 'Y'
			and snd_settle_date <= $l_date
			and saf_flag in ('0')		/* 冲正标志:正常 */
			and edc_err_flag in ('0')	/* 正常 */
			and tran_flag in ('0','4')	/* 交易标志:正常,已退货 */
			and resp_code = '00'
			and tran_type <> 4		/* 预授权 */
			and terminal_id not like 'TRM%'
			and merchant_id = $tmp_merch;
/*
			where snd_settle_flag = 'Y'
			and snd_settle_date <= $l_date
			and tran_type <> 4
			and merchant_id = $tmp_merch;
*/
			if (SQLCODE) {
				daylog(ERROR, "Insert into his_tran_ls failed!(%d)", SQLCODE);
				$rollback work;
				free(G_merchant_id_array);
				return -1;
			}

			$delete from cur_tran_ls
			where acq_bank_id = $sys.bank_id
			and snd_settle_flag = 'Y'
			and snd_settle_date <= $l_date
			and saf_flag in ('0')		/* 冲正标志:正常 */
			and edc_err_flag in ('0')	/* 正常 */
			and tran_flag in ('0','4')	/* 交易标志:正常,已退货 */
			and resp_code = '00'
			and tran_type <> 4		/* 预授权 */
			and terminal_id not like 'TRM%'
			and merchant_id = $tmp_merch;
/*
			where snd_settle_flag = 'Y'
			and snd_settle_date <= $l_date
			and tran_type <> 4
			and merchant_id = $tmp_merch;
*/
	
			if (SQLCODE) {
				daylog(ERROR, "Unable delete from cur_tran_ls!(%d)", SQLCODE);
				$rollback work;
				free(G_merchant_id_array);
				return -1;
			}

			$commit work;
			i ++;

			continue;
		}

		if (G_settle_mode == 0) { /*使用EDC结算交易进清算*/
			$insert into cur_settle_ls
			select * from cur_tran_ls
			where acq_bank_id = $sys.bank_id
			and snd_settle_flag = 'Y'
			and snd_settle_date <= $l_date
			and saf_flag in ('0')		/* 冲正标志:正常 */
			and edc_err_flag in ('0')	/* 正常 */
			and tran_flag in ('0','4')	/* 交易标志:正常,已退货 */
			and resp_code = '00'
			and tran_type not in (4,12)	/* 预授权,撤消 */
			and tran_amt >= 0.01		/* 交易金额为0*/
			and terminal_id not like 'TRM%'
			and merchant_id = $tmp_merch;
	
			if (SQLCODE) {
				daylog(ERROR, "Unable insert cur_tran_ls to cur_settle_ls![%ld]", SQLCODE);

⌨️ 快捷键说明

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