Commit 6c703210 by NitefullWind

1. 增加"确认充值信息"接口,充值后30秒POS未确认自动冲正。

parent f3e0e6c9
...@@ -41,7 +41,8 @@ SOURCES += main.cpp\ ...@@ -41,7 +41,8 @@ SOURCES += main.cpp\
windows/itemdelegate.cpp \ windows/itemdelegate.cpp \
fmprinter.cpp \ fmprinter.cpp \
fmsetting.cpp \ fmsetting.cpp \
windows/fmvipsetting.cpp windows/fmvipsetting.cpp \
task/taskconfirmrecharge.cpp
HEADERS += \ HEADERS += \
task/fmtask.h \ task/fmtask.h \
...@@ -74,7 +75,8 @@ HEADERS += \ ...@@ -74,7 +75,8 @@ HEADERS += \
windows/itemdelegate.h \ windows/itemdelegate.h \
fmprinter.h \ fmprinter.h \
fmsetting.h \ fmsetting.h \
windows/fmvipsetting.h windows/fmvipsetting.h \
task/taskconfirmrecharge.h
FORMS += \ FORMS += \
windows/forms/fmloading.ui \ windows/forms/fmloading.ui \
......
#include <QMenu> #include <QMenu>
#include <QAction> #include <QAction>
#include <QTimer> #include <QTimer>
#include <QJsonDocument>
#include <winsock2.h> #include <winsock2.h>
#include "fmvipdispatcher.h" #include "fmvipdispatcher.h"
#include "fmtask.h" #include "fmtask.h"
#include "taskfactory.h" #include "taskfactory.h"
#include "fmvipsetting.h" #include "fmvipsetting.h"
#include "taskothers.h"
#include "fmprinter.h"
FMVipDispatcher::FMVipDispatcher(QObject *parent) : FMVipDispatcher::FMVipDispatcher(QObject *parent) :
QObject(parent), QObject(parent),
FMApiRelay(), FMApiRelay(),
_posSocketTimer(new QTimer(this)), _posSocketTimer(new QTimer(this)),
_confirmRechageTimer(new QTimer(this)),
fmTask(nullptr) fmTask(nullptr)
{ {
connect(this, SIGNAL(doTask()), this, SLOT(onDoTask())); connect(this, SIGNAL(doTask()), this, SLOT(onDoTask()));
...@@ -19,11 +23,15 @@ FMVipDispatcher::FMVipDispatcher(QObject *parent) : ...@@ -19,11 +23,15 @@ FMVipDispatcher::FMVipDispatcher(QObject *parent) :
connect(_posSocketTimer, SIGNAL(timeout()), SLOT(onCheckSocket())); connect(_posSocketTimer, SIGNAL(timeout()), SLOT(onCheckSocket()));
connect(this, SIGNAL(startSocketTimer()), _posSocketTimer, SLOT(start())); connect(this, SIGNAL(startSocketTimer()), _posSocketTimer, SLOT(start()));
connect(this, SIGNAL(stopSocketTimer()), _posSocketTimer, SLOT(stop())); connect(this, SIGNAL(stopSocketTimer()), _posSocketTimer, SLOT(stop()));
connect(_confirmRechageTimer, SIGNAL(timeout()), this, SLOT(onConfirmRechageTimeOut()));
_confirmRechageTimer->setSingleShot(true);
} }
FMVipDispatcher::~FMVipDispatcher() FMVipDispatcher::~FMVipDispatcher()
{ {
del_p(_posSocketTimer); del_p(_posSocketTimer);
del_p(_confirmRechageTimer);
} }
BOOL FMVipDispatcher::Transfer(LPSTR data, LPSTR &rsp, UINT &rsp_len) BOOL FMVipDispatcher::Transfer(LPSTR data, LPSTR &rsp, UINT &rsp_len)
...@@ -55,8 +63,56 @@ void FMVipDispatcher::onDoTask() ...@@ -55,8 +63,56 @@ void FMVipDispatcher::onDoTask()
if (fmTask == nullptr) { if (fmTask == nullptr) {
rspData = "{\"msg:\":\"未知的请求类型\"}"; rspData = "{\"msg:\":\"未知的请求类型\"}";
} else if(fmTask->FM_Type() == FM_Confirm_Recharge){
QJsonObject rspObj;
if(backupReqObj.empty() || backupReqObj[PosProps.Fm_id] != fmTask->getPosJsonValue(PosProps.Fm_id)) {
QString msg = "未备份该充值订单或非码订单号不一致.";
qDebug() << msg;
rspObj[PosProps.RechargeStatus] = FM_API_ERROR;
rspObj[PosProps.Msg] = msg;
} else {
if(fmTask->getPosJsonValue(PosProps.RechargeStatus).toInt() == FM_API_SUCCESS) {
QString print = backupReqObj[PosProps.Print].toString();
if(FMPrinter::Print(print)) {
rspObj[PosProps.RechargeStatus] = FM_API_SUCCESS;
} else {
qDebug() << "打印小票失败.";
rspObj[PosProps.RechargeStatus] = FM_API_ERROR;
rspObj[PosProps.Msg] = "打印小票失败";
}
_confirmRechageTimer->stop(); // 停止计时
} else {
qDebug() << "POS回执不正确,自动冲正上一笔充值.";
rspObj[PosProps.RechargeStatus] = fmTask->getPosJsonValue(PosProps.RechargeStatus).toInt();
onConfirmRechageTimeOut();
_confirmRechageTimer->stop(); // 停止计时
}
}
rspObj[PosProps.StatusCode] = FM_API_SUCCESS;
rspObj[PosProps.Prompt] = 0;
rspObj[PosProps.Fm_id] = fmTask->getPosJsonValue(PosProps.Fm_id).toString();
QJsonDocument doc(rspObj);
rspData = doc.toJson(QJsonDocument::Compact);
backupReqObj = QJsonObject();
} else { } else {
rspData = fmTask->doTask(); rspData = fmTask->doTask();
if(fmTask->FM_Type() == FM_Manage) {
QJsonObject posRspJsonObj = *(fmTask->getPosRspJsonObj());
if(!posRspJsonObj.empty() && posRspJsonObj.contains(PosProps.FundInfo)) {
backupReqObj = *(fmTask->getPosReqJsonObj());
backupReqObj[PosProps.TransId] = fmTask->session()->data(PosProps.TransId).toString();
backupReqObj[PosProps.Fm_id] = fmTask->session()->data(PosProps.Fm_id).toString();
backupReqObj[PosProps.Print] = fmTask->session()->data(PosProps.Print).toString();
// 启动定时器,30秒后对该充值订单进行冲正
if(_confirmRechageTimer->isActive()) {
onConfirmRechageTimeOut();
_confirmRechageTimer->stop();
}
_confirmRechageTimer->start(30000);
}
}
} }
qDebug() << "Send to pos: " << QString::fromUtf8(rspData); qDebug() << "Send to pos: " << QString::fromUtf8(rspData);
qDebug() << "==============="; qDebug() << "===============";
...@@ -136,3 +192,16 @@ void FMVipDispatcher::onSetting() ...@@ -136,3 +192,16 @@ void FMVipDispatcher::onSetting()
FMVipSetting settingWnd; FMVipSetting settingWnd;
settingWnd.exec(); settingWnd.exec();
} }
void FMVipDispatcher::onConfirmRechageTimeOut()
{
if(!backupReqObj.empty()) {
qDebug() << "冲正备份的请求:" << backupReqObj;
FMTask *reversalTask = new TaskRefundOrder(backupReqObj, this);
reversalTask->doTask();
reversalTask->deleteLater();
backupReqObj = QJsonObject();
} else {
qDebug() << "备份的请求为空,未执行冲正.";
}
}
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <QMutex> #include <QMutex>
#include <QWaitCondition> #include <QWaitCondition>
#include <QSystemTrayIcon> #include <QSystemTrayIcon>
#include <QJsonObject>
#include "fmapirelay.h" #include "fmapirelay.h"
class FMTask; class FMTask;
...@@ -27,8 +28,10 @@ private: ...@@ -27,8 +28,10 @@ private:
QSystemTrayIcon _sysIcon; QSystemTrayIcon _sysIcon;
QTimer *_posSocketTimer; QTimer *_posSocketTimer;
QTimer *_confirmRechageTimer;
FMTask *fmTask; FMTask *fmTask;
QJsonObject backupReqObj;
protected: protected:
BOOL Transfer(LPSTR data, LPSTR &rsp, UINT &rsp_len); BOOL Transfer(LPSTR data, LPSTR &rsp, UINT &rsp_len);
...@@ -44,6 +47,8 @@ public slots: ...@@ -44,6 +47,8 @@ public slots:
void onCheckSocket(); void onCheckSocket();
void onDisconnected(); void onDisconnected();
void onConfirmRechageTimeOut();
}; };
#endif // FMVIPDISPATCHER_H #endif // FMVIPDISPATCHER_H
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
// 请求类型链表 // 请求类型链表
const static QStringList FM_Type_List = QString( const static QStringList FM_Type_List = QString(
"member_manage_request," "member_manage_request,"
"confirm_recharge_request,"
"member_check_request," "member_check_request,"
"order_request," "order_request,"
"integral_request," "integral_request,"
...@@ -22,6 +23,7 @@ const static QStringList FM_Type_List = QString( ...@@ -22,6 +23,7 @@ const static QStringList FM_Type_List = QString(
// 服务端请求类型 // 服务端请求类型
const static QStringList FM_Server_Type = QString( const static QStringList FM_Server_Type = QString(
"member_manage_request," "member_manage_request,"
"order_rechargeprint_request,"
"member_check_request," "member_check_request,"
"order_request," "order_request,"
"integral_request," "integral_request,"
...@@ -35,6 +37,7 @@ const static QStringList FM_Server_Type = QString( ...@@ -35,6 +37,7 @@ const static QStringList FM_Server_Type = QString(
// 请求类型的枚举值 // 请求类型的枚举值
enum FM_TYPE { enum FM_TYPE {
FM_Manage, FM_Manage,
FM_Confirm_Recharge, // 确认充值结果,获取打印信息
FM_Login, FM_Login,
FM_Pay, FM_Pay,
FM_Final, FM_Final,
...@@ -158,6 +161,7 @@ struct{ ...@@ -158,6 +161,7 @@ struct{
const QString AfterValue = "after_value"; const QString AfterValue = "after_value";
const QString FundInfo = "fund_info"; const QString FundInfo = "fund_info";
const QString Discount = "discount"; const QString Discount = "discount";
const QString RechargeStatus = "recharge_status";
// 卡激活锁定 // 卡激活锁定
const QString CardUUID = "CardUUID"; const QString CardUUID = "CardUUID";
......
#ifndef FMTASK_H #ifndef FMTASK_H
#define FMTASK_H #define FMTASK_H
#include "fmvipwnd.h" #include "fmvipwnd.h"
#include "fmmsgwnd.h" #include "fmmsgwnd.h"
...@@ -30,6 +30,7 @@ public: ...@@ -30,6 +30,7 @@ public:
QJsonValue getPosJsonValue(const QString prop); QJsonValue getPosJsonValue(const QString prop);
QString createTransId(); QString createTransId();
QJsonObject* getPosReqJsonObj() {return &posReqJsonObj;}
QJsonObject* getPosRspJsonObj() {return &posRspJsonObj;} QJsonObject* getPosRspJsonObj() {return &posRspJsonObj;}
protected: protected:
......
#include "taskconfirmrecharge.h"
TaskConfirmRecharge::TaskConfirmRecharge(QJsonObject &jsonObj, QObject *parent):
FMTaskNoWnd(jsonObj, FM_Confirm_Recharge, 0, parent)
{
}
void TaskConfirmRecharge::packageServerReq()
{
}
void TaskConfirmRecharge::packagePOSRsp()
{
}
#ifndef TASKCONFIRMRECHARGE_H
#define TASKCONFIRMRECHARGE_H
#include "fmtasknownd.h"
// 整单退款
class TaskConfirmRecharge : public FMTaskNoWnd
{
Q_OBJECT
public:
explicit TaskConfirmRecharge(QJsonObject &jsonObj, QObject *parent = 0);
void packageServerReq();
void packagePOSRsp();
};
#endif // TASKCONFIRMRECHARGE_H
#include "taskfactory.h" #include "taskfactory.h"
#include "tasklogin.h" #include "tasklogin.h"
#include "taskpay.h" #include "taskpay.h"
#include "taskmanage.h" #include "taskmanage.h"
#include "taskfinal.h" #include "taskfinal.h"
#include "taskothers.h" #include "taskothers.h"
#include "taskconfirmrecharge.h"
#include "global.h" #include "global.h"
#include "fmmsgwnd.h" #include "fmmsgwnd.h"
#include <QJsonDocument> #include <QJsonDocument>
...@@ -51,6 +52,10 @@ FMTask* TaskFactory::Task(QByteArray data) ...@@ -51,6 +52,10 @@ FMTask* TaskFactory::Task(QByteArray data)
task = new TaskRefundOrder(jsonObj); task = new TaskRefundOrder(jsonObj);
break; break;
} }
case FM_Confirm_Recharge: {
task = new TaskConfirmRecharge(jsonObj);
break;
}
default: default:
break; break;
} }
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#include "fmvipfund.h" #include "fmvipfund.h"
#include "tasklogin.h" #include "tasklogin.h"
#include "taskothers.h" #include "taskothers.h"
#include "fmprinter.h"
#include <QDateTime> #include <QDateTime>
TaskFund::TaskFund(QJsonObject &jsonObj, Session* session, QObject *parent) TaskFund::TaskFund(QJsonObject &jsonObj, Session* session, QObject *parent)
...@@ -65,6 +64,7 @@ void TaskFund::onFund() ...@@ -65,6 +64,7 @@ void TaskFund::onFund()
posReqJsonObj[PosProps.TransId] = serverReqJsonObj[ServerProps(PosProps.TransId)]; posReqJsonObj[PosProps.TransId] = serverReqJsonObj[ServerProps(PosProps.TransId)];
FMTask *reversalTask = new TaskRefundOrder(posReqJsonObj, this); FMTask *reversalTask = new TaskRefundOrder(posReqJsonObj, this);
reversalTask->doTask(); reversalTask->doTask();
reversalTask->deleteLater();
} }
QString msg = "充值失败:\n" + errorString(); QString msg = "充值失败:\n" + errorString();
FMMsgWnd::FailureWnd(msg); FMMsgWnd::FailureWnd(msg);
...@@ -72,8 +72,9 @@ void TaskFund::onFund() ...@@ -72,8 +72,9 @@ void TaskFund::onFund()
QString msg = "充值失败:\n" + getServerJsonValue(PosProps.Msg).toString(); QString msg = "充值失败:\n" + getServerJsonValue(PosProps.Msg).toString();
FMMsgWnd::FailureWnd(msg); FMMsgWnd::FailureWnd(msg);
} else { } else {
QString print = getServerJsonValue(PosProps.Print).toString(); session()->addData(PosProps.Fm_id, getServerJsonValue(PosProps.Fm_id));
FMPrinter::Print(print); session()->addData(PosProps.Print, getServerJsonValue(PosProps.Print));
session()->addData(PosProps.TransId, getServerJsonValue(PosProps.TransId));
int before_value = getServerJsonValue(PosProps.BeforeValue).toInt(); int before_value = getServerJsonValue(PosProps.BeforeValue).toInt();
int after_value = getServerJsonValue(PosProps.AfterValue).toInt(); int after_value = getServerJsonValue(PosProps.AfterValue).toInt();
QString before_value_str = DOUBLE_STR(before_value/100.0); QString before_value_str = DOUBLE_STR(before_value/100.0);
......
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