Commit 56b36951 by gujin.wang

1.修改卡券核心插件的部分内容 2.添加启动FMDbMonitor的功能,当fmPOS启动时,自动启动FMDbMonitor监控程序

parent 5370b406
...@@ -9,11 +9,16 @@ TEMPLATE = app ...@@ -9,11 +9,16 @@ TEMPLATE = app
INCLUDEPATH += $$PWD/../include/ctk \ INCLUDEPATH += $$PWD/../include/ctk \
$$PWD/../include/interface \ $$PWD/../include/interface \
#Library path
LIBS += -L$$PWD/../lib
CONFIG(debug, debug|release) { CONFIG(debug, debug|release) {
DESTDIR = $$PWD/../debug/bins DESTDIR = $$PWD/../debug/bins
LIBS += -lCTKCored -lCTKPluginFrameworkd
} }
else { else {
DESTDIR = $$PWD/../release/bins DESTDIR = $$PWD/../release/bins
LIBS += -lCTKCore -lCTKPluginFramework
} }
win32 { win32 {
...@@ -21,7 +26,9 @@ win32 { ...@@ -21,7 +26,9 @@ win32 {
} }
HEADERS += \ HEADERS += \
../include/application/fm_singleton.h ../include/application/fm_singleton.h \
monitorwrapper.h
SOURCES += \ SOURCES += \
fmp_app.cpp fmp_app.cpp \
monitorwrapper.cpp
#include <fmp_manager_i.h> #include <fmp_manager_i.h>
#include "fmp_logger_i.h"
#include <QDebug> #include <QDebug>
#include <QPluginLoader> #include <QPluginLoader>
#include <QSettings> #include <QSettings>
#include <QDir> #include <QDir>
#include <QDirIterator> #include <QDirIterator>
#include <qtservice.h> #include <qtservice.h>
#include <QProcess>
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#include <Windows.h> #include <Windows.h>
...@@ -15,6 +17,7 @@ ...@@ -15,6 +17,7 @@
#include "../application/fm_singleton.h" #include "../application/fm_singleton.h"
#include "../fmp_settings/fmp_settings_def.h" #include "../fmp_settings/fmp_settings_def.h"
#include "monitorwrapper.h"
class FMPAppService : public QtService<FMSingleApplication> class FMPAppService : public QtService<FMSingleApplication>
{ {
...@@ -64,7 +67,7 @@ private: ...@@ -64,7 +67,7 @@ private:
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
QString app_path = QString::fromLocal8Bit(argv[0]); QString app_path = QString::fromLocal8Bit(argv[0]);
app_path.replace("\\", "/"); app_path.replace("\\", "/");
QString app_dir = app_path.section("/", 0, -2); QString app_dir = app_path.section("/", 0, -2);
QString app_name = app_path.section("/", -1); QString app_name = app_path.section("/", -1);
...@@ -78,6 +81,11 @@ int main(int argc, char** argv) ...@@ -78,6 +81,11 @@ int main(int argc, char** argv)
return svc->exec(); return svc->exec();
#else #else
svc.start(); svc.start();
//先启动FMDbMonitor.exe
MonitorWrapper mw(app_path);
mw.StartMonitor();
return qApp->exec(); return qApp->exec();
#endif #endif
} }
......
#include "monitorwrapper.h"
#include "fmp_logger_i.h"
#include "fmp_home_i.h"
#include <QDebug>
#include <QApplication>
MonitorWrapper::MonitorWrapper(QString appPath, QObject *parent)
: QObject(parent)
{
this->appPath = appPath;
process.setProgram(this->appPath + "/../../monitor/FMDbMonitor.exe");
connect(&process, SIGNAL(started()), this, SLOT(StartSuccess()));
connect(&process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartFailed(QProcess::ProcessError)));
}
MonitorWrapper::~MonitorWrapper()
{
process.kill();
}
void MonitorWrapper::StartMonitor()
{
process.start();
}
void MonitorWrapper::StartSuccess()
{
FMP_ERROR() << QString::fromLocal8Bit("FMDbMonitor 启动成功");
}
void MonitorWrapper::StartFailed(QProcess::ProcessError)
{
FMP_ERROR() << QString::fromLocal8Bit("FMDbMonitor 发生错误. ") << process.errorString();
process.kill();
qApp->exit();
}
\ No newline at end of file
#ifndef MONITORWRAPPER_H
#define MONITORWRAPPER_H
#include <QObject>
#include <QProcess>
//该类用来管理FMDbMonitor.exe的启动和退出
class MonitorWrapper : public QObject
{
Q_OBJECT
public:
explicit MonitorWrapper(QString appPath, QObject *parent = 0);
~MonitorWrapper();
void StartMonitor();
private slots:
void StartSuccess();
void StartFailed(QProcess::ProcessError);
private:
QString appPath;
QProcess process;
};
#endif // MONITORWRAPPER_H
...@@ -4,8 +4,8 @@ log4j.appender.fa.File = ${FMP_APP}/log/fmp.log ...@@ -4,8 +4,8 @@ log4j.appender.fa.File = ${FMP_APP}/log/fmp.log
log4j.appender.fa.MaxFileSize=512KB log4j.appender.fa.MaxFileSize=512KB
log4j.appender.fa.MaxBackupIndex=10 log4j.appender.fa.MaxBackupIndex=10
log4j.appender.fa.layout = org.apache.log4j.PatternLayout log4j.appender.fa.layout = org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n log4j.appender.fa.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n%n
log4j.appender.ca = org.apache.log4j.ConsoleAppender log4j.appender.ca = org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout = org.apache.log4j.PatternLayout log4j.appender.ca.layout = org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n log4j.appender.ca.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n%n
...@@ -113,11 +113,10 @@ QJsonObject FMPRedeem::Reverse(QJsonObject request) ...@@ -113,11 +113,10 @@ QJsonObject FMPRedeem::Reverse(QJsonObject request)
return retJson; return retJson;
} }
QJsonObject FMPRedeem::Redeem(const double needPay, const QJsonArray& productsInfo) QJsonObject FMPRedeem::Redeem(const QJsonArray& productsInfo)
{ {
FMP_DEBUG() << "Recv redeem data: " << QJsonDocument(productsInfo).toJson(QJsonDocument::Compact); FMP_DEBUG() << "Recv redeem data: " << QJsonDocument(productsInfo).toJson(QJsonDocument::Compact);
_products_info = productsInfo; _products_info = productsInfo;
_needPay = needPay;
//读取门店信息 //读取门店信息
QString apppath = QCoreApplication::applicationDirPath(); QString apppath = QCoreApplication::applicationDirPath();
QSettings settings(QString("%1/FreemudPOS.ini").arg(apppath), QSettings::IniFormat); QSettings settings(QString("%1/FreemudPOS.ini").arg(apppath), QSettings::IniFormat);
...@@ -252,58 +251,53 @@ QJsonObject FMPRedeem::ShowForUnConsum(QJsonObject json) ...@@ -252,58 +251,53 @@ QJsonObject FMPRedeem::ShowForUnConsum(QJsonObject json)
_redeem_json["operator_id"] = _operator_id; _redeem_json["operator_id"] = _operator_id;
_redeem_json["business_date"] = QDate::currentDate().toString("yyyyMMdd"); _redeem_json["business_date"] = QDate::currentDate().toString("yyyyMMdd");
if( couponType == 0){ //商品券 if( couponType == 0){ //商品券
if(!IsContinue(SearchJsonObject(json, "paid").toInt()))
{
QJsonObject result;
result["statusCode"] = FM_API_WINDOWCLOSE;
result["msg"] = QString::fromLocal8Bit("窗口关闭");
return result;
}
QJsonObject transaction; QJsonObject transaction;
QJsonArray transactions; QJsonArray transactions;
transaction["code"] = coupon; transaction["code"] = coupon;
transaction["ebcode"] = ebcode; transaction["ebcode"] = ebcode;
//得到该券所对应商品id,目前一张券只对应一种商品 //根据服务端返回的可适用商品信息,校验pos请求中的商品信息是否匹配
QString canUsedProduct = SearchJsonObject(json, "pid").toString(); QJsonArray redeemProducts;
int seq = 1;
//遍历传入的商品信息,查找是否有相同的商品id, QJsonArray posProducts = _products_info;
//若有则进行核销,否则,直接返回失败 QJsonArray serverProducts = SearchJsonObject(json, "products").toArray();
int i; for(int i = 0; i < serverProducts.size(); i++)
for(i = 0; i < _products_info.size(); i++){ {
QJsonObject obj = _products_info[i].toObject(); QJsonObject serverProduct = serverProducts[i].toObject();
if(obj["pid"].toString() == canUsedProduct) QString serverPid = SearchJsonObject(serverProduct, "pid").toString();
break; int serverNum = SearchJsonObject(serverProduct, "number").toInt();
for(int i = 0; i < posProducts.size(); i++)
{
QJsonObject posProduct = posProducts[i].toObject();
QString posPid = SearchJsonObject(posProduct, "pid").toString();
int posNum = SearchJsonObject(posProduct, "consume_num").toInt();
if(posPid == serverPid)
{
QJsonObject redeemProduct;
redeemProduct.insert("seq", seq);
redeemProduct.insert("pid", posPid);
//redeemProduct.insert("consume_num", posNum);
redeemProduct.insert("consume_num", qMin(serverNum, posNum)); //目前,一张券兑换一个商品
redeemProducts.append(redeemProduct);
seq++;
break;
}
}
} }
if(i >= _products_info.size())
if(redeemProducts.isEmpty())
{ {
//不存在对应商品 //不存在对应商品
return ShowForMismatch(json); return ShowForMismatch(json);
} }
QJsonArray products; transaction["products"] = redeemProducts;
QJsonObject product;
product.insert("seq", 1);
product.insert("pid", _products_info[i].toObject()["pid"]);
//product.insert("consume_num", _products_info[i].toObject()["consume_num"]);
product.insert("consume_num", 1);
products.append(product);
transaction["products"] = products;
transactions.append(transaction); transactions.append(transaction);
_redeem_json["transactions"] = transactions; _redeem_json["transactions"] = transactions;
} }
if( couponType == 1){ //代金券 if( couponType == 1){ //代金券
if(!IsContinue(SearchJsonObject(json, "amount").toInt()))
{
QJsonObject result;
result["statusCode"] = FM_API_WINDOWCLOSE;
result["msg"] = QString::fromLocal8Bit("窗口关闭");
return result;
}
QJsonObject transaction; QJsonObject transaction;
transaction["code"] = coupon; transaction["code"] = coupon;
transaction["ebcode"] = ebcode; transaction["ebcode"] = ebcode;
...@@ -332,12 +326,12 @@ QJsonObject FMPRedeem::ShowForUnConsum(QJsonObject json) ...@@ -332,12 +326,12 @@ QJsonObject FMPRedeem::ShowForUnConsum(QJsonObject json)
{ {
redeemResult["discount"] = SearchJsonObject(json, "paid").toInt(); redeemResult["discount"] = SearchJsonObject(json, "paid").toInt();
redeemResult["pid"] = SearchJsonObject(json, "pid").toString(); redeemResult["pid"] = SearchJsonObject(json, "pid").toString();
redeemResult["couponType"] = "20004"; redeemResult["couponType"] = "0";
} }
else if(couponType == 1) //代金券 else if(couponType == 1) //代金券
{ {
redeemResult["discount"] = SearchJsonObject(json, "amount").toInt(); redeemResult["discount"] = SearchJsonObject(json, "amount").toInt();
redeemResult["couponType"] = "20003"; redeemResult["couponType"] = "1";
} }
redeemResult["couponDesc"] = act_name; redeemResult["couponDesc"] = act_name;
redeemResult["code"] = coupon; redeemResult["code"] = coupon;
...@@ -383,7 +377,8 @@ QJsonObject FMPRedeem::ShowForExpird(QJsonObject json) ...@@ -383,7 +377,8 @@ QJsonObject FMPRedeem::ShowForExpird(QJsonObject json)
QJsonObject FMPRedeem::ShowForErr(QJsonObject json) QJsonObject FMPRedeem::ShowForErr(QJsonObject json)
{ {
int statusCode = json["statusCode"].toInt(); int statusCode = json["statusCode"].toInt();
ErrCodeDialog::showForErr(_coupon, QString("error: ").append(QString::number(statusCode))); QString msg = json["msg"].toString();
ErrCodeDialog::showForErr(_coupon, QString("%1: %2").arg(QString::number(statusCode)).arg(msg));
return json; return json;
} }
...@@ -403,23 +398,23 @@ QJsonObject FMPRedeem::GetRedeemJson() const ...@@ -403,23 +398,23 @@ QJsonObject FMPRedeem::GetRedeemJson() const
bool FMPRedeem::IsContinue(int couponAmount) bool FMPRedeem::IsContinue(int couponAmount)
{ {
if(_needPay < couponAmount/100.0) // if(_needPay < couponAmount/100.0)
{ // {
//如果卡券抵扣额已大于待付金额,则给出警告提示 // //如果卡券抵扣额已大于待付金额,则给出警告提示
QMessageBox msg; // QMessageBox msg;
msg.setWindowTitle(QString::fromLocal8Bit("警告")); // msg.setWindowTitle(QString::fromLocal8Bit("警告"));
msg.setText(QString::fromLocal8Bit("卡券总额已超出应付金额!是否继续?")); // msg.setText(QString::fromLocal8Bit("卡券总额已超出应付金额!是否继续?"));
msg.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel); // msg.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel);
msg.setIcon(QMessageBox::Warning); // msg.setIcon(QMessageBox::Warning);
//msg.setWindowModality(Qt::ApplicationModal); // //msg.setWindowModality(Qt::ApplicationModal);
msg.setWindowFlags(msg.windowFlags() | Qt::WindowStaysOnTopHint); // msg.setWindowFlags(msg.windowFlags() | Qt::WindowStaysOnTopHint);
msg.setAttribute(Qt::WA_QuitOnClose, false); // msg.setAttribute(Qt::WA_QuitOnClose, false);
int choice = msg.exec(); // int choice = msg.exec();
if(choice != QMessageBox::Yes) // if(choice != QMessageBox::Yes)
{ // {
return false; // return false;
} // }
} // }
return true; return true;
} }
......
...@@ -29,7 +29,7 @@ public: ...@@ -29,7 +29,7 @@ public:
explicit FMPRedeem(const FMPContext context); explicit FMPRedeem(const FMPContext context);
virtual ~FMPRedeem(); virtual ~FMPRedeem();
QJsonObject Redeem(const double needPay, const QJsonArray& productsInfo); //券码核销 QJsonObject Redeem(const QJsonArray& productsInfo); //券码核销
QJsonObject Reverse(QJsonObject request); QJsonObject Reverse(QJsonObject request);
QJsonObject GetRedeemJson()const; QJsonObject GetRedeemJson()const;
...@@ -55,7 +55,6 @@ private: ...@@ -55,7 +55,6 @@ private:
QJsonValue SearchJsonArray(QJsonArray& searchJson, QString searchKey); QJsonValue SearchJsonArray(QJsonArray& searchJson, QString searchKey);
private: private:
bool _inited; bool _inited;
double _needPay;
QString _store_id; QString _store_id;
QString _station_id; QString _station_id;
QString _operator_id; QString _operator_id;
......
...@@ -20,7 +20,7 @@ public: ...@@ -20,7 +20,7 @@ public:
connect(this, &FMPRedeemInterface::TriggerUninit, this, &FMPRedeemInterface::OnTriggerUninit); connect(this, &FMPRedeemInterface::TriggerUninit, this, &FMPRedeemInterface::OnTriggerUninit);
} }
virtual QJsonObject Redeem(const double needPay, const QJsonArray& productsInfo) = 0; //券码核销 virtual QJsonObject Redeem(const QJsonArray& productsInfo) = 0; //券码核销
virtual QJsonObject Reverse(QJsonObject request) = 0; //卡券冲正 virtual QJsonObject Reverse(QJsonObject request) = 0; //卡券冲正
virtual QJsonObject GetRedeemJson()const = 0; virtual QJsonObject GetRedeemJson()const = 0;
......
...@@ -4,8 +4,8 @@ log4j.appender.fa.File = ${FMP_APP}/log/fmp.log ...@@ -4,8 +4,8 @@ log4j.appender.fa.File = ${FMP_APP}/log/fmp.log
log4j.appender.fa.MaxFileSize=512KB log4j.appender.fa.MaxFileSize=512KB
log4j.appender.fa.MaxBackupIndex=10 log4j.appender.fa.MaxBackupIndex=10
log4j.appender.fa.layout = org.apache.log4j.PatternLayout log4j.appender.fa.layout = org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n log4j.appender.fa.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n%n
log4j.appender.ca = org.apache.log4j.ConsoleAppender log4j.appender.ca = org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout = org.apache.log4j.PatternLayout log4j.appender.ca.layout = org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n log4j.appender.ca.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}[%-5p]%F:%L %m %n%n
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