int F847107(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int i=0; int ret =0; char logicdate[11]=""; //业务日期 char sysdate[11]=""; char systime[9]=""; int card_id=0; char sMsg[256]=""; char physical_no[41]=""; T_t_tif_tradeserial tradeserial; T_t_pif_card tCard; T_t_tif_savdtl tSavdtl; T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; T_t_aif_account tAccount; //帐户表 InAcc IA; double dSerialNo = 0; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); *pRetCode=0; memset(&tCard,0,sizeof(tCard)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&IA,0,sizeof(IA)); memset(&tSpeFee,0,sizeof(tSpeFee)); memset(&tAccount,0,sizeof(tAccount)); memset(&tradeserial,0,sizeof(tradeserial)); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LSERIAL1,F_DAMT2,F_VSMESS,0); card_id=rPack->lvol0; des2src(physical_no, rPack->sbank_acc); //物理卡号 if(amtcmp(rPack->damt0,0)<=0) { *pRetCode=E_INPUT_AMT; goto L_RETU; } if(amtcmp(rPack->damt1,0)<0) { *pRetCode=E_INPUT_CARD_BALA; goto L_RETU; } if(rPack->lvol10<1) { *pRetCode=E_INPUT_CARD_TXCNT; goto L_RETU; } if(amtcmp(rPack->damt1,rPack->damt0)<0) { writelog(LOG_ERR,"tCard balance[%lf] amount[%lf]",rPack->damt1,rPack->damt0); *pRetCode= E_BALANCE_SHORTAGE; goto L_RETU; } getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } ret=DB_t_pif_card_read_by_card_id(card_id, &tCard); if(ret) { if(DB_NOTFOUND==ret) *pRetCode=E_CARDNO_NOT_EXIST; else *pRetCode=E_DB_CARD_R; goto L_RETU; } if(strncmp(tCard.state_id,CARDSTAT_REG,4)!=0) { if('2'==tCard.state_id[CARDSTAT_TYPE_REG]) *pRetCode = E_CARDNO_LOGOUT; else if('3'==tCard.state_id[CARDSTAT_TYPE_REG]) *pRetCode = E_CARD_CHANGE; else if(tCard.state_id[CARDSTAT_TYPE_LOST]==STATE_TRUE) *pRetCode=E_CARDNO_LOST; else if(tCard.state_id[CARDSTAT_TYPE_FREEZE]==STATE_TRUE) *pRetCode=E_CARDNO_FREEZE; else if(tCard.state_id[CARDSTAT_TYPE_WFAIL]==STATE_TRUE) *pRetCode=E_CARDNO_WFAIL; goto L_RETU; } trim(physical_no); trim(tCard.physical_no); if(strcmp(tCard.physical_no,physical_no)!=0) { writelog(LOG_ERR,"db physical_no[%s],input physical_no[%s]",tCard.physical_no,physical_no); *pRetCode= E_CARD_PHYNO_DIFFER; goto L_RETU; } tradeserial.trade_fee = rPack->damt0; //支取金额 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]purse_id[%d]",ret,card_id); if(DB_NOTFOUND==ret) *pRetCode= E_ACTNO_NOT_EXIST; else *pRetCode= E_DB_ACCOUNT_R; goto L_RETU; } if(amtcmp(tradeserial.trade_fee,tAccount.cur_freebala)>0) { writelog(LOG_ERR,"tradeserial.trade_fee[%lf]tAccount.cur_freebala[%lf]",tradeserial.trade_fee,tAccount.cur_freebala); *pRetCode= E_BALANCE_SHORTAGE; goto L_RETU; } //查询支票经费本有无充值记录 ret=ChkSavdtl(card_id,&tSavdtl); if(ret) { writelog(LOG_ERR,"ChkSavdtl ret[%d]",ret); *pRetCode=ret; goto L_RETU; } IA.dArrInAmt[0]=tradeserial.trade_fee; switch(tSavdtl.bill_type) { 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]",tSavdtl.bill_type); IA.iArrInFeeSwitch[1]=1; break; } 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) *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(); ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo); //获得流水号 if(ret) { *pRetCode = ret; writelog(LOG_ERR," ERRCODE = [%d]",ret); goto L_RETU; } tradeserial.serial_no = D2I(dSerialNo); //流水号 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type = TXCODE_DRAW_DEPOSIT_LOG; //交易代码 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.card_id = rPack->lvol0; //卡号 tradeserial.purse_id = rPack->lvol1; //钱包号 tradeserial.customer_id = rPack->lvol2; //客户标识 tradeserial.in_balance=rPack->damt1; //入卡值 tradeserial.trade_count=rPack->lvol10+1; //交易次数 des2src(tradeserial.oper_code , rPack->scust_limit); //操作员代码 tradeserial.sys_id = 0; //外部系统标识 IA.iCardNo=tCard.card_id; IA.iFeeType=tCustomer.fee_type; strcpy(IA.sArrInActno[0],tAccount.account_id); IA.dArrInAmt[0]=tradeserial.trade_fee; //账号 IA.iArrInFeeSwitch[0]=rPack->lvol0; 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_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_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]); strcat(out_pack->vsmess,sMsg); } } sprintf(sMsg,"支取前卡余额:%.2lf元 卡当前余额:%.2lf元",tradeserial.in_balance,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; } out_pack->damt2=tradeserial.out_balance; //出卡值 out_pack->lserial1=tradeserial.serial_no; //流水号 PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F930101(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret= 0; int dev_usage = 0; //T_t_attend_txdtl tTxdtl; T_t_door_txdtl tTxdtl; T_t_pif_device tDevice; T_t_pif_card tCard; if(strlen(rPack->sdate0) != 8) { *pRetCode = E_DEVPHYID_NULL; goto L_RETU; } /* ret=chk_dyn_key(rPack->lcert_code,rPack->scust_limit2); if(ret) { writelog(LOG_ERR,"subsys_id[%d]dyn_key[%s]",rPack->lcert_code,rPack->scust_limit2); *pRetCode = ret; goto L_RETU; } */ memset(&tTxdtl,0,sizeof(tTxdtl)); memset(&tDevice,0,sizeof tDevice); /* tTxdtl.serial_no= rPack->lvol3; //上传端流水号 tTxdtl.sys_id = rPack->lcert_code; //上传工作站标识(前置机注册号) // tTxdtl.mode_code=rPack->lvol6; //模式代码 tTxdtl.card_no= rPack->lvol7; //交易卡号 // tTxdtl.use_type= rPack->lvol8; //考勤类型 // tTxdtl.inductor_no= rPack->lvol9; //感应头标记 // tTxdtl.work_mark=rPack->lvol10; //上下班标志 tTxdtl.tx_mark=rPack->lvol11; //999交易标志 des2src(tTxdtl.device_id, rPack->sdate0); //物理设备ID des2src(tTxdtl.tx_date,rPack->sdate1); //发生日期(格式化输入的日期) des2src(tTxdtl.crc,rPack->sbank_code2); //CRC校验 des2src(tTxdtl.tx_time,rPack->spost_code2); //发生时间(格式化输入的时间) getsysdate(tTxdtl.col_date); getsystime(tTxdtl.col_time); // ret=check(&tTxdtl); // if(ret) // { // tTxdtl.status[0]='5'; //无效交易 // //tTxdtl.err_code=ret; // writelog(LOG_DEBUG,"无效流水device_id[%d]serial_no[%d]",tTxdtl.device_id,tTxdtl.serial_no); // return ret; // } // else // tTxdtl.status[0]='1'; ret = SaveDoorJSBSerial(&tTxdtl); */ tTxdtl.serial_no= rPack->lvol3; //上传端流水号 tTxdtl.sys_id = rPack->lcert_code; //上传工作站标识(前置机注册号) // tTxdtl.mode_code=rPack->lvol6; //模式代码 tTxdtl.card_no= rPack->lvol7; //交易卡号 memset(&tCard,0,sizeof tCard); ret = DB_t_pif_card_read_by_card_id(tTxdtl.card_no,&tCard); if(ret) { if(DB_NOTFOUND == ret) { // 卡号不存在 writelog(LOG_ERR,"上传的交易卡号deviceid[%s],cardno[%d],不存在", rPack->sdate0,tTxdtl.card_no); return 0; } else { writelog(LOG_ERR,"上传的交易卡号读取表失败cardno[%d]",tTxdtl.card_no); *pRetCode = E_DB_CARD_R; goto L_RETU; } } // tTxdtl.use_type= rPack->lvol8; //考勤类型 // tTxdtl.inductor_no= rPack->lvol9; //感应头标记 // tTxdtl.work_mark=rPack->lvol10; //上下班标志 des2src(tTxdtl.phycard_no,tCard.physical_no); tTxdtl.cust_id = tCard.cosumer_id; //客户号 tTxdtl.tx_mark=rPack->lvol11; //999交易标志 //des2src(tTxdtl.device_id, rPack->sdate0); //物理设备ID ret = get_devinfo_by_phyid(rPack->sdate0,&tDevice); if(ret) { if(DB_NOTFOUND == ret) { // 设备不存在 writelog(LOG_ERR,"采集计时宝流水,设备不存在或已注销[%s]" ,rPack->sdate0); return 0; } else { *pRetCode = ret; goto L_RETU; } } tTxdtl.device_id = tDevice.device_id; //if(strlen(rPack->sdate1)==0) // getsysdate(tTxdtl.tx_date); //else if(strlen(rPack->sdate1)==6) { sprintf(tTxdtl.tx_date,"20%s",rPack->sdate1); } else des2src(tTxdtl.tx_date,rPack->sdate1); //发生日期(格式化输入的日期) des2src(tTxdtl.crc,rPack->sbank_code2); //CRC校验 des2src(tTxdtl.tx_time,rPack->spost_code2); //发生时间(格式化输入的时间) getsysdate(tTxdtl.col_date); getsystime(tTxdtl.col_time); check(&tTxdtl); g_dbchkerr=0; ret = DB_t_door_txdtl_add(&tTxdtl); g_dbchkerr=1; if(ret) { if(DB_REPEAT == ret) return 0; writelog(LOG_ERR,"插入门禁流水表失败,errcode[%d]",ret); writelog(LOG_ERR,"serial_no[%d]phycardid[%s]card_no[%d]device_id[%s]tx_date[%s]tx_time[%s]", tTxdtl.serial_no,tTxdtl.phycard_no,tTxdtl.card_no,tTxdtl.device_id,tTxdtl.tx_date,tTxdtl.tx_time); *pRetCode = ret; goto L_RETU; } ret = SaveKQSerial(&tTxdtl); if(ret) { writelog(LOG_ERR,"插入考勤流水表失败,errcode[%d]",ret); *pRetCode = ret; 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 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; 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); 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); 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_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; //通信版本号 // add by 汤成 2007-10-31 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; // 收费科目 tTradeserialhis.serial_state = SERISTAT_RUSH; //冲正 // 保存被冲正交易的操作员号 des2src(tTradeserialhis.oper_code, tTradeserialhis.oper_code); 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) { 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) *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; sprintf("logicdate[%s],tradedate[%s]",logic_date, tTradeserial.enteract_date); 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.oper_code) != 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.boardfee = -1 * tTradeserial.boardfee; //本次消费管理费 tTradeserial.out_balance = tTradeserial.in_balance - tTradeserial.trade_fee; if (rPack->lvol10 > 0) tTradeserial.trade_count = rPack->lvol10 + 1; 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; 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; }
static int elect_request_changzhou(ST_PACK *in_pack,char ext_msg[256]){ int ret = 0; char c_drtbranch[10]=""; char c_bccbasefuncno[10]=""; int DRTP_BRANCH =0; int BCC_BASEFUNCNO =0; ST_PACK ArrayPack; // 设置返回包 ST_CPACK aPack; // 设置应答包 ST_CPACK sPack; // 设置发送包 int card_id; 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=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; } 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; } ret=GetParameter(2501, c_drtbranch); if(ret){ writelog(LOG_ERR,"get_parameter error,error code=[%d]",ret); return ret; } ret=GetParameter(2502, c_bccbasefuncno); if(ret){ writelog(LOG_ERR,"get_parameter error,error code=[%d]",ret); return ret; } DRTP_BRANCH = atoi(c_drtbranch); BCC_BASEFUNCNO = atoi(c_bccbasefuncno); ResetNormalCPack(&aPack, 0, 1); memset(&ArrayPack, 0, sizeof(ArrayPack)); ResetNormalCPack(&sPack, 0, 1); SetHeadCol(&sPack, F_SSECTYPES,F_LVOL0,F_LVOL1,F_SORDER0,F_SCUST_AUTH,0); // 设置发送windows BU的头部视图信息 sPack.head.RequestType = 847357; sPack.pack.lvol0=in_pack->lvol10;//房间号 sPack.pack.lvol1=D2I(in_pack->damt1*100);//转账金额(分) memcpy(sPack.pack.sorder0,tCustomer.cut_name,11); ret = ExtCall(0, DRTP_BRANCH, BCC_BASEFUNCNO, 0, TIMEOUT, &sPack, &aPack, &ArrayPack); if (ret < 0||aPack.head.retCode!=0) { if(ret<0) { writelog(LOG_ERR,"Call 847357 error,errcode=[%d],retCode=[%d]",ret,aPack.head.retCode); return ret; } else { writelog(LOG_ERR,"Call 847357 error,errcode=[%d],retCode=[%d]",ret,aPack.head.retCode); return aPack.head.retCode; } } return 0; }
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); if(strncmp(logicdate,operate_date,8)==0) { ret=DB_t_tif_tradeserial_read_by_serial_no(iSerialno,&old_tradeserial); if(ret) { writelog(LOG_ERR,"Serialno[%d]",iSerialno); if(DB_NOTFOUND==ret) ret = E_SERIALNO_NOT_EXIST; else ret = E_DB_TRADESERIAL_R; goto L_RETU_INNER; } 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; } else { // TODO: 需要在数据库上建立索引 ret=DB_t_tif_tradeserial_his_read_by_operate_date_and_serial_no(operate_date,iSerialno,&tradeserialhis); if(ret) { writelog(LOG_ERR,"operate_date[%s]Serialno[%d]",operate_date,iSerialno); 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; } 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; }
static int packege_elec_request(ST_PACK *in_pack,int flag,char *send_data){ int ret; ext_elect_req_t* elect_req_t; elect_req_t=(ext_elect_req_t*)send_data; double money=0; //充值金额 char serialno[10]=""; char sysdate[11]=""; char systime[9]=""; char sysdatetime[20]=""; unsigned char buf[106]=""; unsigned char soutmd5[16]=""; char outmd5[32]=""; T_t_pif_card tCard; memset(&tCard,0,sizeof(tCard)); if(flag==1){//房间查询不加密 memcpy(elect_req_t->prix,"0",1); }else{ memcpy(elect_req_t->prix,"1",1); } memcpy(elect_req_t->length,"0141",4); if(flag==1){ memcpy(elect_req_t->type,"0001",4); }else if(flag==2){ memcpy(elect_req_t->type,"0002",4); } memset(elect_req_t->bitery,'0',sizeof(elect_req_t->bitery)); sprintf(elect_req_t->room,"%-20s",in_pack->saddr); ret=DB_t_pif_card_read_by_card_id(in_pack->lvol0, &tCard); if(ret) { if(DB_NOTFOUND==ret) ret=E_CARDNO_NOT_EXIST; else ret=E_DB_CARD_R; return ret; } sprintf(elect_req_t->cutid,"%-22d",tCard.cosumer_id); money = in_pack->damt1; int i_money=D2I(D4U5(money*100,0)); sprintf(elect_req_t->money,"%07d",i_money); 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); } strcpy(sysdatetime,sysdate+4); strcat(sysdatetime,systime); memcpy(elect_req_t->datetime,sysdatetime,10); memcpy(elect_req_t->tracenum,sysdate,8); sprintf(serialno,"%010d",in_pack->lvol6); memcpy(elect_req_t->tracenum+8,serialno,10); memcpy(elect_req_t->retnum,"0000",4); memcpy(elect_req_t->clientid,"0001",4); memset(outmd5,'0',32); if(flag==1){ sprintf(elect_req_t->signcheck,"%s",outmd5); }else if(flag==2){ memcpy(buf,elect_req_t->type,105); writelog(LOG_ERR,"buf data=[%s]",buf); CalcMD5(buf,105,soutmd5); dec2hex(soutmd5,16,outmd5); writelog(LOG_ERR,"outmd5 data=[%s]",outmd5); sprintf(elect_req_t->signcheck,"%s",outmd5); } return 0; }
//系统正式入账 int enter_account(ST_PACK *in_pack,InAcc *IA,ST_PACK *out_pack,T_t_tif_tradeserial *tradeserial){ int ret = 0; int i=0; int card_id = 0; char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char sMsg[256]=""; 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)); // memset(&tradeserial,0,sizeof tradeserial); 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(); //已经入账了 if(tradeserial->serial_state == SERISTAT_DEBT) goto L_RET; IA->iCardNo=tCard.card_id; IA->iFeeType=tCustomer.fee_type; if(amtcmp(tradeserial->trade_fee, 0) <=0) return E_INPUT_AMT_NULL; 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; } */ L_RET: 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 record_serial(ST_PACK *in_pack,T_t_tif_tradeserial *tradeserial,ST_PACK *out_pack){ int ret =0; int card_id= 0; double dUniqno = 0; char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char Operator[33+1] = ""; int maindevice_id = 0; T_t_pif_card tCard; card_id=in_pack->lvol0; memset(&tCard,0,sizeof(tCard)); 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 = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniqno); //获得最大流水号 if(ret) { writelog(LOG_ERR,"getNewUniqNo error,errcode=[%d]",ret); return ret; } tradeserial->serial_no = D2I(dUniqno); //流水号 if(strlen(in_pack->scust_no) ==0) return E_INPUT_OPER_NULL; des2src(Operator,in_pack->scust_no); //操作员号 //采集设备标识 strncpy(tradeserial->operate_date,sysdate,sizeof(sysdate)-1); //发生日期 strncpy(tradeserial->operate_time,systime,sizeof(systime)-1); des2src(tradeserial->collect_date,tradeserial->operate_date); //采集日期 des2src(tradeserial->collect_time,tradeserial->operate_time); //采集时间 des2src(tradeserial->enteract_date,logicdate); //处理日期 des2src(tradeserial->enteract_time,tradeserial->operate_time); //处理时间 tradeserial->serial_no = D2I(dUniqno); //流水号 tradeserial->purse_id = PURSE_NO_ONE; //钱包号 tradeserial->serial_state = SERISTAT_NODEBT; //流水状态 tradeserial->maindevice_id = maindevice_id; //上传工作站标识 tradeserial->device_id = in_pack->lvol4; //采集设备标识 tradeserial->card_id = card_id; //交易卡号 tradeserial->customer_id=tCard.cosumer_id; //客户号 des2src(tradeserial->oper_code,Operator); tradeserial->trade_count=in_pack->lvol1+1; //交易次数 tradeserial->in_balance=in_pack->damt0; //入卡值 //除了海事的考试报名,别的交易金额不能小于0 if(amtcmp(in_pack->damt1, 0) <= 0) { if(tradeserial->serial_type != 847233) return E_INPUT_AMT_NULL; } tradeserial->trade_fee=in_pack->damt1; //交易金额 strncpy(tradeserial->reserve_2,in_pack->vsmess,sizeof(tradeserial->reserve_2)-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; return ret; } ret=db_commit(); if(ret) { writelog(LOG_ERR,"db_commit error,errcode=[%d]",ret); return E_DB_COMMIT; } return 0; }
static int packege_send_data(ST_PACK *in_pack,int flag,char *send_data){ int ret =0; //char cellphone[31]=""; //充值手机号 double money=0; //充值金额 char sysdate[11]=""; char systime[9]=""; char sysdatetime[20]=""; char serialno[20]=""; char sMoney[20]=""; T_t_pif_card tCard; // ext_phone_trans_t phone_trans_struct; ext_phone_trans_t* phone_trans_struct; phone_trans_struct=(ext_phone_trans_t*)send_data; memset(&tCard,0,sizeof(tCard)); memset(phone_trans_struct,0,sizeof(ext_phone_trans_t)); phone_trans_struct->prix[0]=0x31; memcpy(phone_trans_struct->length,"0067",4); if(1==flag) { memcpy(phone_trans_struct->type,"0100",4); } else if(2==flag) { memcpy(phone_trans_struct->type,"0200",4); } //memcpy(phone_trans_struct->bitery,"0000000000000000",16); memset(phone_trans_struct->bitery,'0',sizeof(phone_trans_struct->bitery)); ret=DB_t_pif_card_read_by_card_id(in_pack->lvol0, &tCard); if(ret) { if(DB_NOTFOUND==ret) ret=E_CARDNO_NOT_EXIST; else ret=E_DB_CARD_R; return ret; } sprintf(phone_trans_struct->cutid,"%-22d",tCard.cosumer_id); money = in_pack->damt1; int i_money=D2I(D4U5(money*100,0)); sprintf(sMoney,"%07d",i_money); memcpy(phone_trans_struct->money,sMoney,sizeof(phone_trans_struct->money)); 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); } strcpy(sysdatetime,sysdate+4); strcat(sysdatetime,systime); memcpy(phone_trans_struct->datetime,sysdatetime,10); memcpy(phone_trans_struct->tracenum,sysdate,8); sprintf(serialno,"%06d",in_pack->lvol6%1000000); memcpy(phone_trans_struct->tracenum+8,serialno,6); memcpy(phone_trans_struct->phone,in_pack->sphone,strlen(in_pack->sphone)); memcpy(phone_trans_struct->retnum,"00",2); memset(phone_trans_struct->plugdata,0x20,sizeof(phone_trans_struct->plugdata)); /* memcpy(send_data,phone_trans_struct->prix,1); memcpy(send_data+1,phone_trans_struct->length,4); memcpy(send_data+5,phone_trans_struct->type,4); memcpy(send_data+9,phone_trans_struct->bitery,16); memcpy(send_data+25,phone_trans_struct->cutid,22); memcpy(send_data+47,phone_trans_struct->money,7); memcpy(send_data+54,phone_trans_struct->datetime,10); memcpy(send_data+64,phone_trans_struct->tracenum,14); memcpy(send_data+78,phone_trans_struct->phone,11); memcpy(send_data+89,phone_trans_struct->retnum,2); memcpy(send_data+91,phone_trans_struct->plugdata,36); */ writelog(LOG_ERR,"package send data=[%s]",send_data); return 0; }
int F847110(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret=0; int card_id=0; T_t_pif_card tCard; T_t_pif_spefee tSpeFee; T_t_cif_customer tCustomer; T_t_aif_account tAccount; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); memset(&tCard,0,sizeof(tCard)); memset(&tSpeFee,0,sizeof(tSpeFee)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tAccount,0,sizeof(tAccount)); card_id = in_pack->lvol0; //卡标识 //判断卡状态是否为写卡未成功状态 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) *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); *pRetCode=E_DB_CARD_R; goto L_RETU; } if(strncmp(tCard.state_id,CARDSTAT_REG,4)!=0) { if(tCard.state_id[CARDSTAT_TYPE_REG]!=STATE_TRUE) { *pRetCode=E_CARDNO_LOGOUT; goto L_RETU; } else if(tCard.state_id[CARDSTAT_TYPE_LOST]==STATE_TRUE) { *pRetCode=E_CARDNO_LOST; goto L_RETU; } else if(tCard.state_id[CARDSTAT_TYPE_FREEZE]==STATE_TRUE) { *pRetCode=E_CARDNO_FREEZE; goto L_RETU; } //else if(tCard.state_id[CARDSTAT_TYPE_WFAIL]==STATE_TRUE) //*pRetCode=E_CARDNO_WFAIL; } //得到收费类别 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) *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(); ret=DB_t_aif_account_read_by_card_id_and_purse_id(card_id,0,&tAccount); if(ret) { if(DB_NOTFOUND==ret) *pRetCode= E_ACTNO_NOT_EXIST; else *pRetCode= E_DB_ACCOUNT_R; goto L_RETU; } SetCol(handle,0); SetCol(handle,F_DAMT0,F_LVOL1,F_LVOL5,F_SDATE0,F_LVOL0,F_SNAME,F_SNAME2,F_SCUST_AUTH,F_SSERIAL0,F_SCUST_AUTH2,F_SCUST_TYPE,F_SCUST_LIMIT,F_SCUST_NO,F_SBANK_ACC,0); out_pack->lvol0 = tCard.card_id; //卡标识 out_pack->damt0=D4U5(tAccount.cur_freebala,2); //卡余额 des2src(out_pack->sdate0,tCard.end_time); //有效截止日期 out_pack->lvol1 = tCustomer.cut_type; //客户类别 out_pack->lvol5 = tCustomer.fee_type; //收费类别 des2src(out_pack->sname,tCustomer.cut_name); //学生\员工姓名 des2src(out_pack->sserial0,tCustomer.classdept_no); //单位代码 des2src(out_pack->scust_auth2,tCustomer.man_id); //身份证号 des2src(out_pack->scust_type,tCustomer.sex); //性别 des2src(out_pack->scust_limit,tCustomer.stuemp_no); //学号\员工号 des2src(out_pack->sname2,tCustomer.lib_cardid); //图书证号 des2src(out_pack->scust_no,tCard.showid); //显示卡号 des2src(out_pack->sbank_acc,tCard.physical_no); //物理卡号 PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }