Commit fc9ca9f7 by gujin.wang

完成退款功能

parent c906f78f
...@@ -14,6 +14,7 @@ FMPePay::FMPePay(const FMPContext ctx) ...@@ -14,6 +14,7 @@ FMPePay::FMPePay(const FMPContext ctx)
_databasename(DEFAULT_EPAY_DATABASENAME), _databasename(DEFAULT_EPAY_DATABASENAME),
_table(DEFAULT_EPAY_TABLE), _table(DEFAULT_EPAY_TABLE),
_redeem_table(DEFAULT_REDEEM_TABLE), _redeem_table(DEFAULT_REDEEM_TABLE),
_vip_table(DEFAULT_VIP_TABLE),
_businessdate(QDateTime::currentDateTime().toString("yyyy-MM-dd")), _businessdate(QDateTime::currentDateTime().toString("yyyy-MM-dd")),
_ordershelflife(DEFAULT_EPAY_ORDERLIFE), _ordershelflife(DEFAULT_EPAY_ORDERLIFE),
_operator_id(DEFAULT_EPAY_OPTID), _operator_id(DEFAULT_EPAY_OPTID),
......
...@@ -41,7 +41,8 @@ private: ...@@ -41,7 +41,8 @@ private:
QString _url; QString _url;
QString _databasename; QString _databasename;
QString _table; QString _table;
QString _redeem_table; QString _redeem_table; //存放卡券核销详情
QString _vip_table;
QString _businessdate; QString _businessdate;
QString _store_id; QString _store_id;
QString _station_id; QString _station_id;
......
...@@ -18,6 +18,11 @@ public: ...@@ -18,6 +18,11 @@ public:
QVariant d = QSqlTableModel::data(idx,role); QVariant d = QSqlTableModel::data(idx,role);
return d.toString().toFloat() / 100; return d.toString().toFloat() / 100;
} }
if(idx.column() == 17 && role == Qt::DisplayRole){
QVariant d = QSqlTableModel::data(idx, role);
return d.toString().toFloat()/100;
}
if ((idx.column() == 12) && role == Qt::DisplayRole) { if ((idx.column() == 12) && role == Qt::DisplayRole) {
QVariant d = QSqlTableModel::data(idx,role); QVariant d = QSqlTableModel::data(idx,role);
......
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
#define DEFAULT_EPAY_DATABASENAME "fmp_test.db" #define DEFAULT_EPAY_DATABASENAME "fmp_test.db"
#define DEFAULT_EPAY_TABLE "fmp_pay" #define DEFAULT_EPAY_TABLE "fmp_pay"
#define DEFAULT_REDEEM_TABLE "fmp_redeem" #define DEFAULT_REDEEM_TABLE "fmp_redeem"
#define DEFAULT_VIP_TABLE "fmp_vip"
#define DEFAULT_EPAY_CONNECTNAME "fmp_pay_connect" #define DEFAULT_EPAY_CONNECTNAME "fmp_pay_connect"
#define DEFAULT_EPAY_ORDERLIFE 60 #define DEFAULT_EPAY_ORDERLIFE 60
#define DEFAULT_EPAY_STRID "99999" #define DEFAULT_EPAY_STRID "99999"
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <QFuture> #include <QFuture>
#include <QTcpSocket> #include <QTcpSocket>
#include <QHostAddress> #include <QHostAddress>
#include <QSqlError>
#include <QSqlQuery> #include <QSqlQuery>
#include <fmp_home_i.h> #include <fmp_home_i.h>
...@@ -56,7 +56,7 @@ FMPePayPrivate::FMPePayPrivate(FMPePay *parent) ...@@ -56,7 +56,7 @@ FMPePayPrivate::FMPePayPrivate(FMPePay *parent)
{ {
_db = new FMPDataBase(q->_databasename); _db = new FMPDataBase(q->_databasename);
QString sql = "create table " + q->_table + " (" QString sql = "create table if not exists" + q->_table + " ("
"fmId varchar(40), " "fmId varchar(40), "
"code varchar(40), " "code varchar(40), "
"pay_transId varchar(40), " "pay_transId varchar(40), "
...@@ -74,16 +74,15 @@ FMPePayPrivate::FMPePayPrivate(FMPePay *parent) ...@@ -74,16 +74,15 @@ FMPePayPrivate::FMPePayPrivate(FMPePay *parent)
"statusCode integer," "statusCode integer,"
"operator_id varchar(40)," "operator_id varchar(40),"
"addtime TIMESTAMP default (datetime('now', 'localtime'))," "addtime TIMESTAMP default (datetime('now', 'localtime')),"
"pay_total integer," "pay_total integer"
"PRIMARY KEY (trans_id)"
")"; ")";
FMP_INFO() << " creat table sql:" << sql; FMP_INFO() << " creat table sql:" << sql;
if(_db->creat(sql) == false) if(_db->creat(sql) == false)
{ {
FMP_WARN() << "creat table fmp_pay failed"; FMP_WARN() << "creat table " + q->_table + " failed";
} }
sql = "create table " + q->_redeem_table + "(" sql = "create table if not exists" + q->_redeem_table + "("
"trans_id varchar(40)," "trans_id varchar(40),"
"pay_id varchar(50)," "pay_id varchar(50),"
"code varchar(20)," "code varchar(20),"
...@@ -94,7 +93,19 @@ FMPePayPrivate::FMPePayPrivate(FMPePay *parent) ...@@ -94,7 +93,19 @@ FMPePayPrivate::FMPePayPrivate(FMPePay *parent)
FMP_INFO() << "create table sql: " << sql; FMP_INFO() << "create table sql: " << sql;
if(_db->creat(sql) == false) if(_db->creat(sql) == false)
{ {
FMP_WARN() << "create table fmp_redeem failed"; FMP_WARN() << "create table " + q->_redeem_table + " failed";
}
sql = "create table if not exists" + q->_vip_table + "("
"trans_id varchar(40),"
"pay_id varchar(50),"
"code varchar(20),"
"pid varchar(20),"
"total_amount integer)";
FMP_INFO() << "create table sql: " << sql;
if(_db->creat(sql) == false)
{
FMP_WARN() << "create table " + q->_vip_table + " failed";
} }
} }
...@@ -362,7 +373,12 @@ QByteArray FMPePayPrivate::DockPayRespond() ...@@ -362,7 +373,12 @@ QByteArray FMPePayPrivate::DockPayRespond()
if (_origin_response.contains("ext")) { if (_origin_response.contains("ext")) {
pay_ch["ext"] = _origin_response["ext"]; pay_ch["ext"] = _origin_response["ext"];
} }
pay_channels.append(pay_ch);
//只有卡券支付时,不存在微信/支付宝支付方式
if(!_origin_response["fmId"].toString().isEmpty())
{
pay_channels.append(pay_ch);
}
//添加卡券支付详情 //添加卡券支付详情
foreach (QJsonObject result, _payDialog->_redeem_results) { foreach (QJsonObject result, _payDialog->_redeem_results) {
...@@ -662,142 +678,302 @@ void FMPePayPrivate::GetApiReqMode(int type) ...@@ -662,142 +678,302 @@ void FMPePayPrivate::GetApiReqMode(int type)
_model->select(); _model->select();
} }
void FMPePayPrivate::ControlRefundJson(const QJsonObject &trans) void FMPePayPrivate::ControlVipRefundJson(const QJsonObject &trans)
{ {
_origin_response = QJsonObject(); _origin_response = QJsonObject();
FMP_INFO() << "RefundJson trans: " << trans; FMP_INFO() << "RefundJson trans: " << trans;
QtConcurrent::run( [&, trans, this ]() QtConcurrent::run([&, trans, this]{
{
Q_Q(FMPePay); Q_Q(FMPePay);
QStringList keylist; QStringList keylist;
QSqlQuery query; QSqlQuery query;
keylist.append(SQL_KEY_EBCODE); qDebug() << trans["trans_id"].toString();
keylist.append(SQL_KEY_TRANSID); if(!_db->find(q->_table, query, keylist, QString("trans_id='%1'").arg(trans["trans_id"].toString())) || !query.next())
bool dock_success = false; {
if(_reverse_flag) { emit error(QString::fromLocal8Bit("交易记录不存在"));
emit error(QString::fromLocal8Bit("网络连接异常(冲正...)")); return;
return ;
} }
QString payTransId = trans[FMP_JKEY_PAY_TRANSID].toString(); QJsonObject posRequest;
QString fmTransId = trans[FMP_JKEY_FM_ORDERID].toString(); posRequest["pos_ver"] = 1;
QJsonObject t = trans; posRequest["operator_id"] = q->_operator_id;
if (!payTransId.isEmpty()) { posRequest["fm_cmd"] = 1004;
if(!_db->find(q->_table, query, keylist, QString(QString(SQL_KEY_PAYTRANSID) + " = '%1'").arg(payTransId)) || !query.next()) { posRequest["pos_id"] = q->_station_id;
emit error(QString::fromLocal8Bit("交易记录不存在")); posRequest["store_id"] = q->_store_id;
return; posRequest["business_date"] = QDate::currentDate().toString("yyyyMMdd");
} QJsonObject transactions;
else { transactions["refund_amount"] = query.value("total_amount").toInt();
t[FMP_JKEY_PAY_EBCODE] = query.value(0).toString(); transactions["fm_id"] = query.value("fmId").toString();
t[FMP_JKEY_POS_TRANSID] = query.value(1).toString(); transactions["trans_id"] = trans["trans_id"].toString();
} posRequest["transactions"] = transactions;
posRequest["from_pay"] = 1;
QByteArray reqData = QJsonDocument(posRequest).toJson();
QTcpSocket socket;
socket.connectToHost(QHostAddress::LocalHost, 23770);
if(!socket.waitForConnected())
{
FMP_ERROR() << QString::fromLocal8Bit("发送会员退单请求失败: ") << socket.errorString();
emit error(socket.errorString());
return;
} }
if(socket.write(reqData) <= 0)
if(!GetRefundJson(t)) { {
emit error(QString::fromLocal8Bit("获取门店信息失败")); FMP_ERROR() << QString::fromLocal8Bit("发送会员退单请求失败: ") << socket.errorString();
emit error(socket.errorString());
return; return;
} }
if(!socket.waitForBytesWritten())
FMP_INFO() << "refund json : " << _docked_request; {
FMP_ERROR() << QString::fromLocal8Bit("发送会员退单请求失败: ") << socket.errorString();
QString errors; emit error(socket.errorString());
return;
}
if(!socket.waitForReadyRead())
{
FMP_ERROR() << QString::fromLocal8Bit("接收会员退单请求失败: ") << socket.errorString();
emit error(socket.errorString());
return;
}
QByteArray resArray = socket.readAll();
socket.disconnectFromHost();
socket.close();
QJsonObject resJson = QJsonDocument::fromJson(resArray).object();
if(resJson["statusCode"].toInt() != 100)
{
FMP_ERROR() << QString::fromLocal8Bit("会员退单请求失败: ") << resJson["msg"].toString();
emit error(resJson["msg"].toString());
return;
}
QJsonObject outjson; QJsonObject outjson;
outjson[SQL_KEY_PAYID] = QString::fromLocal8Bit("非码会员支付");
if(!HttpPost(outjson, _docked_request ,errors, q->_time_out)) { outjson[SQL_KEY_FMID] = query.value("fmId").toString();
emit error(errors); outjson[SQL_KEY_PAYTRANSID] = resJson["memberTransId"].toString();
_origin_response = outjson; outjson[SQL_KEY_TOTALAMOUNT] = query.value("total_amount").toInt();
//修改客户数据库
WritePosDatabase(trans["trans_id"].toString());
//修改本地sqlite数据库
QVariantHash hash;
hash.insert(SQL_KEY_ISREFUND, true);
hash.insert(SQL_KEY_REFUND_DATE, QDateTime::currentDateTime().toString("yyyy-MM-dd"));
if(!_db->update(q->_table, hash, QString("trans_id = '%1' and fm_id='%2'").arg(trans["trans_id"].toString()).arg(transactions["fm_id"].toString())))
{
FMP_ERROR() << "refund data update failed";
} }
else {
dock_success = true; emit finished(outjson);
QVariantHash hash; FMP_INFO() << "finished(outjson)";
QSqlQuery tmpquery; });
QStringList tmpkeylist; }
tmpkeylist << SQL_KEY_PAYTRANSID << SQL_KEY_FMID << SQL_KEY_PAYID;
hash.insert(SQL_KEY_ISREFUND, true);
hash.insert(SQL_KEY_REFUND_DATE, QDateTime::currentDateTime().toString("yyyy-MM-dd"));
if(!_db->update(q->_table, hash, QString("pay_transId = '%1' or fmId = '%2'").arg(payTransId).arg(fmTransId)))
{
FMP_ERROR() << "refund data update failed";
}
if(!_db->find(q->_table, tmpquery, tmpkeylist, QString("pay_transId = '%1' or fmId = '%2'").arg(payTransId).arg(fmTransId)) || !tmpquery.next()) void FMPePayPrivate::ControlRefundJson(const QJsonObject &trans)
{ {
FMP_ERROR() << "refund data update failed"; _origin_response = QJsonObject();
FMP_INFO() << "RefundJson trans: " << trans;
outjson.insert(SQL_KEY_PAYTRANSID, payTransId); QtConcurrent::run([&, trans, this]{
outjson.insert(SQL_KEY_FMID, fmTransId); Q_Q(FMPePay);
outjson.insert(SQL_KEY_PAYID, QString::fromLocal8Bit("未知")); QStringList keylist;
outjson.insert(SQL_KEY_TOTALAMOUNT, trans[FMP_JKEY_REFUND_AMOUNT]); QSqlQuery query;
QString errors;
QJsonObject outjson;
bool dock_success = false;
QString payTransId = trans[FMP_JKEY_PAY_TRANSID].toString();
QString fmTransId = trans[FMP_JKEY_FM_ORDERID].toString();
QString transId = trans[FMP_JKEY_POS_TRANSID].toString();
if(!fmTransId.isEmpty()) //fm_id为空时,说明只有卡券支付
{
keylist.append(SQL_KEY_EBCODE);
keylist.append(SQL_KEY_TRANSID);
if(_reverse_flag) {
emit error(QString::fromLocal8Bit("网络连接异常(冲正...)"));
return ;
} }
else
{ QJsonObject t = trans;
outjson.insert(SQL_KEY_PAYTRANSID, tmpquery.value(0).toString()); if (!payTransId.isEmpty()) {
outjson.insert(SQL_KEY_FMID, tmpquery.value(1).toString()); if(!_db->find(q->_table, query, keylist, QString(QString(SQL_KEY_PAYTRANSID) + " = '%1'").arg(payTransId)) || !query.next()) {
outjson.insert(SQL_KEY_PAYID, tmpquery.value(2).toString()); emit error(QString::fromLocal8Bit("交易记录不存在"));
outjson.insert(SQL_KEY_TOTALAMOUNT, trans[FMP_JKEY_REFUND_AMOUNT]); return;
}
else {
t[FMP_JKEY_PAY_EBCODE] = query.value(0).toString();
t[FMP_JKEY_POS_TRANSID] = query.value(1).toString();
}
} }
FMP_INFO() << "refund success view json : " << outjson; if(!GetRefundJson(t)) {
emit error(QString::fromLocal8Bit("获取门店信息失败"));
if (_is_api) { return;
_origin_response = outjson;
} }
FMP_INFO() << "refund json : " << _docked_request;
//退款后冲正被核销的卡券 if(!HttpPost(outjson, _docked_request, errors, q->_time_out))
//先从fmp_pay表中根据fmId查找到 trans_id
tmpquery.clear();
if(!_db->find(q->_table, tmpquery, QStringList(), QString("fmId='%1'").arg(fmTransId)))
{ {
FMP_ERROR() << "cannot find the order's trans_id, coupon reversal failed"; emit error(errors);
_origin_response = outjson;
} }
else else
{ {
if(!tmpquery.first()) dock_success = true;
QVariantHash hash;
keylist.clear();
keylist << SQL_KEY_PAYTRANSID << SQL_KEY_FMID << SQL_KEY_PAYID;
hash.insert(SQL_KEY_ISREFUND, true);
hash.insert(SQL_KEY_REFUND_DATE, QDateTime::currentDateTime().toString("yyyy-MM-dd"));
if(!_db->update(q->_table, hash, QString("pay_transId = '%1' or fmId = '%2'").arg(payTransId).arg(fmTransId)))
{ {
FMP_ERROR() << "there is no such order."; FMP_ERROR() << "refund data update failed";
}
if(!_db->find(q->_table, query, /*keylist*/QStringList(), QString("pay_transId = '%1' or fmId = '%2'").arg(payTransId).arg(fmTransId)) || !query.next())
{
FMP_ERROR() << "refund data update failed";
outjson.insert(SQL_KEY_PAYTRANSID, payTransId);
outjson.insert(SQL_KEY_FMID, fmTransId);
outjson.insert(SQL_KEY_PAYID, QString::fromLocal8Bit("未知"));
outjson.insert(SQL_KEY_TOTALAMOUNT, trans[FMP_JKEY_REFUND_AMOUNT]);
} }
else else
{ {
QString transId = tmpquery.value("trans_id").toString(); outjson.insert(SQL_KEY_PAYTRANSID, query.value(0).toString());
tmpquery.clear(); outjson.insert(SQL_KEY_FMID, query.value(1).toString());
if(_db->find(q->_redeem_table, tmpquery, QStringList(), QString("trans_id='%1'").arg(transId))) outjson.insert(SQL_KEY_PAYID, query.value(2).toString());
outjson.insert(SQL_KEY_TOTALAMOUNT, trans[FMP_JKEY_REFUND_AMOUNT]);
}
//如果该笔支付使用的是微信,则调用会员退单结算
if(trans["pay_ebcode"].toString() == "10004")
{
QJsonObject posRequest;
posRequest["pos_ver"] = 1;
posRequest["operator_id"] = q->_operator_id;
posRequest["fm_cmd"] = 1004;
posRequest["pos_id"] = q->_station_id;
posRequest["store_id"] = q->_store_id;
posRequest["business_date"] = QDate::currentDate().toString("yyyyMMdd");
QJsonObject transactions;
transactions["refund_amount"] = query.value("total_amount").toInt();
transactions["fm_id"] = query.value("pay_transId").toString();
transactions["trans_id"] = trans["trans_id"].toString();
posRequest["transactions"] = transactions;
posRequest["from_pay"] = 1;
QByteArray reqData = QJsonDocument(posRequest).toJson();
FMP_DEBUG() << QString::fromLocal8Bit("会员退单结算: ") << reqData;
QTcpSocket socket;
socket.connectToHost(QHostAddress::LocalHost, 23770);
if(!socket.waitForConnected())
{
FMP_ERROR() << QString::fromLocal8Bit("发送会员退单请求失败: ") << socket.errorString();
emit error(socket.errorString());
return;
}
if(socket.write(reqData) <= 0)
{
FMP_ERROR() << QString::fromLocal8Bit("发送会员退单请求失败: ") << socket.errorString();
emit error(socket.errorString());
return;
}
if(!socket.waitForBytesWritten())
{
FMP_ERROR() << QString::fromLocal8Bit("发送会员退单请求失败: ") << socket.errorString();
emit error(socket.errorString());
return;
}
if(!socket.waitForReadyRead())
{ {
while(tmpquery.next()) FMP_ERROR() << QString::fromLocal8Bit("接收会员退单请求失败: ") << socket.errorString();
{ emit error(socket.errorString());
QByteArray redeemReq = tmpquery.value("redeem_json").toByteArray(); return;
QJsonParseError e;
QJsonDocument redeemDoc = QJsonDocument::fromJson(redeemReq, &e);
if(e.error != QJsonParseError::NoError)
{
FMP_ERROR() << e.errorString();
}
else
{
QJsonObject redeemObj = redeemDoc.object();
_payDialog->Reverse(redeemObj);
}
}
} }
else
QByteArray resArray = socket.readAll();
socket.disconnectFromHost();
socket.close();
QJsonObject resJson = QJsonDocument::fromJson(resArray).object();
if(resJson["statusCode"].toInt() != 100)
{ {
FMP_ERROR() << "search fmp_redeem table failed, or there is no relevant coupon need to reverse."; FMP_ERROR() << QString::fromLocal8Bit("会员退单请求失败: ") << resJson;
// emit error(resJson["msg"].toString());
// return;
} }
} }
FMP_INFO() << "refund success view json : " << outjson;
if (_is_api) {
_origin_response = outjson;
}
} }
emit finished(outjson);
FMP_INFO() << "finished(outjson)";
} }
int statusCode = 100;
//退款后冲正被核销的卡券(如果有的话)
if(_db->find(q->_redeem_table, query, QStringList(), QString("trans_id='%1'").arg(transId)))
{
while(query.next())
{
QByteArray redeemReq = query.value("redeem_json").toByteArray();
QJsonParseError e;
QJsonDocument redeemDoc = QJsonDocument::fromJson(redeemReq, &e);
if(e.error != QJsonParseError::NoError)
{
FMP_ERROR() << e.errorString();
statusCode = e.error;
}
else
{
QJsonObject redeemObj = redeemDoc.object();
_payDialog->Reverse(redeemObj);
}
}
}
else
{
FMP_ERROR() << "search fmp_redeem table failed, or there is no relevant coupon need to reverse.";
}
//修改客户数据库
WritePosDatabase(trans["trans_id"].toString());
if(fmTransId.isEmpty()) //只有卡券支付时,需自己构建返回的结果json
{
outjson[FMP_JKEY_FM_ORDERID] = transId;
outjson[SQL_KEY_PAYID] = QString::fromLocal8Bit("非码优惠券支付");
outjson[SQL_KEY_PAYTRANSID] = transId;
outjson[FMP_RPAY_PAY_RETURN_STATUSCODE] = statusCode;
outjson[SQL_KEY_TOTALAMOUNT] = trans["refund_amount"].toDouble()/100.0;
QVariantHash hash;
hash.insert(SQL_KEY_ISREFUND, true);
hash.insert(SQL_KEY_REFUND_DATE, QDateTime::currentDateTime().toString("yyyy-MM-dd"));
if(!_db->update(q->_table, hash, QString("trans_id = '%1'").arg(transId)))
{
FMP_ERROR() << "refund data update failed";
}
}
emit finished(outjson);
FMP_INFO() << "finished(outjson)";
if (!dock_success) { if (!dock_success) {
emit apiError(); emit apiError();
FMP_INFO() << "emit apiError()"; FMP_INFO() << "emit apiError()";
} }
}); });
FMP_INFO() << "Refund done"; FMP_INFO() << "Refund done";
} }
...@@ -827,7 +1003,7 @@ bool FMPePayPrivate::GetPayJson(const QString& sum, const QString& code) ...@@ -827,7 +1003,7 @@ bool FMPePayPrivate::GetPayJson(const QString& sum, const QString& code)
qDebug() << "get store infomation from settings"; qDebug() << "get store infomation from settings";
int ver = 2; int ver = 2;
qDebug() << q->_store_id;
transaction.insert(FMP_EPAY_TRANSTRACTION_CODE, code); transaction.insert(FMP_EPAY_TRANSTRACTION_CODE, code);
if (_is_api) { if (_is_api) {
QJsonObject origin_trans = _origin_request["transactions"].toObject(); QJsonObject origin_trans = _origin_request["transactions"].toObject();
...@@ -868,6 +1044,8 @@ bool FMPePayPrivate::GetPayJson(const QString& sum, const QString& code) ...@@ -868,6 +1044,8 @@ bool FMPePayPrivate::GetPayJson(const QString& sum, const QString& code)
_docked_request.insert( FMP_EPAY_TRANSTRACTION, transactionarry); _docked_request.insert( FMP_EPAY_TRANSTRACTION, transactionarry);
qDebug() << _docked_request;
return true; return true;
} }
...@@ -990,7 +1168,12 @@ void FMPePayPrivate::writeOrderToSqlite() ...@@ -990,7 +1168,12 @@ void FMPePayPrivate::writeOrderToSqlite()
if (_origin_response.contains("ext")) { if (_origin_response.contains("ext")) {
pay_ch["ext"] = _origin_response["ext"]; pay_ch["ext"] = _origin_response["ext"];
} }
pay_channels.append(pay_ch);
//只有卡券支付时,不存在微信/支付宝支付方式
if(!_origin_response["fmId"].toString().isEmpty())
{
pay_channels.append(pay_ch);
}
//添加卡券支付详情 //添加卡券支付详情
foreach (QJsonObject result, _payDialog->_redeem_results) { foreach (QJsonObject result, _payDialog->_redeem_results) {
...@@ -1014,8 +1197,15 @@ void FMPePayPrivate::writeOrderToSqlite() ...@@ -1014,8 +1197,15 @@ void FMPePayPrivate::writeOrderToSqlite()
FMP_ERROR() << "数据发送监控程序失败:" << json; FMP_ERROR() << "数据发送监控程序失败:" << json;
} }
} }
//只有卡券支付时,将total_amount字段置为卡券总金额
if(_origin_response["fmId"].toString().isEmpty())
{
_dbWrite["total_amount"] = _payDialog->_pay_total;
}
_dbWrite[FMP_EPAY_TRANSID]=_pos_trans_id; _dbWrite[FMP_EPAY_TRANSID]=_pos_trans_id;
_dbWrite["pay_total"] = _payDialog->_pay_total/100; //分->元 _dbWrite["pay_total"] = _payDialog->_pay_total;
if(_dbWrite[FMP_RPAY_PAY_RETURN_STATUSCODE].toInt() == 100){ if(_dbWrite[FMP_RPAY_PAY_RETURN_STATUSCODE].toInt() == 100){
if (!_db->isRecordExist(q->_table,_pos_trans_id)){ if (!_db->isRecordExist(q->_table,_pos_trans_id)){
_dbWrite[FMP_EPAY_OPERATORID] = _origin_request[FMP_EPAY_OPERATORID]; _dbWrite[FMP_EPAY_OPERATORID] = _origin_request[FMP_EPAY_OPERATORID];
...@@ -1032,7 +1222,6 @@ void FMPePayPrivate::writeOrderToSqlite() ...@@ -1032,7 +1222,6 @@ void FMPePayPrivate::writeOrderToSqlite()
QJsonObject origin_trans = _origin_request["transactions"].toObject(); QJsonObject origin_trans = _origin_request["transactions"].toObject();
_dbWrite["total_amount"]=origin_trans["order_amount"]; _dbWrite["total_amount"]=origin_trans["order_amount"];
_dbWrite["business_date"]=_origin_request["business_date"]; _dbWrite["business_date"]=_origin_request["business_date"];
//_dbWrite[FMP_EPAY_TRANSID] = _origin_request[FMP_EPAY_TRANSID];
_dbWrite[FMP_EPAY_OPERATORID] = _origin_request[FMP_EPAY_OPERATORID]; _dbWrite[FMP_EPAY_OPERATORID] = _origin_request[FMP_EPAY_OPERATORID];
_db->insert(q->_table, _dbWrite.toVariantHash()); _db->insert(q->_table, _dbWrite.toVariantHash());
} }
...@@ -1429,3 +1618,25 @@ QString FMPePayPrivate::final(QString fm_open_id) ...@@ -1429,3 +1618,25 @@ QString FMPePayPrivate::final(QString fm_open_id)
} }
return result; return result;
} }
void FMPePayPrivate::WritePosDatabase(QString transId)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
QString name = QString("driver={sql server};server=%1;database=%2;uid=%3;pwd=%4")
.arg("172.16.13.40").arg("kmcyV51").arg("sa").arg("");
db.setDatabaseName(name);
if(!db.open())
{
FMP_ERROR() << QString::fromLocal8Bit("退款后修改pos数据库失败: ") << db.lastError().text();
}
else
{
QSqlQuery query(db);
QString sql = QString("update d_t_food_Bill0 set bSettle=0,bUnsettle=1,eStatus='%1',cUnSettleMan_C=cSettleMan_C,cUnSettleMan=cSettleMan where bSettle =1 and cBill_C='%2'").arg(QString::fromLocal8Bit("付款")).arg(transId);
FMP_INFO() << QString::fromLocal8Bit("退款时修改pos数据库: ") << sql;
if(!query.exec(sql))
{
FMP_ERROR() << QString::fromLocal8Bit("退款后修改pos数据库失败: ") << query.lastError().text();
}
}
}
...@@ -45,6 +45,8 @@ public: ...@@ -45,6 +45,8 @@ public:
void ControlPayJson(QString sum, QString code); void ControlPayJson(QString sum, QString code);
void ControlRefundJson(const QJsonObject &trans); void ControlRefundJson(const QJsonObject &trans);
void ControlVipRefundJson(const QJsonObject &trans);
void GetCheckMode(QString sum); void GetCheckMode(QString sum);
...@@ -108,9 +110,11 @@ signals: ...@@ -108,9 +110,11 @@ signals:
protected slots: protected slots:
void witedata(); void witedata();
protected slots:
void payVip(); void payVip();
void vipFinal(); void vipFinal();
QString final(QString fm_open_id = QString()); QString final(QString fm_open_id = QString());
void WritePosDatabase(QString transId);
public: public:
......
...@@ -883,19 +883,17 @@ void FMPPayDialog::onBtnConfirmClicked() ...@@ -883,19 +883,17 @@ void FMPPayDialog::onBtnConfirmClicked()
{ {
QJsonObject fakeResponse; QJsonObject fakeResponse;
fakeResponse["statusCode"] = 100; fakeResponse["statusCode"] = 100;
fakeResponse["pay_acount"] = ""; fakeResponse["pay_account"] = "";
fakeResponse["pay_ebcode"] = ""; fakeResponse["pay_id"] = QString::fromLocal8Bit("非码优惠券支付");
fakeResponse["pay_id"] = QString::fromLocal8Bit("微信当面付[条码]");
fakeResponse["pay_transId"] = ""; fakeResponse["pay_transId"] = "";
fakeResponse["fmId"] = ""; fakeResponse["fmId"] = "";
fakeResponse["total_amount"] = 0; fakeResponse["total_amount"] = _pay_total;
fakeResponse["alipay_amount"] = 0; fakeResponse["alipay_amount"] = _pay_total;
fakeResponse["mcoupon_amount"] = 0; fakeResponse["mcoupon_amount"] = 0;
fakeResponse["invoice_amount"] = _pay_total; fakeResponse["invoice_amount"] = _pay_total;
fakeResponse["pay_total"] = _pay_total; fakeResponse["pay_total"] = _pay_total;
fakeResponse["pay_ebcode"] = "10004"; fakeResponse["pay_ebcode"] = "30000";
fakeResponse["isrefund"] = false; fakeResponse["isrefund"] = false;
qDebug() << fakeResponse;
_control->writeOrderToSqlite(fakeResponse); _control->writeOrderToSqlite(fakeResponse);
_control->finished(fakeResponse); _control->finished(fakeResponse);
return; return;
...@@ -1040,7 +1038,17 @@ void FMPPayDialog::on_pushButton_2_clicked() ...@@ -1040,7 +1038,17 @@ void FMPPayDialog::on_pushButton_2_clicked()
QJsonObject trans; QJsonObject trans;
trans["refund_amount"] = (int)((model->data(idx.sibling(idx.row(), 6)).toDouble() + 0.005) * 100); trans["refund_amount"] = (int)((model->data(idx.sibling(idx.row(), 6)).toDouble() + 0.005) * 100);
trans["fm_id"] = model->data(idx.sibling(idx.row(),0)).toString(); trans["fm_id"] = model->data(idx.sibling(idx.row(),0)).toString();
_control->ControlRefundJson(trans); trans["trans_id"] = model->record(idx.row()).value("trans_id").toString();
QString pay_ebcode = model->record(idx.row()).value("pay_ebcode").toString();
trans["pay_ebcode"]= pay_ebcode;
if(pay_ebcode == "1003")
{
_control->ControlVipRefundJson(trans);
}
else
{
_control->ControlRefundJson(trans);
}
_wait->show(); _wait->show();
} }
...@@ -1158,7 +1166,7 @@ void FMPPayDialog::redeem() ...@@ -1158,7 +1166,7 @@ void FMPPayDialog::redeem()
FMPRedeemInterface* redeem = FMP::GetService<FMPRedeemInterface>(); FMPRedeemInterface* redeem = FMP::GetService<FMPRedeemInterface>();
redeem->StartService(); redeem->StartService();
QJsonObject result = redeem->Redeem(needPay, _products_info); QJsonObject result = redeem->Redeem( _products_info);
FMP_DEBUG() << "redeem result: " << result; FMP_DEBUG() << "redeem result: " << result;
needPay -= result["discount"].toInt()/100.0; needPay -= result["discount"].toInt()/100.0;
ui->lineedit_num->setText(QString::number(qMax(0.0, needPay))); ui->lineedit_num->setText(QString::number(qMax(0.0, needPay)));
...@@ -1198,15 +1206,27 @@ void FMPPayDialog::ShowPayDetail(const QModelIndex &index) ...@@ -1198,15 +1206,27 @@ void FMPPayDialog::ShowPayDetail(const QModelIndex &index)
DetailDialog detailDlg(x, y, dis, this); DetailDialog detailDlg(x, y, dis, this);
//微信支付详情 QString transId = _control->model()->record(index.row()).value("trans_id").toString();
QSqlRecord record = _control->model()->record(index.row());
detailDlg.AddData(record);
//卡券支付详情
QString transId = record.value("trans_id").toString();
FMPDataBase* database = _control->GetDB(); FMPDataBase* database = _control->GetDB();
QSqlQuery query; QSqlQuery query;
if(!database->find(DEFAULT_REDEEM_TABLE, query, QStringList(), QString("trans_id=%1").arg(transId))) QSqlRecord record;
//微信/支付宝 支付详情
if(!database->find(DEFAULT_EPAY_TABLE, query, QStringList(), QString("trans_id='%1' and pay_ebcode!='%2' and pay_ebcode!='%3'").arg(transId).arg("30000").arg("1003")))
{
FMP_ERROR() << "query fmp_pay failed.";
}
else
{
while(query.next())
{
record = query.record();
detailDlg.AddData(record);
}
}
//卡券支付详情
if(!database->find(DEFAULT_REDEEM_TABLE, query, QStringList(), QString("trans_id='%1'").arg(transId)))
{ {
FMP_ERROR() << "query redeem info failed"; FMP_ERROR() << "query redeem info failed";
} }
...@@ -1214,10 +1234,25 @@ void FMPPayDialog::ShowPayDetail(const QModelIndex &index) ...@@ -1214,10 +1234,25 @@ void FMPPayDialog::ShowPayDetail(const QModelIndex &index)
{ {
while(query.next()) while(query.next())
{ {
QSqlRecord record = query.record(); record = query.record();
detailDlg.AddData(record); detailDlg.AddData(record);
} }
} }
//会员支付详情
if(!database->find(DEFAULT_VIP_TABLE, query, QStringList(), QString("trans_id='%1'").arg(transId)))
{
FMP_ERROR() << "query fmp_vip failed.";
}
else
{
while(query.next())
{
record = query.record();
detailDlg.AddData(record);
}
}
detailDlg.exec(); detailDlg.exec();
} }
...@@ -1235,14 +1270,24 @@ void FMPPayDialog::Reverse() ...@@ -1235,14 +1270,24 @@ void FMPPayDialog::Reverse()
redeem->StartService(); redeem->StartService();
foreach (QJsonObject obj, _reverses) foreach (QJsonObject obj, _reverses)
{ {
QSqlQuery query;
FMPDataBase* database = nullptr; FMPDataBase* database = nullptr;
QString coupon = obj["transactions"].toArray()[0].toObject()["code"].toString(); QString coupon = obj["transactions"].toArray()[0].toObject()["code"].toString();
QJsonObject result = redeem->Reverse(obj); QJsonObject result = redeem->Reverse(obj);
int statusCode = result["statusCode"].toInt(); int statusCode = result["statusCode"].toInt();
if(statusCode == 100) if(statusCode == 100)
{ {
//如果冲正成功,则从数据库中删除该券的核销记录 //先增加 本次消费金额 输入框的值(即冲正掉的金额)
database = _control->GetDB(); database = _control->GetDB();
if(database->find(DEFAULT_REDEEM_TABLE, query, QStringList(), QString("code='%1'").arg(coupon)))
{
FMP_ERROR() << QString::fromLocal8Bit("冲正时查询卡券金额失败. 券码:") << coupon;
}
double cur = ui->lineedit_num->text().toDouble();
cur += query.value("total_amount").toInt()/100.0;
ui->lineedit_num->setText(QString::number(cur));
//如果冲正成功,则从数据库中删除该券的核销记录
if(!database->dlt(DEFAULT_REDEEM_TABLE, "code="+coupon)) if(!database->dlt(DEFAULT_REDEEM_TABLE, "code="+coupon))
{ {
FMP_ERROR() << "delete from redeem_table failed. code=" << coupon; FMP_ERROR() << "delete from redeem_table failed. code=" << coupon;
......
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