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

📄 settle.ec.ah

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 AH
📖 第 1 页 / 共 5 页
字号:
/**************************************************************
 *	对帐清算处理程序
 * 上传清算文件		settle_up() -- up_settle_file() 
 * 下传清算文件		settle_down() -- down_settle_file()
 * 分行上传文件汇总	settle_get_up() -- load_settle_file(0)
 * 中心下传文件汇总	settle_get_down() -- load_settle_file(1)
 * 查看清算文件状态	view_settle_stat()
 * 清算流水转出		bd_stl_out -- down_bd_stl_file()
 * 转入历史流水		day_end()
 * 日终清算处理		chg_logic_date()
 * 锁定EDC批次		lock_edc_batch()
 * 解锁EDC批次		unlock_edc_batch()
 *
 **************************************************************/
#include <stdio.h>
#include <curses.h>
#include <varargs.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/timeb.h>
#include <fcntl.h>
#include <time.h>
#include <errno.h>

#include "all.h"
#include "tool.h"
#include "macro_def.h"

$include "db_struct.h";
$include sqlca;

#define  MX_RECV_PORT	8
#define  COL_LEE	2
#define  ROW_LEE	4
#define  PGS_LEE	17
#define  DISP_ONLY	0
#define  LOG_ONLY	1
#define  DISP_LOG	2

WINDOW *my_win;
int line;

void error_handler ();
void warning_handler ();
void notfound_handler ();

EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

$static S_sys_param	sys;
int	G_settle_mode=0;
int	G_settle_level=0;

struct MERCH_STRUCT{
	char	*merch_id[16];
	char	sttl_mode[2];
};

struct MERCH_STRUCT	*G_merchant_id_array=NULL;
$int		G_total_merch=0;
extern	int	errno;
extern	char	G_cen_bankid[12];
extern	char	G_bankid[12];
extern	int	G_oper_flag;

/*
 * 上传清算文件
 */
int up_settle_file () 
{
char 		l_date[20];
char		filename1[300];
char		filename2[300];
char		buf[1024];
$char		ipaddr[20];
int 		sys_ret;
time_t		t;
struct tm	*tm;
	
	$select * into $sys from sys_param;
	
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable select sys_param table !" );
		return -1;
	}
	del_st_space("sys_param", &sys);
	
	time ( &t );
	tm = localtime ( &t );
	
	sprintf (filename1 , "%s/box/mx/S/%s.%02d%02d%02d", getenv("WORKDIR") , sys.adm_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' and iss_bank_id not in (select bank_id from bank_base where settle_flag='0' or bank_id in (select bank_id from bank_info where adm_bank_id='%s')) and tran_type not in (%d, %d) and saf_flag='0' and tran_flag='0';\n!", getenv("DBNAME"), filename1, CREDIT_CARD, sys.bank_id, sys.bank_id, POS_VOID, PRE_AUTH);
	
	sys_ret = system ( buf);
	if (sys_ret){
		daylog ( ERROR , "dbaccess(unload cur_settle_ls)=%d!",sys_ret);
		return (-1);
	}

	$select settle_ip_addr into $ipaddr from bank_base
	where bank_id = $sys.adm_bank_id
	and   host_id = $sys.adm_host_id;

	if ( SQLCODE ) {
		daylog ( ERROR , "Select bank_base error [%d]!", sqlca.sqlcode);
		return (-1);
	}
	DelSpace(ipaddr);
	
	/*
	 * 置未清算标志
	 */
	$update bank_base set settle_flag = '0' 
	where bank_id = $sys.bank_id
	and   host_id = $sys.host_id;
	
	sprintf (  filename2 , "%s/box/mx/R/%s.%02d%02d%02d", getenv("WORKDIR") , sys.bank_id, tm->tm_year , tm->tm_mon+1 , tm->tm_mday );

	if ( mail ( sys.bank_id, sys.adm_bank_id, ipaddr , MX_RECV_PORT , filename1 , "c", filename2 )) {
		daylog ( ERROR , "Unable mail %s-%s to %s-%s!",sys.bank_id, sys.host_id,sys.adm_bank_id, sys.adm_host_id);
		return ( -1 );
	}
	
	return (0);
}

/*
 * 查看清算文件状态
 */
