int F847104(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret =0; int len = 0; int i=0; int hi_cutid=0; char h_showcardid[11] = ""; //显示卡号 char h_password[7] = ""; //卡密码 double h_temp_Card_id = 0; //卡号 double dSerialNo=0; char seed_key[17] = ""; //种子密钥 char card_endtime[8 + 1] = ""; //卡的有效截至日期 char logicdate[11]=""; //业务日期 char sysdate[11]=""; char systime[9]=""; char sEndDate[9]=""; char sMsg[256]=""; char sMaxCardBalance[20]=""; char lost_date[11]=""; double dMaxCardBalance=0; int lost_card_id=0; T_t_pif_card tCard; T_t_pif_card tOldCard; T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; // T_t_pif_cardlossinfo tCardLossInfo; T_t_tif_tradeserial tradeserial; T_t_aif_account tAccount; InAcc IA; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL5, F_SCUST_NO, F_SCUST_NO2,F_SCUST_AUTH,F_SCUST_AUTH2, F_SDATE0,F_SNAME,F_SNAME2, F_SOPEN_EMP,F_SSTATUS0, F_DAMT2,F_LSERIAL1,F_VSMESS,0); memset(&tCard,0,sizeof(tCard)); memset(&tOldCard,0,sizeof(tOldCard)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tSpeFee,0,sizeof(tSpeFee)); // memset(&tCardLossInfo,0,sizeof(tCardLossInfo)); memset(&tAccount,0,sizeof(tAccount)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&IA,0,sizeof(IA)); getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } //检查客户信息,判断是否可以发行卡 hi_cutid=rPack->lvol0; //客户号 des2src(tCard.physical_no, rPack->sbank_acc); //物理卡号 trim(h_showcardid); ret=IsExistFreezeCardByCustomId(hi_cutid); if(ret) { *pRetCode = ret; goto L_RETU; } ret=IsExistNoLostCardByCustomId(hi_cutid); if(ret) { *pRetCode = ret; goto L_RETU; } if(strlen(h_showcardid)) { ret=IsExistShowCardNo(h_showcardid); if(ret) { *pRetCode = ret; goto L_RETU; } } ret=IsExistCardByPhyCardNo(tCard.physical_no); if(ret) { *pRetCode = ret; goto L_RETU; } ret=GetLostCardIdByCustomId_TypeId(hi_cutid,CT_NORMAL,&lost_card_id); if(ret) { writelog(LOG_ERR,"customer[%d]tCard type_id[%d]",hi_cutid,CT_NORMAL); *pRetCode = ret; goto L_RETU; } /* ret=DB_t_pif_cardlossinfo_read_by_card_id_and_state_id(lost_card_id, STATE_VALID, &tCardLossInfo); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } */ ret=get_latest_lost_date_by_card_no(lost_card_id,lost_date); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); *pRetCode =ret; goto L_RETU; } //先检查客户的挂失的正式卡是否到了补办日期 ret=GetLostCardValiddate(lost_date,sEndDate); if(ret) { *pRetCode =ret; goto L_RETU; } if(strncmp(sEndDate,sysdate,8)>0) { writelog(LOG_ERR,"lost_normal_card_id[%d]lost_date[%s]end_date[%s]",lost_card_id,lost_date,sEndDate); *pRetCode = E_NORMALCARD_NOT_REACH_ENDDATE; goto L_RETU; } /* //更新卡挂失日期表中该卡状态为无效 ret=UpdateCardLossInfoState(lost_card_id,STATE_VALID,STATE_INVALID); if(ret) { *pRetCode = ret; goto L_RETU; } */ //注销原卡 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(lost_card_id,&tOldCard); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } des2src(tOldCard.state_id,CARDSTAT_LOGOUT); //注销 des2src(tOldCard.end_time,sysdate); //注销日期 ret=DB_t_pif_card_update_lock_by_cur(&tOldCard); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(hi_cutid, &tCustomer); if(ret) { writelog(LOG_ERR,"cut_id[%d]",hi_cutid); if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_R; goto L_RETU; } //得到收费类别 if(tCustomer.fee_type<1) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); *pRetCode=E_DB_SPEFEE_R; goto L_RETU; } } else { tCustomer.fee_type=tSpeFee.fee_type; } //更新客户表的收费类别字段 ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_U; goto L_RETU; } } DB_t_cif_customer_free_lock_cur(); tradeserial.trade_fee =D4U5(rPack->damt0,2); // 准备数据插入卡信息表 memcpy(seed_key,STATIC_SEED_KEY,16); //读种子密钥 if(strlen(tCustomer.can_time)==8) { ret=IsInvalidDateTime(tCustomer.can_time,"YYYYMMDD"); if(ret) { *pRetCode=E_TB_CUSTOMER_ENDTIME; goto L_RETU; } if(strncmp(tCustomer.can_time,sysdate,8)<=0) { *pRetCode=E_TB_CUSTOMER_ENDTIME; goto L_RETU; } des2src(card_endtime,tCustomer.can_time); } else if(strlen(rPack->sdate0)==0) { *pRetCode=E_TB_CUSTOMER_NO_ENDTIME; goto L_RETU; } else { ret=IsInvalidDateTime(rPack->sdate0,"YYYYMMDD"); if(ret) { *pRetCode = E_INPUT_DATE; goto L_RETU; } if(strncmp(rPack->sdate0,sysdate,8)<=0) { *pRetCode=E_INPUT_DATE; goto L_RETU; } des2src(card_endtime,rPack->sdate0); } tradeserial.trade_fee = rPack->damt0; //金额 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_state = SERISTAT_DEBT; //流水状态 des2src(tradeserial.operate_date,sysdate); //发生日期 des2src(tradeserial.operate_time,systime); //发生时间 des2src(tradeserial.collect_date,sysdate); //采集日期 des2src(tradeserial.collect_time,systime); //采集时间 des2src(tradeserial.enteract_date,logicdate); //处理日期 des2src(tradeserial.enteract_time,systime); //处理时间 tradeserial.maindevice_id = rPack->lvol6; //上传工作站标识 tradeserial.device_id = rPack->lvol7; //采集设备标识 tradeserial.purse_id = PURSE_NO_ONE; //钱包号 tradeserial.customer_id = tCustomer.cut_id; //客户标识 tradeserial.sys_id = 0; //外部系统标识 des2src(tradeserial.oper_code, rPack->scust_limit); //操作员号 len=strlen(tCustomer.man_id) ; if (len >= 6) { strncpy(h_password,&(tCustomer.man_id[len-6]),6); if(h_password[5]>'9'||h_password[5]<'0') h_password[5]='0'; } else { strcpy(h_password,DEFAULT_CUST_PWD); } ret = getNewUniqNo(KEYTYPE_CARD_ID,&h_temp_Card_id); //获取最大卡号 if(ret) { *pRetCode = ret; goto L_RETU; } tCard.card_id = (int)h_temp_Card_id; //卡号 des2src(tCard.showid,h_showcardid); //显示卡号 des2src(tCard.is_main,TYPE_YES); //是否为主卡 des2src(tCard.state_id,CARDSTAT_REG); //卡状态 tCard.type_id = CT_NORMAL; //卡类别 EncodePwd(seed_key,h_password,tCard.password,0); //卡密码 tCard.cosumer_id = hi_cutid; //客户标识 tCard.account_count = ACCOUNT_COUNT_ONE; //卡对应帐户个数 des2src(tCard.begin_time,sysdate); //注册时间 des2src(tCard.end_time, card_endtime); //截至时间 tCard.phytype = PHYTYPE_NO_ONE; //设备物理型号;默认为1 // 插入卡信息 ret = DB_t_pif_card_add(&tCard); if (ret) { if(DB_REPEAT==ret) *pRetCode = E_DB_CARD_E; else *pRetCode = E_DB_CARD_I; goto L_RETU; } //修改帐户表中对应的卡号,类型,状态 ret=DB_t_aif_account_read_lock_by_c0_and_card_id_and_purse_id(lost_card_id,PURSE_NO_ONE,&tAccount); if (ret) { writelog(LOG_ERR,"normalcard_account_id[%s]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_ACTNO_NOT_EXIST; else *pRetCode = E_DB_ACCOUNT_R; } if(tAccount.current_state!=1) { *pRetCode=E_ACTNO_LOGOUT; goto L_RETU; } tAccount.card_id=tCard.card_id; tAccount.card_balance=tAccount.cur_freebala; //更新卡余额与库余额一致 tAccount.consume_count=0; ret=DB_t_aif_account_update_lock_by_c0(&tAccount); if (ret) { writelog(LOG_ERR,"DB_t_aif_account_update_lock_by_cur4 ret[%d]account_id[%s]",ret,tAccount.account_id); if(DB_NOTFOUND==ret) *pRetCode = E_ACTNO_EXIST; else *pRetCode = E_DB_ACCOUNT_U; } DB_t_aif_account_free_lock_c0(); ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo); //获得最大流水号 if(ret) { *pRetCode=ret; goto L_RETU; } tradeserial.serial_no=(int)dSerialNo; tradeserial.serial_type=TXCODE_CHANGE_CARD; tradeserial.card_id=tCard.card_id; //新卡号 des2src(tradeserial.showid,tCard.showid); //显示卡号 strcpy(IA.sArrInActno[0],tAccount.account_id); //账号 IA.dArrInAmt[0]=tradeserial.trade_fee; //交易金额 IA.iUseCardFlag=USE_CARD_TYPE_ONLINE; //联机交易 IA.dInCardBala=tAccount.cur_freebala; //入卡值 IA.iTxCnt=1; IA.iCardNo=tCard.card_id; IA.iFeeType=tCustomer.fee_type; IA.iArrInFeeSwitch[0]=rPack->lvol0; IA.iArrInFeeSwitch[1]=rPack->lvol1; IA.iArrInFeeSwitch[2]=rPack->lvol2; IA.iArrInFeeSwitch[3]=rPack->lvol3; IA.iArrInFeeSwitch[4]=rPack->lvol4; IA.iArrInFeeSwitch[5]=rPack->lvol5; IA.iArrInFeeSwitch[6]=rPack->lvol6; IA.iArrInFeeSwitch[7]=rPack->lvol7; IA.iArrInFeeSwitch[8]=rPack->lvol8; IA.iArrInFeeSwitch[9]=rPack->lvol9; IA.iArrInFeeSwitch[10]=rPack->lvol10; ret=process(&IA,&tradeserial); if(ret) { writelog(LOG_ERR,"process ret[%d]",ret); *pRetCode=ret; goto L_RETU; } sprintf(out_pack->vsmess,"流水号:%d 卡号:%d ",IA.iSerialNo,IA.iCardNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { switch(IA.iArrOutTxType[i]) { case TXTYPE_TOLL_DEPOSIT: case TXTYPE_DEDUCT_DEPOSIT: case TXTYPE_RETURN_DEPOSIT: tradeserial.deposit_fee=IA.dArrOutAmt[i]; break; case TXTYPE_PRE_TOLL_BOARD: case TXTYPE_TOLL_BOARD: case TXTYPE_DEDUCT_BOARD: case TXTYPE_RETURN_BOARD: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: tradeserial.in_fee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CARDCOST: tradeserial.cost_fee=IA.dArrOutAmt[i]; break; default: break; } if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(out_pack->vsmess,sMsg); } } sprintf(sMsg,"卡当前余额:%.2lf元",tradeserial.out_balance); strcat(out_pack->vsmess,sMsg); writelog(LOG_DEBUG,out_pack->vsmess); ret = DB_t_tif_tradeserial_add(&tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) *pRetCode = E_DB_TRADESERIAL_E; else *pRetCode = E_DB_TRADESERIAL_I; goto L_RETU; } if(amtcmp(tradeserial.out_balance,0)<0) { *pRetCode=E_ENTER_ACCOUNT; goto L_RETU; } //检查金额是否超过最大额度 ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance); if(ret) { *pRetCode=ret; goto L_RETU; } dMaxCardBalance=atof(sMaxCardBalance); if(amtcmp(tradeserial.out_balance,dMaxCardBalance)>0) { writelog(LOG_ERR,"tradeserial.out_balance[%lf]",tradeserial.out_balance); *pRetCode=E_AMT_EXCEED_MAX; goto L_RETU; } // 增加发行新卡时的门禁名单表检查 ret = CheckNewCardHook(&tCustomer, tCard.card_id); if(ret) { *pRetCode = ret; goto L_RETU; } //返回卡号\密码\显示卡号\客户类型\图书证号\有效截至日期 out_pack->lvol0 = (int)h_temp_Card_id; //交易卡号 out_pack->lvol1 = tCustomer.cut_type; //客户类别 out_pack->lvol5 = tCustomer.fee_type; //收费类别 des2src(out_pack->scust_no,h_showcardid); //显示卡号 des2src(out_pack->scust_no2,tCustomer.classdept_no); //部门号 des2src(out_pack->scust_auth,tCustomer.stuemp_no); //学号 des2src(out_pack->scust_auth2,tCustomer.man_id); //身份证号 des2src(out_pack->sname,tCustomer.cut_name); //客户姓名 des2src(out_pack->sname2,tCustomer.lib_cardid); //图书证号 des2src(out_pack->sstatus0,tCustomer.sex); //性别 des2src(out_pack->sopen_emp,h_password); //卡密码 des2src(out_pack->sdate0,card_endtime); //有效截至日期 out_pack->damt2=tradeserial.out_balance; //出卡值 out_pack->lserial1=tradeserial.serial_no; //流水号 // add by 汤成 2005-8-8 // 增加向名单表写入记录 ret = InsertToBlkList((int)h_temp_Card_id,CHCARD_BLACKLIST); if(ret) { *pRetCode = ret; goto L_RETU; } PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int AccountProcess(InAcc *IA) { int ret=-1; int iTxType=0; //交易类型 char num_exp[256]=""; char sFee[256]=""; char sFormula[256]=""; char sIdxDbActNo[4]=""; char sIdxCrActNo[4]=""; char sVocNo[21] = ""; double dExpCalAmt=0; int iVocType = VOCTYPE_DEFALUT; char * pMessage = (char*)IA->pVoidPointer; int i = 0; // int idx=0; int idxTxCfg=-1; int idxSubCfg=-1; int config_cnt=1; int db_amt_flag=0; int cr_amt_flag=0; double dInCardBala=0; double dCardBala=0; double dOutCardBala=0; T_t_pif_card tCard; T_t_aif_account tAccountDb; T_t_aif_account tAccountCr; T_t_tif_tradelog tTradelogDb; T_t_tif_tradelog tTradelogCr; ret=InitTxFeeCfg(IA->iTradeNo); if(ret) return ret; ret=InitSplitCfg(); if(ret) return ret; ret=InitSubjectCfg(); if(ret) return ret; //根据交易码和客户收费类别读交易配置表 if(IA->iFeeType<1) { return E_CUSTOMER_NO_FEE_TYPE; } idxTxCfg=GetIndexTxFeeCfgByTxCode(IA->iTradeNo,IA->iFeeType); if(idxTxCfg<0) { //如果没有取默认值 idxTxCfg=GetIndexTxFeeCfgByTxCode(IA->iTradeNo,0); if(idxTxCfg<0) { writelog(LOG_ERR,"tx_code[%d]fee_type[%d]",IA->iTradeNo,IA->iFeeType); return E_CUSTOMER_NO_RIGHT; } } dInCardBala=IA->dInCardBala; dCardBala=IA->dInCardBala; dOutCardBala=IA->dOutCardBala; for(config_cnt=1;config_cnt<=MAXNUM_CFGSPLIT;config_cnt++) { //开始遍历收费集合 ret=GetValueFromFmtBuf(CfgFee.ArrCfgFee[idxTxCfg].fee_list,",",config_cnt,sFee); if(ret) { if(1==config_cnt) { writelog(LOG_ERR, "TxCode[%d]FeeType[%d]fee_list[%s]",IA->iTradeNo,IA->iFeeType,CfgFee.ArrCfgFee[idxTxCfg].fee_list); return E_TXCODE_NOT_CONFIG; //交易未配置 } break; } iTxType=atoi(sFee); if(iTxType<0) { writelog(LOG_ERR,"tx_code[%d]fee_type[%d]",IA->iTradeNo,IA->iFeeType); return E_CUSTOMER_NO_RIGHT; } // writelog(LOG_DEBUG,"fee_list[%s]sFee[%s]",CfgFee.ArrCfgFee[idxTxCfg].fee_list,sFee); ret=GetValueFromFmtBuf(CfgFee.ArrCfgFee[idxTxCfg].formula_list,",",config_cnt,sFormula); if(ret) { writelog(LOG_ERR, "TxCode[%d]FeeType[%d]formula_list[%s]",IA->iTradeNo,IA->iFeeType,CfgFee.ArrCfgFee[idxTxCfg].formula_list); return E_EXP_NOT_CFG; //交易未配置 } // writelog(LOG_DEBUG,"formula_list[%s]Formula[%s]",CfgFee.ArrCfgFee[idxTxCfg].formula_list,sFormula); //得到收费类型 /* switch(iTxType) { // case TXTYPE_TOLL_DEPOSIT: //收押金 case TXTYPE_RETURN_DEPOSIT: //退押金 case TXTYPE_DEDUCT_DEPOSIT: //扣押金 memset(&tCard,0,sizeof(tCard)); if(IA->iCardNo<1) { return E_INPUT_CARDNO_CANNOT_NULL; } ret=DB_t_pif_card_read_by_card_id(IA->iCardNo,&tCard); if(ret) { if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_R; } dExpCalAmt=tCard.deposit_fee; break; default: ret=VarExp2NumExp(IA->dArrInAmt,IA->iArrInFeeSwitch,sFormula,num_exp); if(ret) { writelog(LOG_ERR,"ret[%d]txcode[%d]txtype[%d]formula[%s]",ret,IA->iTradeNo, iTxType,sFormula); return E_EXP_CFG; } // writelog(LOG_ERR,"formula[%s]num_exp[%s]",sFormula,num_exp); ret=ExpCalAmt(num_exp, &dExpCalAmt); if(ret) { writelog(LOG_ERR,"formula[%s]num_exp[%s]",sFormula,num_exp); return E_EXP_CFG; } writelog(LOG_ERR,"formula[%s]num_exp[%s]amt[%lf]",sFormula,num_exp,dExpCalAmt); break; } */ //根据公式计算发生额 ret=VarExp2NumExp(IA->dArrInAmt,IA->iArrInFeeSwitch,sFormula,num_exp); if(ret) { writelog(LOG_ERR,"ret[%d]txcode[%d]txtype[%d]formula[%s]",ret,IA->iTradeNo, iTxType,sFormula); return E_EXP_CFG; } // writelog(LOG_DEBUG,"formula[%s]num_exp[%s]",sFormula,num_exp); ret=ExpCalAmt(num_exp, &dExpCalAmt); if(ret) { writelog(LOG_ERR,"formula[%s]num_exp[%s]",sFormula,num_exp); return E_EXP_CFG; } dExpCalAmt=D4U5(dExpCalAmt,2); // writelog(LOG_DEBUG,"formula[%s]num_exp[%s]amt[%.4lf]",sFormula,num_exp,dExpCalAmt); //如果金额为0则continue if(amtcmp(dExpCalAmt,0)==0) { continue; } else if(amtcmp(dExpCalAmt,0)<0) { //如果不是冲正交易则不允许金额小于0 if(ACC_TYPE_NORMAL == IA->iTxFlag) { writelog(LOG_DEBUG,"交易名称[%s]当前交易金额[%.4lf]",CfgSplit.ArrCfgsplit[iTxType].txname,dExpCalAmt); if(IA->pVoidPointer != NULL) { sprintf((char*)IA->pVoidPointer,"%.2lf",dExpCalAmt); } return E_AMT_LACK; } } else { //冲正交易不允许金额大于0 if(ACC_TYPE_RUSH == IA->iTxFlag) { writelog(LOG_DEBUG,"交易名称[%s]当前交易金额[%.4lf]",CfgSplit.ArrCfgsplit[iTxType].txname,dExpCalAmt); return E_INPUT_AMT; } } //类型为0的交易是用来检查输入金额是否有错误 if(0==iTxType) { writelog(LOG_DEBUG,"交易名称[%s]当前交易金额[%.4lf]",CfgSplit.ArrCfgsplit[iTxType].txname,dExpCalAmt); return E_INPUT_AMT; } memset(sIdxDbActNo,0,sizeof(sIdxDbActNo)); memset(sIdxCrActNo,0,sizeof(sIdxCrActNo)); memset(&tTradelogDb, 0, sizeof(tTradelogDb)); memset(&tTradelogCr, 0, sizeof(tTradelogCr)); switch (CfgSplit.ArrCfgsplit[iTxType].dbflag) { case TYPE_INPUT: /* ret=GetValueFromFmtBuf(CfgFee.ArrCfgFee[idxTxCfg].idxdbactno_list,",",config_cnt,sIdxDbActNo); if(ret) { writelog(LOG_ERR, "TxCode[%d]FeeType[%d]idxdbactno_list[%s]",IA->iTradeNo,IA->iFeeType,CfgFee.ArrCfgFee[idxTxCfg].idxdbactno_list); return E_ACTNO_IDX_NOT_CFG; //交易未配置 } idx=atoi(sIdxDbActNo); if(idx<0) return E_ACTNO_IDX_CFG; strcpy(tTradelogDb.act_id, IA->sArrInActno[idx]); //借方账号 */ if(TXCODE_CARD_DBCR!=IA->iTradeNo) { if(strcmp(CfgSplit.ArrCfgsplit[iTxType].dbsubno,CfgSplit.ArrCfgsplit[iTxType].crsubno)!=0) { if(strncmp(CfgSplit.ArrCfgsplit[iTxType].dbsubno,SUBJECT_INDIVIDUALSAVING,3)==0) strcpy(tTradelogDb.act_id, IA->sArrInActno[0]); //借方账号(person) else if(strncmp(CfgSplit.ArrCfgsplit[iTxType].dbsubno,SUBJECT_SHOPSAVING,3)==0) strcpy(tTradelogDb.act_id, IA->sArrInActno[1]); //借方账号(shop) } else { strcpy(tTradelogDb.act_id, IA->sArrInActno[0]); //借方账号(person) } } else { strcpy(tTradelogDb.act_id, IA->sArrInActno[0]); //借方账号(person) } break; case TYPE_CONFIG: strcpy(tTradelogDb.act_id, CfgSplit.ArrCfgsplit[iTxType].dbactno); break; default: writelog(LOG_ERR, " TxType=[%d]",iTxType,CfgSplit.ArrCfgsplit[iTxType].dbflag); return E_DB_TRADEACT_R; } //修改借方帐户余额 tTradelogDb.op_fee = dExpCalAmt; //借方发生额 memset(&tAccountDb, 0, sizeof(tAccountDb)); ret = DB_t_aif_account_read_lock_by_cur_and_account_id(tTradelogDb.act_id, &tAccountDb); if (ret) { writelog(LOG_ERR, "read account err[%d]act_id[%s] ", ret, tTradelogDb.act_id); if (DB_NOTFOUND == ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } if(tAccountDb.current_state == ACCOUNTSTAT_LOGOUT) { DB_t_aif_account_free_lock_cur(); writelog(LOG_ERR, "read account err[%d]act_id[%s]", E_ACTNO_LOGOUT, tAccountDb.account_id); return E_ACTNO_LOGOUT; } if(CfgSplit.ArrCfgsplit[iTxType].dbsubno[0]!=0) { if(strcmp(tAccountDb.subno,CfgSplit.ArrCfgsplit[iTxType].dbsubno)!=0) { DB_t_aif_account_free_lock_cur(); writelog(LOG_ERR,"tradecode config_cnt[%d]TxType[%d]act_id[%s] tAccount.subno[%s]config dbsubno[%s]",config_cnt,iTxType,tAccountDb.account_id,tAccountDb.subno,CfgSplit.ArrCfgsplit[iTxType].dbsubno); return E_SPLIT_CFG; } } strcpy(tTradelogDb.subno,tAccountDb.subno); //借方科目号 // writelog(LOG_DEBUG,"debit No[%d]account[%s]account.cur_bala[%lf]cur_freebala[%lf]cur_frozebala[%lf]amt[%lf]",i,account.account_id,account.cur_bala,account.cur_freebala,account.cur_frozebala,tTradelogDb.op_fee); idxSubCfg=GetIndexSubjectCfgBySubNo(tAccountDb.subno); if(idxSubCfg<0) { writelog(LOG_ERR, "GetIndexSubjectCfgBySubNo[%d] ",tAccountDb.subno); DB_t_aif_account_free_lock_cur(); return E_DB_SUBJECT_N; } if (SUBTYPE_FUND== CfgSubject.ArrSubject[idxSubCfg].subtype|| SUBTYPE_COST== CfgSubject.ArrSubject[idxSubCfg].subtype ) { tAccountDb.cur_bala = D4U5(tAccountDb.cur_bala+ tTradelogDb.op_fee,6); tAccountDb.cur_freebala = D4U5(tAccountDb.cur_freebala+ tTradelogDb.op_fee,6); db_amt_flag=1; } else { db_amt_flag=-1; if(strncmp(tAccountDb.subno,"201",3)==0) { //消费时从冻结金额中扣除搭伙费 switch(CfgSplit.ArrCfgsplit[iTxType].fundtype) { case FUNDTYPE_BOARD://搭伙费 //如果搭伙费不足,则只扣账户上剩余的搭伙费 if(amtcmp(tAccountDb.cur_frozebala,0)<=0) { //如果搭伙费为负值或0,则不扣 DB_t_aif_account_free_lock_cur(); continue; } if(amtcmp(tAccountDb.cur_frozebala,tTradelogDb.op_fee)<0) { dExpCalAmt=tAccountDb.cur_frozebala; tTradelogDb.op_fee = dExpCalAmt; //借方发生额 } tAccountDb.cur_bala =D4U5(tAccountDb.cur_bala- tTradelogDb.op_fee,6); //总余额 tAccountDb.cur_frozebala = D4U5(tAccountDb.cur_frozebala - tTradelogDb.op_fee,6); break; default: tAccountDb.cur_bala =D4U5(tAccountDb.cur_bala- tTradelogDb.op_fee,6); //总余额 tAccountDb.cur_freebala =D4U5(tAccountDb.cur_freebala-tTradelogDb.op_fee,6); //可用余额 //更新卡余额 if(USE_CARD_TYPE_ONLINE==IA->iUseCardFlag) { if(amtcmp(dOutCardBala,0)>=0) { tAccountDb.card_balance=dOutCardBala; //卡余额 if(IA->iTxCnt>0) tAccountDb.consume_count=IA->iTxCnt; //消费次数增加 } else if(amtcmp(dInCardBala,0)>=0) { //有入卡值,没有出卡值,计算出卡值,卡余额 dCardBala = dCardBala - D4U5(tTradelogDb.op_fee,2); //卡余额 IA->dOutCardBala=D4U5(dCardBala,2); tAccountDb.card_balance=IA->dOutCardBala; //账户卡余额 if(IA->iTxCnt>0) tAccountDb.consume_count=IA->iTxCnt; } } else if(USE_CARD_TYPE_OFFLINE==IA->iUseCardFlag) { if(tAccountDb.consume_count<IA->iTxCnt) { if(amtcmp(dOutCardBala,0)>=0) { tAccountDb.card_balance=dOutCardBala; if(IA->iTxCnt>0) tAccountDb.consume_count=IA->iTxCnt; //消费次数增加 } else if(amtcmp(dInCardBala,0)>=0) { //有入卡值,没有出卡值,计算出卡值,卡余额 dCardBala = dCardBala - D4U5(tTradelogDb.op_fee,2); //卡余额 IA->dOutCardBala=D4U5(dCardBala,2); tAccountDb.card_balance=IA->dOutCardBala; //账户卡余额 if(IA->iTxCnt>0) tAccountDb.consume_count=IA->iTxCnt; } } //当前交易不是最近一次交易,有入卡值,只计算出卡值 else if((amtcmp(dInCardBala,0)>=0)&&(amtcmp(dOutCardBala,0)<0)) { //计算出卡值 dCardBala = dCardBala - D4U5(tTradelogDb.op_fee,2); //卡余额 IA->dOutCardBala=D4U5(dCardBala,2); } } break; } } else { /* //对押金单独处理 switch(iTxType) { case TXTYPE_RETURN_DEPOSIT: //退押金 case TXTYPE_DEDUCT_DEPOSIT: //扣押金 memset(&tCard,0,sizeof(tCard)); if(IA->iCardNo<1) { return E_INPUT_CARDNO_CANNOT_NULL; } ret=DB_t_pif_card_read_lock_by_cur_and_card_id(IA->iCardNo,&tCard); if(ret) { if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_R; } tCard.deposit_fee=0; ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_U; } DB_t_pif_card_free_lock_by_cur(); break; } */ tAccountDb.cur_bala =D4U5(tAccountDb.cur_bala - tTradelogDb.op_fee,6); tAccountDb.cur_freebala =D4U5(tAccountDb.cur_freebala- tTradelogDb.op_fee,6); } } //判断余额是否小于0,不允许透支,资产类帐户除外 //应该是负债类账户 if(strncmp(tAccountDb.subno,"2",1)==0) { if(amtcmp(tAccountDb.cur_bala,0)<0||amtcmp(tAccountDb.cur_freebala,0)<0) { writelog(LOG_ERR,"host serialno[%d]debit No[%d]account[%s]account.cur_bala[%lf]cur_freebala[%lf]cur_frozebala[%lf]amt[%lf]",IA->iSerialNo,i,tAccountDb.account_id,tAccountDb.cur_bala,tAccountDb.cur_freebala,tAccountDb.cur_frozebala,tTradelogDb.op_fee); DB_t_aif_account_free_lock_cur(); return E_BALANCE_SHORTAGE; } } tTradelogDb.new_fee = tAccountDb.cur_bala; //借方帐户总余额 tTradelogDb.cur_frozebala=tAccountDb.cur_frozebala; //冻结金额 ret = DB_t_aif_account_update_lock_by_cur(&tAccountDb); if (ret) { writelog(LOG_ERR, "update account err[%d] account[%s]", ret,tAccountDb.account_id); if (DB_NOTFOUND == ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_U; } DB_t_aif_account_free_lock_cur(); //###################################################### //处理贷方账号1 switch (CfgSplit.ArrCfgsplit[iTxType].crflag) { case TYPE_INPUT: /* ret=GetValueFromFmtBuf(CfgFee.ArrCfgFee[idxTxCfg].idxcractno_list,",",config_cnt,sIdxCrActNo); if(ret) { writelog(LOG_ERR, "TxCode[%d]FeeType[%d]idxcractno_list[%s]",IA->iTradeNo,IA->iFeeType,CfgFee.ArrCfgFee[idxTxCfg].idxcractno_list); return E_ACTNO_IDX_NOT_CFG; //交易未配置 } idx=atoi(sIdxCrActNo); if(idx<0) return E_ACTNO_IDX_CFG; strcpy(tTradelogCr.act_id, IA->sArrInActno[idx]); //贷方账号 */ if(TXCODE_CARD_DBCR!=IA->iTradeNo) { if(strcmp(CfgSplit.ArrCfgsplit[iTxType].dbsubno,CfgSplit.ArrCfgsplit[iTxType].crsubno)!=0) { if(strncmp(CfgSplit.ArrCfgsplit[iTxType].crsubno,SUBJECT_INDIVIDUALSAVING,3)==0) strcpy(tTradelogCr.act_id, IA->sArrInActno[0]); //贷方账号(person) else if(strncmp(CfgSplit.ArrCfgsplit[iTxType].crsubno,SUBJECT_SHOPSAVING,3)==0) strcpy(tTradelogCr.act_id, IA->sArrInActno[1]); //贷方账号(shop) } else { strcpy(tTradelogCr.act_id, IA->sArrInActno[1]); //贷方账号(person) } } else { strcpy(tTradelogCr.act_id, IA->sArrInActno[1]); //贷方账号(person) } break; case TYPE_CONFIG: strcpy(tTradelogCr.act_id, CfgSplit.ArrCfgsplit[iTxType].cractno); break; default: writelog(LOG_ERR, " TxType=[%d]",iTxType,CfgSplit.ArrCfgsplit[iTxType].crflag); return E_DB_TRADEACT_R; } //修改贷方帐户余额 tTradelogCr.op_fee =dExpCalAmt; //贷方发生额 memset(&tAccountCr, 0, sizeof(tAccountCr)); ret = DB_t_aif_account_read_lock_by_cur_and_account_id(tTradelogCr.act_id, &tAccountCr); if (ret) { writelog(LOG_ERR, "read account err[%d]act_id[%s]", ret, tTradelogCr.act_id); if (DB_NOTFOUND == ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } if(tAccountCr.current_state == ACCOUNTSTAT_LOGOUT) { DB_t_aif_account_free_lock_cur(); writelog(LOG_ERR, "read account err[%d]act_id[%s]", E_ACTNO_LOGOUT, tAccountCr.account_id); return E_ACTNO_LOGOUT; } if(CfgSplit.ArrCfgsplit[iTxType].crsubno[0]!=0) { if(strcmp(tAccountCr.subno,CfgSplit.ArrCfgsplit[iTxType].crsubno)!=0) { writelog(LOG_ERR,"tradecode config_cnt[%d]TxType[%d]act_id[%s] tAccount.subno[%s]config dbsubno[%s]",config_cnt,iTxType,tAccountCr.account_id,tAccountCr.subno,CfgSplit.ArrCfgsplit[iTxType].crsubno); DB_t_aif_account_free_lock_cur(); return E_SPLIT_CFG; } } strcpy(tTradelogCr.subno, tAccountCr.subno); //贷方科目号 // writelog(LOG_DEBUG,"credit No[%d]tAccount[%s]account.cur_bala[%lf]cur_freebala[%lf]cur_frozebala[%lf]amt[%lf]",i,account.account_id,account.cur_bala,account.cur_freebala,account.cur_frozebala,ArrTradelog[i+1].op_fee); idxSubCfg=GetIndexSubjectCfgBySubNo(tAccountCr.subno); if(idxSubCfg<0) { writelog(LOG_ERR, "GetIndexSubjectCfgBySubNo[%d] ", tAccountCr.subno); DB_t_aif_account_free_lock_cur(); return E_DB_SUBJECT_N; } if (SUBTYPE_FUND== CfgSubject.ArrSubject[idxSubCfg].subtype|| SUBTYPE_COST== CfgSubject.ArrSubject[idxSubCfg].subtype ) { tAccountCr.cur_bala =D4U5(tAccountCr.cur_bala- tTradelogCr.op_fee,6); //当前总余额 tAccountCr.cur_freebala =D4U5(tAccountCr.cur_freebala-tTradelogCr.op_fee,6); //当前可用余额 cr_amt_flag=-1; } else { cr_amt_flag=1; //如果帐户类型为个人,则计算搭伙费,主要是充值使用 if(strncmp(tAccountCr.subno,"201",3)==0) { tAccountCr.cur_bala =D4U5(tAccountCr.cur_bala+ tTradelogCr.op_fee,6); //总余额 switch(CfgSplit.ArrCfgsplit[iTxType].fundtype) { case FUNDTYPE_BOARD: //搭伙费 tAccountCr.cur_frozebala =D4U5(tAccountCr.cur_frozebala+ tTradelogCr.op_fee,6); break; default: tAccountCr.cur_freebala =D4U5(tAccountCr.cur_freebala+ tTradelogCr.op_fee,6); //可用余额 //更新卡余额 if(USE_CARD_TYPE_ONLINE==IA->iUseCardFlag) { if(IA->iTxCnt>0) tAccountCr.consume_count=IA->iTxCnt; //消费次数增加 else { DB_t_aif_account_free_lock_cur(); return E_INPUT_CARD_TXCNT; } if(amtcmp(dOutCardBala,0)>=0) { tAccountCr.card_balance=dOutCardBala; //卡余额 } else if(amtcmp(dInCardBala,0)>=0) { //有入卡值,没有出卡值,计算出卡值,卡余额 dCardBala = dCardBala + D4U5(tTradelogDb.op_fee,2); //卡余额 IA->dOutCardBala=D4U5(dCardBala,2); tAccountCr.card_balance=IA->dOutCardBala; //账户卡余额 } } else if(USE_CARD_TYPE_OFFLINE==IA->iUseCardFlag) { if(tAccountCr.consume_count<IA->iTxCnt) { if(IA->iTxCnt>0) tAccountCr.consume_count=IA->iTxCnt; //消费次数增加 if(amtcmp(dOutCardBala,0)>=0) { tAccountCr.card_balance=dOutCardBala; } else if(amtcmp(dInCardBala,0)>=0) { //有入卡值,没有出卡值,计算出卡值,卡余额 dCardBala = dCardBala + D4U5(tTradelogDb.op_fee,2); //卡余额 IA->dOutCardBala=D4U5(dCardBala,2); tAccountCr.card_balance=IA->dOutCardBala; //账户卡余额 } } //当前交易不是最近一次交易,有入卡值,只计算出卡值 else if((amtcmp(dInCardBala,0)>=0)&&(amtcmp(dOutCardBala,0)<0)) { //计算出卡值 dCardBala = dCardBala + D4U5(tTradelogDb.op_fee,2); //卡余额 IA->dOutCardBala=D4U5(dCardBala,2); } } break; } } else { //对押金单独处理 switch(iTxType) { case TXTYPE_TOLL_DEPOSIT: //收押金 case TXTYPE_TOLL_DEPOSIT_BILL: case TXTYPE_TOLL_DEPOSIT_FUNDBOOK: memset(&tCard,0,sizeof(tCard)); if(IA->iCardNo<1) { DB_t_aif_account_free_lock_cur(); return E_INPUT_CARDNO_CANNOT_NULL; } ret=DB_t_pif_card_read_lock_by_cur_and_card_id(IA->iCardNo,&tCard); if(ret) { DB_t_aif_account_free_lock_cur(); if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_R; } tCard.deposit_fee=tTradelogCr.op_fee; ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { DB_t_aif_account_free_lock_cur(); if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_U; } DB_t_pif_card_free_lock_by_cur(); default: break; } tAccountCr.cur_bala =D4U5(tAccountCr.cur_bala+tTradelogCr.op_fee,6); //当前总余额 tAccountCr.cur_freebala=D4U5(tAccountCr.cur_freebala+tTradelogCr.op_fee,6) ; //当前可用余额 } } //判断余额是否小于0,不允许透支,资产类帐户除外 if(strncmp(tAccountCr.subno,"2",1)==0) { if(amtcmp(tAccountCr.cur_bala,0)<0||amtcmp(tAccountCr.cur_freebala,0)<0) { writelog(LOG_ERR,"host serialno[%d]credit No[%d+1]account[%s]account.cur_bala[%lf]cur_freebala[%lf]cur_frozebala[%lf]amt[%lf]",IA->iSerialNo,i,tAccountCr.account_id,tAccountCr.cur_bala,tAccountCr.cur_freebala,tAccountCr.cur_frozebala,tTradelogDb.op_fee); DB_t_aif_account_free_lock_cur(); return E_BALANCE_SHORTAGE; } } tTradelogCr.new_fee = tAccountCr.cur_bala; //贷方帐户余额 tTradelogCr.cur_frozebala=tAccountCr.cur_frozebala; //冻结金额 ret = DB_t_aif_account_update_lock_by_cur(&tAccountCr); if (ret) { writelog(LOG_ERR, "update account err[%d] account[%s]", ret,tAccountCr.account_id); if (DB_NOTFOUND == ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_U; } DB_t_aif_account_free_lock_cur(); //增加借方分录流水 tTradelogDb.maindevice_id = IA->iMainDevId; //工作站标识 tTradelogDb.device_id= IA->iDevId; //终端设备ID tTradelogDb.serino = IA->iSerialNo; //流水号 tTradelogDb.seri_type= IA->iTradeNo; //交易码 tTradelogDb.fee_type=iTxType; //分录序号 tTradelogDb.warrant_type = iVocType; //凭证类型 strcpy(tTradelogDb.warrant_no, sVocNo); //凭证号 strcpy(tTradelogDb.comments, CfgSplit.ArrCfgsplit[iTxType].txname); //摘要 strcpy(tTradelogDb.operate_date, IA->sTxDate); //交易日期 strcpy(tTradelogDb.operate_time, IA->sTxTime); //交易时间 strcpy(tTradelogDb.collect_date,IA->sTxCollectDate); //采集日期 strcpy(tTradelogDb.collect_time,IA->sTxCollectTime); //采集时间 strcpy(tTradelogDb.enteract_date,IA->sTxAccDate); //记账日期 strcpy(tTradelogDb.enteract_time,IA->sTxAccTime); //记账时间 strcpy(tTradelogDb.record_oper, IA->sMdeOper); //录入操作员 strcpy(tTradelogDb.write_oper, IA->sChkOper); //复核记账员 tTradelogDb.outorin = DBCR_DEBIT; //借方标志 strcpy(tTradelogDb.other_actid, tTradelogCr.act_id); //对方账号 strcpy(tTradelogDb.other_subno, tTradelogCr.subno); //对方科目 ++IA->iSubIndex; tTradelogDb.annex = IA->iSubIndex; ret = DB_t_tif_tradelog_add(&tTradelogDb); if (ret) { writelog(LOG_ERR, "add ArrTradelog err[%d] ", ret); return E_DB_TRADELOG_I; } //增加贷方分录流水 tTradelogCr.maindevice_id = IA->iMainDevId; //工作站标识 tTradelogCr.device_id= IA->iDevId; //终端设备ID tTradelogCr.serino = IA->iSerialNo; //流水号 tTradelogCr.seri_type = IA->iTradeNo; //交易码 tTradelogCr.fee_type=iTxType; //分录序号 tTradelogCr.warrant_type = iVocType; //凭证类型 strcpy(tTradelogCr.warrant_no, sVocNo); //凭证号 strcpy(tTradelogCr.comments, CfgSplit.ArrCfgsplit[iTxType].txname);//摘要 strcpy(tTradelogCr.operate_date, IA->sTxDate); //交易日期 strcpy(tTradelogCr.operate_time, IA->sTxTime); //交易时间 strcpy(tTradelogCr.collect_date,IA->sTxCollectDate); //采集日期 strcpy(tTradelogCr.collect_time,IA->sTxCollectTime); //采集时间 strcpy(tTradelogCr.enteract_date,tTradelogDb.enteract_date);//记账日期 strcpy(tTradelogCr.enteract_time,tTradelogDb.enteract_time);//记账时间 strcpy(tTradelogCr.record_oper, IA->sMdeOper); //录入操作员 strcpy(tTradelogCr.write_oper, IA->sChkOper); //复核操作员 tTradelogCr.outorin = DBCR_CREDIT; //贷方标志 strcpy(tTradelogCr.other_actid, tTradelogDb.act_id); //对方账号 strcpy(tTradelogCr.other_subno, tTradelogDb.subno); //对方科目 tTradelogCr.annex = IA->iSubIndex; ret = DB_t_tif_tradelog_add(&tTradelogCr); if (ret) { writelog(LOG_ERR, "add ArrTradelog err[%d] ", ret); return E_DB_TRADELOG_I; } IA->dArrOutAmt[config_cnt]=dExpCalAmt; IA->iArrOutTxType[config_cnt]=iTxType; strcpy(IA->sArrOutTxName[config_cnt],CfgSplit.ArrCfgsplit[iTxType].txname); IA->iOutTxTypeCnt=config_cnt; //############################################################## if(IA->pVoidPointer!=NULL) { if(db_amt_flag>0) sprintf(pMessage+strlen(pMessage),"%s:余额增加%.2lf元", tAccountDb.cut_name,dExpCalAmt); else sprintf(pMessage+strlen(pMessage),"%s:余额减少%.2lf元", tAccountDb.cut_name,dExpCalAmt); if(cr_amt_flag>0) sprintf(pMessage+strlen(pMessage)," %s:余额增加%.2lf元",tAccountCr.cut_name,dExpCalAmt); else sprintf(pMessage+strlen(pMessage)," %s:余额减少%.2lf元", tAccountCr.cut_name,dExpCalAmt); } } //如果有入卡值但没有出卡值,则出卡值就是入卡值 if(amtcmp(IA->dOutCardBala,0)<0) { if(amtcmp(IA->dInCardBala,0)>=0) IA->dOutCardBala=IA->dInCardBala; } // writelog(LOG_DEBUG,"serino[%d]IA->dInCardBala[%lf]IA->dOutCardBala[%lf]IA->iTxCnt[%d]",IA->iSerialNo,IA->dInCardBala,IA->dOutCardBala,IA->iTxCnt); return 0; }
int F847105(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret =0; int i=0; int origin_card_id = 0; int bill_type=0; char physical_no[40+1] = ""; char logicdate[11] = ""; //业务日期 char sysdate[11]=""; char lost_date[11]=""; char systime[9]=""; char sEndDate[9]=""; char sMsg[256]=""; T_t_pif_card tCard; T_t_pif_cardlossinfo cardlossinfo; T_t_tif_tradeserial tradeserial; // T_t_tif_savdtl tSavdtl; InAcc IA; memset(&tCard,0,sizeof(tCard)); memset(&cardlossinfo,0,sizeof(cardlossinfo)); memset(&tradeserial,0,sizeof(tradeserial)); // memset(&tSavdtl,0,sizeof(tSavdtl)); memset(&IA,0,sizeof(IA)); getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } origin_card_id = rPack->lvol1; //原卡号 des2src(physical_no, rPack->sbank_acc); //物理卡号 if(rPack->lvol1<1) { *pRetCode=E_INPUT_CARDNO_CANNOT_NULL; goto L_RETU; } //查询支票经费本有无充值记录 /* ret=ChkSavdtl(origin_card_id,&tSavdtl); if(ret) { writelog(LOG_ERR,"ChkSavdtl ret[%d]",ret); *pRetCode=ret; goto L_RETU; } //Added by hhd at 2006-06-29 begin //增加判断:如果入卡值大于100,检查经费本知否充值过 //否则不加任何判断,退款到现金中 if(amtcmp(rPack->damt2,100.00)<0) { tSavdtl.bill_type=TYPE_CASH; } */ //Added by hhd at 2006-06-29 end tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type=TXCODE_CALLBACK_CARD; //功能号 tradeserial.serial_state = SERISTAT_DEBT; //流水状态 des2src(tradeserial.operate_date,sysdate); //发生日期 des2src(tradeserial.operate_time,systime); //发生时间 des2src(tradeserial.collect_date,sysdate); //采集日期 des2src(tradeserial.collect_time,systime); //采集时间 des2src(tradeserial.enteract_date,logicdate); //处理日期 des2src(tradeserial.enteract_time,systime); //处理时间 tradeserial.maindevice_id = rPack->lvol6; //上传工作站标识 tradeserial.device_id = rPack->lvol7; //采集设备标识 tradeserial.purse_id = PURSE_NO_ONE; //钱包号 tradeserial.sys_id = 0; //外部系统标识 des2src(tradeserial.oper_code, rPack->scust_limit); //操作员号 tradeserial.card_id=origin_card_id; ret=DB_t_pif_card_read_lock_by_cur_and_card_id(origin_card_id,&tCard); if(ret) { if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } // writelog(LOG_DEBUG,"input card_id[%d] card_id[%d]",origin_card_id,tCard.card_id); tradeserial.customer_id = tCard.cosumer_id; //客户标识 if(strncmp(tCard.state_id,CARDSTAT_REG,4)==0) { //检查物理卡号是否一致 trim(physical_no); trim(tCard.physical_no); if(strcmp(tCard.physical_no,physical_no)!=0) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"db physical_no[%s],input physical_no[%s]",tCard.physical_no,physical_no); *pRetCode= E_CARD_PHYNO_DIFFER; goto L_RETU; } } else if('2'==tCard.state_id[CARDSTAT_TYPE_REG]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode = E_CARDNO_LOGOUT; goto L_RETU; } //changed by hhd,泰州现场修改,复旦也有这种情况,必须人为干预 //换卡写卡失败和其它写卡失败,都已库为准退卡,屏蔽掉这两判断 /* else if('3'==tCard.state_id[CARDSTAT_TYPE_REG]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARD_CHANGE; goto L_RETU; } */ else if(tCard.state_id[CARDSTAT_TYPE_FREEZE]==STATE_TRUE) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDNO_FREEZE; goto L_RETU; } /* else if(tCard.state_id[CARDSTAT_TYPE_WFAIL]==STATE_TRUE) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDNO_WFAIL; goto L_RETU; } */ else if(tCard.state_id[CARDSTAT_TYPE_LOST]==STATE_TRUE) { if(IS_YES==rPack->lvol12) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDNO_LOST; goto L_RETU; } /* ret=DB_t_pif_cardlossinfo_read_by_card_id_and_state_id(origin_card_id, STATE_VALID, &cardlossinfo); if(ret) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"lost_card_id[%d]",origin_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } */ ret=get_latest_lost_date_by_card_no(origin_card_id,lost_date); if(ret) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"lost_card_id[%d]",origin_card_id); *pRetCode =ret; goto L_RETU; } //先检查客户的挂失的正式卡是否到了补办日期 ret=GetLostCardValiddate(lost_date,sEndDate); if(ret) { DB_t_pif_card_free_lock_by_cur(); *pRetCode =ret; goto L_RETU; } if(strncmp(sEndDate,sysdate,8)>0) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"lost_normal_card_id[%d]lost_date[%s]end_date[%s]",origin_card_id,lost_date,sEndDate); *pRetCode = E_NORMALCARD_NOT_REACH_ENDDATE; goto L_RETU; } /* //更新卡挂失日期表中该卡状态为无效 ret=UpdateCardLossInfoState(origin_card_id,STATE_VALID,STATE_INVALID); if(ret) { DB_t_pif_card_free_lock_by_cur(); *pRetCode =ret; goto L_RETU; } */ //正常情况下的押金都是退的,但是如果卡丢失则不退的 // IsReturnDeposit=IS_NO; } else if(IS_YES!=rPack->lvol12) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_NOCARD; goto L_RETU; } //注销原卡 des2src(tCard.state_id,CARDSTAT_LOGOUT); //注销 des2src(tCard.end_time,tradeserial.operate_date); //注销日期 ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",tCard.card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); //是否退费,规定正式卡和临时卡退押金,非记名临时卡退押金 if(IS_YES==rPack->lvol12) { IA.iUseCardFlag=USE_CARD_TYPE_ONLINE; //联机交易 IA.dInCardBala = rPack->damt2; //入卡值 IA.dOutCardBala=-1; //-1 表示空值 IA.iTxCnt = rPack->lvol10+1; //当前卡交易次数 tradeserial.in_balance = IA.dInCardBala; //入卡值 tradeserial.trade_count = IA.iTxCnt; } else { IA.iUseCardFlag=USE_CARD_TYPE_NULL; IA.dInCardBala = -1; //-1 表示空值 IA.dOutCardBala=-1; //-1 表示空值 IA.iTxCnt = -1; //-1 表示空值 } bill_type=TYPE_CASH; // IA.pVoidPointer=&tSavdtl.bill_type; IA.pVoidPointer=&bill_type; IA.iCardNo=tCard.card_id; ret=process(rPack,&IA,&tradeserial); if(ret) { *pRetCode=ret; goto L_RETU; } writelog(LOG_DEBUG,"input card_id[%d] card_id[%d]",origin_card_id,tCard.card_id); ret = DB_t_tif_tradeserial_add(&tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) *pRetCode= E_DB_TRADESERIAL_E; else *pRetCode= E_DB_TRADESERIAL_I; goto L_RETU; } ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_DAMT0,F_DAMT1,F_DAMT2,F_DAMT3,F_DAMT4,F_SDATE0,F_LVOL1,F_SPHONE,F_LSERIAL1,F_VSMESS,0); sprintf(out_pack->vsmess,"流水号:%d 卡号:%d ",IA.iSerialNo,IA.iCardNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { switch(IA.iArrOutTxType[i]) { case TXTYPE_DEDUCT_DEPOSIT: tradeserial.deposit_fee=IA.dArrOutAmt[i]; break; case TXTYPE_RETURN_DEPOSIT: case TXTYPE_RETURN_DEPOSIT_BILL: case TXTYPE_RETURN_DEPOSIT_FUNDBOOK: tradeserial.deposit_fee=IA.dArrOutAmt[i]; out_pack->damt0+=IA.dArrOutAmt[i]; break; case TXTYPE_DEDUCT_BOARD: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_RETURN_BOARD: case TXTYPE_RETURN_BOARD_BILL: case TXTYPE_RETURN_BOARD_FUNDBOOK: tradeserial.boardfee=IA.dArrOutAmt[i]; out_pack->damt0+=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: tradeserial.in_fee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CARDCOST: tradeserial.cost_fee=IA.dArrOutAmt[i]; break; case TXTYPE_DRAW_CASH: case TXTYPE_DRAW_BILL: case TXTYPE_DRAW_FUNDBOOK: case TXTYPE_DRAW_OTHER: tradeserial.trade_fee=IA.dArrOutAmt[i]; out_pack->damt0+=IA.dArrOutAmt[i]; break; default: break; } if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(out_pack->vsmess,sMsg); /* if((TXTYPE_DRAW_BILL==IA.iArrOutTxType[i])|| (TXTYPE_DRAW_FUNDBOOK==IA.iArrOutTxType[i])|| (TXTYPE_DRAW_OTHER==IA.iArrOutTxType[i])) { sprintf(sMsg,"票据号码:%s ",tSavdtl.bill_no); strcat(out_pack->vsmess,sMsg); } */ } } sprintf(sMsg,"实际应退金额:%.2lf元",out_pack->damt0); strcat(out_pack->vsmess,sMsg); writelog(LOG_DEBUG,out_pack->vsmess); if(amtcmp(tradeserial.out_balance,0)<0) { *pRetCode=E_ENTER_ACCOUNT; goto L_RETU; } // out_pack->lvol1=tSavdtl.bill_type; out_pack->lvol1=bill_type; // des2src(out_pack->sdate0,tSavdtl.tx_date); // out_pack->damt1=tSavdtl.amount; //经费本充值金额 out_pack->lserial1=tradeserial.serial_no; //流水号 // des2src(out_pack->sphone,tSavdtl.bill_no); PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
static int process(ST_PACK *rPack,InAcc *IA,T_t_tif_tradeserial *p) { int ret =0; int *ptype=NULL; double dSerialNo=0; int upd_flag=0; T_t_aif_account tAccount; T_t_cif_customer tCustomer; T_t_pif_card tCard; T_t_pif_spefee tSpeFee; memset(&tCustomer,0,sizeof(tCustomer)); memset(&tAccount,0,sizeof(tAccount)); memset(&tCard,0,sizeof(tCard)); memset(&tSpeFee,0,sizeof(tSpeFee)); //注销原卡 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(p->card_id, &tCard); if(ret) { if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_R; } if(p->card_id!=tCard.card_id) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"card_id[%d] db card_id[%d]",p->card_id,tCard.card_id); return E_DB_CARD_R; } p->deposit_fee =tCard.deposit_fee; //押金 // tCard.deposit_fee=0; des2src(tCard.state_id,CARDSTAT_LOGOUT); //注销 des2src(tCard.end_time,p->operate_date); //注销日期 ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",tCard.card_id); return E_DB_CARD_U; } DB_t_pif_card_free_lock_by_cur(); //如果是非记名临时卡则注销客户 ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(tCard.cosumer_id,&tCustomer); if(ret) { writelog(LOG_ERR,"cosumer_id[%d]",tCard.cosumer_id); if(DB_NOTFOUND==ret) return E_CUSTOMER_NOT_EXIST; else return E_DB_CUSTOMER_R; } if(CT_TEMP_NONAME==tCard.type_id) { tCustomer.cut_state=CUSTSTAT_LOGOUT; //注销 upd_flag=1; } if(tCustomer.fee_type<1) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); return E_DB_SPEFEE_R; } } else { tCustomer.fee_type=tSpeFee.fee_type; } upd_flag=1; } if(upd_flag) { ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { writelog(LOG_ERR,"cosumer_id[%d]",tCard.cosumer_id); return E_DB_CUSTOMER_U; } } DB_t_cif_customer_free_lock_cur(); IA->iFeeType=tCustomer.fee_type; ret=DB_t_aif_account_read_by_card_id_and_purse_id(tCard.card_id,PURSE_NO_ONE, &tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,tCard.card_id); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } /*Changed by hhd at 2005-10-22 14:21 处理卡库不平的退卡问题,如果卡库不等,则判断卡余额 是否小于库余额,如果不是这程序退出,否则按照库余额 和卡余额的差值进行退卡。搭伙费按照差值进行计算的余 额进行退还,该账户不注销,等待未上传得流水 */ if(USE_CARD_TYPE_ONLINE==IA->iUseCardFlag) //有卡交易 { if(amtcmp(D4U5(tAccount.cur_freebala,2),IA->dInCardBala)<0) { writelog(LOG_ERR,"card_id[%d] act_id[%s] cur_freebala[%lf],input card_balance[%lf]",tCard.card_id,tAccount.account_id,tAccount.cur_freebala,IA->dInCardBala); return E_CARD_ACC_NO_EQ; } if(amtcmp(D4U5(tAccount.cur_freebala,2),IA->dInCardBala)>0) { writelog(LOG_ERR,"card_id[%d] act_id[%s] cur_freebala[%lf],input card_balance[%lf]",tCard.card_id,tAccount.account_id,tAccount.cur_freebala,IA->dInCardBala); //只修改发生额,搭伙费全退,流水入账模块进行处理吧 p->trade_fee = IA->dInCardBala; //可用余额//Changed by hhd at 2005-10-22 14:21 strcpy(p->reserve_2,"卡库不符|按卡余额退卡"); //p->boardfee = (D4U5(tAccount.cur_freebala,2)-IA->dInCardBala); } else p->trade_fee = tAccount.cur_freebala; } else { p->trade_fee = tAccount.cur_freebala; //可用余额//Changed by hhd at 2005-10-22 14:21 } ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo); //获得最大流水号 if(ret) { return ret; } //把预提费用转为学校收益 p->serial_no=D2I(dSerialNo); des2src(p->showid,tCard.showid); //显示卡号 p->in_fee = 0; //管理费/手续费 //p->trade_fee = tAccount.cur_freebala; //可用余额//Changed by hhd at 2005-10-22 14:21 p->boardfee = tAccount.cur_frozebala; //冻结金额//Changed by hhd at 2005-10-22 14:21 IA->iTradeNo=p->serial_type; //交易码 IA->iMainDevId=p->maindevice_id; //工作站标识 IA->iDevId=p->device_id; //设备ID IA->iSerialNo=p->serial_no; //流水号 des2src(IA->sTxDate,p->operate_date); //交易日期 des2src(IA->sTxTime,p->operate_time); //交易时间 des2src(IA->sTxCollectDate,p->collect_date); //采集日期 des2src(IA->sTxCollectTime,p->collect_time); //采集时间 des2src(IA->sTxAccDate,p->enteract_date); //记账日期 des2src(IA->sTxAccTime,p->enteract_time); //记账时间 des2src(IA->sMdeOper,p->oper_code); //操作员 strcpy(IA->sChkOper,p->reserve_1); //复核操作员 des2src(IA->sArrInActno[0],tAccount.account_id); //卡帐户 ptype=(int*)IA->pVoidPointer; switch(*ptype) { case TYPE_CASH: //现金 IA->iArrInFeeSwitch[1]=1; break; case TYPE_BILL: //支票 IA->iArrInFeeSwitch[2]=1; break; case TYPE_FUNDBOOK: //经费本 IA->iArrInFeeSwitch[3]=1; break; default: writelog(LOG_ERR,"type[%d]",*ptype); IA->iArrInFeeSwitch[1]=1; break; } IA->pVoidPointer=NULL; //是否退卡余额和搭伙费 if(IS_YES==rPack->lvol3) { IA->iArrInFeeSwitch[5]=1; } //是否退押金 if(IS_YES==rPack->lvol2) { IA->iArrInFeeSwitch[6]=1; } IA->dArrInAmt[0]=p->trade_fee; //卡余额 IA->dArrInAmt[1]=p->boardfee; //搭伙费 IA->dArrInAmt[2]=p->deposit_fee; //押金 ret=AccountProcess(IA); if(ret) { writelog(LOG_ERR,"AccountProcess ret[%d]",ret); return ret; } //注销帐户 memset(&tAccount,0,sizeof(tAccount)); ret=DB_t_aif_account_read_lock_by_cur_and_account_id(IA->sArrInActno[0],&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_lock_by_cur_and_account_id ret[%d]account_id[%s]",ret,IA->sArrInActno[0]); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } //Changed by hhd at 2005-10-22 14:21 //修改账户状态时,这些账户置为4临时状态 //等待未上传流水回传入账 if(strcmp(p->reserve_2,"卡库不符|按卡余额退卡")==0) { tAccount.current_state= ACCOUNTSTAT_TEMP; //临时状态 } else { tAccount.current_state= ACCOUNTSTAT_LOGOUT; //注销 } des2src(tAccount.close_date,p->operate_date); //销户日期 des2src(tAccount.close_time,p->operate_time); //销户时间 ret=DB_t_aif_account_update_lock_by_cur(&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_update_lock_by_cur ret[%d]account_id[%s]",ret,tAccount.account_id); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_U; } DB_t_aif_account_free_lock_cur(); writelog(LOG_ERR,"out_balance= [%f]",IA->dOutCardBala); if(amtcmp(IA->dOutCardBala,0)>0) { return E_ENTER_ACCOUNT; } p->out_balance=0; //出卡值 ret = process_change_card(&tCustomer,&tCard); return ret; }
int F847108(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; int card_id = 0; char logicdate[11]=""; T_t_pif_card card; memset(&card,0,sizeof(card)); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } //修改原卡状态为发卡写卡失败状态 card_id = in_pack->lvol0; if(in_pack->lvol0<1) { writelog(LOG_ERR,"in_pack->lserial1[%d]",in_pack->lvol0); *pRetCode=E_INPUT_CARDNO; goto L_RETU; } if(in_pack->lserial1<1) { writelog(LOG_ERR,"in_pack->lserial1[%d]",in_pack->lserial1); *pRetCode= E_INPUT_SERIALNO; goto L_RETU; } ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } card.state_id[CARDSTAT_TYPE_WFAIL]=STATE_TRUE; memset(card.comments,0,sizeof(card.comments)); AddXmlItemStr(card.comments, XML_KEY_OPERATEDATE,logicdate); AddXmlItemInt(card.comments,XML_KEY_SERIALNO,in_pack->lserial1); AddXmlItemInt(card.comments,XML_KEY_TRADECODE,in_pack->lvol2); ret=DB_t_pif_card_update_lock_by_cur(&card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); return 0; L_RETU: return -1; }
int F240002(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; double unique=0; int temp_serial_no=0; char logicdate[11]=""; char buffer[16]=""; int i=0; double trans_amt=0.0; char sMsg[255]=""; char sDebugMsg[255]=""; char sMaxCardBalance[20]=""; double dMaxCardBalance=0; T_t_aif_account tAccount; //帐户表 T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; T_t_tif_tradeserial tradeserial; //卡操作流水表 T_t_pif_card card; InAcc IA; memset(&tSpeFee,0,sizeof(tSpeFee)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tAccount,0,sizeof(tAccount)); memset(&IA,0,sizeof(IA)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&card,0,sizeof(card)); ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_DAMT0,F_DAMT1,F_DAMT2,F_LVOL1,F_LVOL2,F_SBANK_CODE,F_SEMP_NO,0); //memset(&tradeserial_bak,0,sizeof(tradeserial_bak)); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"GetLogicDate error,errcode=[%d]",ret); goto L_RETU; } //判断设备是否登陆 if(0!=device_login_yes_or_no(atoi(rPack->sorder2))) { *pRetCode=E_TRANS_TERM_NOLOGIN; writelog(LOG_ERR,"Device don't login"); goto L_RETU; } //判断是否处于日终结算状态 ret=GetParameter(GLOBE_FLAG_BALANCE,buffer); if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"GetParameter error,errcode=[%d]",ret); goto L_RETU; } else if(strncmp(buffer,"0",1)!=0) { *pRetCode=E_TRANS_BANK_SERVICE_NOEXIT; writelog(LOG_ERR,"System is balance now!"); goto L_RETU; } ret=DB_t_pif_card_read_by_card_id(atoi(rPack->sserial0),&card); if(ret) { *pRetCode=E_TRANS_SCHACC_NOEXIT; writelog(LOG_ERR,"Create serial_no error,error code=[%d]",ret); goto L_RETU; } if(strncmp(card.state_id,CARDSTAT_LOGOUT,4)==0) { *pRetCode=E_TRANS_SCHACC_DESTORY; writelog(LOG_ERR,"card.state_id=[%d]",card.card_id); goto L_RETU; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_LOST]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_TRANS_SCHCARD_LOSTING; writelog(LOG_ERR,"card_state=[%s]",card.state_id); goto L_RETU; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_FREEZE]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_TRANS_SCHCARD_FREEZE; writelog(LOG_ERR,"card_state=[%s]",card.state_id); goto L_RETU; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_WFAIL]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_TRANS_SCHCARD_WFAIL; writelog(LOG_ERR,"card_state=[%s]",card.state_id); goto L_RETU; } //转账不允许转小数金额 if((rPack->lvol5)%100>0) { *pRetCode=E_TRANS_TRANSMONEY_OUTRANGE; writelog(LOG_ERR,"Trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0); goto L_RETU; } //开始填充流水数据 //流水号 ret=getNewUniqNo(KEYTYPE_TRADESERIAL, &unique); if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"Create serial_no error,error code=[%d]",ret); goto L_RETU; } tradeserial.serial_no=D2I(unique); //记录流水号,作为冲正使用 temp_serial_no=tradeserial.serial_no; tradeserial.other_seri_no=rPack->lvol0; //上传端流水号 tradeserial.serial_type=TXCODE_BANK_SCHOOL; //交易代码 tradeserial.serial_state=SERISTAT_NODEBT; //流水状态 tradeserial.card_id=atoi(rPack->sserial0); tradeserial.purse_id=0; tradeserial.in_balance=double((rPack->lvol6)/100.00); //入卡金额 tradeserial.out_balance=tradeserial.in_balance; //出卡金额 tradeserial.trade_count=rPack->lvol1+1; //当前卡中交易次数 ret=get_datetime_from_db(tradeserial.operate_date,tradeserial.operate_time); if(ret) { writelog(LOG_ERR,"get_datetime_from_db error,error code=[%d]",ret); getsysdate(tradeserial.operate_date); getsystime(tradeserial.operate_time); } Strncpy_t(tradeserial.collect_date,tradeserial.operate_date,sizeof(tradeserial.collect_date)); //采集日期 Strncpy_t(tradeserial.collect_time,tradeserial.operate_time,sizeof(tradeserial.collect_time)); //采集时间 Strncpy_t(tradeserial.enteract_date,logicdate,sizeof(tradeserial.enteract_date)); //入帐日期 Strncpy_t(tradeserial.enteract_time,tradeserial.operate_time,sizeof(tradeserial.enteract_time)); //入帐时间 tradeserial.maindevice_id=GetTransferSystemId(); //子系统号码 tradeserial.device_id=atoi(rPack->sorder2); //终端ID tradeserial.trade_fee=(rPack->lvol5)/100.0; //转帐金额 Strncpy_t(tradeserial.b_act_id,rPack->scust_auth,sizeof(tradeserial.b_act_id)); tradeserial.sys_id=rPack->lvol2; //表示银行 tradeserial.condition_id=SELF_TRANS; //自动/自助转帐标识 tradeserial.customer_id=card.cosumer_id; Strncpy_t(tradeserial.oper_code,OPER_SYSTEM_KEY,sizeof(tradeserial.oper_code)); //操作员代码 //判断转帐金额是否超出钱包最大限额 ret=DB_t_aif_account_read_by_card_id_and_purse_id(card.card_id, PURSE_NO_ONE,&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,card.card_id); if(DB_NOTFOUND==ret) { *pRetCode=E_TRANS_SCHACC_NOEXIT; goto L_RETU; } else { *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } } ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance); if(ret) { writelog(LOG_ERR,"GetParameter GLOBE_MAXCARDBALANCE error,errcode=[%d]",ret); *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } dMaxCardBalance=atof(sMaxCardBalance); if(amtcmp(tAccount.cur_bala+tradeserial.trade_fee,dMaxCardBalance)>0) { *pRetCode=E_TRANS_TRANSMONEY_OUTRANGE; goto L_RETU; } //读取客户收费类别字段 ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(card.cosumer_id, &tCustomer); if(ret) { writelog(LOG_ERR,"cut_id[%d]",card.cosumer_id); if(DB_NOTFOUND==ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } else { *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } } if(0==tCustomer.fee_type) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); writelog(LOG_ERR,"DB_t_pif_spefee_read_by_dept_code_and_cut_type error,errcode=[%d]",ret); *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } } else { tCustomer.fee_type=tSpeFee.fee_type; } } DB_t_cif_customer_free_lock_cur(); //记录流水数据,用于提供正确的流水号,以及银行业务不成功供查询 ret=DB_t_tif_tradeserial_add(&tradeserial); if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"Insert t_tif_tradeserial table error,error code=[%d]",ret); goto L_RETU; } ret=db_commit(); if(ret) { *pRetCode=E_DB_COMMIT; writelog(LOG_ERR,"db_commit error,error code=[%d]",ret); goto L_RETU; } //填写入账结构,问问闻剑 memset(&IA,0,sizeof(IA)); des2src(IA.sArrInActno[0],tAccount.account_id); //贷方帐户,持卡人账户 des2src(IA.sArrInActno[2],rPack->sstation0); //借方帐号,由前置机上传 switch (rPack->lvol3) { case 4: IA.iArrInFeeSwitch[1] = 1; break; case 5: IA.iArrInFeeSwitch[1] = 0; break; default: break; } IA.iCardNo=card.card_id; IA.iFeeType=tCustomer.fee_type; IA.dArrInAmt[0]=tradeserial.trade_fee; writelog(LOG_ERR,"借方帐号=[%d]",atoi(rPack->sstation0)); ret=process(&IA,&tradeserial); if(ret) { writelog(LOG_ERR,"process err,errcode[%d]",ret); *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } sprintf(sDebugMsg,"流水号:%d ",IA.iSerialNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { switch(IA.iArrOutTxType[i]) { case TXTYPE_TOLL_DEPOSIT: case TXTYPE_DEDUCT_DEPOSIT: case TXTYPE_RETURN_DEPOSIT: tradeserial.deposit_fee=IA.dArrOutAmt[i]; break; case TXTYPE_PRE_TOLL_BOARD: case TXTYPE_TOLL_BOARD: case TXTYPE_DEDUCT_BOARD: case TXTYPE_RETURN_BOARD: case TXTYPE_BANK_PRE_TOLL_BOARD: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: tradeserial.in_fee=IA.dArrOutAmt[i]; break; case TXTYPE_BANK_TRANSFER: trans_amt=IA.dArrOutAmt[i]; break; default: break; } if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(sDebugMsg,sMsg); } } sprintf(sMsg,"充值前卡余额:%.2lf 转帐后卡余额:%.2lf ",IA.dInCardBala,IA.dOutCardBala); strcat(sDebugMsg,sMsg); writelog(LOG_DEBUG,sDebugMsg); out_pack->damt0=tradeserial.out_balance; out_pack->damt1=tradeserial.trade_fee; out_pack->damt2=tradeserial.boardfee; out_pack->lvol1=tradeserial.serial_no; out_pack->lvol2=D2I(tradeserial.out_balance*100.0); des2src(out_pack->semp_no, tradeserial.operate_date); des2src(out_pack->sbank_code, tradeserial.operate_time); PutRow(handle,out_pack,pRetCode,szMsg); //业务结束后,回滚事务 ret=db_rollback(); if(ret) { *pRetCode=E_DB_ROLLBACK; writelog(LOG_ERR,"db_rollback error,error code=[%d]",ret); goto L_RETU; } return 0; L_RETU: return -1; }
static int do_process(T_t_pif_card *tCard, T_t_tif_writefailed *tWriteFailed, ST_PACK *rPack, T_t_tif_tradeserial *tradeserial) { int ret = 0; int free_lock_flag = 1; //0关闭, 1表示打开 char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char operate_date[11]=""; // char sSerialno[20]=""; char physical_no[41]=""; char old_physical_no[41]=""; char deal_flag[1 + 1] = ""; int iSerialno=0; int card_id=0; int serial_type=0; int flag=0; double dSerialno=0; double dAmt=0; int cnt_purse_no = 0; int card_use_cnt=0; int seri_use_cnt=0; double seri_in_bala=0; double seri_out_bala=0; double seri_in_bala_next=0; double seri_out_bala_next=0; int amt_flag=0; char tx_date[11]=""; T_t_tif_tradeserial_his tradeserialhis; T_t_tif_tradeserial old_tradeserial; memset(&old_tradeserial,0,sizeof(old_tradeserial)); memset(&tradeserialhis,0,sizeof(tradeserialhis)); des2src(physical_no,rPack->sbank_acc); card_id=rPack->lvol0; card_use_cnt=rPack->lvol8; cnt_purse_no = rPack->lvol4; getsysdate(sysdate); getsystime(systime); deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_Y; ret=GetLogicDate(logicdate); //业务日期 if(ret) { free_lock_flag = 0; goto L_RETU_INNER; } //判断卡状态是否为写卡未成功状态 ret=DB_t_pif_card_read_by_card_id(card_id, tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) ret = E_CARDNO_NOT_EXIST; else ret = E_DB_CARD_R; free_lock_flag = 0; goto L_RETU_INNER; } if(STATE_FALSE==tCard->state_id[CARDSTAT_TYPE_WFAIL]) { ret = E_CARDSTATE_NOTWRITEFAIL; free_lock_flag = 0; goto L_RETU_INNER; } ret = DB_t_tif_writefailed_read_lock_by_c1_and_card_id_and_purese_no_and_deal_flag(tCard->card_id,cnt_purse_no,&deal_flag[0],tWriteFailed); if (ret) { if (DB_NOTFOUND == ret) // ret = E_DB_WRITEFAILED_N; ret = E_WRITEFAILED_DEAL_FLAG_N; // 没有查到, 就是已经写过了 else ret = E_DB_WRITEFAILED_R; goto L_RETU_INNER; } // writelog(LOG_ERR,"XXX"); iSerialno = tWriteFailed->serial_no; des2src(operate_date,tWriteFailed->tx_date); writelog(LOG_DEBUG,"Serialno[%d]",iSerialno); writelog(LOG_DEBUG,"operate_date[%s]",operate_date); writelog(LOG_DEBUG,"logictime[%s]",logicdate); ret=DB_t_tif_tradeserial_read_by_operate_date_and_serial_no_and_card_id(operate_date,iSerialno,card_id,&old_tradeserial); if(ret) { if(DB_NOTFOUND!=ret) { writelog(LOG_ERR,"operate_date[%s]serialno[%d]card_id[%d]",operate_date,iSerialno,card_id); ret = E_DB_TRADESERIAL_R; goto L_RETU_INNER; } else { // TODO: 需要在数据库上建立索引 ret=DB_t_tif_tradeserial_his_read_by_operate_date_and_serial_no_and_card_id(operate_date,iSerialno,card_id,&tradeserialhis); if(ret) { writelog(LOG_ERR,"operate_date[%s]serialno[%d]card_id[%d]",operate_date,iSerialno,card_id); if(DB_NOTFOUND==ret) ret = E_SERIALNO_NOT_EXIST; else ret = E_DB_TRADESERIAL_R; goto L_RETU_INNER; } if(card_id!=tradeserialhis.card_id) { writelog(LOG_ERR,"input card_id [%d],tradeserial card_id[%d]",card_id,tradeserialhis.card_id); ret = E_CARDNO_SERIAL_NE; goto L_RETU_INNER; } serial_type=tradeserialhis.serial_type; flag=TYPE_HIS; } } else { if(card_id!=old_tradeserial.card_id) { writelog(LOG_ERR,"input card_id [%d],tradeserial card_id[%d]",card_id,old_tradeserial.card_id); ret = E_CARDNO_SERIAL_NE; goto L_RETU_INNER; } serial_type=old_tradeserial.serial_type; flag=TYPE_CUR; } if(TYPE_CUR==flag) { seri_in_bala=old_tradeserial.in_balance; seri_out_bala=old_tradeserial.out_balance; strncpy(tx_date,old_tradeserial.operate_date,sizeof(tx_date)); dAmt=D4U5(old_tradeserial.out_balance-old_tradeserial.in_balance,2); //发生额=出卡值-入卡值 seri_use_cnt=old_tradeserial.trade_count; } else { seri_in_bala=tradeserialhis.in_balance; seri_out_bala=tradeserialhis.out_balance; strncpy(tx_date,tradeserialhis.operate_date,sizeof(tx_date)); dAmt=D4U5(tradeserialhis.out_balance-tradeserialhis.in_balance,2); //发生额=出卡值-入卡值 seri_use_cnt=tradeserialhis.trade_count; } des2src(old_physical_no,tCard->physical_no); trim(physical_no); trim(old_physical_no); switch(serial_type) { //发行正式卡 case 847101: //补办正式卡 case 847104: //发行过渡临时卡 case 847116: //发行非记名临时卡 case 847124: case 847125: case 847126: if(strcmp(old_physical_no,physical_no)!=0) { ret=IsExistCardByPhyCardNo(physical_no); if(ret) { goto L_RETU_INNER; } //修改卡标志,置为正常状态 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) ret = E_CARDNO_NOT_EXIST; else ret = E_DB_CARD_R; goto L_RETU_INNER; } ret = InsertToCutUpdList(tCard->card_id,CUTUPD_CH_OLDCARD,tCard->physical_no); if(ret) { DB_t_pif_card_free_lock_by_cur(); goto L_RETU_INNER; } des2src(tCard->physical_no,physical_no); //更换物理卡号 ret=DB_t_pif_card_update_lock_by_cur(tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) ret = E_CARDNO_NOT_EXIST; else ret = E_DB_CARD_U; goto L_RETU_INNER; } DB_t_pif_card_free_lock_by_cur(); ret = InsertToCutUpdList(tCard->card_id,CUTUPD_CH_NEWCARD,tCard->physical_no); if(ret) { goto L_RETU_INNER; } // 宏定义的判断, 0表示成功, 1表示不需要插入 /* if (0 == insert_chcard_blacklist(serial_type)) { ret = InsertToBlkList(tCard->card_id,CHCARD_BLACKLIST); if (ret) { goto L_RETU_INNER; } } */ // add by 汤成 2005-8-10 // 增加向名单表写入记录 /* switch(serial_type) { //补办正式卡 case 847104: //发行过渡临时卡 case 847116: // 记名临时卡 //case 847124: // VIP 卡 case 847126: ret = InsertToBlkList(tCard.card_id,CHCARD_BLACKLIST); if(ret) { goto L_RETU_INNER; } break; default: break; } */ } tradeserial->in_balance=0; //入卡值 des2src(tWriteFailed->comments, "补写卡成功"); break; //补写水控小钱包, 因小钱包扣款失败而起 //水控小钱包补写归类到847119中,不单独编写 case 847300: des2src(tWriteFailed->comments, "小钱包补写卡成功"); tradeserial->in_balance = rPack->damt1; writelog(LOG_ERR,"小钱包入卡值[%f]",tradeserial->in_balance); break; //补写水控大钱包, 因大钱包扣款失败而起 //水控制大钱包补写归类到847119中, 不单独编写 case 847301: des2src(tWriteFailed->comments, "大钱包补写卡成功"); tradeserial->in_balance = rPack->damt1; break; //银行转帐-Added by hhd at 20051225 //考虑到有可能圈存写卡成功,但是提示失败 //避免重复写卡 case 240001: //判断卡中交易次数是否等于发生错误的流水的交易次数 writelog(LOG_ERR,"card_use_cnt=[%d],seri_use_cnt=[%d]",card_use_cnt,seri_use_cnt); if((card_use_cnt+1)==seri_use_cnt) { //判断上传入卡值是否等于发生错误的流水的入卡值 if(amtcmp(rPack->damt1,seri_in_bala)==0) //入卡值等于入卡值,卡没有写上 tradeserial->in_balance=rPack->damt1; else if(amtcmp(rPack->damt1,seri_out_bala)==0) //入卡值等于出卡值,卡已经写上 { tradeserial->in_balance=rPack->damt1; amt_flag=1; } else { writelog(LOG_ERR,"In_balance abnormity,in_bala=[%f]",rPack->damt1); ret = E_ENTER_ACCOUNT; goto L_RETU_INNER; } } else if((card_use_cnt+1)>seri_use_cnt) { //当写卡不成功时,一般不会更新卡的交易次数, //导致下一次的交易次数还是等于失败流水的次数, //所以去下一条流水的时候,如果取不到,就+1 ret=Get_card_next_serial(tCard->card_id,tx_date,seri_use_cnt,&seri_in_bala_next,&seri_out_bala_next); if(ret) { if(DB_NOTFOUND==ret) { ret=Get_card_next_serial(tCard->card_id,tx_date,seri_use_cnt+1,&seri_in_bala_next,&seri_out_bala_next); if(ret) { writelog(LOG_ERR,"Get_card_next_serial(=) error,errcode=[%d]",ret); writelog(LOG_ERR,"没有找到下一笔流水"); goto L_RETU_INNER; } } else { writelog(LOG_ERR,"Get_card_next_serial(+1) error,errcode=[%d]",ret); goto L_RETU_INNER; } } writelog(LOG_INFO,"seri_in_bala_next=[%f],seri_in_bala=[%f],seri_out_bala=[%f]",seri_in_bala_next,seri_in_bala,seri_out_bala); if(amtcmp(seri_in_bala_next/100,seri_in_bala)==0) tradeserial->in_balance=rPack->damt1; else if(amtcmp(seri_in_bala_next/100,seri_out_bala)==0) { tradeserial->in_balance=rPack->damt1; amt_flag=1; } else { tradeserial->in_balance=rPack->damt1; writelog(LOG_ERR,"In_balance abnormity,in_bala=[%f]",rPack->damt1); ret = E_ENTER_ACCOUNT; goto L_RETU_INNER; } } else { writelog(LOG_ERR,"In_total_cnt abnormity,in_total_cnt=[%d]",card_use_cnt); ret = E_ENTER_ACCOUNT; goto L_RETU_INNER; } default: if(strcmp(old_physical_no,physical_no)!=0) { writelog(LOG_ERR,"db physical_no[%s],input physical_no[%s]",old_physical_no,physical_no); ret = E_CARD_PHYNO_DIFFER; goto L_RETU_INNER; } tradeserial->in_balance=rPack->damt1; //入卡值 break; } if(TYPE_CUR==flag) dAmt=D4U5(old_tradeserial.out_balance-old_tradeserial.in_balance,2); //发生额=出卡值-入卡值 else dAmt=D4U5(tradeserialhis.out_balance-tradeserialhis.in_balance,2); //发生额=出卡值-入卡值 //说明不需要写卡,则发生额置为0 if(amt_flag==1) { tradeserial->trade_fee=0; //补写卡值 } else { tradeserial->trade_fee=dAmt; //补写卡值 } tradeserial->out_balance=tradeserial->in_balance+dAmt; //出卡值 writelog(LOG_ERR,"小钱包出卡值[%f]",tradeserial->out_balance); writelog(LOG_ERR,"小钱包交易金额[%f]",dAmt); if(tradeserial->out_balance<0||tradeserial->out_balance>999) { writelog(LOG_ERR,"tradeserial.out_balance[%lf]",tradeserial->out_balance); ret = E_TX_SERIAL; goto L_RETU_INNER; } writelog(LOG_DEBUG,"写卡失败日期%s,补写流水号%d,交易码%d,卡号%d,补写金额%.2lf,入卡值%lf,出卡值%lf",operate_date,iSerialno,serial_type,card_id,dAmt,tradeserial->in_balance,tradeserial->out_balance); ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialno); //获得流水号 if(ret) { writelog(LOG_ERR,"ret [%d]",ret); goto L_RETU_INNER; } tradeserial->serial_no = D2I(dSerialno); //流水号 tradeserial->other_seri_no = 0; //上传端流水号 tradeserial->serial_type = TXCODE_REWRITE_CARD; //交易代码;备注:发卡+充值 用一个交易码,即847101; 发卡(不充值)另用一个交易码,即新的发卡程序文件名,从而区分发卡充值与发卡不充值的卡操作信息。 tradeserial->serial_state = SERISTAT_DEBT; //流水状态 des2src(tradeserial->operate_date,sysdate); //发生日期 des2src(tradeserial->operate_time,systime); //发生时间 des2src(tradeserial->collect_date,sysdate); //采集日期 des2src(tradeserial->collect_time,systime); //采集时间 des2src(tradeserial->enteract_date,logicdate); //处理日期 des2src(tradeserial->enteract_time,systime); //处理时间 des2src(tradeserial->oper_code , rPack->scust_limit); tradeserial->maindevice_id = rPack->lvol6; //上传工作站标识 tradeserial->device_id = rPack->lvol7; //采集设备标识 tradeserial->card_id = tCard->card_id; //卡号 des2src(tradeserial->showid,tCard->showid); //显示卡号 tradeserial->purse_id = cnt_purse_no; //钱包号,根据具体发现需要补写的钱包号决定 tradeserial->customer_id = tCard->cosumer_id; //客户标识 tradeserial->reviseserial_no = iSerialno; //原写卡失败流水号 tradeserial->trade_count = card_use_cnt + 1; //交易次数为卡交易次数+1 // 插入交易流水表 ret = DB_t_tif_tradeserial_add(tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) ret = E_DB_TRADESERIAL_E; else ret = E_DB_TRADESERIAL_I; goto L_RETU_INNER; } /******************************************************************/ //更新写卡失败表 tWriteFailed->deal_serial_no = tradeserial->serial_no; // writelog(LOG_ERR,"流水号[%d]",tWriteFailed->deal_serial_no); tWriteFailed->deal_bala = tradeserial->trade_fee; des2src(tWriteFailed->deal_date,sysdate); des2src(tWriteFailed->deal_time,systime); // tWriteFailed->deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_N; ret = DB_t_tif_writefailed_update_lock_by_c1(tWriteFailed); if (ret) { if (DB_NOTFOUND == ret) { ret = E_DB_WRITEFAILED_N; } else { ret = E_DB_WRITEFAILED_U; } goto L_RETU_INNER; } DB_t_tif_writefailed_free_lock_by_c1(); /******************************************************************/ return 0; L_RETU_INNER: if (free_lock_flag) DB_t_tif_writefailed_free_lock_by_c1(); return ret; }
int F847103(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret = 0; int hi_cardid = 0; char hi_Operator[33+1] = ""; int hi_Cut_id = 0; int hi_maindevice_id = 0; int hi_device_id = 0; double h_temp_Serial_no = 0; char logicdate[11]=""; char sysdate[11]=""; char systime[8]=""; char dbdate[9]=""; char dbtime[7]=""; char volume[13]=""; T_t_tif_tradeserial tradeserial; T_t_pif_card tCard; T_t_tif_meslist tMesList; T_t_pif_device t_device; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); //用于根据请求包整理本CPACK包的头清空包头位图和包体中的数据 memset(&t_device,0,sizeof(t_device)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&tCard,0,sizeof(tCard)); memset(&tMesList,0,sizeof(tMesList)); hi_cardid = rPack->lvol1; //卡标识 hi_Cut_id = rPack->lvol2; //客户号 des2src(hi_Operator,rPack->scust_limit); //操作员号 hi_maindevice_id = rPack->lvol6; //上传工作站标识 hi_device_id = rPack->lvol7; //采集设备标识 if(hi_maindevice_id==0&&hi_device_id!=0) { DB_t_pif_device_read_by_device_id(hi_device_id, &t_device); hi_maindevice_id=t_device.subsystem_id; } getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } // 检查卡状态是否为挂失 ret = DB_t_pif_card_read_lock_by_cur_and_card_id(hi_cardid,&tCard); if (ret) { writelog(LOG_ERR,"card_id[%d]",hi_cardid); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode=E_DB_CARD_R; goto L_RETU; } hi_Cut_id=tCard.cosumer_id; if('2'==tCard.state_id[CARDSTAT_TYPE_REG]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode = E_CARDNO_LOGOUT; goto L_RETU; } tCard.state_id[CARDSTAT_TYPE_LOST]=STATE_FALSE; strcpy(tCard.lost_date,""); ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",hi_cardid); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&h_temp_Serial_no); //获得最大流水号 if(ret) { *pRetCode = ret; writelog(LOG_ERR,"ERRCODE = [%d]",ret); goto L_RETU; } des2src(tradeserial.operate_date,sysdate); //发生日期 des2src(tradeserial.operate_time,systime); //发生时间 des2src(tradeserial.collect_date,sysdate); //采集日期 des2src(tradeserial.collect_time,systime); //采集时间 des2src(tradeserial.enteract_date,logicdate); //处理日期 des2src(tradeserial.enteract_time,systime); //处理时间 tradeserial.serial_no = D2I(h_temp_Serial_no); //流水号 tradeserial.serial_type = TXCODE_CARD_COMEBACK_LOSS; //解挂 tradeserial.serial_state = SERISTAT_NONEEDDEBT; //流水状态 tradeserial.maindevice_id = hi_maindevice_id; //上传工作站标识 tradeserial.device_id = hi_device_id; //采集设备标识 tradeserial.card_id = hi_cardid; //交易卡号 tradeserial.customer_id = hi_Cut_id; des2src(tradeserial.oper_code, hi_Operator); if(STATE_FALSE==tCard.state_id[CARDSTAT_TYPE_LOST]) { //允许重复解挂 //再下传白名单 // 插入黑名单表 ret=InsertToBlkList(hi_cardid,DELETE_BLACKLIST); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"InsertToBlkList err[%d]",ret); goto L_RETU; } //广播黑名单 // AddXmlItemInt(tMesList.incontent, XML_KEY_CARDID,hi_cardid); // AddXmlItemInt(tMesList.incontent, XML_KEY_ADDDELSIGN,DELETE_BLACKLIST); //增删标志 // // tMesList.funid = 930005; // tMesList.pfunid = 930003; // tMesList.max_send_cnt = 10; // tMesList.level = MESLIST_PRIORITY_REALTIME; // tMesList.msgtype = MESLIST_TYPE_ORDER; // ret=AddMsgLst(&tMesList); // if(ret) // { // *pRetCode=ret; // writelog(LOG_ERR,"AddMsgLst err[%d]",ret); // goto L_RETU; // } // ret=get_datetime_from_db(dbdate,dbtime); // if(ret) // { // *pRetCode = ret; // writelog(LOG_ERR,"ret [%d]",ret); // goto L_RETU; // } ret = SaveCancelLossSerial(&tradeserial); if(ret) { *pRetCode = ret; writelog(LOG_ERR,"ret [%d]",ret); goto L_RETU; } ret=GetCardMaxBlkVerNo(hi_cardid,volume); if(ret) { *pRetCode = ret; goto L_RETU; } SetCol(handle,0); SetCol(handle,F_SSERIAL0,0); des2src(out_pack->sserial0,volume); //卡版本号 writelog(LOG_ERR,"volume:[%s]",volume); PutRow(handle,out_pack,pRetCode,szMsg); return 0; } ret=IsExistNoLostCardByCustomId(hi_Cut_id); if(ret) { if(E_NORMALCARD_NOLOST==ret) { *pRetCode = E_BACK_CARD_FOR_NORCARD2; } else if( E_TEMPCARD_NOLOST==ret) { //如果存在正常使用的临时卡,则提示请退掉此卡,不能解挂 if(tCard.type_id==CT_NORMAL) *pRetCode =E_BACK_CARD_FOR_NORCARD; else *pRetCode =E_BACK_CARD_FOR_TMPCARD; } else { *pRetCode = ret; } goto L_RETU; } if(STATE_FALSE==tCard.state_id[CARDSTAT_TYPE_FREEZE]) { //插入黑名单表 ret=InsertToBlkList(hi_cardid,DELETE_BLACKLIST); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"InsertToBlkList err[%d]",ret); goto L_RETU; } //广播黑名单 // AddXmlItemInt(tMesList.incontent, XML_KEY_CARDID,hi_cardid); // AddXmlItemInt(tMesList.incontent, XML_KEY_ADDDELSIGN,DELETE_BLACKLIST); //增删标志 // // tMesList.funid = 930005; // tMesList.pfunid = 930003; // tMesList.max_send_cnt = 10; // tMesList.level = MESLIST_PRIORITY_REALTIME; // tMesList.msgtype = MESLIST_TYPE_ORDER; // ret=AddMsgLst(&tMesList); // if(ret) // { // *pRetCode=ret; // writelog(LOG_ERR,"AddMsgLst err[%d]",ret); // goto L_RETU; // } } // 修改卡状态为解挂状态 // ret = UpdateCardState(hi_cardid,CARDSTAT_TYPE_LOST,STATE_FALSE); // if (ret) // { // *pRetCode = ret; // goto L_RETU; // } // 准备数据插入交易流水表 ///////////////// ret = SaveCancelLossSerial(&tradeserial); if(ret) { *pRetCode = ret; goto L_RETU; } ret=GetCardMaxBlkVerNo(hi_cardid,volume); if(ret) { *pRetCode = ret; goto L_RETU; } SetCol(handle,0); SetCol(handle,F_SSERIAL0,0); des2src(out_pack->sserial0,volume); //卡版本号 // writelog(LOG_DEBUG,"volume:[%s]",volume); PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F847122(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; int card_id=0; T_t_pif_card tCard; T_t_aif_account tAccount; memset(&tCard,0,sizeof(tCard)); memset(&tAccount,0,sizeof(tAccount)); card_id=rPack->lvol0; if(card_id<1) { *pRetCode=E_INPUT_CARDNO; goto L_RETU; } if(rPack->lvol10<1) { *pRetCode=E_INPUT_CARD_TXCNT; goto L_RETU; } if(amtcmp(rPack->damt0,0)<0) { *pRetCode=E_INPUT_CARD_BALA; goto L_RETU; } //判断卡状态是否为写卡未成功状态 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } if(card_id!=tCard.card_id) { writelog(LOG_ERR,"card_id[%d] db card_id[%d]",card_id,tCard.card_id); DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_DB_CARD_R; goto L_RETU; } if(strncmp(tCard.state_id,CARDSTAT_REG,4)!=0) { DB_t_pif_card_free_lock_by_cur(); if('2'==tCard.state_id[CARDSTAT_TYPE_REG]) *pRetCode=E_CARDNO_LOGOUT; else if('3'==tCard.state_id[CARDSTAT_TYPE_REG]) return 0; else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_LOST]) *pRetCode=E_CARDNO_LOST; else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_FREEZE]) *pRetCode=E_CARDNO_FREEZE; else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_WFAIL]) *pRetCode=E_CARDNO_WFAIL; goto L_RETU; } trim(rPack->sbank_acc); if(strcmp(tCard.physical_no,rPack->sbank_acc)!=0) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"db physical_no[%s],input physical_no[%s]",tCard.physical_no,rPack->sbank_acc); *pRetCode= E_CARD_PHYNO_DIFFER; goto L_RETU; } tCard.state_id[CARDSTAT_TYPE_REG]='3'; ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); //注销帐户 ret=DB_t_aif_account_read_lock_by_cur4_and_card_id_and_purse_id(card_id,PURSE_NO_ONE, &tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_lock_by_cur4_and_card_id_and_purse_id ret[%d]card_id[%d]",ret,card_id); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } tAccount.consume_count=rPack->lvol10; tAccount.card_balance=rPack->damt0; ret=DB_t_aif_account_update_lock_by_cur4(&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_update_lock_by_cur4 ret[%d]account_id[%s]",ret,tAccount.account_id); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_U; } DB_t_aif_account_free_lock_cur4(); return 0; L_RETU: return -1; }
int F847304(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; T_t_pif_card tCard; T_t_tif_writefailed tWriteFailed; T_t_tif_tradeserial tTradeSerial; char logicdate[11] = ""; double dUniqNo = 0; memset(&tCard, 0, sizeof tCard); memset(&tWriteFailed, 0, sizeof tWriteFailed); memset(&tTradeSerial, 0, sizeof(tTradeSerial)); ret = DB_t_tif_tradeserial_read_by_serial_no(in_pack->lvol1, &tTradeSerial); //消费流水号 if (ret) { writelog(LOG_DEBUG,"输入号不存在消费流水号[%d]",in_pack->lvol1); if (DB_NOTFOUND == ret) { *pRetCode = E_DB_TRADESERIAL_N; } else { *pRetCode = E_DB_TRADESERIAL_R; } goto L_RETU; } ret = DB_t_pif_card_read_lock_by_cur_and_card_id(tTradeSerial.card_id, &tCard); if (ret) { if (DB_NOTFOUND == ret) { *pRetCode = E_DB_CARD_N; } else { *pRetCode = E_DB_CARD_R; } goto L_RETU; } ret = DB_t_tif_writefailed_read_by_card_id_and_serial_no(tCard.card_id, tTradeSerial.serial_no, &tWriteFailed); if (ret) { if (DB_NOTFOUND != ret) { *pRetCode = E_DB_WRITEFAILED_R; goto L_RETU; } } else { if (CARDWFAIL_PACKET_DEAL_FLAG_Y == tWriteFailed.deal_flag[0]) *pRetCode = E_WRITEFAILED_DEAL_FLAG_Y; else *pRetCode = E_WRITEFAILED_DEAL_FLAG_N; goto L_RETU; } ret = getNewUniqNo(KEYTYPE_WRITEFAILED, &dUniqNo); // 获得写卡失败表最大ID号 if (ret) { writelog(LOG_ERR,"ret[%d]",ret); *pRetCode = ret; DB_t_pif_card_free_lock_by_cur(); goto L_RETU; } GetLogicDate(logicdate); tWriteFailed.card_id = tCard.card_id; des2src(tWriteFailed.tx_date,logicdate); tWriteFailed.id = D2I(dUniqNo); tWriteFailed.serial_no = tTradeSerial.serial_no; tWriteFailed.serial_type = tTradeSerial.serial_type; tWriteFailed.purese_no = tTradeSerial.purse_id; tWriteFailed.deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_Y; tWriteFailed.deal_bala = tTradeSerial.trade_fee; // des2src(tWriteFailed.comments, "大钱包写卡失败"); des2src(tWriteFailed.comments, in_pack->vsmess); // 注释写卡失败原因 ret = DB_t_tif_writefailed_add(&tWriteFailed); if (ret) { *pRetCode = E_DB_WRITEFAILED_I; DB_t_pif_card_free_lock_by_cur(); goto L_RETU; } tCard.state_id[CARDSTAT_TYPE_WFAIL] = STATE_TRUE; ret = DB_t_pif_card_update_lock_by_cur(&tCard); if (ret) { *pRetCode = E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); return 0; L_RETU: return -1; }
int F847108(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; int card_id = 0; char logicdate[11]=""; double dUniqNo = 0; T_t_pif_card card; T_t_tif_writefailed tWriteFailed; memset(&card,0,sizeof(card)); memset(&tWriteFailed, 0, sizeof tWriteFailed); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } //修改原卡状态为发卡写卡失败状态 card_id = in_pack->lvol0; if(in_pack->lvol0<1) { writelog(LOG_ERR,"card_id=[%d]",in_pack->lvol0); *pRetCode=E_INPUT_CARDNO; goto L_RETU; } if(in_pack->lserial1<1) { writelog(LOG_ERR,"serial_no=[%d]",in_pack->lserial1); *pRetCode= E_INPUT_SERIALNO; goto L_RETU; } ret = DB_t_tif_writefailed_read_by_card_id_and_serial_no_and_tx_date(card_id,in_pack->lserial1,logicdate,&tWriteFailed); if(ret) { if(ret != DB_NOTFOUND) return E_DB_WARRANT_R; } else return 0; //已经插入,直接返回 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } if (STATE_FALSE == card.state_id[CARDSTAT_TYPE_WFAIL]) { card.state_id[CARDSTAT_TYPE_WFAIL]=STATE_TRUE; } ret=DB_t_pif_card_update_lock_by_cur(&card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); //写入写卡失败表 ret = getNewUniqNo(KEYTYPE_WRITEFAILED, &dUniqNo); //获得写卡失败表最大ID号 if (ret) { writelog(LOG_ERR,"ret[%d]",ret); *pRetCode = ret; goto L_RETU; } tWriteFailed.id = D2I(dUniqNo); tWriteFailed.card_id = card_id; tWriteFailed.serial_no = in_pack->lserial1; // tWriteFailed.serial_type = TXCODE_WRITE_ERROR; tWriteFailed.serial_type = in_pack->lvol2; tWriteFailed.purese_no = PURSE_NO_ONE; tWriteFailed.deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_Y; des2src(tWriteFailed.tx_date,logicdate); des2src(tWriteFailed.comments, "发卡失败"); ret = DB_t_tif_writefailed_add(&tWriteFailed); if (ret) { *pRetCode = E_DB_WRITEFAILED_I; goto L_RETU; } /* memset(card.comments,0,sizeof(card.comments)); AddXmlItemStr(card.comments, XML_KEY_OPERATEDATE,logicdate); AddXmlItemInt(card.comments,XML_KEY_SERIALNO,in_pack->lserial1); AddXmlItemInt(card.comments,XML_KEY_TRADECODE,in_pack->lvol2); */ return 0; L_RETU: return -1; }
int F847120(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; int card_id=0; T_t_pif_card card; int cnt_purse_no = 0; char deal_flag[1 + 1] = ""; T_t_tif_writefailed tWriteFailed; deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_Y; cnt_purse_no = rPack->lvol1; memset(&card,0,sizeof(card)); memset(&tWriteFailed, 0, sizeof(tWriteFailed)); card_id=rPack->lvol0; //判断卡状态是否为写卡未成功状态 if(card_id<1) { *pRetCode= E_INPUT_CARDNO_CANNOT_NULL; goto L_RETU; } ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } switch(rPack->lserial0) { case 847119: // writelog(LOG_ERR,"流水号[%d]",rPack->lserial1); // writelog(LOG_ERR,"钱包号[%d]",cnt_purse_no); ret = DB_t_tif_writefailed_read_by_card_id_and_purese_no_and_deal_serial_no(card.card_id, cnt_purse_no, rPack->lserial1, &tWriteFailed); if (ret) { if (ret != DB_NOTFOUND) { *pRetCode = E_DB_WRITEFAILED_R; } else { *pRetCode = E_DB_WRITEFAILED_N; } goto L_RETU; } if (CARDWFAIL_PACKET_DEAL_FLAG_Y == tWriteFailed.deal_flag[0]) tWriteFailed.deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_N; ret = DB_t_tif_writefailed_update_by_card_id_and_purese_no_and_deal_serial_no(card.card_id, cnt_purse_no, rPack->lserial1, &tWriteFailed); if (ret) { *pRetCode = E_DB_WRITEFAILED_I; goto L_RETU; } ret = DB_t_tif_writefailed_read_by_card_id_and_deal_flag(card.card_id, &deal_flag[0], &tWriteFailed); if (ret) { if (DB_NOTFOUND == ret) { if (STATE_TRUE == card.state_id[CARDSTAT_TYPE_WFAIL]) { card.state_id[CARDSTAT_TYPE_WFAIL] = STATE_FALSE; } } } /* ret = DB_t_tif_writefailed_read_by_card_id_and_purese_no_and_deal_flag(card.card_id,cnt_purse_no,&deal_flag[0],&tWriteFailed); if (ret) { if (ret != DB_NOTFOUND) { *pRetCode = E_DB_WRITEFAILED_R; goto L_RETU; } } */ /* if(STATE_FALSE==card.state_id[CARDSTAT_TYPE_WFAIL]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDSTATE_NOTWRITEFAIL; goto L_RETU; } card.state_id[CARDSTAT_TYPE_WFAIL]=STATE_FALSE; //修改状态 memset(card.comments,0,sizeof(card.comments)); */ break; case 847123: if('3'!=card.state_id[CARDSTAT_TYPE_REG]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARD_STATE_NOT_CHANGE; goto L_RETU; } card.state_id[CARDSTAT_TYPE_REG]=STATE_TRUE; //修改状态 break; default: DB_t_pif_card_free_lock_by_cur(); *pRetCode= E_TXCODE_NOT_EXIST; goto L_RETU; } ret=DB_t_pif_card_update_lock_by_cur(&card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); return 0; L_RETU: return -1; }
int F847120(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; int card_id=0; T_t_pif_card card; memset(&card,0,sizeof(card)); card_id=rPack->lvol0; //判断卡状态是否为写卡未成功状态 if(card_id<1) { *pRetCode= E_INPUT_CARDNO_CANNOT_NULL; goto L_RETU; } ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } switch(rPack->lserial0) { case 847119: if(STATE_FALSE==card.state_id[CARDSTAT_TYPE_WFAIL]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDSTATE_NOTWRITEFAIL; goto L_RETU; } card.state_id[CARDSTAT_TYPE_WFAIL]=STATE_FALSE; //修改状态 memset(card.comments,0,sizeof(card.comments)); break; case 847123: if('3'!=card.state_id[CARDSTAT_TYPE_REG]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARD_STATE_NOT_CHANGE; goto L_RETU; } card.state_id[CARDSTAT_TYPE_REG]=STATE_TRUE; //修改状态 break; default: DB_t_pif_card_free_lock_by_cur(); *pRetCode= E_TXCODE_NOT_EXIST; goto L_RETU; } ret=DB_t_pif_card_update_lock_by_cur(&card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); return 0; L_RETU: return -1; }