227 lines
8.3 KiB
C++
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();
|
|
}
|
|
}
|