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 + -
显示快捷键?