Files
hjjeong 50669a66ee 프로젝트관리>제품구분_WBS관리 메뉴 신설 — wace WBS 템플릿 1:1 이식
· 메인 그리드 5컬럼(제품구분/제목/WBS/등록자/등록일) + 통합 팝업(트리 CRUD + 엑셀 임포트 + 템플릿 다운로드)
· 운영 매핑: pms_wbs_template(헤더) + pms_wbs_task_standard(트리) — 활성 갈래 확정 (_info/_standard2 갈래는 2021년 멈춘 레거시)
· wace mergeExcelUploadWBS 1:1: 신규=헤더+트리 INSERT, 수정=트리 일괄 DELETE→INSERT (헤더 변경 없음)
· objid 채번 gen_random_uuid()::text, 엑셀 파싱 xlsx(SheetJS), 정적 템플릿 frontend/public/templates/
· DataGrid 컬럼 단위 onClick 추가 (WBS 폴더 셀 클릭용)
· DDL: 8개 테이블 162컬럼 (docs/migration/project/ddl-extracted/200_pms_wbs.sql) / GAP: docs/migration/project/02-wbs-template.md
· 프로젝트 자동 복사/진행관리 연계는 wace도 미완성 — P2 범위 외

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:43:51 +09:00
..

추출된 DDL (wace_plm 운영 DB) — 프로젝트관리(P2)

추출일: 2026-05-11 출처: 211.115.91.141:11133/waceplm (PostgreSQL 16.8) 적용 대상: 211.115.91.141:11134/vexplor_rps 추출 방법: information_schema 쿼리 (pg_dump 14.19 ↔ 16.8 버전 불일치로 직접 추출 불가 — 영업관리 패턴과 동일)

vexplor_rps에 부재한 WBS 계열 8개 테이블을 운영DB에서 추출해 P2(WBS관리)용 베이스 스키마 구성.

파일

파일 테이블 컬럼 운영 데이터
200_pms_wbs.sql pms_wbs_task (트리 — 설계/구매/제작/자체검사/최종검사/출하/셋업) 58 0건
pms_wbs_task_info (일반 task 리스트 — 실사용) 22 518건
pms_wbs_task_confirm (작업 확정, objid numeric) 7 0건
pms_wbs_task_standard (트리 표준) 10 5건
pms_wbs_task_standard2 (일반 task 표준 — 실사용) 20 74건
pms_wbs_template (제품별 템플릿) 6 1건
setup_wbs_task (셋업 진척 — 최다 사용) 20 2,576건
setup_wbs_task_standard (셋업 표준) 19 46건

운영 컬럼 합 162개 / vexplor_rps 적용 후 162개 — 100% 일치 확인.

핵심 발견

1. 두 갈래 WBS 구조 (트리 vs 평면 리스트)

운영DB에 두 종류 task 테이블이 공존:

갈래 구조 운영 데이터
pms_wbs_task + _standard parent_objid 트리 / 단계별(설계/구매/제작/자체검사/최종검사/출하/셋업) plan/act/rate 컬럼 0건 / 5건 ← 사실상 미사용
pms_wbs_task_info + _standard2 평면 리스트 / task_step+task_seq 정렬 / PM 승인 흐름 518건 / 74건 ← 실사용

운영판이 실제 어느 화면에서 어느 갈래를 쓰는지 wace JSP 분석 + 운영판 화면 캡처로 결정해야 함. _info 갈래가 데이터량 압도적이라 메인 후보지만, JSP 화면이 pms_wbs_task(트리)를 가리킬 가능성도 있음 — 두 갈래 모두 분석.

2. setup_wbs_task가 진척율 데이터 (P1 진행관리 그리드와 연결)

setup_wbs_task 2,576건이 운영에서 가장 큰 WBS 데이터. 진행관리 P1 그리드 컬럼 제조1,2팀 / 제조3팀 / 조립 / 검증 / 출하일 자리가 P1에선 빈 자리였는데, 이게 setup_wbs_task에서 채워지는 데이터일 가능성 높음 (P1 GAP 문서 확인 필요).

3. 인덱스 명 typo

setup_wbs_task_standard _objid_key (_standard 뒤에 공백 한 칸) — 운영 그대로 1:1 보존 ("…" 따옴표 처리).

4. PK/UNIQUE 정책 일관성 없음

  • PK: pms_wbs_task_info, pms_wbs_task_standard, pms_wbs_template (objid)
  • UNIQUE 인덱스만: pms_wbs_task(wbs_task_pk), setup_wbs_task(setup_wbs_task_pk), setup_wbs_task_standard
  • 제약 0: pms_wbs_task_confirm, pms_wbs_task_standard2

운영 1:1 보존. PostgreSQL 측에서는 UNIQUE 인덱스만 있어도 ON CONFLICT 등 동작에 영향 없음.

5. objid 채번 방식

운영DB에 WBS 시퀀스 없음 → wace Java 측에서 UUID.randomUUID() 또는 자체 시퀀스 함수로 생성한 문자열 사용. vexplor_rps에서는 nanoid/uuid 등 backend-node 측 채번 패턴 적용 예정 (영업관리 sales_no 패턴과는 다름).

운영 데이터 시드 (선택)

운영 데이터를 vexplor_rps에 가져오려면(데이터량 작은 표준/템플릿만):

# pg_dump 직접 사용 불가(버전 mismatch) — psql COPY 또는 INSERT 추출
PGPASSWORD='waceplm0909!!' psql -h 211.115.91.141 -p 11133 -U postgres -d waceplm \
  -c "COPY (SELECT * FROM pms_wbs_task_standard2) TO STDOUT WITH CSV HEADER" \
  > /tmp/pms_wbs_task_standard2.csv

PGPASSWORD='vexplor0909!!' psql -h 211.115.91.141 -p 11134 -U postgres -d vexplor_rps \
  -c "\COPY pms_wbs_task_standard2 FROM '/tmp/pms_wbs_task_standard2.csv' WITH CSV HEADER"

setup_wbs_task 2,576건도 동일 방식. 실 데이터 의존성(contract_objid가 운영 project_mgmt.objid를 참조) 때문에 vexplor_rps 측 데이터와 맞지 않을 가능성 — 시드는 화면 검증 단계에서 케이스별 판단.

추출 명령 재현

# 컬럼 정보
PGPASSWORD='waceplm0909!!' psql -h 211.115.91.141 -p 11133 -U postgres -d waceplm -t -A -F '|' -c "
SELECT table_name||'|'||ordinal_position||'|'||column_name||'|'||data_type||'|'||COALESCE(character_maximum_length::text,'')||'|'||COALESCE(numeric_precision::text,'')||'|'||COALESCE(numeric_scale::text,'')||'|'||is_nullable||'|'||COALESCE(column_default,'')
FROM information_schema.columns
WHERE table_schema='public'
  AND table_name IN ('pms_wbs_task','pms_wbs_task_info','pms_wbs_task_confirm','pms_wbs_task_standard','pms_wbs_task_standard2','pms_wbs_template','setup_wbs_task','setup_wbs_task_standard')
ORDER BY table_name, ordinal_position;"

# 제약조건
... information_schema.table_constraints JOIN key_column_usage

# 인덱스
... pg_indexes WHERE schemaname='public'

# 컬럼 코멘트
... information_schema.columns LEFT JOIN pg_statio_all_tables JOIN pg_description

적용

PGPASSWORD='vexplor0909!!' psql -h 211.115.91.141 -p 11134 -U postgres -d vexplor_rps \
  -v ON_ERROR_STOP=1 -f 200_pms_wbs.sql

8개 테이블 모두 IDEMPOTENT (DROP TABLE IF EXISTS … CASCADE로 재실행 안전).