diff --git a/apps/as/docs/spec/essential-attachment-file-management/SPEC.md b/apps/as/docs/spec/essential-attachment-file-management/SPEC.md index 72e7c06b7..7fbbc9345 100644 --- a/apps/as/docs/spec/essential-attachment-file-management/SPEC.md +++ b/apps/as/docs/spec/essential-attachment-file-management/SPEC.md @@ -33,10 +33,10 @@ ├──────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ [영역 B] 필수첨부파일 목록 │ │ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ │ -│ │ 필수첨부파일아이디 | 문서구분 | 필수첨부파일명 | 필수첨부여부 | 비고 | 등록일시 | 수정일시 | 관리 │ +│ │ 필수첨부파일아이디 | 문서구분 | 필수첨부파일명 | 필수첨부여부 | 필수파일검토내용 | 비고 | 관리 │ │ │ ├────────────────────────────────────────────────────────────────────────────────────────────────┤ │ -│ │ EAF-0001 | 설치인가 | 사업계획서 | 예 | 서명본 첨부 | 2026-04-22 10:10:00 | — | [수정][삭제] │ │ -│ │ EAF-0002 | 기본계획 | 변경사유서 | 예 | — | 2026-04-22 11:00:00 | — | [수정][삭제] │ │ +│ │ EAF-0001 | 설치인가 | 사업계획서 | 예 | 사업비 내역 검토 | 서명본 첨부 | [수정][삭제] │ │ +│ │ EAF-0002 | 기본계획 | 변경사유서 | 예 | 변경 전후 비교표 | — | [수정][삭제] │ │ │ └────────────────────────────────────────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -47,7 +47,9 @@ │ 필수첨부파일아이디(자동발급) [EAF-0004] │ │ 문서구분 [설치인가 ▼] │ │ 필수첨부파일명 [예: 사업계획서] │ + │ 양식파일 [파일 선택] │ │ 필수첨부여부 [ ] 예 [ ] 아니오 │ + │ 필수파일검토내용 [검토내용을 입력하세요]│ │ 비고 [비고를 입력하세요] │ ├──────────────────────────────────────────────────────┤ │ [취소] [저장] │ @@ -139,16 +141,16 @@ END ### 5-2. 그리드 컬럼 -| 컬럼명 | Field | 타입 | 비고 | -| ------------------ | ------------------- | ------ | ------------------------------------- | -| 필수첨부파일아이디 | `esntlAtchFileId` | string | 예: `EAF-0001`, 클라이언트 생성/입력 | -| 문서구분 | `docSeComCd` | string | 코드명 표시 — 공통코드 (TBD 상위코드) | -| 필수첨부파일명 | `esntlAtchFileNm` | string | | -| 필수첨부여부 | `esntlAtchYn` | string | `Y`→예, `N`→아니오 | -| 비고 | `esntlAtchFileRmrk` | string | 없으면 `—` 표시 | -| 등록일시 | `regDt` | string | `yyyy-MM-dd HH:mm:ss` | -| 수정일시 | `mdfcnDt` | string | 미수정 시 빈 값 또는 `—` | -| 관리 | — | — | 행별 **[수정] · [삭제]** | +| 컬럼명 | Field | 타입 | 비고 | +| ------------------ | -------------------- | ------ | ------------------------------------- | +| 필수첨부파일아이디 | `esntlAtchFileId` | string | 예: `EAF-0001`, 클라이언트 생성/입력 | +| 문서구분 | `docSeComCd` | string | 코드명 표시 — 공통코드 (TBD 상위코드) | +| 필수첨부파일명 | `esntlAtchFileNm` | string | | +| 필수첨부여부 | `esntlAtchYn` | string | `Y`→예, `N`→아니오 | +| 필수파일검토내용 | `esntlAtchFileRvwCn` | string | 없으면 `—` 표시, 최대 2줄 clamp | +| 비고 | `esntlAtchFileRmrk` | string | 없으면 `—` 표시 | +| 양식 내려받기 | `atchFileGroupId` | string | 양식파일 다운로드 버튼 | +| 관리 | — | — | 행별 **[수정] · [삭제]** | - 행 클릭 시 별도 상세 화면 없음. 편집은 **[수정]** 버튼으로 다이얼로그 C를 연다. @@ -167,13 +169,15 @@ END ### 6-1. 폼 필드 -| 표시명 | 입력 유형 | 필수 | 기본값 | API 파라미터 매핑 | 비고 | -| ------------------ | ---------- | ---- | ------ | ------------------- | -------------------------------- | -| 필수첨부파일아이디 | (Readonly) | Y | — | `esntlAtchFileId` | 등록 시 미노출 | -| 문서구분 | CodeSelect | Y | — | `docSeComCd` | 예: 설치인가, 기본계획 | -| 필수첨부파일명 | Text | Y | — | `esntlAtchFileNm` | placeholder: "예: 사업계획서" | -| 필수첨부여부 | RadioGroup | Y | Y | `esntlAtchYn` | Y/N, UI 표시: 예/아니오 | -| 비고 | Textarea | N | — | `esntlAtchFileRmrk` | placeholder: "비고를 입력하세요" | +| 표시명 | 입력 유형 | 필수 | 기본값 | API 파라미터 매핑 | 비고 | +| ------------------ | ------------------- | ---- | ------ | -------------------- | ---------------------------------- | +| 필수첨부파일아이디 | (Readonly) | Y | — | `esntlAtchFileId` | 등록 시 미노출 | +| 문서구분 | CodeSelect | Y | — | `docSeComCd` | 예: 설치인가, 기본계획 | +| 필수첨부파일명 | Text | Y | — | `esntlAtchFileNm` | placeholder: "예: 사업계획서" | +| 양식파일 | AttachmentFileField | N | — | `atchFileGroupId` | TUS 파일 업로드 | +| 필수첨부여부 | RadioGroup | Y | Y | `esntlAtchYn` | Y/N, UI 표시: 예/아니오 | +| 필수파일검토내용 | Textarea | N | — | `esntlAtchFileRvwCn` | placeholder: "검토내용을 입력하세요"| +| 비고 | Textarea | N | — | `esntlAtchFileRmrk` | placeholder: "비고를 입력하세요" | ### 6-2. 버튼 @@ -210,28 +214,32 @@ END **응답 DTO** -| Field | 타입 | 설명 | -| ------------------- | ------- | -------------------------------- | -| `esntlAtchFileId` | string | 필수첨부파일아이디 | -| `docSeComCd` | string | 문서구분공통코드 | -| `esntlAtchFileNm` | string | 필수첨부파일명 | -| `esntlAtchYn` | string | 필수첨부여부 (Y/N) | -| `esntlAtchFileRmrk` | string? | 필수첨부파일비고 | -| `rgtr` | string? | 등록자 UUID | -| `rgtrNm` | string? | 등록자명 | -| `mdfr` | string? | 수정자 UUID | -| `regDt` | string? | 등록일시 (`yyyy-MM-dd HH:mm:ss`) | -| `mdfcnDt` | string? | 수정일시 | +| Field | 타입 | 설명 | +| -------------------- | -------------------------- | -------------------------------- | +| `esntlAtchFileId` | string | 필수첨부파일아이디 | +| `docSeComCd` | string | 문서구분공통코드 | +| `esntlAtchFileNm` | string | 필수첨부파일명 | +| `esntlAtchYn` | string | 필수첨부여부 (Y/N) | +| `esntlAtchFileRvwCn` | string? | 필수첨부파일검토내용 | +| `esntlAtchFileRmrk` | string? | 필수첨부파일비고 | +| `atchFileGroupId` | string? | 첨부파일그룹아이디 (양식파일) | +| `atchFileList` | AtflMngClientResponseDto[]?| 첨부파일 목록 | +| `rgtr` | string? | 등록자 UUID | +| `rgtrNm` | string? | 등록자명 | +| `mdfr` | string? | 수정자 UUID | +| `regDt` | string? | 등록일시 (`yyyy-MM-dd HH:mm:ss`) | +| `mdfcnDt` | string? | 수정일시 | **저장 Request** -| Field | 필수 | 설명 | -| ------------------- | ---- | ------------------ | -| `esntlAtchFileId` | Y | 필수첨부파일아이디 | -| `docSeComCd` | N | 문서구분 | -| `esntlAtchFileNm` | N | 필수첨부파일명 | -| `esntlAtchYn` | N | 필수첨부여부 | -| `esntlAtchFileRmrk` | N | 비고 | +| Field | 필수 | 설명 | +| -------------------- | ---- | -------------------- | +| `docSeComCd` | Y | 문서구분 | +| `esntlAtchFileNm` | N | 필수첨부파일명 | +| `esntlAtchYn` | N | 필수첨부여부 | +| `esntlAtchFileRvwCn` | N | 필수첨부파일검토내용 | +| `esntlAtchFileRmrk` | N | 비고 | +| `atchFileGroupId` | N | 첨부파일그룹아이디 | **검색 Query** diff --git a/apps/as/src/entities/esntl/model/esntl-interface.ts b/apps/as/src/entities/esntl/model/esntl-interface.ts index 0476fd5a7..fc3d5d94e 100644 --- a/apps/as/src/entities/esntl/model/esntl-interface.ts +++ b/apps/as/src/entities/esntl/model/esntl-interface.ts @@ -19,6 +19,8 @@ export interface EsntlAtchFileMng { esntlAtchYn: "Y" | "N"; /** 필수첨부파일비고 */ esntlAtchFileRmrk?: string; + /** 필수첨부파일검토내용 */ + esntlAtchFileRvwCn?: string; /** 첨부파일그룹아이디 (양식파일 그룹) */ atchFileGroupId?: string; /** 첨부파일 목록 (양식파일) */ @@ -77,6 +79,8 @@ export interface EsntlAtchFileMngSaveRequest { esntlAtchYn?: "Y" | "N"; /** 필수첨부파일비고 */ esntlAtchFileRmrk?: string; + /** 필수첨부파일검토내용 */ + esntlAtchFileRvwCn?: string; /** 첨부파일그룹아이디 (양식파일 그룹) */ atchFileGroupId?: string; } diff --git a/apps/as/src/pages/esntl-atch-file-mng/model/esntl-atch-file-columns.tsx b/apps/as/src/pages/esntl-atch-file-mng/model/esntl-atch-file-columns.tsx index 61a11056e..050d42df9 100644 --- a/apps/as/src/pages/esntl-atch-file-mng/model/esntl-atch-file-columns.tsx +++ b/apps/as/src/pages/esntl-atch-file-mng/model/esntl-atch-file-columns.tsx @@ -51,6 +51,19 @@ export function createEsntlAtchFileColumns({ meta: { align: "center" }, cell: ({ getValue }) => formatYn(getValue()), }), + columnHelper.accessor("esntlAtchFileRvwCn", { + header: "필수파일검토내용", + meta: { align: "left" }, + cell: ({ getValue }) => { + const val = getValue(); + if (!val?.trim()) return "-"; + return ( + + {val} + + ); + }, + }), columnHelper.accessor("esntlAtchFileRmrk", { header: "비고", meta: { align: "center" }, diff --git a/apps/as/src/pages/esntl-atch-file-mng/ui/esntl-atch-file-form-dialog.tsx b/apps/as/src/pages/esntl-atch-file-mng/ui/esntl-atch-file-form-dialog.tsx index c7c63ffed..8a1e5c27b 100644 --- a/apps/as/src/pages/esntl-atch-file-mng/ui/esntl-atch-file-form-dialog.tsx +++ b/apps/as/src/pages/esntl-atch-file-mng/ui/esntl-atch-file-form-dialog.tsx @@ -26,6 +26,7 @@ export interface EsntlAtchFileFormValues { docSeComCd: string; esntlAtchFileNm: string; esntlAtchYn: "Y" | "N"; + esntlAtchFileRvwCn: string; esntlAtchFileRmrk: string; atchFileGroupId: string; } @@ -68,6 +69,7 @@ function EsntlAtchFileFormDialog({ docSeComCd: "", esntlAtchFileNm: "", esntlAtchYn: "Y", + esntlAtchFileRvwCn: "", esntlAtchFileRmrk: "", atchFileGroupId: "", }, @@ -115,6 +117,7 @@ function EsntlAtchFileFormDialog({ docSeComCd: initial.docSeComCd ?? "", esntlAtchFileNm: initial.esntlAtchFileNm ?? "", esntlAtchYn: initial.esntlAtchYn ?? "Y", + esntlAtchFileRvwCn: initial.esntlAtchFileRvwCn ?? "", esntlAtchFileRmrk: initial.esntlAtchFileRmrk ?? "", atchFileGroupId: initial.atchFileGroupId ?? "", }); @@ -127,6 +130,7 @@ function EsntlAtchFileFormDialog({ docSeComCd: "", esntlAtchFileNm: "", esntlAtchYn: "Y", + esntlAtchFileRvwCn: "", esntlAtchFileRmrk: "", atchFileGroupId: "", }); @@ -249,6 +253,17 @@ function EsntlAtchFileFormDialog({ +
+ +