⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 settle.ec.cp

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 CP
📖 第 1 页 / 共 5 页
字号:
	}
	else {
		daylog(DEBUG, "insert into his_settle_ls begin");
		EXEC SQL insert into his_settle_ls
		select * from cur_settle_ls;
	
		if (SQLCODE) {
			daylog(ERROR, "Unable insert cur_settle_ls to his_settle_ls(%d)!", SQLCODE);
			return -1;
		}
	
		daylog(DEBUG, "delete from cur_settle_ls begin");
		EXEC SQL delete from cur_settle_ls;
	
		if (SQLCODE) {
			daylog(ERROR, "Unable delete cur_settle_ls!");
			return -1;
		}
	}

	/* 清除异常批次表时,转历史异常批次表 */
	$insert into his_err_tran_ls
	select * from err_tran_ls
	where local_logic_date <= $sys.logic_date;

	if (SQLCODE) {
		daylog(ERROR, "Unable insert err_tran_ls to his_err_tran_ls!");
		return -1;
	}

	$delete from err_tran_ls
	where local_logic_date <= $sys.logic_date;

	if (SQLCODE) {
		daylog(ERROR, "Unable delete err_tran_ls!");
		return -1;
	}

	/* 将汇计单计录转入历史汇计单表 */
	$insert into his_hand_ls
	select * from cur_hand_ls
	where logic_date <= $sys.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 <= $sys.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(1) {
		//循环查找流水记录
		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;

$ifdef wyz020628_mod;
#ifdef wyz020606_mod
	sprintf(sqlstr, "SELECT DISTINCT merchant_id from merchant_base");
#else
	sprintf(sqlstr, "SELECT DISTINCT merchant_id from cur_tran_ls");
#endif

	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);
		return(-1);
	}

	while(1) {
		//循环查找流水记录
		EXEC SQL FETCH sel_merchant_cur INTO :tmp_merch; 
		if( SQLCODE < 0 ) {
			daylog(ERROR, "取商户号失败!![%ld]", SQLCODE);
			EXEC SQL CLOSE sel_merchant_cur;
			return(-1);
		}
	
		if( SQLCODE == SQLNOTFOUND ) {
			EXEC SQL CLOSE sel_merchant_cur;
			break;
		}
$else;
	i = 0;
	while(i<G_total_merch) {
		strcpy(tmp_merch, G_merchant_id_array[i].merch_id);
$endif;

		DelSpace(tmp_merch);
		daylog(ERROR, "merchant_id=[%s]", tmp_merch);

		$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 )
		*/
		/* 超过30天的所有交易*/
		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);
$ifdef wyz020628_mod;
			EXEC SQL CLOSE sel_merchant_cur;
$else;
			free(G_merchant_id_array);
$endif;
			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 )
		*/
		/* 超过30天的所有交易*/
		or local_sys_date <= $tmp_date2)
		and merchant_id = $tmp_merch;
	
		if (SQLCODE) {
			daylog(ERROR, "Unable delete from cur_tran_ls!(%d)", SQLCODE);
$ifdef wyz020628_mod;
			EXEC SQL CLOSE sel_merchant_cur;
$else;
			free(G_merchant_id_array);
$endif;
			return -1;
		}
$ifdef wyz020628_mod;
$else;
		i++;
$endif;
	}

	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];

    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 == 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;
    }

    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;

    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, tmp_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]日交易全部进入今日清算!!",
		s_r.settle_date, tmp_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_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_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_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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -