Files
ga-commission-system/ga-mobile-pwa
GA Pro 2c9bf710bc feat: P6 후속 — PWA 출금폼/명세상세/토큰refresh + 펌뱅킹 SETTLED 동기화 + user phone UI
외부 SDK 차단 항목 외 P6 잔여 운영성 작업을 일괄 완료. DB 변경 없음(v85 유지).

PWA:
- 출금 신청 작성 폼 (WithdrawCreate.tsx + POST /api/mobile/me/withdraw-requests + GET /settle-masters)
  · 클라이언트가 보낸 agentId/userId 무시, 토큰에서 강제 결정
- 명세서 상세 + 엑셀 다운로드 (StatementDetail.tsx + GET /api/mobile/me/statements/{id}[/download])
  · 본인 agentId 검증 후 기존 CommissionStatementService.download() 재사용
- 토큰 자동 refresh (request.ts interceptor + authStore.refreshToken)
  · 401 시 단일 refresh 호출로 합치고 broadcast, login/refresh 자체 401 은 무한루프 차단

펌뱅킹 SETTLED 동기화:
- WithdrawBankSettleService + POST /api/internal/bank-settle (BankSettleController)
- Mapper: selectAcceptedTransfers / markSettled / markSettleFailed
- 어댑터 queryStatus 폴링 결과로 SETTLED→COMPLETED, FAILED→APPROVED(재시도풀) 전이
- app.bank-settle.cron 옵션 (기본 비활성)

사용자 phone 등록 UI:
- PUT /api/system/users/{id}/phone — NotBlank 검증 없는 단일 패치 endpoint
- UserList 에 phone 컬럼 + "전화번호" 액션 → Antd Modal 인라인 편집
- 결재 SMS 발신 전제 충족

검증 (9/9 PASS, 라이브):
- ga-common/ga-core/ga-external-adapter/ga-api compileJava BUILD SUCCESSFUL
- ga-frontend / ga-mobile-pwa tsc --noEmit PASS
- POST /api/internal/bank-settle → data=3 (3건 COMPLETED 전이 확인)
- PUT /api/system/users/1/phone → 200, 이후 GET 으로 phone 노출 확인
- 보안 강제: admin(agentId=null)으로 /api/mobile/me/{statements,settle-masters,withdraw-requests} → E403
- POST /api/auth/refresh → 200, 새 accessToken 발급
- 3개 서비스 라이브: ga-api :8082 / ga-frontend :3000 / ga-mobile-pwa :3001

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 22:53:59 +09:00
..

ga-mobile-pwa

설계사 전용 모바일 셀프 조회 PWA 스캐폴드.

스택

  • Vite + React 18 + TypeScript
  • antd-mobile@5 (모바일 UI)
  • vite-plugin-pwa (manifest + service worker autoUpdate)
  • React Query (서버 상태) + Zustand (인증)
  • 백엔드: 기존 ga-api(8082) 그대로 재사용. 로그인 후 /api/auth/meagentId 로 본인 데이터 필터링.

화면

경로 화면 백엔드 API
/login 로그인 POST /api/auth/login, GET /api/auth/me
/ 홈 (요약 카드 + 메뉴) 위 3개 카운트
/statement 정산 명세서 GET /api/statements?agentId=…
/withdraw 출금 신청 이력 GET /api/withdraw-requests?agentId=…
/notice 공지사항 GET /api/notices/active

실행

cd ga-mobile-pwa
npm install
npm run dev   # http://localhost:3001

vite.config.ts/api 프록시가 localhost:8082 로 전달하므로 ga-api 가 가동 중이어야 한다.

빌드 / 프리뷰

npm run build      # tsc --noEmit + vite build (dist/)
npm run preview    # 3001 에서 production 번들 서빙

PWA

  • manifest.webmanifest 자동 생성 (vite-plugin-pwa)
  • 서비스워커: registerType=autoUpdate. 신규 빌드 시 사용자 새로고침 시점에 갱신.
  • 런타임 캐시: /api/** NetworkFirst, 5초 타임아웃, 5분 유효 (오프라인 시 직전 응답 반환)
  • 아이콘: public/pwa-{192,512}.svg (스캐폴드 — 본 배포 시 PNG 권장)

잔여 작업 (스캐폴드 이후)

  • 로그인 응답에서 직접 profile 추출 (현재 /me 추가 호출)
  • 백엔드 /api/mobile/me/* 전용 endpoint — 본인 agentId 자동 필터 (현 클라이언트 필터는 변조 가능)
  • 출금 신청 작성 화면 (현재 이력 조회만)
  • 정산 명세서 상세 + PDF 다운로드
  • 공지 상세 + 본인 알림(user_notification) 표시
  • 토큰 만료 자동 refresh (/api/auth/refresh)
  • 푸시 알림 (FCM 등) — 외부 채널 결정 후
  • 실 아이콘 PNG (192/512/512 maskable)