コード例 #1
0
ファイル: F846305.cpp プロジェクト: nykma/ykt4sungard
int F846305(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	int freefeeflag=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	des2src(pAccTrans->trans.opercode,rPack->semp);
	pAccTrans->trans.transcode=TC_CARDRENEW;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	char backcardtype=rPack->sstat_type[0]; //C、以卡为准 A、以账户为准
		
	TRANS& trans=pAccTrans->trans;

	trans.usecardflag=1;
	trans.cardno=rPack->lvol0;
	des2src(trans.showcardno,rPack->sorder0);
	des2src(trans.cardphyid,rPack->sstation0);
	if (!strlen(trans.cardphyid))
	    return E_INPUT_CARDPHYID;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);
	
	ResetNormalCPack(&aPack,0,1);

		
	SetCol(handle,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)
	{
		writelog(LOG_ERR,"cardno[%d]",trans.cardno);
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno);
		else 
			return E_DB_CARD_R;
	}
	trans.cardtype=tCard.cardtype;
	trans.feetype=tCard.feetype;
	trans.custid=tCard.custid;

	if(tCard.cardphytype)
	{
		if(tCard.cardphytype!=rPack->lserial0)
		{
			DB_t_card_free_lock_by_cur();
			ERRTIP("补办选择卡物理类型%d与原卡物理类型%d不符",rPack->lserial0,tCard.cardphytype);
			return E_COMMON_ERR;
		}
	    T_t_cardphytype tCardphytype;
	    memset(&tCardphytype,0,sizeof(tCardphytype));
	    ret=DB_t_cardphytype_read_by_cardphytype(tCard.cardphytype,&tCardphytype);
	    if(ret)
	    {
			DB_t_card_free_lock_by_cur();
			if(DB_NOTFOUND==ret)
				return E_DB_CARDPHYTYPE_N;
			else
				return E_DB_CARDPHYTYPE_R;
	    }
	    if(tCardphytype.cardphytypecode)
	    {
			if(tCardphytype.cardphytypecode!=rPack->lvol3)
			{
				DB_t_card_free_lock_by_cur();
				ERRTIP("卡物理类型代码%X与系统代码%X不符",rPack->lvol3,tCardphytype.cardphytypecode);
				return E_COMMON_ERR;
			}
	    }
    }
	if(tCard.status[0]!=STATUS_NORMAL)
	{
		DB_t_card_free_lock_by_cur();
		return ERRINFO(E_CARD_LOGOUT,trans.cardno);
	}
	if('1'==tCard.badflag[0])
	{
		if((CARDBADFLAG_CARDBAL==tCard.badtype[0])||(CARDBADFLAG_ACCBAL==tCard.badtype[0]))
		{
			DB_t_card_free_lock_by_cur();
			ERRTIP("该卡余额错误,请使用坏卡修复功能来处理,不必补办");
			return E_CARD_BAD_AND_NEED_UPDATE;
		}
	}
	//无卡只有挂失或卡物理损坏的情况下才可以补办卡
	if(tCard.lossflag[0]!='1'&&
		tCard.badflag[0]!='1')
	{
		DB_t_card_free_lock_by_cur();
		ERRTIP("该卡状态正常,不能补办");
		return E_COMMON_ERR;
	}


	//检查该客户是否存在未注销的卡
//	ret=IsExistOtherCardByCustid(tCard.custid,tCard.cardno);
	ret=IsExistNormalTmpCardByCustid(tCard.custid);
	if(ret)
	{
		DB_t_card_free_lock_by_cur();
		if(DB_EXIST==ret)
		{
			ERRTIP("该客户存在正常的过渡临时卡,请先注销过渡临时卡再补办");
			return E_EXIST_OTHERCARD;
		}
		else
			return ret;
	}
	if('1'==tCard.badflag[0])
	{
		//检查卡是否到了销卡的时间
		char enddate[9]={0};
		ret=calcEndDate(tCard.baddate,pAccTrans->sysPara.iRenewCardDayCnt,enddate);
		if(ret)
		{
			DB_t_card_free_lock_by_cur();		
			return ret;
		}
		if(strncmp(enddate,pAccTrans->trans.transdate,8)>0)
		{
			DB_t_card_free_lock_by_cur();	
			ERRTIP("请等到期后再补办");
			return ERRINFO(E_BADCARD_RECORDDATE_NOTREACH,enddate);
		}
		if(CARDBADFLAG_QUALITY==tCard.badtype[0])
			freefeeflag=1;
	}	
	else if('1'==tCard.lossflag[0])
	{
		char enddate[9]={0};
		if(strlen(tCard.lossdate))
		{
			ret=calcEndDate(tCard.lossdate,pAccTrans->sysPara.iRenewCardDayCnt,enddate);
			if(ret)
			{
				DB_t_card_free_lock_by_cur();		
				return ret;
			}
			if(strncmp(enddate,pAccTrans->trans.transdate,8)>0)
			{
				DB_t_card_free_lock_by_cur();		
				ERRTIP("请等到期后再补办");
				return ERRINFO(E_CARDLOSSDATE_NOREACH,enddate);
			}
		}
	}	
	ret=getCardVerNo(tCard.cardverno);
	if(ret)
	{
		DB_t_card_free_lock_by_cur();		
		return ret;
	}
	tCard.status[0]=STATUS_DELETE;
	strcpy(tCard.closedate,trans.transdate);
	des2src(tCard.lastsaved,trans.sysdatetime);
	ret=DB_t_card_update_lock_by_cur(&tCard);
	if(ret)
	{
		writelog(LOG_ERR,"cardno[%d]",tCard.cardno);
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDNO,tCard.cardno);
		else 
			return E_DB_CARD_U;
	}
	//删除卡库不平表该卡的记录
	ret=DelCardAccDiffByCardno(trans.cardno);
	if(ret)
		return ret;
	T_t_customer tCustomer;

	memset(&tCustomer,0,sizeof(tCustomer));
	if(trans.custid>0)
	{
		ret=DB_t_customer_read_by_custid(trans.custid,&tCustomer);
		if(ret)
		{		
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CUSTOMER,trans.custid);
			else
				return E_DB_CUSTOMER_R;
		}
		trans.custid=tCustomer.custid;
		des2src(trans.custname,tCustomer.custname);
		des2src(trans.stuempno,tCustomer.stuempno);
	}
	
	T_t_cardtyperight cardtyperight;

	memset(&cardtyperight,0,sizeof(cardtyperight));
	ret=DB_t_cardtyperight_read_by_cardtype_and_feetype(tCard.cardtype,tCard.feetype,&cardtyperight);
	if(ret)
	{
		writelog(LOG_ERR,"cardtype[%d]feetype[%d]",tCard.cardtype,tCard.feetype);
		if(DB_NOTFOUND==ret)
			return E_NOCARDTYPERIGHT;
		else 
			return E_DB_CARDTYPERIGHT_R;
	}
	////添加旧卡版本号记录
	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.cardno=tCard.cardno;
	cardver.status[0]=STATUS_NORMAL;	
	des2src(cardver.cardphyid,tCard.cardphyid);
	des2src(cardver.stuempno,trans.stuempno);
	cardver.cardvertype=CARDVERTYPE_CARDCLOSE;
	des2src(cardver.cardverno,tCard.cardverno);
	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_card  tCardTest;
    ret=DB_t_card_read_by_cardphyid_and_status(trans.cardphyid,"1",&tCardTest);
    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)
	{
		//使用新的显示卡号
	    if (!strlen(trans.showcardno))
    	    return E_INPUT_SHOWCARDNO;
	    ret=DB_t_card_read_by_showcardno_and_status(trans.showcardno,"1",&tCardTest);
	    if (ret!=DB_NOTFOUND)
	    {
	        if (DB_SUCCESS==ret)
	            return ERRINFO(E_EXIST_SHOWCARDNO,trans.showcardno);
	        else
	            return E_DB_CARD_R;
	    }
		int cardtype=0;
		ret=UseShowCardNo(trans.opercode,trans.showcardno,cardtype);
		if(ret)
		{
			return ret;
		}
		if(cardtype!=tCard.cardtype)
		{
			return ERRINFO(E_DIFF_CARDTYPE,cardtype,tCard.cardtype);
		}
		T_t_carddtl carddtl;
		memset(&carddtl,0,sizeof(carddtl));
		
		des2src(carddtl.accdate,trans.accdate);
		des2src(carddtl.acctime,trans.acctime);
		carddtl.termid=trans.termid;
		carddtl.termseqno=trans.termseqno;
		des2src(carddtl.opercode,trans.opercode);
		carddtl.cardtype=tCard.cardtype;
		carddtl.usetype=CARDUSETYPE_USE;
		carddtl.inoutflag=INOUTFLAG_OUT;
		carddtl.transcnt=1;
		strcpy(carddtl.summary,"补办卡");
		des2src(carddtl.cardphyid,trans.cardphyid);
		des2src(carddtl.showcardno,trans.showcardno);
		ret=DB_t_carddtl_add(&carddtl);
		if(ret)
		{
			if(DB_REPEAT==ret)
				return E_DB_CARDDTL_E;
			else
				return E_DB_CARDDTL_I;
		}
	}
	//使用卡片
	T_t_card  tNewCard;
	memset(&tNewCard,0,sizeof(tNewCard));

	des2src(tNewCard.cardphyid,trans.cardphyid);
	des2src(tNewCard.showcardno,trans.showcardno);
	des2src(tNewCard.expiredate,tCard.expiredate);
	des2src(tNewCard.accno,tCard.accno);
	tNewCard.cardtype=tCard.cardtype;
	tNewCard.feetype=tCard.feetype;
	des2src(tNewCard.cardpwd,tCard.cardpwd);
	tNewCard.custid=tCustomer.custid;
	tNewCard.lossflag[0]='0';
	tNewCard.frozeflag[0]='0';
	tNewCard.badflag[0]='0';
	tNewCard.lockflag[0]='0';
	tNewCard.status[0]=STATUS_NORMAL;
	tNewCard.cardphytype=tCard.cardphytype;
	des2src(tNewCard.opendate,pAccTrans->trans.transdate);
	des2src(tNewCard.lastsaved,trans.sysdatetime);
	ret = getNewUniqNo(KEYTYPE_CARDNO,&tNewCard.cardno);	//获取最大卡号
	if(ret)
	{
		return ret;
	}
	ret=getCardVerNo(tNewCard.cardverno);
	if(ret)
	{
		return ret;
	}
	ret=DB_t_card_add(&tNewCard);
	if(ret)
	{
		if(DB_REPEAT==ret)
			return E_DB_CARD_E;
		else
			return E_DB_CARD_I;
	}
	////添加新卡版本号记录
//	T_t_cardver cardver;

	memset(&cardver,0,sizeof(cardver));
	des2src(cardver.accdate,pAccTrans->trans.accdate);
	cardver.termid=trans.termid;
	cardver.termseqno=trans.termseqno;
	cardver.cardno=tNewCard.cardno;
	cardver.status[0]=STATUS_NORMAL;	
	des2src(cardver.cardphyid,tNewCard.cardphyid);
	des2src(cardver.stuempno,trans.stuempno);
	cardver.cardvertype=CARDVERTYPE_CARDOPEN;
	des2src(cardver.cardverno,tNewCard.cardverno);
	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_cardnochange tCardnoChange;
	
	memset(&tCardnoChange,0,sizeof(tCardnoChange));
	des2src(tCardnoChange.changedate,pAccTrans->trans.accdate);
	tCardnoChange.oldcardno=tCard.cardno;
	tCardnoChange.newcardno=tNewCard.cardno;
	ret=DB_t_cardnochange_add(&tCardnoChange);
	if(ret)
	{
		if(DB_REPEAT==ret)
			return E_DB_CARDNOCHANGE_E;
		else
			return E_DB_CARDNOCHANGE_I;
	}
	//插入卡位图表
	T_t_cardbitmap tCardBitmap;

	memset(&tCardBitmap,0,sizeof(tCardBitmap));
	tCardBitmap.cardno=tNewCard.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_account tCardAccount;	
	memset(&tCardAccount,0,sizeof(tCardAccount));
	ret=DB_t_account_read_by_accno(tNewCard.accno,&tCardAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,tNewCard.accno);
		else 
			return E_DB_ACCOUNT_R;
	}
	if(tCardAccount.status[0]!=STATUS_NORMAL)
	{
		return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno);
	}
	double subsidyamt=0;
	int maxsubsidyno=0;
	//检查补助信息
	ret = UpdAllUnGetSubsidy(trans.cardno);
	if(ret)
	{
		writelog(LOG_ERR,"UpdAllUnGetSubsidy ret=[%d]",ret);
		return ret;
	}
	strcpy(trans.cardaccno,tCardAccount.accno);
	//押金处理
	if(freefeeflag)
	{
		pAccTrans->SetFreeFlag();
	}
	else
	{
		//扣押金
		if(amtcmp(tCardAccount.foregift,0)>0)
		{
			trans.transamt=tCardAccount.foregift;
			trans.inputamt=tCardAccount.foregift;
			trans.unusedamt = trans.inputamt;
			trans.fundtype=0;
			pAccTrans->trans.transtype=TRANSTYPE_FOREGIFT2COSTFEE;
			ret=pAccTrans->DoTransByTransType();
			if(ret)
				return ret;
			if(amtcmp(pAccTrans->trans.unusedamt,0)>0)
				return E_INPUT_AMT;
			if(amtcmp(pAccTrans->trans.unusedamt,0)<0)
				return E_AMT_LACK;
		}			
	}
	if(amtcmp(tCardAccount.cardbal,0)<=0)
	{
		trans.cardbefbal=D4U5(tCardAccount.availbal+tCardAccount.subsidybal);
	}
	else
	{
		if(amtcmp(tCardAccount.availbal,tCardAccount.cardbal)<=0)
			trans.cardbefbal=D4U5(tCardAccount.availbal+tCardAccount.subsidybal);
		else
			trans.cardbefbal=D4U5(tCardAccount.cardbal+tCardAccount.subsidybal);
	}
	if(amtcmp(tCardAccount.subsidybal,0)!=0)
	{
		//领取补助
		memset(&tCardAccount,0,sizeof(tCardAccount));
		ret=DB_t_account_read_lock_by_c0_and_accno(trans.cardaccno,&tCardAccount);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_ACCNO,trans.cardaccno);
			else 
				return E_DB_ACCOUNT_R;
		}
		tCardAccount.availbal=D4U5(tCardAccount.availbal+tCardAccount.subsidybal);
		tCardAccount.subsidybal=0;
		ret=DB_t_account_update_lock_by_c0(&tCardAccount);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return E_DB_ACCOUNT_U;
			else 
				return E_DB_ACCOUNT_R;
		}
	}

	if(amtcmp(tCardAccount.balance,trans.cardbefbal)>0)
	{
		//走长款处理
//		if('C'==backcardtype)
//		{
			trans.transamt=D4U5(tCardAccount.balance-tCardAccount.frozebal-trans.cardbefbal);
			trans.inputamt=trans.transamt;
			trans.unusedamt = trans.inputamt;		
			trans.fundtype=0;
			pAccTrans->trans.transtype=TRANSTYPE_MORE_CARDBALINCOME;
			ret=pAccTrans->DoTransByTransType();
			if(ret)
				return ret;
			if(amtcmp(pAccTrans->trans.unusedamt,0)>0)
				return E_INPUT_AMT;
			if(amtcmp(pAccTrans->trans.unusedamt,0)<0)
				return E_AMT_LACK;
//		}
	}
	trans.cardflag=1;
	trans.usecardflag=1;
	trans.feetype=tCard.feetype;
	trans.fundtype=rPack->lvol9;
	trans.inputamt=rPack->damt0;
	trans.unusedamt = trans.inputamt;	
	if(trans.fundtype>4)
	{
		//如果从账户中扣卡成本费,则没有充值业务
		trans.fundtype=0;
		ret=pAccTrans->doFeeTrans();
		if(ret)
			return ret; 
	}
	else
	{
		des2src(trans.voucherno,rPack->scust_auth2);
		ret=pAccTrans->doTrans();
		if(ret)
			return ret; 
	}
	ret=pAccTrans->doTransEnd();
	if(ret)
		return ret;
	memset(&tCardAccount,0,sizeof(tCardAccount));
	ret=DB_t_account_read_lock_by_c0_and_accno(trans.cardaccno,&tCardAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,trans.cardaccno);
		else 
			return E_DB_ACCOUNT_R;
	}
	if(tCardAccount.status[0]!=STATUS_NORMAL)
	{
		DB_t_account_free_lock_by_c0();
		return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno);
	}
	if(amtcmp(tCardAccount.availbal,0)<0)
	{	
		DB_t_account_free_lock_by_c0();
		return ERRIF_CARDACC_OVERDRAW;
	}
	//取可用余额作为出卡值
	trans.cardaftbal=tCardAccount.availbal;
	tCardAccount.cardbal=trans.cardaftbal;
	tCardAccount.lastdpscnt=0;
	tCardAccount.lastpaycnt=0;
	tCardAccount.dpscnt=0;
	tCardAccount.paycnt=0;
	if(amtcmp(trans.cardaftbal,0)>0)
	{
		tCardAccount.dpscnt=1;
		trans.dpscnt=1;
	}
	double CardMaxBal=0;
	ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal);
	if(ret)
	{
		DB_t_account_free_lock_by_c0();
		return ret;
	}
	if(amtcmp(trans.cardaftbal,CardMaxBal)>=0)
	{
		DB_t_account_free_lock_by_c0();
		return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
	}
	tCardAccount.cardno=tNewCard.cardno;
	tCardAccount.lastsubsidyno=maxsubsidyno;
	tCardAccount.lastcardbal=trans.cardaftbal;
	des2src(tCardAccount.lasttransdate,trans.transdate);
	ret=DB_t_account_update_lock_by_c0(&tCardAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_ACCOUNT_U;
		else 
			return E_DB_ACCOUNT_R;
	}
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));

	strcpy(transdtl.transdate,trans.transdate);
	strcpy(transdtl.transtime,trans.transtime);
	strcpy(transdtl.accdate,trans.accdate);
	strcpy(transdtl.acctime,trans.acctime);
	transdtl.amount=trans.totaltransamt;
	transdtl.managefee=trans.totalfeeamt;
	transdtl.cardno=tNewCard.cardno;
	transdtl.transflag= TF_DPS;
	transdtl.cardcnt=trans.dpscnt;
	transdtl.cardbefbal=trans.cardbefbal;
	transdtl.cardaftbal=trans.cardaftbal;
	transdtl.termid=trans.termid;
	transdtl.termseqno=trans.termseqno;
	transdtl.transcode=trans.transcode;
	transdtl.paytype=trans.fundtype;
	des2src(transdtl.voucherno,trans.voucherno);
	des2src(transdtl.opercode,trans.opercode);
	transdtl.status[0]=DTLSTATUS_SUCCESS;
	transdtl.errcode=0;
	transdtl.custid=tCustomer.custid;
	des2src(transdtl.custname,tCustomer.custname);
	des2src(transdtl.stuempno,tCustomer.stuempno);
	des2src(transdtl.showcardno,tNewCard.showcardno);
	ret=DB_t_transdtl_add(&transdtl);
	if(ret)
	{
	  if(DB_REPEAT==ret)
		return E_DB_TRANSDTL_E;
	  else
		return E_DB_TRANSDTL_I;
	}		
	char cardpwd[33]="";
	char key[17]="";
	
	 //get_init_passwd_by_man_id(tCustomer.idno,cardpwd);
	strcpy(key,STATIC_SEED_KEY);
	EncodePwd(key,cardpwd,tNewCard.cardpwd, 1);

    SetCol(handle,F_LVOL1,F_LSAFE_LEVEL,F_LSAFE_LEVEL2,F_LVOL5,
           F_SALL_NAME,F_SPAGER,F_SCERT_NO,F_SHOLDER_AC_NO,
           F_SEMAIL2,F_SMARKET_CODE,F_SMARKET_CODE2,F_SDATE0,F_SNOTE,
           F_SSTAT_TYPE,F_SSTAT_TYPE2,F_SNATION_CODE,F_SBRANCH_CODE0,
           F_LVOL0,F_STX_PWD,F_LVOL8,F_LVOL11,F_LVOL12,
           F_SORDER0,F_SORDER1,F_SORDER2,F_SDATE3,F_STIME3,F_SEMP,
           F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_SNAME2,0);
    outPack->lvol1=tCustomer.custid;
    outPack->lsafe_level2=tCustomer.custtype;
    outPack->lvol5=tNewCard.feetype;
    des2src(outPack->sall_name,tCustomer.custname);
    des2src(outPack->spager,tCustomer.stuempno);
    des2src(outPack->scert_no,tCustomer.deptcode);
    des2src(outPack->semail2,tCustomer.idno);
    des2src(outPack->smarket_code,tCustomer.sex);
	des2src(outPack->smarket_code2,tCustomer.idtype);
    des2src(outPack->sdate0,tNewCard.expiredate);
    outPack->lvol0=tNewCard.cardno;
    des2src(outPack->stx_pwd,cardpwd);	
    outPack->lvol4=maxsubsidyno;
    outPack->lvol8=D4U5(pAccTrans->trans.cardaftbal*100,0);
    outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0);
    outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0);
    des2src(outPack->sorder0,tNewCard.showcardno);	
	strcpy(outPack->snote,CARD_STRUCT_VERSION);				//制卡版本号
	strcpy(outPack->sorder1,CARD_REGISTER_PUBLISH_CODE);	//发卡注册标识号
	strcpy(outPack->sorder2,CARD_REGISTER_SERVICE_CODE);	//服务注册标识号
	sprintf(outPack->sholder_ac_no,"%d",tCustomer.custid);	//客户号
	des2src(outPack->sstat_type,tCustomer.idtype);			//证件类型
	des2src(outPack->snation_code,tCustomer.country);		//国籍
	des2src(outPack->sstat_type2,tCustomer.nation);	//民族
	des2src(outPack->sbranch_code0,tCustomer.areacode);		//院校代码	
    des2src(outPack->sname2,tCard.cardverno);	
    des2src(outPack->sdate3,pAccTrans->trans.accdate);
	des2src(outPack->stime3,pAccTrans->trans.acctime);
	outPack->lsafe_level=tCard.cardtype;
	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;
}
コード例 #2
0
ファイル: F846303.cpp プロジェクト: nykma/ykt4sungard
//有卡退卡
static int CardCloseWithCard(ST_PACK *rPack)
{
    //检查卡
    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_lock_by_cur_and_cardno(trans.cardno,&tCard);
    if(ret)
    {
        writelog(LOG_ERR,"cardno[%d]",trans.cardno);
        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);
    }
    if(strcmp(tCard.cardphyid,trans.cardphyid)!=0)
    {
        DB_t_card_free_lock_by_cur();
        //	writelog(LOG_ERR,"db cardphyid[%s],input cardphyid[%s]",tCard.cardphyid,trans.cardphyid);
        return ERRINFO(E_CARD_PHYNO_DIFFER,trans.cardphyid,tCard.cardphyid);
    }
    ret=getCardVerNo(tCard.cardverno);
    if(ret)
    {
        DB_t_card_free_lock_by_cur();
        return ret;
    }
    tCard.status[0]=STATUS_DELETE;
    strcpy(tCard.closedate,trans.accdate);
    des2src(tCard.lastsaved,trans.sysdatetime);
    ret=DB_t_card_update_lock_by_cur(&tCard);
    if(ret)
    {
        writelog(LOG_ERR,"cardno[%d]",tCard.cardno);
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_CARDNO,tCard.cardno);
        else
            return E_DB_CARD_U;
    }
    trans.cardtype=tCard.cardtype;
    trans.custid=tCard.custid;
    trans.feetype=tCard.feetype;
    des2src(trans.showcardno,tCard.showcardno);

    T_t_customer tCustomer;

    memset(&tCustomer,0,sizeof(tCustomer));
    if(trans.custid>0)
    {
        ret=DB_t_customer_read_lock_by_cur_and_custid(trans.custid,&tCustomer);
        if(ret)
        {
            if(DB_NOTFOUND==ret)
                return ERRINFO(E_NOTEXIST_CUSTOMER,trans.custid);
            else
                return E_DB_CUSTOMER_R;
        }
        if(tCustomer.holdcardcnt)
        {
            tCustomer.holdcardcnt--;
        }
        des2src(tCustomer.lastsaved,trans.sysdatetime);
        ret=DB_t_customer_update_lock_by_cur(&tCustomer);
        if(ret)
        {
            if(DB_NOTFOUND==ret)
                return ERRINFO(E_NOTEXIST_CUSTOMER,trans.custid);
            else
                return E_DB_CUSTOMER_U;
        }
        des2src(trans.custname,tCustomer.custname);
        des2src(trans.stuempno,tCustomer.stuempno);
    }
    ////添加卡版本号记录
    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.cardno=tCard.cardno;
    cardver.status[0]=STATUS_NORMAL;
    des2src(cardver.cardphyid,tCard.cardphyid);
    des2src(cardver.stuempno,trans.stuempno);
    cardver.cardvertype=CARDVERTYPE_CARDCLOSE;
    des2src(cardver.cardverno,tCard.cardverno);
    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_cardtype tCardType;

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

    ret=DB_t_cardtype_read_by_cardtype(tCard.cardtype,&tCardType);
    if(ret)
    {
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_CARDTYPE,tCard.cardtype);
        else
            return E_DB_CARDTYPE_R;
    }
    if(tCardType.reuseable[0]=='1')
    {
        if(pAccTrans->sysPara.bEnableCardMgr)
        {
            ret=UseShowCardNoBack(trans.opercode,tCard.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=tCard.cardtype;
            carddtl.usetype=CARDUSETYPE_REUSE;
            carddtl.inoutflag=INOUTFLAG_IN;
            carddtl.transcnt=1;
            strcpy(carddtl.summary,"销户回收卡");
            des2src(carddtl.cardphyid,tCard.cardphyid);
            des2src(carddtl.showcardno,tCard.showcardno);
            ret=DB_t_carddtl_add(&carddtl);
            if(ret)
            {
                if(DB_REPEAT==ret)
                    return E_DB_CARDDTL_E;
                else
                    return E_DB_CARDDTL_I;
            }
        }
    }
    //读取帐户信息
    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;
    }
    if(tCardAccount.status[0]!=STATUS_NORMAL)
    {
        return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno);
    }
    //检查补助信息
    ret=UpdAllUnGetSubsidy(trans.cardno);
    if(ret)
        return ret;
    trans.cardaftbal=D4U5(trans.cardbefbal+tCardAccount.subsidybal);
    strcpy(trans.cardaccno,tCardAccount.accno);
    //押金处理
    double returncashamt=0;
    if(tCardAccount.foregift>0)
    {
        returncashamt=tCardAccount.foregift;
        trans.inputamt=tCardAccount.foregift;
        trans.unusedamt = trans.inputamt;
        trans.transamt=tCardAccount.foregift;
        trans.fundtype=0;//0表示从帐户扣
        //退押金
        pAccTrans->trans.transtype=TRANSTYPE_RETURNFOREGIFT;
        ret=pAccTrans->DoTransByTransType();
        if(ret)
            return ret;
        ret=pAccTrans->doTransEnd();
        if(ret)
            return ret;
    }
    if(amtcmp(tCardAccount.balance,0)<0)//处理负账户
    {
        trans.inputamt= - tCardAccount.balance;
        if(amtcmp(trans.inputamt,pAccTrans->sysPara.dAutoRenewAccMaxAmt)>0)
        {
            return ERRIF_CARDBAL_OVERDRAW;
        }
        trans.unusedamt = trans.inputamt;
        trans.transamt=trans.inputamt;
        trans.fundtype=0;//0表示从帐户扣
        //营业外支出
        pAccTrans->trans.transtype=TRANSTYPE_LESS_CARDBAL;
        ret=pAccTrans->DoTransByTransType();
        if(ret)
            return ret;
        ret=pAccTrans->doTransEnd();
        if(ret)
            return ret;
        trans.cardaftbal=0;
    }
    //判断卡余额是否大于账户余额
    else if(amtcmp(trans.cardaftbal,tCardAccount.balance)>0)
    {
        trans.cardaftbal=tCardAccount.balance;
    }
    /*
    	if(amtcmp(cardbal - availbal,pAccTrans->sysPara.dAutoRenewAccMaxAmt)>0)
    	{
    		return ERRINFO(E_CARDBAL_EXCEPTION,cardbal,availbal);
    	}
    //		if(amtcmp(trans.cardbefbal,tCardAccount.availbal)!=0)
    //	{
    	trans.inputamt=D4U5(cardbal-availbal);
    	trans.unusedamt = trans.inputamt;
    	trans.transamt=trans.inputamt;
    	trans.fundtype=0;//0表示从帐户扣
    	//营业外支出
    	pAccTrans->trans.transtype=TRANSTYPE_LESS_CARDBAL;
    	ret=pAccTrans->DoTransByTransType();
    	if(ret)
    		return ret;
    	ret=pAccTrans->doTransEnd();
    	if(ret)
    		return ret;
    //		}
    //		else
    //		{
    		//如果卡本身余额等于账户余额,则按照卡余额退款
    //			cardbal=tCardAccount.balance;
    //		}
    */
    else if(amtcmp(trans.cardaftbal,tCardAccount.balance)<0)
    {
        //营业外收入
//		if('C'==backcardtype)
//		{
        //以卡余额为准
        trans.inputamt=D4U5(tCardAccount.balance-trans.cardaftbal);
        trans.unusedamt = trans.inputamt;
        trans.transamt=trans.inputamt;
        trans.fundtype=0;//0表示从帐户扣
        //营业外支
        pAccTrans->trans.transtype=TRANSTYPE_MORE_CARDBALINCOME;
        ret=pAccTrans->DoTransByTransType();
        if(ret)
            return ret;
        ret=pAccTrans->doTransEnd();
        if(ret)
            return ret;
//		}
//		else
//		{
        //以库余额为准
//			trans.cardaftbal=tCardAccount.balance;
//		}
    }
    //下面退款按账户金额来退
    returncashamt= D4U5(returncashamt+trans.cardaftbal);
    if(amtcmp(trans.cardaftbal,0)>0)
    {
        trans.inputamt=trans.cardaftbal;//按卡余额来退款
        trans.unusedamt = trans.inputamt;
        trans.feetype=tCard.feetype;
        /*
        if('1'==backfunctype)
        {
        	trans.fundtype=PAYTYPE_OUTLAY;
        	des2src(trans.voucherno,rPack->scust_auth2);
        }
        */
        ret=pAccTrans->doTrans();
        if(ret)
            return ret;
        ret=pAccTrans->doTransEnd();
        if(ret)
            return ret;
    }
    sprintf(trans.remark,"销户成功,%s,总共应退款%.2lf元",pAccTrans->remark.c_str(),returncashamt);
    return 0;
}
コード例 #3
0
int UpdBadCard(TRUSERID *handle,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans& ats=CAccTrans::GetInst();
	TRANS& trans=ats.trans;
	T_t_card tCard;
	memset(&tCard,0,sizeof(tCard));

	if(trans.cardno<1)
	{
		ret=DB_t_card_read_by_cardphyid_and_status(trans.cardphyid,"1",&tCard);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CARDPHYID,trans.cardphyid);
			else 
				return E_DB_CARD_R;
		}
		trans.cardno=tCard.cardno;
	}
	ret=DB_t_card_read_lock_by_c0_and_cardno(trans.cardno,&tCard);
	if(ret)
	{
		writelog(LOG_ERR,"cardno[%d]",trans.cardno);
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno);
		else 
			return E_DB_CARD_R;
	}
	trans.custid=tCard.custid;
	trans.cardtype=tCard.cardtype;
	trans.feetype=tCard.feetype;
	if(tCard.status[0]!=STATUS_NORMAL)
	{
		DB_t_card_free_lock_by_c0();
		return ERRINFO(E_CARD_LOGOUT,trans.cardno);
	}	
/*
	if('1'==tCard.frozeflag[0])
	{
		DB_t_card_free_lock_by_c0();
		return ERRINFO(E_CARD_FREEZE,trans.cardno);
	}
*/
	if('1'==tCard.lossflag[0])
	{
		DB_t_card_free_lock_by_c0();
		return ERRINFO(E_CARD_LOST,trans.cardno);
	}	
	//比较卡物理ID是否相同
	if(strcmp(tCard.cardphyid,trans.cardphyid)!=0)
	{
		DB_t_card_free_lock_by_c0();
		return ERRINFO(E_CARD_PHYNO_DIFFER,trans.cardphyid,tCard.cardphyid);
	}
	if('1'!=tCard.badflag[0])
	{
		return ERRINFO(E_CARD_NOBADRECORD,trans.cardno);
	}
	if((CARDBADFLAG_CARDBAL!=tCard.badtype[0])&&(CARDBADFLAG_ACCBAL!=tCard.badtype[0]))
	{
		DB_t_card_free_lock_by_c0();
		ERRTIP("该卡已经登记为卡片损坏,请检查该卡是否完全损坏,如果没有损坏,请修改该卡损坏类型为余额错误类型再来修复");
		return E_COMMON_ERR;
	}
	char badtype=tCard.badtype[0];
	char enddate[9]={0};
	ret=calcEndDate(tCard.baddate,ats.sysPara.iRenewCardDayCnt,enddate);
	if(ret)
	{
		DB_t_card_free_lock_by_c0();				
		return ret;
	}
	if(strncmp(enddate,trans.transdate,8)>0)
	{
		DB_t_card_free_lock_by_c0();
		return ERRINFO(E_BADCARD_RECORDDATE_NOTREACH,enddate);
	}
	tCard.badflag[0]='0';
	tCard.badtype[0]=0;
	tCard.baddate[0]=0;
	des2src(tCard.lastsaved,trans.sysdatetime);
	ret=DB_t_card_update_lock_by_cur(&tCard);
	if(ret)
	{
		writelog(LOG_ERR,"cardno[%d]",tCard.cardno);
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno);
		else 
			return E_DB_CARD_U;
	}
	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;
		}
	}
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));
	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;
	}
	if(tCardAccount.status[0]!=STATUS_NORMAL)
	{
		DB_t_account_free_lock_by_c0();
		return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno);
	}	
	if(CARDBADFLAG_ACCBAL==badtype)
	{
		//以卡修库
		if(amtcmp(tCardAccount.balance,trans.cardbefbal)<0)
		{
			//在卡比库大的时候不允许更新
			DB_t_account_free_lock_by_c0();		
			ERRTIP("卡余额比账户余额大,不允许以卡修库");
			return E_COMMON_ERR;
		}
		if(amtcmp(tCardAccount.availbal,trans.cardbefbal)==0)
		{
			DB_t_account_free_lock_by_c0();		
			ERRTIP("卡余额与账户余额已经相等,不需要以卡修库");
			return E_COMMON_ERR;
		}
		//库余额错误,以卡余额为准,但必须卡余额小于库余额
		//更新账户余额与卡余额一致
		trans.cardaftbal=trans.cardbefbal;
		tCardAccount.cardbal=  trans.cardaftbal;
		tCardAccount.availbal+=tCardAccount.subsidybal;
		tCardAccount.subsidybal=0;
		tCardAccount.dpscnt = trans.aftdpscnt;
		tCardAccount.paycnt = trans.aftpaycnt;
		strcpy(tCardAccount.transtime,trans.sysdatetime);
		ret=DB_t_account_update_lock_by_c0(&tCardAccount);
		if(ret)
		{
			return E_DB_ACCOUNT_U;
		}		
		//考虑消费流水丢失的情况,走长款处理
		trans.cardflag=0;//一定要设为无卡
		trans.transamt=D4U5(tCardAccount.availbal-trans.cardbefbal);
		trans.inputamt=trans.transamt;
		trans.unusedamt = trans.inputamt;
		trans.fundtype=0;
		des2src(trans.cardaccno,tCardAccount.accno);
		ats.trans.transtype=TRANSTYPE_MORE_CARDBALINCOME;
		ret=ats.DoTransByTransType();
		if(ret)
			return ret;
		if(ats.trans.unusedamt>0)
			return E_INPUT_AMT;
		if(ats.trans.unusedamt<0)
			return E_AMT_LACK;
	}
	else
	{
		if(amtcmp(tCardAccount.balance,0)<0)
		{
			ERRTIP("卡余额不能小于0,该卡账户余额为%.2lf",tCardAccount.balance);
			return E_COMMON_ERR;
		}
		//卡余额错误,把库余额写入卡余额
		//更新卡余额与账户余额一致
		tCardAccount.availbal+=tCardAccount.subsidybal;
		tCardAccount.subsidybal=0;
		tCardAccount.cardbal= tCardAccount.balance;
		trans.cardaftbal=tCardAccount.cardbal;
		if(amtcmp(trans.cardaftbal,trans.cardbefbal)>0)
		{
			tCardAccount.dpscnt=trans.dpscnt+1;
			transdtl.cardcnt = tCardAccount.dpscnt;
			transdtl.transflag = TF_DPS;
		}
		else if(amtcmp(trans.cardaftbal,trans.cardbefbal)<0)
		{
			tCardAccount.paycnt = trans.paycnt+1; 	
			transdtl.cardcnt=tCardAccount.paycnt;
			transdtl.transflag = TF_PAY;
			ret=UpdateCardBitmap(trans.cardno,transdtl.cardcnt,CARDBITMAPTYPE_SYS_ONLINE);
			if(ret)
				return ret;
		}
		strcpy(tCardAccount.transtime,trans.sysdatetime);
		ret=DB_t_account_update_lock_by_c0(&tCardAccount);
		if(ret)
		{
			return E_DB_ACCOUNT_U;
		}
	}
	ret=UpdAllUnGetSubsidy(trans.cardno);
	if(ret)
		return ret;
	des2src(transdtl.transdate,trans.transdate);
	des2src(transdtl.transtime,trans.transtime);
	des2src(transdtl.accdate,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.cardbefbal=trans.cardbefbal;	
	transdtl.cardaftbal=trans.cardaftbal;
	transdtl.managefee=trans.totalfeeamt;
	transdtl.amount=trans.totaltransamt;
	transdtl.custid=tCardAccount.custid;
	des2src(transdtl.custname,tCardAccount.accname);
	des2src(transdtl.opercode,trans.opercode);
	transdtl.status[0]=DTLSTATUS_SUCCESS;
	des2src(transdtl.showcardno,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;
	}	

	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_SMARKET_CODE2,F_SDATE0,
				F_LVOL0,F_STX_PWD,F_LVOL8,F_LVOL6,
				F_SORDER0,F_SEMP,F_LVOL11,F_LVOL12,
				F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_STIME3,F_SDATE3,0);	
	outPack->lvol1=customer.custid;
	outPack->lsafe_level2=customer.custtype;
	outPack->lvol5=tCard.feetype;
	strncpy(outPack->sall_name,customer.custname,8);
	des2src(outPack->spager,customer.stuempno);
	des2src(outPack->scert_no,customer.deptcode);
	des2src(outPack->smarket_code2,customer.idtype);
	des2src(outPack->semail2,customer.idno);
	des2src(outPack->smarket_code,customer.sex);
	des2src(outPack->sdate0,tCard.expiredate);
	outPack->lvol0=tCard.cardno;
	outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);
	outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0);
	outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0);
	outPack->lvol6=tCardAccount.paycnt;
//	outPack->lvol4=tCardAccount.subsidyno;
	des2src(outPack->sorder0,tCard.showcardno);
	des2src(outPack->sdate3,ats.trans.accdate);
	des2src(outPack->stime3,ats.trans.acctime);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=trans.termid;
	outPack->lserial1=trans.termseqno;
	des2src(outPack->vsmess,ats.remark.c_str());
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}
コード例 #4
0
ファイル: F846303.cpp プロジェクト: nykma/ykt4sungard
//无卡退卡
static int CardCloseWithoutCard(ST_PACK *rPack)
{
    //检查卡
    int ret=0;
    CAccTrans *pAccTrans=CAccTrans::getInstance();
    TRANS& trans=pAccTrans->trans;
    int ReturnForgift=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)
    {
        writelog(LOG_ERR,"cardno[%d]",trans.cardno);
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno);
        else
            return E_DB_CARD_R;
    }
    trans.cardtype=tCard.cardtype;
    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();
        ERRTIP("请先解冻后再销户");
        return ERRINFO(E_CARD_FREEZE,trans.cardno);
    }
    if('1'==tCard.badflag[0])
    {
        if((CARDBADFLAG_CARDBAL==tCard.badtype[0])||(CARDBADFLAG_ACCBAL==tCard.badtype[0]))
        {
            DB_t_card_free_lock_by_cur();
            ERRTIP("该卡余额错误,请使用坏卡修复功能处理,不可以直接退卡");
            return E_CARD_BAD_AND_NEED_UPDATE;
        }
    }
    //无卡只有挂失或卡物理损坏的情况下才可以退卡
    if(tCard.lossflag[0]!='1'&&
            tCard.badflag[0]!='1')
    {
        DB_t_card_free_lock_by_cur();
        ERRTIP("该卡状态正常,请先放卡再销户!");
        return E_COMMON_ERR;
    }
    if(tCard.badflag[0]=='1')
    {
        //检查卡是否到了销卡的时间
        /*
        T_t_badcardbook badcardbook;
        memset(&badcardbook,0,sizeof(badcardbook));
        ret=DB_t_badcardbook_read_by_cardno(trans.cardno,&badcardbook);
        if(ret)
        {
        	DB_t_card_free_lock_by_cur();
        	if(DB_NOTFOUND==ret)
        		return E_DB_BADCARDBOOK_N;
        	else
        		return E_DB_BADCARDBOOK_R;
        }
        */
        char enddate[9]= {0};
        ret=calcEndDate(tCard.baddate,pAccTrans->sysPara.iRenewCardDayCnt,enddate);
        if(ret)
        {
            DB_t_card_free_lock_by_cur();
            return ret;
        }
        if(strncmp(enddate,pAccTrans->trans.transdate,8)>0)
        {
            DB_t_card_free_lock_by_cur();
            return ERRINFO(E_BADCARD_RECORDDATE_NOTREACH,enddate);
        }
        if(tCard.badtype[0]!=CARDBADFLAG_MANMADE)
            ReturnForgift=1;
    }
    else if('1'==tCard.lossflag[0])
    {
        if(strlen(tCard.lossdate))
        {
            char enddate[9]= {0};
            ret=calcEndDate(tCard.lossdate,pAccTrans->sysPara.iRenewCardDayCnt,enddate);
            if(ret)
            {
                DB_t_card_free_lock_by_cur();
                return ret;
            }
            if(strncmp(enddate,pAccTrans->trans.transdate,8)>0)
            {
                DB_t_card_free_lock_by_cur();
                return ERRINFO(E_CARDLOSSDATE_NOREACH,enddate);
            }
        }
    }
    tCard.status[0]=STATUS_DELETE;
    ret=getCardVerNo(tCard.cardverno);
    if(ret)
    {
        DB_t_card_free_lock_by_cur();
        return ret;
    }
    strcpy(tCard.closedate,trans.transdate);
    des2src(tCard.lastsaved,trans.sysdatetime);
    ret=DB_t_card_update_lock_by_cur(&tCard);
    if(ret)
    {
        writelog(LOG_ERR,"cardno[%d]",tCard.cardno);
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_CARDNO,tCard.cardno);
        else
            return E_DB_CARD_U;
    }
    trans.custid=tCard.custid;
    trans.feetype=tCard.feetype;
    des2src(trans.showcardno,tCard.showcardno);

    T_t_customer tCustomer;

    memset(&tCustomer,0,sizeof(tCustomer));
    if(tCard.custid>0)
    {
        ret=DB_t_customer_read_lock_by_cur_and_custid(trans.custid,&tCustomer);
        if(ret)
        {
            if(DB_NOTFOUND==ret)
                return ERRINFO(E_NOTEXIST_CUSTOMER,trans.custid);
            else
                return E_DB_CUSTOMER_R;
        }
        if(tCustomer.holdcardcnt)
        {
            tCustomer.holdcardcnt--;
        }
        des2src(tCustomer.lastsaved,trans.sysdatetime);
        ret=DB_t_customer_update_lock_by_cur(&tCustomer);
        if(ret)
        {
            if(DB_NOTFOUND==ret)
                return ERRINFO(E_NOTEXIST_CUSTOMER,trans.custid);
            else
                return E_DB_CUSTOMER_U;
        }
        des2src(trans.custname,tCustomer.custname);
        des2src(trans.stuempno,tCustomer.stuempno);
    }
    ////添加卡版本号记录
    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.cardno=tCard.cardno;
    cardver.status[0]=STATUS_NORMAL;
    des2src(cardver.cardphyid,tCard.cardphyid);
    des2src(cardver.stuempno,trans.stuempno);
    cardver.cardvertype=CARDVERTYPE_CARDCLOSE;
    des2src(cardver.cardverno,tCard.cardverno);
    ret=DB_t_cardver_add(&cardver);
    if(ret)
    {
        if(DB_REPEAT==ret)
            return E_DB_CARDVER_E;
        else
            return E_DB_CARDVER_I;
    }