int view_settle_stat ()
{
WINDOW		*sub_win;
char		buff[1024];
$int 		cnt;
$S_sys_param	sys;
$char 		bankid[12], hostid[3];
$char		bankname[35];
$long		ct;
$char		tm[30];
char		filename[128];
int		i;


	sprintf(filename, "/tmp/.view.%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);

	sub_win = newwin( 16 , 68 , 5 , 6 );
	
	Box1 ( sub_win , 16 , 68 );
	
	wrefresh ( sub_win );
	
	$select count(*) into $cnt from mx_logtab
	where proc_flag='0';
	
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable select count(*) from mx_logtab !" );
		sprintf ( buff , "显示交易明细接收登记表失败, 按任一键继续...");
		mvwaddstr ( sub_win , 14 , 12 , buff );
		wgetch ( sub_win );
		delwin ( sub_win );
		
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		
		return -1;
	}
	
	sprintf ( buff , "%-12.12s %4.4s %-11.11s" , "银行名" , "数目" , "日期  时间 " );
	
	mvwaddstr ( sub_win , 1 , 3 , buff );
	mvwaddstr ( sub_win , 1 , 3+33 , buff );
	sprintf ( buff ,\
	"交易明细接收表(共接收 %d 项), 按任一键继续...",\
	 cnt );
	mvwaddstr ( sub_win , 14 , 11 , buff );
	wrefresh ( sub_win );
	
	$select * into $sys from sys_param;
	
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable select sys_param table! " );
		sprintf ( buff , "显示交易明细接收登记表失败" );
		mvwaddstr ( sub_win , 5 , 21 , buff );
		wgetch ( sub_win );
		delwin ( sub_win );
		
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		
		return -1;
	}
	del_st_space("sys_param", &sys);

	$declare bank_list cursor for
	select bank_id, host_id, bank_name from bank_info
	where (bank_id != :sys.bank_id)
	and ( adm_bank_id = :sys.bank_id and adm_host_id = :sys.host_id
	      or bank_id = :sys.adm_bank_id and host_id = :sys.adm_host_id );
	
	$open bank_list;
	
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable open cursor bank_list !" );
		sprintf ( buff , "显示交易明细接收登记表失败" );
		mvwaddstr ( sub_win , 5 , 21 , buff );
		wgetch ( sub_win );
		delwin ( sub_win );
		
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		
		return -1;
	}
	
	i=0;
	
	while (1) {
		$fetch bank_list into $bankid, $hostid, $bankname;
	
		if ( SQLCODE )
			break;
		DelSpace(bankid);
		DelSpace(hostid);
		DelSpace(bankname);
		
		$select count(*) , max(date_time) into $ct,$tm from mx_logtab 
		where sd_bankid=$bankid and sd_hostid=$hostid and proc_flag='0';
		
		if ( SQLCODE )
			break;
		
		sprintf ( buff , "%12.12s %-4d " , bankname , ct );

		if ( ct != 0 )
			sprintf(buff + strlen(buff), "%2.2s/%2.2s %2.2s:%2.2s",
				tm + 2, tm + 4, tm + 6, tm + 8);
		
		if ( (i%20)==0 && i!=0 ) {
			wgetch (sub_win);
			i=0;
			clear_screen ( sub_win );
			
			Box1 ( sub_win , 16 , 68 );
	
			sprintf ( buff , "%-12.12s %4.4s %-11.11s" , "银行名" , "数目" , "日期  时间" );
		
			mvwaddstr ( sub_win , 1 , 3 , buff );
			mvwaddstr ( sub_win , 1 , 3+33 , buff );
			sprintf ( buff ,\
			"交易明细接收表(共接收 %d 项), 按任一键继续...",\
			 cnt );
			mvwaddstr ( sub_win , 14 , 11 , buff );
			wrefresh ( sub_win );
		}
				
		mvwaddstr ( sub_win , 3+i/2 , (i%2)*33+3 , buff );
		wrefresh ( sub_win );
		
		i++;
	}
	
	$close bank_list;
	
	wgetch ( sub_win );
	delwin ( sub_win );
		
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);
	
	return 0;
}

/*
 * 清算流水转出
 */
