cisproc.cpp
来自「液晶电视完整代码可实现人机界面」· C++ 代码 · 共 2,145 行 · 第 1/5 页
CPP
2,145 行
/*******************************************************************************函数说明:处理recv_data表数据*______________________________________________________________________________*版本号 |修改时间 |修改说明*------------------------------------------------------------------------------*v1.01 |20070717 |增加410文件处理* |*------------------------------------------------------------------------------********************************************************************************/#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <sys/time.h>#include "MbToCis.h"#include "CisPub.hpp"#include "CisProc.hpp"#include "sybdblib.hpp"#include "CBase64.h"///////////////////////////////////////#ifndef BOOL#endif#ifndef TRUE #define TRUE 1#endif//全局变量SybServer m_clsSybServer;BepsPub sCis;//文件处理函数int ParseFile( RECVDATA *recvData, char *RetMsg );//根据配置进行发送行内系统操作int SendtoMb();int SendToMb(int dataidx, char *retmsg );//获取系统日期 BOOL GetSysData(char *Data ){ struct timeval ct; struct tm ttm; struct timezone zone; gettimeofday(&ct, &zone); localtime_r(&(ct.tv_sec), &ttm); if (ttm.tm_year >= 70) ttm.tm_year = ttm.tm_year + 1900; else ttm.tm_year = ttm.tm_year + 2000; ttm.tm_mon = ttm.tm_mon + 1; sprintf( Data , "%04d%02d%02d" , ttm.tm_year, ttm.tm_mon,ttm.tm_mday); return 0;} //格式化字符串int STRTRIM( char *in_data ,char c){ int i,j = 0; char tmp[1024]; memset(tmp,0,sizeof(tmp)); for(i = 0;i < strlen(in_data);i++) { if(in_data[i] != c) tmp[j++] = in_data[i]; } strcpy( in_data , tmp); return TRUE;}//连接数据库int connectToDB( char *dbname , char *username , char *passwd , char *wkname){ if(!m_clsSybServer.Open(dbname,username ,passwd)) { filelog(CISPROLOG,"\n连接数据库[%s][%s][%s]失败!\n",dbname,username,passwd); return -1; } filelog(CISPROLOG,"\n连接数据库[%s][%s][%s]成功!\n",dbname,username,passwd); if(!m_clsSybServer.SetWrkDb(wkname)) { filelog(CISPROLOG,"\n切换数据库[%s]失败!\n" , wkname); return -1; } filelog(CISPROLOG,"\n切换数据库[%s]成功\n" , wkname); return 0;}//断开数据库连接int disConnectToDB(){ m_clsSybServer.Close(); filelog(CISPROLOG,"断开数据库连接!\n"); return 0;}//主函数入口int main(int argc, char* argv[]){ //显示其版本号 if(argc == 2 && (memcmp(argv[1], "-v", 2)==0||memcmp(argv[1], "-V", 2)==0)) { printf("System verison is: Direct CIS CisService CISProc V002R003C010\n"); exit(0); } //使主进程成为守护进程 pid_t main_pid =0; main_pid = fork(); if(0!= main_pid) { exit(0); } int ret=0; char doflag[1+1]; char CisNo[3+1]; char retMsg[255+1]; RECVDATA sRecvData; char Password[20]; memset( Password , 0 , sizeof( Password )); strcpy( Password , getenv("PASSWORD")); char DBUserName[10]; memset( DBUserName , 0 , sizeof(DBUserName)); strcpy( DBUserName , getenv("DBUSERNAME")); StrTrim(DBUserName , ' '); if( strlen( DBUserName ) == 0 ) { strcpy( DBUserName , "sa"); } printf("DBUserName = [%s]\n", DBUserName ); ret = connectToDB( "SYBASE" , DBUserName , Password , "DIRWAYSDB"); if( ret != 0 ) { filelog(CISPROLOG,"连接数据库失败!\n"); printf("连接数据库失败!\n"); return FALSE; }/*版本授权 int flag = 0; ret = sCis.CheckSerail(&flag); if( flag != 0) { printf("system not permission exit!\n"); exit(0); }*/ while(1) { TCnapsTagMML *pTagMML = NULL; pTagMML = new TCnapsTagMML; if( NULL == pTagMML ) { printf("分配TCnapsTagMML空间失败!\n"); filelog(CISPROLOG,"分配TCnapsTagMML空间失败!\n"); delete pTagMML; return FALSE; } memset( doflag , 0 , sizeof( doflag)); memset( CisNo , 0 , sizeof( CisNo )); memset( &sRecvData , 0 , sizeof( sRecvData )); memset( retMsg , 0 , sizeof( retMsg )); //获取未处理CIS报文 ret = sCis.GetCisInfo(&sRecvData,DATARECV_NO); if( ret < 0 ) { filelog(CISPROLOG,"102系统错误,检查前置机故障重新接收!\n"); break; } if( ret == 0 ) { delete pTagMML; printf( "\nCIS前置机系统没有报文可被提取......\n"); sleep(2); continue; } if( ret > 0 ) { filelog( CISPROLOG, "====================>接收报文[%s]成功!<====================\n", sRecvData.msgid); filelog( CISPROLOG, "报文内容:[%s]\n", sRecvData.msgcontent); } memcpy( CisNo, sRecvData.msgid+3, 3 ); ret = 0; switch( atoi(CisNo) ) { case 100: ret = Parse100( pTagMML, &sRecvData, retMsg ); break; case 101: ret = Parse101( pTagMML, &sRecvData, retMsg ); break; case 201: ret = Parse201( pTagMML, &sRecvData, retMsg ); break; case 301: ret = Parse301( pTagMML, &sRecvData, retMsg ); break; case 302: ret = Parse302( pTagMML, &sRecvData, retMsg ); break; case 303: ret = Parse303( pTagMML, &sRecvData, retMsg ); break; case 305: ret = Parse305( pTagMML, &sRecvData, retMsg ); break; case 307: ret = Parse307( pTagMML, &sRecvData, retMsg ); break; case 308: ret = Parse308( pTagMML, &sRecvData, retMsg ); break; case 309: ret = Parse309( pTagMML, &sRecvData, retMsg ); break; case 310: ret = Parse310( pTagMML, &sRecvData, retMsg ); break; case 405: ret = Parse405( pTagMML, &sRecvData, retMsg ); break; case 406: ret = Parse406( pTagMML, &sRecvData, retMsg ); break; case 407: ret = Parse407( pTagMML, &sRecvData, retMsg ); break; case 408: ret = Parse408( pTagMML, &sRecvData, retMsg ); break; case 409: ret = Parse409( pTagMML, &sRecvData, retMsg ); break; case 410: ret = Parse410( pTagMML, &sRecvData, retMsg ); break; case 411: ret = Parse411( pTagMML, &sRecvData, retMsg ); break; case 412: ret = Parse412( pTagMML, &sRecvData, retMsg ); break; case 413: ret = Parse413( pTagMML, &sRecvData, retMsg ); break; case 414: ret = Parse414( pTagMML, &sRecvData, retMsg ); break; case 601: ret = Parse601( pTagMML, &sRecvData, retMsg ); break; case 602: ret = Parse602( pTagMML, &sRecvData, retMsg ); break; case 402: ret = Parse402( pTagMML, &sRecvData, retMsg ); break; case 404: ret = Parse404( pTagMML, &sRecvData, retMsg ); break; default: printf( "未定义报文:[%s]\n", CisNo ); ret = -1; filelog( CISPROLOG, "接收到未定义报文:[%s]\n", CisNo ); break; } if( ret <= 0 ) { //修改recv_data处理状态位 strcpy( doflag, "2" ); printf("处理报文[%s]出错:%s\n", sRecvData.msgid, retMsg); filelog(CISPROLOG, "处理报文[%s]出错:%s\n", sRecvData.msgid, retMsg); filelog("ERROR.log", "[CisProc.bin]处理报文[%s]出错:[%s]\n", sRecvData.msgid, retMsg); } else { strcpy( doflag, "1" ); } printf("处理recv_data表:dataidx=[%d]\t处理状态:doflag=[%s]\n",sRecvData.dataidx,doflag); //更改接收报文队列表报文处理状态 ret = sCis.SetDoflag( "recv_data",&sRecvData.dataidx, doflag, retMsg ); if( ret < 0 ) { printf("更改报文[%s]处理状态失败:%s\n", sRecvData.msgid,retMsg ); filelog(CISPROLOG, "更改报文[%s]处理状态失败:%s\n", sRecvData.msgid,retMsg ); } filelog(CISPROLOG, SIGNLIMIT); delete pTagMML; }//end while disConnectToDB(); return TRUE;}//modify by limh 0520 未核验报文不直接发送行内//解析CIS100支票业务报文 int Parse100( TCnapsTagMML *pTagMML, RECVDATA *pRecvData, char *RetMsg ){ int ret; char Table[20]; char tmpstr[20]; char sSqlCmd[1024*1024]; char cmsgbuf[1024*1024]; char BackPicFilename[99+1]; //发起行行号+委托日期+交易系号.cis char FrontPicFilename[99+1]; //发起行行号+委托日期+交易系号.cis char filename[70+1]; CIS100 tmpCis100; CIS100 *strCis=NULL; strCis = &tmpCis100; memset( Table, 0, sizeof(Table) ); memset( &tmpCis100, 0, sizeof(tmpCis100) ); memset( sSqlCmd, 0, sizeof(sSqlCmd) ); memset( BackPicFilename, 0, sizeof(BackPicFilename) ); memset( FrontPicFilename, 0, sizeof(FrontPicFilename) ); memset( filename, 0, sizeof(filename) ); memset( tmpstr, 0, sizeof(tmpstr) ); memset( cmsgbuf, 0, sizeof(cmsgbuf) ); //modified by hanyun 2007-04-08 //$cis/RecvMsg/msg100+发起行行号+委托日期+交易系号.cis strcat(filename, "cis100"); strcat(filename, pRecvData->orgno);//pRecvData->msgcontent保存文件名 strcat(filename,pRecvData->workdate); //strcat(filename,"00"); sprintf(tmpstr,"%d",pRecvData->dataidx); strcat(filename,tmpstr); strcat(filename,".cis"); //modified above to below char frontpicname[100]; char backpicname[100]; memset(frontpicname, 0, sizeof(frontpicname)); memset(backpicname, 0, sizeof(backpicname)); sprintf( frontpicname, "%sFRONT", filename); sprintf( backpicname, "%sBACK", filename); if(getenv("WORKDIR")!=NULL) { snprintf(FrontPicFilename, sizeof(FrontPicFilename), "%s/pic/%sFRONT", getenv("WORKDIR"), filename); snprintf(BackPicFilename, sizeof(BackPicFilename), "%s/pic/%sBACK", getenv("WORKDIR"), filename); } else { snprintf(FrontPicFilename, sizeof(FrontPicFilename), "/home/cis/pic/%sFRONT", filename); snprintf(BackPicFilename, sizeof(BackPicFilename), "/home/cis/pic/%sBACK", filename); } printf("\r\n 读取CIS100报文成功!进入CIS100报文解析处理!\n");// printf("\r\n read file[%s]",pRecvData->msgcontent); //从filein目录获取cis100报文 ret = GetCisDataFromFile( pRecvData->msgcontent, cmsgbuf ); if( ret <= 0 ) { printf("Get Data From File Error!\n"); return FALSE; } pTagMML->mmlInfo = cmsgbuf; pTagMML->mmlInfoLen = strlen( cmsgbuf ); if(FALSE == pTagMML->parserMmlcmd()) { filelog( CISPROLOG, "Parser file content failed\n"); return FALSE; } //得到委托日期 if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":30A:", strCis->precativedate)) { strcpy( RetMsg, "Can't find TAG:[:30A:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":0BC:", strCis->businessno)) { strcpy( RetMsg, "Can't find TAG:[:0BC:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":CC5:", strCis->recvbankno)) { strcpy( RetMsg, "Can't find TAG:[:CC5:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":59C:", strCis->recvaccounts)) { strcpy( RetMsg, "Can't find TAG:[:59C:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":59A:", strCis->recvname)) { strcpy( RetMsg, "Can't find TAG:[:59A:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":D21:", strCis->paybankno)) { strcpy( RetMsg, "Can't find TAG:[:D21:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":D23:", strCis->payaccounts)) { strcpy( RetMsg, "Can't find TAG:[:D23:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":D22:", strCis->payname)) { strcpy( RetMsg, "Can't find TAG:[:D22:]!\n" ); return FALSE; } if(FALSE == pTagMML->getParaValue(MML_CONTTYPE_CONT, ":32A:", strCis->moneysum)) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?