Esempio n. 1
0
int F820522(TRUSERID * handle, int iRequest, ST_PACK * in_pack, int *pRetCode, char *szMsg)
{
	int ret;

	CAccTrans& ats=CAccTrans::GetInst();
	ret=ats.Reset();
	if(ret)
		return ret;
	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);
	ResetNormalCPack(&aPack, 0, 1);
	SetCol(handle, F_VSMESS, F_SDATE0, F_SDATE1, F_SDATE2, F_SDATE3, F_SSTATUS0, F_STIME0, 0);
	sprintf(out_pack->sdate0,"%d",ats.hostdate);
	sprintf(out_pack->stime0,"%06d",ats.hosttime);
	sprintf(out_pack->sdate1,"%d",ats.settledate);
	calcEndDate(out_pack->sdate1,-1,out_pack->sdate2);
	calcEndDate(out_pack->sdate1,1,out_pack->sdate3);
	PutRow(handle, out_pack, pRetCode, szMsg);
	return 0;
}
Esempio n. 2
0
static int doCard(TRANS& trans,T_t_card& tCard)
{

	int ret=0;

	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);
	}	
		//比较卡物理ID是否相同
	if(strcmp(tCard.cardphyid,trans.cardphyid)!=0)
	{
		writelog(LOG_ERR,"db cardphyid[%s],input cardphyid[%s]",tCard.cardphyid,trans.cardphyid);
		DB_t_card_free_lock_by_cur();
		return ERRINFO(E_CARD_PHYNO_DIFFER,trans.cardphyid,tCard.cardphyid);
	}
	//回收卡
	T_t_cardtype tCardType;

	memset(&tCardType,0,sizeof(tCardType));
		
	ret=DB_t_cardtype_read_by_cardtype(tCard.cardtype,&tCardType);
	if(tCardType.recycleable[0]!='1')
	{
		DB_t_card_free_lock_by_cur();
		return	ERRINFO(E_CARDTYPE_CANNOT_REUSE,tCardType.cardtype);
	}
	if(tCardType.fixdaycnt<1)
	{
		DB_t_card_free_lock_by_cur();		
		return ERRINFO(E_NOSET_CARDTYPE_VALIDDAYS,tCardType.cardtype);
	}
	ret=calcEndDate(trans.transdate,tCardType.fixdaycnt,tCard.expiredate);
	if(ret)
	{
		DB_t_card_free_lock_by_cur();		
		return ret;
	}
	char cardpwd[33]="";
	char key[17]="";
	get_init_passwd_by_man_id("",cardpwd);
	strcpy(key,STATIC_SEED_KEY);
	EncodePwd(key,cardpwd,tCard.cardpwd, 0);
//	memset(tCard.cardstatus,'0',sizeof(tCard.cardstatus));
	des2src(tCard.lastsaved,trans.sysdatetime);

	ret=DB_t_card_update_lock_by_cur(&tCard);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return E_DB_CARD_N;
		else 
			return E_DB_CARD_U;
	}
	//用来输出卡密码
	strcpy(tCard.cardpwd,cardpwd);
	/*
	//添加卡片回收明细记录
	T_t_carddtl tCarddtl;
	
	memset(&tCarddtl,0,sizeof(tCarddtl));
	/////////////////////////////////rPack2TableStuct////////////////////////
	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_RETURNCARD;
	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;
	}
	*/
	return 0;
}
Esempio n. 3
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;
}
Esempio n. 4
0
static int AddCard(T_t_customer& tCustomer,T_t_card& tCard)
{
    //检查卡是否已经使用
    int ret=0;
    char sysdate[9];
    getsysdate(sysdate);

    tCard.status[0]=STATUS_NORMAL;
    ret=DB_t_card_read_by_cardphyid_and_status(tCard.cardphyid,tCard.status,&tCard);
    if(ret!=DB_NOTFOUND)
    {
        if(DB_SUCCESS==ret)
            return E_CARDPHYID_EXIST;
        else
            return E_DB_CARD_R;
    }
    ret=DB_t_card_read_by_showcardno_and_status(tCard.showcardno,tCard.status,&tCard);
    if(ret!=DB_NOTFOUND)
    {
        if(DB_SUCCESS==ret)
            return E_SHOWCARDNO_EXIST;
        else
            return E_DB_CARD_R;
    }
    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 E_DB_CARDTYPE_N;
        else
            return E_DB_CARDTYPE_R;
    }
    //判断到期日期
    if(strlen(tCard.expiredate)<1)
    {
        ret=IsInvalidDateTime(tCustomer.outdate,"YYYYMMDD");
        if(ret==0)
        {
            if(strncmp(tCustomer.outdate,sysdate,8)>0)
            {

                des2src(tCard.expiredate,tCustomer.outdate);
            }
        }
        else
        {

            if(tCardtype.validdays<1)
                return E_NOSET_CARDTYPE_VALIDDAYS;
            ret=calcEndDate(sysdate,tCardtype.validdays,tCard.expiredate);
            if(ret)
                return ret;
        }
    }
    else
    {
        ret=IsInvalidDateTime(tCard.expiredate,"YYYYMMDD");
        if(ret)
            return E_INPUT_EXPIREDATE;
        if(strncmp(tCard.expiredate,sysdate,8)<0)
            return E_INPUT_EXPIREDATE;
    }
    tCard.custid=tCustomer.custid;
    des2src(tCard.stuempno,tCustomer.stuempno);
    memset(tCard.cardattr,'0',sizeof(tCard.cardattr));
    des2src(tCard.opendate,sysdate);
    getfmtsysdatetime(tCard.lastsaved);
    ret = getNewUniqNo(KEYTYPE_CARDNO,&tCard.cardno);	//获取最大卡号
    if(ret)
    {
        return ret;
    }
    ret=DB_t_card_add(&tCard);
    if(ret)
    {
        if(DB_REPEAT==ret)
            return E_DB_CARD_E;
        else
            return E_DB_CARD_I;
    }
    return 0;
}
Esempio n. 5
0
static int check(int cardno,T_t_customer& tCustomer,T_t_card& tCard)
{
    int ret=0;

    ret=DB_t_card_read_by_cardno(cardno,&tCard);
    if(ret)
    {
        if(DB_NOTFOUND==ret)
            return E_CARDNO_NOT_EXIST;
        else
            return E_DB_CARD_R;
    }
    if(tCard.cardattr[CARDSTAT_TYPE_FREEZE]=='1')
    {
        return E_REWCARD_CARDFROZE;
    }
    if((tCard.cardattr[CARDSTAT_TYPE_LOST]!='1')&&(tCard.cardattr[CARDSTAT_TYPE_BAD]!='1'))
    {
        return E_REWCARD_CARDSTATUS;

    }
    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 E_DB_CARDTYPE_N;
        else
            return E_DB_CARDTYPE_R;
    }
    if(tCardtype.renewable[0]!='1')
    {
        return E_CARD_CANNOT_RENEW;
    }
    if(tCard.custid)
    {
        ret=DB_t_customer_read_by_custid(tCard.custid,&tCustomer);
        if(ret)
        {
            if(DB_NOTFOUND==ret)
                return E_CUSTOMER_NOT_EXIST;
            else
                return E_DB_CUSTOMER_R;
        }
        if(tCustomer.status[0]=='2')
        {
            return E_CUSTOMER_LOGOUT;
        }
        if(tCustomer.feetype<1)
        {
            return E_NOSET_CUSTOMER_FEETYPE;
        }
    }
    char lossexpiredate[9]="";
    char sysdate[9]="";
    char sDays[10]="";
    ret=getParaVal(GLOBE_RENEWCARDDATE,sDays);
    if(ret)
        return ret;
    int days=atoi(sDays);

    ret=calcEndDate(tCard.lossdate,days,lossexpiredate);
    if(ret)
        return ret;
    getsysdate(sysdate);
    if(strcmp(sysdate,lossexpiredate)<0)
    {
        return E_CARDLOSSDATE_NOREACH;
    }
    return 0;
}
Esempio n. 6
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;
}
Esempio n. 7
0
//无卡退卡
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;
}