Commit Graph

4590 Commits

Author SHA1 Message Date
hjjeong 8acfcdf430 구매관리 7메뉴 품명 컬럼 너비 180~200 → 280px 통일
CARBON BRUSH ASSY (US Spindle V2) 같은 긴 영문 품명이 잘려 보이는 문제 해소.
구매리스트 / 견적요청서 / 품의서 / 입고관리 / 품목별·입고일별 / 프로젝트별 발주입고 현황.
2026-05-15 16:02:41 +09:00
hjjeong 95e0a66290 listProjectStatus mbom_detail.qty 캐스트 오류 수정
NULLIF(MD.QTY, '')::numeric 패턴은 numeric 컬럼을 빈 문자열과 비교하여
"invalid input syntax for type numeric" 에러 발생 → 전체 SELECT 실패 → 빈 그리드.
MD.QTY 만 사용 (이미 numeric, SUM은 NULL safe).
2026-05-15 15:55:19 +09:00
hjjeong c2e364207e 구매관리 입고 3메뉴 + 프로젝트 발주/입고 통계 빈 그리드 채움
- DDL: purchase_order_part(43 cols) + arrival_plan(37 cols) + POM 보충 컬럼 10개
  (mail_send_yn/date, form_type, purchase_close_date 등)
- 데이터: 운영 sample purchase_order_master 1건 + part 1건 + arrival_plan 1건
- listInbound — wace deliveryMngList_new 매퍼 1:1 (POM + S1 집계, AP × POP)
- listInboundByItem — wace deliveryMngPartList 매퍼 1:1 (품목별)
- listInboundByDate — wace purchaseCloseList 매퍼 1:1 (입고일별 + 매입마감)
- listProjectStatus — PO/DLV 통계 0 → 실데이터 (purchase_order_part + arrival_plan)
- INVENTORY_MGMT / INCOMING_INSPECTION 미존재 → 검사/폐기 0 처리 (확정수량=입고수량)
2026-05-15 15:51:22 +09:00
hjjeong 6b029e20f9 구매관리 견적요청서 빈 그리드 채움 (quotation_request_master/detail 신설)
- DDL: quotation_request_master(14 cols) + quotation_request_detail(15 cols)
  운영 → RPS 타입 차이: numeric objid → varchar(64), detail.part_objid bigint(part_mng FK)
- 데이터: 운영 sample master 4건 / detail 4건 (sales_request_part 미존재 → NULL fallback)
- 백엔드 listQuotationRequest — wace salesMng.xml:5248-5349 매퍼 1:1
  (vendor → client_mng JOIN, attach_file_info QUOTATION_RECEIVED 카운트)
- listVendorOptions(client_mng) 신규 — 발주서 vendor 옵션이 supply_mng 와 분리됨
- listPurchaseRequest.has_quotation_request 분기 활성화
- quote-request page.tsx UI 문자열 내부 참조 제거, vendor 옵션 client_mng 로 교체
2026-05-15 15:32:05 +09:00
hjjeong 30a891f4b8 Merge pull request 'hjjeong' (#15) from hjjeong into main
Build and Push Images / build-and-push (push) Has been cancelled
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/15
2026-05-15 06:08:31 +00:00
hjjeong 0658630c68 Merge remote-tracking branch 'origin/main' into hjjeong
# Conflicts:
#	frontend/components/common/CompactFilterBar.tsx
2026-05-15 14:55:52 +09:00
hjjeong 0fe71298d2 공용 NumberInput + 숫자 포맷 정책 적용 (수량 1,234 / 금액 1,234.00)
- NumberInput 공용 컴포넌트: blur 시 콤마+소수점 자릿수 강제,
  focus 시 raw 숫자로 전환되어 자유 편집, 잘못된 입력은 이전 값 유지.
- 다이얼로그 수량/단가 input → NumberInput 으로 교체.
- 백엔드 정규화 — M-BOM/detail/proposal-targets:
  qty=FLOOR()::INTEGER, unit_price/partner_price/total_price=NUMERIC(18,2)
  (운영 sales_request_part 는 정수 String 이지만 M-BOM production_qty
   NUMERIC(15,4) 가 흘러들어와 '4.0000' 노출되던 문제 차단).
- ProposalCreateDialog fmt: Math.floor 후 ko-KR toLocaleString.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:52:50 +09:00
hjjeong 1fb438bdcb 공용 DateInput + DataGrid 헤더 가독성 + 구매요청서 수정모드/공급업체 옵션
- 공용 DateInput (YYYY-MM-DD 통일): text input + Popover Calendar,
  숫자 8자리 자동 - 삽입. CompactDateRange / 다이얼로그 입고요청일 적용.
- DataGrid 헤더 라벨 truncate + TableHead 패딩 축소(!px-1.5):
  좁은 컬럼에서 라벨 겹침/잘림 해소.
- 구매요청서관리 그리드 컬럼 너비 합리화 (총 ~300px 절감)로 품명까지
  화면 안에 표시.
- 구매요청서 수정모드: 선택 1건 시 [구매요청서수정] 분기 →
  getDetail 로 헤더/라인 채워 다이얼로그 오픈. 확정·품의서생성 가드.
- 공급업체 옵션을 client_mng 기반 listVendorOptions 로 신설
  (운영 supply_mng=0 / client_mng=8946, M-BOM vendor 매칭).
- 주문유형 CommCodeSelect groupId 0000005 → 0000167 (계약구분).
- 고객사 셀렉트 → CustomerSelect 공용 컴포넌트로 교체.
- 그리드 delivery_request_date 점 형식 → YYYY-MM-DD 정규화.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:40:28 +09:00
hjjeong 75f4ca8127 영업관리 구매요청 2메뉴 액션 완성 + SmartSelect 키보드 네비
- sales_request_part DDL 추출(운영 11133)→RPS(11134) 마이그레이션
- 백엔드 6 엔드포인트: 프로젝트 자동채움/M-BOM 품목/저장/품의서생성/SSO
  · 품의서 결재상신 Amaranth SSO (target_type=PROPOSAL, formId=1163)
- 프론트 다이얼로그 2개 (구매요청서작성 / 품의서생성 확인)
  · 프로젝트 선택→주문유형·제품구분·국내외·고객사·유무상 자동 채움
  · 행추가 시 M-BOM 품번 셀렉트→품명/공급업체/단가 자동 셋팅
- 공용 SmartSelect: ↑↓·Enter·Esc·Home·End·PageUp·Down 키보드 네비
- 그리드 delivery_request_date . → - 형식 정규화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:01:26 +09:00
chpark c61cf8af99 CompactDateRange — onClick/onFocus 에 showPicker() 강제 호출로 입력칸 클릭 시 달력 표시
Build and Push Images / build-and-push (push) Has been cancelled
2026-05-15 13:52:21 +09:00
chpark a6f3b7b4b7 품질관리 — vexplor_rps DB 컬럼명 정합 + 날짜/조인 타입 수정
Build and Push Images / build-and-push (push) Has been cancelled
vexplor_rps 의 purchase_order_master / sales_request_master / client_mng /
code_info 가 wace_plm 의 컬럼명과 다른 부분을 정합.

수정:
 - pom.contract_objid       → pom.contract_mgmt_objid
 - pom.product_cd           → pom.product_code
 - pom.part_objid           → 부재 (part_mng 조인 FALSE 처리, part_no/name 빈값)
 - srm.proposal_no          → srm.request_mng_no
 - code_info: ci.objid 조인 → ci.code_value = pom.product_code
 - client_mng.partner_name  → client.client_nm

날짜 컬럼 타입 차이 처리:
 - process_inspection_master.inspection_date (varchar) + inspector_id 빈값 → reg_date / writer fallback
 - pms_quality_semi_product_inspection.inspection_date (date) → COALESCE + TO_CHAR
 - incoming_inspection_detail.inspection_date (varchar) + reg_date fallback

데이터:
 - purchase_order_master 1행 waceplm → vexplor_rps 복사 (수입검사 요청 활성화)

수입검사 진행 필터에서 inspection_yn='검사' 하드코딩 제거(이전 커밋)로
'스킵' 행도 노출됨.
2026-05-15 12:25:38 +09:00
hjjeong 3db55d9fd9 구매요청 2메뉴 경로 정렬 + UI 문자열 정리 + 이식 문서 추가
페이지 경로 이동 (menu_info 등록 경로와 일치)
- sales/purchase-request → purchase-request/request (구매요청서관리)
- sales/purchase-proposal → purchase-request/proposal (품의서관리)
- 사이드바 '구매요청' top-level 그룹(objid=100025) 하위 2개 메뉴와 1:1 매칭

UI 문자열 정리
- PageHeader description 2곳에서 wace 매퍼명 노출 제거
- 미구현 액션 toast 3개를 일반 안내문으로 교체 ("XXX 기능은 준비 중입니다.")

문서
- docs/migration/sales/09-purchase-request.md 신규 — 두 메뉴 매핑/컬럼/SQL 정합성/구매관리>품의서관리와의 차이/백로그
- docs/migration/sales/README.md — 이식 대상 4개 → 6개, 매핑표/다음작업 갱신

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 12:24:00 +09:00
chpark 83a774f0f5 품질관리 — waceplm 운영 DB 스키마/데이터 1:1 동기화 + incoming-mgmt 필터 완화
Build and Push Images / build-and-push (push) Has been cancelled
스키마 재정합 (docs/migration/quality/03_waceplm_quality_sync.sql):
 - waceplm.esgrin.com 운영(211.115.91.141:11133/waceplm) 스키마 그대로 이식
 - 기존 bigserial PK 5개 테이블 DROP 후 varchar(50) PK 로 재생성
 - customer_cs, pms_quality_ecr 신규 추가

데이터 복사 (waceplm → vexplor_rps, 126행):
 - customer_cs                              24
 - process_inspection_master                3
 - process_inspection_detail                13
 - incoming_inspection_detail               1
 - pms_quality_semi_product_inspection      84
 - pms_quality_ecr                          1

backend qualityRoutes.ts:
 - incoming-mgmt 의 inspection_yn='검사' 하드코딩 필터를 1=1 로 완화.
   '스킵' 행도 검사 진행 화면에 노출. 완료 건만 보려면 search_inspection_status='완료'.
2026-05-15 12:02:51 +09:00
hjjeong 748fde3d3d docs(migration): 27개 메뉴 통합 진행 상태 README — 6도메인 매트릭스
영업4 + 구매요청2 + 프로젝트2 + 개발5 + 구매9 + 생산5 = 27개 메뉴 한눈에:
 - 매트릭스: 완료17 / 🟡베이스7 / 🟠빈그리드3
 - 도메인별 진행 상태 + 대표 커밋 + 상세문서 링크
 - 공통 인프라(공용 컴포넌트/마이그레이션 패턴/결재/채번)
 - 핵심 정책 8종 + 도메인 함정 8종
 - 다음 작업 우선순위 6종 + 인덱스

품질관리(chpark 베이스, d7c645d2)는 부록으로만 언급.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 11:57:33 +09:00
chpark c74e742b6f 품질관리 4메뉴 — wace_plm JSP + quality.xml MyBatis 1:1 재정합
Build and Push Images / build-and-push (push) Has been cancelled
수입검사 요청 (incoming-request):
 - 필터 12종 (품의서/발주서/프로젝트/품번/품명/공급업체/입고결과/제품구분/
   검사여부/요청현황/요청자/요청일범위)
 - 그리드 12컬럼 (proposal_no, purchase_order_no, project_no, product_name,
   part_no, part_name, partner_name, delivery_status, request_date,
   request_user_name, inspection_yn, request_status)
 - 백엔드: purchase_order_master + incoming_inspection_detail LEFT JOIN
   + sales_request_master + contract_mgmt + part_mng + user_info

수입검사 진행 (incoming-mgmt):
 - 필터 11종 (수입요청과 유사 + 검사일범위 + 검사현황)
 - 그리드 19컬럼 (검사일/검사자/품의서/발주서/프로젝트/제품구분/품명모델/
   부품품번/부품명/공급업체/입고일/입고수량/입고결과/검사수량/불량수량/
   불량률/검사현황/검사성적서)
 - SUM(defect_qty) 서브쿼리로 불량률 자동 계산
 - 하단 요약: 총 입고수량/검사수량/불량수량

공정검사 관리 (process-inspection):
 - 필터 10종 (프로젝트/제품구분/품번/품명/작업환경/측정기/검사일범위/
   검사자/검사결과/진행공정)
 - 그리드 9컬럼 (검사일/검사자/프로젝트/제품구분/품번/품명/검사수량합계/
   검사결과/첨부파일)
 - master/detail 집계 + EXISTS 필터로 wace 1:1

반제품검사 관리 (semi-product-inspection):
 - 필터 8종 (모델명/작업지시번호/부품품번/부품명/검사일범위/검사자/
   불량유형/귀책부서)
 - 그리드 14컬럼 (검사일/검사자/제품구분/모델명/작업지시번호/부품품번/
   부품명/입고수량/양품수량/불량수량/불량률/재생수량/최종양품수량)
 - data_type='GOOD' 마스터 + 동일 inspection_group_id 의 'DEFECT' SUM
 - 재생수량(disposition_type='수정완료') + 최종양품수량 자동 산정
 - 하단 요약: 5개 합계 카드

frontend/lib/api/quality.ts 타입 1:1 정합, 모든 필터 파라미터 직렬화.
2026-05-15 11:23:46 +09:00
hjjeong 21cd81bd79 docs(production): 생산관리 README 신규 — 5메뉴 + PR-B5+ BOM 복사 + 매퍼 매핑
sales/README.md 패턴 따라 생산관리 도메인 전체 문서화:
 - 정책: 5개 메뉴(M-BOM/계획실적×2/소요량×2)가 전부, vexplor 잔재(bom/plan-management/process-info/result/work-instruction) 제외
 - 메뉴 매핑표 + 도메인 테이블 + data-sync/ddl-extracted 인덱스
 - productionplanning.xml 23개 매퍼 → mbomService/prodPlanResultService/mbomRequirementService 1:1 표
 - PR-A0~B5+ 진행 흐름 + 대표 커밋
 - 5메뉴 1:1 검증 결과(Agent 5병렬, 2026-05-15)
 - PR-B5+ BOM 복사 다이얼로그 상세 (BomCopyDialog, 도면업로드 차이 명시)
 - 다음 작업 후보 6종

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 11:14:20 +09:00
hjjeong 6368258797 생산관리 M-BOM PR-B5+ — BOM 복사 다이얼로그 (운영 structureBomCopyFormPopup 1:1)
5개 메뉴 1:1 검증(Agent 5병렬) 후 발견된 mbom 메인 그리드 [BOM 복사] 누락 보완.
저장 매퍼는 PR-B5 saveBomAssignment 재사용 — 백엔드는 EBOM/MBOM 분기 이미 지원,
이번에 MBOM UI 진입점도 첫 노출.

신규 컴포넌트:
 - BomCopyDialog.tsx — 품번/품명 readonly + E-BOM/M-BOM 셀렉트 상호배타 +
   트리 미리보기 + AttachFileDropZone (docType=MBOM_DRAWING, accept=.stp,.step,.dwg,.dxf,.pdf)
 - 메인 page.tsx [BOM 복사] 버튼 추가 + 체크 단건 검증 +
   Machine(0000928) 외 동일 partNo 최신 M-BOM 자동 추천

신규 백엔드 (mbomService/Controller/Routes):
 - searchAssignableMboms — 매퍼 productionplanning.getMbomListForSelect2 (4007~4014) 1:1
 - previewMbomTree     — getStructureOnly + finalize("ASSIGNED_MBOM")
 - getLatestMbomByPartNo — 매퍼 getLatestMbomByPartNo (3426~3445) 1:1, Machine 외 자동 검색
 - 라우트: GET /assignable-mboms, GET /mbom-preview/:objid, GET /latest-mbom-by-partno/:partNo

도면 업로드 차이: 운영 fn_uploadDrawingFiles 는 placeholder("구현 예정"). RPS 는
공용 AttachFileDropZone 재사용해 실구현 (target_objid=projectObjid).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:53:35 +09:00
hjjeong 7e7c6a0ac0 영업관리 구매요청서관리·품의서관리 신규 2메뉴 (wace_plm 1:1)
backend
- services/salesPurchaseRequestService.ts: listPurchaseRequestReg(DOC_TYPE='PURCHASE_REG') + listPurchaseRegProposal(DOC_TYPE='PURCHASE_REG_PROPOSAL')
  · 구매요청서 상태 CASE: PURCHASE_REG_PROPOSAL 자식 존재 시 '품의서생성' → '확정'/'작성중' (wace 매퍼 1:1)
  · 품의서 결재상태: amaranth_approval(target_type='PROPOSAL') LEFT JOIN 우선순위
  · sales_request_part 누락 → MBOM_DETAIL+PART_MNG fallback (구매관리 패턴 동일)
- routes/salesPurchaseRequestRoutes.ts + app.ts: /api/sales/purchase-request, /api/sales/purchase-proposal

frontend
- lib/api/salesPurchaseRequest.ts
- sales/purchase-request/page.tsx — 14컬럼, 구매요청서작성/품의서생성 액션 (placeholder 토스트)
- sales/purchase-proposal/page.tsx — 10컬럼, 결재상신 액션 (placeholder 토스트)
- PageHeader+CompactFilterBar+SmartSelect+DataGrid logicstudio 6종 패턴 일관 적용

구매관리>품의서관리 vs 영업관리>품의서관리 차이
- 구매관리: DOC_TYPE in ('PROPOSAL', 'PURCHASE_REG_PROPOSAL'(결재완료만)) → 발주서 생성 풀
- 영업관리: DOC_TYPE='PURCHASE_REG_PROPOSAL' 전용 → 결재상신 화면 (결재완료 시 구매관리로 자동 노출)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:04:37 +09:00
hjjeong e785cd8a98 Merge pull request 'hjjeong' (#14) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/14
2026-05-15 00:25:12 +00:00
chpark d7c645d24c 품질관리/고객CS/ECR — wace_plm 1:1 이식 + 견적관리 그리드 패턴 통일
Build and Push Images / build-and-push (push) Has been cancelled
신규 4개 메뉴 (PageHeader + CompactFilterBar + DataGrid 통일):
 - 품질관리/수입검사 요청 (/quality/incoming-request)
 - 품질관리/수입검사 관리 (/quality/incoming-mgmt)
 - 품질관리/공정검사 관리 (/quality/process-inspection)
 - 품질관리/반제품검사 관리 (/quality/semi-product-inspection)

DB 마이그레이션 (docs/migration/quality/):
 - 01_quality_tables_from_ilshin.sql — ilshin 운영 5개 테이블 vexplor_rps 정합
   (customer_service_mgmt/part/workingtime, inspection_mgmt, delivery_history_defect)
   + ecr_mng 7개 컬럼 동기화 (project_no, customer_cd, equip_name,
     design_dept, unit_cd, memo, check_result)
 - 02_wace_plm_quality_tables.sql — wace_plm quality.xml 매퍼 호환 신규 5개 테이블
   (incoming_inspection_detail/defect, process_inspection_master/detail,
    pms_quality_semi_product_inspection) + 인덱스 정의

백엔드:
 - qualityRoutes.ts — 4개 메뉴 list 엔드포인트 (실 테이블 조회)
 - ecrMngService SELECT_BASE 에 ilshin 신규 7컬럼 노출
 - app.ts 라우팅 등록 (/api/quality/*)

프론트:
 - DataGrid 4개 신규 페이지 + 그리드 툴바 (차트/엑셀/새로고침/컬럼설정/페이지사이즈)
 - customer-cs/cs, ecr/ecr — 견적관리와 동일한 PageHeader + CompactFilterBar
   + DataGrid 패턴으로 리팩토링 (다이얼로그/기존 API 유지)
 - ECR 그리드에 신규 6개 컬럼 추가 (설비명/프로젝트번호/고객사/설계부서/조치결과 등)
 - AdminPageRenderer 4개 라우트 등록

데이터 복사: ilshin → vexplor_rps (workingtime 5건, inspection_mgmt 1건,
ecr_mng 1건). 나머지 ilshin 운영 테이블은 0건이므로 스키마만 정합.
2026-05-14 19:08:15 +09:00
hjjeong c83a73a111 생산관리 4개 메뉴 보정 — 디렉토리/그리드 헤더/소요량 SQL
디렉토리 rename (menu_info 등록 URL 일치)
- prod-plan-result → plan-result
- prod-plan-result-equip → plan-result-equip
- semi-product-requirement → semi-product-req
- raw-material-requirement → raw-material-req
- menu_info objid 100033~100036 이 가리키는 URL 과 1:1 매칭 + gridId 동기화

DataGrid 헤더 잘림/한 글자 깨짐 수정
- 헤더 라벨 span: whitespace-nowrap + title (이전 break-words 가 한글 단어를 글자 단위로 wrap 시키던 문제 제거)
- 부모 컨테이너 overflow-hidden 도 제거 — 좁은 컬럼에서도 글자가 한 줄로 자연스럽게 표시
- plan-result / plan-result-equip 좁은 컬럼 너비 보정 (수주/추가생산/총생산/완조립/등록자/진척율)

반제품/원자재 소요량 numeric 캐스팅 에러 수정
- RPS DB mbom_detail.qty/required_qty 는 numeric(15,4) — wace_plm 의 varchar 패턴(NULLIF 후 ::INTEGER) 적용 시 invalid input syntax 발생
- COALESCE(MD.QTY, 1)::INTEGER / COALESCE(MD.REQUIRED_QTY, 0)::NUMERIC 으로 교체
2026-05-14 18:13:26 +09:00
hjjeong bd47ca80df 생산관리 M-BOM PR-B5+ — BOM 할당 다이얼로그 운영판 1:1 재구성 + 미리보기 트리
운영판 mBomEbomSelectPopup.jsp (324 lines) 1:1 레이아웃:
  · 헤더 — "E-BOM 선택" / "E-BOM 상세 및 변경" 토글 제목 + 우측 [E-BOM 변경] 버튼
  · 현재 할당된 E-BOM 정보 카드 — 2×3 table (제품구분/품번/품명/Ver/등록일/작성자)
  · 리스트 토글 — 할당된 경우 변경 모드 ON 시에만 노출
  · 검색폼 운영판 매칭 — 제품구분(SmartSelect) + 품번 + 품명 + 등록일(범위)
  · 리스트 헤더 우측 [조회][E-BOM 할당] 버튼 (footer 제거)
  · 선택 시 하단 미리보기 트리 자동 로드 (read-only, 동적 LEVEL + 폴더아이콘)

신규 백엔드:
  · mbomService.previewEbomTree(bomReportObjid) — EBOM_WORKING_TREE_SQL 재사용
  · GET /api/production/mbom/ebom-preview/:bomReportObjid
  · searchAssignableEboms 필터: material/supplier → product_cd/from_date/to_date 운영판 매칭
  · objid 단건 필터 추가 — 현재 할당 E-BOM 카드 정보 자체 로드용

프론트:
  · MbomAssignDialog 완전 재작성 (full layout, SmartSelect, 미리보기 PreviewTree 컴포넌트)
  · MbomDetailDialog: currentEbomObjid prop 으로 단순화 (다이얼로그 내부에서 상세 fetch)
  · mbomApi.previewEbomTree + AssignableEbomFilter 타입 매칭

이전 b38f5957 의 PR-B5 베이스(검색/할당) 위에 운영판 UX 정합 강화.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 18:13:10 +09:00
hjjeong b38f5957f2 구매관리 7메뉴 신규 + M-BOM PR-B3·B5 + 발주관리 DataGrid 통일 + 생산계획&실적 라우트
구매관리 (wace 1:1)
- backend: services/purchaseService.ts (7 list + 옵션 3종) + controllers/purchaseController.ts + routes/purchaseRoutes.ts (/api/purchase 마운트)
- frontend: lib/api/purchase.ts + 7 page.tsx (list/quote-request/proposal/inbound/inbound-by-item/inbound-by-date/project-status)
- 영업관리 4메뉴 DataGrid 패턴 통일 — pageSizeOptions=[10,15,20,50,100], emptyMessage, showColumnSettings/summaryStats/onRefresh/onDownload/showChart
- 마스터단독 데이터(sales_request_master, project_mgmt+mbom_detail) 노출, detail/part 누락 테이블 의존은 빈 그리드 + UI

발주관리 (purchase/order/page.tsx)
- EDataTable → DataGrid 교체 + logicstudio 6종 props + 날짜/숫자 pre-format

M-BOM PR-B3 — 구매리스트 생성 (wace createPurchaseListFromMBom.do 1:1)
- mbomService.createSalesRequest + controller + route POST /api/production/mbom/sales-request
- 단건 체크 + 1:1 강제 + R-YYYYMMDD-NNN 채번 + sales_request_master 단건 INSERT
- production/mbom/page.tsx 에 [구매리스트 생성] 버튼

M-BOM PR-B5 — BOM 할당 (mBomEbomSelectPopup.do)
- mbomService.searchAssignableEboms/assignBom + controller + routes
- MbomAssignDialog 신규, MbomDetailDialog 통합

생산관리 4메뉴 라우트 (생산계획&실적, 소요량)
- prodPlanResultService/Controller + productionPlanResultRoutes (planResult/mbomReq)
- mbomRequirementService + 4 page.tsx (prod-plan-result, prod-plan-result-equip, raw-material-requirement, semi-product-requirement)
- lib/api/prodPlanResult.ts

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 17:31:12 +09:00
hjjeong dee03f6024 생산관리 M-BOM PR-B2 — 본 편집 다이얼로그 행 추가/삭제 (팝업 방식)
행 추가: MbomAddPartDialog 신설 (devPartApi.list 재사용)
  · 품번/품명 검색 + 체크박스 multi-select + 페이지네이션
  · 선택 행 1개면 그 자식으로 추가, 없으면 root (level=1)

편집 모드 확장 (MbomDetailDialog):
  · 체크박스 컬럼(맨 왼쪽) + 전체 선택 토글
  · 선택 행 파란 배경, 새 행 초록 배경 (temp- prefix 식별)
  · toolbar [+ 행 추가] / [선택 삭제] 버튼 추가
  · 선택 삭제 — cascade(선택 + 하위) + 확인창

backend save() UPDATE 분기:
  · client temp- child_objid → 서버 발급 createObjId 매핑
    (객체 ID 안정성 + DB 에 임시 ID 잔존 방지 + 충돌 회피)
  · parent_objid 가 temp- 참조면 신규 ID 로 remap

운영판은 좌(M-BOM)+중앙(<<,>>,변경)+우(소스 트리) 3분할이지만
좌측 19컬럼이 좁아져 가로스크롤 강제되는 약점. 팝업 방식이
트리 풀너비 확보 + 모바일 친화 → 사용자 결정으로 팝업 채택.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:59:29 +09:00
hjjeong 8dd5f184ae 생산관리 M-BOM 변경이력 다이얼로그(PR-B4) + 그리드 컬럼 폭 다듬기
운영 productionplanning.getMbomHistory (3448~3470) 1:1 이식:
  · backend mbomService.getHistory(projectObjid) — project 단위 mbom_header 변경이력
    시간순 최신 우선, USER_INFO join 으로 변경자명 함께
  · GET /api/production/mbom/history/:projectObjid
  · frontend MbomHistoryDialog — 5컬럼 그리드(변경일시/유형/내용/변경자/M-BOM품번)
    CREATE=파란 뱃지, UPDATE=황색 뱃지, max-w-900px
  · MbomDetailDialog toolbar 에 "변경이력" 버튼 (편집 모드 아닐 때만 노출)

PR-B1 의 history 저장 결과를 사용자가 직접 확인할 수 있도록 보는 화면 마무리.

부수: production/mbom/page 그리드 컬럼 폭 정돈 + summaryStats(전체/페이지/수주합/M-BOM 비율).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:39:48 +09:00
hjjeong a6692c4e21 생산관리 — M-BOM 관리에 logicstudio 스타일 DataGrid 적용
PR-B1(7a7f4f03)에 이미 들어간 서버 페이지네이션 + folder 컬럼은 유지하고,
영업관리/개발관리 패턴의 toolbar + 통계만 얹는다.
구매관리 mbom 메뉴는 production/mbom 페이지 re-export 이므로 자동 적용.

추가 DataGrid props:
- showColumnSettings · summaryStats · showChart
- onRefresh = fetchList · onDownload = exportToExcel(현재 페이지 행만, 라벨 매핑)
- systemColumnKeys=["writer_name","mbom_regdate"]

summaryStats (페이지 기준 + 서버 total):
- 전체 건수(서버 total) / 페이지 건수 / 수주수량 합계 / M-BOM 저장 비율(N/M + %)

부수 정리:
- 부모 wrapper 영업관리 통일: flex h-full flex-col overflow-hidden p-2 gap-2
  + DataGrid 직접 자식으로 (min-h-0 flex-1 wrapper 제거)
- 컬럼 폭: ⋮⋮ 핸들 추가로 좁아진 4글자 한국어 라벨을 100~125px 로 보정

서버 페이지네이션 모드라 onDownload 는 현재 페이지만 export.
전체 export 가 필요하면 별 endpoint(서버에서 페이징 없는 전체 응답)와 함께 추가 가능.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:30:51 +09:00
chpark a5ddf852fc 로그인 — 자격증명 오류시 메시지 유지 및 LOGIN_FAILED 코드 처리
- /auth/login 401 응답은 인터셉터에서 리다이렉트하지 않고 그대로 반환해 호출부에서 에러 메시지를 표시하도록 수정
- apiCall에서 errorCode 추출 시 error.code 경로도 지원
- useLogin: errorCode === "LOGIN_FAILED"면 INVALID_CREDENTIALS 메시지 노출
2026-05-14 16:30:11 +09:00
hjjeong 430a511605 Merge pull request 'hjjeong' (#12) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/12
2026-05-14 07:26:59 +00:00
hjjeong 7a7f4f03b5 생산관리 M-BOM 본 편집(PR-B1) + 폴더 컬럼 + DataGrid 서버 페이지네이션 + bigint=varchar fix
PR-B1 본 편집/저장 (운영 saveMbom.do 1:1)
  · 매퍼 7종 1:1 (insert/updateMbomHeader, insert/updateMbomDetail,
    deleteMbomDetailByObjid, insertMbomHistory, updateProjectMbomStatus)
  · 신규 CREATE: createObjId + generateMbomNo(M-{partNo}-YYMMDD-NN) +
    child_objid 재매핑 + detail 일괄 insert + history(CREATE) + project_mgmt.mbom_status='Y'
  · 수정 UPDATE: 기존 mbom_header.objid UPSERT(insert/update/delete) + history(UPDATE)
  · POST /api/production/mbom/save (BEGIN/COMMIT/ROLLBACK 트랜잭션)
  · MbomDetailDialog: '본 편집' 토글 + 13개 셀 인라인 편집 + 저장/취소 가드

M-BOM 컬럼 폴더 아이콘
  · production/mbom/page.tsx: mbom_status 컬럼 → mbom_has(0/1) renderType=folder
  · onClick → MbomDetailDialog 오픈 (행 더블클릭도 그대로 유지)
  · 운영판 wace 견적/partMng 폴더 아이콘 패턴 1:1

DataGrid 서버 페이지네이션
  · props 신설: serverPaging/serverPage/serverPageSize/serverTotalItems
    + onPageChange/onPageSizeChange
  · 5메뉴 적용: production/mbom, development/change-list/ebom-regist/part-search/part-regist
  · pageSizeOptions=[10,15,20,50,100,200,500] 통일
  · 클라이언트 모드 하위호환 유지

bigint=varchar fix (mbom 트리 SQL 4종)
  · ATTACH_FILE_INFO 서브쿼리: P.OBJID(bigint) = F.TARGET_OBJID(varchar) → P.OBJID::varchar 캐스트
  · EBOM_WORKING_TREE_SQL INNER JOIN: P.OBJID = COALESCE(V.LAST_PART_OBJID,V.PART_NO) → ::varchar 캐스트
  · 사용자 보고: 폴더 클릭 시 'operator does not exist: bigint = character varying' 토스트

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:26:20 +09:00
hjjeong 3a5bcb5e3a 공용 — getDirectFileUrl 로컬 origin 을 NEXT_PUBLIC_API_URL fallback 으로
localhost/127.0.0.1 일 때 하드코딩된 http://localhost:8080 대신
NEXT_PUBLIC_API_URL 의 origin(/api suffix 제거) 을 우선 사용.
환경변수 없을 때만 기존 http://localhost:8080 으로 떨어짐.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:09:05 +09:00
hjjeong c955fe0dac 개발관리 — 5메뉴(PART/E-BOM/EO이력)에 logicstudio 스타일 DataGrid 적용
영업관리/프로젝트관리 패턴(fc959d88·6a181371)을 개발관리 5메뉴 전체로 확장.

공통 변경:
- 부모 wrapper 영업관리 통일: flex h-full flex-col overflow-hidden p-2 gap-2
  + DataGrid 를 직접 자식으로 (불필요한 min-h-0 flex-1 wrapper 제거)
- DataGrid props 확장:
  - showColumnSettings · paginationStyle="range" · pageSizeOptions=[10,15,20,50,100]
  - onRefresh = fetchList(또는 runQuery) · onDownload = exportToExcel(GRID_COLUMNS 라벨 매핑)
  - showChart
- 컬럼 폭: ⋮⋮ 드래그 핸들 추가로 좁아진 4글자 한국어/영문 라벨을 95~125px 로 보정

메뉴별 summaryStats:
- PART 등록(M1): 전체·페이지 건수 / 환산수량·개당수량·BOM 수량 합계
- PART 조회(M2): 전체·페이지 건수 / BOM 수량·환산수량·개당수량 합계
- E-BOM 등록(M3): 전체·페이지 건수 + 상태별(status_title) 분포 4종
- E-BOM 조회(M4): 모드(정/역전개) + 표시·원본 행 + MAX_LEVEL + 수량·항목수량 합계
- 설계변경 리스트(M5): 전체·페이지 건수 / 수량·변경수량 합계

systemColumnKeys 분리 (컬럼 설정의 데이터/시스템 그룹 구분):
- PART 등록: revision, status
- PART 조회: revision, eo_no
- E-BOM 등록: dept_user_name, reg_date, deploy_date, revision, status_title
- 설계변경: writer_name, his_reg_date_title

id 매핑 누락 보강 (350ddcd3 함정 재발 방지):
- ebom-search: gridData 에 child_objid 또는 인덱스 fallback id 부여
- change-list: rows 에 objid 또는 인덱스 fallback id 부여
- (PART/E-BOM 등록은 이미 gridRows 매핑 있음)

E-BOM 조회 특수:
- defaultPageSize=100, pageSizeOptions=[20,50,100,200,500] — BOM 트리 가독성
- onDownload 는 PageHeader 의 정/역전개 엑셀 버튼과 동일 동작(현재 direction)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:23:33 +09:00
hjjeong 350ddcd3b8 프로젝트관리 — DataGrid 행 id 매핑 누락 + selectedId 가드
증상:
프로젝트관리 진행관리/WBS 그리드의 모든 행이 회색(bg-accent) 으로 표시.
원인 추적 결과 DataGrid 의 isSelected 평가식 `selectedId === row.id` 가
selectedId 도 row.id 도 둘 다 undefined 일 때 `undefined === undefined` = true
가 되어 모든 행이 selected 상태로 잡힘 (memory: feedback_datagrid_id_mapping
함정의 또 다른 발현 — 영업관리는 항상 id 매핑이 있어 우연히 회피).

수정:
- project/progress/page.tsx, project/wbs-template/page.tsx
  - setRows 에서 `id: r.objid ?? "...-${i}"` 매핑 추가
  - 부모 wrapper 도 영업관리 패턴 `overflow-hidden` + DataGrid 직접 자식으로 통일
- components/common/DataGrid.tsx
  - isSelected 가드 — selectedId/row.id 가 nullish 면 무조건 false 처리.
    향후 다른 페이지에서 id 매핑 누락 시에도 그리드 색 폭주는 차단.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:12:34 +09:00
hjjeong 6a1813719a 프로젝트관리 — 진행관리/WBS템플릿에 logicstudio 스타일 DataGrid 적용
영업관리(fc959d88)와 동일 패턴을 프로젝트관리 2개 메뉴로 확장:

공통 DataGrid props:
- gridId 는 기존(project-progress-wbslist3 / project-wbs-template) 그대로 유지
- showColumnSettings, paginationStyle="range", pageSizeOptions=[10,15,20,50,100]
- onRefresh = fetchList(혹은 fetchList(filterProduct)), onDownload = exportToExcel(라벨 매핑)
- showChart

도메인별 summaryStats:
- 진행관리: 프로젝트 건수 / 수주수량 합계 / 입고율 평균(% 문자열 파싱)
- WBS 템플릿: 템플릿 건수 / WBS 작업 합계 / 평균 WBS 작업수

WBS 템플릿 systemColumnKeys: writer_title, reg_date_title (등록자/등록일 시스템 영역)

컬럼 폭 보정:
- ⋮⋮ 드래그 핸들 추가로 좁아진 4글자 한국어/영문 라벨 95~120px 로 확대
- 진행관리: 주문유형·제품구분·국내/해외·요청납기·E-BOM·M-BOM·제조1,2팀·제조3팀 등
- WBS: WBS 컬럼 100→115, 등록일 130→140

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 14:56:54 +09:00
hjjeong fc959d8872 영업관리 — 주문/판매/매출에 logicstudio 스타일 DataGrid 적용
견적관리(36c1f357)와 동일한 패턴을 나머지 3개 메뉴로 확장:

공통 DataGrid props:
- gridId (sales-order / sales-sale / sales-revenue) 로 컬럼 visibility·순서·너비·차트 영속
- showColumnSettings, paginationStyle="range", pageSizeOptions=[10,15,20,50,100]
- onRefresh = fetchList, onDownload = exportToExcel(GRID_COLUMNS 라벨 매핑)
- showChart

도메인별 summaryStats (하단 통계 행):
- 주문: 수주 건수 / 수주수량·수주취소 합계 / 공급가액·부가세·총액·원화총액 합계
- 판매: 판매 라인 / 수주·판매·잔량 수량 합계 / 판매공급가액·판매원화·잔량원화 합계
- 매출: 매출 이력 / 수량 합계 / 공급가액·부가세·총액·원화총액 합계

컬럼 폭 보정:
- ⋮⋮ 드래그 핸들 추가로 좁아진 4글자 한국어 라벨이 잘리지 않도록 95~135px로 확대
- 시스템 컬럼: 주문관리 writer_name (systemColumnKeys 분리)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 14:53:07 +09:00
hjjeong 36c1f3579e 공용 DataGrid — logicstudio 스타일 toolbar + footer 통계 + 차트 분석 패널 흡수, 견적관리 적용
DataGrid:
- ⟳ Refresh · ⬇ Download · ⚙️ 컬럼 표시 설정 · 📊 차트 분석 toolbar
- 컬럼 visibility 토글 (데이터/시스템 그룹 분리 + 표시·순서·너비 reset)
- summaryStats 하단 통계 행 (라벨/값/접미사)
- paginationStyle 'range' — "1-N / 총 X건" + 페이지 크기 Select
- 행 높이 컴팩트화 (h-7 + py-0 + leading-none, 아이콘 h-3.5)
- sticky 헤더 불투명 배경(bg-muted)으로 스크롤 시 본문 비침 차단
- ⋮⋮ 드래그 핸들 항상 표시

DataGridChartPanel (신규):
- 여러 차트 추가/삭제, 제목 인라인 편집, 드래그 순서 변경
- Bar/Line/Pie + X/Y축 선택 + count/sum/avg/min/max 집계
- localStorage 영속, 360px 고정 높이 + 내부 스크롤

견적관리:
- 컬럼 폭 조정 (⋮⋮ 추가로 좁아진 한국어 4글자 라벨 보장)
- summaryStats, onRefresh, onDownload(exportToExcel) 연결
- gridId="sales-estimate"로 영속화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 14:42:52 +09:00
hjjeong 2b4282fbeb Merge pull request 'hjjeong' (#11) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/11
2026-05-14 00:28:57 +00:00
hjjeong 49956f7afa 개발관리·생산관리 — 3D/2D/PDF 카운트 컬럼을 폴더 아이콘으로 통일
사용자 보고: "품명/3D 컬럼이 좁아서 겹쳐 보임 + 폴더 모양(파랑/투명)으로 표시해줘"

운영판 wace 견적현황·partMng 폴더 아이콘 패턴 1:1 적용:
  - 값 > 0  → 파란 폴더 (fill-[#1a73e8])
  - 값 = 0  → 흰색 폴더 (투명 효과, fill-white + muted text)

수정:
  - app/(main)/COMPANY_16/development/part-regist/page.tsx — 3D/2D/PDF (60→70px, center, folder)
  - app/(main)/COMPANY_16/development/part-search/page.tsx — 3D/2D/PDF (60→70px, center, folder)
  - app/(main)/COMPANY_16/development/ebom-search/page.tsx — 3D/2D/PDF (60→70px width 통일)
  - components/development/BomReportTreeDialog.tsx — "Y/공백" → FolderCell
  - components/production/MbomDetailDialog.tsx       — "Y/공백" → FolderCell

sales/{order,sale,revenue}.tsx 의 cu01_cnt 는 "주문서첨부" clip 아이콘이라 별 의미라 미수정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:40:25 +09:00
hjjeong a136867f52 공용 — 검색·초기화 버튼을 PageHeader 우측 액션 영역으로 이전
사용자 보고: "초기화, 검색 버튼은 상단의 메뉴이름 쪽에 다른 버튼들이랑 같이 있으면 될거같아"

CompactFilterBar 안에 있던 [초기화][검색] 버튼이 자리 차지 + 시선 분산.
PageHeader 의 actions 슬롯 옆으로 통합하면서 11개 페이지 일괄 적용.

PageHeader 확장:
  - onSearch / onReset / loading / searchLabel / resetLabel prop 추가
  - actions 뒤에 [초기화][검색] 버튼 자동 렌더 (h-8 / text-xs)

CompactFilterBar 단순화:
  - onSearch / onReset / loading / searchLabel / resetLabel prop 제거
  - children + totalText 만 유지 (필드 컨테이너 + 합계 텍스트)

11개 페이지: <CompactFilterBar onSearch onReset loading> 3 prop 을
              <PageHeader onSearch onReset loading> 로 이동

메모리: feedback_compact_search_pattern.md 에 "검색·초기화 위치 = PageHeader" 박제

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:17:24 +09:00
hjjeong 16ae6088d4 공용 — menu_desc 사용자 노출 텍스트 정리 (개발 메모 제거)
PageHeader 가 표시하는 menu_info.menu_desc 에서 (wace estimateList 1:1) 같은
원본 매퍼 출처/JSP 파일명 등 개발 메모를 제거. 사용자가 보는 화면이므로
업무 의미만 남긴다.

DB 업데이트 + data-sync 스크립트 동일 내용으로 정정 (멱등 UPDATE 13건).
원칙은 feedback_compact_search_pattern.md 에 박제.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:11:43 +09:00
hjjeong 4f5dd8b47f 공용 — 영업 4 + 프로젝트 2 + 개발 5메뉴 PageHeader + CompactFilterBar 일괄 적용
총 11개 페이지를 동일한 페이지 구조 표준으로 마이그레이션. 페이지 메뉴명은
PageHeader 가 useMenu() 자동 매칭, 검색 영역은 CompactFilterBar/CompactFilterField,
날짜 범위는 CompactDateRange 로 통일. 모든 자체 grid 검색폼 + 자체 h1 + 자체 액션
버튼 그룹 제거.

영업관리 4:
  - sales/estimate (견적관리) — 7필드 + 결재상태 SmartSelect
  - sales/order    (주문서관리) — 9필드 (날짜 2종)
  - sales/sale     (판매관리)   — 10필드 (출하지시상태 SmartSelect)
  - sales/revenue  (매출관리)   — 11필드 (날짜 3종)

프로젝트관리 2:
  - project/progress     (진행관리)         — 11필드 (그리드 6→자동 wrap)
  - project/wbs-template (제품구분_WBS관리) — 1필드

개발관리 5:
  - development/part-regist  (PART 등록)      — 2필드 (자동완성) + 7 액션
  - development/part-search  (PART 조회)      — 2필드 + 5 액션
  - development/ebom-regist  (E-BOM 등록)     — 4필드 + 3 액션 (잔재 Field helper 제거)
  - development/ebom-search  (E-BOM 조회)     — 3필드 + 4 액션 (정/역전개)
  - development/change-list  (설계변경 리스트) — 8필드 (read-only)

DB:
  - menu_info.menu_desc 11개 메뉴 보강 (PageHeader 자동 표시)
  - docs/migration/common/menu_desc_sync.sql (멱등 UPDATE)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:10:07 +09:00
hjjeong e208d26e51 공용 — PageHeader 탭 시스템 대응 (활성 탭 adminUrl 매칭)
RPS 는 탭 기반 라우터라 usePathname() 이 /main 으로 고정됨.
사용자 보고: M-BOM 페이지에서 PageHeader 가 메뉴명을 못 잡아 빈 상태.

수정: useCurrent2ndLevelMenuObjid 와 동일 패턴 적용
  - useTabStore.selectTabs / selectActiveTabId 로 활성 탭 조회
  - pathname='/main' 이면 활성 탭의 adminUrl 로 매칭
  - stripCompanyPrefix 로 /COMPANY_NN 무시 → menu_info.menu_url 양방향 비교

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:51:16 +09:00
hjjeong 2e3a430cf7 공용 — PageHeader 신설 (메뉴명 자동 매칭) + M-BOM 메뉴명 복원
CompactFilterBar 마이그레이션 과정에서 M-BOM 페이지 상단 메뉴명/설명이 사라진
회귀를 해결. customer-cs/cs 의 페이지 헤더 패턴을 공용 컴포넌트로 추출.

신설:
  - components/common/PageHeader.tsx
    · usePathname() + useMenu() 자동 매칭 → menu_info.menu_name_kor + menu_desc
    · 명시 props (title/description/actions) 지원
    · 동적 라우트 prefix fallback (/foo/123 → /foo 매칭)

적용:
  - production/mbom/page.tsx 상단에 <PageHeader /> 1줄 추가

DB:
  - menu_info.menu_desc 보강 (objid 100016/100032)
    "생산용 BOM 트리 + read-only 조회 (운영판 mBomMgmtList 1:1)"

메모리: feedback_compact_search_pattern.md 갱신
  - PageHeader 도 의무 사용 컴포넌트 목록에 추가
  - 페이지 구조 표준 코드 예시 명시

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:49:09 +09:00
hjjeong 364d4707fe 공용 — native <select> 금지 + CompactFilterBar 신설 + M-BOM 시범 마이그레이션
영업관리에 이미 적용된 SmartSelect/CustomerSelect 패턴을 다른 메뉴(생산/개발/프로젝트)
의 native <select> 7개 자리에 일괄 적용. customer-cs/cs 메뉴의 컴팩트 검색바 패턴을
공용 컴포넌트로 추출하고 M-BOM 페이지에 시범 마이그레이션.

신설:
  - components/common/CompactFilterBar.tsx — CompactFilterBar + CompactFilterField + CompactDateRange
    · rounded-md border bg-muted/20 p-2 + flex-wrap (자동 줄바꿈)
    · 자식 input/combobox 자동 h-7 + text-xs 컴팩트화
    · onSearch / onReset / totalText 슬롯

native <select> → SmartSelect 일괄 교체:
  - production/mbom/page.tsx          5건 (주문유형/제품구분/국내해외/고객사/유무상)
  - development/change-list/page.tsx  1건 (년도)
  - development/ebom-regist/page.tsx  1건 (상태)
  - development/ebom-search/page.tsx  1건 (표시레벨)
  - project/progress/page.tsx         3건 (년도/국내해외/유무상)
  - components/development/PartFormDialog.tsx — BasicSelect 가 내부적으로 SmartSelect 위임
  - components/development/BomReportExcelImportDialog.tsx — E-BOM 복사 옵션

M-BOM 시범 마이그레이션:
  - 기존: 2행 grid 6×2 검색 폼 (h-9 큰 입력)
  - 변경: <CompactFilterBar> 안에 <CompactFilterField> 10개 (h-7 컴팩트)

원칙:
  - 향후 모든 신규/수정 페이지는 CompactFilterBar + SmartSelect/CustomerSelect 사용 필수
  - native <select> + 자체 grid 검색폼 작성 금지
  - 메모리: feedback_compact_search_pattern.md

타입체크 0건 에러 (변경 파일 기준).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:44:26 +09:00
hjjeong dd88dc6e8c 생산관리>M-BOM 관리 — PR-A2 단건 상세 + read-only 트리 4분기 (wace mBomPopupLeft.do 1:1)
행 더블클릭 → MbomDetailDialog (헤더 메타 + 동적 LEVEL × 19컬럼 트리 그리드).
운영판 ProductionPlanningController:1113~1276 의 4분기 자동 판별을 백엔드에서 처리:
  1) SAVED         mbom_header.status='Y' 우선 → getSavedMbomTreeList CTE
  2) ASSIGNED_EBOM source_bom_type='EBOM' → partMng.getBOMTreeList(working) CTE
  3) ASSIGNED_MBOM source_bom_type='MBOM' → getMbomStructureOnly CTE
  4) TEMPLATE      Machine 이외 + 동일 part_no → mbom_header 템플릿 CTE
  5) NONE          빈 트리

backend:
  - mbomService.getDetail (getProjectMgmtDetail 1:1, TOTAL_PROD_QTY = production_plan 우선)
  - mbomService.getTree   (4분기 orchestrator + 매퍼 4종 CTE 1:1)
  - GET /api/production/mbom/detail/:objid
  - GET /api/production/mbom/tree/:objid

frontend:
  - lib/api/mbom.ts  : MbomDetail / MbomTreeRow / MbomBomDataType / getDetail / getTree
  - components/production/MbomDetailDialog.tsx (max-w-1600px, 헤더 14필드 + 트리 그리드)
  - page.tsx 행 더블클릭 핸들러

검증: O-RING (593315995) SAVED 분기 5행 정상. TOTAL_PROD_QTY production_plan=5 / QUANTITY=2 fallback 확인.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:29:52 +09:00
hjjeong 55239547d6 생산관리>data-sync — production_plan 신설 + 운영 sample 2행 이관
PR-A2 단건 상세의 TOTAL_PROD_QTY 서브쿼리(`SELECT NULLIF(PP.TOTAL_PROD_QTY,'')::numeric
FROM PRODUCTION_PLAN PP WHERE PP.PROJECT_OBJID=PM.OBJID AND UPPER(PP.STATUS)='ACTIVE'`)
의존 테이블을 운영판 11133.waceplm에서 1:1 추출해 RPS 11134.vexplor_rps에 신설.

- 402_production_plan.sql: 19 컬럼 / 4 인덱스 (objid, project_objid, total_prod_qty 포함)
- 04_production_plan_sync.sql: 운영 sample 2행
  - 1058002488 / W/M ASSY  (-1752090174, total=4)
  - 1439133152 / O-RING    ( 1157387151, total=5)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:29:38 +09:00
hjjeong 66cee22be3 생산관리>M-BOM 관리 — PR-A1 그리드/검색 (mBomMgmtGridList 1:1 이식)
운영 wace productionplanning/mBomMgmtList.jsp + productionplanning.xml:2874-3119
mBomMgmtGridList 매퍼 1:1 이식. PROJECT_MGMT × CONTRACT_ITEM 펼침 그리드
+ M-BOM 헤더/히스토리/구매리스트 상태 표시 + 9 검색 필터.

백엔드 (3 파일 + app.ts 마운트):
- services/mbomService.ts — list() : 9 검색 필터 + 30+ 컬럼 SELECT
  · 주문유형/제품구분/국내해외(CODE_NAME 비교)/고객사(C_ 3-way)/유무상/SN(EXISTS)
  · 품번/품명(PM·CI 양쪽 LIKE)/접수일·요청납기 범위
  · WRITER_NAME/MBOM_EDITOR : user_name() PL/pgSQL (PR-A0 신설)
  · MBOM_STATUS/MBOM_PART_NO/MBOM_REGDATE/MBOM_VERSION : mbom_header+history 서브쿼리
  · PURCHASE_LIST_OBJID/_DATE : sales_request_master.mbom_header_objid 매칭
  · CUSTOMER_NAME : CASE C_% → client_mng / ELSE → supply_mng
- controllers/mbomController.ts — getList
- routes/productionMbomRoutes.ts — GET /list
- app.ts — /api/production/mbom 마운트 (productionRoutes 다음)

프론트 (3 파일):
- lib/api/mbom.ts — MbomListFilter / MbomRow / mbomApi.list
- app/(main)/COMPANY_16/production/mbom/page.tsx — 검색 폼 2행(12 필드) + 16 컬럼 DataGrid
  · comm_code 옵션 로드: /api/sales/codes/0000167 (주문유형) /0000001 (제품구분) /0001782 (유무상)
  · 고객사: /api/sales/customers 재사용 (customer_mng)
  · 국내/해외 + 유상/무상 raw 옵션
- app/(main)/COMPANY_16/purchase/mbom/page.tsx — production/mbom 페이지 re-export
  (사용자 요청: 구매관리 메뉴 트리에도 동일 화면 노출)

메뉴 (data-sync):
- 03_mbom_menu_dedup.sql — menu_info 100016(purchase/mbom) + 100032(production/mbom)
  양쪽 active 보장 (이미 DB에 등록되어 있던 entry)

PR-A2 이후 분리:
- 단건 상세 다이얼로그, read-only mbom_detail 트리 표시
- BOM 복사 (E-BOM→M-BOM 트리 복사)
- 구매리스트 생성 액션 (M-BOM→PURCHASE)
- M-BOM 본 편집 (4프레임 팝업)

검증:
- backend nodemon hot-load OK (401 TOKEN_MISSING 응답으로 라우터 등록 확인)
- 매퍼 SQL 직접 실행: PROJECT_MGMT × CONTRACT_ITEM 5건 + CUSTOMER/M-BOM 매칭 정상
- typecheck: 신규 코드 0 에러 (pre-existing 에러만 잔존)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 15:57:23 +09:00
hjjeong 7af366c595 생산관리>M-BOM 관리 — PR-A0 의존 테이블 신설 (mbom_history/sales_request_master/client_mng + user_name fn)
이전 04cfac6e (구매관리>data-sync) 분류 정정: M-BOM 은 운영 wace "생산관리_M-BOM관리"
메뉴에 1:1 대응. docs/migration/purchase/ → docs/migration/production/ 폴더 rename.

신규 DDL (401_mbom_dependencies.sql):
- mbom_history (8 cols) — M-BOM 변경 이력. FK→mbom_header CASCADE,
  PK objid, idx (header_objid, change_date)
- sales_request_master (27 cols) — 구매요청서 마스터. PK objid,
  mbom_header_objid 컬럼(FK 없음), doc_type/recipient_ref/executor/title 등
  M-BOM→PURCHASE 연계 컬럼, idx (doc_type, mbom_header_objid)
- client_mng (117 cols) — 거래처 마스터. uk(client_cd), idx 3종
- user_name(varchar) PL/pgSQL — 그리드 WRITER_NAME/MBOM_EDITOR 표시용
  (운영 mBomMgmtGridList:user_name(MH.WRITER) 1:1)

운영 sample 이관 (02_mbom_dependencies_sync.sql):
- mbom_history 14 / sales_request_master 3 / client_mng 8,946 → RPS 전이
- staging 패턴(LIKE INCLUDING DEFAULTS + PK·FK·UK 제거) 으로 무결성 우회
- mbom_history: mbom_header 매칭 없는 행은 import 제외 (FK CASCADE 호환)
- sales_request_master: mbom_header_objid 매칭 안 되면 NULL fallback

검증:
- contract_mgmt.customer_objid LIKE 'C_%' → client_mng 매칭 성공
  (운영 매퍼 CUSTOMER_NAME 분기 RPS 에서 그대로 동작)
- user_name('admin') → '관리자' 반환 확인
- M-BOM 관리 화면 PR-A1 (그리드/검색/상세) 의 모든 의존 테이블 준비 완료

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 15:43:21 +09:00
hjjeong 04cfac6eff 구매관리>data-sync — M-BOM 테이블 신설(mbom_header/mbom_detail) + 운영 sample 이관
PR-A 베이스라인 사전 작업. 후속 백엔드/프론트 PR 의 의존성.

DDL (400_mbom.sql):
- mbom_header (21 cols) — PK objid varchar(64), UNIQUE mbom_no
  FK source_ebom_objid → part_bom_report.objid (SET NULL)
  FK source_mbom_objid → mbom_header.objid (SET NULL, self)
- mbom_detail (47 cols) — PK objid varchar(64)
  FK mbom_header_objid → mbom_header.objid (CASCADE)
  FK part_objid → part_mng.objid (SET NULL)
- 인덱스 11개 (project/source/status/header/parent/part 등)

운영DB vs RPS 타입 함정 정정:
- 운영 part_mng.objid varchar(64) → RPS bigint (feedback_createobjid_pattern.md)
- mbom_detail.part_objid 도 bigint 로 통일해 FK 호환
- numeric/varchar 모두 bigint 와 FK 불가 — 정확한 타입 매칭 필요

운영 sample 이관 (01_mbom_sync.sql):
- mbom_header 3 / mbom_detail 95 → RPS 전이
- staging 테이블 패턴 (LIKE INCLUDING DEFAULTS, FK·PK 제거)
- FK 매칭 안 되는 source_ebom_objid / part_objid 는 NULL 처리
- mbom_header 에 없는 mbom_header_objid 행은 DELETE (orphan 방지)
- part_objid varchar(64) → bigint 형변환 (운영 String.hashCode 결과)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 15:05:42 +09:00
hjjeong cac879eded Merge pull request 'hjjeong' (#9) from hjjeong into main
Reviewed-on: https://g.wace.me/chpark/vexplor_rps/pulls/9
2026-05-13 05:37:08 +00:00
hjjeong 7218edc500 개발관리>PART 도면 다중 업로드 — M1·M2 [도면 다중 업로드] 버튼 + 파일명↔품번 자동 매칭
wace partMngTempList.jsp btnDrawingUpload + PartMngController.uploadDrawingFilesForPartList +
partMng.xml partMngListByPartNos 1:1 이식.

- 백엔드 (devPartService.drawingMultiUpload):
  · 확장자 → doc_type 매핑 (STP/STEP=3D_CAD, DWG/DXF=2D_DRAWING_CAD, PDF=2D_PDF_CAD)
  · 파일명에서 알려진 확장자 반복 제거 (.idw .dwg .dxf .stp .step .pdf .chg)
  · PART_NO 매칭: 정확 일치 우선 → 안 되면 longest prefix
  · partNoList 지정 → 그 목록 IN 절로 후보 제한 (M1, 현재 그리드 기반)
  · partNoList 미지정 → IS_LAST='1' 전체 part_mng 매칭 (M2, 페이지 밖도 허용)
    (wace partMngListByPartNos <if PART_NO_LIST != null> 분기 1:1)
  · 매칭 성공 → attach_file_info INSERT (target_objid = part_mng.objid)
  · 매칭 실패 → notFoundCount + 임시 파일 삭제
  · 결과 details[] 반환 (파일별 상태/매칭품번/사유)

- 엔드포인트: POST /api/development/part/drawing-multi-upload
  · multer 파일당 200MB · 최대 500개 · 임시 디스크 저장 후 회사/날짜 폴더 이동

- 프론트 PartDrawingMultiUploadButton (개발관리 공용):
  · 버튼 클릭 → 숨김 input(multiple, accept=.stp,.step,.dwg,.dxf,.pdf)
  · 확장자별 분류 + "총 N개 업로드?" confirm (wace 1:1 텍스트)
  · 결과 다이얼로그 — 총합/성공/품번 미존재/실패 + 파일별 상세표

- M1(part-regist): partNoList = 현재 그리드 rows.part_no 전달
- M2(part-search): partNoList 미전달 → 전체 part_mng 매칭

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