Commit 8d0a64f2 by guanghui.cui

增加功能:

1、配置信息从配置文件读取
2、如果程序不是运行在服务器,退出
parent 6708f9e3
......@@ -6,7 +6,9 @@ CXXFLAG := -g
#source of so
SRCSSO := base/MySQLService.cpp\
3rdParty/easylogging/easylogging++.cc\
pos_bft/OrderInfo.cpp
pos_bft/OrderInfo.cpp\
utility/utility.cpp\
utility/zini.cpp
#source of bin
SRCS := utility/utility.cpp\
......
......@@ -4,21 +4,26 @@
#include "OrderInfo.h"
#include <time.h>
#include <stdio.h>
#include <iconv.h>
#include "../3rdParty/easylogging/easylogging++.h"
#include "../base/FM_ErrorCode.h"
#include "../utility/utility.h"
#include "../utility/zini.h"
#define SQL_BUFFER_SIZE 1024
COrderInfo::COrderInfo()
:mysql(NULL)
,_tempLatin1(NULL)
{
if(mysql==NULL){
db.server="localhost";
db.db="pos";
db.user="root";
db.passwd="123";
db.timeout=0;
std::string strIniPath = GetProcDir();
strIniPath.append("monitor.ini");
db.server = ZIni::readString("DB","ip", "",strIniPath.c_str());
db.db = ZIni::readString("DB","dbName", "",strIniPath.c_str());
db.user = ZIni::readString("DB","user", "",strIniPath.c_str());
db.passwd = ZIni::readString("DB","password", "",strIniPath.c_str());
db.timeout=5;
db.interactive_timeout=5;
mysql=new MySQLService(&db);
......@@ -29,6 +34,10 @@ COrderInfo::COrderInfo()
COrderInfo::~COrderInfo()
{
pthread_mutex_destroy(&mutex); //销毁互斥锁
if(_tempLatin1!=NULL){
delete[] _tempLatin1;
_tempLatin1=NULL;
}
}
int COrderInfo::DBConnect()
......@@ -58,12 +67,11 @@ int COrderInfo::Init()
return EC_EX_SQL_FAILED;
}
LOG(INFO)<<"strName:"<<vecTakewayTypes[i].strName.c_str();
printf("%s\n", vecTakewayTypes[i].strName.c_str());
if (NULL == (mysql->_row = mysql_fetch_row(mysql->_result))){
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"INSERT INTO tbl_PayMethod\
(PayNo, SeqNo, Name3, EmpPayLevel, PayClass, PmsAskAccount)\
VALUES (%d, %d,'%s', 5, 3, 0)",
payType, payType, vecTakewayTypes[i].strName.c_str());
payType, payType, UTF8ToLatin1(vecTakewayTypes[i].strName.c_str()));
nErrCode = mysql->insert();
if(nErrCode != EC_OK)
{
......@@ -127,6 +135,8 @@ int COrderInfo::SetPayResult(IN std::string& strOrderId, //订单
int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
{
int nErrCode = EC_OK;
fmPOSType posTakeway;
GetTakewayType(order.pay_ebcode,posTakeway); //获取外卖类型id
pthread_mutex_lock(&mutex); //上锁
//判断记录是否存在,如果存在直接返回
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"SELECT orderid FROM fmTakeaway where fm_id='%s';",order.fm_id.data());
......@@ -230,8 +240,8 @@ int COrderInfo::SetTakeawayOrder(TakeawayOrder &order)
//支付信息吸入“支付详情表”
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE, "INSERT INTO tbl_Payment(`Date`,`Check`,Outlet,PayIdx,PayNo,Name3,PayEmp,PayTime,PayStation,PayTot,PayClass,Member,\
IsModified,LastModifiedTime)\
VALUES('%s',%d,%d,1,1,'alipay',4,'%s',99,10.00,1,'',1,'%s')", \
strDate.data(),orderId,iOutlet,chTime,chTime);
VALUES('%s',%d,%d,1,%d,'%s',4,'%s',99,10.00,1,'',1,'%s')", \
strDate.data(),orderId,iOutlet,atoi(posTakeway.merchantTypeId.data()),posTakeway.strName.data(),chTime,chTime);
nErrCode = mysql->insert();
return 0;
}
......@@ -321,6 +331,32 @@ void COrderInfo::SetTakewayTypes(std::vector<fmPOSType> &vecTakeway)
vecTakewayTypes.assign(vecTakeway.begin(), vecTakeway.end());
}
char* COrderInfo::UTF8ToLatin1(const char *str)
{
if(_tempLatin1!=NULL){
delete[] _tempLatin1;
_tempLatin1=NULL;
}
iconv_t cd;
size_t inLen, outLen;
char *_str = (char*)str;
if (!str)
return NULL;
inLen = strlen(str)+1;
_tempLatin1=new char[inLen];
outLen = inLen;
cd = iconv_open("ISO-8859-1", "UTF-8");
size_t convertedLen = iconv(cd, &_str, &inLen, &_tempLatin1, &outLen);
LOG(INFO)<<"Converted Length:"<< convertedLen << "Error: " << errno;
iconv_close(cd);
LOG(INFO)<<"_tempLatin1:"<<_tempLatin1;
return _tempLatin1;
}
//需要导出的函数,即用户在外部可以调用的接口
bool GetOperationObject(void** _RtObject)
{
......
......@@ -67,12 +67,15 @@ private:
std::vector<fmPOSType> vecPayTypes; //非码-商户 支付类型对应表
std::vector<fmPOSType> vecTakewayTypes; //非码-商户 外卖类型对应表
char* UTF8ToLatin1(const char *str);
//向数据库总添加:fmTemp表 | 触发器 | fmTakeaway表 | fmTakeaway_products表
int AddFMTable();
pthread_mutex_t mutex; //互斥锁
MySQLService *mysql;
DB db;
char* _tempLatin1; //utf8转换为Latin1后,存放在此变量中
};
#endif
......@@ -10,14 +10,19 @@
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <ifaddrs.h>
#include <string.h>
#include "../base/FM_ErrorCode.h"
#include "SQLiteOperate.h"
#include "PayProcess.h"
#include "json.h"
#include "../3rdParty/easylogging/easylogging++.h"
#include "../utility/utility.h"
#include "../utility/zini.h"
#define BUFFER_SIZE 1024 //缓冲区大小
void InitSystem();
void Init();
INITIALIZE_EASYLOGGINGPP
......@@ -38,6 +43,8 @@ int main()
/// 设置全部logger的配置
el::Loggers::reconfigureAllLoggers(conf);
InitSystem();
//获取dll对象
void* pObj=NULL;
if(GetOperationObject(&pObj))
......@@ -210,22 +217,6 @@ void Init()
//启动外卖监控线程
pthread_t takewayId;
ret = pthread_create(&takewayId, NULL, FunTakeaway, NULL);
//int nPos;
//char szPath[MAX_PATH] = { 0 };
//GetModuleFileNameA(NULL, szPath, MAX_PATH);
//nPos = strlen(szPath) - 1;
//while ('\\' != szPath[nPos])
//{
// nPos--;
//}
//nPos++;
//szPath[nPos] = '\0';
//std::string str = std::string(szPath);
//str += "monitor.ini";
//int nShow = GetPrivateProfileIntA("show","show_windows",1,str.c_str());
//if(nShow == 0) //;0 隐藏 1 显示
// ShowWindow(GetConsoleWindow(), SW_HIDE); //隐藏窗口
}
void app_stopped(int sig)
......@@ -236,3 +227,42 @@ void app_stopped(int sig)
shutdown(pay_server_fd, SHUT_RDWR);
return;
}
void InitSystem()
{
std::string strIniPath = GetProcDir();
strIniPath.append("monitor.ini");
std::string pos = ZIni::readString("SYS","pos", "",strIniPath.c_str());
std::string serverip = ZIni::readString("SYS","serverip", "",strIniPath.c_str());
if(pos.compare("bifengtang")==0){
LOG(INFO)<<"避风塘POS";
struct ifaddrs * ifAddrStruct=NULL;
void * tmpAddrPtr=NULL;
getifaddrs(&ifAddrStruct);
while (ifAddrStruct!=NULL) {
if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { // check it is IP4
// is a valid IP4 Address
std::string ifaName=ifAddrStruct->ifa_name;
if(ifaName.compare("eth0")==0){
tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
std::string ip=addressBuffer;
if(serverip.compare(ip)==0){
return;
}
else{
LOG(INFO)<<"运行机器ip:"<<addressBuffer<<" 不是服务端,程序退出!";
exit(0);
}
}
}
ifAddrStruct=ifAddrStruct->ifa_next;
}
}
}
\ No newline at end of file
......@@ -266,95 +266,6 @@ void *FunTakeaway(void* lpParamter)
}
close(socket_fd);
delete[] takeWayRecvBuf;
// SOCKADDR_IN addrServer;
// SOCKADDR_IN addrClient;
// sockTakewayServer = socket(AF_INET, SOCK_STREAM, 0);
// addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//INADDR_ANY表示任何IP
// addrServer.sin_family = AF_INET;
// addrServer.sin_port = htons(23772);//绑定端口
// bind(sockTakewayServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
// //Listen监听端
// listen(sockTakewayServer, 5);//5为等待连接数目
// int len = sizeof(SOCKADDR);
// char* takeWayRecvBuf = new char[BUFFER_SIZE*10]; //外卖数据接收区
// TakeawayOrder order;
// int nErrCode = EC_OK;
// while(!g_exit)
// {
// sockTakewayClient = accept(sockTakewayServer, (SOCKADDR*)&addrClient, &len);
// if(sockTakewayClient == SOCKET_ERROR)
// {
// continue;
// }
// //接收并打印客户端数据
// int rlt = socketRecvData(takeWayRecvBuf,BUFFER_SIZE*10,sockTakewayClient);
// if (rlt > 0)
// {
// takeWayRecvBuf[rlt] = '\0';
// int lenGBK = CCodeConv::UTF8ToGBK(takeWayRecvBuf,NULL,NULL);
// char* strGBK = new char[lenGBK];
// CCodeConv::UTF8ToGBK(takeWayRecvBuf,strGBK,lenGBK);
// LOG(INFO)<<"外卖请求:"<<strGBK;
// order.vecProducts.clear();
// GetTakeawayOrder(strGBK,order);
// //根据请求类型进行不同操作
// int statusCode;
// std::string msg;
// if(order.fm_cmd == "put_order")
// {
// LOG(INFO)<<"新外卖订单,fmId:"<<order.fm_id.data();
// nErrCode = dbOperation->SetTakeawayOrder(order);
// LOG(INFO)<<"---------------nErrCode:"<<nErrCode;
// if(nErrCode == EC_OK)
// {
// statusCode = 100;
// msg = "";
// }
// else if(nErrCode == EC_EXIST_ORDER){
// statusCode=100;
// msg = "order exist";
// }
// else
// {
// statusCode=101;
// msg = "order:write error";
// }
// }
// else if(order.fm_cmd == "refund_order")
// {
// LOG(INFO)<<"-----------------------------------退单";
// nErrCode = dbOperation->CancleTakeaway(order);
// if(nErrCode == EC_OK)
// {
// statusCode = 100;
// msg = "";
// }
// else
// {
// statusCode = 101;
// msg = "refund order:write error";
// }
// }
// LOG(INFO)<<"外卖:"<<order.order_index<<" 写数据库:"<<statusCode;
// delete[] strGBK;
// if(order.fm_cmd == "put_order" || order.fm_cmd == "refund_order")
// {
// std::string strReturnJson = GetTakeawayResultJson(statusCode,msg.data());
// //发送返回数据
// int result = send(sockTakewayClient, strReturnJson.data(), strReturnJson.length(), 0);
// LOG(INFO)<<"外卖发送处理结果:"<<strReturnJson.c_str();
// }
// }
// closesocket(sockTakewayClient);
// }
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment