📄 settle.ec.cp
字号:
if ( head_flag == 0 ) {
$update mx_logtab set proc_flag='1'
where current of load_settle0;
}
else {
$update mx_logtab set proc_flag='1'
where current of load_settle1;
}
if ( SQLCODE ) {
daylog ( ERROR , \
"Unable update mx_logtab's proc_flag to '1' ( file_name = %s ) !" , 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;
}
disp_log_day ( DISP_ONLY , DEBUG, "装入%13.13s成功!(联行号=%4.4s-%2.2s)" ,\
mx_log.file_name , mx_log.sd_bankid, mx_log.sd_hostid);
}
if ( head_flag == 0 )
$close load_settle0;
else
$close load_settle1;
disp_log_day ( DISP_ONLY, DEBUG, "共装入%d个交易明细!" , cnt );
$commit work;
$delete from mx_logtab
where proc_flag='1';
if ( SQLCODE ) {
daylog ( ERROR, "Unable delete mx_logtab!" );
}
return 0;
}
/*
* 下传清算文件
*/
/* send the reconciliation file to the branch */
int down_settle_file ()
{
$char datebuf[12];
$char ipaddr[21];
$char head[12];
$char file_name[200],tmpfile[50];
$char file_name2[200];
$ S_bank_base bank_base;
$ S_sys_param sys;
char buf[1024];
time_t t;
struct tm *tm;
$select * into $sys from sys_param;
if ( SQLCODE ) {
daylog ( ERROR , "Select sys_param table error !");
return -1;
}
del_st_space("sys_param", &sys);
time ( &t );
tm = localtime ( &t );
$declare downcur cursor for
select bank_id, host_id from bank_info x
where (adm_bank_id != bank_id)
and adm_bank_id = $sys.bank_id and adm_host_id = $sys.host_id
and exists (
select bank_id, host_id from bank_info
where ( (bank_id = x.bank_id and host_id = x.host_id) or
bank_id in ( select bank_id from bank_info
where adm_bank_id = x.bank_id ))
and ( bank_id in ( select bank_id from bank_base
where settle_flag = '1' ))
);
if ( SQLCODE ) {
daylog ( ERROR ,"Unable declare downcur!" );
return (-1) ;
}
$open downcur;
if ( SQLCODE ) {
daylog ( ERROR ,"Unable open downcur !" );
return (-1);
}
while (1) {
$fetch downcur into $bank_base.bank_id, $bank_base.host_id;
if ( SQLCODE && SQLCODE != 100 ) {
daylog ( ERROR ,"Unable fetch downcur !" );
$close downcur;
return (-1) ;
} else if ( SQLCODE == 100 ){
$close downcur;
return (0);
}
DelSpace(bank_base.bank_id);
DelSpace(bank_base.host_id);
sprintf ( file_name , "%s/box/mx/S/%11.11s.%02d%02d%02d" , \
getenv("WORKDIR"), bank_base.bank_id, tm->tm_year , tm->tm_mon+1 , \
tm->tm_mday );
sprintf ( file_name2 , "%s/box/mx/R/%4.4s.%02d%02d%02d" , \
getenv("WORKDIR"), sys.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' or iss_bank_id in (select bank_id from bank_info where adm_bank_id='%s')) and (iss_bank_id in (select bank_id from bank_base where settle_flag='1')) and tran_type not in (%d, %d) and saf_flag='0' and tran_flag='0';\n!", getenv("DBNAME"), file_name, CREDIT_CARD, bank_base.bank_id, bank_base.bank_id, POS_VOID, PRE_AUTH);
system ( buf);
$select settle_ip_addr into $ipaddr from bank_base
where bank_id=$bank_base.bank_id
and host_id=$bank_base.host_id;
DelSpace(ipaddr);
if ( mail(sys.bank_id, bank_base.bank_id, ipaddr,
MX_RECV_PORT , file_name , "c",file_name2 )) {
disp_log_day ( DISP_ONLY, ERROR , "下传%s联行失败!" , bank_base.bank_id );
$close downcur;
daylog ( ERROR , "Unable mail %s to %s!",sys.bank_id,bank_base.bank_id);
return ( -1 );
}
disp_log_day ( DISP_ONLY, DEBUG, "下传%s联行成功!" , bank_base.bank_id );
}
}
/*
* 转入历史流水
*/
int day_end()
{
char filename[128], screen[128];
$char s_date[15], e_date[15];
int ret;
sprintf(screen, "/tmp/.day_end.%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;
getdatef(s_date, "");
dateadd(s_date, -1, s_date);
mvwprintw(my_win, 2, 4, "请输入起始清算日期: [%s]", s_date);
ret = in_item(my_win, "", 2, 25, s_date, 8, NULL, NULL, 0, 0);
if (ret != ENTER) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
strcpy(e_date, s_date);
//mvwprintw(my_win, 2, 41, "请输入结束清算日期: [%s]", e_date);
//ret = in_item(my_win, "", 2, 62, e_date, 8, NULL, NULL, 0, 0);
mvwprintw(my_win, 3, 4, "请输入结束清算日期: [%s]", e_date);
ret = in_item(my_win, "", 3, 25, e_date, 8, NULL, NULL, 0, 0);
if (ret != ENTER) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
#ifdef wyz_mod_011229
#else
if (strcmp(s_date, e_date) >0 ){
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR,
"起始日期大于结束日期, 操作失败, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(-1);
}
#endif
line = line+3;
disp_log_day(DISP_LOG, DEBUG, "警告: 转入历史流水后将无法处理当日报表! 请确认已进行过日终报表处理!");
line++;
if (yorn(my_win, line, " 是否继续?", "1.是", "0.否", 1, 0)) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
disp_log_day(DISP_LOG, DEBUG, "警告: 转入历史流水后将无法传送当日清算文件! 请确认已进行过清算文件传送!");
line++;
if (yorn(my_win, line, " 是否继续?", "1.是", "0.否", 1, 0)) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
disp_log_day(DISP_LOG, DEBUG, "转入历史流水, 请稍候 ...");
EXEC SQL INSERT INTO his_settle_ls
SELECT * FROM cur_settle_ls
WHERE snd_settle_date >= $s_date
AND snd_settle_date <= $e_date
AND edc_err_flag = '0';
if (SQLCODE) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "备份表 settle_ls 出错, 请立即联系系统管理员! 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
EXEC SQL DELETE FROM cur_settle_ls
WHERE snd_settle_date >= $s_date
AND snd_settle_date <= $e_date
AND edc_err_flag = '0';
if (SQLCODE) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "清理表 settle_ls 出错, 请立即联系系统管理员! 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG, "转入历史流水成功, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
/*
* 传流水记录到当日清算流水表中
*/
int posls_to_settle()
{
char filename[80];
char buf[1024];
int sys_ret;
$char l_date[20];
$char e_date[9], e_time[7];
$char sqlstr[512];
$char tmp_merch[16];
$char tmp_sttl_mode[2];
int i=0;
daylog(ERROR, "posls_to_settle() begin.");
getdatef(e_date, "");
gettimef(e_time, "");
dateadd(sys.logic_date, -1, l_date);
/*
$set isolation to cursor stability;
$set isolation to dirty read;
*/
$ifdef wyz020628_mod;
$else;
/*将当前流水表中所有商户取入内存中*/
EXEC SQL SELECT count(DISTINCT merchant_id) INTO :G_total_merch FROM cur_tran_ls;
if (SQLCODE) {
daylog(ERROR, "取当前交易流水中商户号数错误[%d]", SQLCODE);
return -1;
}
G_merchant_id_array = (struct MERCH_STRUCT *)malloc(G_total_merch * sizeof(struct MERCH_STRUCT));
if (G_merchant_id_array == NULL) {
daylog(ERROR, "申请空间失败");
return -1;
}
memset(G_merchant_id_array, 0, G_total_merch * sizeof(struct MERCH_STRUCT));
sprintf(sqlstr, "SELECT DISTINCT merchant_id FROM cur_tran_ls");
EXEC SQL PREPARE get_merchant_id FROM :sqlstr;
EXEC SQL DECLARE get_merchant_cur CURSOR WITH HOLD FOR get_merchant_id;
EXEC SQL OPEN get_merchant_cur;
if( SQLCODE < 0 ) {
daylog(ERROR, "OPEN Cursor Failed[%ld]", SQLCODE);
free(G_merchant_id_array);
return(-1);
}
i = 0;
while(1) {
//循环查找流水记录
EXEC SQL FETCH get_merchant_cur INTO :tmp_merch;
if( SQLCODE < 0 ) {
daylog(ERROR, "取商户号失败!![%ld]", SQLCODE);
EXEC SQL CLOSE get_merchant_cur;
free(G_merchant_id_array);
return(-1);
}
if( SQLCODE == SQLNOTFOUND ) {
EXEC SQL CLOSE get_merchant_cur;
break;
}
DelSpace(tmp_merch);
EXEC SQL SELECT settle_mode INTO :tmp_sttl_mode FROM merchant_base
WHERE merchant_id = :tmp_merch;
if (SQLCODE < 0) {
daylog(ERROR, "取商户[%s]清算模式失败[%d]", tmp_merch, SQLCODE);
EXEC SQL CLOSE get_merchant_cur;
free(G_merchant_id_array);
return -1;
}
else if (SQLCODE == 100) {
tmp_sttl_mode[0] = 'N';
}
tmp_sttl_mode[1] = '\0';
strcpy(G_merchant_id_array[i].merch_id, tmp_merch);
G_merchant_id_array[i].sttl_mode[0] = tmp_sttl_mode[0];
i ++;
}
$endif;
/*按照商户分批地转流水*/
$ifdef wyz020628_mod;
#ifdef wyz020625_mod
sprintf(sqlstr, "SELECT merchant_id, settle_mode from merchant_base order by merchant_id");
#else
sprintf(sqlstr, "SELECT DISTINCT merchant_id from cur_tran_ls");
#endif
EXEC SQL PREPARE sel_tran_ls FROM :sqlstr;
EXEC SQL DECLARE sel_tran_ls_cur CURSOR WITH HOLD FOR sel_tran_ls;
if( SQLCODE < 0 ) {
daylog(ERROR, "DECLARE Cursor Failed[%ld]", SQLCODE);
return(-1);
}
EXEC SQL OPEN sel_tran_ls_cur;
if( SQLCODE < 0 ) {
daylog(ERROR, "OPEN Cursor Failed[%ld]", SQLCODE);
return(-1);
}
while(1) {
//循环处理流水记录
$ifdef wyz020625_mod;
EXEC SQL FETCH sel_tran_ls_cur INTO :tmp_merch, :tmp_sttl_mode;
$else;
EXEC SQL FETCH sel_tran_ls_cur INTO :tmp_merch;
$endif;
if( SQLCODE < 0 ) {
daylog(ERROR, "Fetch Opened Cursor Failed[%ld]", SQLCODE);
EXEC SQL CLOSE sel_tran_ls_cur;
return(-1);
}
if( SQLCODE == SQLNOTFOUND ) {
EXEC SQL CLOSE sel_tran_ls_cur;
break;
}
$else;
i = 0;
memset(tmp_merch, 0, sizeof(tmp_merch));
while(i < G_total_merch) {
strcpy(tmp_merch, G_merchant_id_array[i].merch_id);
tmp_sttl_mode[0] = G_merchant_id_array[i].sttl_mode[0];
$endif;
DelSpace(tmp_merch);
$ifdef wyz020628_mod;
$ifdef wyz020625_mod;
$else;
EXEC SQL SELECT settle_mode INTO :tmp_sttl_mode FROM merchant_base
WHERE merchant_id = :tmp_merch;
if (SQLCODE<0) {
daylog(ERROR, "select settle_mode Failed[%ld]", SQLCODE);
EXEC SQL CLOSE sel_tran_ls_cur;
return(-1);
}
else if (SQLCODE == 100) {
daylog(DEBUG,"没有找到该商户[%s]的清算模式,系统自动置不参加清算",tmp_merch);
tmp_sttl_mode[0] = 'N';
}
$endif;
$else;
$endif;
tmp_sttl_mode[1] = '\0';
daylog(DEBUG, "Merchant_id=%s[%s]", tmp_merch, tmp_sttl_mode);
/* 将当前流水中收单行或发卡行为本行的交易
且已清算清算日期等于当前日期的正常交易
且不是PRE_AUTH和POS_VOID交易转入cur_settle_ls中
*/
$begin work;
/*手工清算商户,不进清算流水,直接清入历史流水*/
/* 删除当前交易流水已清算的记录 */
if (tmp_sttl_mode[0] == 'N') {
daylog(DEBUG, "手工清算商户[%s],不进清算流水,直接清入历史流水", tmp_merch);
EXEC SQL INSERT INTO his_tran_ls
SELECT * from cur_tran_ls
where snd_settle_flag = 'Y'
and snd_settle_date <= $l_date
and tran_type <> 4
and merchant_id = $tmp_merch;
if (SQLCODE) {
daylog(ERROR, "Insert into his_tran_ls failed!(%d)", SQLCODE);
$rollback work;
$ifdef wyz020628_mod;
EXEC SQL CLOSE sel_tran_ls_cur;
$else;
free(G_merchant_id_array);
$endif;
return -1;
}
$delete from cur_tran_ls
where snd_settle_flag = 'Y'
and snd_settle_date <= $l_date
and tran_type <> 4
and merchant_id = $tmp_merch;
if (SQLCODE) {
daylog(ERROR, "Unable delete from cur_tran_ls!(%d)", SQLCODE);
$rollback work;
$ifdef wyz020628_mod;
EXEC SQL CLOSE sel_tran_ls_cur;
$else;
free(G_merchant_id_array);
$endif;
return -1;
}
$commit work;
continue;
}
if (G_settle_mode == 0) { /*使用EDC结算交易进清算*/
$insert into cur_settle_ls
select * from cur_tran_ls
where acq_bank_id = $sys.bank_id
and snd_settle_flag = 'Y'
and snd_settle_date <= $l_date
and saf_flag in ('0') /* 冲正标志:正常 */
and edc_err_flag in ('0') /* 正常 */
and tran_flag in ('0','4') /* 交易标志:正常,已退货 */
and resp_code = '00'
and tran_type not in (4,12) /* 预授权,撤消 */
and tran_amt >= 0.01 /* 交易金额为0*/
and terminal_id not like 'TRM%'
and merchant_id = $tmp_merch;
if (SQLCODE) {
daylog(ERROR, "Unable insert cur_tran_ls to cur_settle_ls![%ld]", SQLCODE);
$rollback work;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -