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_card tCard; 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)); 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; //冲正 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; //通信版本号 // 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); //发生时间(格式化输入的时间) 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) { 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; 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; 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; 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 F847124(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int hi_cutid = 0; //客户ID int hi_cuttype = 0; //客户类型 int i=0; int ret = 0; int len = 0; char h_showcardid[11] = ""; //显示卡号 char h_password[7] = ""; //卡密码 double h_temp_Card_id = 0; //卡号 char seed_key[17] = ""; //种子密钥 char card_endtime[8 + 1] = ""; //卡的有效截至日期 char logicdate[11]=""; //业务日期 char sysdate[11]=""; char systime[9]=""; char sMsg[256]=""; char sMaxCardBalance[20]=""; double dMaxCardBalance=0; int type=0; //充值类型 T_t_pif_card tCard; T_t_cif_customer tCustomer; T_t_aif_account tAccount; T_t_tif_tradeserial tradeserial; T_t_tif_savdtl tSavdtl; T_t_pif_spefee tSpeFee; double h_temp_Serial_no = 0; InAcc IA; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); memset(&IA,0,sizeof(IA)); memset(&tCard, 0, sizeof(tCard)); memset(&tAccount,0,sizeof(tAccount)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&tSpeFee,0,sizeof(tSpeFee)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tSavdtl,0,sizeof(tSavdtl)); ResetNormalCPack(&aPack,0,1); SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL5, F_SCUST_NO, F_SCUST_NO2,F_SCUST_AUTH,F_SCERT_NO, F_SDATE0,F_SNAME,F_SNAME2, F_SOPEN_EMP,F_SSTATUS0, F_DAMT2,F_LSERIAL1,F_VSMESS, F_SORDER0,F_SORDER1,F_SORDER2, F_SHOLDER_AC_NO,F_SSTAT_TYPE,F_SSTAT_TYPE2, F_SNATION_CODE,F_SBRANCH_CODE0, 0); hi_cutid = rPack->lvol0; //客户ID hi_cuttype = rPack->lvol3; //客户类别 //满足大学城的需求,用客户号替代显示卡号 //des2src(h_showcardid,rPack->scust_no); //显示卡号 sprintf(h_showcardid,"%010d",hi_cutid); getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } //检查客户信息,判断是否可以发行卡 des2src(tCard.physical_no, rPack->sbank_acc); //物理卡号 trim(h_showcardid); if(strlen(h_showcardid)) { ret=IsExistShowCardNo(h_showcardid); if(ret) { *pRetCode = ret; goto L_RETU; } } ret=IsExistCardByPhyCardNo(tCard.physical_no); if(ret) { *pRetCode = ret; goto L_RETU; } ret=IsExistCardByCustomId(hi_cutid); if (ret) { *pRetCode = ret; goto L_RETU; } ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(hi_cutid, &tCustomer); if(ret) { writelog(LOG_ERR,"cut_id[%d]",hi_cutid); if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_R; goto L_RETU; } //得到收费类别 if(tCustomer.fee_type<1) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); *pRetCode=E_DB_SPEFEE_R; goto L_RETU; } } else { tCustomer.fee_type=tSpeFee.fee_type; } //更新客户表的收费类别字段 } tCustomer.use_flag[0]='1'; ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_U; goto L_RETU; } DB_t_cif_customer_free_lock_cur(); tradeserial.trade_fee =rPack->damt0; //检查金额是否超过最大额度 ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance); if(ret) { *pRetCode=ret; goto L_RETU; } dMaxCardBalance=atof(sMaxCardBalance); if(amtcmp(tradeserial.trade_fee,dMaxCardBalance)>0) { writelog(LOG_ERR,"tradeserial.trade_fee[%lf]",tradeserial.trade_fee); *pRetCode=E_AMT_EXCEED_MAX; goto L_RETU; } // 准备数据插入卡信息表 memcpy(seed_key,STATIC_SEED_KEY,sizeof(seed_key)); //读种子密钥 ret=IsInvalidDateTime(rPack->sdate0,"YYYYMMDD"); if(ret) { *pRetCode = E_INPUT_DATE; goto L_RETU; } if(strncmp(rPack->sdate0,sysdate,8)<=0) { *pRetCode=E_INPUT_DATE; goto L_RETU; } des2src(card_endtime,rPack->sdate0); /* ret = GetCardValiddate(hi_cuttype,logicdate,card_endtime); //计算卡的有效期 if (ret) { *pRetCode = ret; goto L_RETU; } */ //规则如下: 当发卡人在系统中的证件类别为身份证并有身份证号时,卡密码取身份证的后六位数字(例如...987654321则为654321;...98765432X则为765432),否则都为“888888”。 if(strcmp(tCustomer.man_idtype,"1")==0) { get_init_passwd_by_man_id(tCustomer.man_id,h_password); } else strcpy(h_password,DEFAULT_CUST_PWD); ret = getNewUniqNo(KEYTYPE_CARD_ID,&h_temp_Card_id); //获取最大卡号 if(ret) { *pRetCode = ret; goto L_RETU; } tCard.card_id = D2I(h_temp_Card_id); //卡号 des2src(tCard.showid,h_showcardid); //显示卡号 des2src(tCard.is_main,TYPE_YES); //是否为主卡 des2src(tCard.state_id,CARDSTAT_REG); //卡状态 tCard.type_id = CT_TEMP_NAME; //卡类别 EncodePwd(seed_key,h_password,tCard.password,0); //卡密码 tCard.cosumer_id = hi_cutid; //客户标识 tCard.account_count = ACCOUNT_COUNT_ONE; //卡对应帐户个数 des2src(tCard.begin_time,logicdate); //注册时间 des2src(tCard.end_time, card_endtime); //截至时间 tCard.phytype = PHYTYPE_NO_ONE; //设备物理型号;默认为1 // 插入卡信息 ret = DB_t_pif_card_add(&tCard); if (ret) { if(DB_REPEAT==ret) *pRetCode = E_DB_CARD_E; else *pRetCode = E_DB_CARD_I; goto L_RETU; } // 准备数据插入帐户信息表 ret = getNewActno(tAccount.account_id); //获得最大帐号 if (ret) { *pRetCode = ret; goto L_RETU; } des2src(tAccount.open_date,sysdate); //开户时间 des2src(tAccount.open_time,systime); tAccount.current_state = ACCOUNTSTAT_REGIST; //当前状态 tAccount.act_type = ACCTYPE_PERMAIN; //帐号类别 tAccount.customer_id = rPack->lvol0; //客户号 des2src(tAccount.cut_name,rPack->sname); //客户名称 tAccount.cut_type = hi_cuttype; //客户类别 des2src(tAccount.stuemp_no,rPack->scust_auth2); //客户学号或员工号 tAccount.card_id = tCard.card_id; //关联卡号 tAccount.purse_id = PURSE_NO_ONE; //关联卡钱包号 tAccount.card_type = tCard.type_id; //卡类别 des2src(tAccount.subno,SUBJECT_INDIVIDUALSAVING); //所属科目 des2src(tAccount.isautotra,TYPE_NO); //是否自动转帐 // 插入帐户信息表 ret = DB_t_aif_account_add(&tAccount); if (ret) { writelog(LOG_ERR,"ret [%d]",ret); if(DB_REPEAT==ret) *pRetCode = E_DB_ACCOUNT_E; else *pRetCode = E_DB_ACCOUNT_I; goto L_RETU; } ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&h_temp_Serial_no); //获得最大流水号 if(ret) { *pRetCode = ret; writelog(LOG_ERR,"ret [%d]",ret); goto L_RETU; } tradeserial.serial_no = D2I(h_temp_Serial_no); //流水号 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type=TXCODE_CARD_OPEN_TMP_CASH; //交易码 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 = tCard.card_id; //卡号 des2src(tradeserial.showid,tCard.showid); //显示卡号 tradeserial.purse_id = PURSE_NO_ONE; //钱包号 tradeserial.customer_id = hi_cutid; //客户标识 des2src(tradeserial.oper_code , rPack->scust_limit); //操作员代码 tradeserial.sys_id = 0; //外部系统标识 tradeserial.trade_count=1; //当前卡交易次数 type=rPack->lvol4; //交易类型 IA.dArrInAmt[0]=tradeserial.trade_fee; switch(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: *pRetCode=E_INPUT_DEPOSIT_TYPE; goto L_RETU; } switch(type) { case TYPE_CASH: //现金 break; case TYPE_BILL: //支票 case TYPE_FUNDBOOK: //经费本 tSavdtl.amount=rPack->damt0; //发生额 if(amtcmp(tSavdtl.amount,0)<=0) break; des2src(tSavdtl.bill_no,rPack->sphone); //票据号码 if(strlen(tSavdtl.bill_no)<1) { *pRetCode=E_INPUT_BILLNO; goto L_RETU; } tSavdtl.card_no=tCard.card_id; //卡号 des2src(tSavdtl.oper_no,rPack->scust_limit); //操作员 tSavdtl.seqno=tradeserial.serial_no; //流水号 des2src(tSavdtl.tx_date,logicdate); //发生日期 des2src(tSavdtl.tx_time,systime); //发生时间 tSavdtl.cnt=1; //票据数量 tSavdtl.bill_type=type; //票据类型 tSavdtl.tx_code=tradeserial.serial_type; //交易码 ret=DB_t_tif_savdtl_add(&tSavdtl); if(ret) { if(DB_REPEAT==ret) *pRetCode = E_DB_SAVDTL_E; else *pRetCode = E_DB_SAVDTL_I; goto L_RETU; } break; default: *pRetCode=E_TXCODE_NOT_EXIST; goto L_RETU; } des2src(IA.sArrInActno[0],tAccount.account_id); //帐户 IA.iCardNo=tCard.card_id; IA.iFeeType=tCustomer.fee_type; //调用入账子模块 ret=process(&IA,&tradeserial); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"process ret[%d]",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元",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->lvol0 = (int)h_temp_Card_id; //交易卡号 out_pack->lvol1 = tCustomer.cut_type; //客户类别 out_pack->lvol5 = tCustomer.fee_type; //收费类别 des2src(out_pack->scust_no,h_showcardid); //显示卡号 des2src(out_pack->scust_no2,tCustomer.classdept_no); //部门号 des2src(out_pack->scust_auth,tCustomer.stuemp_no); //学号 des2src(out_pack->scert_no,tCustomer.man_id); //身份证号 des2src(out_pack->sname,tCustomer.cut_name); //客户姓名 des2src(out_pack->sname2,tCustomer.lib_cardid); //图书证号 des2src(out_pack->sstatus0,tCustomer.sex); //性别 des2src(out_pack->sopen_emp,h_password); //卡密码 des2src(out_pack->sdate0,card_endtime); //有效截至日期 strcpy(out_pack->sorder0,CARD_STRUCT_VERSION); //制卡版本号 strcpy(out_pack->sorder1,CARD_REGISTER_PUBLISH_CODE); //发卡注册标识号 strcpy(out_pack->sorder2,CARD_REGISTER_SERVICE_CODE); //服务注册标识号 sprintf(out_pack->sholder_ac_no,"%ld",tCustomer.cut_id); //客户号 des2src(out_pack->sstat_type,tCustomer.man_idtype); //证件类型 des2src(out_pack->snation_code,tCustomer.country); //国籍 sprintf(out_pack->sstat_type2,"%d",tCustomer.nation); //民族 des2src(out_pack->sbranch_code0,tCustomer.school_code); //院校代码 out_pack->damt2=tradeserial.out_balance; //出卡值 out_pack->lserial1=tradeserial.serial_no; //流水号 PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
static int do_process(T_t_pif_card *tCard, T_t_tif_writefailed *tWriteFailed, ST_PACK *rPack, T_t_tif_tradeserial *tradeserial) { int ret = 0; int free_lock_flag = 1; //0关闭, 1表示打开 char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char operate_date[11]=""; // char sSerialno[20]=""; char physical_no[41]=""; char old_physical_no[41]=""; char deal_flag[1 + 1] = ""; int iSerialno=0; int card_id=0; int serial_type=0; int flag=0; double dSerialno=0; double dAmt=0; int cnt_purse_no = 0; int card_use_cnt=0; int seri_use_cnt=0; double seri_in_bala=0; double seri_out_bala=0; double seri_in_bala_next=0; double seri_out_bala_next=0; int amt_flag=0; char tx_date[11]=""; T_t_tif_tradeserial_his tradeserialhis; T_t_tif_tradeserial old_tradeserial; memset(&old_tradeserial,0,sizeof(old_tradeserial)); memset(&tradeserialhis,0,sizeof(tradeserialhis)); des2src(physical_no,rPack->sbank_acc); card_id=rPack->lvol0; card_use_cnt=rPack->lvol8; cnt_purse_no = rPack->lvol4; getsysdate(sysdate); getsystime(systime); deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_Y; ret=GetLogicDate(logicdate); //业务日期 if(ret) { free_lock_flag = 0; goto L_RETU_INNER; } //判断卡状态是否为写卡未成功状态 ret=DB_t_pif_card_read_by_card_id(card_id, tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) ret = E_CARDNO_NOT_EXIST; else ret = E_DB_CARD_R; free_lock_flag = 0; goto L_RETU_INNER; } if(STATE_FALSE==tCard->state_id[CARDSTAT_TYPE_WFAIL]) { ret = E_CARDSTATE_NOTWRITEFAIL; free_lock_flag = 0; goto L_RETU_INNER; } ret = DB_t_tif_writefailed_read_lock_by_c1_and_card_id_and_purese_no_and_deal_flag(tCard->card_id,cnt_purse_no,&deal_flag[0],tWriteFailed); if (ret) { if (DB_NOTFOUND == ret) // ret = E_DB_WRITEFAILED_N; ret = E_WRITEFAILED_DEAL_FLAG_N; // 没有查到, 就是已经写过了 else ret = E_DB_WRITEFAILED_R; goto L_RETU_INNER; } // writelog(LOG_ERR,"XXX"); iSerialno = tWriteFailed->serial_no; des2src(operate_date,tWriteFailed->tx_date); writelog(LOG_DEBUG,"Serialno[%d]",iSerialno); writelog(LOG_DEBUG,"operate_date[%s]",operate_date); writelog(LOG_DEBUG,"logictime[%s]",logicdate); ret=DB_t_tif_tradeserial_read_by_operate_date_and_serial_no_and_card_id(operate_date,iSerialno,card_id,&old_tradeserial); if(ret) { if(DB_NOTFOUND!=ret) { writelog(LOG_ERR,"operate_date[%s]serialno[%d]card_id[%d]",operate_date,iSerialno,card_id); ret = E_DB_TRADESERIAL_R; goto L_RETU_INNER; } else { // TODO: 需要在数据库上建立索引 ret=DB_t_tif_tradeserial_his_read_by_operate_date_and_serial_no_and_card_id(operate_date,iSerialno,card_id,&tradeserialhis); if(ret) { writelog(LOG_ERR,"operate_date[%s]serialno[%d]card_id[%d]",operate_date,iSerialno,card_id); if(DB_NOTFOUND==ret) ret = E_SERIALNO_NOT_EXIST; else ret = E_DB_TRADESERIAL_R; goto L_RETU_INNER; } if(card_id!=tradeserialhis.card_id) { writelog(LOG_ERR,"input card_id [%d],tradeserial card_id[%d]",card_id,tradeserialhis.card_id); ret = E_CARDNO_SERIAL_NE; goto L_RETU_INNER; } serial_type=tradeserialhis.serial_type; flag=TYPE_HIS; } } else { if(card_id!=old_tradeserial.card_id) { writelog(LOG_ERR,"input card_id [%d],tradeserial card_id[%d]",card_id,old_tradeserial.card_id); ret = E_CARDNO_SERIAL_NE; goto L_RETU_INNER; } serial_type=old_tradeserial.serial_type; flag=TYPE_CUR; } if(TYPE_CUR==flag) { seri_in_bala=old_tradeserial.in_balance; seri_out_bala=old_tradeserial.out_balance; strncpy(tx_date,old_tradeserial.operate_date,sizeof(tx_date)); dAmt=D4U5(old_tradeserial.out_balance-old_tradeserial.in_balance,2); //发生额=出卡值-入卡值 seri_use_cnt=old_tradeserial.trade_count; } else { seri_in_bala=tradeserialhis.in_balance; seri_out_bala=tradeserialhis.out_balance; strncpy(tx_date,tradeserialhis.operate_date,sizeof(tx_date)); dAmt=D4U5(tradeserialhis.out_balance-tradeserialhis.in_balance,2); //发生额=出卡值-入卡值 seri_use_cnt=tradeserialhis.trade_count; } des2src(old_physical_no,tCard->physical_no); trim(physical_no); trim(old_physical_no); switch(serial_type) { //发行正式卡 case 847101: //补办正式卡 case 847104: //发行过渡临时卡 case 847116: //发行非记名临时卡 case 847124: case 847125: case 847126: if(strcmp(old_physical_no,physical_no)!=0) { ret=IsExistCardByPhyCardNo(physical_no); if(ret) { goto L_RETU_INNER; } //修改卡标志,置为正常状态 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) ret = E_CARDNO_NOT_EXIST; else ret = E_DB_CARD_R; goto L_RETU_INNER; } ret = InsertToCutUpdList(tCard->card_id,CUTUPD_CH_OLDCARD,tCard->physical_no); if(ret) { DB_t_pif_card_free_lock_by_cur(); goto L_RETU_INNER; } des2src(tCard->physical_no,physical_no); //更换物理卡号 ret=DB_t_pif_card_update_lock_by_cur(tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) ret = E_CARDNO_NOT_EXIST; else ret = E_DB_CARD_U; goto L_RETU_INNER; } DB_t_pif_card_free_lock_by_cur(); ret = InsertToCutUpdList(tCard->card_id,CUTUPD_CH_NEWCARD,tCard->physical_no); if(ret) { goto L_RETU_INNER; } // 宏定义的判断, 0表示成功, 1表示不需要插入 /* if (0 == insert_chcard_blacklist(serial_type)) { ret = InsertToBlkList(tCard->card_id,CHCARD_BLACKLIST); if (ret) { goto L_RETU_INNER; } } */ // add by 汤成 2005-8-10 // 增加向名单表写入记录 /* switch(serial_type) { //补办正式卡 case 847104: //发行过渡临时卡 case 847116: // 记名临时卡 //case 847124: // VIP 卡 case 847126: ret = InsertToBlkList(tCard.card_id,CHCARD_BLACKLIST); if(ret) { goto L_RETU_INNER; } break; default: break; } */ } tradeserial->in_balance=0; //入卡值 des2src(tWriteFailed->comments, "补写卡成功"); break; //补写水控小钱包, 因小钱包扣款失败而起 //水控小钱包补写归类到847119中,不单独编写 case 847300: des2src(tWriteFailed->comments, "小钱包补写卡成功"); tradeserial->in_balance = rPack->damt1; writelog(LOG_ERR,"小钱包入卡值[%f]",tradeserial->in_balance); break; //补写水控大钱包, 因大钱包扣款失败而起 //水控制大钱包补写归类到847119中, 不单独编写 case 847301: des2src(tWriteFailed->comments, "大钱包补写卡成功"); tradeserial->in_balance = rPack->damt1; break; //银行转帐-Added by hhd at 20051225 //考虑到有可能圈存写卡成功,但是提示失败 //避免重复写卡 case 240001: //判断卡中交易次数是否等于发生错误的流水的交易次数 writelog(LOG_ERR,"card_use_cnt=[%d],seri_use_cnt=[%d]",card_use_cnt,seri_use_cnt); if((card_use_cnt+1)==seri_use_cnt) { //判断上传入卡值是否等于发生错误的流水的入卡值 if(amtcmp(rPack->damt1,seri_in_bala)==0) //入卡值等于入卡值,卡没有写上 tradeserial->in_balance=rPack->damt1; else if(amtcmp(rPack->damt1,seri_out_bala)==0) //入卡值等于出卡值,卡已经写上 { tradeserial->in_balance=rPack->damt1; amt_flag=1; } else { writelog(LOG_ERR,"In_balance abnormity,in_bala=[%f]",rPack->damt1); ret = E_ENTER_ACCOUNT; goto L_RETU_INNER; } } else if((card_use_cnt+1)>seri_use_cnt) { //当写卡不成功时,一般不会更新卡的交易次数, //导致下一次的交易次数还是等于失败流水的次数, //所以去下一条流水的时候,如果取不到,就+1 ret=Get_card_next_serial(tCard->card_id,tx_date,seri_use_cnt,&seri_in_bala_next,&seri_out_bala_next); if(ret) { if(DB_NOTFOUND==ret) { ret=Get_card_next_serial(tCard->card_id,tx_date,seri_use_cnt+1,&seri_in_bala_next,&seri_out_bala_next); if(ret) { writelog(LOG_ERR,"Get_card_next_serial(=) error,errcode=[%d]",ret); writelog(LOG_ERR,"没有找到下一笔流水"); goto L_RETU_INNER; } } else { writelog(LOG_ERR,"Get_card_next_serial(+1) error,errcode=[%d]",ret); goto L_RETU_INNER; } } writelog(LOG_INFO,"seri_in_bala_next=[%f],seri_in_bala=[%f],seri_out_bala=[%f]",seri_in_bala_next,seri_in_bala,seri_out_bala); if(amtcmp(seri_in_bala_next/100,seri_in_bala)==0) tradeserial->in_balance=rPack->damt1; else if(amtcmp(seri_in_bala_next/100,seri_out_bala)==0) { tradeserial->in_balance=rPack->damt1; amt_flag=1; } else { tradeserial->in_balance=rPack->damt1; writelog(LOG_ERR,"In_balance abnormity,in_bala=[%f]",rPack->damt1); ret = E_ENTER_ACCOUNT; goto L_RETU_INNER; } } else { writelog(LOG_ERR,"In_total_cnt abnormity,in_total_cnt=[%d]",card_use_cnt); ret = E_ENTER_ACCOUNT; goto L_RETU_INNER; } default: if(strcmp(old_physical_no,physical_no)!=0) { writelog(LOG_ERR,"db physical_no[%s],input physical_no[%s]",old_physical_no,physical_no); ret = E_CARD_PHYNO_DIFFER; goto L_RETU_INNER; } tradeserial->in_balance=rPack->damt1; //入卡值 break; } if(TYPE_CUR==flag) dAmt=D4U5(old_tradeserial.out_balance-old_tradeserial.in_balance,2); //发生额=出卡值-入卡值 else dAmt=D4U5(tradeserialhis.out_balance-tradeserialhis.in_balance,2); //发生额=出卡值-入卡值 //说明不需要写卡,则发生额置为0 if(amt_flag==1) { tradeserial->trade_fee=0; //补写卡值 } else { tradeserial->trade_fee=dAmt; //补写卡值 } tradeserial->out_balance=tradeserial->in_balance+dAmt; //出卡值 writelog(LOG_ERR,"小钱包出卡值[%f]",tradeserial->out_balance); writelog(LOG_ERR,"小钱包交易金额[%f]",dAmt); if(tradeserial->out_balance<0||tradeserial->out_balance>999) { writelog(LOG_ERR,"tradeserial.out_balance[%lf]",tradeserial->out_balance); ret = E_TX_SERIAL; goto L_RETU_INNER; } writelog(LOG_DEBUG,"写卡失败日期%s,补写流水号%d,交易码%d,卡号%d,补写金额%.2lf,入卡值%lf,出卡值%lf",operate_date,iSerialno,serial_type,card_id,dAmt,tradeserial->in_balance,tradeserial->out_balance); ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialno); //获得流水号 if(ret) { writelog(LOG_ERR,"ret [%d]",ret); goto L_RETU_INNER; } tradeserial->serial_no = D2I(dSerialno); //流水号 tradeserial->other_seri_no = 0; //上传端流水号 tradeserial->serial_type = TXCODE_REWRITE_CARD; //交易代码;备注:发卡+充值 用一个交易码,即847101; 发卡(不充值)另用一个交易码,即新的发卡程序文件名,从而区分发卡充值与发卡不充值的卡操作信息。 tradeserial->serial_state = SERISTAT_DEBT; //流水状态 des2src(tradeserial->operate_date,sysdate); //发生日期 des2src(tradeserial->operate_time,systime); //发生时间 des2src(tradeserial->collect_date,sysdate); //采集日期 des2src(tradeserial->collect_time,systime); //采集时间 des2src(tradeserial->enteract_date,logicdate); //处理日期 des2src(tradeserial->enteract_time,systime); //处理时间 des2src(tradeserial->oper_code , rPack->scust_limit); tradeserial->maindevice_id = rPack->lvol6; //上传工作站标识 tradeserial->device_id = rPack->lvol7; //采集设备标识 tradeserial->card_id = tCard->card_id; //卡号 des2src(tradeserial->showid,tCard->showid); //显示卡号 tradeserial->purse_id = cnt_purse_no; //钱包号,根据具体发现需要补写的钱包号决定 tradeserial->customer_id = tCard->cosumer_id; //客户标识 tradeserial->reviseserial_no = iSerialno; //原写卡失败流水号 tradeserial->trade_count = card_use_cnt + 1; //交易次数为卡交易次数+1 // 插入交易流水表 ret = DB_t_tif_tradeserial_add(tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) ret = E_DB_TRADESERIAL_E; else ret = E_DB_TRADESERIAL_I; goto L_RETU_INNER; } /******************************************************************/ //更新写卡失败表 tWriteFailed->deal_serial_no = tradeserial->serial_no; // writelog(LOG_ERR,"流水号[%d]",tWriteFailed->deal_serial_no); tWriteFailed->deal_bala = tradeserial->trade_fee; des2src(tWriteFailed->deal_date,sysdate); des2src(tWriteFailed->deal_time,systime); // tWriteFailed->deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_N; ret = DB_t_tif_writefailed_update_lock_by_c1(tWriteFailed); if (ret) { if (DB_NOTFOUND == ret) { ret = E_DB_WRITEFAILED_N; } else { ret = E_DB_WRITEFAILED_U; } goto L_RETU_INNER; } DB_t_tif_writefailed_free_lock_by_c1(); /******************************************************************/ return 0; L_RETU_INNER: if (free_lock_flag) DB_t_tif_writefailed_free_lock_by_c1(); return ret; }
static int do_froze_onecard(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret = 0; int card_id = 0; char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char oper[33+1] = ""; int cut_id = 0; int maindevice_id = 0; int device_id = 0; double dSerial_no = 0; char sCardState[5] = ""; T_t_tif_black_sheet black_sheet; T_t_tif_tradeserial tradeserial; T_t_tif_meslist tMesList; memset(&black_sheet,0,sizeof(black_sheet)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&tMesList,0,sizeof(tMesList)); getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { return ret; } // 准备输入信息 card_id = rPack->lvol1; //卡标识 cut_id = rPack->lvol0; //客户号 des2src(oper,rPack->scust_limit); //操作员号 maindevice_id = rPack->lvol6; //上传工作站标识 device_id = rPack->lvol7; //采集设备标识 // 检查客户信息,判断是否可以冻结 ret = GetCardState(card_id,sCardState); if (ret) { writelog(LOG_ERR,"card_id[%d]",sCardState); return ret; } if('2'==sCardState[CARDSTAT_TYPE_REG]) { ret = E_CARDNO_LOGOUT; return ret; } if(STATE_TRUE==sCardState[CARDSTAT_TYPE_FREEZE]) { ret = E_CARDNO_FREEZE; return ret; } // 修改卡状态为冻结 ret = UpdateCardState(card_id,CARDSTAT_TYPE_FREEZE,STATE_TRUE); if (ret) { writelog(LOG_ERR,"SQLCODE=[%d]",ret); return ret; } ret=InsertToBlkList(card_id,ADD_BLACKLIST); if (ret) { writelog(LOG_ERR,"InsertToBlkList err[%d]",ret); return ret; } //广播黑名单 AddXmlItemInt(tMesList.incontent, XML_KEY_CARDID,card_id); AddXmlItemInt(tMesList.incontent, XML_KEY_ADDDELSIGN,ADD_BLACKLIST); //增删标志 tMesList.funid = 930005; tMesList.level = 1; ret=AddMsgLst(&tMesList); if(ret) { writelog(LOG_ERR,"AddMsgLst err[%d]",ret); return ret; } // 准备数据插入交易流水表 ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerial_no); //获得最大流水号 if(ret) { writelog(LOG_ERR,"ERRCODE = [%d]",ret); return ret; } des2src(tradeserial.operate_date,sysdate); //发生日期 des2src(tradeserial.operate_time,systime); //发生时间 des2src(tradeserial.collect_date,sysdate); //采集日期 des2src(tradeserial.collect_time,systime); //采集时间 des2src(tradeserial.enteract_date,logicdate); //处理日期 des2src(tradeserial.enteract_time,systime); //处理时间 tradeserial.serial_no = D2I(dSerial_no); //流水号 tradeserial.serial_type = TXCODE_FREEZE_CARD; //挂失 tradeserial.serial_state = SERISTAT_NONEEDDEBT; //流水状态 tradeserial.maindevice_id = maindevice_id; //上传工作站标识 tradeserial.device_id = device_id; //采集设备标识 tradeserial.card_id = card_id; //交易卡号 tradeserial.customer_id=cut_id; //客户号 des2src(tradeserial.oper_code,oper); // 插入交易流水表 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; } return 0; }
static int AddCard(T_t_customer& tCustomer,T_t_card& tCard) { //检查卡是否已经使用 int ret=0; char sysdate[9]; getsysdate(sysdate); tCard.status[0]=STATUS_NORMAL; ret=DB_t_card_read_by_cardphyid_and_status(tCard.cardphyid,tCard.status,&tCard); if(ret!=DB_NOTFOUND) { if(DB_SUCCESS==ret) return E_CARDPHYID_EXIST; else return E_DB_CARD_R; } ret=DB_t_card_read_by_showcardno_and_status(tCard.showcardno,tCard.status,&tCard); if(ret!=DB_NOTFOUND) { if(DB_SUCCESS==ret) return E_SHOWCARDNO_EXIST; else return E_DB_CARD_R; } T_t_cardtype tCardtype; memset(&tCardtype,0,sizeof(tCardtype)); ret=DB_t_cardtype_read_by_cardtype(tCard.cardtype,&tCardtype); if(ret) { if(DB_NOTFOUND==ret) return E_DB_CARDTYPE_N; else return E_DB_CARDTYPE_R; } //判断到期日期 if(strlen(tCard.expiredate)<1) { ret=IsInvalidDateTime(tCustomer.outdate,"YYYYMMDD"); if(ret==0) { if(strncmp(tCustomer.outdate,sysdate,8)>0) { des2src(tCard.expiredate,tCustomer.outdate); } } else { if(tCardtype.validdays<1) return E_NOSET_CARDTYPE_VALIDDAYS; ret=calcEndDate(sysdate,tCardtype.validdays,tCard.expiredate); if(ret) return ret; } } else { ret=IsInvalidDateTime(tCard.expiredate,"YYYYMMDD"); if(ret) return E_INPUT_EXPIREDATE; if(strncmp(tCard.expiredate,sysdate,8)<0) return E_INPUT_EXPIREDATE; } tCard.custid=tCustomer.custid; des2src(tCard.stuempno,tCustomer.stuempno); memset(tCard.cardattr,'0',sizeof(tCard.cardattr)); des2src(tCard.opendate,sysdate); getfmtsysdatetime(tCard.lastsaved); ret = getNewUniqNo(KEYTYPE_CARDNO,&tCard.cardno); //获取最大卡号 if(ret) { return ret; } ret=DB_t_card_add(&tCard); if(ret) { if(DB_REPEAT==ret) return E_DB_CARD_E; else return E_DB_CARD_I; } return 0; }
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 F847116(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int hi_cutid = 0; //客户ID int hi_cuttype = 0; //客户类型 int i=0; int ret = 0; int len = 0; char h_showcardid[11] = ""; //显示卡号 char h_password[7] = ""; //卡密码 double h_temp_Card_id = 0; //卡号 char seed_key[17] = ""; //种子密钥 char card_endtime[27 + 1] = ""; //卡的有效截至日期 char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char sMsg[256]=""; char sMaxCardBalance[20]=""; double dMaxCardBalance=0; double h_temp_Serial_no = 0; T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; T_t_pif_card tCard; T_t_aif_account tAccount; T_t_tif_tradeserial tradeserial; InAcc IA; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL5, F_SCUST_NO, F_SCUST_NO2,F_SCUST_AUTH,F_SCUST_AUTH2, F_SDATE0,F_SNAME,F_SNAME2, F_SOPEN_EMP,F_SSTATUS0, F_DAMT2,F_DAMT3,F_LSERIAL1,F_VSMESS,0); memset(&IA,0,sizeof(IA)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tCard, 0, sizeof(tCard)); memset(&tAccount,0,sizeof(tAccount)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&tSpeFee,0,sizeof(tSpeFee)); #ifdef DEBUG writelog(LOG_DEBUG,"rPack->damt0[%lf]",rPack->damt0); writelog(LOG_DEBUG,"rPack->scust_auth2[%s]",rPack->scust_auth2); #endif hi_cutid = rPack->lvol0; //客户ID hi_cuttype = rPack->lvol3; //客户类别 tradeserial.trade_fee=rPack->damt0; //发生额 des2src(h_showcardid,rPack->scust_no); //显示卡号 getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } if(strlen(h_showcardid) > 0) { ret=IsExistShowCardNo(h_showcardid); if(ret) { *pRetCode = ret; goto L_RETU; } } // 检查客户信息,判断是否可以发行临时卡 ret = IsExistNoLostCardByCustomId(hi_cutid); if (ret) { writelog(LOG_ERR,"hi_cutid[%d]",hi_cutid); *pRetCode = ret; goto L_RETU; } des2src(tCard.physical_no, rPack->sbank_acc); //物理卡号 ret=IsExistCardByPhyCardNo(tCard.physical_no); //物理卡号 if(ret) { writelog(LOG_ERR,"physical_no[%s]",tCard.physical_no); *pRetCode = ret; goto L_RETU; } ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(hi_cutid, &tCustomer); if(ret) { writelog(LOG_ERR,"cut_id[%d]",hi_cutid); if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_R; goto L_RETU; } //得到收费类别 if(tCustomer.fee_type<1) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); *pRetCode=E_DB_SPEFEE_R; goto L_RETU; } } else { tCustomer.fee_type=tSpeFee.fee_type; } //更新客户表的收费类别字段 ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_U; goto L_RETU; } } DB_t_cif_customer_free_lock_cur(); //检查金额是否超过最大额度 ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance); if(ret) { *pRetCode=ret; goto L_RETU; } dMaxCardBalance=atof(sMaxCardBalance); if(amtcmp(tradeserial.trade_fee,dMaxCardBalance)>0) { writelog(LOG_ERR,"tradeserial.trade_fee[%lf]",tradeserial.trade_fee); *pRetCode=E_AMT_EXCEED_MAX; goto L_RETU; } // 准备数据插入卡信息表 memcpy(seed_key,STATIC_SEED_KEY,sizeof(seed_key)); //读种子密钥 // 默认密码, 初始取身份证的后6位, 没有身份证号用默认密码. trim(rPack->sname2); len=strlen(rPack->sname2) ; if (len >= 6) { strncpy(h_password,&(rPack->sname2[len-6]),6); if(h_password[5]>'9'||h_password[5]<'0') h_password[5]='0'; } else { strcpy(h_password,DEFAULT_CUST_PWD); } ret = getNewUniqNo(KEYTYPE_CARD_ID,&h_temp_Card_id); //获取最大卡号 if(ret) { *pRetCode = ret; writelog(LOG_ERR,"ret[%d]",ret); goto L_RETU; } tCard.card_id = D2I(h_temp_Card_id); //卡号 des2src(tCard.showid,h_showcardid); //显示卡号 des2src(tCard.is_main,TYPE_YES); //是否为主卡 des2src(tCard.state_id,CARDSTAT_REG); //卡状态 tCard.type_id = CT_TEMP; //卡类别 EncodePwd(seed_key,h_password,tCard.password,0); //卡密码 tCard.cosumer_id = hi_cutid; //客户标识 tCard.account_count = ACCOUNT_COUNT_ONE; //卡对应帐户个数 des2src(tCard.begin_time,logicdate); //注册时间 ret = GetTempCardValiddate(GLOBE_TMPCARDVALIDDATE,logicdate,card_endtime); //计算卡的有效期 if (ret) { *pRetCode = ret; goto L_RETU; } des2src(tCard.end_time, card_endtime); //截至时间 tCard.phytype = PHYTYPE_NO_ONE; //设备物理型号;默认为1 // 插入卡信息 ret = DB_t_pif_card_add(&tCard); if (ret) { if(DB_REPEAT==ret) *pRetCode = E_DB_CARD_E; else *pRetCode = E_DB_CARD_I; goto L_RETU; } ret = InsertToCutUpdList(tCard.card_id,CUTUPD_ADD,tCard.physical_no); if(ret) { *pRetCode = ret; goto L_RETU; } // 准备数据插入帐户信息表 ret = getNewActno(tAccount.account_id); //获得最大帐号 if (ret) { *pRetCode = ret; goto L_RETU; } des2src(tAccount.open_date,logicdate); //开户时间 des2src(tAccount.open_time,systime); tAccount.current_state = ACCOUNTSTAT_REGIST; //当前状态 tAccount.act_type = ACCTYPE_PERMAIN; //帐号类别 tAccount.customer_id = rPack->lvol0; //客户号 des2src(tAccount.cut_name,rPack->sname); //客户名称 tAccount.cut_type = hi_cuttype; //客户类别 des2src(tAccount.stuemp_no,rPack->scust_auth2); //客户学号或员工号 tAccount.card_id = (int)h_temp_Card_id; //关联卡号 tAccount.purse_id = PURSE_NO_ONE; //关联卡钱包号 tAccount.card_type = CT_TEMP; //卡类别 des2src(tAccount.subno,SUBJECT_INDIVIDUALSAVING); //所属科目 des2src(tAccount.isautotra,TYPE_NO); //是否自动转帐 // 插入帐户信息表 ret = DB_t_aif_account_add(&tAccount); if (ret) { if(DB_REPEAT==ret) *pRetCode = E_DB_ACCOUNT_E; else *pRetCode = E_DB_ACCOUNT_I; goto L_RETU; } // 准备数据插入交易流水表 ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&h_temp_Serial_no); //获得最大流水号 if(ret) { *pRetCode = ret; goto L_RETU; } tradeserial.serial_no = D2I(h_temp_Serial_no); //流水号 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type = TXCODE_TEMPCARD_OPEN; //交易代码 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 = tCard.card_id; //卡号 des2src(tradeserial.showid,tCard.showid); //显示卡号 tradeserial.purse_id = PURSE_NO_ONE; //钱包号 tradeserial.customer_id = rPack->lvol0; //客户标识 des2src(tradeserial.oper_code,rPack->scust_limit); //操作员代码 tradeserial.sys_id = 0; //外部系统标识 tradeserial.trade_count=1; //当前卡交易次数 des2src(IA.sArrInActno[0],tAccount.account_id); //帐户 IA.iCardNo=tCard.card_id; IA.iFeeType=tCustomer.fee_type; IA.dArrInAmt[0]=tradeserial.trade_fee; IA.iArrInFeeSwitch[0]=rPack->lvol0; IA.iArrInFeeSwitch[1]=rPack->lvol1; IA.iArrInFeeSwitch[2]=rPack->lvol2; IA.iArrInFeeSwitch[3]=rPack->lvol3; IA.iArrInFeeSwitch[4]=rPack->lvol4; IA.iArrInFeeSwitch[5]=rPack->lvol5; IA.iArrInFeeSwitch[6]=rPack->lvol6; IA.iArrInFeeSwitch[7]=rPack->lvol7; IA.iArrInFeeSwitch[8]=rPack->lvol8; IA.iArrInFeeSwitch[9]=rPack->lvol9; IA.iArrInFeeSwitch[10]=rPack->lvol10; // 调用入账子模块 ret=process(&IA,&tradeserial); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"process ret[%d]",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_TOLL_DEPOSIT_TRAD: 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_PRE_TOLL_BOARD_TRAD: case TXTYPE_TOLL_BOARD: case TXTYPE_DEDUCT_BOARD: case TXTYPE_RETURN_BOARD: case TXTYPE_RETURN_BOARD_BILL: case TXTYPE_RETURN_BOARD_FUNDBOOK: case TXTYPE_RETURN_BOARD_TRAD: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: case TXTYPE_TOLL_CHARGE_BILL: case TXTYPE_TOLL_CHARGE_FUNDBOOK: case TXTYPE_TOLL_CHARGE_TRAD: tradeserial.in_fee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CARDCOST: case TXTYPE_TOLL_CARDCOST_BILL: case TXTYPE_TOLL_CARDCOST_FUNDBOOK: case TXTYPE_TOLL_CARDCOST_TRAD: tradeserial.cost_fee=IA.dArrOutAmt[i]; break; default: break; } if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(out_pack->vsmess,sMsg); } } sprintf(sMsg,"卡当前余额:%.2lf元",tradeserial.out_balance); strcat(out_pack->vsmess,sMsg); writelog(LOG_DEBUG,out_pack->vsmess); // 插入交易流水表 ret = DB_t_tif_tradeserial_add(&tradeserial); if (ret) { 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->lvol0 = (int)h_temp_Card_id; //交易卡号 out_pack->lvol1 = tCustomer.cut_type; //客户类别 out_pack->lvol5 = tCustomer.fee_type; //收费类别 des2src(out_pack->scust_no,h_showcardid); //显示卡号 des2src(out_pack->scust_no2,tCustomer.classdept_no); //部门号 des2src(out_pack->scust_auth,tCustomer.stuemp_no); //学号 des2src(out_pack->scust_auth2,tCustomer.man_id); //身份证号 des2src(out_pack->sname,tCustomer.cut_name); //客户姓名 des2src(out_pack->sname2,tCustomer.lib_cardid); //图书证号 des2src(out_pack->sstatus0,tCustomer.sex); //性别 des2src(out_pack->sopen_emp,h_password); //卡密码 des2src(out_pack->sdate0,card_endtime); //有效截至日期 out_pack->damt2=tradeserial.out_balance; //出卡值 out_pack->damt3=tradeserial.boardfee; //搭伙费 out_pack->lserial1=tradeserial.serial_no; //流水号 // add by 汤成 2005-8-8 // 增加向名单表写入记录 /* ret = InsertToBlkList((int)h_temp_Card_id,CHCARD_BLACKLIST); if(ret) { *pRetCode = ret; goto L_RETU; } */ PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F847222(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; char ia_buf[1024]=""; char sMsg[256]=""; double dUniNo; InAcc IA; T_t_tif_tradeserial serial; T_t_aif_account account; T_t_cif_shop shop; trade_param_t param; int shop_id; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); int i; ResetNormalCPack(&aPack,0,1); shop_id = atoi(rPack->sbank_acc); if(shop_id <= 0) { *pRetCode = E_SHOP_ACTNO_NOT_EXIST; goto L_RETU; } 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(&account,0,sizeof account); memset(&shop,0,sizeof shop); ret = DB_t_cif_shop_read_by_shop_id(shop_id,&shop); if(ret) { if(DB_NOTFOUND == ret) *pRetCode = E_SHOP_ACTNO_NOT_EXIST; else *pRetCode = E_DB_SHOP_R; goto L_RETU; } if(strcmp(shop.is_indep, TYPE_YES)) { *pRetCode = E_FAN_SHOP_NOT_INDEP; goto L_RETU; } memset(&IA,0,sizeof IA); memset(¶m,0,sizeof param); param.pIA = &IA; IA.pVoidPointer = ia_buf; param.shop_id = shop.shop_id; param.remain_balance = rPack->damt1; ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniNo); if(ret) { *pRetCode = ret; goto L_RETU; } param.serial_no = D2I(dUniNo); //初始化流水记录 memset(&serial,0,sizeof serial); serial.serial_no = param.serial_no; serial.serial_state = SERISTAT_DEBT; serial.serial_type = TXCODE_FAN_BALANCE; // 借用显示卡号字段保存商户号 sprintf(serial.showid,"%d",param.shop_id); 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.oper_code,rPack->scard0); des2src(serial.reserve_1,rPack->scert_addr); serial.in_balance = param.remain_balance; serial.trade_fee = param.remain_balance; des2src(param.tx_date,serial.operate_date); des2src(param.tx_time,serial.operate_time); des2src(param.oper_code,rPack->scard0); ret = do_parse_shop(¶m); if(ret) { writelog(LOG_ERR,"商户解款失败shop[%d] ret [%d]",param.shop_id,ret); *pRetCode = ret; goto L_RETU; } SetCol(handle,0); SetCol(handle,F_VSMESS,F_LVOL1,F_DAMT1,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 = IA.iSerialNo; out_pack->damt1 = param.free_balance; //strcat(out_pack->vsmess,IA.pVoidPointer); writelog(LOG_DEBUG,out_pack->vsmess); //保存流水 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 F843335(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int dept_id=0; //父商户标识 int ret=0; int len=0; double dUniqno=0; char logicdate[11]=""; char sysdate[11]=""; char systime[9]=""; char seed_key[17] = ""; //种子密钥 char pwd[17] = ""; //密码 ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); T_t_cif_shop tShop; T_t_cif_customer tCustomer; T_t_aif_account tAccount; T_t_tif_tradeserial tradeserial; memset(&tShop,0,sizeof(tShop)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tAccount,0,sizeof(tAccount)); memset(&tradeserial,0,sizeof(tradeserial)); ResetNormalCPack(&aPack,0,1); getsysdate(sysdate); getsystime(systime); dept_id=rPack->lvol1; //父商户ID if(dept_id<1) { *pRetCode= E_FAT_SHP_ID_NOT_EXIST; goto L_RETU; } ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode = ret; goto L_RETU; } //判断商户名称是否已经使 ret=IsExistSameShopName(rPack->scard1,0); if(ret) { *pRetCode= ret; goto L_RETU; } ret=DB_t_cif_shop_read_lock_by_cur1_and_shop_id(dept_id,&tShop); if(ret) { writelog(LOG_ERR,"dept_id[%d]",dept_id); if(DB_NOTFOUND==ret) *pRetCode= E_FAT_SHP_ID_NOT_EXIST; else *pRetCode= E_DB_SHOP_R; goto L_RETU; } if(strncmp(tShop.is_leaf,TYPE_YES,1)!=0) { DB_t_cif_shop_free_lock_cur1(); } else { //是叶结点,先判断有无设备 ret=IsExistDeviceByShopId(dept_id,logicdate); if(ret) { DB_t_cif_shop_free_lock_cur1(); *pRetCode= ret; goto L_RETU; } //更新叶子标志为非叶子 des2src(tShop.is_leaf,TYPE_NO); ret=DB_t_cif_shop_update_lock_by_cur1(&tShop); if(ret) { writelog(LOG_ERR,"dept_id[%d] ",dept_id); if(DB_NOTFOUND==ret) *pRetCode= E_FAT_SHP_ID_NOT_EXIST; else *pRetCode= E_DB_SHOP_U; goto L_RETU; } DB_t_cif_shop_free_lock_cur1(); //注销帐户 ret=DB_t_aif_account_read_lock_by_c5_and_customer_id_and_act_type(tShop .cut_id, ACCTYPE_SHOPMAIN, &tAccount); if(ret) { writelog(LOG_ERR,"shop.cut_id[%d]",tShop.cut_id); if(DB_NOTFOUND==ret) *pRetCode=E_ACTNO_NOT_EXIST; else *pRetCode=E_DB_ACCOUNT_R; goto L_RETU; } if(amtcmp(tAccount.cur_bala,0)>0) { DB_t_aif_account_free_lock_c5(); writelog(LOG_ERR,"account.cur_bala[%lf]",tAccount.cur_bala); *pRetCode=E_SHP_ACC_NO_RECKONING; goto L_RETU; } tAccount.current_state=ACCOUNTSTAT_LOGOUT; des2src(tAccount.close_date,logicdate); des2src(tAccount.close_time,systime); ret=DB_t_aif_account_update_lock_by_c5(&tAccount); if(ret) { if(DB_NOTFOUND==ret) *pRetCode=E_ACTNO_NOT_EXIST; else *pRetCode=E_DB_ACCOUNT_U; goto L_RETU; } DB_t_aif_account_free_lock_c5(); } //非叶子节点 if(strcmp(rPack->smarket_code2,TYPE_YES)!=0) { // 不能收取搭伙费 if(strcmp(rPack->smarket_code,TYPE_YES) == 0) { *pRetCode = E_SHOP_NOT_LEAF_GETFEE; goto L_RETU; } } memset(&tShop,0,sizeof(tShop)); //先增加客户 ret=getNewUniqNo(KEYTYPE_CUSTOMER, &dUniqno); if(ret) { writelog(LOG_ERR,"getNewUniqNo err[%d]",ret); *pRetCode=ret; goto L_RETU; } tCustomer.cut_id=D2I(dUniqno); tCustomer.cut_type=CUSTTYPE_SHOP; //客户类型-商户 tCustomer.cut_state=CUSTSTAT_REGIST; des2src(tCustomer.cut_name,rPack->scard1); //商户名称 tCustomer.area=rPack->lvol8; //区域 des2src(tCustomer.stuemp_no,rPack->scust_auth); //员工号 des2src(tCustomer.classdept_no,rPack->scust_no);//部门号 des2src(tCustomer.man,rPack->sname); //姓名 des2src(tCustomer.sex,rPack->sstatus0); //性别 tCustomer.nation=rPack->lvol4; //民族 des2src(tCustomer.man_id,rPack->sname2); //身份证号 des2src(tCustomer.tel,rPack->scust_auth2); //电话 des2src(tCustomer.address,rPack->scusttypes); //地址 des2src(tCustomer.reg_time,logicdate); //注册日期 des2src(tCustomer.can_time,rPack->sphone3); //预计注销日期 //des2src(tCustomer.comments,rPack->ssectypes); ret=DB_t_cif_customer_add(&tCustomer); if(ret) { *pRetCode=E_DB_CUSTOMER_I; goto L_RETU; } dUniqno=0; ret=getNewUniqNo(KEYTYPE_SHOP, &dUniqno); if(ret) { writelog(LOG_ERR,"getNewUniqNo err[%d]",ret); *pRetCode=ret; goto L_RETU; } tShop.shop_id=D2I(dUniqno); tShop.cut_id=tCustomer.cut_id; tShop.dept_id=dept_id; des2src(tShop.shop_name,tCustomer.cut_name); tShop.shop_type=rPack->lvol7; //商户类别 des2src(tShop.is_indep,rPack->smain_flag); //是否独立核算 des2src(tShop.is_leaf,rPack->smarket_code2); //是否是叶结点 tShop.shop_state=SHOPSTAT_REGIST; des2src(tShop.shop_manager,tCustomer.stuemp_no); //学号 des2src(tShop.man,tCustomer.man); //联系人姓名 des2src(tShop.sex,tCustomer.sex); //性别 tShop.nation=tCustomer.nation; //民族 des2src(tShop.man_id,tCustomer.man_id); //联系人身份证号 des2src(tShop.tel,tCustomer.tel); //电话 des2src(tShop.address,tCustomer.address); //地址 des2src(tShop.is_getfee,rPack->smarket_code); //是否收取管理费 des2src(tShop.b_act_id,rPack->sbank_acc); // 银行账号 des2src(tShop.b_act_name,rPack->sbankname); // 银行名称 tShop.ratio=rPack->damt0; //汇率 if(tShop.ratio>MAX_RATIO) { *pRetCode=E_FEERATIO_TOO_HIGH; goto L_RETU; } tShop.manager_type=rPack->lvol3; //管理费计算方式 tShop.duty_type=rPack->lvol2; //商户税费计算方式 des2src(tShop.reg_time,logicdate); //商户注册日期 des2src(tShop.comments,rPack->ssectypes); des2src(tShop.rakeoff_type,rPack->sstatus1); //佣金类型 tShop.rakeoff_ratio=rPack->damt1; //佣金费率 ret=DB_t_cif_shop_add(&tShop); if(ret) { *pRetCode=E_DB_SHOP_I; goto L_RETU; } //如果是叶结点则开帐号 if(strncmp(tShop.is_leaf,TYPE_YES,1)==0) { /* len=strlen(rPack->sserial0); if(len==0) { *pRetCode=E_PWD_NULL; goto L_RETU; } else if(len!=6) { *pRetCode=E_PWD_LEN; goto L_RETU; } */ memset(&tAccount,0,sizeof(tAccount)); ret = getNewActno(tAccount.account_id); //获得新帐号 if (ret) { *pRetCode = ret; goto L_RETU; } des2src(tAccount.open_date,logicdate); //开户日期 des2src(tAccount.open_time,systime); des2src(tAccount.cut_name,tCustomer.cut_name); //客户名称 tAccount.customer_id=tCustomer.cut_id; //客户号 tAccount.cut_type =tCustomer.cut_type; //客户类别 des2src(tAccount.stuemp_no,tCustomer.stuemp_no); //客户学号或员工号 tAccount.current_state = ACCOUNTSTAT_REGIST; //当前状态 tAccount.act_type = ACCTYPE_SHOPMAIN; //帐号类别 des2src(tAccount.subno,SUBJECT_SHOPSAVING); //所属科目 memcpy(seed_key,STATIC_SEED_KEY,sizeof(seed_key)); //读种子密钥 strcpy(pwd,"666666"); EncodePwd(seed_key,pwd,tAccount.password,0); //帐户密码 // 插入帐户信息表 ret = DB_t_aif_account_add(&tAccount); if (ret) { writelog(LOG_ERR,"tAccount.account_id[%s]",tAccount.account_id); if(DB_REPEAT==ret) *pRetCode = E_DB_ACCOUNT_E; else *pRetCode = E_DB_ACCOUNT_I; goto L_RETU; } dUniqno=0; ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniqno); //获得最大流水号 if(ret) { *pRetCode = ret; writelog(LOG_ERR,"ret [%d]",ret); goto L_RETU; } des2src(tradeserial.oper_code,rPack->scust_limit); //操作员号 tradeserial.maindevice_id=rPack->lvol10; //工作站 tradeserial.serial_no = D2I(dUniqno); //流水号 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type = TXCODE_SHOP_OPEN; //交易代码;备注:发卡+充值 用一个交易码,即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); //处理时间 tradeserial.maindevice_id = rPack->lvol6; //上传工作站标识 tradeserial.device_id = rPack->lvol7; //采集设备标识 tradeserial.customer_id=tAccount.customer_id; //客户号 // 插入交易流水表 ret = DB_t_tif_tradeserial_add(&tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) *pRetCode = E_DB_TRADESERIAL_E; else *pRetCode = E_DB_TRADESERIAL_I; goto L_RETU; } } SetCol(handle,0); SetCol(handle,F_LVOL5,0); out_pack->lvol5=tShop.shop_id; PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F847108(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; int card_id = 0; char logicdate[11]=""; double dUniqNo = 0; T_t_pif_card card; T_t_tif_writefailed tWriteFailed; memset(&card,0,sizeof(card)); memset(&tWriteFailed, 0, sizeof tWriteFailed); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } //修改原卡状态为发卡写卡失败状态 card_id = in_pack->lvol0; if(in_pack->lvol0<1) { writelog(LOG_ERR,"card_id=[%d]",in_pack->lvol0); *pRetCode=E_INPUT_CARDNO; goto L_RETU; } if(in_pack->lserial1<1) { writelog(LOG_ERR,"serial_no=[%d]",in_pack->lserial1); *pRetCode= E_INPUT_SERIALNO; goto L_RETU; } ret = DB_t_tif_writefailed_read_by_card_id_and_serial_no_and_tx_date(card_id,in_pack->lserial1,logicdate,&tWriteFailed); if(ret) { if(ret != DB_NOTFOUND) return E_DB_WARRANT_R; } else return 0; //已经插入,直接返回 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } if (STATE_FALSE == card.state_id[CARDSTAT_TYPE_WFAIL]) { card.state_id[CARDSTAT_TYPE_WFAIL]=STATE_TRUE; } ret=DB_t_pif_card_update_lock_by_cur(&card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); //写入写卡失败表 ret = getNewUniqNo(KEYTYPE_WRITEFAILED, &dUniqNo); //获得写卡失败表最大ID号 if (ret) { writelog(LOG_ERR,"ret[%d]",ret); *pRetCode = ret; goto L_RETU; } tWriteFailed.id = D2I(dUniqNo); tWriteFailed.card_id = card_id; tWriteFailed.serial_no = in_pack->lserial1; // tWriteFailed.serial_type = TXCODE_WRITE_ERROR; tWriteFailed.serial_type = in_pack->lvol2; tWriteFailed.purese_no = PURSE_NO_ONE; tWriteFailed.deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_Y; des2src(tWriteFailed.tx_date,logicdate); des2src(tWriteFailed.comments, "发卡失败"); ret = DB_t_tif_writefailed_add(&tWriteFailed); if (ret) { *pRetCode = E_DB_WRITEFAILED_I; goto L_RETU; } /* memset(card.comments,0,sizeof(card.comments)); AddXmlItemStr(card.comments, XML_KEY_OPERATEDATE,logicdate); AddXmlItemInt(card.comments,XML_KEY_SERIALNO,in_pack->lserial1); AddXmlItemInt(card.comments,XML_KEY_TRADECODE,in_pack->lvol2); */ return 0; L_RETU: return -1; }
int F847104(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret =0; int len = 0; int i=0; int hi_cutid=0; char h_showcardid[11] = ""; //显示卡号 char h_password[7] = ""; //卡密码 double h_temp_Card_id = 0; //卡号 double dSerialNo=0; char seed_key[17] = ""; //种子密钥 char card_endtime[8 + 1] = ""; //卡的有效截至日期 char logicdate[11]=""; //业务日期 char sysdate[11]=""; char systime[9]=""; char sEndDate[9]=""; char sMsg[256]=""; char sMaxCardBalance[20]=""; char lost_date[11]=""; double dMaxCardBalance=0; int lost_card_id=0; T_t_pif_card tCard; T_t_pif_card tOldCard; T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; // T_t_pif_cardlossinfo tCardLossInfo; T_t_tif_tradeserial tradeserial; T_t_aif_account tAccount; InAcc IA; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL5, F_SCUST_NO, F_SCUST_NO2,F_SCUST_AUTH,F_SCUST_AUTH2, F_SDATE0,F_SNAME,F_SNAME2, F_SOPEN_EMP,F_SSTATUS0, F_DAMT2,F_LSERIAL1,F_VSMESS,0); memset(&tCard,0,sizeof(tCard)); memset(&tOldCard,0,sizeof(tOldCard)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tSpeFee,0,sizeof(tSpeFee)); // memset(&tCardLossInfo,0,sizeof(tCardLossInfo)); memset(&tAccount,0,sizeof(tAccount)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&IA,0,sizeof(IA)); getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } //检查客户信息,判断是否可以发行卡 hi_cutid=rPack->lvol0; //客户号 des2src(tCard.physical_no, rPack->sbank_acc); //物理卡号 trim(h_showcardid); ret=IsExistFreezeCardByCustomId(hi_cutid); if(ret) { *pRetCode = ret; goto L_RETU; } ret=IsExistNoLostCardByCustomId(hi_cutid); if(ret) { *pRetCode = ret; goto L_RETU; } if(strlen(h_showcardid)) { ret=IsExistShowCardNo(h_showcardid); if(ret) { *pRetCode = ret; goto L_RETU; } } ret=IsExistCardByPhyCardNo(tCard.physical_no); if(ret) { *pRetCode = ret; goto L_RETU; } ret=GetLostCardIdByCustomId_TypeId(hi_cutid,CT_NORMAL,&lost_card_id); if(ret) { writelog(LOG_ERR,"customer[%d]tCard type_id[%d]",hi_cutid,CT_NORMAL); *pRetCode = ret; goto L_RETU; } /* ret=DB_t_pif_cardlossinfo_read_by_card_id_and_state_id(lost_card_id, STATE_VALID, &tCardLossInfo); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } */ ret=get_latest_lost_date_by_card_no(lost_card_id,lost_date); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); *pRetCode =ret; goto L_RETU; } //先检查客户的挂失的正式卡是否到了补办日期 ret=GetLostCardValiddate(lost_date,sEndDate); if(ret) { *pRetCode =ret; goto L_RETU; } if(strncmp(sEndDate,sysdate,8)>0) { writelog(LOG_ERR,"lost_normal_card_id[%d]lost_date[%s]end_date[%s]",lost_card_id,lost_date,sEndDate); *pRetCode = E_NORMALCARD_NOT_REACH_ENDDATE; goto L_RETU; } /* //更新卡挂失日期表中该卡状态为无效 ret=UpdateCardLossInfoState(lost_card_id,STATE_VALID,STATE_INVALID); if(ret) { *pRetCode = ret; goto L_RETU; } */ //注销原卡 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(lost_card_id,&tOldCard); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } des2src(tOldCard.state_id,CARDSTAT_LOGOUT); //注销 des2src(tOldCard.end_time,sysdate); //注销日期 ret=DB_t_pif_card_update_lock_by_cur(&tOldCard); if(ret) { writelog(LOG_ERR,"lost_card_id[%d]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); ret = InsertToCutUpdList(tOldCard.card_id,CUTUPD_CH_OLDCARD,tOldCard.physical_no); if(ret) { *pRetCode = ret; goto L_RETU; } ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(hi_cutid, &tCustomer); if(ret) { writelog(LOG_ERR,"cut_id[%d]",hi_cutid); if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_R; goto L_RETU; } //得到收费类别 if(tCustomer.fee_type<1) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); *pRetCode=E_DB_SPEFEE_R; goto L_RETU; } } else { tCustomer.fee_type=tSpeFee.fee_type; } //更新客户表的收费类别字段 ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { if(DB_NOTFOUND==ret) *pRetCode= E_CUSTOMER_NOT_EXIST; else *pRetCode= E_DB_CUSTOMER_U; goto L_RETU; } } DB_t_cif_customer_free_lock_cur(); tradeserial.trade_fee =D4U5(rPack->damt0,2); // 准备数据插入卡信息表 memcpy(seed_key,STATIC_SEED_KEY,16); //读种子密钥 if(strlen(tCustomer.can_time)==8) { ret=IsInvalidDateTime(tCustomer.can_time,"YYYYMMDD"); if(ret) { *pRetCode=E_TB_CUSTOMER_ENDTIME; goto L_RETU; } if(strncmp(tCustomer.can_time,sysdate,8)<=0) { *pRetCode=E_TB_CUSTOMER_ENDTIME; goto L_RETU; } des2src(card_endtime,tCustomer.can_time); } else if(strlen(rPack->sdate0)==0) { *pRetCode=E_TB_CUSTOMER_NO_ENDTIME; goto L_RETU; } else { ret=IsInvalidDateTime(rPack->sdate0,"YYYYMMDD"); if(ret) { *pRetCode = E_INPUT_DATE; goto L_RETU; } if(strncmp(rPack->sdate0,sysdate,8)<=0) { *pRetCode=E_INPUT_DATE; goto L_RETU; } des2src(card_endtime,rPack->sdate0); } tradeserial.trade_fee = rPack->damt0; //金额 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_state = SERISTAT_DEBT; //流水状态 des2src(tradeserial.operate_date,sysdate); //发生日期 des2src(tradeserial.operate_time,systime); //发生时间 des2src(tradeserial.collect_date,sysdate); //采集日期 des2src(tradeserial.collect_time,systime); //采集时间 des2src(tradeserial.enteract_date,logicdate); //处理日期 des2src(tradeserial.enteract_time,systime); //处理时间 tradeserial.maindevice_id = rPack->lvol6; //上传工作站标识 tradeserial.device_id = rPack->lvol7; //采集设备标识 tradeserial.purse_id = PURSE_NO_ONE; //钱包号 tradeserial.customer_id = tCustomer.cut_id; //客户标识 tradeserial.sys_id = 0; //外部系统标识 des2src(tradeserial.oper_code, rPack->scust_limit); //操作员号 len=strlen(tCustomer.man_id) ; if (len >= 6) { strncpy(h_password,&(tCustomer.man_id[len-6]),6); if(h_password[5]>'9'||h_password[5]<'0') h_password[5]='0'; } else { strcpy(h_password,DEFAULT_CUST_PWD); } ret = getNewUniqNo(KEYTYPE_CARD_ID,&h_temp_Card_id); //获取最大卡号 if(ret) { *pRetCode = ret; goto L_RETU; } tCard.card_id = D2I(h_temp_Card_id); //卡号 des2src(tCard.showid,h_showcardid); //显示卡号 des2src(tCard.is_main,TYPE_YES); //是否为主卡 des2src(tCard.state_id,CARDSTAT_REG); //卡状态 tCard.type_id = CT_NORMAL; //卡类别 EncodePwd(seed_key,h_password,tCard.password,0); //卡密码 tCard.cosumer_id = hi_cutid; //客户标识 tCard.account_count = ACCOUNT_COUNT_ONE; //卡对应帐户个数 des2src(tCard.begin_time,sysdate); //注册时间 des2src(tCard.end_time, card_endtime); //截至时间 tCard.phytype = PHYTYPE_NO_ONE; //设备物理型号;默认为1 // 插入卡信息 ret = DB_t_pif_card_add(&tCard); if (ret) { if(DB_REPEAT==ret) *pRetCode = E_DB_CARD_E; else *pRetCode = E_DB_CARD_I; goto L_RETU; } ret = InsertToCutUpdList(tCard.card_id,CUTUPD_CH_NEWCARD,tCard.physical_no); if(ret) { *pRetCode = ret; goto L_RETU; } //修改帐户表中对应的卡号,类型,状态 ret=DB_t_aif_account_read_lock_by_c0_and_card_id_and_purse_id(lost_card_id,PURSE_NO_ONE,&tAccount); if (ret) { writelog(LOG_ERR,"normalcard_account_id[%s]",lost_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_ACTNO_NOT_EXIST; else *pRetCode = E_DB_ACCOUNT_R; } if(tAccount.current_state!=1) { *pRetCode=E_ACTNO_LOGOUT; goto L_RETU; } tAccount.card_id=tCard.card_id; tAccount.card_balance=tAccount.cur_freebala; //更新卡余额与库余额一致 tAccount.consume_count=0; ret=DB_t_aif_account_update_lock_by_c0(&tAccount); if (ret) { writelog(LOG_ERR,"DB_t_aif_account_update_lock_by_cur4 ret[%d]account_id[%s]",ret,tAccount.account_id); if(DB_NOTFOUND==ret) *pRetCode = E_ACTNO_EXIST; else *pRetCode = E_DB_ACCOUNT_U; } DB_t_aif_account_free_lock_c0(); ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo); //获得最大流水号 if(ret) { *pRetCode=ret; goto L_RETU; } tradeserial.serial_no=D2I(dSerialNo); tradeserial.serial_type=TXCODE_CHANGE_CARD; tradeserial.card_id=tCard.card_id; //新卡号 des2src(tradeserial.showid,tCard.showid); //显示卡号 strcpy(IA.sArrInActno[0],tAccount.account_id); //账号 IA.dArrInAmt[0]=tradeserial.trade_fee; //交易金额 IA.iUseCardFlag=USE_CARD_TYPE_ONLINE; //联机交易 IA.dInCardBala=tAccount.cur_freebala; //入卡值 IA.iTxCnt=1; IA.iCardNo=tCard.card_id; IA.iFeeType=tCustomer.fee_type; IA.iArrInFeeSwitch[0]=rPack->lvol0; IA.iArrInFeeSwitch[1]=rPack->lvol1; IA.iArrInFeeSwitch[2]=rPack->lvol2; IA.iArrInFeeSwitch[3]=rPack->lvol3; IA.iArrInFeeSwitch[4]=rPack->lvol4; IA.iArrInFeeSwitch[5]=rPack->lvol5; IA.iArrInFeeSwitch[6]=rPack->lvol6; IA.iArrInFeeSwitch[7]=rPack->lvol7; IA.iArrInFeeSwitch[8]=rPack->lvol8; IA.iArrInFeeSwitch[9]=rPack->lvol9; IA.iArrInFeeSwitch[10]=rPack->lvol10; ret=process(&IA,&tradeserial); if(ret) { writelog(LOG_ERR,"process ret[%d]",ret); *pRetCode=ret; goto L_RETU; } sprintf(out_pack->vsmess,"流水号:%d 卡号:%d ",IA.iSerialNo,IA.iCardNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { switch(IA.iArrOutTxType[i]) { case TXTYPE_TOLL_DEPOSIT: case TXTYPE_DEDUCT_DEPOSIT: case TXTYPE_RETURN_DEPOSIT: tradeserial.deposit_fee=IA.dArrOutAmt[i]; break; case TXTYPE_PRE_TOLL_BOARD: case TXTYPE_TOLL_BOARD: case TXTYPE_DEDUCT_BOARD: case TXTYPE_RETURN_BOARD: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: tradeserial.in_fee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CARDCOST: tradeserial.cost_fee=IA.dArrOutAmt[i]; break; default: break; } if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(out_pack->vsmess,sMsg); } } sprintf(sMsg,"卡当前余额:%.2lf元",tradeserial.out_balance); strcat(out_pack->vsmess,sMsg); writelog(LOG_DEBUG,out_pack->vsmess); ret = DB_t_tif_tradeserial_add(&tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) *pRetCode = E_DB_TRADESERIAL_E; else *pRetCode = E_DB_TRADESERIAL_I; goto L_RETU; } if(amtcmp(tradeserial.out_balance,0)<0) { *pRetCode=E_ENTER_ACCOUNT; goto L_RETU; } //检查金额是否超过最大额度 ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance); if(ret) { *pRetCode=ret; goto L_RETU; } dMaxCardBalance=atof(sMaxCardBalance); if(amtcmp(tradeserial.out_balance,dMaxCardBalance)>0) { writelog(LOG_ERR,"tradeserial.out_balance[%lf]",tradeserial.out_balance); *pRetCode=E_AMT_EXCEED_MAX; goto L_RETU; } //返回卡号\密码\显示卡号\客户类型\图书证号\有效截至日期 out_pack->lvol0 = (int)h_temp_Card_id; //交易卡号 out_pack->lvol1 = tCustomer.cut_type; //客户类别 out_pack->lvol5 = tCustomer.fee_type; //收费类别 des2src(out_pack->scust_no,h_showcardid); //显示卡号 des2src(out_pack->scust_no2,tCustomer.classdept_no); //部门号 des2src(out_pack->scust_auth,tCustomer.stuemp_no); //学号 des2src(out_pack->scust_auth2,tCustomer.man_id); //身份证号 des2src(out_pack->sname,tCustomer.cut_name); //客户姓名 des2src(out_pack->sname2,tCustomer.lib_cardid); //图书证号 des2src(out_pack->sstatus0,tCustomer.sex); //性别 des2src(out_pack->sopen_emp,h_password); //卡密码 des2src(out_pack->sdate0,card_endtime); //有效截至日期 out_pack->damt2=tradeserial.out_balance; //出卡值 out_pack->lserial1=tradeserial.serial_no; //流水号 // add by 汤成 2005-8-8 // 增加向名单表写入记录 /* ret = InsertToBlkList((int)h_temp_Card_id,CHCARD_BLACKLIST); if(ret) { *pRetCode = ret; goto L_RETU; } */ PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int 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; }
int F846335(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; char logicdate[9]=""; char sysdate[9]=""; char systime[7]=""; char accno[21]=""; char stoppayflag[2]=""; ST_CPACK aPack; ST_PACK *outPack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); des2src(stoppayflag,rPack->sstatus1); //指付/解付状态 des2src(accno,rPack->sbank_acc); //账户 if(!strlen(accno)) return E_INPUTNULL_ACCNO; T_t_tif_tradeserial tradeserial; memset(&tradeserial,0,sizeof(tradeserial)); //取帐户信息 T_t_aif_account tAccount; memset(&tAccount,0,sizeof(tAccount)); ret=DB_t_aif_account_read_lock_by_cur_and_account_id(accno,&tAccount); if(ret) { if(DB_NOTFOUND==ret) return E_DB_ACCOUNT_N; else return E_DB_ACCOUNT_R; } if(tAccount.current_state!=ACCOUNTSTAT_REGIST) { DB_t_aif_account_free_lock_cur(); return E_EACCNO_LOGOUT; } if(stoppayflag[0]=='1') { if(tAccount.stoppayflag[0]=='1') { DB_t_aif_account_free_lock_cur(); return E_EACC_STOPPAY; } tradeserial.serial_type = TXCODE_EACC_STOPPAY; //止付 } else { if(tAccount.stoppayflag[0]=='0') { DB_t_aif_account_free_lock_cur(); return E_EACC_NO_STOPPAY; } tradeserial.serial_type = TXCODE_EACC_UNSTOPPAY; //解付 } tAccount.stoppayflag[0]=stoppayflag[0]; ret=DB_t_aif_account_update_lock_by_cur(&tAccount); if(ret) { if(DB_NOTFOUND==ret) return E_DB_ACCOUNT_N; else return E_DB_ACCOUNT_U; } getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) return ret; double dUniqno= 0; ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniqno); //获得最大流水号 if(ret) { writelog(LOG_ERR,"ERRCODE = [%d]",ret); return ret; } des2src(tradeserial.operate_date,sysdate); //发生日期 des2src(tradeserial.operate_time,systime); //发生时间 des2src(tradeserial.collect_date,sysdate); //采集日期 des2src(tradeserial.collect_time,systime); //采集时间 des2src(tradeserial.enteract_date,logicdate); //处理日期 des2src(tradeserial.enteract_time,systime); //处理时间 tradeserial.serial_no = D2I(dUniqno); //流水号 tradeserial.serial_state = SERISTAT_NONEEDDEBT; //流水状态 tradeserial.card_id = tAccount.card_id; //交易卡号 tradeserial.customer_id=tAccount.customer_id; //客户号 des2src(tradeserial.oper_code,rPack->semp); //操作员 ret = DB_t_tif_tradeserial_add(&tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) return E_DB_TRADESERIAL_E; else return E_DB_TRADESERIAL_I; } SetCol(handle,F_LSERIAL1,F_VSMESS,0); outPack->lserial1=tradeserial.serial_no; strcpy(outPack->vsmess,"交易成功"); PutRow(handle,outPack,pRetCode,szMsg); return 0; }
int F240157(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]=""; InAcc IA; double dUniqno = 0; int card_id=0; int iSerialno=0; char physical_no[41]=""; char sMaxCardBalance[20]=""; char sMsg[256]=""; double dMaxCardBalance=0; T_t_pif_card tCard; T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; T_t_aif_account tAccount; //帐户表 T_t_tif_tradeserial tradeserial; T_t_tif_diff_transfer tDiffTransfer; T_t_tif_report_trans_comp rpttrans_comp; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); memset(&tCard,0,sizeof(tCard)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tSpeFee,0,sizeof(tSpeFee)); memset(&tAccount,0,sizeof(tAccount)); memset(&tDiffTransfer,0,sizeof(tDiffTransfer)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&IA,0,sizeof(IA)); ResetNormalCPack(&aPack,0,1); if(amtcmp(rPack->damt1,0)==0) { *pRetCode=E_INPUT_AMT; goto L_RETU; } 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; } card_id=rPack->lvol0; des2src(physical_no, rPack->sbank_acc); //物理卡号 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) { 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('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(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_LOST]) *pRetCode=E_CARDNO_LOST; else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_FREEZE]) *pRetCode=E_CARDNO_FREEZE; else if(STATE_TRUE==tCard.state_id[CARDSTAT_TYPE_WFAIL]) *pRetCode=E_CARDNO_WFAIL; goto L_RETU; } trim(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; } iSerialno=rPack->lserial0; ret=DB_t_tif_diff_transfer_read_lock_by_c0_and_op_date_and_local_sn(rPack->sdate0,iSerialno,&tDiffTransfer); if(ret) { writelog(LOG_ERR,"operater_date[%s]Serialno[%d]",rPack->sdate0,iSerialno); if(DB_NOTFOUND==ret) *pRetCode=E_SERIALNO_NOT_EXIST; else *pRetCode=E_DB_TRADESERIAL_R; goto L_RETU; } if(card_id!=tDiffTransfer.card_id) { writelog(LOG_ERR,"input card_id [%d],DiffTransfer card_id[%d]",card_id,tDiffTransfer.card_id); DB_t_tif_diff_transfer_free_lock_by_c0(); *pRetCode=E_CARDNO_SERIAL_NE; goto L_RETU; } if(SERISTAT_NODEBT!=tDiffTransfer.status) { DB_t_tif_diff_transfer_free_lock_by_c0(); *pRetCode=E_TX_SERIAL_CANNOT_CZ; goto L_RETU; } if(amtcmp(tDiffTransfer.diff_amt,rPack->damt1)!=0) { DB_t_tif_diff_transfer_free_lock_by_c0(); *pRetCode=E_INPUT_AMT; goto L_RETU; } tDiffTransfer.status=SERISTAT_DEBT; ret=DB_t_tif_diff_transfer_update_lock_by_c0(&tDiffTransfer); if(ret) { *pRetCode=E_DB_DIFF_TRANSFER_U; goto L_RETU; } DB_t_tif_diff_transfer_free_lock_by_c0(); //根据卡号和钱包号得到消费者账号(借方) 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) *pRetCode=E_ACTNO_NOT_EXIST; else *pRetCode=E_DB_ACCOUNT_R; goto L_RETU; } ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance); if(ret) { *pRetCode=ret; goto L_RETU; } dMaxCardBalance=atof(sMaxCardBalance); tradeserial.trade_fee = rPack->damt1; //充值金额 if(amtcmp(tAccount.cur_bala+tradeserial.trade_fee,dMaxCardBalance)>0) { *pRetCode= E_AMT_EXCEED_MAX; goto L_RETU; } 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,&dUniqno); //获得最大流水号 if(ret) { *pRetCode = ret; writelog(LOG_ERR," ERRCODE = [%d]",ret); goto L_RETU; } tradeserial.serial_no = D2I(dUniqno); //流水号 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type = TXCODE_MAKEUPSERIAL; 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 =card_id; //卡号 tradeserial.purse_id = PURSE_NO_ONE; //钱包号 tradeserial.customer_id = tCard.cosumer_id; //客户标识 tradeserial.in_balance=rPack->damt0; //入卡值 tradeserial.trade_count=rPack->lvol1+1; //交易次数 des2src(tradeserial.oper_code,rPack->scust_limit); //操作员代码 tradeserial.sys_id = 0; //外部系统标识 des2src(IA.sArrInActno[0],tAccount.account_id); //帐户 IA.iCardNo=tCard.card_id; IA.iFeeType=tCustomer.fee_type; IA.dArrInAmt[0]=tradeserial.trade_fee; IA.iArrInFeeSwitch[0]=rPack->lvol0; IA.iArrInFeeSwitch[1]=rPack->lvol1; IA.iArrInFeeSwitch[2]=rPack->lvol2; IA.iArrInFeeSwitch[3]=rPack->lvol3; IA.iArrInFeeSwitch[4]=rPack->lvol4; IA.iArrInFeeSwitch[5]=rPack->lvol5; ret=process(&IA,&tradeserial); if(ret) { writelog(LOG_ERR,"process ret[%d]",ret); *pRetCode=ret; goto L_RETU; } sprintf(out_pack->vsmess,"流水号:%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: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: tradeserial.in_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); } } writelog(LOG_DEBUG,out_pack->vsmess); SetCol(handle,0); SetCol(handle,F_LSERIAL1,F_DAMT2,F_DAMT3,F_DAMT4,F_VSMESS,0); out_pack->lserial1=tradeserial.serial_no; //流水号 out_pack->damt2=tradeserial.trade_fee; //充值金额 out_pack->damt3=tradeserial.boardfee; //搭伙费 out_pack->damt4=tradeserial.out_balance; //出卡值 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; } memset(&rpttrans_comp,0,sizeof rpttrans_comp); /* ret = DB_t_tif_report_trans_comp_read_by_cmp_date(sysdate,&rpttrans_comp); if(ret) { if(DB_NOTFOUND != ret) { *pRetCode = E_DB_RPT_TRANS_COMP_R; goto L_RETU; } des2src(rpttrans_comp.cmp_date,sysdate); rpttrans_comp.localauto_num = 1; rpttrans_comp.localauto_amt = tradeserial.trade_fee; ret = DB_t_tif_report_trans_comp_add(&rpttrans_comp); if(ret) { *pRetCode = E_DB_RPT_TRANS_COMP_I; goto L_RETU; } } else { rpttrans_comp.localauto_num += 1; rpttrans_comp.localauto_amt += tradeserial.trade_fee; ret = DB_t_tif_report_trans_comp_update_by_cmp_date(sysdate,&rpttrans_comp); if(ret) { *pRetCode = E_DB_RPT_TRANS_COMP_U; goto L_RETU; } } */ ret = DB_t_tif_report_trans_comp_read_by_cmp_date(tDiffTransfer.op_date,&rpttrans_comp); if(ret) { *pRetCode = E_DB_RPT_TRANS_COMP_R; goto L_RETU; } rpttrans_comp.localauto_num += 1; rpttrans_comp.localauto_amt += tradeserial.trade_fee; ret = DB_t_tif_report_trans_comp_update_by_cmp_date(tDiffTransfer.op_date,&rpttrans_comp); if(ret) { *pRetCode = E_DB_RPT_TRANS_COMP_U; goto L_RETU; } PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F847304(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; T_t_pif_card tCard; T_t_tif_writefailed tWriteFailed; T_t_tif_tradeserial tTradeSerial; char logicdate[11] = ""; double dUniqNo = 0; memset(&tCard, 0, sizeof tCard); memset(&tWriteFailed, 0, sizeof tWriteFailed); memset(&tTradeSerial, 0, sizeof(tTradeSerial)); ret = DB_t_tif_tradeserial_read_by_serial_no(in_pack->lvol1, &tTradeSerial); //消费流水号 if (ret) { writelog(LOG_DEBUG,"输入号不存在消费流水号[%d]",in_pack->lvol1); if (DB_NOTFOUND == ret) { *pRetCode = E_DB_TRADESERIAL_N; } else { *pRetCode = E_DB_TRADESERIAL_R; } goto L_RETU; } ret = DB_t_pif_card_read_lock_by_cur_and_card_id(tTradeSerial.card_id, &tCard); if (ret) { if (DB_NOTFOUND == ret) { *pRetCode = E_DB_CARD_N; } else { *pRetCode = E_DB_CARD_R; } goto L_RETU; } ret = DB_t_tif_writefailed_read_by_card_id_and_serial_no(tCard.card_id, tTradeSerial.serial_no, &tWriteFailed); if (ret) { if (DB_NOTFOUND != ret) { *pRetCode = E_DB_WRITEFAILED_R; goto L_RETU; } } else { if (CARDWFAIL_PACKET_DEAL_FLAG_Y == tWriteFailed.deal_flag[0]) *pRetCode = E_WRITEFAILED_DEAL_FLAG_Y; else *pRetCode = E_WRITEFAILED_DEAL_FLAG_N; goto L_RETU; } ret = getNewUniqNo(KEYTYPE_WRITEFAILED, &dUniqNo); // 获得写卡失败表最大ID号 if (ret) { writelog(LOG_ERR,"ret[%d]",ret); *pRetCode = ret; DB_t_pif_card_free_lock_by_cur(); goto L_RETU; } GetLogicDate(logicdate); tWriteFailed.card_id = tCard.card_id; des2src(tWriteFailed.tx_date,logicdate); tWriteFailed.id = D2I(dUniqNo); tWriteFailed.serial_no = tTradeSerial.serial_no; tWriteFailed.serial_type = tTradeSerial.serial_type; tWriteFailed.purese_no = tTradeSerial.purse_id; tWriteFailed.deal_flag[0] = CARDWFAIL_PACKET_DEAL_FLAG_Y; tWriteFailed.deal_bala = tTradeSerial.trade_fee; // des2src(tWriteFailed.comments, "大钱包写卡失败"); des2src(tWriteFailed.comments, in_pack->vsmess); // 注释写卡失败原因 ret = DB_t_tif_writefailed_add(&tWriteFailed); if (ret) { *pRetCode = E_DB_WRITEFAILED_I; DB_t_pif_card_free_lock_by_cur(); goto L_RETU; } tCard.state_id[CARDSTAT_TYPE_WFAIL] = STATE_TRUE; ret = DB_t_pif_card_update_lock_by_cur(&tCard); if (ret) { *pRetCode = E_DB_CARD_U; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); return 0; L_RETU: return -1; }
static int process(ST_PACK *rPack,InAcc *IA,T_t_tif_tradeserial *p) { int ret =0; int *ptype=NULL; double dSerialNo=0; int upd_flag=0; T_t_aif_account tAccount; T_t_cif_customer tCustomer; T_t_pif_card tCard; T_t_pif_spefee tSpeFee; memset(&tCustomer,0,sizeof(tCustomer)); memset(&tAccount,0,sizeof(tAccount)); memset(&tCard,0,sizeof(tCard)); memset(&tSpeFee,0,sizeof(tSpeFee)); //注销原卡 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(p->card_id, &tCard); if(ret) { if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_R; } if(p->card_id!=tCard.card_id) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"card_id[%d] db card_id[%d]",p->card_id,tCard.card_id); return E_DB_CARD_R; } p->deposit_fee =tCard.deposit_fee; //押金 // tCard.deposit_fee=0; des2src(tCard.state_id,CARDSTAT_LOGOUT); //注销 des2src(tCard.end_time,p->operate_date); //注销日期 ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",tCard.card_id); return E_DB_CARD_U; } DB_t_pif_card_free_lock_by_cur(); //如果是非记名临时卡则注销客户 ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(tCard.cosumer_id,&tCustomer); if(ret) { writelog(LOG_ERR,"cosumer_id[%d]",tCard.cosumer_id); if(DB_NOTFOUND==ret) return E_CUSTOMER_NOT_EXIST; else return E_DB_CUSTOMER_R; } if(CT_TEMP_NONAME==tCard.type_id) { tCustomer.cut_state=CUSTSTAT_LOGOUT; //注销 upd_flag=1; } if(tCustomer.fee_type<1) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); return E_DB_SPEFEE_R; } } else { tCustomer.fee_type=tSpeFee.fee_type; } upd_flag=1; } if(upd_flag) { ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { writelog(LOG_ERR,"cosumer_id[%d]",tCard.cosumer_id); return E_DB_CUSTOMER_U; } } DB_t_cif_customer_free_lock_cur(); IA->iFeeType=tCustomer.fee_type; ret=DB_t_aif_account_read_by_card_id_and_purse_id(tCard.card_id,PURSE_NO_ONE, &tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,tCard.card_id); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } /*Changed by hhd at 2005-10-22 14:21 处理卡库不平的退卡问题,如果卡库不等,则判断卡余额 是否小于库余额,如果不是这程序退出,否则按照库余额 和卡余额的差值进行退卡。搭伙费按照差值进行计算的余 额进行退还,该账户不注销,等待未上传得流水 */ if(USE_CARD_TYPE_ONLINE==IA->iUseCardFlag) //有卡交易 { if(amtcmp(tAccount.cur_freebala,IA->dInCardBala)<0) { long long a1 = D4U5(tAccount.cur_freebala,2)*100; double d2 = IA->dInCardBala; long long a2 = D4U5(d2,2)*100; writelog(LOG_ERR,"cur bala[%lf]:[%ld], card bala [%lf]:[%ld]",tAccount.cur_freebala,a1,d2,a2); writelog(LOG_ERR,"card_id[%d] act_id[%s] cur_freebala[%lf],input card_balance[%lf]",tCard.card_id,tAccount.account_id,D4U5(tAccount.cur_freebala,2),IA->dInCardBala); return E_CARD_ACC_NO_EQ; } if(amtcmp(D4U5(tAccount.cur_freebala,2),IA->dInCardBala)>0) { writelog(LOG_ERR,"card_id[%d] act_id[%s] cur_freebala[%lf],input card_balance[%lf]",tCard.card_id,tAccount.account_id,tAccount.cur_freebala,IA->dInCardBala); //只修改发生额,搭伙费全退,流水入账模块进行处理吧 p->trade_fee = IA->dInCardBala; //可用余额//Changed by hhd at 2005-10-22 14:21 strcpy(p->reserve_2,"卡库不符|按卡余额退卡"); //p->boardfee = (D4U5(tAccount.cur_freebala,2)-IA->dInCardBala); } else p->trade_fee = tAccount.cur_freebala; } else { p->trade_fee = tAccount.cur_freebala; //可用余额//Changed by hhd at 2005-10-22 14:21 } ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo); //获得最大流水号 if(ret) { return ret; } //把预提费用转为学校收益 p->serial_no=(int)dSerialNo; des2src(p->showid,tCard.showid); //显示卡号 p->in_fee = 0; //管理费/手续费 //p->trade_fee = tAccount.cur_freebala; //可用余额//Changed by hhd at 2005-10-22 14:21 p->boardfee = tAccount.cur_frozebala; //冻结金额//Changed by hhd at 2005-10-22 14:21 IA->iTradeNo=p->serial_type; //交易码 IA->iMainDevId=p->maindevice_id; //工作站标识 IA->iDevId=p->device_id; //设备ID IA->iSerialNo=p->serial_no; //流水号 des2src(IA->sTxDate,p->operate_date); //交易日期 des2src(IA->sTxTime,p->operate_time); //交易时间 des2src(IA->sTxCollectDate,p->collect_date); //采集日期 des2src(IA->sTxCollectTime,p->collect_time); //采集时间 des2src(IA->sTxAccDate,p->enteract_date); //记账日期 des2src(IA->sTxAccTime,p->enteract_time); //记账时间 des2src(IA->sMdeOper,p->oper_code); //操作员 strcpy(IA->sChkOper,p->reserve_1); //复核操作员 des2src(IA->sArrInActno[0],tAccount.account_id); //卡帐户 ptype=(int*)IA->pVoidPointer; switch(*ptype) { case TYPE_CASH: //现金 IA->iArrInFeeSwitch[1]=1; break; case TYPE_BILL: //支票 IA->iArrInFeeSwitch[2]=1; break; case TYPE_FUNDBOOK: //经费本 IA->iArrInFeeSwitch[3]=1; break; default: writelog(LOG_ERR,"type[%d]",*ptype); IA->iArrInFeeSwitch[1]=1; break; } IA->pVoidPointer=NULL; //是否退卡余额和搭伙费 if(IS_YES==rPack->lvol3) { IA->iArrInFeeSwitch[5]=1; } //是否退押金 if(IS_YES==rPack->lvol2) { IA->iArrInFeeSwitch[6]=1; } IA->dArrInAmt[0]=p->trade_fee; //卡余额 IA->dArrInAmt[1]=p->boardfee; //搭伙费 IA->dArrInAmt[2]=p->deposit_fee; //押金 ret=AccountProcess(IA); if(ret) { writelog(LOG_ERR,"AccountProcess ret[%d]",ret); return ret; } //注销帐户 memset(&tAccount,0,sizeof(tAccount)); ret=DB_t_aif_account_read_lock_by_cur_and_account_id(IA->sArrInActno[0],&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_lock_by_cur_and_account_id ret[%d]account_id[%s]",ret,IA->sArrInActno[0]); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } //Changed by hhd at 2005-10-22 14:21 //修改账户状态时,这些账户置为4临时状态 //等待未上传流水回传入账 if(strcmp(p->reserve_2,"卡库不符|按卡余额退卡")==0) { tAccount.current_state= ACCOUNTSTAT_TEMP; //临时状态 } else { tAccount.current_state= ACCOUNTSTAT_LOGOUT; //注销 } des2src(tAccount.close_date,p->operate_date); //销户日期 des2src(tAccount.close_time,p->operate_time); //销户时间 ret=DB_t_aif_account_update_lock_by_cur(&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_update_lock_by_cur ret[%d]account_id[%s]",ret,tAccount.account_id); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_U; } DB_t_aif_account_free_lock_cur(); writelog(LOG_ERR,"out_balance= [%f]",IA->dOutCardBala); if(amtcmp(IA->dOutCardBala,0)>0) { return E_ENTER_ACCOUNT; } p->out_balance=0; //出卡值 ret = process_change_card(&tCustomer,&tCard); return ret; }
int F847132(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; int i=0; int iTotalCnt=0; double dTotalAmt=0.0; double dSerialNo = 0; char logicdate[11]=""; //业务日期 char sysdate[11]=""; char systime[9]=""; char sMsg[256]=""; T_t_tif_tradeserial tradeserial; T_t_tif_savdtl tSavdtl; T_t_tif_subsidy tSubsidy; InAcc IA; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); T_t_tif_meslist tMesList; T_t_pif_device t_device; T_t_pif_syskey tSyskey; memset(&t_device,0,sizeof t_device); memset(&tMesList,0,sizeof tMesList); memset(&tSavdtl,0,sizeof(tSavdtl)); memset(&tSubsidy,0,sizeof(tSubsidy)); memset(&tSyskey,0,sizeof tSyskey); memset(&tradeserial,0,sizeof(tradeserial)); memset(&IA,0,sizeof(IA)); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_VSMESS,0); getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } if(strlen(rPack->scust_limit)<1) { *pRetCode=E_INPUT_BATCH_NO; goto L_RETU; } if(strlen(rPack->scust_no)<1) { *pRetCode=E_INPUT_OPER_NULL; goto L_RETU; } //允许补助负金额 if(amtcmp(rPack->damt0,0)==0) { *pRetCode=E_INPUT_AMT; goto L_RETU; } des2src(tSubsidy.summary,rPack->semail); //补助摘要 if(strlen(rPack->semail)<1) { *pRetCode=E_INPUT_SUMMARY; goto L_RETU; } des2src(tSubsidy.batch_no,rPack->scust_limit); tSubsidy.bill_type=rPack->lvol2; //票据类型 des2src(tSubsidy.bill_no,rPack->scust_auth2); //票据号码 tSubsidy.amount=rPack->damt0; //补助金额 des2src(tSubsidy.subsidytype,rPack->smain_flag);//补助标志(0增值1减值) des2src(tSubsidy.subsidytype,"1"); //补助标志(0增值1减值) des2src(tSubsidy.broker_id,rPack->sname); //经办人身份证号 des2src(tSubsidy.broker_name,rPack->semail2); //经办人姓名 IA.dArrInAmt[0]=tradeserial.trade_fee; switch(tSubsidy.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: *pRetCode=E_INPUT_DEPOSIT_TYPE; goto L_RETU; } /* ret=get_batch_no_by_subsidy_no(tSubsidy.subsidy_no,tSubsidy.batch_no); if(ret) { *pRetCode = E_DB_SUBSIDYTMP_R; goto L_RETU; } */ // 下发补助时才生成批次号 /* ret=judge_with_max_subsidy_no_within_new(tSubsidy.subsidy_no); if(ret) { *pRetCode = E_SUBSIDY_DOWN_ERROR; goto L_RETU; } */ ret=stat_subsidy_amount_by_batch_no(tSubsidy.batch_no, &iTotalCnt,&dTotalAmt); if(ret) { *pRetCode = ret; writelog(LOG_ERR,"ret[%d]",ret); goto L_RETU; } if(iTotalCnt!=rPack->lvol3) { strcpy(szMsg,"补助人数与导入的数据不符"); *pRetCode=E_INPUT_DATA_INVAILD; goto L_RETU; } if(amtcmp(dTotalAmt,rPack->damt0)!=0) { strcpy(szMsg,"补助总金额与导入的补助数据不符"); *pRetCode=E_INPUT_DATA_INVAILD; goto L_RETU; } writelog(LOG_DEBUG,"download subsidy batch_no : %s",tSubsidy.batch_no); des2src(tSubsidy.tx_date,sysdate); des2src(tSubsidy.tx_time,systime); ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo); //获得最大流水号 if(ret) { *pRetCode = ret; writelog(LOG_ERR,"ret[%d]",ret); goto L_RETU; } tradeserial.serial_no = D2I(dSerialNo); //流水号 tradeserial.other_seri_no = 0; //上传端流水号 if(amtcmp(dTotalAmt,0.0)>0) tradeserial.serial_type = TXCODE_SET_SUBSIDY; else tradeserial.serial_type = TXCODE_DESUBSIDY_DOWN; 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; //采集设备标识 des2src(tradeserial.oper_code , rPack->scust_no); //操作员代码 tradeserial.sys_id = 0; //外部系统标识 // 设置发生金额 tradeserial.trade_fee = dTotalAmt; switch(tSubsidy.bill_type) { case TYPE_CASH: //现金 break; case TYPE_BILL: //支票 case TYPE_FUNDBOOK: //经费本 tSavdtl.amount=rPack->damt0; //发生额 if(amtcmp(tSavdtl.amount,0)==0) break; des2src(tSavdtl.bill_no,tSubsidy.bill_no); //票据号码 if(strlen(tSavdtl.bill_no)<1) { *pRetCode=E_INPUT_BILLNO; goto L_RETU; } tSavdtl.card_no=0; //卡号 des2src(tSavdtl.oper_no,rPack->scust_limit); //操作员 tSavdtl.seqno=tradeserial.serial_no; //流水号 des2src(tSavdtl.tx_date,sysdate); //发生日期 des2src(tSavdtl.tx_time,systime); //发生时间 tSavdtl.cnt=1; //票据数量 tSavdtl.bill_type=tSubsidy.bill_type; //票据类型 tSavdtl.tx_code=tradeserial.serial_type; //交易码 ret=DB_t_tif_savdtl_add(&tSavdtl); if(ret) { if(DB_REPEAT==ret) *pRetCode = E_DB_SAVDTL_E; else *pRetCode = E_DB_SAVDTL_I; goto L_RETU; } break; default: *pRetCode=E_INPUT_DEPOSIT_TYPE; goto L_RETU; } IA.iFeeType=1; //默认值 //支持负金额扣款 if(tradeserial.trade_fee<0) tradeserial.trade_fee=-tradeserial.trade_fee; 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,&tSubsidy); if(ret) { writelog(LOG_ERR,"process ret[%d]",ret); *pRetCode=ret; goto L_RETU; } sprintf(out_pack->vsmess,"流水号:%d ",IA.iSerialNo); // writelog(LOG_DEBUG,"out tx type count %d",IA.iOutTxTypeCnt); /* 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); } } */ sprintf(sMsg,",共%d笔",iTotalCnt); strcat(out_pack->vsmess,sMsg); // 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; } // 广播下载补助名单任务 memset(&tMesList,0,sizeof tMesList); tMesList.funid=930077; tMesList.level = MESLIST_PRIORITY_REALTIME; tMesList.msgtype = MESLIST_TYPE_NORMAL; tMesList.max_send_cnt = 5; ret=AddMsgLst(&tMesList); if(ret) { *pRetCode=E_DB_MESLIST_I; writelog(LOG_ERR,"AddMsgLst err[%d]",ret); return ret; } // 锁住批次号 ret = DB_t_pif_syskey_read_lock_by_cur_and_key_code(KEYTYPE_TIF_SUBSIDY_NO,&tSyskey); if(ret) { if(DB_NOTFOUND == ret) *pRetCode = E_DB_SYSKEY_N; else *pRetCode = E_DB_SYSKEY_R; goto L_RETU; } ret = calc_import_max_subsidy_no(tSubsidy.batch_no,tSubsidy.oper_code,&tSubsidy.subsidy_no); if(ret) { DB_t_tif_subsidy_close_select_by_c4(); return ret; } writelog(LOG_DEBUG,"download subsidy no[%d]",tSubsidy.subsidy_no); ret=update_subsidy_info_by_batch_no(&tSubsidy); if(ret) { *pRetCode = ret; DB_t_pif_syskey_free_lock_cur(); writelog(LOG_ERR,"ret[%d]",ret); goto L_RETU; } // 释放批次号 DB_t_pif_syskey_free_lock_cur(); PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }