# 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}."