Files
HIS-GUI/gui/dialogs/settlement_dialog.cpp
2026-04-07 17:18:33 +08:00

227 lines
8.3 KiB
C++

#include "settlement_dialog.h"
#include "core/his_core.h"
#include "models/settlement.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QHeaderView>
#include <QPushButton>
#include <QTextEdit>
#include <QMessageBox>
#include <QDesktopServices>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <iomanip>
#include <sstream>
SettlementDialog::SettlementDialog(core::HisCore& core, QWidget* parent)
: QDialog(parent), core_(core) {
setWindowTitle("结算单");
setModal(false);
setMinimumSize(800, 600);
setupUI();
}
void SettlementDialog::setupUI() {
QVBoxLayout* mainLayout = new QVBoxLayout(this);
// Settlement ID
QHBoxLayout* idLayout = new QHBoxLayout();
idLayout->addWidget(new QLabel("结算单号:"));
settlementIDEdit_ = new QLineEdit();
settlementIDEdit_->setReadOnly(true);
idLayout->addWidget(settlementIDEdit_);
mainLayout->addLayout(idLayout);
// Patient Info
QHBoxLayout* patientLayout = new QHBoxLayout();
patientLayout->addWidget(new QLabel("患者ID:"));
patientIDEdit_ = new QLineEdit();
patientIDEdit_->setReadOnly(true);
patientLayout->addWidget(patientIDEdit_);
patientLayout->addWidget(new QLabel("患者姓名:"));
patientNameEdit_ = new QLineEdit();
patientNameEdit_->setReadOnly(true);
patientLayout->addWidget(patientNameEdit_);
mainLayout->addLayout(patientLayout);
// Discharge Date
QHBoxLayout* dateLayout = new QHBoxLayout();
dateLayout->addWidget(new QLabel("出院日期:"));
dischargeDateEdit_ = new QLineEdit();
dischargeDateEdit_->setReadOnly(true);
dateLayout->addWidget(dischargeDateEdit_);
mainLayout->addLayout(dateLayout);
// Fee Items Table
mainLayout->addWidget(new QLabel("费用明细:"));
itemsTable_ = new QTableWidget();
itemsTable_->setColumnCount(6);
itemsTable_->setHorizontalHeaderLabels(
{"项目名称", "项目类型", "数量", "单价", "金额", "支付方式"});
itemsTable_->horizontalHeader()->setStretchLastSection(true);
itemsTable_->setEditTriggers(QAbstractItemView::NoEditTriggers);
mainLayout->addWidget(itemsTable_);
// Summary Section
QHBoxLayout* summaryLayout = new QHBoxLayout();
totalAmountLabel_ = new QLabel("医疗总费用: ¥0.00");
insurancePaidLabel_ = new QLabel("医保支付: ¥0.00");
patientPaidLabel_ = new QLabel("患者自付: ¥0.00");
summaryLayout->addWidget(totalAmountLabel_);
summaryLayout->addWidget(insurancePaidLabel_);
summaryLayout->addWidget(patientPaidLabel_);
mainLayout->addLayout(summaryLayout);
// Notes
mainLayout->addWidget(new QLabel("备注:"));
notesEdit_ = new QTextEdit();
notesEdit_->setMaximumHeight(80);
mainLayout->addWidget(notesEdit_);
// Button Section
QHBoxLayout* buttonLayout = new QHBoxLayout();
printButton_ = new QPushButton("打印");
connect(printButton_, &QPushButton::clicked, this, &SettlementDialog::onPrintSettlement);
buttonLayout->addWidget(printButton_);
exportButton_ = new QPushButton("导出");
connect(exportButton_, &QPushButton::clicked, this, &SettlementDialog::onExportSettlement);
buttonLayout->addWidget(exportButton_);
confirmButton_ = new QPushButton("确认结算");
connect(confirmButton_, &QPushButton::clicked, this, &SettlementDialog::onConfirmSettlement);
buttonLayout->addWidget(confirmButton_);
buttonLayout->addStretch();
closeButton_ = new QPushButton("关闭");
connect(closeButton_, &QPushButton::clicked, this, &SettlementDialog::onClose);
buttonLayout->addWidget(closeButton_);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
}
void SettlementDialog::displaySettlement(const QString& settlementID) {
currentSettlementID_ = settlementID;
loadSettlementDetails();
}
bool SettlementDialog::createNewSettlement(const QString& patientID, const QString& patientName,
const QString& dischargeDate) {
std::string outSettlementID;
if (core_.settlementService.generateSettlement(patientID.toStdString(),
patientName.toStdString(),
dischargeDate.toStdString(),
outSettlementID)) {
currentSettlementID_ = QString::fromStdString(outSettlementID);
loadSettlementDetails();
return true;
}
return false;
}
void SettlementDialog::loadSettlementDetails() {
const Settlement* settlement = core_.settlementService.findSettlement(currentSettlementID_.toStdString());
if (!settlement) {
QMessageBox::warning(this, "错误", "结算单不存在");
return;
}
settlementIDEdit_->setText(QString::fromStdString(settlement->SettlementID));
patientIDEdit_->setText(QString::fromStdString(settlement->PatientID));
patientNameEdit_->setText(QString::fromStdString(settlement->PatientName));
dischargeDateEdit_->setText(QString::fromStdString(settlement->DischargeDate));
// Clear and populate items table
itemsTable_->setRowCount(0);
int row = 0;
for (const auto& item : settlement->Items) {
itemsTable_->insertRow(row);
itemsTable_->setItem(row, 0, new QTableWidgetItem(QString::fromStdString(item.ItemName)));
itemsTable_->setItem(row, 1, new QTableWidgetItem(QString::fromStdString(item.ItemType)));
itemsTable_->setItem(row, 2, new QTableWidgetItem(QString::number(item.Quantity, 'f', 2)));
itemsTable_->setItem(row, 3, new QTableWidgetItem(QString::number(item.UnitPrice, 'f', 2)));
itemsTable_->setItem(row, 4, new QTableWidgetItem(QString::number(item.Amount, 'f', 2)));
itemsTable_->setItem(row, 5, new QTableWidgetItem(QString::fromStdString(item.PaymentMethod)));
row++;
}
// Update summary labels
totalAmountLabel_->setText(QString("医疗总费用: ¥%1").arg(settlement->TotalAmount, 0, 'f', 2));
insurancePaidLabel_->setText(QString("医保支付: ¥%1").arg(settlement->InsurancePaid, 0, 'f', 2));
patientPaidLabel_->setText(QString("患者自付: ¥%1").arg(settlement->PatientPaid, 0, 'f', 2));
notesEdit_->setText(QString::fromStdString(settlement->Notes));
}
void SettlementDialog::onPrintSettlement() {
if (currentSettlementID_.isEmpty()) {
QMessageBox::warning(this, "警告", "没有选择结算单");
return;
}
auto report = core_.settlementService.generateSettlementReport(currentSettlementID_.toStdString());
QMessageBox msgBox(this);
msgBox.setWindowTitle("结算单");
msgBox.setText(QString::fromStdString(report));
msgBox.setTextFormat(Qt::PlainText);
msgBox.exec();
}
void SettlementDialog::onExportSettlement() {
if (currentSettlementID_.isEmpty()) {
QMessageBox::warning(this, "警告", "没有选择结算单");
return;
}
const Settlement* settlement = core_.settlementService.findSettlement(currentSettlementID_.toStdString());
if (!settlement) {
QMessageBox::warning(this, "错误", "结算单不存在");
return;
}
QString fileName = QString("settlement_%1.txt").arg(QString::fromStdString(settlement->SettlementID));
QFile file(fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out << QString::fromStdString(core_.settlementService.generateSettlementReport(currentSettlementID_.toStdString()));
file.close();
QMessageBox::information(this, "成功", "结算单已导出到: " + fileName);
} else {
QMessageBox::warning(this, "失败", "无法导出结算单");
}
}
void SettlementDialog::onConfirmSettlement() {
if (currentSettlementID_.isEmpty()) {
QMessageBox::warning(this, "警告", "没有选择结算单");
return;
}
if (core_.settlementService.completeSettlement(currentSettlementID_.toStdString())) {
QMessageBox::information(this, "成功", "结算单已确认");
loadSettlementDetails();
} else {
QMessageBox::warning(this, "失败", "无法确认结算单");
}
}
void SettlementDialog::onClose() {
accept();
}
void SettlementDialog::refreshDisplay() {
if (!currentSettlementID_.isEmpty()) {
loadSettlementDetails();
}
}