//检查补助信息
    //double cardbal=D4U5(trans.cardbefbal+subsidyamt);
    //读取帐户信息
    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;
    }
    if(tCardAccount.status[0]!=STATUS_NORMAL)
    {
        return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno);
    }
    ret=UpdAllUnGetSubsidy(trans.cardno);
    if(ret)
        return ret;
    strcpy(trans.cardaccno,tCardAccount.accno);
    //押金处理
    double returncashamt=0;
    if(tCardAccount.foregift>0)
    {
        trans.inputamt=tCardAccount.foregift;
        trans.unusedamt = trans.inputamt;
        trans.transamt=tCardAccount.foregift;
        trans.fundtype=0;//0表示从帐户扣
        //退押金
        if(ReturnForgift)
        {
            pAccTrans->trans.transtype=TRANSTYPE_RETURNFOREGIFT;
            returncashamt=tCardAccount.foregift;
        }
        else
        {
            pAccTrans->trans.transtype=TRANSTYPE_FOREGIFT2COSTFEE;
        }
        ret=pAccTrans->DoTransByTransType();
        if(ret)
            ret=pAccTrans->doTransEnd();
        if(ret)
            return ret;
    }
    if(amtcmp(tCardAccount.balance,0)<0)//处理负账户
    {
        trans.inputamt= - tCardAccount.balance;
        if(amtcmp(trans.inputamt,pAccTrans->sysPara.dAutoRenewAccMaxAmt)>0)
        {
            return ERRIF_CARDBAL_OVERDRAW;
        }
        trans.unusedamt = trans.inputamt;
        trans.transamt=trans.inputamt;
        trans.fundtype=0;//0表示从帐户扣
        //营业外支出
        pAccTrans->trans.transtype=TRANSTYPE_LESS_CARDBAL;
        ret=pAccTrans->DoTransByTransType();
        if(ret)
            return ret;
        ret=pAccTrans->doTransEnd();
        if(ret)
            return ret;
    }
    /*
    double ReturnCardBal=0;
    ReturnCardBal=D4U5(tCardAccount.cardbal+tCardAccount.subsidybal);
    if(amtcmp(tCardAccount.balance,ReturnCardBal)>0)
    {
    	if('C'==backcardtype)
    	{
    		//走长款处理
    		trans.transamt=D4U5(tCardAccount.balance-ReturnCardBal);
    		trans.inputamt=trans.transamt;
    		trans.unusedamt = trans.inputamt;
    		trans.fundtype=0;
    		pAccTrans->trans.transtype=TRANSTYPE_MORE_CARDBALINCOME;
    		ret=pAccTrans->DoTransByTransType();
    		if(ret)
    			return ret;
    		if(pAccTrans->trans.unusedamt>0)
    			return E_INPUT_AMT;
    		if(pAccTrans->trans.unusedamt<0)
    			return E_AMT_LACK;
    	}
    }
    */
    else
    {
        //下面退款按账户金额来退
        returncashamt = D4U5(returncashamt+tCardAccount.balance);
        trans.inputamt=tCardAccount.balance;
        trans.unusedamt = trans.inputamt;
        trans.feetype=tCard.feetype;
        /*
        if('1'==backfunctype)
        {
        	trans.fundtype=PAYTYPE_OUTLAY;
        	des2src(trans.voucherno,rPack->scust_auth2);
        }
        */
        ret=pAccTrans->doTrans();
        if(ret)
            return ret;
        ret=pAccTrans->doTransEnd();
        if(ret)
            return ret;
    }
    sprintf(trans.remark,"销户成功 %s 总共应退款%.2lf元",pAccTrans->remark.c_str(),returncashamt);
    return 0;
}