示例#1
0
static int doAccount(TRANS& trans)
{
    int ret=0;
    T_t_account tCardAccount;

    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 E_CARDACC_LOGOUT;
    }
    if(amtcmp(tCardAccount.balance,0)!=0)
    {
        writelog(LOG_ERR,"balance[%.2lf]",tCardAccount.balance);
        DB_t_account_free_lock_by_c0();
        return ERRINFO(E_CARDACC_BALANCE_NOZERO,tCardAccount.balance);
    }
    if(amtcmp(tCardAccount.foregift,0)!=0)
    {
        writelog(LOG_ERR,"foregift[%.2lf]",tCardAccount.foregift);
        DB_t_account_free_lock_by_c0();
        return ERRINFO(E_CARDACC_FOREGIFT_NOZERO,tCardAccount.foregift);
    }
    tCardAccount.status[0]=STATUS_DELETE;
    tCardAccount.lastcardbal=trans.cardbefbal;
    tCardAccount.lastpaycnt=trans.paycnt-1;
    tCardAccount.paycnt=trans.paycnt;
    tCardAccount.cardbal=0;
    tCardAccount.frozebal=0;
    tCardAccount.subsidybal=0;
    tCardAccount.availbal=0;
    strcpy(tCardAccount.closedate,trans.accdate);
    ret=DB_t_account_update_lock_by_c0(&tCardAccount);
    if(ret)
    {
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_CARDACCNO,tCardAccount.accno);
        else
            return E_DB_ACCOUNT_U;
    }
    return 0;
}
示例#2
0
static int doAccount(TRANS& trans,char *cardaccno)
{
	int ret=0;
	T_t_account tCardAccount;

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

	ret=DB_t_account_read_lock_by_c0_and_accno(cardaccno,&tCardAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,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.balance,0)!=0)
	{
		DB_t_account_free_lock_by_c0();
		return ERRINFO(E_CARDACC_BALANCE_NOZERO,tCardAccount.balance);
	}
	tCardAccount.availbal=0;
	tCardAccount.frozebal=0;
	tCardAccount.lastcardbal=0;
	ret=DB_t_account_update_lock_by_c0(&tCardAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,cardaccno);
		else
			return E_DB_ACCOUNT_U;
	}
	return 0;
}
int F846322(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) {
    int ret=0;
    CAccTrans *pAccTrans=CAccTrans::getInstance();
    TRANS& trans=pAccTrans->trans;
    des2src(pAccTrans->trans.opercode,rPack->semp);
    if(strlen(pAccTrans->trans.opercode)<1) {
        pAccTrans->trans.termid=rPack->lwithdraw_flag;
    }
    pAccTrans->trans.transcode=TC_CARDBALMOD;
    ret=pAccTrans->InitTrans();
    if(ret)
        return ret;

    des2src(pAccTrans->trans.chkopercode,rPack->semp_no);
    ret=chk_oper_pwd(pAccTrans->trans.chkopercode,rPack->scust_limit);
    if(ret)
        return ret;
    trans.cardflag=1;
    trans.usecardflag=1;
    trans.cardno=rPack->lvol0;
    pAccTrans->SetCardCntAndCardBal(rPack->lvol5,rPack->lvol6,rPack->lvol7);
    des2src(trans.cardphyid,rPack->sstation1);
    if(rPack->lbank_acc_type>0) {
        trans.transamt=rPack->damt0;
        trans.transflag=TF_DPS;
        trans.aftdpscnt++;
    } else {
        trans.transamt=-rPack->damt0;
        trans.transflag=TF_PAY;
        trans.aftpaycnt++;
    }
    if(amtcmp(trans.transamt,0)==0) {
        ERRTIP("调整金额不能为0");
        return E_COMMON_ERR;
    }
    trans.cardaftbal= D4U5(trans.cardbefbal+trans.transamt);
    T_t_card tCard;
    memset(&tCard,0,sizeof(tCard));
    ret=doCard(trans,tCard);
    if(ret) {
        return ret;
    }
    trans.feetype=tCard.feetype;
    trans.cardtype=tCard.cardtype;
    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(amtcmp(trans.cardbefbal,tCardAccount.availbal)==0) {
        DB_t_account_free_lock_by_c0();
        ERRTIP("该卡余额与账户余额一致,不需要调整");
        return E_COMMON_ERR;
    }
    if(amtcmp(trans.cardbefbal,tCardAccount.balance)==0) {
        DB_t_account_free_lock_by_c0();
        ERRTIP("该卡余额与账户余额一致,不需要调整");
        return E_COMMON_ERR;
    }
    if(amtcmp(trans.cardaftbal,tCardAccount.balance)>0) {
        DB_t_account_free_lock_by_c0();
        ERRTIP("调整后卡余额不能大于账户余额");
        return E_COMMON_ERR;
    }
    tCardAccount.dpscnt=trans.dpscnt;
    tCardAccount.paycnt=trans.paycnt;
    if(rPack->lbank_acc_type>0)
        tCardAccount.dpscnt=trans.aftdpscnt;
    if(rPack->lbank_acc_type<0)
        tCardAccount.paycnt=trans.aftpaycnt;
    tCardAccount.cardbal=trans.cardaftbal;
    strcpy(tCardAccount.transtime,trans.sysdatetime);
    ret=DB_t_account_update_lock_by_c0(&tCardAccount);
    if(ret) {
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_CARDACCNO,tCard.accno);
        else
            return E_DB_ACCOUNT_U;
    }
    trans.custid=tCard.custid;
    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.cardbefbal=trans.cardbefbal;
    transdtl.amount=trans.transamt;
    transdtl.managefee=trans.totalfeeamt;
    transdtl.cardaftbal=trans.cardaftbal;
    transdtl.custid=trans.custid;
    des2src(transdtl.opercode,trans.opercode);
    des2src(transdtl.showcardno,tCard.showcardno);
    GetCustBaseInfoByCustID(transdtl.custid,transdtl.custname,transdtl.stuempno,NULL);
    transdtl.status[0]=DTLSTATUS_SUCCESS;
    transdtl.transflag = trans.transflag;
    if(TF_DPS==transdtl.transflag) {
        transdtl.cardcnt=trans.aftdpscnt;
    } else {
        transdtl.cardcnt=trans.aftpaycnt;
        ret=UpdateCardBitmap(trans.cardno,transdtl.cardcnt,CARDBITMAPTYPE_SYS_ONLINE);
        if(ret)
            return ret;
    }
    ret=SaveCardTransInfo();
    if(ret) {
        writelog(LOG_ERR,"SaveCardTransInfo ret=%d",ret);
    }
    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,F_LVOL0,F_LVOL8,F_SDATE0,
           F_SDATE3,F_STIME3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,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;
}
示例#4
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;
}
示例#5
0
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;
    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;
