2c9bf710bc
외부 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>
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import api, { unwrap, PageResponse } from './request';
|
|
|
|
export interface StatementResp extends Record<string, unknown> {
|
|
statementId: number;
|
|
agentId: number;
|
|
agentName?: string;
|
|
settleMonth: string;
|
|
statementType: string;
|
|
statementTypeName?: string;
|
|
issueStatus?: string;
|
|
issueStatusName?: string;
|
|
totalCommission?: number;
|
|
totalTax?: number;
|
|
netAmount?: number;
|
|
issuedAt?: string;
|
|
}
|
|
|
|
export interface StatementSearchParam {
|
|
settleMonth?: string;
|
|
statementType?: string;
|
|
issueStatus?: string;
|
|
pageNum?: number;
|
|
pageSize?: number;
|
|
}
|
|
|
|
export interface StatementDetailResp extends StatementResp {
|
|
grossAmount?: number;
|
|
incomeTaxAmount?: number;
|
|
localTaxAmount?: number;
|
|
vatAmount?: number;
|
|
deductionAmount?: number;
|
|
filePath?: string;
|
|
fileFormat?: string;
|
|
issuedBy?: string;
|
|
}
|
|
|
|
export const statementApi = {
|
|
/** 본인 명세서 — 서버측이 토큰 → agentId 강제 필터. */
|
|
list: (params: StatementSearchParam = {}) =>
|
|
unwrap<PageResponse<StatementResp>>(api.get('/api/mobile/me/statements', { params })),
|
|
|
|
/** 본인 명세서 단건 — 서버측이 본인 agentId 가 아니면 E403. */
|
|
detail: (statementId: number) =>
|
|
unwrap<StatementDetailResp>(api.get(`/api/mobile/me/statements/${statementId}`)),
|
|
};
|