Exemple #1
0
int F846315(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	des2src(pAccTrans->trans.opercode,rPack->semp);
	if(strlen(pAccTrans->trans.opercode)<1)
	{
		pAccTrans->trans.termid=rPack->lwithdraw_flag;
	}
	pAccTrans->trans.transcode=TC_TRANSREV;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
//	TRANS& trans=pAccTrans->trans;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);

	ResetNormalCPack(&aPack,0,1);
		

	char oldaccdate[9]="";
	des2src(oldaccdate,rPack->sdate3);
	int oldtermid=rPack->lwithdraw_flag;
	int oldtermseqno=rPack->lserial1;
	
	char authrightflag=rPack->sstatus2[0];

	if(strlen(oldaccdate)<1)
		return E_INPUTNULL_ACCDATE;
	if(oldtermid<1)
		return E_INPUTNULL_TERMID;
	if(oldtermseqno<1)
		return E_INPUTNULL_TERMSEQNO;

	des2src(pAccTrans->trans.chkopercode,rPack->semp_no);
	if('1'==authrightflag)
	{
		ret=chk_oper_pwd(pAccTrans->trans.chkopercode,rPack->scust_limit);
		if(ret)
			return ret;
		ret=AccTransRev(oldaccdate,oldtermid,oldtermseqno);
		if(ret)
		{
			writelog(LOG_ERR,"acctransrev err ret=%d",ret);
			return ret;
		}
	}
	else
	{
		ret=OnlineTransRev(oldaccdate,oldtermid,oldtermseqno);
		if(ret)
		{
			writelog(LOG_ERR,"acctransrev err ret=%d",ret);
			return ret;
		}
	}
	SetCol(handle,F_LVOL0,F_LVOL8,F_SDATE3,F_STIME3,F_SEMP,F_LSERIAL1,F_VSMESS,0);	
	outPack->lvol0=pAccTrans->trans.cardno;
	outPack->lvol8=0;
	des2src(outPack->sdate3,pAccTrans->trans.accdate);
	des2src(outPack->stime3,pAccTrans->trans.acctime);
	des2src(outPack->semp,pAccTrans->trans.opercode);
	outPack->lserial1=pAccTrans->trans.termseqno;
	strcpy(outPack->vsmess,pAccTrans->remark.c_str());
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}
Exemple #2
0
int F846314(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
//	ret=pAccTrans->checkCfgUpdate();
//	if(ret)
//		return ret;
	des2src(pAccTrans->trans.opercode,rPack->semp);
	pAccTrans->trans.transcode=TC_CARDDRAW;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	TRANS& trans=pAccTrans->trans;

	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);
	ResetNormalCPack(&aPack,0,1);
		
	SetCol(handle,0);
	trans.cardflag=1;
	trans.usecardflag=1;	
	trans.cardno=rPack->lvol0;	
	trans.purseno=PURSE_NO_ONE;
	trans.paycnt=rPack->lvol6+1;
	trans.cardbefbal=rPack->lvol7/100.0;
	trans.cardaftbal=trans.cardbefbal;
//	trans.fundtype=PAYTYPE_CASH;
	des2src(trans.cardphyid,rPack->sstation0);
	trans.inputamt=rPack->damt0;	
	trans.unusedamt = trans.inputamt;
	if(amtcmp(trans.inputamt,trans.cardbefbal)>0)
	{
		return ERRINFO(E_CARD_BALANCE_SHORTAGE,trans.cardbefbal);
	}
	T_t_card tCard;
	
	memset(&tCard,0,sizeof(tCard));
	ret=doCard(trans,tCard);
	if(ret)
	{
		return ret;
	}
//	ret=UpdateCardBitmap(trans.cardno,trans.cardcnt,CARDBITMAPTYPE_DEC,0);
//	if(ret)
//		return ret;
	T_t_account tCardAccount;	
	memset(&tCardAccount,0,sizeof(tCardAccount));
	ret=DB_t_account_read_by_accno(tCard.accno,&tCardAccount);
	if(ret)
	{
		writelog(LOG_ERR,"cardno[%d]",tCard.cardno);
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,tCard.accno);
		else
			return E_DB_ACCOUNT_R;
	}
	if(tCardAccount.status[0]!=STATUS_NORMAL)
	{
		return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno);
	}
	if(tCardAccount.lastpaycnt>trans.paycnt)
	{
		return ERRINFO(E_CARDCNT_LT_LASTCARDCNT,trans.paycnt,tCardAccount.lastpaycnt);
	}
	strcpy(trans.cardaccno,tCardAccount.accno);
	trans.feetype=tCard.feetype;
	trans.custid=tCard.custid;
	strcpy(trans.draccno,tCardAccount.accno);
	ret=pAccTrans->doTrans();
	if(ret)
		return ret;
	ret=pAccTrans->doTransEnd();
	if(ret)
		return ret;
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));

	des2src(transdtl.transdate,trans.transdate);
	des2src(transdtl.transtime,trans.transtime);
	strcpy(transdtl.accdate,trans.accdate);
	strcpy(transdtl.acctime,trans.acctime);
	transdtl.termid=trans.termid;
	transdtl.termseqno=trans.termseqno;
	transdtl.transcode=trans.transcode;
//	transdtl.paytype=trans.fundtype;
//	des2src(transdtl.voucherno,trans.voucherno);
	transdtl.cardno=trans.cardno;
	transdtl.purseno=trans.purseno;
	transdtl.transflag =TF_PAY;
	transdtl.cardcnt=trans.paycnt;
	transdtl.cardbefbal=trans.cardbefbal;
	transdtl.cardaftbal=trans.cardaftbal;
    transdtl.amount=trans.totaltransamt;
	transdtl.managefee=trans.totalfeeamt;
	transdtl.custid=tCardAccount.custid;
	des2src(transdtl.custname,tCardAccount.accname);
	des2src(transdtl.opercode,trans.opercode);
	transdtl.status[0]=DTLSTATUS_SUCCESS;
    transdtl.showcardno=atol(tCard.showcardno);
	GetStuempnoByCustid(transdtl.custid,transdtl.stuempno);
	ret=DB_t_transdtl_add(&transdtl);
	if(ret)
	{
	  if(DB_REPEAT==ret)
	    return E_DB_TRANSDTL_E;
	  else
	    return E_DB_TRANSDTL_I;
	}		
	SetCol(handle,F_LVOL0,F_LVOL8,F_SDATE0,
		F_SDATE3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_STIME3,0);	
	outPack->lvol0=tCard.cardno;
	outPack->lvol8=D4U5(pAccTrans->trans.cardaftbal*100,0);
	des2src(outPack->sdate3,pAccTrans->trans.accdate);
	des2src(outPack->stime3,pAccTrans->trans.acctime);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=trans.termid;
	outPack->lserial1=trans.termseqno;
    sprintf(trans.remark,"%s卡余额%.2lf元",pAccTrans->remark.c_str(),pAccTrans->trans.cardaftbal);
    des2src(outPack->vsmess,trans.remark);
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}
Exemple #3
0
int F846334(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	des2src(pAccTrans->trans.opercode,rPack->semp);
	pAccTrans->trans.transcode=TC_EACCDRAW;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	TRANS& trans=pAccTrans->trans;

	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);
	ResetNormalCPack(&aPack,0,1);

	SetCol(handle,0);

	des2src(trans.eaccno,rPack->sbank_acc);
	if(!strlen(trans.eaccno))
		return E_INPUTNULL_ACCNO;
	//去帐户信息
	T_t_netacc eaccount;	
	memset(&eaccount,0,sizeof(eaccount));
	ret=DB_t_netacc_read_by_accno(trans.eaccno,&eaccount);
	if(ret)
	{
		writelog(LOG_ERR,"accno[%s]",trans.eaccno);
		if(DB_NOTFOUND==ret)
			return E_NOTEXIST_EACCNO;
		else 
			return E_DB_ACCOUNT_R;
	}
	if(eaccount.status[0]!=STATUS_NORMAL)
	{
		return E_EACCNO_LOGOUT;
	}	
	char seedkey[33]="";
	char inpwd_crypt[65]="";
	char inpwd_plain[65]="";
	char dbpwd_plain[65]="";
	des2src(inpwd_crypt,rPack->snote2);
	if(!strlen(inpwd_crypt))
		return E_PWD_NULL;
	ret=GetSysParaVal(GLOBLE_SYSPARA_STATIC_KEY,seedkey);
	if(ret)
		return ret;
	ret=decrypt_elec_card_pwd(0,seedkey,inpwd_crypt,inpwd_plain);
	if(ret)
		return	E_EACCPWD;
	ret=decrypt_elec_card_pwd(0,seedkey,eaccount.accpwd,dbpwd_plain);
	if(ret)
		return E_PWD_DECRYPT;
	if(strcmp(inpwd_plain,dbpwd_plain)!=0)
		return E_EACCPWD;
	if(eaccount.stoppayflag[0]=='1')
		return E_EACC_STOPPAY;
	pAccTrans->trans.inputamt=rPack->damt0;
	pAccTrans->trans.unusedamt = trans.inputamt;	
	if(amtcmp(pAccTrans->trans.inputamt,0)==0)
		return E_INPUT_AMT_NULL;
	if(amtcmp(pAccTrans->trans.inputamt,eaccount.balance)>0)
		return E_BALANCE_SHORTAGE;
	//	创建账号
	pAccTrans->trans.custid=eaccount.custid;
	pAccTrans->trans.fundtype=0;
	ret=pAccTrans->doTrans();
	if(ret)
		return ret;	
	SetCol(handle,F_LVOL0,F_LVOL8,F_SDATE3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);	
	des2src(outPack->sdate3,pAccTrans->trans.accdate);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=trans.termid;
	outPack->lserial1=trans.termseqno;
	sprintf(outPack->vsmess,"%s %s 帐户余额:%.2f元",eaccount.accname,pAccTrans->remark.c_str(),pAccTrans->trans.draccaftbal);
	des2src(trans.remark,outPack->vsmess);
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}
Exemple #4
0
//取消换卡
static int DoCardInsteadCancel(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_LVOL1,F_LSAFE_LEVEL2,F_LVOL4,F_LVOL5,
					F_SALL_NAME,F_SPAGER,F_SCERT_NO,
					F_SEMAIL2,F_SMARKET_CODE,F_SDATE0,
					F_LVOL0,F_STX_PWD,F_LVOL8,F_LVOL6,F_LSAFE_LEVEL,F_SMARKET_CODE2,F_SHOLDER_AC_NO,
					F_SORDER0,F_SEMP,F_SDATE3,F_STIME3,F_LVOL11,F_LVOL12,
					F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_SNAME2,0);	
		
		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;
		}
		if(tCard.status[0]!=STATUS_NORMAL)
		{
			return ERRINFO(E_CARD_LOGOUT,trans.cardno);
		}	
		if('1'==tCard.frozeflag[0])
		{
			return ERRINFO(E_CARD_FREEZE,trans.cardno);
		}
		if('1'==tCard.lossflag[0])
		{
			return ERRINFO(E_CARD_LOST,trans.cardno);
		}	
		if('1'==tCard.badflag[0])
		{
			return ERRINFO(E_CARD_BADRECORD,trans.cardno);
		}	
		T_t_account tCardAccount;	
		memset(&tCardAccount,0,sizeof(tCardAccount));
		ret=DB_t_account_read_by_accno(tCard.accno,&tCardAccount);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CARDACCNO,tCard.accno);
			else 
				return E_DB_ACCOUNT_R;
		}
		
		T_t_customer  customer;
		memset(&customer,0,sizeof(customer));
		if(tCard.custid)
		{
			ret=DB_t_customer_read_by_custid(tCard.custid,&customer);
			if(ret)
			{
				if(DB_NOTFOUND==ret)
					return ERRINFO(E_NOTEXIST_CUSTOMER,tCard.custid);
				else
					return E_DB_CUSTOMER_R;
			}
		}
		char cardpwd[33]="";
		char key[17]="";
		strcpy(key,STATIC_SEED_KEY);
		EncodePwd(key,cardpwd,tCard.cardpwd, 1);
		T_t_cardinsteaddtl cardinsteaddtl;

		memset(&cardinsteaddtl,0,sizeof(cardinsteaddtl));
		ret=DB_t_cardinsteaddtl_read_lock_by_c0_and_cardno(trans.cardno,&cardinsteaddtl);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return E_DB_CARDINSTEADDTL_N;
			else
				return E_DB_CARDINSTEADDTL_R;
		}
		if(cardinsteaddtl.status[0]==STATUS_NORMAL)
		{
			T_t_transdtl transdtl;
			memset(&transdtl,0,sizeof(transdtl));
			
			des2src(transdtl.transdate,trans.transdate);
			des2src(transdtl.transtime,trans.transtime);
			des2src(transdtl.accdate,pAccTrans->trans.accdate);
			des2src(transdtl.acctime,trans.acctime);
			transdtl.termid=trans.termid;
			transdtl.termseqno=trans.termseqno;
			transdtl.transcode=trans.transcode;
			transdtl.paytype=trans.fundtype;
			des2src(transdtl.voucherno,trans.voucherno);
			transdtl.cardno=trans.cardno;
			transdtl.purseno=trans.purseno;
			transdtl.cardcnt=cardinsteaddtl.oldcardcnt;
			transdtl.cardbefbal=cardinsteaddtl.oldcardbal;
			transdtl.cardaftbal=transdtl.cardbefbal;	

			transdtl.managefee=trans.totalfeeamt;
			transdtl.amount=trans.totaltransamt;
			transdtl.custid=tCard.custid;
			des2src(transdtl.custname,customer.custname);
			des2src(transdtl.stuempno,customer.stuempno);
			des2src(transdtl.opercode,trans.opercode);
			transdtl.status[0]=DTLSTATUS_SUCCESS;
			des2src(transdtl.showcardno,cardinsteaddtl.oldshowcardno);
			ret=DB_t_transdtl_add(&transdtl);
			if(ret)
			{
				if(DB_REPEAT==ret)
					return E_DB_TRANSDTL_E;
				else
					return E_DB_TRANSDTL_I;
			} 
			outPack->lvol1=tCard.custid;
			outPack->lsafe_level2=customer.custtype;
			outPack->lvol5=tCard.feetype;
			des2src(outPack->sall_name,customer.custname);
			des2src(outPack->spager,customer.stuempno);
			des2src(outPack->scert_no,customer.deptcode);
			des2src(outPack->semail2,customer.idno);
			des2src(outPack->smarket_code,customer.sex);
			des2src(outPack->sdate0,tCard.expiredate);
			sprintf(outPack->sholder_ac_no,"%d",10);				//发行方标识
			des2src(outPack->smarket_code2,customer.idtype);
			des2src(outPack->sname2,tCard.cardverno);
			outPack->lsafe_level=tCard.cardtype;
			outPack->lvol0=tCard.cardno;
			outPack->lvol8=(int)(cardinsteaddtl.oldcardbal*100);
			outPack->lvol4=cardinsteaddtl.oldsubsidyno;
			outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0);
			outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0);
			outPack->lvol6=cardinsteaddtl.oldcardcnt;
			des2src(outPack->sorder0,tCard.showcardno);
			des2src(outPack->sdate3,pAccTrans->trans.accdate);
			des2src(outPack->stime3,pAccTrans->trans.acctime);
			des2src(outPack->semp,trans.opercode);
			outPack->lwithdraw_flag=trans.termid;
			outPack->lserial1=trans.termseqno;			
			des2src(outPack->stx_pwd,cardpwd);
			PutRow(handle,outPack,pRetCode,szMsg);		
			return 0;
		}
		if(cardinsteaddtl.revflag[0]=='1')
		{
				return E_CARDINSTEAD_CANCEL;
		}
		T_t_card cardtmp;
		memset(&cardtmp,0,sizeof(cardtmp));
		ret=DB_t_card_read_by_cardphyid_and_status(trans.cardphyid,"1",&cardtmp);
		if(ret!=DB_NOTFOUND)
		{
			if(DB_SUCCESS==ret)
				return ERRINFO(E_EXIST_CARDPHYID,trans.cardphyid);
			else
					return E_DB_CARD_R;
		}
		if(pAccTrans->sysPara.bEnableCardMgr)
		{
			ret=DB_t_card_read_by_showcardno_and_status(trans.showcardno,"1",&tCard);
			if(ret!=DB_NOTFOUND)
			{
				if(DB_SUCCESS==ret)
						return ERRINFO(E_EXIST_SHOWCARDNO,trans.showcardno);
				else
						return E_DB_CARD_R;
			} 
			//回收卡
			ret=UseShowCardNoBack(trans.opercode,cardinsteaddtl.showcardno);
			if(ret)
			{
				return ret;
			}
			T_t_carddtl carddtl;
			memset(&carddtl,0,sizeof(carddtl));
			
			des2src(carddtl.accdate,pAccTrans->trans.accdate);
			des2src(carddtl.acctime,trans.acctime);
			carddtl.termid=trans.termid;
			carddtl.termseqno=trans.termseqno;
			des2src(carddtl.opercode,trans.opercode);
			carddtl.cardtype=trans.cardtype;
			carddtl.usetype=CARDUSETYPE_REUSE;
			carddtl.inoutflag=INOUTFLAG_IN;
			carddtl.transcnt=1;
			strcpy(carddtl.summary,"换卡撤销(新卡回收)");
			des2src(carddtl.cardphyid,cardinsteaddtl.cardphyid);
			des2src(carddtl.showcardno,cardinsteaddtl.showcardno);
			
			ret=DB_t_carddtl_add(&carddtl);
			if(ret)
			{
				if(DB_REPEAT==ret)
					return E_DB_CARDDTL_E;
				else
					return E_DB_CARDDTL_I;
			}
			//使用原卡
			int cardtype=0;
			ret=UseShowCardNo(trans.opercode,cardinsteaddtl.oldshowcardno,cardtype);
			if(ret)
			{
				return ret;
			}
			memset(&carddtl,0,sizeof(carddtl));
			
			des2src(carddtl.accdate,pAccTrans->trans.accdate);
			des2src(carddtl.acctime,trans.acctime);
			carddtl.termid=trans.termid;
			carddtl.termseqno=trans.termseqno;
			des2src(carddtl.opercode,trans.opercode);
			carddtl.cardtype=cardinsteaddtl.oldcardtype;
			carddtl.usetype=CARDUSETYPE_USE;
			carddtl.inoutflag=INOUTFLAG_OUT;
			carddtl.transcnt=1;
			strcpy(carddtl.summary,"换卡撤销(重发原卡)"); 
			des2src(carddtl.cardphyid,cardinsteaddtl.oldcardphyid);
			des2src(carddtl.showcardno,cardinsteaddtl.oldshowcardno);
			ret=DB_t_carddtl_add(&carddtl);
			if(ret)
			{
				if(DB_REPEAT==ret)
					return E_DB_CARDDTL_E;
				else
					return E_DB_CARDDTL_I;
			}
		}
		//更新卡信息
		memset(&tCard,0,sizeof(tCard));
		ret=DB_t_card_read_lock_by_cur_and_cardno(trans.cardno,&tCard);
		if(ret)
		{
				if(DB_NOTFOUND==ret)
					return E_NOTEXIST_CARDNO;
				else 
					return E_DB_CARD_R;
		}
		if(tCard.status[0]!=STATUS_NORMAL)
		{
			  DB_t_card_free_lock_by_cur();
				return E_CARD_LOGOUT;
		}
		tCard.cardtype=cardinsteaddtl.oldcardtype;
		des2src(tCard.cardphyid,cardinsteaddtl.oldcardphyid);
		des2src(tCard.showcardno,cardinsteaddtl.oldshowcardno);
		ret=DB_t_card_update_lock_by_cur(&tCard);
		if(ret)
		{
				if(DB_NOTFOUND==ret)
					return E_NOTEXIST_CARDNO;
				else 
					return E_DB_CARD_U;
		}
		T_t_transdtl transdtl;
		memset(&transdtl,0,sizeof(transdtl));
		
		des2src(transdtl.transdate,trans.transdate);
		des2src(transdtl.transtime,trans.transtime);
		strcpy(transdtl.accdate,trans.accdate);
		strcpy(transdtl.acctime,trans.acctime);
		transdtl.termid=trans.termid;
		transdtl.termseqno=trans.termseqno;
		transdtl.transcode=trans.transcode;
		transdtl.paytype=trans.fundtype;
		des2src(transdtl.voucherno,trans.voucherno);
		transdtl.cardno=trans.cardno;
		transdtl.purseno=trans.purseno;
		transdtl.cardcnt=cardinsteaddtl.oldcardcnt;
		transdtl.cardbefbal=cardinsteaddtl.oldcardbal;
		transdtl.cardaftbal=transdtl.cardbefbal;	

		transdtl.managefee=trans.totalfeeamt;
		transdtl.amount=trans.totaltransamt;
		transdtl.custid=tCard.custid;
		des2src(transdtl.custname,customer.custname);
		des2src(transdtl.stuempno,customer.stuempno);
		des2src(transdtl.opercode,trans.opercode);
		transdtl.status[0]=DTLSTATUS_SUCCESS;
		des2src(transdtl.showcardno,cardinsteaddtl.oldshowcardno);
		ret=DB_t_transdtl_add(&transdtl);
		if(ret)
		{
			if(DB_REPEAT==ret)
				return E_DB_TRANSDTL_E;
			else
				return E_DB_TRANSDTL_I;
		} 
		outPack->lvol1=tCard.custid;
		outPack->lsafe_level2=customer.custtype;
		outPack->lvol5=trans.feetype;
		des2src(outPack->sall_name,customer.custname);
		des2src(outPack->spager,customer.stuempno);
		des2src(outPack->scert_no,customer.deptcode);
		des2src(outPack->semail2,customer.idno);
		des2src(outPack->smarket_code,customer.sex);
		des2src(outPack->sdate0,tCard.expiredate);
		des2src(outPack->smarket_code2,customer.idtype);
		sprintf(outPack->sholder_ac_no,"%d",10);				//发行方标识
		des2src(outPack->sname2,tCard.cardverno);
		outPack->lsafe_level=tCard.cardtype;
		outPack->lvol0=tCard.cardno;
		outPack->lvol4=cardinsteaddtl.oldsubsidyno;
		outPack->lvol8=(int)(cardinsteaddtl.oldcardbal*100);
		outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0);
		outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0);
		outPack->lvol6=cardinsteaddtl.oldcardcnt;
		des2src(outPack->sorder0,tCard.showcardno);
		des2src(outPack->sdate3,pAccTrans->trans.accdate);
		des2src(outPack->stime3,pAccTrans->trans.acctime);
		des2src(outPack->semp,trans.opercode);
		des2src(outPack->stx_pwd,cardpwd);
		outPack->lwithdraw_flag=trans.termid;
		outPack->lserial1=trans.termseqno;
		PutRow(handle,outPack,pRetCode,szMsg); 		
		return 0;
}
int F847183(TRUSERID *handle, int iRequest, ST_PACK *rPack, int *pRetCode, char *szMsg)
{

	int ret = 0;
	char    	tx_date[8+1] = "";              	//发生日期
//		char    	tx_time[6+1]="";      		//发生时间
	int		cardno = 0;                    	//卡号
	char    	deviceid[8+1] = "";            	//终端机ID
	int		serial_no = 0;                  	//终端机流水号
	int 		flag = 0;
	double 	iSeqNo = 0;
	T_t_tif_tradeserial		tOldTradeserial;	//当日流水表
	T_t_tif_tradeserial		tTradeserial;	//当日流水表
	T_t_tif_tradeserial_his	tTradeserialhis;	//历史流水表
	T_t_tradecode tTradeCode;
	T_t_card tCard;
	char sysdate[11] = "";
	char systime[9] = "";
	char sYear[5] = "";
	char sMonDay[5] = "";
	char logic_date[9] = "";
	int days = 0;
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	ST_PACK next_pack;

	ResetNormalCPack(&aPack, 0, 1);
	memset(&tTradeserial, 0, sizeof(tTradeserial));
	memset(&tOldTradeserial, 0, sizeof(tOldTradeserial));
	memset(&tTradeserialhis, 0, sizeof(tTradeserialhis));
	memset(&tTradeCode, 0, sizeof tTradeCode);
	memset(&tCard, 0, sizeof tCard);
	getsysdate(sysdate);
	getsystime(systime);
	des2src(tTradeserial.enteract_time, systime);

	des2src(tx_date, rPack->sbank_pwd);
//		des2src(tx_time,rPack->sbank_code);
	cardno = rPack->lvol0;
	des2src(deviceid, rPack->sbank_pwd2);
	serial_no = rPack->lvol1;
	trim(rPack->scust_limit);
	trim(rPack->scust_limit2);
	trim(rPack->semp_pwd);
	des2src(sYear, tx_date);
	des2src(sMonDay, tx_date + 4);

	if (strlen(rPack->scust_limit) == 0)
	{
		*pRetCode = E_OPER_NOT_EXIST;
		goto L_RETU;
	}
	if (strlen(rPack->scust_limit2) == 0)
	{
		*pRetCode = E_INPUT_AUTH_OPER_NULL;
		goto L_RETU;
	}
	if (strcmp(rPack->scust_limit, rPack->scust_limit2) == 0)
	{
		writelog(LOG_ERR, "oper[%s]auth_oper[%s]", rPack->scust_limit, rPack->scust_limit2);
		*pRetCode = E_OPER_AND_AUTH_OPER_EQ;
		goto L_RETU;
	}
	ret = chk_oper_pwd(rPack->scust_limit2, rPack->semp_pwd);
	if (ret)
	{
		if (E_OPER_NOT_EXIST == ret)
			*pRetCode = E_AUTH_OPER_NOT_EXIST;
		else if (E_PASSWORD_WRONG == ret)
			*pRetCode = E_AUTH_OPER_PWD;
		else
			*pRetCode = ret;
		goto L_RETU;
	}
	ret = DB_t_card_read_by_cardno(cardno, &tCard);
	if (ret)
	{
		if (DB_NOTFOUND == ret)
			*pRetCode = E_CARDNO_NOT_EXIST;
		else
			*pRetCode = E_DB_CARD_R;
		goto L_RETU;
	}
	if (tCard.cardattr[CARDSTAT_TYPE_REG] == '2')
	{
		writelog(LOG_ERR, "冲正交易卡号已注销cardid[%d]", tCard.cardno);
		*pRetCode = E_ACTNO_LOGOUT;
		goto L_RETU;
	}
	//查询当前流水表
	ret = DB_t_tif_tradeserial_read_lock_by_c4_and_operate_date_and_serial_no_and_cardno(tx_date, serial_no, cardno, &tOldTradeserial);
	if (ret)
	{
		writelog(LOG_ERR, "tx_date[%s]serial_no[%d]ret[%d]", tx_date, serial_no, ret);
		if (DB_NOTFOUND != ret)
		{
			*pRetCode = E_DB_TRADESERIAL_R;
			goto L_RETU;
		}
	}
	else
	{
		flag = 1;
		memcpy(&tTradeserial, &tOldTradeserial, sizeof(tTradeserial));
		tTradeserial.other_seri_no = tOldTradeserial.serial_no;					//上传端流水号
		tOldTradeserial.serial_state = SERISTAT_RUSH;				//冲正
		ret = DB_t_tif_tradeserial_update_lock_by_c4(&tOldTradeserial);
		if (ret)
		{
			*pRetCode = E_DB_TRADESERIAL_U;
			writelog(LOG_ERR, "DB_t_tif_tradeserial_update_lock_by_c4[%d]", ret);
			goto L_RETU;
		}
		DB_t_tif_tradeserial_free_lock_c4();
	}
	if (!flag)
	{
		//查询历史流水表
		ret = DB_t_tif_tradeserial_his_read_lock_by_c0_and_trans_year_and_trans_mon_day_and_serial_no_and_cardno(sYear, sMonDay, serial_no, cardno, &tTradeserialhis);
		if (ret)
		{
			writelog(LOG_ERR, "year[%s]date[%d]serialno[%d]ret[%d]", sYear, sMonDay, serial_no, ret);
			if (DB_NOTFOUND == ret)
			{
				*pRetCode = E_SERIALNO_NOT_EXIST;
				goto L_RETU;
			}
			else
			{
				*pRetCode = E_DB_TRADESERIAL_R;
				goto L_RETU;
			}
		}
		tTradeserial.other_seri_no = tTradeserialhis.serial_no;						//上传端流水号
		tTradeserial.serial_state = tTradeserialhis.serial_state;						//流水状态
		tTradeserial.tmark = tTradeserialhis.tmark;								//999交易标记
		tTradeserial.maindeviceid = tTradeserialhis.maindeviceid;							//上传工作站标识(前置机注册号)
		tTradeserial.sys_id = tTradeserialhis.sys_id;
		tTradeserial.comu_ver = tTradeserialhis.comu_ver;							//通信版本号
		// add by 汤成 2007-10-31
		tTradeserial.deviceid = tTradeserialhis.deviceid;
		des2src(tTradeserial.devphyid, tTradeserialhis.devphyid);				//物理设备ID
		des2src(tTradeserial.dev_auth, tTradeserialhis.dev_auth);					//终端设备授权号
		des2src(tTradeserial.crc, tTradeserialhis.crc);								//CRC校验
		tTradeserial.cardno = tTradeserialhis.cardno;								//交易卡号
		tTradeserial.purseno = tTradeserialhis.purseno;							//消费钱包号
		tTradeserial.in_balance = tTradeserialhis.in_balance;						//入卡金额
		tTradeserial.out_balance = tTradeserialhis.out_balance;					//出卡金额
		tTradeserial.trade_fee = tTradeserialhis.trade_fee;						//本次消费金额
		tTradeserial.trade_count = tTradeserialhis.trade_count;							//当前卡中帐户消费次数(累计使用次数)
		tTradeserial.serial_type = tTradeserialhis.serial_type;							//交易代码
		tTradeserial.managefee = tTradeserialhis.managefee	;						//搭伙费
		des2src(tTradeserial.operate_date, tTradeserialhis.operate_date);					//发生日期(格式化输入的日期)
		des2src(tTradeserial.operate_time, tTradeserialhis.operate_time);					//发生时间(格式化输入的时间)
		tTradeserial.condition_id = tTradeserialhis.condition_id;							// 收费科目
		tTradeserialhis.serial_state = SERISTAT_RUSH;				//冲正
		// 保存被冲正交易的操作员号
		des2src(tTradeserialhis.opercode, tTradeserialhis.opercode);
		ret = DB_t_tif_tradeserial_his_update_lock_by_c0(&tTradeserialhis);
		if (ret)
		{
			*pRetCode = E_DB_TRADESERIAL_U;
			writelog(LOG_ERR, "DB_t_tif_tradeserial_update_lock_by_c4[%d]", ret);
			goto L_RETU;
		}
		DB_t_tif_tradeserial_his_free_lock_by_c0();
	}
	if (tTradeserial.cardno != cardno)
	{
		writelog(LOG_ERR, "流水中卡号不符cardid[%d]serial[%d]", cardno, tTradeserial.cardno);
		*pRetCode = E_SERIALNO_NOT_EXIST;
		goto L_RETU;
	}
	if (tTradeserial.serial_state == SERISTAT_RUSH)
	{
		*pRetCode = E_TX_SERIAL_CZ;
		goto L_RETU;
	}
	if (tTradeserial.serial_state != SERISTAT_DEBT)
	{
		*pRetCode = E_TX_SERIAL_CANNOT_CZ;
		goto L_RETU;
	}
	if (amtcmp(tTradeserial.trade_fee, 0) == 0)
	{
		*pRetCode = E_TX_SERIAL_CANNOT_CZ;
		strcpy(szMsg,"交易金额有误!");
		goto L_RETU;
	}

	ret = DB_t_tradecode_read_by_tradecode(tTradeserial.serial_type, &tTradeCode);
	if (ret)
	{
		if (DB_NOTFOUND == ret)
			*pRetCode = E_DB_TRADECODE_N;
		else
			*pRetCode = E_DB_TRADECODE_R;
		goto L_RETU;
	}

	if (tTradeCode.rush_flag != IS_YES)
	{
		*pRetCode = E_TX_SERIAL_CANNOT_CZ;
		strcpy(szMsg,"该交易不能被冲正");
		goto L_RETU;
	}

	ret = GetLogicDate(logic_date);						//业务日期
	if (ret)
	{
		*pRetCode = ret;
		writelog(LOG_ERR, "GetLogicDate  err ret[%d]", ret);
		goto L_RETU;
	}
	// 小于 0 , 则不判断
	if (tTradeCode.rush_max_day >= 0)
	{
		ret = DiffDay(logic_date, tTradeserial.enteract_date, &days);
		if (ret)
		{
			*pRetCode = ret;
			goto L_RETU;
		}
		if (days > tTradeCode.rush_max_day)
		{
			writelog(LOG_ERR, "流水入账日期[%s],已超过期限[%d]天",
					 tTradeserial.enteract_date, days);
			*pRetCode = E_TX_SERIAL_CANNOT_CZ;
			strcpy(szMsg, "流水日期已超过可冲正期限!");
			goto L_RETU;
		}
	}

	if (tTradeCode.restrict_oper == IS_YES)
	{
		if (strcmp(rPack->scust_limit, tTradeserial.opercode) != 0)
		{
			strcpy(szMsg, "必须由作此次交易的操作员来冲正");
			*pRetCode = E_TX_SERIAL_CANNOT_CZ;
			goto L_RETU;
		}
	}

	// 保存上传的操作员号
	des2src(tTradeserial.operate_date, sysdate);
	des2src(tTradeserial.operate_time, systime);
	des2src(tTradeserial.collect_date, sysdate);
	des2src(tTradeserial.collect_time, systime);

	des2src(tTradeserial.enteract_date, logic_date);						//业务日期
	des2src(tTradeserial.enteract_time, systime);
	tTradeserial.in_balance = rPack->damt1;
	tTradeserial.trade_fee = -1 * tTradeserial.trade_fee;					//本次消费金额
	tTradeserial.managefee = -1 * tTradeserial.managefee;					//本次消费管理费
	tTradeserial.out_balance = tTradeserial.in_balance - tTradeserial.trade_fee;
	if (rPack->lvol10 > 0)
		tTradeserial.trade_count = rPack->lvol10 + 1;
	tTradeserial.maindeviceid = rPack->lvol6;
	// 上传的操作员号
	des2src(tTradeserial.opercode, rPack->scust_limit);
	tTradeserial.reviseserial_no = tTradeserial.other_seri_no;

	//取流水号,从帐处理
	ret = getNewUniqNo(KEYTYPE_TRADESERIAL, &iSeqNo);
	if (ret)
	{
		*pRetCode = ret;
		writelog(LOG_ERR, "getNewUniqNo err[%d]", ret);
		goto L_RETU;
	}
	tTradeserial.serial_no = iSeqNo;
	//######################################################
	//入账处理
	switch (tTradeserial.serial_type)
	{
	case 930031:
		// 交易冲正
		if (amtcmp(tTradeserial.trade_fee, 0) == 0)
			break;
		tTradeserial.serial_type = TXCODE_TX_REVEAL;
		ret = process930031(&tTradeserial);
		if (ret)
		{
			//业务处理失败处理
			*pRetCode = ret;
			goto L_RETU;
		}
		break;
	case 930034:
		// 充值冲正
		if (amtcmp(tTradeserial.trade_fee, 0) == 0)
			break;
		tTradeserial.serial_type = TXCODE_TX_REVEAL;
		ret = process930034(&tTradeserial);
		if (ret)
		{
			//业务处理失败处理
			*pRetCode = ret;
			goto L_RETU;
		}
		break;
	case 930036:
		// 搭伙费冲正
		if (amtcmp(tTradeserial.trade_fee, 0) == 0)
			break;
		tTradeserial.serial_type = TXCODE_TX_REVEAL;
		ret = process930036(&tTradeserial);
		if (ret)
		{
			//业务处理失败处理
			*pRetCode = ret;
			goto L_RETU;
		}
		break;
	case 847106: // 现金充值冲正
		memset(&next_pack,0,sizeof next_pack);
		tTradeserial.serial_type = TXCODE_SAVING_CASH;
		ret = do_flush_847106(&tTradeserial,&tCard);
		if(ret)
		{
			*pRetCode = ret;
			goto L_RETU;
		}
		break;
	default:
		*pRetCode = E_TXCODE_NOT_EXIST;	//交易码错误
		goto L_RETU;
	}
	//######################################################
	//添加交易流水
	tTradeserial.serial_state = SERISTAT_DEBT;
	ret = DB_t_tif_tradeserial_add(&tTradeserial);
	if (ret)
	{
		writelog(LOG_ERR, "DB_t_tif_tradeserial_add ret[%d]", ret);
		if (DB_REPEAT == ret)
			*pRetCode = E_DB_TRADESERIAL_E;
		else
			*pRetCode = E_DB_TRADESERIAL_I;
		goto L_RETU;
	}
	if (amtcmp(tTradeserial.out_balance, 0) < 0)
	{
		*pRetCode = E_ENTER_ACCOUNT;
		goto L_RETU;
	}
	SetCol(handle, 0);
	SetCol(handle, F_LSERIAL1, F_DAMT2, F_DAMT3, F_VSMESS, 0);
	out_pack->lserial1 = tTradeserial.serial_no;
	out_pack->damt2 = tTradeserial.out_balance;
	out_pack->damt3 = -tTradeserial.trade_fee;
	sprintf(out_pack->vsmess, "流水号:%d 冲正金额:%.2lf元 冲正前卡余额:%.2lf元 卡当前余额:%.2lf元", tTradeserial.serial_no, -tTradeserial.trade_fee, tTradeserial.in_balance, tTradeserial.out_balance);
	writelog(LOG_DEBUG, out_pack->vsmess);
	PutRow(handle, out_pack, pRetCode, szMsg);
	return 0;
L_RETU:
	return -1;
}
Exemple #6
0
int F250001(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;

	char host[16]="";		//对方机器的ip
	short port=0;			
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	//char senddata[327]="";
	//char rcvdata[327]="";
	CTcpSocket tcpsocket ;
	ext_phone_trans_t  PhoneTrans;

	
	//memset(senddata,0x20,sizeof senddata);
	//memset(rcvdata,0x20,sizeof rcvdata);

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_SSECTYPES,0);

	des2src(host,rPack->scust_auth);
	port=rPack->lvol0;
	memset(&PhoneTrans,0,sizeof(PhoneTrans));
	memcpy(&PhoneTrans, rPack->ssectypes,127);
	memset(PhoneTrans.plugdata,0x20,sizeof(PhoneTrans.plugdata));
	memcpy(PhoneTrans.signcheck,gSignCheck,strlen(gSignCheck));
	
	//writelog(LOG_ERR,"package_send=[%s] ",rPack->ssectypes);
	writelog(LOG_INFO,"Connect to boss system ip_addr[%s],port[%d] ",host,port);	
	ret = tcpsocket.ConnectTcp(host, port);
	if(!ret)
	{
		writelog(LOG_ERR,"Connect to boss system error,error code is [%d],ip_addr[%s],port[%d] ",ret,host,port);
		*pRetCode=E_MOBILE_TRANS_CONNECT;
		goto l_ret;
	}
	printf("send:[%s]\n",(char*)&PhoneTrans);
	ret = tcpsocket.Send((char*)&PhoneTrans,sizeof(PhoneTrans));
	if (ret<0)
	{
	      	// 发送时,端口有问题,包括被关闭
		writelog(LOG_ERR,"Send to boss system error,error code is [%d] ",ret);
		*pRetCode=E_MOBILE_TRANS_REQUEST;
		goto l_ret;
	}
	else if(0==ret){
		// 不应该出现这种情况
	      	writelog(LOG_ERR,"Send to boss system error,CTcpSocket.Send should not return this error,error code is[%d]!\n",ret);
		*pRetCode=E_MOBILE_TRANS_REQUEST;
	      	goto l_ret;
	}
	memset(&PhoneTrans,0,sizeof(PhoneTrans));
	if(rPack->lvol1==1)
	{
		ret = tcpsocket.Recv((char*)&PhoneTrans, sizeof(PhoneTrans), 15000);		
		tcpsocket.Close();
		if (ret!=327)
		{
			writelog(LOG_ERR,"Receive from boss system error,error code is [%d] ",ret);
			*pRetCode=E_MOBILE_TRANS_TIME_OUT;
			goto l_ret;  // 接收时候出错,或超时
		}
		printf("trans recv:[%s]\n",(char*)&PhoneTrans);
//		memcpy(out_pack->ssectypes,&PhoneTrans,127);
		if(strncmp(PhoneTrans.retnum,"00",2)!=0)
		{
			if(strncmp(PhoneTrans.retnum,"01",2)==0)
			{
				writelog(LOG_ERR,"trans error,mac error,ret[%s] ",PhoneTrans.retnum);
				*pRetCode=E_MOBILE_CHECK_MAC;
				goto l_ret;
			}
			if(strncmp(PhoneTrans.retnum,"02",2)==0)
			{
				writelog(LOG_ERR,"trans falied ret[%s] ",PhoneTrans.retnum);

				*pRetCode=E_MOBILE_TRANS_FAILURE;
				goto l_ret;
			}
		}
		else
		{
			writelog(LOG_INFO,"trans success ret[%s] ","00");
		}
	}else{
		ret=tcpsocket.Recv((char*)&PhoneTrans, sizeof(PhoneTrans), 15000);
		tcpsocket.Close();
		if (ret!=327)
		{
			writelog(LOG_ERR,"Receive from boss system error,error code is [%d] ",ret);
			*pRetCode=E_MOBILE_TRANS_TIME_OUT;
			goto l_ret;  // 接收时候出错,或超时
		}
		printf("query recv:[%s]\n",(char*)&PhoneTrans);	
//		memcpy(out_pack->ssectypes,&PhoneTrans,127);
		if(strncmp(PhoneTrans.retnum,"00",2)!=0)
		{
			if(strncmp(PhoneTrans.retnum,"01",2)==0)
			{
				writelog(LOG_ERR,"query error,mac error,ret[%s] ",PhoneTrans.retnum);
				*pRetCode=E_MOBILE_CHECK_MAC;
				goto l_ret;
			}
			if(strncmp(PhoneTrans.retnum,"02",2)==0)
			{
				writelog(LOG_ERR,"query falied ret[%s] ",PhoneTrans.retnum);
				*pRetCode=E_MOBILE_CHECK_FAIL;
				goto l_ret;
			}
		}
		else
		{
			writelog(LOG_INFO,"query success ret[%s] ","00");
		}
	}
	//writelog(LOG_ERR,"package_recv=[%s] ",out_pack->ssectypes);
			PutRow(handle,out_pack,pRetCode,szMsg);
			return 0;
l_ret:
	return -1;
}
Exemple #7
0
static int SaveOldCardInfo(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
		int ret=0;
		CAccTrans *pAccTrans=CAccTrans::getInstance();

		TRANS& trans=pAccTrans->trans;

		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;
		}
		if(tCard.status[0]!=STATUS_NORMAL)
		{
			return ERRINFO(E_CARD_LOGOUT,trans.cardno);
		}	
		if('1'==tCard.frozeflag[0])
		{
			return ERRINFO(E_CARD_FREEZE,trans.cardno);
		}
		if('1'==tCard.lossflag[0])
		{
			return ERRINFO(E_CARD_LOST,trans.cardno);
		}	
		if('1'==tCard.badflag[0])
		{
			return ERRINFO(E_CARD_BADRECORD,trans.cardno);
		}	
		//比较卡物理ID是否相同
		if(strcmp(tCard.cardphyid,trans.cardphyid)!=0)
		{
				writelog(LOG_ERR,"db cardphyid[%s],input cardphyid[%s]",tCard.cardphyid,trans.cardphyid);
				return E_CARD_PHYNO_DIFFER;
		}
		T_t_account tCardAccount;	
		memset(&tCardAccount,0,sizeof(tCardAccount));
		ret=DB_t_account_read_lock_by_c0_and_accno(tCard.accno,&tCardAccount);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CARDACCNO,tCard.accno);
			else 
				return E_DB_ACCOUNT_R;
		}
		int existflag=0;
		ret=IsExistUnGetSubsidy(tCard.cardno,&existflag);
		if(ret)
		{
			return ret;
		}
		if(existflag)
		{
			ERRTIP("有未领补助,请领取补助后再换卡");
			return E_COMMON_ERR;
		}
		ret=DB_t_cardinsteaddtl_del_by_cardno(trans.cardno);
		if(ret)
		{
			if(DB_NOTFOUND!=ret)
				return E_DB_CARDINSTEADDTL_R;
		}		
		T_t_cardinsteaddtl cardinsteaddtl;

		memset(&cardinsteaddtl,0,sizeof(cardinsteaddtl));
		des2src(cardinsteaddtl.accdate,pAccTrans->trans.accdate);
		cardinsteaddtl.termid = trans.termid;
		cardinsteaddtl.termseqno = trans.termseqno;
		cardinsteaddtl.cardno = trans.cardno;
		cardinsteaddtl.oldcardtype=tCard.cardtype;
		des2src(cardinsteaddtl.oldcardphyid,trans.cardphyid);
		des2src(cardinsteaddtl.oldshowcardno,tCard.showcardno);
		cardinsteaddtl.oldcardcnt = trans.paycnt;
		cardinsteaddtl.oldcardbal = trans.cardbefbal;	
		cardinsteaddtl.oldsubsidyno=trans.cardsubsidyno;
		cardinsteaddtl.revflag[0]='0';
		cardinsteaddtl.status[0]=STATUS_NORMAL;
		ret=DB_t_cardinsteaddtl_add(&cardinsteaddtl);
		if(ret)
		{
			if(DB_REPEAT==ret)
				return E_DB_CARDINSTEADDTL_E;
			else
				return E_DB_CARDINSTEADDTL_I;
		}
        T_t_cardver cardver;
		
		memset(&cardver,0,sizeof(cardver));
		cardver.cardno=tCard.cardno;
		des2src(cardver.accdate,pAccTrans->trans.accdate);
		cardver.termid=trans.termid;
		cardver.termseqno=trans.termseqno;
		cardver.status[0]=STATUS_NORMAL;	
		des2src(cardver.cardphyid,cardinsteaddtl.cardphyid);
		des2src(cardver.stuempno,trans.stuempno);
		cardver.cardvertype=CARDVERTYPE_CARDINSTEADOLD;
		ret=getCardVerNo(cardver.cardverno);
		if(ret)
			return ret;
        
		ret=DB_t_cardver_add(&cardver);
		if(ret)
		{
			if(DB_REPEAT==ret)
				return E_DB_CARDVER_E;
			else
				return E_DB_CARDVER_I;
		}

		T_t_newcardchange newcardchange;
		memset(&newcardchange,0,sizeof(newcardchange));

		ret=DB_t_newcardchange_read_lock_by_c1_and_showcardno(trans.showcardno,&newcardchange);
		if(ret)
		{
			writelog(LOG_ERR,"showcardno[%s]",trans.showcardno);
			if(DB_NOTFOUND==ret)
				return E_DB_NEWCARDCHANGE_N;
			else
				return E_DB_NEWCARDCHANGE_R;
		}
		newcardchange.status= NEWCARDSTATUS_INIT;
		des2src(newcardchange.oldcardphyid,cardinsteaddtl.oldcardphyid);
		des2src(newcardchange.cardphyid,rPack->scust_no2);
		des2src(newcardchange.lastsaved,trans.sysdatetime);
		ret=DB_t_newcardchange_update_lock_by_c1(&newcardchange);
		if(ret)
		{
			return E_DB_NEWCARDCHANGE_U;
		}
		//保存水控钱包卡余额
		map<int,double> CardBalMap;
		CardBalMap[rPack->lvol10]=D4U5(rPack->lvol1/100.0);
		CardBalMap[rPack->lvol11]=D4U5(rPack->lvol2/100.0);
		CardBalMap[rPack->lvol12]=D4U5(rPack->lvol3/100.0);
		map<int,double>::iterator itMap;
		for(itMap=CardBalMap.begin();itMap!=CardBalMap.end();itMap++)
		{
			int pursetype=itMap->first;
			double balance=itMap->second;
			if(pursetype<1)
				continue;
			T_t_cardbalance cardbalance;
			memset(&cardbalance,0,sizeof(cardbalance));
			ret=DB_t_cardbalance_read_lock_by_c0_and_accno_and_pursetype(tCard.accno,pursetype,&cardbalance);
			if(ret)
			{
				if(DB_NOTFOUND!=ret)
					return E_DB_CARDBALANCE_R;
				else
				{
					memset(&cardbalance,0,sizeof(cardbalance));
					des2src(cardbalance.accno,tCardAccount.accno);
					cardbalance.pursetype=pursetype;
					cardbalance.cardno=tCard.cardno;
					cardbalance.balance=balance;
					cardbalance.cardbal=balance;
					cardbalance.accumdpsamt=balance;
					ret=DB_t_cardbalance_add(&cardbalance);
					if(ret)
					{
						return E_DB_CARDBALANCE_I;
					}
				}
			}
			else
			{
				cardbalance.cardno=tCard.cardno;
				cardbalance.cardbal=balance;
				ret=DB_t_cardbalance_update_lock_by_c0(&cardbalance);
				if(ret)
				{
					return E_DB_CARDBALANCE_U;
				}
			}
			writelog(LOG_INFO,"pursertype[%d]cardbalance[%.2lf]",pursetype,cardbalance.cardbal);
		}
		ST_CPACK aPack;
		ST_PACK *outPack = &(aPack.pack); 
		
		ResetNormalCPack(&aPack,0,1);

			
		SetCol(handle,0);
		
		SetCol(handle,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_SDATE3,F_STIME3,0);	
		des2src(outPack->semp,trans.opercode);
		des2src(outPack->sdate3,pAccTrans->trans.accdate);
		des2src(outPack->stime3,pAccTrans->trans.acctime);
		outPack->lwithdraw_flag=trans.termid;
		outPack->lserial1=trans.termseqno;
		PutRow(handle,outPack,pRetCode,szMsg); 		
		return 0;
}
Exemple #8
0
int F847104(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret =0;
	int len = 0;
	int i=0;
	int hi_cutid=0;
	char h_showcardid[11] = "";						//显示卡号
	char h_password[7] = "";							//卡密码
	double h_temp_Card_id = 0;						//卡号
	double dSerialNo=0;
	char seed_key[17] = "";							//种子密钥
	char card_endtime[8 + 1] = "";						//卡的有效截至日期
	char logicdate[11]="";								//业务日期
	char sysdate[11]="";
	char systime[9]="";
	char sEndDate[9]="";
	char sMsg[256]="";
	char sMaxCardBalance[20]="";
	char lost_date[11]="";
	double dMaxCardBalance=0;
	int lost_card_id=0;
	T_t_pif_card		tCard;
	T_t_pif_card		tOldCard;
	T_t_cif_customer 	tCustomer;
	T_t_pif_spefee 	tSpeFee;
    //	T_t_pif_cardlossinfo tCardLossInfo;
	T_t_tif_tradeserial  tradeserial;
	T_t_aif_account tAccount;
	InAcc  IA;
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL5,
           F_SCUST_NO,	F_SCUST_NO2,F_SCUST_AUTH,F_SCUST_AUTH2,
           F_SDATE0,F_SNAME,F_SNAME2,
           F_SOPEN_EMP,F_SSTATUS0,
           F_DAMT2,F_LSERIAL1,F_VSMESS,0);

	memset(&tCard,0,sizeof(tCard));
	memset(&tOldCard,0,sizeof(tOldCard));
	memset(&tCustomer,0,sizeof(tCustomer));
	memset(&tSpeFee,0,sizeof(tSpeFee));
    //	memset(&tCardLossInfo,0,sizeof(tCardLossInfo));
	memset(&tAccount,0,sizeof(tAccount));
	memset(&tradeserial,0,sizeof(tradeserial));
	memset(&IA,0,sizeof(IA));

	getsysdate(sysdate);
	getsystime(systime);
	ret=GetLogicDate(logicdate);										//业务日期
	if(ret)
	{
		*pRetCode=ret;
		goto L_RETU;
	}
	//检查客户信息,判断是否可以发行卡
	hi_cutid=rPack->lvol0;									//客户号
	des2src(tCard.physical_no, rPack->sbank_acc);				//物理卡号
	trim(h_showcardid);
	ret=IsExistFreezeCardByCustomId(hi_cutid);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	ret=IsExistNoLostCardByCustomId(hi_cutid);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	if(strlen(h_showcardid))
	{
		ret=IsExistShowCardNo(h_showcardid);
		if(ret)
		{
			*pRetCode = ret;
			goto L_RETU;
		}
	}
	ret=IsExistCardByPhyCardNo(tCard.physical_no);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	ret=GetLostCardIdByCustomId_TypeId(hi_cutid,CT_NORMAL,&lost_card_id);
	if(ret)
	{
		writelog(LOG_ERR,"customer[%d]tCard type_id[%d]",hi_cutid,CT_NORMAL);
		*pRetCode = ret;
		goto L_RETU;
	}

    /*
      ret=DB_t_pif_cardlossinfo_read_by_card_id_and_state_id(lost_card_id, STATE_VALID, &tCardLossInfo);
      if(ret)
      {
      writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id);
      if(DB_NOTFOUND==ret)
      *pRetCode =  E_CARDNO_NOT_EXIST;
      else
      *pRetCode =  E_DB_CARD_R;
      goto L_RETU;
      }
    */
	ret=get_latest_lost_date_by_card_no(lost_card_id,lost_date);
	if(ret)
	{
		writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id);
		*pRetCode =ret;
		goto L_RETU;
	}
	//先检查客户的挂失的正式卡是否到了补办日期
	ret=GetLostCardValiddate(lost_date,sEndDate);
	if(ret)
	{
		*pRetCode =ret;
		goto L_RETU;
	}

	if(strncmp(sEndDate,sysdate,8)>0)
	{
		writelog(LOG_ERR,"lost_normal_card_id[%d]lost_date[%s]end_date[%s]",lost_card_id,lost_date,sEndDate);
		*pRetCode =  E_NORMALCARD_NOT_REACH_ENDDATE;
		goto L_RETU;
	}
    /*
	//更新卡挂失日期表中该卡状态为无效
	ret=UpdateCardLossInfoState(lost_card_id,STATE_VALID,STATE_INVALID);
	if(ret)
	{
    *pRetCode = ret;
    goto L_RETU;
	}
    */
	//注销原卡
	ret=DB_t_pif_card_read_lock_by_cur_and_card_id(lost_card_id,&tOldCard);
	if(ret)
	{
		writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id);
		if(DB_NOTFOUND==ret)
			*pRetCode = E_CARDNO_NOT_EXIST;
		else
			*pRetCode =  E_DB_CARD_R;
		goto L_RETU;
	}
	des2src(tOldCard.state_id,CARDSTAT_LOGOUT);		//注销
	des2src(tOldCard.end_time,sysdate);				//注销日期
	ret=DB_t_pif_card_update_lock_by_cur(&tOldCard);
	if(ret)
	{
		writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id);
		if(DB_NOTFOUND==ret)
			*pRetCode =   E_CARDNO_NOT_EXIST;
		else
			*pRetCode =  E_DB_CARD_R;
		goto L_RETU;
	}
	DB_t_pif_card_free_lock_by_cur();

	ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(hi_cutid, &tCustomer);
	if(ret)
	{
		writelog(LOG_ERR,"cut_id[%d]",hi_cutid);
		if(DB_NOTFOUND==ret)
			*pRetCode= E_CUSTOMER_NOT_EXIST;
		else
			*pRetCode= E_DB_CUSTOMER_R;
		goto L_RETU;
	}
	//得到收费类别
	if(tCustomer.fee_type<1)
	{
		ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
			{
				tCustomer.fee_type=tCustomer.cut_type;
			}
			else
			{
				DB_t_cif_customer_free_lock_cur();
				*pRetCode=E_DB_SPEFEE_R;
				goto L_RETU;
			}
		}
		else
		{
			tCustomer.fee_type=tSpeFee.fee_type;
		}
		//更新客户表的收费类别字段
		ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				*pRetCode= E_CUSTOMER_NOT_EXIST;
			else
				*pRetCode= E_DB_CUSTOMER_U;
			goto L_RETU;
		}
	}
	DB_t_cif_customer_free_lock_cur();

	tradeserial.trade_fee =D4U5(rPack->damt0,2);
	//	准备数据插入卡信息表
	memcpy(seed_key,STATIC_SEED_KEY,16);			//读种子密钥
	if(strlen(tCustomer.can_time)==8)
	{
		ret=IsInvalidDateTime(tCustomer.can_time,"YYYYMMDD");
		if(ret)
		{
			*pRetCode=E_TB_CUSTOMER_ENDTIME;
			goto L_RETU;
		}
		if(strncmp(tCustomer.can_time,sysdate,8)<=0)
		{
			*pRetCode=E_TB_CUSTOMER_ENDTIME;
			goto L_RETU;
		}
		des2src(card_endtime,tCustomer.can_time);
	}
	else if(strlen(rPack->sdate0)==0)
	{
		*pRetCode=E_TB_CUSTOMER_NO_ENDTIME;
		goto L_RETU;
	}
	else
	{
		ret=IsInvalidDateTime(rPack->sdate0,"YYYYMMDD");
		if(ret)
		{
			*pRetCode = E_INPUT_DATE;
			goto L_RETU;
		}
		if(strncmp(rPack->sdate0,sysdate,8)<=0)
		{
			*pRetCode=E_INPUT_DATE;
			goto L_RETU;
		}
		des2src(card_endtime,rPack->sdate0);
	}

	tradeserial.trade_fee = rPack->damt0;								//金额
	tradeserial.other_seri_no = 0;										//上传端流水号
	tradeserial.serial_state = SERISTAT_DEBT;								//流水状态
	des2src(tradeserial.operate_date,sysdate);							//发生日期
	des2src(tradeserial.operate_time,systime);							//发生时间
	des2src(tradeserial.collect_date,sysdate);								//采集日期
	des2src(tradeserial.collect_time,systime);								//采集时间
	des2src(tradeserial.enteract_date,logicdate);							//处理日期
	des2src(tradeserial.enteract_time,systime);							//处理时间
	tradeserial.maindevice_id = rPack->lvol6;								//上传工作站标识
	tradeserial.device_id = rPack->lvol7;									//采集设备标识
	tradeserial.purse_id = PURSE_NO_ONE;								//钱包号
	tradeserial.customer_id = tCustomer.cut_id;							//客户标识
	tradeserial.sys_id = 0;												//外部系统标识
	des2src(tradeserial.oper_code, rPack->scust_limit);					//操作员号

	len=strlen(tCustomer.man_id) ;
	if (len >= 6)
	{
		strncpy(h_password,&(tCustomer.man_id[len-6]),6);
		if(h_password[5]>'9'||h_password[5]<'0')
			h_password[5]='0';
	}
	else
	{
		strcpy(h_password,DEFAULT_CUST_PWD);
	}
	ret = getNewUniqNo(KEYTYPE_CARD_ID,&h_temp_Card_id);						//获取最大卡号
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	tCard.card_id = (int)h_temp_Card_id;											//卡号
	des2src(tCard.showid,h_showcardid);										//显示卡号
	des2src(tCard.is_main,TYPE_YES);  											//是否为主卡
	des2src(tCard.state_id,CARDSTAT_REG);										//卡状态
	tCard.type_id = CT_NORMAL;													//卡类别
	EncodePwd(seed_key,h_password,tCard.password,0);							//卡密码
	tCard.cosumer_id = hi_cutid;													//客户标识
	tCard.account_count = ACCOUNT_COUNT_ONE;									//卡对应帐户个数
	des2src(tCard.begin_time,sysdate);											//注册时间
	des2src(tCard.end_time, card_endtime);										//截至时间

	tCard.phytype = PHYTYPE_NO_ONE;											//设备物理型号;默认为1
	//	插入卡信息
	ret = DB_t_pif_card_add(&tCard);
	if (ret)
	{
		if(DB_REPEAT==ret)
			*pRetCode = E_DB_CARD_E;
		else
			*pRetCode = E_DB_CARD_I;
		goto L_RETU;
	}
	//修改帐户表中对应的卡号,类型,状态
	ret=DB_t_aif_account_read_lock_by_c0_and_card_id_and_purse_id(lost_card_id,PURSE_NO_ONE,&tAccount);
	if (ret)
	{
		writelog(LOG_ERR,"normalcard_account_id[%s]",lost_card_id);
		if(DB_NOTFOUND==ret)
			*pRetCode =  E_ACTNO_NOT_EXIST;
		else
			*pRetCode =  E_DB_ACCOUNT_R;
	}
	if(tAccount.current_state!=1)
	{
		*pRetCode=E_ACTNO_LOGOUT;
		goto L_RETU;
	}
	tAccount.card_id=tCard.card_id;
	tAccount.card_balance=tAccount.cur_freebala;			//更新卡余额与库余额一致
	tAccount.consume_count=0;
	ret=DB_t_aif_account_update_lock_by_c0(&tAccount);
	if (ret)
	{
		writelog(LOG_ERR,"DB_t_aif_account_update_lock_by_cur4 ret[%d]account_id[%s]",ret,tAccount.account_id);
		if(DB_NOTFOUND==ret)
			*pRetCode =   E_ACTNO_EXIST;
		else
			*pRetCode =  E_DB_ACCOUNT_U;
	}
	DB_t_aif_account_free_lock_c0();

	ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo);  						//获得最大流水号
	if(ret)
	{
		*pRetCode=ret;
		goto L_RETU;
	}
	tradeserial.serial_no=(int)dSerialNo;
	tradeserial.serial_type=TXCODE_CHANGE_CARD;
	tradeserial.card_id=tCard.card_id;				//新卡号
	des2src(tradeserial.showid,tCard.showid);			//显示卡号

	strcpy(IA.sArrInActno[0],tAccount.account_id);		//账号
	IA.dArrInAmt[0]=tradeserial.trade_fee;			//交易金额
	IA.iUseCardFlag=USE_CARD_TYPE_ONLINE;		//联机交易
	IA.dInCardBala=tAccount.cur_freebala;			//入卡值
	IA.iTxCnt=1;
	IA.iCardNo=tCard.card_id;
	IA.iFeeType=tCustomer.fee_type;
	IA.iArrInFeeSwitch[0]=rPack->lvol0;
	IA.iArrInFeeSwitch[1]=rPack->lvol1;
	IA.iArrInFeeSwitch[2]=rPack->lvol2;
	IA.iArrInFeeSwitch[3]=rPack->lvol3;
	IA.iArrInFeeSwitch[4]=rPack->lvol4;
	IA.iArrInFeeSwitch[5]=rPack->lvol5;
	IA.iArrInFeeSwitch[6]=rPack->lvol6;
	IA.iArrInFeeSwitch[7]=rPack->lvol7;
	IA.iArrInFeeSwitch[8]=rPack->lvol8;
	IA.iArrInFeeSwitch[9]=rPack->lvol9;
	IA.iArrInFeeSwitch[10]=rPack->lvol10;
	ret=process(&IA,&tradeserial);
	if(ret)
	{
		writelog(LOG_ERR,"process ret[%d]",ret);
		*pRetCode=ret;
		goto L_RETU;
	}
	sprintf(out_pack->vsmess,"流水号:%d 卡号:%d ",IA.iSerialNo,IA.iCardNo);
	for(i=1;i<=IA.iOutTxTypeCnt;i++)
	{
		switch(IA.iArrOutTxType[i])
		{
        case TXTYPE_TOLL_DEPOSIT:
        case TXTYPE_DEDUCT_DEPOSIT:
        case TXTYPE_RETURN_DEPOSIT:
            tradeserial.deposit_fee=IA.dArrOutAmt[i];
            break;
        case TXTYPE_PRE_TOLL_BOARD:
        case TXTYPE_TOLL_BOARD:
        case TXTYPE_DEDUCT_BOARD:
        case TXTYPE_RETURN_BOARD:
            tradeserial.boardfee=IA.dArrOutAmt[i];
            break;
        case TXTYPE_TOLL_CHARGE:
            tradeserial.in_fee=IA.dArrOutAmt[i];
            break;
        case TXTYPE_TOLL_CARDCOST:
            tradeserial.cost_fee=IA.dArrOutAmt[i];
            break;
        default:
            break;
		}
		if(amtcmp(IA.dArrOutAmt[i],0)!=0)
		{
			sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
			strcat(out_pack->vsmess,sMsg);
		}
	}
	sprintf(sMsg,"卡当前余额:%.2lf元",tradeserial.out_balance);
	strcat(out_pack->vsmess,sMsg);
	writelog(LOG_DEBUG,out_pack->vsmess);
	ret = DB_t_tif_tradeserial_add(&tradeserial);
	if (ret)
	{
		writelog(LOG_ERR,"ret[%d]",ret);
		if(DB_REPEAT==ret)
			*pRetCode = E_DB_TRADESERIAL_E;
		else
			*pRetCode = E_DB_TRADESERIAL_I;
		goto L_RETU;
	}
	if(amtcmp(tradeserial.out_balance,0)<0)
	{
		*pRetCode=E_ENTER_ACCOUNT;
		goto L_RETU;
	}
	//检查金额是否超过最大额度
	ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance);
	if(ret)
	{
		*pRetCode=ret;
		goto L_RETU;
	}
	dMaxCardBalance=atof(sMaxCardBalance);
	if(amtcmp(tradeserial.out_balance,dMaxCardBalance)>0)
	{
		writelog(LOG_ERR,"tradeserial.out_balance[%lf]",tradeserial.out_balance);
		*pRetCode=E_AMT_EXCEED_MAX;
		goto L_RETU;
	}
	// 增加发行新卡时的门禁名单表检查
	ret = CheckNewCardHook(&tCustomer, tCard.card_id);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	//返回卡号\密码\显示卡号\客户类型\图书证号\有效截至日期
	out_pack->lvol0 = (int)h_temp_Card_id;						//交易卡号
	out_pack->lvol1 = tCustomer.cut_type;						//客户类别
	out_pack->lvol5 = tCustomer.fee_type;						//收费类别
	des2src(out_pack->scust_no,h_showcardid);					//显示卡号
	des2src(out_pack->scust_no2,tCustomer.classdept_no);			//部门号
	des2src(out_pack->scust_auth,tCustomer.stuemp_no);			//学号
	des2src(out_pack->scust_auth2,tCustomer.man_id);			//身份证号
	des2src(out_pack->sname,tCustomer.cut_name);				//客户姓名
	des2src(out_pack->sname2,tCustomer.lib_cardid);				//图书证号
	des2src(out_pack->sstatus0,tCustomer.sex);					//性别
	des2src(out_pack->sopen_emp,h_password);					//卡密码
	des2src(out_pack->sdate0,card_endtime);					//有效截至日期

	out_pack->damt2=tradeserial.out_balance;					//出卡值
	out_pack->lserial1=tradeserial.serial_no;						//流水号
	// add by 汤成 2005-8-8
	// 增加向名单表写入记录
	ret = InsertToBlkList((int)h_temp_Card_id,CHCARD_BLACKLIST);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
  L_RETU:
	return -1;
}
Exemple #9
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;
}
int F930203(TRUSERID *handle, int iRequest, ST_PACK *in_pack, int *pRetCode, char *szMsg) {
    T_t_doordtl tDoordtl;
    T_t_card tCard;
    T_t_device device;
    T_t_dooreventdtl event;
    T_t_customer tCust;
    int ret;
    char weigand_no[12+1] = "";
    memset(&device, 0, sizeof device);

    writelog(LOG_INFO, "接收前置数据:device=[%d],parent_id=[%d],dev_no=[%d],cardno=[%d],phycarid=[%s],ret=[%d]",in_pack->lvol5, in_pack->lvol2, in_pack->lvol1,in_pack->lvol0,in_pack->sdate1,ret);
    // 查询设备ID号
    if (in_pack->lvol5 > 0) {
        ret = DB_t_device_read_by_deviceid(in_pack->lvol5, &device);
    } else {
        // 先判断是不是有父设备ID
        if (in_pack->lvol2 > 0)
            ret = get_door_dev_by_parent_and_termid(&device, in_pack->lvol2
                                                    , in_pack->lvol1); // 通过机号查询
        else {
            // 判断父设备机号
            if (in_pack->lvol3 > 0)
                ret = find_device_by_parent_termid(&device, in_pack->lvol3, in_pack->lvol1
                                                   , in_pack->lserial0); // 通过父设备机号与设备机号查询
            else {
                // 通过子系统号与设备机号查询
                ret = find_device_by_devinfo(&device, in_pack->lcert_code, in_pack->lvol1
                                             , in_pack->sbank_code, in_pack->lserial0);
            }
        }
    }
    if (ret) {
        writelog(LOG_ERR, "获取设备信息失败:deviceid=[%d],parent_id=[%d],dev_no=[%d],ret=[%d]",in_pack->lvol5, in_pack->lvol2, in_pack->lvol1, ret);
        if (ret == E_DB_DEVICE_N) {
            writelog(LOG_ERR, "上传记录找不到对应的设备termid[%d]type[%s]parent[%d][%d],sys[%d],phytype[%d]",in_pack->lvol1, in_pack->sbank_code, in_pack->lvol2, in_pack->lvol3, in_pack->lcert_code, in_pack->lserial0);
            return ret;
        } else {
            *pRetCode = ret;
            goto L_RETU;
        }
    }
    // 没有物理卡号,也没有交易卡号
    if ((strlen(in_pack->sdate1) == 0) && in_pack->lvol0 == 0) {
        //事件
        memset(&event, 0, sizeof event);
        event.deviceid = device.deviceid;
        event.eventcode = atoi(in_pack->semp_no);
        des2src(event.eventmsg, in_pack->vsmess);
        event.sysid= in_pack->lcert_code;
        des2src(event.transdate, in_pack->sdate0);
        des2src(event.transtime, in_pack->stime0);
        getsysdate(event.coldate);
        getsystime(event.coltime);
        ret = DB_t_dooreventdtl_add(&event);
        if (ret) {
            if (DB_REPEAT == ret)
                return 0;
            return E_DB_DOOREVENTDTL_I;
        }
        return 0;

    } else {
        memset(&tCard, 0, sizeof tCard);

        if(strlen(in_pack->sdate1) >0) {	// 有物理卡号
            ret = get_card_by_phyno(&tCard, in_pack->sdate1);
            if (ret) {
                if (ret == E_DB_CARD_N) {
                    ConverPhyNo(in_pack->sdate1, weigand_no);
                    ret = get_card_by_weigand_no(&tCard, weigand_no);
                    if (ret) {
                        writelog(LOG_ERR, "Get_card_by_weigand_no err,weigand_no=[%s],ret=[%d]", weigand_no, ret);
                        // 没有这张卡,仍然保留流水
                        if (ret != E_DB_CARD_N) {
                            *pRetCode = ret;
                            goto L_RETU;
                        }
                    }
                } else {
                    *pRetCode = ret;
                    goto L_RETU;
                }
            }
        } else {	// 根据交易卡号查询
            ret = DB_t_card_read_by_cardno(in_pack->lvol0, &tCard);
            if(ret) {
                *pRetCode = E_DB_CARD_R;
                goto L_RETU;
            }
        }
        memset(&tDoordtl, 0, sizeof tDoordtl);
        tDoordtl.deviceid = device.deviceid;
        des2src(tDoordtl.devphyid,device.devphyid);
        writelog(LOG_DEBUG,"deviceid[%d],devphyid[%s]",device.deviceid,device.devphyid);
        tDoordtl.cardno = tCard.cardno;
        tDoordtl.sysid = in_pack->lcert_code;
        tDoordtl.custid = tCard.custid;

        if (!ret)
            des2src(tDoordtl.cardphyid, tCard.cardphyid);
        else
            des2src(tDoordtl.cardphyid, in_pack->sdate1);

        if(tDoordtl.custid) {
            memset(&tCust,0,sizeof tCust);
            ret = DB_t_customer_read_by_custid(tDoordtl.custid, &tCust);
            if(ret ) {
                if(ret != DB_NOTFOUND)
                    return E_DB_CUSTOMER_R;
            } else {
                des2src(tDoordtl.stuempno,tCust.stuempno);
                des2src(tDoordtl.custname,tCust.custname);
            }
        }
        //writelog(LOG_DEBUG,"door serial date[%s] time[%s]",in_pack->sdate0,in_pack->stime0);
        des2src(tDoordtl.transdate, in_pack->sdate0);
        des2src(tDoordtl.transtime, in_pack->stime0);
        getsysdate(tDoordtl.coldate);
        getsystime(tDoordtl.coltime);
        tDoordtl.transmark = atoi(in_pack->semp_no);
        ret = getNewUniqNo(KEYTYPE_DOORDTL,&(tDoordtl.devseqno));
        if(ret) {
            writelog(LOG_ERR,"生成流水号失败");
            *pRetCode = ret;
            goto L_RETU;
        }
        // 保存门禁流水
        ret = DB_t_doordtl_add(&tDoordtl);
        if (ret) {
            // 重复流水忽略
            if (DB_REPEAT == ret) {
                writelog(LOG_DEBUG, "流水重复card[%s],date[%s],time[%s]", in_pack->sdate1,in_pack->sdate0, in_pack->stime0);
                return 0;
            }
            writelog(LOG_ERR, "保存流水失败card[%s],date[%s],time[%s]", in_pack->sdate1,in_pack->sdate0, in_pack->stime0);
            *pRetCode = E_DB_DOOREVENTDTL_I;
            goto L_RETU;
        }

        switch (device.devusage) {
        case DU_JSB_CONFRENCE:
            /*
            ret = SaveDoorJSBSerial(&tDoordtl);
            if(ret)
            {
            	writelog(LOG_ERR,"保存计时宝流水失败,errcode[%d]",ret);
            	break;
            }
            ret = UpdateConferSerial(&tDoordtl);
            */
//			break;
        case DU_JSB_ATTENDANCE:
//			ret = SaveKQSerial(&tDoordtl);
//			if (ret)
//			{
//				writelog(LOG_ERR, "插入考勤流水表失败,errcode[%d]", ret);
//				break;
//			}
        default:
            //ret = SaveDoorJSBSerial(&tDoordtl);
            /*
            ret = SaveDoorDtl(&tDoordtl);
            if (ret)
            {
            	writelog(LOG_ERR, "插入考勤流水表失败,errcode[%d]", ret);
            	break;
            }
            */
            break;
        }
        if (ret) {
            *pRetCode = ret;
            goto L_RETU;
        }
    }
    return 0;

L_RETU:
    return -1;

}
Exemple #11
0
int F847132(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	int i=0;
	int iTotalCnt=0;
	double dTotalAmt=0.0;
	double dSerialNo = 0;
	char logicdate[11]="";										//业务日期
	char sysdate[11]="";
	char systime[9]="";
	char sMsg[256]="";
	T_t_tif_tradeserial  tradeserial;
	T_t_tif_savdtl		tSavdtl;
	T_t_tif_subsidy  	tSubsidy;
	InAcc	IA;
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);

	memset(&tSavdtl,0,sizeof(tSavdtl));
	memset(&tSubsidy,0,sizeof(tSubsidy));
	memset(&tradeserial,0,sizeof(tradeserial));
	memset(&IA,0,sizeof(IA));

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_VSMESS,0);
	getsysdate(sysdate);
	getsystime(systime);
	ret=GetLogicDate(logicdate);					//业务日期
	if(ret)
	{
		*pRetCode=ret;
		goto L_RETU;
	}
	if(strlen(rPack->scust_limit)<1)
	{
		*pRetCode=E_INPUT_BATCH_NO;
		goto L_RETU;
	}
	if(strlen(rPack->scust_no)<1)
	{
		*pRetCode=E_INPUT_OPER_NULL;
		goto L_RETU;
	}
	if(amtcmp(rPack->damt0,0)<=0)
	{
		*pRetCode=E_INPUT_AMT;
		goto L_RETU;
	}
	des2src(tSubsidy.summary,rPack->semail);		//补助摘要
	if(strlen(rPack->semail)<1)
	{
		*pRetCode=E_INPUT_SUMMARY;
		goto L_RETU;
	}
	des2src(tSubsidy.batch_no,rPack->scust_limit);
	tSubsidy.bill_type=rPack->lvol2;					//票据类型
	des2src(tSubsidy.bill_no,rPack->scust_auth2);	//票据号码
	tSubsidy.amount=rPack->damt0;				//补助金额
	des2src(tSubsidy.subsidytype,rPack->smain_flag);//补助标志(0增值1减值)
	des2src(tSubsidy.subsidytype,"1");			//补助标志(0增值1减值)
	des2src(tSubsidy.broker_id,rPack->sname);		//经办人身份证号
	des2src(tSubsidy.broker_name,rPack->semail2);	//经办人姓名

	IA.dArrInAmt[0]=tradeserial.trade_fee;
	switch(tSubsidy.bill_type)
	{
		case TYPE_CASH:	//现金
			IA.iArrInFeeSwitch[1]=1;
			break;
		case TYPE_BILL:	//支票
			IA.iArrInFeeSwitch[2]=1;
			break;
		case TYPE_FUNDBOOK:	//经费本
			IA.iArrInFeeSwitch[3]=1;
			break;
		default:
			*pRetCode=E_INPUT_DEPOSIT_TYPE;
			goto L_RETU;
	}
	ret=stat_subsidy_amount_by_batch_no(tSubsidy.batch_no, &iTotalCnt,&dTotalAmt);
	if(ret)
	{
		*pRetCode = ret;
		writelog(LOG_ERR,"ret[%d]",ret);
		goto L_RETU;
	}
	if(iTotalCnt!=rPack->lvol3)
	{
		strcpy(szMsg,"补助人数与导入的数据不符");
		*pRetCode=E_INPUT_DATA_INVAILD;
		goto L_RETU;
	}
	if(amtcmp(dTotalAmt,rPack->damt0)!=0)
	{
		strcpy(szMsg,"补助总金额与导入的补助数据不符");
		*pRetCode=E_INPUT_DATA_INVAILD;
		goto L_RETU;
	}
	// writelog(LOG_DEBUG,"subsidy no : %s",tSubsidy.batch_no);
	des2src(tSubsidy.tx_date,sysdate);
	des2src(tSubsidy.tx_time,systime);
	ret=update_subsidy_info_by_batch_no(&tSubsidy);
	if(ret)
	{
		*pRetCode = ret;
		writelog(LOG_ERR,"ret[%d]",ret);
		goto L_RETU;
	}
	ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo);  					//获得最大流水号
	if(ret)
	{
		*pRetCode = ret;
		writelog(LOG_ERR,"ret[%d]",ret);
		goto L_RETU;
	}
	tradeserial.serial_no = (int)dSerialNo;											//流水号
	tradeserial.other_seri_no = 0;															//上传端流水号
	tradeserial.serial_type = TXCODE_SET_SUBSIDY;
	tradeserial.serial_state = SERISTAT_DEBT;				//流水状态
	des2src(tradeserial.operate_date,logicdate);			//发生日期
	des2src(tradeserial.operate_time,systime);			//发生时间
	des2src(tradeserial.collect_date,sysdate);				//采集日期
	des2src(tradeserial.collect_time,systime);				//采集时间
	des2src(tradeserial.enteract_date,logicdate);			//处理日期
	des2src(tradeserial.enteract_time,systime);			//处理时间
	tradeserial.maindevice_id = rPack->lvol6;				//上传工作站标识
	tradeserial.device_id = rPack->lvol7;					//采集设备标识
	des2src(tradeserial.oper_code , rPack->scust_no);		//操作员代码
	tradeserial.sys_id = 0;								//外部系统标识
	// 设置发生金额
	tradeserial.trade_fee = dTotalAmt;
	switch(tSubsidy.bill_type)
	{
		case TYPE_CASH:		//现金
			break;
 		case TYPE_BILL:		//支票
		case TYPE_FUNDBOOK:	//经费本
 			tSavdtl.amount=rPack->damt0;				//发生额
 			if(amtcmp(tSavdtl.amount,0)<=0)
				break;
			des2src(tSavdtl.bill_no,tSubsidy.bill_no);		//票据号码
			if(strlen(tSavdtl.bill_no)<1)
			{
				*pRetCode=E_INPUT_BILLNO;
				goto L_RETU;
			}
			tSavdtl.card_no=0;							//卡号
			des2src(tSavdtl.oper_no,rPack->scust_limit);	//操作员
			tSavdtl.seqno=tradeserial.serial_no;			//流水号
			des2src(tSavdtl.tx_date,sysdate);			//发生日期
			des2src(tSavdtl.tx_time,systime);			//发生时间
			tSavdtl.cnt=1;								//票据数量
			tSavdtl.bill_type=tSubsidy.bill_type;			//票据类型
			tSavdtl.tx_code=tradeserial.serial_type;		//交易码
			ret=DB_t_tif_savdtl_add(&tSavdtl);
			if(ret)
			{
				if(DB_REPEAT==ret)
					*pRetCode = E_DB_SAVDTL_E;
				else
					*pRetCode = E_DB_SAVDTL_I;
				goto L_RETU;
			}
			break;
		default:
			*pRetCode=E_INPUT_DEPOSIT_TYPE;
			goto L_RETU;
	}
	IA.iFeeType=1;				//默认值
	IA.dArrInAmt[0]=tradeserial.trade_fee;
	// writelog(LOG_DEBUG,"补助金额[%lf]",tradeserial.trade_fee);
//	if(strncmp(tSubsidy.subsidytype,"1",1)==0)
//		IA.dArrInAmt[0]=tradeserial.trade_fee;
//	else if(strncmp(tSubsidy.subsidytype,"2",1)==0)
//	{
//		IA.dArrInAmt[0]=-tradeserial.trade_fee;
//		IA.iTxFlag=1;
//	}
//	else
//	{
//		*pRetCode=E_INPUT_DATA_INVAILD;
//		sprintf(szMsg,"输入的补助类型%s不存在",strncmp(tSubsidy.subsidytype);
//		goto L_RETU;
//	}
	IA.iArrInFeeSwitch[0]=rPack->lvol0;
	IA.iArrInFeeSwitch[5]=rPack->lvol5;
	IA.iArrInFeeSwitch[6]=rPack->lvol6;
	IA.iArrInFeeSwitch[7]=rPack->lvol7;
	IA.iArrInFeeSwitch[8]=rPack->lvol8;
	IA.iArrInFeeSwitch[9]=rPack->lvol9;
	IA.iArrInFeeSwitch[10]=rPack->lvol10;

	ret=process(&IA,&tradeserial);
	if(ret)
	{
		writelog(LOG_ERR,"process ret[%d]",ret);
		*pRetCode=ret;
		goto L_RETU;
	}
	sprintf(out_pack->vsmess,"流水号:%d ",IA.iSerialNo);
	// writelog(LOG_DEBUG,"out tx type count %d",IA.iOutTxTypeCnt);
	for(i=1;i<=IA.iOutTxTypeCnt;i++)
	{
		if(amtcmp(IA.dArrOutAmt[i],0)!=0)
		{
			sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
			strcat(out_pack->vsmess,sMsg);
		}
	}
	sprintf(sMsg,",共%d笔",iTotalCnt);
	strcat(out_pack->vsmess,sMsg);
	// strcat(out_pack->vsmess,sMsg);
	// writelog(LOG_DEBUG,out_pack->vsmess);
	ret = DB_t_tif_tradeserial_add(&tradeserial);
	if (ret)
	{
		writelog(LOG_ERR,"ret[%d]",ret);
		if(DB_REPEAT==ret)
			*pRetCode = E_DB_TRADESERIAL_E;
		else
			*pRetCode = E_DB_TRADESERIAL_I;
		goto L_RETU;
	}
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
L_RETU:
	return -1;
}
int F950073(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret;
	char packid[30]={0};
	char reqid[20]={0};
	T_t_device tDevice;
	T_t_transpack transpack;
	CAccTrans& ats = CAccTrans::GetInst();
	TRANS &trans = ats.trans;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);

	memset(&tDevice,0,sizeof tDevice);
	memset(&transpack,0,sizeof transpack);

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LCERT_CODE,F_SPHONE3,F_LSERIAL0,F_LWITHDRAW_FLAG,0);

	GetCpackDataString(rPack,transpack.reqdata);
	des2src(tDevice.devphyid,rPack->sphone3);
	ret = addPOSCheckPOS(rPack->lwithdraw_flag,tDevice);
	if(ret)
	{
		outPack->lcert_code = ret;
	}
	else
	{
		des2src(transpack.transdate,rPack->sdate0);
		des2src(transpack.transtime,rPack->stime0);
		transpack.reqsno = rPack->lserial0;
		
		sprintf(transpack.packetid,"%s%s%03d",transpack.transdate,transpack.transtime,transpack.reqsno%1000);
		sprintf(transpack.reqid,"%d",tDevice.deviceid);
		transpack.funcno = iRequest;
		transpack.status[0]=TRANSPACKSTATE_NODEAL;
		des2src(transpack.lastupdtime,trans.sysdatetime);
		transpack.datalen = strlen(transpack.reqdata);
		if(rPack->lvol10 == 2) // 中途拔卡,发送交易取消
		{
			transpack.status[0] = TRANSPACKSTATE_WRITEFAILD;
			transpack.revflag = 0;
		}
		else if(rPack->lvol10 == 1)//交易冲正
		{
			transpack.revflag = 1;
		}
		else 
		{
			transpack.errcode = ERRIF_DATA;
			transpack.status[0] = TRANSPACKSTATE_DENY;
		}
		ret = DB_t_transpack_add(&transpack);
		if(ret)
		{
			if(DB_REPEAT == ret)
			{
				//
				des2src(packid,transpack.packetid);
				des2src(reqid,transpack.reqid);
				memset(&transpack,0,sizeof transpack);
				ret = DB_t_transpack_read_lock_by_c0_and_packetid_and_reqid(packid,reqid,&transpack);
				if(ret)
				{
					outPack->lcert_code = ERRIF_SYSTEM;
				}
				else
				{
					
					des2src(transpack.lastupdtime,trans.sysdatetime);
					if(rPack->lvol10 == 2) // 中途拔卡,发送交易取消
					{
						transpack.status[0] = TRANSPACKSTATE_WRITEFAILD;
						transpack.revflag = 0;
					}
					else if(rPack->lvol10 == 1)//交易冲正
					{
						transpack.revflag = 1;
						transpack.retrycnt++;
					}
					else 
					{
						transpack.errcode = ERRIF_DATA;
					}
					ret = DB_t_transpack_update_lock_by_c0(&transpack);
					if(ret)
					{
						outPack->lcert_code = ERRIF_SYSTEM;
					}
					else
					{
						outPack->lcert_code = 0;
					}
				}
				
			}
			else
			{
				outPack->lcert_code = ERRIF_SYSTEM;
			}
		}
		else
		{
			// 没有对应的充值记录
			outPack->lcert_code = 0;
		}
	}
	des2src(outPack->sphone3,tDevice.devphyid);
	outPack->lwithdraw_flag = tDevice.deviceid;
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
	
}
Exemple #13
0
//冲正
int ReverseProcess(RevAcc * revacc)			
{
	int ret = -1;
	int rows = 0;
	char sTxdate[9] = "";
	
	//char *pMessage = (char*) revacc->pVoidPointer;

	T_t_tif_tradelog tTradelog;
	T_t_tif_tradelog_his tTradeloghis;

	memset(&tTradelog,0,sizeof tTradelog);
	memset(&tTradeloghis,0,sizeof tTradeloghis);

	GetLogicDate(sTxdate);
	if(strcmp(revacc->sTxAccDate,sTxdate) == 0)		//查当前账务表
	{
		ret = DB_t_tif_tradelog_open_select_by_c2_and_serino_and_seri_type_and_outorin(revacc->iSerialNo, revacc->iTradeNo, DBCR_DEBIT);
		if(ret)
		{
			if(DB_NOTFOUND == ret)
				return  E_FAN_SERIAL_NOT_EXISTS;
			else
				return E_DB_TRADELOG_R;
		}
		while(1)
		{
			memset(&tTradelog,0,sizeof tTradelog);
			ret = DB_t_tif_tradelog_fetch_select_by_c2(&tTradelog);
			if(ret)
			{
				if(DB_NOTFOUND == ret)
				{
					if(rows > 0)
						break;
					else
						return E_FAN_SERIAL_NOT_EXISTS;
				}
				else
					return E_DB_TRADELOG_R;
			}
			rows++;
			ret = do_reverse_balance(&tTradelog,revacc);
			if(ret)
			{
				DB_t_tif_tradelog_close_select_by_c2();
				return ret;
			}			
		}
		DB_t_tif_tradelog_close_select_by_c2();
	}
	else 			// 查历史账务表
	{					
		ret =  DB_t_tif_tradelog_his_open_select_by_c0_and_bak_date_and_serino_and_outorin(revacc->sTxAccDate, revacc->iSerialNo,DBCR_DEBIT );			
		if(ret)
		{
			if(DB_NOTFOUND == ret)
				return  E_FAN_SERIAL_NOT_EXISTS;
			else
				return E_DB_TRADELOG_R;
		}
		while(1)
		{
			memset(&tTradelog,0,sizeof tTradelog);
			ret = DB_t_tif_tradelog_his_fetch_select_by_c0(&tTradeloghis);
			if(ret)
			{
				if(DB_NOTFOUND == ret)
				{
					if(rows > 0)
						break;
					else
						return E_FAN_SERIAL_NOT_EXISTS;
				}
				else
					return E_DB_TRADELOG_R;
			}
			rows++;
			tTradelog.fee_type = tTradeloghis.fee_type;
			des2src(tTradelog.act_id,tTradeloghis.act_id);
			des2src(tTradelog.subno,tTradeloghis.subno);
			des2src(tTradelog.other_actid,tTradeloghis.other_actid);
			des2src(tTradelog.other_subno,tTradeloghis.other_subno);
			tTradelog.outorin= tTradeloghis.outorin;
			tTradelog.op_fee= tTradeloghis.op_fee;
			tTradelog.new_fee = tTradeloghis.new_fee;
			tTradelog.cur_frozebala= tTradeloghis.cur_frozebala;
			tTradelog.annex= tTradeloghis.annex;
			des2src(tTradelog.comments,tTradeloghis.comments);
			ret = do_reverse_balance(&tTradelog,revacc);
			if(ret)
			{
				DB_t_tif_tradelog_his_close_select_by_c0();
				return ret;
			}
			
		}
		DB_t_tif_tradelog_his_close_select_by_c0();
	}

	return 0;
}
Exemple #14
0
int do_reverse_balance(T_t_tif_tradelog *tTradelog,RevAcc *revacc)
{
	int ret = -1;
	int idxSub=0;
	T_t_aif_account tAccountDb;
	T_t_aif_account tAccountCr;
	T_t_tif_tradelog tTradelogDb;
	T_t_tif_tradelog tTradelogCr;
	T_t_tif_subject  tSubject;
	T_t_tif_cfgsplit  tCfgsplit;
	
	memset(&tAccountDb,0,sizeof tAccountDb);
	memset(&tAccountCr,0,sizeof tAccountCr);
	memset(&tSubject,0,sizeof tSubject);
	memset(&tCfgsplit,0,sizeof tCfgsplit);
	memset(&tTradelogDb,0,sizeof tTradelogDb);
	memset(&tTradelogCr,0,sizeof tTradelogCr);

	// 处理借方
	memcpy(&tTradelogDb,tTradelog,sizeof tTradelogDb);
	tTradelogDb.seri_type = TXCODE_TX_REVEAL;					// 交易代码记录为冲正
	
	ret = DB_t_aif_account_read_lock_by_cur_and_account_id(tTradelog->act_id, &tAccountDb);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_ACTNO_NOT_EXIST;
		else
			return E_DB_ACCOUNT_R;
	}
	if(tAccountDb.current_state == ACCOUNTSTAT_LOGOUT)
	{
		DB_t_aif_account_free_lock_cur();
		writelog(LOG_ERR, "read account err[%d]act_id[%s]", E_ACTNO_LOGOUT, tAccountDb.account_id);
		return E_ACTNO_LOGOUT;
	}
	
	ret = DB_t_tif_subject_read_by_subno(tAccountDb.subno, &tSubject);
	if(ret)
	{
		DB_t_aif_account_free_lock_cur();
		return ret;
	}
		
	if (SUBTYPE_FUND== tSubject.subtype|| SUBTYPE_COST==  tSubject.subtype )
	{
		tAccountDb.cur_bala = D4U5(tAccountDb.cur_bala- tTradelog->op_fee,6);
		tAccountDb.cur_freebala = D4U5(tAccountDb.cur_freebala- tTradelog->op_fee,6);
		//db_amt_flag=1;
	}
	else
	{
		//db_amt_flag=-1;
		if(strncmp(tAccountDb.subno,"201",3)==0)
		{
			//消费时从冻结金额中扣除搭伙费
			ret = DB_t_tif_cfgsplit_read_by_txtype(tTradelog->fee_type, &tCfgsplit);
			if(ret)
			{
				DB_t_aif_account_free_lock_cur();
				return ret;
			}
			switch(tCfgsplit.fundtype)
			{
				case FUNDTYPE_BOARD://搭伙费
					tAccountDb.cur_bala =D4U5(tAccountDb.cur_bala+ tTradelog->op_fee,6);			//总余额
					tAccountDb.cur_frozebala = D4U5(tAccountDb.cur_frozebala + tTradelog->op_fee,6);
					break;
				default:
					tAccountDb.cur_bala =D4U5(tAccountDb.cur_bala+ tTradelog->op_fee,6);			//总余额
					tAccountDb.cur_freebala =D4U5(tAccountDb.cur_freebala+tTradelog->op_fee,6);	//可用余额
					//更新卡余额
					if(USE_CARD_TYPE_ONLINE==revacc->iUseCardFlag)
					{
						//联机交易保留交易金额的交易时间
						getsysdate(tAccountDb.reserve_1);
					
						 if(amtcmp(revacc->dInCardBala,0)>=0)
						{
							//有入卡值,没有出卡值,计算出卡值,卡余?
							revacc->dOutCardBala=D4U5(revacc->dInCardBala + tTradelog->op_fee,2);
							
							tAccountDb.card_balance=revacc->dOutCardBala;					//账户卡余额
							if(revacc->iTradeCnt>0)
								tAccountDb.consume_count=revacc->iTradeCnt;
						}
					}
					else if(USE_CARD_TYPE_NULL==revacc->iUseCardFlag)
					{
						if((tAccountDb.consume_count<=revacc->iTradeCnt)||(strncmp(revacc->sTxDate,tAccountDb.reserve_1,8)>0))
						{
							strcpy(tAccountDb.reserve_1,revacc->sTxDate);						
							tAccountDb.card_balance=D4U5(revacc->dInCardBala + tTradelog->op_fee,2);			//账户卡余额	
							
						}			
						revacc->dOutCardBala=D4U5(revacc->dInCardBala + tTradelog->op_fee,2);
					}
					break;
			}
		}
		else
		{
			tAccountDb.cur_bala =D4U5(tAccountDb.cur_bala + tTradelog->op_fee,6);
			tAccountDb.cur_freebala =D4U5(tAccountDb.cur_freebala+ tTradelog->op_fee,6);
		}

	}
	
	tTradelogDb.new_fee    = tAccountDb.cur_bala;						//借方帐户总余额
	tTradelogDb.cur_frozebala=tAccountDb.cur_frozebala;					//冻结金额
	ret = DB_t_aif_account_update_lock_by_cur(&tAccountDb);
	if (ret)
	{
		writelog(LOG_ERR, "update account err[%d] account[%s]", ret,tAccountDb.account_id);
		if (DB_NOTFOUND == ret)
			return E_ACTNO_NOT_EXIST;
		else
			return E_DB_ACCOUNT_U;
	}
	DB_t_aif_account_free_lock_cur();


	// 处理贷方
	ret = DB_t_aif_account_read_lock_by_cur_and_account_id(tTradelog->other_actid, &tAccountCr);
	if (ret)
	{
		writelog(LOG_ERR, "read account err[%d]act_id[%s]", ret, tTradelog->other_actid);
		if (DB_NOTFOUND == ret)
			return E_ACTNO_NOT_EXIST;
		else
			return E_DB_ACCOUNT_R;
	}
	if(tAccountCr.current_state == ACCOUNTSTAT_LOGOUT)
	{
		DB_t_aif_account_free_lock_cur();
		writelog(LOG_ERR, "read account err[%d]act_id[%s]", E_ACTNO_LOGOUT, tAccountCr.account_id);
		return E_ACTNO_LOGOUT;
	}
	memset(&tSubject,0,sizeof tSubject);
	ret = DB_t_tif_subject_read_by_subno(tAccountCr.subno, &tSubject);
	if(ret)
	{
		DB_t_aif_account_free_lock_cur();
		return ret;
	}

	if (SUBTYPE_FUND== tSubject.subtype|| SUBTYPE_COST== tSubject.subtype)
	{
		tAccountCr.cur_bala =D4U5(tAccountCr.cur_bala+ tTradelog->op_fee,6);							//当前总余额
		tAccountCr.cur_freebala =D4U5(tAccountCr.cur_freebala+tTradelog->op_fee,6);							//当前可用余额
		//cr_amt_flag=-1;
	}
	else
	{
		//cr_amt_flag=1;
		//如果帐户类型为个人,则计算搭伙费,主要是充值使用
		if(strncmp(tAccountCr.subno,"201",3)==0)
		{
			tAccountCr.cur_bala =D4U5(tAccountCr.cur_bala- tTradelog->op_fee,6);				//总余额
			if(tCfgsplit.txtype ==0)			//第一次读取
			{
				ret = DB_t_tif_cfgsplit_read_by_txtype(tTradelog->fee_type, &tCfgsplit);
				if(ret)
				{
					DB_t_aif_account_free_lock_cur();
					return ret;
				}
			}				
			switch(tCfgsplit.fundtype)
			{
				case FUNDTYPE_BOARD:						//搭伙费
					tAccountCr.cur_frozebala =D4U5(tAccountCr.cur_frozebala- tTradelog->op_fee,6);
					break;
				default:
					tAccountCr.cur_freebala =D4U5(tAccountCr.cur_freebala- tTradelog->op_fee,6);	//可用余额
					//更新卡余额
					if(USE_CARD_TYPE_ONLINE==revacc->iUseCardFlag)
					{
						getsysdate(tAccountCr.reserve_1);
						if(revacc->iTradeCnt>0)
							tAccountCr.consume_count=revacc->iTradeCnt;			//消费次数增加
						
						if(amtcmp(revacc->dInCardBala,0)>=0)
						{
							//有入卡值,没有出卡值,计算出卡值,卡余额
							revacc->dOutCardBala=D4U5(revacc->dInCardBala -tTradelog->op_fee,2);
							tAccountCr.card_balance=revacc->dOutCardBala;							//账户卡余额
						}
					}
					else if(USE_CARD_TYPE_NULL==revacc->iUseCardFlag)
					{										
						if((tAccountCr.consume_count<=revacc->iTradeCnt)||(strncmp(revacc->sTxDate,tAccountCr.reserve_1,8)>0))
						{
							strcpy(tAccountCr.reserve_1,revacc->sTxDate);
							tAccountCr.card_balance=D4U5(revacc->dInCardBala - tTradelog->op_fee,2);			//账户卡余额
						}
						revacc->dOutCardBala=D4U5(revacc->dInCardBala - tTradelog->op_fee,2);		
					}
					break;
			}
		}
		else
		{				
			tAccountCr.cur_bala =D4U5(tAccountCr.cur_bala-tTradelog->op_fee,6);						//当前总余额
			tAccountCr.cur_freebala=D4U5(tAccountCr.cur_freebala-tTradelog->op_fee,6) ;					//当前可用余额
		}
	}
	
	ret = DB_t_aif_account_update_lock_by_cur(&tAccountCr);
	if (ret)
	{
		writelog(LOG_ERR, "update account err[%d] account[%s]", ret,tAccountCr.account_id);
		if (DB_NOTFOUND == ret)
			return E_ACTNO_NOT_EXIST;
		else
			return E_DB_ACCOUNT_U;
	}
	DB_t_aif_account_free_lock_cur();

	des2src(tTradelogDb.operate_date,revacc->sTxDate);
	des2src(tTradelogDb.operate_time,revacc->sTxTime);
	des2src(tTradelogDb.collect_date,revacc->sTxDate);
	des2src(tTradelogDb.collect_time,revacc->sTxTime);
	des2src(tTradelogDb.enteract_date,revacc->sTxDate);
	des2src(tTradelogDb.enteract_time,revacc->sTxTime);
	des2src(tTradelogDb.check_oper,revacc->sChkOper);
	des2src(tTradelogDb.record_oper,revacc->sMdeOper);
	tTradelogDb.serino = revacc->iRevSeriNo;
	tTradelogDb.op_fee = -tTradelogDb.op_fee;
	tTradelogDb.maindevice_id = revacc->maindevice_id;
	tTradelogDb.device_id = 0;
	ret = DB_t_tif_tradelog_add(&tTradelogDb);
	if (ret)
	{
		writelog(LOG_ERR, "add ArrTradelog err[%d] seri_no[%d],seri_type[%d],fee_type[%d],act_id[%s]", ret,tTradelogDb.serino,tTradelogDb.seri_type,
			tTradelogDb.fee_type,tTradelogDb.act_id);
		return E_DB_TRADELOG_I;
	}

	memcpy(&tTradelogCr,&tTradelogDb,sizeof tTradelogCr);
	
	tTradelogCr.new_fee = tAccountCr.cur_bala;			//贷方帐户余额
	tTradelogCr.cur_frozebala=tAccountCr.cur_frozebala;		//冻结金额
	des2src(tTradelogCr.act_id,tTradelogDb.other_actid);
	des2src(tTradelogCr.subno,tTradelogDb.other_subno);
	des2src(tTradelogCr.other_actid,tTradelogDb.act_id);
	des2src(tTradelogCr.other_subno,tTradelogDb.subno);
	tTradelogCr.outorin = DBCR_CREDIT;
	ret = DB_t_tif_tradelog_add(&tTradelogCr);
	if (ret)
	{
		writelog(LOG_ERR, "add ArrTradelog err[%d] seri_no[%d],seri_type[%d],fee_type[%d],act_id[%s]", ret,tTradelogCr.serino,tTradelogCr.seri_type,
			tTradelogCr.fee_type,tTradelogCr.act_id);
		return E_DB_TRADELOG_I;
	}
	return 0;
}
int F847221(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	double 	tx_money = 0.0;
	char  ia_buf[1024]="";
	char sMsg[256]="";
	double	dUniNo = 0;
	T_t_tif_tradeserial serial;
	T_t_tif_tradeserial old_serial;
	T_t_group_cash_report group_cash;
	T_t_groups groups;
	InAcc IA;
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	int i;

	ResetNormalCPack(&aPack,0,1);

	if(strlen(rPack->scard0) <= 0)
	{
		*pRetCode = E_NOTEXIST_OPER;
		goto L_RETU;
	}
	ret = CheckOperatorPwd(rPack->scard0,rPack->semp_pwd);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}

	if(rPack->lvol1 <= 0)
	{
		*pRetCode = E_FAN_SERIAL_NOT_EXISTS;
		goto L_RETU;
	}

	// 更新被冲正流水的状态
	memset(&old_serial,0,sizeof old_serial);
	ret = DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(rPack->lvol1,&old_serial);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			*pRetCode = E_FAN_SERIAL_NOT_EXISTS;
		else
			*pRetCode = E_DB_TRADESERIAL_R;
		goto L_RETU;
	}

	if(SERISTAT_RUSH == old_serial.serial_state)
	{
		writelog(LOG_ERR,"流水已被冲正,流水号[%d]",old_serial.serial_no);
		*pRetCode = E_FAN_ALREADY_RUSHED;
		DB_t_tif_tradeserial_free_lock_cur();
		goto L_RETU;
	}

	old_serial.serial_state = SERISTAT_RUSH;
	ret = DB_t_tif_tradeserial_update_lock_by_cur(&old_serial);
	if(ret)
	{
		writelog(LOG_ERR,"更新流水[%d]状态失败",old_serial.serial_no);
		*pRetCode = E_DB_TRADESERIAL_U;
		goto L_RETU;
	}
	DB_t_tif_tradeserial_free_lock_cur();

	tx_money = old_serial.trade_fee;
	// 生成新的冲正流水
	ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniNo);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	// 查询组可解款余额
	memset(&group_cash,0,sizeof group_cash);
	ret = DB_t_group_cash_report_read_lock_by_c1_and_groupid(old_serial.showid,&group_cash);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			*pRetCode = E_FAN_ACC_NOT_EXISTS;
		else
			*pRetCode = E_DB_GRP_CASH_RPT_R;
		goto L_RETU;
	}
	
	/*
	if(amtcmp(tx_money,group_cash.cur_money)>0)
	{
		*pRetCode = E_FAN_ACC_INSUFFICIENT;
		DB_t_group_cash_report_free_lock_by_c1();
		goto L_RETU;
	}
	*/

	// 生成流水
	memset(&serial,0,sizeof serial);
	serial.serial_no = (int)dUniNo;
	serial.serial_state = SERISTAT_DEBT;
	serial.serial_type = TXCODE_FAN_RUSH_PAY;
	getsysdate(serial.operate_date);
	getsystime(serial.operate_time);
	des2src(serial.collect_date,serial.operate_date);
	des2src(serial.collect_time,serial.operate_time);
	GetLogicDate(serial.enteract_date);
	des2src(serial.enteract_time,serial.operate_time);

	des2src(serial.opercode,rPack->scard0);
	des2src(serial.reserve_1,rPack->scert_addr);
	serial.cardbefbal = tx_money;
	serial.trade_fee = tx_money * -1;
	// 商户号
	des2src(serial.showid,old_serial.showid);

	// 入账
	memset(&IA,0,sizeof IA);
	IA.dArrInAmt[0] = serial.trade_fee;
	IA.iCardNo = 0;
	//收费类别为 1
	IA.iFeeType = 1;
	IA.iTxFlag = ACC_TYPE_RUSH;
	IA.pVoidPointer = ia_buf;
	ret = process(&IA,&serial);
	if(ret)
	{
		writelog(LOG_ERR,"account process error [%d]",ret);
		*pRetCode  = ret;
		DB_t_group_cash_report_free_lock_by_c1();
		goto L_RETU;
	}
	SetCol(handle,0);
	SetCol(handle,F_VSMESS,F_LVOL1,F_DAMT1,F_DAMT2,F_SBANK_ACC,0);
	
	sprintf(out_pack->vsmess,"流水号:%d ",IA.iSerialNo);
	for(i=1;i<=IA.iOutTxTypeCnt;i++)
	{
		if(amtcmp(IA.dArrOutAmt[i],0)!=0)
		{
			sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
			strcat(out_pack->vsmess,sMsg);
		}
	}
	
	strcat(out_pack->vsmess,(char*)IA.pVoidPointer);
	writelog(LOG_DEBUG,out_pack->vsmess);

	des2src(group_cash.last_check_date,serial.operate_date);
	des2src(group_cash.last_check_time,serial.operate_time);
	group_cash.cur_money = group_cash.cur_money + tx_money;
	out_pack->lvol1 = serial.serial_no;
	out_pack->damt1 = serial.trade_fee;
	out_pack->damt2 = group_cash.cur_money;

	//更新组未解款金额
	ret = DB_t_group_cash_report_update_lock_by_c1(&group_cash);
	if(ret)
	{
		*pRetCode = E_DB_GRP_CASH_RPT_U;
		goto L_RETU;
	}
	// add
	DB_t_group_cash_report_free_lock_by_c1();
	ret = DB_t_groups_read_by_groupid(group_cash.groupid,&groups);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			*pRetCode = E_DB_GROUP_N;
		else
			*pRetCode = E_DB_GROUP_R;
		goto L_RETU;
	}
	des2src(out_pack->sbank_acc,groups.group_acc);
	//保存流水
	ret = DB_t_tif_tradeserial_add(&serial);
	if(ret)
	{
		if(DB_REPEAT == ret)
			return E_DB_TRADESERIAL_E;
		else
			return E_DB_TRADESERIAL_I;
		goto L_RETU;
	}
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
	
L_RETU:
	return -1;
}
Exemple #16
0
static int ConfirmTrans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
    CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;
    T_t_transdtl dtl;
    int ret;
    ST_CPACK aPack;
    ST_PACK *out_pack=&(aPack.pack);

    memset(&dtl,0,sizeof dtl);
    T_t_refno tRefno;
	memset(&tRefno,0,sizeof(tRefno));
	ret=DB_t_refno_read_by_refno(rPack->sphone3,&tRefno);
    writelog(LOG_DEBUG,"confirm refno[%s]",rPack->sphone3);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return 0;
		else
			return E_DB_REFNO_R;
	}
	if(RS_SUCC==tRefno.status)
	{
		TIPINFO("交易已确认");
		return 0;
	}
    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;
	}
    
    ret = DB_t_transdtl_read_lock_by_c0_and_accdate_and_termid_and_termseqno(
        tRefno.accdate,tRefno.termid,tRefno.termseqno,&dtl);
    if(ret)
    {
        if(DB_NOTFOUND == ret)
            return E_DB_TRANSDTL_N;
        return E_DB_TRANSDTL_R;
    }
    dtl.errcode = rPack->lvol0;
    des2src(dtl.remark,rPack->vsmess);
    des2src(dtl.voucherno,rPack->sphone2);
    writelog(LOG_ERR,"begin DB_t_transdtl_update_lock_by_c0");
    ret = DB_t_transdtl_update_lock_by_c0(&dtl);
    if(ret)
    {
        writelog(LOG_ERR,"更新流水表失败,ret[%d]",ret);
        return E_DB_TRANSDTL_U;
    }
    writelog(LOG_ERR,"end DB_t_transdtl_update_lock_by_c0");
    
    
    ResetNormalCPack(&aPack,0,1);
    SetCol(handle,0);
    SetCol(handle,F_LVOL0,F_LVOL5,F_DAMT0,F_DAMT1,F_DAMT2,F_SNAME2,F_SDATE1,0);
    out_pack->lvol0 = dtl.termseqno;
    out_pack->damt0 = dtl.cardaftbal;
    out_pack->damt1 = dtl.amount;
    out_pack->damt2 = dtl.cardbefbal;
    out_pack->lvol5 = D2I(dtl.cardaftbal * 100.0);
    des2src(out_pack->sname2,dtl.refno);
    des2src(out_pack->sdate1,dtl.accdate);
    PutRow(handle,out_pack,pRetCode,szMsg);
    return 0;
}
Exemple #17
0
int F930060(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg)
{
	int ret = 0;
	int cnt=0;
	int mesid=0;
     	T_t_tif_meslist tMesList;
	T_t_device tDevice;
	memset(&tDevice,0,sizeof tDevice);

	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_VSVARSTR0,0);
	memset(&tMesList,0,sizeof(tMesList));

	if(strlen(in_pack->sdate0)==0)
	{
		*pRetCode=E_DEVPHYID_NULL;
		goto L_RETU;
	}

	AddXmlItemInt(tMesList.incontent, XML_KEY_SUBSIDYONOFF, in_pack->lvol4);

	if((ret = get_devinfo_by_phyid(in_pack->sdate0,&tDevice)))
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	tMesList.devid = tDevice.deviceid;
	tMesList.funid = 930060;
	tMesList.level = 2;
	ret=AddMsgLst(&tMesList);
	if(ret)
	{
		*pRetCode=ret;
		writelog(LOG_ERR,"AddMsgLst err[%d]",ret);
		goto L_RETU;
	}
	if(iRequest!=tMesList.funid)
		return 0;	
	ret=db_commit();
	if(ret)
	{
		writelog(LOG_ERR,"db_commit ret[%d]",ret);
		*pRetCode=E_DB_COMMIT;
		goto  L_RETU;
	}
	mesid=tMesList.mesid;
	des2src(out_pack->sdate0,in_pack->sdate0);
	for(cnt=0;(cnt<10)&&(tMesList.ecode!=0);cnt++)
	{
		sleep(1);
		memset(&tMesList,0,sizeof(tMesList));
		ret=DB_t_tif_meslist_read_by_mesid(mesid, &tMesList);
		if(ret)
		{
			writelog(LOG_ERR,"DB_t_tif_meslist_read_by_mesid err[%d]",ret);
			*pRetCode=E_DB_MESLIST_R;
			goto L_RETU;
		}
	}
	switch(tMesList.ecode)
	{
		case 0:		//成功
			des2src(out_pack->vsvarstr0,"成功");
			ret=F930055( handle,iRequest, in_pack,pRetCode,szMsg);
			if(ret)
			{
				writelog(LOG_ERR,"设备签退成功,但F930055 更新签退状态失败");
				goto L_RETU;
			}
			break;
		case 9999:		//交易未处理
			des2src(out_pack->vsvarstr0,"前置机无应答");
			break;
		default:			//交易已经处理,但结果是失败
			des2src(out_pack->vsvarstr0,tMesList.emsg);				
			break;
	}	
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
L_RETU:
	return  -1;	
}
Exemple #18
0
static int TestTrans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	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);
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;
	trans.transcode=TC_CARDPAYMENT;
	des2src(trans.opercode,rPack->semp);
	trans.termid=rPack->lwithdraw_flag;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;	
	
	int paycode=rPack->lcert_code;

	trans.cardno=rPack->lvol0;
	if(trans.cardno<1)
	{
		return E_INPUTNULL_CARDNO;
	}
	trans.cardflag=1;
	trans.usecardflag=1;	
	trans.purseno=PURSE_NO_ONE;
	trans.paycnt=rPack->lvol6+1;
	des2src(trans.cardphyid,rPack->sstation1);

	trans.inputamt= D4U5(rPack->lvol1/100.0);	
	trans.unusedamt = trans.inputamt;
	trans.cardbefbal=rPack->lvol7/100.0;
	trans.cardaftbal=trans.cardbefbal - trans.inputamt;
	if(amtcmp(trans.inputamt,0)<=0)
	{
		ERRTIP("交易金额不能为0");
		return E_COMMON_ERR;
	}
	if(amtcmp(trans.inputamt,trans.cardbefbal)>0)
	{
		return ERRINFO(E_CARD_BALANCE_SHORTAGE,trans.cardbefbal);
	}	
	T_t_card  tCard;
	memset(&tCard,0,sizeof(tCard));

	T_t_account tAccount;
	memset(&tAccount,0,sizeof(tAccount));
	
	ret=pAccTrans->CheckAcc(&tCard,&tAccount);
	if(ret)
	{
		writelog(LOG_INFO,"检查状态失败");
		return ret;
	}
	if(amtcmp(trans.cardbefbal-tAccount.balance,MAXAMT_CARDGTACC)>0)
	{
		writelog(LOG_ERR,"卡余额[%.2lf]错误",trans.cardbefbal);
		return ERRIF_CARDBAL_EXCEPT;
	}
	if(strlen(rPack->stx_pwd))
	{
		ret=check_card_pwd_by_card(trans.cardno,rPack->stx_pwd);
		if(ret)
			return ret;
	}	
	if(tCard.custid>0)
	{
		ret=GetCustBaseInfoByCustID(trans.custid,trans.custname,trans.stuempno,NULL);
		if(ret)
			return ret;
	}
	CPaymentBase *payment;
	payment = CPaymentBase::find_payment(paycode);
	if(NULL == payment)
	{
		return E_TRANS_FUNC_NONSUPPORT;
	}
	ret = payment->init(handle,&aPack,rPack);
	if(ret)
	{
		writelog(LOG_ERR,"trade[%d],ret[%d]",paycode,ret);		
		return	ret;
	}
	int waterflag=0;
	double waterbefbal=0;
	double wateraftbal=0;
	if(paycode/1000==1)//水控
	{
		waterflag=1;
	}
	if(waterflag)
	{
		switch(rPack->lvol1)
		{
			case 500:
			case 1000:
			case 1500:
			case 2000:
				break;
			default:
			  ERRTIP("交易金额只能为5、10、15、20元");
			  return E_COMMON_ERR;
		}
		waterbefbal = rPack->lsafe_level/100.0;
		wateraftbal = D4U5(waterbefbal+trans.inputamt);
		double CardMaxBal=0;
		ret=GetPurseMaxBal(PURSE_NO_TWO,CardMaxBal);
		if(ret)
			return ret;
		if(amtcmp(wateraftbal,CardMaxBal)>0)
			return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
		if(1061==paycode)
		{
			int price1=0;
			int price2=0;
			int price3=0;
			ret=GetWaterPrice(price1,price2,price3);
			if(ret)
			{
				writelog(LOG_ERR,"读水价失败ret=%d",ret);
				return ret;
			}
			outPack->lvol10=price1;
			outPack->lvol11=price2;
			outPack->lvol12=price3;
		}
	}
	// 保持第三方账号
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));
	transdtl.exttype = paycode;
	if(waterflag)
	{
		sprintf(transdtl.extdata,"%.2lf",wateraftbal);	
	}
	else
	{
		des2src(transdtl.extdata,rPack->sbank_acc);
	}
	ret = pAccTrans->GenTransdtl(&transdtl,DTLSTATUS_INIT);
	if(ret)
	{
		writelog(LOG_ERR,"GenTransdtl ret=%d",ret);
		return ret;
	}
	ret=db_commit();
	if(ret)
	{
		return ret;
	}	
	trans.cardaftbal=trans.cardbefbal;
	ret=pAccTrans->doTrans();
	if(ret)
	{
		writelog(LOG_ERR,"doTrans err=%d",ret);
		return ret;
	}
	ret=pAccTrans->doTransEnd();
	if(ret)
	{
		writelog(LOG_ERR,"doTransEnd err=%d",ret);
		return ret;
	}
	if(amtcmp(trans.cardaftbal,transdtl.cardaftbal)!=0)
	{
		ERRTIP("卡余额计算有误");
		return E_COMMON_ERR;
	}
	ret=db_rollback();
	if(ret)
	{
		writelog(LOG_ERR,"db_rollback err");
		return ret;
	}
	// 输出参数
	outPack->lvol0=tCard.cardno;
	outPack->lvol1=D4U5(trans.inputamt*100,0);
	outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);
	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,trans.cardpwd);	//mac
    sprintf(trans.remark,"%s卡余额%.2lf元",pAccTrans->remark.c_str(),pAccTrans->trans.cardaftbal);
    des2src(outPack->vsmess,trans.remark);
 	if(payment->payment_.onlinepay>0&&payment->payment_.paychkflag>0)
  	{
		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->qry_acc(handle,rPack,outPack);
	  	if(ret)
		  	return ret;
	  	if(payment->pushflag_ != 1)
		  	PutRow(handle,outPack,pRetCode,szMsg);
  	}
	else
	{
		PutRow(handle,outPack,pRetCode,szMsg);			
	}
	return 0;
}
int F930032(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) {
    int ret = 0;						//返回码
    int hi_sign = 0;					//挂失解挂标志
    double h_temp_Serial_no = 0;		//本地流水号
    char logicdate[11]="";
    char sysdate[11]="";
    char systime[9]="";
    int dev_id=0;
    T_t_tif_tradeserial  tradeserial;

    memset(&tradeserial,0,sizeof(tradeserial));
    hi_sign = in_pack->lvol6;												//挂失解挂标志

    ret=chk_dyn_key(in_pack->lcert_code,in_pack->scust_limit2);
    if(ret) {
        *pRetCode = ret;
        goto L_RETU;
    }
    getsysdate(sysdate);
    getsystime(systime);
    ret=GetLogicDate(logicdate);												//业务日期
    if(ret) {
        *pRetCode = ret;
        goto L_RETU;
    }
    switch (hi_sign) {
    case 0:
        tradeserial.serial_type = TXCODE_CARD_LOSS;					//挂失
        break;
    case 1:
        tradeserial.serial_type = TXCODE_CARD_COMEBACK_LOSS;			//解挂
        break;
    case 2:
        tradeserial.serial_type = TXCODE_MODIFICATIONPW;				//修改密码
        break;
    default:
        *pRetCode = -1;
        writelog(LOG_ERR,"挂失解挂修改密码标志出错。ERRCODE[%d] ",*pRetCode);
        goto L_RETU;
        break;
    }
    /*	读取设备ID	*/
    ret = GetDevIdByDevPhyId(&dev_id,in_pack->sdate1);
    if (ret) {
        *pRetCode = ret;
        writelog(LOG_ERR,"GetDevIdByDevPhyId err[%d] ",ret);
        goto L_RETU;
    }

    tradeserial.serial_state = SERISTAT_NODEBT;								//流水状态

    ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&h_temp_Serial_no);
    if(ret) {
        *pRetCode = ret;
        writelog(LOG_ERR,"获取最大流水号错误: ERRCODE = [%d]",ret);
        goto L_RETU;
    }
    tradeserial.serial_no = D2I(h_temp_Serial_no);													//流水号

    snprintf(tradeserial.operate_date,9,"20%s",in_pack->spost_code);		//发生日期(格式化输入的日期)
    des2src(tradeserial.operate_time,in_pack->spost_code2);			//发生时间(格式化输入的时间)
    des2src(tradeserial.collect_date,sysdate);												//采集日期
    des2src(tradeserial.collect_time,systime);												//采集时间
    des2src(tradeserial.enteract_date,logicdate);											//处理日期
    des2src(tradeserial.enteract_time,systime);											//处理时间
    tradeserial.other_seri_no = in_pack->lvol4;													//上传端流水号
    tradeserial.serial_state = SERISTAT_DEBT;													//流水状态
    tradeserial.maindeviceid = in_pack->lcert_code;												//上传工作站标识
    tradeserial.deviceid = dev_id;														//采集设备标识
    tradeserial.cardno = in_pack->lvol5;														//卡号
    Strncpy_t(tradeserial.showid,in_pack->sstation0,sizeof(tradeserial.showid));						//显示卡号
    Strncpy_t(tradeserial.oldpwd,in_pack->sstock_code,sizeof(tradeserial.oldpwd));					//原始密码
    Strncpy_t(tradeserial.newpwd,in_pack->sstock_code2,sizeof(tradeserial.newpwd));				//更新密码
    des2src(tradeserial.opercode,"system");

    ret = DB_t_tif_tradeserial_add(&tradeserial);
    if (ret) {
        writelog(LOG_ERR,"ret[%d]",ret);
        if(DB_REPEAT==ret)
            *pRetCode = E_DB_TRADESERIAL_E;
        else
            *pRetCode = E_DB_TRADESERIAL_I;
        goto L_RETU;
    }
    return 0;
L_RETU:
    return -1;
}
Exemple #20
0
int F847222(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	char  ia_buf[1024]="";
	char sMsg[256]="";
	double dUniNo;
	InAcc IA;
	T_t_tif_tradeserial serial;
	T_t_aif_account account;
	T_t_cif_shop shop;
	trade_param_t param;
	int shop_id;
	
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	int i;

	ResetNormalCPack(&aPack,0,1);

	shop_id = atoi(rPack->sbank_acc);
	if(shop_id <= 0)
	{
		*pRetCode = E_SHOP_ACTNO_NOT_EXIST;
		goto L_RETU;
	}
	if(strlen(rPack->scard0) <= 0)
	{
		*pRetCode = E_OPER_NOT_EXIST;
		goto L_RETU;
	}
	if(amtcmp(rPack->damt1,0)<=0)
	{
		*pRetCode = E_INPUT_AMT;
		goto L_RETU;
	}
	ret = CheckOperatorPwd(rPack->scard0,rPack->semp_pwd);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}

	memset(&account,0,sizeof account);
	memset(&shop,0,sizeof shop);
	
	ret = DB_t_cif_shop_read_by_shop_id(shop_id,&shop);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			*pRetCode  = E_SHOP_ACTNO_NOT_EXIST;
		else
			*pRetCode = E_DB_SHOP_R;
		goto L_RETU;
	}
	if(strcmp(shop.is_indep, TYPE_YES))
	{
		*pRetCode = E_FAN_SHOP_NOT_INDEP;
		goto L_RETU;
	}
	memset(&IA,0,sizeof IA);
	memset(&param,0,sizeof param);
	param.pIA = &IA;
	IA.pVoidPointer = ia_buf;
	param.shop_id = shop.shop_id;
	param.remain_balance = rPack->damt1;
	
	ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniNo);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	param.serial_no = D2I(dUniNo);

	//初始化流水记录
	memset(&serial,0,sizeof serial);
	serial.serial_no = param.serial_no;
	serial.serial_state = SERISTAT_DEBT;
	serial.serial_type = TXCODE_FAN_BALANCE;
	// 借用显示卡号字段保存商户号
	sprintf(serial.showid,"%d",param.shop_id);
	getsysdate(serial.operate_date);
	getsystime(serial.operate_time);
	des2src(serial.collect_date,serial.operate_date);
	des2src(serial.collect_time,serial.operate_time);
	// 客户号
	serial.customer_id = shop.cut_id;
	GetLogicDate(serial.enteract_date);
	des2src(serial.enteract_time,serial.operate_time);

	des2src(serial.oper_code,rPack->scard0);
	des2src(serial.reserve_1,rPack->scert_addr);
	serial.in_balance = param.remain_balance;
	serial.trade_fee = param.remain_balance;

	des2src(param.tx_date,serial.operate_date);
	des2src(param.tx_time,serial.operate_time);
	des2src(param.oper_code,rPack->scard0);
	
	ret = do_parse_shop(&param);
	if(ret)
	{
		writelog(LOG_ERR,"商户解款失败shop[%d] ret [%d]",param.shop_id,ret);
		*pRetCode = ret;
		goto L_RETU;
	}
	
	SetCol(handle,0);
	SetCol(handle,F_VSMESS,F_LVOL1,F_DAMT1,0);
	
		
	for(i=1;i<=IA.iOutTxTypeCnt;i++)
	{
		if(amtcmp(IA.dArrOutAmt[i],0)!=0)
		{
			//sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
			//strcat(out_pack->vsmess,sMsg);
			writelog(LOG_INFO,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
		}
	}
	out_pack->lvol1 = IA.iSerialNo;
	out_pack->damt1 = param.free_balance;
	sprintf(out_pack->vsmess,"流水号:%d 解款金额[%.2lf]元,余额[%.2lf]元"
		,IA.iSerialNo,rPack->damt1,out_pack->damt1);
	//strcat(out_pack->vsmess,IA.pVoidPointer);
	writelog(LOG_DEBUG,out_pack->vsmess);
	
	//保存流水
	ret = DB_t_tif_tradeserial_add(&serial);
	if(ret)
	{
		if(DB_REPEAT == ret)
			return E_DB_TRADESERIAL_E;
		else
			return E_DB_TRADESERIAL_I;
		goto L_RETU;
	}
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
	
L_RETU:
	return -1;
}
Exemple #21
0
static int DoCardInstead(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
		int ret=0;
	    char  sqlcmd[2048]="";
		CAccTrans *pAccTrans=CAccTrans::getInstance();
		TRANS& trans=pAccTrans->trans;
		int nOldCardno=trans.cardno;
		ST_CPACK aPack;
		ST_PACK *outPack = &(aPack.pack); 
		
		ResetNormalCPack(&aPack,0,1);

			
		SetCol(handle,0);
		
		SetCol(handle,F_LVOL1,F_LSAFE_LEVEL2,F_LVOL4,F_LVOL5,
					F_SALL_NAME,F_SPAGER,F_SCERT_NO,F_LSAFE_LEVEL,F_SMARKET_CODE2,F_SHOLDER_AC_NO,
					F_SEMAIL2,F_SMARKET_CODE,F_SDATE0,
					F_LVOL0,F_STX_PWD,F_LVOL8,F_LVOL6,
					F_SORDER0,F_SEMP,F_SDATE3,F_STIME3,F_LVOL11,F_LVOL12,
					F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_SNAME2,0);	

		T_t_card  tCard;
		memset(&tCard,0,sizeof(tCard));
		ret=DB_t_card_read_lock_by_cur_and_cardno(trans.cardno,&tCard);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno);
			else 
				return E_DB_CARD_R;
		}
		if(tCard.status[0]!=STATUS_NORMAL)
		{
			DB_t_card_free_lock_by_cur();
			return ERRINFO(E_CARD_LOGOUT,trans.cardno);
		}	
		if('1'==tCard.frozeflag[0])
		{
			DB_t_card_free_lock_by_cur();
			return ERRINFO(E_CARD_FREEZE,trans.cardno);
		}
		if('1'==tCard.lossflag[0])
		{
			DB_t_card_free_lock_by_cur();		
			return ERRINFO(E_CARD_LOST,trans.cardno);
		}	
		if('1'==tCard.badflag[0])
		{
			DB_t_card_free_lock_by_cur();		
			return ERRINFO(E_CARD_BADRECORD,trans.cardno);
		}	
		tCard.status[0]=STATUS_DELETE;
		des2src(tCard.closedate,trans.transdate);
		ret=DB_t_card_update_lock_by_cur(&tCard);
		if(ret)
		{
			return E_DB_CARD_U;
		}
		memset(tCard.closedate,0,sizeof(tCard.closedate));
		tCard.status[0]=STATUS_NORMAL;
		T_t_account tCardAccount;	
		memset(&tCardAccount,0,sizeof(tCardAccount));
		ret=DB_t_account_read_by_accno(tCard.accno,&tCardAccount);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CARDACCNO,tCard.accno);
			else 
				return E_DB_ACCOUNT_R;
		}
		int existflag=0;
		ret=IsExistUnGetSubsidy(tCard.cardno,&existflag);
		if(ret)
		{
			return ret;
		}
		if(existflag)
		{
			ERRTIP("有未领补助,请领取补助后再换卡");
			return E_COMMON_ERR;
		}
		T_t_customer  customer;
		memset(&customer,0,sizeof(customer));
		if(tCard.custid)
		{
			ret=DB_t_customer_read_by_custid(tCard.custid,&customer);
			if(ret)
			{
				if(DB_NOTFOUND==ret)
					return ERRINFO(E_NOTEXIST_CUSTOMER,tCard.custid);
				else
					return E_DB_CUSTOMER_R;
			}
			des2src(trans.stuempno,customer.stuempno);
			des2src(trans.custname,customer.custname);
			trans.custid=customer.custid;
		}
		char cardpwd[33]="";
		char key[17]="";
		strcpy(key,STATIC_SEED_KEY);
		EncodePwd(key,cardpwd,tCard.cardpwd, 1);
		T_t_cardinsteaddtl cardinsteaddtl;
		memset(&cardinsteaddtl,0,sizeof(cardinsteaddtl));
		ret=DB_t_cardinsteaddtl_read_lock_by_c0_and_cardno(trans.cardno,&cardinsteaddtl);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return E_DB_CARDINSTEADDTL_N;
			else
				return E_DB_CARDINSTEADDTL_R;
		}
		//核对登记信息与卡表是否一致
		if(strcmp(cardinsteaddtl.oldcardphyid,tCard.cardphyid)!=0)
		{
			DB_t_cardinsteaddtl_free_lock_by_c0();
			strcpy(szMsg,"保存的卡信息与原卡物理ID不一致");
			return E_CARD_PHYNO_DIFFER;
		}
		//核对原物理ID是否一致
		if(strcmp(cardinsteaddtl.oldcardphyid,rPack->scust_no)!=0)
		{
			DB_t_cardinsteaddtl_free_lock_by_c0();
			return E_CARD_PHYNO_DIFFER;
		}
		if(cardinsteaddtl.revflag[0]=='1')
		{
			DB_t_cardinsteaddtl_free_lock_by_c0();
			return E_CARDINSTEAD_CANCEL;
		}
		if(cardinsteaddtl.status[0]=='2')
		{
			DB_t_cardinsteaddtl_free_lock_by_c0();
			if(strcmp(cardinsteaddtl.cardphyid,trans.cardphyid)!=0)
			{
				return ERRINFO(E_CARD_PHYNO_DIFFER,trans.cardphyid,cardinsteaddtl.cardphyid);
			}			
			outPack->lvol1=tCard.custid;
			outPack->lsafe_level2=customer.custtype;
			outPack->lvol5=tCard.feetype;
			des2src(outPack->sall_name,customer.custname);
			des2src(outPack->spager,customer.stuempno);
			des2src(outPack->scert_no,customer.deptcode);
			des2src(outPack->semail2,customer.idno);
			des2src(outPack->smarket_code,customer.sex);
			des2src(outPack->sdate0,tCard.expiredate);
			sprintf(outPack->sholder_ac_no,"%d",10);				//发行方标识
			des2src(outPack->smarket_code2,customer.idtype);
			outPack->lsafe_level=tCard.cardtype;
			des2src(outPack->sname2,tCard.cardverno);
			outPack->lvol0=tCard.cardno;
			outPack->lvol8=(int)(cardinsteaddtl.oldcardbal*100);
			outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0);
			outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0);
			outPack->lvol6=cardinsteaddtl.oldcardcnt;
			outPack->lvol4=cardinsteaddtl.oldsubsidyno;
			des2src(outPack->sorder0,tCard.showcardno);
			des2src(outPack->sdate3,pAccTrans->trans.accdate);
			des2src(outPack->semp,trans.opercode);
			des2src(outPack->stx_pwd,cardpwd);			
			outPack->lwithdraw_flag=trans.termid;
			outPack->lserial1=trans.termseqno;
			PutRow(handle,outPack,pRetCode,szMsg);		
			return 0;
		}
		cardinsteaddtl.status[0]=STATUS_DELETE;
		des2src(cardinsteaddtl.cardphyid,trans.cardphyid);
		des2src(cardinsteaddtl.showcardno,trans.showcardno);
		ret=DB_t_cardinsteaddtl_update_lock_by_c0(&cardinsteaddtl);
		if(ret)
		{
			return E_DB_CARDINSTEADDTL_U;
		}
		T_t_newcardchange newcardchange;
		memset(&newcardchange,0,sizeof(newcardchange));

		ret=DB_t_newcardchange_read_lock_by_c1_and_showcardno(cardinsteaddtl.showcardno,&newcardchange);
		if(ret)
		{
			writelog(LOG_ERR,"showcardno[%s]",trans.showcardno);
			if(DB_NOTFOUND==ret)
				return E_DB_NEWCARDCHANGE_N;
			else
				return E_DB_NEWCARDCHANGE_R;
		}
		newcardchange.status= NEWCARDSTATUS_SUCCESS;
		des2src(newcardchange.oldcardphyid,cardinsteaddtl.oldcardphyid);
		des2src(newcardchange.cardphyid,cardinsteaddtl.cardphyid);
		des2src(newcardchange.lastsaved,CAccTrans::getInstance()->trans.sysdatetime);
		ret=DB_t_newcardchange_update_lock_by_c1(&newcardchange);
		if(ret)
		{
				return E_DB_NEWCARDCHANGE_U;
		}
		//检查新卡物理id
		T_t_card cardtmp;
		memset(&cardtmp,0,sizeof(cardtmp));
		ret=DB_t_card_read_by_cardphyid_and_status(trans.cardphyid,"1",&cardtmp);
		if(ret!=DB_NOTFOUND)
		{
			if(DB_SUCCESS==ret)
				return ERRINFO(E_EXIST_CARDPHYID,trans.cardphyid);
			else
				return E_DB_CARD_R;
		}
		ret = getNewUniqNo(KEYTYPE_CARDNO,&tCard.cardno);	//获取最大卡号
		if(ret)
		{
			return ret;
		}
				
		T_t_cardver cardver;
		
		memset(&cardver,0,sizeof(cardver));
		cardver.cardno=tCard.cardno;
		des2src(cardver.accdate,pAccTrans->trans.accdate);
		cardver.termid=trans.termid;
		cardver.termseqno=trans.termseqno;
		cardver.status[0]=STATUS_NORMAL;	
		des2src(cardver.cardphyid,cardinsteaddtl.oldcardphyid);
		des2src(cardver.stuempno,trans.stuempno);
		cardver.cardvertype=CARDVERTYPE_CARDINSTEADNEW;
		ret=getCardVerNo(cardver.cardverno);
		if(ret)
			return ret;
		ret=DB_t_cardver_add(&cardver);
		if(ret)
		{
			if(DB_REPEAT==ret)
				return E_DB_CARDVER_E;
			else
				return E_DB_CARDVER_I;
		}
		//使用卡片
		des2src(tCard.cardphyid,trans.cardphyid);
		des2src(tCard.showcardno,trans.showcardno);
		des2src(tCard.lastsaved,trans.sysdatetime);
		des2src(tCard.cardverno,cardver.cardverno);
		tCard.status[0]=STATUS_NORMAL;
		ret=DB_t_card_add(&tCard);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return E_NOTEXIST_CARDNO;
			else 
				return E_DB_CARD_U;
		}
		T_t_cardbalance  cardbalance;
		ret=DB_t_cardbalance_open_select_for_update_by_c2_and_accno(tCard.accno);
		if(ret)
		{
			return E_DB_CARDBALANCE_R;
		}
		while(1)
		{
			memset(&cardbalance,0,sizeof(cardbalance));
			ret=DB_t_cardbalance_fetch_select_by_c2(&cardbalance);
			if(ret)
			{
				if(DB_NOTFOUND==ret)
					break;
				else
					return E_DB_CARDBALANCE_R;
			}
			cardbalance.oldcardno=cardbalance.cardno;
			cardbalance.cardno=tCard.cardno;
			ret= DB_t_cardbalance_update_select_by_c2(&cardbalance);
			if(ret)
			{
				DB_t_cardbalance_close_select_by_c2();
				return E_DB_CARDBALANCE_U;
			}
		}
		tCardAccount.cardno=tCard.cardno;
		tCardAccount.dpscnt=0;
		tCardAccount.paycnt=0;
		strcpy(tCardAccount.transtime,trans.sysdatetime);
		ret=DB_t_account_update_by_accno(tCard.accno,&tCardAccount);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return E_DB_ACCOUNT_N;
			else
				return E_DB_ACCOUNT_R;
		}
		//插入卡位图表
		T_t_cardbitmap tCardBitmap;
		
		memset(&tCardBitmap,0,sizeof(tCardBitmap));
		tCardBitmap.cardno=tCard.cardno;
		tCardBitmap.baseno=0;
		memset(tCardBitmap.bitmap0,'0',sizeof(tCardBitmap.bitmap0)-1);
		memset(tCardBitmap.bitmap1,'0',sizeof(tCardBitmap.bitmap1)-1);
		memset(tCardBitmap.bitmap2,'0',sizeof(tCardBitmap.bitmap2)-1);
		memset(tCardBitmap.bitmap3,'0',sizeof(tCardBitmap.bitmap3)-1);
		memset(tCardBitmap.bitmap4,'0',sizeof(tCardBitmap.bitmap4)-1);
		memset(tCardBitmap.bitmap5,'0',sizeof(tCardBitmap.bitmap5)-1);
		memset(tCardBitmap.bitmap6,'0',sizeof(tCardBitmap.bitmap6)-1);
		memset(tCardBitmap.bitmap7,'0',sizeof(tCardBitmap.bitmap7)-1);
		memset(tCardBitmap.bitmap8,'0',sizeof(tCardBitmap.bitmap8)-1);
		memset(tCardBitmap.bitmap9,'0',sizeof(tCardBitmap.bitmap9)-1);
		ret=DB_t_cardbitmap_add(&tCardBitmap);
		if (ret)
		{
			if (DB_REPEAT==ret)
				return E_DB_CARDBITMAP_E;
			else
				return E_DB_CARDBITMAP_I;
		}
		T_t_transdtl transdtl;
		memset(&transdtl,0,sizeof(transdtl));
		
		des2src(transdtl.transdate,trans.transdate);
		des2src(transdtl.transtime,trans.transtime);
		strcpy(transdtl.accdate,trans.accdate);
		strcpy(transdtl.acctime,trans.acctime);
		transdtl.termid=trans.termid;
		transdtl.termseqno=trans.termseqno;
		transdtl.transcode=trans.transcode;
		transdtl.paytype=trans.fundtype;
		des2src(transdtl.voucherno,trans.voucherno);
		transdtl.cardno=trans.cardno;
		transdtl.exttype=EXTTYPE_NEWCARD;
		sprintf(transdtl.extdata,"%d",tCard.cardno);
		transdtl.purseno=trans.purseno;
		transdtl.cardcnt=cardinsteaddtl.oldcardcnt;
		transdtl.cardbefbal=cardinsteaddtl.oldcardbal;
		transdtl.cardaftbal=cardinsteaddtl.oldcardbal; 	

		transdtl.managefee=trans.totalfeeamt;
		transdtl.amount=trans.totaltransamt;
		transdtl.custid=tCard.custid;
		des2src(transdtl.custname,customer.custname);
		des2src(transdtl.stuempno,customer.stuempno);
		des2src(transdtl.opercode,trans.opercode);
		transdtl.status[0]=DTLSTATUS_SUCCESS;
		des2src(transdtl.showcardno,tCard.showcardno);		
		ret=DB_t_transdtl_add(&transdtl);
		if(ret)
		{
			if(DB_REPEAT==ret)
				return E_DB_TRANSDTL_E;
			else
				return E_DB_TRANSDTL_I;
		} 			
		outPack->lvol1=tCard.custid;
		outPack->lsafe_level2=customer.custtype;
		outPack->lvol5=tCard.feetype;
		des2src(outPack->sall_name,customer.custname);
		des2src(outPack->spager,customer.stuempno);
		des2src(outPack->scert_no,customer.deptcode);
		des2src(outPack->semail2,customer.idno);
		des2src(outPack->smarket_code,customer.sex);
		des2src(outPack->sdate0,tCard.expiredate);
		sprintf(outPack->sholder_ac_no,"%d",10);				//发行方标识
		des2src(outPack->smarket_code2,customer.idtype);
		outPack->lsafe_level=tCard.cardtype;
		outPack->lvol0=tCard.cardno;
		outPack->lvol4=cardinsteaddtl.oldsubsidyno;
		outPack->lvol8=(int)(cardinsteaddtl.oldcardbal*100);
		outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0);
		outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0);
		outPack->lvol6=cardinsteaddtl.oldcardcnt;
		des2src(outPack->sorder0,tCard.showcardno);
		des2src(outPack->stx_pwd,cardpwd);			
		des2src(outPack->sdate3,pAccTrans->trans.accdate);
		des2src(outPack->stime3,pAccTrans->trans.acctime);
		des2src(outPack->semp,trans.opercode);
		outPack->lwithdraw_flag=trans.termid;
		outPack->lserial1=trans.termseqno;
		PutRow(handle,outPack,pRetCode,szMsg); 		
		return 0;
}
Exemple #22
0
static int do_process_trade(trade_param_t * param)
{
	int ret;
	T_t_cif_shop shop;
	T_t_aif_account account;
	void * pTmp;
	InAcc * IA; 
	
	memset(&shop,0,sizeof shop);
	ret = DB_t_cif_shop_read_by_shop_id(param->out_shop_id,&shop);
	//writelog(LOG_DEBUG,"trade shop id[%d]",param->out_shop_id);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			return E_DB_SHOP_N;
		else
			return E_DB_SHOP_R;
	}

	memset(&account,0,sizeof account);
	ret = DB_t_aif_account_read_by_customer_id_and_act_type(
		shop.cut_id,ACCTYPE_SHOPMAIN,&account);
	if(ret)
	{
		writelog(LOG_ERR,"shop id[%d] custid[%d]",shop.shop_id,shop.cut_id);
		if(DB_NOTFOUND == ret)
			return E_FAN_ACC_NOT_EXISTS;
		return E_DB_ACCOUNT_R;
	}
	//writelog(LOG_DEBUG,"对叶子商户[%d]进行解款[%.2lf]金额[%.2lf]",
	//	param->out_shop_id,account.last_bala,param->remain_balance);
	if(amtcmp(account.last_bala,0) <= 0)
	{
		// 商户无余额不处理
		return 0;
	}
	// 检查是否已经解款完成
	if(amtcmp(param->remain_balance,0) == 0)
	{
		//只计算商户余额
		param->free_balance += account.last_bala;
		return 0;
	}
	// 计算交易金额
	if(amtcmp(param->remain_balance,account.last_bala) >= 0)
	{
		param->trade_fee = account.last_bala;
	}
	else
	{
		param->trade_fee = param->remain_balance;
	}
	// 入账
	IA = param->pIA;
	//pTmp =  IA->pVoidPointer;
	memset(IA,0,sizeof(InAcc));
	des2src(IA->sArrInActno[1],account.account_id);
	IA->pVoidPointer = pTmp;
	ret = process(IA,param);
	if(ret)
	{
		writelog(LOG_ERR,"process account failed,ret [%d]shopid[%d]subindex[%d]",
			ret,param->out_shop_id,param->index);
		return ret;
	}
	// 更新账户余额
	// 入账之后账户余额已经被更新,需要重新读取
	memset(&account,0,sizeof account);
	ret = DB_t_aif_account_read_by_customer_id_and_act_type(
		shop.cut_id,ACCTYPE_SHOPMAIN,&account);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
			return E_FAN_ACC_NOT_EXISTS;
		return E_DB_ACCOUNT_R;
	}
	account.last_bala -= param->trade_fee;
	account.last_freebala -= param->trade_fee;
	if(amtcmp(account.last_bala,0)< 0)
	{
		account.last_bala = 0.0;
		account.last_freebala = 0.0;
	}
	else
	{
		param->free_balance += account.last_bala;
	}
	ret = DB_t_aif_account_update_by_account_id(account.account_id,&account);
	if(ret)
	{
		writelog(LOG_ERR,"更新商户账户余额失败ret[%d]",ret);
		if(DB_NOTFOUND == ret)
			return E_DB_ACCOUNT_N;
		return E_DB_ACCOUNT_R;
	}
	writelog(LOG_DEBUG,"商户[%d]解款金额[%.2lf]余额[%.2lf]"
		,shop.shop_id,param->trade_fee,account.last_bala);
	return ret;
}
Exemple #23
0
int F846327(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	ret=pAccTrans->CheckCfgUpdate();
	if(ret)
		return ret;
	pAccTrans->trans.termid=rPack->lcert_code;
	//des2src(pAccTrans->trans.opercode,rPack->semp);
	TRANS& trans=pAccTrans->trans;
	switch(rPack->sstatus0[0])
	{
		case 'S'://保存卡信息
			trans.transcode=TC_CARDSAVEINFO;
			ret=pAccTrans->InitTrans();
			if(ret)
				return ret; 		
			trans.cardflag=1;
			trans.usecardflag=1;	
			trans.cardno=rPack->lvol0;	
			trans.cardsubsidyno=rPack->lvol4;
			pAccTrans->SetCardCntAndCardBal(rPack->lvol5,rPack->lvol6,rPack->lvol7);
			des2src(trans.cardphyid,rPack->scust_no);			
			des2src(trans.showcardno,rPack->sorder0);
			ret=SaveOldCardInfo(handle,rPack,pRetCode,szMsg);
			break;
		case 'C':
			trans.transcode=TC_CARDINSTEAD;
			ret=pAccTrans->InitTrans();
			if(ret)
				return ret; 
			trans.cardflag=1;
			trans.usecardflag=1;	
			trans.cardno=rPack->lvol0;	
			trans.cardsubsidyno=rPack->lvol4;
			pAccTrans->SetCardCntAndCardBal(rPack->lvol5,rPack->lvol6,rPack->lvol7);
			des2src(trans.cardphyid,rPack->scust_no2);
			des2src(trans.showcardno,rPack->sorder0);
			ret=DoCardInstead(handle,rPack,pRetCode,szMsg);
			break;
		case 'D'://换卡撤销
			trans.transcode=TC_CARDINSTEADREV;
			ret=pAccTrans->InitTrans();
			if(ret)
				return ret; 		
			trans.cardflag=1;
			trans.usecardflag=1;	
			trans.cardno=rPack->lvol0;	
			trans.cardsubsidyno=rPack->lvol4;
			pAccTrans->SetCardCntAndCardBal(rPack->lvol5,rPack->lvol6,rPack->lvol7);
			des2src(trans.cardphyid,rPack->scust_no2);			
			des2src(trans.showcardno,rPack->sorder0);
			ret=DoCardInsteadCancel(handle,rPack,pRetCode,szMsg);	
			break;
		default:
			return -1;
	}
	if(ret)
		return ret;
	return 0;
}
Exemple #24
0
int F930037(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int    ret=0;
	int    row=0;
	int dev_id=0;
	char devphy999_id[9]="";
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	T_t_pif_device 	p;
	T_t_pif_device		parent;

#ifdef DEBUG
	writelog(LOG_DEBUG,"subsystem_id[%d]",rPack->lcert_code);
	writelog(LOG_DEBUG,"dyn_key[%s]",rPack->scust_limit2);
#endif

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_SDATE2,F_SDATE1,F_LVOL4,F_SEMP,F_SDATE3,F_SHOLDER_TYPE,F_SNOTE2,F_LVOL1,F_LVOL5,F_STIME0,F_LVOL6,F_LVOL7,F_LVOL8,F_SSTATION0,F_SBANK_CODE,F_LVOL9,F_LVOL10,F_SSERIAL0,F_SSERIAL1,F_LVOL11,F_SCUST_AUTH,F_LVOL12,F_SCUST_AUTH2,F_LVOL0,0);

	writelog(LOG_DEBUG,"前置机%d下载设备档案",rPack->lcert_code);

	ret=chk_dyn_key(rPack->lcert_code,rPack->scust_limit2);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	strncpy(devphy999_id,rPack->sdate1,sizeof(devphy999_id)-1);
	trim(devphy999_id);
	if(strlen(devphy999_id)&&strncmp(devphy999_id,"00000000",8)!=0)
	{
		memset(&p,0,sizeof(p));
		ret = GetDevIdByDevPhyId(&dev_id,devphy999_id);
		if(ret)
		{
			*pRetCode=ret;
			goto L_RETU;
		}
		ret=DB_t_pif_device_read_by_devphy999_id(devphy999_id, &p);
		if(ret)
		{
			writelog(LOG_ERR,"devphy999_id[%s]",devphy999_id);
			if(DB_NOTFOUND==ret)
				*pRetCode=E_DB_DEVICE_N;
			else
				*pRetCode=E_DB_DEVICE_R;
			goto L_RETU;
		}
		if(p.state_id==DEVISTAT_LOGOUT)
		{
			*pRetCode=E_DB_DEVICE_N;
			goto L_RETU;
		}
		p.state_id=DEVISTAT_REGIST;
		if((strncmp(p.dev999_id,"FFFFFFFF",8)==0)||(strlen(p.dev999_id)==0))
		{
			*pRetCode=E_DB_DEVICE_N;
			goto L_RETU;
		}
		if(ROOT_DEVICE_ID == p.fdev_id)
			memset(out_pack->stime0,0,sizeof(out_pack->stime0));
		else
		{
			out_pack->lvol0 = p.device_id;
			memset(&parent,0,sizeof parent);
			ret = DB_t_pif_device_read_by_device_id(p.fdev_id,&parent);
			if(ret)
			{
				des2src(out_pack->stime0,"FFFFFFFF");
			}
			else
			{
				des2src(out_pack->stime0,parent.devphy999_id);
			}
		}
		strncpy(out_pack->sdate2,p.dev999_id,sizeof(out_pack->sdate2)-1);
		strncpy(out_pack->sdate1,p.devphy999_id,sizeof(out_pack->sdate1)-1);
		out_pack->lvol4=p.dev999_no;
		strncpy(out_pack->semp,p.devtype,sizeof(out_pack->semp)-1);
		strncpy(out_pack->sdate3,p.devversion,sizeof(out_pack->sdate3)-1);
		strncpy(out_pack->sholder_type,p.cardstr,sizeof(out_pack->sholder_type)-1);
		strncpy(out_pack->snote2,p.cardtype,sizeof(out_pack->snote2)-1);
		out_pack->lvol5=p.portcount;

		out_pack->lvol6=p.portno;
		out_pack->lvol7=p.state_id;
		out_pack->lvol8=p.joinmode;
		strncpy(out_pack->sstation0,p.comadd,sizeof(out_pack->sstation0)-1);
		strncpy(out_pack->sbank_code,p.port,sizeof(out_pack->sbank_code)-1);
		out_pack->lvol9=p.baudrate;
		out_pack->lvol10=p.comtype;
		strncpy(out_pack->sserial0,p.bsheetvdate,sizeof(out_pack->sserial0)-1);
		strncpy(out_pack->sserial1,p.bsheetver,sizeof(out_pack->sserial1)-1);
		out_pack->lvol11=p.lasttraserno;
		strncpy(out_pack->scust_auth,p.lasttradate,sizeof(out_pack->scust_auth)-1);
		out_pack->lvol12=p.lastshutserno;
		strncpy(out_pack->scust_auth2,p.lastshutdate,sizeof(out_pack->scust_auth2)-1);
		PutRow(handle,out_pack,pRetCode,szMsg);
		return 0;
	}

	ret=DB_t_pif_device_open_select_by_c1_and_subsystem_id(rPack->lcert_code);
	writelog(LOG_DEBUG,"subsystem [%d]",rPack->lcert_code);
	if(ret)
	{
			writelog(LOG_ERR,"sub_system_id[%d]",rPack->lcert_code);
			*pRetCode=E_DB_DEVICE_R;
			goto L_RETU;
	}
	while(1)
	{

		memset(&p,0,sizeof(p));
		ret=DB_t_pif_device_fetch_select_by_c1(&p);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
			{
				if(row)
					break;
				else
					*pRetCode=E_DB_DEVICE_N;
			}
			else
				*pRetCode=E_DB_DEVICE_R;
			goto L_RETU;
		}
		if(p.state_id==DEVISTAT_LOGOUT  || PHYTYPE_999_DEV != p.phytype)
			continue;
		p.state_id=DEVISTAT_REGIST;
		if((strncmp(p.dev999_id,"FFFFFFFF",8)==0)||(strlen(p.dev999_id)==0))
			continue;
		if(ROOT_DEVICE_ID == p.fdev_id)
		{
			memset(out_pack->stime0,0,sizeof(out_pack->stime0));
			out_pack->lvol1 = -1;
		}
		else
		{
			out_pack->lvol1 = p.fdev_id;
			memset(&parent,0,sizeof parent);
			ret = DB_t_pif_device_read_by_device_id(p.fdev_id,&parent);
			if(ret)
			{
				des2src(out_pack->stime0,"FFFFFFFF");
			}
			else
			{
				des2src(out_pack->stime0,parent.dev999_id);
			}
		}
		out_pack->lvol0 = p.device_id;
		out_pack->lvol7=p.state_id;
		strncpy(out_pack->sdate2,p.dev999_id,sizeof(out_pack->sdate2)-1);
		strncpy(out_pack->sdate1,p.devphy999_id,sizeof(out_pack->sdate1)-1);
		out_pack->lvol4=p.dev999_no;
		strncpy(out_pack->semp,p.devtype,sizeof(out_pack->semp)-1);
		strncpy(out_pack->sdate3,p.devversion,sizeof(out_pack->sdate3)-1);
		strncpy(out_pack->sholder_type,p.cardstr,sizeof(out_pack->sholder_type)-1);
		strncpy(out_pack->snote2,p.cardtype,sizeof(out_pack->snote2)-1);
		out_pack->lvol5=p.portcount;
		out_pack->lvol6=p.portno;
		out_pack->lvol8=p.joinmode;
		strncpy(out_pack->sstation0,p.comadd,sizeof(out_pack->sstation0)-1);
		strncpy(out_pack->sbank_code,p.port,sizeof(out_pack->sbank_code)-1);
		out_pack->lvol9=p.baudrate;
		out_pack->lvol10=p.comtype;
		strncpy(out_pack->sserial0,p.bsheetvdate,sizeof(out_pack->sserial0)-1);
		strncpy(out_pack->sserial1,p.bsheetver,sizeof(out_pack->sserial1)-1);
		out_pack->lvol11=p.lasttraserno;
		strncpy(out_pack->scust_auth,p.lasttradate,sizeof(out_pack->scust_auth)-1);
		out_pack->lvol12=p.lastshutserno;
		strncpy(out_pack->scust_auth2,p.lastshutdate,sizeof(out_pack->scust_auth2)-1);
		row++;
		PutRow(handle,out_pack,pRetCode,szMsg);
		if(row%10==0)
			AnswerDataPart(handle,*pRetCode,szMsg);
	}
	AnswerData(handle,*pRetCode,szMsg);
	return 0;