//	if (!strlen(trans.showcardno))
//	    return E_INPUT_SHOWCARDNO;
    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.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.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]="";
        ret=calcEndDate(tCard.baddate,pAccTrans->sysPara.iPosdtlMaxDayCnt,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]="";
        ret=calcEndDate(tCard.lossdate,pAccTrans->sysPara.iPosdtlMaxDayCnt,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);
    getfmtsysdatetime(tCard.lastsaved);
    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.sysdate);
    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)
    {
        //使用新的显示卡号
        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,pAccTrans->trans.sysdate);
        des2src(carddtl.acctime,trans.systime);
        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.status[0]=STATUS_NORMAL;
    des2src(tNewCard.opendate,pAccTrans->trans.transdate);
    getfmtsysdatetime(tNewCard.lastsaved);
    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.sysdate);
    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.sysdate);
    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));
    memset(tCardBitmap.bitmap1,'0',sizeof(tCardBitmap.bitmap1));
    memset(tCardBitmap.bitmap2,'0',sizeof(tCardBitmap.bitmap2));
    memset(tCardBitmap.bitmap3,'0',sizeof(tCardBitmap.bitmap3));
    memset(tCardBitmap.bitmap4,'0',sizeof(tCardBitmap.bitmap4));
    memset(tCardBitmap.bitmap5,'0',sizeof(tCardBitmap.bitmap5));
    memset(tCardBitmap.bitmap6,'0',sizeof(tCardBitmap.bitmap6));
    memset(tCardBitmap.bitmap7,'0',sizeof(tCardBitmap.bitmap7));
    memset(tCardBitmap.bitmap8,'0',sizeof(tCardBitmap.bitmap8));
    memset(tCardBitmap.bitmap9,'0',sizeof(tCardBitmap.bitmap9));
    tCardBitmap.bitmap0[0]=CARDBITMAPTYPE_INC;
    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_cardno_and_purseno(trans.cardno,trans.purseno,&tCardAccount);
    if(ret)
    {
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_CARDNO_PURSENO_NOACCNO,trans.cardno,trans.purseno);
        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 = GetSubsidy(tCard.cardno,tCardAccount.subsidyno,0,subsidyamt,maxsubsidyno);
    if(ret)
    {
        writelog(LOG_ERR,"DoGetSubsidy ret=[%d]",ret);
        return ret;
    }
    strcpy(trans.cardaccno,tCardAccount.accno);
    //押金处理
