综合平台编程器项目的远程存储
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

109 lines
3.2 KiB

  1. #include "alarm_editor_service.h"
  2. #include "project_service.h"
  3. #include "domain/project_limits.h"
  4. #include <algorithm>
  5. namespace {
  6. AlarmEditorResult failure(AlarmEditorError error, const std::string &message)
  7. {
  8. return {false, error, message, {}};
  9. }
  10. } // namespace
  11. AlarmEditorService::AlarmEditorService(ProjectService &project_service)
  12. : project_service_(project_service)
  13. {
  14. }
  15. const std::vector<AlarmDefinition> &AlarmEditorService::definitions() const
  16. {
  17. return project_service_.project().alarmDefinitions;
  18. }
  19. const AlarmDefinition *AlarmEditorService::findDefinition(
  20. const std::string &id) const
  21. {
  22. const auto &definitions = project_service_.project().alarmDefinitions;
  23. const auto definition = std::find_if(
  24. definitions.cbegin(), definitions.cend(),
  25. [&id](const AlarmDefinition &candidate) { return candidate.id == id; });
  26. return definition == definitions.cend() ? nullptr : &*definition;
  27. }
  28. AlarmEditorResult AlarmEditorService::addDefinition(
  29. const AlarmDefinition &definition)
  30. {
  31. if (definitions().size() >= ProjectLimits::kMaximumAlarmDefinitions)
  32. {
  33. return failure(AlarmEditorError::InvalidDefinition, "单个工程最多包含 512 条报警定义");
  34. }
  35. AlarmDefinition candidate = definition;
  36. candidate.id = makeUniqueId();
  37. std::string error;
  38. if (!candidate.validate(&error))
  39. {
  40. return failure(AlarmEditorError::InvalidDefinition, error);
  41. }
  42. project_service_.editProject().alarmDefinitions.push_back(candidate);
  43. return {true, AlarmEditorError::None, {}, candidate.id};
  44. }
  45. AlarmEditorResult AlarmEditorService::updateDefinition(
  46. const std::string &id, const AlarmDefinition &definition)
  47. {
  48. if (findDefinition(id) == nullptr)
  49. {
  50. return failure(AlarmEditorError::NotFound, "未找到报警定义");
  51. }
  52. AlarmDefinition candidate = definition;
  53. candidate.id = id;
  54. std::string error;
  55. if (!candidate.validate(&error))
  56. {
  57. return failure(AlarmEditorError::InvalidDefinition, error);
  58. }
  59. Project &project = project_service_.editProject();
  60. auto editable = std::find_if(
  61. project.alarmDefinitions.begin(), project.alarmDefinitions.end(),
  62. [&id](const AlarmDefinition &item) { return item.id == id; });
  63. *editable = std::move(candidate);
  64. return {true, AlarmEditorError::None, {}, id};
  65. }
  66. AlarmEditorResult AlarmEditorService::removeDefinition(const std::string &id)
  67. {
  68. if (findDefinition(id) == nullptr)
  69. {
  70. return failure(AlarmEditorError::NotFound, "未找到报警定义");
  71. }
  72. Project &project = project_service_.editProject();
  73. project.alarmDefinitions.erase(
  74. std::remove_if(
  75. project.alarmDefinitions.begin(), project.alarmDefinitions.end(),
  76. [&id](const AlarmDefinition &definition)
  77. {
  78. return definition.id == id;
  79. }),
  80. project.alarmDefinitions.end());
  81. return {true, AlarmEditorError::None, {}, id};
  82. }
  83. std::string AlarmEditorService::makeUniqueId() const
  84. {
  85. int suffix = 1;
  86. while (true)
  87. {
  88. const std::string candidate = "alarm-" + std::to_string(suffix);
  89. if (findDefinition(candidate) == nullptr)
  90. {
  91. return candidate;
  92. }
  93. ++suffix;
  94. }
  95. }