int down_bd_stl_file1 ( int cre_or_debit )
{
$S_tran_ls ls;
$S_sys_param sys;
$char c_type[3];

FILE *fp;
char buff[1024];
time_t t;
struct tm *tm;
double amt;
char mer_id[16];
int cnt, id;
long off_1, off_2;

	$select * into $sys from sys_param;
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable select sys_param table !" );
		return -1;
	}
	del_st_space("sys_param", &sys);
	
	time ( &t );
	tm = localtime ( &t );
	
	if ( cre_or_debit == 0 )
		sprintf (buff, "%s/box/mx/local/au%s.%02d%02d%02d", getenv("WORKDIR"), sys.bank_id, tm->tm_year, tm->tm_mon+1, tm->tm_mday);
	else
		sprintf (buff, "%s/box/mx/local/de%s.%02d%02d%02d", getenv("WORKDIR"), sys.bank_id, tm->tm_year, tm->tm_mon+1, tm->tm_mday);
	
	if ( ( fp = fopen ( buff , "w+" ) ) == NULL ) {
		daylog ( ERROR , "Unable open %s !" , buff );
		return -1;
	}


	if ( cre_or_debit == 0 ) 
		strcpy ( c_type , CREDIT_CARD );
	else
		strcpy ( c_type , DEBIT_CARD );

	$declare stl_cur cursor for
	select * from cur_settle_ls
	where card_type = $c_type
	order by merchant_id, terminal_id, local_sys_date;

	$open stl_cur;
	if (SQLCODE) {
		daylog(ERROR, "Open stl_cur error!");
		fclose(fp);
		return(-1);
	}

	amt = 0;
	cnt = 0;
	id = 10000;
	mer_id[0] = 0;
	while (1) {
		$fetch stl_cur into :ls;
		if (SQLCODE == 100) break;
		if (SQLCODE) {
			daylog(ERROR, "Fetch stl_cur error!");
			$close stl_cur;
			fclose(fp);
			return(-1);
		}

		del_st_space("tran_ls", &ls);

		if (strcmp(mer_id, ls.merchant_id)) {
			if (cnt) {
				off_2 = ftell(fp);
				fseek(fp, off_1, 0);
				fprintf(fp, "%12.2lf%04d", amt, cnt);
				fseek(fp, off_2, 0);
			}
			id++;
			strcpy(mer_id, ls.merchant_id);
			fprintf(fp, "   %5d%-15.15s", id, mer_id);
			off_1 = ftell(fp);
			fprintf(fp, "%-16.16s\n", " ");
			amt = 0;
			cnt = 0;
		}
		cnt++;
		amt += ls.tran_amt;
		if ( cre_or_debit == 0 )
		fprintf(fp,
		"    %-4.4s%-16.16s%-2.2s%-2.2s%-2.2s%-15.15s%12.2lf%-6.6s\n",
		ls.terminal_id + 4, ls.card_no, ls.local_sys_date + 2,
		ls.local_sys_date + 4, ls.local_sys_date + 6, ls.merchant_id,
		ls.tran_amt, ls.auth_no);
		else
		fprintf(fp,
		"    %-4.4s%-16.16s%-2.2s%-2.2s%-2.2s%-15.15s%12.2lf%-6.6s%06ld\n",
		ls.terminal_id + 4, ls.card_no, ls.local_sys_date + 2,
		ls.local_sys_date + 4, ls.local_sys_date + 6, ls.merchant_id,
		ls.tran_amt, ls.auth_no, ls.trace_no/*ls.gcc_trace*/ );
	}
	if (cnt) {
		fseek(fp, off_1, 0);
		fprintf(fp, "%12.2lf%04d", amt, cnt);
	}
	$close stl_cur;

	fclose (fp);
	
	return 0;
}

int down_bd_stl_file ()
{
	system ( "LOC_gen -c" );
	system ( "LOC_gen -d" );
	
	return 0;
}

int load_settle_file ( char head_flag )
{
$S_sys_param 	sys;
$S_mx_logtab	mx_log;
int		sys_ret;
int		cnt=0;
$char		sql_string[1024];
char		file_name[300];
char		buf[512];
	
	$select * into $sys from sys_param;
	
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable select sys_param !" );
		return -1;
	}
	
	del_st_space("sys_param", &sys);

	$begin work;
	
	if ( SQLCODE ) {
		daylog ( ERROR , "Unable begin transaction !" );
		return -1;
	}
	
	if ( head_flag == 0 ) {
		$declare load_settle0 cursor for
		select * from mx_logtab
		where proc_flag='0'
		and sd_bankid!=$sys.adm_bank_id
		and sd_hostid!=$sys.adm_host_id
		for update of proc_flag;
		
		$open load_settle0;
	}
	else {
		$declare load_settle1 cursor for
		select * from mx_logtab
		where proc_flag='0'
		and sd_bankid=$sys.adm_bank_id
		and sd_hostid=$sys.adm_host_id
		for update of proc_flag;
		
		$open load_settle1;
	}
	
	if ( SQLCODE ) {
		$rollback work;
		daylog ( ERROR , "Unable open load_settle cursor !" );
		return -1;
	}
	
	while (1) {
		if ( head_flag == 0 ) 
			$fetch load_settle0 into $mx_log;
		else
			$fetch load_settle1 into $mx_log;
		
		if ( SQLCODE )
			break;
		
		del_st_space("mx_logtab", &mx_log);

		cnt++;
		
		sprintf ( file_name , "%s/box/mx/R/%11.11s" , getenv("WORKDIR") , mx_log.file_name );
	
		sprintf ( buf , "dbaccess - - 2>/dev/null >/dev/null <<!\ndatabase %s;\nload from \"%s\" insert into cur_settle_ls ;\n!",getenv("DBNAME"), file_name);
		sys_ret = system ( buf);
		if (sys_ret){
			daylog ( ERROR ,\
			"Unable load from %13.13s insert into settle_ls !" ,\

⌨️ 快捷键说明

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