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

📄 charge_balance0908.cpp

📁 通信BOSS计费方面的服务器源码,有很多经典的创意,值得借鉴,在UNIX上运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "charge_balance.h"#include "payment.flds.h"//-----------------------------------------------------------------//构造函数//-----------------------------------------------------------------CBalance::CBalance(char *pcInp,COracle *pcDatabase){	cDatabase = pcDatabase;	pInp = pcInp;}//------------------------------------------------------------------------//服务 PBWriteOff 实现函数,实现存款和销帐——共15个参数//传入参数gl_staff_id,acct_id,acct_seq_nbr,//	 营业员        合同号  合同号序列号  		(销帐|存款共有参数)//billing_cycle_id,charge,change,derate	//帐期(200210)       费用  上次零钱 违约金			(销帐参数)//checknbr,amount,balance,cycle_begin_date,//支票号码 输入金额 帐户余额 帐期(20021021)	//present_staff,ldt_advance,ldt_present//赠款预存标识	预存款余额   赠款余额			(存款参数)//------------------------------------------------------------------------void CBalance::BalWriteOff(){	char lsSql[2048],lsTemp[1024],lsErr[500];	char staff_id[20],acct_id[20],acct_seq_nbr[6];	char *lparm[20];		int i,isqlcode,lpnum,rpnum;	int bal_flag;	//----共有变量----	char change[10],new_change[10],charge[15],derate[15],billing_cycle_id[10];	char bill_serial_nbr[20],pay_serial_nbr[20];	char lsRetstr[200];	char ls_w_balance[20],ls_w_advance[20],ls_w_present[20];//余额	long w_balance,w_advance,w_present;//余额	long total_amount;//销帐实收费用	//----销帐变量----	char checknbr[50],cycle_begin_date[15];	char paymaxno[30],paymethod[4],systime[20];	char ls_conduct[2],ls_optype[4];	long year,month,day;	int rt,write_flag;	int day_diff;	long remain;	char hist_id[15];		char ls_amount[20],ls_balance[20];	long amount;//当前操作金额	long balance;//总的余额	char ls_present[20],ls_eff_date[15],ls_month[6];//接收预存款、赠款预存本金临时变量	long lde_advance;//预存款余额	long lde_present;//赠款余额	char present_staff[2]; //赠款存入标识        long t_present;//临时赠款本金用于检索赠款        char p_type[2],t_type[2],p_rate[3],t_month[3];//赠费标识|失效时间计算方式标识|赠费比例|有效期        //----存款变量----                        char temp_date[20],nullity_date[20];//有效时间        long n_year,n_month;//用于计算有效期        char a_year[10],a_month[10],a_day[10];//用于计算有效期        char temp_year[10],temp_md[10];//用于重新组织失效时间顺序。        //----有效时间变量----                	lpnum=17;		//userlog(pInp);	rpnum=GetInputParm(pInp,lparm,50);	if(rpnum!=lpnum)	{		lpfree(lparm,rpnum);					cDatabase->Rollback();		strcpy(lsTemp,"解析客户端传入参数失败,可能参数数据或传输格式不正确!\n");		if(WriteLog(cDatabase,"-1","w_p_balance",lsTemp,lsErr)!=1)			strcat(lsTemp,lsErr);		cDatabase->Commit();		StrReturn(-2,lsTemp);	}	strcpy(staff_id,lparm[0]);	strcpy(acct_id,lparm[1]);	strcpy(acct_seq_nbr,lparm[2]);		strcpy(billing_cycle_id,lparm[3]);//帐期(200210)	strcpy(charge,lparm[4]);//费用	strcpy(change,lparm[5]);//上次零钱	strcpy(derate,lparm[6]);//违约金	total_amount=atof(charge)*100+atof(change)*100+atof(derate)*100;//销帐实收费用		strcpy(checknbr,lparm[7]);//支票号	strcpy(cycle_begin_date,lparm[8]);//帐期(20021021)	bal_flag=atoi(lparm[9]); //第一次调用服务标识	write_flag=atoi(lparm[10]);	strcpy(ls_amount,lparm[11]);//输入金额	strcpy(ls_balance,lparm[12]);//帐户余额	strcpy(present_staff,lparm[13]);//赠费存款标识	strcpy(ls_present,lparm[14]);//赠款余额	strcpy(ls_eff_date,lparm[15]);	strcpy(ls_month,lparm[16]);	amount=atol(ls_amount);	balance=atol(ls_balance);	lde_present=atol(ls_present);	lpfree(lparm,rpnum);   strcpy(lsTemp," ");//初始化返回变量——实现多次销帐的参数返回///////////////////////////////////////////////   	//取系统时间(单独提出来)	strcpy(lsSql,	"SELECT to_char(sysdate,'YYYY-MM-DD'),to_char(sysdate,'yy'), "		"to_char(sysdate,'mm'),to_char(sysdate,'dd') "		"FROM dual "	);		cDatabase->DoSql(lsSql);	isqlcode=cDatabase->GetSqlCode();		if(isqlcode<0)	{		strcpy(lsTemp,"存取预付款取系统时间出错!\n");		cDatabase->Rollback();		strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");		if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)			strcat(lsTemp,lsErr);		cDatabase->Commit();		StrReturn(-1,lsTemp);	}		strcpy(systime,cDatabase->data->GetColData(1,1));		year=atol(cDatabase->data->GetColData(1,2));	month=atol(cDatabase->data->GetColData(1,3));	day=atol(cDatabase->data->GetColData(1,4));///////////////////////////////////////////////	         //存款	   if(bal_flag==0)   {	///////////////////////////////////////////////	if(strcmp(cycle_begin_date,"0")==0)	{		strcpy(lsSql,"select to_char(max(cycle_begin_date),'yyyymmdd')"		             " from b_billing_cycle "		             " where cycle_begin_date<sysdate");		cDatabase->DoSql(lsSql);		isqlcode=cDatabase->GetSqlCode();			//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());		//userlog("检索返回行数:%d",cDatabase->GetRowCount());				if(isqlcode<0)		{			strcpy(lsTemp,"存取费用开始时间出错!\n");			cDatabase->Rollback();			strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");			if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)				strcat(lsTemp,lsErr);			cDatabase->Commit();			StrReturn(-1,lsTemp);		}		        strcpy(cycle_begin_date,cDatabase->GetData());			        }        sprintf(lsSql," select trunc(sysdate - to_date('%s','yyyymmdd'),0) from dual "                     ,cycle_begin_date);	cDatabase->DoSql(lsSql);	isqlcode=cDatabase->GetSqlCode();	//userlog(lsSql);	//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());	//userlog("检索返回行数:%d",cDatabase->GetRowCount());			if(isqlcode<0)	{		strcpy(lsTemp,"取时间差出错!\n");		cDatabase->Rollback();		strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");		if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)			strcat(lsTemp,lsErr);		cDatabase->Commit();		StrReturn(-1,lsTemp);	}        day_diff=atoi(cDatabase->GetData());	        		       		sprintf(lsSql," insert into LBAS.service_billing "		              " select LBAS.seq_service_billing_init.nextval ,"		              " area_code,acc_nbr,'05',to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'0',serv_type_id "		              " from lbas.serv "		              " where acct_id=%s"		              " and  state ='F0K' "		              ,acct_id);			cDatabase->DoSql(lsSql);			isqlcode=cDatabase->GetSqlCode();			//userlog(lsSql);			//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());			//userlog("检索返回行数:%d",cDatabase->GetRowCount());							if(isqlcode<0)			{				strcpy(lsTemp,"插入复机清单出错!\n");				cDatabase->Rollback();				strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");				if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)					strcat(lsTemp,lsErr);				cDatabase->Commit();				StrReturn(-1,lsTemp);			}    		sprintf(lsSql,"update b_serv "		              " set state=decode(state,'F0K','F0A','F0L','F0J') "		              " where acct_id=%s "		              " and state in ('F0K','F0L') " 		              ,acct_id);			cDatabase->DoSql(lsSql);			isqlcode=cDatabase->GetSqlCode();			//userlog(lsSql);			//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());			//userlog("检索返回行数:%d",cDatabase->GetRowCount());							if(isqlcode<0)			{				strcpy(lsTemp,"修改收费档案出错!\n");				cDatabase->Rollback();				strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");				if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)					strcat(lsTemp,lsErr);				cDatabase->Commit();				StrReturn(-1,lsTemp);			}    			      		sprintf(lsSql,"update lbas.serv "		              " set state=decode(state,'F0K','F0A','F0L','F0J') "		              " where acct_id=%s "		              " and state in ('F0K','F0L') "		              ,acct_id );			cDatabase->DoSql(lsSql);			isqlcode=cDatabase->GetSqlCode();			//userlog(lsSql);			//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());			//userlog("检索返回行数:%d",cDatabase->GetRowCount());							if(isqlcode<0)			{				strcpy(lsTemp,"修改计费档案出错!\n");				cDatabase->Rollback();				strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");				if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)					strcat(lsTemp,lsErr);				cDatabase->Commit();				StrReturn(-1,lsTemp);			}                 		sprintf(lsSql,"update lbas.realtime_charge_acc "		              " set state=decode(state,'F0K','F0A','F0L','F0J') "		              " where acct_id=%s "		              " and state in ('F0K','F0L') "		              ,acct_id );			cDatabase->DoSql(lsSql);			isqlcode=cDatabase->GetSqlCode();			//userlog(lsSql);			//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());			//userlog("检索返回行数:%d",cDatabase->GetRowCount());							if(isqlcode<0)			{				strcpy(lsTemp,"修改realtime_charge_acc出错!\n");				cDatabase->Rollback();				strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");				if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)					strcat(lsTemp,lsErr);				cDatabase->Commit();				StrReturn(-1,lsTemp);			}          			    			         				                         	if(amount>=0)	{		strcpy(ls_conduct,"1");		strcpy(ls_optype,"10");	}	else 	{		strcpy(ls_conduct,"2");		strcpy(ls_optype,"30");	}			if(strcmp(checknbr,NULL)==0||strcmp(checknbr,"")==0) strcpy(paymethod,"11");	else strcpy(paymethod,"12");			cDatabase->BeginTran();		//计算基数	sprintf(lsSql,	"UPDATE BALANCE_TABLE_ADMIN  "	"SET radix = radix + total_amount * ( (%d - to_number(to_char(state_date,'yy'))) * 360 +   "            "(%d - to_number(to_char(state_date,'mm'))) * 30 +   "	    "((%d - %d/31) - (to_number(to_char(state_date,'dd')) - to_number(to_char(state_date,'dd'))/31)) )  "	"WHERE acct_id = %s AND   "		"state = '1'  "	,year,month,day,day,acct_id);	 	//userlog(lsSql);	cDatabase->DoSql(lsSql);	isqlcode=cDatabase->GetSqlCode();	//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());			if(isqlcode<0)	{		strcpy(lsTemp,"存取预付款计算基数出错!\n");		strcat(lsTemp,cDatabase->GetSqlErrText());strcat(lsTemp,"\n");		cDatabase->Rollback();		if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)			strcat(lsTemp,lsErr);		cDatabase->Commit();		StrReturn(-1,lsTemp);	}		///////////////////////////////////////////////		//更新销帐库的BALANCE_TABLE_ADMIN表中的数据	sprintf(lsSql,	"UPDATE BALANCE_TABLE_ADMIN   "	"SET total_amount = %ld + %ld ,  "	         " present=present + %ld,  "	         " advance=advance + %ld,  "		 "state_date = sysdate  "	"WHERE acct_id = %s AND   "			"state = '1'  "	,balance,lde_present,lde_present,amount,acct_id);		//userlog(lsSql);	cDatabase->DoSql(lsSql);	isqlcode=cDatabase->GetSqlCode();	//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());		if(isqlcode<0) 	{			strcpy(lsTemp,"更新销帐库的BALANCE_TABLE_ADMIN表中的数据时出错!\n");		strcat(lsTemp,cDatabase->GetSqlErrText());		strcat(lsTemp,"\n");		cDatabase->Rollback();		if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)			strcat(lsTemp,lsErr);		cDatabase->Commit();		StrReturn(-1,lsTemp);	}			//更新收费库B_ACCT表中的balance字段的值	sprintf(lsSql,	"UPDATE B_ACCT   "	"SET balance = %ld + %ld   "	"WHERE acct_id=%s AND  "		"state='10A'  "	,balance,lde_present,acct_id);			//userlog(lsSql);	cDatabase->DoSql(lsSql);	isqlcode=cDatabase->GetSqlCode();	//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());		if(isqlcode<0) 	{			strcpy(lsTemp,"更新收费库B_ACCT表中的balance字段的值时出错!\n");		strcat(lsTemp,cDatabase->GetSqlErrText());		strcat(lsTemp,"\n");		cDatabase->Rollback();		if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)			strcat(lsTemp,lsErr);		cDatabase->Commit();		StrReturn(-1,lsTemp);	}		//更新实时费用表	/*sprintf(lsSql,	"UPDATE LBAS.realtime_charge_acc   "	"SET month_acc = 0   "	"WHERE acct_id=%s  "	,acct_id);			//userlog(lsSql);	cDatabase->DoSql(lsSql);	isqlcode=cDatabase->GetSqlCode();	//userlog("Sqlcode: %d SqlErrText: %s",isqlcode,cDatabase->GetSqlErrText());		if(isqlcode<0) 	{			strcpy(lsTemp,"更新计费库realtime_charge_acc表中的month_acc字段的值时出错!\n");		strcat(lsTemp,cDatabase->GetSqlErrText());		strcat(lsTemp,"\n");		cDatabase->Rollback();		if(WriteLog(cDatabase,staff_id,"w_p_balance",lsTemp,lsErr)!=1)			strcat(lsTemp,lsErr);		cDatabase->Commit();		StrReturn(-1,lsTemp);	}	*/				//更新计费库ACCT表中的balance字段的值	sprintf(lsSql,	"UPDATE LBAS.ACCT   "	"SET balance = %ld + %ld  "	"WHERE acct_id=%s AND  "		"state = '10A'  "	,balance,lde_present,acct_id);			//userlog(lsSql);	cDatabase->DoSql(lsSql);

⌨️ 快捷键说明

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