Commit d49d5be4 by guanghui.cui

添加守护进程及菜单缓存

parent 93479b9a
/* 定义订单信息结构 /* 定义订单信息结构
*/ */
...@@ -8,63 +8,76 @@ ...@@ -8,63 +8,76 @@
#include <string> #include <string>
#include <vector> #include <vector>
//商品信息 //商品信息
struct GOODS_INFO struct GOODS_INFO
{ {
std::string strId; //商品id std::string strId; //商品id
std::string strPrice; //商品价格 std::string strPrice; //商品价格
std::string strNum; //商品数量 std::string strNum; //商品数量
}; };
//订单信息 //订单信息
struct FM_ORDER_INFO struct FM_ORDER_INFO
{ {
std::string store; //门店号 std::string store; //门店号
std::string pos; //pos机号 std::string pos; //pos机号
std::string operater; //操作员 std::string operater; //操作员
std::string date; //营业日 std::string date; //营业日
std::string payTotal; //订单总额 std::string payTotal; //订单总额
std::string transId; //交易号 std::string transId; //交易号
std::vector<GOODS_INFO> vecGoods; //商品信息 std::vector<GOODS_INFO> vecGoods; //商品信息
}; };
//外卖商品 //外卖商品
struct TakeawayProduct struct TakeawayProduct
{ {
int consume_num; //数量 int consume_num; //数量
int original_price; //商品编码 int original_price; //商品编码
std::string pid; //外卖平台上的单价 std::string pid; //外卖平台上的单价
}; };
//外卖销售单 //外卖销售单
struct TakeawayOrder struct TakeawayOrder
{ {
std::string fm_cmd; //外卖订单写入确认 std::string fm_cmd; //外卖订单写入确认
std::string fm_ver; //接口版本 std::string fm_ver; //接口版本
std::string pay_id; //支付方式 std::string pay_id; //支付方式
std::string pay_str; //支付方式说明 std::string pay_str; //支付方式说明
std::string pay_ebcode; //支付方式中的类型&渠道 std::string pay_ebcode; //支付方式中的类型&渠道
std::string pay_ebcode_str; //支付方式中的类型&渠道说明 std::string pay_ebcode_str; //支付方式中的类型&渠道说明
int shop_fee; //门店能够从平台拿到的钱(已除去费务服) int shop_fee; //门店能够从平台拿到的钱(已除去费务服)
int service_fee; //平台收取的佣金 int service_fee; //平台收取的佣金
int products_fee; //商品金额 int products_fee; //商品金额
int discount_fee; //优惠总额 int discount_fee; //优惠总额
int dis_shop_fee; //商家承担的优惠总额 int dis_shop_fee; //商家承担的优惠总额
int dis_platform_fee; //平台承担的优惠总额 int dis_platform_fee; //平台承担的优惠总额
int send_fee; //配送费 int send_fee; //配送费
int package_fee; //打包费 int package_fee; //打包费
int invoice_amount; //发票金额 int invoice_amount; //发票金额
std::string paid_trans_id; //外卖平台的交易号 订单号 std::string paid_trans_id; //外卖平台的交易号 订单号
std::string fm_id; //非码交易号 std::string fm_id; //非码交易号
std::string customer_address; //顾客地址 std::string customer_address; //顾客地址
std::string customer_name; //顾客名称 std::string customer_name; //顾客名称
std::string customer_phone; //顾客手机号 std::string customer_phone; //顾客手机号
int delivery_time; //送达时间 int delivery_time; //送达时间
int order_index; //平台序号 int order_index; //平台序号
std::string remark; //备注 std::string remark; //备注
std::vector<TakeawayProduct> vecProducts; //商品信息 std::vector<TakeawayProduct> vecProducts; //商品信息
};
struct PrinterMenu
{
std::string idMenu;
int idPrinter;
std::string device;
};
struct PrintDevice
{
int id;
std::string device;
}; };
#endif #endif
\ No newline at end of file
...@@ -10,42 +10,45 @@ ...@@ -10,42 +10,45 @@
class IOperation class IOperation
{ {
public: public:
//初始化操作 //初始化操作
virtual int DBConnect()=0; virtual int DBConnect()=0;
virtual int Init()=0; virtual int Init()=0;
//根据订单id从数据库中查找订单信息 //根据订单id从数据库中查找订单信息
virtual int GetOrderInfo(IN std::string &strOrderId, virtual int GetOrderInfo(IN std::string &strOrderId,
OUT FM_ORDER_INFO **pFMOrderInfo)=0; OUT FM_ORDER_INFO **pFMOrderInfo)=0;
//监测是否有新订单产生 //监测是否有新订单产生
virtual int MonitorNewOrder(OUT std::string & strNewOrderId)=0; virtual int MonitorNewOrder(OUT std::string & strNewOrderId)=0;
//向数据库中写入支付结果信息 //向数据库中写入支付结果信息
virtual int SetPayResult(IN std::string& strOrderId, //订单id virtual int SetPayResult(IN std::string& strOrderId, //订单id
IN std::string& strStatusCode, //错误码 IN std::string& strStatusCode, //错误码
IN std::string& strPayType)=0; //支付类型 IN std::string& strPayType)=0; //支付类型
//所有的清除操作 //所有的清除操作
virtual void UnInit()=0; virtual void UnInit()=0;
//释放为订单数据结构申请的内存 //释放为订单数据结构申请的内存
//在GetOrderInfo()函数中申请 //在GetOrderInfo()函数中申请
virtual void FreeOrderBuf(FM_ORDER_INFO * pbuf)=0; virtual void FreeOrderBuf(FM_ORDER_INFO * pbuf)=0;
//设置 非码-商户 支付类型对照表 //设置 非码-商户 支付类型对照表
virtual void SetPayTypes(std::vector<fmPOSType> &vecPay)=0; virtual void SetPayTypes(std::vector<fmPOSType> &vecPay)=0;
//设置 非码-商户 外卖类型对照表 //设置 非码-商户 外卖类型对照表
virtual void SetTakewayTypes(std::vector<fmPOSType> &vecTakeway)=0; virtual void SetTakewayTypes(std::vector<fmPOSType> &vecTakeway)=0;
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
//外卖订单相关操作 //外卖订单相关操作
//设置外卖订单信息数据表 //设置外卖订单信息数据表
virtual int SetTakeawayOrder(TakeawayOrder &order)=0; virtual int SetTakeawayOrder(TakeawayOrder &order)=0;
//外卖退单数据库操作 //外卖退单数据库操作
virtual int CancleTakeaway(TakeawayOrder &order)=0; virtual int CancleTakeaway(TakeawayOrder &order)=0;
//获取POS菜单
virtual std::vector<PrinterMenu>& GetPOSMenu()=0;
}; };
#ifdef WIN32 #ifdef WIN32
......
#!/bin/bash
CMDClient="/home/fm/monitor"
PIDClient="./pidClient.txt"
# ---------------------------------------------------
# 启动函数
function startClient {
$CMDClient 2>&1 &
mypgmpid=$!
echo $mypgmpid > $PIDClient
echo "startClient [ok]"
}
# 停止函数
function stopClient {
kill `cat $PIDClient`
rm $PIDClient
echo "stopClient [ok]"
}
# --------------------------------------------------
echo "$CMDClient $1"
case "$1" in
start)
startClient
;;
restart)
if [ -f $PIDClient ] ; then
stopClient
sleep 4
fi
startClient
;;
stop)
stopClient
exit 0
;;
esac
for (( c=0 ; ; c++ ))
do
if [ -f $PIDClient ] ; then
mypgmpid=`cat $PIDClient`
cmdex="ps uh -p$mypgmpid"
psrtn=`$cmdex`
if [ -z "$psrtn" ]; then
# 进程挂掉自动重启
echo "`date '+%Y/%m/%d %H:%M:%S'` FATALERROR RESTART SERVICE"
startClient
elif (( $c%20 == 0 )); then
# 记录进程运行状态
echo "`date '+%Y/%m/%d %H:%M:%S'` PSINFO $psrtn"
c=0
fi
sleep 3
else
break
fi
done
...@@ -4,6 +4,18 @@ dbName=pos ...@@ -4,6 +4,18 @@ dbName=pos
user=root user=root
password=123 password=123
#打印机数据库
[PRINTER_DB]
ip=localhost
dbName=pserver
user=root
password=123
[SYS] [SYS]
pos=bifengtang pos=bifengtang
serverip=192.168.0.111 serverip=192.168.0.102
\ No newline at end of file
#守护进程脚本
[SH]
monitor=/home/fm/daemon_monitor.sh start &
takeout=/home/fm/daemon_takeout.sh start &
\ No newline at end of file
...@@ -27,6 +27,9 @@ COrderInfo::COrderInfo() ...@@ -27,6 +27,9 @@ COrderInfo::COrderInfo()
db.timeout=5; db.timeout=5;
db.interactive_timeout=5; db.interactive_timeout=5;
mysql=new MySQLService(&db); mysql=new MySQLService(&db);
strMonitorDeamon = ZIni::readString("SH","monitor", "",strIniPath.c_str());
strTakeoutDeamon = ZIni::readString("SH","takeout", "",strIniPath.c_str());
} }
pthread_mutex_init(&mutex, NULL); //初始化互斥锁 pthread_mutex_init(&mutex, NULL); //初始化互斥锁
} }
...@@ -359,6 +362,11 @@ int COrderInfo::AddFMTable() ...@@ -359,6 +362,11 @@ int COrderInfo::AddFMTable()
original_price INT,\ original_price INT,\
pid VARCHAR(20))"); pid VARCHAR(20))");
nErrCode = mysql->exec_proc(); nErrCode = mysql->exec_proc();
//设置“非码外卖按钮”
snprintf(mysql->sqlStr,SQL_BUFFER_SIZE,"UPDATE tbl_FuncType SET Name1='fmTakeout',Name2='·ÇÂëÍâÂô',Name3='·ÇÂëÍâÂô',Param1='%s' WHERE FuncNo=28;",strTakeoutDeamon.data());
nErrCode = mysql->update();
return nErrCode; return nErrCode;
} }
...@@ -423,6 +431,69 @@ char* COrderInfo::UTF8ToLatin1(const char *str) ...@@ -423,6 +431,69 @@ char* COrderInfo::UTF8ToLatin1(const char *str)
return _tempLatin1; return _tempLatin1;
} }
bool COrderInfo::GetMenuPrinter()
{
LOG(INFO)<<"---------------------get printer service--------------------";
vecPrinterMenus.clear();
std::vector<PrintDevice> vecDevices;
int nErrCode=0;
//打印机数据库
DB dbDevice;
std::string strIniPath = GetProcDir();
strIniPath.append("monitor.ini");
dbDevice.server = ZIni::readString("PRINTER_DB","ip", "",strIniPath.c_str());
dbDevice.db = ZIni::readString("PRINTER_DB","dbName", "",strIniPath.c_str());
dbDevice.user = ZIni::readString("PRINTER_DB","user", "",strIniPath.c_str());
dbDevice.passwd = ZIni::readString("PRINTER_DB","password", "",strIniPath.c_str());
dbDevice.timeout=5;
dbDevice.interactive_timeout=5;
MySQLService *mysqlDevice=new MySQLService(&dbDevice);
sprintf(mysqlDevice->sqlStr,"%s","SELECT Printer,Device FROM tbl_PrintDevice;");
nErrCode = mysqlDevice->query();
while ((mysqlDevice->_row = mysql_fetch_row(mysqlDevice->_result)) != NULL){
PrintDevice device;
device.id=atoi(mysqlDevice->_row[0]);
device.device=mysqlDevice->_row[1];
vecDevices.push_back(device);
}
mysql_free_result(mysqlDevice->_result);
delete mysqlDevice;
if(nErrCode==-1)
return false;
//查询菜单数据
sprintf(mysql->sqlStr,"%s","SELECT Item,PrintQ1 FROM tbl_Menu;");
nErrCode = mysql->query();
while ((mysql->_row = mysql_fetch_row(mysql->_result)) != NULL){
PrinterMenu menu;
menu.idMenu=mysql->_row[0];
menu.idPrinter=atoi(mysql->_row[1]);
for(auto dev:vecDevices){
if(menu.idPrinter==dev.id){
menu.device=dev.device;
}
}
vecPrinterMenus.push_back(menu);
}
mysql_free_result(mysql->_result);
if(nErrCode==-1)
return false;
// for(auto menu:vecPrinterMenus){
// LOG(INFO)<<"idMenu"<<menu.idMenu<<" idPrinter:"<<menu.idPrinter<<" device:"<<menu.device;
// }
return true;
}
std::vector<PrinterMenu>& COrderInfo::GetPOSMenu()
{
if(!GetMenuPrinter())
LOG(INFO)<<"Get menu info failed!";
return vecPrinterMenus;
}
//需要导出的函数,即用户在外部可以调用的接口 //需要导出的函数,即用户在外部可以调用的接口
bool GetOperationObject(void** _RtObject) bool GetOperationObject(void** _RtObject)
{ {
......
...@@ -54,6 +54,8 @@ public: ...@@ -54,6 +54,8 @@ public:
//外卖退单数据库操作 //外卖退单数据库操作
int CancleTakeaway(TakeawayOrder &order); int CancleTakeaway(TakeawayOrder &order);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
std::vector<PrinterMenu>& GetPOSMenu();
std::string m_FMPay; std::string m_FMPay;
...@@ -64,11 +66,15 @@ private: ...@@ -64,11 +66,15 @@ private:
void GetPosPayType(IN std::string fmPayType,OUT fmPOSType &payType); void GetPosPayType(IN std::string fmPayType,OUT fmPOSType &payType);
void GetTakewayType(IN std::string strType,OUT fmPOSType &takewayType); void GetTakewayType(IN std::string strType,OUT fmPOSType &takewayType);
std::vector<fmPOSType> vecPayTypes; //非码-商户 支付类型对应表 std::vector<fmPOSType> vecPayTypes; //非码-商户 支付类型对应表
std::vector<fmPOSType> vecTakewayTypes; //非码-商户 外卖类型对应表 std::vector<fmPOSType> vecTakewayTypes; //非码-商户 外卖类型对应表
std::vector<PrinterMenu> vecPrinterMenus; //菜单-打印机 类型对应表
char* UTF8ToLatin1(const char *str); char* UTF8ToLatin1(const char *str);
//获取菜品对应打印机及打印设备
bool GetMenuPrinter();
//向数据库总添加:fmTemp表 | 触发器 | fmTakeaway表 | fmTakeaway_products表 //向数据库总添加:fmTemp表 | 触发器 | fmTakeaway表 | fmTakeaway_products表
int AddFMTable(); int AddFMTable();
...@@ -76,6 +82,8 @@ private: ...@@ -76,6 +82,8 @@ private:
MySQLService *mysql; MySQLService *mysql;
DB db; DB db;
char* _tempLatin1; //utf8转换为Latin1后,存放在此变量中 char* _tempLatin1; //utf8转换为Latin1后,存放在此变量中
std::string strMonitorDeamon; //monitor守护进程脚本文件路径
std::string strTakeoutDeamon; //takeout守护进程脚本文件路径
}; };
#endif #endif
...@@ -256,6 +256,16 @@ void *FunTakeaway(void* lpParamter) ...@@ -256,6 +256,16 @@ void *FunTakeaway(void* lpParamter)
msg = "refund order:write error"; msg = "refund order:write error";
} }
} }
else if(order.fm_cmd == "get_menu"){
LOG(INFO)<<"------get pos menu------";
std::vector<PrinterMenu> &vecMenu = dbOperation->GetPOSMenu();
LOG(INFO)<<"------get pos menu------111111";
// for(auto menu:vecMenu){
// LOG(INFO)<<"idMenu"<<menu.idMenu<<" idPrinter:"<<menu.idPrinter<<" device:"<<menu.device;
// }
std::string resJson = GetPOSMenuJson(vecMenu);
socketSendData(resJson.data(), connect_fd);
}
LOG(INFO)<<"外卖:"<<order.order_index<<" 写数据库:"<<statusCode; LOG(INFO)<<"外卖:"<<order.order_index<<" 写数据库:"<<statusCode;
//delete[] strGBK; //delete[] strGBK;
...@@ -263,7 +273,8 @@ void *FunTakeaway(void* lpParamter) ...@@ -263,7 +273,8 @@ void *FunTakeaway(void* lpParamter)
{ {
std::string strReturnJson = GetTakeawayResultJson(statusCode,msg.data()); std::string strReturnJson = GetTakeawayResultJson(statusCode,msg.data());
//发送返回数据 //发送返回数据
int result = send(connect_fd, strReturnJson.data(), strReturnJson.length(), 0); //int result = send(connect_fd, strReturnJson.data(), strReturnJson.length(), 0);
int result = socketSendData(strReturnJson.data(), connect_fd);
LOG(INFO)<<"外卖发送处理结果:"<<strReturnJson.c_str(); LOG(INFO)<<"外卖发送处理结果:"<<strReturnJson.c_str();
} }
close(connect_fd); close(connect_fd);
......
// json.cpp : 定义控制台应用程序的入口点。 // json.cpp : 定义控制台应用程序的入口点。
// //
#include "json.h" #include "json.h"
#include <iostream> #include <iostream>
#include "../3rdParty/easylogging/easylogging++.h"
//将支付订单信息结构组合为json字串 //将支付订单信息结构组合为json字串
std::string GetPayJson(FM_ORDER_INFO &OrderInfo) std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
{ {
rapidjson::StringBuffer buffer; rapidjson::StringBuffer buffer;
...@@ -60,7 +61,7 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo) ...@@ -60,7 +61,7 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
writer.Key("products"); writer.Key("products");
writer.StartArray(); writer.StartArray();
//-----------------start 单个商品------------------ //-----------------start 单个商品------------------
for(unsigned int i=0;i<OrderInfo.vecGoods.size();i++) for(unsigned int i=0;i<OrderInfo.vecGoods.size();i++)
{ {
writer.StartObject(); writer.StartObject();
...@@ -75,7 +76,7 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo) ...@@ -75,7 +76,7 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
writer.EndObject(); writer.EndObject();
} }
//-----------------end 单个商品------------------ //-----------------end 单个商品------------------
writer.EndArray(); writer.EndArray();
//-----------------end products-------------------- //-----------------end products--------------------
writer.EndObject(); writer.EndObject();
...@@ -86,17 +87,17 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo) ...@@ -86,17 +87,17 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
return buffer.GetString(); return buffer.GetString();
} }
//通过json字串获取外卖订单信息 //通过json字串获取外卖订单信息
bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order) bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order)
{ {
rapidjson::Document document; // 定义一个Document对象 rapidjson::Document document; // 定义一个Document对象
document.Parse(lpJson); // 解析,Parse()无返回值,也不会抛异常 document.Parse(lpJson); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功 if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
{ {
// 可通过GetParseError()取得出错代码, // 可通过GetParseError()取得出错代码,
// 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值 // 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值
// 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写 // 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写
// 函数GetErrorOffset()返回出错发生的位置 // 函数GetErrorOffset()返回出错发生的位置
//LOG_ERROR("TakeawayOrder JSON parse error: (%d:%d)", document.GetParseError(), document.GetErrorOffset()) //LOG_ERROR("TakeawayOrder JSON parse error: (%d:%d)", document.GetParseError(), document.GetErrorOffset())
} }
else else
...@@ -110,6 +111,9 @@ bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order) ...@@ -110,6 +111,9 @@ bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order)
rapidjson::Value& fm_id = document["fm_id"]; rapidjson::Value& fm_id = document["fm_id"];
order.fm_id=fm_id.GetString(); order.fm_id=fm_id.GetString();
} }
else if(order.fm_cmd == "get_menu"){
}
else else
{ {
rapidjson::Value& pay_id_obj = document["pay_id"]; rapidjson::Value& pay_id_obj = document["pay_id"];
...@@ -178,9 +182,9 @@ bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order) ...@@ -178,9 +182,9 @@ bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order)
return true; return true;
} }
//获取外卖订单返回结果的json字串 //获取外卖订单返回结果的json字串
// statuscode 状态码 // statuscode 状态码
// msg 状态信息 // msg 状态信息
std::string GetTakeawayResultJson(const int statuscode,const char* msg) std::string GetTakeawayResultJson(const int statuscode,const char* msg)
{ {
rapidjson::StringBuffer buffer; rapidjson::StringBuffer buffer;
...@@ -197,3 +201,11 @@ std::string GetTakeawayResultJson(const int statuscode,const char* msg) ...@@ -197,3 +201,11 @@ std::string GetTakeawayResultJson(const int statuscode,const char* msg)
return buffer.GetString(); return buffer.GetString();
} }
std::string GetPOSMenuJson(std::vector<PrinterMenu> &vecMenu)
{
for(auto menu:vecMenu){
LOG(INFO)<<"idMenu"<<menu.idMenu<<" idPrinter:"<<menu.idPrinter<<" device:"<<menu.device;
}
return "123456";
}
\ No newline at end of file
...@@ -5,13 +5,15 @@ ...@@ -5,13 +5,15 @@
#include "../base/CommonStruct.h" #include "../base/CommonStruct.h"
//将支付订单信息结构组合为json字串 //将支付订单信息结构组合为json字串
std::string GetPayJson(FM_ORDER_INFO &OrderInfo); std::string GetPayJson(FM_ORDER_INFO &OrderInfo);
//通过json字串获取外卖订单信息 //通过json字串获取外卖订单信息
bool GetTakeawayOrder(const char* json, TakeawayOrder &order); bool GetTakeawayOrder(const char* json, TakeawayOrder &order);
//获取外卖订单返回结果的json字串 //获取外卖订单返回结果的json字串
std::string GetTakeawayResultJson(const int statuscode,const char* msg); std::string GetTakeawayResultJson(const int statuscode,const char* msg);
std::string GetPOSMenuJson(std::vector<PrinterMenu> &vecMenu);
#endif #endif
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