Exemple #1
0
int F950052(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
    int ret =0;
    //writelog(LOG_INFO,"start pos deposit");
    cpu_trade_t cpu_trade;
    CAccTrans *pAccTrans=CAccTrans::getInstance();
    TRANS& trans=pAccTrans->trans;
    ret=pAccTrans->CheckCfgUpdate();
    if(ret)
        return ret;
    T_t_authcard tAuthCard;
    T_t_transdtl transdtl;
    T_t_depositoper   tDepositOper;
    T_t_depositoperpos tDepositOperpos;
    T_t_depositshoppos tDepositShoppos;
    T_t_shop 					tDepositShop;
    T_t_account	tAccount;		//帐户表
    T_t_device tDevice;

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

    memset(&tAuthCard,0,sizeof(tAuthCard));
    memset(&tDepositOper,0,sizeof(tDepositOper));
    memset(&tDepositOperpos,0,sizeof(tDepositOperpos));
    memset(&tDepositShoppos,0,sizeof(tDepositShoppos));
    memset(&tDepositShop,0,sizeof(tDepositShop));
    memset(&tAccount,0,sizeof(tAccount));
    memset(&transdtl,0,sizeof(transdtl));
    int opercardno=rPack->lvol3;			//操作员号
    if(!opercardno)
        return E_INPUTNULL_CARDNO;
    trans.cardflag=1;
    trans.usecardflag=1;
    trans.cardno=rPack->lvol5;
    trans.purseno=PURSE_NO_ONE;
    trans.cardbefbal=rPack->lvol9/100.0;				//入卡金额
    trans.cardcnt= rPack->lvol7;					//入卡金额
    trans.inputamt= rPack->lvol8/100.0;			//充值金额
    trans.fundtype=1;
    transdtl.sysid= rPack->lcert_code;						//上传工作站标识(前置机注册号)
    des2src(transdtl.devphyid, rPack->sdate1);		//物理设备ID
    transdtl.devseqno=rPack->lvol4;					//上传端流水号
    ret=GetDevIdByDevPhyId(&(trans.termid),transdtl.devphyid);
    if (ret)
    {
        writelog(LOG_ERR,"GetDevIdByDevPhyId err[%d] devphy999_id[%s]",ret,transdtl.devphyid);
        return ret;
    }
    ret = DB_t_device_read_by_deviceid(trans.termid,&tDevice);
    if(ret)
    {
        writelog(LOG_ERR," DB_t_device_read_by_deviceid err[%d]",ret);
        return E_DB_DEVICE_R;
    }

    //writelog(LOG_DEBUG,"trans.inputamt[%d]",trans.inputamt);
    T_t_card tCard;
    memset(&tCard,0,sizeof(tCard));
    ret=doCard(trans,tCard);
    if(ret)
    {
        return ret;
    }
    memset(&cpu_trade,0,sizeof cpu_trade);
    cpu_trade.random_key = atoi(rPack->sstock_code);
    cpu_trade.tradeamt = rPack->lvol8;
    cpu_trade.balance = rPack->lvol9;
    cpu_trade.termsno = rPack->lvol4;
    cpu_trade.termid = tDevice.deviceno; // 终端号
    cpu_trade.tradecnt = trans.cardcnt;
    sprintf(cpu_trade.tx_datetime,"%s%s",rPack->spost_code,rPack->spost_code2);

    ret = doCheckMac(&cpu_trade,NULL,out_pack->sstock_code2);
    if(ret)
    {
        writelog(LOG_ERR,"doCheckMac err[%d]",ret);
        return ret;
    }

    trans.feetype=tCard.feetype;
    trans.cardtype=tCard.cardtype;
    ret=UpdateCardBitmap(trans.cardno,trans.cardcnt,CARDBITMAPTYPE_INC,0);
    if(ret)
        return ret;
    // 读取操作员号
    ret = DB_t_authcard_read_by_cardno(opercardno,&tAuthCard);
    if(ret)
    {
        writelog(LOG_ERR,"get operator code from auth card error, auth_card_id[%d]",opercardno);
        if(DB_NOTFOUND == ret)
            return E_DB_AUTHCARD_N;
        else
            return  E_DB_OPERATOR_R;
    }
    if(tAuthCard.status[0]!=STATUS_NORMAL)
    {
        return E_OPERLOGON_UNREG;
    }
    des2src(trans.opercode,tAuthCard.opercode);
    ret=DB_t_depositoper_read_lock_by_c0_and_opercode(trans.opercode,&tDepositOper);
    if(ret)
    {
        if(DB_NOTFOUND==ret)
            return E_DB_DEPOSITOPER_R;
        else
            return E_DB_DEPOSITOPER_N;
    }
    if(tDepositOper.status[0]!=STATUS_NORMAL)
    {
        DB_t_depositoper_free_lock_by_c0();
        return E_DEPOSITOPER_STOP;
    }
    //判断是否是重复交易
    if(tDepositOper.lastdevseqno==transdtl.devseqno)
    {
        DB_t_depositoper_free_lock_by_c0();
        ret=DB_t_transdtl_read_by_transdate_and_devphyid_and_devseqno(
                trans.transdate,tDepositOper.lastdevphyid,tDepositOper.lastdevseqno,
                &transdtl);
        if(ret)
        {
            if(DB_NOTFOUND==ret)
                return E_DB_TRANSDTL_N;
            else
                return E_DB_TRANSDTL_R;
        }
        //if(transdtl.revflag[0]=='1')
        //	return E_TRANSDTL_REV;
        ResetNormalCPack(&aPack,0,1);
        SetCol(handle,0);
        SetCol(handle,F_LVOL5,F_LVOL10,F_LCERT_CODE,0);

        out_pack->lvol5 = transdtl.cardno;
        out_pack->lvol10 = (int)D4U5(transdtl.cardaftbal*100,0);
        out_pack->lcert_code = transdtl.termseqno;
        writelog(LOG_INFO,"该交易已成功,卡号[%d]充值金额[%.2lf]卡余额[%.2lf]",transdtl.cardno,
                 transdtl.amount,transdtl.cardaftbal);
        PutRow(handle,out_pack,pRetCode,szMsg);
        return 0;
    }
    if(strncmp(tDepositOper.lasttransdate,trans.transdate,8)!=0)
    {
        des2src(tDepositOper.lasttransdate,trans.transdate);
        tDepositOper.depositcnt=0;
        tDepositOper.depositamt=0;
    }
    tDepositOper.depositcnt++;
    tDepositOper.depositamt+=trans.inputamt;
    tDepositOper.lastdevseqno=transdtl.devseqno;
    des2src(tDepositOper.lastdevphyid,transdtl.devphyid);
    getfmtsysdatetime(tDepositOper.lastsaved);
    if(amtcmp(tDepositOper.maxdepositamt,0)>0)
    {
        DB_t_depositoper_free_lock_by_c0();
        if(amtcmp(tDepositOper.depositamt,tDepositOper.maxdepositamt)>0)
        {
            return E_OPER_OVER_MAX_DEPOSIT_AMT;
        }
    }
    ret=DB_t_depositoper_update_lock_by_c0(&tDepositOper);
    if(ret)
    {
        return E_DB_DEPOSITOPER_U;
    }
    ret=DB_t_depositshoppos_read_by_deviceid(trans.termid, &tDepositShoppos);

    if(ret)
    {
        if(DB_NOTFOUND==ret)
        {
            writelog(LOG_INFO,"PosDeposit termid[%d] ",trans.termid);
            trans.transcode = TC_POSDEPOSIT;
        }
        else
        {
            return E_DB_DEPOSITSHOPPOS_R;
        }
    }
    else
    {
        writelog(LOG_INFO,"ShopPosDeposit termid[%d] ",trans.termid);
        trans.transcode = TC_SHOPPOSDEPOSIT;
        ret=DB_t_shop_read_by_shopid(tDepositShoppos.shopid, &tDepositShop);
        if(ret)
        {
            if(DB_NOTFOUND==ret)
                return E_DB_SHOP_N;
            else
                return E_DB_SHOP_R;
        }
        if(tDepositShop.status[0]!=STATUS_NORMAL)
        {
            return E_SHOP_LOGOUT;
        }
        des2src(trans.draccno,tDepositShop.accno);
    }
    ret=pAccTrans->InitTrans();
    if(ret)
        return ret;
    //根据卡号和钱包号得到消费者账号(借方)
    ret=DB_t_account_read_by_cardno_and_purseno(trans.cardno, trans.purseno,&tAccount);
    if(ret)
    {
        writelog(LOG_ERR,"DB_t_account_read_by_cardno_and_purseno ret[%d]cardno[%d]",ret,trans.cardno);
        if(DB_NOTFOUND==ret)
            return E_NOTEXIST_ACCNO;
        else
            return E_DB_ACCOUNT_R;
    }
    if(tAccount.lastcardcnt>trans.cardcnt)
    {
        return E_CARDCNT_LT_LASTCARDCNT;
    }
    if(amtcmp(trans.inputamt+trans.cardbefbal,tAccount.cardmaxbal)>0)
        return E_AMT_EXCEED_MAX;
    trans.custid=tCard.custid;
    des2src(trans.craccno,tAccount.accno);
    ret=pAccTrans->doTrans();
    if(ret)
        return ret;
    des2src(transdtl.transdate,trans.transdate);
    des2src(transdtl.transtime,trans.transtime);
    strcpy(transdtl.accdate,trans.sysdate);
    strcpy(transdtl.acctime,trans.systime);
    transdtl.termid=trans.termid;
    transdtl.termseqno=trans.termseqno;
    transdtl.transcode=trans.transcode;
    transdtl.paytype=trans.fundtype;
    des2src(transdtl.voucherno,trans.voucherno);
    transdtl.cardno=trans.cardno;
    transdtl.purseno=trans.purseno;
    transdtl.cardcnt=trans.cardcnt;
    transdtl.cardbefbal=trans.cardbefbal;
    transdtl.amount=trans.totaltransamt;
    transdtl.managefee=trans.totalfeeamt;
    transdtl.cardaftbal=trans.cardaftbal;
    transdtl.custid=trans.custid;
    des2src(transdtl.custname,tAccount.accname);
    des2src(transdtl.opercode,trans.opercode);
    transdtl.status[0]=DTLSTATUS_SUCCESS;
    ret=DB_t_transdtl_add(&transdtl);
    if(ret)
    {
        if(DB_REPEAT==ret)
            return E_DB_TRANSDTL_E;
        else
            return E_DB_TRANSDTL_I;
    }
    sprintf(trans.remark,"卡号%d 充值前卡余额:%.2lf元 卡当前余额:%.2lf元",trans.cardno,trans.cardbefbal,trans.cardaftbal);
    writelog(LOG_INFO,trans.remark);
    ResetNormalCPack(&aPack,0,1);
    SetCol(handle,0);
    SetCol(handle,F_LVOL5,F_LVOL10,F_LCERT_CODE,F_SSTOCK_CODE2,0);

    out_pack->lvol5 = trans.cardno;
    out_pack->lvol10 = (int)D4U5(trans.cardaftbal*100,0);
    out_pack->lcert_code = trans.termseqno;
    PutRow(handle,out_pack,pRetCode,szMsg);
    return 0;
}
Exemple #2
0
int F843362(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;

	CAccTrans *pAccTrans=CAccTrans::getInstance();
	des2src(pAccTrans->trans.opercode,rPack->semp);
	pAccTrans->trans.transcode=MAKETRANSCODEADD(TCM_DEPOSITOPERPOS);
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	char deviceid[31]="";
	T_t_depositoperpos tDepositOperPos;
	T_t_depositoper tDepositOper;
	T_t_depositshoppos  tDepositShopPos;
	
	memset(&tDepositOperPos,0,sizeof(tDepositOperPos));
	memset(&tDepositOper,0,sizeof(tDepositOper));
	memset(&tDepositShopPos,0,sizeof(tDepositShopPos));
	
	if(!strlen(rPack->vsvarstr1))
	{
		return E_INPUT_DATA_INVAILD;
	}	
	ret=DB_t_depositoper_read_by_opercode(rPack->scust_auth,&tDepositOper);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			return ERRINFO(E_NOTEXIST_DEPOSITOPER,rPack->scust_auth);
		else
			return E_DB_DEPOSITOPER_R;
	}
	if(tDepositOper.devlimitflag[0]!='1')
	{
		return E_OPER_NO_NEED_DEVICE;
	}
	des2src(tDepositOperPos.opercode,rPack->scust_auth);
	des2src(tDepositOperPos.openoper,rPack->semp);
	getfmtsysdatetime(tDepositOperPos.lastsaved);
	vector<string>  strlist;
	split2list(rPack->vsvarstr1,',',strlist);
	for(int i=0;i<strlist.size();i++)
	{
		tDepositOperPos.deviceid=atoi(strlist[i].c_str());
		//如果操作员不是充值商户操作员则不允许绑定充值商户设备
		ret=DB_t_depositshoppos_read_by_deviceid(tDepositOperPos.deviceid, &tDepositShopPos);
		if(ret)
		{
			if(ret==DB_NOTFOUND)
			{
				if(tDepositOper.shopoperflag[0]=='1')
				{
					return ERRINFO(E_DEVICE_NOTIS_DEPOSITSHOP,tDepositOperPos.deviceid);
				}
			}	
			else
			{
				return E_DB_DEPOSITSHOPPOS_R;

			}
		}
		else
		{
			if(tDepositOper.shopoperflag[0]=='0')
			{
				return ERRINFO(E_DEVICE_IS_DEPOSITSHOP,tDepositOperPos.deviceid);
			}
		}
		SQLCODE=0;
		ret=DB_t_depositoperpos_add(&tDepositOperPos);
		if(ret)
		{
			writelog(LOG_ERR,"opercode[%s]",tDepositOperPos.opercode);
			if(DB_REPEAT==ret)
			{
				return ERRINFO(E_DB_DEPOSITOPERPOS_E,tDepositOperPos.opercode,ltos(tDepositOperPos.deviceid).c_str());
			}
			else
			{
				return E_DB_DEPOSITOPERPOS_I;
			}
		}
	}
	return 0;
}