Commit 56b36951 by gujin.wang

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

parent 5370b406
......@@ -9,11 +9,16 @@ TEMPLATE = app
INCLUDEPATH += $$PWD/../include/ctk \
$$PWD/../include/interface \
#Library path
LIBS += -L$$PWD/../lib
CONFIG(debug, debug|release) {
DESTDIR = $$PWD/../debug/bins
LIBS += -lCTKCored -lCTKPluginFrameworkd
}
else {
DESTDIR = $$PWD/../release/bins
LIBS += -lCTKCore -lCTKPluginFramework
}
win32 {
......@@ -21,7 +26,9 @@ win32 {
}
HEADERS += \
../include/application/fm_singleton.h
../include/application/fm_singleton.h \
monitorwrapper.h
SOURCES += \
fmp_app.cpp
fmp_app.cpp \
monitorwrapper.cpp
#include <fmp_manager_i.h>
#include "fmp_logger_i.h"
#include <QDebug>
#include <QPluginLoader>
#include <QSettings>
#include <QDir>
#include <QDirIterator>
#include <qtservice.h>
#include <QProcess>
#ifdef Q_OS_WIN
#include <Windows.h>
......@@ -15,6 +17,7 @@
#include "../application/fm_singleton.h"
#include "../fmp_settings/fmp_settings_def.h"
#include "monitorwrapper.h"
class FMPAppService : public QtService<FMSingleApplication>
{
......@@ -78,6 +81,11 @@ int main(int argc, char** argv)
return svc->exec();
#else
svc.start();
//先启动FMDbMonitor.exe
MonitorWrapper mw(app_path);
mw.StartMonitor();
return qApp->exec();
#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
log4j.appender.fa.MaxFileSize=512KB
log4j.appender.fa.MaxBackupIndex=10
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.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)
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);
_products_info = productsInfo;
_needPay = needPay;
//读取门店信息
QString apppath = QCoreApplication::applicationDirPath();
QSettings settings(QString("%1/FreemudPOS.ini").arg(apppath), QSettings::IniFormat);
......@@ -253,57 +252,52 @@ QJsonObject FMPRedeem::ShowForUnConsum(QJsonObject json)
_redeem_json["business_date"] = QDate::currentDate().toString("yyyyMMdd");
if( couponType == 0){ //商品券
if(!IsContinue(SearchJsonObject(json, "paid").toInt()))
{
QJsonObject result;
result["statusCode"] = FM_API_WINDOWCLOSE;
result["msg"] = QString::fromLocal8Bit("窗口关闭");
return result;
}
QJsonObject transaction;
QJsonArray transactions;
transaction["code"] = coupon;
transaction["ebcode"] = ebcode;
//得到该券所对应商品id,目前一张券只对应一种商品
QString canUsedProduct = SearchJsonObject(json, "pid").toString();
//根据服务端返回的可适用商品信息,校验pos请求中的商品信息是否匹配
QJsonArray redeemProducts;
int seq = 1;
QJsonArray posProducts = _products_info;
QJsonArray serverProducts = SearchJsonObject(json, "products").toArray();
for(int i = 0; i < serverProducts.size(); i++)
{
QJsonObject serverProduct = serverProducts[i].toObject();
QString serverPid = SearchJsonObject(serverProduct, "pid").toString();
int serverNum = SearchJsonObject(serverProduct, "number").toInt();
//遍历传入的商品信息,查找是否有相同的商品id,
//若有则进行核销,否则,直接返回失败
int i;
for(i = 0; i < _products_info.size(); i++){
QJsonObject obj = _products_info[i].toObject();
if(obj["pid"].toString() == canUsedProduct)
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);
}
QJsonArray products;
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;
transaction["products"] = redeemProducts;
transactions.append(transaction);
_redeem_json["transactions"] = transactions;
}
if( couponType == 1){ //代金券
if(!IsContinue(SearchJsonObject(json, "amount").toInt()))
{
QJsonObject result;
result["statusCode"] = FM_API_WINDOWCLOSE;
result["msg"] = QString::fromLocal8Bit("窗口关闭");
return result;
}
QJsonObject transaction;
transaction["code"] = coupon;
transaction["ebcode"] = ebcode;
......@@ -332,12 +326,12 @@ QJsonObject FMPRedeem::ShowForUnConsum(QJsonObject json)
{
redeemResult["discount"] = SearchJsonObject(json, "paid").toInt();
redeemResult["pid"] = SearchJsonObject(json, "pid").toString();
redeemResult["couponType"] = "20004";
redeemResult["couponType"] = "0";
}
else if(couponType == 1) //代金券
{
redeemResult["discount"] = SearchJsonObject(json, "amount").toInt();
redeemResult["couponType"] = "20003";
redeemResult["couponType"] = "1";
}
redeemResult["couponDesc"] = act_name;
redeemResult["code"] = coupon;
......@@ -383,7 +377,8 @@ QJsonObject FMPRedeem::ShowForExpird(QJsonObject json)
QJsonObject FMPRedeem::ShowForErr(QJsonObject json)
{
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;
}
......@@ -403,23 +398,23 @@ QJsonObject FMPRedeem::GetRedeemJson() const
bool FMPRedeem::IsContinue(int couponAmount)
{
if(_needPay < couponAmount/100.0)
{
//如果卡券抵扣额已大于待付金额,则给出警告提示
QMessageBox msg;
msg.setWindowTitle(QString::fromLocal8Bit("警告"));
msg.setText(QString::fromLocal8Bit("卡券总额已超出应付金额!是否继续?"));
msg.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel);
msg.setIcon(QMessageBox::Warning);
//msg.setWindowModality(Qt::ApplicationModal);
msg.setWindowFlags(msg.windowFlags() | Qt::WindowStaysOnTopHint);
msg.setAttribute(Qt::WA_QuitOnClose, false);
int choice = msg.exec();
if(choice != QMessageBox::Yes)
{
return false;
}
}
// if(_needPay < couponAmount/100.0)
// {
// //如果卡券抵扣额已大于待付金额,则给出警告提示
// QMessageBox msg;
// msg.setWindowTitle(QString::fromLocal8Bit("警告"));
// msg.setText(QString::fromLocal8Bit("卡券总额已超出应付金额!是否继续?"));
// msg.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel);
// msg.setIcon(QMessageBox::Warning);
// //msg.setWindowModality(Qt::ApplicationModal);
// msg.setWindowFlags(msg.windowFlags() | Qt::WindowStaysOnTopHint);
// msg.setAttribute(Qt::WA_QuitOnClose, false);
// int choice = msg.exec();
// if(choice != QMessageBox::Yes)
// {
// return false;
// }
// }
return true;
}
......
......@@ -29,7 +29,7 @@ public:
explicit FMPRedeem(const FMPContext context);
virtual ~FMPRedeem();
QJsonObject Redeem(const double needPay, const QJsonArray& productsInfo); //券码核销
QJsonObject Redeem(const QJsonArray& productsInfo); //券码核销
QJsonObject Reverse(QJsonObject request);
QJsonObject GetRedeemJson()const;
......@@ -55,7 +55,6 @@ private:
QJsonValue SearchJsonArray(QJsonArray& searchJson, QString searchKey);
private:
bool _inited;
double _needPay;
QString _store_id;
QString _station_id;
QString _operator_id;
......
......@@ -20,7 +20,7 @@ public:
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 GetRedeemJson()const = 0;
......
......@@ -4,8 +4,8 @@ log4j.appender.fa.File = ${FMP_APP}/log/fmp.log
log4j.appender.fa.MaxFileSize=512KB
log4j.appender.fa.MaxBackupIndex=10
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.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