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

📄 comp.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
📖 第 1 页 / 共 2 页
字号:
/*******************************************************
 *	核对交易明细(check_mx)
 *
 * 最后修改:	周国祥 2001/08/19
 *******************************************************/
#include <stdio.h>
#include <curses.h>
#include "all.h"
#include "tool.h"
#include "macro_def.h"

$include "db_struct.h"
$include sqlca;

EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

int check_mx()
{
	WINDOW *my_win;
	$S_debit_mx mx;
	$S_sys_param sys;
	$char center[128];
	char local[128], local_out[128], center_out[128];
	char path[64], filename[128], today[11], cmd[2000];
	char normal[80] = "(", rev[80] = "(", buf[160] = "";
	/* old:2消费3退货4取现5存款8转帐9代收11确认21授权消费 */
	/* now:1消费9退货3取现7存款6转出10转入14双转5确认2授权消费8调帐 */
	/* old:6撤销 */
	/* now:12撤销 */
/***
	char *p, *trans[] = { "2,4,11,", "3,5,", "8,9,", "21,10," };
***/
	char *p, *trans[] = { "1,3,5,8,", "9,7,", "6,10,14,", "2,4," };
	int i;

	$select * into :sys from sys_param;
	if (SQLCODE) {
		daylog(ERROR, "Unable select sys_param table!");
		return(-1);
	}
	del_st_space("sys_param", &sys);

	/* 若是总行则退出 */
	if (!strcmp(sys.bank_id, sys.adm_bank_id) &&
	    !strcmp(sys.host_id, sys.adm_host_id) )
		return(0);

	getdatef(today, "");
	strcpy(path, getenv("WORKDIR"));
	sprintf(center, "%s/box/mx/R/Debit%4.4s.%2.2s%2.2s%2.2s",
		path, sys.adm_bank_id, today + 2, today + 4, today + 6);

	$select * into :mx from debit_mx
	where filename = :center;
	if (SQLCODE < 0) {
		daylog(ERROR, "Select debit_mx error!");
		return(-1);
	}
	if (SQLCODE == 100 || mx.flag[0] == '0') {
		daylog(ERROR, "Debit mx has not reached!");
		return(-1);
	}
	del_st_space("debit_mx", &mx);

	sprintf(filename, "/tmp/.check_mx.%d", getpid());
	scr_dump(filename);

	disp_below("核对交易明细");
	clear_wline(stdscr, LINES-1);
	h_prompt(LINES-1, 1, "                                                                 < ESC 退出 > ", 0, 0);
	h_prompt(LINES-1, 1, "核对交易明细", 0, 0);
	my_win = newwin(19, 80, 3, 0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

	mvwprintw(my_win, 2, 4, "处理中, 请稍候 ...");
	wrefresh(my_win);

	sprintf(local, "/tmp/.debit_mx.%d", getpid());

	for (i = 0; i < 7; i++) {
		if (!(mx.items & (1 << (7 - i)))) continue;
		if (i % 2) p = rev;
		else p = normal;
		strcat(p, trans[i / 2]);
	}
	if (strlen(rev) > 1) {
		rev[strlen(rev) - 1] = ')';
		if (strlen(normal) > 1) strcat(buf, "(");
		sprintf(buf + strlen(buf),
			"(tran_type=%d and void_tran_type in %s)",
			POS_VOID, rev);
		if (strlen(normal) > 1) strcat(buf, "or ");
	}
	if (strlen(normal) > 1) {
		normal[strlen(normal) - 1] = ')';
		sprintf(buf + strlen(buf),
			"(tran_type in %s and void_tran_type=0)", normal);
		if (strlen(rev) > 1) strcat(buf, ")");
	}

/***********
	sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nunload to \"%s\" select merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), local);
	sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, gcc_trace, adjust_amount, currency_code, res_flag, flag1, err_flag, ret_code, refunded, oper_no, down_flag, up_flag, manunal_flag, dac from posls ");
	sprintf(cmd + strlen(cmd), "where ((fk_bankid != \"%s\" and fk_bankid not in (select bankid from jgbm_basic where headquarter = \"%s\")) or authno like \"____HO\" or (sd_bankid != \"%s\" and sd_bankid not in (select bankid from jgbm_basic where headquarter = \"%s\"))) and %s ", sys.center, sys.center, sys.center, sys.center, buf);
	sprintf(cmd + strlen(cmd), "and ret_code like \"00%%\" and res_flag = \"O\" and refunded = \"N\" and manunal_flag = \"N\" and remote_date = \"%s\" and card_type = \"01\" order by merchant_id, terminal_id, trace;\n!", mx.logic_date);

***********/
	sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nunload to \"%s\" select merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), local);
	sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, void_amt, ccy_code, tran_flag, saf_flag, offline_flag, edc_err_flag, resp_code, oper_no, snd_settle_flag, rcv_settle_flag, manual_flag from cur_tran_ls ");
	sprintf(cmd + strlen(cmd), "where ((iss_bank_id != \"%s\" and iss_bank_id not in (select bank_id from bank_info where adm_bank_id = \"%s\")) or auth_no like \"____HO\" or (acq_bank_id != \"%s\" and acq_bank_id not in (select bank_id from bank_info where adm_bank_id = \"%s\"))) and %s ", sys.bank_id, sys.bank_id, sys.bank_id, sys.bank_id, buf);
	sprintf(cmd + strlen(cmd), "and resp_code like \"00%%\" and saf_flag = \"0\" and tran_flag != '4' and manual_flag = \"N\" and rcv_settle_date = \"%s\" and card_type = \"%s\" order by merchant_id, terminal_id, trace_no;\n!", mx.logic_date, DEBIT_CARD);

	i = system(cmd);
	if (i) {
		daylog(ERROR, "Debit mx unload error!");
		h_winprompt(my_win, 17, 4, "数据库操作错误!", 1, 0);
		goto end;
	}

	sprintf(center_out, "%s/box/mx/diff/%4.4s.%2.2s%2.2s%2.2s",
		path, sys.adm_bank_id, today + 2, today + 4, today + 6);
	sprintf(local_out, "%s/box/mx/diff/%4.4s.%2.2s%2.2s%2.2s",
		path, sys.bank_id, today + 2, today + 4, today + 6);

	i = comp(local, center, local_out, center_out);
	switch (i) {
	    case -1:
		daylog(ERROR, "Read %s error!", local);
		break;
	    case -2:
		daylog(ERROR, "Read %s error!", center);
		break;
	    case -3:
		daylog(ERROR, "Write %s error!", local_out);
		break;
	    case -4:
		daylog(ERROR, "Write %s error!", center_out);
		break;
	}
	if (i) {
		h_winprompt(my_win, 17, 4, "文件操作错误!", 1, 0);
		unlink(local_out);
		unlink(center_out);
	} else {
		mvwprintw(my_win, 4, 4, "交易明细核对完成!");
		mvwprintw(my_win, 6, 4, "本地多出的交易明细显示在文件 %s 中",
			  local_out);
		mvwprintw(my_win, 7, 4, "中心多出的交易明细显示在文件 %s 中",
			  center_out);
		if (fool(local_out, center_out))
			mvwprintw(my_win, 17, 4, "交易明细调整失败!");
		else
			mvwprintw(my_win, 9, 4, "交易明细调整完成!");
		wgetch(my_win);
	}
	unlink(local);
end:
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);
	return(0);
}

int comp(char *local, char *center, char *local_out, char *center_out)
{
	FILE *fpl, *fpc, *fplo, *fpco;
	char bufl[512], bufc[512];

	if (!(fpl = fopen(local, "r")))
		return(-1);
	if (!(fpc = fopen(center, "r"))) {
		fclose(fpl);
		return(-2);
	};
	if (!(fplo = fopen(local_out, "w+"))) {
		fclose(fpl);
		fclose(fpc);
		return(-3);
	}
	if (!(fpco = fopen(center_out, "w+"))) {
		fclose(fpl);
		fclose(fpc);
		fclose(fplo);
		return(-4);
	}

	fgets(bufl, 512, fpl);
	fgets(bufc, 512, fpc);
	while (!feof(fpl) && !feof(fpc)) {
		switch (compare(bufl, bufc)) {
		    case 0:
			fgets(bufl, 512, fpl);
			fgets(bufc, 512, fpc);
			break;
		    case 1:
			fputs(bufl, fplo);
			fgets(bufl, 512, fpl);
			break;
		    case 2:
			fputs(bufc, fpco);
			fgets(bufc, 512, fpc);
			break;
		    case 3:
			fputs(bufl, fplo);
			fputs(bufc, fpco);
			fgets(bufl, 512, fpl);
			fgets(bufc, 512, fpc);
			break;
		}
	}
	if (!feof(fpl)) {
		fputs(bufl, fplo);
		addall(fpl, fplo);
	}
	if (!feof(fpc)) {
		fputs(bufc, fpco);
		addall(fpc, fpco);
	}
	fclose(fpl);
	fclose(fpc);
	fclose(fplo);
	fclose(fpco);
	return(0);
}

int compare(char *str1, char *str2)
{
	int	i, trace1, trace2, type1, type2, oldtype1, oldtype2;
	double	amt1, amt2;

	i = memcmp(str1, str2, 20);
	if (i < 0) return(1);
	if (i > 0) return(2);

	sscanf(str1 + 20, "%d|%d|%d|%lf|", &trace1, &type1, &oldtype1, &amt1);
	sscanf(str2 + 20, "%d|%d|%d|%lf|", &trace2, &type2, &oldtype2, &amt2);

	if (trace1 < trace2) return(1);
	if (trace1 > trace2) return(2);

	if (type1 != type2) return(3);

	if (oldtype1 != oldtype2) return(3);

	if (amt1 != amt2) return(3);

	return(0);
}

int addall(FILE *fpin, FILE *fpout)
{
	char buf[512];

	fgets(buf, 512, fpin);
	while (!feof(fpin)) {
		fputs(buf, fpout);
		fgets(buf, 512, fpin);
	}
	return(0);
}

int fool(char *local_out, char *center_out)
{
	$S_sys_param sys;
	$S_tran_ls local, center;
	$short indi;
	$int count;
	$char flag;
	char cmd[512], tmp[11];
	int i;

	$select * into :sys from sys_param;
	if (SQLCODE) {
		daylog(ERROR, "Select sys_param error!");
		return(-1);
	}
	del_st_space("sys_param", &sys);
	$delete from local_ls;
	if (SQLCODE) {
		daylog(ERROR, "Delete local_ls error!");
		return(-1);
	}
	$delete from center_ls;
	if (SQLCODE) {
		daylog(ERROR, "Delete center_ls error!");
		return(-1);
	}
/***********
	sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase boc_db;\nload from \"%s\" insert into local_ls (merchant_id, terminal_id, trace, trans_type, old_type, amount, sd_bankid, fk_bankid, source_bankid, target_bankid, local_date, remote_date, equip_date, equip_time, mcc, bank_type, card_type, ", local_out);
	sprintf(cmd + strlen(cmd), "card_no, expire, person_id, card_no2, invoice, void_invoice, hostls, batch_no, authno, rrn, gcc_trace, adjust_amount, currency_code, res_flag, flag1, err_flag, ret_code, refunded, oper_no, down_flag, up_flag, manunal_flag, dac);\n!");
************/
	sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nload from \"%s\" insert into local_ls (merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), local_out);
	sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, void_amt, ccy_code, saf_flag, tran_flag, offline_flag, edc_err_flag, resp_code, oper_no, snd_settle_flag, rcv_settle_flag, manual_flag);\n!");
	i = system(cmd);
	if (i) {
		daylog(ERROR, "load %s error!", local_out);
		return(-1);
	}
/********
	sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase boc_db;\nload from \"%s\" insert into center_ls (merchant_id, terminal_id, trace, trans_type, old_type, amount, sd_bankid, fk_bankid, source_bankid, target_bankid, local_date, remote_date, equip_date, equip_time, mcc, bank_type, card_type, ", center_out);
	sprintf(cmd + strlen(cmd), "card_no, expire, person_id, card_no2, invoice, void_invoice, hostls, batch_no, authno, rrn, gcc_trace, adjust_amount, currency_code, res_flag, flag1, err_flag, ret_code, refunded, oper_no, down_flag, up_flag, manunal_flag, dac);\n!");
********/
	sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nload from \"%s\" insert into center_ls (merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), center_out);
	sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, void_amt, ccy_code, saf_flag, tran_flag, offline_flag, edc_err_flag, resp_code, oper_no, snd_settle_flag, rcv_settle_flag, manual_flag);\n!");
	i = system(cmd);
	if (i) {
		daylog(ERROR, "load %s error!", center_out);
		return(-1);
	}

	begin_tran();

	$declare local_cur cursor for
	select * from local_ls
	where void_tran_type = 0;
	$open local_cur;
	if (SQLCODE) {
		rollback_tran();
		daylog(ERROR, "Open local_cur error!");
		return(-1);
	}
	while (1) {
		$fetch local_cur into :local;
		if (SQLCODE == 100) break;
		if (SQLCODE) {
			$close local_cur;
			rollback_tran();
			daylog(ERROR, "Fetch local_cur error!");
			return(-1);
		}
		del_st_space("tran_ls", &local);
		i = s_chk(sys.bank_id, sys.host_id, center.acq_bank_id, center.acq_host_id);
		if (i < 0) {
			$close local_cur;
			rollback_tran();
			daylog(ERROR, "Check depend error!");
			return(-1);
		}
		$select count(*) into :count:indi from center_ls
		where merchant_id = :local.merchant_id
		and terminal_id = :local.terminal_id
		and void_invoice_no = :local.invoice_no;
		if (SQLCODE < 0) {
			$close local_cur;
			rollback_tran();
			daylog(ERROR, "Select center_ls error!");
			return(-1);
		}
		if (count == 0 || indi == -1) flag = 'K'; /* 已冲正 */
		else flag = 'C';	/* 已撤消 */
		if (i) {
			if (flag == 'K') {
				$update cur_tran_ls set
				saf_flag = '1',
				rcv_settle_flag = 'Y',
				offline_flag = '0'
				where merchant_id = :local.merchant_id
				and terminal_id = :local.terminal_id
				and invoice_no = :local.invoice_no

⌨️ 快捷键说明

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