📄 settle.ec
字号:
EXEC SQL SELECT * INTO :sys FROM sys_param;
if (SQLCODE) return (-1);
del_st_space("sys_param", &sys);
memcpy(sy, &sys, sizeof(sys));
return (0);
}
int get_settle_info(char *card_type, char *field_name, char *s_date, char *e_date)
{
char date_fname[80],logic_date[9];
S_sys_param sys;
if(readtab("SETTLE_CONFIG",card_type,"SETTLE_DATE",field_name) < 0){
daylog(ERROR,"SETTLE_CONFIG文件中没有[%s]下的SETTLE_DATE配置.",
card_type);
return (-1);
}
if(readtab("SETTLE_CONFIG",card_type,"DATE_FILE",date_fname) < 0) {
daylog(ERROR,"SETTLE_CONFIG文件中没有[%s]下的DATE_FILE配置.",
card_type);
return (-1);
}
if(readtab("SETTLE_CONFIG",card_type,"CUR_SETTLE_DATE",s_date) < 0){
daylog(ERROR,"SETTLE_CONFIG文件中没有[%s]下的LST_SETTLE_DATE配置.", card_type);
return (-1);
}
if(!strcmp(field_name, "local_sys_date") && date_fname[0] == 'N')
getdatef(e_date, "");
else if(!strcmp(field_name,"snd_settle_date") && date_fname[0]=='N') {
if(get_nas_sysparam(&sys) < 0) {
daylog(ERROR, "取NAS本地参数表失败.");
return (-1);
}
strcpy(e_date, sys.logic_date);
}
else {
if(date_fname[0] == 'N') {
daylog(ERROR, "SETTLE_CONFIG文件中[%s]下清算日期字段为%s,清算日期文件必须指定.", card_type, field_name);
return (-1);
}
if(get_date(date_fname, e_date) < 0) return (-1);
}
return (0);
}
int update_settle_date(char *card_type, char *s_date, char *e_date)
{
if(writetab("SETTLE_CONFIG",card_type,"LST_SETTLE_DATE",s_date) < 0){
daylog(ERROR,"更新SETTLE_CONFIG文件中[%s]下的LST_SETTLE_DATE配置.", card_type);
return (-1);
}
if(writetab("SETTLE_CONFIG",card_type,"CUR_SETTLE_DATE",e_date) < 0){
daylog(ERROR,"更新SETTLE_CONFIG文件中[%s]下的CUR_SETTLE_DATE配置.", card_type);
return (-1);
}
return (0);
}
int get_acq_bank(char *card_type, S_sys_param *sys, char *acq_bank)
{
char tmp[10], buff[10], buffer[40], acq_str[100];
char bank[3][10]={"GOLD", "HOST", "NAPH"};
int i;
memset( acq_str, 0, sizeof( acq_str ) );
memset(tmp, 0, sizeof(tmp));
if(readtab("SETTLE_CONFIG", card_type, "ACQ_BANK", tmp) < 0) {
daylog(ERROR, "SETTLE_CONFIG文件中没有[%s]下的ACQ_BANK配置.",
card_type);
return (-1);
}
sprintf( acq_str, " '%s' ", sys->bank_id );
for(i = 0; tmp[i] != '\0' && i < 10; i++) {
if(tmp[i] == '1') {
strcat( acq_str, ", " );
sprintf( buff, " '%s' ", bank[i]);
strcat( acq_str, buff );
}
}
strcpy( acq_bank, acq_str );
return (0);
}
int get_tran_type(char *card_type, char *tran_type)
{
char tmp[10], buff[10];
int type[6]={PURCHASE,CONFIRM,OFFLINE,WITHDRAWAL,DEPOSIT,TRANS_OUT};
int i;
memset(tmp, 0, sizeof(tmp));
if(readtab("SETTLE_CONFIG", card_type, "TRAN_TYPE", tmp) < 0) {
daylog(ERROR, "SETTLE_CONFIG文件中没有[%s]下的TRAN_TYPE配置.",
card_type);
return (-1);
}
for(i = 0; tmp[i] != '\0' && i < 10; i++) {
if(tmp[i] == '1') {
sprintf(buff, "%d", type[i]);
if(tran_type[0] == '\0')
sprintf(tran_type, "%d", type[i]);
else {
sprintf(buff, ",%d", type[i]);
strcat(tran_type, buff);
}
}
}
return (0);
}
int insert_into_settle(card_type, card_name, s_date, e_date, sys)
char *card_type;
char *card_name;
char *s_date;
char *e_date;
S_sys_param *sys;
{
EXEC SQL BEGIN DECLARE SECTION;
char date[9], l_date[9], sql_str[1024];
char settle_mode[2];
S_tran_ls tran_ls;
EXEC SQL END DECLARE SECTION;
char tran_type[50], field_name[40], acq_bank[40], bank_type[10];
char cardtype[30], logic_date[11];
memset(field_name, 0, sizeof(field_name));
memset(tran_type, 0, sizeof(tran_type));
if(get_settle_info(card_type, field_name, s_date, e_date) < 0) {
daylog(ERROR, "取%s清算日期错!", card_name);
return -1;
}
if(get_acq_bank(card_type, sys, acq_bank ) < 0 ) {
daylog(ERROR, "取%s收单行错!", card_name );
return -1;
}
if(get_tran_type(card_type, tran_type) < 0) {
daylog(ERROR, "取%s交易类型错!", card_name);
return (-1);
}
if(!memcmp(card_type, "50", 2))
strcpy(cardtype, "'51', '52', '53', '54', '55'");
else
sprintf(cardtype, "'%s'", card_type);
dateadd(sys->logic_date, -1, l_date);
getdatef(date, "");
if(!memcmp(card_type, "03", 2))
sprintf(sql_str, "select * from cur_tran_ls \
where acq_bank_id in ( %s ) and acq_host_id = '%s' \
and bank_type not in('04', '51', '52', '53', '54', '55') \
and (%s >= '%s' and %s < '%s') \
and saf_flag = '0' and tran_flag in ('0', '4') \
and resp_code = '00' and tran_type in (%s) \
and terminal_id[1,3] not in ('TRM','TEL','TLX','VOC') \
for update of snd_settle_flag, snd_settle_date ", acq_bank,
sys->host_id, field_name, s_date, field_name, e_date,tran_type);
else
sprintf(sql_str, "select * from cur_tran_ls \
where acq_bank_id in ( %s ) and acq_host_id = '%s' \
and card_type in (%s) \
and bank_type in('04', '51', '52', '53', '54', '55') \
and (%s >= '%s' and %s < '%s') \
and saf_flag = '0' and tran_flag in ('0', '4') \
and resp_code = '00' and tran_type in (%s) \
and terminal_id[1,3] not in ('TRM', 'TEL', 'TLX', 'VOC') \
for update of snd_settle_flag, snd_settle_date ", acq_bank,
sys->host_id, cardtype, field_name, s_date, field_name, e_date, tran_type);
EXEC SQL prepare s_sql from :sql_str;
if (SQLCODE) {
daylog(ERROR, "Unable prepare sql_str[%s]![%d]",
sql_str, SQLCODE);
return -1;
}
EXEC SQL declare settle_cur cursor for s_sql;
if (SQLCODE) {
daylog(ERROR, "Unable declare settle_cur![%d]", SQLCODE);
return -1;
}
EXEC SQL open settle_cur;
if ( SQLCODE ) {
daylog ( ERROR , "Unable open cursor settle_cur![%d]", SQLCODE);
return -1;
}
while(1) {
EXEC SQL fetch settle_cur into :tran_ls;
if (SQLCODE == 100) break;
if (SQLCODE) {
daylog(ERROR, "Unable fetch cur_tran_ls![%d]", SQLCODE);
EXEC SQL close settle_cur;
return -1;
}
del_st_space("cur_tran_ls", &tran_ls);
memcpy( tran_ls.snd_settle_date, date, 9 );
strcpy( tran_ls.snd_settle_flag, "Y" );
EXEC SQL select settle_mode into :settle_mode from merchant_base
where merchant_id = :tran_ls.merchant_id;
if(SQLCODE) {
daylog(ERROR, "Unable select settle_mode from merchant_base. merchant_id=[%s]![%d]", tran_ls.merchant_id, SQLCODE);
EXEC SQL close settle_cur;
return (-1);
}
if(memcmp(settle_mode, "Y", 1)) continue;
EXEC SQL insert into cur_settle_ls values ( :tran_ls) ;
if (SQLCODE) {
daylog(ERROR, "Unable insert cur_settle_ls![%d]", SQLCODE);
EXEC SQL close settle_cur;
return -1;
}
EXEC SQL update cur_tran_ls set snd_settle_flag='Y',
snd_settle_date=$l_date where current of settle_cur;
if(SQLCODE) {
daylog(ERROR, "Unable update settle_cur of cur_tran_ls![%d]", SQLCODE);
EXEC SQL close settle_cur;
return -1;
}
}
if(update_settle_date(card_type, s_date, e_date) < 0) {
EXEC SQL close settle_cur;
return -1;
}
EXEC SQL close settle_cur;
return 0;
}
int errtran_to_errsettle(S_sys_param *sys)
{
$char date[9], l_date[9];
getdatef(date, "");
dateadd(sys->logic_date, -1, l_date);
EXEC SQL update err_tran_ls set snd_settle_date = $date
where snd_settle_date = $l_date;
if (SQLCODE) {
daylog(ERROR, "Unable update snd_settle_date of err_tran_ls![%d]", SQLCODE);
return -1;
}
EXEC SQL insert into err_settle_ls select * from err_tran_ls
where snd_settle_date = $date and tran_type not in (4,12) ;
if (SQLCODE) {
daylog(ERROR, "Unable insert err_tran_ls to err_settle_ls![%d]", SQLCODE);
return -1;
}
EXEC SQL insert into his_err_tran_ls select * from err_tran_ls
where snd_settle_date = $date and tran_type not in(4,12);
if (SQLCODE) {
daylog(ERROR, "Unable insert err_tran_ls to his_err_tran_ls![%d]", SQLCODE);
return -1;
}
EXEC SQL delete from err_tran_ls where snd_settle_date = $date;
if (SQLCODE) {
daylog(ERROR, "Unable delete err_tran_ls![%d]", SQLCODE);
return -1;
}
return (0);
}
/*
* 传流水记录到当日清算流水表中
*/
int tran_to_settle()
{
EXEC SQL BEGIN DECLARE SECTION;
S_sys_param sys;
EXEC SQL END DECLARE SECTION;
char s_date[11], e_date[11], logic_date[11];
char *card_type[4]={"01", "02", "03", "50"};
char *card_name[4]={"信用卡", "借记卡", "它行卡", "外卡"};
int i;
if(get_nas_sysparam(&sys) < 0) {
daylog(ERROR, "取NAS本地参数表失败.");
return (-1);
}
dateadd(sys.logic_date, -1, logic_date);
daylog(ERROR, "日终清算处理时NAS逻辑日: [%s]", logic_date);
for(i = 0; i < 4; i++) {
if(insert_into_settle(card_type[i], card_name[i], s_date, e_date, &sys) < 0) {
daylog(ERROR, "%s交易流水转清算流水失败! s_date=[%s], e_date=[%s].", card_name[i], s_date, e_date);
return -1;
}
daylog(ERROR, "%s交易流水转清算流水成功. s_date=[%s], e_date=[%s],", card_name[i], s_date, e_date);
}
if(errtran_to_errsettle(&sys) < 0) {
daylog(ERROR, "当日异常批次转清算异常批次失败!");
return -1;
}
daylog(ERROR, "当日异常批次转清算异常批次成功!");
return 0;
}
/*
* 日终清算处理
*/
int chg_logic_date()
{
EXEC SQL BEGIN DECLARE SECTION;
S_sys_param sys;
EXEC SQL END DECLARE SECTION;
char auto_flag[2], screen[128];
sprintf(screen, "/tmp/.chg_logic_date.%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;
if (strcmp(G_cen_bankid, G_bankid)) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "[%s]行柜员无权进行日终处理, 统一由省行进行日终处理", G_bankid);
daylog(ERROR, "[%s]行柜员无权进行日终处理", G_bankid);
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return -1;
}
if (yorn(my_win, line, " 是否进行日终清算处理?", "1.是", "0.否", 1, 0)) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
$set lock mode to wait 60;
if(readtab("SETTLE_CONFIG", "ALL", "AUTO_SETTLE", auto_flag) < 0) {
disp_log_day(DISP_LOG, ERROR, "SETTLE_CONFIG文件中[ALL]下没有AUTO_SETTLE配置.");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return (-1);
}
if(auto_flag[0] == 'Y') {
disp_log_day(DISP_LOG, ERROR, "系统目前配置为自动清算方式.");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
if(get_nas_sysparam(&sys) < 0) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "取本地逻辑日失败, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
dateadd(sys.logic_date, 1, sys.logic_date);
EXEC SQL UPDATE sys_param SET logic_date = :sys.logic_date;
if (SQLCODE) {
line = PGS_LEE;
disp_log_day(DISP_LOG,ERROR,"切换本地逻辑日失败, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
act_set_reload_num();
daylog(ERROR, "切换NAS系统本地逻辑日成功.");
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "正在进行清算处理, 请稍候 ...");
EXEC SQL begin work;
/*
* 清算处理成功后,转当前交易流水表中收单记录到清算流水表中
*/
if (tran_to_settle() < 0) {
EXEC SQL rollback work;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -