📄 settle.0812.ec
字号:
daylog(ERROR, "Unable delete err_tran_ls!");
return -1;
}
/* 将汇计单计录转入历史汇计单表 */
$insert into his_hand_ls
select * from cur_hand_ls
where logic_date <= :logic_date;
if (SQLCODE) {
daylog(ERROR, "Unable insert from cur_hand_ls into his_hand_ls!(%d)", SQLCODE);
return -1;
}
$delete from cur_hand_ls
where logic_date <= :logic_date;
if (SQLCODE) {
daylog(ERROR, "Unable delete from cur_hand_ls!(%d)", SQLCODE);
return -1;
}
/*
$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 sel_merchant_id FROM :sqlstr;
EXEC SQL DECLARE sel_merchant_cur CURSOR WITH HOLD FOR sel_merchant_id;
EXEC SQL OPEN sel_merchant_cur;
if( SQLCODE < 0 ) {
daylog(ERROR, "OPEN Cursor Failed[%ld]", SQLCODE);
free(G_merchant_id_array);
return(-1);
}
i = 0;
while(i < G_total_merch) {
//循环查找流水记录
EXEC SQL FETCH sel_merchant_cur INTO :tmp_merch;
if( SQLCODE < 0 ) {
daylog(ERROR, "取商户号失败!![%ld]", SQLCODE);
EXEC SQL CLOSE sel_merchant_cur;
free(G_merchant_id_array);
return(-1);
}
if( SQLCODE == SQLNOTFOUND ) {
EXEC SQL CLOSE sel_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 sel_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;
G_total_merch = i;
i = 0;
while(i<G_total_merch) {
strcpy(tmp_merch, G_merchant_id_array[i].merch_id);
DelSpace(tmp_merch);
daylog(ERROR, "merchant_id=[%s]", tmp_merch);
EXEC SQL BEGIN WORK;
$insert into his_tran_ls
select * from cur_tran_ls
/* 非成功交易 */
where (resp_code not like '00'
/* 已确认,已撤消,已调整和已冲正*/
or tran_flag not in ('0','4')
or saf_flag = '1'
/* 非自己收单或自己发卡的超过2天的所有非PRE_AUTH交易*/
or ( acq_bank_id <> $sys.bank_id /* 非自己收单 */
and tran_type not in ( 4 )
and local_sys_date <= $tmp_date1
)
/*超过规定时间的特殊终端授权*/
or ( terminal_id in ('TEL_AUTH', 'TRM_AUTH', 'VOC_AUTH')
and local_sys_date <= $tmp_date1)
/*金额为0的所有交易
or ( tran_amt < 0.01 )
*/
/* 超过45天的所有交易*/
or local_sys_date <= $tmp_date2)
and merchant_id = $tmp_merch;
if (SQLCODE) {
daylog(ERROR, "Unable insert from cur_tran_ls into his_tran_ls!(%d)", SQLCODE);
EXEC SQL ROLLBACK WORK;
free(G_merchant_id_array);
return -1;
}
/* 删除当前非成功交易流水和不需要进行清算的交易流水 */
$delete from cur_tran_ls
/* 非成功交易 */
where (resp_code not like '00'
/* 已确认,已撤消,已调整和已冲正*/
or tran_flag not in ('0','4')
or saf_flag = '1'
/* 非自己收单或自己发卡的超过2天的所有非PRE_AUTH交易*/
or (acq_bank_id <> $sys.bank_id /* 非自己收单 */
and tran_type not in ( 4 )
and local_sys_date <= $tmp_date1
)
/*超过规定时间的特殊终端授权*/
or ( terminal_id in ('TEL_AUTH', 'TRM_AUTH', 'VOC_AUTH')
and local_sys_date <= $tmp_date1)
/*金额为0的所有交易
or ( tran_amt < 0.01 )
*/
/* 超过45天的所有交易*/
or local_sys_date <= $tmp_date2)
and merchant_id = $tmp_merch;
if (SQLCODE) {
daylog(ERROR, "Unable delete from cur_tran_ls!(%d)", SQLCODE);
EXEC SQL ROLLBACK WORK;
free(G_merchant_id_array);
return -1;
}
EXEC SQL COMMIT WORK;
i++;
}
return 0;
}
/*
* 日终清算处理
*/
int chg_logic_date()
{
$char logic_date[12];
char filename[128], screen[128];
FILE *fp;
SETTLE_RESULT s_r;
struct stat t_stat;
char tmp_date[9];
char tmp_time[7];
char buf[32];
char tmp_string[256];
char tmp_prompt_str[256];
getdatef(tmp_date, "");
gettimef(tmp_time, "");
/*取系统设置的清算模式和新模式的使用方法*/
memset(buf, '\0', sizeof(buf));
readtab("SETTLE_MODE", "SETTLE_SET", "SETTLE_MODE", buf);
G_settle_mode = atoi(buf);
if (G_settle_mode != 0 && G_settle_mode != 1)
G_settle_mode = 0;
if (G_settle_mode == 1) {
memset(buf, '\0', sizeof(buf));
readtab("SETTLE_MODE", "SETTLE_SET", "SETTLE_LEVEL", buf);
G_settle_level = atoi(buf);
if (G_settle_level < 0 || G_settle_level > 2) {
daylog(DEBUG, "系统清算模式设置有问题,清算模式设置为按逻辑日进行清算,\
但清算级别设置有误, 系统自动使用按EDC结算进清算方式处理");
G_settle_mode = 0;
}
}
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;
}
#ifdef wyz020704_mod
if (yorn(my_win, line, " 是否进行日终清算处理?", "1.是", "0.否", 1, 0)) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
#endif
$set lock mode to wait 60;
EXEC SQL SELECT * INTO :sys FROM sys_param;
if (SQLCODE) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "取本地逻辑日失败, 按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
del_st_space("sys_param", &sys);
#ifdef wyz_mod_020109
#else
sprintf(filename, "%s/etc/settle_result", getenv("WORKDIR"));
if ( stat(filename, &t_stat) == -1 ) {
if (errno == ENOENT) {
if ((fp = fopen(filename, "w+"))==NULL) {
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR,
"清算处理失败, 请联系管理员或亚大公司解决!!按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
s_r.result = 0;
strcpy(s_r.settle_date, tmp_date);
strcpy(s_r.logic_date, sys.logic_date);
strcpy(s_r.update_date, tmp_date);
strcpy(s_r.update_time, tmp_time);
strcpy(s_r.settle_op, "00");
if (fwrite(&s_r, sizeof(SETTLE_RESULT), 1, fp) != 1){
fclose(fp);
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR,
"清算处理失败, 请联系管理员或亚大公司解决!!按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
fclose(fp);
}
}
redoit:
if ((fp = fopen(filename, "r+"))==NULL){
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR,
"清算处理失败, 请联系管理员或亚大公司解决!!按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
if (fread(&s_r, sizeof(SETTLE_RESULT), 1, fp) != 1){
fclose(fp);
/*解决文件被破坏情况,如果文件被人为破坏则认为上次清算成功*/
if ((fp = fopen(filename, "w+"))!=NULL) {
s_r.result = 0;
strcpy(s_r.settle_date, tmp_date);
strcpy(s_r.logic_date, sys.logic_date);
strcpy(s_r.update_date, tmp_date);
strcpy(s_r.update_time, tmp_time);
strcpy(s_r.settle_op, "00");
if (fwrite(&s_r, sizeof(SETTLE_RESULT), 1, fp) == 1){
fclose(fp);
goto redoit;
}
fclose(fp);
}
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR,
"清算处理失败, 请联系管理员或亚大公司解决!!按任意键继续");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
fseek(fp, 0, 0);
if (s_r.result == -1) {/*上次清算切换逻辑日不成功*/
line += 1;
disp_log_day(DISP_LOG, ERROR,
"%s日清算不成功, 交易全部进入今日清算!!", s_r.settle_date);
}
else if (s_r.result == -2) {/*上次清算预处理不成功*/
/*即已切换了逻辑日*/
line += 1;
disp_log_day(DISP_LOG, ERROR,
"[%s]日清算交易预处理不成功, 系统将自动处理上次清算未处理的工作!!",s_r.settle_date);
line += 1;
disp_log_day(DISP_LOG, ERROR,
"系统处理完上次清算未处理的工作后,请首先产生[%s]日的入帐文件", s_r.settle_date);
line += 1;
disp_log_day(DISP_LOG, ERROR,
"并出[%s]日相应的报表!!",s_r.settle_date);
line += 1;
disp_log_day(DISP_LOG, ERROR,
"系统正在进行清算后处理工作,请耐心等待....");
if (pre_posls_to_history()) {
s_r.result = -2;
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG,
"系统清算后处理失败, 请联系系统管理员或亚大公司! 按任意键继续");
}
else {
if (posls_to_settle()) {
s_r.result = -3;
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR,
"系统清算后处理失败, 请联系系统管理员或亚大公司! 按任意键继续");
} else {
/*
* 清算处理成功
*/
s_r.result = 0;
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG,
"系统后处理成功,请出[%s]日的入帐文件并打印相应报表文件!!按任意键继续",s_r.settle_date);
}
}
strcpy(s_r.settle_op, G_oper_no);
strcpy(s_r.update_date, tmp_date);
strcpy(s_r.update_time, tmp_time);
fwrite(&s_r, sizeof(SETTLE_RESULT), 1, fp);
fclose(fp);
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
else if (s_r.result == -3) {/*上次清算转清算流水不成功*/
line += 1;
sprintf(tmp_string,
"[%s]日清算转清算流水不成功, 系统将自动处理上次清算未处理的工作!!",s_r.settle_date);
disp_log_day(DISP_LOG, DEBUG, "%s", tmp_string);
line += 1;
sprintf(tmp_string,
"系统处理完上次清算未处理的工作后,请首先产生[%s]日的入帐文件", s_r.settle_date);
disp_log_day(DISP_LOG, DEBUG, "%s", tmp_string);
line += 1;
disp_log_day(DISP_LOG, ERROR,
"并打印[%s]日相应的报表!!",s_r.settle_date);
line += 1;
disp_log_day(DISP_LOG, ERROR,
"系统正在进行清算后处理工作,请耐心等待....");
if (posls_to_settle()) {
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG,
"系统清算后处理失败, 请联系系统管理员或亚大公司! 按任意键继续");
}
else {
line = PGS_LEE;
disp_log_day(DISP_LOG, DEBUG,
"系统后处理成功, 请产生[%s]日入帐文件并打印相应报表!!按任意键继续",
s_r.settle_date);
s_r.result = 0;
}
strcpy(s_r.settle_op, G_oper_no);
strcpy(s_r.update_date, tmp_date);
strcpy(s_r.update_time, tmp_time);
fwrite(&s_r, sizeof(SETTLE_RESULT), 1, fp);
fclose(fp);
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
#endif
#ifdef wyz020704_mod
#else
if (strcmp(s_r.settle_date, tmp_date) == 0) {
sprintf(tmp_prompt_str, "[%s]日已进行日终处理, 系统将自动终止日终清算处理", tmp_date);
line ++;
disp_log_day(DISP_LOG, ERROR, tmp_prompt_str);
daylog(ERROR, tmp_prompt_str);
line ++;
disp_log_day(DISP_LOG, ERROR, "如果系统没有产生入帐文件或没有生成相应的报表,请调用相应的系统菜单生成");
line = PGS_LEE;
disp_log_day(DISP_LOG, ERROR, "按任意键退出");
getch();
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
else {
sprintf(tmp_prompt_str, " 是否进行日终清算处理?");
if (yorn(my_win, line, tmp_prompt_str, "1.是", "0.否", 1, 0)) {
delwin(my_win);
scr_restore(screen);
unlink(screen);
return(0);
}
}
#endif
disp_log_day(DISP_LOG, DEBUG, "切换本地逻辑日 ...");
dateadd(sys.logic_date, 1, logic_date);
EXEC SQL UPDATE sys_param SET logic_date = :logic_date;
if (SQLCODE) {
s_r.result = -1;
strcpy(s_r.settle_date, tmp_date);
strcpy(s_r.logic_date, logic_date);
strcpy(s_r.settle_op, G_oper_no);
strcpy(s_r.update_date, tmp_date);
strcpy(s_r.update_time, tmp_time);
fwrite(&s_r, sizeof(SETTLE_RESULT), 1, fp);
fclose(fp);
line = PGS_LEE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -