Ejemplo n.º 1
0
int F240004(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;

	T_t_refno     tRefno;
	T_t_transdtl  transdtl; //卡操作流水表,用做冲正用

	memset(&transdtl,0,sizeof transdtl);
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);

	SetCol(handle,0);
   	SetCol(handle,F_SHOLDER_AC_NO,F_SCLOSE_EMP,F_SORDER0,F_SORDER1,F_SSERIAL1,F_LVOL0,F_LVOL1,F_SDATE0,F_STIME0,F_SDATE1,F_STIME1,F_SCUST_NO,F_SCHANGE_EMP,F_SSERIAL0,F_LVOL2,F_SCUST_AUTH,F_SSTATUS1,F_SEMP_PWD,F_SEMP_PWD2,F_SSTATION0,F_SSTATION1,F_SORDER2,0);

	ret =  DB_t_refno_open_select_by_c1_and_status(RS_YKTREVSUCC);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			return E_DB_REFNO_N;
		return E_DB_REFNO_R;
	}
	while(1)
	{
		memset(&tRefno,0,sizeof tRefno);
		ret = DB_t_refno_fetch_select_by_c1(&tRefno);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return 0;
			else
				return E_DB_REFNO_R;
		}
		break;
	}
	ret=DB_t_transdtl_read_by_accdate_and_termid_and_termseqno(tRefno.accdate,tRefno.termid,tRefno.termseqno,&transdtl);
	if(ret)
	{
		if(ret==DB_NOTFOUND)
			return E_DB_TRANSDTL_N;
		else 
			return E_DB_TRANSDTL_R;
	}	
	sprintf(out_pack->sorder0,"%-9d", int(transdtl.amount));     // 转账时 限制了金额不能有小数
	Strncpy_t(out_pack->sdate0,transdtl.transdate,sizeof(out_pack->sdate0));
	Strncpy_t(out_pack->stime0,transdtl.transtime,sizeof(out_pack->stime0));
	sprintf(out_pack->sserial0,"%-10d",transdtl.cardno);
	Strncpy_t(out_pack->scust_auth,transdtl.extdata,sizeof(out_pack->scust_auth));
	out_pack->lvol0=atoi(transdtl.refno+8);
	//out_pack->lvol1=atoi(transdtl.refno+8);
	out_pack->lvol2=transdtl.termid;

	des2src(out_pack->sholder_ac_no,transdtl.refno);	// 交易参考号
	des2src(out_pack->sdate1,tRefno.mac);
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
}
Ejemplo n.º 2
0
static int NormalTrans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL8,F_LVOL10,F_LVOL11,F_LVOL12,F_SDATE0,F_SPHONE3,F_SADDR,F_LSAFE_LEVEL2,
		F_SDATE3,F_STIME3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);

	des2src(trans.refno,rPack->sphone3);		//交易参考号
	if(strlen(trans.refno)!=14)
	{
		 ERRTIP("交易参考号错误");
		 return E_COMMON_ERR;
	}
	T_t_refno tRefno;
	memset(&tRefno,0,sizeof(tRefno));

	ret=DB_t_refno_read_by_refno(trans.refno,&tRefno);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_REFNO_N;
		else
			return E_DB_REFNO_R;
	}
	if(strncmp(tRefno.mac,rPack->saddr,8)!=0)
	{
		ERRTIP("交易参考号MAC校验错误");
		return E_COMMON_ERR;
	}
	if(RS_FAIL==tRefno.status)
	{
		ERRTIP("交易已失败");
		return E_COMMON_ERR;
	}
	T_t_transdtl transdtl;	
	memset(&transdtl,0,sizeof(transdtl));
	ret=DB_t_transdtl_read_by_accdate_and_termid_and_termseqno(tRefno.accdate,tRefno.termid,tRefno.termseqno,&transdtl);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_NOTEXIST_TRANSDTL;
		else
			return E_DB_TRANSDTL_R;
	}
	int waterflag=0;
	if(transdtl.exttype/1000==1)//水控
		waterflag=1;
	if(RS_SUCC==tRefno.status)
	{
		outPack->lvol0=transdtl.cardno;
		outPack->lvol1=D4U5(transdtl.amount*100,0);
		outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);
		if(waterflag)//水控
		{
			double wateraftbal= atof(transdtl.extdata);
			outPack->lsafe_level2=D4U5(wateraftbal*100,0);
		}
		des2src(outPack->sdate3,transdtl.transdate);
		des2src(outPack->stime3,transdtl.transtime);
		des2src(outPack->semp,transdtl.opercode);
		outPack->lwithdraw_flag=transdtl.termid;
		outPack->lserial1=transdtl.termseqno;
		des2src(outPack->sphone3,transdtl.refno);	
		des2src(outPack->saddr,tRefno.mac);
		PutRow(handle,outPack,pRetCode,szMsg);
		return 0;
	}
	if(transdtl.status[0]!=DTLSTATUS_INIT)
	{
		ERRTIP("交易流水表状态错误");
		return E_COMMON_ERR;
	}
	des2src(trans.opercode,transdtl.opercode);
	trans.termid=transdtl.termid;
	trans.termseqno=transdtl.termseqno;
	trans.cardflag=1;
	trans.usecardflag=1;	
	trans.transcode=transdtl.transcode;
	trans.cardno=transdtl.cardno;	
	trans.purseno=transdtl.purseno;
	trans.paycnt=transdtl.cardcnt;
	trans.cardbefbal=transdtl.cardbefbal;
	trans.cardaftbal=transdtl.cardbefbal;
	trans.inputamt= transdtl.amount;	
	trans.unusedamt = trans.inputamt;

	CPaymentBase *payment;
	payment = CPaymentBase::find_payment(transdtl.exttype);
	if(NULL == payment)
	{
		return E_TRANS_FUNC_NONSUPPORT;
	}
	rPack->lcert_code = transdtl.exttype;
	strcpy(rPack->sbank_acc,transdtl.extdata);
	ret = payment->init(handle,&aPack,rPack);
	if(ret)
	{
		writelog(LOG_ERR,"trade[%d],ret[%d]",transdtl.exttype,ret);		
		return	ret;
	}
	pAccTrans->SetSummary(payment->payment_.summary);
	
	T_t_card tCard;

	memset(&tCard,0,sizeof(tCard));

	ret=DB_t_card_read_by_cardno(trans.cardno,&tCard);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno);
		else
			return E_DB_CARD_R;
	}
	strcpy(trans.cardaccno,tCard.accno);
	trans.feetype=tCard.feetype;
	trans.custid=tCard.custid;
	
	ret=pAccTrans->doTrans();
	if(ret)
		return ret;
	ret=pAccTrans->doTransEnd();
	if(ret)
		return ret;	
	ret=UpdateCardBitmap(trans.cardno,trans.paycnt,CARDBITMAPTYPE_SYS_ONLINE);
	if(ret)
		return ret;
	transdtl.status[0]=DTLSTATUS_SUCCESS;
	ret=DB_t_transdtl_update_by_accdate_and_termid_and_termseqno(tRefno.accdate,tRefno.termid,tRefno.termseqno,&transdtl);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_TRANSDTL_N;
		else
			return E_DB_TRANSDTL_U;
	}
	tRefno.status=RS_SUCC;
	strcpy(tRefno.lastsaved,trans.sysdatetime);
	ret=DB_t_refno_update_by_refno(tRefno.refno,&tRefno);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_REFNO_N;
		else
			return E_DB_REFNO_U;
	}
	outPack->lvol0=tCard.cardno;
	outPack->lvol1=D4U5(trans.inputamt*100,0);
	outPack->lvol8=D4U5(trans.cardaftbal*100,0);
	if(waterflag)//水控
	{
		double wateraftbal= atof(transdtl.extdata);
		outPack->lsafe_level2=D4U5(wateraftbal*100,0);
	}
	des2src(outPack->sdate3,trans.accdate);
	des2src(outPack->stime3,trans.acctime);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=trans.termid;
	outPack->lserial1=trans.termseqno;
	des2src(outPack->sphone3,trans.refno);
	des2src(outPack->saddr,tRefno.mac);
	sprintf(trans.remark,"%s卡余额%.2lf元",pAccTrans->remark.c_str(),pAccTrans->trans.cardaftbal);
	des2src(outPack->vsmess,trans.remark);
//	AnswerData(handle,*pRetCode,szMsg);
	//进行第三方支付
	if(payment->payment_.onlinepay)
	{
		ret=db_commit();
		if(ret)
		{
			writelog(LOG_ERR,"数据库事务提交失败 ret=%d",ret);
			return E_DB_COMMIT;
		}
		rPack->lwithdraw_flag=outPack->lwithdraw_flag;
		rPack->lserial1=outPack->lserial1;
		rPack->lvol0=outPack->lvol0;
		rPack->lvol1=outPack->lvol1;
		rPack->lvol8=outPack->lvol8;
		rPack->lsafe_level2=outPack->lsafe_level2;
		des2src(rPack->sdate3,outPack->sdate3);
		des2src(rPack->stime3,outPack->stime3);
		des2src(rPack->sphone3,outPack->sphone3);
		des2src(rPack->saddr,outPack->saddr);	//mac
		des2src(rPack->semp,outPack->semp);		
		ret=payment->transfer(handle,rPack,outPack);
		if(ret)
		{
			writelog(LOG_ERR,"与第三方系统交易失败 ret=%d",ret);
			return ret;
		}
		if(payment->pushflag_ != 1)
			PutRow(handle,outPack,pRetCode,szMsg);			
	}
	else
	{
		PutRow(handle,outPack,pRetCode,szMsg);			
	}
	return 0;
}
Ejemplo n.º 3
0
static int NormalTrans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL2,F_LVOL8,F_LVOL10,F_LVOL11,F_LVOL12,F_SDATE0,F_SPHONE3,F_SADDR,F_LSAFE_LEVEL2,
		F_SDATE3,F_STIME3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);

	if(rPack->lvol0<1)
	{
		ERRTIP("请输入付款方卡号");
		return E_COMMON_ERR;
	}
	if(rPack->lvol2<1)
	{
		ERRTIP("请输入收款方卡号");
		return E_COMMON_ERR;
	}
	des2src(trans.refno,rPack->sphone3);		//交易参考号
	if(strlen(trans.refno)!=14)
	{
		 ERRTIP("交易参考号错误");
		 return E_COMMON_ERR;
	}
	T_t_refno tRefno;
	memset(&tRefno,0,sizeof(tRefno));

	ret=DB_t_refno_read_by_refno(trans.refno,&tRefno);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_REFNO_N;
		else
			return E_DB_REFNO_R;
	}
	if(strncmp(tRefno.mac,rPack->saddr,8)!=0)
	{
		ERRTIP("交易参考号MAC校验错误");
		return E_COMMON_ERR;
	}
	if(RS_FAIL==tRefno.status)
	{
		ERRTIP("交易已失败");
		return E_COMMON_ERR;
	}
	T_t_transdtl transdtl;	
	memset(&transdtl,0,sizeof(transdtl));
	ret=DB_t_transdtl_read_by_accdate_and_termid_and_termseqno(tRefno.accdate,tRefno.termid,tRefno.termseqno,&transdtl);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_NOTEXIST_TRANSDTL;
		else
			return E_DB_TRANSDTL_R;
	}
	if(RS_SUCC==tRefno.status)
	{
		outPack->lvol0=transdtl.cardno;
		outPack->lvol1=D4U5(transdtl.amount*100,0);
		outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);
		outPack->lsafe_level2=rPack->lsafe_level+D4U5(transdtl.amount*100,0);
		des2src(outPack->sdate3,transdtl.transdate);
		des2src(outPack->stime3,transdtl.transtime);
		des2src(outPack->semp,transdtl.opercode);
		outPack->lwithdraw_flag=transdtl.termid;
		outPack->lserial1=transdtl.termseqno;
		des2src(outPack->sphone3,transdtl.refno);	
		PutRow(handle,outPack,pRetCode,szMsg);
		return 0;
	}
	int cardno=atoi(transdtl.voucherno);
	if(rPack->lvol2!=cardno)
	{
		ERRTIP("收款方卡号错误");
		return E_COMMON_ERR;
	}
	if(transdtl.status[0]!=DTLSTATUS_INIT)
	{
		ERRTIP("交易流水表状态错误");
		return E_COMMON_ERR;
	}
	des2src(trans.opercode,transdtl.opercode);
	trans.termid=transdtl.termid;
	trans.termseqno=transdtl.termseqno;
	trans.cardflag=0;
	trans.usecardflag=0;	
	trans.transcode=transdtl.transcode;
	trans.cardno=transdtl.cardno;	
	trans.purseno=transdtl.purseno;
	trans.paycnt=transdtl.cardcnt;
	trans.cardbefbal=transdtl.cardbefbal;
	trans.cardaftbal=transdtl.cardaftbal;
	trans.inputamt= transdtl.amount;	
	trans.unusedamt = trans.inputamt;
	
	T_t_card tOutCard;
	memset(&tOutCard,0,sizeof(tOutCard));

	T_t_card tInCard;
	memset(&tInCard,0,sizeof(tInCard));

	ret=DB_t_card_read_by_cardno(trans.cardno,&tOutCard);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno);
		else
			return E_DB_CARD_R;
	}
	ret=DB_t_card_read_by_cardno(rPack->lvol2,&tInCard);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDNO,rPack->lvol2);
		else
			return E_DB_CARD_R;
	}
	trans.feetype=tOutCard.feetype;
	trans.custid=tOutCard.custid;
//	trans.cardaftbal=trans.cardbefbal;
	strcpy(pAccTrans->trans.draccno,tOutCard.accno);
	strcpy(pAccTrans->trans.craccno,tInCard.accno);
	
	ret=pAccTrans->doTrans();
	if(ret)
		return ret;
	ret=pAccTrans->doTransEnd();
	if(ret)
		return ret;
	transdtl.status[0]=DTLSTATUS_SUCCESS;
	ret=DB_t_transdtl_update_by_accdate_and_termid_and_termseqno(tRefno.accdate,tRefno.termid,tRefno.termseqno,&transdtl);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_TRANSDTL_N;
		else
			return E_DB_TRANSDTL_U;
	}
	tRefno.status=RS_SUCC;
	des2src(tRefno.lastsaved,trans.sysdatetime);
	ret=DB_t_refno_update_by_refno(tRefno.refno,&tRefno);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_REFNO_N;
		else
			return E_DB_REFNO_U;
	}
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//记录转入卡的卡交易流水	
	pAccTrans->Reset();
	trans.termid=transdtl.termid;
	trans.dpscnt=rPack->lvol3+1;
	trans.cardbefbal=rPack->lsafe_level/100.0;
	trans.cardaftbal=(rPack->lvol1+rPack->lsafe_level)/100.0;
	trans.cardno=atoi(transdtl.voucherno);
	if(trans.cardno!=rPack->lvol2)
	{
		ERRTIP("收款卡号不符");
		return E_COMMON_ERR;
	}
	ret=GetCustBaseInfoByCustID(tInCard.custid,trans.custname,trans.stuempno,trans.remark);
	if(ret)
		return ret;
	ret=pAccTrans->GetTermSeqno();
	if(ret)
	{
		return ret;
	}
	T_t_transdtl transdtl2;
	memset(&transdtl2,0,sizeof(transdtl2));
	des2src(transdtl2.refno,transdtl.refno);
	des2src(transdtl2.transdate,transdtl.transdate);
	des2src(transdtl2.transtime,transdtl.transtime);
	strcpy(transdtl2.accdate,transdtl.accdate);
	strcpy(transdtl2.acctime,transdtl.acctime);
	transdtl2.termid=trans.termid;
	transdtl2.termseqno=trans.termseqno;
	transdtl2.transcode=transdtl.transcode;
	sprintf(transdtl2.voucherno,"%d",transdtl.cardno);
	transdtl2.cardno=trans.cardno;
	transdtl2.purseno=trans.purseno;
	transdtl2.transflag =TF_DPS;
	transdtl2.cardcnt=trans.dpscnt;
	transdtl2.cardbefbal=trans.cardbefbal;
	transdtl2.cardaftbal=trans.cardaftbal;
	transdtl2.amount= transdtl.amount;
	transdtl2.managefee=0;
	transdtl2.custid=tInCard.custid;
	des2src(transdtl2.custname,trans.custname);
	des2src(transdtl2.opercode,trans.opercode);
	transdtl2.status[0]=DTLSTATUS_SUCCESS;
	des2src(transdtl2.showcardno,tInCard.showcardno);
	des2src(transdtl2.stuempno,trans.stuempno);
	transdtl2.exttype=EXTTYPE_OPPSNO;	
	des2src(transdtl2.extdata,transdtl.stuempno);
	sprintf(transdtl2.remark,"由(%s)转出",transdtl.custname);
	ret=DB_t_transdtl_add(&transdtl2);
	if(ret)
	{
	  if(DB_REPEAT==ret)
		return E_DB_TRANSDTL_E;
	  else
		return E_DB_TRANSDTL_I;
	}		
	T_t_account OutAccount;
	memset(&OutAccount,0,sizeof(OutAccount));
	ret=DB_t_account_read_lock_by_c0_and_accno(tOutCard.accno,&OutAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,tOutCard.accno);
		else
			return E_DB_ACCOUNT_R;
	}
	OutAccount.paycnt=transdtl.cardcnt;
	OutAccount.cardbal=transdtl.cardaftbal;
	OutAccount.lastpaycnt=transdtl.cardcnt-1;
	OutAccount.lastcardbal=transdtl.cardbefbal;
	strcpy(OutAccount.lastaccdate,transdtl.transdate);
	ret=DB_t_account_update_lock_by_c0(&OutAccount);
	if(ret)
	{
		writelog(LOG_ERR,"更新付款方账户表错误ret=%d",ret);
		return E_DB_ACCOUNT_U;
	}

	T_t_account InAccount;
	memset(&InAccount,0,sizeof(InAccount));
	ret=DB_t_account_read_lock_by_c0_and_accno(tInCard.accno,&InAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,tInCard.accno);
		else
			return E_DB_ACCOUNT_R;
	}
	InAccount.dpscnt=transdtl2.cardcnt;
	InAccount.cardbal=transdtl2.cardaftbal;
	InAccount.lastdpscnt=transdtl2.cardcnt-1;
	InAccount.lastcardbal=transdtl2.cardbefbal;
	strcpy(InAccount.lastaccdate,transdtl2.transdate);
	ret=DB_t_account_update_lock_by_c0(&InAccount);
	if(ret)
	{
		writelog(LOG_ERR,"更新收款方账户表错误ret=%d",ret);
		return E_DB_ACCOUNT_U;
	}
	outPack->lvol0=transdtl.cardno;
	outPack->lvol2=transdtl2.cardno;
	outPack->lvol1=D4U5(transdtl.amount*100,0);
	outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);	
	outPack->lsafe_level2=D4U5(transdtl2.cardaftbal*100,0);
	des2src(outPack->sdate3,trans.accdate);
	des2src(outPack->stime3,trans.acctime);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=transdtl.termid;
	outPack->lserial1=transdtl.termseqno;
	des2src(outPack->sphone3,transdtl.refno);
	des2src(outPack->vsmess,trans.remark);
	
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}