L_RETU:
	return -1;
}
int F930063(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg)
{
	int ret = 0;
	int cnt=0;
	int msgid=0;
     	T_t_msglist tMsgList;
	T_t_device tDevice;
	memset(&tDevice,0,sizeof tDevice);

	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);

	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_VSVARSTR0,0);
	memset(&tMsgList,0,sizeof(tMsgList));

	if(strlen(in_pack->sdate0)==0)
	{
		*pRetCode=E_DEVPHYID_NULL;
		goto L_RETU;
	}

	AddXmlItemStr(tMsgList.reqdata, XML_KEY_ADMPWD, in_pack->semp_pwd);

	if((ret = get_devinfo_by_phyid(in_pack->sdate0,&tDevice)))
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	tMsgList.deviceid = tDevice.deviceid;
	tMsgList.funcno = 930063;
	tMsgList.msglevel = 2;
	ret=AddMsgLst(&tMsgList);
	if(ret)
	{
		*pRetCode=ret;
		writelog(LOG_ERR,"AddMsgLst err[%d]",ret);
		goto L_RETU;
	}
	if(iRequest!=tMsgList.funcno)
		return 0;	
	ret=db_commit();
	if(ret)
	{
		writelog(LOG_ERR,"db_commit ret[%d]",ret);
		*pRetCode=E_DB_COMMIT;
		goto  L_RETU;
	}
	msgid=tMsgList.msgid;
	des2src(out_pack->sdate0,in_pack->sdate0);
	for(cnt=0;(cnt<10)&&(tMsgList.errcode!=0);cnt++)
	{
		sleep(1);
		memset(&tMsgList,0,sizeof(tMsgList));
		ret=DB_t_msglist_read_by_msgid(msgid, &tMsgList);
		if(ret)
		{
			writelog(LOG_ERR,"DB_t_msglist_read_by_msgid err[%d]",ret);
			*pRetCode=E_DB_MSGLIST_R;
			goto L_RETU;
		}
	}
	switch(tMsgList.errcode)
	{
		case 0:		//成功
			des2src(out_pack->vsvarstr0,"成功");
			break;
		case 9999:		//交易未处理
			des2src(out_pack->vsvarstr0,"前置机无应答");
			break;
		default:			//交易已经处理,但结果是失败
			des2src(out_pack->vsvarstr0,tMsgList.errmsg);				
			break;
	}	
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
L_RETU:
	return  -1;	
}
Exemple #26
0
static int Add848012(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg)
{
	int ret = 0;
	int rows = 0;
	T_t_doorgrpmember tDoorGrpMem;
	T_t_doorholiday tHoliday;
	T_t_door_oper_right tOper;
	ST_PACK send_pack;
	int holiday_count = 0;
	char holiday[241] = "";
	int subsysid;
	if(in_pack->lvol0 < 1 )
	{
		return E_INPUT_GROUP_ID;
	}
	if(in_pack->lvol1 < 1)
	{
		return E_INPUt_doorholidayid;
	}
	if(strlen(in_pack->scust_limit) < 1)
	{
		return E_INPUT_DATA_INVAILD;
	}
	//writelog(LOG_DEBUG,"lvol0				: [%d]",in_pack->lvol0);
	//writelog(LOG_DEBUG,"lvol1				: [%d]",in_pack->lvol1);
	
	memset(&tHoliday,0,sizeof tHoliday);
	ret = DB_t_doorholiday_read_by_holidayid(in_pack->lvol1,&tHoliday);
	if(ret)
	{
		if(DB_NOTFOUND == ret)
		{
			return E_DB_DOOR_HOLIDAY_N;
		}
		return E_DB_DOOR_HOLIDAY_R;
	}
	
	ret = DB_t_doorgrpmember_open_select_by_cur1_and_groupid(in_pack->lvol0);
	if(ret)
	{
		return E_DB_DOOR_GROUP_MEMBER_R;
	}
	while(1)
	{
		memset(&tDoorGrpMem,0,sizeof tDoorGrpMem);
		ret = DB_t_doorgrpmember_fetch_select_by_cur1(&tDoorGrpMem);
		if(ret)
		{
			if(DB_NOTFOUND == ret)
			{
				if(rows > 0)
				{
					return 0;
				}
				return E_DB_DOOR_GROUP_MEMBER_N;
			}
			return E_DB_DOOR_GROUP_MEMBER_R;
		}
		ret = get_subsysid_by_phyid(tDoorGrpMem.deviceid,&subsysid);
		if(ret)
		{
			// 设备不存在,继续下一个设备
			continue;
		}
		rows++;
		memset(&tOper,0,sizeof tOper);
		ret = DB_t_door_oper_right_read_by_oper_no_and_deviceid(
			in_pack->scust_limit,tDoorGrpMem.deviceid,&tOper);
		if(ret )
		{
			DB_t_doorgrpmember_close_select_by_cur1();
			// 只对该操作员有权限的设备处理
			if(DB_NOTFOUND == ret)
			{
				sprintf(szMsg,"操作员对设备%s没有操作权限",tDoorGrpMem.deviceid);
				return E_OPER_NO_RIGHT_FOR_DEVICE;
			}
			return E_DB_DOOR_OPER_RIGHT_R;
		}
		memset(holiday,0,sizeof holiday);
		holiday_count = 0;
		ret = AddDoorDevHld(tDoorGrpMem.deviceid,in_pack->lvol1,holiday,&holiday_count);
		if(ret)
		{
			// 一个门禁已经设置了该节假日就跳过
			if(E_DB_DOOR_DEV_HLD_E == ret)
			{
				continue;
			}
			DB_t_doorgrpmember_close_select_by_cur1();
			return ret;
		}
		memset(&send_pack,0,sizeof send_pack);
		send_pack.lvol1 = 930109;
		des2src(send_pack.sdate0,tDoorGrpMem.deviceid);
		send_pack.lvol5 = holiday_count;
		des2src(send_pack.vsvarstr0,holiday); 
		ret = F930109(handle,iRequest,&send_pack,pRetCode,szMsg);
		if(ret)
		{
			DB_t_doorgrpmember_close_select_by_cur1();
			return *pRetCode;
		}
	}
	return 0;
}
Exemple #27
0
int F847123(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	int card_id=0;
	char sSeedKey[17] = "";							//种子密钥
	char sPwd[7] = "";							//卡密码
	char logicdate[11]="";
	char sysdate[11]="";
	char systime[9]="";
	double dSerialno=0;
	T_t_pif_card tCard;
	T_t_cif_customer tCustomer;
	T_t_pif_spefee 	tSpeFee;
	T_t_aif_account  tAccount;
	T_t_tif_tradeserial tTradeserial;
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);

	memset(&tCard,0,sizeof(tCard));
	memset(&tCustomer,0,sizeof(tCustomer));
	memset(&tSpeFee,0,sizeof(tSpeFee));
	memset(&tAccount,0,sizeof(tAccount));
	memset(&tTradeserial,0,sizeof(tTradeserial));
	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL10,F_LVOL5,
				F_SCUST_NO,	F_SCUST_NO2,F_SCUST_AUTH,F_SCUST_AUTH2,
				F_SDATE0,F_SNAME,F_SNAME2,
				F_SOPEN_EMP,F_SSTATUS0,
				F_DAMT2,F_LSERIAL1,F_VSMESS,0);

	card_id=rPack->lvol0;
	if(card_id<1)
	{
		*pRetCode=E_INPUT_CARDNO;
		goto L_RETU;
	}
	getsysdate(sysdate);
	getsystime(systime);
	ret=GetLogicDate(logicdate);								//业务日期
	if(ret)
	{
		*pRetCode=ret;
		goto L_RETU;
	}
	//判断卡状态是否为写卡未成功状态
	ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &tCard);
	if(ret)
	{
		writelog(LOG_ERR,"card_id[%d]",card_id);
		if(DB_NOTFOUND==ret)
			*pRetCode= E_CARDNO_NOT_EXIST;
		else
			*pRetCode= E_DB_CARD_R;
		goto L_RETU;
	}
	if(card_id!=tCard.card_id)
	{
		writelog(LOG_ERR,"card_id[%d] db card_id[%d]",card_id,tCard.card_id);
		DB_t_pif_card_free_lock_by_cur();
		*pRetCode=E_DB_CARD_R;
		goto L_RETU;
	}
	if('3'!=tCard.state_id[CARDSTAT_TYPE_REG])
	{
		DB_t_pif_card_free_lock_by_cur();
		if('2'==tCard.state_id[CARDSTAT_TYPE_REG])
			*pRetCode=E_CARDNO_LOGOUT;
		else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_LOST])
			*pRetCode=E_CARDNO_LOST;
		else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_FREEZE])
			*pRetCode=E_CARDNO_FREEZE;
		else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_WFAIL])
			*pRetCode=E_CARDNO_WFAIL;
		else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_REG])
			*pRetCode=E_OLDCARDINFO_NOSAVE;
		goto L_RETU;
	}
	trim(rPack->sbank_acc);
	trim(rPack->scust_no);
	trim(rPack->sdate0);
	if(strlen(rPack->scust_no))
	{
		ret=IsExistShowCardNo(rPack->scust_no);
		if(ret)
		{
			*pRetCode = ret;
			goto L_RETU;
		}
	}
	if(strcmp(tCard.physical_no,rPack->sbank_acc)!=0)
	{
		ret=IsExistCardByPhyCardNo(rPack->sbank_acc);
		if(ret)
		{
			*pRetCode = ret;
			goto L_RETU;
		}
	}
	ret=IsInvalidDateTime(rPack->sdate0,"YYYYMMDD");
	if(ret)
	{
		*pRetCode=ret;
		goto L_RETU;
	}

	des2src(tCard.physical_no, rPack->sbank_acc);		//物理卡号
	des2src(tCard.showid,rPack->scust_no);				//显示卡号
	des2src(tCard.end_time,rPack->sdate0);				//到期日期

	ret=DB_t_pif_card_update_lock_by_cur(&tCard);
	if(ret)
	{
		writelog(LOG_ERR,"card_id[%d]",card_id);
		if(DB_NOTFOUND==ret)
			*pRetCode= E_CARDNO_NOT_EXIST;
		else
			*pRetCode= E_DB_CARD_U;
		goto L_RETU;
	}
	DB_t_pif_card_free_lock_by_cur();

	memcpy(sSeedKey,STATIC_SEED_KEY,16);			//读种子密钥
	EncodePwd(sSeedKey,sPwd,tCard.password,1);		//卡密码

	//注销帐户
	ret=DB_t_aif_account_read_by_card_id_and_purse_id(card_id,PURSE_NO_ONE, &tAccount);
	if(ret)
	{
		writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,card_id);
		if(DB_NOTFOUND==ret)
			*pRetCode= E_ACTNO_NOT_EXIST;
		else
			*pRetCode= E_DB_ACCOUNT_R;
		goto L_RETU;
	}
	if(tAccount.consume_count<1)
	{
		*pRetCode=E_CARD_TXCNT;
		goto L_RETU;
	}
	if(amtcmp(tAccount.card_balance,0)<0)
	{
		*pRetCode=E_CARD_BALA;
		goto L_RETU;
	}
	ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(tCard.cosumer_id, &tCustomer);
	if(ret)
	{
		writelog(LOG_ERR,"cut_id[%d]",tCard.cosumer_id);
		if(DB_NOTFOUND==ret)
			*pRetCode= E_CUSTOMER_NOT_EXIST;
		else
			*pRetCode= E_DB_CUSTOMER_R;
		goto L_RETU;
	}
	//得到收费类别
	if(tCustomer.fee_type<1)
	{
		ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
			{
				tCustomer.fee_type=tCustomer.cut_type;
			}
			else
			{
				DB_t_cif_customer_free_lock_cur();
				*pRetCode=E_DB_SPEFEE_R;
				goto L_RETU;
			}
		}
		else
		{
			tCustomer.fee_type=tSpeFee.fee_type;
		}
		//更新客户表的收费类别字段
		ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				*pRetCode= E_CUSTOMER_NOT_EXIST;
			else
				*pRetCode= E_DB_CUSTOMER_U;
			goto L_RETU;
		}
	}
	DB_t_cif_customer_free_lock_cur();
	ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialno);  				//获得流水号
	if(ret)
	{
		*pRetCode = ret;
		writelog(LOG_ERR,"ret [%d]",ret);
		goto L_RETU;
	}
	tTradeserial.serial_no = (int)dSerialno;					//流水号
	tTradeserial.other_seri_no = 0;							//上传端流水号
	tTradeserial.serial_type = 847123;						//交易代码;备注:发卡+充值 用一个交易码,即847101; 发卡(不充值)另用一个交易码,即新的发卡程序文件名,从而区分发卡充值与发卡不充值的卡操作信息。
	tTradeserial.serial_state = SERISTAT_DEBT;				//流水状态
	des2src(tTradeserial.operate_date,sysdate);				//发生日期
	des2src(tTradeserial.operate_time,systime);				//发生时间
	des2src(tTradeserial.collect_date,sysdate);				//采集日期
	des2src(tTradeserial.collect_time,systime);				//采集时间
	des2src(tTradeserial.enteract_date,logicdate);				//处理日期
	des2src(tTradeserial.enteract_time,systime);				//处理时间
	des2src(tTradeserial.oper_code , rPack->scust_limit);
	tTradeserial.maindevice_id = rPack->lvol6;				//上传工作站标识
	tTradeserial.device_id = rPack->lvol7;					//采集设备标识
	tTradeserial.card_id = tCard.card_id;						//卡号
	des2src(tTradeserial.showid,tCard.showid);				//显示卡号
	tTradeserial.purse_id = PURSE_NO_ONE;					//钱包号
	tTradeserial.customer_id = tCard.cosumer_id;				//客户标识

	//插入交易流水表
	ret = DB_t_tif_tradeserial_add(&tTradeserial);
	if (ret)
	{
		writelog(LOG_ERR,"ret[%d]",ret);
		if(DB_REPEAT==ret)
			*pRetCode = E_DB_TRADESERIAL_E;
		else
			*pRetCode = E_DB_TRADESERIAL_I;
		goto L_RETU;
	}
	out_pack->lvol0 = card_id;									//交易卡号
	out_pack->lvol1 = tCustomer.cut_type;						//客户类别
	out_pack->lvol5 = tCustomer.fee_type;						//收费类别
	des2src(out_pack->scust_no,tCard.showid);					//显示卡号
	des2src(out_pack->scust_no2,tCustomer.classdept_no);			//部门号
	des2src(out_pack->scust_auth,tCustomer.stuemp_no);			//学号
	des2src(out_pack->scust_auth2,tCustomer.man_id);			//身份证号
	des2src(out_pack->sname,tCustomer.cut_name);				//客户姓名
	des2src(out_pack->sname2,tCustomer.lib_cardid);				//图书证号
	des2src(out_pack->sstatus0,tCustomer.sex);					//性别
	des2src(out_pack->sopen_emp,sPwd);						//卡密码
	des2src(out_pack->sdate0,tCard.end_time);					//有效截至日期

	out_pack->damt2=D4U5(tAccount.card_balance,2);			//卡余额
	out_pack->lvol10=tAccount.consume_count;					//消费次数
	out_pack->lserial1=tTradeserial.serial_no;						//流水号

	sprintf(out_pack->vsmess,"流水号:%d 卡号:%d 学工号:%s 姓名:%s 卡余额:%.2lf元",tTradeserial.serial_no,card_id,tCustomer.stuemp_no,tCustomer.cut_name,tAccount.card_balance);
	writelog(LOG_DEBUG,out_pack->vsmess);
	// add by 汤成 2005-8-8
	// 增加向名单表写入记录
	ret = InsertToBlkList(card_id,CHCARD_BLACKLIST);
	if(ret)
	{
		*pRetCode = ret;
		goto L_RETU;
	}
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
L_RETU:
	return -1;
}
Exemple #28
0
int F930203(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg)
{
	T_t_door_txdtl txdtl;
	T_t_pif_card tCard;
	T_t_pif_device device;
	T_t_door_events event;
	int ret;
	char weigand_no[12+1]="";
	memset(&device,0,sizeof device);
	ret = get_door_dev_by_parent_and_termid(&device,in_pack->lvol2,in_pack->lvol1);
	if(ret)
	{
		writelog(LOG_ERR,"get_door_dev_by_parent_and_termid err,parent_id=[%d],dev_no=[%d],ret=[%d]",in_pack->lvol2,in_pack->lvol1,ret);
		if(ret == E_DB_DEVICE_N)
		{
			return 0;
		}
		else
		{
			*pRetCode = ret;
			goto L_RETU;
		}
	}
	if(strlen(in_pack->sdate1) == 0)
	{
		//事件
		memset(&event,0,sizeof event);
		event.device_id = device.device_id;
		event.event_code = atoi(in_pack->semp_no);
		des2src(event.event_msg,in_pack->vsmess);
		event.sysid = in_pack->lcert_code;
		des2src(event.tx_date,in_pack->sdate0);
		des2src(event.tx_time,in_pack->stime0);
		getsysdate(event.col_date);
		getsystime(event.col_time);
		ret = DB_t_door_events_add(&event);
		if(ret)
		{
			if(DB_REPEAT == ret)	return 0;
			*pRetCode = E_DB_DOOR_TXDTL_I;
			goto L_RETU;
		}
		return 0;
		
	}
	/*
	else if(strlen(in_pack->sdate1) !=8)
	{
		// 流水卡号错误
		ret=get_card_by_weigand_no(&tCard,in_pack->sdate1);
		if(ret)
		{

		}
		writelog(LOG_DEBUG,"数据有误");
		return 0;
	}
	*/
	else
	{
		memset(&tCard,0,sizeof tCard);
		ret = get_card_by_phyno(&tCard,in_pack->sdate1);
		if(ret)
		{
			if(ret==E_DB_CARD_N)
			{
				ConverPhyNo(in_pack->sdate1,weigand_no);
				ret=get_card_by_weigand_no(&tCard,weigand_no);
				if(ret)
				{
					writelog(LOG_ERR,"Get_card_by_weigand_no err,weigand_no=[%s],ret=[%d]",weigand_no,ret);
					// 没有这张卡,仍然保留流水
					if(ret != E_DB_CARD_N)	
					{
						*pRetCode=ret;
						goto L_RETU;
					};
				}
			}
			else 
			{
				*pRetCode=ret;
				goto L_RETU;
			};
		}
		memset(&txdtl,0,sizeof txdtl);
		txdtl.device_id = device.device_id;
		txdtl.card_no = tCard.card_id;
		txdtl.sys_id = in_pack->lcert_code;
		txdtl.cust_id = tCard.cosumer_id;
		if(!ret)	des2src(txdtl.phycard_no,tCard.physical_no);
		else des2src(txdtl.phycard_no,in_pack->sdate1);
		//writelog(LOG_DEBUG,"door serial date[%s] time[%s]",in_pack->sdate0,in_pack->stime0);
		des2src(txdtl.tx_date,in_pack->sdate0);
		des2src(txdtl.tx_time,in_pack->stime0);
		getsysdate(txdtl.col_date);
		getsystime(txdtl.col_time);
		txdtl.tx_mark = atoi(in_pack->semp_no);
		
		ret = DB_t_door_txdtl_add(&txdtl);
		if(ret)
		{
			// 重复流水忽略
			if(DB_REPEAT == ret)
			{
				writelog(LOG_DEBUG,"流水重复card[%s],date[%s],time[%s]",in_pack->sdate1
					,in_pack->sdate0,in_pack->stime0);
				return 0;
			}
			writelog(LOG_ERR,"保存流水失败card[%s],date[%s],time[%s]",in_pack->sdate1
					,in_pack->sdate0,in_pack->stime0);
			*pRetCode = E_DB_DOOR_TXDTL_I;
			goto L_RETU;
		}
	}
	return 0;

L_RETU:
	return -1;

}
Exemple #29
0
int F847127(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	des2src(pAccTrans->trans.opercode,rPack->semp);
	pAccTrans->trans.transcode=TC_MANUALDRCR;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	TRANS& trans=pAccTrans->trans;

	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);

	ResetNormalCPack(&aPack,0,1);
	des2src(trans.draccno,rPack->sbank_acc);
	des2src(trans.craccno,rPack->sbank_acc2);
	trans.inputamt=rPack->damt0;
	if(amtcmp(trans.inputamt,0)==0)
	{
		return E_INPUT_AMT_NULL;
	}	
	if(!strlen(trans.draccno))
		return E_NO_DRACCNO;
	if(!strlen(trans.craccno))
		return E_NO_CRACCNO;
	if(strcmp(trans.draccno,trans.craccno)==0)
	{
		return E_INPUT_2ACTNO_EQ;
	}
	des2src(trans.opercode,rPack->scust_limit);
	des2src(trans.chkopercode,rPack->scust_limit2);
	trim(rPack->semp_pwd);
	if(strlen(trans.opercode)==0)
	{
		return E_INPUT_OPER_NULL;
	}
	if(strlen(trans.chkopercode)==0)
	{
		return E_INPUTNULL_CHKOPER;
	}
	if(strcmp(trans.opercode,trans.chkopercode)==0)
	{
		writelog(LOG_ERR,"oper1[%s]chkoper[%s]",trans.opercode,trans.chkopercode);
		return E_INPUT_2OPER_EQ;
	}
	ret=chk_oper_pwd(trans.chkopercode,rPack->semp_pwd);
	if(ret)
	{
		return ret;
	}
	pAccTrans->trans.transamt=pAccTrans->trans.inputamt;
	pAccTrans->trans.fundtype=0;
	pAccTrans->trans.transtype=TRANSTYPE_MANDRCR;
	ret=pAccTrans->DoTransByTransType();
	if(ret)
		return ret;	
	ret=pAccTrans->doTransEnd();
	if(ret)
		return ret;
	sprintf(trans.remark,"交易金额%.2lf,借方账户[%s]余额%.2lf,贷方账户[%s]余额%.2lf",trans.totaltransamt,trans.draccname,trans.draccaftbal,trans.craccname,trans.craccaftbal);
	SetCol(handle,F_LVOL0,F_LVOL8,F_SDATE3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);	
	des2src(outPack->sdate3,pAccTrans->trans.sysdate);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=trans.termid;
	outPack->lserial1=trans.termseqno;
	sprintf(outPack->vsmess,"%s 借方账户[%s]贷方帐户[%s]",pAccTrans->remark.c_str(),pAccTrans->trans.draccname,trans.craccname);
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}
Exemple #30
0
//联机冲正,当日即时冲正
int OnlineTransRev(char *oldaccdate,int oldtermid,int oldtermseqno)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;

	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));
	ret=DB_t_transdtl_read_lock_by_c0_and_accdate_and_termid_and_termseqno(oldaccdate,oldtermid,oldtermseqno,&transdtl);
	if(ret)
	{
		writelog(LOG_ERR,"ret[%d]accdate[%s]termid[%d]termseqno[%d]",ret,oldaccdate,oldtermid,oldtermseqno);
		if(DB_NOTFOUND==ret)
			return E_DB_TRANSDTL_N;
		else
			return E_DB_TRANSDTL_R;
	}	
	if('1'==transdtl.revflag[0])
	{
		DB_t_transdtl_free_lock_by_c0();
		pAccTrans->remark="该交易已冲正";
		return 0;
	}	
	transdtl.revflag[0]='1';
	ret=DB_t_transdtl_update_lock_by_c0(&transdtl);
	if(ret)
	{
		writelog(LOG_ERR,"UpdateTransdtlRevFlag ret[%d]accdate[%s]termid[%d]termseqno[%d]",ret,oldaccdate,oldtermid,oldtermseqno);
		return ret;
	}
	if(transdtl.cardcnt>0&&transdtl.cardno>0)
	{	
		if(TF_PAY==transdtl.transflag)
		{
			ret=UpdateCardBitmap(transdtl.cardno,transdtl.cardcnt,CARDBITMAPTYPE_REV);
			if(ret)
			{
				writelog(LOG_ERR,"UpdateCardBitmap err ret[%d]cardno[%d]cardcnt[%d]",ret,transdtl.cardno,transdtl.cardcnt);
			}
		}		
	}
	if(strlen(transdtl.opercode))
	{
		if(strcmp(transdtl.opercode,pAccTrans->trans.opercode)!=0)
		{
			return ERRINFO(E_REVOPER,transdtl.opercode);
		}
	}
	else
	{
		des2src(transdtl.opercode,trans.opercode);
	}
	/*
	if(transdtl.cardno)
	{
		T_t_card card;
		memset(&card,0,sizeof(card));
		ret=DB_t_card_read_by_cardno(transdtl.cardno,&card);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CARDNO,transdtl.cardno);
			else
				return E_DB_CARD_R;
		}
		strcpy(pAccTrans->trans.cardaccno,card.accno);
	}
	*/
	
	trans.cardno=transdtl.cardno;
	trans.cardflag=1;
	trans.offlineflag=1;
	trans.revflag=1;//冲正标志
	trans.cardbefbal=transdtl.cardaftbal;
	trans.cardaftbal=transdtl.cardbefbal;
	ret=GetAccnoByCardno(trans.cardno,trans.cardaccno);
	if(ret)
		return ret;	
	ret=pAccTrans->doTodayReverseTrans(oldaccdate,oldtermid,oldtermseqno);	
	if(ret)
		return ret; 
	ret=UpdCardBalByAccno(trans.cardaccno,transdtl.cardbefbal,transdtl.transflag,transdtl.cardcnt,1,0);
	if(ret)
		return ret;
	transdtl.cardaftbal=transdtl.cardbefbal;
	transdtl.revflag[0]='0';
	strcpy(transdtl.accdate,pAccTrans->trans.accdate);
	strcpy(transdtl.acctime,pAccTrans->trans.acctime);
	des2src(transdtl.transdate,pAccTrans->trans.transdate);
	des2src(transdtl.transtime,pAccTrans->trans.transtime);
	transdtl.transcode= pAccTrans->trans.transcode;
	transdtl.termid = pAccTrans->trans.termid;
	transdtl.termseqno = pAccTrans->trans.termseqno;
	transdtl.amount = -transdtl.amount;
	transdtl.managefee = -transdtl.managefee;
	ret=DB_t_transdtl_add(&transdtl);
	if(ret)
	{
		if(DB_REPEAT==ret)
			return E_DB_TRANSDTL_E;
		else
			return E_DB_TRANSDTL_I;
	}
	return 0;
}