#include "basicwidget.h" #include "ui_basicwidget.h" #include "compareitemlistdialog.h" #include "DialogBase.h" #include "UIStyleManager.h" #include "customcombobox.h" #include "CompareItemData.h" #include "tipwidget.h" #include "SystemConfigStruct.h" #include "SystemConfig.h" #include "GlobalInfo.h" #include "SoundCardData.h" #include BasicWidget::BasicWidget(QWidget *parent) : QWidget(parent), ui(new Ui::BasicWidget) { ui->setupUi(this); m_logger = spdlog::get("ACASetting"); if(m_logger == nullptr) { fmt::print("BasicWidget: Logger ACASetting not found\n"); return; } connect(ui->pBtn_compareItem, &QPushButton::clicked, this, &BasicWidget::do_pBtn_CompareItemClicked); /* 设置UI */ UIStyle.registerWidget(this); /* 设置下拉框选项 */ ui->comBox_notConsistency->setViewShadowEffect(); ui->comBox_driverName->setViewShadowEffect(); ui->comBox_recordMode->setViewShadowEffect(); /* 设置IP地址格式限制 */ QRegularExpression ipRegex(R"(^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}$)"); QValidator *ipValidator = new QRegularExpressionValidator(ipRegex, this); ui->lineEdit_serverIP->setValidator(ipValidator); /* 初始化数据 */ /* 设置录音模式 */ for(auto it = g_mapRecordModes.begin(); it != g_mapRecordModes.end(); ++it) { ui->comBox_recordMode->addItem(it.value(), it.key()); } /* 设置不一致判断选项 */ for(auto it = g_mapNotConsistency.begin(); it != g_mapNotConsistency.end(); ++it) { ui->comBox_notConsistency->addItem(it.value(), it.key()); } /* 设置从数据库读取到的选项 */ const BaseConfig_t& baseConfig = SysConfig.getBaseConfigSrc(); ui->lineEdit_serverIP->setText(baseConfig.strServerIP); ui->comBox_recordMode->setCurrentIndex(ui->comBox_recordMode->findData(baseConfig.nRecordMode)); ui->comBox_driverName->setCurrentText(baseConfig.strDriverName); ui->comBox_notConsistency->setCurrentIndex(ui->comBox_notConsistency->findData(baseConfig.nNotConsistency)); ui->checkBox_enableMultiCPU->setChecked(baseConfig.isEnableMultiCore); ui->checkBox_enableDebug->setChecked(baseConfig.isEnableDebugLog); ui->checkBox_clearHistoryDir->setChecked(baseConfig.isClearDirSystemOn); ui->checkBox_enableSoundCardName->setChecked(baseConfig.isUsingSoundCardName); /* 连接信号和槽 */ connect(ui->comBox_driverName, QOverload::of(&QComboBox::currentIndexChanged), this, &BasicWidget::do_soundCardChanged); /* 设置声卡信息 */ setSoundCardInfo(); } BasicWidget::~BasicWidget() { UIStyle.unregisterWidget(this); delete ui; } /* 保存数据 */ bool BasicWidget::saveBasicInfo() { bool isSuccess = true; /* 保存基础信息 */ if(!saveBasicSettingInfo()) { TipWidget::display(TipWidget::OPERATOR_WARN, "保存基础信息失败", GInfo.getTopWindow()); isSuccess = false; } /* 保存对比项信息 */ if(!saveCompareItemInfo()) { TipWidget::display(TipWidget::OPERATOR_WARN, "保存对比项信息失败", GInfo.getTopWindow()); isSuccess = false; } m_isModify = false; // 保存成功后,重置修改标志 return isSuccess; } void BasicWidget::do_pBtn_CompareItemClicked() { CompareItemListDialog dlg; /* 设置已有的对比项列表 */ dlg.setCompareItemList(CIData.getCompareItemTableData()); dlg.exec(); } /* 修改了选择了声卡 */ void BasicWidget::do_soundCardChanged(int nIndex) { int nSoundCardNum = ui->comBox_driverName->currentData().toInt(); if(nSoundCardNum < 0) { SPDLOG_LOGGER_ERROR(m_logger, "选择的声卡无效,无法设置通道信息"); return; } /* 设置当前声卡信息 */ if(!SoundCards.setCurrentSoundCard(nSoundCardNum)) { SPDLOG_LOGGER_ERROR(m_logger, "设置当前声卡失败,声卡编号: {}", nSoundCardNum); return; } } /* 设置声卡信息 */ void BasicWidget::setSoundCardInfo() { const auto& soundCardInfo = SoundCards.getSoundCardInfo(); /* 清空现有的声卡信息 */ ui->comBox_driverName->clear(); /* 添加声卡信息到下拉框 */ for(const auto& it : soundCardInfo) { ui->comBox_driverName->addItem(it.strSoundCardName, it.nSoundCardNum); } /* 设置当前信息 */ ui->comBox_driverName->setCurrentIndex(0); } /* 保存基础信息 */ bool BasicWidget::saveBasicSettingInfo() { BaseConfig_t baseConfig; const BaseConfig_t& srcBaseConfig = SysConfig.getBaseConfigSrc(); /* 获取基础配置信息 */ baseConfig.strServerIP = ui->lineEdit_serverIP->text(); baseConfig.nRecordMode = ui->comBox_recordMode->currentData().toInt(); baseConfig.strDriverName = ui->comBox_driverName->currentData().toString(); baseConfig.nNotConsistency = ui->comBox_notConsistency->currentData().toInt(); baseConfig.isEnableMultiCore = ui->checkBox_enableMultiCPU->isChecked(); baseConfig.isEnableDebugLog = ui->checkBox_enableDebug->isChecked(); baseConfig.isClearDirSystemOn = ui->checkBox_clearHistoryDir->isChecked(); baseConfig.isUsingSoundCardName = ui->checkBox_enableSoundCardName->isChecked(); // SPDLOG_LOGGER_DEBUG(m_logger, "修改后的基础配置信息: ServerIP: {}, RecordMode: {}, DriverName: {}, NotConsistency: {}, EnableMultiCore: {}, EnableDebugLog: {}, ClearHistoryDirOnStart: {}, UseSoundCardName: {}", // baseConfig.strServerIP.toStdString(), baseConfig.nRecordMode, baseConfig.strDriverName.toStdString(), // baseConfig.nNotConsistency, baseConfig.isEnableMultiCore, baseConfig.isEnableDebugLog, // baseConfig.isClearDirSystemOn, baseConfig.isUsingSoundCardName); // SPDLOG_LOGGER_DEBUG(m_logger, "现有的基础配置信息: ServerIP: {}, RecordMode: {}, DriverName: {}, NotConsistency: {}, EnableMultiCore: {}, EnableDebugLog: {}, ClearHistoryDirOnStart: {}, UseSoundCardName: {}", // srcBaseConfig.strServerIP.toStdString(), srcBaseConfig.nRecordMode, srcBaseConfig.strDriverName.toStdString(), // srcBaseConfig.nNotConsistency, srcBaseConfig.isEnableMultiCore, srcBaseConfig.isEnableDebugLog, // srcBaseConfig.isClearDirSystemOn, srcBaseConfig.isUsingSoundCardName); if(baseConfig == srcBaseConfig) { SPDLOG_LOGGER_DEBUG(m_logger, "基础配置信息没有修改,不需要保存"); return true; } /* 将结构体转换成json字符串 */ std::string strJson; SysConfig.setBaseConfigToJson(baseConfig, strJson); if(!m_fromWebAPI->updateSystemConfig(Config_Base, strJson, SysConfig.mapSysConfigDesc[eSystemConfigType::eSCT_BaseConfig])) { SPDLOG_LOGGER_ERROR(m_logger, "更新基础配置信息失败"); return false; } SysConfig.setBaseConfig(baseConfig); // 更新本地的基础配置信息 return true; } /* 保存对比项信息 * 先获取未修改过的对比项信息,和现有的进行对比一下,找出新增、修改、删除的对比项。 * 新增的对比项直接添加到数据库中,修改的对比项更新到数据库中,删除的对比项从数据库中删除。 */ bool BasicWidget::saveCompareItemInfo() { if(m_fromWebAPI == nullptr) { SPDLOG_LOGGER_ERROR(m_logger, "WebAPI 未设置指针,无法保存对比项信息"); return false; } /* 获取未修改过的对比项信息,不从数据库里获取了 */ const QList& srcCompareItems = CIData.getSrcCompareItemList(); const QList& nowItems = CIData.getCompareItemList(); QList insertItems; // 新增的对比项 QList deleteIDs; // 删除的对比项ID QList baseUpdateItems; // 修改的对比项基础信息 QList roadUpdateItems; // 修改的对比项通道信息 /* 先找到新增的对比项 */ findInsertCompareItem(srcCompareItems, nowItems, insertItems); /* 找到删除的对比项 */ findDeleteCompareItem(srcCompareItems, nowItems, deleteIDs); /* 找到修改的对比项 */ findUpdateCompareItem(srcCompareItems, nowItems, baseUpdateItems, roadUpdateItems); /* 先删除已经消失的对比项 */ if(!deleteIDs.isEmpty()) { if(!m_fromWebAPI->deleteCompareItem(deleteIDs)) { SPDLOG_LOGGER_ERROR(m_logger, "删除对比项信息失败"); return false; } } /* 再插入新增的对比项 */ if(!insertItems.isEmpty()) { if(!m_fromWebAPI->insertCompareItem(insertItems)) { SPDLOG_LOGGER_ERROR(m_logger, "插入对比项信息失败"); return false; } } /* 更新修改的对比项基础信息 */ if(!baseUpdateItems.isEmpty()) { if(!m_fromWebAPI->updateCompareItemOnly(baseUpdateItems)) { SPDLOG_LOGGER_ERROR(m_logger, "更新对比项基础信息失败"); return false; } } /* 更新修改的对比项通道信息 */ if(!roadUpdateItems.isEmpty()) { if(!m_fromWebAPI->updateCompareItemRoadOnly(roadUpdateItems)) { SPDLOG_LOGGER_ERROR(m_logger, "更新对比项通道信息失败"); return false; } } /* 更新数据库的信息 */ QList listNewItems; if(!m_fromWebAPI->getCompareItemInfo(listNewItems)) { SPDLOG_LOGGER_ERROR(m_logger, "获取最新对比项信息失败"); return false; } /* 更新本地的对比项数据 */ CIData.setCompareItemList(listNewItems); return true; } /* 查找新增的对比项信息 */ void BasicWidget::findInsertCompareItem(const QList& srcItems, const QList& nowItems, QList& insertItems) { for(const CompareItemInfo_t& nowItem : nowItems) { bool bFound = false; for(const CompareItemInfo_t& srcItem : srcItems) { if(nowItem.nID == srcItem.nID) { bFound = true; break; } } if(!bFound) { insertItems.append(nowItem); } } } /* 查找删除的对比项信息 */ void BasicWidget::findDeleteCompareItem(const QList& srcItems, const QList& nowItems, QList& deleteIDs) { for(const CompareItemInfo_t& srcItem : srcItems) { bool bFound = false; for(const CompareItemInfo_t& nowItem : nowItems) { if(srcItem.nID == nowItem.nID) { bFound = true; break; } } if(!bFound) { deleteIDs.append(srcItem.nID); } } } /* 查找修改的对比项 */ void BasicWidget::findUpdateCompareItem(const QList& srcItems, const QList& nowItems, QList& baseUpdateItems, QList& roadUpdateItems) { for(const CompareItemInfo_t& nowItem : nowItems) { bool bFound = false; for(const CompareItemInfo_t& srcItem : srcItems) { if(nowItem.nID == srcItem.nID) { bFound = true; if(!nowItem.isEqualBase(srcItem)) { baseUpdateItems.append(nowItem); } /* 对比通道信息 */ if(!nowItem.isEqualRoads(srcItem)) { roadUpdateItems.append(nowItem); } break; } } if(!bFound) { // SPDLOG_LOGGER_DEBUG(m_logger, "对比项ID {} 在源数据中未找到,可能是新增的对比项", nowItem.nID); } } }