📄 settle.ec.cp
字号:
/**************************************************************
* 对帐清算处理程序
* 上传清算文件 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 !" ,\
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -