Files
ARMStrong.Vision/api/db/seeds.rb
T
2026-06-08 22:55:30 +04:00

119 lines
4.7 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# This file should ensure the existence of records required to run the application in every environment (production,
# development, test). The code here should be idempotent so that it can be executed at any point in every environment.
# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup).
# ID каналов синхронизированы с frontend/src/App.jsx (selected_index фильтрует по Channel.id).
APP_CHANNEL_IDS_BY_GROUP = {
sm: [267, 268, 301, 300, 295, 296],
rbt: [313, 312, 270, 271, 357, 316],
blowout: [275, 276, 277, 278, 279, 280, 281, 282],
blowout_aerosols: [384, 388, 392, 396, 401, 405, 409, 413],
hols_l: [195, 196, 263, 264, 291, 292],
hols_r: [297, 298, 328, 329, 354, 355],
hols_r2: [265, 266, 317]
}.freeze
# Дополнительные id в том же числовом диапазоне (не пересекаются с APP_CHANNEL_IDS_BY_GROUP).
EXTRA_CHANNEL_IDS = [
180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
190, 191, 192, 193, 194, 200, 201, 202, 203, 204,
205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
255, 256, 257, 258, 259, 260, 261, 262, 269, 272,
273, 274, 283, 284, 285, 286, 287, 288, 289, 290,
302, 303, 304, 305, 306, 307, 308, 309, 310, 311,
314, 315, 318, 319, 320, 321, 322, 323, 324, 325,
326, 327, 330, 331, 332, 333, 334, 335, 336, 337,
338, 339, 340, 341, 342, 343, 344, 345, 346, 347,
348, 349, 350, 351, 352, 353, 356, 358, 359, 360,
361, 362, 363, 364, 365, 366, 367, 368, 369, 370,
371, 372, 373, 374, 375, 376, 377, 378, 379, 380,
381, 382, 383, 385, 386, 387, 389, 390, 391, 393,
394, 395, 397, 398, 399, 400, 402, 403, 404, 406,
407, 408, 410, 411, 412, 414, 415, 416, 417, 418,
419, 420, 421, 422, 423, 424, 425, 426, 427, 428,
429, 430
].freeze
def channel_group_label(channel_id)
APP_CHANNEL_IDS_BY_GROUP.each do |label, ids|
return label.to_s.upcase if ids.include?(channel_id)
end
"EXTRA"
end
def channel_row(channel_id)
label = channel_group_label(channel_id)
t = channel_id % 5
base = Time.zone.parse("2024-01-15 08:00:00") + (channel_id % 1440).minutes
{
id: channel_id,
channel_id: channel_id,
server_id: 1 + (channel_id % 3),
name_controlpoint: "#{label}-#{channel_id}"[0, 50],
name_db: "БД-#{channel_id % 7}"[0, 50],
name_location: "Участок #{label}, канал #{channel_id}"[0, 256],
event_value: (0.1 + (channel_id % 100) * 0.017).round(4),
unit: (t.even? ? "мкЗв/ч" : "Бк/м³"),
event_date: base,
on_off: channel_id.even? ? 1 : 0,
coefficient: (0.95 + (channel_id % 10) * 0.01).round(4),
pre_accident: 0.1 + (channel_id % 5) * 0.1,
accident: 1.0 + (channel_id % 4) * 0.5,
type: 1 + (channel_id % 3),
count: 200 + (channel_id % 2000),
value_impulses: (channel_id % 50) + (channel_id % 7) * 0.1,
error_count: channel_id % 4,
state_for_threeview: 1 + (channel_id % 3),
min_nuclid_value: 0.05 + (channel_id % 10) * 0.01,
max_nuclid_value: 2.0 + (channel_id % 15) * 0.1,
background: ((channel_id % 20) * 0.005).round(4),
consumption: 0.8 + (channel_id % 8) * 0.05,
special_control: channel_id % 3 != 0,
value_cu: (channel_id % 17) * 0.0005
}
end
def history_rows_for(channel_id, base_time)
(0..4).map do |i|
{
channel_id: channel_id,
event_value: (0.2 + (channel_id % 10) * 0.05 + i * 0.02).round(4),
event_date: base_time + (i * 12).minutes
}
end
end
all_ids = (APP_CHANNEL_IDS_BY_GROUP.values.flatten + EXTRA_CHANNEL_IDS).uniq.sort
overlap = APP_CHANNEL_IDS_BY_GROUP.values.flatten & EXTRA_CHANNEL_IDS
raise "Пересечение APP и EXTRA id: #{overlap.inspect}" if overlap.any?
Channel.transaction do
History.where(channel_id: all_ids).delete_all
Channel.where(id: all_ids).delete_all
Channel.insert_all(all_ids.map { |id| channel_row(id) })
history_batch = []
all_ids.each do |cid|
base = channel_row(cid)[:event_date]
history_batch.concat(history_rows_for(cid, base))
end
History.insert_all(history_batch) if history_batch.any?
seq = Channel.connection.select_value(
"SELECT pg_get_serial_sequence('channels', 'id')"
)
if seq.present?
max_id = Channel.maximum(:id).to_i
Channel.connection.execute(
ActiveRecord::Base.sanitize_sql_array(["SELECT setval(?, ?, true)", seq, max_id])
)
end
end
puts "Seeds: каналы id=#{all_ids.size} шт. (в т.ч. из App.jsx + EXTRA), историй=#{History.where(channel_id: all_ids).count}."