From c90d428ef2ab43fa21fd972c4a08503f8a1b0e02 Mon Sep 17 00:00:00 2001 From: leebj Date: Mon, 1 Dec 2025 15:48:18 +0900 Subject: [PATCH] no message --- .../src/app/lane/MessageSender.c.190627 | 489 ---- .../src/app/lane/MessageSender.c.200122 | 702 ------ GREEN_LANE/src/app/lane/rcv_function.c.241206 | 2036 ----------------- .../src/app/passraw/wrk_data_handle.c.241206 | 1924 ---------------- GREEN_LANE/src/app/util/core.238438 | Bin 974848 -> 0 bytes 5 files changed, 5151 deletions(-) delete mode 100644 GREEN_LANE/src/app/lane/MessageSender.c.190627 delete mode 100644 GREEN_LANE/src/app/lane/MessageSender.c.200122 delete mode 100644 GREEN_LANE/src/app/lane/rcv_function.c.241206 delete mode 100644 GREEN_LANE/src/app/passraw/wrk_data_handle.c.241206 delete mode 100644 GREEN_LANE/src/app/util/core.238438 diff --git a/GREEN_LANE/src/app/lane/MessageSender.c.190627 b/GREEN_LANE/src/app/lane/MessageSender.c.190627 deleted file mode 100644 index 7e1def7..0000000 --- a/GREEN_LANE/src/app/lane/MessageSender.c.190627 +++ /dev/null @@ -1,489 +0,0 @@ - -#include "MessageSender.h" -#include "hi_ctrl.h" -#include "taglnk_frame.h" -#include "tagbl_struc.h" - -char g_szProcessname[MAX_STRING_SIZE + 1]; -char g_szProcessPath[PATH_MAX + 1]; - -int g_nResponseTimeout; -int cmd; -int type; -int job; - -char szOrganizationID[6+1]; -char szWorkType[4+1]; -char szMsgType[4+1]; -//char szSerialID[8 + 1] = "00000001"; -//char szRequestDTime[14 + 1] = "20180917014900"; -char szRespCode[] = "0000"; -char szData[MAX_STRING_SIZE + 1]; -char rtnData[MAX_STRING_SIZE + 1]; - -int g_nSerailNo = 1; -pthread_mutex_t g_sSerialMutex = PTHREAD_MUTEX_INITIALIZER; - -static struct { - int cmd; /* CONTROL COMMAND */ - int act; /* 0:송신 1:응답 2:3자통신 */ - int work; - char *cmd_nm; -} lane_act[] = { - { NS_RQ_SEQ_NO , 1, 0},/* 0x01 전송연번요구 */ - { NS_LANE_STAT , 0, 0},/* 0x75 차로상태(STATUS) */ - { NS_RPR_DATA , 0, 0},/* 0x76 보수데이터 */ - { NS_CLOSE_PASS , 0, 0},/* 0x73 야간계수 데이터 */ - { NS_WRK_START , 0, 0},/* 0x61 근무개시보고 */ - { NS_HND_DATA , 0, 0},/* 0x17 처리 데이터 */ - { NS_CRD_HND_DATA , 0, 0},/* 0x50 카드처리 데이터 */ - { NS_WRK_END , 0, 0},/* 0x28 근무종료데이터 */ - { NS_REMOTE_LANE_STAT_REPLY, 0, 0},/* 0xD4 원격차로상태응답 */ - { NS_TBL_ORDER , 3, 0},/* 0x24 테이블요구(백그라운드용) */ - { -1 , -1, -1 , " "} -}; - -int MessageSender(int kind, char *packet, char *path, char *rtn) -{ - char szProcessname[PATH_MAX + 1]; - char *pFindPointer; - struct rcv_lane_data *rd; - struct bl_struct *sd; - int nResult; - int i = 0; - - //DaemonStart(); - - nResult = SafeStrCopy(szProcessname, sizeof(szProcessname), path); - - if (nResult != SEC_ERR_SUCCESS) - { - printf("strcpy_s Error![%d]\n", nResult); - } - - pFindPointer = szProcessname; - nResult = SafeStrrChr(szProcessname, strnlen_s(szProcessname, sizeof(szProcessname)), PATH_SEPERATOR, &pFindPointer); - - if (pFindPointer == NULL) - { - nResult = SafeStrCopy(g_szProcessname, sizeof(g_szProcessname), szProcessname); - } - else - { - nResult = SafeStrCopy(g_szProcessname, sizeof(g_szProcessname), pFindPointer + 1); - } - - GetExecPath(g_szProcessPath, sizeof(g_szProcessPath) - 1, path); - - if (g_szProcessPath == NULL) - { - printf("Can't get process path[Cann't load config file]!\nExit Program!"); - return -1; - } -lane_log("MessageSender Start\n"); - nResult = InitMessageSenderConfig(); - - if (nResult != MQ_ERR_SUCCESS) - { - printf("Program terminated!!!\n"); - return -1; - } -lane_log("--------------------------------------------------\n"); - WriteLog(LogType_SystemOut,LogLevel_Info, "Process Started![%s]", g_szProcessname); - - while(1) - { - if(lane_act[i].cmd == kind || lane_act[i].cmd == -1) break; - i++; - } - cmd = lane_act[i].cmd; -lane_log("lane_act[%d].cmd[%02x][%d]\n", i, lane_act[i].cmd, lane_act[i].act); - snprintf(szOrganizationID, 6+1, "%06d", lb_data2atoi(hi_comm_ctrl.bas_tbl.plz_id, 2)); -lane_log("Packet[%s]\n", packet); - if(lane_act[i].act == 2) - snprintf(szWorkType, 4+1, "%.4s", "9998"); - else if(lane_act[i].act == 1) - snprintf(szWorkType, 4+1, "%.4s", "9997"); - else if(lane_act[i].act == 0) - snprintf(szWorkType, 4+1, "%.4s", "9999"); - else if(lane_act[i].act == 3) - snprintf(szWorkType, 4+1, "%.4s", "0080"); - else return -1; - - if(lane_act[i].act != 3) - { - rd = (struct rcv_lane_data *)packet; - snprintf(szData, sizeof(struct rcv_lane_data)+1, "%s", (char *)rd); - printf("szData[%.2s] [%.2s]\n", szData, rd->plz_id); - }else{ - sd = (struct bl_struct *)packet; - snprintf(szData, sizeof(struct bl_struct)+1, "%s", (char *)sd); - printf("szData[%.2s] [%.2s]\n", szData, sd->plz_id); - } - - type = lane_act[i].act; - job = lane_act[i].work; -//lane_log("szWorkType[%s] [%s]\n", szWorkType, lane_act[i].cmd_nm); - snprintf(szMsgType , 4+1, "%.4s", "0010"); -lane_log("처리할 자료[%s]\n", szData); - //2019.06.27 InitDoubleLinkedList Main 선언 - InitThread_Before(); - - if(type == 0) - nResult = InitThread(ProcThread); - else - nResult = InitThreadWait(ProcThread); - -lane_log("종료[%d]?[%s][%d]\n", type, rtnData, nResult); - sprintf(rtn, "%s", rtnData); - WriteLog(LogType_SystemOut,LogLevel_Info, "Process Stopped![%s]", g_szProcessname); - - return 0; -} - -int InitMessageSenderConfig() -{ - char szConfigfilename[PATH_MAX + 1]; - char szConfigfilenameTemp[PATH_MAX + 1]; - char szValueTemp[MAX_STRING_SIZE + 1]; - int nResult; - - snprintf(szConfigfilenameTemp, sizeof(szConfigfilenameTemp), "%s%c%s%c", g_szProcessPath, PATH_SEPERATOR, CONF_FILE_PATH, PATH_SEPERATOR); - - realpath(szConfigfilenameTemp, szConfigfilename); - - snprintf(szValueTemp, sizeof(szValueTemp), "%c", PATH_SEPERATOR); - nResult = SafeStrCat(szConfigfilename, sizeof(szConfigfilename), szValueTemp, 1); - nResult = SafeStrCat(szConfigfilename, sizeof(szConfigfilename), g_szProcessname, strnlen_s(g_szProcessname, sizeof(g_szProcessname))); - nResult = SafeStrCat(szConfigfilename, sizeof(szConfigfilename), CONF_FILE_EXT, strnlen_s(CONF_FILE_EXT, sizeof(CONF_FILE_EXT))); - - printf("Process Name : %s\n", g_szProcessname); - printf("Process Path : %s\n", g_szProcessPath); - printf("Config Filename : %s[%d]\n", szConfigfilename, nResult); - - ReadConfigFile(true, szConfigfilename); -lane_log("Init 1\n"); - // Read MS_RESPONSE_TIMEOUT_KEY - if (GetConfigValue(MS_RESPONSE_TIMEOUT_KEY, szValueTemp, sizeof(szValueTemp)) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket MS_RESPONSE_TIMEOUT_KEY configuration not found!"); - return SOCK_ERR_CONFIG; - } -lane_log("Init 2\n"); - if (SafeStringToInt(szValueTemp, sizeof(szValueTemp), &g_nResponseTimeout) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket MS_RESPONSE_TIMEOUT_KEY configuration error[ConfigFile:%s]!", szValueTemp); - return SOCK_ERR_CONFIG; - } -lane_log("Init 3\n"); - // Read CONNECTION_TYPE - if (GetConfigValue(SOCK_CONF_CONN_TYPE_KEY, szValueTemp, sizeof(szValueTemp)) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket CONNECTION_TYPE configuration not found[Available Value:Server or Client]!"); - return SOCK_ERR_CONFIG; - } -lane_log("Init 4\n"); - if (MappingStringToInt(szValueTemp, sizeof(szValueTemp), g_sConnTypeInfo, sizeof(g_sConnTypeInfo)/sizeof(struct VALUE_STRING_PAIR_INFO), &g_eConnectionType) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket Connection Type configuration error[ConfigFile:%s,Available Value:Server or Client]!", szValueTemp); - return SOCK_ERR_CONFIG; - } -lane_log("Init 5\n"); - if (InitLogConfig() != LOG_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } -lane_log("Init 6\n"); - if (InitSenderMQConfig() != MQ_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } -lane_log("Init 7\n"); - if (InitSender2MQConfig() != MQ_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } -lane_log("Init 8\n"); - if (InitThreadConfig() != THREAD_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } -lane_log("Init 9\n"); - return MS_ERR_SUCCESS; -} - -void *ProcThread(void *pData) -{ - char cOccurType; - struct THREAD_INFO *pThreadInfo; - struct THREAD_INFO SendThreadInfo; - char szMessageBuffer[MAX_STRING_SIZE + 1]; - struct MESSAGE_INFO sMessageInfo; - struct MESSAGE_INFO sndMessageInfo; - int nResult; - int nRslt = 0; - int *pnThreadExitCode; - char szTopic[MAX_STRING_SIZE + 1]; - char szTargetTopic[MAX_STRING_SIZE + 1]; - char szReplyQueuename[MAX_STRING_SIZE + 1]; - char szReply2Queuename[MAX_STRING_SIZE + 1]; - char szExchangername[MAX_STRING_SIZE + 1]; - uuid_t sUUIDTemp; - char szSendUUIDString[UUID_STRING_SIZE + 1]; - char szSend2UUIDString[UUID_STRING_SIZE + 1]; - char szRecvUUIDString[UUID_STRING_SIZE + 1]; - char szRecv2UUIDString[UUID_STRING_SIZE + 1]; - int nMessageLength; - //int nPacketLength; - int nSerialNo; - int nCompareResult; - - //time_t sNow; - struct tm tNow; - int nMillisecond; - - //struct timespec sRecvTimeSpec; - //time_t sRecvNow; - struct tm tRecvNow; - int nRecvMillisecond; - - struct timeval sResponseTimeout; - - uint64_t nDeliveryTag; - - int nDiffSec; - int nDiffMilliSec; - long nDiffTime; - - bool bMessageMatch; - bool bTimeout; - - struct rcv_lane_data *rd; - rd = szData; - - pThreadInfo = (struct THREAD_INFO *)pData; - SafeMemSet(&SendThreadInfo, sizeof(SendThreadInfo), 0, sizeof(SendThreadInfo)); - pthread_mutex_init(&SendThreadInfo.sContextMutex, NULL); - pthread_mutex_init(&SendThreadInfo.sPublishMQ.sMQMutex, NULL); - pthread_mutex_init(&SendThreadInfo.sConsumeMQ.sMQMutex, NULL); - pnThreadExitCode = NULL; - nResult = SafeMemoryAlloc((void **)&pnThreadExitCode, sizeof(int)); - SendThreadInfo.nThreadIndex = pThreadInfo->nThreadIndex; - SendThreadInfo.bThreadLoop = true; - //pnThreadExitCode = SafeAlloc(pnThreadExitCode, sizeof(int)); - *pnThreadExitCode = 0; - //nSerialNo = 1; -lane_log("수신 Buf[%s]\n", rd->buf); - if (g_eConnectionType == SOCK_CONN_TYPE_SERVER) - { - cOccurType = 'S'; - } - else - { - cOccurType = 'C'; - } -/* - while (pThreadInfo->bThreadLoop) - { -*/ - if (pThreadInfo->sPublishMQ.bMQConnection == false || pThreadInfo->sPublishMQ.bMQChannelOpen == false - || pThreadInfo->sConsumeMQ.bMQConnection == false || pThreadInfo->sConsumeMQ.bMQChannelOpen == false) - { -#if 1 - if (ConnectSenderMQ(pThreadInfo, true) != MQ_ERR_SUCCESS) -#else - if(ConnectSenderMultiMQ(pThreadInfo, true, type, 0) != MQ_ERR_SUCCESS) -#endif - { - WriteLog(LogType_StandardOut, LogLevel_Debug, "[Thread:%02d]Connect SenderMQ is failed!", pThreadInfo->nThreadIndex); -#if 0 - continue; -#else - return pnThreadExitCode; -#endif - } - - WriteLog(LogType_StandardOut, LogLevel_Debug, "[Thread:%02d]Connect SenderMQ is succeeded!!", pThreadInfo->nThreadIndex); -lane_log("Type [%d]\n", type); -#if 1 - switch(type) - { - case 0: - case 3: - snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendRespQueuename, szOrganizationID, pThreadInfo->nThreadIndex); - break; - case 1: - case 2: - snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendRealQueuename, szOrganizationID, pThreadInfo->nThreadIndex); - break; - } -#else - snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendRespQueuename, szOrganizationID, pThreadInfo->nThreadIndex); -#endif - } - if (SendThreadInfo.sPublishMQ.bMQConnection == false || SendThreadInfo.sPublishMQ.bMQChannelOpen == false - || SendThreadInfo.sConsumeMQ.bMQConnection == false || SendThreadInfo.sConsumeMQ.bMQChannelOpen == false) - { - if(ConnectSenderMultiMQ(&SendThreadInfo, true, type, 1) != MQ_ERR_SUCCESS) - { - WriteLog(LogType_StandardOut, LogLevel_Debug, "[Thread:%02d]Connect SenderMQ is failed!", SendThreadInfo.nThreadIndex); -#if 0 - continue; -#else - return pnThreadExitCode; -#endif - } - snprintf(szReply2Queuename, sizeof(szReply2Queuename), "%s%s.%02d", g_szMQMessageSendHqctQueuename, g_szMQTargetOrganizationCode, SendThreadInfo.nThreadIndex); - } -lane_log("Reply Que 1 [%s]\n", szReplyQueuename); - GetCurrTime(&tNow, &nMillisecond); - nSerialNo = GetSerialNo(); -lane_log("Serial Que 2 [%d]\n", nSerialNo); - snprintf(szMessageBuffer, sizeof(szMessageBuffer), "%s%c%s%s%08d%04d%02d%02d%02d%02d%02d%s%s", szOrganizationID, cOccurType, szWorkType, - szMsgType, nSerialNo++, tNow.tm_year + 1900, tNow.tm_mon + 1, tNow.tm_mday, tNow.tm_hour, tNow.tm_min, tNow.tm_sec, szRespCode, szData); - nMessageLength = strnlen_s(szMessageBuffer, sizeof(szMessageBuffer)); - sMessageInfo.nMessageLength = nMessageLength; - sMessageInfo.paMessageData = NULL; - SafeMemoryAlloc((void **)&sMessageInfo.paMessageData, sMessageInfo.nMessageLength + 5); - snprintf(sMessageInfo.paMessageData, sMessageInfo.nMessageLength + 5, "%04X", sMessageInfo.nMessageLength); - SafeStrCat(sMessageInfo.paMessageData + 4, sMessageInfo.nMessageLength + 1, szMessageBuffer, strnlen_s(szMessageBuffer, sizeof(szMessageBuffer))); - snprintf(szTopic, sizeof(szTopic), "%s.%s%s", szOrganizationID, szWorkType, szMsgType); -#ifdef _WIN32 - uuid_generate(&sUUIDTemp); - uuid_unparse(&sUUIDTemp, szSendUUIDString); -#else - uuid_generate(sUUIDTemp); - uuid_unparse(sUUIDTemp, szSendUUIDString); -#endif -lane_log("TEST 2 Exchange[%s]\n", g_szMQMessageSendExchangername); -lane_log("TEST 3 Topic[%s]\n", szTopic); -lane_log("TEST 4 Reply[%s][%d]\n", szReplyQueuename, pThreadInfo->sPublishMQ.bMQChannelOpen); - nResult = PutMessageToQueue(pThreadInfo->sPublishMQ.sMQConnectionState, &pThreadInfo->sPublishMQ.bMQConnection, &pThreadInfo->sPublishMQ.bMQChannelOpen, pThreadInfo->nThreadIndex, - g_szMQMessageSendExchangername, szReplyQueuename, szTopic, &sMessageInfo, sMessageInfo.paMessageData, sMessageInfo.nMessageLength, - szSendUUIDString, sizeof(szSendUUIDString), false, NULL); - printf("SendData[%d] : [Thread:%02d]%s\n", nResult, pThreadInfo->nThreadIndex, sMessageInfo.paMessageData); - - if (nResult != MS_ERR_SUCCESS) - { - // 메시지 전송 오류인 경우 처리 - // 오류인 경우 오류 로그에 추가하는 형태의 샘플이지만 DB 처리라면 재전송 여부를 결정해서 재전송 몇번 이내면 재전송 하고 그렇지 않으면 실패 처리하는 로직이 필요하다. - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]MQ Data Publish Error[Data:%s]!", pThreadInfo->nThreadIndex, sMessageInfo.paMessageData); - } - else - { - WriteQueueLog(LogType_MQOut, LogLevel_Info, pThreadInfo->nThreadIndex, 'P', g_szMQMessageSendExchangername, szTopic, szSendUUIDString, sMessageInfo.nMessageLength, "%s", - sMessageInfo.paMessageData); - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]MQ Data Publish[Data:%s]!", pThreadInfo->nThreadIndex, sMessageInfo.paMessageData); - bMessageMatch = false; - bTimeout = false; - if (g_bBypassMode) - { - do - { - GetCurrTime(&tRecvNow, &nRecvMillisecond); - nDiffTime = TimeDiff(&tNow, nMillisecond, &tRecvNow, nRecvMillisecond); - nDiffSec = nDiffTime / 1000; - nDiffMilliSec = nDiffTime % 1000; - - if (nDiffMilliSec < 0) - { - nDiffSec--; - nDiffMilliSec += 1000; - } - - sResponseTimeout.tv_sec = g_nResponseTimeout / 1000 - nDiffSec; - sResponseTimeout.tv_usec = (g_nResponseTimeout % 1000 - nDiffMilliSec) * 1000; - if (sResponseTimeout.tv_usec < 0) - { - sResponseTimeout.tv_sec--; - sResponseTimeout.tv_usec += 1000000; - } - if (sResponseTimeout.tv_sec < 0 || sResponseTimeout.tv_usec < 0) - { - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]Response Timeout! - UUID:%s, Message:%s, ProcessTime:%d.%03ds\n", pThreadInfo->nThreadIndex, szSendUUIDString, - sMessageInfo.paMessageData, nDiffSec, nDiffMilliSec); - bTimeout = true; - break; - } - - memset(rtnData, 0x00, sizeof(rtnData)); - nResult = GetMessageFromQueue(pThreadInfo->sConsumeMQ.sMQConnectionState, szExchangername, sizeof(szExchangername), szMessageBuffer, sizeof(szMessageBuffer), - szRecvUUIDString, sizeof(szRecvUUIDString), szReplyQueuename, sizeof(szReplyQueuename), &pThreadInfo->sConsumeMQ.bMQConnection, - &pThreadInfo->sConsumeMQ.bMQChannelOpen, &nDeliveryTag, &sResponseTimeout); -//lane_log("Get Msg[%s][%d]\n", szMessageBuffer, nResult); - - nResult = pthread_tryjoin_np(pThreadInfo->nThreadID, NULL); - if(nResult == '0') - { - RemoveTerminatedThread(); - nResult = pthread_kill(pThreadInfo, SIGINT); - pthread_mutex_unlock(&pThreadInfo->sContextMutex); - //nResult = DoubleLinkedListRemoveCurrentNode(&g_sConnectedSocketThreadInfo, NULL); - SafeFree((void **)&pThreadInfo); - //SafeFree((void **)&pListNode); - } - - snprintf(rtnData, strnlen_s(szMessageBuffer+45, sizeof(szMessageBuffer)-45)+1, "%s", szMessageBuffer+45); -lane_log("Rtn Data[%s]\n", rtnData); - GetCurrTime(&tRecvNow, &nRecvMillisecond); - nDiffTime = TimeDiff(&tNow, nMillisecond, &tRecvNow, nRecvMillisecond); - nDiffSec = nDiffTime / 1000; - nDiffMilliSec = nDiffTime % 1000; - - if (nDiffMilliSec < 0) - { - nDiffSec--; - nDiffMilliSec += 1000; - } - - if (nResult == MQ_ERR_TIMEOUT) - { - //printf("Response Timeout! - UUID:%s, Message:%s, ProcessTime:%d.%03ds\n", ); - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]Response Timeout! - UUID:%s, Message:%s, ProcessTime:%d.%03ds\n", - pThreadInfo->nThreadIndex, szSendUUIDString, sMessageInfo.paMessageData, nDiffSec, nDiffMilliSec); - bTimeout = true; - break; - } -printf("TEST11[%d][%d][%s]\n", type, nResult, rtnData); - - nResult = SafeStrCmp(szRecvUUIDString, sizeof(szRecvUUIDString), szSendUUIDString, &nCompareResult); - if (nCompareResult != 0) - { - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]Recv UUID is not matched! - UUID:[Send:%s, Recv:%s], Message:%s, ProcessTime:%d.%03ds\n", pThreadInfo->nThreadIndex, szSendUUIDString, szRecvUUIDString, sMessageInfo.paMessageData, nDiffSec, nDiffMilliSec); - amqp_basic_ack(pThreadInfo->sConsumeMQ.sMQConnectionState, 1, nDeliveryTag, 0); - continue; - } - bMessageMatch = true; - nMessageLength = strnlen_s(szMessageBuffer, sizeof(szMessageBuffer)); - amqp_basic_ack(pThreadInfo->sConsumeMQ.sMQConnectionState, 1, nDeliveryTag, 0); - WriteQueueLog(LogType_MQOut, LogLevel_Info, pThreadInfo->nThreadIndex, 'C', szReplyQueuename, "", szRecvUUIDString, nMessageLength, "%s", szMessageBuffer); - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]MQ Data Consume[Data:%s] - ProcessTime:%d.%03ds!", pThreadInfo->nThreadIndex, szMessageBuffer, nDiffSec, nDiffMilliSec); - } while (bMessageMatch == false && bTimeout == false); - if (!bTimeout) - { -printf("센터 전송 옴[%d]?\n", type); - // 전송 완료 처리 필요 - }else - { - memset(rtnData, 0x00, sizeof(rtnData)); - snprintf(rtnData, sizeof(rtnData), "%02x0002", cmd); - } - } - } - //sleep(1); // test -/* - } -*/ - CloseMQ(pThreadInfo->nThreadIndex, pThreadInfo->sPublishMQ.sMQConnectionState, &pThreadInfo->sPublishMQ.bMQConnection, &pThreadInfo->sPublishMQ.bMQChannelOpen, &pThreadInfo->sPublishMQ.sMQMutex); - CloseMQ(pThreadInfo->nThreadIndex, pThreadInfo->sConsumeMQ.sMQConnectionState, &pThreadInfo->sConsumeMQ.bMQConnection, &pThreadInfo->sConsumeMQ.bMQChannelOpen, &pThreadInfo->sConsumeMQ.sMQMutex); - return pnThreadExitCode; -} - -int GetSerialNo() -{ - int nSerialNo; - pthread_mutex_lock(&g_sSerialMutex); - nSerialNo = g_nSerailNo++; - pthread_mutex_unlock(&g_sSerialMutex); - return nSerialNo; -} diff --git a/GREEN_LANE/src/app/lane/MessageSender.c.200122 b/GREEN_LANE/src/app/lane/MessageSender.c.200122 deleted file mode 100644 index 8d00efe..0000000 --- a/GREEN_LANE/src/app/lane/MessageSender.c.200122 +++ /dev/null @@ -1,702 +0,0 @@ - -#include "MessageSender.h" -#include "hi_ctrl.h" -#include "taglnk_frame.h" -#include "tagbl_struc.h" -#include -#include "iss_comp.h" - -char g_szProcessname[MAX_STRING_SIZE + 1]; -char g_szProcessPath[PATH_MAX + 1]; - -extern int g_nResponseTimeout; -extern int cmd; -extern int type; -extern int job; -extern char szOrganizationID[6+1]; -extern char szWorkType[4+1]; -extern char szMsgType[4+1]; - -extern char szRespCode[] = "0000"; -//char *szData; -char rcvData[MAX_STRING_SIZE + 1]; -char szData[MAX_STRING_SIZE + 1]; -char rtnData[MAX_STRING_SIZE + 1]; - -extern int g_nSerailNo = 1; -pthread_mutex_t g_sSerialMutex = PTHREAD_MUTEX_INITIALIZER; - -static struct { - int cmd; /* CONTROL COMMAND */ - int act; /* 0:송신 1:응답 2:3자통신 */ - int work; - char *cmd_nm; -} lane_act[] = { - { NS_RPR_DATA , 0, 0 , " 0x76 보수데이터 "}, - { NS_CLOSE_PASS , 0, 5 , " 0x73 야간계수 데이터 "}, - { NS_WRK_START , 0, 0 , " 0x61 근무개시보고 "}, - { NS_HND_DATA , 0, 2 , " 0x17 처리 데이터 "}, - { NS_CRD_HND_DATA , 0, 3 , " 0x50 카드처리 데이터 "}, - { NS_WRK_END , 0, 4 , " 0x28 근무종료데이터 "}, - //{ NS_REMOTE_LANE_STAT_REPLY, 2, 0 , " 0xD4 원격차로상태응답 "}, - { NS_TBL_ORDER , 3, 0 , " 0x24 테이블요구(백그라운드용) "}, - { NS_REFUND_DATA , 0, 2 , " 0x40 환불처리 데이터 "}, - { NS_LANE_STAT , 1, 1 , " 0x75 차로상태(STATUS) "}, - { -1 , -1, -1 , " "} -}; - -static struct { - uchar plz_id[2]; - int lane_no; - int tbl_order; -} lane_info[20] = -{ - {"01", 1, 0}, - {"01", 2, 0}, - {"01", 3, 0}, - {"01", 4, 0}, - {"01", 5, 0}, - {"01", 6, 0}, - {"01", 7, 0}, - {"01", 8, 0}, - {"03", 1, 0}, - {"03", 2, 0}, - {"03", 3, 0}, - {"03", 4, 0}, - {"03", 5, 0}, - {"03", 6, 0}, - {"03", 7, 0}, - {"03", 8, 0}, - {"03", 9, 0}, - {"03", 10, 0}, - {"00", -1, -1} -}; - -int MessageSender(int kind, char *packet, char *path, char *rtn) -{ - char szProcessname[PATH_MAX + 1]; - char *sDataMalloc; - struct write_info wi; - struct rcv_lane_data *rd; - struct bl_struct *sd; - int nResult; - int i = 0; - - //DaemonStart(); -/* //2019.07.04 InitMessageQueue에 포함 - nResult = SafeStrCopy(szProcessname, sizeof(szProcessname), path); - - if (nResult != SEC_ERR_SUCCESS) - { - printf("strcpy_s Error![%d]\n", nResult); - } - - pFindPointer = szProcessname; - nResult = SafeStrrChr(szProcessname, strnlen_s(szProcessname, sizeof(szProcessname)), PATH_SEPERATOR, &pFindPointer); - - if (pFindPointer == NULL) - { - nResult = SafeStrCopy(g_szProcessname, sizeof(g_szProcessname), szProcessname); - } - else - { - nResult = SafeStrCopy(g_szProcessname, sizeof(g_szProcessname), pFindPointer + 1); - } - - GetExecPath(g_szProcessPath, sizeof(g_szProcessPath) - 1, path); - - if (g_szProcessPath == NULL) - { - printf("Can't get process path[Cann't load config file]!\nExit Program!"); - return -1; - } -*/ -lane_log("MessageSender Start\n"); -/* // 2019.07.04 lane_main에서 1번만 실행하도록 수정 - nResult = InitMessageSenderConfig(path); - - if (nResult != MQ_ERR_SUCCESS) - { - printf("Program terminated!!!\n"); - return -1; - } -*/ -//lane_log("---------------------------[%s]-----------------------\n", packet); - //WriteLog(LogType_SystemOut,LogLevel_Info, "Process Started![%s]", g_szProcessname); - - memset(szData, 0x00, sizeof(szData)); - memset(rcvData, 0x00, sizeof(rcvData)); - memset(rtnData, 0x00, sizeof(rtnData)); - sprintf(wi.plz_id, "%.2s", PLZ_CODE2); - nResult = lb_freadx(&wi, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); - - if (nResult < 0){ - err_log("기초사항-F을 읽을 수 없습니다.", 1); - } - - //lane_log("plz_id[%.2s]\n", hi_comm_ctrl.bas_tbl.plz_id); - while(1) - { - if(lane_act[i].cmd == kind || lane_act[i].cmd == -1) break; - i++; - } - cmd = lane_act[i].cmd; -lane_log("lane_act[%d].cmd[%02x][%d]\n", i, lane_act[i].cmd, lane_act[i].act); - snprintf(szOrganizationID, 6+1, "%06d", lb_data2atoi(hi_comm_ctrl.bas_tbl.plz_id, 2)); -//lane_log("Packet[%s]\n", packet); - //sDataMalloc = szData; - //szData = (char *)malloc(MAX_STRING_SIZE +1); - //SafeMemoryAlloc((void **)&sDataMalloc, MAX_STRING_SIZE+ 1); - if(lane_act[i].act == 3) - { - sd = (struct bl_struct *)packet; - snprintf(szData, sizeof(struct bl_struct)+1, "%s", (char *)sd); - snprintf(rcvData, sizeof(struct bl_struct)+1, "%s", (char *)sd); - //lane_log("3 szData[%.2s] [%.2s]\n", szData, sd->plz_id); - }else if(lane_act[i].act == 1) - { - sprintf(szData, "%s", packet); - sprintf(rcvData, "%s", packet); - //lane_log("1 szData[%s]\n", szData); - }else{ - rd = (struct rcv_lane_data *)packet; - snprintf(szData, sizeof(struct rcv_lane_data)+1, "%s", (char *)rd); - snprintf(rcvData, sizeof(struct rcv_lane_data)+1, "%s", (char *)rd); - //lane_log("else szData[%.2s] [%.2s]\n", szData, rd->plz_id); - } - - if(lane_act[i].act == 2) - snprintf(szWorkType, 4+1, "%.4s", "9998"); - else if(lane_act[i].act == 1) - snprintf(szWorkType, 4+1, "%04d", lane_act[i].work); - else if(lane_act[i].act == 0) - snprintf(szWorkType, 4+1, "%.4s", "9999"); - else if(lane_act[i].act == 3) - snprintf(szWorkType, 4+1, "%.2s%.2s", sd->plz_id, sd->lane_no); - else{ - //SafeFree((void **)&sDataMalloc); - return -1; - } - type = lane_act[i].act; - job = lane_act[i].work; -lane_log("szWorkType[%s] [%s]\n", szWorkType, lane_act[i].cmd_nm); - snprintf(szMsgType , 4+1, "%.4s", "0010"); -//lane_log("처리할 자료[%s]\n", szData); - //2019.06.27 InitDoubleLinkedList Main 선언 - InitThread_Before(); -lane_log("Queue 초기화\n"); - -// if(type == 0) - nResult = InitThread(ProcThread); -// else -// nResult = InitThreadWait(ProcThread); - -lane_log("종료[%d]?[%s][%d]\n", type, rtnData, nResult); - sprintf(rtn, "%s", rtnData); - //SafeFree((void **)&sDataMalloc); - //WriteLog(LogType_SystemOut,LogLevel_Info, "Process Stopped![%s]", g_szProcessname); - - return 0; -} - -int InitMessageSenderConfig(char *path) -{ - char szConfigfilename[PATH_MAX + 1]; - char szConfigfilenameTemp[PATH_MAX + 1]; - char szValueTemp[MAX_STRING_SIZE + 1]; - char szProcessname[PATH_MAX + 1]; - char *pFindPointer; - int nResult; - - nResult = SafeStrCopy(szProcessname, sizeof(szProcessname), path); - - if (nResult != SEC_ERR_SUCCESS) - { - printf("strcpy_s Error![%d]\n", nResult); - } - - pFindPointer = szProcessname; - nResult = SafeStrrChr(szProcessname, strnlen_s(szProcessname, sizeof(szProcessname)), PATH_SEPERATOR, &pFindPointer); - - if (pFindPointer == NULL) - { - nResult = SafeStrCopy(g_szProcessname, sizeof(g_szProcessname), szProcessname); - } - else - { - nResult = SafeStrCopy(g_szProcessname, sizeof(g_szProcessname), pFindPointer + 1); - } - - GetExecPath(g_szProcessPath, sizeof(g_szProcessPath) - 1, path); - - if (g_szProcessPath == NULL) - { - printf("Can't get process path[Cann't load config file]!\nExit Program!"); - return -1; - } - - snprintf(szConfigfilenameTemp, sizeof(szConfigfilenameTemp), "%s%c%s%c", g_szProcessPath, PATH_SEPERATOR, CONF_FILE_PATH, PATH_SEPERATOR); - - realpath(szConfigfilenameTemp, szConfigfilename); - - snprintf(szValueTemp, sizeof(szValueTemp), "%c", PATH_SEPERATOR); - nResult = SafeStrCat(szConfigfilename, sizeof(szConfigfilename), szValueTemp, 1); - nResult = SafeStrCat(szConfigfilename, sizeof(szConfigfilename), g_szProcessname, strnlen_s(g_szProcessname, sizeof(g_szProcessname))); - nResult = SafeStrCat(szConfigfilename, sizeof(szConfigfilename), CONF_FILE_EXT, strnlen_s(CONF_FILE_EXT, sizeof(CONF_FILE_EXT))); - - printf("Process Name : %s\n", g_szProcessname); - printf("Process Path : %s\n", g_szProcessPath); - printf("Config Filename : %s[%d]\n", szConfigfilename, nResult); - - ReadConfigFile(true, szConfigfilename); - - // Read MS_RESPONSE_TIMEOUT_KEY - if (GetConfigValue(MS_RESPONSE_TIMEOUT_KEY, szValueTemp, sizeof(szValueTemp)) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket MS_RESPONSE_TIMEOUT_KEY configuration not found!"); - return SOCK_ERR_CONFIG; - } - - if (SafeStringToInt(szValueTemp, sizeof(szValueTemp), &g_nResponseTimeout) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket MS_RESPONSE_TIMEOUT_KEY configuration error[ConfigFile:%s]!", szValueTemp); - return SOCK_ERR_CONFIG; - } - - // Read CONNECTION_TYPE - if (GetConfigValue(SOCK_CONF_CONN_TYPE_KEY, szValueTemp, sizeof(szValueTemp)) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket CONNECTION_TYPE configuration not found[Available Value:Server or Client]!"); - return SOCK_ERR_CONFIG; - } - - if (MappingStringToInt(szValueTemp, sizeof(szValueTemp), g_sConnTypeInfo, sizeof(g_sConnTypeInfo)/sizeof(struct VALUE_STRING_PAIR_INFO), &g_eConnectionType) != CONF_ERR_SUCCESS) - { - WriteLog(LogType_ErrorOut, LogLevel_Error, "Socket Connection Type configuration error[ConfigFile:%s,Available Value:Server or Client]!", szValueTemp); - return SOCK_ERR_CONFIG; - } - - if (InitLogConfig() != LOG_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } - - if (InitSenderMQConfig() != MQ_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } - - if (InitSender2MQConfig() != MQ_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } - - if (InitThreadConfig() != THREAD_ERR_SUCCESS) - { - return MS_ERR_CONFIG; - } - - return MS_ERR_SUCCESS; -} - -void *ProcThread(void *pData) -{ - char cOccurType; - struct THREAD_INFO *pThreadInfo; - struct THREAD_INFO SendThreadInfo; - char szMessageBuffer[MAX_STRING_SIZE + 1]; - struct MESSAGE_INFO sMessageInfo; - struct MESSAGE_INFO sndMessageInfo; - int nResult; - int nRslt = 0, retry = 0; - int *pnThreadExitCode; - amqp_queue_purge_ok_t *pQueuePurgeResult; - char szTopic[MAX_STRING_SIZE + 1]; - char szTargetTopic[MAX_STRING_SIZE + 1]; - char szReplyQueuename[MAX_STRING_SIZE + 1]; - char szReply2Queuename[MAX_STRING_SIZE + 1]; - char szExchangername[MAX_STRING_SIZE + 1]; - uuid_t sUUIDTemp; - char szSendUUIDString[UUID_STRING_SIZE + 1]; - char szSend2UUIDString[UUID_STRING_SIZE + 1]; - char szRecvUUIDString[UUID_STRING_SIZE + 1]; - char szRecv2UUIDString[UUID_STRING_SIZE + 1]; - char orgCarNo[255+1]; - char szCarNo[255+1]; - char putCarNp[16]; - char nowTbl[2+1]; - - char procData[MAX_STRING_SIZE + 1]; memset(procData, 0x00, sizeof(procData)); - char webData[MAX_STRING_SIZE + 1]; memset(webData, 0x00, sizeof(webData)); - int nMessageLength; - //int nPacketLength; - int nSerialNo; - int nCompareResult, size, ii; - - //time_t sNow; - struct tm tNow; - int nMillisecond; - - //struct timespec sRecvTimeSpec; - //time_t sRecvNow; - struct tm tRecvNow; - int nRecvMillisecond; - - struct timeval sResponseTimeout; - - uint64_t nDeliveryTag; - - int nDiffSec; - int nDiffMilliSec; - long nDiffTime; - - bool bMessageMatch; - bool bTimeout; - struct hi_lane_stat *hs; - struct hi_wrk_end *we; - struct hi_wrk_start *ws; - struct hi_crd_hnd_data *crd; - struct hi_hnd_data *hnd; - size_t in_size; - size_t out_size; - size_t out_buf_left; - char* in_buf; - char* out_buf; - char in_fare[2]; - char in_booth[2]; - char tmp_chg[20]; -#if 1 - FILE *fp; - char path[128]; - int flen = 0; - - memset(path, 0x00, sizeof(path)); -#endif -//lane_log("##### Rcv Data[%s] ##### \n", rcvData); - memcpy(procData, szData, sizeof(procData)); - - //memcpy(nowTbl, tbl_order, sizeof(nowTbl)); - memset(orgCarNo, 0x00, sizeof(orgCarNo)); - memset(szCarNo, 0x00, sizeof(szCarNo)); -lane_log("MessageSender 1\n"); - pThreadInfo = (struct THREAD_INFO *)pData; - SafeMemSet(&SendThreadInfo, sizeof(SendThreadInfo), 0, sizeof(SendThreadInfo)); - pthread_mutex_init(&SendThreadInfo.sContextMutex, NULL); - pthread_mutex_init(&SendThreadInfo.sPublishMQ.sMQMutex, NULL); - pthread_mutex_init(&SendThreadInfo.sConsumeMQ.sMQMutex, NULL); - pnThreadExitCode = NULL; - nResult = SafeMemoryAlloc((void **)&pnThreadExitCode, sizeof(int)); - SendThreadInfo.nThreadIndex = pThreadInfo->nThreadIndex; - SendThreadInfo.bThreadLoop = true; - //pnThreadExitCode = SafeAlloc(pnThreadExitCode, sizeof(int)); - *pnThreadExitCode = 0; - //nSerialNo = 1; -lane_log("MessageSender 2\n"); - if (g_eConnectionType == SOCK_CONN_TYPE_SERVER) - { - cOccurType = 'S'; - } - else - { - cOccurType = 'C'; - } -/* - while (pThreadInfo->bThreadLoop) - { -*/ -lane_log("MessageSender 3\n"); - if (pThreadInfo->sPublishMQ.bMQConnection == false || pThreadInfo->sPublishMQ.bMQChannelOpen == false - || pThreadInfo->sConsumeMQ.bMQConnection == false || pThreadInfo->sConsumeMQ.bMQChannelOpen == false) - { -#if 0 - while(1) - { -#endif - lane_log("[Thread:%02d]Connect SenderMQ Connecting [%d]\n", pThreadInfo->nThreadIndex, retry); - if (ConnectSenderMQ(pThreadInfo, true) != MQ_ERR_SUCCESS) - { - lane_log("[Thread:%02d]Connect SenderMQ is failed!\n", pThreadInfo->nThreadIndex); - -#if 1 - sprintf(path, "/app_data/tcs/FILE/RECV/Retry_%04d%02d%02d%02d%02d%02d", tNow.tm_year + 1900, tNow.tm_mon + 1, tNow.tm_mday, tNow.tm_hour, tNow.tm_min, tNow.tm_sec); - unlink(path); - fp = fopen(path, "r+"); - if(fp < 0) - { - lane_log("%s:파일생성 실패[%d]", path, errno); - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]Connect Fail & File Create Fail! - Message:[%s]\n", - pThreadInfo->nThreadIndex, procData); - return(-1); - } - flen = strlen(procData); - procData[flen] = '\n'; - procData[flen+1] = '\0'; - nRslt = fputs(procData, fp); - fclose(fp); -#endif - pThreadInfo->nRunState = SOCK_THREAD_STATE_TERMINATED; - pthread_mutex_destroy(&pThreadInfo->sContextMutex); - pthread_mutex_destroy(&pThreadInfo->sPublishMQ.sMQMutex); - pthread_mutex_destroy(&pThreadInfo->sConsumeMQ.sMQMutex); - SafeFree((void **)&pThreadInfo); - SafeFree((void **)&pnThreadExitCode); - -#if 0 - pThreadInfo = (struct THREAD_INFO *)pData; - pnThreadExitCode = NULL; - nResult = SafeMemoryAlloc((void **)&pnThreadExitCode, sizeof(int)); - SendThreadInfo.nThreadIndex = pThreadInfo->nThreadIndex; - continue; -#else - lane_log("[Thread:%02d]Connect SenderMQ File Create[%d]!\n", pThreadInfo->nThreadIndex, flen); - return(-1); -#endif - }else - { - lane_log("[Thread:%02d]Connect SenderMQ Reconnecting is Success!\n", pThreadInfo->nThreadIndex); - //break; - } -#if 0 - } -#endif - //WriteLog(LogType_StandardOut, LogLevel_Debug, "[Thread:%02d]Connect SenderMQ is succeeded!!", pThreadInfo->nThreadIndex); -lane_log("Type [%d]\n", type); -#if 1 - switch(type) - { - case 0: - case 2: - snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendRespQueuename, szOrganizationID, pThreadInfo->nThreadIndex); - break; - case 3: - snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendHqctQueuename, szOrganizationID, pThreadInfo->nThreadIndex); - break; - case 1: - snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendRealQueuename, szOrganizationID, pThreadInfo->nThreadIndex); - //snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendHqctQueuename, szOrganizationID, pThreadInfo->nThreadIndex); - break; - } -#else - snprintf(szReplyQueuename, sizeof(szReplyQueuename), "%s%s.%02d", g_szMQMessageSendRespQueuename, szOrganizationID, pThreadInfo->nThreadIndex); -#endif - } - -lane_log("Reply Que 1 [%s]\n", szReplyQueuename); -//sleep(4); - GetCurrTime(&tNow, &nMillisecond); - nSerialNo = GetSerialNo(); -lane_log("Serial Que 2 [%d]\n", nSerialNo); -//sleep(4); - snprintf(szMessageBuffer, sizeof(szMessageBuffer), "%s%c%s%s%08d%04d%02d%02d%02d%02d%02d%s%s", szOrganizationID, cOccurType, szWorkType, - szMsgType, nSerialNo++, tNow.tm_year + 1900, tNow.tm_mon + 1, tNow.tm_mday, tNow.tm_hour, tNow.tm_min, tNow.tm_sec, szRespCode, procData); - //free(szData); - nMessageLength = strnlen_s(szMessageBuffer, sizeof(szMessageBuffer)); - sMessageInfo.nMessageLength = nMessageLength; - sMessageInfo.paMessageData = NULL; -lane_log("Aloc Before\n"); -//sleep(4); - SafeMemoryAlloc((void **)&sMessageInfo.paMessageData, sMessageInfo.nMessageLength + 5); -lane_log("Aloc After\n"); -//sleep(4); - snprintf(sMessageInfo.paMessageData, sMessageInfo.nMessageLength + 5, "%04X", sMessageInfo.nMessageLength); - SafeStrCat(sMessageInfo.paMessageData + 4, sMessageInfo.nMessageLength + 1, szMessageBuffer, strnlen_s(szMessageBuffer, sizeof(szMessageBuffer))); -lane_log("MessageSender 5\n"); -//sleep(4); - snprintf(szTopic, sizeof(szTopic), "%s.%s%s", szOrganizationID, szWorkType, szMsgType); -#ifdef _WIN32 - uuid_generate(&sUUIDTemp); - uuid_unparse(&sUUIDTemp, szSendUUIDString); -#else -//lane_log("A2\n"); -//sleep(4); - uuid_generate(sUUIDTemp); -//lane_log("A3\n"); -//sleep(4); - uuid_unparse(sUUIDTemp, szSendUUIDString); -#endif -lane_log("TEST 2 Exchange[%s]\n", g_szMQMessageSendExchangername); -lane_log("TEST 3 Topic[%s]\n", szTopic); -//lane_log("TEST 4 Reply[%s][%d]\n", szReplyQueuename, pThreadInfo->sPublishMQ.bMQChannelOpen); -//sleep(4); -lane_log("MessageSender 6\n"); -#if 1 // 백그라운드 전송 시, 언제나 최신을 처리하기 위한 기존 데이터 삭제(TEST 필) -//lane_log("Back Purge 0[%d][%s][%.2s]\n", type, nowTbl, procData+12); - if(type == 3) - { - memset(in_fare, 0x00, sizeof(in_fare)); - memset(in_booth, 0x00, sizeof(in_booth)); - memset(tmp_chg, 0x00, sizeof(tmp_chg)); - - memcpy(in_fare, procData, 2); - memcpy(in_booth, procData+2, 2); - memcpy(tmp_chg, procData+12, 2); - for(ii = 0; ii < 20; ii++) - { - if(strncmp(lane_info[ii].plz_id, in_fare, 2) == 0 && lane_info[ii].lane_no == lb_data2atoi(in_booth, 2)) - break; - } - } -lane_log("MessageSender 7\n"); - //memcpy(nowTbl, lane_info[ii].tbl_order, sizeof(nowTbl)); - - if(type == 3 && lane_info[ii].tbl_order == lb_data2atoi(tmp_chg, 2)) - { - lane_log("Back Purge 1[%x]\n", pThreadInfo->sPublishMQ.sMQConnectionState); - pQueuePurgeResult = amqp_queue_purge(pThreadInfo->sPublishMQ.sMQConnectionState, 1, amqp_cstring_bytes(g_szMQMessageSendHqctQueuename)); - lane_log("Back Purge 2[%x]\n", pThreadInfo->sPublishMQ.sMQConnectionState); - //sleep(1); - }else - lane_info[ii].tbl_order = lb_data2atoi(tmp_chg, 2); -#endif -lane_log("MessageSender 8\n"); - nResult = PutMessageToQueue(pThreadInfo->sPublishMQ.sMQConnectionState, &pThreadInfo->sPublishMQ.bMQConnection, &pThreadInfo->sPublishMQ.bMQChannelOpen, pThreadInfo->nThreadIndex, - g_szMQMessageSendExchangername, szReplyQueuename, szTopic, &sMessageInfo, sMessageInfo.paMessageData, sMessageInfo.nMessageLength, - szSendUUIDString, sizeof(szSendUUIDString), false, NULL); -//lane_log("Put After\n"); -//sleep(2); - lane_log("SendData[%d] : [Thread:%02d]%s\n", nResult, pThreadInfo->nThreadIndex, sMessageInfo.paMessageData); - if (nResult != MS_ERR_SUCCESS) - { - lane_log("[Thread:%02d]MQ Data Publish Error[Data:%s]!", pThreadInfo->nThreadIndex, sMessageInfo.paMessageData); - // 메시지 전송 오류인 경우 처리 - // 오류인 경우 오류 로그에 추가하는 형태의 샘플이지만 DB 처리라면 재전송 여부를 결정해서 재전송 몇번 이내면 재전송 하고 그렇지 않으면 실패 처리하는 로직이 필요하다. - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]MQ Data Publish Error[Data:%s]!", pThreadInfo->nThreadIndex, sMessageInfo.paMessageData); - } - else - { - //snprintf((char *)tbl_order, 2+1, "%.2s", szData+12); - lane_log("[Thread:%02d]MQ Data Publish[Data:%s]!", pThreadInfo->nThreadIndex, sMessageInfo.paMessageData); - bMessageMatch = false; - bTimeout = false; -#if 1 //2019.06.28 - if(type == 0) - { -lane_log("Send type[%d] End Loot\n", type); - CloseMQ(pThreadInfo->nThreadIndex, pThreadInfo->sPublishMQ.sMQConnectionState, &pThreadInfo->sPublishMQ.bMQConnection, &pThreadInfo->sPublishMQ.bMQChannelOpen, &pThreadInfo->sPublishMQ.sMQMutex); - CloseMQ(pThreadInfo->nThreadIndex, pThreadInfo->sConsumeMQ.sMQConnectionState, &pThreadInfo->sConsumeMQ.bMQConnection, &pThreadInfo->sConsumeMQ.bMQChannelOpen, &pThreadInfo->sConsumeMQ.sMQMutex); -//sleep(2); -lane_log("Send type[%d] End\n", type); - pThreadInfo->nRunState = SOCK_THREAD_STATE_TERMINATED; - pthread_mutex_destroy((char *)&pThreadInfo->sContextMutex); - pthread_mutex_destroy((char *)&pThreadInfo->sPublishMQ.sMQMutex); - pthread_mutex_destroy((char *)&pThreadInfo->sConsumeMQ.sMQMutex); -lane_log("Mutex destroy[%d]\n", type); -//sleep(2); - SafeFree((void **)&pThreadInfo); - SafeFree((void **)&sMessageInfo.paMessageData); - SafeFree((void **)&pnThreadExitCode); -lane_log("SafeFree[%d]\n", type); -//sleep(2); - return(nResult); - } -#endif - - if (g_bBypassMode) - { - do - { - GetCurrTime(&tRecvNow, &nRecvMillisecond); - nDiffTime = TimeDiff(&tNow, nMillisecond, &tRecvNow, nRecvMillisecond); - nDiffSec = nDiffTime / 1000; - nDiffMilliSec = nDiffTime % 1000; - - if (nDiffMilliSec < 0) - { - nDiffSec--; - nDiffMilliSec += 1000; - } - - sResponseTimeout.tv_sec = g_nResponseTimeout / 1000 - nDiffSec; - sResponseTimeout.tv_usec = (g_nResponseTimeout % 1000 - nDiffMilliSec) * 1000; - if (sResponseTimeout.tv_usec < 0) - { - sResponseTimeout.tv_sec--; - sResponseTimeout.tv_usec += 1000000; - } - if (sResponseTimeout.tv_sec < 0 || sResponseTimeout.tv_usec < 0) - { - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]Response Timeout! - UUID:%s, Message:%s, ProcessTime:%d.%03ds\n", pThreadInfo->nThreadIndex, szSendUUIDString, - sMessageInfo.paMessageData, nDiffSec, nDiffMilliSec); - bTimeout = true; - break; - } - - memset(rtnData, 0x00, sizeof(rtnData)); - memset(procData, 0x00, sizeof(procData)); - nResult = GetMessageFromQueue(pThreadInfo->sConsumeMQ.sMQConnectionState, szExchangername, sizeof(szExchangername), szMessageBuffer, sizeof(szMessageBuffer), - szRecvUUIDString, sizeof(szRecvUUIDString), szReplyQueuename, sizeof(szReplyQueuename), &pThreadInfo->sConsumeMQ.bMQConnection, - &pThreadInfo->sConsumeMQ.bMQChannelOpen, &nDeliveryTag, &sResponseTimeout); -//lane_log("Get Msg[%s][%d]\n", szMessageBuffer, nResult); - snprintf(rtnData, strnlen_s(szMessageBuffer+45, sizeof(szMessageBuffer)-45)+1, "%s", szMessageBuffer+45); -//lane_log("Rtn Data[%s]\n", rtnData); - GetCurrTime(&tRecvNow, &nRecvMillisecond); - nDiffTime = TimeDiff(&tNow, nMillisecond, &tRecvNow, nRecvMillisecond); - nDiffSec = nDiffTime / 1000; - nDiffMilliSec = nDiffTime % 1000; - - if (nDiffMilliSec < 0) - { - nDiffSec--; - nDiffMilliSec += 1000; - } - - if (nResult == MQ_ERR_TIMEOUT) - { - //printf("Response Timeout! - UUID:%s, Message:%s, ProcessTime:%d.%03ds\n", ); - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]Response Timeout! - UUID:%s, Message:%s, ProcessTime:%d.%03ds\n", - pThreadInfo->nThreadIndex, szSendUUIDString, sMessageInfo.paMessageData, nDiffSec, nDiffMilliSec); - bTimeout = true; - break; - } -//printf("TEST11[%d][%d][%s]\n", type, nResult, rtnData); - - nResult = SafeStrCmp(szRecvUUIDString, sizeof(szRecvUUIDString), szSendUUIDString, &nCompareResult); - if (nCompareResult != 0) - { - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]Recv UUID is not matched! - UUID:[Send:%s, Recv:%s], Message:%s, ProcessTime:%d.%03ds\n", pThreadInfo->nThreadIndex, szSendUUIDString, szRecvUUIDString, sMessageInfo.paMessageData, nDiffSec, nDiffMilliSec); - amqp_basic_ack(pThreadInfo->sConsumeMQ.sMQConnectionState, 1, nDeliveryTag, 0); - continue; - } - bMessageMatch = true; - nMessageLength = strnlen_s(szMessageBuffer, sizeof(szMessageBuffer)); - amqp_basic_ack(pThreadInfo->sConsumeMQ.sMQConnectionState, 1, nDeliveryTag, 0); - WriteQueueLog(LogType_MQOut, LogLevel_Info, pThreadInfo->nThreadIndex, 'C', szReplyQueuename, "", szRecvUUIDString, nMessageLength, "%s", szMessageBuffer); - WriteLog(LogType_StandardOut, LogLevel_Info, "[Thread:%02d]MQ Data Consume[Data:%s] - ProcessTime:%d.%03ds!", pThreadInfo->nThreadIndex, szMessageBuffer, nDiffSec, nDiffMilliSec); - } while (bMessageMatch == false && bTimeout == false); - if (!bTimeout) - { -//printf("센터 전송 옴[%d]?\n", type); - // 전송 완료 처리 필요 - }else - { - memset(rtnData, 0x00, sizeof(rtnData)); - snprintf(rtnData, sizeof(rtnData), "%02x0002", cmd); - } - } - } - //sleep(1); // test -/* - } -*/ - CloseMQ(pThreadInfo->nThreadIndex, pThreadInfo->sPublishMQ.sMQConnectionState, &pThreadInfo->sPublishMQ.bMQConnection, &pThreadInfo->sPublishMQ.bMQChannelOpen, &pThreadInfo->sPublishMQ.sMQMutex); - CloseMQ(pThreadInfo->nThreadIndex, pThreadInfo->sConsumeMQ.sMQConnectionState, &pThreadInfo->sConsumeMQ.bMQConnection, &pThreadInfo->sConsumeMQ.bMQChannelOpen, &pThreadInfo->sConsumeMQ.sMQMutex); - pThreadInfo->nRunState = SOCK_THREAD_STATE_TERMINATED; -#if 1 //2019.07.12 메모리 증가로 Mutex Unlock 후 삭제 부분 추가 - pthread_mutex_destroy(&pThreadInfo->sContextMutex); - pthread_mutex_destroy(&pThreadInfo->sPublishMQ.sMQMutex); - pthread_mutex_destroy(&pThreadInfo->sConsumeMQ.sMQMutex); -#endif - SafeFree((void **)&pThreadInfo); - SafeFree((void **)&sMessageInfo.paMessageData); - SafeFree((void **)&pnThreadExitCode); - return 0; -} - -int GetSerialNo() -{ - int nSerialNo; - pthread_mutex_lock(&g_sSerialMutex); - nSerialNo = g_nSerailNo++; - pthread_mutex_unlock(&g_sSerialMutex); - return nSerialNo; -} diff --git a/GREEN_LANE/src/app/lane/rcv_function.c.241206 b/GREEN_LANE/src/app/lane/rcv_function.c.241206 deleted file mode 100644 index b24a75f..0000000 --- a/GREEN_LANE/src/app/lane/rcv_function.c.241206 +++ /dev/null @@ -1,2036 +0,0 @@ -/* -*======================================================================== -* -* SYSTEM : AZN_PLAZA_LANE APP -* FILE : rcv_function.c -* Progrmer : JBY (baarong@neighbor21.co.kr) -* Date : 2018.08.30 -* Modified : -* Remark : -* -*======================================================================== -*/ - -#include -#include -#include -#include -#include -#include - -#include "hi_ctrl.h" -#include "snd_rcv_knd.h" -#include "hi_packet_format.h" -#include "dir_path.h" -#include "file_lb.h" -#include "func_list.h" -#include "ipc_def.h" -#include "lb_func_list.h" -#include "iss_comp.h" -#include "path_def.h" - -extern int oracon_snd; - -#define ATT_A 0x01 /* 축적 DATA */ -#define ATT_P 0x02 /* 통행원시 저장 */ -#define ATT_T 0x04 /* 단말수신 저장 */ -#define ATT_M 0x08 /* 모니터링 */ -#define ATT_W 0x10 /* 근무자료처리로 전달 */ -#define ATT_R 0x20 /* 실시간 자료처리로 전달 */ -#define _DEV_ -extern int snd_snd_no_data() , rq_accuml_data_resnd() , snd_tbl_cmd(); -extern int snd_tm_dt() , snd_tbl_dt() , snd_tbl_dt_hpss(); -extern int confrm_reply_snd_hnd() , lane_cir_test() , snd_crd_no_srch_result(); -extern int lane_stat_info_chng() , wrk_stat_info_chng() , fsave_bkout_cnt_spec(); -extern int rq_lane_fw_data() , snd_open_key_rslt() , snd_welfare_crd_no_result(); - -extern int date_dt_init() , fsave_rprspec() , fsave_clslane_spec(); -extern int fsave_ofc_hnd() , fsave_hr_trf_spec() , fsave_5min_trf_spec(); -extern int fsave_tbl_dmp() , fsave_passraw() , fsave_trmn_rcv(); - -extern int fsave_ecrd_pay_dt() , fsave_ecrd_chrg_dt(); -extern int srch_rmotlane_stat() , fsave_mtnc_dt() , fsave_crd_dt(); - -extern int snd_non_pay_srch_rlt() , snd_crd_no_srch_rlt(), snd_imm_red_srch_rlt(); - -int rcv_rq_seq_no(), rcv_comm_continue_rq(), rcv_accuml_data_ok(); -int rcv_tbl_order(), rcv_lane_stat(), rcv_rpr_data(); -int rcv_close_pass(), rcv_wrk_strt(), rcv_hnd_data(); -int rcv_card_data(), rcv_wrk_end(), rcv_plz_line_reply(); -int remote_lane_stat_rlt(), rcv_non_pay_srch(), rcv_crd_srch(), rcv_refund_data(); - -static char *path; -int err_chk = 0; -int lst_rcv_acc_no; - -static struct { - int kind; /* DATA 종별 */ - uchar desc[50]; /* DATA 제목 */ - int attr; /* DATA ATTRIBUTE */ - int (*func[5])(); /* 처리 FUNCTION */ - /* func[0]() 수신처리 */ - /* func[1]() 상태처리 */ - /* func[2]() 상태처리 */ - /* func[3]() 저장처리 */ - /* func[4]() 응답처리 */ -} rcv_handle[31] = { - /*DATA 종별*/ /* DATA 제목 */ /*DATA ATTRIBUTE*/ /*수신처리*/ /*상태처리*/ /*상태처리*/ /*저장처리 */ /*응답처리*/ - { NS_RQ_SEQ_NO , "전송연번요구" , ATT_W, rcv_rq_seq_no, lane_stat_info_chng, NULL, NULL, snd_rq_seq_no }, - { NS_COMM_CONTINUE_RQ , "교신재개요구" , 0, rcv_comm_continue_rq, NULL, NULL, NULL, rq_accuml_data_resnd }, - { NS_ACCUML_DATA_OK , "축적데이터 전송완료" , 0, rcv_accuml_data_ok, NULL, NULL, NULL, NULL }, - { NS_TM_RQ , "시각요구" , 0, NULL, NULL, NULL, NULL, snd_tm_dt }, - { NS_CMD_REPLY , "지령응답" , 0, NULL, lane_stat_info_chng, NULL, NULL, NULL }, - { NS_TBL_ORDER , "테이블 요구" , 0, rcv_tbl_order, NULL, NULL, NULL, snd_tbl_dt }, - { NS_LANE_STAT , "차로상태" , ATT_W, rcv_lane_stat, lane_stat_info_chng, NULL, NULL, snd_tbl_cmd }, - { NS_RPR_DATA , "보수데이터" , ATT_A|ATT_W, rcv_rpr_data, lane_stat_info_chng, NULL, NULL, NULL }, - { NS_CLOSE_PASS , "야간계수 데이터" , ATT_A|ATT_W, rcv_close_pass, NULL, NULL, NULL, NULL }, - { NS_WRK_START , "근무개시보고" , ATT_A|ATT_P|ATT_T|ATT_M|ATT_W, rcv_wrk_strt, lane_stat_info_chng, wrk_stat_info_chng, NULL, NULL }, - { NS_HND_DATA , "처리 데이터" , ATT_A|ATT_P|ATT_T|ATT_M|ATT_W, rcv_hnd_data, NULL, NULL, NULL, NULL }, - { NS_CRD_HND_DATA , "카드처리 데이터" , ATT_A|ATT_P|ATT_T|ATT_M|ATT_W, rcv_card_data, NULL, NULL, NULL, NULL }, - { NS_WRK_END , "근무종료데이터" , ATT_A|ATT_P|ATT_T|ATT_M|ATT_W, rcv_wrk_end, lane_stat_info_chng, wrk_stat_info_chng, NULL, snd_tbl_cmd }, - { NS_DUMP_TBL , "테이블 덤프" , 0, NULL, NULL, NULL, NULL, confrm_reply_snd_hnd }, - { NS_LANE_LINE_TEST , "차로측기동회선테스트 테이터" , 0, NULL, NULL, NULL, NULL, lane_cir_test }, - { NS_PLZ_LINE_TEST_REPLY , "영업소측 기동회선테스트 테이터 응답" , 0, rcv_plz_line_reply, NULL, NULL, NULL, NULL }, - { NS_REMOTE_LANE_STAT_REPLY, "원격차로상태응답" , 0, remote_lane_stat_rlt, NULL, NULL, NULL, NULL }, - { NS_NON_PAY_SRCH , "미납정보조회" , ATT_W, NULL, NULL, NULL, NULL, snd_non_pay_srch_rlt }, - { NS_CRD_SRCH , "카드번호조회" , ATT_W, NULL, NULL, NULL, NULL, snd_crd_no_srch_rlt }, - { NS_IMMRED_SRCH , "면제감면정보조회" , ATT_W, NULL, NULL, NULL, NULL, snd_imm_red_srch_rlt }, - { NS_REFUND_DATA , "환불처리 데이터" , ATT_A|ATT_W, rcv_refund_data, NULL, NULL, NULL, NULL }, - { -1 , "" , 0, NULL, NULL, NULL, NULL, NULL } -}; - -/*=========================== FUNCTION LIST =================================*/ -/* recv_process() 하위차로에서 수신된 DATA FRAME 처리 MAIN FUNCTION */ -/* rcv_xxxxx() xxxxx FRAME DATA의 수신 처리 */ -/* chk_seq_no() 수신 전송연번의 CHECKING */ -/*===========================================================================*/ - -/* - *======================================================================== - * - * Function : recv_process() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.24 - * Modified : - * Remark : 차로와 통신에서 수신된 DATA 처리 - * - *=========================================================================== -*/ - -int recv_process(char *p) -{ - struct write_info wi; - char log_msg[128]; - int retc, ret_dt; - int ii, jj, backup_seq = 0; - int kk; - int chkdiv; - int ret; - - hi_comm_ctrl.be_stat_info = hi_comm_ctrl.now_stat_info; - - if(!(hi_comm_ctrl.now_stat_info & H_ACC_RESND)) - { - e_memcpy(hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.bas_tbl.plz_id); - } -//lane_log("수신데이터 종별[%x]\n", hi_comm_ctrl.rcv_ctrl.cmd); - /*************************************************/ - /* 수신 자료의 DATA 종별 및 처리 PROCEDURE CHECK */ - /*************************************************/ - for (ii = 0; rcv_handle[ii].kind != -1; ii++) - { - if ((int)hi_comm_ctrl.rcv_ctrl.cmd == rcv_handle[ii].kind) break; - } -#if 0 - for (kk = 0; web_rcv_handle[kk].kind != -1; kk++) - { - if ((int)hi_comm_ctrl.rcv_ctrl.cmd == web_rcv_handle[kk].kind) break; - } -#endif -//lane_log("recv 1[%x] [%x]\n", hi_comm_ctrl.rcv_ctrl.cmd, rcv_handle[ii].kind); - if (rcv_handle[ii].kind == -1) - { - sprintf(log_msg, "수신 DATA 종별(%02X) ERROR.", hi_comm_ctrl.rcv_ctrl.cmd); - lane_log("수신 DATA 종별(%02X) ERROR.", hi_comm_ctrl.rcv_ctrl.cmd); - err_log(log_msg, 0); - - return (-1); - } - - chkdiv = chk_seq_no(); -//lane_log("recv 2 [%d] \n", chkdiv); - /********************************************************/ - /* 전처리 : 1. 축적 DATA인 경우, 전송연번 CHECK */ - /* 2. 재송요구시 첫번째 DATA가 근무개시 DATA가 */ - /* 아닌 경우 ERROR 처리 */ - /********************************************************/ - if ((rcv_handle[ii].attr & ATT_A) && chkdiv != 0) - { - sprintf(log_msg, "축적 데이타 전송연번 오류(관리: %08X 수신=%08X)", - hi_comm_ctrl.write_info.rcv_snd_no, - hi_comm_ctrl.rcv_ctrl.snd_no); - lane_log(log_msg, "축적 데이타 전송연번 오류(관리: %08X 수신=%08X)", - hi_comm_ctrl.write_info.rcv_snd_no, - hi_comm_ctrl.rcv_ctrl.snd_no); - err_log(log_msg, 0); - - return (-1); /* 축적 DATA 전송연번 오류 */ - } -//lane_log("recv 3\n"); - if ((rcv_handle[ii].attr & ATT_A) && (hi_comm_ctrl.now_stat_info & (H_ACC_RESND|H_FRAME_WAIT)) == (H_ACC_RESND|H_FRAME_WAIT)) - { - lane_log(log_msg, "축적 데이타 관리 %04X 수신=%04X 수신 상태 = %04X", hi_comm_ctrl.write_info.rcv_snd_no, hi_comm_ctrl.rcv_ctrl.snd_no, hi_comm_ctrl.now_stat_info); - lane_log(log_msg, "축적 데이타 재전송중:0x0004, 축적재전송 1st FRAME 수신대기:0x0008"); - if (hi_comm_ctrl.rcv_ctrl.cmd == NS_ACCUML_DATA_OK) - { - sprintf(log_msg, "축적데이타 재전송 : 재전송 자료가 없습니다."); - lane_log("축적데이타 재전송 : 재전송 자료가 없습니다."); - err_log(log_msg, 0); - lcc_reply(LW_RESND_NO, 1, 1, log_msg); - hi_comm_ctrl.now_stat_info = 0; - return (-1); - } - else if (hi_comm_ctrl.rcv_ctrl.cmd == NS_WRK_START) - { - return (0); - } - hi_comm_ctrl.now_stat_info &= ~H_FRAME_WAIT; - lane_log(log_msg, "축적 데이타 관리 수신 상태 = %04X", hi_comm_ctrl.now_stat_info); - lane_log(log_msg, "축적 데이타 재전송중:0x0004, 축적재전송 1st FRAME 수신대기:0x0008"); - } -//lane_log("recv 4\n"); - /********************************************************/ - /* 재전송이 아닌 축적 DATA인 경우, 전송연번 저장 */ - /********************************************************/ - if ((rcv_handle[ii].attr & ATT_A) && !(hi_comm_ctrl.now_stat_info & H_ACC_RESND)) - { - backup_seq = hi_comm_ctrl.write_info.rcv_snd_no; - /* 중간에 데이터 장애로 누락 발생 시, 아래의 2개 값을 수정하면 해당 전송연번 다시 수신 가능 */ - hi_comm_ctrl.write_info.rcv_snd_no = hi_comm_ctrl.rcv_ctrl.snd_no; /* 최종수신 전송연번 */ - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = hi_comm_ctrl.rcv_ctrl.snd_no; /* 최종수신 전송연번 */ - hi_comm_ctrl.lane_stat_info.last_rcv_knd = hi_comm_ctrl.rcv_ctrl.cmd; /* 최종수신 DATA 종별 */ - } -//lane_log("recv 5\n"); - /********************************************************/ - /* DATA 종별에 따른 각 처리 함수를 순차적으로 호출 */ - /* 1. 모니터링 자료처리 */ - /* 2. 각 DATA 종별에 따른 처리 함수 호출 */ - /********************************************************/ - - ret_dt = 0; - if ((hi_comm_ctrl.now_stat_info & H_ERR_REST) || (hi_comm_ctrl.now_stat_info & H_ACC_RESND)) - ret_dt = get_data_time(hi_comm_ctrl.rcv_ctrl.buf, &wi); - - path = p; - - for (jj = 0; jj < 4 && ret_dt == 0; jj++) - { -//lane_log("recv 8[%d]\n", ii); - if (rcv_handle[ii].func[jj] == NULL) continue; -//lane_log("recv 9[%d]\n", jj); - retc = (*rcv_handle[ii].func[jj])(p); -//lane_log("recv 10[%d]\n", retc); - switch (retc) - { - case -1: /* ATT_A 축적 DATA ,H_ACC_RESND 0x0004 축적 DATA 재전송 중 */ - lane_log("RECEIVE PROC ERR [%d]\n", jj); - err_chk = 1; - if ((rcv_handle[ii].attr & ATT_A) && !(hi_comm_ctrl.now_stat_info & H_ACC_RESND)) - { - hi_comm_ctrl.write_info.rcv_snd_no = backup_seq; - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = backup_seq; - } - return (-1); - case -2: lane_log("RECEIVE PROC SKIP \n"); - return (0); - default: break; - } -#if 0 - if (web_rcv_handle[kk].func[jj] == NULL) continue; - retc = (*web_rcv_handle[kk].func[jj])(p); -#endif - } -//lane_log("recv 11[%d][%d]\n", ii, jj); - if (rcv_handle[ii].func[jj] != NULL) - { -//lane_log("수신처리 Start \n"); - hi_comm_ctrl.snd.len = (*rcv_handle[ii].func[jj])(1); -//lane_log("수신처리 [%d]\n", hi_comm_ctrl.snd.len); - /* 차로 상태응답 - 1.지령이 있으면 지령으로 응답처리 - 2.지령이 없으면 확인 응답처리 */ - lane_log("(rcv_function.cpp) hi_comm_ctrl.snd.len = %d\n", hi_comm_ctrl.snd.len); - - if(hi_comm_ctrl.snd.len == 0) - { -//lane_log("Chk [%x] [%x]\n", hi_comm_ctrl.rcv_ctrl.cmd, NS_LANE_STAT, NS_TBL_ORDER); - if(hi_comm_ctrl.rcv_ctrl.cmd == NS_LANE_STAT || hi_comm_ctrl.rcv_ctrl.cmd == NS_TBL_ORDER) - { - lane_log("(rcv_function.cpp) 확인응답 송신, hi_comm_ctrl.rcv_ctrl.cmd(%d)\n", hi_comm_ctrl.rcv_ctrl.cmd); - hi_comm_ctrl.snd.len = confrm_reply_snd_hnd(1); - } - - if(hi_comm_ctrl.rcv_ctrl.cmd == NS_WRK_END) - { - lane_log("보증전송연번 송신 확인[%02x]\n", hi_comm_ctrl.rcv_ctrl.cmd); - hi_comm_ctrl.snd.len = snd_warr_snd_no(0); - lane_comm_snd(); - } - } - - - } - - if (rcv_handle[ii].attr & ATT_T && ret_dt == 0) - { - ret = fsave_trmn_rcv(); /* 단말수신-F 저장 */ - - if(ret < 0) - { - lane_log("단말수신-F 저장 실패 ret = %d\n", ret); - return (-1); - } - } - - /* 이상복구 수순중 */ - if ((rcv_handle[ii].attr & ATT_A) && ((hi_comm_ctrl.now_stat_info & H_ERR_REST) || (hi_comm_ctrl.now_stat_info & H_ACC_RESND))) - { - hi_comm_ctrl.snd.len = confrm_reply_snd_hnd(1); - } -//lane_log("recv 13\n"); - /********************************************************/ - /* 축적 DATA 재전송요구시 수신 전송연번이 재전송요구 */ - /* 최종전송연번과 동일시 통신 단절후, 재개처리 */ - /********************************************************/ - if (hi_comm_ctrl.now_stat_info & H_ACC_RESND) - { - if (hi_comm_ctrl.rcv_ctrl.snd_no == hi_comm_ctrl.rtr.rq_resnd_endno || - hi_comm_ctrl.rcv_ctrl.cmd == NS_WRK_END) - { - sprintf(log_msg, "축적데이타 재전송 완료...."); - //lane_log("[%s]\n", log_msg); - //lane_log(log_msg, "축적데이타 재전송 완료...."); - err_log(log_msg, 0); - //lane_log("err_log 끝?\n"); - lcc_reply(LW_RESND_NO, 1, 1, log_msg); - hi_comm_ctrl.now_stat_info &= ~(H_ACC_RESND|H_FRAME_WAIT); - return (-1); - } - } -/* - if(rcv_handle[ii].kind == NS_ACCUML_DATA_OK && err_chk != 1 && hi_comm_ctrl.cday.tm_hour >= 21 || hi_comm_ctrl.cday.tm_hour < 7) - { - err_chk = 0; -lane_log("축적데이터 전송완료[%02d : %02d]\n", hi_comm_ctrl.cday.tm_hour, hi_comm_ctrl.cday.tm_min); - hi_comm_ctrl.warr_snd_no = lst_rcv_acc_no; - hi_comm_ctrl.snd.len = snd_warr_snd_no(0); - lane_comm_snd(); - } -*/ -//lane_log("recv 14\n"); - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_rq_seq_no() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : 전송연번 요구 - * - *======================================================================== -*/ -int rcv_rq_seq_no() -{ - - struct rcv_lane_data rd; - struct hi_rq_seq_no *hrsn; - int ret; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); -//lane_log("rcv_rq1\n"); - hi_comm_ctrl.now_stat_info |= H_INIT; /* 초기화 */ -//lane_log("rcv_rq2\n"); - hi_comm_ctrl.write_info.con_stat = CONNECT_STAT; - -#if 0 - hrsn = (struct hi_rq_seq_no *)hi_comm_ctrl.rcv_ctrl.buf; - sprintf((char *)hi_comm_ctrl.write_info.year, "%04d", hi_comm_ctrl.cday.tm_year+1900); - sprintf((char *)hi_comm_ctrl.write_info.mon, "%02d", hi_comm_ctrl.cday.tm_mon+1); - sprintf((char *)hi_comm_ctrl.write_info.day, "%02d", hi_comm_ctrl.cday.tm_mday); - sprintf((char *)hi_comm_ctrl.write_info.hr, "%02d", hi_comm_ctrl.cday.tm_hour); - sprintf((char *)hi_comm_ctrl.write_info.min, "%02d", hi_comm_ctrl.cday.tm_min); - sprintf((char *)hi_comm_ctrl.write_info.sec, "%02d", hi_comm_ctrl.cday.tm_sec); - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf((char *)hi_comm_ctrl.write_info.lane_no, "%02d", hi_comm_ctrl.lane_no); - - memset(&rd, 0x00, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.write_info.plz_id); - sprintf((char *)rd.wrk_datetm, "%04d%02d%02d%02d%02d%02d", - hi_comm_ctrl.cday.tm_year+1900, hi_comm_ctrl.cday.tm_mon+1, hi_comm_ctrl.cday.tm_mday, - hi_comm_ctrl.cday.tm_hour, hi_comm_ctrl.cday.tm_min, hi_comm_ctrl.cday.tm_sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%02d00", hi_comm_ctrl.lane_no); -//lane_log("====전송연번요구 일자[%.14s]\n", rd.wrk_datetm); - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].lane_type[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "ETCS"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].lane_type[1] - '0' == 4) - sprintf((char *)rd.wrkr_no, "MLFF"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s ", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)rd.buf, "%s", (char *)hrsn); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 전송연번요구[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } - -//lane_log("전송연번 요구[%s]\n", rtn); - hi_comm_ctrl.snd.len = snd_rq_seq_no(rtn);/* 전송연번 요청 결과 송신 */ - - lcc_reply(LW_RQ_SEQ_NO, 0, 1, "전송연번 전송이 완료 되었읍니다"); -#endif -//lane_log("rcv_rq3\n"); - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_comm_continue_rq() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : 교신재개요구 수신 처리 - * - *======================================================================== -*/ -int rcv_comm_continue_rq() -{ - struct rcv_lane_data rd; - struct hi_comm_continue_rq *hccr; - struct rq_warr_info *rq_no; - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - int ret; - - hi_comm_ctrl.now_stat_info |= H_ERR_REST; /* 이상복구 수순 */ - if (hi_comm_ctrl.now_stat_info & H_ACC_RESND) /* 축적자료 재전송중 ? */ - hi_comm_ctrl.now_stat_info |= H_FRAME_WAIT; /* 축적자료 1st DATA 대기중 */ - hi_comm_ctrl.now_stat_info |= H_INIT; /* 초기화 */ -#if 0 - hccr = (struct hi_rq_seq_no *)hi_comm_ctrl.rcv_ctrl.buf; - - memset(&rd, 0x00, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.write_info.plz_id); - sprintf((char *)rd.wrk_datetm, "%04d%02d%02d%02d%02d%02d", - hi_comm_ctrl.cday.tm_year+1900, hi_comm_ctrl.cday.tm_mon+1, hi_comm_ctrl.cday.tm_mday, - hi_comm_ctrl.cday.tm_hour, hi_comm_ctrl.cday.tm_min, hi_comm_ctrl.cday.tm_sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%02d00", hi_comm_ctrl.lane_no); - - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].lane_type[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "ETCS"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].lane_type[1] - '0' == 4) - sprintf((char *)rd.wrkr_no, "MLFF"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s ", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)rd.buf, "%s", (char *)hccr); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 교신재개요구[%.2s]처리실패\n", hi_comm_ctrl.write_info.plz_id); - return(-1); - } - - rq_no = rtn; -//lane_log("교신재개요구 수신 데이터[%s]\n", rtn); - sprintf((char *)hi_comm_ctrl.rtr.wrk_year, "%.4s", rq_no->wrk_date); - sprintf((char *)hi_comm_ctrl.rtr.wrk_mon, "%.2s", rq_no->wrk_date+4); - sprintf((char *)hi_comm_ctrl.rtr.wrk_day, "%.2s", rq_no->wrk_date+6); - sprintf(tmp, "%.8s%c", rq_no->rq_seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.rtr.rq_resnd_strtno = strtoul(tmp, NULL, 16); - //hi_comm_ctrl.sndrq_sndno = strtoul(tmp, NULL, 16); - sprintf(tmp, "%.8s%c", rq_no->warr_snd_no, '\0'); - hi_comm_ctrl.warr_snd_no = strtoul(tmp, NULL, 16); -//lane_log("수신받은 최종 수신 연번[%08x][%.8s]\n", hi_comm_ctrl.write_info.rcv_snd_no, rq_no->wrk_date); -#endif - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_accuml_data_ok() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : 축적 DATA 전송완료 수신 처리 - * - *======================================================================== -*/ -int rcv_accuml_data_ok() -{ - hi_comm_ctrl.now_stat_info &= ~H_ERR_REST; /* 이상복구 수순 */ - if (hi_comm_ctrl.now_stat_info & H_ACC_RESND) /* 축적자료 재전송중 ? */ - { -//lane_log("############# 축적데이터 전송 완료 1 [%d]\n", lst_rcv_acc_no); - hi_comm_ctrl.now_stat_info &= ~H_ACC_RESND; /* 축적자료 재전송요구 CLR */ - hi_comm_ctrl.now_stat_info &= ~H_FRAME_WAIT; /* 축적자료 1st DATA 대기중 */ - lcc_reply(LW_RESND_NO, 0, 1, "축적자료 재수신이 완료 되었읍니다"); - } -//lane_log("############# 축적데이터 전송 완료 2 [%d]\n", lst_rcv_acc_no); -//lane_log("############# 축적데이터 전송 완료 3 [%02d]\n", hi_comm_ctrl.cday.tm_hour); - if(hi_comm_ctrl.cday.tm_hour >= 21 && !(hi_comm_ctrl.now_stat_info & H_ERR_REST) || hi_comm_ctrl.cday.tm_hour < 7 && !(hi_comm_ctrl.now_stat_info & H_ERR_REST)) - { - //lane_log("############# 축적데이터 전송 완료 4 [%02d]\n", hi_comm_ctrl.cday.tm_hour); -/* 업무 시간 외에 축적데이터 전송 완료 시, 보증전송연번 변경 */ - hi_comm_ctrl.warr_snd_no = lst_rcv_acc_no; - } - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_tbl_order() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : TABLE 요구 DATA 처리 - * - *======================================================================== -*/ -int rcv_tbl_order() -{ - struct hi_tbl_order *hto; - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - hto = (struct hi_tbl_order *)hi_comm_ctrl.rcv_ctrl.buf; - - sprintf(tmp, "%.8s%c", hto->frame_no, '\0'); - - if (strtoul(tmp, NULL, 16) != FRAME_LAST_I) /* 마지막 FRAME */ - return (0); - - if (lb_data2atoi((char *)hto->tbl_typ, 2) != TB_LAST) /* 최종 TABLE ? */ - return (0); - - /* TABLE 전송 완료 */ - hi_comm_ctrl.now_stat_info &= ~H_INIT; - - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_lane_stat() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : 차로상태정보 수신 처리 - * - *======================================================================== -*/ -int rcv_lane_stat(int rsp) -{ - struct hi_lane_stat *hls; - struct rcv_lane_data rd; -#if 0 - struct write_info wi; -#endif - int ret = 0, ii, jj; - static time_t c_clock = 0; - struct tm *t; - - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char bak[MAX_STRING_SIZE]; memset(bak, 0x00, sizeof(bak)); - char date[8+1]; - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - struct { - uchar plz_id[2]; - int lane_no; - uchar anpr[10]; - } anpr_id[20] = - { - {"01", 1, "A20201107"}, - {"01", 2, "A20201108"}, - {"01", 3, "A20201109"}, - {"01", 4, "A20211110"}, - {"01", 5, "A20201111"}, - {"01", 6, "A20211112"}, - {"01", 7, "A20201113"}, - {"01", 8, "A20211114"}, - {"03", 1, "A20203115"}, - {"03", 2, "A20213116"}, - {"03", 3, "A10103117"}, - {"03", 4, "A10103118"}, - {"03", 5, "CLOSE "}, - {"03", 6, "CLOSE "}, - {"03", 7, "A10103119"}, - {"03", 8, "A10103120"}, - {"03", 9, "A10103121"}, - {"03", 10, "A10103122"}, - {"00", -1, ""} - }; - - /******************************************************/ - /* 기초사항 TABLE의 수정유무 CHECK, 최신정보로 READ */ - /******************************************************/ -//lane_log("PLZ_ID[%.2s] [%.2s]\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.lane_stat_info.plz_id); -if(strncmp(hi_comm_ctrl.write_info.plz_id, PLZ_CODE2, 2) != 0) -{ - //lane_log("######## PLZ_ID[%.2s] [%.2s]\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.lane_stat_info.plz_id); - snprintf(hi_comm_ctrl.write_info.plz_id, 2+1, "%.2s", PLZ_CODE2); -} - - lb_freadx(&hi_comm_ctrl.write_info, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); -//lane_log("(rcv_function.cpp) 차로상태정보 영업소ID : %.2s\n", hi_comm_ctrl.bas_tbl.plz_id); -//lane_log("(rcv_function.cpp) 차로상태정보 차로번호[%.8s] : %2d\n",&hi_comm_ctrl.write_info.year[0], hi_comm_ctrl.lane_no); - - hls = (struct hi_lane_stat *)hi_comm_ctrl.rcv_ctrl.buf; - - sprintf((char *)hi_comm_ctrl.write_info.year, "%04d", hi_comm_ctrl.cday.tm_year+1900); - sprintf((char *)hi_comm_ctrl.write_info.mon, "%02d", hi_comm_ctrl.cday.tm_mon+1); - sprintf((char *)hi_comm_ctrl.write_info.day, "%02d", hi_comm_ctrl.cday.tm_mday); - sprintf((char *)hi_comm_ctrl.write_info.hr, "%02d", hi_comm_ctrl.cday.tm_hour); - sprintf((char *)hi_comm_ctrl.write_info.min, "%02d", hi_comm_ctrl.cday.tm_min); - sprintf((char *)hi_comm_ctrl.write_info.sec, "%02d", hi_comm_ctrl.cday.tm_sec); - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf(tmp, "%.8s%c", hls->seq_no, '\0'); - - for(jj = 0; jj < 20; jj++) - { - if(anpr_id[jj].lane_no == -1) - break; - - if(strncmp(anpr_id[jj].plz_id, hi_comm_ctrl.write_info.plz_id, 2) == 0 && anpr_id[jj].lane_no == hi_comm_ctrl.lane_no) - break; - } - - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.write_info.con_stat = 'C'; -//차로상태정보 저장 - hi_comm_ctrl.lane_stat_info.mchi_stat0 = hls->mchi_stat[0]; - hi_comm_ctrl.lane_stat_info.mchi_stat1 = hls->mchi_stat[1]; - hi_comm_ctrl.lane_stat_info.mchi_stat2 = hls->mchi_stat[2]; - hi_comm_ctrl.lane_stat_info.mchi_stat3 = hls->mchi_stat[3]; - hi_comm_ctrl.lane_stat_info.mchi_stat4 = hls->mchi_stat[4]; - hi_comm_ctrl.lane_stat_info.mchi_stat5 = hls->mchi_stat[5]; - hi_comm_ctrl.lane_stat_info.mchi_stat6 = hls->mchi_stat[6]; - hi_comm_ctrl.lane_stat_info.mchi_stat7 = hls->mchi_stat[7]; - - memset(tmp, 0x00, sizeof(tmp)); - sprintf(tmp, "%.8s%c", hls->bl_seq_no, '\0'); - hi_comm_ctrl.lane_stat_info.bl_lst_hnd_no = strtoul(tmp, NULL, 16); - memset(tmp, 0x00, sizeof(tmp)); - sprintf(tmp, "%.8s%c", hls->bef_seq_no, '\0'); - hi_comm_ctrl.lane_stat_info.bef_lst_hnd_no = strtoul(tmp, NULL, 16); - memset(tmp, 0x00, sizeof(tmp)); - sprintf(tmp, "%.8s%c", hls->imm_carno_seq_no, '\0'); - hi_comm_ctrl.lane_stat_info.imm_lst_hnd_no = strtoul(tmp, NULL, 16); - memset(tmp, 0x00, sizeof(tmp)); - sprintf(tmp, "%.8s%c", hls->rfid_seq_no, '\0'); - hi_comm_ctrl.lane_stat_info.rfid_lst_hnd_no = strtoul(tmp, NULL, 16); - memset(tmp, 0x00, sizeof(tmp)); - sprintf(tmp, "%.8s%c", hls->red_carno_seq_no, '\0'); - hi_comm_ctrl.lane_stat_info.red_lst_hnd_no = strtoul(tmp, NULL, 16); - - hi_comm_ctrl.lane_stat_info.comm_stat = CONNECT_STAT; - - for(ii = 0; ii < 20; ii++) - { - hi_comm_ctrl.lane_stat_info.tbl_stat[ii][0] = lb_data2atoi(hls->tbl_stat[ii].rvs_no, 2); - hi_comm_ctrl.lane_stat_info.tbl_stat[ii][1] = hls->tbl_stat[ii].stat; - } -#if 0 -//차로상태정보 저장 끝 - memset(&rd, 0x20, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.write_info.plz_id); - sprintf((char *)rd.wrk_datetm, "%04d%02d%02d%02d%02d%02d", - hi_comm_ctrl.cday.tm_year+1900, hi_comm_ctrl.cday.tm_mon+1, hi_comm_ctrl.cday.tm_mday, - hi_comm_ctrl.cday.tm_hour, hi_comm_ctrl.cday.tm_min, hi_comm_ctrl.cday.tm_sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); - - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - sprintf((char *)rd.wrkr_no, "SYSI "); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "SYSO"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s ", hi_comm_ctrl.write_info.wrkr_no); - -//lane_log("======차로상태정보 수신 메시지 확인[%08x]\n", hi_comm_ctrl.rcv_ctrl.snd_no); -//lane_log("차로상태 연결 확인 [%c]\n", hi_comm_ctrl.lane_stat_info.comm_stat); - rd.con_stat = hi_comm_ctrl.lane_stat_info.comm_stat; - - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)rd.buf, "%s", (char *)hls); - //lane_log("###### 차로상태정보[%s]\n", rd.buf); -#else - sprintf((char *)bak, "%s%04d%02d%02d%02d%02d%02d%c%-4s%c%c%c", anpr_id[jj].anpr, - hi_comm_ctrl.cday.tm_year+1900, hi_comm_ctrl.cday.tm_mon+1, hi_comm_ctrl.cday.tm_mday, - hi_comm_ctrl.cday.tm_hour, hi_comm_ctrl.cday.tm_min, hi_comm_ctrl.cday.tm_sec, - hls->anpr_cam, hls->anpr_tempa, hls->anpr_door, hls->anpr_sd, '\0'); -#endif -#if 0 -//lane_log("차로상태 송신[%s]\n", bak); - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&bak, path, rtn); -//lane_log("DB처리 결과(MQ) [%d]\n", ret); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 차로상태정보[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - //return(-1); - } -#endif -//lane_log("차로상태 RET [%d]\n", ret); - hi_comm_ctrl.now_stat_info &= ~H_INIT; - - c_clock = hi_comm_ctrl.time; - t = localtime(&c_clock); - if( t->tm_hour == 00 && t->tm_min == 00 ) - { -//lane_log("Time Check In "); - sprintf(date, "%04d%02d%02d", t->tm_year+1900, t->tm_mon+1, t->tm_mday); - //log_open(date); - //packet_open(date); - -//lane_log("보증지시 LANE_STAT Go [%02d : %02d : %02d]\n", t->tm_hour, t->tm_min, t->tm_sec); - hi_comm_ctrl.warr_snd_no = lst_rcv_acc_no; - //hi_comm_ctrl.warr_snd_no = hi_comm_ctrl.lane_stat_info.lst_rev_snd_no; - hi_comm_ctrl.snd.len = snd_warr_snd_no(0); - lane_comm_snd(); - } - -//lane_log("차로상태정보 끝\n"); - return 0; -} - -/* - *======================================================================== - * - * Function : rcv_rpr_data() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : 보수 DATA 수신처리 - * - *======================================================================== -*/ -int rcv_rpr_data() -{ - struct rcv_lane_data rd; -#if 0 - struct write_info wi; -#endif - struct hi_rpr_data *hrd; - int ret = 0; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - hrd = (struct hi_rpr_data *)hi_comm_ctrl.rcv_ctrl.buf; - memcpy(hi_comm_ctrl.write_info.year, &hrd->year, 4); - memcpy(hi_comm_ctrl.write_info.mon, &hrd->month, 2); - memcpy(hi_comm_ctrl.write_info.day, &hrd->day, 2); - memcpy(hi_comm_ctrl.write_info.hr, &hrd->hour, 2); - memcpy(hi_comm_ctrl.write_info.min, &hrd->min, 2); - memcpy(hi_comm_ctrl.write_info.sec, &hrd->sec, 2); - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - - if(memcmp(hrd->wrk_no, "0000", 4) == 0) - memcpy(hi_comm_ctrl.write_info.wrk_no, hrd->terminal_no, sizeof(hi_comm_ctrl.write_info.wrk_no)); - - sprintf(tmp, "%.8s%c", hrd->seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = strtoul(tmp, NULL, 16); - -#if 0 - memset(&rd, 0x20, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.bas_tbl.plz_id); - sprintf((char *)rd.wrk_datetm, "%04d%02d%02d%02d%02d%02d", - hi_comm_ctrl.cday.tm_year+1900, hi_comm_ctrl.cday.tm_mon+1, hi_comm_ctrl.cday.tm_mday, - hi_comm_ctrl.cday.tm_hour, hi_comm_ctrl.cday.tm_min, hi_comm_ctrl.cday.tm_sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); - - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - sprintf((char *)rd.wrkr_no, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "SYSO"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)rd.buf, "%s", (char *)hrd); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 보수처리[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } -#endif - if(ret == 0) - { - lst_rcv_acc_no = strtoul(tmp, NULL, 16); - } - - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_close_pass() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2019.05.12 - * Modified : - * Remark : 야간계수 통행 DATA - * - *======================================================================== -*/ -int rcv_close_pass() -{ - struct rcv_lane_data rd; - struct write_info wi; - struct hi_close_pass *hclp; - int ret, retw; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char bak[MAX_STRING_SIZE]; memset(bak, 0x00, sizeof(bak)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - char mCarNo[3+1]; - - hclp = (struct hi_close_pass *)hi_comm_ctrl.rcv_ctrl.buf; - e_memcpy(hi_comm_ctrl.write_info.year, hclp->year); - e_memcpy(hi_comm_ctrl.write_info.mon, hclp->month); - e_memcpy(hi_comm_ctrl.write_info.day, hclp->day); - e_memcpy(hi_comm_ctrl.write_info.hr, hclp->hour); - e_memcpy(hi_comm_ctrl.write_info.min, hclp->min); - e_memcpy(hi_comm_ctrl.write_info.sec, hclp->sec); - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf(tmp, "%.8s%c", hclp->seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = strtoul(tmp, NULL, 16); - sprintf(wi.plz_id, "%.2s", PLZ_CODE2); - lb_freadx(&wi, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); - memset(&rd, 0x20, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.bas_tbl.plz_id); - sprintf((char *)rd.wrk_datetm, "%.4s%.2s%.2s%.2s%.2s%.2s", - hi_comm_ctrl.write_info.year, hi_comm_ctrl.write_info.mon, hi_comm_ctrl.write_info.day, - hi_comm_ctrl.write_info.hr, hi_comm_ctrl.write_info.min, hi_comm_ctrl.write_info.sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); - if(strlen(rd.wrk_no) == 0) - sprintf((char *)rd.wrk_no, "%.2s00", rd.lane_no); - - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - sprintf((char *)rd.wrkr_no, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "SYSO"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)bak, "%.8s%.2s%.8s%.2s%.6s%.4s%.2s%.2s%.2s%.2s%.2s%c%.2s%c%c%-16s%.4s%.4s%.4s%.4s", - hclp->seq_no, hclp->kind, hclp->wrk_date, hclp->lane_no, hclp->serial_no, hclp->year, hclp->month, hclp->day, - hclp->hour, hclp->min, hclp->sec, hclp->io_div, hclp->plz_id, hclp->car_kind, hclp->image_yn, - hclp->car_no, hclp->x_point, hclp->y_point, hclp->img_width, hclp->img_heigh); - //sprintf((char *)rd.buf, "%s", (char *)hclp); - snprintf((char *)rd.buf, strlen(bak)+1, "%s", bak); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 야간계수[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } -#if 0 - memset(bak, 0x00, sizeof(bak)); - - //RemoveTerminatedThread(); - - sprintf((char *)bak, "%.2s%.2s%.4s%.2s%.2s%.2s%.2s%.2s%.6s%-16s%c%c%c", - hclp->plz_id, hclp->lane_no, hclp->year, hclp->month, hclp->day, hclp->hour, hclp->min, hclp->sec, - hclp->serial_no, hclp->car_no, hclp->car_kind, hclp->io_div, '\0'); - -//lane_log("야간계수 Web 송신[%s]\n", bak); - retw = MessageSender(NS_WEB_CLOSE_PASS, (char *)&bak, path, rtn); - //usleep(300000); - - if(retw < 0) - { - lane_log("(rcv_function.cpp) Web 야간계수데이터[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - } -#endif - if(ret == 0) - { - lst_rcv_acc_no = strtoul(tmp, NULL, 16); - } -#ifdef _DEV_ - //장애 대응을 위한 처리자료 파일화 - char queue_d[128]; memset(queue_d, 0x00, sizeof(queue_d)); - char queue_f[128]; memset(queue_f, 0x00, sizeof(queue_f)); - char back_car[128]; memset(back_car, 0x00, sizeof(back_car)); - int div_carkind; - FILE *backup_f; - sprintf(queue_d, "%s/%.8s%c", LOG_DIR, rd.wrk_datetm, '\0'); - mkdir(queue_d,0755); - sprintf(queue_f, "%s/queue%.2s%.2s.log", queue_d, rd.plz_id, rd.lane_no); -/* - div_carkind = hclp->car_kind - '0'; - sprintf(back_car, "%.16s", hclp->car_no); - del_space(back_car); - - if(strlen(back_car) == 0) - sprintf(back_car, "????????????"); - else - div_carkind = chg_car_kind(back_car, hclp->car_kind); -*/ - backup_f = fopen(queue_f, "a+t"); - fprintf(backup_f, "%.2s%.2s%.2s|%.2s%.2s%.14s%c%.2s%.4s%.4s%c%.10s%.10s%.10s%s\n", - hclp->hour, hclp->min, hclp->sec, rd.kind, rd.plz_id, rd.wrk_datetm, rd.io_div, rd.lane_no, rd.wrk_no, rd.wrkr_no, rd.con_stat, rd.rcv_snd_no, rd.st_snd_no, rd.ed_snd_no, rd.buf); -/* - fprintf(backup_f, "INSERT INTO DAY_TRAFFIC_INFO(FARE_OFFICE_ID, BOOTH_ID, PASS_DATE, PASS_TIME, PASS_SEQNO, CAR_NO, CARS_TYPE_ID, IN_OUT_KBN, CREATE_DATE, CREATER, UPDATE_DATE, UPDATER) VALUES ('%.2s','%.2s','%.4s%.2s%.2s','%.2s%.2s%.2s',%.6s,'%s','%s','%c',sysdate,'system',sysdate,'system');\n", - rd.plz_id, rd.lane_no, hclp->year, hclp->month, hclp->day, hclp->hour, hclp->min, hclp->sec, hclp->serial_no, back_car, div_carkind, hclp->io_div); -*/ - fclose(backup_f); -#endif - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_wrk_strt() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : 근무개시보고 - * - *======================================================================== -*/ -int rcv_wrk_strt() -{ - struct rcv_lane_data rd; -#if 1 - struct write_info wi; -#endif - struct hi_wrk_start *hws; - int wrk_order, ret = 0; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - hws = (struct hi_wrk_start *)hi_comm_ctrl.rcv_ctrl.buf; - - if (hi_comm_ctrl.now_stat_info & H_ACC_RESND) - { - /* 재송요구시 : 재송요구 근무 DATA */ - if (memcmp(hws->wrk_no, hi_comm_ctrl.manager[LW_RESND_NO-1].lo_lane_ctrl_cmd.wrk_no, 4) != 0 || - memcmp(hws->wrk_start_year, hi_comm_ctrl.manager[LW_RESND_NO-1].lo_lane_ctrl_cmd.wrk_year, 4) != 0 || - memcmp(hws->wrk_start_month, hi_comm_ctrl.manager[LW_RESND_NO-1].lo_lane_ctrl_cmd.wrk_mon, 2) != 0 || - memcmp(hws->wrk_start_day, hi_comm_ctrl.manager[LW_RESND_NO-1].lo_lane_ctrl_cmd.wrk_day, 2) != 0) - { - hi_comm_ctrl.now_stat_info &= ~(H_ACC_RESND|H_FRAME_WAIT); - lcc_reply(LW_RESND_NO, 1, 1, "재전송 자료의 일시 및 근무번호가 틀립니다."); - return (-1); - } - } - - wrk_order = natoi(&hws->wrk_no[2], 2); - - if (wrk_order <= 0 || wrk_order > MAX_WRKCNT) - return (-1); /* 최대근무수초과 */ - - if(natoi(&hws->wrk_no[0], 2) != (int)hi_comm_ctrl.lane_no){ - lane_log("근무 차로번호 불일치 %.4s != %d\n",hws->wrk_no,hi_comm_ctrl.lane_no); - return (-1); /* 근무번호 앞2비교 */ - } - - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_no , hws->wrk_no ); /* 근무번호 */ - e_memcpy(hi_comm_ctrl.lane_stat_info.wrkr_no , hws->wrkr_no ); - - sprintf(tmp, "%.8s%c", hws->seq_no, '\0'); - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = strtoul(tmp, NULL, 16); - - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_strt_year , hws->wrk_start_year ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_strt_mon , hws->wrk_start_month); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_strt_day , hws->wrk_start_day ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_strt_hr , hws->wrk_start_hour ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_strt_min , hws->wrk_start_min ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_strt_sec , hws->wrk_start_sec ); - - //유지보수 근무자번호 정의시 수정 - if(memcmp(hws->wrkr_no, "6", 1) == 0) - { - hi_comm_ctrl.write_info.wrk_knd = WS_RPR; - hi_comm_ctrl.lane_stat_info.wrk_stat = WS_RPR; - }else{ - hi_comm_ctrl.write_info.wrk_knd = WS_NORMAL; - hi_comm_ctrl.lane_stat_info.wrk_stat = WS_NORMAL; - } - - e_memcpy(hi_comm_ctrl.write_info.year, hws->wrk_start_year); /* 근무일자 */ - e_memcpy(hi_comm_ctrl.write_info.mon, hws->wrk_start_month); - e_memcpy(hi_comm_ctrl.write_info.day, hws->wrk_start_day); - e_memcpy(hi_comm_ctrl.write_info.hr, hws->wrk_start_hour); - e_memcpy(hi_comm_ctrl.write_info.min, hws->wrk_start_min); - e_memcpy(hi_comm_ctrl.write_info.day, hws->wrk_start_sec); - - e_memcpy(hi_comm_ctrl.write_info.wrk_no, hws->wrk_no); /* 근무번호 */ - - e_memcpy(hi_comm_ctrl.write_info.wrk_no, hws->wrk_no); /* 근무번호 */ - e_memcpy(hi_comm_ctrl.write_info.wrkr_no, hws->wrkr_no); /* 근무번호 */ - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - -//lane_log("개시10[%d]\n", hws->lane_typ[0]-'0'); - hi_comm_ctrl.write_info.io_div = hws->io_div; - -//lane_log("개시11[%x]\n", hws->seq_no); -// hi_comm_ctrl.write_info.io_div = hws->lane_typ[0]; - -//lane_log("개시 11-1[%x]\n", strtoul(tmp, NULL, 16)); - hi_comm_ctrl.write_info.strt_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - - sprintf(wi.plz_id, "%.2s", PLZ_CODE2); - lb_freadx(&wi, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); - - memset(&rd, 0x20, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.bas_tbl.plz_id); - sprintf((char *)rd.wrk_datetm, "%.4s%.2s%.2s%.2s%.2s%.2s", - hi_comm_ctrl.write_info.year, hi_comm_ctrl.write_info.mon, hi_comm_ctrl.write_info.day, - hi_comm_ctrl.write_info.hr, hi_comm_ctrl.write_info.min, hi_comm_ctrl.write_info.sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); -//lane_log("차로번호[%.2s]\n", rd.lane_no); - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - sprintf((char *)rd.wrkr_no, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "SYSO"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)rd.buf, "%s", (char *)hws); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 근무개시[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } - - if (wkr_no2wrk_stat(hws->wrkr_no) == W_MTNC) /* 근무상태 */ - hi_comm_ctrl.now_stat_info |= H_MTNC; /* 유지보수원 근무중 */ - else - hi_comm_ctrl.now_stat_info &= ~H_MTNC; - - if (!(hi_comm_ctrl.now_stat_info & H_ERR_REST)) - hi_comm_ctrl.now_stat_info &= ~H_LANE_CLS; /* 폐쇄 : 해제 */ -//printf("W15\n"); - if(ret == 0) - { - lst_rcv_acc_no = strtoul(tmp, NULL, 16); - } - - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_hnd_data() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2019.05.12 - * Modified : - * Remark : 처리 데이터 - * - *======================================================================== -*/ -int rcv_hnd_data() -{ - struct rcv_lane_data rd; - struct write_info wi; - struct hi_hnd_data *hcd; - int ret, retw; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char bak[MAX_STRING_SIZE]; memset(bak, 0x00, sizeof(bak)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - char rfid_kbn[2]; memset(rfid_kbn, 0x00, sizeof(rfid_kbn)); - char serial_no[8]; memset(serial_no, 0x00, sizeof(serial_no)); - char car_kind; - - hcd = (struct hi_hnd_data *)hi_comm_ctrl.rcv_ctrl.buf; - e_memcpy(hi_comm_ctrl.write_info.year, hcd->hnd_info.hnd_year ); - e_memcpy(hi_comm_ctrl.write_info.mon, hcd->hnd_info.hnd_month); - e_memcpy(hi_comm_ctrl.write_info.day, hcd->hnd_info.hnd_day ); - e_memcpy(hi_comm_ctrl.write_info.hr, hcd->hnd_info.hnd_hour ); - e_memcpy(hi_comm_ctrl.write_info.min, hcd->hnd_info.hnd_min ); - e_memcpy(hi_comm_ctrl.write_info.sec, hcd->hnd_info.hnd_sec ); - - e_memcpy(hi_comm_ctrl.write_info.wrk_no, hcd->wrk_no); /* 근무번호 */ - hi_comm_ctrl.write_info.io_div = hcd->io_div; - -/* 2019. 04.17 추가 */ - e_memcpy(hi_comm_ctrl.write_info.wrkr_no, hcd->wrkr_no); - hi_comm_ctrl.write_info.io_div = hcd->io_div; - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf(tmp, "%.8s%c", hcd->seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = strtoul(tmp, NULL, 16); - - sprintf(wi.plz_id, "%.2s", PLZ_CODE2); - lb_freadx(&wi, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); - - memset(&rd, 0x00, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.bas_tbl.plz_id); - sprintf((char *)rd.wrk_datetm, "%.4s%.2s%.2s%.2s%.2s%.2s", - hi_comm_ctrl.write_info.year, hi_comm_ctrl.write_info.mon, hi_comm_ctrl.write_info.day, - hi_comm_ctrl.write_info.hr, hi_comm_ctrl.write_info.min, hi_comm_ctrl.write_info.sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); - - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - snprintf((char *)rd.wrkr_no, 4+1, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - snprintf((char *)rd.wrkr_no, 4+1, "SYSO"); - else - snprintf((char *)rd.wrkr_no, 4+1, "0000"); - }else - snprintf((char *)rd.wrkr_no, 4+1, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); -#if 1 -/* 2019.07.26 감지시간 추가 */ - sprintf(bak, "%.8s%.2s%.8s%.4s%.4s%.6s%c%.2s%.2s%c%.6s%.6s%.4s%.2s%.2s%.2s%.2s%.2s%.6s%.6s%.6s%c%c%.2s%c%.7s%.20s%.2s%c%c%-16s%-16s%.4s%.4s%.4s%.4s%.2s%.24s%.24s%c", - hcd->seq_no, hcd->kind, hcd->wrk_date, hcd->wrk_no, hcd->wrkr_no, hcd->serial_no, - hcd->io_div, hcd->plz_id, hcd->lane_no, hcd->car_kind, hcd->sence_seq_no, hcd->sence_time, - hcd->hnd_info.hnd_year, hcd->hnd_info.hnd_month, hcd->hnd_info.hnd_day, - hcd->hnd_info.hnd_hour, hcd->hnd_info.hnd_min, hcd->hnd_info.hnd_sec, hcd->hnd_info.org_pass_fare, - hcd->hnd_info.pass_fare, hcd->hnd_info.rcpt_money, hcd->hnd_info.refund_yn, hcd->hnd_info.key_yn, - hcd->hnd_info.rcpt_hnd, hcd->hnd_info.red_div, - hcd->hnd_info.issue_code, hcd->hnd_info.crd_no, hcd->hnd_info.rcpt_div, hcd->pre_yn, hcd->img_yn, - hcd->car_no1, hcd->car_no2, hcd->x_point, hcd->y_point, hcd->img_width, hcd->img_heigh, hcd->dc_typ, - hcd->tag_id1, hcd->tag_id2, '\0'); -#else - sprintf(bak, "%.8s%.2s%.8s%.4s%.4s%.6s%c%.2s%.2s%c%.6s%.4s%.2s%.2s%.2s%.2s%.2s%.6s%.6s%.6s%c%c%.2s%c%.7s%.20s%.2s%c%c%-16s%-16s%.4s%.4s%.4s%.4s%.2s%.24s%.24s%c", - hcd->seq_no, hcd->kind, hcd->wrk_date, hcd->wrk_no, hcd->wrkr_no, hcd->serial_no, - hcd->io_div, hcd->plz_id, hcd->lane_no, hcd->car_kind, hcd->sence_seq_no, - hcd->hnd_info.hnd_year, hcd->hnd_info.hnd_month, hcd->hnd_info.hnd_day, - hcd->hnd_info.hnd_hour, hcd->hnd_info.hnd_min, hcd->hnd_info.hnd_sec, hcd->hnd_info.org_pass_fare, - hcd->hnd_info.pass_fare, hcd->hnd_info.rcpt_money, hcd->hnd_info.refund_yn, hcd->hnd_info.key_yn, - hcd->hnd_info.rcpt_hnd, hcd->hnd_info.red_div, - hcd->hnd_info.issue_code, hcd->hnd_info.crd_no, hcd->hnd_info.rcpt_div, hcd->pre_yn, hcd->img_yn, - hcd->car_no1, hcd->car_no2, hcd->x_point, hcd->y_point, hcd->img_width, hcd->img_heigh, hcd->dc_typ, - hcd->tag_id1, hcd->tag_id2, '\0'); -#endif - //sprintf((char *)rd.buf, "%s", (char *)hcd); - snprintf((char *)rd.buf, strlen(bak)+1, "%s", bak); -//lane_log("처리데이터[%s]\n", rd.buf); - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 처리[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } - - //usleep(300000); -#if 0 - memset(bak, 0x00, sizeof(bak)); - - RemoveTerminatedThread(); - - switch(lb_data2atoi(hcd->hnd_info.rcpt_hnd, 2)) - { - case 10: - case 11: - case 20: - case 21: - case 22: - case 23: - case 24: - case 30: - case 31: - case 32: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 71: - case 74: - case 75: - case 76: - case 77: - case 78: - case 79: - case 40: - case 41: - case 50: - case 51: - case 52: - case 53: - case 54: - case 60: - case 61: - case 62: - case 63: - case 64: - case 65: - case 66: - case 67: - sprintf(rfid_kbn, "00"); - break; - case 12: - case 25: - case 26: - case 55: - sprintf(rfid_kbn, "01"); - break; - case 13: - case 14: - case 27: - case 28: - case 56: - sprintf(rfid_kbn, "03"); - break; - case 33: - sprintf(rfid_kbn, "02"); - break; - default: - sprintf(rfid_kbn, "00"); - break; - } - - switch(lb_data2atoi(hcd->hnd_info.rcpt_hnd, 2)) - { - case 31: - car_kind = 0x36; - break; - case 36: - car_kind = 0x37; - break; - default: - car_kind = hcd->car_kind; - break; - } - - if(lb_data2atoi(hcd->hnd_info.rcpt_hnd, 2) > 19 && lb_data2atoi(hcd->hnd_info.rcpt_hnd, 2) < 30) - { - sprintf(serial_no, "%c%.2s%05u", hcd->plz_id[1], hcd->lane_no, lb_data2atoi(hcd->serial_no, 6)); - }else - { - sprintf(serial_no, "%08u", lb_data2atoi(hcd->serial_no, 6)); - } - sprintf((char *)bak, "%.4s%.2s%.2s%.8s%.2s%.2s%.2s%.8s%.8s%-16s%.2s0 %.6s%.3s%.3s%.3s%.3s%c%c%.2s%-24s%-24s%c%c", - hcd->wrkr_no, hcd->plz_id, hcd->lane_no, hcd->wrk_date, hcd->hnd_info.hnd_hour, hcd->hnd_info.hnd_min, hcd->hnd_info.hnd_sec, - serial_no, serial_no, hcd->car_no1, hcd->hnd_info.rcpt_hnd, - hcd->hnd_info.pass_fare, hcd->x_point+1, hcd->y_point+1, hcd->img_width+1, hcd->img_heigh+1, - hcd->hnd_info.refund_yn, hcd->wrk_no[3], rfid_kbn, hcd->tag_id1, hcd->tag_id2, car_kind, '\0'); - -//lane_log("처리데이터 Web 송신[%s]\n", bak); - retw = MessageSender(NS_WEB_HND_DATA, (char *)&bak, path, rtn); - - if(retw < 0) - { - lane_log("(rcv_function.cpp) Web 처리데이터[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - } -#endif - - if(ret == 0) - { - lst_rcv_acc_no = strtoul(tmp, NULL, 16); - } -#ifdef _DEV_ - //장애 대응을 위한 처리자료 파일화 - char queue_d[128]; memset(queue_d, 0x00, sizeof(queue_d)); - char queue_f[128]; memset(queue_f, 0x00, sizeof(queue_f)); - char back_car[128]; memset(back_car, 0x00, sizeof(back_car)); - int div_carkind; - FILE *backup_f; - sprintf(queue_d, "%s/%.8s%c", LOG_DIR, rd.wrk_datetm, '\0'); - mkdir(queue_d,0755); - sprintf(queue_f, "%s/queue%.2s%.2s.log", queue_d, rd.plz_id, rd.lane_no); - - backup_f = fopen(queue_f, "a+t"); - fprintf(backup_f, "%.2s%.2s%.2s|%.2s%.2s%.14s%c%.2s%.4s%.4s%c%.10s%.10s%.10s%s\n", - hcd->hnd_info.hnd_hour, hcd->hnd_info.hnd_min, hcd->hnd_info.hnd_sec, rd.kind, rd.plz_id, rd.wrk_datetm, rd.io_div, rd.lane_no, rd.wrk_no, rd.wrkr_no, rd.con_stat, rd.rcv_snd_no, rd.st_snd_no, rd.ed_snd_no, rd.buf); - - fclose(backup_f); -#endif - - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_card_data() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2019.05.12 - * Modified : - * Remark : 카드처리 데이터 - * - *======================================================================== -*/ -int rcv_card_data() -{ - struct rcv_lane_data rd; - struct write_info wi; - struct hi_crd_hnd_data *hcd; - int ret, retw; - int ii, size; - - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char bak[MAX_STRING_SIZE]; memset(bak, 0x00, sizeof(bak)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - char sam_seq[10+1]; memset(sam_seq, 0x00, sizeof(sam_seq)); - char tot_sam_seq[10+1]; memset(tot_sam_seq, 0x00, sizeof(tot_sam_seq)); - char sam_coll_cnt[5+1]; memset(sam_coll_cnt, 0x00, sizeof(sam_coll_cnt)); - char sam_tot_amt[10+1]; memset(sam_tot_amt, 0x00, sizeof(sam_tot_amt)); - char tmp_iss_cd[6+1]; memset(tmp_iss_cd, 0x00, sizeof(tmp_iss_cd)); - char issue_id[7+1]; memset(issue_id, 0x00, sizeof(issue_id)); - char path[256]; memset(path, 0x00, sizeof(path)); - - FILE *fp; - struct stat file_info; - struct iss_comp_tbl iss_comp_tbl_f; - - hcd = (struct hi_in_way_hnd_data *)hi_comm_ctrl.rcv_ctrl.buf; - e_memcpy(hi_comm_ctrl.write_info.year, hcd->hnd_year ); - e_memcpy(hi_comm_ctrl.write_info.mon, hcd->hnd_month); - e_memcpy(hi_comm_ctrl.write_info.day, hcd->hnd_day ); - e_memcpy(hi_comm_ctrl.write_info.hr, hcd->hnd_hour ); - e_memcpy(hi_comm_ctrl.write_info.min, hcd->hnd_min ); - e_memcpy(hi_comm_ctrl.write_info.sec, hcd->hnd_sec ); - - e_memcpy(hi_comm_ctrl.write_info.wrk_no , hcd->wrk_no); /* 근무번호 */ - e_memcpy(hi_comm_ctrl.write_info.wrkr_no, hcd->wrkr_no); - - hi_comm_ctrl.write_info.io_div = hcd->io_div; - sprintf(wi.plz_id, "%.2s", PLZ_CODE2); - lb_freadx(&wi, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf(tmp, "%.8s%c", hcd->seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = strtoul(tmp, NULL, 16); - - memset(&rd, 0x00, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.bas_tbl.plz_id); - sprintf((char *)rd.wrk_datetm, "%.4s%.2s%.2s%.2s%.2s%.2s", - hi_comm_ctrl.write_info.year, hi_comm_ctrl.write_info.mon, hi_comm_ctrl.write_info.day, - hi_comm_ctrl.write_info.hr, hi_comm_ctrl.write_info.min, hi_comm_ctrl.write_info.sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); - - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - snprintf((char *)rd.wrkr_no, 4+1, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - snprintf((char *)rd.wrkr_no, 4+1, "SYSO"); - else - snprintf((char *)rd.wrkr_no, 4+1, "0000"); - }else - snprintf((char *)rd.wrkr_no, 4+1, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - //sprintf((char *)rd.buf, "%s", (char *)hcd); - sprintf((char *)bak, "%.8s%.2s%.8s%.4s%.4s%.6s%c%.2s%.4s%.2s%.2s%.2s%.2s%.2s%.6s%.6s%.8s%.8s%.2s%.2s%c%c%.20s%.2s%.10s%.10s%.2s%.16s%.8s%.2s%.6s%.10s%.8s%.8s%.10s%.8s%.4s%.8s%.2s%.8s%.2s%.8s%.2s%.7s%.2s%.10s%-16s%-16s%.12s%c", - hcd->seq_no, hcd->kind, hcd->wrk_date, hcd->wrk_no, hcd->wrkr_no, hcd->serial_no, hcd->io_div, hcd->plz_id, - hcd->hnd_year, hcd->hnd_month, hcd->hnd_day, hcd->hnd_hour, hcd->hnd_min, hcd->hnd_sec, - hcd->pass_fare, hcd->rcpt_money, hcd->bef_rcpt_balc, hcd->aft_rcpt_balc, hcd->rcpt_div, hcd->crd_kind, - hcd->pre_div, hcd->car_kind, hcd->crd_no, hcd->pay_div, hcd->terminal_no, hcd->terminal_cnt, - hcd->alg_id, hcd->psam_id, hcd->purch_dt, hcd->deal_div, hcd->elec_iss_id, hcd->elec_id, hcd->elec_ser_no, hcd->deal_ser_no, - hcd->crd_ser_no, hcd->deal_tot, hcd->ind_iss_cnt, hcd->rcpt_deal_ser, hcd->ind_sign1, hcd->psam_sign1, hcd->ind_sign2, - hcd->psam_sign2, hcd->id_center, hcd->iss_code, hcd->another, hcd->alias_no, hcd->car_no1, hcd->car_no2, hcd->tot_id, '\0'); - snprintf((char *)rd.buf, strlen(bak)+1, "%s", bak); -//lane_log("카드처리데이터[%s]\n", rd.buf); - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - //usleep(300000); - if(ret < 0) - { - lane_log("(rcv_function.cpp) 카드처리[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } -#if 0 - memset(bak, 0x00, sizeof(bak)); - - RemoveTerminatedThread(); - - snprintf(sam_seq, 8+1, "%s%c", hcd->deal_ser_no, '\0'); - snprintf(tot_sam_seq, 8+1, "%s%c", hcd->rcpt_deal_ser, '\0'); - snprintf(sam_coll_cnt, 4+1, "%s%c", hcd->ind_iss_cnt, '\0'); - snprintf(sam_tot_amt, 8+1, "%s%c", hcd->deal_tot, '\0'); - sprintf(tmp_iss_cd, "%.6s%c", hcd->crd_no, '\0'); - - sprintf(path, "%s/%s/ISSTBL", DIR_TCS, DIR_BASEINFO); - fp = fopen(path, "r+"); - if( 0 > stat(path, &file_info)) - { - proc_log("발행사정보 없음\n"); - }else - { - size = file_info.st_size; -//proc_log("파일 Size[%d]\n", size); - for(ii = 0; ii < (size / sizeof(struct iss_comp_tbl)); ii++) - { - fseek(fp, ii * sizeof(struct iss_comp_tbl), SEEK_SET); - fread(&iss_comp_tbl_f, sizeof(struct iss_comp_tbl), 1, fp); -//proc_log("[%d]FILE BIN[%.6s] ISSCD[%.6s]\n", ii, iss_comp_tbl_f.bin_code+2, tmp_iss_cd); - if(strncmp(iss_comp_tbl_f.bin_code+2, tmp_iss_cd, 6) == 0) - break; - } - } - - snprintf(issue_id, 7+1, "%.7s", iss_comp_tbl_f.issue_cd); - - sprintf((char *)bak, "%.4s%.2s%.2s%.8s%.2s%.2s%.2s%.8s%c%-16s%.2s%.8s%.8s%.8s%.9s%-16s%010u%.10s%.2s%.2s%.2s%10u%05u%010u%.8s%.2s9100000000%.2s%.10s%.7s%c", - hcd->wrkr_no, hcd->plz_id, hcd->lane_no, hcd->wrk_date, hcd->hnd_hour, hcd->hnd_min, hcd->hnd_sec, - hcd->serial_no, hcd->pre_div, hcd->crd_no, hcd->rcpt_div, hcd->bef_rcpt_balc, hcd->rcpt_money, hcd->aft_rcpt_balc, - hcd->terminal_no, hcd->psam_id, strtoul(sam_seq, NULL, 16), hcd->crd_ser_no, hcd->alg_id, hcd->ind_sign1, hcd->id_center, - strtoul(tot_sam_seq, NULL, 16), strtoul(sam_coll_cnt, NULL, 16), strtoul(sam_tot_amt, NULL, 16), hcd->psam_sign1, - hcd->another, hcd->lane_no, hcd->in_alias_no, issue_id, '\0'); - -//lane_log("카드처리데이터 Web 송신[%s]\n", bak); - retw = MessageSender(NS_WEB_CRD_HND_DATA, (char *)&bak, path, rtn); - - if(retw < 0) - { - lane_log("(rcv_function.cpp) Web 카드처리데이터[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - } -#endif - if(ret == 0) - { - lst_rcv_acc_no = strtoul(tmp, NULL, 16); - } -#ifdef _DEV_ - //장애 대응을 위한 처리자료 파일화 - char queue_d[128]; memset(queue_d, 0x00, sizeof(queue_d)); - char queue_f[128]; memset(queue_f, 0x00, sizeof(queue_f)); - char back_car[128]; memset(back_car, 0x00, sizeof(back_car)); - int div_carkind; - FILE *backup_f; - sprintf(queue_d, "%s/%.8s%c", LOG_DIR, rd.wrk_datetm, '\0'); - mkdir(queue_d,0755); - sprintf(queue_f, "%s/queue%.2s%.2s.log", queue_d, rd.plz_id, rd.lane_no); - - backup_f = fopen(queue_f, "a+t"); - fprintf(backup_f, "%.2s%.2s%.2s|%.2s%.2s%.14s%c%.2s%.4s%.4s%c%.10s%.10s%.10s%s\n", - hcd->hnd_hour, hcd->hnd_min, hcd->hnd_sec, rd.kind, rd.plz_id, rd.wrk_datetm, rd.io_div, rd.lane_no, rd.wrk_no, rd.wrkr_no, rd.con_stat, rd.rcv_snd_no, rd.st_snd_no, rd.ed_snd_no, rd.buf); - - fclose(backup_f); -#endif - - return (0); -} - -/* - *======================================================================== - * - * Function : remote_lane_stat_rlt() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2019.05.12 - * Modified : - * Remark : 원격차로상태응답 - * - *======================================================================== -*/ -int remote_lane_stat_rlt() -{ - struct rcv_lane_data rd; - struct hi_remote_lane_stat_reply *hrlsr; - int ret; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - hrlsr = (struct hi_hnd_data *)hi_comm_ctrl.rcv_ctrl.buf; - sprintf((char *)hi_comm_ctrl.write_info.year, "%04d", hi_comm_ctrl.cday.tm_year+1900); - sprintf((char *)hi_comm_ctrl.write_info.mon, "%02d", hi_comm_ctrl.cday.tm_mon+1); - sprintf((char *)hi_comm_ctrl.write_info.day, "%02d", hi_comm_ctrl.cday.tm_mday); - sprintf((char *)hi_comm_ctrl.write_info.hr, "%02d", hi_comm_ctrl.cday.tm_hour); - sprintf((char *)hi_comm_ctrl.write_info.min, "%02d", hi_comm_ctrl.cday.tm_min); - sprintf((char *)hi_comm_ctrl.write_info.sec, "%02d", hi_comm_ctrl.cday.tm_sec); - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf(tmp, "%.8s%c", hrlsr->seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - - memset(&rd, 0x20, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.write_info.plz_id); - sprintf((char *)rd.wrk_datetm, "%.4s%.2s%.2s%.2s%.2s%.2s", - hi_comm_ctrl.write_info.year, hi_comm_ctrl.write_info.mon, hi_comm_ctrl.write_info.day, - hi_comm_ctrl.write_info.hr, hi_comm_ctrl.write_info.min, hi_comm_ctrl.write_info.sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); - - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - sprintf((char *)rd.wrkr_no, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "SYSO"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)rd.buf, "%s", (char *)hrlsr); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 원격차로상태응답[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } - - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_wrk_end() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.31 - * Modified : - * Remark : 근무 종료 - * - *======================================================================== -*/ -int rcv_wrk_end() -{ - struct rcv_lane_data rd; - struct write_info wi; - struct hi_wrk_end *howwe; - int wrk_order, ret, retw; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char bak[MAX_STRING_SIZE]; memset(bak, 0x00, sizeof(bak)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - int cash = 0, k_cash = 0, free = 0, minap = 0, coupon = 0, k_coupon = 0; - int sun = 0, k_sun = 0, who = 0, k_who = 0; - int sale = 0, k_sale = 0, tot_amt = 0, repay_q = 0, repay_m = 0; - - howwe = (struct hi_wrk_end *)hi_comm_ctrl.rcv_ctrl.buf; - e_memcpy(hi_comm_ctrl.write_info.year, howwe->wrk_end_year ); - e_memcpy(hi_comm_ctrl.write_info.mon, howwe->wrk_end_month); - e_memcpy(hi_comm_ctrl.write_info.day, howwe->wrk_end_day ); - e_memcpy(hi_comm_ctrl.write_info.hr, howwe->wrk_end_hour ); - e_memcpy(hi_comm_ctrl.write_info.min, howwe->wrk_end_min ); - e_memcpy(hi_comm_ctrl.write_info.sec, howwe->wrk_end_sec ); - e_memcpy(hi_comm_ctrl.write_info.wrk_no, howwe->wrk_no); /* 근무번호 */ - e_memcpy(hi_comm_ctrl.write_info.wrkr_no, howwe->wrkr_no); - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf(tmp, "%.8s%c", howwe->seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.write_info.end_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = strtoul(tmp, NULL, 16); - - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_end_year , howwe->wrk_end_year ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_end_mon , howwe->wrk_end_month); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_end_day , howwe->wrk_end_day ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_end_hr , howwe->wrk_end_hour ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_end_min , howwe->wrk_end_min ); - e_memcpy(hi_comm_ctrl.lane_stat_info.wrk_end_sec , howwe->wrk_end_sec ); - - hi_comm_ctrl.lane_stat_info.wrk_stat = WS_NONE; - - wrk_order = natoi(&hi_comm_ctrl.write_info.wrk_no[2], 2); - if (wrk_order <= 0 || wrk_order > MAX_WRKCNT) - return (-1); - - sprintf(wi.plz_id, "%.2s", PLZ_CODE2); - lb_freadx(&wi, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); - - memset(&rd, 0x20, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.bas_tbl.plz_id); - sprintf((char *)rd.wrk_datetm, "%.4s%.2s%.2s%.2s%.2s%.2s", - hi_comm_ctrl.write_info.year, hi_comm_ctrl.write_info.mon, hi_comm_ctrl.write_info.day, - hi_comm_ctrl.write_info.hr, hi_comm_ctrl.write_info.min, hi_comm_ctrl.write_info.sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); -//lane_log("차로번호[%.2s]\n", rd.lane_no); - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - sprintf((char *)rd.wrkr_no, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - sprintf((char *)rd.wrkr_no, "SYSO"); - else - sprintf((char *)rd.wrkr_no, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); - sprintf((char *)rd.buf, "%s", (char *)howwe); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 근무종료[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } - hi_comm_ctrl.warr_snd_no = hi_comm_ctrl.write_info.end_snd_no; - if(!(hi_comm_ctrl.now_stat_info & H_ERR_REST) || !(hi_comm_ctrl.now_stat_info & H_ACC_RESND)) - { - hi_comm_ctrl.snd.len = snd_warr_snd_no(0); - lane_comm_snd(); - } - //hi_comm_ctrl.snd.len = snd_warr_snd_no();/* 보증 전송연번 송신 */ -//lane_log("출구 보증전송연번 송신?[%d]\n", hi_comm_ctrl.snd.len); - hi_comm_ctrl.now_stat_info |= H_LANE_CLS; /* 차로폐쇄중 */ - - if(ret == 0) - { - lst_rcv_acc_no = strtoul(tmp, NULL, 16); - } - -#if 0 - memset(bak, 0x00, sizeof(bak)); - - RemoveTerminatedThread(); - - for(ii = 0; ii < 50; ii++) - { - switch(lb_data2atoi(howwe->hnd_cnt[ii].div, 2)) - { - case 10: - cash += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 11: - case 12: - case 13: - case 14: - k_cash += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 30: - case 31: - case 32: - case 33: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 71: - case 74: - case 75: - case 76: - case 77: - case 78: - case 79: - free += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 40: - case 41: - case 60: - case 61: - case 62: - case 63: - case 64: - case 65: - case 66: - case 67: - minap += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 51: - coupon += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 53: - case 55: - case 56: - k_coupon += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 21: - sun += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 23: - case 25: - case 27: - k_sun += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 22: - who += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 24: - case 26: - case 28: - k_who += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 52: - sale += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - case 54: - k_sale += lb_data2atoi(howwe->hnd_cnt[ii].cnt, 4); - break; - } - } - - sprintf((char *)bak, "%.4s%.2s%02d%.4s%.2s%.2s%.2s%.2s%.2s%.4s%.2s%.2s%.2s%.2s%.2s%04d%04d%04d%04d%04d%04d%04d%04d%04d%04d%04d%04d%08d%04d%08d%c%c", - howwe->wrkr_no, hi_comm_ctrl.bas_tbl.plz_id, hi_comm_ctrl.lane_no, - howwe->wrk_start_year, howwe->wrk_start_month, howwe->wrk_start_day, howwe->wrk_start_hour, howwe->wrk_start_min, howwe->wrk_start_sec, - howwe->wrk_end_year, howwe->wrk_end_month, howwe->wrk_end_day, howwe->wrk_end_hour, howwe->wrk_end_min, howwe->wrk_end_sec, - cash, k_cash, free, minap, coupon, k_coupon, sun, k_sun, who, k_who, sale, k_sale, lb_data2atoi(howwe->tot_fare, 8), - lb_data2atoi(howwe->repay_cnt, 4), lb_data2atoi(howwe->repay_fare, 8), pk_in->wrk_no[3], '\0'); - -//lane_log("근무종료 Web 송신[%s]\n", bak); - retw = MessageSender(NS_WEB_CRD_HND_DATA, (char *)&bak, path, rtn); - - if(retw < 0) - { - lane_log("(rcv_function.cpp) Web 근무종료[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - } -#endif -#ifdef _DEV_ - //장애 대응을 위한 처리자료 파일화 - char queue_d[128]; memset(queue_d, 0x00, sizeof(queue_d)); - char queue_f[128]; memset(queue_f, 0x00, sizeof(queue_f)); - char back_car[128]; memset(back_car, 0x00, sizeof(back_car)); - int div_carkind; - FILE *backup_f; - sprintf(queue_d, "%s/%.8s%c", LOG_DIR, rd.wrk_datetm, '\0'); - mkdir(queue_d,0755); - sprintf(queue_f, "%s/queue%.2s%.2s.log", queue_d, rd.plz_id, rd.lane_no); - - backup_f = fopen(queue_f, "a+t"); - fprintf(backup_f, "%.2s%.2s%.2s|%.2s%.2s%.14s%c%.2s%.4s%.4s%c%.10s%.10s%.10s%s\n", - howwe->wrk_end_hour, howwe->wrk_end_min, howwe->wrk_end_sec, rd.kind, rd.plz_id, rd.wrk_datetm, rd.io_div, rd.lane_no, rd.wrk_no, rd.wrkr_no, rd.con_stat, rd.rcv_snd_no, rd.st_snd_no, rd.ed_snd_no, rd.buf); - - fclose(backup_f); -#endif - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_refund_data() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2019.07.01 - * Modified : - * Remark : 환불처리 데이터 - * - *======================================================================== -*/ -int rcv_refund_data() -{ - struct rcv_lane_data rd; - struct write_info wi; - struct hi_refund_data *hrd; - int wrk_order, ret; - char rtn[MAX_STRING_SIZE]; memset(rtn, 0x00, sizeof(rtn)); - char bak[MAX_STRING_SIZE]; memset(bak, 0x00, sizeof(bak)); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - hrd = (struct hi_refund_data *)hi_comm_ctrl.rcv_ctrl.buf; -#if 0 - e_memcpy(hi_comm_ctrl.write_info.year, hrd->hnd_year ); - e_memcpy(hi_comm_ctrl.write_info.mon, hrd->hnd_month); - e_memcpy(hi_comm_ctrl.write_info.day, hrd->hnd_day ); - e_memcpy(hi_comm_ctrl.write_info.hr, hrd->hnd_hour ); - e_memcpy(hi_comm_ctrl.write_info.min, hrd->hnd_min ); - e_memcpy(hi_comm_ctrl.write_info.sec, hrd->hnd_sec ); -#else - e_memcpy(hi_comm_ctrl.write_info.year, hrd->hnd_info.hnd_year ); - e_memcpy(hi_comm_ctrl.write_info.mon, hrd->hnd_info.hnd_month); - e_memcpy(hi_comm_ctrl.write_info.day, hrd->hnd_info.hnd_day ); - e_memcpy(hi_comm_ctrl.write_info.hr, hrd->hnd_info.hnd_hour ); - e_memcpy(hi_comm_ctrl.write_info.min, hrd->hnd_info.hnd_min ); - e_memcpy(hi_comm_ctrl.write_info.sec, hrd->hnd_info.hnd_sec ); -#endif - e_memcpy(hi_comm_ctrl.write_info.wrk_no, hrd->wrk_no); /* 근무번호 */ - e_memcpy(hi_comm_ctrl.write_info.wrkr_no, hrd->wrkr_no); - sprintf(wi.plz_id, "%.2s", PLZ_CODE2); - lb_freadx(&wi, FNO_BASICTBL, &hi_comm_ctrl.bas_tbl, FFIRST); - - hi_comm_ctrl.write_info.knd = hi_comm_ctrl.rcv_ctrl.cmd; - sprintf(tmp, "%.8s%c", hrd->seq_no, '\0'); - hi_comm_ctrl.write_info.rcv_snd_no = strtoul(tmp, NULL, 16); - hi_comm_ctrl.lane_stat_info.lst_rev_snd_no = strtoul(tmp, NULL, 16); - - wrk_order = natoi(&hi_comm_ctrl.write_info.wrk_no[2], 2); - if (wrk_order <= 0 || wrk_order > MAX_WRKCNT) - return (-1); - - memset(&rd, 0x20, sizeof(struct rcv_lane_data)); - sprintf((char *)rd.kind, "%02x", hi_comm_ctrl.rcv_ctrl.cmd); - sprintf((char *)rd.plz_id, "%.2s", hi_comm_ctrl.write_info.plz_id); - sprintf((char *)rd.wrk_datetm, "%.4s%.2s%.2s%.2s%.2s%.2s", - hi_comm_ctrl.write_info.year, hi_comm_ctrl.write_info.mon, hi_comm_ctrl.write_info.day, - hi_comm_ctrl.write_info.hr, hi_comm_ctrl.write_info.min, hi_comm_ctrl.write_info.sec); - rd.io_div = lb_data2atoi((char *)hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div, 2) + '0'; - sprintf((char *)rd.lane_no, "%02d", hi_comm_ctrl.lane_no); - sprintf((char *)rd.wrk_no, "%.4s", hi_comm_ctrl.write_info.wrk_no); -//lane_log("차로번호[%.2s]\n", rd.lane_no); - if(lb_data2atoi(hi_comm_ctrl.write_info.wrkr_no, 4) == 0) - { - if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 1) - snprintf((char *)rd.wrkr_no, 4+1, "SYSI"); - else if(hi_comm_ctrl.bas_tbl.lane_info[hi_comm_ctrl.lane_no -1].io_div[1] - '0' == 2) - snprintf((char *)rd.wrkr_no, 4+1, "SYSO"); - else - snprintf((char *)rd.wrkr_no, 4+1, "0000"); - }else - sprintf((char *)rd.wrkr_no, "%.4s", hi_comm_ctrl.write_info.wrkr_no); - - rd.con_stat = CONNECT_STAT;; - sprintf((char *)rd.rcv_snd_no, "%010d", hi_comm_ctrl.rcv_ctrl.snd_no); - sprintf((char *)rd.st_snd_no, "%010d", hi_comm_ctrl.write_info.strt_snd_no); - sprintf((char *)rd.ed_snd_no, "%010d", hi_comm_ctrl.write_info.end_snd_no); -#if 0 - sprintf((char *)bak, "%.8s%.2s%.8s%.4s%.4s%.6s%.2s%.2s%.4s%.2s%.2s%.2s%.2s%.2s%.6s%.6s%.6s%.4s%.2s%.2s%.2s%.2s%.2s%c", - hrd->seq_no, hrd->kind, hrd->wrk_date, hrd->wrk_no, hrd->wrkr_no, hrd->serial_no, hrd->plz_id, hrd->lane_no, - hrd->hnd_year, hrd->hnd_month, hrd->hnd_day, hrd->hnd_hour, hrd->hnd_min, hrd->hnd_sec, - hrd->org_pass_fare, hrd->pass_fare, hrd->toll_amt, - hrd->refund_year, hrd->refund_month, hrd->refund_day, hrd->refund_hour, hrd->refund_min, hrd->refund_sec, - hrd->refund_key); -#else - sprintf(bak, "%.8s%.2s%.8s%.4s%.4s%.6s%c%.2s%.2s%c%.6s%.6s%.4s%.2s%.2s%.2s%.2s%.2s%.6s%.6s%.6s%c%c%.2s%c%.7s%.20s%.2s%c%c%-16s%-16s%.4s%.4s%.4s%.4s%.2s%.24s%.24s%c", - hrd->seq_no, hrd->kind, hrd->wrk_date, hrd->wrk_no, hrd->wrkr_no, hrd->serial_no, - hrd->io_div, hrd->plz_id, hrd->lane_no, hrd->car_kind, hrd->sence_seq_no, hrd->sence_time, - hrd->hnd_info.hnd_year, hrd->hnd_info.hnd_month, hrd->hnd_info.hnd_day, - hrd->hnd_info.hnd_hour, hrd->hnd_info.hnd_min, hrd->hnd_info.hnd_sec, hrd->hnd_info.org_pass_fare, - hrd->hnd_info.pass_fare, hrd->hnd_info.rcpt_money, hrd->hnd_info.refund_yn, hrd->hnd_info.key_yn, - hrd->hnd_info.rcpt_hnd, hrd->hnd_info.red_div, - hrd->hnd_info.issue_code, hrd->hnd_info.crd_no, hrd->hnd_info.rcpt_div, hrd->pre_yn, hrd->img_yn, - hrd->car_no1, hrd->car_no2, hrd->x_point, hrd->y_point, hrd->img_width, hrd->img_heigh, hrd->dc_typ, - hrd->tag_id1, hrd->tag_id2, '\0'); -#endif -//lane_log("환불[%s]\n", bak); - snprintf((char *)rd.buf, strlen(bak)+1, "%s", (char *)bak); - - ret = MessageSender(hi_comm_ctrl.rcv_ctrl.cmd, (char *)&rd, path, rtn); - - if(ret < 0) - { - lane_log("(rcv_function.cpp) 환불처리[%.2s][%.4s] 처리실패\n", hi_comm_ctrl.write_info.plz_id, hi_comm_ctrl.write_info.wrk_no); - return(-1); - } - - if(ret == 0) - { - lst_rcv_acc_no = strtoul(tmp, NULL, 16); - } -#ifdef _DEV_ - //장애 대응을 위한 처리자료 파일화 - char queue_d[128]; memset(queue_d, 0x00, sizeof(queue_d)); - char queue_f[128]; memset(queue_f, 0x00, sizeof(queue_f)); - char back_car[128]; memset(back_car, 0x00, sizeof(back_car)); - int div_carkind; - FILE *backup_f; - sprintf(queue_d, "%s/%.8s%c", LOG_DIR, rd.wrk_datetm, '\0'); - mkdir(queue_d,0755); - sprintf(queue_f, "%s/queue%.2s%.2s.log", queue_d, rd.plz_id, rd.lane_no); - - backup_f = fopen(queue_f, "a+t"); - fprintf(backup_f, "%.2s%.2s%.2s|%.2s%.2s%.14s%c%.2s%.4s%.4s%c%.10s%.10s%.10s%s\n", - hrd->hnd_info.hnd_hour, hrd->hnd_info.hnd_min, hrd->hnd_info.hnd_sec, rd.kind, rd.plz_id, rd.wrk_datetm, rd.io_div, rd.lane_no, rd.wrk_no, rd.wrkr_no, rd.con_stat, rd.rcv_snd_no, rd.st_snd_no, rd.ed_snd_no, rd.buf); - - fclose(backup_f); -#endif - - return (0); -} - -/* - *======================================================================== - * - * Function : rcv_plz_line_reply() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.31 - * Modified : - * Remark : 회선 TEST 응답 DATA 수신처리 - * - *======================================================================== -*/ -int rcv_plz_line_reply() -{ - if (hi_comm_ctrl.now_stat_info & H_CIR) - { - hi_comm_ctrl.now_stat_info &= ~H_CIR; - lcc_reply(LW_LANECOMMTEST, 0, 1, "회선 테스트가 완료 되었습니다."); - } - - return (0); -} - -/* - *======================================================================== - * - * Function : chk_seq_no() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2018.08.28 - * Modified : - * Remark : 수신 전송연번 CHECKING - * - *======================================================================== -*/ -int chk_seq_no() -{ - if (hi_comm_ctrl.now_stat_info & H_INIT) - return (0); -//lane_log("전송연번 Check1[%x][%x]\n", hi_comm_ctrl.write_info.rcv_snd_no, hi_comm_ctrl.rcv_ctrl.snd_no); - if (hi_comm_ctrl.write_info.rcv_snd_no == hi_comm_ctrl.rcv_ctrl.snd_no) - return (0); /* 전송연번 중복 */ -//lane_log("전송연번 Check2[%x][%x]\n", hi_comm_ctrl.write_info.rcv_snd_no+1, hi_comm_ctrl.rcv_ctrl.snd_no); - if ((hi_comm_ctrl.write_info.rcv_snd_no+1) == hi_comm_ctrl.rcv_ctrl.snd_no) - return (0); -//lane_log("전송연번 Check3[%x][%x]\n", hi_comm_ctrl.write_info.rcv_snd_no, hi_comm_ctrl.rcv_ctrl.snd_no); - if (hi_comm_ctrl.write_info.rcv_snd_no == 0xffff && hi_comm_ctrl.rcv_ctrl.snd_no == 1) - return (0); -//lane_log("전송연번 Check4[%x][%x]\n", hi_comm_ctrl.write_info.rcv_snd_no, hi_comm_ctrl.rcv_ctrl.snd_no); - if (hi_comm_ctrl.write_info.rcv_snd_no == 0) /* 최종수신 전송연번 무 */ - return (0); -//lane_log("전송연번 Check5[%x][%x]\n", hi_comm_ctrl.write_info.rcv_snd_no, hi_comm_ctrl.rcv_ctrl.snd_no); - if (hi_comm_ctrl.now_stat_info & H_ERR_REST) - return (0); -//lane_log("전송연번 Check6[%x][%x]\n", hi_comm_ctrl.write_info.rcv_snd_no, hi_comm_ctrl.rcv_ctrl.snd_no); - if (hi_comm_ctrl.now_stat_info & H_ACC_RESND) /* KSW */ - return (0); -//lane_log("전송연번 Check7[%x][%x]\n", hi_comm_ctrl.write_info.rcv_snd_no, hi_comm_ctrl.rcv_ctrl.snd_no); - return (-1); /* 전송연번 오류 */ -} - -/* - *======================================================================== - * - * Function : chg_car_kind() - * Progrmer : JBY (baarong@neighbor21.co.kr) - * Date : 2020.04.07 - * Modified : - * Remark : 차량번호로 차종 변경 - * - *======================================================================== -*/ -int chg_car_kind(char *car_no, char car_kind) -{ - char back_car[128]; memset(back_car, 0x00, sizeof(back_car)); - char mCarNo[3+1]; memset(mCarNo, 0x00, sizeof(mCarNo)); - int div_carkind; - - snprintf(back_car, strlen(car_no)+1, "%s", car_no); - del_space(back_car); - - div_carkind = car_kind - '0'; - sprintf(mCarNo, "%.2s%c", back_car + strlen(back_car) - 6, '\0'); - if(strcmp(mCarNo, "바") == 0 || strcmp(mCarNo, "사") == 0 || strcmp(mCarNo, "아") == 0 || strcmp(mCarNo, "자") == 0) - { - if(div_carkind == 1) - { - div_carkind = 6; - }else if(div_carkind == 2) - { - div_carkind = 7; - } - } - - return div_carkind; -} diff --git a/GREEN_LANE/src/app/passraw/wrk_data_handle.c.241206 b/GREEN_LANE/src/app/passraw/wrk_data_handle.c.241206 deleted file mode 100644 index d82a44a..0000000 --- a/GREEN_LANE/src/app/passraw/wrk_data_handle.c.241206 +++ /dev/null @@ -1,1924 +0,0 @@ -/* - *======================================================================== - * - * ý۸ : ¡ ý - * : wrk_data_handle.pc - * : - * : 2012.09.24 - * : - * : - * - *======================================================================== -*/ - -#include -#include -#include -#include -#include -/* -#include "ora_sql.h" -*/ -#include "bas_tbl.h" -#include "passraw.h" -#include "wrk_data_def.h" -/* -exec sql include "tcs_db_def.h"; -*/ -//EXEC SQL BEGIN DECLARE SECTION; -#include "tcs_db_def.h" -//EXEC SQL END DECLARE SECTION; -#include "wrk_end_def.h" -#include "iss_comp.h" - -#define _WEBSVR_ -//#define _ORACLE_ - -/*------------------------------------------------------------------------------------------------ - * Global Variable.( ) - *-----------------------------------------------------------------------------------------------*/ -//exec sql begin declare section; - -//exec sql end declare section; - -//EXEC SQL INCLUDE SQLCA; - -struct hi_comm_ctrl hi_comm_ctrl; -//static struct iss_comp_tbl iss_comp_tbl_f;; - -/* - *======================================================================== - * - * : proc_close_pass() - * : - * : 2019.06.10 - * : - * : ߰ - * - *======================================================================== -*/ - -int proc_close_pass(char *target, char *rtn) -{ - struct rcv_lane_data *rd; - struct hi_close_pass *pk_in; - int iCrjb; - int start_sno; - int end_sno; - int ii, nResult; - char tmp[20]; memset(tmp, 0x00, sizeof(tmp)); - char rBuffer[MAX_STRING_SIZE+1]; - char mCarNo[3+1]; - -//EXEC SQL BEGIN DECLARE SECTION; - char in_fare[2+1]; - char in_booth[2+1]; - char in_date[14+1]; - char in_car[16+1]; - char in_carkind[1+1]; - - char c_io[1+1]; - //char in_date[8+1]; - //char in_time[6+1]; - - int d_seq = 0; - int in_count = 0; - - int ret = 3; - -//EXEC SQL END DECLARE SECTION; -#ifdef _WEBSVR_ - size_t in_size; - size_t out_size; - size_t out_buf_left; - char orgCarNo[255+1]; - char szCarNo[255+1]; - char* in_buf; - char* out_buf; - - memset(orgCarNo, 0x00, sizeof(orgCarNo)); - memset(szCarNo, 0x00, sizeof(szCarNo)); - - iconv_t ic = iconv_open("UTF-8", "EUC-KR"); - - if(ic == (iconv_t) -1) - { - proc_log("###### Not Supported ICONV Code ###### \n"); - } -#endif - memset(in_fare , 0x00, sizeof(in_fare )); - memset(in_booth, 0x00, sizeof(in_booth)); - memset(in_date , 0x00, sizeof(in_date )); - - //memset(in_time , 0x00, sizeof(in_time )); - - //rtn = (char *)rBuffer; - rd = (struct rcv_lane_data *)target; - pk_in = (struct hi_close_pass *)rd->buf; -//proc_log("[%s]\n", target); - sprintf(in_fare, "%.2s", rd->plz_id); - //in_fare[2] = '\0'; - sprintf(in_booth, "%.2s", rd->lane_no); - //in_booth[2] = '\0'; - sprintf(in_date, "%.14s", rd->wrk_datetm); - //in_booth[14] = '\0'; - printf("Ϸùȣ[%.6s]\n", pk_in->serial_no); - d_seq = lb_data2atoi(pk_in->serial_no, 6); - - sprintf(in_car, "%.16s", pk_in->car_no); - del_space(in_car); - if(strlen(in_car) == 0) - sprintf(in_car, "????????????"); - //in_car[16] = '\0'; - - in_carkind[0] = pk_in->car_kind; - in_carkind[1] = '\0'; - - c_io[0] = pk_in->io_div; - c_io[1] = '\0'; -#if 1 - //del_space(in_car); -//proc_log("ȣ[%s]\n", in_car); - sprintf(mCarNo, "%.2s%c", in_car + strlen(in_car) - 6, '\0'); -//proc_log("߰ȣ[%.2s]\n", mCarNo); - if(strcmp(mCarNo, "") == 0 || strcmp(mCarNo, "") == 0 || strcmp(mCarNo, "") == 0 || strcmp(mCarNo, "") == 0) - { - if(in_carkind[0] - '0' == 1) - { - in_carkind[0] = '6'; - in_carkind[1] = '\0'; - }else if(in_carkind[0] - '0' == 2) - { - in_carkind[0] = '7'; - in_carkind[1] = '\0'; - } - //proc_log("Get Mid No[%s]", mCarNo); - } - //sprintf(tmp, "%s%c", in_car, '\0'); -#endif - //sprintf(in_time, "%.2s%.2s%.2s", pk_in->hour, pk_in->min, pk_in->sec); - - in_count = 1; - -//printf("[%s][%s][%s][%s][%d]\n", in_fare, in_booth, in_date, in_time, in_count); - -proc_log("[%s][%s][%s][%d][%s][%s][%s]\n", in_fare, in_booth, in_date, d_seq, in_car, in_carkind, c_io); -#ifdef _ORACLE_ - EXEC SQL INSERT INTO DAY_TRAFFIC_INFO - (FARE_OFFICE_ID, BOOTH_ID, PASS_DATE, PASS_TIME, PASS_SEQNO, CAR_NO, CARS_TYPE_ID, IN_OUT_KBN, CREATE_DATE, CREATER, UPDATE_DATE, UPDATER) - VALUES - (:in_fare, :in_booth, SUBSTR(:in_date, 1, 8), SUBSTR(:in_date, 9, 6), :d_seq, :in_car, :in_carkind, :c_io, sysdate, 'system', sysdate, 'system'); - - if (SQLCODE < 0) - { - proc_log("Day Traffic Info Insert Fail[%d][%s]\n", SQLCODE, sqlca.sqlerrm.sqlerrmc); - // return -1; - } -#endif -#ifdef _WEBSVR_ - sprintf(orgCarNo, "%.16s", in_car); - if(strlen(orgCarNo) == 0) - { - memset(in_car, 0x00, sizeof(in_car)); - sprintf(in_car, "????????????"); - }else - { - memset(in_car, 0x00, sizeof(in_car)); - in_size = strlen(orgCarNo); - out_size = sizeof(wchar_t) * in_size * 4; - - in_buf = orgCarNo; - out_buf = szCarNo; - out_buf_left = out_size; - - nResult = iconv(ic, (char *)&in_buf, &in_size, (char *)&out_buf, &out_buf_left); - if(nResult == -1) - { - proc_log("ICONV FAILED [%d]\n", nResult); - } - -//proc_log("ICONV in_size[%d] out_size[%d] [%s]\n", in_size, out_size - out_buf_left, szCarNo); - sprintf(in_car, "%.16s", szCarNo); - } - iconv_close(ic); - sprintf(rBuffer, "%s%s%s%06d%-16s%s%s", in_fare, in_booth, in_date, d_seq, in_car, in_carkind, c_io); -//proc_log("1111111 [%s] 111111\n", rBuffer); - memcpy(rtn, &rBuffer, strlen(rBuffer)); -#endif - - //sprintf(rBuffer, "%08d", SQLCODE); - proc_log("߰ [%.8s] [%d]óϷ", in_date, SQLCODE); - - return(0); -} - -/* - *======================================================================== - * - * : proc_hnd_data() - * : - * : 2019.06.10 - * : - * : ó - * - *======================================================================== -*/ - -int proc_hnd_data(char *target, char *rtn) -{ - struct rcv_lane_data *rd; - struct hi_hnd_data *pk_in; - int iCrjb; - int start_sno; - int end_sno; - int ii, nResult; - char tmp[20]; memset(tmp, 0x00, sizeof(tmp)); - char rcv_hnd[2+1]; - char rBuffer[MAX_STRING_SIZE+1]; - -//EXEC SQL BEGIN DECLARE SECTION; - char in_id[4+1]; - char in_fare[2+1]; - char in_booth[2+1]; - char in_date[14+1]; - char in_seqno[9+1]; - char in_rf_seqno[9+1]; - char in_car[16+1]; - char in_collect[2+1]; - char in_army[1+1]; - - char in_stop[50+1]; - char in_move[32+1]; - char in_amount[6+1]; - char in_x[4+1]; - char in_y[4+1]; - char in_garo[4+1]; - char in_sero[4+1]; - char in_card_ret[1+1]; - char in_other[1+1]; - char in_rfid_kbn[2+1]; - char in_tag[48+1]; - char in_carkind[1+1]; - -/* 2019.07.26 ð߰ */ - char in_sens_time[6+1]; - char in_collect_new[2+1]; -/* 2020.06.16 (ڵǴ), KeyԷ¿ ڵ ߰ */ - char in_auto_kind[2+1]; - char in_key_yn[1+1]; - - char c_io[1+1]; - int d_seq = 0; - int ret = 3; - -//EXEC SQL END DECLARE SECTION; -#ifdef _WEBSVR_ - size_t in_size; - size_t out_size; - size_t out_buf_left; - char orgCarNo[255+1]; - char szCarNo[255+1]; - char* in_buf; - char* out_buf; - - memset(orgCarNo, 0x00, sizeof(orgCarNo)); - memset(szCarNo, 0x00, sizeof(szCarNo)); - - iconv_t ic = iconv_open("UTF-8", "EUC-KR"); - - if(ic == (iconv_t) -1) - { - proc_log("###### Not Supported ICONV Code ###### \n"); - } -#endif - memset(in_id , 0x00, sizeof(in_id )); - memset(in_fare , 0x00, sizeof(in_fare )); - memset(in_booth , 0x00, sizeof(in_booth )); - memset(in_date , 0x00, sizeof(in_date )); - memset(in_seqno , 0x00, sizeof(in_seqno )); - memset(in_rf_seqno, 0x00, sizeof(in_rf_seqno)); - memset(in_car , 0x00, sizeof(in_car )); - memset(in_collect , 0x00, sizeof(in_collect )); - memset(in_army , 0x00, sizeof(in_army )); - - memset(in_stop , 0x00, sizeof(in_stop )); - memset(in_move , 0x00, sizeof(in_move )); - memset(in_amount , 0x00, sizeof(in_amount )); - memset(in_x , 0x00, sizeof(in_x )); - memset(in_y , 0x00, sizeof(in_y )); - memset(in_garo , 0x00, sizeof(in_garo )); - memset(in_sero , 0x00, sizeof(in_sero )); - memset(in_card_ret, 0x00, sizeof(in_card_ret)); - memset(in_other , 0x00, sizeof(in_other )); - memset(in_rfid_kbn, 0x00, sizeof(in_rfid_kbn)); - memset(in_tag , 0x00, sizeof(in_tag )); - memset(in_carkind , 0x00, sizeof(in_carkind )); - - memset(in_sens_time , 0x00, sizeof(in_sens_time )); - memset(in_auto_kind , 0x00, sizeof(in_auto_kind )); - - //rtn = (char *)rBuffer; - rd = (struct rcv_lane_data *)target; - pk_in = (struct hi_hnd_data *)rd->buf; - - sprintf(in_id, "%.4s", pk_in->wrkr_no); - sprintf(in_fare, "%.2s", pk_in->plz_id); - sprintf(in_booth, "%.2s", rd->lane_no); - sprintf(in_date, "%.8s%.2s%.2s%.2s", pk_in->wrk_date, pk_in->hnd_info.hnd_hour, pk_in->hnd_info.hnd_min, pk_in->hnd_info.hnd_sec); - - sprintf(c_io, "%c", pk_in->io_div); - -//Ģ - //sprintf(in_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); //10->9 - //sprintf(in_rf_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); - sprintf(in_seqno, "%08u", lb_data2atoi(pk_in->serial_no, 6)); //10->9 - sprintf(in_rf_seqno, "%08u", lb_data2atoi(pk_in->serial_no, 6)); - - d_seq = lb_data2atoi(pk_in->sence_seq_no, 6); - - sprintf(in_car, "%.16s", pk_in->car_no1); - del_space(in_car); - - if(strlen(in_car) == 0) - strncpy(in_car, "????????????", 12); - - memcpy(rcv_hnd, pk_in->hnd_info.rcpt_hnd, 2); - rcv_hnd[2] = '\0'; -// - sprintf(in_amount, "%.6s%c", pk_in->hnd_info.pass_fare, '\0'); - - switch(lb_data2atoi(rcv_hnd, 2)) - { - case 31: - sprintf(in_carkind, "6"); - break; - case 36: - sprintf(in_carkind, "7"); - break; - default: - sprintf(in_carkind, "%c", pk_in->car_kind); - break; - } - - if(lb_data2atoi(rcv_hnd, 2) > 19 && lb_data2atoi(rcv_hnd, 2) < 30 || lb_data2atoi(rcv_hnd, 2) > 59 && lb_data2atoi(rcv_hnd, 2) < 70) - { - sprintf(in_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); //10->9 - sprintf(in_rf_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); - } - - //sprintf(tmp, "%.2s%c", pk_in->hnd_info.rcpt_hnd, '\0'); - //sprintf(in_collect, "%.2s", pk_in->hnd_info.rcpt_hnd); - - switch(lb_data2atoi(rcv_hnd, 2)) - { - case 10: - sprintf(in_collect, "10"); - break; - case 11: - case 12: - case 13: - case 14: - sprintf(in_collect, "11"); - break; - case 20: - sprintf(in_collect, "20"); - break; - case 21: - case 61: - sprintf(in_collect, "21"); - break; - case 22: - sprintf(in_collect, "22"); - break; - case 23: - case 25: - case 27: - case 62: - case 63: - case 64: - case 66: - sprintf(in_collect, "23"); - break; - case 24: - case 26: - case 28: - sprintf(in_collect, "24"); - break; - case 30: - sprintf(in_collect, "30"); - break; - case 31: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 72: - case 73: - case 75: - case 76: - case 77: - case 78: - case 79: - sprintf(in_collect, "34"); - break; - case 32: - sprintf(in_collect, "32"); - break; - case 33: - sprintf(in_collect, "33"); - break; - case 34: - case 65: - case 67: - sprintf(in_collect, "30"); - break; - case 71: - case 74: - sprintf(in_collect, "31"); - break; - case 40: - case 41: - sprintf(in_collect, "40"); - break; - case 50: - sprintf(in_collect, "50"); - break; - case 51: - sprintf(in_collect, "51"); - break; - case 52: - sprintf(in_collect, "52"); - break; - case 53: - case 55: - case 56: - sprintf(in_collect, "53"); - break; - case 54: - sprintf(in_collect, "54"); - break; - case 60: - if(lb_data2atoi(in_amount, 6) > 1000) - sprintf(in_collect, "21"); - else - sprintf(in_collect, "23"); - break; - default: - sprintf(in_collect, "00"); - break; - } - - in_army[0] = '0'; - - sprintf(in_stop, "%.8s_%.2s%.2s%.2s00_%06d%.2s_%c%.2s%c_%s_%c", - pk_in->wrk_date, pk_in->hnd_info.hnd_hour, pk_in->hnd_info.hnd_min, pk_in->hnd_info.hnd_sec, - lb_data2atoi(pk_in->serial_no, 6), pk_in->hnd_info.rcpt_hnd, pk_in->plz_id[1], rd->lane_no, pk_in->io_div, - in_car, pk_in->car_kind); - - in_move[0] = ' '; - -// - memcpy(in_x, pk_in->x_point+1, 3); - in_x[3] = '\0'; -// - memcpy(in_y, pk_in->y_point+1, 3); - in_y[3] = '\0'; -// - memcpy(in_garo, pk_in->img_width+1, 3); - in_garo[3] = '\0'; -// - memcpy(in_sero, pk_in->img_heigh+1, 3); - in_sero[3] = '\0'; - - in_card_ret[0] = pk_in->hnd_info.refund_yn; - //sprintf(in_rfid_kbn, "%c", pk_in->hnd_info.issue_code[0]); - - switch(lb_data2atoi(rcv_hnd, 2)) - { - case 10: - case 11: - case 20: - case 21: - case 22: - case 23: - case 24: - case 30: - case 31: - case 32: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 71: - case 72: - case 73: - case 74: - case 75: - case 76: - case 77: - case 78: - case 79: - case 40: - case 41: - case 50: - case 51: - case 52: - case 53: - case 54: - sprintf(in_rfid_kbn, "00"); - break; - case 12: - case 25: - case 26: - case 55: - sprintf(in_rfid_kbn, "01"); - break; - case 13: - case 14: - case 27: - case 28: - case 56: - sprintf(in_rfid_kbn, "03"); - break; - case 33: - sprintf(in_rfid_kbn, "02"); - break; - case 60: - case 61: - case 62: - case 63: - case 64: - case 65: - case 66: - case 67: - sprintf(in_rfid_kbn, "99"); - break; - default: - sprintf(in_rfid_kbn, "00"); - break; - } - - if(lb_data2atoi(tmp, 2) == 53) - sprintf(in_rfid_kbn, "04"); - -#if 0 /*20191009 ݿ */ - snprintf(in_tag, 48+1, "%.24s%.24s", pk_in->tag_id1, pk_in->tag_id2); -#else - snprintf(in_tag, 48+1, "%.4s00%.2s%.2s00%c000000%c0000%.24s", pk_in->wrk_no, rcv_hnd, pk_in->hnd_info.rcpt_div, pk_in->hnd_info.key_yn, pk_in->pre_yn, pk_in->tag_id2); -#endif - -#if 1 /* 2020.06.16 (ڵǴ), KeyԷ¿ ߰ */ - sprintf(in_auto_kind, "%.2s\0", pk_in->hnd_info.rcpt_div); - sprintf(in_key_yn, "%c\0", pk_in->hnd_info.key_yn); -#endif -/* EXEC SQL - SELECT SUBSTR(COUNT(*)+1, 1, 1) - INTO :in_other - FROM FARE_TERMINAL_INFO - WHERE FARE_OFFICE_ID = :in_fare - AND BOOTH_ID = :in_booth - AND YEAR || MONTH || DAY || WORK_TIMES = :in_date - ; - in_other[0] = pk_in->wrk_no[4]; - - if (SQLCODE < 0) - { - proc_log("FARE_TERMINAL_INFO SELECT FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - return(1); - } -*/ - in_other[0] = pk_in->wrk_no[3]; -#if 1 -/* 2019.07.26 ð߰ */ - snprintf(in_sens_time, 6+1, "%.6s", pk_in->sence_time); -#endif -proc_log("PROC1[%s][%s][%s][%s][%s][%s]", in_id, in_fare, in_booth, in_date, in_seqno, in_rf_seqno); -proc_log("PROC2[%s][%s][%s][%s][%s][%s]", in_car, in_collect, in_army, in_stop, in_move, in_amount); -proc_log("PROC3[%s][%s][%s][%s][%s][%s]", in_x, in_y, in_garo, in_sero, in_card_ret, in_other); -proc_log("PROC4[%s][%s][%s][%s][%s][%s]\n", in_rfid_kbn, in_tag, in_carkind, in_sens_time, in_auto_kind, in_key_yn); - -//proc_log("ó [%02x][%02x][%02x][%02x][%02x][%02x]\n", in_id[4], in_fare[2], in_booth[2], in_date[14], in_seqno[9], in_rf_seqno[9]); -//proc_log("ó [%02x][%02x][%02x][%02x][%02x][%02x]\n", in_car[16], in_collect[2], in_army[1], in_stop[50], in_move[1], in_amount[6]); -//proc_log("ó [%02x][%02x][%02x][%02x][%02x][%02x]\n", in_x[4], in_y[4], in_garo[4], in_sero[4], in_card_ret[1], in_other[1]); -//proc_log("ó [%02x][%02x][%02x]\n", in_rfid_kbn[2], in_tag[48], in_carkind[1]); -#ifdef _ORACLE_ - EXEC SQL INSERT INTO DAY_TRAFFIC_INFO - (FARE_OFFICE_ID, BOOTH_ID, PASS_DATE, PASS_TIME, PASS_SEQNO, CAR_NO, CARS_TYPE_ID, IN_OUT_KBN, CREATE_DATE, CREATER, UPDATE_DATE, UPDATER) - VALUES - (:in_fare, :in_booth, SUBSTR(:in_date, 1, 8), SUBSTR(:in_date, 9, 6), :d_seq, :in_car, :in_carkind, :c_io, sysdate, 'system', sysdate, 'system'); - - if (SQLCODE < 0) - { - proc_log("Day Traffic Info Insert Fail[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - } -#endif -#if 0 //RFID_KBN 02 ó 迡 ߻(2019.09.30) - if(in_carkind[0] == '7') - sprintf(in_rfid_kbn, "02"); -#endif -//proc_log("CAR_KIND[%s]\n", in_carkind); - - sprintf(in_collect_new, "%.2s%c", rcv_hnd, '\0'); - -/* - EXEC SQL EXECUTE - BEGIN SP_FARE_INS_NEW(:in_id, :in_fare, :in_booth, :in_date, :in_seqno, :in_rf_seqno, :in_car, :in_collect, :in_army, :in_stop, :in_move, :in_amount, :in_x, :in_y, :in_garo, :in_sero, :in_card_ret, :in_other, :in_rfid_kbn, :in_tag, :in_carkind, :in_collect_new, :in_sens_time, :ret); - END; - END-EXEC; - - EXEC SQL - Insert Into RF_Terminal_Info - (worker_id, fare_office_id, booth_id, year, month, day, work_times, seqno, - issue_office_id, after_kbn, card_no, in_out_kbn, collect_id, levy_amount, - remaind_amount, card_office_id, terminal_id, sam_id, sam_seqno, - card_seqno, before_amount, algorithm_id, key_version, e_cash_identifier, - sam_tot_seqno, sam_collect_cnt, sam_tot_amount, sign_value, person_code, - zipge_id, alias_no, issue_id, create_date, creater, - update_date, updater, send_flag) - Values - (:in_id || :in_fare, :in_fare, :in_booth, substr(:in_date, 1, 4), substr(:in_date, 5, 2), - substr(:in_date, 7, 2), :work_times, :seqno, v_prefix, v_kbn, - v_card, v_inout, v_collect, v_amount, nvl(to_number(nvl(rtrim(in_re_amount,' '),'0')),0), - v_card_office, v_terminal_id, v_sam_id, nvl(to_number(nvl(rtrim(in_sam_seqno,' '),'0')),0), nvl(to_number(nvl(rtrim(in_card_seqno,' '),'0')),0), - nvl(to_number(nvl(rtrim(in_be_amount,' '),'0')),0), v_algorithm_id, v_key_version, v_e_cash, nvl(to_number(nvl(rtrim(in_sam_tot_seqno,' '),'0')),0), - nvl(to_number(nvl(rtrim(in_sam_collect_cnt,' '),0)),0), nvl(to_number(nvl(rtrim(in_sam_tot_amount,' '),'0')),0), in_sign_value, v_person_code, - v_zipge_id, v_alias_no, v_issue_id, sysdate, 'dekim', - sysdate, 'dekim', '0'); - - if (SQLCODE < 0) - { - proc_log("SP_FARE_INS_NEW 1 CALL FAIL[%d]", sqlca.sqlerrd[4]); - proc_log("SP_FARE_INS_NEW 2 CALL FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - return(1); - } -*/ -#ifdef _WEBSVR_ - del_space(in_car); - sprintf(orgCarNo, "%.16s", in_car); - - if(strlen(orgCarNo) == 0) - { - memset(in_car, 0x00, sizeof(in_car)); - sprintf(in_car, "????????????"); - }else - { - memset(in_car, 0x00, sizeof(in_car)); - in_size = strlen(orgCarNo); - out_size = sizeof(wchar_t) * in_size * 4; - - in_buf = orgCarNo; - out_buf = szCarNo; - out_buf_left = out_size; - - nResult = iconv(ic, (char *)&in_buf, &in_size, (char *)&out_buf, &out_buf_left); - if(nResult == -1) - { - proc_log("ICONV FAILED [%d]\n", nResult); - } - -//proc_log("ICONV in_size[%d] out_size[%d] [%s]\n", in_size, out_size - out_buf_left, szCarNo); - sprintf(in_car, "%.16s", szCarNo); - } - iconv_close(ic); -#if 0 - sprintf(rBuffer, "%s%s%s%s%s%s%-16s%s%s00%s%s%s%s%s%s%s%s%-48s%s%s%s%s", - in_id, in_fare, in_booth, in_date, in_seqno, in_rf_seqno, - in_car, in_collect, in_army, in_amount, - in_x, in_y, in_garo, in_sero, in_card_ret, in_other, - in_rfid_kbn, in_tag, in_carkind, rcv_hnd, in_sens_time, c_io); -#else /* 2020.06.16 (ڵǴ), KeyԷ¿ DBó ߰ */ - sprintf(rBuffer, "%s%s%s%s%s%s%-16s%s%s00%s%s%s%s%s%s%s%s%-48s%s%s%s%s%s%s", - in_id, in_fare, in_booth, in_date, in_seqno, in_rf_seqno, - in_car, in_collect, in_army, in_amount, - in_x, in_y, in_garo, in_sero, in_card_ret, in_other, - in_rfid_kbn, in_tag, in_carkind, rcv_hnd, in_sens_time, c_io, in_auto_kind, in_key_yn); -#endif - //sprintf(rBuffer, "%08d", SQLCODE); - memcpy(rtn, &rBuffer, strlen(rBuffer)); -#endif - - proc_log("ó [%.8s] [%d]óϷ", in_date, SQLCODE); - - return 0; -} - -/* - *======================================================================== - * - * : proc_card_data() - * : - * : 2019.06.10 - * : - * : ī ó - * - *======================================================================== -*/ - -int proc_card_data(char *target, char *rtn) -{ - struct rcv_lane_data *rd; - struct hi_crd_hnd_data *pk_in; - int iCrjb; - int start_sno; - int end_sno; - int ii, size, stsize; - char tmp[10+1]; memset(tmp, 0x00, sizeof(tmp)); - char path[256]; memset(path, 0x00, sizeof(path)); - char tmp_iss_cd[7]; memset(tmp_iss_cd, 0x00, sizeof(tmp_iss_cd)); - char rBuffer[MAX_STRING_SIZE+1]; - FILE *fp; - struct iss_comp_tbl iss_comp_tbl_f; - struct stat file_info; - -//EXEC SQL BEGIN DECLARE SECTION; - char in_id[4+1]; - char in_fare[2+1]; - char in_booth[2+1]; - char in_date[8+1]; - char in_time[6+1]; - char in_seqno[9+1]; - char in_kbn[1+1]; - char in_card[16+1]; - char in_collect[2+1]; - char in_be_amount[8+1]; - char in_amount[8+1]; - char in_re_amount[8+1]; - char in_terminal_id[9+1]; - char in_sam_id[16+1]; - char in_sam_seqno[10+1]; - char in_card_seqno[10+1]; - char in_algorithm_id[2+1]; - char in_key_version[2+1]; - char in_e_cash[2+1]; - char in_sam_tot_seqno[10+1]; - char in_sam_collect_cnt[5+1]; - char in_sam_tot_amount[10+1]; - char in_sign_value[8+1]; - char in_person_code[2+1]; - char in_zipge_id[12+1]; - char in_alias_no[10+1]; - char in_issue_id[7+1]; - int ret = 3; -//EXEC SQL END DECLARE SECTION; - - memset(in_id , 0x00, sizeof(in_id )); - memset(in_fare , 0x00, sizeof(in_fare )); - memset(in_booth , 0x00, sizeof(in_booth )); - memset(in_date , 0x00, sizeof(in_date )); - memset(in_time , 0x00, sizeof(in_time )); - memset(in_seqno , 0x00, sizeof(in_seqno )); - memset(in_kbn , 0x00, sizeof(in_kbn )); - memset(in_card , 0x00, sizeof(in_card )); - memset(in_collect , 0x00, sizeof(in_collect )); - memset(in_be_amount , 0x00, sizeof(in_be_amount )); - memset(in_amount , 0x00, sizeof(in_amount )); - memset(in_re_amount , 0x00, sizeof(in_re_amount )); - memset(in_terminal_id , 0x00, sizeof(in_terminal_id )); - memset(in_sam_id , 0x00, sizeof(in_sam_id )); - memset(in_sam_seqno , 0x00, sizeof(in_sam_seqno )); - memset(in_card_seqno , 0x00, sizeof(in_card_seqno )); - memset(in_algorithm_id , 0x00, sizeof(in_algorithm_id )); - memset(in_key_version , 0x00, sizeof(in_key_version )); - memset(in_e_cash , 0x00, sizeof(in_e_cash )); - memset(in_sam_tot_seqno , 0x00, sizeof(in_sam_tot_seqno )); - memset(in_sam_collect_cnt, 0x00, sizeof(in_sam_collect_cnt)); - memset(in_sam_tot_amount , 0x00, sizeof(in_sam_tot_amount )); - memset(in_sign_value , 0x00, sizeof(in_sign_value )); - memset(in_person_code , 0x00, sizeof(in_person_code )); - memset(in_zipge_id , 0x00, sizeof(in_zipge_id )); - memset(in_alias_no , 0x00, sizeof(in_alias_no )); - memset(in_issue_id , 0x00, sizeof(in_issue_id )); - - //rtn = (char *)rBuffer; - rd = (struct rcv_lane_data *)target; -//proc_log("īó[%s]\n", rd->buf); - pk_in = (struct hi_crd_hnd_data *)rd->buf; - - sprintf(in_id, "%.4s", pk_in->wrkr_no); - sprintf(in_fare, "%.2s", pk_in->plz_id); - sprintf(in_booth, "%.2s", rd->lane_no); - - sprintf(in_date, "%.8s", pk_in->wrk_date); - sprintf(in_time, "%.2s%.2s%.2s", pk_in->hnd_hour, pk_in->hnd_min, pk_in->hnd_sec); - -//Ģ - sprintf(tmp, "%.6s%c", pk_in->serial_no, '\0'); - sprintf(in_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(tmp, 6)); //10->9 -//sprintf(in_seqno, "%08d", lb_data2atoi(tmp, 6)); //10->9 -// Ģ Ȯ ʿ(ī 3, 8) - -//if(lb_data2atoi(tmp, 2) > 19 && lb_data2atoi(tmp, 2) < 30) -//{ - //sprintf(in_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(tmp, 6)); //10->9 -//} - //sprintf(tmp, "%.2s%c", pk_in->crd_kind, '\0'); -/* - switch(lb_data2atoi(tmp, 2)) - { - case 0: - sprintf(in_kbn, "3"); - break; - case 9: - case 10: - case 11: - case 12: - sprintf(in_kbn, "4"); - break; - case 3: - case 8: - if(ii = 0) sprintf(in_kbn, "4"); - else sprintf(in_kbn, "2"); - break; - default : - sprintf(in_kbn, "2"); - break; - } -*/ - - memset(tmp, 0x00, sizeof(tmp)); - sprintf(tmp, "%.6s%c", pk_in->rcpt_money, '\0'); - sprintf(in_amount, "%8u", lb_data2atoi(tmp, 6)); - in_kbn[0] = pk_in->pre_div; -//proc_log("ĺұ[%cs[%c]\n", in_kbn, pk_in->pre_div); - sprintf(in_card, "%.16s", pk_in->crd_no); - sprintf(tmp, "%.2s%c", pk_in->rcpt_div, '\0'); - switch(lb_data2atoi(tmp, 2)) - { - case 10: - sprintf(in_collect, "10"); - break; - case 11: - case 12: - case 13: - case 14: - sprintf(in_collect, "11"); - break; - case 20: - sprintf(in_collect, "20"); - break; - case 21: - sprintf(in_collect, "21"); - break; - case 22: - sprintf(in_collect, "22"); - break; - case 23: - case 25: - case 27: - case 62: - case 63: - case 64: - case 66: - sprintf(in_collect, "23"); - break; - case 24: - case 26: - case 28: - sprintf(in_collect, "24"); - break; - case 30: - sprintf(in_collect, "30"); - break; - case 31: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 72: - case 73: - case 75: - case 76: - case 77: - case 78: - case 79: - sprintf(in_collect, "34"); - break; - case 32: - sprintf(in_collect, "32"); - break; - case 33: - sprintf(in_collect, "33"); - break; - case 34: - case 65: - case 67: - sprintf(in_collect, "30"); - break; - case 71: - case 74: - sprintf(in_collect, "31"); - break; - case 40: - case 41: - sprintf(in_collect, "40"); - break; - case 50: - sprintf(in_collect, "50"); - break; - case 51: - sprintf(in_collect, "51"); - break; - case 52: - sprintf(in_collect, "52"); - break; - case 53: - case 55: - case 56: - sprintf(in_collect, "53"); - break; - case 54: - sprintf(in_collect, "54"); - break; - case 60: - if(lb_data2atoi(in_amount, 6) > 1000) - sprintf(in_collect, "21"); - else - sprintf(in_collect, "23"); - break; - default: - sprintf(in_collect, "00"); - break; - } - //sprintf(in_collect, "%.2s", pk_in->rcpt_div); - - sprintf(tmp, "%.8s%c", pk_in->bef_rcpt_balc, '\0'); - sprintf(in_be_amount, "%8u", lb_data2atoi(tmp, 8)); - - sprintf(tmp, "%.8s%c", pk_in->aft_rcpt_balc, '\0'); - sprintf(in_re_amount, "%8u", lb_data2atoi(tmp, 8)); - - sprintf(in_terminal_id, "%.9s", pk_in->terminal_no+1); - sprintf(in_sam_id, "%.16s", pk_in->psam_id); -#if 1 //Hexa -> Decimal - sprintf(tmp, "%.8s%c", pk_in->deal_ser_no, '\0'); - sprintf(in_sam_seqno, "%010u", strtoul(tmp, NULL, 16)); -#else // Hexa - sprintf(in_sam_seqno, "%.8s%c", pk_in->deal_ser_no, '\0'); -#endif - -#if 0 //Hexa -> Decimal - sprintf(tmp, "%.10s%c", pk_in->crd_ser_no, '\0'); - sprintf(in_card_seqno, "%010u", strtoul(tmp, NULL, 16)); -#else // Hexa (OK) - sprintf(in_card_seqno, "%.10s%c", pk_in->crd_ser_no, '\0'); -#endif - sprintf(in_algorithm_id, "%.2s", pk_in->alg_id); - sprintf(in_key_version, "%.2s", pk_in->ind_sign1); - sprintf(in_e_cash, "%.2s", pk_in->id_center); -#if 1 //Hexa -> Decimal - sprintf(tmp, "%.8s%c", pk_in->rcpt_deal_ser, '\0'); - sprintf(in_sam_tot_seqno, "%010u", strtoul(tmp, NULL, 16)); -#else // Hexa - sprintf(in_sam_tot_seqno, "%.8s%c", pk_in->rcpt_deal_ser, '\0'); -#endif -#if 1 //Hexa -> Decimal - sprintf(tmp, "%.4s%c", pk_in->ind_iss_cnt, '\0'); - sprintf(in_sam_collect_cnt, "%05u", strtoul(tmp, NULL, 16)); -#else - sprintf(in_sam_collect_cnt, "%.4s%c", pk_in->ind_iss_cnt, '\0'); -#endif -#if 1 - sprintf(tmp, "%.8s%c", pk_in->deal_tot, '\0'); - sprintf(in_sam_tot_amount, "%010d", strtoul(tmp, NULL, 16)); -#else - sprintf(in_sam_tot_amount, "%.8s%c", pk_in->deal_tot, '\0'); -#endif - sprintf(in_sign_value, "%.8s", pk_in->psam_sign1); - sprintf(in_person_code, "%.2s", pk_in->another); - sprintf(in_zipge_id, "9100000000%.2s", rd->lane_no); -#if 0 // Hexa -> Decimal - sprintf(tmp, "%.10s%c", pk_in->alias_no, '\0'); - sprintf(in_alias_no, "%010u", strtoul(tmp, NULL, 16)); -#else - sprintf(in_alias_no, "%.10s", pk_in->alias_no); -#endif - sprintf(tmp_iss_cd, "%.6s%c", pk_in->crd_no, '\0'); - stsize = sizeof(struct iss_comp_tbl); -//proc_log("BIN_CODE[%.6s]\n", tmp_iss_cd); - -#if 0 - sprintf(path, "%s/%s/ISSTBL", DIR_TCS, DIR_BASEINFO); - fp = fopen(path, "r+"); - if( 0 > stat(path, &file_info)) - { - proc_log(" \n"); - }else - { - size = file_info.st_size; -//proc_log(" Size[%d]\n", size); - for(ii = 0; ii < (size / stsize); ii++) - { - //fseek(fp, ii * stsize, SEEK_SET); - fread(&iss_comp_tbl_f, stsize, 1, fp); -//proc_log("[%d]FILE BIN[%.6s] ISSCD[%.6s]\n", ii, iss_comp_tbl_f.bin_code+2, tmp_iss_cd); - if(strncmp(iss_comp_tbl_f.bin_code+2, tmp_iss_cd, 6) == 0) - break; - } - } - - close(fp); -#endif - -#if 0 //LG ? - if(strncmp(iss_comp_tbl_f.issue_cd, "2000400", 7) == 0) - sprintf(in_issue_id, "2000700"); - else snprintf(in_issue_id, 7+1, "%.7s", iss_comp_tbl_f.issue_cd); -#else - //snprintf(in_issue_id, 7+1, "%.7s", iss_comp_tbl_f.issue_cd); - sprintf(in_issue_id, "2000700"); -#endif - -proc_log("CARD1[%s][%s][%s][%s][%s][%s]", in_id, in_fare, in_booth, in_date, in_time, in_seqno); -proc_log("CARD2[%s][%s][%s][%s][%s][%s][%s]", in_kbn, in_card, in_collect, in_be_amount, in_amount, in_re_amount, in_terminal_id); -proc_log("CARD3[%s][%s][%s][%s][%s][%s]", in_sam_id, in_sam_seqno, in_card_seqno, in_algorithm_id, in_key_version, in_e_cash); -proc_log("CARD4[%s][%s][%s][%s][%s][%s]", in_sam_tot_seqno, in_sam_collect_cnt, in_sam_tot_amount, in_sign_value, in_person_code, in_zipge_id); -proc_log("CARD5[%s][%s]\n", in_alias_no, in_issue_id); -#ifdef _ORACLE_ -EXEC SQL EXECUTE -BEGIN SP_RF_INS_NEW(:in_id, :in_fare, :in_booth, :in_date, :in_time, :in_seqno, :in_kbn, :in_card, :in_collect, :in_be_amount, :in_amount, :in_re_amount, :in_terminal_id, :in_sam_id, :in_sam_seqno, :in_card_seqno, :in_algorithm_id, :in_key_version, :in_e_cash, :in_sam_tot_seqno, :in_sam_collect_cnt, :in_sam_tot_amount, :in_sign_value, :in_person_code, :in_zipge_id, :in_alias_no, :in_issue_id, :ret); -END; -END-EXEC; - if (SQLCODE < 0) - { - proc_log("SP_RF_INS CALL FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - return(1); - } -#endif -#ifdef _WEBSVR_ - sprintf(rBuffer, "%s%s%s%s%s%s%s%s%s%08d%08d%08d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", - in_id, in_fare, in_booth, in_date, in_time, in_seqno, - in_kbn, in_card, in_collect, lb_data2atoi(in_be_amount, 8), lb_data2atoi(in_amount, 8), lb_data2atoi(in_re_amount, 8), - in_terminal_id, in_sam_id, in_sam_seqno, in_card_seqno, in_algorithm_id, in_key_version, in_e_cash, - in_sam_tot_seqno, in_sam_collect_cnt, in_sam_tot_amount, in_sign_value, in_person_code, in_zipge_id, - in_alias_no, in_issue_id); - - //sprintf(rBuffer, "%08d", SQLCODE); - memcpy(rtn, &rBuffer, strlen(rBuffer)); -#endif - proc_log("īó [%.8s] [%d]óϷ", in_date, SQLCODE); - usleep(100000); - return 0; -} - -/* - *======================================================================== - * - * : proc_wrk_end() - * : - * : 2019.06.10 - * : - * : ٹ ó - * - *======================================================================== -*/ - -int proc_wrk_end(char *target, char *rtn) -{ - struct rcv_lane_data *rd; - struct hi_wrk_end *pk_in; - int iCrjb; - int start_sno; - int end_sno; - int ii; - char rBuffer[MAX_STRING_SIZE+1]; - char hnd_div[2+1]; - -//EXEC SQL BEGIN DECLARE SECTION; - char year[4+1]; - char mon[2+1]; - char day[2+1]; - - char in_id[4+1]; - char in_fare[2+1]; - char in_booth[2+1]; - char in_st_date[14+1]; - char in_ed_date[14+1]; - int in_cash = 0; - int in_k_cash = 0; - int in_free = 0; - int in_minap = 0; - int in_coupon = 0; - int in_k_coupon = 0; - int in_sun = 0; - int in_k_sun = 0; - int in_who = 0; - int in_k_who = 0; - int in_sale = 0; - int in_k_sale = 0; - int in_total_amount = 0; - int in_repay_q = 0; - int in_repay_m = 0; - int in_prp_q = 0; - int in_prp_m = 0; - int in_k_prp_q = 0; - int in_k_prp_m = 0; - int in_seqno = 0; - int ret = -1; -//EXEC SQL END DECLARE SECTION; - - memset(year, 0x00, sizeof(year)); - memset(mon , 0x00, sizeof(mon )); - memset(day , 0x00, sizeof(day )); - - memset(in_id , 0x00, sizeof(in_id )); - memset(in_fare , 0x00, sizeof(in_fare )); - memset(in_booth , 0x00, sizeof(in_booth )); - memset(in_st_date, 0x00, sizeof(in_st_date)); - memset(in_ed_date, 0x00, sizeof(in_ed_date)); - - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); - - //rtn = (char *)rBuffer; - rd = (struct rcv_lane_data *)target; - pk_in = (struct hi_wrk_end *)rd->buf; - start_sno = lb_data2atoi(rd->st_snd_no, 10); - end_sno = lb_data2atoi(pk_in->seq_no, 10); - - sprintf(in_id, "%.4s", pk_in->wrkr_no); - sprintf(in_fare, "%.2s", rd->plz_id); - sprintf(in_booth, "%.2s", rd->lane_no); - sprintf(in_st_date, "%.4s%.2s%.2s%.2s%.2s%.2s", - pk_in->wrk_start_year, pk_in->wrk_start_month, pk_in->wrk_start_day, - pk_in->wrk_start_hour, pk_in->wrk_start_min, pk_in->wrk_start_sec); - sprintf(in_ed_date, "%.4s%.2s%.2s%.2s%.2s%.2s", - pk_in->wrk_end_year, pk_in->wrk_end_month, pk_in->wrk_end_day, - pk_in->wrk_end_hour, pk_in->wrk_end_min, pk_in->wrk_end_sec); - -/* ˻ Է */ - sprintf(year, "%.4s", pk_in->wrk_start_year); - sprintf(mon, "%.2s", pk_in->wrk_start_month); - sprintf(day, "%.2s", pk_in->wrk_start_day); - - for(ii = 0; ii < 50; ii++) - { - switch(lb_data2atoi(pk_in->hnd_cnt[ii].div, 2)) - { - case 10: - in_cash += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 11: - case 12: - case 13: - case 14: - in_k_cash += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 30: - case 31: - case 32: - case 33: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 71: - case 72: - case 73: - case 74: - case 75: - case 76: - case 77: - case 78: - case 79: - in_free += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 40: - case 41: - case 65: - case 67: - in_minap += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 51: - in_coupon += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 53: - case 55: - case 56: - in_k_coupon += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 21: - case 60: - case 61: - case 62: - case 63: - case 64: - case 66: - in_sun += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 23: - case 25: - case 27: - in_k_sun += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 22: - in_who += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 24: - case 26: - case 28: - in_k_who += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 52: - in_sale += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 54: - in_k_sale += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - } - } - - in_total_amount = lb_data2atoi(pk_in->tot_fare, 8); - in_repay_q = lb_data2atoi(pk_in->repay_cnt, 4); - in_repay_m = lb_data2atoi(pk_in->repay_fare, 8); - - in_seqno = pk_in->wrk_no[3] - '0'; - - if (SQLCODE < 0) - { - proc_log("FARE_ADJUST_INFO Select FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - hi_comm_ctrl.write_info.return_code = HNDSTAT(J_DATA,S_TBL_ERR); - return(1); - } - -/* EXEC SQL PREPARE sProc FROM :stmt; */ -/* EXEC SQL EXECUTE sProc USING :pr_out.in_id, :pr_out.in_fare, :pr_out.in_booth, :pr_out.in_st_date, :pr_out.in_ed_date, :pr_out.in_cash, :pr_out.in_k_cash, :pr_out.in_free, :pr_out.in_minap, :pr_out.in_coupon, :pr_out.in_k_coupon, :pr_out.in_sun, :pr_out.in_k_sun, :pr_out.in_who, :pr_out.in_k_who, :pr_out.in_sale, :pr_out.in_k_sale, :pr_out.in_total_amount, :pr_out.in_repay_q, :pr_out.in_repay_m, :pr_out.in_seqno, :ret; */ - -/* - EXEC SQL CALL SP_ADJUST_INS(:pr_out.in_id, :pr_out.in_fare, :pr_out.in_booth, :pr_out.in_st_date, :pr_out.in_ed_date, - :pr_out.in_cash, :pr_out.in_k_cash, :pr_out.in_free, :pr_out.in_minap, :pr_out.in_coupon, - :pr_out.in_k_coupon, :pr_out.in_sun, :pr_out.in_k_sun, :pr_out.in_who, :pr_out.in_k_who, - :pr_out.in_sale, :pr_out.in_k_sale, :pr_out.in_total_amount, :pr_out.in_repay_q, :pr_out.in_repay_m, - :pr_out.in_seqno, :ret); -*/ -#ifdef _ORACLE_ -EXEC SQL EXECUTE -BEGIN SP_ADJUST_INS(:in_id, :in_fare, :in_booth, :in_st_date, :in_ed_date, :in_cash, :in_k_cash, :in_free, :in_minap, :in_coupon, :in_k_coupon, :in_sun, :in_k_sun, :in_who, :in_k_who, :in_sale, :in_k_sale, :in_total_amount, :in_repay_q, :in_repay_m, :in_seqno, :ret); -END; -END-EXEC; - - if (SQLCODE < 0) - { - proc_log("SP_ADJUST_INS CALL FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - hi_comm_ctrl.write_info.return_code = HNDSTAT(J_DATA,S_TBL_ERR); - return(1); - } -#endif -#ifdef _WEBSVR_ -/* - in_cash = 0; - in_k_cash = 0; - in_free = 0; - in_minap = 0; - in_coupon = 0; - in_k_coupon = 0; - in_sun = 0; - in_k_sun = 0; - in_who = 0; - in_k_who = 0; - in_sale = 0; - in_k_sale = 0; - - for(ii = 0; ii < 50; ii++) - { - switch(lb_data2atoi(pk_in->hnd_cnt[ii].div, 2)) - { - case 10: - in_cash += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 11: - case 12: - case 13: - case 14: - in_k_cash += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 30: - case 31: - case 32: - case 33: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 71: - case 72: - case 73: - case 74: - case 75: - case 76: - case 77: - case 78: - case 79: - in_free += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 40: - case 41: - in_minap += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 60: - case 61: - in_prp_q += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - in_prp_m += lb_data2atoi(pk_in->hnd_cnt[ii].fare, 8); - break; - case 62: - case 63: - case 64: - case 65: - case 66: - case 67: - in_k_prp_q += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - in_k_prp_m += lb_data2atoi(pk_in->hnd_cnt[ii].fare, 8); - break; - case 51: - in_coupon += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 53: - case 55: - case 56: - in_k_coupon += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 21: - in_sun += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 23: - case 25: - case 27: - in_k_sun += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 22: - in_who += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 24: - case 26: - case 28: - in_k_who += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 52: - in_sale += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - case 54: - in_k_sale += lb_data2atoi(pk_in->hnd_cnt[ii].cnt, 4); - break; - } - } -*/ - sprintf(rBuffer, "%s%s%s%s%s%04d%04d%04d%04d%04d%04d%04d%04d%04d%04d%04d%04d%08d%04d%08d%04d%08d%04d%08d%d", - in_id, in_fare, in_booth, in_st_date, in_ed_date, - in_cash, in_k_cash, in_free, in_minap, in_coupon, in_k_coupon, in_sun, in_k_sun, - in_who, in_k_who, in_sale, in_k_sale, in_total_amount, in_repay_q, - in_repay_m, in_prp_q, in_prp_m, in_k_prp_q, in_k_prp_m, in_seqno); - - //sprintf(rBuffer, "%08d", SQLCODE); - memcpy(rtn, &rBuffer, strlen(rBuffer)); -#endif - - proc_log("ٹ [%.8s] [%d]óϷ", in_ed_date, SQLCODE); - - return 0; -} - -/* - *======================================================================== - * - * : proc_refund() - * : - * : 2019.07.01 - * : - * : ȯó ó - * - *======================================================================== -*/ - -int proc_refund(char *target, char *rtn) -{ - struct rcv_lane_data *rd; - struct hi_refund_data *pk_in; - int iCrjb; - int end_sno; - int ii, nResult; - char rBuffer[MAX_STRING_SIZE+1]; - char rcv_hnd[2+1]; - char tmp_seq[9+1]; - char tmp[10+1]; -#if 0 -EXEC SQL BEGIN DECLARE SECTION; - char in_wrkr_id[6+1]; - char in_fare[2+1]; - char in_booth[2+1]; - char in_year[4+1]; - char in_month[2+1]; - char in_day[2+1]; - char in_wrk_time[6+1]; - int in_seqno; - char in_refund[1+1]; - - int ret = -1; -EXEC SQL END DECLARE SECTION; -//proc_log("1-1\n"); - memset(in_wrkr_id , 0x00, sizeof(in_wrkr_id )); - memset(in_fare , 0x00, sizeof(in_fare )); - memset(in_booth , 0x00, sizeof(in_booth )); - memset(in_year , 0x00, sizeof(in_year )); - memset(in_month , 0x00, sizeof(in_month )); - memset(in_day , 0x00, sizeof(in_day )); - memset(in_wrk_time, 0x00, sizeof(in_wrk_time)); - //memset(in_seqno , 0x00, sizeof(in_seqno )); - memset(in_refund , 0x00, sizeof(in_refund )); -//proc_log("1-2\n"); - char tmp[10]; memset(tmp, 0x00, sizeof(tmp)); -//proc_log("1-3\n"); - //rtn = (char *)rBuffer; - rd = (struct rcv_lane_data *)target; - pk_in = (struct hi_refund_data *)rd->buf; -//proc_log("1[%.2s][%.4s]\n", pk_in->plz_id, pk_in->wrkr_no); - sprintf((char *)in_wrkr_id, "%.2s%.4s", pk_in->plz_id, pk_in->wrkr_no); - sprintf((char *)in_fare, "%.2s", rd->plz_id); -//proc_log("1-1[%.2s]\n", rd->lane_no); - sprintf((char *)in_booth, "%.2s", rd->lane_no); - sprintf(tmp, "%.6s%c", pk_in->serial_no, '\0'); - sprintf(tmp_seq, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(tmp, 6)); //10->9 - in_seqno = lb_data2atoi(tmp_seq, 8); -//proc_log("2[%.4s]\n", pk_in->hnd_year); - sprintf((char *)in_year, "%.4s", pk_in->hnd_year); -//proc_log("2-1[%.2s]\n", pk_in->hnd_month); - sprintf((char *)in_month, "%.2s", pk_in->hnd_month); -//proc_log("2-2[%.2s]\n", pk_in->hnd_day); - sprintf((char *)in_day, "%.2s", pk_in->hnd_day); -//proc_log("2-3[%.2s][%.8s]\n", pk_in->hnd_hour, pk_in->hnd_min, pk_in->hnd_sec, pk_in->serial_no); - sprintf((char *)in_wrk_time, "%.2s%.2s%.2s", pk_in->hnd_hour, pk_in->hnd_min, pk_in->hnd_sec); -//proc_log("3[%s][%s][%s][%s][%s][%s][%s][%d][%c]\n", in_wrkr_id, in_fare, in_booth, in_year, in_month, in_day, in_wrk_time, in_seqno, pk_in->refund_key); - sprintf((char *)in_refund, "%c", pk_in->refund_key); -//proc_log("4[%s]\n", in_refund); -#ifdef _ORACLE_ - EXEC SQL - UPDATE FARE_TERMINAL_INFO - SET C_REPAY_KBN = :in_refund - WHERE WORKER_ID = :in_wrkr_id - AND FARE_OFFICE_ID = :in_fare - AND BOOTH_ID = :in_booth - AND YEAR = :in_year - AND MONTH = :in_month - AND DAY = :in_day - AND WORK_TIMES = :in_wrk_time - AND SEQNO = :in_seqno - ; -//proc_log("5\n"); - if (SQLCODE < 0) - { - proc_log("FARE_TERMINAL_INFO UPDATE FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - hi_comm_ctrl.write_info.return_code = HNDSTAT(J_DATA,S_TBL_ERR); - return(1); - } -#endif - sprintf(rBuffer, "%08d", SQLCODE); - - //proc_log("ȯó [%d]óϷ", SQLCODE); -#else - -//EXEC SQL BEGIN DECLARE SECTION; - char in_id[4+1]; - char in_fare[2+1]; - char in_booth[2+1]; - char in_date[14+1]; - char in_seqno[9+1]; - char in_rf_seqno[9+1]; - char in_car[16+1]; - char in_collect[2+1]; - char in_army[1+1]; - - char in_stop[50+1]; - char in_move[32+1]; - char in_amount[6+1]; - char in_x[4+1]; - char in_y[4+1]; - char in_garo[4+1]; - char in_sero[4+1]; - char in_card_ret[1+1]; - char in_other[1+1]; - char in_rfid_kbn[2+1]; - char in_tag[48+1]; - char in_carkind[1+1]; - char in_sens_time[6+1]; - char in_collect_new[2+1]; - - char c_io[1+1]; - int d_seq = 0; - int ret = 3; - -//EXEC SQL END DECLARE SECTION; -#ifdef _WEBSVR_ - size_t in_size; - size_t out_size; - size_t out_buf_left; - char orgCarNo[255+1]; - char szCarNo[255+1]; - char* in_buf; - char* out_buf; - - memset(orgCarNo, 0x00, sizeof(orgCarNo)); - memset(szCarNo, 0x00, sizeof(szCarNo)); - - iconv_t ic = iconv_open("UTF-8", "EUC-KR"); - - if(ic == (iconv_t) -1) - { - proc_log("###### Not Supported ICONV Code ###### \n"); - } -#endif - memset(in_id , 0x00, sizeof(in_id )); - memset(in_fare , 0x00, sizeof(in_fare )); - memset(in_booth , 0x00, sizeof(in_booth )); - memset(in_date , 0x00, sizeof(in_date )); - memset(in_seqno , 0x00, sizeof(in_seqno )); - memset(in_rf_seqno, 0x00, sizeof(in_rf_seqno)); - memset(in_car , 0x00, sizeof(in_car )); - memset(in_collect , 0x00, sizeof(in_collect )); - memset(in_army , 0x00, sizeof(in_army )); - - memset(in_stop , 0x00, sizeof(in_stop )); - memset(in_move , 0x00, sizeof(in_move )); - memset(in_amount , 0x00, sizeof(in_amount )); - memset(in_x , 0x00, sizeof(in_x )); - memset(in_y , 0x00, sizeof(in_y )); - memset(in_garo , 0x00, sizeof(in_garo )); - memset(in_sero , 0x00, sizeof(in_sero )); - memset(in_card_ret, 0x00, sizeof(in_card_ret)); - memset(in_other , 0x00, sizeof(in_other )); - memset(in_rfid_kbn, 0x00, sizeof(in_rfid_kbn)); - memset(in_tag , 0x00, sizeof(in_tag )); - memset(in_carkind , 0x00, sizeof(in_carkind )); - memset(in_sens_time , 0x00, sizeof(in_sens_time )); - - //rtn = (char *)rBuffer; - rd = (struct rcv_lane_data *)target; - pk_in = (struct hi_hnd_data *)rd->buf; - - sprintf(in_id, "%.4s", pk_in->wrkr_no); - sprintf(in_fare, "%.2s", pk_in->plz_id); - sprintf(in_booth, "%.2s", rd->lane_no); - sprintf(in_date, "%.8s%.2s%.2s%.2s", pk_in->wrk_date, pk_in->hnd_info.hnd_hour, pk_in->hnd_info.hnd_min, pk_in->hnd_info.hnd_sec); - - sprintf(c_io, "%c", pk_in->io_div); - -//Ģ - //sprintf(in_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); //10->9 - //sprintf(in_rf_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); - sprintf(in_seqno, "%08u", lb_data2atoi(pk_in->serial_no, 6)); //10->9 - sprintf(in_rf_seqno, "%08u", lb_data2atoi(pk_in->serial_no, 6)); - - d_seq = lb_data2atoi(pk_in->sence_seq_no, 6); - - sprintf(in_car, "%.16s", pk_in->car_no1); - del_space(in_car); - - if(strlen(in_car) == 0) - strncpy(in_car, "????????????", 12); - - memcpy(rcv_hnd, pk_in->hnd_info.rcpt_hnd, 2); - rcv_hnd[2] = '\0'; - - switch(lb_data2atoi(rcv_hnd, 2)) - { - case 31: - sprintf(in_carkind, "6"); - break; - case 36: - sprintf(in_carkind, "7"); - break; - default: - sprintf(in_carkind, "%c", pk_in->car_kind); - break; - } - - if(lb_data2atoi(rcv_hnd, 2) > 19 && lb_data2atoi(rcv_hnd, 2) < 30) - { - sprintf(in_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); //10->9 - sprintf(in_rf_seqno, "%c%.2s%05d", pk_in->plz_id[1], rd->lane_no, lb_data2atoi(pk_in->serial_no, 6)); - } - - switch(lb_data2atoi(rcv_hnd, 2)) - { - case 10: - sprintf(in_collect, "10"); - break; - case 11: - case 12: - case 13: - case 14: - sprintf(in_collect, "11"); - break; - case 20: - sprintf(in_collect, "20"); - break; - case 21: - sprintf(in_collect, "21"); - break; - case 22: - sprintf(in_collect, "22"); - break; - case 23: - case 25: - case 27: - sprintf(in_collect, "23"); - break; - case 24: - case 26: - case 28: - sprintf(in_collect, "24"); - break; - case 30: - sprintf(in_collect, "30"); - break; - case 31: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 72: - case 73: - case 75: - case 76: - case 77: - case 78: - case 79: - sprintf(in_collect, "34"); - break; - case 32: - sprintf(in_collect, "32"); - break; - case 33: - sprintf(in_collect, "33"); - break; - case 34: - case 65: - case 67: - sprintf(in_collect, "30"); - break; - case 71: - case 74: - sprintf(in_collect, "31"); - break; - case 40: - case 41: - case 60: - case 61: - case 62: - case 63: - case 64: - case 66: - sprintf(in_collect, "40"); - break; - case 50: - sprintf(in_collect, "50"); - break; - case 51: - sprintf(in_collect, "51"); - break; - case 52: - sprintf(in_collect, "52"); - break; - case 53: - case 55: - case 56: - sprintf(in_collect, "53"); - break; - case 54: - sprintf(in_collect, "54"); - break; - default: - sprintf(in_collect, "00"); - break; - } - - in_army[0] = '0'; - - sprintf(in_stop, "%.8s_%.2s%.2s%.2s00_%06d%.2s_%c%.2s%c_%s_%c", - pk_in->wrk_date, pk_in->hnd_info.hnd_hour, pk_in->hnd_info.hnd_min, pk_in->hnd_info.hnd_sec, - lb_data2atoi(pk_in->serial_no, 6), pk_in->hnd_info.rcpt_hnd, pk_in->plz_id[1], rd->lane_no, pk_in->io_div, - in_car, pk_in->car_kind); - - in_move[0] = ' '; -// - sprintf(in_amount, "%.6s", pk_in->hnd_info.pass_fare); - -// - memcpy(in_x, pk_in->x_point+1, 3); - in_x[3] = '\0'; -// - memcpy(in_y, pk_in->y_point+1, 3); - in_y[3] = '\0'; -// - memcpy(in_garo, pk_in->img_width+1, 3); - in_garo[3] = '\0'; -// - memcpy(in_sero, pk_in->img_heigh+1, 3); - in_sero[3] = '\0'; - - sprintf((char *)in_card_ret, "%c", pk_in->hnd_info.refund_yn); - //sprintf(in_rfid_kbn, "%c", pk_in->hnd_info.issue_code[0]); - - switch(lb_data2atoi(rcv_hnd, 2)) - { - case 10: - case 11: - case 20: - case 21: - case 22: - case 23: - case 24: - case 30: - case 31: - case 32: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 70: - case 71: - case 72: - case 73: - case 74: - case 75: - case 76: - case 77: - case 78: - case 79: - case 40: - case 41: - case 50: - case 51: - case 52: - case 53: - case 54: - case 60: - case 61: - case 62: - case 63: - case 64: - case 65: - case 66: - case 67: - sprintf(in_rfid_kbn, "00"); - break; - case 12: - case 25: - case 26: - case 55: - sprintf(in_rfid_kbn, "01"); - break; - case 13: - case 14: - case 27: - case 28: - case 56: - sprintf(in_rfid_kbn, "03"); - break; - case 33: - sprintf(in_rfid_kbn, "02"); - break; - default: - sprintf(in_rfid_kbn, "00"); - break; - } - - if(lb_data2atoi(tmp, 2) == 53) - sprintf(in_rfid_kbn, "04"); - - snprintf(in_tag, 48+1, "%.24s%.24s", pk_in->tag_id1, pk_in->tag_id2); - -/* EXEC SQL - SELECT SUBSTR(COUNT(*)+1, 1, 1) - INTO :in_other - FROM FARE_TERMINAL_INFO - WHERE FARE_OFFICE_ID = :in_fare - AND BOOTH_ID = :in_booth - AND YEAR || MONTH || DAY || WORK_TIMES = :in_date - ; - in_other[0] = pk_in->wrk_no[4]; -proc_log("ȯó12"); - if (SQLCODE < 0) - { - proc_log("FARE_TERMINAL_INFO SELECT FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - return(1); - } -*/ - in_other[0] = pk_in->wrk_no[3]; - - if(in_carkind[0] == '7') - sprintf(in_rfid_kbn, "02"); -#if 0 - sprintf(in_sens_time, 6+1, "%.6s", pk_in->sence_time); -#else - sprintf(in_sens_time, "000000"); - in_sens_time[6] = '\0'; -#endif -proc_log("ȯó [%s][%s][%s][%s][%s][%s]\n", in_id, in_fare, in_booth, in_date, in_seqno, in_rf_seqno); -proc_log("ȯó [%s][%s][%s][%s][%s][%s]\n", in_car, in_collect, in_army, in_stop, in_move, in_amount); -proc_log("ȯó [%s][%s][%s][%s][%s][%s]\n", in_x, in_y, in_garo, in_sero, in_card_ret, in_other); -proc_log("ȯó [%s][%s][%s][%s]\n", in_rfid_kbn, in_tag, in_carkind, in_sens_time); - -//proc_log("ȯó [%02x][%02x][%02x][%02x][%02x][%02x]\n", in_id[4], in_fare[2], in_booth[2], in_date[14], in_seqno[9], in_rf_seqno[9]); -//proc_log("ȯó [%02x][%02x][%02x][%02x][%02x][%02x]\n", in_car[16], in_collect[2], in_army[1], in_stop[50], in_move[1], in_amount[6]); -//proc_log("ȯó [%02x][%02x][%02x][%02x][%02x][%02x]\n", in_x[4], in_y[4], in_garo[4], in_sero[4], in_card_ret[1], in_other[1]); -//proc_log("ȯó [%02x][%02x][%02x]\n", in_rfid_kbn[2], in_tag[48], in_carkind[1]); -/* - EXEC SQL INSERT INTO DAY_TRAFFIC_INFO - (FARE_OFFICE_ID, BOOTH_ID, PASS_DATE, PASS_TIME, PASS_SEQNO, CAR_NO, CARS_TYPE_ID, IN_OUT_KBN, CREATE_DATE, CREATER, UPDATE_DATE, UPDATER) - VALUES - (:in_fare, :in_booth, SUBSTR(:in_date, 1, 8), SUBSTR(:in_date, 9, 6), :d_seq, :in_car, :in_carkind, :c_io, sysdate, 'system', sysdate, 'system'); - - if (SQLCODE < 0) - { - proc_log("Day Traffic Info Insert Fail[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - } -*/ - - sprintf(in_collect_new, "%.2s%c", rcv_hnd, '\0'); -#ifdef _ORACLE_ -//proc_log("CAR_KIND[%s]\n", in_carkind); - EXEC SQL EXECUTE - BEGIN SP_FARE_INS_NEW(:in_id, :in_fare, :in_booth, :in_date, :in_seqno, :in_rf_seqno, :in_car, :in_collect, :in_army, :in_stop, :in_move, :in_amount, :in_x, :in_y, :in_garo, :in_sero, :in_card_ret, :in_other, :in_rfid_kbn, :in_tag, :in_carkind, :in_collect_new, :in_sens_time, :ret); - END; - END-EXEC; -/* - EXEC SQL - Insert Into RF_Terminal_Info - (worker_id, fare_office_id, booth_id, year, month, day, work_times, seqno, - issue_office_id, after_kbn, card_no, in_out_kbn, collect_id, levy_amount, - remaind_amount, card_office_id, terminal_id, sam_id, sam_seqno, - card_seqno, before_amount, algorithm_id, key_version, e_cash_identifier, - sam_tot_seqno, sam_collect_cnt, sam_tot_amount, sign_value, person_code, - zipge_id, alias_no, issue_id, create_date, creater, - update_date, updater, send_flag) - Values - (:in_id || :in_fare, :in_fare, :in_booth, substr(:in_date, 1, 4), substr(:in_date, 5, 2), - substr(:in_date, 7, 2), :work_times, :seqno, v_prefix, v_kbn, - v_card, v_inout, v_collect, v_amount, nvl(to_number(nvl(rtrim(in_re_amount,' '),'0')),0), - v_card_office, v_terminal_id, v_sam_id, nvl(to_number(nvl(rtrim(in_sam_seqno,' '),'0')),0), nvl(to_number(nvl(rtrim(in_card_seqno,' '),'0')),0), - nvl(to_number(nvl(rtrim(in_be_amount,' '),'0')),0), v_algorithm_id, v_key_version, v_e_cash, nvl(to_number(nvl(rtrim(in_sam_tot_seqno,' '),'0')),0), - nvl(to_number(nvl(rtrim(in_sam_collect_cnt,' '),0)),0), nvl(to_number(nvl(rtrim(in_sam_tot_amount,' '),'0')),0), in_sign_value, v_person_code, - v_zipge_id, v_alias_no, v_issue_id, sysdate, 'dekim', - sysdate, 'dekim', '0'); -*/ - if (SQLCODE < 0) - { - proc_log("SP_FARE_INS_NEW 1 CALL FAIL[%d]", sqlca.sqlerrd[4]); - proc_log("SP_FARE_INS_NEW 2 CALL FAIL[%d][%s]", SQLCODE, sqlca.sqlerrm.sqlerrmc); - return(1); - } -#endif -#ifdef _WEBSVR_ - sprintf(orgCarNo, "%.16s", in_car); - if(strlen(orgCarNo) == 0) - { - memset(in_car, 0x00, sizeof(in_car)); - sprintf(in_car, "????????????"); - }else - { - memset(in_car, 0x00, sizeof(in_car)); - in_size = strlen(orgCarNo); - out_size = sizeof(wchar_t) * in_size * 4; - - in_buf = orgCarNo; - out_buf = szCarNo; - out_buf_left = out_size; - - nResult = iconv(ic, (char *)&in_buf, &in_size, (char *)&out_buf, &out_buf_left); - if(nResult == -1) - { - proc_log("ICONV FAILED [%d]\n", nResult); - } - -//proc_log("ICONV in_size[%d] out_size[%d] [%s]\n", in_size, out_size - out_buf_left, szCarNo); - sprintf(in_car, "%.16s", szCarNo); - } - iconv_close(ic); - sprintf(rBuffer, "%s%s%s%s%s%s%-16s%s%s00%s%s%s%s%s%s%s%s%-48s%s%s%s", - in_id, in_fare, in_booth, in_date, in_seqno, in_rf_seqno, - in_car, in_collect, in_army, in_amount, - in_x, in_y, in_garo, in_sero, in_card_ret, in_other, - in_rfid_kbn, in_tag, in_carkind, rcv_hnd, in_sens_time); - //sprintf(rBuffer, "%08d", SQLCODE); - memcpy(rtn, &rBuffer, strlen(rBuffer)); -#endif - - proc_log("ȯó [%.8s] [%d][%d]ȯóϷ", in_date, SQLCODE, ret); - -#endif - return 0; -} diff --git a/GREEN_LANE/src/app/util/core.238438 b/GREEN_LANE/src/app/util/core.238438 deleted file mode 100644 index 317e14a1a3db6b79eb6f61f62e0971d93e296e27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974848 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
1oBfC5)4srX*oUnBhuPmaz3$H*MArSy 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

T`@Z4<08jf-e!5z&DCBDDPfz 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