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; //终端机流水号 double dUniqno=0; T_t_tif_tradeserial tTradeserial; //卡操作流水表 T_t_tif_rcvdtl tRcvdtl; char sysdate[11]=""; char systime[9]=""; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); memset(&tRcvdtl,0,sizeof(tRcvdtl)); memset(&tTradeserial,0,sizeof(tTradeserial)); getsysdate(sysdate); getsystime(systime); des2src(tTradeserial.enteract_time,systime); 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); 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_tif_rcvdtl_read_lock_by_c0_and_tx_date_and_tx_time_and_card_no_and_device_id_and_serial_no(tx_date,tx_time,card_no,device_id,serial_no,&tRcvdtl); if(ret) { if(DB_NOTFOUND==ret) { writelog(LOG_ERR,"tx_date[%s],tx_time[%s],card_no[%d],device_id[%s],serial_no[%d]",tx_date,tx_time,card_no,device_id,serial_no); *pRetCode=E_SERIALNO_NOT_EXIST; } else { writelog(LOG_ERR,"read_lock t_tif_rcvdtl err ret[%d]",ret); *pRetCode=E_DB_RCVDTL_R; } goto L_RETU; } if(tRcvdtl.status[0]=='4') { *pRetCode=E_TX_SERIAL_CZ; DB_t_tif_rcvdtl_free_lock_c0(); goto L_RETU; } if(tRcvdtl.status[0]!='3') { *pRetCode=E_TX_SERIAL_CANNOT_CZ; DB_t_tif_rcvdtl_free_lock_c0(); goto L_RETU; } if(tRcvdtl.amount<0) { *pRetCode=E_TX_SERIAL_CANNOT_CZ; DB_t_tif_rcvdtl_free_lock_c0(); goto L_RETU; } tRcvdtl.status[0]='4'; //冲正 des2src(tRcvdtl.oper_no,rPack->scust_limit); des2src(tRcvdtl.deal_date,sysdate); des2src(tRcvdtl.deal_time,systime); ret=DB_t_tif_rcvdtl_update_lock_by_c0(&tRcvdtl); if(ret) { *pRetCode=E_DB_RCVDTL_U; writelog(LOG_ERR,"DB_t_tif_rcvdtl_update_lock_by_c0[%d]",ret); goto L_RETU; } DB_t_tif_rcvdtl_free_lock_c0(); //赋值 ret=getdata(&tTradeserial,&tRcvdtl); if(ret) { *pRetCode=ret; goto L_RETU; } des2src(tTradeserial.operate_date,sysdate); des2src(tTradeserial.operate_time,systime); des2src(tTradeserial.collect_date,sysdate); des2src(tTradeserial.collect_time,systime); ret=GetLogicDate(tTradeserial.enteract_date); //业务日期 if(ret) { *pRetCode=ret; writelog(LOG_ERR,"GetLogicDate err ret[%d]",ret); goto L_RETU; } des2src(tTradeserial.enteract_time,systime); tTradeserial.in_balance =rPack->damt1; tTradeserial.trade_fee = -(tRcvdtl.amount/100.0); //本次消费金额 tTradeserial.out_balance=tTradeserial.in_balance-tTradeserial.trade_fee; tTradeserial.trade_count=rPack->lvol10; tTradeserial.maindevice_id=rPack->lvol6; // tTradeserial.sys_id=rPack->lvol6; des2src(tTradeserial.oper_code,rPack->sdate1); tTradeserial.reviseserial_no=tTradeserial.other_seri_no; //取流水号,从帐处理 ret=getNewUniqNo(KEYTYPE_TRADESERIAL, &dUniqno); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"getNewUniqNo err[%d]",ret); goto L_RETU; } tTradeserial.serial_no=(int)dUniqno; //###################################################### //入账处理 switch(tTradeserial.serial_type) { case 930031: if(0==tRcvdtl.amount) break; tTradeserial.serial_type=TXCODE_TX_REVEAL; ret=process930031(&tTradeserial); if(ret) { //业务处理失败处理 *pRetCode=ret; goto L_RETU; } break; default: *pRetCode=E_TXCODE_NOT_EXIST; //交易码错误 goto L_RETU; } //###################################################### //添加交易流水 tTradeserial.serial_state=SERISTAT_DEBT; ret = DB_t_tif_tradeserial_add(&tTradeserial); if (ret) { writelog(LOG_ERR,"DB_t_tif_tradeserial_add ret[%d]",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; } 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元",tTradeserial.serial_no,-tTradeserial.trade_fee,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 F847181(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 cardno=0; //卡号 char deviceid[8+1]=""; //终端机ID int serial_no=0; //终端机流水号 int shop_id=0; double iSeqNo=0; T_t_tif_tradeserial tTradeserial; //卡操作流水表 T_t_tif_rcvdtl tRcvdtl; char sysdate[11]=""; char systime[9]=""; memset(&tRcvdtl,0,sizeof(tRcvdtl)); memset(&tTradeserial,0,sizeof(tTradeserial)); getsysdate(sysdate); getsystime(systime); des2src(tx_date,rPack->sbank_pwd); des2src(tx_time,rPack->sbank_code); cardno=rPack->lvol0; des2src(deviceid,rPack->sbank_pwd2); serial_no=rPack->lvol1; shop_id=rPack->lvol12; ret=DB_t_tif_rcvdtl_read_lock_by_c0_and_tx_date_and_tx_time_and_cardno_and_deviceid_and_serial_no(tx_date,tx_time,cardno,deviceid,serial_no,&tRcvdtl); if(ret) { if(DB_NOTFOUND==ret) { writelog(LOG_ERR,"tx_date[%s],tx_time[%s],cardno[%d],deviceid[%s],serial_no[%d]",tx_date,tx_time,cardno,deviceid,serial_no); *pRetCode=E_SERIALNO_NOT_EXIST; } else { *pRetCode=E_DB_RCVDTL_R; writelog(LOG_ERR,"read_lock t_tif_rcvdtl err ret[%d]",ret); } goto L_RETU; } if(tRcvdtl.status[0]!='2') { *pRetCode=E_TX_CANNOT_DEAL; DB_t_tif_rcvdtl_free_lock_c0(); goto L_RETU; } des2src(tRcvdtl.oper_no,rPack->sdate1); des2src(tRcvdtl.deal_date,sysdate); des2src(tRcvdtl.deal_time,systime); tRcvdtl.status[0]='3'; //1-未处理2-失败3-成功 ret=DB_t_tif_rcvdtl_update_lock_by_c0(&tRcvdtl); if(ret) { *pRetCode=E_DB_RCVDTL_U; writelog(LOG_ERR,"DB_t_tif_rcvdtl_update_lock_by_c1[%d]",ret); goto L_RETU; } DB_t_tif_rcvdtl_free_lock_c0(); //赋值 ret=getdata(&tTradeserial,&tRcvdtl); if(ret) { *pRetCode=ret; goto L_RETU; } ret=GetLogicDate(tTradeserial.enteract_date); //业务日期 if(ret) { *pRetCode=ret; writelog(LOG_ERR,"GetLogicDate err ret[%d]",ret); goto L_RETU; } des2src(tTradeserial.enteract_time,systime); tTradeserial.maindeviceid=rPack->lvol11; des2src(tTradeserial.opercode,rPack->sdate1); //取流水号,从帐处理 ret=getNewUniqNo(KEYTYPE_TRADESERIAL, &iSeqNo); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"getNewUniqNo err[%d]",ret); goto L_RETU; } tTradeserial.serial_no=iSeqNo; //###################################################### //入账处理 switch(tTradeserial.serial_type) { case 930031: if(0==tRcvdtl.amount) break; tTradeserial.comu_ver=shop_id; ret=process930031(&tTradeserial); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"process930031 err[%d]",ret); goto L_RETU; } break; default: *pRetCode=E_TXCODE_NOT_EXIST; //交易码错误 goto L_RETU; } //###################################################### //业务处理成功处理 tTradeserial.serial_state=SERISTAT_DEBT; //已入帐 //添加交易流水 ret = DB_t_tif_tradeserial_add(&tTradeserial); if (ret) { writelog(LOG_ERR,"DB_t_tif_tradeserial_add ret[%d]",ret); if(DB_REPEAT==ret) *pRetCode = E_DB_TRADESERIAL_E; else *pRetCode = E_DB_TRADESERIAL_I; goto L_RETU; } return 0; L_RETU: return -1; }
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 cardno = 0; //卡号 char deviceid[8+1] = ""; //终端机ID int serial_no = 0; //终端机流水号 int flag = 0; double iSeqNo = 0; T_t_tif_tradeserial tOldTradeserial; //当日流水表 T_t_tif_tradeserial tTradeserial; //当日流水表 T_t_tif_tradeserial_his tTradeserialhis; //历史流水表 T_t_tradecode tTradeCode; T_t_card tCard; 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); ST_PACK next_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); getsysdate(sysdate); getsystime(systime); des2src(tTradeserial.enteract_time, systime); des2src(tx_date, rPack->sbank_pwd); // des2src(tx_time,rPack->sbank_code); cardno = rPack->lvol0; des2src(deviceid, 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_card_read_by_cardno(cardno, &tCard); if (ret) { if (DB_NOTFOUND == ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } if (tCard.cardattr[CARDSTAT_TYPE_REG] == '2') { writelog(LOG_ERR, "冲正交易卡号已注销cardid[%d]", tCard.cardno); *pRetCode = E_ACTNO_LOGOUT; goto L_RETU; } //查询当前流水表 ret = DB_t_tif_tradeserial_read_lock_by_c4_and_operate_date_and_serial_no_and_cardno(tx_date, serial_no, cardno, &tOldTradeserial); if (ret) { writelog(LOG_ERR, "tx_date[%s]serial_no[%d]ret[%d]", tx_date, serial_no, ret); if (DB_NOTFOUND != ret) { *pRetCode = E_DB_TRADESERIAL_R; goto L_RETU; } } else { flag = 1; memcpy(&tTradeserial, &tOldTradeserial, sizeof(tTradeserial)); tTradeserial.other_seri_no = tOldTradeserial.serial_no; //上传端流水号 tOldTradeserial.serial_state = SERISTAT_RUSH; //冲正 ret = DB_t_tif_tradeserial_update_lock_by_c4(&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_c4(); } if (!flag) { //查询历史流水表 ret = DB_t_tif_tradeserial_his_read_lock_by_c0_and_trans_year_and_trans_mon_day_and_serial_no_and_cardno(sYear, sMonDay, serial_no, cardno, &tTradeserialhis); if (ret) { writelog(LOG_ERR, "year[%s]date[%d]serialno[%d]ret[%d]", sYear, sMonDay, serial_no, 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; //上传端流水号 tTradeserial.serial_state = tTradeserialhis.serial_state; //流水状态 tTradeserial.tmark = tTradeserialhis.tmark; //999交易标记 tTradeserial.maindeviceid = tTradeserialhis.maindeviceid; //上传工作站标识(前置机注册号) tTradeserial.sys_id = tTradeserialhis.sys_id; tTradeserial.comu_ver = tTradeserialhis.comu_ver; //通信版本号 // add by 汤成 2007-10-31 tTradeserial.deviceid = tTradeserialhis.deviceid; des2src(tTradeserial.devphyid, tTradeserialhis.devphyid); //物理设备ID des2src(tTradeserial.dev_auth, tTradeserialhis.dev_auth); //终端设备授权号 des2src(tTradeserial.crc, tTradeserialhis.crc); //CRC校验 tTradeserial.cardno = tTradeserialhis.cardno; //交易卡号 tTradeserial.purseno = tTradeserialhis.purseno; //消费钱包号 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.managefee = tTradeserialhis.managefee ; //搭伙费 des2src(tTradeserial.operate_date, tTradeserialhis.operate_date); //发生日期(格式化输入的日期) des2src(tTradeserial.operate_time, tTradeserialhis.operate_time); //发生时间(格式化输入的时间) tTradeserial.condition_id = tTradeserialhis.condition_id; // 收费科目 tTradeserialhis.serial_state = SERISTAT_RUSH; //冲正 // 保存被冲正交易的操作员号 des2src(tTradeserialhis.opercode, tTradeserialhis.opercode); ret = DB_t_tif_tradeserial_his_update_lock_by_c0(&tTradeserialhis); 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_his_free_lock_by_c0(); } if (tTradeserial.cardno != cardno) { writelog(LOG_ERR, "流水中卡号不符cardid[%d]serial[%d]", cardno, tTradeserial.cardno); *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_tradecode_read_by_tradecode(tTradeserial.serial_type, &tTradeCode); if (ret) { if (DB_NOTFOUND == ret) *pRetCode = E_DB_TRADECODE_N; else *pRetCode = E_DB_TRADECODE_R; goto L_RETU; } if (tTradeCode.rush_flag != IS_YES) { *pRetCode = E_TX_SERIAL_CANNOT_CZ; strcpy(szMsg,"该交易不能被冲正"); 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) { *pRetCode = ret; goto L_RETU; } if (days > tTradeCode.rush_max_day) { writelog(LOG_ERR, "流水入账日期[%s],已超过期限[%d]天", tTradeserial.enteract_date, days); *pRetCode = E_TX_SERIAL_CANNOT_CZ; strcpy(szMsg, "流水日期已超过可冲正期限!"); goto L_RETU; } } if (tTradeCode.restrict_oper == IS_YES) { if (strcmp(rPack->scust_limit, tTradeserial.opercode) != 0) { strcpy(szMsg, "必须由作此次交易的操作员来冲正"); *pRetCode = E_TX_SERIAL_CANNOT_CZ; goto L_RETU; } } // 保存上传的操作员号 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); tTradeserial.in_balance = rPack->damt1; tTradeserial.trade_fee = -1 * tTradeserial.trade_fee; //本次消费金额 tTradeserial.managefee = -1 * tTradeserial.managefee; //本次消费管理费 tTradeserial.out_balance = tTradeserial.in_balance - tTradeserial.trade_fee; if (rPack->lvol10 > 0) tTradeserial.trade_count = rPack->lvol10 + 1; tTradeserial.maindeviceid = rPack->lvol6; // 上传的操作员号 des2src(tTradeserial.opercode, rPack->scust_limit); tTradeserial.reviseserial_no = tTradeserial.other_seri_no; //取流水号,从帐处理 ret = getNewUniqNo(KEYTYPE_TRADESERIAL, &iSeqNo); if (ret) { *pRetCode = ret; writelog(LOG_ERR, "getNewUniqNo err[%d]", ret); goto L_RETU; } tTradeserial.serial_no = iSeqNo; //###################################################### //入账处理 switch (tTradeserial.serial_type) { case 930031: // 交易冲正 if (amtcmp(tTradeserial.trade_fee, 0) == 0) break; tTradeserial.serial_type = TXCODE_TX_REVEAL; ret = process930031(&tTradeserial); if (ret) { //业务处理失败处理 *pRetCode = ret; goto L_RETU; } break; case 930034: // 充值冲正 if (amtcmp(tTradeserial.trade_fee, 0) == 0) break; tTradeserial.serial_type = TXCODE_TX_REVEAL; ret = process930034(&tTradeserial); if (ret) { //业务处理失败处理 *pRetCode = ret; goto L_RETU; } break; case 930036: // 搭伙费冲正 if (amtcmp(tTradeserial.trade_fee, 0) == 0) break; tTradeserial.serial_type = TXCODE_TX_REVEAL; ret = process930036(&tTradeserial); if (ret) { //业务处理失败处理 *pRetCode = ret; goto L_RETU; } break; case 847106: // 现金充值冲正 memset(&next_pack,0,sizeof next_pack); tTradeserial.serial_type = TXCODE_SAVING_CASH; ret = do_flush_847106(&tTradeserial,&tCard); if(ret) { *pRetCode = ret; goto L_RETU; } break; default: *pRetCode = E_TXCODE_NOT_EXIST; //交易码错误 goto L_RETU; } //###################################################### //添加交易流水 tTradeserial.serial_state = SERISTAT_DEBT; ret = DB_t_tif_tradeserial_add(&tTradeserial); if (ret) { writelog(LOG_ERR, "DB_t_tif_tradeserial_add ret[%d]", 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; } 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元", tTradeserial.serial_no, -tTradeserial.trade_fee, 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 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; //历史流水表 char sysdate[11]=""; char systime[9]=""; char sYear[5]=""; char sMonDay[5]=""; 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)); getsysdate(sysdate); getsystime(systime); des2src(tTradeserial.enteract_time,systime); 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_tif_tradeserial_read_lock_by_c4_and_operate_date_and_serial_no_and_card_id(tx_date,serial_no,card_no,&tOldTradeserial); if(ret) { writelog(LOG_ERR,"tx_date[%s]serial_no[%d]ret[%d]",tx_date,serial_no,ret); if(DB_NOTFOUND!=ret) { *pRetCode=E_DB_TRADESERIAL_R; goto L_RETU; } } else { flag=1; memcpy(&tTradeserial,&tOldTradeserial,sizeof(tTradeserial)); tTradeserial.other_seri_no=tOldTradeserial.serial_no; //上传端流水号 tOldTradeserial.serial_state=SERISTAT_RUSH; //冲正 des2src(tOldTradeserial.oper_code,rPack->scust_limit); ret=DB_t_tif_tradeserial_update_lock_by_c4(&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_c4(); } 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); if(ret) { writelog(LOG_ERR,"year[%s]date[%d]serialno[%d]ret[%d]",sYear,sMonDay,serial_no,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; //上传端流水号 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; //通信版本号 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); //发生时间(格式化输入的时间) tTradeserial.condition_id = tTradeserialhis.condition_id; // 收费科目 tTradeserialhis.serial_state=SERISTAT_RUSH; //冲正 des2src(tTradeserialhis.oper_code,rPack->scust_limit); ret=DB_t_tif_tradeserial_his_update_lock_by_c0(&tTradeserialhis); 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_his_free_lock_by_c0(); } if(tTradeserial.card_id!=card_no) { *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; goto L_RETU; } des2src(tTradeserial.operate_date,sysdate); des2src(tTradeserial.operate_time,systime); des2src(tTradeserial.collect_date,sysdate); des2src(tTradeserial.collect_time,systime); ret=GetLogicDate(tTradeserial.enteract_date); //业务日期 if(ret) { *pRetCode=ret; writelog(LOG_ERR,"GetLogicDate err ret[%d]",ret); goto L_RETU; } des2src(tTradeserial.enteract_time,systime); tTradeserial.in_balance =rPack->damt1; tTradeserial.trade_fee = -1 * tTradeserial.trade_fee; //本次消费金额 tTradeserial.boardfee = -1 * tTradeserial.boardfee; //本次消费管理费 tTradeserial.out_balance=tTradeserial.in_balance-tTradeserial.trade_fee; tTradeserial.trade_count=rPack->lvol10; tTradeserial.maindevice_id=rPack->lvol6; des2src(tTradeserial.oper_code,rPack->scust_limit); tTradeserial.reviseserial_no=tTradeserial.other_seri_no; //取流水号,从帐处理 ret=getNewUniqNo(KEYTYPE_TRADESERIAL, &dUniqno); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"getNewUniqNo err[%d]",ret); goto L_RETU; } tTradeserial.serial_no=D2I(dUniqno); //###################################################### //入账处理 switch(tTradeserial.serial_type) { case 930031: // 交易冲正 if(amtcmp(tTradeserial.trade_fee,0)<=0) break; tTradeserial.serial_type=TXCODE_TX_REVEAL; ret=process930031(&tTradeserial); if(ret) { //业务处理失败处理 *pRetCode=ret; goto L_RETU; } break; case 930034: // 充值冲正 if(amtcmp(tTradeserial.trade_fee,0)<=0) break; tTradeserial.serial_type=TXCODE_TX_REVEAL; ret=process930034(&tTradeserial); if(ret) { //业务处理失败处理 *pRetCode=ret; goto L_RETU; } break; case 930036: // 搭伙费冲正 if(amtcmp(tTradeserial.trade_fee,0)<=0) break; tTradeserial.serial_type=TXCODE_TX_REVEAL; ret=process930036(&tTradeserial); if(ret) { //业务处理失败处理 *pRetCode=ret; goto L_RETU; } break; default: *pRetCode=E_TXCODE_NOT_EXIST; //交易码错误 goto L_RETU; } //###################################################### //添加交易流水 tTradeserial.serial_state=SERISTAT_DEBT; ret = DB_t_tif_tradeserial_add(&tTradeserial); if (ret) { writelog(LOG_ERR,"DB_t_tif_tradeserial_add ret[%d]",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; } 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元",tTradeserial.serial_no,-tTradeserial.trade_fee,tTradeserial.in_balance,tTradeserial.out_balance); writelog(LOG_DEBUG,out_pack->vsmess); PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }