고객관리 리스트¶
라우트:
/crm/tasks진입: 좌측 메뉴 CRM → 고객관리 리스트
한 줄 요약
SMS·알림톡·해피콜 큐의 발송/처리 이력 통합 리스트 — 기간/채널/상태 필터링 후 체크박스 다중 선택 → 일괄 발송 / 일괄 완료 처리.
신규 시스템 (2026-05-19 WI#100 Phase B)
옛 crm_tasks 테이블 기반 리스트는 폐기되고 고객관리 시스템(crm_task_logs) 으로 통합되었습니다. 룰/템플릿이 자동 생성한 발송 로그를 한 곳에서 검색·발송·완료 처리합니다.
화면 구성¶
[고객관리 리스트] [전체 / 내 담당] [↻ 새로고침]
─────────────────────────────────────────────────────────────────────
[발송완료 N] [대기 N] [실패 N] [해피콜완료 N] [총건수 N]
─────────────────────────────────────────────────────────────────────
[기간] [채널 ▾] [상태 ▾] [룰 전체 ▾] [템플릿 전체 ▾] [이름▾ 검색]
─────────────────────────────────────────────────────────────────────
(선택 시) N건 선택 [일괄 발송] [일괄 완료] [선택 해제]
─────────────────────────────────────────────────────────────────────
┌ ☐ ┬ 처리시각 ┬ 환자 ┬ 채널 ┬ 룰 ┬ 템플릿 ┬ 상태 ┬ 미리보기 ┬ 액션 ┐
│ ☐ │ 5/19 09:00 │ 김보혜 │ SMS │ R1_한약_D+1 │ T1_안내 │ sent │ ... │ [상세보기] │
└─────────────────────────────────────────────────────────────────────┘
상단 KPI 5종¶
| 타일 | 의미 | 색 |
|---|---|---|
| 발송 완료 | action='sent' 발송 성공 |
초록 |
| 대기 | action='queued' 큐 대기 중 |
주황 |
| 실패 | action='failed' aligo 오류 등 |
빨강 (0건이면 회색) |
| 해피콜 완료 | action='completed' 통화 성공/거절 처리 |
파랑 |
| 총 건수 | 필터 적용 후 전체 행 수 | 회색 |
→ 필터 적용 후 갱신되는 카운트입니다. 전체 DB 합계가 아닙니다.
필터¶
| 필터 | 옵션 |
|---|---|
| 기간 | 시작일 ~ 종료일 (기본 = 최근 3개월) |
| 채널 | 전체 / SMS / 카카오 / 해피콜 / 메모 |
| 상태 | 전체 / 대기(queued) / 발송(sent) / 실패(failed) / 완료(completed) / 취소(cancelled) |
| 룰 | 전체 / 활성 룰 드롭다운 (R1_한약_해독_D+1 등) |
| 템플릿 | 전체 / 활성 템플릿 드롭다운 (T1_안내, T2_재내원 등) |
| 검색 | 이름 / 차트번호 — Enter 또는 🔍 클릭 |
전체 / 내 담당 토글 (헤더 오른쪽 배지):
- 전체 = 모든 환자의 발송 로그
- 내 담당 = level 4(실장) 자동 + admin이 수동 토글 시 본인 매핑 환자만
결과 표 컬럼¶
| 컬럼 | 의미 |
|---|---|
| ☐ | 체크박스 — 일괄 작업 선택 |
| 처리시각 | performed_at (발송 시각 또는 큐 등록 시각) |
| 환자 | 이름 · 차트번호 · 성별/생년월일 |
| 담당 | 환자별 매핑된 실장 칩 (level 1~3 화면에만) |
| 채널 | SMS / 카카오 / 해피콜 / 메모 |
| 룰 | 어떤 자동 룰이 만든 큐인지 (예: R1_한약_해독_D+1) |
| 템플릿 | 발송에 사용된 템플릿명 |
| 상태 | queued / sent / failed / completed / cancelled — 색 배지 |
| 미리보기 | 본문 100자 미리보기 (호버 시 전체) |
| 액션 | [상세보기] 클릭 → 고객관리 상세 팝업 진입 |
자주 쓰는 동작¶
시나리오 1 — 오늘 자동 발송된 SMS 결과 확인¶
- 기간: 오늘 ~ 오늘 / 채널: SMS / 상태: 발송(sent)
- KPI 「발송 완료」 카운트 확인
- 실패가 있으면 상태 = 실패로 필터 → 각 행 [상세보기] → 재발송
시나리오 2 — 대기 큐 일괄 발송¶
수동 발송 정책 룰(auto_send=0)이 매칭한 큐를 한 번에 보내기
- 채널: SMS / 상태: 대기(queued)
- 발송할 행 체크박스 다중 선택 → 상단에
N건 선택액션 바 출현 - [일괄 발송] 클릭 → 미리보기 모달
- 본문 / 수신자 명단 확인 → [확정]
- 5초 중복 차단 가드 + 백엔드 transaction → 발송 결과 alert
시나리오 3 — 해피콜 큐 일괄 완료 처리¶
운영 종료 / 일괄 정리 시
- 채널: 해피콜(call) / 상태: 대기(queued)
- 처리할 행 체크박스 다중 선택
- [일괄 완료] 클릭 → 결과 모달
- 결과: 성공 / 부재중 / 거절 / 재시도 선택 + 메모
- 성공/거절 → 완료 처리 +
patient_calls자동 INSERT - 부재중/재시도 → 큐에 남음 +
error_message메모 누적
시나리오 4 — 환자별 상세 작업¶
각 행의 [상세보기] 버튼 → 고객관리 상세 팝업 (전체 화면)으로 이동. 환자별 문자/통화 이력 + 차트 이력 + 큐 카드 처리 가능. 자세한 내용: 고객관리 상세 페이지
일괄 액션 안전장치¶
| 항목 | 동작 |
|---|---|
| 체크박스 선택 시 검증 | 다른 채널 또는 다른 상태가 섞이면 액션 바에 ⚠️ ... 경고 + 버튼 비활성 |
| 중복 클릭 5초 차단 | global.__inflightCrmSendNow 인메모리 가드 (단일 PM2 fork 모드) |
| DB UNIQUE (rule_id, patient_id, performed_date) | 같은 일자 중복 INSERT 차단 (마이그레이션 071) |
| WHERE action='queued' 가드 | 일괄 완료가 이미 처리된 행에 재실행해도 영향 없음 (idempotent) |
| 수신거부 자동 차단 | patients.sms_consent / ad_consent 거부 환자는 발송 대상에서 제외 |
권한별 차이¶
| 기능 | 권한 |
|---|---|
| 리스트 조회 (전체) | 🟢 admin / level 1~3 |
| 리스트 조회 (본인 담당) | 🟢 level 4(실장) — 자동 필터 |
| 일괄 발송 | 🟢 모든 직원 |
| 일괄 완료 | 🟢 모든 직원 |
| 상세보기 → 큐 카드 처리 | 🟢 모든 직원 |
| 룰/템플릿 관리 | 🔴 고객관리 메인 > 룰/템플릿 + 메시지 템플릿 참조 |
자주 묻는 질문 / FAQ¶
Q. 옛 'TASK' 페이지의 안내 자동생성 / 안내 등록은 어디 갔어요?
WI#100 Phase B 통합으로 옛 crm_tasks 시스템은 폐기되고 고객관리 시스템으로 일원화되었습니다. 안내 자동 생성은 룰(/crm/customer-management/rules)에서, 직접 등록은 환자 컨텍스트 메뉴 → "특별숙제"로 옮겨졌습니다. 본 리스트는 발송/처리 결과 모니터링 전용입니다.
Q. 일괄 발송 클릭했는데 '⚠️ 다른 채널이 섞여있습니다'가 떠요
체크박스로 선택한 행 중 SMS와 해피콜이 섞여있으면 발송 불가합니다. 한 가지 채널만 선택하세요.
Q. 일괄 완료 처리 후 일부 건이 '대기'로 남아있어요
UPDATE WHERE 절에 action='queued' 조건이 있어 이미 처리된 행은 자동 skip 됩니다. alert에 표시된 완료 N / 스킵 M / 실패 K 숫자로 결과 확인하세요. 스킵 = 이미 처리된 건, 실패 = DB 오류 (드뭄).
Q. 룰 / 템플릿 드롭다운에 항목이 안 보여요
/crm/customer-management/rules / /templates 에서 활성(enabled=1) 룰·템플릿만 노출됩니다. 비활성/시드는 제외.
Q. 상세보기를 누르면 새 창이 떠야 하는데 메인 페이지가 바뀌어요
2026-05-19 hotfix로 차단됨 (item.path.startsWith('/popup/') 자동 팝업 오픈). 그래도 발생하면 브라우저 팝업 차단 설정 확인.
Q. 검색이 환자 한 명에 대해 정확히 동작 안 해요
검색 타입을 「이름」 또는 「차트번호」 중 정확한 항목으로 설정 후 Enter. 부분 일치이므로 차트번호는 전체 입력 권장.
Q. 발송 실패 사유는 어디서 봐요?
행의 상태 = 실패 → [상세보기] 진입 → 큐 카드의 error_message 영역에서 aligo 응답 메시지 확인.