Commit 5fc70a5d by NitefullWind

1. 限制每个账户的最多可充值金额。 2. 删除了使用积分功能。 3. 删除读卡器相关代码。

parent 68f5b16a
......@@ -36,8 +36,7 @@ SOURCES += main.cpp\
backup/resend.cpp \
fmvipdispatcher.cpp \
fmnetwork.cpp \
windows/fmnumpad.cpp \
entityCard/reader.cpp
windows/fmnumpad.cpp
HEADERS += \
task/fmtask.h \
......@@ -65,9 +64,7 @@ HEADERS += \
fmnetwork.h \
readcfg.hpp \
reader.h \
windows/fmnumpad.h \
entityCard/readcfg.h \
entityCard/reader.h
windows/fmnumpad.h
FORMS += windows/forms/fmcouponwidget.ui \
windows/forms/fmloading.ui \
......@@ -78,7 +75,7 @@ FORMS += windows/forms/fmcouponwidget.ui \
windows/forms/fmvippanel.ui \
windows/forms/fmnumpad.ui
INCLUDEPATH += ../FMVipDC/ ./task ./windows ./backup ./entityCard
INCLUDEPATH += ../FMVipDC/ ./task ./windows ./backup
SUBDIRS += \
../FMVipDC/FMVipDC.pro
......@@ -87,12 +84,10 @@ CONFIG(debug, debug|release) {
DESTDIR = $$PWD/../FMVipTest/Debug
TARGET = fmvip
LIBS += -L..\FMVipTest\Debug -lFMVipDC
LIBS += -L..\FMVipTest\Debug -lfm_mwrf32
} else {
DESTDIR = $$PWD/../FMVipTest/Release
TARGET = fmvip
LIBS += -L..\FMVipTest\Release -lFMVipDC
LIBS += -L..\FMVipTest\Release -lfm_mwrf32
}
QMAKE_LFLAGS += -static-libstdc++ -static-libgcc -static -lpthread
......
#ifndef READCFG_HPP
#define READCFG_HPP
#include <QDebug>
#include <QString>
#include <QVariantMap>
#include <QSettings>
#include <QCoreApplication>
class ReadCfg
{
public:
static bool readvalueforkey(const QString &cfgfilename, const QString &section, const QString &key, QString &value)
{
QString path = qApp->applicationDirPath() + "/" + cfgfilename;
qDebug() << "read cfg file path:" << path;
auto *configIniRead = new QSettings(path, QSettings::IniFormat);
configIniRead->setIniCodec("utf-8");
QString akey = "/" + section + "/" + key;
value = configIniRead->value(akey).toString();
delete configIniRead;
return value == "" ? false : true;
}
static bool readvalueforheadlist(const QString &cfgfilename, const QString &section, QVariantMap &value)
{
QString path = qApp->applicationDirPath() + "/" + cfgfilename;
QSettings *configIniRead = new QSettings(path, QSettings::IniFormat);
configIniRead->setIniCodec("utf-8");
QString akey = "/" + section + "/" + "headlist";
QStringList keylist = configIniRead->value(akey).toString().split(",");
if(keylist.size() == 0 || keylist[0] == "")
{
qDebug() << QString("read %1 file %2 section for headlist failed").arg(path).arg(section);
return false;
}
foreach (auto key, keylist)
{
QString tmpkey = "/" + section + "/" + key;
if(configIniRead->value(tmpkey).toString() != "")
value.insert(key, configIniRead->value(tmpkey).toString());
}
delete configIniRead;
return (value.size() == 0)? false : true;
}
};
#endif // READCFG_HPP
#include "reader.h"
Reader* Reader::instance()
{
static Reader reader;
return &reader;
}
Reader::Reader(QObject *parent) : QObject(parent)
{
s_end = true;
s_initsuc = false;
_isDefaultPassword = false;
s_reader = NULL;
this->moveToThread(&m_thread);
m_thread.start();
QVariantMap map;
bool isOk = ReadCfg::readvalueforheadlist(CFG_FILENAME, CFG_SECTION_READER, map);
if(isOk) {
s_readerCfg.Port = map.value(CFG_READER_PORT).toInt();
s_readerCfg.Baud = map.value(CFG_READER_BAUD).toInt();
s_readerCfg.Section = map.value(CFG_READER_SECTION).toInt();
s_readerCfg.Password = map.value(CFG_READER_PWD).toString();
s_readerCfg.PasswordDefault = map.value(CFG_READER_PWD_DEFAULT).toString();
qDebug() << "Read values: " << s_readerCfg.Port << s_readerCfg.Baud << s_readerCfg.Section << s_readerCfg.Password << s_readerCfg.PasswordDefault;
} else {
qDebug() << "Read value for head list failed.";
}
}
Reader::~Reader()
{
disconnectReader();
}
bool Reader::readVipNO()
{
QString vipNo;
QString error;
QString uuid;
while(s_end && (!ReadCard(s_reader, s_readerCfg.Section, vipNo, uuid , error) || _isDefaultPassword))
{
// 如果是用默认密码读卡,则进行激活操作
if(_isDefaultPassword) {
emit needActivate();
qDebug() << tr("修改卡[%1]密码").arg(uuid);
while(s_end && !ActivateCard(s_reader, s_readerCfg.Section, s_readerCfg.Password, error)) {
}
emit activateFinished();
_isDefaultPassword = false;
connectReader();
break;
}
if(error == ReaderError.ConnectedError || error == ReaderError.PasswordError) {
qDebug() << "Readcard failed: " << error;
if(error == ReaderError.PasswordError) {
_isDefaultPassword = true;
}
connectReader();
}
Sleep(500);
}
if(!s_end)
{
condition.wakeAll();
return false;
}
qDebug() << __FUNCTION__ << vipNo << uuid;
emit getVipNO(vipNo, uuid);
return true;
}
void Reader::connectReader()
{
qDebug() << "son:" <<QThread::currentThreadId() << "s_initsuc:" << s_initsuc << "s_reader: " << s_reader;
bool sign = true;
QString error;
if(s_end)
{
if(s_initsuc) {
DisConnectDevice(s_reader);
}
int tryTimes = 3;
do
{
if(sign)
{
if(_isDefaultPassword) {
sign = ConnectDevice(s_readerCfg.Port,
s_readerCfg.Baud,
s_readerCfg.Section,
s_readerCfg.PasswordDefault,
s_reader,
error);
} else {
sign = ConnectDevice(s_readerCfg.Port,
s_readerCfg.Baud,
s_readerCfg.Section,
s_readerCfg.Password,
s_reader,
error);
}
}
if(!sign) {
s_reader = NULL;
qDebug() << "Connect reader device failed: " << error;
}
else
s_initsuc = sign;
Sleep(500);
}while(s_end && !sign && --tryTimes);
}
}
void Reader::disconnectReader()
{
s_end = false;
mutex.lock();
if(!condition.wait(&mutex, 2*1000))
{
m_thread.terminate();
m_thread.wait();
}
if(s_initsuc || s_reader > 0)
{
DisConnectDevice(s_reader);
s_reader = NULL;
s_initsuc = false;
}
mutex.unlock();
}
//bool Reader::activateCard()
//{
// bool sign = false;
// QString error;
// if(s_initsuc) {
// sign = ActivateCard(s_reader, s_readerCfg.Section, s_readerCfg.Password, error);
// }
// if(!sign) {
// qDebug() << "Activate card failed: " << error;
// }
// return sign;
//}
#ifndef READER_H
#define READER_H
#include "global.h"
#include "readcfg.h"
#include "../fmvip_card_reader/fm_mwrf32/fm_mwrf32.h"
#include <QMutex>
#include <QString>
#include <QObject>
#include <QThread>
#include <QWaitCondition>
#include <windows.h>
class Reader : public QObject
{
Q_OBJECT
public:
static Reader* instance();
void connectReader();
void resetEnd() {s_end = false;}
~Reader();
// 读卡器错误
struct {
QString ConnectedError = "open device failed";
QString PasswordError = "check password failure";
} ReaderError;
// 读卡器配置
struct ReaderCfg{
int Port;
int Baud;
int Section;
QString Password;
QString PasswordDefault;
};
private:
Reader(QObject *parent = 0);
private:
bool s_end;
bool s_initsuc;
bool _isDefaultPassword;
QMutex mutex;
QWaitCondition condition;
HANDLE s_reader;
QThread m_thread;
ReaderCfg s_readerCfg;
signals:
void getVipNO(QString VipNO, QString uuid);
void needActivate();
void activateFinished();
public slots:
void disconnectReader();
bool readVipNO();
// bool activateCard();
};
#endif // READER_H
......@@ -91,6 +91,7 @@ struct{
const QString Member_type = "member_type";
const QString IsActive = "is_active";
const QString Inner_code = "inner_code";
const QString Recharge_value = "recharge_value";
const QString Name = "name";
const QString Birthday = "birthday";
......@@ -224,15 +225,4 @@ typedef unsigned int FMError;
#define MAX(a,b) ((a<b) ? b : a)
#define DOUBLE_STR(num) QString::number((num), 'f', 2)
extern bool g_init_reader_flg;
//
#define CFG_FILENAME "FMVip.cfg"
#define CFG_SECTION_READER "Reader"
#define CFG_READER_PORT "port"
#define CFG_READER_SECTION "section"
#define CFG_READER_BAUD "baud"
#define CFG_READER_PWD "password"
#define CFG_READER_PWD_DEFAULT "password_default"
#endif // GLOBAL_H
......@@ -2,13 +2,8 @@
#include "fmvipdispatcher.h"
#include "fmsockserver.h"
#include "resend.h"
#include "reader.h"
#include "include/fmutils/fmutils.hpp"
#include <QWidget>
#include "reader.h"
//global.h 中声明 读卡器是否初始化||初始化是否成功标识
bool g_init_reader_flg = false;
void customMessageHandler(QtMsgType,const QMessageLogContext& , const QString&);
bool checkOnly();
......@@ -25,9 +20,6 @@ int main(int argc, char *argv[])
qInstallMessageHandler(customMessageHandler);
// 连接读卡器
// Reader::instance()->connectReader();
QWidget w;
w.show();
w.close();
......
......@@ -77,6 +77,7 @@ void TaskLogin::onLogin()
session()->addData(PosProps.Score, getServerJsonValue(PosProps.Score).toInt());
session()->addData(PosProps.Score_value, getServerJsonValue(PosProps.Score_value).toInt());
session()->addData(PosProps.IsActive, getServerJsonValue(PosProps.IsActive).toInt());
session()->addData(PosProps.Recharge_value, getServerJsonValue(PosProps.Recharge_value).toInt());
closeWindow();
}
}
......
......@@ -6,7 +6,6 @@
#include "fmmsgwnd.h"
#include <QJsonDocument>
#include <QJsonObject>
#include "reader.h"
TaskManage::TaskManage(QJsonObject &jsonObj, QObject *parent):
FMTask(jsonObj, FM_Manage, 0, parent),
......
#include "taskothers.h"
#include "reader.h"
/// 优惠券查询
TaskCoupon::TaskCoupon(QJsonObject &jsonObj, Session *session, QObject *parent)
......
......@@ -2,6 +2,7 @@
//#include "fmvipforward.h"
#include "ui_fmvipfund.h"
#include "fmnumpad.h"
#include "fmmsgwnd.h"
FMVipFund::FMVipFund(QDialog *parent) :
FMVipWnd(parent),
......@@ -40,6 +41,16 @@ void FMVipFund::initWnd(Session *session)
double amount = session->data(PosProps.Amount).toInt() / 100.0;
double max_recharge = session->data(PosProps.Recharge_value).toInt() / 100.0;
for (auto &btn : _digit_group->buttons()) {
QString digit = btn->text();
digit = digit.replace("¥", "");
if(digit.toDouble() > max_recharge) {
btn->setText(QString("该账户最多充值\n %1 元").arg(max_recharge));
btn->setEnabled(false);
}
}
QString show_amount_str = QString::number(amount, 'f', 2);
ui->operator_label->setText(operator_id);
......
#ifndef FMVIPFUND_H
#ifndef FMVIPFUND_H
#define FMVIPFUND_H
#include "fmvipwnd.h"
......
......@@ -6,7 +6,6 @@
#include <QTimer>
#include "fmloading.h"
#include "fmnumpad.h"
//#include "reader.h"
FMVipLogin::FMVipLogin(QDialog *parent) :
FMVipWnd(parent),
......@@ -14,11 +13,6 @@ FMVipLogin::FMVipLogin(QDialog *parent) :
{
numpad = NULL;
ui->setupUi(this);
// connect(this, &FMVipLogin::startreader, Reader::instance(), &Reader::readVipNO);
// connect(Reader::instance(), &Reader::getVipNO, this, &FMVipLogin::readVipNO);
// connect(Reader::instance(), &Reader::needActivate, this, &FMVipLogin::onNeedActivate);
// connect(Reader::instance(), &Reader::activateFinished, this, &FMVipLogin::onActivateFinished);
// emit startreader();
ui->login_edit->setFocus();
autoLoginTimer.setSingleShot(true);
autoLoginTimer.setInterval(100);
......@@ -94,7 +88,7 @@ void FMVipLogin::initWnd(Session *session)
session->addData(PosProps.Member_sign, member_sign.mid(0, 16));
ui->login_edit->setText(member_sign.mid(0, 16));
autoLoginTimer.start();
} else {
} else if(!member_sign.isEmpty()) {
qDebug() << "fmv:会员账号格式错误: " << member_sign;
}
}
......
......@@ -55,7 +55,7 @@ void FMVipOrder::initWnd(Session *session)
initCouponItems();
ui->pay_chk->setText(QString("使用积分抵用 %1 元").arg(orderInfo->getScoreAmount()));
// ui->pay_chk->setText(QString("使用积分抵用 %1 元").arg(orderInfo->getScoreAmount()));
if(standard_amount > 0) {
ui->standard_label->setText(QString("满 %1 元可享受储值金满额优惠").arg(standard_amount));
......@@ -83,31 +83,55 @@ void FMVipOrder::on_pay_btn_clicked()
emit pay();
}
void FMVipOrder::on_pay_chk_clicked(bool checked)
{
int is = checked ? 1 : 0;
session()->addData(ServerProps(PosProps.IsUseScore), is);
orderInfo->setUseScore(checked);
setWillPayText();
}
//void FMVipOrder::on_pay_chk_clicked(bool checked)
//{
// int is = checked ? 1 : 0;
// session()->addData(ServerProps(PosProps.IsUseScore), is);
// orderInfo->setUseScore(checked);
// setWillPayText();
//}
void FMVipOrder::onItemClicked(QListWidgetItem *item)
{
QString code = item->data(Qt::UserRole).toString();
// 如果代金券已被选中则取消,否则选中
if(orderInfo->selectCouponMap.contains(code)) {
ui->coupon_page->itemWidget(item)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-left: 5 solid rgb(255, 170, 37);}");
orderInfo->selectCouponMap.remove(code);
orderInfo->enoughCoupon(); // 计算一下当前代金券金额
}else{
QString newItemCode = item->data(Qt::UserRole).toString();
QString oldItemCode = "";
if(!orderInfo->selectCouponMap.isEmpty()) {
oldItemCode = orderInfo->selectCouponMap.firstKey();
};
// 将原来选中的代金券置为未选中状态,从选中map中移除
for(int i=0; i<ui->coupon_page->count(); ++i) {
auto tempItem = ui->coupon_page->item(i);
if(tempItem->data(Qt::UserRole).toString() == oldItemCode) {
ui->coupon_page->itemWidget(tempItem)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-left: 5 solid rgb(255, 170, 37);}");
orderInfo->selectCouponMap.remove(oldItemCode);
orderInfo->enoughCoupon(); // 计算一下当前代金券金额
}
}
if(newItemCode != oldItemCode) {
ui->coupon_page->itemWidget(item)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-image: url(:/coupon_select.png);}");
orderInfo->selectCouponMap[code] = orderInfo->couponMap()[code];
orderInfo->selectCouponMap[newItemCode] = orderInfo->couponMap()[newItemCode];
if(orderInfo->enoughCoupon())
{
FMMsgWnd::WarningWnd("请注意代金券总额已超过待付金额!");
}
}
// QString code = item->data(Qt::UserRole).toString();
// // 如果代金券已被选中则取消,否则选中
// if(orderInfo->selectCouponMap.contains(code)) {
// ui->coupon_page->itemWidget(item)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-left: 5 solid rgb(255, 170, 37);}");
// orderInfo->selectCouponMap.remove(code);
// orderInfo->enoughCoupon(); // 计算一下当前代金券金额
// }else{
// ui->coupon_page->itemWidget(item)->setStyleSheet("#FMCouponWidget{background-color: rgb(255, 255, 255); border: none; border-image: url(:/coupon_select.png);}");
// orderInfo->selectCouponMap[code] = orderInfo->couponMap()[code];
// if(orderInfo->enoughCoupon())
// {
// FMMsgWnd::WarningWnd("请注意代金券总额已超过待付金额!");
// }
// }
setWillPayText();
}
......
......@@ -27,7 +27,7 @@ signals:
public slots:
void on_pay_btn_clicked();
void on_pay_chk_clicked(bool checked);
// void on_pay_chk_clicked(bool checked);
void on_clean_numpad();
void onItemClicked(QListWidgetItem*);
......
......@@ -459,7 +459,7 @@ QPushButton#fund_btn:hover {
</size>
</property>
<property name="text">
<string>100</string>
<string>0</string>
</property>
<property name="readOnly">
<bool>true</bool>
......
......@@ -839,16 +839,6 @@ font: 13px &quot;微软雅黑&quot;;
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="pay_chk">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text">
<string>使用积分最多可抵用 0 元</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
......@@ -947,7 +937,6 @@ font: 13px &quot;微软雅黑&quot;;
<tabstop>coupon_prev_btn</tabstop>
<tabstop>close_btn</tabstop>
<tabstop>pay_key</tabstop>
<tabstop>pay_chk</tabstop>
</tabstops>
<resources/>
<connections/>
......
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