#include "repayment.h" #include "ui_repayment.h" #include "util.h" #include #include #include #include Repayment::Repayment(QWidget* parent, std::unique_ptr& 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 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)) + "元,未还清。"); } }