feat: 为 G5 room_status 写入添加强制 online_status 为 1 的功能,并确保冲突时始终更新,即使业务字段未变化

This commit is contained in:
2026-03-10 19:52:14 +08:00
parent 2f8857f98e
commit 360d11222f
3 changed files with 72 additions and 8 deletions

View File

@@ -785,7 +785,7 @@ class DatabaseManager {
}
_buildRoomStatusUpsertQuery(events, target) {
const { tableName, conflictColumns, includeGuid, tableRef } = target;
const { tableName, conflictColumns, includeGuid, tableRef, forceOnlineStatusOnWrite, forceUpdateOnConflict } = target;
const columns = this._getRoomStatusBaseColumns();
const uniqueEventsMap = new Map();
@@ -804,29 +804,43 @@ class DatabaseManager {
return { sql: null, values: [], uniqueEvents: [] };
}
const allColumns = includeGuid ? [...columns, 'guid'] : [...columns];
const allColumns = forceOnlineStatusOnWrite ? [...columns, 'online_status'] : [...columns];
if (includeGuid) {
allColumns.push('guid');
}
const updateColumns = columns.filter((column) => !['ts_ms', ...conflictColumns].includes(column));
const updateSet = updateColumns.map((column) => `${column} = EXCLUDED.${column}`).join(', ');
const updateAssignments = updateColumns.map((column) => `${column} = EXCLUDED.${column}`);
if (forceOnlineStatusOnWrite) {
updateAssignments.push('online_status = 1');
}
const updateSet = updateAssignments.join(', ');
const whereConditions = updateColumns.map((column) => `${tableRef}.${column} IS DISTINCT FROM EXCLUDED.${column}`).join(' OR ');
const values = [];
const placeholders = uniqueEvents.map((event, eventIndex) => {
const rowValues = this._roomStatusToRowValues(event);
if (forceOnlineStatusOnWrite) {
rowValues.push(1);
}
values.push(...rowValues);
const start = eventIndex * rowValues.length;
const params = rowValues.map((_, valueIndex) => `$${start + valueIndex + 1}`).join(', ');
return includeGuid ? `(${params}, gen_random_uuid())` : `(${params})`;
}).join(', ');
const whereClause = forceUpdateOnConflict
? ''
: `
WHERE
${tableRef}.ts_ms <= EXCLUDED.ts_ms
AND (${whereConditions})`;
const sql = `
INSERT INTO ${tableName} (${allColumns.join(', ')})
VALUES ${placeholders}
ON CONFLICT (${conflictColumns.join(', ')})
DO UPDATE SET
${updateSet}
WHERE
${tableRef}.ts_ms <= EXCLUDED.ts_ms
AND (${whereConditions})
${updateSet}${whereClause}
`;
return { sql, values, uniqueEvents };
@@ -876,6 +890,8 @@ class DatabaseManager {
includeGuid: true,
autoCreatePartitions: true,
tableRef: this.config.roomStatusTable ?? 'room_status.room_status_moment',
forceOnlineStatusOnWrite: false,
forceUpdateOnConflict: false,
logPrefix: 'upsertRoomStatus',
});
}
@@ -887,6 +903,8 @@ class DatabaseManager {
includeGuid: false,
autoCreatePartitions: false,
tableRef: this.config.roomStatusTable ?? 'room_status.room_status_moment_g5',
forceOnlineStatusOnWrite: true,
forceUpdateOnConflict: true,
logPrefix: 'upsertRoomStatusG5',
});
}