사용자-약국 매핑 시스템 개선 및 UI 업데이트

- 자동 매핑 버그 수정: 이름만으로 자동 연결되던 문제 해결
- 매핑되지 않은 약국 목록 API 추가 (/api/pharmacies/available)
- 사용자 연결 드롭다운에서 매핑 가능한 약국만 표시하도록 개선
- 기존 잘못된 매핑 초기화하여 명시적 링크만 허용
- UI 텍스트 업데이트: "Headscale 사용자 목록" → "PQON 사용자 목록"
- UI 텍스트 업데이트: "Headscale 네트워크 사용자" → "PharmQ-ON 사용자"
- 사이드 메뉴 링크 변경: "Headplane UI" → "Medivault" (https://medivault.co.kr/)
- SQLAlchemy or_ import 추가하여 복합 조건 쿼리 지원

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-11 11:49:17 +09:00
parent e71cdb2cda
commit 56b72629f9
3 changed files with 77 additions and 12 deletions

View File

@@ -20,7 +20,7 @@
<i class="fas fa-users text-primary"></i>
사용자 관리
</h1>
<p class="text-muted">Headscale 네트워크 사용자 및 약국 매칭 관리</p>
<p class="text-muted">PharmQ-ON 사용자 및 약국 매칭 관리</p>
</div>
<div class="d-flex gap-2">
<button class="btn btn-outline-secondary" onclick="refreshUserList()">
@@ -87,7 +87,7 @@
<div class="card">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-list"></i> Headscale 사용자 목록
<i class="fas fa-list"></i> PQON 사용자 목록
</h5>
</div>
<div class="card-body" id="usersTableContainer">
@@ -420,13 +420,33 @@ function showLinkPharmacyModal(userName) {
document.getElementById('linkUserName').textContent = userName;
selectedUserId = userName;
// 약국 목록을 셀렉트 박스에 추가
// 매핑 가능한 약국 목록을 API에서 가져오기
const select = document.getElementById('pharmacySelect');
select.innerHTML = '<option value="">약국을 선택하세요</option>';
select.innerHTML = '<option value="">로딩 중...</option>';
currentPharmacies.forEach(pharmacy => {
select.innerHTML += `<option value="${pharmacy.id}">${pharmacy.pharmacy_name} (${pharmacy.manager_name})</option>`;
});
fetch('/api/pharmacies/available')
.then(response => response.json())
.then(data => {
if (data.success) {
select.innerHTML = '<option value="">약국을 선택하세요</option>';
if (data.pharmacies.length === 0) {
select.innerHTML = '<option value="">매핑 가능한 약국이 없습니다</option>';
} else {
data.pharmacies.forEach(pharmacy => {
select.innerHTML += `<option value="${pharmacy.id}">${pharmacy.pharmacy_name} (${pharmacy.manager_name})</option>`;
});
}
} else {
select.innerHTML = '<option value="">약국 목록 로드 실패</option>';
showToast('약국 목록을 불러오는데 실패했습니다.', 'error');
}
})
.catch(error => {
console.error('약국 목록 로드 오류:', error);
select.innerHTML = '<option value="">약국 목록 로드 실패</option>';
showToast('약국 목록을 불러오는데 실패했습니다.', 'error');
});
const modal = new bootstrap.Modal(document.getElementById('linkPharmacyModal'));
modal.show();