//系统正式入账 int enter_account(ST_PACK *in_pack,InAcc *IA,ST_PACK *out_pack){ int ret = 0; int i=0; int card_id = 0; char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char sMsg[256]=""; T_t_tif_tradeserial tradeserial; T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; T_t_aif_account tAccount; T_t_pif_card tCard; memset(&tCustomer,0,sizeof(tCustomer)); memset(&tSpeFee,0,sizeof(tSpeFee)); memset(&tAccount,0,sizeof(tAccount)); memset(&tCard,0,sizeof(tCard)); card_id=in_pack->lvol0; ret=get_datetime_from_db(sysdate,systime); if(ret) { writelog(LOG_ERR,"get_datetime_from_db error,error code=[%d]",ret); getsysdate(sysdate); getsystime(systime); return ret; } ret=GetLogicDate(logicdate); //业务日期 if(ret) { writelog(LOG_ERR,"GetLogicDate error,errcode=[%d]",ret); return ret; } ret=DB_t_pif_card_read_by_card_id(card_id, &tCard); if(ret) { if(DB_NOTFOUND==ret) ret=E_CARDNO_NOT_EXIST; else ret=E_DB_CARD_R; return ret; } if(strncmp(tCard.state_id,CARDSTAT_REG,4)!=0) { if('2'==tCard.state_id[CARDSTAT_TYPE_REG]) ret= E_CARDNO_LOGOUT; else if('3'==tCard.state_id[CARDSTAT_TYPE_REG]) ret = E_CARD_CHANGE; else if(tCard.state_id[CARDSTAT_TYPE_LOST]==STATE_TRUE) ret=E_CARDNO_LOST; else if(tCard.state_id[CARDSTAT_TYPE_FREEZE]==STATE_TRUE) ret=E_CARDNO_FREEZE; else if(tCard.state_id[CARDSTAT_TYPE_WFAIL]==STATE_TRUE) ret=E_CARDNO_WFAIL; return ret; } //根据卡号和钱包号得到消费者账号(借方) ret=DB_t_aif_account_read_by_card_id_and_purse_id(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_id); if(DB_NOTFOUND==ret) ret=E_ACTNO_NOT_EXIST; else ret=E_DB_ACCOUNT_R; return ret; } ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(tCard.cosumer_id, &tCustomer); if(ret) { writelog(LOG_ERR,"cut_id[%d]",tCard.cosumer_id); if(DB_NOTFOUND==ret) ret= E_CUSTOMER_NOT_EXIST; else ret= E_DB_CUSTOMER_R; return ret; } //得到收费类别 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(); return E_DB_SPEFEE_R; } } else { tCustomer.fee_type=tSpeFee.fee_type; } //更新客户表的收费类别字段 ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { if(DB_NOTFOUND==ret) ret= E_CUSTOMER_NOT_EXIST; else ret= E_DB_CUSTOMER_U; return ret; } } DB_t_cif_customer_free_lock_cur(); ret = DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(in_pack->lvol6,&tradeserial); if(ret) { if(DB_NOTFOUND == ret){ ret = E_DB_TRADESERIAL_N; }else{ ret = E_DB_TRADESERIAL_R; } } IA->iCardNo=tCard.card_id; IA->iFeeType=tCustomer.fee_type; IA->dArrInAmt[0]=tradeserial.trade_fee; IA->iMainDevId=tradeserial.maindevice_id; //工作站标识 IA->iDevId=tradeserial.device_id; //设备ID IA->iSerialNo=tradeserial.serial_no; //流水号 IA->iTradeNo=tradeserial.serial_type; //交易码 strcpy(IA->sTxDate,tradeserial.operate_date); //交易日期 strcpy(IA->sTxTime,tradeserial.operate_time); //交易时间 strcpy(IA->sTxCollectDate,tradeserial.collect_date); //采集日期 strcpy(IA->sTxCollectTime,tradeserial.collect_time); //采集时间 strcpy(IA->sTxAccDate,tradeserial.enteract_date); //记账日期 strcpy(IA->sTxAccTime,tradeserial.enteract_time); //记账时间 strcpy(IA->sMdeOper,tradeserial.oper_code); //操作员 strcpy(IA->sChkOper,tradeserial.reserve_1); //复核操作员 IA->iUseCardFlag=USE_CARD_TYPE_ONLINE; //联机交易 IA->iTxCnt=tradeserial.trade_count; //交易次数 IA->dInCardBala=tradeserial.in_balance; //入卡值 IA->dOutCardBala=-1; //出卡值 //修改借方和贷方帐户余额,记会计分录帐 ret=AccountProcess(IA); if(ret) { writelog(LOG_ERR,"AccountProcess ret[%d]",ret); return ret; } tradeserial.out_balance=IA->dOutCardBala; //出卡值 if(amtcmp(tradeserial.out_balance,0)<0) { return E_ENTER_ACCOUNT; } for(i=1;i<=IA->iOutTxTypeCnt;i++) { switch(IA->iArrOutTxType[i]) { case TXTYPE_TOLL_DEPOSIT: case TXTYPE_TOLL_DEPOSIT_BILL: case TXTYPE_TOLL_DEPOSIT_FUNDBOOK: case TXTYPE_DEDUCT_DEPOSIT: case TXTYPE_RETURN_DEPOSIT: tradeserial.deposit_fee=IA->dArrOutAmt[i]; break; case TXTYPE_PRE_TOLL_BOARD: case TXTYPE_PRE_TOLL_BOARD_BILL: case TXTYPE_BANK_PRE_TOLL_BOARD: case TXTYPE_PRE_TOLL_BOARD_FUNDBOOK: case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_CASH: case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_BILL: case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_FUNDBOOK: case TXTYPE_TOLL_BOARD: case TXTYPE_DEDUCT_BOARD: case TXTYPE_RETURN_BOARD: case TXTYPE_RETURN_BOARD_BILL: case TXTYPE_RETURN_BOARD_FUNDBOOK: tradeserial.boardfee=IA->dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: case TXTYPE_TOLL_CHARGE_BILL: case TXTYPE_TOLL_CHARGE_FUNDBOOK: tradeserial.in_fee=IA->dArrOutAmt[i]; break; case TXTYPE_TOLL_CARDCOST: case TXTYPE_TOLL_CARDCOST_BILL: case TXTYPE_TOLL_CARDCOST_FUNDBOOK: 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]); } } tradeserial.serial_state=SERISTAT_DEBT; ret = DB_t_tif_tradeserial_update_lock_by_cur(&tradeserial); if(ret) { writelog(LOG_ERR,"db update t_tif_tradeserial error,errcode=[%d]",ret); return E_DB_TRADESERIAL_U; } DB_t_tif_tradeserial_free_lock_cur(); out_pack->damt0=tradeserial.out_balance; //出卡值 out_pack->damt1=tradeserial.trade_fee; //交易金额 out_pack->lvol0 = tradeserial.serial_no; //流水号 sprintf(sMsg,"交易前卡余额:%.2lf元 卡当前余额:%.2lf元",tradeserial.in_balance,tradeserial.out_balance); strcat(out_pack->vsmess,sMsg); writelog(LOG_DEBUG,out_pack->vsmess); return 0; }
int F847183(TRUSERID *handle, int iRequest, ST_PACK *rPack, int *pRetCode, char *szMsg) { int ret = 0; char tx_date[8+1] = ""; //发生日期 // char tx_time[6+1]=""; //发生时间 int card_no = 0; //卡号 char device_id[8+1] = ""; //终端机ID int serial_no = 0; //终端机流水号 int flag = 0; double dUniqno = 0; T_t_tif_tradeserial tOldTradeserial; //当日流水表 T_t_tif_tradeserial tTradeserial; //当日流水表 T_t_tif_tradeserial_his tTradeserialhis; //历史流水表 T_t_pif_tradecode tTradeCode; T_t_pif_card tCard; RevAcc revAcc; char sysdate[11] = ""; char systime[9] = ""; char sYear[5] = ""; char sMonDay[5] = ""; char logic_date[9] = ""; int days = 0; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack, 0, 1); memset(&tTradeserial, 0, sizeof(tTradeserial)); memset(&tOldTradeserial, 0, sizeof(tOldTradeserial)); memset(&tTradeserialhis, 0, sizeof(tTradeserialhis)); memset(&tTradeCode, 0, sizeof tTradeCode); memset(&tCard, 0, sizeof tCard); memset(&revAcc,0,sizeof revAcc); getsysdate(sysdate); getsystime(systime); des2src(tTradeserial.enteract_time, systime); //取流水号,入帐处理 ret = getNewUniqNo(KEYTYPE_TRADESERIAL, &dUniqno); if (ret) { *pRetCode = ret; writelog(LOG_ERR, "getNewUniqNo err[%d]", ret); goto L_RETU; } if(db_commit()) return E_DB_COMMIT; writelog(LOG_ERR,"getNewUniqNo[%d]",D2I(dUniqno)); des2src(tx_date, rPack->sbank_pwd); // des2src(tx_time,rPack->sbank_code); card_no = rPack->lvol0; des2src(device_id, rPack->sbank_pwd2); serial_no = rPack->lvol1; trim(rPack->scust_limit); trim(rPack->scust_limit2); trim(rPack->semp_pwd); des2src(sYear, tx_date); des2src(sMonDay, tx_date + 4); if (strlen(rPack->scust_limit) == 0) { *pRetCode = E_OPER_NOT_EXIST; goto L_RETU; } if (strlen(rPack->scust_limit2) == 0) { *pRetCode = E_INPUT_AUTH_OPER_NULL; goto L_RETU; } if (strcmp(rPack->scust_limit, rPack->scust_limit2) == 0) { writelog(LOG_ERR, "oper[%s]auth_oper[%s]", rPack->scust_limit, rPack->scust_limit2); *pRetCode = E_OPER_AND_AUTH_OPER_EQ; goto L_RETU; } ret = chk_oper_pwd(rPack->scust_limit2, rPack->semp_pwd); if (ret) { if (E_OPER_NOT_EXIST == ret) *pRetCode = E_AUTH_OPER_NOT_EXIST; else if (E_PASSWORD_WRONG == ret) *pRetCode = E_AUTH_OPER_PWD; else *pRetCode = ret; goto L_RETU; } ret = DB_t_pif_card_read_by_card_id(card_no, &tCard); if (ret) { if (DB_NOTFOUND == ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } if (tCard.state_id[CARDSTAT_TYPE_REG] == '2') { writelog(LOG_ERR, "冲正交易卡号已注销cardid[%d]", tCard.card_id); *pRetCode = E_ACTNO_LOGOUT; goto L_RETU; } //查询当前流水表 // ret = DB_t_tif_tradeserial_read_lock_by_c4_and_operate_date_and_serial_no_and_card_id(tx_date, serial_no, card_no, &tOldTradeserial); // ret = DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(serial_no,&tOldTradeserial); ret = DB_t_tif_tradeserial_read_by_serial_no(serial_no,&tOldTradeserial); writelog(LOG_ERR, "tradeserial tx_date[%s]serial_no[%d]ret[%d]", tx_date, serial_no, ret); if (ret) { if (DB_NOTFOUND != ret) { *pRetCode = E_DB_TRADESERIAL_R; goto L_RETU; } } else { // 如果入账日期相同,表示同一笔流水 if(strcmp(tOldTradeserial.enteract_date,tx_date) == 0) { flag = 1; memcpy(&tTradeserial, &tOldTradeserial, sizeof(tTradeserial)); //上传端流水号 tTradeserial.other_seri_no = tOldTradeserial.serial_no; des2src(tTradeserial.reserve_1, tOldTradeserial.enteract_date); /* tOldTradeserial.serial_state = SERISTAT_RUSH; //冲正 ret = DB_t_tif_tradeserial_update_lock_by_cur(&tOldTradeserial); if (ret) { *pRetCode = E_DB_TRADESERIAL_U; writelog(LOG_ERR, "DB_t_tif_tradeserial_update_lock_by_c4[%d]", ret); goto L_RETU; } DB_t_tif_tradeserial_free_lock_cur(); */ revAcc.iSerialNo= tOldTradeserial.serial_no; des2src(revAcc.sTxAccDate,tOldTradeserial.enteract_date); // des2src(revAcc.sTxDate,tOldTradeserial.operate_date); } } if (!flag) { //查询历史流水表 // ret = DB_t_tif_tradeserial_his_read_lock_by_c0_and_trans_year_and_trans_mon_day_and_serial_no_and_card_id(sYear, sMonDay, serial_no, card_no, &tTradeserialhis); // ret = DB_t_tif_tradeserial_his_read_lock_by_c1_and_enteract_date_and_serial_no( ret = DB_t_tif_tradeserial_his_read_by_bak_date_and_serial_no( tx_date,serial_no,&tTradeserialhis); writelog(LOG_ERR, "tradeserial_his enteract_date[%s]serialno[%d]ret[%d]", tx_date, serial_no, ret); if (ret) { if (DB_NOTFOUND == ret) { *pRetCode = E_SERIALNO_NOT_EXIST; goto L_RETU; } else { *pRetCode = E_DB_TRADESERIAL_R; goto L_RETU; } } tTradeserial.other_seri_no = tTradeserialhis.serial_no; des2src(tTradeserial.reserve_1, tTradeserialhis.enteract_date); // 被冲正的流水的入账日期 tTradeserial.serial_state = tTradeserialhis.serial_state; //流水状态 tTradeserial.tmark = tTradeserialhis.tmark; //999交易标记 tTradeserial.maindevice_id = tTradeserialhis.maindevice_id; //上传工作站标识(前置机注册号) tTradeserial.sys_id = tTradeserialhis.sys_id; tTradeserial.comu_ver = tTradeserialhis.comu_ver; //通信版本号 tTradeserial.device_id = tTradeserialhis.device_id; des2src(tTradeserial.devphy999_id, tTradeserialhis.devphy999_id); //物理设备ID des2src(tTradeserial.dev_auth, tTradeserialhis.dev_auth); //终端设备授权号 des2src(tTradeserial.crc, tTradeserialhis.crc); //CRC校验 tTradeserial.card_id = tTradeserialhis.card_id; //交易卡号 tTradeserial.purse_id = tTradeserialhis.purse_id; //消费钱包号 tTradeserial.in_balance = tTradeserialhis.in_balance; //入卡金额 tTradeserial.out_balance = tTradeserialhis.out_balance; //出卡金额 tTradeserial.trade_fee = tTradeserialhis.trade_fee; //本次消费金额 tTradeserial.trade_count = tTradeserialhis.trade_count; //当前卡中帐户消费次数(累计使用次数) tTradeserial.serial_type = tTradeserialhis.serial_type; //交易代码 tTradeserial.boardfee = tTradeserialhis.boardfee; //搭伙费 des2src(tTradeserial.operate_date, tTradeserialhis.operate_date); //发生日期(格式化输入的日期) des2src(tTradeserial.operate_time, tTradeserialhis.operate_time); //发生时间(格式化输入的时间) // 历史入账日期 des2src(tTradeserial.enteract_date,tTradeserialhis.enteract_date); tTradeserial.condition_id = tTradeserialhis.condition_id; // 收费科目 // 保存被冲正交易的操作员号 //des2src(tTradeserial.oper_code, tTradeserialhis.oper_code); tTradeserial.customer_id = tTradeserialhis.customer_id; /* tTradeserialhis.serial_state = SERISTAT_RUSH; //冲正 ret = DB_t_tif_tradeserial_his_update_lock_by_c1(&tTradeserialhis); if (ret) { *pRetCode = E_DB_TRADESERIAL_U; writelog(LOG_ERR, "DB_t_tif_tradeserial_update_lock_by_c1[%d]", ret); goto L_RETU; } DB_t_tif_tradeserial_his_free_lock_by_c1(); */ revAcc.iSerialNo = tTradeserialhis.serial_no; des2src(revAcc.sTxAccDate,tTradeserialhis.enteract_date); // des2src(revAcc.sTxDate,tTradeserialhis.operate_date); } if (tTradeserial.card_id != card_no) { writelog(LOG_ERR, "流水中卡号不符cardid[%d]serial[%d]", card_no, tTradeserial.card_id); *pRetCode = E_SERIALNO_NOT_EXIST; goto L_RETU; } if (tTradeserial.serial_state == SERISTAT_RUSH) { *pRetCode = E_TX_SERIAL_CZ; goto L_RETU; } if (tTradeserial.serial_state != SERISTAT_DEBT) { *pRetCode = E_TX_SERIAL_CANNOT_CZ; goto L_RETU; } /* if (amtcmp(tTradeserial.trade_fee, 0) <= 0) { *pRetCode = E_TX_SERIAL_CANNOT_CZ; strcpy(szMsg,"交易金额有误!"); goto L_RETU; } */ ret = DB_t_pif_tradecode_read_by_tradecode(tTradeserial.serial_type, &tTradeCode); if (ret) { if (DB_NOTFOUND == ret) { writelog(LOG_ERR,"补冲正交易码[%d]不存在",tTradeserial.serial_type); *pRetCode = E_DB_TRADECODE_N; } else *pRetCode = E_DB_TRADECODE_R; goto L_RETU; } if (strcmp(tTradeCode.flag,TYPE_YES) != 0) { *pRetCode = E_TX_SERIAL_CANNOT_CZ; goto L_RETU; } ret = GetLogicDate(logic_date); //业务日期 if (ret) { *pRetCode = ret; writelog(LOG_ERR, "GetLogicDate err ret[%d]", ret); goto L_RETU; } /*// 小于 0 , 则不判断 if (tTradeCode.rush_max_day >= 0) { ret = DiffDay(logic_date, tTradeserial.enteract_date, &days); if (ret) { writelog(LOG_ERR,"ret[%d]date1[%s]date2[%s]",ret, logic_date,tTradeserial.enteract_date); *pRetCode = ret; goto L_RETU; } writelog(LOG_DEBUG,"tradecode[%d]max day[%d]diff day[%d]",tTradeCode.tradecode ,tTradeCode.rush_max_day,days); if (days > tTradeCode.rush_max_day) { writelog(LOG_ERR, "流水入账日期[%s],已超过期限[%d]天", tTradeserial.enteract_date, days-tTradeCode.rush_max_day); *pRetCode = E_TX_SERIAL_CANNOT_CZ; strcpy(szMsg, "流水入账日期已超过可冲正期限!"); goto L_RETU; } } if (tTradeCode.restrict_oper == IS_YES) { if (strcmp(rPack->scust_limit, tTradeserial.oper_code) != 0) { strcpy(szMsg, "必须由作此次交易的操作员来冲正"); *pRetCode = E_TX_SERIAL_CANNOT_CZ; goto L_RETU; } } */ des2src(revAcc.sMdeOper, rPack->scust_limit); des2src(revAcc.sChkOper,rPack->scust_limit2); des2src(revAcc.sTxDate,sysdate); des2src(revAcc.sTxTime,systime); des2src(tTradeserial.operate_date, sysdate); des2src(tTradeserial.operate_time, systime); des2src(tTradeserial.collect_date, sysdate); des2src(tTradeserial.collect_time, systime); des2src(tTradeserial.enteract_date, logic_date); //业务日期 des2src(tTradeserial.enteract_time, systime); /////有卡冲正 if(rPack->lvol3) { if(rPack->lvol10 <=0) //交易次数 return E_INPUT_CARD_TXCNT; revAcc.iUseCardFlag = USE_CARD_TYPE_ONLINE; revAcc.iTradeCnt = rPack->lvol10 + 1; revAcc.dInCardBala = rPack->damt1; //有卡冲正,卡片上余额 tTradeserial.in_balance = rPack->damt1; tTradeserial.trade_count = rPack->lvol10 + 1; //交易次数增加 } else //使用流水的出卡值作为冲正流水的入卡值 { revAcc.iUseCardFlag = USE_CARD_TYPE_NULL; tTradeserial.in_balance = tTradeserial.out_balance ; revAcc.dInCardBala = tTradeserial.in_balance; revAcc.iTradeCnt = tTradeserial.trade_count; } revAcc.dOutCardBala=revAcc.dInCardBala; //在冲正模块中计算出卡值 tTradeserial.trade_fee = -1 * tTradeserial.trade_fee; //本次消费金额 tTradeserial.boardfee = -1 * tTradeserial.boardfee; //本次消费管理费 tTradeserial.maindevice_id = rPack->lvol6; tTradeserial.device_id = 0; revAcc.maindevice_id = tTradeserial.maindevice_id; // 上传的操作员号 des2src(tTradeserial.oper_code, rPack->scust_limit); tTradeserial.reviseserial_no = tTradeserial.other_seri_no; tTradeserial.serial_no = D2I(dUniqno); switch (tTradeserial.serial_type) { case 847106: // 现金充值冲正 ret = process847106(&tTradeserial); // 不是现金充值,不能冲正 if(ret) { *pRetCode = ret; goto L_RETU; } break; default: break; } //###################################################### //入账处理 revAcc.iRevSeriNo = tTradeserial.serial_no; revAcc.iTradeNo = tTradeserial.serial_type; ret = ReverseProcess(&revAcc); if(ret) { *pRetCode = ret; writelog(LOG_ERR, "ReverseProcess err[%d]", ret); goto L_RETU; } //###################################################### //添加交易流水 tTradeserial.serial_type = TXCODE_TX_REVEAL; //交易代码记录为冲正 tTradeserial.serial_state = SERISTAT_DEBT; tTradeserial.out_balance = revAcc.dOutCardBala; tTradeserial.tmark = 254; ret = DB_t_tif_tradeserial_add(&tTradeserial); writelog(LOG_ERR, "DB_t_tif_tradeserial_add ret[%d]", ret); if (ret) { if (DB_REPEAT == ret) *pRetCode = E_DB_TRADESERIAL_E; else *pRetCode = E_DB_TRADESERIAL_I; goto L_RETU; } if (amtcmp(tTradeserial.out_balance, 0) < 0) { *pRetCode = E_ENTER_ACCOUNT; goto L_RETU; } if(db_commit()) return E_DB_COMMIT; //更新原来流水的状态 if(flag == 1) //更新流水表 { memset(&tOldTradeserial,0,sizeof tOldTradeserial); ret = DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(serial_no,&tOldTradeserial); writelog(LOG_ERR, "tradeserial tx_date[%s]serial_no[%d]ret[%d]", tx_date, serial_no, ret); if (ret) { *pRetCode = E_DB_TRADESERIAL_R; goto L_RETU; } tOldTradeserial.serial_state = SERISTAT_RUSH; //冲正 ret = DB_t_tif_tradeserial_update_lock_by_cur(&tOldTradeserial); if (ret) { *pRetCode = E_DB_TRADESERIAL_U; writelog(LOG_ERR, "DB_t_tif_tradeserial_update_lock_by_c4[%d]", ret); goto L_RETU; } DB_t_tif_tradeserial_free_lock_cur(); } else //更新历史流水表 { memset(&tTradeserialhis,0,sizeof tTradeserialhis); ret = DB_t_tif_tradeserial_his_read_lock_by_c1_and_bak_date_and_serial_no( tx_date,serial_no,&tTradeserialhis); writelog(LOG_ERR, "tradeserial_his enteract_date[%s]serialno[%d]ret[%d]",tx_date, serial_no, ret); if (ret) { *pRetCode = E_DB_TRADESERIAL_R; goto L_RETU; } tTradeserialhis.serial_state = SERISTAT_RUSH; //冲正 ret = DB_t_tif_tradeserial_his_update_lock_by_c1(&tTradeserialhis); if (ret) { *pRetCode = E_DB_TRADESERIAL_U; writelog(LOG_ERR, "DB_t_tif_tradeserial_update_lock_by_c1[%d]", ret); goto L_RETU; } DB_t_tif_tradeserial_his_free_lock_by_c1(); } SetCol(handle, 0); SetCol(handle, F_LSERIAL1, F_DAMT2, F_DAMT3, F_VSMESS, 0); out_pack->lserial1 = tTradeserial.serial_no; out_pack->damt2 = tTradeserial.out_balance; out_pack->damt3 = -tTradeserial.trade_fee; sprintf(out_pack->vsmess, "流水号:%d 冲正金额:%.2lf元,搭伙费:%.2lf元,冲正前卡余额:%.2lf元,卡当前余额:%.2lf元", tTradeserial.serial_no, -tTradeserial.trade_fee,-tTradeserial.boardfee, tTradeserial.in_balance, tTradeserial.out_balance); writelog(LOG_DEBUG, out_pack->vsmess); PutRow(handle, out_pack, pRetCode, szMsg); return 0; L_RETU: return -1; }
int F240001(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,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; } */ ret=DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(rPack->lvol7, &tradeserial); if(ret) { *pRetCode=E_DB_TRADESERIAL_R; writelog(LOG_ERR,"DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no error,error code=[%d],serial_no=[%d]",ret,rPack->lvol7); goto L_RETU; } if(tradeserial.serial_state == SERISTAT_DEBT) { DB_t_tif_tradeserial_free_lock_cur(); goto L_FINISHED; } /* 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(); //填写入账结构,问问闻剑 memset(&IA,0,sizeof(IA)); des2src(IA.sArrInActno[0],tAccount.account_id); //贷方帐户,持卡人账户 des2src(IA.sArrInActno[2],rPack->sstation0); //借方帐号,由前置机上传 IA.iCardNo=card.card_id; IA.iFeeType=tCustomer.fee_type; IA.dArrInAmt[0]=tradeserial.trade_fee; 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); } } //结束填充流水数据 tradeserial.serial_state=SERISTAT_DEBT; ret=DB_t_tif_tradeserial_update_lock_by_cur(&tradeserial); if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"DB_t_tif_tradeserial_update_lock_by_cur error,error code=[%d]",ret); goto L_RETU; } sprintf(sMsg,"充值前卡余额:%.2lf 转帐后卡余额:%.2lf ",IA.dInCardBala,IA.dOutCardBala); strcat(sDebugMsg,sMsg); writelog(LOG_DEBUG,sDebugMsg); L_FINISHED: out_pack->damt0=tradeserial.out_balance; out_pack->damt1=tradeserial.trade_fee; out_pack->damt2=tradeserial.boardfee; out_pack->lvol1=tradeserial.serial_no; PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F847221(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; double tx_money = 0.0; char ia_buf[1024]=""; char sMsg[256]=""; double dUniNo = 0; T_t_tif_tradeserial serial; T_t_tif_tradeserial old_serial; T_t_group_cash_report group_cash; T_t_groups groups; InAcc IA; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); int i; ResetNormalCPack(&aPack,0,1); if(strlen(rPack->scard0) <= 0) { *pRetCode = E_NOTEXIST_OPER; goto L_RETU; } ret = CheckOperatorPwd(rPack->scard0,rPack->semp_pwd); if(ret) { *pRetCode = ret; goto L_RETU; } if(rPack->lvol1 <= 0) { *pRetCode = E_FAN_SERIAL_NOT_EXISTS; goto L_RETU; } // 更新被冲正流水的状态 memset(&old_serial,0,sizeof old_serial); ret = DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(rPack->lvol1,&old_serial); if(ret) { if(DB_NOTFOUND == ret) *pRetCode = E_FAN_SERIAL_NOT_EXISTS; else *pRetCode = E_DB_TRADESERIAL_R; goto L_RETU; } if(SERISTAT_RUSH == old_serial.serial_state) { writelog(LOG_ERR,"流水已被冲正,流水号[%d]",old_serial.serial_no); *pRetCode = E_FAN_ALREADY_RUSHED; DB_t_tif_tradeserial_free_lock_cur(); goto L_RETU; } old_serial.serial_state = SERISTAT_RUSH; ret = DB_t_tif_tradeserial_update_lock_by_cur(&old_serial); if(ret) { writelog(LOG_ERR,"更新流水[%d]状态失败",old_serial.serial_no); *pRetCode = E_DB_TRADESERIAL_U; goto L_RETU; } DB_t_tif_tradeserial_free_lock_cur(); tx_money = old_serial.trade_fee; // 生成新的冲正流水 ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniNo); if(ret) { *pRetCode = ret; goto L_RETU; } // 查询组可解款余额 memset(&group_cash,0,sizeof group_cash); ret = DB_t_group_cash_report_read_lock_by_c1_and_groupid(old_serial.showid,&group_cash); if(ret) { if(DB_NOTFOUND == ret) *pRetCode = E_FAN_ACC_NOT_EXISTS; else *pRetCode = E_DB_GRP_CASH_RPT_R; goto L_RETU; } /* if(amtcmp(tx_money,group_cash.cur_money)>0) { *pRetCode = E_FAN_ACC_INSUFFICIENT; DB_t_group_cash_report_free_lock_by_c1(); goto L_RETU; } */ // 生成流水 memset(&serial,0,sizeof serial); serial.serial_no = (int)dUniNo; serial.serial_state = SERISTAT_DEBT; serial.serial_type = TXCODE_FAN_RUSH_PAY; getsysdate(serial.operate_date); getsystime(serial.operate_time); des2src(serial.collect_date,serial.operate_date); des2src(serial.collect_time,serial.operate_time); GetLogicDate(serial.enteract_date); des2src(serial.enteract_time,serial.operate_time); des2src(serial.opercode,rPack->scard0); des2src(serial.reserve_1,rPack->scert_addr); serial.cardbefbal = tx_money; serial.trade_fee = tx_money * -1; // 商户号 des2src(serial.showid,old_serial.showid); // 入账 memset(&IA,0,sizeof IA); IA.dArrInAmt[0] = serial.trade_fee; IA.iCardNo = 0; //收费类别为 1 IA.iFeeType = 1; IA.iTxFlag = ACC_TYPE_RUSH; IA.pVoidPointer = ia_buf; ret = process(&IA,&serial); if(ret) { writelog(LOG_ERR,"account process error [%d]",ret); *pRetCode = ret; DB_t_group_cash_report_free_lock_by_c1(); goto L_RETU; } SetCol(handle,0); SetCol(handle,F_VSMESS,F_LVOL1,F_DAMT1,F_DAMT2,F_SBANK_ACC,0); sprintf(out_pack->vsmess,"流水号:%d ",IA.iSerialNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(out_pack->vsmess,sMsg); } } strcat(out_pack->vsmess,(char*)IA.pVoidPointer); writelog(LOG_DEBUG,out_pack->vsmess); des2src(group_cash.last_check_date,serial.operate_date); des2src(group_cash.last_check_time,serial.operate_time); group_cash.cur_money = group_cash.cur_money + tx_money; out_pack->lvol1 = serial.serial_no; out_pack->damt1 = serial.trade_fee; out_pack->damt2 = group_cash.cur_money; //更新组未解款金额 ret = DB_t_group_cash_report_update_lock_by_c1(&group_cash); if(ret) { *pRetCode = E_DB_GRP_CASH_RPT_U; goto L_RETU; } // add DB_t_group_cash_report_free_lock_by_c1(); ret = DB_t_groups_read_by_groupid(group_cash.groupid,&groups); if(ret) { if(DB_NOTFOUND == ret) *pRetCode = E_DB_GROUP_N; else *pRetCode = E_DB_GROUP_R; goto L_RETU; } des2src(out_pack->sbank_acc,groups.group_acc); //保存流水 ret = DB_t_tif_tradeserial_add(&serial); if(ret) { if(DB_REPEAT == ret) return E_DB_TRADESERIAL_E; else return E_DB_TRADESERIAL_I; goto L_RETU; } PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F847223(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; char ia_buf[1024]=""; char sMsg[256]=""; int rows; double dUniNo; InAcc IA; T_t_tif_tradelog tradelog; T_t_tif_tradeserial serial; T_t_tif_tradeserial old_serial; int shop_id; int i; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); if(strlen(rPack->scard0) <= 0) { *pRetCode = E_OPER_NOT_EXIST; goto L_RETU; } ret = CheckOperatorPwd(rPack->scard0,rPack->semp_pwd); if(ret) { *pRetCode = ret; goto L_RETU; } memset(&old_serial,0,sizeof old_serial); writelog(LOG_DEBUG,"rush log serial no[%d]",rPack->lvol1); ret = DB_t_tif_tradeserial_read_lock_by_cur_and_serial_no(rPack->lvol1,&old_serial); if(ret) { if(DB_NOTFOUND == ret) *pRetCode = E_FAN_SERIAL_NOT_EXISTS; else *pRetCode = E_DB_TRADESERIAL_N; goto L_RETU; } if(SERISTAT_RUSH == old_serial.serial_state) { DB_t_tif_tradeserial_free_lock_cur(); writelog(LOG_ERR,"流水重复冲正,serial[%d] operator[%s]" ,old_serial.serial_no,rPack->scard0); *pRetCode = E_FAN_ALREADY_RUSHED; goto L_RETU; } old_serial.serial_state = SERISTAT_RUSH; ret = DB_t_tif_tradeserial_update_lock_by_cur(&old_serial); if(ret) { writelog(LOG_ERR,"流水状态更新失败"); *pRetCode = E_DB_TRADESERIAL_U; goto L_RETU; } DB_t_tif_tradeserial_free_lock_cur(); ////////////////////////////////////////////////////////////////////////////////// ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniNo); if(ret) { *pRetCode = ret; goto L_RETU; } //初始化流水记录 memset(&serial,0,sizeof serial); serial.serial_no = D2I(dUniNo); serial.serial_state = SERISTAT_DEBT; serial.serial_type = TXCODE_FAN_RUSH_BALANCE; GetLogicDate(serial.operate_date); getsystime(serial.operate_time); getsysdate(serial.collect_date); des2src(serial.collect_time,serial.operate_time); des2src(serial.enteract_date,serial.collect_date); des2src(serial.enteract_time,serial.operate_time); des2src(serial.oper_code,rPack->scard0); des2src(serial.reserve_1,rPack->scert_addr); serial.in_balance = serial.trade_fee; des2src(serial.showid,old_serial.showid); // 查询流水明细 ret = DB_t_tif_tradelog_open_select_by_c2_and_serino_and_seri_type_and_outorin( old_serial.serial_no,old_serial.serial_type,DBCR_DEBIT); if(ret) { if(DB_NOTFOUND == ret) *pRetCode = E_FAN_SERIAL_NOT_EXISTS; else *pRetCode = E_DB_TRADELOG_R; goto L_RETU; } rows= 0; memset(&IA,0,sizeof IA); while(1) { memset(&tradelog,0,sizeof tradelog); ret = DB_t_tif_tradelog_fetch_select_by_c2(&tradelog); if(ret) { if(DB_NOTFOUND == ret) { if(rows > 0) break; else *pRetCode = E_FAN_SERIAL_NOT_EXISTS; } else *pRetCode = E_DB_TRADELOG_R; goto L_RETU; } rows++; ret = do_rush_balance(&tradelog,&IA,&serial); if(ret) { DB_t_tif_tradelog_close_select_by_c2(); *pRetCode = ret; goto L_RETU; } } SetCol(handle,0); SetCol(handle,F_VSMESS,F_LVOL1,F_DAMT1,F_DAMT2,F_SBANK_ACC,0); sprintf(out_pack->vsmess,"流水号:%d ",IA.iSerialNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { if(amtcmp(IA.dArrOutAmt[i],0)!=0) { //sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); //strcat(out_pack->vsmess,sMsg); writelog(LOG_INFO,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); } } out_pack->lvol1 = serial.serial_no; // 冲正金额 out_pack->damt1 = serial.trade_fee; des2src(out_pack->sbank_acc,old_serial.showid); // 计算商户余额 shop_id = strtoul(old_serial.showid,NULL,10); ret = do_calc_shop_balance(shop_id,&(out_pack->damt2)); if(ret) { writelog(LOG_ERR,"计算商户余额失败ret[%d]",ret); *pRetCode = ret; goto L_RETU; } //strcat(out_pack->vsmess,IA.pVoidPointer); writelog(LOG_DEBUG,out_pack->vsmess); serial.trade_fee *= -1; //保存流水 ret = DB_t_tif_tradeserial_add(&serial); if(ret) { if(DB_REPEAT == ret) return E_DB_TRADESERIAL_E; else return E_DB_TRADESERIAL_I; goto L_RETU; } PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }