Commit d49d5be4 by guanghui.cui

添加守护进程及菜单缓存

parent 93479b9a
/* 定义订单信息结构
/* 定义订单信息结构
*/
......@@ -8,63 +8,76 @@
#include <string>
#include <vector>
//商品信息
//商品信息
struct GOODS_INFO
{
std::string strId; //商品id
std::string strPrice; //商品价格
std::string strNum; //商品数量
std::string strId; //商品id
std::string strPrice; //商品价格
std::string strNum; //商品数量
};
//订单信息
//订单信息
struct FM_ORDER_INFO
{
std::string store; //门店号
std::string pos; //pos机号
std::string operater; //操作员
std::string date; //营业日
std::string payTotal; //订单总额
std::string transId; //交易号
std::vector<GOODS_INFO> vecGoods; //商品信息
std::string store; //门店号
std::string pos; //pos机号
std::string operater; //操作员
std::string date; //营业日
std::string payTotal; //订单总额
std::string transId; //交易号
std::vector<GOODS_INFO> vecGoods; //商品信息
};
//外卖商品
//外卖商品
struct TakeawayProduct
{
int consume_num; //数量
int original_price; //商品编码
std::string pid; //外卖平台上的单价
int consume_num; //数量
int original_price; //商品编码
std::string pid; //外卖平台上的单价
};
//外卖销售单
//外卖销售单
struct TakeawayOrder
{
std::string fm_cmd; //外卖订单写入确认
std::string fm_ver; //接口版本
std::string pay_id; //支付方式
std::string pay_str; //支付方式说明
std::string pay_ebcode; //支付方式中的类型&渠道
std::string pay_ebcode_str; //支付方式中的类型&渠道说明
int shop_fee; //门店能够从平台拿到的钱(已除去费务服)
int service_fee; //平台收取的佣金
int products_fee; //商品金额
int discount_fee; //优惠总额
int dis_shop_fee; //商家承担的优惠总额
int dis_platform_fee; //平台承担的优惠总额
int send_fee; //配送费
int package_fee; //打包费
int invoice_amount; //发票金额
std::string paid_trans_id; //外卖平台的交易号 订单号
std::string fm_id; //非码交易号
std::string customer_address; //顾客地址
std::string customer_name; //顾客名称
std::string customer_phone; //顾客手机号
int delivery_time; //送达时间
int order_index; //平台序号
std::string remark; //备注
std::string fm_cmd; //外卖订单写入确认
std::string fm_ver; //接口版本
std::string pay_id; //支付方式
std::string pay_str; //支付方式说明
std::string pay_ebcode; //支付方式中的类型&渠道
std::string pay_ebcode_str; //支付方式中的类型&渠道说明
int shop_fee; //门店能够从平台拿到的钱(已除去费务服)
int service_fee; //平台收取的佣金
int products_fee; //商品金额
int discount_fee; //优惠总额
int dis_shop_fee; //商家承担的优惠总额
int dis_platform_fee; //平台承担的优惠总额
int send_fee; //配送费
int package_fee; //打包费
int invoice_amount; //发票金额
std::string paid_trans_id; //外卖平台的交易号 订单号
std::string fm_id; //非码交易号
std::string customer_address; //顾客地址
std::string customer_name; //顾客名称
std::string customer_phone; //顾客手机号
int delivery_time; //送达时间
int order_index; //平台序号
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
\ No newline at end of file
......@@ -10,42 +10,45 @@
class IOperation
{
public:
//初始化操作
//初始化操作
virtual int DBConnect()=0;
virtual int Init()=0;
//根据订单id从数据库中查找订单信息
//根据订单id从数据库中查找订单信息
virtual int GetOrderInfo(IN std::string &strOrderId,
OUT FM_ORDER_INFO **pFMOrderInfo)=0;
//监测是否有新订单产生
//监测是否有新订单产生
virtual int MonitorNewOrder(OUT std::string & strNewOrderId)=0;
//向数据库中写入支付结果信息
virtual int SetPayResult(IN std::string& strOrderId, //订单id
IN std::string& strStatusCode, //错误码
IN std::string& strPayType)=0; //支付类型
//向数据库中写入支付结果信息
virtual int SetPayResult(IN std::string& strOrderId, //订单id
IN std::string& strStatusCode, //错误码
IN std::string& strPayType)=0; //支付类型
//所有的清除操作
//所有的清除操作
virtual void UnInit()=0;
//释放为订单数据结构申请的内存
//在GetOrderInfo()函数中申请
//释放为订单数据结构申请的内存
//在GetOrderInfo()函数中申请
virtual void FreeOrderBuf(FM_ORDER_INFO * pbuf)=0;
//设置 非码-商户 支付类型对照表
//设置 非码-商户 支付类型对照表
virtual void SetPayTypes(std::vector<fmPOSType> &vecPay)=0;
//设置 非码-商户 外卖类型对照表
//设置 非码-商户 外卖类型对照表
virtual void SetTakewayTypes(std::vector<fmPOSType> &vecTakeway)=0;
//////////////////////////////////////////////////////////////////////////
//外卖订单相关操作
//外卖订单相关操作
//设置外卖订单信息数据表
//设置外卖订单信息数据表
virtual int SetTakeawayOrder(TakeawayOrder &order)=0;
//外卖退单数据库操作
//外卖退单数据库操作
virtual int CancleTakeaway(TakeawayOrder &order)=0;
//获取POS菜单
virtual std::vector<PrinterMenu>& GetPOSMenu()=0;
};
#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
user=root
password=123
#打印机数据库
[PRINTER_DB]
ip=localhost
dbName=pserver
user=root
password=123
[SYS]
pos=bifengtang
serverip=192.168.0.111
\ No newline at end of file
serverip=192.168.0.102
#守护进程脚本
[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()
db.timeout=5;
db.interactive_timeout=5;
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); //初始化互斥锁
}
......@@ -359,6 +362,11 @@ int COrderInfo::AddFMTable()
original_price INT,\
pid VARCHAR(20))");
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;
}
......@@ -423,6 +431,69 @@ char* COrderInfo::UTF8ToLatin1(const char *str)
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)
{
......
......@@ -54,6 +54,8 @@ public:
//外卖退单数据库操作
int CancleTakeaway(TakeawayOrder &order);
//////////////////////////////////////////////////////////////////////////
std::vector<PrinterMenu>& GetPOSMenu();
std::string m_FMPay;
......@@ -64,11 +66,15 @@ private:
void GetPosPayType(IN std::string fmPayType,OUT fmPOSType &payType);
void GetTakewayType(IN std::string strType,OUT fmPOSType &takewayType);
std::vector<fmPOSType> vecPayTypes; //非码-商户 支付类型对应表
std::vector<fmPOSType> vecTakewayTypes; //非码-商户 外卖类型对应表
std::vector<fmPOSType> vecPayTypes; //非码-商户 支付类型对应表
std::vector<fmPOSType> vecTakewayTypes; //非码-商户 外卖类型对应表
std::vector<PrinterMenu> vecPrinterMenus; //菜单-打印机 类型对应表
char* UTF8ToLatin1(const char *str);
//获取菜品对应打印机及打印设备
bool GetMenuPrinter();
//向数据库总添加:fmTemp表 | 触发器 | fmTakeaway表 | fmTakeaway_products表
int AddFMTable();
......@@ -76,6 +82,8 @@ private:
MySQLService *mysql;
DB db;
char* _tempLatin1; //utf8转换为Latin1后,存放在此变量中
std::string strMonitorDeamon; //monitor守护进程脚本文件路径
std::string strTakeoutDeamon; //takeout守护进程脚本文件路径
};
#endif
......@@ -256,6 +256,16 @@ void *FunTakeaway(void* lpParamter)
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;
//delete[] strGBK;
......@@ -263,7 +273,8 @@ void *FunTakeaway(void* lpParamter)
{
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();
}
close(connect_fd);
......
// json.cpp : 定义控制台应用程序的入口点。
// json.cpp : 定义控制台应用程序的入口点。
//
#include "json.h"
#include <iostream>
#include "../3rdParty/easylogging/easylogging++.h"
//将支付订单信息结构组合为json字串
//将支付订单信息结构组合为json字串
std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
{
rapidjson::StringBuffer buffer;
......@@ -60,7 +61,7 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
writer.Key("products");
writer.StartArray();
//-----------------start 单个商品------------------
//-----------------start 单个商品------------------
for(unsigned int i=0;i<OrderInfo.vecGoods.size();i++)
{
writer.StartObject();
......@@ -75,7 +76,7 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
writer.EndObject();
}
//-----------------end 单个商品------------------
//-----------------end 单个商品------------------
writer.EndArray();
//-----------------end products--------------------
writer.EndObject();
......@@ -86,17 +87,17 @@ std::string GetPayJson(FM_ORDER_INFO &OrderInfo)
return buffer.GetString();
}
//通过json字串获取外卖订单信息
//通过json字串获取外卖订单信息
bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order)
{
rapidjson::Document document; // 定义一个Document对象
document.Parse(lpJson); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
rapidjson::Document document; // 定义一个Document对象
document.Parse(lpJson); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
{
// 可通过GetParseError()取得出错代码,
// 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值
// 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写
// 函数GetErrorOffset()返回出错发生的位置
// 可通过GetParseError()取得出错代码,
// 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值
// 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写
// 函数GetErrorOffset()返回出错发生的位置
//LOG_ERROR("TakeawayOrder JSON parse error: (%d:%d)", document.GetParseError(), document.GetErrorOffset())
}
else
......@@ -110,6 +111,9 @@ bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order)
rapidjson::Value& fm_id = document["fm_id"];
order.fm_id=fm_id.GetString();
}
else if(order.fm_cmd == "get_menu"){
}
else
{
rapidjson::Value& pay_id_obj = document["pay_id"];
......@@ -178,9 +182,9 @@ bool GetTakeawayOrder(const char* lpJson, TakeawayOrder &order)
return true;
}
//获取外卖订单返回结果的json字串
// statuscode 状态码
// msg 状态信息
//获取外卖订单返回结果的json字串
// statuscode 状态码
// msg 状态信息
std::string GetTakeawayResultJson(const int statuscode,const char* msg)
{
rapidjson::StringBuffer buffer;
......@@ -197,3 +201,11 @@ std::string GetTakeawayResultJson(const int statuscode,const char* msg)
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 @@
#include "../base/CommonStruct.h"
//将支付订单信息结构组合为json字串
//将支付订单信息结构组合为json字串
std::string GetPayJson(FM_ORDER_INFO &OrderInfo);
//通过json字串获取外卖订单信息
//通过json字串获取外卖订单信息
bool GetTakeawayOrder(const char* json, TakeawayOrder &order);
//获取外卖订单返回结果的json字串
//获取外卖订单返回结果的json字串
std::string GetTakeawayResultJson(const int statuscode,const char* msg);
std::string GetPOSMenuJson(std::vector<PrinterMenu> &vecMenu);
#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