feat: 회원 상세 - 전체 구매이력 + 조제이력 탭 추가
- 전화번호 → CD_PERSON(CUSCODE) 매핑 - 구매 탭: SALE_MAIN/SALE_SUB (전체 POS 구매) - 조제 탭: PS_main/PS_sub_pharm (처방전 조제) - 병원명, 의사명, 투약일수, 처방 약품 표시 - POS 미등록 회원 안내 메시지 추가
This commit is contained in:
@@ -610,8 +610,9 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-tabs">
|
||||
<div class="detail-tab active" data-tab="mileage" onclick="switchDetailTab('mileage')">📊 적립 내역</div>
|
||||
<div class="detail-tab" data-tab="purchase" onclick="switchDetailTab('purchase')">🛒 구매 이력</div>
|
||||
<div class="detail-tab active" data-tab="mileage" onclick="switchDetailTab('mileage')">📊 적립</div>
|
||||
<div class="detail-tab" data-tab="purchase" onclick="switchDetailTab('purchase')">🛒 구매</div>
|
||||
<div class="detail-tab" data-tab="prescription" onclick="switchDetailTab('prescription')">💊 조제</div>
|
||||
</div>
|
||||
<div class="detail-content" id="detailContent">
|
||||
<div class="detail-loading">데이터를 불러오는 중...</div>
|
||||
@@ -888,8 +889,10 @@
|
||||
|
||||
if (currentDetailTab === 'mileage') {
|
||||
renderMileageTab(content);
|
||||
} else {
|
||||
} else if (currentDetailTab === 'purchase') {
|
||||
renderPurchaseTab(content);
|
||||
} else if (currentDetailTab === 'prescription') {
|
||||
renderPrescriptionTab(content);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -941,26 +944,23 @@
|
||||
}
|
||||
|
||||
function renderPurchaseTab(container) {
|
||||
// 적립 내역 중 품목이 있는 것들만 추출
|
||||
if (!detailData.mileage || !detailData.mileage.transactions) {
|
||||
container.innerHTML = '<div class="detail-empty">📭 구매 이력이 없습니다</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
const purchases = detailData.mileage.transactions.filter(tx =>
|
||||
tx.items && tx.items.length > 0 && tx.points > 0
|
||||
);
|
||||
|
||||
if (purchases.length === 0) {
|
||||
container.innerHTML = '<div class="detail-empty">📭 QR 적립된 구매 이력이 없습니다</div>';
|
||||
// POS 전체 구매 이력 (고객코드 기준)
|
||||
if (!detailData.purchases || detailData.purchases.length === 0) {
|
||||
if (!detailData.pos_customer) {
|
||||
container.innerHTML = '<div class="detail-empty">📭 POS 회원으로 등록되지 않았습니다<br><small style="color:#94a3b8;">전화번호가 POS에 등록되면 구매 이력이 표시됩니다</small></div>';
|
||||
} else {
|
||||
container.innerHTML = '<div class="detail-empty">📭 구매 이력이 없습니다</div>';
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
container.innerHTML = purchases.map(p => {
|
||||
container.innerHTML = detailData.purchases.map(p => {
|
||||
// 날짜 포맷
|
||||
const date = p.created_at ? new Date(p.created_at).toLocaleString('ko-KR', {
|
||||
year: 'numeric', month: 'short', day: 'numeric'
|
||||
}) : '';
|
||||
const dateStr = p.date || '';
|
||||
let formattedDate = dateStr;
|
||||
if (dateStr.length === 8) {
|
||||
formattedDate = `${dateStr.slice(0,4)}.${dateStr.slice(4,6)}.${dateStr.slice(6,8)}`;
|
||||
}
|
||||
|
||||
// 품목 렌더링
|
||||
const itemsHtml = (p.items || []).map(item => `
|
||||
@@ -974,10 +974,9 @@
|
||||
return `
|
||||
<div class="purchase-card">
|
||||
<div class="purchase-header">
|
||||
<span class="purchase-date">📅 ${date}</span>
|
||||
<span class="purchase-total">${(p.total_amount || 0).toLocaleString()}원</span>
|
||||
<span class="purchase-date">📅 ${formattedDate}</span>
|
||||
<span class="purchase-total">${(p.total || 0).toLocaleString()}원</span>
|
||||
</div>
|
||||
<div style="font-size:12px;color:#10b981;margin-bottom:8px;">+${p.points.toLocaleString()}P 적립</div>
|
||||
${p.items && p.items.length > 0 ? `
|
||||
<div class="purchase-items">${itemsHtml}</div>
|
||||
` : ''}
|
||||
@@ -985,6 +984,50 @@
|
||||
`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
function renderPrescriptionTab(container) {
|
||||
// 조제 이력 (고객코드 기준)
|
||||
if (!detailData.prescriptions || detailData.prescriptions.length === 0) {
|
||||
if (!detailData.pos_customer) {
|
||||
container.innerHTML = '<div class="detail-empty">📭 POS 회원으로 등록되지 않았습니다<br><small style="color:#94a3b8;">전화번호가 POS에 등록되면 조제 이력이 표시됩니다</small></div>';
|
||||
} else {
|
||||
container.innerHTML = '<div class="detail-empty">📭 조제 이력이 없습니다</div>';
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
container.innerHTML = detailData.prescriptions.map(rx => {
|
||||
// 날짜 포맷
|
||||
const dateStr = rx.date || '';
|
||||
let formattedDate = dateStr;
|
||||
if (dateStr.length === 8) {
|
||||
formattedDate = `${dateStr.slice(0,4)}.${dateStr.slice(4,6)}.${dateStr.slice(6,8)}`;
|
||||
}
|
||||
|
||||
// 처방 품목 렌더링
|
||||
const itemsHtml = (rx.items || []).map(item => `
|
||||
<div class="purchase-item">
|
||||
<span class="purchase-item-name">${escapeHtml(item.name)}</span>
|
||||
<span class="purchase-item-qty" style="min-width:70px;">${item.days}일 x${item.times_per_day}회</span>
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
return `
|
||||
<div class="purchase-card" style="border-left: 3px solid #6366f1;">
|
||||
<div class="purchase-header">
|
||||
<span class="purchase-date">📅 ${formattedDate}</span>
|
||||
<span style="font-size:12px;color:#6366f1;">${rx.total_days || ''}일분</span>
|
||||
</div>
|
||||
<div style="font-size:12px;color:#64748b;margin-bottom:8px;">
|
||||
🏥 ${escapeHtml(rx.hospital || '')} · ${escapeHtml(rx.doctor || '')}
|
||||
</div>
|
||||
${rx.items && rx.items.length > 0 ? `
|
||||
<div class="purchase-items">${itemsHtml}</div>
|
||||
` : ''}
|
||||
</div>
|
||||
`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
function openSendFromDetail() {
|
||||
if (!currentDetailMember) return;
|
||||
|
||||
Reference in New Issue
Block a user