net_stat.ec

来自「在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便」· EC 代码 · 共 383 行

EC
383
字号
/*******************************************************
 *	跨行清算统计(net_stat)
 *
 * 最后修改:	周国祥 2001/08/16
 *******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include "macro_def.h"
#include "mytools.h"
#include "tool.h"

$include "db_struct.h"
$include sqlca;

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

/* same as the struct in bal_rpt.c */
typedef struct {
	char	bankid[12];
	char	hostid[3];
	int	credit_cnt;
	double	credit_amt;
	int	rev_credit_cnt;
	double	rev_credit_amt;
	int	debit_cnt;
	double	debit_amt;
	int	rev_debit_cnt;
	double	rev_debit_amt;
	int	tran_cnt;
	int	rev_tran_cnt;
	int	auth_cnt;
	int	cnt;
	double	amt;
} S_stat;

$static S_sys_param sys;

void addbank(S_stat *stat, S_tran_ls ls, int flag)
{
	int sym;

	switch (ls.tran_type) {
	    case PURCHASE:
	    case WITHDRAWAL:
	    case CONFIRM:
		if (flag == 1) {
			stat->credit_amt += ls.tran_amt;
			stat->credit_cnt++;
		} else {
			stat->debit_amt += ls.tran_amt;
			stat->debit_cnt++;
		}
		break;
	    case REFUND:
	    case DEPOSIT:
		if (flag == 1) {
			stat->debit_amt += ls.tran_amt;
			stat->debit_cnt++;
		} else {
			stat->credit_amt += ls.tran_amt;
			stat->credit_cnt++;
		}
		break;
	    case TRANS_OUT:
	    case TRANS_IN:
	    case TRANS_DUP:
/*
	    case AGENT_OUT:
*/
		stat->tran_cnt++;
		break;
/*
	    case AUTH:
*/
	    case AUTH_PUR:
		stat->auth_cnt++;
		break;
	    case POS_VOID:
		switch (ls.void_tran_type) {
		    case PURCHASE:
		    case WITHDRAWAL:
		    case CONFIRM:
			if (flag == 1) {
				stat->rev_credit_amt += ls.tran_amt;
				stat->rev_credit_cnt++;
			} else {
				stat->rev_debit_amt += ls.tran_amt;
				stat->rev_debit_cnt++;
			}
			break;
		    case REFUND:
		    case DEPOSIT:
			if (flag == 1) {
				stat->rev_debit_amt += ls.tran_amt;
				stat->rev_debit_cnt++;
			} else {
				stat->rev_credit_amt += ls.tran_amt;
				stat->rev_credit_cnt++;
			}
			break;
		    case TRANS_OUT:
		    case TRANS_IN:
		    case TRANS_DUP:
/**zgx
		    case AGENT_OUT:
*/
			stat->rev_tran_cnt++;
			break;
		}
		break;
	}

	stat->cnt++;

	if (ls.tran_type == POS_VOID) {
		ls.tran_type = ls.void_tran_type;
		sym = -1;
	} else
		sym = 1;
	if (ls.tran_type == REFUND || ls.tran_type == DEPOSIT)
		sym *= -1;
	if (ls.tran_type != PRE_AUTH)
		stat->amt += ls.tran_amt * sym * flag;
}

int get_son(bankid, hostid, son_bankid, son_hostid)
$parameter char *bankid;
$parameter char *hostid;
char son_bankid[48][12];
char son_hostid[48][3];
{
	$char	bank_id[12];
	$char	host_id[3];
	int	i;

	memset(son_bankid, 0, sizeof(son_bankid));
	memset(son_hostid, 0, sizeof(son_hostid));

	$declare son_cur cursor for
	select bank_id, host_id from bank_info 
	where adm_bank_id = :bankid and adm_host_id = :hostid
	or bank_id = :bankid and host_id = :hostid
	order by bank_id, host_id;
	$open son_cur;
	if (SQLCODE) {
		daylog(ERROR, "Open son_cur error!");
		return(-2);
	}
	i = 0;
	while (1) {
		$fetch son_cur into :bank_id, :host_id;
		if (SQLCODE == 100)
			break;
		if (SQLCODE) {
			daylog(ERROR, "Fetch son_cur error!");
			$close son_cur;
			return(-2);
		}
		DelSpace(bank_id);
		DelSpace(host_id);
		strcpy(son_bankid[i], bank_id);
		strcpy(son_hostid[i++], host_id);
	}
	$close son_cur;
	return(0);
}

int check_son(bankid, hostid, son_bankid, son_hostid)
char *bankid, *hostid;
char son_bankid[48][12];
char son_hostid[48][3];
{
	int i;

	for (i = 0; son_bankid[i][0]; i++) {
		if (!strcmp(bankid, son_bankid[i]) &&
		    !strcmp(hostid, son_hostid[i]) )
			break;
	}
	if (son_bankid[i][0])
		return(1);
	return(0);
}

int get_stat(stat, logic_date)
S_stat	**stat;
$parameter char *logic_date;
{
	int flag1, flag2, i, j, num = 0;
	char son_bankid[48][12];
	char son_hostid[48][3];
	$S_tran_ls ls;
	S_stat	mid;
	void	*tmp;

	if (get_son(sys.bank_id, sys.host_id, son_bankid, son_hostid) < 0)
		return(-2);

	*stat = NULL;

	/* old:2消费3退货4取现5存款8转帐9代收11确认21授权消费 */
	/* now:1消费9退货3取现7存款6转出10转入14双转5确认2授权消费8调帐 */
	/* old:6撤销 */
	/* now:12撤销 */
	$declare stat_cur cursor for
	select * from cur_tran_ls
	where acq_bank_id != iss_bank_id 
	and (tran_type in (1,2,3,5,6,7,8,9,10,14) or
	    (tran_type = 12 and void_tran_type in (1,3,5,6,7,8,9,10,14)))
	and saf_flag in ('0')	/* 未冲正 */
	and manual_flag = 'N'
	and resp_code like '00%'
	and snd_settle_date = :logic_date
	and card_type = '02';	/* old:01,now:02, 借记卡 */

	$open stat_cur;
	if (SQLCODE) {
		daylog(ERROR, "Open stat_cur error!");
		return(-2);	/* Database operate error */
	}
	while (1) {
		$fetch stat_cur into :ls;
		if (SQLCODE == 100) break;
		if (SQLCODE) {
			daylog(ERROR, "Fetch stat_cur error!");
			free((void *)*stat);
			$close stat_cur;
			return(-2);	/* Database operate error */
		}
		del_st_space("tran_ls", &ls);
		if (!check_son(ls.acq_bank_id, ls.acq_host_id, son_bankid, son_hostid)) {
			strcpy(ls.acq_bank_id, BOC_CENTER /*"0004"*/);
			strcpy(ls.acq_host_id, "00");
		}
		if (!check_son(ls.iss_bank_id, "00", son_bankid, son_hostid)) {
			strcpy(ls.iss_bank_id, BOC_CENTER /*"0004"*/);
		}
		flag1 = flag2 = 1;
		for (i = 0; (flag1 || flag2) && (i < num); i++) {
			if (flag1 && 
			    !strcmp((*stat)[i].bankid, ls.acq_bank_id) &&
			    !strcmp((*stat)[i].hostid, ls.acq_host_id) ) {
				addbank(*stat + i, ls, 1);
				flag1 = 0;
			}
			if (flag2 && 
			    !strcmp((*stat)[i].bankid, ls.acq_bank_id) &&
			    !strcmp((*stat)[i].hostid, ls.acq_host_id) ) {
				addbank(*stat + i, ls, -1);
				flag2 = 0;
			}
		}
		if (flag1 || flag2) {
			tmp = realloc((void *)*stat,
				      (num + flag1 + flag2) * sizeof(S_stat));
			if (!tmp) {
				daylog(ERROR, "Memory allocate error!");
				free((void *)*stat);
				$close stat_cur;
				return(-1);	/* Memory operate error */
			}
			*stat = (S_stat *)tmp;
			memset((void *)(*stat + num), 0,
			       (flag1 + flag2) * sizeof(S_stat));
		}
		if (flag1) {
			strcpy((*stat)[num].bankid, ls.acq_bank_id);
			strcpy((*stat)[num].hostid, ls.acq_host_id);
			addbank(*stat + num, ls, 1);
		}
		if (flag2) {
			strcpy((*stat)[num + flag1].bankid, ls.iss_bank_id);
			strcpy((*stat)[num + flag1].hostid, "00");
			addbank(*stat + num + flag1, ls, -1);
		}
		num += flag1 + flag2;
	}
	$close stat_cur;

	for (i = 0; i < num - 1; i++) {
		flag1 = flag2 = 0;
		for (j = 1; j < num - i; j++) {
			if (strcmp((*stat)[flag1].bankid, (*stat)[j].bankid) > 0)
				flag2 = 1;
			else flag1 = j;
		}
		if (!flag2)
			break;
		flag2 = num - i - 1;
		if (flag1 != flag2) {
			memcpy(&mid, *stat + flag1, sizeof(S_stat));
			memcpy(*stat + flag1, *stat + flag2, sizeof(S_stat));
			memcpy(*stat + flag2, &mid, sizeof(S_stat));
		}
	}

	return(num);
}

