#include "settlement_dialog.h" #include "core/his_core.h" #include "models/settlement.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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(); } }