Реализация Page и DataCardWidget
This commit is contained in:
+118
@@ -0,0 +1,118 @@
|
||||
# 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}."
|
||||
Reference in New Issue
Block a user