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

📄 agtpay.ec

📁 简单的银行代收系统
💻 EC
📖 第 1 页 / 共 2 页
字号:
		EXEC SQL ROLLBACK WORK;
		return (-1);
	}
	
	/* 验证 */
	if (datahead.sum_num != tot_num)
	{
		batlog("文件实际笔数与汇总信息不符合![%d][%d]  [%s][%d]", datahead.sum_num, tot_num, __FILE__, __LINE__);
	}

	if ( datahead.sum_amt - suc_amt - bad_amt < -ZEROAMT 
		|| datahead.sum_amt - suc_amt - bad_amt > ZEROAMT)
	{
		batlog("文件实际金额与汇总信息不符合![%.2lf][%.2lf]  [%s][%d]", datahead.sum_amt, suc_amt+bad_amt, __FILE__, __LINE__);
	}

	/* 生成结果文件 */
	ret = gen_retfile(&datahead, suc_num, bad_num, suc_amt, reflag);
	if (ret != 0)
	{
		batlog("生成结果文件错!  [%s][%d]", __FILE__, __LINE__);
		return (-1);
	} 

	/* 关闭数据库 */
	EXEC SQL CLOSE DATABASE;
	if (SQLCODE)
	{
		batlog("关闭数据库失败!database_name[%s][%d]  [%s][%d]", database, SQLCODE, __FILE__, __LINE__);
		return (-1);
	}

	batlog("批量代发工资完成!  [%s][%d]", __FILE__, __LINE__);

	return (0);
}

/* 写日志函数
 * Function: batlog(char * fmt,...)
 */
void batlog(va_alist)   /*  va_alist = parameters table*/
va_dcl
{
    va_list args;/*  a varible in order to check parameters table */
    char *sign,*fmt;
    char err_str1[80],err_str2[80];
    char outfile[80];
    char *home;
    FILE *logfd;
    time_t itm;
    struct tm *stm;

    memset(err_str1,'-',79); err_str1[79]='\0';
    memset(err_str2,'*',79); err_str2[79]='\0';
    memset(outfile,0x0,80);

    itm=time(&itm);
    stm=localtime(&itm);

    sprintf(outfile,"./%s", ERRNAME );
    /*  initial parameters table, set args at start of parameters table */

    va_start(args);
    if ((logfd=fopen(outfile,"a"))==NULL)
	{
        fprintf(stderr,"Error in open %s\n",outfile);
        return;
    }

    fprintf(logfd,"%s\n",err_str2);
    fprintf(logfd,"%4d/%02d/%02d %02d:%02d:%02d\n",\
                                stm->tm_year+1900,\
                                stm->tm_mon+1,stm->tm_mday,\
                                stm->tm_hour,stm->tm_min,stm->tm_sec);

    fmt=va_arg(args,char *);
    vfprintf(logfd,fmt,args);
    fprintf(logfd,"\n%s\n",err_str1);
    fflush(logfd);

    va_end(args);       /* clear parameters table       */
    fclose(logfd);
}

/* 去右空格函数
 * Function: char *batlog(char * fmt,...)
 */
char * rtrim ( char *str )
{
    char *endp;

    if ( str == NULL )  return str;
    for ( endp = strchr (str, '\0'); endp != (char*)str && *--endp == ' '; )
         *endp = '\0';
    return (str);
}

/*取文件中某个域的值
 *Function: get_value(char * line, int *index, char * value)
 *		  line -- 原字符串
 *		  index -- 起始位置
 *        value -- 域值
 */
char *
get_value(char * line, int *index, char * value)
{
	char *p = NULL;

	p = strchr(&line[*index], '|');
	if (p == NULL)
	{
		p = strchr(&line[*index], '\n');
		if (p == NULL)
		{
			return(NULL);
		}
	}
	strncpy(value, &line[*index], p - &(line[*index]));
    *index	= *index + (p - &(line[*index])) + 1;

	return (value);
}

/*取第一行汇总信息
 *Function: read_tot_line(char * line, struct s_data_head *head)
 *			line -- 原内容字符串
 *			head -- 第一行汇总信息结构体指针
 *return: 0 -- 成功 <0 -- 失败
 */
int
read_tot_line(char * line, struct s_data_head * head)
{
	char tmpstr[80+1];
	int index = 0;

	memset(tmpstr, 0, sizeof(tmpstr));

	/* 单位名称 */
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	strncpy(head->corp_name, tmpstr, 60);

	/* 合计金额 */
	memset(tmpstr, 0, sizeof(tmpstr));
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	head->sum_amt = atof(tmpstr);

	/* 合计笔数 */
	memset(tmpstr, 0, sizeof(tmpstr));
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	head->sum_num = atoi(tmpstr);

	/* 代发日期 */
	memset(tmpstr, 0, sizeof(tmpstr));
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	strncpy(head->tran_date, tmpstr, 8);

	/* 内部帐户 */
	memset(tmpstr, 0, sizeof(tmpstr));
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	strncpy(head->inn_acc, tmpstr, 30);

	/* 检查合法性 */
	if ( strlen(head->corp_name) == 0
		|| head->sum_amt < -ZEROAMT
		|| (head->sum_amt > -ZEROAMT && head->sum_amt < ZEROAMT)
		|| head->sum_num <= 0
		|| strlen(head->tran_date) == 0
		|| strlen(head->inn_acc) == 0
	   )
	{
		batlog("第一行汇总信息不合法!\ncorp_name[%s]\nsum_amt[%.2lf]\nsum_num[%d]\ntran_date[%s]\ninn_acc[%s]  [%s][%d]",
              head->corp_name, head->sum_amt, head->sum_num, head->tran_date,head->inn_acc, __FILE__, __LINE__);
		return (-1);
	}

	return (0);
}


/*取明细信息
 *Function: read_body(char * line, struct s_data_body *body)
 *			line -- 原内容字符串
 *			head -- 明细信息结构体指针
 *return: 0 -- 成功 <0 -- 失败
 */
int read_body(char *line, struct s_data_body *body) 
{
	char tmpstr[80+1];
	int	index = 0;

	memset(tmpstr, 0, sizeof(tmpstr));
	
	/* 帐号 */
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	strncpy(body->acc, tmpstr, 30);
	
	/* 户名 */
	memset(tmpstr, 0, sizeof(tmpstr));
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	strncpy(body->acc_name, tmpstr, 60);
	
	/* 金额 */
	memset(tmpstr, 0, sizeof(tmpstr));
	get_value(line, &index, tmpstr);
	rtrim(tmpstr);
	body->amt = atof(tmpstr);
	
	/* 检查合法性 */
	if ( strlen(body->acc) == 0
		|| strlen(body->acc_name) == 0
		|| body->amt < -ZEROAMT
		|| (body->amt > -ZEROAMT && body->amt < ZEROAMT)
	   )
	{
		batlog("此条信息不合法!\nacc[%s]\nacc_name[%s]\namt[%.2lf]  [%s][%d]",
              body->acc, body->acc_name, body->amt, __FILE__, __LINE__);
    	return (-1); 
	}

	return (0);
}


/*插代发工资结果表
 *Function: insert_payret(struct s_data_head *head, struct s_data_body *body, int flag, char * msg)
 *			head -- 第一行汇总信息结构体指针
 *			body -- 明细信息结构体指针
 *			flag -- 0:成功操作,1:失败操作
 *			msg  -- 失败时的说明信息
 *return: 0 -- 成功 <0 -- 失败
 */
int
insert_payret(head, body, flag, msg)
	struct s_data_head *head;
	struct s_data_body *body;
	int flag;
	char * msg;
{
	EXEC SQL BEGIN DECLARE SECTION;
		struct s_agt_payret payret;
	EXEC SQL END DECLARE SECTION;
	
	memset(&payret, 0, sizeof(payret));
	
	strcpy(payret.acc, body->acc);
	strcpy(payret.corp_name, head->corp_name);
	rdefmtdate(&payret.tran_date, "yyyymmdd", head->tran_date);
	sprintf(payret.flag, "%d", flag);
	if(flag == 1)
	{
		strncpy(payret.remark, msg, 60);
	}

	/* 插入表中 */
	EXEC SQL INSERT INTO t_agt_payret VALUES (:payret);
	if (SQLCODE)
	{
		if(SQLCODE == 239)
		{
			batlog("Warning:有重复记录!\nacc[%s]\ncorp_name[%s]\ntran_date[%s]  [%s][%d]",
              payret.acc, payret.corp_name, head->tran_date, __FILE__, __LINE__);
    		return (0); 
		}
		else
		{
			batlog("数据库操作错!\nsqlcode[%d]\nacc[%s]\ncorp_name[%s]\ntran_date[%s]  [%s][%d]",
              SQLCODE, payret.acc, payret.corp_name, head->tran_date, __FILE__, __LINE__);
    		return (-1); 
		}	
	}
	
	return (0);
}


/*生成结果清单
 *Function: gen_retfile(struct s_data_head *head, long suc_num, long bad_num, double suc_amt, long reflag )
 *			head -- 第一行汇总信息结构体指针
 *			body -- 明细信息结构体指针
 *			flag -- 0:成功操作,1:失败操作
 *			msg  -- 失败时的说明信息
 *return: 0 -- 成功 <0 -- 失败
 */
int
gen_retfile(head, suc_num, bad_num, suc_amt, reflag)
EXEC SQL BEGIN DECLARE SECTION;
	parameter struct s_data_head *head;
EXEC SQL END DECLARE SECTION;
	long suc_num;
	long bad_num;
	double suc_amt;
	long reflag;
{
	EXEC SQL BEGIN DECLARE SECTION;
		int tran_date = 0;
		struct s_agt_payret payret;
	EXEC SQL END DECLARE SECTION;
	char top[80+1];
	char mid[80+1];
	char enm[80+1];
	char end[80+1];
	char stramt[20+1];
	char filename[80+1];
	FILE * fp = NULL;

	memset(&payret, 0, sizeof(payret));
	memset(top, 0, sizeof(top));
	memset(mid, 0, sizeof(mid));
	memset(enm, 0, sizeof(enm));
	memset(end, 0, sizeof(end));
	memset(filename, 0, sizeof(filename));
	memset(stramt, 0, sizeof(stramt));

	strcpy(top, "┌─────────┬───────────────┐\n");
	strcpy(mid, "├─────────┼───────────────┤\n");
	strcpy(enm, "├─────────┴───────────────┤\n");
	strcpy(end, "└─────────────────────────┘\n");

	sprintf(filename, "./%s", RETNAME); 
	fp = fopen(filename, "w");
	if (fp == NULL)
	{
		batlog("打开结果文件失败!filename[%s]  [%s][%d]", filename, __FILE__, __LINE__);
		return (-1);
	}

	/* 写基本信息 */
	fprintf(fp, "%s", top);
	fprintf(fp, "|%18s|%30s|\n", "代发单位", head->corp_name);
	fprintf(fp, "%s", mid);

	memset(stramt, 0, sizeof(stramt));
	sprintf(stramt, "%.2lf", head->sum_amt);
	fprintf(fp, "|%18s|%30s|\n", "预计发放金额", stramt);
	fprintf(fp, "%s", mid);

	memset(stramt, 0, sizeof(stramt));
	sprintf(stramt, "%.2lf", suc_amt);
	if ( reflag == 0 )
	{
		fprintf(fp, "|%18s|%30s|\n", "实际发放金额", stramt);
	}
	else
	{
		fprintf(fp, "|%18s|%30s|\n", "补发金额", stramt);
	}
	fprintf(fp, "%s", mid);

	fprintf(fp, "|%18s|%30d|\n", "代发总户数", head->sum_num);
	fprintf(fp, "%s", mid);

	fprintf(fp, "|%18s|%30d|\n", "成功户数", suc_num);
	fprintf(fp, "%s", mid);

	fprintf(fp, "|%18s|%30d|\n", "失败户数", bad_num);
	fprintf(fp, "%s", mid);

	fprintf(fp, "|%18s|%30s|\n", "失败帐户", "失败原因");
	fprintf(fp, "%s", enm);

	/* 查询失败明细 */
	rdefmtdate(&tran_date, "yyyymmdd", head->tran_date);	
	EXEC SQL DECLARE cur_payret CURSOR FOR
		SELECT * FROM t_agt_payret
			WHERE corp_name = :head->corp_name
			AND tran_date = :tran_date
			AND flag = '1';
	if (SQLCODE)
	{
		batlog("定义游标失败!sqlcode[%d]  [%s][%d]", SQLCODE, __FILE__, __LINE__);
		fclose(fp);
		return (-1);
	}

	EXEC SQL OPEN cur_payret;
	if (SQLCODE)
	{
		batlog("打开游标失败!sqlcode[%d]  [%s][%d]", SQLCODE, __FILE__, __LINE__);
		fclose(fp);
		return (-1);
	}

	while (1)
	{
		memset(&payret, 0, sizeof(payret));
		EXEC SQL FETCH cur_payret INTO :payret;
		if (SQLCODE == 100)
		{
			break;
		}
		else if (SQLCODE < 0)
		{
			batlog("查询结果表失败!sqlcode[%d]  [%s][%d]", SQLCODE, __FILE__, __LINE__);
			EXEC SQL CLOSE cur_payret;
			EXEC SQL FREE cur_payret;
			fclose(fp);
			return (-1);
		}
		rtrim(payret.acc);
		rtrim(payret.remark);
		fprintf(fp, "|%18s  %30s|\n", payret.acc, payret.remark);
	}

	EXEC SQL CLOSE cur_payret;
	EXEC SQL FREE cur_payret;

	fprintf(fp, "%s", end);

	fclose(fp);

	return (0);
}

⌨️ 快捷键说明

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