#include "alarm_editor_service.h" #include "project_service.h" #include "domain/project_limits.h" #include namespace { // 创建统一的报警编辑失败结果 AlarmEditorResult failure(AlarmEditorError error, const std::string &message) { return {false, error, message, {}}; } } // namespace // 保存工程服务引用,后续编辑都通过该服务修改当前工程 AlarmEditorService::AlarmEditorService(ProjectService &project_service) : project_service_(project_service) { } // 返回当前工程持有的报警定义列表 const std::vector &AlarmEditorService::definitions() const { return project_service_.project().alarmDefinitions; } // 按稳定 ID 查找报警定义,找不到时返回空指针 const AlarmDefinition *AlarmEditorService::findDefinition( const std::string &id) const { const auto &definitions = project_service_.project().alarmDefinitions; const auto definition = std::find_if( definitions.cbegin(), definitions.cend(), [&id](const AlarmDefinition &candidate) { return candidate.id == id; }); return definition == definitions.cend() ? nullptr : &*definition; } // 校验数量和定义内容后添加一条带唯一 ID 的报警定义 AlarmEditorResult AlarmEditorService::addDefinition( const AlarmDefinition &definition) { const std::size_t maximum = project_service_.projectLimits().maximumAlarmDefinitions; if (definitions().size() >= maximum) { return failure( AlarmEditorError::InvalidDefinition, "当前配置最多允许 " + std::to_string(maximum) + " 条报警定义"); } AlarmDefinition candidate = definition; candidate.id = makeUniqueId(); std::string error; if (!candidate.validate(&error)) { return failure(AlarmEditorError::InvalidDefinition, error); } project_service_.editProject().alarmDefinitions.push_back(candidate); return {true, AlarmEditorError::None, {}, candidate.id}; } // 校验候选定义后整体替换指定 ID 的报警定义 AlarmEditorResult AlarmEditorService::updateDefinition( const std::string &id, const AlarmDefinition &definition) { if (findDefinition(id) == nullptr) { return failure(AlarmEditorError::NotFound, "未找到报警定义"); } AlarmDefinition candidate = definition; candidate.id = id; std::string error; if (!candidate.validate(&error)) { return failure(AlarmEditorError::InvalidDefinition, error); } Project &project = project_service_.editProject(); auto editable = std::find_if( project.alarmDefinitions.begin(), project.alarmDefinitions.end(), [&id](const AlarmDefinition &item) { return item.id == id; }); *editable = std::move(candidate); return {true, AlarmEditorError::None, {}, id}; } // 删除指定 ID 的报警定义 AlarmEditorResult AlarmEditorService::removeDefinition(const std::string &id) { if (findDefinition(id) == nullptr) { return failure(AlarmEditorError::NotFound, "未找到报警定义"); } Project &project = project_service_.editProject(); // remove_if 先把目标项移到逻辑末尾,再由 erase 真正缩短容器 project.alarmDefinitions.erase( std::remove_if( project.alarmDefinitions.begin(), project.alarmDefinitions.end(), [&id](const AlarmDefinition &definition) { return definition.id == id; }), project.alarmDefinitions.end()); return {true, AlarmEditorError::None, {}, id}; } // 从 alarm-1 开始递增查找当前工程内可用的 ID std::string AlarmEditorService::makeUniqueId() const { int suffix = 1; while (true) { const std::string candidate = "alarm-" + std::to_string(suffix); if (findDefinition(candidate) == nullptr) { return candidate; } ++suffix; } }