完成消费功能(不包括写卡);修改充值函数,充值完成后输入金额框归零。

This commit is contained in:
Jingfan Ke 2024-07-30 23:36:27 +08:00
parent 8968bba852
commit 7fa59a9a5c
4 changed files with 226 additions and 4 deletions

View File

@ -49,3 +49,224 @@ void MainWindow::on_consumeInventoryButton_clicked()
ui->consumeCardIdBox->addItems(cardIdList);
}
}
/**
* @brief
*
* @param void
* @return void
* @details
*
*
*
* 50
* `deductCard`
* @author
* @date 2024-07-30
*/
void MainWindow::on_consumeButton_clicked()
{
if (!softwareReady())
{
QMessageBox::warning(this, QString("提示"), QString("数据库未连接,请设置。"));
if (ui->stackedWidget->currentWidget() != ui->settingPage)
{
ui->stackedWidget->setCurrentWidget(ui->settingPage);
}
return;
}
if (ui->consumeCardIdBox->currentIndex() == -1)
{
QMessageBox::warning(this, "提示", "请放置卡片并点击查询按钮。");
return;
}
QString cardId = ui->consumeCardIdBox->currentText();
int userId;
int cardStatus;
double originalBalance;
// 检查和获取绑定用户
QSqlQuery query(db->getDatabase());
query.prepare(QString("select userId, `status`, balance from card "
"where id = :cardId;"));
query.bindValue(":cardId", cardId);
bool success = false;
success = query.exec();
if (!success)
{
QMessageBox::warning(this, QString("提示"), QString("数据库异常。消费失败。"));
return;
}
if (query.next()) // 卡已被注册获取用户ID
{
cardStatus = query.value("status").toInt();
if (cardStatus == -1)
{
QMessageBox::warning(this, QString("提示"), QString("此卡已被挂失。消费失败。"));
return;
}
if (cardStatus == 0)
{
QMessageBox::warning(this, QString("提示"), QString("此卡未被启用。消费失败。"));
return;
}
userId = query.value("userId").toInt();
originalBalance = query.value("balance").toDouble();
}
else // 卡没有注册
{
query.finish();
query.prepare(QString("insert into card "
"values (:cardId, 0, 0.0, null);"));
query.bindValue(":cardId", cardId);
success = query.exec();
if (!success)
{
QMessageBox::warning(this, QString("提示"), QString("数据库异常。消费失败。"));
return;
}
QMessageBox::warning(this, QString("提示"), QString("此卡未被启用。消费失败。"));
return;
}
double deductValue = ui->consumeValueBox->value();
if (!(deductValue > 0.00))
{
QMessageBox::warning(this, "提示", "请输入大于0.00的消费金额。");
return;
}
if (originalBalance - deductValue < 0.00)
{
QMessageBox::warning(this, "提示", "余额不足。");
return;
}
if (deductValue > 300.00)
{
QMessageBox::warning(this, "提示", "消费金额不得超过300.00元。");
return;
}
if (deductValue > 50.00)
{
QString prompt = "消费超过50.00元,需要密码验证。";
QString info;
success = verifyUser(userId, prompt, info);
if (!success)
{
QMessageBox::warning(this, "提示", info + QString("\n用户验证不通过。消费失败。"));
return;
}
}
QString info;
double finalBalance;
QString recordId;
success = deductCard(cardId, deductValue, originalBalance, finalBalance, recordId, info);
if (!success)
{
QMessageBox::warning(this, "提示", info + QString("\n消费失败。"));
return;
}
QString consumeResultMessage = QString("消费成功:") + QString::number(deductValue) + QString("\n");
consumeResultMessage += QString("原余额:") + QString::number(originalBalance) + QString("\n");
consumeResultMessage += QString("消费后余额:") + QString::number(finalBalance) + QString("\n");
consumeResultMessage += QString("消费设备:") + device.getName() + QString("\n");
consumeResultMessage += QString("交易记录号:") + recordId + QString("\n");
QMessageBox::information(this, "消费成功", consumeResultMessage);
ui->consumeValueBox->setValue(0.00);
return;
}
/**
* @brief
*
* `sp_consumeCard`
* @param cardId
* @param deductValue
* @param originalBalance
* @param finalBalance
* @param recordId
* @param info
* @return bool
* - true
* - false
* @author
* @date 2024-07-30
*/
bool MainWindow::deductCard(QString cardId, double deductValue, double &originalBalance, double &finalBalance, QString &recordId, QString &info)
{
QSqlQuery query(db->getDatabase());
bool success;
query.prepare(QString("select userId, `status`, balance from card "
"where id = :cardId;"));
query.bindValue(":cardId", cardId);
success = query.exec();
if (!success)
{
info = "数据库异常。";
return false;
}
if (!query.next())
{
info = "卡号不存在。";
return false;
}
int cardStatus = query.value("status").toInt();
if (cardStatus == -1)
{
info = "此卡已被挂失。";
return false;
}
if (cardStatus == 0)
{
info = "此卡未被启用。";
return false;
}
originalBalance = query.value("balance").toDouble();
int userId = query.value("userId").toInt();
if (originalBalance - deductValue < 0.00)
{
info = "余额不足。";
return false;
}
if (deductValue > 300.00)
{
info = "单次消费额上限为300.00元。";
return false;
}
QDateTime currentTime = QDateTime::currentDateTime();
recordId = getRecordId(currentTime, userId, 1);
query.finish();
query.prepare(QString("call sp_consumeCard (:cardId, :value, :recordId, :device, :time, :type, @newBalance);"));
query.bindValue(":cardId", cardId);
query.bindValue(":value", deductValue);
query.bindValue(":recordId", recordId);
query.bindValue(":device", device.getId());
query.bindValue(":time", currentTime.toString("yyyy-MM-dd hh:mm:ss"));
query.bindValue(":type", 1);
success = query.exec();
if (!success)
{
info = "数据库异常。";
return false;
}
query.exec("select @newBalance;");
query.next();
finalBalance = query.value("@newBalance").toDouble();
/// @todo 写卡
return true;
}

View File

@ -207,6 +207,7 @@ void MainWindow::on_depositByUserIdButton_clicked()
depositResultMessage += QString("充值设备:") + device.getName() + QString("\n");
depositResultMessage += QString("交易记录号:") + recordId + QString("\n");
QMessageBox::information(this, "充值成功", depositResultMessage);
ui->depositValueBox->setValue(0.00);
return;
}

View File

@ -63,3 +63,4 @@ MainWindow::~MainWindow()
{
delete ui;
}

View File

@ -40,6 +40,7 @@ public:
bool reopenCard(QString cardId, QString &info);
bool topUpCard(QString cardId, double topUpValue, double &originalBalance, double &finalBalance, QString &recordId, QString &info);
QString getRecordId(QDateTime currentTime, int userId, int recordType);
bool deductCard(QString cardId, double deductValue, double &originalBalance, double &finalBalance, QString &recordId, QString &info);
private slots:
void on_settingAction_triggered();
@ -47,6 +48,7 @@ private slots:
void on_NewCardAction_triggered();
void on_reportLossAction_triggered();
void on_depositAction_triggered();
void on_ConsumptionAction_triggered();
void on_connectReaderButton_clicked();
void on_confirmQuitButton_clicked();
@ -56,12 +58,9 @@ private slots:
void on_reportLossButton_clicked();
void on_depositInventoryButton_clicked();
void on_depositByCardIdButton_clicked();
void on_depositByUserIdButton_clicked();
void on_consumeInventoryButton_clicked();
void on_ConsumptionAction_triggered();
void on_consumeButton_clicked();
private:
Ui::MainWindow *ui;