//	double returncashamt=0;
    if(freefeeflag)
    {
        pAccTrans->SetFreeFlag();
    }
    else
    {
        //扣押金
        if(amtcmp(tCardAccount.foregift,0)>0)
        {
            trans.transamt=tCardAccount.foregift;
            trans.inputamt=tCardAccount.foregift;
            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.availbal,tCardAccount.lastcardbal)<=0)
        trans.cardbefbal=D4U5(tCardAccount.availbal+tCardAccount.subsidybal);
    else
        trans.cardbefbal=D4U5(tCardAccount.lastcardbal+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-tCardAccount.frozebal,trans.cardbefbal)>0)
    {
        //走长款处理
        trans.transamt=D4U5(tCardAccount.balance-tCardAccount.frozebal-trans.cardbefbal);
        trans.inputamt=trans.transamt;
        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.cardcnt=1;
    trans.inputamt=rPack->damt0;
    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);
    }
    //取可用余额作为出卡值
    trans.cardaftbal=tCardAccount.availbal;
    if(amtcmp(trans.cardaftbal,0)<0)
    {
        DB_t_account_free_lock_by_c0();
        return ERRINFO(E_CARD_BALANCE_SHORTAGE,trans.cardaftbal);
    }
    if(amtcmp(trans.cardaftbal,tCardAccount.cardmaxbal)>=0)
    {
        DB_t_account_free_lock_by_c0();
        return ERRINFO(E_AMT_EXCEED_MAX,tCardAccount.cardmaxbal);
    }
    tCardAccount.cardno=tNewCard.cardno;
    tCardAccount.lastcardcnt=1;
    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.sysdate);
    strcpy(transdtl.acctime,trans.systime);
    transdtl.amount=trans.totaltransamt;
    transdtl.managefee=trans.totalfeeamt;
    transdtl.cardno=tNewCard.cardno;
    transdtl.cardcnt=trans.cardcnt;
    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);
    transdtl.showcardno=atol(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_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_LVOL11,F_LVOL12,
           F_SORDER0,F_SDATE3,F_SEMP,
           F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);
    outPack->lvol1=tNewCard.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->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);
    des2src(outPack->sdate3,pAccTrans->trans.sysdate);
    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;
}
示例#6
0
static int doReverse(char* oldaccdate,int oldtermid,int oldtermseqno,char *cardphyid)
{
	//查找操作员流水
	int ret=0;
	T_t_card tCard;
	
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;

	trans.revflag=1;//冲正标志

	char transdtlname[61]={0};
	ret=GetTransdtlTableName(oldaccdate,transdtlname);
	if(ret)
	{
		writelog(LOG_ERR,"GetTransdtlTableName err");
		return ret;
	}
	T_t_transdtl transdtl;
	
	ret=ReadTransdtlData(transdtlname,oldaccdate,oldtermid,oldtermseqno,transdtl);
	if(ret)
	{
		writelog(LOG_ERR,"ReadTransdtlData transdtlname[%s],oldaccdate[%s],oldtermid[%d],oldtermseqno[%d]",transdtlname,oldaccdate,oldtermid,oldtermseqno);
		return ret;
	}
	trans.cardno=transdtl.cardno;
	if('1'==transdtl.revflag[0])
	{
		memset(&tCard,0,sizeof(tCard));
		ret=DB_t_card_read_by_cardno(transdtl.cardno,&tCard);
		if(ret)
		{
			writelog(LOG_ERR,"cardno[%d]",transdtl.cardno);
			if(DB_NOTFOUND==ret)
				return ERRINFO(E_NOTEXIST_CARDNO,tCard.cardno);
			else 
				return E_DB_CARD_R;
		}		
		pAccTrans->remark="该交易已冲正";
		strcpy(cardphyid,tCard.cardphyid);
		return 0;
	}	
	if(transdtl.cardcnt>0&&transdtl.cardno>0)
	{
		ret=UpdateCardBitmap(transdtl.cardno,transdtl.cardcnt,CARDBITMAPTYPE_REV);
		if(ret)
			return ret;
	}
	if(strlen(transdtl.opercode))
	{
		if(strcmp(transdtl.opercode,pAccTrans->trans.opercode)!=0)
		{
			return ERRINFO(E_REVOPER,transdtl.opercode);
		}
	}
	else
	{
		des2src(transdtl.opercode,trans.opercode);
	}
	ret=UpdateTransdtlHisRevFlag(transdtlname,oldaccdate,oldtermid,oldtermseqno);
	if(ret)
	{
		writelog(LOG_ERR,"UpdateTransdtlRevFlag ret[%d] transdtlname[%s]accdate[%s]termid[%d]termseqno[%d]",ret,transdtlname,oldaccdate,oldtermid,oldtermseqno);
		return ret;
	}
	transdtl.termid=trans.termid;
	transdtl.termseqno=trans.termseqno;
	strcpy(transdtl.accdate,trans.accdate);
	strcpy(transdtl.acctime,trans.acctime);
	des2src(transdtl.transdate,trans.transdate);
	des2src(transdtl.transtime,trans.transtime);
	des2src(transdtl.opercode,trans.opercode);
	transdtl.transcode=TC_CARDOPENREV;
	transdtl.cardcnt=trans.paycnt;
	transdtl.cardbefbal=trans.cardbefbal;
	transdtl.cardaftbal=0;
	transdtl.amount=-transdtl.amount;
	if(amtcmp(trans.cardbefbal,0)>0)
	{	
		transdtl.transflag=TF_PAY;
		transdtl.cardcnt=trans.paycnt;
	}
	transdtl.managefee=-transdtl.managefee;
	transdtl.revflag[0]=0;
	ret=DB_t_transdtl_add(&transdtl);
	if(ret)
	{
		if(DB_REPEAT==ret)
			return E_DB_TRANSDTL_E;
		else
			return E_DB_TRANSDTL_I;
	}
	memset(&tCard,0,sizeof(tCard));
	ret=DB_t_card_read_lock_by_cur_and_cardno(transdtl.cardno,&tCard);
	if(ret)
	{
		writelog(LOG_ERR,"cardno[%d]",transdtl.cardno);
		if(DB_NOTFOUND==ret)
			return E_DB_CARD_N;
		else 
			return E_DB_CARD_R;
	}
	if(tCard.status[0]!=STATUS_NORMAL)
	{
		DB_t_card_free_lock_by_cur();
		return ERRINFO(E_CARD_LOGOUT,transdtl.cardno);
	}	
	if('1'==tCard.frozeflag[0])
	{
		DB_t_card_free_lock_by_cur();
		return ERRINFO(E_CARD_FREEZE,transdtl.cardno);
	}
	if('1'==tCard.lossflag[0])
	{
		DB_t_card_free_lock_by_cur();
		return ERRINFO(E_CARD_LOST,transdtl.cardno);
	}	
	if('1'==tCard.badflag[0])
	{
		DB_t_card_free_lock_by_cur();
		return ERRINFO(E_CARD_BADRECORD,transdtl.cardno);
	}	
	ret=getCardVerNo(tCard.cardverno);
	if(ret)
	{
		DB_t_card_free_lock_by_cur();
		return ret;
	}
	tCard.status[0]=STATUS_DELETE;
	strcpy(cardphyid,tCard.cardphyid);
	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 E_DB_CARD_N;
		else 
			return E_DB_CARD_U;
	}	
	T_t_customer tCustomer;
	
	memset(&tCustomer,0,sizeof(tCustomer));
	//检查客户
	if(tCard.custid)
	{
		ret=DB_t_customer_read_lock_by_cur_and_custid(tCard.custid,&tCustomer);
		if(ret)
		{
			writelog(LOG_ERR,"custid[%d]",tCard.custid);
			if(DB_NOTFOUND==ret)
				return E_DB_CUSTOMER_N;
			else 
				return E_DB_CUSTOMER_R;
		}
		if(tCustomer.status[0]!=STATUS_NORMAL)

		{
			DB_t_customer_free_lock_cur();
			return E_CUSTOMER_LOGOUT;		
		}
		tCustomer.holdcardcnt--;
		des2src(tCustomer.lastsaved,trans.sysdatetime);
		ret=DB_t_customer_update_lock_by_cur(&tCustomer);
		if(ret)
		{
			writelog(LOG_ERR,"custid[%d]",tCard.custid);
			if(DB_NOTFOUND==ret)
				return E_DB_CUSTOMER_N;
			else 
				return E_DB_CUSTOMER_U;
		}
		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,tCustomer.stuempno);
	cardver.cardvertype=CARDVERTYPE_CARDCLOSE;	
	des2src(cardver.cardverno,tCard.cardverno);
	ret=DB_t_cardver_add(&cardver);
	if(ret)
	{
		writelog(LOG_ERR,"cardverno[%s]",cardver.cardverno);
		if(DB_REPEAT==ret)
			return E_DB_CARDVER_E;
		else
			return E_DB_CARDVER_I;
	}
	if(pAccTrans->sysPara.bEnableCardMgr)
	{
		ret=UseShowCardNoRev(tCard.showcardno);
		if(ret)
			return ret;
		trans.cardno=tCard.cardno;
		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_GET;
		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_cardbook tCardBook;

	memset(&tCardBook,0,sizeof(tCardBook));
	ret=getCardBookRecordNo(tCardBook.recordno);
	if(ret)
		return ret;
	tCardBook.cardtype=tCard.cardtype;
//	strcpy(tCardBook.curno,tCard.showcardno);
//	strcpy(tCardBook.startno,tCard.showcardno);
//	strcpy(tCardBook.endno,tCard.showcardno);	
////	tCardBook.usedcnt=0;
//	tCardBook.unusedcnt=1;
	tCardBook.status[0]=STATUS_NORMAL;
	strcpy(tCardBook.opercode,trans.opercode);
	ret=DB_t_cardbook_add(&tCardBook);
	if(ret)
	{
		if(DB_REPEAT==ret)
			return E_DB_CARDBOOK_E;
		else
			return E_DB_CARDBOOK_I;
	}
	//添加卡片回收明细记录
	T_t_carddtl tCarddtl;
	
	memset(&tCarddtl,0,sizeof(tCarddtl));

	des2src(tCarddtl.accdate,pAccTrans->sysPara.sSettleDate);
	tCarddtl.termid=trans.termid;
	tCarddtl.termseqno=trans.termseqno;
	tCarddtl.cardtype=tCard.cardtype;
	des2src(tCarddtl.showcardno,tCard.showcardno);
	des2src(tCarddtl.cardphyid,tCard.cardphyid);
	tCarddtl.cardusetype=CARDUSETYPE_REUSE;
	des2src(tCarddtl.opercode,trans.opercode);
	ret=DB_t_carddtl_add(&tCarddtl);
	if(ret)
	{
		if(DB_REPEAT==ret)
			return E_DB_CARDDTL_E;
		else
			return E_DB_CARDDTL_I;
	}
	*/
	//删除卡交易位图数据
	/*
	ret=DB_t_cardbitmap_del_by_cardno(tCard.cardno);
	if(ret)
	{
		writelog(LOG_ERR,"cardno[%d]",trans.cardno);		
		return E_DB_CARDBITMAP_D;
	}
	*/
	T_t_account tCardAccount;

	memset(&tCardAccount,0,sizeof(tCardAccount));
	ret=DB_t_account_read_by_accno(tCard.accno,&tCardAccount);
	if(ret)
	{
		writelog(LOG_ERR,"transdtl.cardno[%d],transdtl.purseno[%d]",transdtl.cardno,transdtl.purseno);
		if(DB_NOTFOUND==ret)
			return E_NOTEXIST_CARDACCNO;
		else
			return E_DB_ACCOUNT_R;
	}
	if(tCardAccount.status[0]!=STATUS_NORMAL)
	{
		return E_CARDACC_LOGOUT;
	}
	des2src(trans.cardaccno,tCardAccount.accno);
	ret=pAccTrans->doHistoryReverseTrans(oldaccdate,oldtermid,oldtermseqno);	
	if(ret)
	{
		if(E_DB_ACCDTL_N!=ret)
			return ret;
	}
	//注销帐户
	memset(&tCardAccount,0,sizeof(tCardAccount));

	ret=DB_t_account_read_lock_by_c0_and_accno(tCard.accno,&tCardAccount);
	if(ret)
	{
		writelog(LOG_ERR,"transdtl.cardno[%d],transdtl.purseno[%d]",transdtl.cardno,transdtl.purseno);
		if(DB_NOTFOUND==ret)
			return E_NOTEXIST_CARDACCNO;
		else
			return E_DB_ACCOUNT_R;
	}
	if(tCardAccount.status[0]!=STATUS_NORMAL)
	{
		DB_t_account_free_lock_by_c0();
		return E_CARDACC_LOGOUT;
	}
	if(amtcmp(tCardAccount.balance,0)!=0)
	{
		writelog(LOG_ERR,"balance[%.2lf]",tCardAccount.balance);
		DB_t_account_free_lock_by_c0();
		return E_CARDACC_BALANCE_NOZERO;
	}
	if(amtcmp(tCardAccount.foregift,0)!=0)
	{
		writelog(LOG_ERR,"foregift[%.2lf]",tCardAccount.foregift);
		DB_t_account_free_lock_by_c0();
		return E_CARDACC_FOREGIFT_NOZERO;
	}
	tCardAccount.status[0]=STATUS_DELETE;
	tCardAccount.cardbal=0;
	strcpy(tCardAccount.closedate,trans.transdate);
	ret=DB_t_account_update_lock_by_c0(&tCardAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_NOTEXIST_CARDACCNO;
		else 
			return E_DB_ACCOUNT_U;

	}
	return 0;
}
示例#7
0
static int NormalTrans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);

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

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

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

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

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

	T_t_account InAccount;
	memset(&InAccount,0,sizeof(InAccount));
	ret=DB_t_account_read_lock_by_c0_and_accno(tInCard.accno,&InAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_CARDACCNO,tInCard.accno);
		else
			return E_DB_ACCOUNT_R;
	}
	InAccount.dpscnt=transdtl2.cardcnt;
	InAccount.cardbal=transdtl2.cardaftbal;
	InAccount.lastdpscnt=transdtl2.cardcnt-1;
	InAccount.lastcardbal=transdtl2.cardbefbal;
	strcpy(InAccount.lastaccdate,transdtl2.transdate);
	ret=DB_t_account_update_lock_by_c0(&InAccount);
	if(ret)
	{
		writelog(LOG_ERR,"更新收款方账户表错误ret=%d",ret);
		return E_DB_ACCOUNT_U;
	}
	outPack->lvol0=transdtl.cardno;
	outPack->lvol2=transdtl2.cardno;
	outPack->lvol1=D4U5(transdtl.amount*100,0);
	outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);	
	outPack->lsafe_level2=D4U5(transdtl2.cardaftbal*100,0);
	des2src(outPack->sdate3,trans.accdate);
	des2src(outPack->stime3,trans.acctime);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=transdtl.termid;
	outPack->lserial1=transdtl.termseqno;
	des2src(outPack->sphone3,transdtl.refno);
	des2src(outPack->vsmess,trans.remark);
	
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}
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;
}
int UpdCardBaseInfo(TRUSERID *handle,ST_PACK *rPack,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_by_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)
	{
		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);
	}	
	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_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_ACCNO,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(amtcmp(rPack->damt11,0)>=0)
	{
		tCardAccount.singlemaxamt=rPack->damt11;
		if(amtcmp(tCardAccount.singlemaxamt,500)>0)
		{
			DB_t_account_free_lock_by_c0();
			ERRTIP("单次消费限额不能超过500元");
			return E_COMMON_ERR;
		}
	}
	if(amtcmp(rPack->damt12,0)>=0)
	{
		tCardAccount.daycostmaxamt=rPack->damt12;
		if(amtcmp(tCardAccount.daycostmaxamt,10000)>0)
		{
			DB_t_account_free_lock_by_c0();
			ERRTIP("日累计消费限额不能超过10000元");
			return E_COMMON_ERR;
		}
	}
	ret=DB_t_account_update_lock_by_c0(&tCardAccount);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_CARDNO_PURSENO_NOACCNO,trans.cardno,trans.purseno);
		else 
			return E_DB_ACCOUNT_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.cardbefbal=trans.cardbefbal;	

