Commit b76f2edb by wuyang.zou

POS 插件:

1、设备 ip 展示 (过滤非合法ip 和 mac地址并进行排序);
2、黑金优先制作:会员等级 + 打印扩展列表;
3、插件开机立刻启动,出现数据库服务还未Ready,插件连接异常导致登陆失败,新增插件连接异常重连机制;
4、针对OnePos 守护程序的路径变更为正确路径;
5、插件数据库表自增id 长度的考虑扩增;
------------------------------------------------------------------------------------
tb_main_prod_refinfo     自增ID 目前  2105692 【2,147,483,647】
tb_msr_customer_info    自增ID 目前 719439    【2,147,483,647】
tb_order_promotions      自增ID 目前 22803      【2,147,483,647】
tb_print_msr_customer   自增ID 目前 714955    【2,147,483,647】
--------------------------------------------------
SimProcOrderTable    无新增 ID
tb_notice_msg            数据量小可以忽略
------------------------------------------------------------------------------------
parent a2341a01
Pipeline #43790 failed with stage
in 0 seconds
......@@ -46,14 +46,12 @@ SocketCommunicate::~SocketCommunicate()
while(!_stoped) {
QLOG_INFO() << QString("SocketCommunicate:: ~SocketCommunicate()......");
_stopFlag = true;
if ( _sslSocket ) {
_sslSocket->disconnectFromHost(); // free Host And Port Resource;
// https://doc.qt.io/archives/qtjambi-4.5.2_01/com/trolltech/qt/network/QAbstractSocket.html#disconnectFromHost()
// Will Emit signal: disconnected() , Then Trigger Slot: deleteLater()
// delete _sslSocket; _sslSocket = nullptr;
}
emit quit();
EVENTWAIT(20);
this->threadClose();
......@@ -100,13 +98,15 @@ bool SocketCommunicate::connectTcpSvr()
//下载证书接口(需要门店号 & 设备号)待调试, 评估是否需要保存证书文件:
QLOG_INFO() << "connectTcpSvr::Get Certificate From Url: ......................";
std::string tempMacAddress = "";
int getMacRet = MacTool::GetMacByAdaptersAddresses( tempMacAddress );
std::string tempIpAddress = "";
int getMacRet = MacTool::GetMacByAdaptersAddresses( tempMacAddress , tempIpAddress );
if ( !getMacRet) {
QLOG_ERROR() << "connectTcpSvr:: MacTool::GetMacByAdaptersAddresses Falied";
// 是否需要弹框提示 伙伴.
}
_macAddress = tempMacAddress.c_str();
_localIp = tempIpAddress.c_str();
// 组装请求头+请求体, 获取证书相关数据;
QString reqCertificateRealUrl = _getCertificateUrl + "storeId=" + _storeId + "&deviceId=" + _macAddress;
......@@ -115,7 +115,7 @@ bool SocketCommunicate::connectTcpSvr()
QString requestError;
int requestErrorNum = 0;
// 如果获取证书失败,需要循环获取,且频次需要越来越低;
if ( 0 == _certPublishKey.length() || 0 == _certPrivateKey.length() ) {
if ( 0 == _certPublishKey.length() || 0 == _certPrivateKey.length() || _reconnectTimes >= 5 ) {
do {
if ( S_GetRequest( reqCertificateRealUrl, outCertificateData, requestError) ) {
......@@ -799,7 +799,7 @@ void SocketCommunicate::threadStart()
}
QLOG_INFO() << QString("Waitting HttpLogin / openTcpChannel / GetSvrIpPort Failed, Wait 10 Seconds, _httpLoginResult:%1, _openTcpChannel:%2, _stopFlag:%3")
.arg( _httpLoginResult?1:0 ).arg(_openTcpChannel?1:0).arg(_stopFlag?1:0);
Sleep( SOCKET_START_TIMEOUT_INTERVAL );
Sleep( SOCKET_START_CHECK_TIMEOUT_INTERVAL );
FlowControl::GetInstance()._GetFcMajorInfo(_httpLoginResult, _openTcpChannel, _storeId, _localIp, _hostName,_workStationNum,_backupPos);
}
......
......@@ -174,6 +174,7 @@ private:
QTimer *m_reportOMSReocrdOrderTimer;
QTimer *m_presistInputPosSuccessReocrdTimer;
QTimer *m_loginTimer;
QTimer *m_loopRefreshTimer;
QTimer *m_queryAllNoticeTimer;
QTimer *m_storageOrderTimer;
QTimer *m_delayGetRefundDetailTimer;
......@@ -249,7 +250,6 @@ private:
//新增三个bool变量用来标识 程序初始化时,两个数据库中的三张表是否能够连接正常;
bool m_initSimProcOrderDBRet;
bool m_initPrintSumBillPosDBRet;
bool m_initGetAuthPosDBRet;
bool m_initPrintCupStickPosDBRet;
bool m_initPrintMsgQueueDBRet;
bool m_initPrintOrderPromotionDBRet;
......@@ -315,6 +315,13 @@ signals:
* 返回:NULL
* */
void setStoreInfo(const QString& storeId);
/* 功能:设置主界面终端IP
* 参数:[1]终端IP
* 返回:NULL
* */
void setTerminalIp(const QString& terminalIp);
/* 功能:设置主界收银员信息
* 参数:[1]收银员信息
* 返回:NULL
......@@ -501,6 +508,8 @@ private slots:
void _ClickToLogin();
void _LoopRefresh();
void RefreshPosMetaData();
void _QueryAllNoticeMsg();
......
......@@ -106,3 +106,32 @@ bool PosMetaDataDB::queryPosMetaDataDB( PosMateDataObject* posMateDataObj) {
m_sqlDb.close();
return result;
}
QString PosMetaDataDB::getDbStoreId() {
QMutexLocker mutex(&m_mutex);
if(!m_sqlDb.open()) {
QLOG_ERROR()<<"[<<<<---SqlServer Database:Open Failed--->>>>]"<<m_sqlDb.lastError().text();
return "";
}
QString result = "";
QSqlQuery query(m_sqlDb);
QLOG_INFO()<< QString("SELECT TOP 1 ObjectNumber FROM [DataStore].[dbo].[V_HIERARCHY] where Parent1=1");
query.prepare( QString("SELECT TOP 1 ObjectNumber FROM [DataStore].[dbo].[V_HIERARCHY] where Parent1=1") );
if ( !query.exec() ) {
QLOG_ERROR()<<"[<<<<---SqlServer Database:getDbStoreId--->>>>]"<<query.lastError().text();
result= "";
}
if ( query.first() ) {
result= query.value(0).toString();
QLOG_INFO()<<QString("[<<<<---SqlServer Database, getDbStoreId: %1--->>>>]").arg(result);
} else {
result = "";
}
m_sqlDb.close();
return result;
}
......@@ -29,6 +29,14 @@ public:
**/
bool queryPosMetaDataDB(PosMateDataObject* posMateDataObj);
/**
*功能:查询 “门店号” 是否存在本地的POS系统中;
*参数:[0]
*返回: 查询成功的门店号;
**/
QString getDbStoreId();
private:
QMutex m_mutex;
PosMetaDataDB();
......@@ -36,6 +44,7 @@ private:
PosMetaDataDB& operator=(PosMetaDataDB const&);
QSqlDatabase m_sqlDb;
bool m_configTableExist;
QString m_dbStoreId;
signals:
......
......@@ -20,10 +20,67 @@ ConfigManger::ConfigManger()
QString appDir = QApplication::applicationDirPath();
QString config = QString("%1/%2").arg(appDir).arg(CONFIG_NAME);
QString userConfig = QString("%1/%2").arg(appDir).arg(USERCONFIG_NAME);
QString proxyServiceConfig = QString("C:\\Freemud\\daemonService\\fmproxy_service.config");
m_config = new QSettings(config, QSettings::IniFormat);
m_userConfig = new QSettings(userConfig, QSettings::IniFormat);
/* // One Pos 守护程序: 守护插件的路径的修改;
[FMKeeper]
Heartbeat={"fm_cmd":4}
HeartbeatPeer=24409
ServiceName=PosPluginDaemon
HeartbeatTryCnt=5
CheckInterval=180
PersistLaunch=0
KillElapse=0
DefaultExe=C:\\freemud\\fmPlugin\\fmTakeout.exe //<<---//
ServiceStartMode=2
ServiceStartDelayInterval=330
DaemonMultiProcessMode=1
MultiProcessPortExeMap=24409@C:\\freemud\\fmPlugin\\fmTakeout.exe;8080@C:\\Micros\\Simphony\\WebServer\\ServiceHost.exe //<<---//
ExtraDaemonServiceNameList=SbuxCapsServices;
*/
//判断文件是否存在,不存在则置空,存在则配置;
QFileInfo proxyServiceConfigFileInfo(proxyServiceConfig);
if ( proxyServiceConfigFileInfo.isFile() )
{
//QFile::rename(newConfigFileFullName ,newBakConfigFileFullName);
//QFile::copy(configFileFullName, newConfigFileFullName);
//QLOG_INFO() << QString(" Copy config.ini File:: %1 To %2 Success !!!").arg(configFileFullName).arg(newConfigFileFullName);
m_proxyServiceConfig = new QSettings(proxyServiceConfig, QSettings::IniFormat);
QString tempProcessMapCfg = m_proxyServiceConfig->value(INI_DAEMON_PROCESS_MAP_KEY).toString();
QString tempDefaultExeCfg = m_proxyServiceConfig->value(INI_DAEMON_DEFAULT_EXE_KEY).toString();
// 输出检查;
QLOG_INFO() << QString(" One Pos(Backup Pos) Daemon DefaultExe::%1 ; Daemon Service List:: %2 ").arg(tempDefaultExeCfg).arg(tempProcessMapCfg);
if ( tempProcessMapCfg.indexOf(INI_DAEMON_PROCESS_MAP_VALUE,Qt::CaseInsensitive) >= 0
&& tempDefaultExeCfg.indexOf(INI_DAEMON_DEFAULT_EXE_VALUE,Qt::CaseInsensitive) >= 0 ) {
QLOG_INFO() << QString(" One Pos(Backup Pos) Value Is New, No Need Modify !!!");
} else {
// 重置新路径配置;
if ( m_proxyServiceConfig->isWritable() ) {
QString tempNewProcessMapCfg = QString("24409@C:\\freemud\\fmPluginNew\\fmTakeout.exe;8080@C:\\Micros\\Simphony\\WebServer\\ServiceHost.exe");
m_proxyServiceConfig->setValue(INI_DAEMON_PROCESS_MAP_KEY, tempNewProcessMapCfg.trimmed());
QString tempNewDefaultExeCfg = "C:\\freemud\\fmPluginNew\\fmTakeout.exe";
m_proxyServiceConfig->setValue( INI_DAEMON_DEFAULT_EXE_KEY, tempNewDefaultExeCfg);
// 修改后再次输出检查;
tempProcessMapCfg = m_proxyServiceConfig->value(INI_DAEMON_PROCESS_MAP_KEY).toString();
tempDefaultExeCfg = m_proxyServiceConfig->value(INI_DAEMON_DEFAULT_EXE_KEY).toString();
QLOG_INFO() << QString(" One Pos(Backup Pos) After Modify --> Daemon DefaultExe::%1 ; Daemon Service List:: %2").arg(tempDefaultExeCfg).arg(tempProcessMapCfg);
} else {
QLOG_ERROR() << QString(" One Pos(Backup Pos) Mode , fmproxy_service.config No Writable !!!");
}
}
} else {
QLOG_INFO() << QString(" Not One Pos(Backup Pos) Mode, No Need Do Anthing");
m_proxyServiceConfig = new QSettings();
}
}
ConfigManger::SqlConnectInfo ConfigManger::GetSqlConnectInfo()
{
SqlConnectInfo info;
......@@ -47,10 +104,12 @@ QString ConfigManger::GetLoginServerUrl()
{
return m_config->value(INI_LOGINSERVER).toString();
}
QString ConfigManger::GetOrderServerUrl()
{
return m_config->value(INI_ORDERSERVER).toString();
}
QString ConfigManger::GetStoreServerUrl()
{
return m_config->value(INI_STORESERVER).toString();
......
......@@ -4,6 +4,8 @@
#include <QSettings>
#include <QUrl>
#include <QPoint>
#include <QFileInfo>
#include "QsLog.h"
class ConfigManger
{
......@@ -171,6 +173,7 @@ private:
// 程序配置和用户配置
QSettings *m_config;
QSettings *m_userConfig;
QSettings *m_proxyServiceConfig;
};
#endif // CONFIGMANGER_H
......@@ -67,6 +67,13 @@ public:
bool alterTablePrintSumBillPosDBLength();
/**
*功能:新增pos本地数据库打印小票信息表中字段;
*参数:[无]
*返回:true:新增成功,false:新增字段失败
**/
bool alterTablePrintSumBillPosDB24();
/**
*功能:插入一条汇总单信息到pos本地数据库中;
*参数:[1]订单对象指针 [2]小票号 [3]Pos机实际开单时间
*返回:true操作成功,false失败
......
#include "PosExtendObject.h"
#include "preDefine.h"
#include <QJsonArray>
PosExtendObject::PosExtendObject(const PosExtendObject &posExtendObj, QObject *parent):QObject(parent)
{
const QMetaObject *m = posExtendObj.metaObject();
for( int i=m->propertyOffset(); i<m->propertyCount(); i++) {
QMetaProperty qmp = m->property(i);
QString key = QString::fromLatin1(qmp.name());
QVariant value = posExtendObj.property(key.toUtf8());
this->setProperty(key.toUtf8(), value);
}
}
PosExtendObject& PosExtendObject::operator =(const PosExtendObject& posExtendObj)
{
const QMetaObject *m = posExtendObj.metaObject();
for( int i=m->propertyOffset(); i<m->propertyCount(); i++) {
QMetaProperty qmp = m->property(i);
QString key = QString::fromLatin1(qmp.name());
QVariant value = posExtendObj.property(key.toUtf8());
this->setProperty(key.toUtf8(), value);
}
return *this;
}
void PosExtendObject::FetchDataFromJson(const QJsonObject &json)
{
foreach(QString key, json.keys()) {
setProperty(key.toUtf8(), json[key].toVariant());
}
return;
}
QString PosExtendObject::objectToString(){
QString tempString;
tempString = "{\"printType\":\"" + printType + "\","
+ "\"qty\":" + QString::number( qty ) + ","
+ "\"printName\":\"" + printName + "\","
+ "\"printDesc\":\"" + printDesc + "\"}" ;
return tempString;
}
#ifndef POSEXTENDOBJECT_H
#define POSEXTENDOBJECT_H
#include <QObject>
#include <QJsonObject>
#include <QVariant>
#include <QMetaProperty>
class PosExtendObject : public QObject
{
Q_OBJECT
Q_PROPERTY (QString printType READ getPrintType WRITE setPrintType)
Q_PROPERTY (int qty READ getQty WRITE setQty)
Q_PROPERTY (QString printName READ getPrintName WRITE setPrintName)
Q_PROPERTY (QString printDesc READ getPrintDesc WRITE setPrintDesc)
public:
explicit PosExtendObject(QObject *parent = 0):QObject(parent){}
PosExtendObject(const PosExtendObject& posExtendObj,QObject* parent=0);
PosExtendObject& operator =(const PosExtendObject& posExtendObj);
void FetchDataFromJson(const QJsonObject &json);
QString objectToString();
QString printType;
int qty = 0;
QString printName;
QString printDesc;
protected:
inline QString getPrintType(){ return printType; }
inline void setPrintType(const QString& v){ printType = v; }
inline int getQty(){ return qty; }
inline void setQty(const int& v){ qty = v; }
inline QString getPrintName(){ return printName; }
inline void setPrintName(const QString& v){ printName = v; }
inline QString getPrintDesc(){ return printDesc; }
inline void setPrintDesc(const QString& v){ printDesc = v; }
};
#endif // POSEXTENDOBJECT_H
......@@ -16,6 +16,11 @@ OrderObject::OrderObject(const OrderObject &order, QObject *parent):QObject(pare
qDeleteAll(paymentList);
paymentList.clear();
/*
qDeleteAll(posExtendList);
posExtendList.clear();
*/
const QMetaObject *m = order.metaObject();
for( int i=m->propertyOffset(); i<m->propertyCount(); i++)
{
......@@ -44,8 +49,17 @@ OrderObject::OrderObject(const OrderObject &order, QObject *parent):QObject(pare
PaymentObject *payment=new PaymentObject(*ptr,this);
this->paymentList.append(payment);
}
/*
foreach (auto ptr, order.posExtendList) {
PosExtendObject *posExtendObj=new PosExtendObject(*ptr,this);
this->posExtendList.append(posExtendObj);
}
*/
}
OrderObject& OrderObject::operator =(const OrderObject& order)
{
qDeleteAll(proList);
......@@ -60,6 +74,11 @@ OrderObject& OrderObject::operator =(const OrderObject& order)
qDeleteAll(paymentList);
paymentList.clear();
/*
qDeleteAll(posExtendList);
posExtendList.clear();
*/
const QMetaObject *m = order.metaObject();
for( int i=m->propertyOffset(); i<m->propertyCount(); i++)
{
......@@ -89,9 +108,17 @@ OrderObject& OrderObject::operator =(const OrderObject& order)
this->paymentList.append(payment);
}
/*
foreach (auto ptr, order.posExtendList) {
PosExtendObject *posExtendObj=new PosExtendObject(*ptr,this);
this->posExtendList.append(posExtendObj);
}
*/
return *this;
}
void OrderObject::FromJson(const QJsonObject &json)
{
qDeleteAll(proList);
......@@ -106,6 +133,11 @@ void OrderObject::FromJson(const QJsonObject &json)
qDeleteAll(paymentList);
paymentList.clear();
/*
qDeleteAll(posExtendList);
posExtendList.clear();
*/
FetchDataFromJson(json);
QJsonArray products = json[JSON_PRODUCTS].toArray();
......@@ -192,6 +224,28 @@ void OrderObject::FromJson(const QJsonObject &json)
paymentList.append(paymObject);
}
/*
//解析多条POS扩展属性 List;
QJsonArray posExtends = json[JSON_POS_EXTEND_LIST].toArray();
foreach(QJsonValue posExtend, posExtends)
{
QJsonObject posExtendJson = posExtend.toObject();
PosExtendObject *posExtendObject = new PosExtendObject(this);
posExtendObject->qty = 0;
posExtendObject->FetchDataFromJson(posExtendJson);
posExtendList.append(posExtendObject);
}
*/
QJsonArray posExtends = json[JSON_POS_EXTEND_LIST].toArray();
if ( posExtends.isEmpty() ) {
posExtendListString = QString("");
} else {
QJsonDocument tempDoc( posExtends );
// 获取JSON文本表示形式的字符串
QByteArray tempByteArray = tempDoc.toJson(QJsonDocument::Compact);
posExtendListString = QString::fromUtf8( tempByteArray );
}
// 更新 QJsonObject Value;
if (json.contains(JSON_PUSH_PLUGIN_OPTIONS) ) {
pluginOptions = json[JSON_PUSH_PLUGIN_OPTIONS].toObject();
......@@ -241,6 +295,7 @@ void OrderObject::FromJson(const QJsonObject &json)
return;
}
void OrderObject::FetchDataFromJson(const QJsonObject &json)
{
QStringList keys = json.keys();
......
......@@ -5,6 +5,9 @@
#include "Model/dishesObject.h"
#include "Model/couponsObject.h"
#include "Model/paymentObject.h"
#include "Model/PosExtendObject.h"
#include <QJsonArray>
#include <QJsonDocument>
class OrderObject : public QObject
{
......@@ -15,7 +18,6 @@ class OrderObject : public QObject
Q_PROPERTY (QString thirdPartyBatch READ getThirdPartyBatch WRITE setThirdPartyBatch)
Q_PROPERTY (QString refundFmId READ getRefundFmId WRITE setRefundFmId)
Q_PROPERTY (QString thirdPartyOrderId READ getThirdPartyOrderId WRITE setThirdPartyOrderId)
Q_PROPERTY (int orderType READ getOrderType WRITE setOrderType)
Q_PROPERTY (QString orgOrderId READ getOrgOrderId WRITE setOrgOrderId)
Q_PROPERTY (QString waybillId READ getWaybillId WRITE setWaybillId)
......@@ -24,7 +26,6 @@ class OrderObject : public QObject
Q_PROPERTY (QString customerId READ getCustomerId WRITE setCustomerId)
Q_PROPERTY (QString customerName READ getCustomerName WRITE setCustomerName)
Q_PROPERTY (QString phone READ getPhone WRITE setPhone)
Q_PROPERTY (QString msr_no READ getMsr_no WRITE setMsr_no)
Q_PROPERTY (QString storeId READ getStoreId WRITE setStoreId)
Q_PROPERTY (QString storeName READ getStoreName WRITE setStoreName)
......@@ -84,28 +85,21 @@ class OrderObject : public QObject
Q_PROPERTY (QString customerSex READ getCustomerSex WRITE setCustomerSex)
Q_PROPERTY (QString platformSource READ getPlatformSource WRITE setPlatformSource)
Q_PROPERTY (int orderIndex READ getOrderIndex WRITE setOrderIndex)
Q_PROPERTY (QString expectDate READ getExpectDate WRITE setExpectDate)
Q_PROPERTY (QString lastExpectDate READ getLastExpectDate WRITE setLastExpectDate)
Q_PROPERTY (QString reserveMakeTime READ getReserveMakeTime WRITE setReserveMakeTime)
Q_PROPERTY (int inAdvanceTakemeal READ getInAdvanceTakemeal WRITE setInAdvanceTakemeal)
Q_PROPERTY (QString subStoreId READ getSubStoreId WRITE setSubStoreId)
Q_PROPERTY (int tenderDeliveryDiscountB READ getTenderDeliveryDiscountB WRITE setTenderDeliveryDiscountB)
Q_PROPERTY (QString tenderDeliveryDiscountBSku READ getTenderDeliveryDiscountBSku WRITE setTenderDeliveryDiscountBSku)
Q_PROPERTY (int decouplePosVersion READ getDecouplePosVersion WRITE setDecouplePosVersion)
Q_PROPERTY (bool deliveryAtProd READ getDeliveryAtProd WRITE setDeliveryAtProd)
Q_PROPERTY (int globalServiceType READ getGlobalServiceType WRITE setGlobalServiceType)
Q_PROPERTY (int globalOrderType READ getGlobalOrderType WRITE setGlobalOrderType)
Q_PROPERTY (int extendType READ getExtendType WRITE setExtendType)
Q_PROPERTY (int deliveryProvider READ getDeliveryProvider WRITE setDeliveryProvider)
Q_PROPERTY (int deliveryType READ getDeliveryType WRITE setDeliveryType)
Q_PROPERTY (int isGiftitForward READ getIsGiftitForward WRITE setIsGiftitForward )
Q_PROPERTY (QString remindTicketTime READ getRemindTicketTime WRITE setRemindTicketTime )
Q_PROPERTY (QString carNumber READ getCarNumber WRITE setCarNumber)
Q_PROPERTY (QString carColor READ getCarColor WRITE setCarColor)
......@@ -117,8 +111,8 @@ class OrderObject : public QObject
Q_PROPERTY (int totalPriceForPos READ getTotalPriceForPos WRITE setTotalPriceForPos )
Q_PROPERTY (int blockPrintCupTicketTask READ getBlockPrintCupTicketTask WRITE setBlockPrintCupTicketTasks )
Q_PROPERTY (int blockPrintRemindTicketTask READ getBlockPrintRemindTicketTask WRITE setBlockPrintRemindTicketTask )
Q_PROPERTY (bool packageFeeAtProduct READ getPackageFeeAtProduct WRITE setPackageFeeAtProduct)
Q_PROPERTY (QString memberLevel READ getMemberLevel WRITE setMemberLevel)
public:
OrderObject(QObject *parent=0)
......@@ -170,6 +164,15 @@ public:
//扩展 星巴克 组合支付的券信息 List;
QList<CouponsObject*>orderCoupList;
// 扩展 星巴克 多条 POS打印扩展属性List;
// POS/PCS 扩展列表: 优先打印,店用餐具,一次性杯,自带杯
// {printType->string,qty->int,printName->string,printDesc->string}
// printType: 打印类型 1001:优先制作 1101:店用餐具 1102:一次性杯 1103:自带杯
// qty: 数量(自带杯)
// printName: 打印名称
// printDesc: 打印描述
// QList<PosExtendObject*>posExtendList; //不可动态新增字段,在PosExtendObject转序列化时会丢失新增字段; 顾放弃此模式;
//扩展 存储订单全部 Poskey List (用于做PosKey有效期检查);
QStringList posKeyList;
......@@ -279,7 +282,6 @@ public:
int blockPrintCupTicketTask = 0;
// block按时打印送餐提醒小票 0:不block; 1:block [reserve27] 对应OMS接口:remindTicketFlag 是否打印送餐小票 0 打印 1 不打印
int blockPrintRemindTicketTask = 0;
int forwardPosStatus; // 正向单入机状态: 0:未知 1: 成功 2:失败;
int negativePosStatus; // 负向单同上;
int deliveryStatus;
......@@ -307,6 +309,15 @@ public:
QString sbkAppRefundPayValue;
bool backupPosFlag;
int totalPriceForPos;
QString memberLevel; // 会员等级: 黑金-Black、金星-Gold、玉星-Green、银星-Welcome;
QString posExtendListString;
// 扩展 星巴克 多条 POS打印扩展属性List;
// POS/PCS 扩展列表: 优先打印,店用餐具,一次性杯,自带杯
// {printType->string,qty->int,printName->string,printDesc->string}
// printType: 打印类型 1001:优先制作 1101:店用餐具 1102:一次性杯 1103:自带杯
// qty: 数量(自带杯)
// printName: 打印名称
// printDesc: 打印描述
QString getChannelName();
......@@ -609,6 +620,9 @@ public:
inline int getBlockPrintRemindTicketTask()const{return blockPrintRemindTicketTask;}
inline void setBlockPrintRemindTicketTask(const int& v){blockPrintRemindTicketTask = v;}
inline QString getMemberLevel()const{return memberLevel;}
inline void setMemberLevel(const QString& v){memberLevel = v;}
};
#endif // ORDEROBJECT_H
......@@ -16,70 +16,77 @@ class MacTool
{
public:
static int GetMacByAdaptersAddresses(std::string& macOut)
static int GetMacByAdaptersAddresses(std::string& macOut, std::string& ipOut)
{
int ret = 0;
/*
ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
if (pAddresses == NULL)
return 0;
// Make an initial call to GetAdaptersAddresses to get the necessary size into the ulOutBufLen variable
if(GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW)
QString macAddress ="";
QStringList macAddressList;
QString ipAddress ="";
QStringList ipAddressList;
auto interfaces = QNetworkInterface::allInterfaces();
auto hostAddresses = QNetworkInterface::allAddresses();
// 在线网卡可能存在多个,故还是需要像 upp 一样,将在线全部网卡进行排序后,取第一个
QLOG_INFO()<<QString("GetMacByAdaptersAddresses:: interfaces size: %1 , hostAddresses: %2 ").arg( interfaces.size() ).arg( hostAddresses.size() );
for (int i = 0; i < interfaces.length(); i++) {
if ( interfaces[i].isValid() ) {
if( interfaces[i].flags().testFlag(QNetworkInterface::IsUp) && interfaces[i].flags().testFlag(QNetworkInterface::IsRunning) &&
!interfaces[i].flags().testFlag(QNetworkInterface::IsLoopBack))
{
free(pAddresses);
pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
if (pAddresses == NULL)
return 0;
QLOG_INFO()<<QString("GetMacByAdaptersAddresses:: interfaces[ %1 ] = %2").arg( i+1 ).arg( interfaces[i].hardwareAddress() );
macAddressList.append( interfaces[i].hardwareAddress() );
}
if(GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == NO_ERROR)
{
for(PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; pCurrAddresses != NULL; pCurrAddresses = pCurrAddresses->Next)
{
if(pCurrAddresses->PhysicalAddressLength != 6)
continue;
char acMAC[32];
sprintf(acMAC, "%02X-%02X-%02X-%02X-%02X-%02X",
int (pCurrAddresses->PhysicalAddress[0]),
int (pCurrAddresses->PhysicalAddress[1]),
int (pCurrAddresses->PhysicalAddress[2]),
int (pCurrAddresses->PhysicalAddress[3]),
int (pCurrAddresses->PhysicalAddress[4]),
int (pCurrAddresses->PhysicalAddress[5]));
macOut = acMAC;
ret = 1;
break;
}
}
free(pAddresses);
return ret;
*/
// MAC地址列表大于1时(需要进行升序排序);
if ( macAddressList.size() > 1 ) {
qSort(macAddressList.begin(), macAddressList.end(), [] (const QString& s1, const QString& s2) {
return s1 < s2;
} );
macAddress = macAddressList.first();
// MAC地址列表等于1时(无需排序,直接取唯一的值)
} else if ( macAddressList.size() == 1 ) {
macAddress = macAddressList.first();
} else {
// Do Nothing;
}
QString address ="";
auto interfaces = QNetworkInterface::allInterfaces();
for (int i = 0; i < interfaces.length(); i++) {
QLOG_INFO()<<QString("GetMacByAdaptersAddresses:: interfaces[%1]= %2 ").arg( i+1 ).arg( interfaces[i].hardwareAddress() );
if ( interfaces[i].isValid() ) {
/* if( interfaces[i].flags().testFlag(QNetworkInterface::IsUp) &&
interfaces[i].flags().testFlag(QNetworkInterface::IsRunning) &&
!interfaces[i].flags().testFlag(QNetworkInterface::IsLoopBack)) */
address = interfaces[i].hardwareAddress();
break;
// ip 地址可能存在多个,故还是需要像 upp 一样,将全部 ip 地址进行排序后,取第一个
for (int i = 0; i < hostAddresses.length(); i++) {
// if(address.protocol() == QAbstractSocket::IPv4Protocol) { } //1.1.1.1 > length > 7
QHostAddress hadr = hostAddresses[i];
if ( hadr.toString().length() > 7 && !hadr.toString().contains("127.0.0.1") && !hadr.toString().contains("192.168.")
&& !hadr.toString().contains("10.0.75.1") && !hadr.toString().contains("172.") && hadr.toString().contains("10.") )
{
QLOG_INFO()<<QString("GetMacByAdaptersAddresses:: hostAddresses[ %1 ] = %2 , protocol: %3")
.arg( i+1 ).arg( hadr.toString() ).arg( hadr.protocol() );
ipAddressList.append( hadr.toString() );
}
}
// IP地址列表大于1时(需要进行升序排序);
if ( ipAddressList.size() > 1 ) {
qSort(ipAddressList.begin(), ipAddressList.end(), [] (const QString& s1, const QString& s2) {
return s1 < s2;
} );
ipAddress = ipAddressList.first();
// MAC地址列表等于1时(无需排序,直接取唯一的值)
} else if ( ipAddressList.size() == 1 ) {
ipAddress = ipAddressList.first();
} else {
// Do Nothing;
}
if (address.isEmpty()) {
QLOG_ERROR()<<QString("GetMacByAdaptersAddresses:: Local Hardware Address Acquisition Failed!");
if ( macAddress.isEmpty() || ipAddress.isEmpty() ) {
QLOG_ERROR()<<QString("GetMacByAdaptersAddresses:: Local Hardware Address Acquisition Failed || Local IP Address Failed");
} else {
ret = 1;
address = address.replace(QRegExp(":"), "-");
macOut = address.toStdString();
QLOG_INFO()<<QString("GetMacByAdaptersAddresses:: MAC= %1 ").arg( address );
macAddress = macAddress.replace(QRegExp(":"), "-");
macOut = macAddress.toStdString();
ipOut = ipAddress.toStdString();
QLOG_INFO()<<QString("GetMacByAdaptersAddresses::MAC: %1 , IP: %2").arg( macAddress ).arg(ipAddress);
}
return ret;
}
};
......
......@@ -86,7 +86,8 @@ SOURCES += main.cpp\
PrintTicketSelectForm.cpp \
Model/PosMateDataObject.cpp \
DTools/PosMetaDataDB.cpp \
MiniStoreStatusForm.cpp
MiniStoreStatusForm.cpp \
Model/PosExtendObject.cpp
HEADERS += \
Control/flowControl.h \
......@@ -154,7 +155,8 @@ HEADERS += \
PrintTicketSelectForm.h \
Model/PosMateDataObject.h \
DTools/PosMetaDataDB.h \
MiniStoreStatusForm.h
MiniStoreStatusForm.h \
Model/PosExtendObject.h
FORMS += mainForm.ui \
alertForm.ui \
......
......@@ -7,8 +7,8 @@ IDI_ICON ICON DISCARDABLE "logo.ico"
#endif
VS_VERSION_INFO VERSIONINFO
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
FILEVERSION 2,2023,10,12
PRODUCTVERSION 2,2023,10,12
FILEVERSION 2,2024,1,31
PRODUCTVERSION 2,2024,1,31
//*************************************************************************//
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
......@@ -27,12 +27,12 @@ VS_VERSION_INFO VERSIONINFO
VALUE "CompanyName", "ShangHai.Freemud Co., Ltd."
VALUE "FileDescription", "Delivery Order Plugin Application"
VALUE "InternalName", "fmTakeout.exe"
VALUE "LegalCopyright", "Copyright (C)2014-2023"
VALUE "LegalCopyright", "Copyright (C)2014-2024"
VALUE "OriginalFilename", "fmTakeout.exe"
VALUE "ProductName", "Delivery Order Plugin"
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
VALUE "ProductVersion", "2.2023.10.12"
VALUE "FileVersion", "2.2023.10.12"
VALUE "ProductVersion", "2.2024.1.31"
VALUE "FileVersion", "2.2024.1.31"
//*************************************************************************//
END
END
......
......@@ -81,31 +81,6 @@ void CopyOriginConfigResetSelf(const QString& g_appDir){
}
// One Pos 守护程序: 守护插件的路径的修改;【启动项路径有待测试】
void ModifyDaemonExeConfigPath(){
// 等待下一个版本测试,再进行修改 守护程序路径;
// C:\Freemud\daemonService\fmproxy_service.config
/*
[FMKeeper]
Heartbeat={"fm_cmd":4}
HeartbeatPeer=24409
ServiceName=PosPluginDaemon
HeartbeatTryCnt=5
CheckInterval=180
PersistLaunch=0
KillElapse=0
DefaultExe=C:\\freemud\\fmPlugin\\fmTakeout.exe //<<---------------------//
ServiceStartMode=2
ServiceStartDelayInterval=330
DaemonMultiProcessMode=1
MultiProcessPortExeMap=24409@C:\\freemud\\fmPlugin\\fmTakeout.exe;8080@C:\\Micros\\Simphony\\WebServer\\ServiceHost.exe //<<---------------------//
ExtraDaemonServiceNameList=SbuxCapsServices;
*/
QLOG_INFO() << QString(" Wait Next Version , Change fmproxy_service.config File'DefaultExe And MultiProcessPortExeMap !!!");
}
int main(int argc, char *argv[])
{
......@@ -142,7 +117,6 @@ int main(int argc, char *argv[])
// 兼容之前老版本(Qt5.5 & VS2010)的配置文件 与 守护程序的配置文件:
CopyOriginConfigResetSelf(g_appDir);
ModifyDaemonExeConfigPath();
// 将控制器移到工作线程
FlowControl::GetInstance().moveToThread(&workThread);
......
......@@ -53,6 +53,7 @@ MainForm::MainForm(QWidget *parent) :
connect(&FlowControl::GetInstance(), &FlowControl::setOpeStatus, this, &MainForm::onSetOpeStatus);
connect(&FlowControl::GetInstance(), &FlowControl::setNetStatus, this, &MainForm::onSetNetStatus);
connect(&FlowControl::GetInstance(), &FlowControl::setStoreInfo, this, &MainForm::onSetStoreInfo);
connect(&FlowControl::GetInstance(), &FlowControl::setTerminalIp, this, &MainForm::onSetTerminalIp);
connect(&FlowControl::GetInstance(), &FlowControl::setCashierInfo, this, &MainForm::onSetCashierInfo);
connect(&FlowControl::GetInstance(), &FlowControl::changeOrderStatus, this, &MainForm::onChangeOrderStatus/*,Qt::BlockingQueuedConnection*/);
connect(&FlowControl::GetInstance(), &FlowControl::showOrderDetails, this, &MainForm::onShowOrderDetails);
......@@ -187,6 +188,7 @@ void MainForm::_Init()
// 初始化文字
ui->mainLabStoreid->setText(QString::fromLocal8Bit(UI_STOREID));
ui->mainLabVersion->setText(APP_VERSION);
ui->mainSlabIp->setText(TERMINAL_DEF_IP);
// 初始化表
int scales6[] = {3, 4, 2, 3, 3, 3};
......@@ -468,6 +470,12 @@ void MainForm::onSetCashierInfo(const QString &cashierInfo)
}
void MainForm::onSetTerminalIp(const QString &terminalIp)
{
ui->mainSlabIp->setText(terminalIp);
}
void MainForm::onSetOpeStatus(const QString &status)
{
ui->mainLabOpeStatus->setText(status);
......
......@@ -331,6 +331,13 @@ public slots:
* */
void onSetStoreInfo(const QString& storeId);
/* 功能:设置设备ip信息
* 参数:[1]设备ip信息
* 返回:NULL
* */
void onSetTerminalIp(const QString& terminalIp);
/* 功能:设置收银员信息
* 参数:[1]收银员编号
* 返回:NULL
......
......@@ -1181,7 +1181,7 @@
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8" stretch="0,0,1">
<layout class="QHBoxLayout" name="horizontalLayout_8" stretch="0,0,0">
<property name="spacing">
<number>0</number>
</property>
......@@ -1360,6 +1360,17 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_19">
<item>
<widget class="QLabel" name="mainSlabIp">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="spacing">
<number>10</number>
......
......@@ -51,10 +51,11 @@
//#define APP_VERSION "2.2023.6.29"
//#define APP_VERSION "2.2023.7.24"
// Qt 5.9.1 & VS2015 [2023-09-13] 开始启用新的大版本;
#define APP_VERSION "2.2023.10.12"
#define APP_VERSION "2.2024.1.31"
//修正版本号时,切记修正 FmTakeout.rc 中的版本号
#define SERVER_PASSWORD "posoperator@freemud.cn"
#define TERMINAL_DEF_IP "*.*.*.*"
#define CONFIG_NAME "config.ini"
#define USERCONFIG_NAME "userConfig.ini"
......@@ -70,6 +71,11 @@
#define INI_LOGINSERVER "FmServer/loginUrl"
#define INI_ORDERSERVER "FmServer/orderUrl"
#define INI_STORESERVER "FmServer/storeUrl"
#define INI_DAEMON_PROCESS_MAP_KEY "FMKeeper/MultiProcessPortExeMap"
#define INI_DAEMON_PROCESS_MAP_VALUE "24409@C:\\freemud\\fmPluginNew\\fmTakeout.exe"
#define INI_DAEMON_DEFAULT_EXE_KEY "FMKeeper/DefaultExe"
#define INI_DAEMON_DEFAULT_EXE_VALUE "C:\\freemud\\fmPluginNew\\fmTakeout.exe"
#define INI_PRINTERNAME "Printer/name"
#define INI_OMSBTNPOSTION "OmsBtn/postion"
#define INI_OMSBTNWIDTHOFFSET "OmsBtn/widthoffset"
......@@ -159,6 +165,7 @@
#define JSON_COUPONS "coupons"
#define JSON_EXCHANGECOUPONS "exchangeCoupons"
#define JSON_PAYMENTS "PaymentObjs"
#define JSON_POS_EXTEND_LIST "posExtendList"
#define JSON_SUBPRODUCTS "addExtra"
#define JSON_ITEMSDISCOUNT "itemsDiscount"
#define JSON_COUPONPRODUCTS "skus"
......@@ -238,6 +245,9 @@
#define SOCKET_CONNECT_TIMEOUT_INTERVAL 20*1000
// 写报文超时时间(单位: 毫秒);
#define SOCKET_WRITE_TIMEOUT_INTERVAL 15*1000
// 启动检查超时时间(单位: 毫秒);
#define SOCKET_START_CHECK_TIMEOUT_INTERVAL 5*1000
// 启动超时时间(单位: 毫秒);
#define SOCKET_START_TIMEOUT_INTERVAL 1*10*1000
// 短超时时间(单位: 毫秒);
......
......@@ -81,7 +81,7 @@ QWidget
background-color: #303030;
}
#mainSlabStoreid,#mainSlabOpeStatus,#mainSlabNetStatus,#mainSlabVersion,#mainSlabCashier,
#mainSlabTime,#mainLabStoreid,#mainLabOpeStatus,#mainLabNetStatus,#mainLabVersion,#mainLabCashier
#mainSlabTime,#mainLabStoreid,#mainLabOpeStatus,#mainLabNetStatus,#mainLabVersion,#mainLabCashier,#mainSlabIp
{
color: #9b9b9b;
}
......
No preview for this file type
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