Files
Web_BLS_Heartbeat_Server/scripts/db/smokeTest.js
XuJiacheng 910f1c353f feat: 实现Redis集成与Kafka消息处理优化
- 新增Redis集成模块,支持心跳写入与控制台日志队列
- 优化Kafka消费者实现,支持多实例与自动重连
- 改进消息处理器,支持批量处理与多层解码
- 更新数据库表结构,调整字段类型与约束
- 添加Redis与Kafka的配置项和环境变量支持
- 补充测试用例和文档说明
2026-01-14 17:58:45 +08:00

113 lines
2.8 KiB
JavaScript

import { Client } from 'pg';
import config from '../../src/config/config.js';
async function main() {
const client = new Client({
host: config.db.host,
port: config.db.port,
user: config.db.user,
password: config.db.password,
database: config.db.database,
});
await client.connect();
// 预创建今日分区,避免“无分区时 INSERT 直接失败”
await client.query('SELECT heartbeat.ensure_partitions(current_date, current_date)');
const ipType = await client.query(
`
SELECT format_type(a.atttypid, a.atttypmod) AS type
FROM pg_attribute a
JOIN pg_class c ON c.oid = a.attrelid
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'heartbeat'
AND c.relname = 'heartbeat_events'
AND a.attname = 'ip'
AND a.attnum > 0
AND NOT a.attisdropped
`
);
const type = String(ipType?.rows?.[0]?.type ?? '').toLowerCase();
if (type.startsWith('inet')) {
await client.query(
`ALTER TABLE heartbeat.heartbeat_events
ALTER COLUMN ip TYPE varchar(21)
USING ip::text`
);
}
const ts = Date.now();
await client.query(
`INSERT INTO heartbeat.heartbeat_events (
ts_ms, hotel_id, room_id, device_id, ip,
power_state, guest_type, cardless_state, service_mask,
pms_state, carbon_state, device_count, comm_seq, extra
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)`,
[
ts,
1,
101,
'dev-1',
'192.168.0.1:12345',
1,
0,
0,
5,
0,
0,
1,
1,
{ source: 'smoke-test' },
]
);
const partitions = await client.query(
`SELECT c.relname AS partition
FROM pg_inherits i
JOIN pg_class c ON c.oid = i.inhrelid
JOIN pg_class p ON p.oid = i.inhparent
JOIN pg_namespace n ON n.oid = p.relnamespace
WHERE n.nspname = 'heartbeat'
AND p.relname = 'heartbeat_events'
ORDER BY c.relname`
);
const parent = await client.query(
`
SELECT c.relkind AS kind
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'heartbeat'
AND c.relname = 'heartbeat_events'
`
);
const parentIndexes = await client.query(
`
SELECT indexname
FROM pg_indexes
WHERE schemaname = 'heartbeat'
AND tablename = 'heartbeat_events'
ORDER BY indexname
`
);
const cnt = await client.query(
'SELECT count(*)::int AS n FROM heartbeat.heartbeat_events'
);
console.log('parentKind:', parent.rows?.[0]?.kind);
console.log('partitions:', partitions.rows.map((r) => r.partition));
console.log('parentIndexes:', parentIndexes.rows.map((r) => r.indexname));
console.log('rows:', cnt.rows[0].n);
await client.end();
}
main().catch((err) => {
console.error('smoke test failed:', err);
process.exit(1);
});