//	transdtl.cardcnt=trans.cardcnt;
	transdtl.cardaftbal=trans.cardbefbal;		

	transdtl.managefee=trans.totalfeeamt;
	transdtl.amount=trans.totaltransamt;
	transdtl.custid=trans.custid;
	des2src(transdtl.custname,customer.custname);
	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_LVOL6,
           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_SEMP,
           F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_STIME3,0);
    outPack->lvol1=customer.custid;
    outPack->lsafe_level2=customer.custtype;
    outPack->lvol5=tCard.feetype;
    des2src(outPack->sall_name,customer.custname);
    des2src(outPack->spager,customer.stuempno);
	des2src(outPack->smarket_code2,customer.idtype);
    des2src(outPack->scert_no,customer.deptcode);
    des2src(outPack->semail2,customer.idno);
	des2src(outPack->smarket_code,customer.sex);
    des2src(outPack->sdate0,tCard.expiredate);
    outPack->lvol0=tCard.cardno;
//    des2src(outPack->stx_pwd,cardpwd);	
    des2src(outPack->sorder0,tCard.showcardno);	
	strcpy(outPack->snote,CARD_STRUCT_VERSION);				//制卡版本号
	strcpy(outPack->sorder1,CARD_REGISTER_PUBLISH_CODE);	//发卡注册标识号
	strcpy(outPack->sorder2,CARD_REGISTER_SERVICE_CODE);	//服务注册标识号
    outPack->lvol8=D4U5(ats.trans.cardaftbal*100,0);
    outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0);
    outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0);
	sprintf(outPack->sholder_ac_no,"%d",customer.custid);	//客户号
	des2src(outPack->sstat_type,customer.idtype);			//证件类型
	des2src(outPack->snation_code,customer.country);		//国籍
	des2src(outPack->sstat_type2,customer.nation);	//民族
	des2src(outPack->sbranch_code0,customer.areacode);		//院校代码	
    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;
	outPack->lvol0=tCard.cardno;
	outPack->lvol6=tCardAccount.paycnt;
//	outPack->lvol4=tCardAccount.subsidyno;
	des2src(outPack->vsmess,"更新卡信息成功");
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}