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_dpsoper tDepositOper; T_t_dpsoperpos tDepositOperpos; T_t_dpsshoppos 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.dpscnt= rPack->lvol7; //入卡金额 trans.inputamt= rPack->lvol8/100.0; //充值金额 trans.unusedamt = trans.inputamt; 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); des2src(cpu_trade.random_key,rPack->sstock_code);//fixme cpu_trade.tradeamt = rPack->lvol8; cpu_trade.balance = rPack->lvol9; cpu_trade.termsno = rPack->lvol4; sprintf(cpu_trade.termno,"%012d",tDevice.deviceno); // 终端号 cpu_trade.tradecnt = trans.dpscnt; 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_dpsoper_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_dpsoper_free_lock_by_c0(); return E_DEPOSITOPER_STOP; } //判断是否是重复交易 if(tDepositOper.lastdevseqno==transdtl.devseqno) { DB_t_dpsoper_free_lock_by_c0(); ret=DB_t_transdtl_read_by_accdate_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); des2src(tDepositOper.lastsaved,trans.sysdatetime); if(amtcmp(tDepositOper.maxdepositamt,0)>0) { DB_t_dpsoper_free_lock_by_c0(); if(amtcmp(tDepositOper.depositamt,tDepositOper.maxdepositamt)>0) { return E_OPER_OVER_MAX_DEPOSIT_AMT; } } ret=DB_t_dpsoper_update_lock_by_c0(&tDepositOper); if(ret) { return E_DB_DEPOSITOPER_U; } ret=DB_t_dpsshoppos_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_accno(tCard.accno,&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_account_read_by_accno ret[%d]cardno[%d]",ret,trans.cardno); if(DB_NOTFOUND==ret) return E_NOTEXIST_ACCNO; else return E_DB_ACCOUNT_R; } double CardMaxBal=0; ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal); if(ret) return ret; if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>=0) return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal); trans.custid=tCard.custid; des2src(trans.cardaccno,tAccount.accno); ret=pAccTrans->doTrans(); if(ret) return ret; des2src(transdtl.transdate,trans.transdate); des2src(transdtl.transtime,trans.transtime); strcpy(transdtl.accdate,trans.accdate); strcpy(transdtl.acctime,trans.acctime); transdtl.termid=trans.termid; transdtl.termseqno=trans.termseqno; transdtl.transcode=trans.transcode; transdtl.paytype=trans.fundtype; des2src(transdtl.voucherno,trans.voucherno); transdtl.cardno=trans.cardno; transdtl.purseno=trans.purseno; transdtl.transflag = TF_DPS; transdtl.cardcnt=trans.dpscnt; 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; }
int F846340(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; CAccTrans *pAccTrans=CAccTrans::getInstance(); TRANS& trans=pAccTrans->trans; trans.transcode=TC_EACC2SHOP; trans.transtype = TRANSTYPE_EACCPAYMENT; // 支付交易 //trans.termid=TERMID_WEB; trans.termid=rPack->lcert_code; // 使用支付网关的注册ID ret=pAccTrans->InitTrans(); if(ret) return ret; trans.inputamt=D4U5(rPack->damt0,2); trans.unusedamt = trans.inputamt; trans.transamt=trans.inputamt; if(amtcmp(trans.inputamt,0)==0) return E_INPUT_AMT_NULL; if(amtcmp(trans.inputamt,0)<0) return E_INPUT_AMT; //查询电子钱包帐户 T_t_netacc tNetAccount; memset(&tNetAccount,0,sizeof(tNetAccount)); ret=DB_t_netacc_read_by_accno(rPack->scust_no,&tNetAccount); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_EACCNO,rPack->scust_no); else return E_DB_ACCOUNT_R; } //检查电子钱包密码 if(rPack->lvol1 == 0) { // 检查电子账户密码 检查账户余额 if(strcmp(rPack->snote2,tNetAccount.paypwd)!=0) return E_EACCPWD; } if(tNetAccount.status[0]!=STATUS_NORMAL) // 账户状态 return ERRINFO(E_EACCNO_LOGOUT,tNetAccount.accno); if(tNetAccount.stoppayflag[0]=='1') // 止付标志 return ERRINFO(E_EACC_STOPPAY,tNetAccount.accno); if(rPack->lvol1 == 0) { // 检查电子账户密码 检查账户余额 if(amtcmp(trans.inputamt,tNetAccount.balance)>0) return ERRINFO(E_EACC_BALANCE_SHORTAGE,trans.inputamt-tNetAccount.balance); } /* double CardMaxBal=0; ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal); if(ret) return ret; if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>0) return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal); */ des2src(trans.draccno,tNetAccount.accno); trans.custid=tNetAccount.custid; des2src(trans.custname,tNetAccount.accname); // 支付转账 T_t_shop shop; memset(&shop,0,sizeof(shop)); ret=DB_t_shop_read_by_shopid(rPack->lvol0,&shop); if(ret) { if(DB_NOTFOUND==ret) return E_NOTEXIST_SHOPID; else return E_DB_SHOP_R; } if(shop.status[0]!=STATUS_NORMAL) return E_SHOP_LOGOUT; if(shop.shoptype!=SHOPTYPE_ESHOP) return ERRIF_SHOP_TYPE; des2src(trans.craccno,shop.accno); // 产生交易参考号 T_t_refno tRefno; memset(&tRefno,0,sizeof(tRefno)); get_random(tRefno.mac); ret= GetNewRefno(tRefno.refno); if(ret) return ret; des2src(tRefno.lastsaved,trans.sysdatetime); des2src(tRefno.accdate,trans.accdate); tRefno.termid = trans.termid; tRefno.termseqno = trans.termseqno; tRefno.status = RS_SUCC; ret=DB_t_refno_add(&tRefno); if(ret) { if(DB_REPEAT==ret) return E_DB_REFNO_E; else return E_DB_REFNO_I; } des2src(trans.refno, tRefno.refno); ret=pAccTrans->doTrans(); if(ret) return ret; // 添加电子账户支付信息 T_t_epay_record t_epay_record; memset(&t_epay_record,0,sizeof(t_epay_record)); des2src(t_epay_record.refno, tRefno.refno); t_epay_record.shopid = shop.shopid; des2src(t_epay_record.oid, rPack->sbankname); des2src(t_epay_record.accno,tNetAccount.accno); des2src(t_epay_record.accname,tNetAccount.accname); t_epay_record.amount = trans.inputamt; des2src(t_epay_record.currency,rPack->sstock_code); des2src(t_epay_record.epay_date,trans.accdate); des2src(t_epay_record.epay_time,trans.acctime); t_epay_record.status = 1; // 交易成功 t_epay_record.transcode = trans.transcode; des2src(t_epay_record.remark,rPack->snote); ret=DB_t_epay_record_add(&t_epay_record); if(ret) return ret; // 添加交易流水 T_t_transdtl transdtl; memset(&transdtl,0,sizeof(transdtl)); des2src(transdtl.refno,tRefno.refno); // 交易参考号 des2src(transdtl.transdate,trans.accdate); des2src(transdtl.transtime,trans.acctime); strcpy(transdtl.accdate,trans.accdate); strcpy(transdtl.acctime,trans.acctime); transdtl.termid=trans.termid; transdtl.termseqno=trans.termseqno; transdtl.transcode=trans.transcode; transdtl.transflag=TF_PAY; transdtl.managefee=trans.totalfeeamt; des2src(transdtl.custname,tNetAccount.accname); transdtl.amount = trans.inputamt; des2src(transdtl.opercode,trans.opercode); transdtl.cardbefbal = trans.draccbefbal; transdtl.cardaftbal = trans.draccaftbal; des2src(transdtl.coldate,trans.accdate); des2src(transdtl.coltime,trans.acctime); transdtl.status[0]=DTLSTATUS_SUCCESS; transdtl.revflag[0]='0'; transdtl.custid=tNetAccount.custid; 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_LVOL0,F_SCUST_NO, F_SDATE0,F_STIME0, F_DAMT0,F_SPHONE3,F_SADDR,F_VSMESS,0); outPack->lvol0=shop.shopid; des2src(outPack->scust_no,tNetAccount.accno); des2src(outPack->sdate0,trans.accdate); des2src(outPack->stime0,trans.acctime); des2src(outPack->sphone3,tRefno.refno); // 一卡通流水号,冲正使用 des2src(outPack->saddr,tRefno.mac); // MAC 冲正使用 outPack->damt0=trans.draccaftbal; // 余额 char temp[128]=""; sprintf(temp,"%s 支付成功,电子钱包余额:%.2f", tNetAccount.accname, trans.draccaftbal); pAccTrans->remark+=temp; strcpy(outPack->vsmess,pAccTrans->remark.c_str()); des2src(trans.remark,outPack->vsmess); PutRow(handle,outPack,pRetCode,szMsg); return 0; }
static int DoCheck(ST_PACK *rPack,T_t_shopcard& tShopCard,T_t_shop& tShop) { //检查卡是否已经使用 int ret=0; CAccTrans *pAccTrans=CAccTrans::getInstance(); TRANS& trans=pAccTrans->trans; des2src(tShopCard.cardphyid,rPack->sbank_acc); des2src(tShopCard.showcardno,rPack->sorder0); des2src(tShopCard.expiredate,rPack->sdate0); des2src(tShopCard.opendate,trans.accdate); des2src(tShopCard.lastsaved,trans.sysdatetime); tShopCard.status[0]=STATUS_NORMAL; tShopCard.lossflag[0]='0'; tShopCard.shopid =rPack->lvol0; if(!strlen(tShopCard.cardphyid)) return E_INPUT_CARDPHYID; if(!strlen(tShopCard.expiredate)) return E_INPUT_EXPIREDATE; //判断到期日期 ret=IsInvalidDateTime(tShopCard.expiredate,"YYYYMMDD"); if (ret) return ERRINFO(E_INPUT_EXPIREDATE,tShopCard.expiredate); if (strncmp(tShopCard.expiredate,trans.accdate,8)<0) return ERRINFO(E_INPUT_EXPIREDATE,tShopCard.expiredate); //检查商户 ret=DB_t_shop_read_by_shopid(tShopCard.shopid,&tShop); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_SHOPID,tShopCard.shopid); else return E_DB_SHOPCARD_R; } if(tShop.status[0]!=STATUS_NORMAL) { return ERRINFO(E_SHOP_LOGOUT,tShop.shopid); } char cardpwd[33]={0}; char key[17]={0}; get_init_passwd_by_man_id(tShop.idno,cardpwd); strcpy(key,STATIC_SEED_KEY); EncodePwd(key,cardpwd,tShopCard.cardpwd, 0); strcpy(trans.cardpwd,cardpwd);//临时保存密码 //检查是否存在商户卡 T_t_shopcard tShopCardCheck; memset(&tShopCardCheck,0,sizeof(tShopCardCheck)); ret=DB_t_shopcard_read_by_shopid_and_status(tShopCard.shopid,tShopCard.status,&tShopCardCheck); if(ret) { if(DB_NOTFOUND!=ret) return E_DB_SHOPCARD_R; } else { ERRTIP("该商户商户卡已发行"); return E_COMMON_ERR; } ret=DB_t_shopcard_read_by_cardphyid_and_status(tShopCard.cardphyid,tShopCard.status,&tShopCardCheck); if (ret!=DB_NOTFOUND) { if (DB_SUCCESS==ret) return ERRINFO(E_EXIST_CARDPHYID,tShopCard.cardphyid); else return E_DB_CARD_R; } return 0; }
int F849005(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret; int device_id=0; char sDevPhyid[31]=""; char current_date[9] = ""; CAccTrans& ats=CAccTrans::GetInst(); TRANS& trans=ats.trans; ret=ats.CheckCfgUpdate(); if(ret) return ret; T_t_authcard auth_card; memset(&auth_card,0,sizeof auth_card); writelog(LOG_INFO,"充值操作员签到,操作员卡号%d,设备%s",rPack->lvol5,rPack->sphone3); ret = DB_t_authcard_read_by_cardno(rPack->lvol5,&auth_card); if(ret) { if(DB_NOTFOUND == ret) return E_DB_AUTHCARD_N; else return E_DB_AUTHCARD_R; } if(auth_card.status[0]!=STATUS_NORMAL) return E_AUTHCARD_LOGOUT; if(auth_card.lossflag[0] == '1') { return E_AUTHCARD_IS_LOSS; } // 判断授权卡权限 // if((auth_card.privilege & AUTHCARD_PRV_ADDPOS) == 0) // { // *pRetCode = E_AUTHCARD_IS_LOSS; // goto L_RETU; // } // 判断有效期 if(strcmp(auth_card.expiredate,trans.accdate) < 0) { return E_CARD_EXPIRED; } T_t_operator oper; memset(&oper,0,sizeof oper); ret = DB_t_operator_read_by_opercode(auth_card.opercode,&oper); if(ret) { if(DB_NOTFOUND==ret) return E_NOTEXIST_OPER; else return E_DB_OPERATOR_R; } T_t_dpsoper tDepositOper; memset(&tDepositOper,0,sizeof tDepositOper); ret=DB_t_dpsoper_read_by_opercode(auth_card.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) { return E_DEPOSITOPER_STOP; } ret=GetDevIdByDevPhyId(&device_id,rPack->sphone3); if (ret) { writelog(LOG_ERR,"GetDevIdByDevPhyId err[%d] device_id[%d]devphyid[%s]",ret,device_id,rPack->sphone3); return ret; } T_t_dpsshoppos tDepositShoppos; if('1'==tDepositOper.shopoperflag[0]) { memset(&tDepositShoppos,0,sizeof(tDepositShoppos)); ret=DB_t_dpsshoppos_read_by_deviceid(device_id, &tDepositShoppos); if(ret) { if(DB_NOTFOUND==ret) { writelog(LOG_INFO,"PosDeposit device_id[%d] ",device_id); return E_DB_DEPOSITSHOPPOS_N; } else { return E_DB_DEPOSITSHOPPOS_R; } } T_t_shop tShop; memset(&tShop,0,sizeof(tShop)); ret=DB_t_shop_read_by_shopid(tDepositShoppos.shopid, &tShop); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_SHOPID,tDepositShoppos.shopid); else return E_DB_SHOP_R; } if(tShop.status[0]!=STATUS_NORMAL) { return ERRINFO(E_SHOP_LOGOUT,tDepositShoppos.shopid); } } else { memset(&tDepositShoppos,0,sizeof(tDepositShoppos)); ret=DB_t_dpsshoppos_read_by_deviceid(device_id, &tDepositShoppos); if(ret) { if(DB_NOTFOUND!=ret) { writelog(LOG_ERR,"PosDeposit termid[%d] ",device_id); return E_DB_DEPOSITSHOPPOS_R; } } else { ERRTIP("设备号[%d]属于属于充值商户,非充值商户操作员不能使用该设备"); return E_COMMON_ERR; } } if(tDepositOper.devlimitflag[0]=='1') { T_t_dpsoperpos tDepositOperpos; memset(&tDepositOperpos,0,sizeof tDepositOperpos); ret=DB_t_dpsoperpos_read_by_opercode_and_deviceid(tDepositOper.opercode, device_id,&tDepositOperpos); if(ret) { writelog(LOG_ERR,"DB_t_dpsoperpos_read_by_opercode_and_deviceid ret[%d]oper_code[%s] device_id[%d]devphy999_id[%s]",ret,tDepositOper.opercode, device_id,sDevPhyid); if(DB_NOTFOUND==ret) return E_OPER_NO_RIGHT_FOR_DEVICE; else return E_DB_DEPOSITOPERPOS_R; } } return 0;
int F849003(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret =0; 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_dpsoper tDepositOper; T_t_dpsoperpos tDepositOperpos; T_t_dpsshoppos tDepositShoppos; T_t_shop tDepositShop; T_t_account tAccount; //帐户表 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.cardaftbal=trans.cardbefbal; trans.dpscnt= rPack->lvol7; //入卡金额 trans.inputamt= rPack->lvol8/100.0; //充值金额 trans.unusedamt = trans.inputamt; trans.fundtype=1; ret=IsWaterExceptCard(trans.cardno); if(ret) { ERRTIP("卡号[%d]水控余额异常,充值功能暂停使用,请联系一卡通管理中心处理!!!",trans.cardno); return ERRIF_CARDACC_EXCEPT; } 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; // ret=UpdateCardBitmap(trans.cardno,trans.cardcnt,CARDBITMAPTYPE_INC,0); // if(ret) // return ret; transdtl.sysid= rPack->lcert_code; //上传工作站标识(前置机注册号) des2src(transdtl.devphyid, rPack->sphone3); //物理设备ID transdtl.devseqno=rPack->lvol4; //上传端流水号 // 读取操作员号 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=GetDevIdByDevPhyId(&(trans.termid),transdtl.devphyid); if (ret) { writelog(LOG_ERR,"GetDevIdByDevPhyId err[%d] devphy999_id[%s]",ret,transdtl.devphyid); return ret; } ret=DB_t_dpsoper_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_dpsoper_free_lock_by_c0(); return E_DEPOSITOPER_STOP; } //判断是否是重复交易 if(tDepositOper.lastdevseqno==transdtl.devseqno) { DB_t_dpsoper_free_lock_by_c0(); ret=DB_t_transdtl_read_by_accdate_and_termid_and_devseqno(trans.accdate,trans.termid,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); des2src(tDepositOper.lastsaved,trans.sysdatetime); if(amtcmp(tDepositOper.maxdepositamt,0)>0) { DB_t_dpsoper_free_lock_by_c0(); if(amtcmp(tDepositOper.depositamt,tDepositOper.maxdepositamt)>0) { return E_OPER_OVER_MAX_DEPOSIT_AMT; } } ret=DB_t_dpsoper_update_lock_by_c0(&tDepositOper); if(ret) { return E_DB_DEPOSITOPER_U; } if('1'==tDepositOper.shopoperflag[0]) { ret=DB_t_dpsshoppos_read_by_deviceid(trans.termid, &tDepositShoppos); if(ret) { if(DB_NOTFOUND==ret) { writelog(LOG_INFO,"PosDeposit termid[%d] ",trans.termid); return E_DB_DEPOSITSHOPPOS_N; } else { return E_DB_DEPOSITSHOPPOS_R; } } ret=DB_t_shop_read_by_shopid(tDepositShoppos.shopid, &tDepositShop); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_SHOPID,tDepositShoppos.shopid); else return E_DB_SHOP_R; } if(tDepositShop.status[0]!=STATUS_NORMAL) { return ERRINFO(E_SHOP_LOGOUT,tDepositShop.shopid); } trans.transcode = TC_SHOPPOSDEPOSIT; des2src(trans.shopaccno,tDepositShop.accno); writelog(LOG_INFO,"充值商户充值"); } else { ret=DB_t_dpsshoppos_read_by_deviceid(trans.termid, &tDepositShoppos); if(ret) { if(DB_NOTFOUND!=ret) { writelog(LOG_INFO,"PosDeposit termid[%d] ",trans.termid); return E_DB_DEPOSITSHOPPOS_R; } } else { ERRTIP("设备号[%d]属于属于充值商户,非充值商户操作员不能使用该设备",trans.termid); return E_COMMON_ERR; } trans.transcode = TC_POSDEPOSIT; } ret=pAccTrans->InitTrans(); if(ret) return ret; //根据卡号和钱包号得到消费者账号(借方) ret=DB_t_account_read_by_accno(tCard.accno,&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_account_read_by_accno ret[%d]cardno[%d]accno[%s]",ret,trans.cardno,tCard.accno); if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_ACCNO,tCard.accno); else return E_DB_ACCOUNT_R; } if(tAccount.lastdpscnt>trans.dpscnt) { return ERRINFO(E_CARDCNT_LT_LASTCARDCNT,trans.dpscnt,tAccount.lastdpscnt); } // double CardMaxBal=0; // ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal); // if(ret) // return ret; // if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>0) // return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal); trans.custid=tCard.custid; des2src(trans.cardaccno,tAccount.accno); ret=pAccTrans->doTrans(); if(ret) return ret; des2src(transdtl.transdate,trans.transdate); des2src(transdtl.transtime,trans.transtime); strcpy(transdtl.accdate,trans.accdate); strcpy(transdtl.acctime,trans.acctime); transdtl.termid=trans.termid; transdtl.termseqno=trans.termseqno; transdtl.transcode=trans.transcode; transdtl.paytype=trans.fundtype; des2src(transdtl.voucherno,trans.voucherno); transdtl.cardno=trans.cardno; transdtl.purseno=trans.purseno; transdtl.transflag=TF_DPS; transdtl.cardcnt=trans.dpscnt; transdtl.cardbefbal=trans.cardbefbal; transdtl.amount=trans.totaltransamt; transdtl.managefee=trans.totalfeeamt; transdtl.cardaftbal=trans.cardaftbal; transdtl.custid=trans.custid; transdtl.showcardno=atol(tCard.showcardno); des2src(transdtl.custname,tAccount.accname); des2src(transdtl.opercode,trans.opercode); GetStuempnoByCustid(transdtl.custid,transdtl.stuempno); 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,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; }
int F847128(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; char transdate[12]=""; char devphyid[30]=""; int devseqno=0; int cardno=0; int deviceid=0; CAccTrans *pAccTrans=CAccTrans::getInstance(); des2src(pAccTrans->trans.opercode,rPack->semp); pAccTrans->trans.transcode=TC_MANUALDRCR; ret=pAccTrans->InitTrans(); if(ret) return ret; TRANS& trans=pAccTrans->trans; ST_CPACK aPack; ST_PACK *outPack = &(aPack.pack); //水控消费 T_t_purseposdtl purseposdtl; memset(&purseposdtl,0,sizeof purseposdtl); T_t_shop shop; memset(&shop,0,sizeof shop); T_t_account account; memset(&account,0,sizeof account); ResetNormalCPack(&aPack,0,1); des2src(transdate,rPack->sdate0); deviceid=rPack->lwithdraw_flag; devseqno=rPack->lserial1; cardno=rPack->lvol0; trans.inputamt=rPack->damt0; trans.unusedamt = trans.inputamt; trans.transamt=trans.inputamt; if(amtcmp(trans.inputamt,0)==0) { return E_INPUT_AMT_NULL; } ret=DB_t_purseposdtl_read_lock_by_c1_and_transdate_and_termid_and_devseqno_and_cardno(transdate,deviceid,devseqno,cardno,&purseposdtl); if (ret) { if(DB_NOTFOUND==ret) E_DB_PURSEPOSDTL_N; else return E_DB_PURSEPOSDTL_R; } if(!trans.cardaccno) { ret=GetShopidByDevphyid(purseposdtl.devphyid,purseposdtl.transdate,purseposdtl.transtime,deviceid,purseposdtl.shopid); if(ret) { return ret; } } ret=DB_t_shop_read_by_shopid(purseposdtl.shopid,&shop); if(ret) { writelog(LOG_ERR,"DB_t_shop_read_by_shop_id ret[%d],shopid[%d]",ret,rPack->lserial0); if(DB_NOTFOUND==ret) { return E_NOTEXIST_SHOPACCNO; } else return E_DB_SHOP_R; } ret=DB_t_account_read_by_cardno(cardno,&account); if (rPack->lvol1) { ret=DB_t_account_read_by_cardno(rPack->lvol1,&account); if(ret) { if(DB_NOTFOUND == ret) return E_DB_ACCOUNT_R; } } des2src(trans.draccno,shop.accno); des2src(trans.craccno,account.accno); des2src(trans.chkopercode,rPack->semp_no); pAccTrans->trans.fundtype=0; pAccTrans->trans.transtype=TRANSTYPE_MANDRCR; ret=pAccTrans->DoTransByTransType(); if(ret) return ret; ret=pAccTrans->doTransEnd(); if(ret) return ret; des2src(purseposdtl.status,"4"); ret=DB_t_purseposdtl_update_lock_by_c1(&purseposdtl); if(ret) return ret; DB_t_purseposdtl_free_lock_by_c1(); sprintf(trans.remark,"交易金额%.2lf,借方账户[%s]余额%.2lf,贷方账户[%s]余额%.2lf",trans.totaltransamt,trans.draccname,trans.draccaftbal,trans.craccname,trans.craccaftbal); SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL8,F_SDATE3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0); des2src(outPack->sdate3,pAccTrans->trans.accdate); des2src(outPack->semp,trans.opercode); outPack->lwithdraw_flag=trans.termid; outPack->lvol1=rPack->lvol1; outPack->lvol0=cardno; //卡号 outPack->lvol2=trans.transamt*100;//交易金额 sprintf(outPack->vsmess,"%s 借方账户[%s]贷方帐户[%s]",pAccTrans->remark.c_str(),pAccTrans->trans.draccname,trans.craccname); PutRow(handle,outPack,pRetCode,szMsg); return 0; }