/* * fd references a file which has been authorized & checked for relocations. * send back the headers & its contents. * includes checks for conditional requests & ranges. */ int sendfd(HConnect *c, int fd, Dir *dir, HContent *type, HContent *enc) { Qid qid; HRange *r; HContents conts; Hio *hout; char *boundary, etag[32]; long mtime; ulong tr; int n, nw, multir, ok; vlong wrote, length; hout = &c->hout; length = dir->length; mtime = dir->mtime; qid = dir->qid; free(dir); /* * figure out the type of file and send headers */ n = -1; r = nil; multir = 0; boundary = nil; if(c->req.vermaj){ if(type == nil && enc == nil){ conts = uriclass(c, c->req.uri); type = conts.type; enc = conts.encoding; if(type == nil && enc == nil){ n = read(fd, c->xferbuf, HBufSize-1); if(n > 0){ c->xferbuf[n] = '\0'; conts = dataclass(c, c->xferbuf, n); type = conts.type; enc = conts.encoding; } } } if(type == nil) type = hmkcontent(c, "application", "octet-stream", nil); snprint(etag, sizeof(etag), "\"%lluxv%lux\"", qid.path, qid.vers); ok = checkreq(c, type, enc, mtime, etag); if(ok <= 0){ close(fd); return ok; } /* * check for if-range requests */ if(c->head.range == nil || c->head.ifrangeetag != nil && !etagmatch(1, c->head.ifrangeetag, etag) || c->head.ifrangedate != 0 && c->head.ifrangedate != mtime){ c->head.range = nil; c->head.ifrangeetag = nil; c->head.ifrangedate = 0; } if(c->head.range != nil){ c->head.range = fixrange(c->head.range, length); if(c->head.range == nil){ if(c->head.ifrangeetag == nil && c->head.ifrangedate == 0){ hprint(hout, "%s 416 Request range not satisfiable\r\n", hversion); hprint(hout, "Date: %D\r\n", time(nil)); hprint(hout, "Server: Plan9\r\n"); hprint(hout, "Content-Range: bytes */%lld\r\n", length); hprint(hout, "Content-Length: %d\r\n", STRLEN(BADRANGE)); hprint(hout, "Content-Type: text/html\r\n"); if(c->head.closeit) hprint(hout, "Connection: close\r\n"); else if(!http11(c)) hprint(hout, "Connection: Keep-Alive\r\n"); hprint(hout, "\r\n"); if(strcmp(c->req.meth, "HEAD") != 0) hprint(hout, "%s", BADRANGE); hflush(hout); writelog(c, "Reply: 416 Request range not satisfiable\n"); close(fd); return 1; } c->head.ifrangeetag = nil; c->head.ifrangedate = 0; } } if(c->head.range == nil) hprint(hout, "%s 200 OK\r\n", hversion); else hprint(hout, "%s 206 Partial Content\r\n", hversion); hprint(hout, "Server: Plan9\r\n"); hprint(hout, "Date: %D\r\n", time(nil)); hprint(hout, "ETag: %s\r\n", etag); /* * can't send some entity headers if partially responding * to an if-range: etag request */ r = c->head.range; if(r == nil) hprint(hout, "Content-Length: %lld\r\n", length); else if(r->next == nil){ hprint(hout, "Content-Range: bytes %ld-%ld/%lld\r\n", r->start, r->stop, length); hprint(hout, "Content-Length: %ld\r\n", 1 + r->stop - r->start); }else{ multir = 1; boundary = hmkmimeboundary(c); hprint(hout, "Content-Type: multipart/byteranges; boundary=%s\r\n", boundary); } if(c->head.ifrangeetag == nil){ hprint(hout, "Last-Modified: %D\r\n", mtime); if(!multir) printtype(hout, type, enc); if(c->head.fresh_thresh) hintprint(c, hout, c->req.uri, c->head.fresh_thresh, c->head.fresh_have); } if(c->head.closeit) hprint(hout, "Connection: close\r\n"); else if(!http11(c)) hprint(hout, "Connection: Keep-Alive\r\n"); hprint(hout, "\r\n"); } if(strcmp(c->req.meth, "HEAD") == 0){ if(c->head.range == nil) writelog(c, "Reply: 200 file 0\n"); else writelog(c, "Reply: 206 file 0\n"); hflush(hout); close(fd); return 1; } /* * send the file if it's a normal file */ if(r == nil){ hflush(hout); wrote = 0; if(n > 0) wrote = write(hout->fd, c->xferbuf, n); if(n <= 0 || wrote == n){ while((n = read(fd, c->xferbuf, HBufSize)) > 0){ nw = write(hout->fd, c->xferbuf, n); if(nw != n){ if(nw > 0) wrote += nw; break; } wrote += nw; } } writelog(c, "Reply: 200 file %lld %lld\n", length, wrote); close(fd); if(length == wrote) return 1; return -1; } /* * for multipart/byterange messages, * it is not ok for the boundary string to appear within a message part. * however, it probably doesn't matter, since there are lengths for every part. */ wrote = 0; ok = 1; for(; r != nil; r = r->next){ if(multir){ hprint(hout, "\r\n--%s\r\n", boundary); printtype(hout, type, enc); hprint(hout, "Content-Range: bytes %ld-%ld/%lld\r\n", r->start, r->stop, length); hprint(hout, "Content-Length: %ld\r\n", 1 + r->stop - r->start); hprint(hout, "\r\n"); } hflush(hout); if(seek(fd, r->start, 0) != r->start){ ok = -1; break; } for(tr = 1 + r->stop - r->start; tr; tr -= n){ n = tr; if(n > HBufSize) n = HBufSize; if(read(fd, c->xferbuf, n) != n){ ok = -1; goto breakout; } nw = write(hout->fd, c->xferbuf, n); if(nw != n){ if(nw > 0) wrote += nw; ok = -1; goto breakout; } wrote += nw; } } breakout:; if(r == nil){ if(multir){ hprint(hout, "--%s--\r\n", boundary); hflush(hout); } writelog(c, "Reply: 206 partial content %lld %lld\n", length, wrote); }else writelog(c, "Reply: 206 partial content, early termination %lld %lld\n", length, wrote); close(fd); return ok; }
int F850001(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; CAccTrans& ats=CAccTrans::GetInst(); TRANS& trans=ats.trans; des2src(trans.refno,rPack->sphone3); if(strlen(trans.refno)!=14) { ERRTIP("交易参考号错误"); return E_COMMON_ERR; } T_t_refno tRefno; memset(&tRefno,0,sizeof(tRefno)); ret=DB_t_refno_read_by_refno(trans.refno,&tRefno); if(ret) { if(DB_NOTFOUND==ret) return 0; else return E_DB_REFNO_R; } if(strncmp(tRefno.mac,rPack->saddr,8)!=0) { ERRTIP("交易参考号MAC校验错误"); return E_COMMON_ERR; } if(RS_SUCC!=tRefno.status) { TIPINFO("交易已冲正"); return 0; } ats.trans.transcode=TC_TRANSREV; ats.trans.termid=tRefno.termid; ret=ats.InitTrans(); if(ret) return ret; des2src(ats.trans.chkopercode,rPack->semp_no); char authrightflag=rPack->sstatus2[0]; if('1'==authrightflag) { ret=chk_oper_pwd(ats.trans.chkopercode,rPack->scust_limit); if(ret) return ret; ret=AccTransRev(tRefno.accdate,tRefno.termid,tRefno.termseqno); if(ret) { writelog(LOG_ERR,"acctransrev err ret=%d",ret); return ret; } } else { ret=OnlineTransRev(tRefno.accdate,tRefno.termid,tRefno.termseqno); if(ret) { writelog(LOG_ERR,"acctransrev err ret=%d",ret); return ret; } } ST_CPACK aPack; ST_PACK *outPack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,F_LVOL0,F_SPHONE3,F_SADDR,F_LWITHDRAW_FLAG,F_SDATE3,F_STIME3,F_SEMP,F_LSERIAL1,F_VSMESS,0); outPack->lvol0=ats.trans.cardno; des2src(outPack->sdate3,ats.trans.accdate); des2src(outPack->stime3,ats.trans.acctime); des2src(outPack->semp,ats.trans.opercode); outPack->lserial1=ats.trans.termseqno; strcpy(outPack->sphone3,tRefno.refno); strcpy(outPack->saddr,tRefno.mac); strcpy(outPack->vsmess,ats.remark.c_str()); PutRow(handle,outPack,pRetCode,szMsg); return 0; }
int F930007(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; int cnt=0; int msgid=0; T_t_msglist tMsgList; T_t_device tDevice; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_VSVARSTR0,0); memset(&tMsgList,0,sizeof(tMsgList)); memset(&tDevice,0,sizeof(tDevice)); if(strlen(in_pack->sdate0)==0) { *pRetCode=E_DEVPHYID_NULL; goto L_RETU; } ret=get_devinfo_by_phyid(in_pack->sdate0,&tDevice); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"get_devinfo_by_phyid err[%d]",ret); goto L_RETU; } AddXmlItemInt(tMsgList.reqdata, XML_KEY_DEV999_NO, tDevice.deviceno); //机号 AddXmlItemStr(tMsgList.reqdata, XML_KEY_DEV999_ID, tDevice.devphyid); //注册号 AddXmlItemInt(tMsgList.reqdata, XML_KEY_BAUDRATE, tDevice.baudrate); //波特率 // AddXmlItemStr(tMsgList.reqdata, XML_KEY_SYSPWD, tDevice.syspwd); //系统员密码 // AddXmlItemStr(tMsgList.reqdata, XML_KEY_ADMPWD,tDevice.admpwd); //管理员密码 // AddXmlItemInt(tMsgList.reqdata, XML_KEY_PWDONOFF,tDevice.pwdonoff); //密码开关 AddXmlItemStr(tMsgList.reqdata, XML_KEY_CARDSTR, "100"); //卡片结构 // AddXmlItemInt(tMsgList.reqdata, XML_KEY_CARDUSENUM,tDevice.cardusenum); //卡的最大使用次数\允许最大消费次数 // AddXmlItemInt(tMsgList.reqdata, XML_KEY_MAXDEPOSIT, tDevice.maxdeposit); //钱包最高存款限额 // AddXmlItemInt(tMsgList.reqdata, XML_KEY_MINDEPOSIT, tDevice.mindeposit); //钱包最低剩余款限额 // AddXmlItemInt(tMsgList.reqdata, XML_KEY_RATION, tDevice.ration); //定值收费方式使用的定值额\定值金额 // AddXmlItemStr(tMsgList.reqdata, XML_KEY_PUSERNO, tDevice.puserno); //钱包代码\钱包号 // AddXmlItemInt(tMsgList.reqdata, XML_KEY_MAXTRADE, tDevice.maxtrade); //每次交易最高额\大额消费限额 AddXmlItemStr(tMsgList.reqdata, XML_KEY_VCARDSET, tDevice.cardset); //终端机适用用户卡类别 // AddXmlItemStr(tMsgList.reqdata, XML_KEY_FUNONOFF, tDevice.funonoff); //收费机增强功能开关 // AddXmlItemInt(tMsgList.reqdata, XML_KEY_FEETYPE, tDevice.feetype); //收费方式 tMsgList.deviceid = tDevice.deviceid; tMsgList.funcno = 930007; tMsgList.msglevel = 2; ret=AddMsgLst(&tMsgList); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"AddMsgLst err[%d]",ret); goto L_RETU; } if(iRequest!=tMsgList.funcno) return 0; ret=db_commit(); if(ret) { writelog(LOG_ERR,"db_commit ret[%d]",ret); *pRetCode=E_DB_COMMIT; goto L_RETU; } msgid=tMsgList.msgid; des2src(out_pack->sdate0,in_pack->sdate0); for(cnt=0; (cnt<10)&&(tMsgList.errcode!=0); cnt++) { sleep(1); memset(&tMsgList,0,sizeof(tMsgList)); ret=DB_t_msglist_read_by_msgid(msgid, &tMsgList); if(ret) { writelog(LOG_ERR,"DB_t_msglist_read_by_msgid err[%d]",ret); *pRetCode=E_DB_MSGLIST_R; goto L_RETU; } } switch(tMsgList.errcode) { case 0: //成功 des2src(out_pack->vsvarstr0,"成功"); break; case 9999: //交易未处理 des2src(out_pack->vsvarstr0,"前置机无应答"); break; default: //交易已经处理,但结果是失败 des2src(out_pack->vsvarstr0,tMsgList.errmsg); break; } PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
int F930006(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; double dMaxFeeRatio=0; // int iMaxFeeRatio=0; int iRow=0; T_t_tif_meslist tMesList; // T_t_cif_cuttypefee tCuttypefee; memset(&tMesList,0,sizeof(tMesList)); // memset(&tCuttypefee,0,sizeof(tCuttypefee)); des2src(tMesList.devphy999_id, in_pack->sdate0); trim(tMesList.devphy999_id); if(strlen(tMesList.devphy999_id)==0) { *pRetCode=E_DEVPHYID_NULL; goto L_RETU; } tMesList.funid = iRequest; tMesList.level = 1; /* ret=GetMaxFeeRatioFromShop(&dMaxFeeRatio); if(ret) { *pRetCode=ret; goto L_RETU; } iMaxFeeRatio=dMaxFeeRatio*100; ret=DB_t_cif_cuttypefee_open_select_by_c0(); if(ret) { *pRetCode=E_DB_CUTTYPEFEE_R; goto L_RETU; } while(1) { memset(&tCuttypefee,0,sizeof(tCuttypefee)); memset(&tMesList.incontent,0,sizeof(tMesList.incontent)); ret=DB_t_cif_cuttypefee_fetch_select_by_c0(&tCuttypefee); if(ret) { if(DB_NOTFOUND==ret) { if(iRow) break; else { *pRetCode= E_DB_CUTTYPEFEE_N; goto L_RETU; } } else { *pRetCode= E_DB_CUTTYPEFEE_R; goto L_RETU; } } iRow++; AddXmlItemInt(tMesList.incontent, XML_KEY_CARDTYPE,tCuttypefee.cut_type); //卡类型 if(strncmp(tCuttypefee.is_outfee,TYPE_YES,1)==0) AddXmlItemInt(tMesList.incontent, XML_KEY_FEE, iMaxFeeRatio); else AddXmlItemInt(tMesList.incontent, XML_KEY_FEE, 0); ret=AddMsgLst(&tMesList); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"AddMsgLst err[%d]",ret); goto L_RETU; } } */ AddXmlItemInt(tMesList.incontent, XML_KEY_CARDTYPE,in_pack->lvol5); //卡类型 AddXmlItemInt(tMesList.incontent, XML_KEY_FEE, in_pack->lvol6); //费率 ret=AddMsgLst(&tMesList); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"AddMsgLst err[%d]",ret); goto L_RETU; } return 0; L_RETU: return -1; }
int F930101(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret= 0; int dev_usage = 0; T_t_door_txdtl tTxdtl; if(strlen(rPack->sdate0) != 8) { *pRetCode = E_DEVPHYID_NULL; goto L_RETU; } /* ret=chk_dyn_key(rPack->lcert_code,rPack->scust_limit2); if(ret) { writelog(LOG_ERR,"subsys_id[%d]dyn_key[%s]",rPack->lcert_code,rPack->scust_limit2); *pRetCode = ret; goto L_RETU; } */ memset(&tTxdtl,0,sizeof(tTxdtl)); tTxdtl.serial_no= rPack->lvol3; //上传端流水号 tTxdtl.sys_id = rPack->lcert_code; //上传工作站标识(前置机注册号) tTxdtl.mode_code=rPack->lvol6; //模式代码 tTxdtl.card_no= rPack->lvol7; //交易卡号 tTxdtl.use_type= rPack->lvol8; //考勤类型 tTxdtl.inductor_no= rPack->lvol9; //感应头标记 tTxdtl.work_mark=rPack->lvol10; //上下班标志 tTxdtl.tx_mark=rPack->lvol11; //999交易标志 des2src(tTxdtl.device_id, rPack->sdate0); //物理设备ID des2src(tTxdtl.tx_date,rPack->sdate1); //发生日期(格式化输入的日期) des2src(tTxdtl.crc,rPack->sbank_code2); //CRC校验 des2src(tTxdtl.tx_time,rPack->spost_code2); //发生时间(格式化输入的时间) getsysdate(tTxdtl.col_date); getsystime(tTxdtl.col_time); ret=check(&tTxdtl); if(ret) { // tTxdtl.status[0]='5'; //无效交易 // tTxdtl.err_code=ret; writelog(LOG_DEBUG,"无效流水[%s][%d]",tTxdtl.device_id,tTxdtl.serial_no); return ret; } else tTxdtl.status[0]='1'; ret = GetDevUsageByDevId(tTxdtl.device_id,&dev_usage); if(ret) { *pRetCode = ret; goto L_RETU; } switch(dev_usage) { case DU_JSB_CONFRENCE: ret = SaveDoorJSBSerial(&tTxdtl); if(ret) { writelog(LOG_ERR,"保存计时宝流水失败,errcode[%d]",ret); break; } ret = UpdateConferSerial(&tTxdtl); break; case DU_JSB_ATTENDANCE: ret = InsertKQSerial(&tTxdtl); if(ret) { writelog(LOG_ERR,"插入考勤流水表失败,errcode[%d]",ret); break; } default: ret = SaveDoorJSBSerial(&tTxdtl); break; } if(ret) { *pRetCode = ret; goto L_RETU; } return 0; L_RETU: return -1; }
int F847105(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret =0; int i=0; int origin_card_id = 0; char physical_no[40+1] = ""; char logicdate[11] = ""; //业务日期 char sysdate[11]=""; char lost_date[11]=""; char systime[9]=""; char sEndDate[9]=""; char sMsg[256]=""; T_t_pif_card tCard; T_t_pif_cardlossinfo cardlossinfo; T_t_tif_tradeserial tradeserial; T_t_tif_savdtl tSavdtl; InAcc IA; memset(&tCard,0,sizeof(tCard)); memset(&cardlossinfo,0,sizeof(cardlossinfo)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&tSavdtl,0,sizeof(tSavdtl)); memset(&IA,0,sizeof(IA)); getsysdate(sysdate); getsystime(systime); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=ret; goto L_RETU; } origin_card_id = rPack->lvol1; //原卡号 des2src(physical_no, rPack->sbank_acc); //物理卡号 if(rPack->lvol1<1) { *pRetCode=E_INPUT_CARDNO_CANNOT_NULL; goto L_RETU; } //查询支票经费本有无充值记录 ret=ChkSavdtl(origin_card_id,&tSavdtl); if(ret) { writelog(LOG_ERR,"ChkSavdtl ret[%d]",ret); *pRetCode=ret; goto L_RETU; } tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type=TXCODE_CALLBACK_CARD; //功能号 tradeserial.serial_state = SERISTAT_DEBT; //流水状态 des2src(tradeserial.operate_date,sysdate); //发生日期 des2src(tradeserial.operate_time,systime); //发生时间 des2src(tradeserial.collect_date,sysdate); //采集日期 des2src(tradeserial.collect_time,systime); //采集时间 des2src(tradeserial.enteract_date,logicdate); //处理日期 des2src(tradeserial.enteract_time,systime); //处理时间 tradeserial.maindevice_id = rPack->lvol6; //上传工作站标识 tradeserial.device_id = rPack->lvol7; //采集设备标识 tradeserial.purse_id = PURSE_NO_ONE; //钱包号 tradeserial.sys_id = 0; //外部系统标识 des2src(tradeserial.oper_code, rPack->scust_limit); //操作员号 tradeserial.card_id=origin_card_id; ret=DB_t_pif_card_read_lock_by_cur_and_card_id(origin_card_id,&tCard); if(ret) { if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } // writelog(LOG_DEBUG,"input card_id[%d] card_id[%d]",origin_card_id,tCard.card_id); tradeserial.customer_id = tCard.cosumer_id; //客户标识 if(strncmp(tCard.state_id,CARDSTAT_REG,4)==0) { //检查物理卡号是否一致 trim(physical_no); trim(tCard.physical_no); if(strcmp(tCard.physical_no,physical_no)!=0) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"db physical_no[%s],input physical_no[%s]",tCard.physical_no,physical_no); *pRetCode= E_CARD_PHYNO_DIFFER; goto L_RETU; } } else if('2'==tCard.state_id[CARDSTAT_TYPE_REG]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode = E_CARDNO_LOGOUT; goto L_RETU; } else if('3'==tCard.state_id[CARDSTAT_TYPE_REG]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARD_CHANGE; goto L_RETU; } else if(tCard.state_id[CARDSTAT_TYPE_FREEZE]==STATE_TRUE) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDNO_FREEZE; goto L_RETU; } else if(tCard.state_id[CARDSTAT_TYPE_WFAIL]==STATE_TRUE) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDNO_WFAIL; goto L_RETU; } else if(tCard.state_id[CARDSTAT_TYPE_LOST]==STATE_TRUE) { if(IS_YES==rPack->lvol12) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_CARDNO_LOST; goto L_RETU; } /* ret=DB_t_pif_cardlossinfo_read_by_card_id_and_state_id(origin_card_id, STATE_VALID, &cardlossinfo); if(ret) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"lost_card_id[%d]",origin_card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } */ ret=get_latest_lost_date_by_card_no(origin_card_id,lost_date); if(ret) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"lost_card_id[%d]",origin_card_id); *pRetCode =ret; goto L_RETU; } //先检查客户的挂失的正式卡是否到了补办日期 ret=GetLostCardValiddate(lost_date,sEndDate); if(ret) { DB_t_pif_card_free_lock_by_cur(); *pRetCode =ret; goto L_RETU; } if(strncmp(sEndDate,sysdate,8)>0) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"lost_normal_card_id[%d]lost_date[%s]end_date[%s]",origin_card_id,lost_date,sEndDate); *pRetCode = E_NORMALCARD_NOT_REACH_ENDDATE; goto L_RETU; } /* //更新卡挂失日期表中该卡状态为无效 ret=UpdateCardLossInfoState(origin_card_id,STATE_VALID,STATE_INVALID); if(ret) { DB_t_pif_card_free_lock_by_cur(); *pRetCode =ret; goto L_RETU; } */ //正常情况下的押金都是退的,但是如果卡丢失则不退的 // IsReturnDeposit=IS_NO; } else if(IS_YES!=rPack->lvol12) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_NOCARD; goto L_RETU; } //注销原卡 des2src(tCard.state_id,CARDSTAT_LOGOUT); //注销 des2src(tCard.end_time,tradeserial.operate_date); //注销日期 ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",tCard.card_id); if(DB_NOTFOUND==ret) *pRetCode = E_CARDNO_NOT_EXIST; else *pRetCode = E_DB_CARD_R; goto L_RETU; } DB_t_pif_card_free_lock_by_cur(); //是否退费,规定正式卡和临时卡退押金,非记名临时卡退押金 if(IS_YES==rPack->lvol12) { IA.iUseCardFlag=USE_CARD_TYPE_ONLINE; //联机交易 IA.dInCardBala = rPack->damt2; //入卡值 IA.dOutCardBala=-1; //-1 表示空值 IA.iTxCnt = rPack->lvol10+1; //当前卡交易次数 tradeserial.in_balance = IA.dInCardBala; //入卡值 tradeserial.trade_count = IA.iTxCnt; } else { IA.iUseCardFlag=USE_CARD_TYPE_NULL; IA.dInCardBala = -1; //-1 表示空值 IA.dOutCardBala=-1; //-1 表示空值 IA.iTxCnt = -1; //-1 表示空值 } IA.pVoidPointer=&tSavdtl.bill_type; IA.iCardNo=tCard.card_id; ret=process(rPack,&IA,&tradeserial); if(ret) { *pRetCode=ret; goto L_RETU; } writelog(LOG_DEBUG,"input card_id[%d] card_id[%d]",origin_card_id,tCard.card_id); ret = DB_t_tif_tradeserial_add(&tradeserial); if (ret) { writelog(LOG_ERR,"ret[%d]",ret); if(DB_REPEAT==ret) *pRetCode= E_DB_TRADESERIAL_E; else *pRetCode= E_DB_TRADESERIAL_I; goto L_RETU; } ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_DAMT0,F_DAMT1,F_DAMT2,F_DAMT3,F_DAMT4,F_SDATE0,F_LVOL1,F_SPHONE,F_LSERIAL1,F_VSMESS,0); sprintf(out_pack->vsmess,"流水号:%d 卡号:%d ",IA.iSerialNo,IA.iCardNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { switch(IA.iArrOutTxType[i]) { case TXTYPE_DEDUCT_DEPOSIT: tradeserial.deposit_fee=IA.dArrOutAmt[i]; break; case TXTYPE_RETURN_DEPOSIT: case TXTYPE_RETURN_DEPOSIT_BILL: case TXTYPE_RETURN_DEPOSIT_FUNDBOOK: tradeserial.deposit_fee=IA.dArrOutAmt[i]; out_pack->damt0+=IA.dArrOutAmt[i]; break; case TXTYPE_DEDUCT_BOARD: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_RETURN_BOARD: case TXTYPE_RETURN_BOARD_BILL: case TXTYPE_RETURN_BOARD_FUNDBOOK: tradeserial.boardfee=IA.dArrOutAmt[i]; out_pack->damt0+=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: tradeserial.in_fee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CARDCOST: tradeserial.cost_fee=IA.dArrOutAmt[i]; break; case TXTYPE_DRAW_CASH: case TXTYPE_DRAW_BILL: case TXTYPE_DRAW_FUNDBOOK: case TXTYPE_DRAW_OTHER: tradeserial.trade_fee=IA.dArrOutAmt[i]; out_pack->damt0+=IA.dArrOutAmt[i]; break; default: break; } if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(out_pack->vsmess,sMsg); if((TXTYPE_DRAW_BILL==IA.iArrOutTxType[i])|| (TXTYPE_DRAW_FUNDBOOK==IA.iArrOutTxType[i])|| (TXTYPE_DRAW_OTHER==IA.iArrOutTxType[i])) { sprintf(sMsg,"票据号码:%s ",tSavdtl.bill_no); strcat(out_pack->vsmess,sMsg); } } } sprintf(sMsg,"实际应退金额:%.2lf元",out_pack->damt0); strcat(out_pack->vsmess,sMsg); writelog(LOG_DEBUG,out_pack->vsmess); if(amtcmp(tradeserial.out_balance,0)<0) { *pRetCode=E_ENTER_ACCOUNT; goto L_RETU; } out_pack->lvol1=tSavdtl.bill_type; des2src(out_pack->sdate0,tSavdtl.tx_date); out_pack->damt1=tSavdtl.amount; //经费本充值金额 out_pack->lserial1=tradeserial.serial_no; //流水号 des2src(out_pack->sphone,tSavdtl.bill_no); PutRow(handle,out_pack,pRetCode,szMsg); return 0; L_RETU: return -1; }
static int process(ST_PACK *rPack,InAcc *IA,T_t_tif_tradeserial *p) { int ret =0; int *ptype=NULL; double dSerialNo=0; int upd_flag=0; T_t_aif_account tAccount; T_t_cif_customer tCustomer; T_t_pif_card tCard; T_t_pif_spefee tSpeFee; memset(&tCustomer,0,sizeof(tCustomer)); memset(&tAccount,0,sizeof(tAccount)); memset(&tCard,0,sizeof(tCard)); memset(&tSpeFee,0,sizeof(tSpeFee)); //注销原卡 ret=DB_t_pif_card_read_lock_by_cur_and_card_id(p->card_id, &tCard); if(ret) { if(DB_NOTFOUND==ret) return E_CARDNO_NOT_EXIST; else return E_DB_CARD_R; } if(p->card_id!=tCard.card_id) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"card_id[%d] db card_id[%d]",p->card_id,tCard.card_id); return E_DB_CARD_R; } p->deposit_fee =tCard.deposit_fee; //押金 // tCard.deposit_fee=0; des2src(tCard.state_id,CARDSTAT_LOGOUT); //注销 des2src(tCard.end_time,p->operate_date); //注销日期 ret=DB_t_pif_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"card_id[%d]",tCard.card_id); return E_DB_CARD_U; } DB_t_pif_card_free_lock_by_cur(); //如果是非记名临时卡则注销客户 ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(tCard.cosumer_id,&tCustomer); if(ret) { writelog(LOG_ERR,"cosumer_id[%d]",tCard.cosumer_id); if(DB_NOTFOUND==ret) return E_CUSTOMER_NOT_EXIST; else return E_DB_CUSTOMER_R; } if(CT_TEMP_NONAME==tCard.type_id) { tCustomer.cut_state=CUSTSTAT_LOGOUT; //注销 upd_flag=1; } if(tCustomer.fee_type<1) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); return E_DB_SPEFEE_R; } } else { tCustomer.fee_type=tSpeFee.fee_type; } upd_flag=1; } if(upd_flag) { ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer); if(ret) { writelog(LOG_ERR,"cosumer_id[%d]",tCard.cosumer_id); return E_DB_CUSTOMER_U; } } DB_t_cif_customer_free_lock_cur(); IA->iFeeType=tCustomer.fee_type; ret=DB_t_aif_account_read_by_card_id_and_purse_id(tCard.card_id,PURSE_NO_ONE, &tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,tCard.card_id); if(DB_NOTFOUND==ret) return E_ACTNO_NOT_EXIST; else return E_DB_ACCOUNT_R; } /*Changed by hhd at 2005-10-22 14:21 处理卡库不平的退卡问题,如果卡库不等,则判断卡余额 是否小于库余额,如果不是这程序退出,否则按照库余额 和卡余额的差值进行退卡。搭伙费按照差值进行计算的余 额进行退还,该账户不注销,等待未上传得流水 */ if(USE_CARD_TYPE_ONLINE==IA->iUseCardFlag) //有卡交易 { if(amtcmp(D4U5(tAccount.cur_freebala,2),IA->dInCardBala)<0) { writelog(LOG_ERR,"card_id[%d] act_id[%s] cur_freebala[%lf],input card_balance[%lf]",tCard.card_id,tAccount.account_id,tAccount.cur_freebala,IA->dInCardBala); return E_CARD_ACC_NO_EQ; } if(amtcmp(D4U5(tAccount.cur_freebala,2),IA->dInCardBala)>0) { writelog(LOG_ERR,"card_id[%d] act_id[%s] cur_freebala[%lf],input card_balance[%lf]",tCard.card_id,tAccount.account_id,tAccount.cur_freebala,IA->dInCardBala); //只修改发生额,搭伙费全退,流水入账模块进行处理吧 p->trade_fee = IA->dInCardBala; //可用余额//Changed by hhd at 2005-10-22 14:21 strcpy(p->reserve_2,"卡库不符|按卡余额退卡"); //p->boardfee = (D4U5(tAccount.cur_freebala,2)-IA->dInCardBala); } else p->trade_fee = tAccount.cur_freebala; } else { p->trade_fee = tAccount.cur_freebala; //可用余额//Changed by hhd at 2005-10-22 14:21 } ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dSerialNo); //获得最大流水号 if(ret) { return ret; } //把预提费用转为学校收益 p->serial_no=(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 F950044(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret,i,j; T_t_device tDevice; T_t_msglist tMsg; int retries = 0; int msgid; char msg[257] = ""; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); T_t_waterfeecfg tWaterFeeCfg; memset(&tMsg,0,sizeof tMsg); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_VSVARSTR0,0); memset(&tDevice,0,sizeof tDevice); if(rPack->lcert_code < 1) { return E_NOTEXIST_DEVICE; } ret = DB_t_waterfeecfg_read_by_feeid(rPack->lvol1,&tWaterFeeCfg); if(ret) { if(DB_NOTFOUND == ret) { writelog(LOG_ERR,"F950044,ret=[%d]",ret); return E_DB_WATERFEECFG_N; } else { writelog(LOG_ERR,"F950044,ret=[%d]",ret); return E_DB_WATERFEECFG_R; } } if((ret = DB_t_device_read_by_deviceid(rPack->lcert_code,&tDevice))) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_DEVICE,rPack->lcert_code); else return E_DB_DEVICE_R; } if(tDevice.status[0]!=STATUS_NORMAL) { return ERRINFO(E_NOTEXIST_DEVICE,tDevice.devphyid); } tMsg.funcno = 950047; tMsg.msglevel=1; tMsg.maxsendcnt = 1; tMsg.deviceid= tDevice.deviceid; AddXmlItemInt(tMsg.reqdata,XML_KEY_FEE,tWaterFeeCfg.feeid); if((ret = AddMsgLst(&tMsg))) { return ret; } strcpy(out_pack->vsvarstr0,"成功"); PutRow(handle,out_pack,pRetCode,szMsg); return 0; }
int send_to_and_recv_from_bank_of_boc(char* pSend, int send_len,char* pRecv,int *recv_len,int max_recv_len,int delay_time) { struct SockNode SockNode,SockNode_rsp; CTcpSocket sock; char bank_ip[20]=""; int bank_port=0; int bank_port_rsp=0; //int delay_time=0; int ret=0; char temp[5]=""; int length=0; TIniFile tf; if (!tf.Open(TRANS_INI_FILE)) { writelog(LOG_ERR,"Cann't open ini file,file=[%s]\n",TRANS_INI_FILE); return E_TRANS_UNKNOW_ERROR; } tf.ReadString("BANK", "BANK_IP", "127.0.0.1", bank_ip,sizeof(bank_ip)); bank_port=tf.ReadInt("BANK", "BANK_PORT",9001); bank_port_rsp=tf.ReadInt("BANK", "BANK_PORT_RSP",9002); if(0==delay_time) delay_time=tf.ReadInt("BANK", "BANK_DELAY_TIME", 3000); tf.Close(); #ifdef DEBUG //printf("BANK_IP=[%s],BANK_PORT[%d],DELAY_TIME[%d]\n",bank_ip,bank_port,delay_time); #endif writelog(LOG_DEBUG,"connect to bank [%s][%d][%d]",bank_ip,bank_port,bank_port_rsp); //连接银行 ret=SockNode.hSock.ConnectTcp(bank_ip, bank_port,5); if(!ret) { writelog(LOG_ERR,"Connect to bank error,error code is [%d],bank_ip[%s],port[%d] ",ret,bank_ip,bank_port); return E_TRANS_BANK_NETERR; } //发送数据到银行 ret=SockNode.hSock.Send(pSend, send_len); if (ret<0) { // 发送时,端口有问题,包括被关闭 writelog(LOG_ERR,"Send to bank error,ret = %ret, error code is [%d] ",ret, errno); return E_TRANS_BANK_NETERR; } else if (0==ret) { // 不应该出现这种情况 writelog(LOG_ERR,"Send to bank error,CTcpSocket.Send should not return this error,error code is[%d]!\n",errno); return E_TRANS_BANK_NETERR; } writelog(LOG_DEBUG,"send to bank success, waiting for responsing!!"); sleep(1); if(!sock.Create()) { writelog(LOG_ERR,"sock.Create error!\n"); return E_TRANS_BANK_NETERR; } if(!sock.Listen(bank_port_rsp)) { writelog(LOG_ERR,"sock.Listen error![%d]",errno); return E_TRANS_BANK_NETERR; } CTcpSocket rcv_sock; if(sock.Accept(rcv_sock)) { int rcvlen = rcv_sock.Recv(pRecv,max_recv_len,delay_time); if(rcvlen < 0) { writelog(LOG_ERR,"sock.Recv error![%d][%d]\n",rcvlen,errno); return E_TRANS_BANK_NOANSWER; } writelog(LOG_DEBUG,"recv length[%d]",rcvlen); *recv_len=rcvlen; return 0; } return E_TRANS_BANK_NOANSWER; /* ret=SockNode_rsp.hSock.Listen(bank_port_rsp); if(!ret) { char msg[256]=""; SockNode_rsp.hSock.GetLastError(msg); writelog(LOG_ERR,"Listen bank error,error code is[%d],msg=[%s]!\n",ret,msg); return E_TRANS_BANK_NETERR; } CTcpSocket rcv_sock; ret=SockNode_rsp.hSock.Accept(rcv_sock); if(ret) { int rcvlen = SockNode.hSock.Recv(pRecv,max_recv_len,delay_time); if(rcvlen < 0) { char msg[256]=""; SockNode_rsp.hSock.GetLastError(msg); writelog(LOG_ERR,"Receive from bank error,error code is[%d],msg=[%s]!\n",ret,msg); return E_TRANS_BANK_NETERR; } *recv_len=rcvlen; SockNode.hSock.Close(); SockNode_rsp.hSock.Close(); rcv_sock.Close(); return 0; } return -2; */ }
int main(int argc,char *argv[]) { int rtn; int ret=0; openlog("yktbank",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL3); g_pSvrLink = BUPubInitialize(g_XBDefines,CallBDFunc,WriteAppInfo,&g_LogFile); SetLogShowLevel(0); if (argc<2) ReadIni("ksbu.ini"); else ReadIni(argv[1]); struct sigaction act,oldact; act.sa_handler = handler_alarm; if(-1==sigaction(SIGALRM,&act,&oldact)) { writelog(LOG_ERR,"sigaction error,errcode=[%d]",-1); return -1; } ret=ReadIni_bank(&g_Bank); if(ret) { writelog(LOG_ERR,"ReadIni_bank error,errcode=[%d]",ret); return -1; } ResetBPFunctions(); if (argc>2) { ListBPFunctions(argv[2]); } // 初始化数据库连接: /* SQLInitialize(); if (SQLConnectToServer()!=0) { RAISE_RUNTIME_ERROR("不能正常建立数据库连接, 检查配置和数据库服务器!\n"); return(-100); } */ // 初始化与BCC连接: do { rtn = g_pSvrLink->ToLink(&g_BUnit); if (rtn==1) { DEBUG_RUNTIME_MSGOUT("与业务调度中心(BCC)的连接成功!\n"); break; } else if (rtn==-100) { DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n"); mysleep(g_BUnit.iHBInterval); } else { // 应该属于故障,或对方并不是BCC DEBUG_RUNTIME_MSGOUT("未知错误\n"); return(rtn); } } while (1); #ifdef WIN32 setnoblockgetch(); #endif /********************************************************************** Added by hhd at 2004-09-16 为了增加签到处理,达到共享内存的处理 增加共享内存和信号量 共享内存一共1024个字节,其中使用前18个字节 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功 ,后续业务将不能进行签到处理,如果为其他值,系统将进行签到 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为 银行正常返回数据,可以使用 shm[2~17]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥 ***********************************************************************/ /********************************************************************** Update by hhd at 2004-10-27 为了增加签到处理,达到共享内存的处理 增加共享内存和信号量 为了反映每个终端的当前工作状态,在共享内存中设置一个状态标志 共享内存一共1024个字节,其中使用前26个字节 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功 ,后续业务将不能进行签到处理,如果为其他值,系统将进行签到 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为 银行正常返回数据,可以使用 shm[2]:代表系统重新启动标志,如果不为1,系统进行初始化操作(进行设备 注册表中设备的状态的清空操作),然后系统将改标志置为1,其他BU启动 跳过该项操作 shm[10~25]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥 ***********************************************************************/ key_t key; struct shmid_ds buf; // Update by lq at 2005-03-10 // 将创建共享内存和设备签到移到bankguard中去 // 必须先运行bankguard此处操作才能完成 key=ftok("bankguard",9); shmid=shmget(key,SEGSIZE,0666); if(-1==shmid) { printf("errno=%s\n",strerror(errno)); DEBUG_RUNTIME_MSGOUT("获取共享内存失败,请确保bankguard已经启动\n"); return E_CREATE_SHARE_MEMORY; } shm=(char*)shmat(shmid,0,0); if((int)shm==-1) { DEBUG_RUNTIME_MSGOUT("映射共享内存失败"); return E_JOIN_SHARE_MEMORY; } semid=semget(key,1,0); if(semid==-1) { DEBUG_RUNTIME_MSGOUT("获取共享锁id失败"); return E_JOIN_SHARE_MEMORY; } // Added by hhd end here while (g_pSvrLink->LinkOK()) { #ifdef WIN32 switch (mygetch()) { case '?': case 'h': case 'H': printf("\nCommand List:\n"); printf("\t ? or h: display this Help informations!\n"); printf("\t x: To eXit this business unit.\n"); printf("\t d: Display functions status.\n"); printf("\t l: List functions status into <function.lst>.\n"); printf("Enter command to select:"); break; case 'x': case 'X': g_pSvrLink->bExit = true; continue; break; case 'd': case 'D': ListBPFunctions(NULL); break; case 'l': case 'L': ListBPFunctions("function.lst"); break; } #endif // if (!SQLIsConnectOK()) if(0) { mysleep(1000); if (!g_pSvrLink->CheckLink()) break; // BCC exit (可能用户发现数据库连接断开,需要维护系统,导致手工将BCC退出同时也需要BU退出) //if (SQLConnectToServer()!=0) if(0) { // SQL Link error: DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n"); } else { DEBUG_RUNTIME_MSGOUT("与数据库连接成功!\n"); } continue; } else { //DEBUG_RUNTIME_MSGOUT("处理bu业务!\n"); g_pSvrLink->Processing(&g_BUnit); } //if (g_pSvrLink->bExit) break; } /* ****** Updated by CHENYH at 2004-4-14 11:07:19 ****** 经过测试后,CheckLink()工作正常,测试环境为:BCC(WIN)+BU(WIN),BCC(LINUX)+BU(WIN),BCC(LINUX)+BU(LINUX) while (1) { mysleep(1000); if (!g_SvrLink.CheckLink()) { printf("TEST CHECK LINK return <false>!\n"); break; } } */ /* shmdt(shm); shmctl(shmid,IPC_RMID,&buf); d_sem(semid); */ g_pSvrLink->Close(); // SQLExit(); DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n"); g_LogFile.Close(); closelog(); return(0); }
int CallBDFunc(int fno,TRUSERID *handle,ST_CPACK *rpack,ST_PACK *pArrays,int *iRetCode, char *szMsg) { int r=0; int rtn=0; int sendtype=0; char param[101]=""; #ifdef _DEBUG1 CMemoryState cm1, cm2, cm3; #endif APPFUNC pFunc = g_XBDefines[fno].pFunc; #ifdef _DEBUG1 cm1.Checkpoint(); #endif *iRetCode=0; *szMsg=0; g_pArrays=pArrays; //判断是否是结帐时刻,如果是则等待处理 sendtype=rpack->head.RequestType; switch(sendtype) { case 95: case 93: #ifdef _DEBUG_CPACK rtn=SaveCPackData(rpack); if(rtn) { //writelog(LOG_ERR,"SaveCpackData err "); strcpy(szMsg,"写流水日志表错误"); ERR_DEAL( szMsg,rtn); break; } #endif rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg); #ifdef _DEBUG1 cm2.Checkpoint(); if (cm3.Difference(cm1, cm2)) { BCCMsgLogOut(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType); g_LogFile.WriteLogEx(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType); cm3.DumpStatistics(); } #endif break; default: rtn=GetParameter(GLOBE_FLAG_BALANCE,param); if(rtn) { *iRetCode=rtn; break; } else if(strncmp(param,"0",1)!=0) { rtn=E_DAYEND_STATUS; *iRetCode=rtn; break; } rtn=SaveCPackData(rpack); if(rtn) { //writelog(LOG_ERR,"SaveCpackData err "); strcpy(szMsg,"写流水日志表错误"); ERR_DEAL( szMsg,rtn); break; } *iRetCode=0; rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg); #ifdef _DEBUG1 cm2.Checkpoint(); if (cm3.Difference(cm1, cm2)) { BCCMsgLogOut(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType); g_LogFile.WriteLogEx(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType); cm3.DumpStatistics(); } #endif break; } if(rtn) { char sErrMsg[101]=""; char sRetMsg[256]=""; if(*szMsg) snprintf(sRetMsg,256," %s",szMsg); if(*iRetCode==0) *iRetCode=rtn; r=get_errcode_msg(*iRetCode, sErrMsg); db_rollback(); snprintf(szMsg,256,"%s%s\n%s",sErrMsg,sRetMsg,g_sqlmsg); writelog(LOG_ERR,"Func[%d]ecode[%d]msg[%s]",rpack->head.RequestType,*iRetCode,szMsg); ERR_DEAL(szMsg,*iRetCode); if(r) { AnswerData(handle,*iRetCode,szMsg); db_disconnect(); writelog(LOG_ERR,"数据库错误,系统退出"); exit(1); } } else { if(strncmp(rpack->pack.scust_limit,"test",4)==0) db_rollback(); else { r=db_commit(); if(r) { *iRetCode=E_DB_COMMIT; strcpy(szMsg,"数据库事务提交失败"); writelog(LOG_ERR,"Func[%d]Msg[%s]",rpack->head.RequestType,szMsg); db_rollback(); ERR_DEAL( szMsg,*iRetCode); } } } return(rtn); }
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,"in_pack->lserial1[%d]",in_pack->lvol0); *pRetCode=E_INPUT_CARDNO; goto L_RETU; } if(in_pack->lserial1<1) { writelog(LOG_ERR,"in_pack->lserial1[%d]",in_pack->lserial1); *pRetCode= E_INPUT_SERIALNO; goto L_RETU; } ret=DB_t_pif_card_read_lock_by_cur_and_card_id(card_id, &card); if(ret) { writelog(LOG_ERR,"card_id[%d]",card_id); if(DB_NOTFOUND==ret) *pRetCode= E_CARDNO_NOT_EXIST; else *pRetCode= E_DB_CARD_R; goto L_RETU; } 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 F930061(TRUSERID *handle,int iRequest,ST_PACK *in_pack,int *pRetCode,char *szMsg) { int ret = 0; int cnt=0; int msgid=0; T_t_msglist tMsgList; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_VSVARSTR0,0); memset(&tMsgList,0,sizeof(tMsgList)); if(strlen(in_pack->sdate0)==0) { return E_DEVPHYID_NULL; } ret=GetDeviceidByDevphyid(in_pack->sdate0,&(tMsgList.deviceid)); if(ret) { return ret; } AddXmlItemInt(tMsgList.reqdata, XML_KEY_MAXTRADE, in_pack->lvol4); tMsgList.funcno = 930061; tMsgList.msglevel = 2; ret=AddMsgLst(&tMsgList); if(ret) { *pRetCode=ret; writelog(LOG_ERR,"AddMsgLst err[%d]",ret); goto L_RETU; } if(iRequest!=tMsgList.funcno) return 0; ret=db_commit(); if(ret) { writelog(LOG_ERR,"db_commit ret[%d]",ret); *pRetCode=E_DB_COMMIT; goto L_RETU; } msgid=tMsgList.msgid; des2src(out_pack->sdate0,in_pack->sdate0); for(cnt=0;(cnt<10)&&(tMsgList.errcode!=0);cnt++) { sleep(1); memset(&tMsgList,0,sizeof(tMsgList)); ret=DB_t_msglist_read_by_msgid(msgid, &tMsgList); if(ret) { writelog(LOG_ERR,"DB_t_msglist_read_by_msgid err[%d]",ret); *pRetCode=E_DB_MSGLIST_R; goto L_RETU; } } switch(tMsgList.errcode) { case 0: //成功 des2src(out_pack->vsvarstr0,"成功"); break; case 9999: //交易未处理 des2src(out_pack->vsvarstr0,"前置机无应答"); break; default: //交易已经处理,但结果是失败 des2src(out_pack->vsvarstr0,tMsgList.errmsg); break; } 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); #ifdef DEBUG writelog(LOG_DEBUG,"cut_id :lvol0 [%d]",rPack->lvol0); writelog(LOG_DEBUG,"dept_id :lvol1 [%d]",rPack->lvol1); writelog(LOG_DEBUG,"shop_name :scard1 [%s]",rPack->scard1); writelog(LOG_DEBUG,"shop_type :lvol7 [%d]",rPack->lvol7); writelog(LOG_DEBUG,"is_indep :smain_flag [%s]",rPack->smain_flag); writelog(LOG_DEBUG,"is_leaf :smarket_code2 [%s]",rPack->smarket_code2); writelog(LOG_DEBUG,"shop_manager :scust_auth [%s]",rPack->scust_auth); writelog(LOG_DEBUG,"man :sname [%s]",rPack->sname); writelog(LOG_DEBUG,"sex :sstatus0 [%s]",rPack->sstatus0); writelog(LOG_DEBUG,"nation :lvol4 [%d]",rPack->lvol4); writelog(LOG_DEBUG,"man_id :sname2 [%s]",rPack->sname2); writelog(LOG_DEBUG,"tel :scust_auth2 [%s]",rPack->scust_auth2); writelog(LOG_DEBUG,"address :scusttypes [%s]",rPack->scusttypes); writelog(LOG_DEBUG,"is_getfee :smarket_code [%s]",rPack->smarket_code); writelog(LOG_DEBUG,"ratio :damt0 [%lf]",rPack->damt0); writelog(LOG_DEBUG,"manager_type :lvol3 [%d]",rPack->lvol3); writelog(LOG_DEBUG,"duty_type :lvol2 [%d]",rPack->lvol2); writelog(LOG_DEBUG,"comments :ssectypes [%s]",rPack->ssectypes); writelog(LOG_DEBUG,"area :lvol8 [%d]",rPack->lvol8); #endif 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); //是否收取管理费 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); 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 F930101(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret= 0; int dev_usage = 0; //T_t_attend_txdtl tTxdtl; T_t_door_txdtl tTxdtl; T_t_device tDevice; T_t_card tCard; if(strlen(rPack->sdate0) != 8) { *pRetCode = E_DEVPHYID_NULL; goto L_RETU; } /* ret=chk_dyn_key(rPack->lcert_code,rPack->scust_limit2); if(ret) { writelog(LOG_ERR,"subsys_id[%d]dyn_key[%s]",rPack->lcert_code,rPack->scust_limit2); *pRetCode = ret; goto L_RETU; } */ memset(&tTxdtl,0,sizeof(tTxdtl)); memset(&tDevice,0,sizeof tDevice); /* tTxdtl.serial_no= rPack->lvol3; //上传端流水号 tTxdtl.sys_id = rPack->lcert_code; //上传工作站标识(前置机注册号) // tTxdtl.mode_code=rPack->lvol6; //模式代码 tTxdtl.cardno= rPack->lvol7; //交易卡号 // tTxdtl.use_type= rPack->lvol8; //考勤类型 // tTxdtl.inductor_no= rPack->lvol9; //感应头标记 // tTxdtl.work_mark=rPack->lvol10; //上下班标志 tTxdtl.tx_mark=rPack->lvol11; //999交易标志 des2src(tTxdtl.deviceid, rPack->sdate0); //物理设备ID des2src(tTxdtl.tx_date,rPack->sdate1); //发生日期(格式化输入的日期) des2src(tTxdtl.crc,rPack->sbank_code2); //CRC校验 des2src(tTxdtl.tx_time,rPack->spost_code2); //发生时间(格式化输入的时间) getsysdate(tTxdtl.col_date); getsystime(tTxdtl.col_time); // ret=check(&tTxdtl); // if(ret) // { // tTxdtl.status[0]='5'; //无效交易 // //tTxdtl.err_code=ret; // writelog(LOG_DEBUG,"无效流水deviceid[%d]serial_no[%d]",tTxdtl.deviceid,tTxdtl.serial_no); // return ret; // } // else // tTxdtl.status[0]='1'; ret = SaveDoorJSBSerial(&tTxdtl); */ tTxdtl.serial_no= rPack->lvol3; //上传端流水号 tTxdtl.sys_id = rPack->lcert_code; //上传工作站标识(前置机注册号) // tTxdtl.mode_code=rPack->lvol6; //模式代码 tTxdtl.cardno= rPack->lvol7; //交易卡号 memset(&tCard,0,sizeof tCard); ret = DB_t_card_read_by_cardno(tTxdtl.cardno,&tCard); if(ret) { if(DB_NOTFOUND == ret) { // 卡号不存在 } else { *pRetCode = E_DB_CARD_R; goto L_RETU; } } // tTxdtl.use_type= rPack->lvol8; //考勤类型 // tTxdtl.inductor_no= rPack->lvol9; //感应头标记 // tTxdtl.work_mark=rPack->lvol10; //上下班标志 tTxdtl.cust_id = tCard.custid; //客户号 tTxdtl.tx_mark=rPack->lvol11; //999交易标志 //des2src(tTxdtl.deviceid, rPack->sdate0); //物理设备ID ret = get_devinfo_by_phyid(rPack->sdate0,&tDevice); if(ret) { if(DB_NOTFOUND == ret) { // 设备不存在 writelog(LOG_ERR,"采集计时宝流水,设备不存在或已注销[%s]" ,rPack->sdate0); return 0; } else { *pRetCode = ret; goto L_RETU; } } tTxdtl.deviceid = tDevice.deviceid; des2src(tTxdtl.tx_date,rPack->sdate1); //发生日期(格式化输入的日期) des2src(tTxdtl.crc,rPack->sbank_code2); //CRC校验 des2src(tTxdtl.tx_time,rPack->spost_code2); //发生时间(格式化输入的时间) getsysdate(tTxdtl.col_date); getsystime(tTxdtl.col_time); ret = SaveKQSerial(&tTxdtl); if(ret) { writelog(LOG_ERR,"插入考勤流水表失败,errcode[%d]",ret); *pRetCode = ret; goto L_RETU; } return 0; L_RETU: return -1; }
int F847126(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; T_t_pif_carddtl carddtl; 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)); memset(&carddtl,0,sizeof(carddtl)); #ifdef DEBUG writelog(LOG_DEBUG,"rPack->scust_auth2[%s]",rPack->scust_auth2); #endif 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); hi_cutid = rPack->lvol0; //客户ID hi_cuttype = rPack->lvol3; //客户类别 des2src(h_showcardid,rPack->scust_no); //显示卡号 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=IsExistShowCardNo(h_showcardid); if(ret) { *pRetCode = ret; goto L_RETU; } ret = UseShowCardNo(rPack->scust_limit,h_showcardid,CT_VIP); if(ret) return ret; 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; } //更新客户表的收费类别字段 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; } */ // 默认密码, 初始取身份证的后6位, 没有身份证号用666666. 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,"666666"); } ret = getNewUniqNo(KEYTYPE_CARD_ID,&h_temp_Card_id); //获取最大卡号 if(ret) { *pRetCode = ret; goto L_RETU; } tCard.card_id = (int)h_temp_Card_id; //卡号 des2src(tCard.showid,h_showcardid); //显示卡号 des2src(tCard.is_main,TYPE_YES); //是否为主卡 des2src(tCard.state_id,CARDSTAT_REG); //卡状态 tCard.type_id = CT_VIP; //卡类别 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; } //插入卡片操作情况表 des2src(carddtl.accdate,sysdate); des2src(carddtl.acctime,systime); carddtl.termid=rPack->lvol6; //上传工作站标识 ret = getNewUniqNo(KEYTYPE_T_PIF_CARDDTL,&h_temp_Serial_no); //获取流水号 if(ret) { writelog(LOG_ERR,"getNewUniqNo[KEYTYPE_T_PIF_CARDDTL] "); return ret; } carddtl.termseqno = D2I(h_temp_Serial_no); des2src(carddtl.opercode,rPack->scust_limit); carddtl.cardtype=CT_VIP; carddtl.usetype[0]=CARDUSETYPE_USE; carddtl.inoutflag=INOUTFLAG_OUT; carddtl.transcnt=1; strcpy(carddtl.summary,"发行VIP 记名临时卡"); des2src(carddtl.cardphyid,rPack->sbank_acc); des2src(carddtl.showcardno,h_showcardid); ret=DB_t_pif_carddtl_add(&carddtl); if(ret) { if(DB_REPEAT==ret) return E_DB_CARDDTL_E; else return E_DB_CARDDTL_I; } // 准备数据插入帐户信息表 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; } // add by 汤成2005-09-05 // 记录发行正式卡信息 ///////////////////////////////////////////////////////////////////////// ret = InsertToCutUpdList((int)h_temp_Card_id, CUTUPD_ADD); if( ret ) { *pRetCode = ret; goto L_RETU; } ///////////////////////////////////////////////////////////////////////// tradeserial.serial_no = (int)h_temp_Serial_no; //流水号 tradeserial.other_seri_no = 0; //上传端流水号 tradeserial.serial_type=TXCODE_CARD_OPEN_VIP_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->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; //流水号 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; }
InplaceTransformFinal get_invhtransformfinal_c(int wavelet_index, int active_bits, int sample_size) { if (active_bits < 10 || active_bits > 16 || (active_bits % 2) != 0) { writelog(LOG_ERROR, "%s:%d: Invalid bit depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } if (sample_size == 4) { switch(wavelet_index) { case VC2DECODER_WFT_FIDELITY: switch (active_bits) { case 10: return Fidelity_invtransform_H_final_1<10>; case 12: return Fidelity_invtransform_H_final_1<12>; } case VC2DECODER_WFT_DESLAURIERS_DUBUC_9_7: switch (active_bits) { case 10: return Deslauriers_Dubuc_9_7_invtransform_H_final_1<10, int32_t>; case 12: return Deslauriers_Dubuc_9_7_invtransform_H_final_1<12, int32_t>; } case VC2DECODER_WFT_DESLAURIERS_DUBUC_13_7: switch (active_bits) { case 10: return Deslauriers_Dubuc_13_7_invtransform_H_final_1<10, int32_t>; case 12: return Deslauriers_Dubuc_13_7_invtransform_H_final_1<12, int32_t>; } case VC2DECODER_WFT_LEGALL_5_3: switch (active_bits) { case 10: return LeGall_5_3_invtransform_H_final_1<10, int32_t>; case 12: return LeGall_5_3_invtransform_H_final_1<12, int32_t>; } case VC2DECODER_WFT_HAAR_NO_SHIFT: switch (active_bits) { case 10: return Haar_invtransform_H_final_1<0, 10, int32_t>; case 12: return Haar_invtransform_H_final_1<0, 12, int32_t>; } break; case VC2DECODER_WFT_HAAR_SINGLE_SHIFT: switch (active_bits) { case 10: return Haar_invtransform_H_final_1<1, 10, int32_t>; case 12: return Haar_invtransform_H_final_1<1, 12, int32_t>; } break; default: writelog(LOG_ERROR, "%s:%d: Invalid transform\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } } else if (sample_size == 2) { switch(wavelet_index) { case VC2DECODER_WFT_DESLAURIERS_DUBUC_9_7: switch (active_bits) { case 10: return Deslauriers_Dubuc_9_7_invtransform_H_final_1<10, int16_t>; case 12: return Deslauriers_Dubuc_9_7_invtransform_H_final_1<12, int16_t>; } case VC2DECODER_WFT_DESLAURIERS_DUBUC_13_7: switch (active_bits) { case 10: return Deslauriers_Dubuc_13_7_invtransform_H_final_1<10, int16_t>; case 12: return Deslauriers_Dubuc_13_7_invtransform_H_final_1<12, int16_t>; } case VC2DECODER_WFT_LEGALL_5_3: switch (active_bits) { case 10: return LeGall_5_3_invtransform_H_final_1<10, int16_t>; case 12: return LeGall_5_3_invtransform_H_final_1<12, int16_t>; } case VC2DECODER_WFT_HAAR_NO_SHIFT: switch (active_bits) { case 10: return Haar_invtransform_H_final_1<0, 10, int16_t>; case 12: return Haar_invtransform_H_final_1<0, 12, int16_t>; } break; case VC2DECODER_WFT_HAAR_SINGLE_SHIFT: switch (active_bits) { case 10: return Haar_invtransform_H_final_1<1, 10, int16_t>; case 12: return Haar_invtransform_H_final_1<1, 12, int16_t>; } break; default: writelog(LOG_ERROR, "%s:%d: Invalid transform\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } } writelog(LOG_ERROR, "%s:%d: Invalid sample size\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; }
void drawline() { writelog("\n-------------------------------------" "------------------------------------------"); }
static void writelogv(FILE *file, const char *fmt, va_list args) { static char buf[LOGSTRLEN]; vformatstring(buf, fmt, args, sizeof(buf)); writelog(file, buf); }
InplaceTransform get_invhtransform_c(int wavelet_index, int level, int depth, int sample_size) { if (sample_size == 4) { switch(wavelet_index) { case VC2DECODER_WFT_FIDELITY: switch (depth - level - 1) { case 3: return Fidelity_invtransform_H_inplace<8>; case 2: return Fidelity_invtransform_H_inplace<4>; case 1: return Fidelity_invtransform_H_inplace<2>; case 0: return Fidelity_invtransform_H_inplace<1>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_DESLAURIERS_DUBUC_9_7: switch (depth - level - 1) { case 3: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<8, int32_t>; case 2: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<4, int32_t>; case 1: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<2, int32_t>; case 0: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<1, int32_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_DESLAURIERS_DUBUC_13_7: switch (depth - level - 1) { case 3: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<8, int32_t>; case 2: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<4, int32_t>; case 1: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<2, int32_t>; case 0: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<1, int32_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_LEGALL_5_3: switch(depth - level - 1) { case 3: return LeGall_5_3_invtransform_H_inplace<8, int32_t>; case 2: return LeGall_5_3_invtransform_H_inplace<4, int32_t>; case 1: return LeGall_5_3_invtransform_H_inplace<2, int32_t>; case 0: return LeGall_5_3_invtransform_H_inplace<1, int32_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_HAAR_NO_SHIFT: switch (depth - level - 1) { case 3: return Haar_invtransform_H_inplace<8,0, int32_t>; case 2: return Haar_invtransform_H_inplace<4,0, int32_t>; case 1: return Haar_invtransform_H_inplace<2,0, int32_t>; case 0: return Haar_invtransform_H_inplace<1,0, int32_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_HAAR_SINGLE_SHIFT: switch (depth - level - 1) { case 3: return Haar_invtransform_H_inplace<8,1, int32_t>; case 2: return Haar_invtransform_H_inplace<4,1, int32_t>; case 1: return Haar_invtransform_H_inplace<2,1, int32_t>; case 0: return Haar_invtransform_H_inplace<1,1, int32_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } default: writelog(LOG_ERROR, "%s:%d: Invalid transform\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } } else if (sample_size == 2) { switch(wavelet_index) { case VC2DECODER_WFT_DESLAURIERS_DUBUC_9_7: switch (depth - level - 1) { case 3: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<8, int16_t>; case 2: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<4, int16_t>; case 1: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<2, int16_t>; case 0: return Deslauriers_Dubuc_9_7_invtransform_H_inplace<1, int16_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_DESLAURIERS_DUBUC_13_7: switch (depth - level - 1) { case 3: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<8, int16_t>; case 2: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<4, int16_t>; case 1: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<2, int16_t>; case 0: return Deslauriers_Dubuc_13_7_invtransform_H_inplace<1, int16_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_LEGALL_5_3: switch (depth - level - 1) { case 3: return LeGall_5_3_invtransform_H_inplace<8, int16_t>; case 2: return LeGall_5_3_invtransform_H_inplace<4, int16_t>; case 1: return LeGall_5_3_invtransform_H_inplace<2, int16_t>; case 0: return LeGall_5_3_invtransform_H_inplace<1, int16_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_HAAR_NO_SHIFT: switch (depth - level - 1) { case 3: return Haar_invtransform_H_inplace<8,0, int16_t>; case 2: return Haar_invtransform_H_inplace<4,0, int16_t>; case 1: return Haar_invtransform_H_inplace<2,0, int16_t>; case 0: return Haar_invtransform_H_inplace<1,0, int16_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } case VC2DECODER_WFT_HAAR_SINGLE_SHIFT: switch (depth - level - 1) { case 3: return Haar_invtransform_H_inplace<8,1, int16_t>; case 2: return Haar_invtransform_H_inplace<4,1, int16_t>; case 1: return Haar_invtransform_H_inplace<2,1, int16_t>; case 0: return Haar_invtransform_H_inplace<1,1, int16_t>; default: writelog(LOG_ERROR, "%s:%d: Invalid transform depth\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } default: writelog(LOG_ERROR, "%s:%d: Invalid transform\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; } } writelog(LOG_ERROR, "%s:%d: Invalid sample size\n", __FILE__, __LINE__); throw VC2DECODER_NOTIMPLEMENTED; }
int Do_Compare_file_shoudong() { ///* FILE *fp; TIniFile tf; char path_name[256]=""; char file_name[256]=""; int ret=0; int cnt=0; int i=0; BANK_COMPARE_RECODE compare,compare1; T_t_tif_bank_comp bank_comp; T_t_tif_report_trans_comp trans_comp; T_t_tif_tradeserial tradeserial; T_t_tif_tradeserial_his his_tradeserial; T_t_tif_diff_transfer diff_transfer; char logicdate[10]=""; char tmp_date[10]=""; char forward_date[10]=""; double trans_count=0; double bank_count=0; double trans_amt=0; double bank_amt=0; double second=0; double temp=0; char *p=getenv("BIN_PATH"); ret=GetLogicDate(logicdate); //业务日期 if(ret) { writelog(LOG_ERR,"GetLogicDate error,errcode=[%d]",ret); return ret; } ret=datetime2second(logicdate, "YYYYMMDD", &second); if(ret) { writelog(LOG_ERR,"datetime2second error,errcode=[%d]",ret); return ret; } //trans_count=0; //bank_count=0; //trans_amt=0; // bank_amt=0; second=second-24*60*60; ret=second2datetime(second, forward_date, "YYYYMMDD"); if(ret) { writelog(LOG_ERR,"second2datetime error,errcode=[%d]",ret); return ret; } memset(&bank_comp,0,sizeof(bank_comp)); memset(&compare,0,sizeof(compare)); memset(&trans_comp,0,sizeof(trans_comp)); memset(&tradeserial,0,sizeof(tradeserial)); memset(&his_tradeserial,0,sizeof(his_tradeserial)); memset(&compare1,0x30,sizeof(compare1)); ret=DB_t_tif_report_trans_comp_read_by_cmp_date(forward_date,&trans_comp); if(ret!=100&&ret!=0) { writelog(LOG_ERR,"DB_t_tif_report_trans_comp_read_by_cmp_date error,errcode=[%d]",ret); goto LRet; } if(1==trans_comp.cmp_flag) { writelog(LOG_ERR,"trans_comp.cmp_flag =1,already compare!"); goto LRet; } //配置环境变量 if(p==NULL) { writelog(LOG_ERR,"Cann't get env HOME PATH\n"); return -1; } //sprintf(path_name,"%s/ftp",p); sprintf(path_name,"%s",p); //strcpy(path_name,"/bank/ykt/src/bank/ftp"); sprintf(file_name,"%s/XYK00002.%8.8s",path_name,forward_date); writelog(LOG_ERR,"Open indirect file=[%s]",file_name); if((fp = fopen(file_name,"rb"))==NULL) { writelog(LOG_ERR,"Open indirect file error,file=[%s]",file_name); return -1; } while(!feof(fp)) { memset(&bank_comp,0,sizeof(bank_comp)); memset(&compare,0,sizeof(compare)); cnt++; if(NULL==fgets((char *)(&compare),sizeof(compare),fp)) { writelog(LOG_ERR,"fgets error,"); continue; } //不知道为什么,必须要跳一个才能对? if((cnt+2)%2==0) continue; //开始进行赋值 if(memcmp(&compare,&compare1,10)==0) break; else { strncpy(bank_comp.op_date,forward_date,sizeof(bank_comp.op_date)-1); memcpy(bank_comp.tx_code,compare.TradeCode,2); bank_comp.card_id=atoi(compare.GDCAccount); memcpy(bank_comp.bankcard,compare.BankCard,20); bank_comp.local_sn=atoi(compare.LocalSn); //printf("--------local_sn[%d]=[%d]\n",cnt,bank_comp.local_sn); memcpy(bank_comp.bank_sn,compare.BankSn,20); strncpy(bank_comp.trans_money,compare.TransMomoy,9); ret=DB_t_tif_bank_comp_add(&bank_comp); if(ret) { writelog(LOG_ERR,"DB_t_tif_bank_comp_add rows[%d] error,errcode=[%d]",cnt,ret); goto LRet; } } } //读取对帐文件结束,关闭对仗文件,提交事务 //printf("Line=[%d]\n",__LINE__); if(fclose(fp)) { writelog(LOG_ERR,"Close file error,file=[%s]",file_name); goto LRet; } ret=db_commit(); if(ret) { writelog(LOG_ERR,"db_commit error,errcode=[%d]",ret); goto LRet; } //开始进行对帐 cnt=0; //对总数 ret=DB_his_t_tif_tradeserial_get_count_by_serial_type(&temp,240001,forward_date); if(ret!=100&&ret!=0) { writelog(LOG_ERR,"DB_t_tif_tradeserial_get_count_by_serial_type err,errcode=[%d]",ret); goto LRet; } trans_count=trans_count+temp; trans_comp.localself_num=trans_count; ret=DB_his_t_tif_tradeserial_get_sum_by_serial_type(&temp, 240001, forward_date); if(ret!=100&&ret!=0) { writelog(LOG_ERR,"DB_his_t_tif_tradeserial_get_sum_by_serial_type err,errcode=[%d]",ret); goto LRet; } trans_amt=trans_amt+temp; trans_comp.localself_amt=trans_amt; ret=DB_t_tif_bank_comp_open_select_by_cur1_and_op_date(forward_date); if(ret) { writelog(LOG_ERR,"DB_t_tif_bank_comp_open_select_by_cur1_and_op_date err,errcode=[%d]",ret); goto LRet; } while(1) { ret=DB_t_tif_bank_comp_fetch_select_by_cur1(&bank_comp); if(ret) { DB_t_tif_bank_comp_close_select_by_cur1(); if(ret==DB_NOTFOUND) { if(cnt==0) { writelog(LOG_DEBUG,"There havn't record from t_tif_bankcomp table!"); break; } else break; } else goto LRet; } cnt++; bank_count=bank_count+1; bank_amt=bank_amt+atof(bank_comp.trans_money)/100.00; memset(&diff_transfer,0,sizeof(diff_transfer)); //printf("Line=[%d],cnt=[%d]\n",__LINE__,cnt); ret=DB_t_tif_tradeserial_his_read_by_bak_date_and_serial_no(forward_date,bank_comp.local_sn,&his_tradeserial); //流水表中没有记录的情况 if(ret) { if(100==ret) { strncpy(diff_transfer.op_date,forward_date,sizeof(diff_transfer.op_date)-1); strncpy(diff_transfer.bankcard,bank_comp.bankcard,sizeof(diff_transfer.bankcard)-1); diff_transfer.bank_amt=atoi(bank_comp.trans_money)/100.00; strncpy(diff_transfer.bank_sn,bank_comp.bank_sn,sizeof(diff_transfer.bank_sn)-1); diff_transfer.card_id=bank_comp.card_id; diff_transfer.local_sn=bank_comp.local_sn; diff_transfer.diff_amt=diff_transfer.bank_amt-diff_transfer.local_amt; diff_transfer.status=1; ret=DB_t_tif_diff_transfer_add(&diff_transfer); if(ret) { writelog(LOG_ERR,"DB_t_tif_diff_transfer_add error,errcode=[%d]!",ret); break; } continue; } else { writelog(LOG_ERR,"DB_t_tif_tradeserial_his_read_lock_by_c0_and_enteract_date_and_serial_no error,errcode=[%d]!",ret); break; } } //流水表中存在,但是没有入账的情况 if(his_tradeserial.serial_state!=2) { strncpy(diff_transfer.op_date,forward_date,sizeof(diff_transfer.op_date)-1); strncpy(diff_transfer.bankcard,bank_comp.bankcard,sizeof(diff_transfer.bankcard)-1); diff_transfer.bank_amt=atoi(bank_comp.trans_money)/100.00; strncpy(diff_transfer.bank_sn,bank_comp.bank_sn,sizeof(diff_transfer.bank_sn)-1); diff_transfer.card_id=bank_comp.card_id; diff_transfer.local_amt=0; diff_transfer.local_sn=bank_comp.local_sn; diff_transfer.diff_amt=diff_transfer.bank_amt-diff_transfer.local_amt; diff_transfer.status=1; ret=DB_t_tif_diff_transfer_add(&diff_transfer); if(ret) { writelog(LOG_ERR,"DB_t_tif_diff_transfer_add error,errcode=[%d]!",ret); break; } } } trans_comp.bankself_amt=bank_amt; trans_comp.bankself_num=bank_count; trans_comp.localself_amt=trans_amt; trans_comp.localself_num=trans_count; trans_comp.cmp_flag=1; strncpy(trans_comp.cmp_date,forward_date,sizeof(trans_comp.cmp_date)-1); ret=DB_t_tif_report_trans_comp_add(&trans_comp); if(ret) { writelog(LOG_DEBUG,"DB_t_tif_report_trans_comp_add error,errcode=[%d]",ret); goto LRet; } ret=db_commit(); if(ret) { writelog(LOG_ERR,"db_commit error,errcode=[%d]",ret); goto LRet; } return 0; LRet: db_rollback(); return ret; //*/ }
int Do_Transfer(BANK_TRANS_REQUEST *pBankTrans) { //char buffer[20]=""; char temp[128]=""; int ho_OpCount=0; int delay_time=0; double ho_Fee_Change=0; int ret=0; FILE *fp; TIniFile tf; int nrows=0; char path_name[128]=""; char file_name[128]=""; BANK_TRANSFER_HEAD trans_head; BANK_TRANSFER_RECORD trans_record; T_v_tif_shopdeptfee v_shopdeptfee; T_t_cif_shop t_shop; //系统正在结算,可以生成划拨文件 //sleep(1); //ret=DB_v_tif_shopdeptfee_read_sum_fee(&ho_OpCount,&ho_Fee_Change); if(ret) { writelog(LOG_ERR,"DB_v_tif_shopdeptfee_read_sum_fee err [%d]",ret); return ret; } ho_OpCount=4; ho_Fee_Change=12345.98; strcpy(path_name,"/ykt/ykt/src/bank/ftp"); sprintf(file_name,"%s/fd_%8.8s",path_name,getsysdate(NULL)); #ifdef DEBUG // strcpy(path_name,"./ftp/fd_20041009"); writelog(LOG_ALERT,"file_name2=[%s]",file_name); #endif fp = fopen(file_name,"wb"); if (fp==NULL) { writelog(LOG_ALERT,"Open indicate file fail"); return -1; } memcpy(trans_head.rmb_batch_no,BATCH_NO,sizeof(trans_head.rmb_batch_no)); fprintf(fp,"%-14.14s",trans_head.rmb_batch_no); //批量编号 memcpy(trans_head.rmb_start_seq,"000000",6); fprintf(fp,"%-6.6s",trans_head.rmb_start_seq); //填000000 trans_head.rmb_acc_status='0'; fprintf(fp,"%c",trans_head.rmb_acc_status); //记帐状态(填0) trans_head.rmb_chk_status='2'; fprintf(fp,"%c",trans_head.rmb_chk_status); //检查状态(填2) sprintf(trans_head.rmb_total_amount,"%-13d",int(ho_Fee_Change*100)); fprintf(fp,"%-13.13s",trans_head.rmb_total_amount); //总金额(11位整数2位小数,无小数点) sprintf(trans_head.rmb_total_num,"%-6d",ho_OpCount); fprintf(fp,"%-6.6s",trans_head.rmb_total_num); //总笔数 fprintf(fp,"%-13.13s",trans_head.rmb_enter_amount); //入帐金额 fprintf(fp,"%-6.6s",trans_head.rmb_enter_num); //入帐笔数 sprintf(trans_head.rmb_unit_name,"%-40s",UNIT_NAME); fprintf(fp,"%-40.40s",trans_head.rmb_unit_name); //单位名称 #ifdef DEBUG writelog(LOG_ALERT,"trans_head.rmb_unit_name=[%s]",trans_head.rmb_unit_name); #endif strcpy(trans_head.rmb_unit_account,UNIT_ACCOUNT); //sprintf(trans_head.rmb_unit_account,"%-20s"UNIT_ACCOUNT); fprintf(fp,"%-20.20s",trans_head.rmb_unit_account); //单位帐号 #ifdef DEBUG writelog(LOG_ALERT,"trans_head.rmb_unit_account=[%s]",trans_head.rmb_unit_account); #endif memcpy(trans_head.rmb_apply_date,getsysdate(NULL),sizeof(trans_head.rmb_apply_date)); fprintf(fp,"%-8.8s",trans_head.rmb_apply_date); //申请入帐日期(当天日期) //memcpy(trans_head.rmb_send_date,trans_head.rmb_apply_date,sizeof(trans_head.rmb_apply_date)); memcpy(trans_head.rmb_send_date,getsystime(NULL),sizeof(trans_head.rmb_send_date)); fprintf(fp,"%-8.8s",trans_head.rmb_send_date); //上传日期(当天日期) #ifdef DEBUG printf("[%14.14s]\n",trans_head.rmb_batch_no ); //批量编号 printf("[%6.6s]\n",trans_head.rmb_start_seq ); //填000000 printf("[%c]\n",trans_head.rmb_acc_status ); //记帐状态(填0) printf("[%c]\n",trans_head.rmb_chk_status ); //检查状态(填2) printf("[%13.13s]\n",trans_head.rmb_total_amount ); //总金额(11位整数2位小数,无小数点) printf("[%6.6s]\n",trans_head.rmb_total_num ); //总笔数 printf("[%13.13s]\n",trans_head.rmb_enter_amount ); //入帐金额(11位整数2位小数,无小数点) printf("[%6.6s]\n",trans_head.rmb_enter_num ); //入帐笔数 printf("[%40.40s]\n",trans_head.rmb_unit_name ); //单位名称 printf("[%20.20s]\n",trans_head.rmb_unit_account ); //单位帐号 printf("[%8.8s]\n",trans_head.rmb_apply_date ); //申请入帐日期(当天日期) printf("[%8.8s]\n",trans_head.rmb_send_date ); //上传日期(当天日期) #endif //写入划拨文件 // fprintf(fp,(char*)(&trans_head)); strcpy(temp,"1"); ret=DB_v_tif_shopdeptfee_open_select_by_c6_and_is_indep(temp); if(ret) { //db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ALERT,"DB_v_tif_shopdeptfee_open_select_by_c6_and_is_indep[%d]",ret); return ret; } while(1) { //初始化宿主变量 ho_Fee_Change=0; memset(&v_shopdeptfee,0,sizeof(v_shopdeptfee)); memset(&t_shop,0,sizeof(t_shop)); ret=DB_v_tif_shopdeptfee_fetch_select_by_c6(&v_shopdeptfee); if(ret) { if(DB_NOTFOUND==ret) { if(0==nrows) { writelog(LOG_ERR,"DB_v_tif_shopdeptfee_fetch_select_by_c6[%d]",ret); break; } else break; //循环记录结束 } else { //db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ERR,"DB_v_tif_shopdeptfee_fetch_select_by_c6[%d]",ret); return ret; } } ret=DB_t_cif_shop_read_by_shop_id(v_shopdeptfee.shop_id,&t_shop); if(ret) { //db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ALERT,"DB_t_cif_shop_read_by_shop_id[%d]",ret); return ret; } strcpy(trans_record.rmb_batch_no1,BATCH_NO); sprintf(trans_record.rmb_seq_no,"%d",nrows); trans_record.rmb_acc_status1='0'; trans_record.rmb_tran_kind='2'; strncpy(trans_record.rmb_cust_name,t_shop.b_act_name,sizeof(trans_record.rmb_cust_name)); strncpy(trans_record.rmb_acc_no,t_shop.b_act_id,sizeof(trans_record.rmb_acc_no)); trans_record.rmb_cb_cr='0'; sprintf(trans_record.rmb_tran_amt,"%f",ho_Fee_Change); strcpy(trans_record.rmb_cur_code,"001"); strcpy(trans_record.rmb_host_no,"00000000"); memcpy(trans_record.rmb_ret_code," ",sizeof(trans_record.rmb_ret_code)); strcpy(trans_record.rmb_acc_date,"00000000"); strcpy(trans_record.rmb_host_no1,"000000000"); strcpy(trans_record.rmb_open_branch,"0000000"); memcpy(trans_record.rmb_vcho_kind," ",sizeof(trans_record.rmb_vcho_kind)); strcpy(trans_record.rmb_vcho_bat_no,"00"); strcpy(trans_record.rmb_vcho_no,"000000000"); strcpy(trans_record.rmb_memo," "); strcpy(trans_record.rmb_tran_info," "); fprintf(fp,(char*)(&trans_record)); nrows++; } fclose(fp); memset(pBankTrans,0,BANK_TRANS_PACKLEN); //开始银行发送清算报文 memcpy( pBankTrans->TradeCode,TRADE_BANK_BALANCE, sizeof(pBankTrans->TradeCode)); //写交易代码 //写交易日期和交易时间 getsysdate(pBankTrans->TradeDate); getsystime(pBankTrans->TradeTime); //写院校代码 sprintf(pBankTrans->CustNo,"%-16s",SCHOOL_CODE); //写银行卡号-此处约定为划拨文件名 sprintf(pBankTrans->BankCardNo,"%8.8s",getsysdate(NULL)); //写校验mac码 //写校验mac码----林钦此处应该用银行回传回来的动态密钥做mac密钥,此处改过来了 generate_mac((char*)pBankTrans,sizeof(pBankTrans),pBankTrans->MAC); //ANSIX99(mac_key,(char*)(&BankTransPak), BANK_TRANS_PACKLEN-LEN_MAC,BankTransPak.MAC); TRACE_BANK_TRANS(pBankTrans,"send transfer package"); //发送数据到银行并同时接收银行数据,此处不判断返回的mac校验 ret=send_to_and_recv_from_bank((char*)pBankTrans,BANK_TRANS_PACKLEN, (char*)pBankTrans,BANK_TRANS_PACKLEN,delay_time); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,errcode=[%d]",ret); return E_TRANS_BANK_NOANSWER; } TRACE_BANK_TRANS(pBankTrans,"recv transfer package"); //农行暂时未校验该mac,所以暂时屏蔽掉 ret=check_mac((char*)pBankTrans,BANK_TRANS_PACKLEN); if(ret) { writelog(LOG_ERR,"Receive data mac verify error,error code is [%d] ",ret); //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_RECVERR); return E_TRANS_BANK_RECVERR; } writelog(LOG_INFO,"Congratulation, transer succeed!"); return 0; }
int UpdBadCard(TRUSERID *handle,int *pRetCode,char *szMsg) { int ret=0; CAccTrans& ats=CAccTrans::GetInst(); TRANS& trans=ats.trans; T_t_card tCard; memset(&tCard,0,sizeof(tCard)); if(trans.cardno<1) { ret=DB_t_card_read_by_cardphyid_and_status(trans.cardphyid,"1",&tCard); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDPHYID,trans.cardphyid); else return E_DB_CARD_R; } trans.cardno=tCard.cardno; } ret=DB_t_card_read_lock_by_c0_and_cardno(trans.cardno,&tCard); if(ret) { writelog(LOG_ERR,"cardno[%d]",trans.cardno); if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno); else return E_DB_CARD_R; } trans.custid=tCard.custid; trans.cardtype=tCard.cardtype; trans.feetype=tCard.feetype; if(tCard.status[0]!=STATUS_NORMAL) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_LOGOUT,trans.cardno); } /* if('1'==tCard.frozeflag[0]) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_FREEZE,trans.cardno); } */ if('1'==tCard.lossflag[0]) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_LOST,trans.cardno); } //比较卡物理ID是否相同 if(strcmp(tCard.cardphyid,trans.cardphyid)!=0) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_PHYNO_DIFFER,trans.cardphyid,tCard.cardphyid); } if('1'!=tCard.badflag[0]) { return ERRINFO(E_CARD_NOBADRECORD,trans.cardno); } if((CARDBADFLAG_CARDBAL!=tCard.badtype[0])&&(CARDBADFLAG_ACCBAL!=tCard.badtype[0])) { DB_t_card_free_lock_by_c0(); ERRTIP("该卡已经登记为卡片损坏,请检查该卡是否完全损坏,如果没有损坏,请修改该卡损坏类型为余额错误类型再来修复"); return E_COMMON_ERR; } char badtype=tCard.badtype[0]; char enddate[9]={0}; ret=calcEndDate(tCard.baddate,ats.sysPara.iRenewCardDayCnt,enddate); if(ret) { DB_t_card_free_lock_by_c0(); return ret; } if(strncmp(enddate,trans.transdate,8)>0) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_BADCARD_RECORDDATE_NOTREACH,enddate); } tCard.badflag[0]='0'; tCard.badtype[0]=0; tCard.baddate[0]=0; des2src(tCard.lastsaved,trans.sysdatetime); ret=DB_t_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"cardno[%d]",tCard.cardno); if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno); else return E_DB_CARD_U; } T_t_customer customer; memset(&customer,0,sizeof(customer)); if(tCard.custid) { ret=DB_t_customer_read_by_custid(tCard.custid,&customer); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CUSTOMER,tCard.custid); else return E_DB_CUSTOMER_R; } } T_t_transdtl transdtl; memset(&transdtl,0,sizeof(transdtl)); T_t_account tCardAccount; memset(&tCardAccount,0,sizeof(tCardAccount)); ret=DB_t_account_read_lock_by_c0_and_accno(tCard.accno,&tCardAccount); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDACCNO,tCard.accno); else return E_DB_ACCOUNT_R; } if(tCardAccount.status[0]!=STATUS_NORMAL) { DB_t_account_free_lock_by_c0(); return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno); } if(CARDBADFLAG_ACCBAL==badtype) { //以卡修库 if(amtcmp(tCardAccount.balance,trans.cardbefbal)<0) { //在卡比库大的时候不允许更新 DB_t_account_free_lock_by_c0(); ERRTIP("卡余额比账户余额大,不允许以卡修库"); return E_COMMON_ERR; } if(amtcmp(tCardAccount.availbal,trans.cardbefbal)==0) { DB_t_account_free_lock_by_c0(); ERRTIP("卡余额与账户余额已经相等,不需要以卡修库"); return E_COMMON_ERR; } //库余额错误,以卡余额为准,但必须卡余额小于库余额 //更新账户余额与卡余额一致 trans.cardaftbal=trans.cardbefbal; tCardAccount.cardbal= trans.cardaftbal; tCardAccount.availbal+=tCardAccount.subsidybal; tCardAccount.subsidybal=0; tCardAccount.dpscnt = trans.aftdpscnt; tCardAccount.paycnt = trans.aftpaycnt; strcpy(tCardAccount.transtime,trans.sysdatetime); ret=DB_t_account_update_lock_by_c0(&tCardAccount); if(ret) { return E_DB_ACCOUNT_U; } //考虑消费流水丢失的情况,走长款处理 trans.cardflag=0;//一定要设为无卡 trans.transamt=D4U5(tCardAccount.availbal-trans.cardbefbal); trans.inputamt=trans.transamt; trans.unusedamt = trans.inputamt; trans.fundtype=0; des2src(trans.cardaccno,tCardAccount.accno); ats.trans.transtype=TRANSTYPE_MORE_CARDBALINCOME; ret=ats.DoTransByTransType(); if(ret) return ret; if(ats.trans.unusedamt>0) return E_INPUT_AMT; if(ats.trans.unusedamt<0) return E_AMT_LACK; } else { if(amtcmp(tCardAccount.balance,0)<0) { ERRTIP("卡余额不能小于0,该卡账户余额为%.2lf",tCardAccount.balance); return E_COMMON_ERR; } //卡余额错误,把库余额写入卡余额 //更新卡余额与账户余额一致 tCardAccount.availbal+=tCardAccount.subsidybal; tCardAccount.subsidybal=0; tCardAccount.cardbal= tCardAccount.balance; trans.cardaftbal=tCardAccount.cardbal; if(amtcmp(trans.cardaftbal,trans.cardbefbal)>0) { tCardAccount.dpscnt=trans.dpscnt+1; transdtl.cardcnt = tCardAccount.dpscnt; transdtl.transflag = TF_DPS; } else if(amtcmp(trans.cardaftbal,trans.cardbefbal)<0) { tCardAccount.paycnt = trans.paycnt+1; transdtl.cardcnt=tCardAccount.paycnt; transdtl.transflag = TF_PAY; ret=UpdateCardBitmap(trans.cardno,transdtl.cardcnt,CARDBITMAPTYPE_SYS_ONLINE); if(ret) return ret; } strcpy(tCardAccount.transtime,trans.sysdatetime); ret=DB_t_account_update_lock_by_c0(&tCardAccount); if(ret) { return E_DB_ACCOUNT_U; } } ret=UpdAllUnGetSubsidy(trans.cardno); if(ret) return ret; des2src(transdtl.transdate,trans.transdate); des2src(transdtl.transtime,trans.transtime); des2src(transdtl.accdate,trans.accdate); des2src(transdtl.acctime,trans.acctime); transdtl.termid=trans.termid; transdtl.termseqno=trans.termseqno; transdtl.transcode=trans.transcode; transdtl.paytype=trans.fundtype; des2src(transdtl.voucherno,trans.voucherno); transdtl.cardno=trans.cardno; transdtl.purseno=trans.purseno; transdtl.cardbefbal=trans.cardbefbal; transdtl.cardaftbal=trans.cardaftbal; transdtl.managefee=trans.totalfeeamt; transdtl.amount=trans.totaltransamt; transdtl.custid=tCardAccount.custid; des2src(transdtl.custname,tCardAccount.accname); des2src(transdtl.opercode,trans.opercode); transdtl.status[0]=DTLSTATUS_SUCCESS; des2src(transdtl.showcardno,tCard.showcardno); GetStuempnoByCustid(transdtl.custid,transdtl.stuempno); ret=DB_t_transdtl_add(&transdtl); if(ret) { if(DB_REPEAT==ret) return E_DB_TRANSDTL_E; else return E_DB_TRANSDTL_I; } ST_CPACK aPack; ST_PACK *outPack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL1,F_LSAFE_LEVEL2,F_LVOL4,F_LVOL5, F_SALL_NAME,F_SPAGER,F_SCERT_NO, F_SEMAIL2,F_SMARKET_CODE,F_SMARKET_CODE2,F_SDATE0, F_LVOL0,F_STX_PWD,F_LVOL8,F_LVOL6, F_SORDER0,F_SEMP,F_LVOL11,F_LVOL12, F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_STIME3,F_SDATE3,0); outPack->lvol1=customer.custid; outPack->lsafe_level2=customer.custtype; outPack->lvol5=tCard.feetype; strncpy(outPack->sall_name,customer.custname,8); des2src(outPack->spager,customer.stuempno); des2src(outPack->scert_no,customer.deptcode); des2src(outPack->smarket_code2,customer.idtype); des2src(outPack->semail2,customer.idno); des2src(outPack->smarket_code,customer.sex); des2src(outPack->sdate0,tCard.expiredate); outPack->lvol0=tCard.cardno; outPack->lvol8=D4U5(transdtl.cardaftbal*100,0); outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0); outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0); outPack->lvol6=tCardAccount.paycnt; // outPack->lvol4=tCardAccount.subsidyno; des2src(outPack->sorder0,tCard.showcardno); des2src(outPack->sdate3,ats.trans.accdate); des2src(outPack->stime3,ats.trans.acctime); des2src(outPack->semp,trans.opercode); outPack->lwithdraw_flag=trans.termid; outPack->lserial1=trans.termseqno; des2src(outPack->vsmess,ats.remark.c_str()); PutRow(handle,outPack,pRetCode,szMsg); return 0; }
int send_to_and_recv_from_bank(char* pSend, int send_len,char* pRecv,int recv_len,int delay_time) { struct SockNode SockNode; char bank_ip[20]=""; int bank_port=0; //int delay_time=0; int ret=0; TIniFile tf; if (!tf.Open(TRANS_INI_FILE)) { writelog(LOG_ERR,"Cann't open ini file,file=[%s]\n",TRANS_INI_FILE); return E_TRANS_UNKNOW_ERROR; } tf.ReadString("BANK", "BANK_IP", "127.0.0.1", bank_ip,sizeof(bank_ip)); bank_port=tf.ReadInt("BANK", "BANK_PORT",3501); if(0==delay_time) delay_time=tf.ReadInt("BANK", "BANK_DELAY_TIME", 3000); tf.Close(); #ifdef DEBUG //printf("BANK_IP=[%s],BANK_PORT[%d],DELAY_TIME[%d]\n",bank_ip,bank_port,delay_time); #endif //连接银行 ret=SockNode.hSock.ConnectTcp(bank_ip, bank_port,30); if(!ret) { writelog(LOG_ERR,"Connect to bank error,error code is [%d],bank_ip[%s],port[%d] ",ret,bank_ip,bank_port); return E_TRANS_BANK_NETERR; } //发送数据到银行 ret=SockNode.hSock.Send(pSend, send_len); if (ret<0) { // 发送时,端口有问题,包括被关闭 writelog(LOG_ERR,"Send to bank error,ret = %ret, error code is [%d] ",ret, errno); return E_TRANS_BANK_NETERR; } else if (0==ret) { // 不应该出现这种情况 writelog(LOG_ERR,"Send to bank error,CTcpSocket.Send should not return this error,error code is[%d]!\n",errno); return E_TRANS_BANK_NETERR; } system("sleep 1"); //接收银行返回信息 ret= SockNode.hSock.Recv(pRecv,recv_len,delay_time); if (ret!=recv_len) { writelog(LOG_ERR,"Receive from bank error,ret= %ret, error code is [%d] ",ret, errno); return E_TRANS_BANK_NOANSWER; // 接收时候出错,或超时 } SockNode.hSock.Close(); return 0; }
int UpdCardExpireDate(char *cardexpiredate,TRUSERID *handle,int *pRetCode,char *szMsg) { int ret=0; CAccTrans& ats=CAccTrans::GetInst(); TRANS& trans=ats.trans; T_t_card tCard; memset(&tCard,0,sizeof(tCard)); ret=DB_t_card_read_lock_by_c0_and_cardno(trans.cardno,&tCard); if(ret) { writelog(LOG_ERR,"cardno[%d]",trans.cardno); if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno); else return E_DB_CARD_R; } trans.custid=tCard.custid; trans.cardtype=tCard.cardtype; trans.feetype=tCard.feetype; if(tCard.status[0]!=STATUS_NORMAL) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_LOGOUT,trans.cardno); } if('1'==tCard.frozeflag[0]) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_FREEZE,trans.cardno); } if('1'==tCard.lossflag[0]) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_LOST,trans.cardno); } //比较卡物理ID是否相同 if(strcmp(tCard.cardphyid,trans.cardphyid)!=0) { DB_t_card_free_lock_by_c0(); return ERRINFO(E_CARD_PHYNO_DIFFER,trans.cardphyid,tCard.cardphyid); } ret=IsInvalidDateTime(cardexpiredate,"YYYYMMDD"); if(ret) return ret; if(strncmp(trans.accdate,cardexpiredate,8)>=0) return ERRINFO(E_CARD_EXPIREDATE,cardexpiredate,trans.accdate); des2src(tCard.expiredate,cardexpiredate); des2src(tCard.lastsaved,trans.sysdatetime); ret=DB_t_card_update_lock_by_cur(&tCard); if(ret) { writelog(LOG_ERR,"cardno[%d]",tCard.cardno); if(DB_NOTFOUND==ret) return E_NOTEXIST_CARDNO; else return E_DB_CARD_U; } T_t_customer customer; memset(&customer,0,sizeof(customer)); if(tCard.custid) { ret=DB_t_customer_read_lock_by_cur_and_custid(tCard.custid,&customer); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CUSTOMER,tCard.custid); else return E_DB_CUSTOMER_R; } if(strncmp(customer.outdate,cardexpiredate,8)!=0) { des2src(customer.outdate,cardexpiredate); des2src(tCard.lastsaved,trans.sysdatetime); ret=DB_t_customer_update_lock_by_cur(&customer); if(ret) { return E_DB_CUSTOMER_U; } } else { DB_t_customer_free_lock_cur(); } } T_t_account tCardAccount; memset(&tCardAccount,0,sizeof(tCardAccount)); ret=DB_t_account_read_by_accno(tCard.accno,&tCardAccount); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_ACCNO,tCard.accno); else return E_DB_ACCOUNT_R; } if(tCardAccount.status[0]!=STATUS_NORMAL) { return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno); } trans.custid=tCard.custid; T_t_transdtl transdtl; memset(&transdtl,0,sizeof(transdtl)); des2src(transdtl.transdate,trans.transdate); des2src(transdtl.transtime,trans.transtime); strcpy(transdtl.accdate,trans.accdate); strcpy(transdtl.acctime,trans.acctime); transdtl.termid=trans.termid; transdtl.termseqno=trans.termseqno; transdtl.transcode=trans.transcode; transdtl.paytype=trans.fundtype; des2src(transdtl.voucherno,trans.voucherno); transdtl.cardno=trans.cardno; transdtl.purseno=trans.purseno; transdtl.cardbefbal=trans.cardbefbal; // transdtl.cardcnt=trans.cardcnt; transdtl.cardaftbal=trans.cardaftbal; transdtl.managefee=trans.totalfeeamt; transdtl.amount=trans.totaltransamt; transdtl.custid=tCardAccount.custid; des2src(transdtl.showcardno,tCard.showcardno); des2src(transdtl.custname,customer.custname); des2src(transdtl.opercode,trans.opercode); transdtl.status[0]=DTLSTATUS_SUCCESS; GetStuempnoByCustid(transdtl.custid,transdtl.stuempno); ret=DB_t_transdtl_add(&transdtl); if(ret) { if(DB_REPEAT==ret) return E_DB_TRANSDTL_E; else return E_DB_TRANSDTL_I; } ST_CPACK aPack; ST_PACK *outPack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL1,F_LSAFE_LEVEL2,F_LVOL4,F_LVOL5, F_SALL_NAME,F_SPAGER,F_SCERT_NO, F_SEMAIL2,F_SMARKET_CODE,F_SMARKET_CODE2,F_SDATE0, F_LVOL0,F_STX_PWD,F_LVOL8,F_LVOL6, F_SORDER0,F_SEMP,F_LVOL11,F_LVOL12, F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_STIME3,F_SDATE3,0); outPack->lvol1=customer.custid; outPack->lsafe_level2=customer.custtype; outPack->lvol5=tCard.feetype; des2src(outPack->sall_name,customer.custname); des2src(outPack->spager,customer.stuempno); des2src(outPack->scert_no,customer.deptcode); des2src(outPack->smarket_code2,customer.idtype); des2src(outPack->semail2,customer.idno); des2src(outPack->smarket_code,customer.sex); des2src(outPack->sdate0,tCard.expiredate); outPack->lvol0=tCard.cardno; outPack->lvol8=D4U5(transdtl.cardaftbal*100,0); outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0); outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0); outPack->lvol6=tCardAccount.paycnt; // outPack->lvol4=tCardAccount.subsidyno; des2src(outPack->sorder0,tCard.showcardno); des2src(outPack->sdate3,ats.trans.accdate); des2src(outPack->stime3,ats.trans.acctime); des2src(outPack->semp,trans.opercode); outPack->lwithdraw_flag=trans.termid; outPack->lserial1=trans.termseqno; // des2src(outPack->vsmess,ats.remark.c_str()); PutRow(handle,outPack,pRetCode,szMsg); return 0; }
int UpdCardBaseInfo(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; CAccTrans& ats=CAccTrans::GetInst(); TRANS& trans=ats.trans; T_t_card tCard; memset(&tCard,0,sizeof(tCard)); if(trans.cardno<1) { ret=DB_t_card_read_by_cardphyid_and_status(trans.cardphyid,"1",&tCard); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDPHYID,trans.cardphyid); else return E_DB_CARD_R; } trans.cardno=tCard.cardno; } ret=DB_t_card_read_by_cardno(trans.cardno,&tCard); if(ret) { writelog(LOG_ERR,"cardno[%d]",trans.cardno); if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDNO,trans.cardno); else return E_DB_CARD_R; } trans.custid=tCard.custid; trans.cardtype=tCard.cardtype; trans.feetype=tCard.feetype; if(tCard.status[0]!=STATUS_NORMAL) { return ERRINFO(E_CARD_LOGOUT,trans.cardno); } if('1'==tCard.frozeflag[0]) { return ERRINFO(E_CARD_FREEZE,trans.cardno); } if('1'==tCard.lossflag[0]) { return ERRINFO(E_CARD_LOST,trans.cardno); } T_t_customer customer; memset(&customer,0,sizeof(customer)); if(tCard.custid) { ret=DB_t_customer_read_by_custid(tCard.custid,&customer); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CUSTOMER,tCard.custid); else return E_DB_CUSTOMER_R; } } T_t_account tCardAccount; memset(&tCardAccount,0,sizeof(tCardAccount)); ret=DB_t_account_read_lock_by_c0_and_accno(tCard.accno,&tCardAccount); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_ACCNO,tCard.accno); else return E_DB_ACCOUNT_R; } if(tCardAccount.status[0]!=STATUS_NORMAL) { DB_t_account_free_lock_by_c0(); return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno); } if(amtcmp(rPack->damt11,0)>=0) { tCardAccount.singlemaxamt=rPack->damt11; if(amtcmp(tCardAccount.singlemaxamt,500)>0) { DB_t_account_free_lock_by_c0(); ERRTIP("单次消费限额不能超过500元"); return E_COMMON_ERR; } } if(amtcmp(rPack->damt12,0)>=0) { tCardAccount.daycostmaxamt=rPack->damt12; if(amtcmp(tCardAccount.daycostmaxamt,10000)>0) { DB_t_account_free_lock_by_c0(); ERRTIP("日累计消费限额不能超过10000元"); return E_COMMON_ERR; } } ret=DB_t_account_update_lock_by_c0(&tCardAccount); if(ret) { if(DB_NOTFOUND==ret) return ERRINFO(E_CARDNO_PURSENO_NOACCNO,trans.cardno,trans.purseno); else return E_DB_ACCOUNT_U; } T_t_transdtl transdtl; memset(&transdtl,0,sizeof(transdtl)); des2src(transdtl.transdate,trans.transdate); des2src(transdtl.transtime,trans.transtime); strcpy(transdtl.accdate,trans.accdate); strcpy(transdtl.acctime,trans.acctime); transdtl.termid=trans.termid; transdtl.termseqno=trans.termseqno; transdtl.transcode=trans.transcode; transdtl.paytype=trans.fundtype; des2src(transdtl.voucherno,trans.voucherno); transdtl.cardno=trans.cardno; transdtl.purseno=trans.purseno; transdtl.cardbefbal=trans.cardbefbal; // transdtl.cardcnt=trans.cardcnt; transdtl.cardaftbal=trans.cardbefbal; transdtl.managefee=trans.totalfeeamt; transdtl.amount=trans.totaltransamt; transdtl.custid=trans.custid; des2src(transdtl.custname,customer.custname); des2src(transdtl.opercode,trans.opercode); transdtl.status[0]=DTLSTATUS_SUCCESS; des2src(transdtl.showcardno,tCard.showcardno); GetStuempnoByCustid(transdtl.custid,transdtl.stuempno); ret=DB_t_transdtl_add(&transdtl); if(ret) { if(DB_REPEAT==ret) return E_DB_TRANSDTL_E; else return E_DB_TRANSDTL_I; } ST_CPACK aPack; ST_PACK *outPack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL1,F_LSAFE_LEVEL2,F_LVOL4,F_LVOL5,F_LVOL6, F_SALL_NAME,F_SPAGER,F_SCERT_NO,F_SHOLDER_AC_NO, F_SEMAIL2,F_SMARKET_CODE,F_SMARKET_CODE2,F_SDATE0,F_SNOTE, F_SSTAT_TYPE,F_SSTAT_TYPE2,F_SNATION_CODE,F_SBRANCH_CODE0, F_LVOL0,F_STX_PWD,F_LVOL8,F_LVOL11,F_LVOL12, F_SORDER0,F_SORDER1,F_SORDER2,F_SDATE3,F_SEMP, F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,F_STIME3,0); outPack->lvol1=customer.custid; outPack->lsafe_level2=customer.custtype; outPack->lvol5=tCard.feetype; des2src(outPack->sall_name,customer.custname); des2src(outPack->spager,customer.stuempno); des2src(outPack->smarket_code2,customer.idtype); des2src(outPack->scert_no,customer.deptcode); des2src(outPack->semail2,customer.idno); des2src(outPack->smarket_code,customer.sex); des2src(outPack->sdate0,tCard.expiredate); outPack->lvol0=tCard.cardno; // des2src(outPack->stx_pwd,cardpwd); des2src(outPack->sorder0,tCard.showcardno); strcpy(outPack->snote,CARD_STRUCT_VERSION); //制卡版本号 strcpy(outPack->sorder1,CARD_REGISTER_PUBLISH_CODE); //发卡注册标识号 strcpy(outPack->sorder2,CARD_REGISTER_SERVICE_CODE); //服务注册标识号 outPack->lvol8=D4U5(ats.trans.cardaftbal*100,0); outPack->lvol11=D4U5(tCardAccount.singlemaxamt*100,0); outPack->lvol12=D4U5(tCardAccount.daycostmaxamt*100,0); sprintf(outPack->sholder_ac_no,"%d",customer.custid); //客户号 des2src(outPack->sstat_type,customer.idtype); //证件类型 des2src(outPack->snation_code,customer.country); //国籍 des2src(outPack->sstat_type2,customer.nation); //民族 des2src(outPack->sbranch_code0,customer.areacode); //院校代码 des2src(outPack->sdate3,ats.trans.accdate); des2src(outPack->stime3,ats.trans.acctime); des2src(outPack->semp,trans.opercode); outPack->lwithdraw_flag=trans.termid; outPack->lserial1=trans.termseqno; outPack->lvol0=tCard.cardno; outPack->lvol6=tCardAccount.paycnt; // outPack->lvol4=tCardAccount.subsidyno; des2src(outPack->vsmess,"更新卡信息成功"); PutRow(handle,outPack,pRetCode,szMsg); return 0; }
int DoLossCard(int cardno) { int ret=0; T_t_card tCard; CAccTrans *pAccTrans=CAccTrans::getInstance(); TRANS& trans=pAccTrans->trans; memset(&tCard,0,sizeof(tCard)); ret=DB_t_card_read_lock_by_cur_and_cardno(cardno,&tCard); if (ret) { writelog(LOG_ERR,"cardno[%d]",cardno); if (DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDNO,cardno); else return E_DB_CARD_R; } des2src(trans.showcardno,tCard.showcardno); if(tCard.status[0]!=STATUS_NORMAL) { DB_t_card_free_lock_by_cur(); return ERRINFO(E_CARD_LOGOUT,trans.cardno); } if('1'==tCard.frozeflag[0]) { DB_t_card_free_lock_by_cur(); return ERRINFO(E_CARD_FREEZE,trans.cardno); } if('1'==tCard.lossflag[0]) { DB_t_card_free_lock_by_cur(); return ERRINFO(E_CARD_LOST,trans.cardno); } if('1'==tCard.badflag[0]) { DB_t_card_free_lock_by_cur(); return ERRINFO(E_CARD_BADRECORD,trans.cardno); } //去掉锁定标志 tCard.lockflag[0]='0'; tCard.lockdate[0]=0; tCard.lossflag[0]='1'; des2src(tCard.lossdate,trans.transdate); ret=getCardVerNo(tCard.cardverno); if(ret) { DB_t_card_free_lock_by_cur(); return ret; } des2src(tCard.lastsaved,trans.sysdatetime); ret=DB_t_card_update_lock_by_cur(&tCard); if (ret) { writelog(LOG_ERR,"cardno[%d]",tCard.cardno); if (DB_NOTFOUND==ret) return E_NOTEXIST_CARDNO; else return E_DB_CARD_U; } T_t_customer customer; memset(&customer,0,sizeof(customer)); if (tCard.custid) { ret=DB_t_customer_read_by_custid(tCard.custid,&customer); if (ret) { if (DB_NOTFOUND==ret) return E_NOTEXIST_CUSTOMER; else return E_DB_CUSTOMER_R; } trans.custid=tCard.custid; des2src(trans.custname,customer.custname); des2src(trans.stuempno,customer.stuempno); } //修改以前的解挂记录为删除状态 UpdCardVerStatus(cardno,CARDVERTYPE_CARDUNLOSS); //更新系统黑名单最大版本号 ret=SetSysParaVal(SYSPARA_MAXBLACKCARDVERNO,tCard.cardverno); if(ret) { return ret; } T_t_cardver cardver; memset(&cardver,0,sizeof(cardver)); cardver.cardno=tCard.cardno; des2src(cardver.accdate,pAccTrans->trans.accdate); cardver.termid=trans.termid; cardver.termseqno=trans.termseqno; cardver.cardno=tCard.cardno; des2src(cardver.cardphyid,tCard.cardphyid); des2src(cardver.stuempno,customer.stuempno); cardver.cardvertype=CARDVERTYPE_CARDLOSS; cardver.adddelflag=ADDDELFLAG_ADD; cardver.status[0]=STATUS_NORMAL; des2src(cardver.cardverno,tCard.cardverno); ret=DB_t_cardver_add(&cardver); if (ret) { if (DB_REPEAT==ret) return E_DB_CARDVER_E; else return E_DB_CARDVER_I; } des2src(trans.summary,cardver.cardverno); char broadcastblkflag[20]={0}; ret=GetSysParaVal(SYSPARA_BROADCASTBLKLIST,broadcastblkflag); if(ret) { if(DB_NOTFOUND==ret) return 0; else return E_DB_SYSKEY_R; } if(broadcastblkflag[0]!='1') return 0; T_t_msglist tMsgList; memset(&tMsgList,0,sizeof(tMsgList)); AddXmlItemInt(tMsgList.reqdata, XML_KEY_CARDID,tCard.cardno); AddXmlItemStr(tMsgList.reqdata, XML_KEY_VERNUM,tCard.cardverno); AddXmlItemInt(tMsgList.reqdata, XML_KEY_ADDDELSIGN,0); //增删标志 tMsgList.funcno = 930005; tMsgList.pfuncno = 846307; tMsgList.msglevel = MESLIST_PRIORITY_REALTIME; tMsgList.msgtype = MESLIST_TYPE_ORDER; ret=AddMsgLst(&tMsgList); if(ret) { writelog(LOG_ERR,"AddMsgLst err[%d]",ret); return ret; } return 0; }
int DoUnlossCard(int cardno) { int ret=0; T_t_card tCard; CAccTrans *pAccTrans=CAccTrans::getInstance(); TRANS& trans=pAccTrans->trans; trans.transcode=TC_CARDUNLOSS; memset(&tCard,0,sizeof(tCard)); ret=DB_t_card_read_lock_by_cur_and_cardno(cardno,&tCard); if (ret) { writelog(LOG_ERR,"cardno[%d]",cardno); if (DB_NOTFOUND==ret) return ERRINFO(E_NOTEXIST_CARDNO,cardno); else return E_DB_CARD_R; } des2src(trans.showcardno,tCard.showcardno); if(tCard.status[0]!=STATUS_NORMAL) { DB_t_card_free_lock_by_cur(); return ERRINFO(E_CARD_LOGOUT,trans.cardno); } // if('1'!=tCard.lossflag[0]) // { // DB_t_card_free_lock_by_cur(); // return ERRINFO(E_CARDNO_NOLOST,trans.cardno); // } if('1'==tCard.frozeflag[0]) { DB_t_card_free_lock_by_cur(); ERRTIP("请先解冻后再解挂"); return ERRINFO(E_CARD_FREEZE,trans.cardno); } if('1'==tCard.badflag[0]) { DB_t_card_free_lock_by_cur(); return ERRINFO(E_CARD_BADRECORD,trans.cardno); } //判断是否存在过渡临时卡 if(CARDTYPE_TEMP!=tCard.cardtype) { ret=IsExistNormalTmpCardByCustid(tCard.custid); if(ret) { DB_t_card_free_lock_by_cur(); if(DB_EXIST==ret) { //锁定该卡,该卡只能销户 ERRTIP("该客户存在卡状态正常的过渡临时卡,请先退掉过卡状态正常的渡临时卡再解挂"); return E_EXIST_NORMALCARD; } else return ret; } } else { //检查是否存在其他正常的卡 ret=IsExistOtherNormalCardByCustid(tCard.custid,tCard.cardno); if(ret) { if(DB_EXIST==ret) { //锁定该卡,该卡只能销户 TIPINFO("该客户存在卡状态正常的其他卡,该卡解挂后将不能再使用,请解挂后注销该卡!"); tCard.lockflag[0]='1'; des2src(tCard.lockdate,trans.accdate); } else { DB_t_card_free_lock_by_cur(); return ret; } } } tCard.lossflag[0]='0'; tCard.lossdate[0]=0; ret=getCardVerNo(tCard.cardverno); if (ret) { DB_t_card_free_lock_by_cur(); return ret; } des2src(tCard.lastsaved,trans.sysdatetime); ret=DB_t_card_update_lock_by_cur(&tCard); if (ret) { writelog(LOG_ERR,"cardno[%d]",tCard.cardno); if (DB_NOTFOUND==ret) return E_NOTEXIST_CARDNO; else return E_DB_CARD_U; } T_t_customer customer; memset(&customer,0,sizeof(customer)); if (tCard.custid) { ret=DB_t_customer_read_by_custid(tCard.custid,&customer); if (ret) { if (DB_NOTFOUND==ret) return E_NOTEXIST_CUSTOMER; else return E_DB_CUSTOMER_R; } trans.custid=tCard.custid; des2src(trans.custname,customer.custname); des2src(trans.stuempno,customer.stuempno); } UpdCardVerStatus(cardno,CARDVERTYPE_CARDLOSS); if('1'==tCard.lockflag[0]) { //不下发名单 strcpy(trans.summary,"000101010101"); return 0; } //更新系统黑名单最大版本号 ret=SetSysParaVal(SYSPARA_MAXBLACKCARDVERNO,tCard.cardverno); if(ret) { return ret; } T_t_cardver cardver; memset(&cardver,0,sizeof(cardver)); cardver.cardno=tCard.cardno; des2src(cardver.accdate,pAccTrans->trans.accdate); cardver.termid=trans.termid; cardver.termseqno=trans.termseqno; cardver.cardno=tCard.cardno; des2src(cardver.cardphyid,tCard.cardphyid); des2src(cardver.stuempno,customer.stuempno); cardver.cardvertype=CARDVERTYPE_CARDUNLOSS; cardver.adddelflag=ADDDELFLAG_DEL; cardver.status[0]=STATUS_NORMAL; des2src(cardver.cardverno,tCard.cardverno); ret=DB_t_cardver_add(&cardver); if (ret) { if (DB_REPEAT==ret) return E_DB_CARDVER_E; else return E_DB_CARDVER_I; } des2src(trans.summary,cardver.cardverno); char broadcastblkflag[20]={0}; ret=GetSysParaVal(SYSPARA_BROADCASTBLKLIST,broadcastblkflag); if(ret) { if(DB_NOTFOUND==ret) return 0; else return E_DB_SYSKEY_R; } if(broadcastblkflag[0]!='1') return 0; T_t_msglist tMsgList; memset(&tMsgList,0,sizeof(tMsgList)); AddXmlItemInt(tMsgList.reqdata, XML_KEY_CARDID,tCard.cardno); AddXmlItemStr(tMsgList.reqdata, XML_KEY_VERNUM,tCard.cardverno); AddXmlItemInt(tMsgList.reqdata, XML_KEY_ADDDELSIGN,1); //增删标志 tMsgList.funcno = 930005; tMsgList.pfuncno = 846307; tMsgList.msglevel = MESLIST_PRIORITY_REALTIME; tMsgList.msgtype = MESLIST_TYPE_ORDER; ret=AddMsgLst(&tMsgList); if(ret) { writelog(LOG_ERR,"AddMsgLst err[%d]",ret); return ret; } return 0; }
static int do_process_trade(trade_param_t * param) { int ret; T_t_cif_shop shop; T_t_aif_account account; void * pTmp; InAcc * IA; memset(&shop,0,sizeof shop); ret = DB_t_cif_shop_read_by_shop_id(param->out_shop_id,&shop); //writelog(LOG_DEBUG,"trade shop id[%d]",param->out_shop_id); if(ret) { if(DB_NOTFOUND == ret) return E_DB_SHOP_N; else return E_DB_SHOP_R; } memset(&account,0,sizeof account); ret = DB_t_aif_account_read_by_customer_id_and_act_type( shop.cut_id,ACCTYPE_SHOPMAIN,&account); if(ret) { if(DB_NOTFOUND == ret) return E_FAN_ACC_NOT_EXISTS; return E_DB_ACCOUNT_R; } //writelog(LOG_DEBUG,"对叶子商户[%d]进行解款[%.2lf]金额[%.2lf]", // param->out_shop_id,account.last_bala,param->remain_balance); if(amtcmp(account.last_bala,0) <= 0) { // 商户无余额不处理 return 0; } // 检查是否已经解款完成 if(amtcmp(param->remain_balance,0) == 0) { //只计算商户余额 param->free_balance += account.last_bala; return 0; } // 计算交易金额 if(amtcmp(param->remain_balance,account.last_bala) >= 0) { param->trade_fee = account.last_bala; } else { param->trade_fee = param->remain_balance; } // 入账 IA = param->pIA; //pTmp = IA->pVoidPointer; memset(IA,0,sizeof(InAcc)); des2src(IA->sArrInActno[0],account.account_id); IA->pVoidPointer = pTmp; ret = process(IA,param); if(ret) { writelog(LOG_ERR,"process account failed,ret [%d]shopid[%d]subindex[%d],tradefee[%f]", ret,param->out_shop_id,param->index,param->trade_fee); return ret; } // 更新账户余额 // 入账之后账户余额已经被更新,需要重新读取 memset(&account,0,sizeof account); ret = DB_t_aif_account_read_lock_by_c5_and_customer_id_and_act_type( shop.cut_id,ACCTYPE_SHOPMAIN,&account); if(ret) { if(DB_NOTFOUND == ret) return E_FAN_ACC_NOT_EXISTS; return E_DB_ACCOUNT_R; } account.last_bala -= param->trade_fee; account.last_freebala -= param->trade_fee; if(amtcmp(account.last_bala,0)< 0) { account.last_bala = 0.0; account.last_freebala = 0.0; } else { param->free_balance += account.last_bala; } ret = DB_t_aif_account_update_lock_by_c5(&account); if(ret) { writelog(LOG_ERR,"更新商户账户余额失败ret[%d]",ret); if(DB_NOTFOUND == ret) return E_DB_ACCOUNT_N; return E_DB_ACCOUNT_R; } DB_t_aif_account_free_lock_c5(); writelog(LOG_DEBUG,"商户[%d]解款金额[%.2lf]余额[%.2lf]" ,shop.shop_id,param->trade_fee,account.last_bala); return ret; }