226 lines
7.0 KiB
C++
226 lines
7.0 KiB
C++
#include "repayment.h"
|
|
#include "ui_repayment.h"
|
|
#include "util.h"
|
|
#include <QDateTime>
|
|
#include <QInputDialog>
|
|
#include <QMenu>
|
|
#include <QMessageBox>
|
|
|
|
Repayment::Repayment(QWidget* parent, std::unique_ptr<RepaySqlOpr>& repaySqlOpr)
|
|
: QDialog(parent), ui(new Ui::Repayment), repaySqlOpr_(repaySqlOpr)
|
|
{
|
|
ui->setupUi(this);
|
|
Init();
|
|
setWindowTitle("还款情况");
|
|
resize(800, 600);
|
|
}
|
|
|
|
Repayment::~Repayment()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
int Repayment::exec()
|
|
{
|
|
ui->lbInfo->setText(info_);
|
|
ShowData();
|
|
if (!over_) {
|
|
return QDialog::Rejected;
|
|
}
|
|
return QDialog::exec();
|
|
}
|
|
|
|
void Repayment::SetInformation(const QString& info)
|
|
{
|
|
info_ = info;
|
|
}
|
|
|
|
void Repayment::SetRecord(const AccountRecord& record)
|
|
{
|
|
record_ = record;
|
|
}
|
|
|
|
void Repayment::ShowData()
|
|
{
|
|
over_ = false;
|
|
RepayRecordList reuslt;
|
|
if (!repaySqlOpr_->GetRepayResult(reuslt, record_.id)) {
|
|
QMessageBox::critical(this, "错误", "获取还款记录失败");
|
|
return;
|
|
}
|
|
|
|
tw_->setRowCount(reuslt.size());
|
|
for (int row = 0; row < reuslt.size(); ++row) {
|
|
QTableWidgetItem* item = new QTableWidgetItem(QString::number(reuslt[row].id));
|
|
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
|
|
tw_->setItem(row, 0, item);
|
|
|
|
item = new QTableWidgetItem(QString::number(reuslt[row].accID));
|
|
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
|
|
tw_->setItem(row, 1, item);
|
|
|
|
item = new QTableWidgetItem(QString::number(Util::CashDouble(reuslt[row].money)));
|
|
tw_->setItem(row, 2, item);
|
|
|
|
item = new QTableWidgetItem(QString::fromStdString(reuslt[row].dt));
|
|
tw_->setItem(row, 3, item);
|
|
|
|
item = new QTableWidgetItem(QString::fromStdString(reuslt[row].remark));
|
|
tw_->setItem(row, 4, item);
|
|
}
|
|
|
|
ui->edPay->setText(QString::number(Util::CashDouble(record_.money)) + "元");
|
|
|
|
// 统计还了多少钱
|
|
BasicAnasys(reuslt);
|
|
over_ = true;
|
|
}
|
|
|
|
void Repayment::Init()
|
|
{
|
|
ui->edPay->setReadOnly(true);
|
|
ui->edResult->setReadOnly(true);
|
|
|
|
auto* lay = new QVBoxLayout(this);
|
|
tw_ = new QTableWidget(this);
|
|
|
|
QStringList headers;
|
|
headers << "ID" << "记录ID" << "金额" << "日期" << "备注";
|
|
|
|
tw_->setColumnCount(headers.size());
|
|
tw_->setHorizontalHeaderLabels(headers);
|
|
tw_->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
|
|
tw_->setColumnWidth(0, 50);
|
|
tw_->setColumnWidth(1, 50);
|
|
tw_->setColumnWidth(2, 100);
|
|
tw_->setColumnWidth(3, 150);
|
|
tw_->setColumnWidth(4, 100);
|
|
|
|
lay->addWidget(tw_);
|
|
ui->widget->setLayout(lay);
|
|
tw_->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
connect(tw_, &QTableWidget::customContextMenuRequested, this, &Repayment::ShowContextMenu);
|
|
connect(ui->btnSave, &QPushButton::clicked, this, &Repayment::Save);
|
|
}
|
|
|
|
void Repayment::ShowContextMenu(const QPoint& pos)
|
|
{
|
|
QList<QTableWidgetItem*> selectedItems = tw_->selectedItems();
|
|
if (selectedItems.isEmpty()) {
|
|
QAction* acAdd = new QAction("添加", this);
|
|
QMenu menu(this);
|
|
connect(acAdd, &QAction::triggered, this, [this]() {
|
|
bool ok = false;
|
|
double amount =
|
|
QInputDialog::getDouble(this, "录入金额", "请输入金额:", 0.0, 0.0, 1000000.0, 2, &ok, Qt::WindowFlags(), 1.0);
|
|
|
|
if (!ok || amount <= 0) {
|
|
return;
|
|
}
|
|
|
|
int row = tw_->rowCount();
|
|
tw_->insertRow(row);
|
|
|
|
QString currentDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
|
|
auto* nId = new QTableWidgetItem("");
|
|
nId->setFlags(nId->flags() & ~Qt::ItemIsEditable);
|
|
tw_->setItem(row, 0, nId);
|
|
|
|
auto* rIdItem = new QTableWidgetItem(QString::number(record_.id));
|
|
rIdItem->setFlags(rIdItem->flags() & ~Qt::ItemIsEditable);
|
|
|
|
tw_->setItem(row, 1, rIdItem);
|
|
tw_->setItem(row, 2, new QTableWidgetItem(QString::number(amount, 'f', 2)));
|
|
|
|
auto* dateCur = new QTableWidgetItem(currentDateTime);
|
|
dateCur->setFlags(dateCur->flags() & ~Qt::ItemIsEditable);
|
|
|
|
tw_->setItem(row, 3, dateCur);
|
|
tw_->setItem(row, 4, new QTableWidgetItem(""));
|
|
|
|
tw_->resizeRowToContents(row);
|
|
tw_->scrollToItem(tw_->item(row, 0));
|
|
});
|
|
menu.addAction(acAdd);
|
|
menu.exec(tw_->viewport()->mapToGlobal(pos));
|
|
return;
|
|
}
|
|
if (selectedItems.size() == 5) {
|
|
QAction* acDel = new QAction("删除", this);
|
|
QMenu menu(this);
|
|
connect(acDel, &QAction::triggered, this, [this, selectedItems]() {
|
|
auto strId = selectedItems[0]->text();
|
|
if (strId.isEmpty()) {
|
|
return;
|
|
}
|
|
int id = strId.toInt();
|
|
// 确认
|
|
if (QMessageBox::No == QMessageBox::question(this, "删除", "确定删除吗?")) {
|
|
return;
|
|
}
|
|
if (!repaySqlOpr_->deleteRepayRecord(id)) {
|
|
QMessageBox::critical(this, "错误", "删除失败");
|
|
return;
|
|
}
|
|
tw_->removeRow(selectedItems[0]->row());
|
|
});
|
|
menu.addAction(acDel);
|
|
menu.exec(tw_->viewport()->mapToGlobal(pos));
|
|
}
|
|
}
|
|
void Repayment::Save()
|
|
{
|
|
int rowCount = tw_->rowCount();
|
|
if (rowCount < 1) {
|
|
return;
|
|
}
|
|
for (int row = 0; row < rowCount; ++row) {
|
|
auto* id = tw_->item(row, 0);
|
|
auto* rId = tw_->item(row, 1);
|
|
auto* amount = tw_->item(row, 2);
|
|
auto* date = tw_->item(row, 3);
|
|
auto* note = tw_->item(row, 4);
|
|
|
|
auto idText = id->text();
|
|
if (idText.isEmpty()) {
|
|
RepayRecord rd;
|
|
rd.dt = date->text().toStdString();
|
|
rd.accID = record_.id;
|
|
rd.money = Util::CashInt(amount->text().toDouble());
|
|
rd.remark = note->text().toStdString();
|
|
if (!repaySqlOpr_->InsertRepayRecord(rd)) {
|
|
QMessageBox::critical(this, "错误", "添加还款记录失败");
|
|
return;
|
|
}
|
|
id->setText(QString::number(rd.id));
|
|
} else {
|
|
RepayRecord rd;
|
|
rd.id = idText.toInt();
|
|
rd.dt = date->text().toStdString();
|
|
rd.accID = record_.id;
|
|
rd.money = Util::CashInt(amount->text().toDouble());
|
|
rd.remark = note->text().toStdString();
|
|
if (!repaySqlOpr_->updateRepayRecord(rd)) {
|
|
QMessageBox::critical(this, "错误", "更新还款记录失败");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
QMessageBox::information(this, "提示", "保存成功");
|
|
}
|
|
|
|
void Repayment::BasicAnasys(const RepayRecordList& rList)
|
|
{
|
|
int32_t total{};
|
|
for (const auto& rd : rList) {
|
|
total += rd.money;
|
|
}
|
|
if (total >= record_.money) {
|
|
ui->edResult->setText("剩余" + QString::number(Util::CashDouble(total - record_.money)) + "元,已还清。");
|
|
} else {
|
|
ui->edResult->setText("剩余" + QString::number(Util::CashDouble(record_.money - total)) + "元,未还清。");
|
|
}
|
|
}
|