728x90
λ°μν
SMALL
Alarm Popup μμ€ν μ°κ΅¬λ ΈνΈ
π κ°μ
alarm-popup.jsλ μ€μκ° μλ νμ
μμ€ν
μ ꡬνν JavaScript λͺ¨λμ
λλ€. νμ¬, κ°μ€, μΉ¨μ
λ±μ 보μ μλμ μ€μκ°μΌλ‘ λͺ¨λν°λ§νκ³ μ¬μ©μμκ² νμ
ννλ‘ μλ¦Όμ μ 곡ν©λλ€.
ποΈ μμ€ν μν€ν μ²
μ£Όμ ν΄λμ€ κ΅¬μ‘°
1. PopupDB ν΄λμ€
- λͺ©μ : IndexedDBλ₯Ό νμ©ν μλ λ°μ΄ν° μꡬ μ μ₯
- νΉμ§:
- λΈλΌμ°μ μ¬μμ μμλ μλ μν 볡μ
- λΉλκΈ° μ²λ¦¬λ‘ μ±λ₯ μ΅μ ν
- μλ¬ μ²λ¦¬ λ° ν΄λ°± λ©μ»€λμ¦
class PopupDB {
constructor() {
this.dbName = 'AlarmPopupDB';
this.version = 1;
this.storeName = 'popups';
}
}
2. AlarmPopupManager ν΄λμ€
- λͺ©μ : μλ νμ μμ€ν μ μ 체 κ΄λ¦¬
- ν΅μ¬ κΈ°λ₯:
- μ€μκ° μλ ν΄λ§ (4μ΄ κ°κ²©)
- μλ κ·Έλ£Ήν λ° λΆλ₯
- νμ UI μμ± λ° κ΄λ¦¬
- μλ¦Όμ μ¬μ
- λλκ·Έ μ€ λλ‘ κΈ°λ₯
π ν΅μ¬ μν¬νλ‘μ°
1. μ΄κΈ°ν κ³Όμ
μμ€ν
μμ β IndexedDB μ΄κΈ°ν β μ μ₯λ νμ
볡μ β ν΄λ§ μμ2. μλ μ²λ¦¬ κ³Όμ
API ν΄λ§ β μ μλ μμ β μλ κ·Έλ£Ήν β νμ
μμ±/μ
λ°μ΄νΈ β μλ¦Όμ μ¬μ3. μλ κ·Έλ£Ήν λ‘μ§
- νμ¬/κ°μ€/μΉ¨μ
μλ:
alarmType_deviceGroupIdννλ‘ κ·Έλ£Ήν - κΈ°ν μλ:
alarmTypeλ§μΌλ‘ κ·Έλ£Ήν - μλ νμ
μ κ·ν:
- 17, 193 β 1 (νμ¬)
- 18 β 2 (κ°μ€)
- 19 β 3 (μΉ¨μ )
π΅ μλ¦Όμ μμ€ν
μλ¦Όμ λ‘λ λ° μ¬μ
async loadNotificationSound() {
const soundSetting = localStorage.getItem('clientNotificationSound');
if (soundSetting) {
this.notificationSoundPath = soundSetting;
}
}
playNotificationSound() {
const audio = new Audio(this.notificationSoundPath);
audio.volume = 1;
audio.play().catch(error => {
console.warn('μλ¦Όμ μ¬μ μ€ν¨:', error);
});
}
πΎ λ°μ΄ν° μμμ±
IndexedDB νμ©
- μ μ₯μ μ΄λ¦:
AlarmPopupDB - μ€ν μ΄ μ΄λ¦:
popups - ν€ κ΅¬μ‘°:
alarmType_deviceGroupIdλλalarmType - λ°μ΄ν° ꡬ쑰:
{ key: string, data: { alarmType: string, alarmTypeName: string, deviceGroupId: string, deviceGroupName: string, alarmList: Array, timestamp: number } }
π¨ UI/UX κΈ°λ₯
νμ UI νΉμ§
- λμ μμΉ μ‘°μ : κΈ°μ‘΄ νμ κ³Ό κ²ΉμΉμ§ μλλ‘ μλ λ°°μΉ
- λλκ·Έ μ€ λλ‘: μ¬μ©μκ° νμ μμΉ μ‘°μ κ°λ₯
- μμ μ½λ©: μλ νμ
λ³ κ΅¬λΆ (CSS ν΄λμ€:
color-{alarmType}) - λ°μν ν μ΄λΈ: μλ μ 보λ₯Ό ν μ΄λΈ ννλ‘ νμ
λλκ·Έ κΈ°λ₯ ꡬν
const onMouseDown = (e) => {
isDragging = true;
const rect = popup.getBoundingClientRect();
startX = e.clientX - rect.left;
startY = e.clientY - rect.top;
// μ΄λ²€νΈ 리μ€λ λ±λ‘
};
π§ μ£Όμ κΈ°λ₯ λΆμ
1. μ€μκ° ν΄λ§ μμ€ν
- ν΄λ§ κ°κ²©: 4μ΄
- API μλν¬μΈνΈ:
/api/monitoring/select-alarm-popup-message - λ§μ§λ§ μμ μλ ID μΆμ : μ€λ³΅ μλ λ°©μ§
2. μλ λΆλ₯ λ° μ²λ¦¬
function normalizeAlarmType(type) {
if (type === '17' || type === '193') return '1';
if (type === '18') return '2';
if (type === '19') return '3';
return type;
}
3. κ·Έλ£Ή ν΄μ κΈ°λ₯
- νμ¬ μλ: μΌμ 볡ꡬ/νμ¬ ν΄μ μλ¦Ό ν ν΄μ κ°λ₯
- API νΈμΆ:
/api/monitoring/group-send-wave-alarm - νλΌλ―Έν°:
deviceGroupIds,alarmSetting
π μ±λ₯ μ΅μ ν
λ©λͺ¨λ¦¬ κ΄λ¦¬
- λ©λͺ¨λ¦¬ μΊμ:
Mapκ°μ²΄λ‘ μ΄λ¦° νμ κ΄λ¦¬ - μ€λ³΅ μ κ±°:
alarmIdκΈ°μ€μΌλ‘ μ€λ³΅ μλ νν°λ§ - λΉλκΈ° μ μ₯: IndexedDB μ μ₯ μ λ©μΈ μ€λ λ λΈλ‘νΉ λ°©μ§
μλ¬ μ²λ¦¬
- IndexedDB μ€ν¨ μ: λ©λͺ¨λ¦¬ λͺ¨λλ‘ ν΄λ°±
- μλ¦Όμ μ¬μ μ€ν¨: μ¬μ©μ μνΈμμ© νμ λ©μμ§ νμ
- API νΈμΆ μ€ν¨: μ½μ λ‘κ·Έ λ° κ³μ ν΄λ§
π νμ€ν 리 κΈ°λ₯
24μκ° μλ νμ€ν 리
- κΈ°λ₯: μ§λ 24μκ° λμμ λͺ¨λ μλ μ‘°ν
- API:
/api/monitoring/select-alarm-popup-message-history - UI: λ³λ νμ μΌλ‘ μλ λͺ©λ‘ νμ
window.showAlarmPopupHistory = function() {
const now = new Date();
const yesterday = new Date(now.getTime() - (24 * 60 * 60 * 1000));
// API νΈμΆ λ° UI μμ±
}
π 보μ κ³ λ €μ¬ν
μλ νμ λ³ μ μ½
- νμ¬ μλ (νμ
1):
- νμ κ°μ λ«κΈ° λ°©μ§
- μΌμ 볡ꡬ μλ¦Ό νμλ§ ν΄μ κ°λ₯
- κ·Έλ£Ή ν΄μ κΈ°λ₯ μ ν
λ°μ΄ν° κ²μ¦
- μλ λ°μ΄ν° μ ν¨μ± κ²μ¬
- deviceGroupId μ‘΄μ¬ μ¬λΆ νμΈ
- μ¬μ©μ κΆν νμΈ (κ·Έλ£Ή ν΄μ μ)
π λΈλΌμ°μ νΈνμ±
μ§μ κΈ°μ
- IndexedDB: λͺ¨λ λͺ¨λ λΈλΌμ°μ μ§μ
- Web Audio API: μλ¦Όμ μ¬μ
- localStorage: μ€μ μ μ₯
- Fetch API: μλ² ν΅μ
ν΄λ°± λ©μ»€λμ¦
- IndexedDB μ€ν¨ μ λ©λͺ¨λ¦¬ μ μ₯μ μ¬μ©
- μλ¦Όμ μ¬μ μ€ν¨ μ μ‘°μ©ν μ€ν¨ μ²λ¦¬
π― μ¬μ© μλ리μ€
μΌλ°μ μΈ μ¬μ© νλ¦
- νμ΄μ§ λ‘λ: μμ€ν μ΄κΈ°ν λ° μ μ₯λ νμ 볡μ
- μ€μκ° λͺ¨λν°λ§: 4μ΄λ§λ€ μλ‘μ΄ μλ νμΈ
- μλ μμ : νμ μμ± λ° μλ¦Όμ μ¬μ
- μ¬μ©μ μνΈμμ©: νμ μ΄λ, κ·Έλ£Ή ν΄μ , λ«κΈ°
- νμ€ν 리 μ‘°ν: κ³Όκ±° μλ λ΄μ νμΈ
νΉμ μν© μ²λ¦¬
- λΈλΌμ°μ μ¬μμ: IndexedDBμμ νμ μν 볡μ
- λ€μ€ ν: localStorageλ₯Ό ν΅ν λκΈ°ν
- λ€νΈμν¬ μ€λ₯: ν΄λ§ κ³μ μλ
π§ μ€μ λ° μ»€μ€ν°λ§μ΄μ§
μ£Όμ μ€μ κ°
this.pollInterval = 4000; // ν΄λ§ κ°κ²© (4μ΄)
this.warningMs = 30 * 1000; // κ²½κ³ μκ° (30μ΄)
this.timeoutSidebarMs = 10 * 60 * 1000; // μ¬μ΄λλ° νμ μκ° (10λΆ)
컀μ€ν°λ§μ΄μ§ ν¬μΈνΈ
- ν΄λ§ κ°κ²© μ‘°μ : μλ² λΆνμ μ€μκ°μ± κ· ν
- μλ¦Όμ μ€μ : localStorageμμ μ¬μ©μ μ μ μ¬μ΄λ
- UI ν λ§: CSS ν΄λμ€λ₯Ό ν΅ν μλ νμ λ³ μ€νμΌλ§
π λͺ¨λν°λ§ λ° λ‘κΉ
λ‘κ·Έ λ 벨
- INFO: μ μμ μΈ μλ μ²λ¦¬ κ³Όμ
- WARN: 볡ꡬ κ°λ₯ν μ€λ₯ (IndexedDB μ€ν¨ λ±)
- ERROR: μ€μν μ€λ₯ (API νΈμΆ μ€ν¨ λ±)
μ±λ₯ λ©νΈλ¦
- νμ 볡μ μκ°: IndexedDBμμ λ°μ΄ν° λ‘λ μκ°
- ν΄λ§ μλ΅ μκ°: API νΈμΆ μλ΅ μκ°
- λ©λͺ¨λ¦¬ μ¬μ©λ: μ΄λ¦° νμ μμ λ©λͺ¨λ¦¬ μΊμ ν¬κΈ°
π ν₯ν κ°μ λ°©μ
μ±λ₯ μ΅μ ν
- WebSocket μ°κ²°: ν΄λ§ λμ μ€μκ° νΈμ μλ¦Ό
- κ°μν: λλμ μλ λ°μ΄ν° ν¨μ¨μ λ λλ§
- Service Worker: λ°±κ·ΈλΌμ΄λμμ μλ μ²λ¦¬
κΈ°λ₯ νμ₯
- μλ νν°λ§: μ¬μ©μ μ μ νν° μ΅μ
- μλ μ°μ μμ: μ€μλλ³ νμ μ€νμΌλ§
- λͺ¨λ°μΌ μ΅μ ν: ν°μΉ μΈν°νμ΄μ€ μ§μ
μ¬μ©μ κ²½ν κ°μ
- ν€λ³΄λ λ¨μΆν€: νμ μ μ΄λ₯Ό μν λ¨μΆν€
- μ κ·Όμ±: μ€ν¬λ¦° 리λ μ§μ
- λ€κ΅μ΄: κ΅μ ν μ§μ
728x90
λ°μν
LIST