int net_stat()
{
	WINDOW *my_win;
	char filename[1024], logic_date[11];
	char str[80], name[31];
	S_stat *stat;
	int num, i, cnt;
	double amt;

	$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 (not (bank_id =  adm_bank_id and host_id = adm_host_id)) and adm_bank_id = \'%s\' and adm_host_id = \'%s\'", sys.bank_id, sys.host_id);
	num = query_count(filename);
	if (!num)
		return(0);

	sprintf(filename, "/tmp/.net_stat.%d", getpid());
	scr_dump(filename);

	disp_below("跨行清算统计");
	clear_wline(stdscr, LINES-1);
	h_prompt(LINES-1, 1, "                                                                 < ESC 退出 > ", 0, 0);
	h_prompt(LINES-1, 1, "跨行清算统计", 0, 0);
	my_win = newwin(19, 80, 3, 0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);

	set_prompt(PROMPT_OFF);

	dateadd(sys.logic_date, -1, logic_date);
	mvwprintw(my_win, 2, 22, "请输入清算逻辑日: [%s]", logic_date);
	if (in_item(my_win, "", 2, 41, logic_date, 8, NULL, NULL, 0, 0) !=
	    ENTER) goto end;

	mvwprintw(my_win, 4, 22, "处理中, 请稍候 ...");
	wrefresh(my_win);

	num = get_stat(&stat, logic_date);
	switch (num) {
	    case -1:
		h_winprompt(my_win, 17, 4, "内存不足!", 1, 0);
		goto end;
	    case -2:
		h_winprompt(my_win, 17, 4, "数据库操作错误!", 1, 0);
		goto end;
	}

	cnt = 0;
	amt = 0;
	sprintf(str, "%-12s%-32s%-10s%14s",
		"联行行号", "联行名称", "交易笔数", "净金额");
	CreateList(16, 74, 6, 3, str);
	for (i = 0; i < num; i++) {
		get_bank_name(stat[i].bankid, stat[i].hostid, name);
		sprintf(str, "%-12s%-30s%10d%16.2f",
			stat[i].bankid, name, stat[i].cnt, stat[i].amt);
		AddListItem(str, 0);
		cnt += stat[i].cnt;
		amt += stat[i].amt;
	}
	AddListItem("", 0);
	sprintf(str, "%-42s%10d%16.2f", "总计", cnt / 2, amt);
	AddListItem(str, 1);
	clear_wline(stdscr, LINES-1);
	h_wpromptr(stdscr, LINES-1, "上移: Home PgUp ↑ 下移: End PgDn ↓ 返回: ESC", 0, 0);
	DispList(0);
	FreeList();
	free((void *)stat);
end:
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);
	return(0);
}

⌨️ 快捷键说明

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