Commit Graph

4355 Commits

Author SHA1 Message Date
hoffthatmuz 72107474ea chore(ci): add harbor secrets length debug to login step
Diagnose why Harbor login fails despite secrets being registered.
Outputs length-only (value masked) to verify secrets are injected.
2026-05-15 11:03:49 +09:00
chpark 529232c940 Merge pull request 'feat(pipeline): R3 sentinel sanitize (string+number) + R4.0 inbound ports' (#1) from h.offthatmuz/vexplor_pipeline:feat/r3-sentinel-typeof-fix-r4-ports into main
Reviewed-on: https://g.wace.me/chpark/vexplor_pipeline/pulls/1
2026-05-15 01:42:50 +00:00
h.offthatmuz 931127505a feat(pipeline): R3 sentinel sanitize (string+number) + R4.0 inbound ports
R3 — PLC sentinel(-480910 / -481000) drop policy (root cause fix)
  - new: src/domain/policies/tag-value-sanitizer.policy.ts
  - wired in deviceCollectorService.publishData() 진입부 — 모든 sink
    (로컬 MQTT, IDC central MQTT, equipmentState, target DB) 직전 1회 호출
  - typeof bug 수정: PLC/Edge 가 '-480910.000000' string 으로 전송하는 케이스
    포함. coerceNumeric() 으로 number/string 양쪽 안전 변환 후 Set 매칭.
  - T6 (Claude tracer agent) 진단 결과 — Edge 컨테이너에서 hash field 가
    '-480910.000000' string 으로 적재되어 typeof === 'number' 만 검사하던
    이전 로직 통과. dt-web 응답까지 sentinel 도달 확인됨.

R4.0 — Inbound Port 인터페이스만 정의 (런타임 영향 0)
  - new: src/ports/inbound/plc-source.port.ts (PlcSourcePort)
  - new: src/ports/inbound/rest-request.port.ts (RestRequestPort, RestResponse)
  - new: src/ports/inbound/scheduled-trigger.port.ts (ScheduledTriggerPort)
  - 어댑터 구현은 R4.1+ 단계에서 진행 (deviceCollectorService 의 thin wrapper).

영향:
  - Edge pipeline-backend 빌드 시 sanitize 호출 활성화 → IDC Redis 까지
    sentinel 도달 차단. dt-web 의 운영 워크어라운드 제거 가능.
  - 4개 신규 파일 + 1개 기존 파일 +5 lines 수정.

Constraint: chpark 의 로컬 hex 작업과 동기화 필요 — git pull main 후 머지/리베이스 권장
Confidence: high (T6 tracer 가 진단 + Edge build 산물 코드 위치 일치)
Scope-risk: narrow (publishData 진입부 1줄 + 4 신규 파일)
Directive: SENTINEL_VALUES set 변경 시 coerceNumeric 의 string 처리도 함께 갱신
Not-tested: chpark 의 로컬 R1~R5 작업과의 충돌 (사용자가 안내 예정)
2026-05-15 10:30:30 +09:00
chpark 974938d8aa fix(frontend): API 호출 절대 URL :8080 직격 → 상대 /api 로 변경
Build and Push Images / build-and-push (push) Has been cancelled
브라우저가 백엔드 포트 8080 직접 접근 가능하다는 가정이 깨지면(방화벽/포트 제한) 로그인 실패.
모든 호출을 FE 자신의 /api 로 보내고 next.config rewrites() 가 SERVER_API_URL 로 프록시.
브라우저는 FE 포트(예: 9771) 한 곳만 열려 있으면 됨.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:12:45 +09:00
chpark 3a2f9c2dd1 fix(frontend): SERVER_API_URL 빌드 시점 주입 — next.config rewrites() 가 build-time 베이크
Build and Push Images / build-and-push (push) Has been cancelled
Next.js rewrites 는 빌드 시점에 평가되므로 SERVER_API_URL 미주입 시
fallback 127.0.0.1:8080 이 베이크되어 컨테이너에서 ECONNREFUSED.
ARG SERVER_API_URL 로 받아 ENV 노출 → 빌드 시 http://pipeline-backend:8080 으로 베이크.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:43:36 +09:00
chpark 4b9b22a2fe fix(frontend): next.js standalone 모드와 실행 명령 정합 — next start → node server.js
Build and Push Images / build-and-push (push) Has been cancelled
Next.js 15 부터 output: "standalone" 설정 시 next start 로 실행하면 정적 자원(_next/static)이 404,
API rewrite도 동작 안 함. .next/standalone/server.js 직접 실행하도록 Dockerfile 변경.
static/public 디렉토리는 standalone 트리에 같이 복사해야 함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:06:04 +09:00
chpark 6a1b79dc81 feat(file-reader): CSV/TXT/Excel 파일 데이터 소스 — UI 업로드 + 폴더 감시 + 매핑 + 적재
Build and Push Images / build-and-push (push) Has been cancelled
- 신규 테이블 file_reader_configs / file_reader_mappings / file_reader_history (마이그레이션 313)
- 파서: csv-parse + xlsx 라이브러리 추가, CSV/TSV/TXT/XLSX 통합 파서 (parsers.ts)
- 서비스: 파일→매핑→타겟 DB INSERT/UPSERT/REPLACE, 호스트 경로 허용 루트 검증
- 스케줄러: source_mode='watch' 설정마다 node-cron 등록, 1분 주기 reload
- 라우트: /api/file-reader/configs CRUD + preview + run-upload + run-watch + history
- 프론트: 데이터 소스 페이지 "파일 리더" 탭 placeholder → FileReaderConnectionList 컴포넌트
- FileReaderConnectionModal: 기본/파싱/타겟/매핑 통합 폼 + 샘플 업로드 미리보기
- 환경변수 FILE_READER_ALLOWED_ROOTS (콤마 구분, 기본 /home/wace/file-imports,/mnt)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 15:38:10 +09:00
chpark 77d35220b1 feat(edge): 디지털 트윈용 장비 메타(IP/Protocol) IDC TimescaleDB 적재 + 송신 페이로드 보강
Build and Push Images / build-and-push (push) Has been cancelled
- edgeDeviceConfigReporter 신규: pipeline_device_connections + pipeline_equipment 조인해
  IDC TimescaleDB의 edge_device_config_1 에 5분 주기로 적재 (DISTINCT ON 으로 최신값 조회용)
- app.ts: 부팅 시 startEdgeDeviceConfigReporter, SIGTERM/SIGINT 시 graceful stop 추가
- CollectedData 에 host/port 필드 추가, collectDevice 에서 device row 값 채움
- centralMqttForwarder.buildPayload 에 protocol/host/port 포함 (IDC 컨슈머가 활용)
- 312 마이그레이션(fleet_edge_raw_data host/port 컬럼) 등록 (sql 파일은 .gitignore 로 미동봉, OPS 절차로 적용)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 15:38:38 +09:00
chpark 080cfe9585 feat(ai-orch): 모든 그룹 실행에 코디네이터 무조건 앞단 내장 + 가상 코디네이터 자동 생성
Build and Push Images / build-and-push (push) Has been cancelled
사용자 요구
- "에이전트 오케스트레이션 앞단에는 무조건 코디네이터 내장"
- "코디네이터가 질문 분석 → 각 에이전트에 명령 전달 → 결과 정리 → 답변" 흐름 강제

Engine 변경 (multiAgentExecutionEngine.ts)
- execute() switch 단순화: parallel/sequential/mixed/coordinator 등 어느 모드든 무조건
  executeCoordinator() 거치도록. 'raw_*' 접두사가 명시된 경우만 기존 분기로 우회 (legacy)
- executeCoordinator():
  · 멤버 중 config.is_coordinator=true 가 있으면 그 멤버를 coordinator 로 사용
  · 없으면 가상(virtual) 코디네이터 자동 생성 — ai_llm_providers 에서 priority 가장 높은
    활성 LLM 으로 model 자동 선택. 모든 실 멤버가 worker 로 동작
  · 가상/실 코디네이터 모두 같은 3-라운드 흐름 (분해 → 병렬 위임 → 합성)
- ai_llm_providers.priority 정렬을 활용해 운영자가 어떤 모델을 자동 코디네이터로 쓸지 제어 가능

DB
- ai_llm_providers.id=6 (ollama/Qwen3.6-35B-A3B) priority 10 → 0 으로 상향
  → 가상 코디네이터가 로컬 Qwen 자동 선택. (Anthropic 키가 죽어있어도 동작)

검증 결과 (PLM 그룹, 멤버에 코디 지정 0)
- 자동 가상 코디네이터(Qwen3.6) 생성 → 사용자 요청 분해 → 두 worker 에 short task 분배
- 환율전문가: rates.JPY=0.10809 정확 인용
- 기상전문가: HTML 응답 → 정직 거부
- 최종 코디네이터 합성: 두 결과를 마크다운 단일 답변으로 정리

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 21:00:03 +09:00
chpark e2845508fa feat(ai-orch): Coordinator (Orchestrator-Worker) 패턴 구현
Build and Push Images / build-and-push (push) Has been cancelled
진짜 멀티 에이전트 오케스트레이션 — 라우터 + 워커 + 합성 3단계

Engine (multiAgentExecutionEngine.ts)
- execution_mode 'coordinator' 신규 추가
- executeCoordinator() 3 라운드 구현:
  Round 1: coordinator 가 사용자 요청 분해 → JSON delegations 출력
           system prompt 에 sub-agent 카탈로그(role/desc/connectors) 자동 inject
  Round 2: delegated sub-agent 들 각자 짧은 task 만 받아 병렬 실행
  Round 3: coordinator 가 모든 sub-agent 응답을 받아 사용자 친화적 최종 답변 합성
- coordinator 식별: member.config.is_coordinator === true 우선,
                    없으면 execution_order 가 가장 작은 멤버
- JSON 파싱 실패 시 모든 worker 에 원문 fallback

Service (aiAgentGroupService.ts)
- updateMember 에 config / is_coordinator 옵션 추가
  is_coordinator 단축키는 기존 config jsonb 와 || 머지

UI (workspace/page.tsx)
- EXEC_MODES 에 'coordinator' (Compass 아이콘) 추가
- MemberCardContent 에 코디네이터 토글 버튼 (왕관 아이콘) — 클릭 즉시
  updateGroupMember(is_coordinator) 호출
- 활성 시 분홍 배지 "코디네이터" 표시

검증 결과 (PLM 그룹 / 환율전문가=coordinator)
- 사용자: "환율과 화성시 날씨 알려줘"
  Round 1: 기상전문가 ← "화성시의 날씨 정보를 알려줘"
  Round 2: 기상전문가 → API 호출 → HTML 응답 → 정직하게 "데이터 못받음"
  Round 3: coordinator 가 환율/날씨 모두 정리한 단일 답변 합성

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 20:19:01 +09:00
chpark 9891c06038 feat(ai-orch): 멀티 에이전트 진짜 도구 호출 + hallucination 가드
Build and Push Images / build-and-push (push) Has been cancelled
치명적 결함 수정
- multiAgentExecutionEngine.executeConnector 의 rest_api 분기가 실제 API 를 호출하지 않고
  메타정보만 prompt 에 넣던 문제 수정. 모델이 환율 같은 수치를 hallucinate 하던 근본 원인 제거.

REST API 실호출 (executeConnector)
- axios 직접 호출, default_method / default_headers / default_request_body 반영
- auth_type: bearer / api_key / basic 처리
- 응답 데이터를 12000자까지 prompt 에 inject (이전 4000자 → JPY 등 알파벳 후반 키 잘림 문제 해결)
- status / duration_ms / truncated 메타와 함께 반환

System prompt 보강 (data guard)
- 응답 본문을 끝까지 정독하라고 명시
- 데이터 안에 있으면 자신 있게 인용하고 출처 필드 경로 표기
- HTML 응답·status 비-200·필드 누락 시 "값을 받지 못했습니다"로 응답하고 추측 거부
- "절대 추측 금지" 만 있던 이전 가드는 정상 데이터까지 거부하는 부작용 → 양방향 가드로 균형

Connector 결과 prompt 포맷 개선
- 이전: JSON.stringify 중첩으로 가독성 ↓ 모델이 응답 본문을 못 알아봄
- 이후: "========== 데이터 소스 ==========" 라벨 + "--- 응답 본문 시작 / 끝 ---" 명시
- REST API 응답은 raw string 그대로 inject (JSON.stringify 중복 제거)

검증 결과
- 환율전문가: rates.JPY = 0.10809 정확 인용 + 출처 표기 
- 기상전문가: HTML 응답 시 "데이터 못 받음" 정직 답변  (이전: hallucinate 한 false 수치)

DB
- ai_agent_groups.id=2 (PLM) execution_mode 'parallel' → 'sequential' 로 UPDATE
  (sequential 모드는 이전 단계 결과를 다음에 전달, 진짜 오케스트레이션 흐름)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 18:55:25 +09:00
chpark b4dc9b1927 feat(ai): LLM 라우팅 + 에이전트/지식 UX 다수 개선
Build and Push Images / build-and-push (push) Has been cancelled
LLM 호출
- llmClient.resolveProvider 우선순위 보강: model_name 정확 매칭(case-insensitive)을 1순위로 추가
- MODEL_PROVIDER_MAP regex 모두 /i 플래그 (대문자 'Qwen' 등 대응)
- max_tokens fallback 4096 → 16384
- API key 빈 값일 때 Authorization 헤더 자체를 생략 (인증 안 받는 로컬 LLM 대응)

multiAgentExecutionEngine
- 강제 max_tokens=2000 제거 → provider DB 값 fallback 으로 위임

에이전트 관리 (agents/page.tsx)
- 모델 드롭다운: 하드코딩 MODEL_GROUPS 제거 → 등록된 ai_llm_providers 동적 로드
- 같은 provider type(anthropic/openai/ollama 등) 끼리 그룹핑, 0개일 때 안내
- model_name 빈 값 row 는 dropdown 에서 자동 제외 (Radix 제약 회피)
- max_tokens 기본 16384, 빠른선택 버튼 (4K/16K/32K/64K) 추가
- 적용된 지식 파일 row 클릭 시 상세 모달 (내용/복사) 오픈
- hard delete 서비스 변경에 맞춘 UX

LLM 프로바이더 (providers/page.tsx)
- Ollama (로컬) 선택 시 'API 호출 URL' 입력 필드 노출
- '모델 ID' 직접 입력 필드 추가 (Qwen3.6-35B-A3B 같은 커스텀 모델)
- max_tokens / temperature 편집 UI 추가, 기본값 16384/0.7
- 더미 'ollama' API key 자동주입 제거 (실제 인증 토큰 보존)
- ollama 일 때 model_name 빈 값 저장 차단

대화 모니터링 (conversations/page.tsx)
- 메시지 안의 fenced code block (```lang ... ```) 자동 파싱
- 코드블록 별 다운로드 / 복사 버튼 (파일명 자동 추출 또는 snippet-{n}.{ext})
- 17종 언어 → 확장자 매핑 (html/jsp/ts/tsx/py/java/c/cpp/cs/go/rs/rb/php/sql/yml ...)
- 모달 폭 max-w-2xl → max-w-4xl

API 키 관리 (api-keys-manage/page.tsx)
- 그룹 실행 axios 호출 timeout 30s → 5분 (multi-agent 추론 시간 대응)

지식 라이브러리 (knowledge/page.tsx)
- TS2774 (Buffer.byteLength 함수 참조 truthy 체크) 컴파일 에러 수정 → 청크 빌드 정상화

aiAgentService
- delete() 진짜 hard DELETE 로 변경 + 외래키 의존 row(group_members/conversations/logs/usage) 정리
- list() 기본 필터에 status <> 'archived' 추가 → soft-deleted row 자동 숨김

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 18:41:52 +09:00
chpark e4bca14a90 docs(README): 운영 메모 / 라이선스 섹션 제거
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 18:30:54 +09:00
chpark 6f8d63bbec docs(README): 프로젝트 실태에 맞게 전면 재작성
기존: WACE ERP/PLM 일반 솔루션 소개
변경: Pipeline 의 실제 정체성 — 장비 수집 + 외부 DB 통합 + AI 에이전트 오케스트레이션 통합 플랫폼

포함 내용
- 10대 핵심 기능 (장비 통신/적재/Edge 자가보고/MQTT/외부DB/AI 에이전트/Fleet/Python Hook/배치/데이터플로)
- 프로토콜 6종 클라이언트 표 (XGT/Modbus/OPCUA/S7/MQTT/MSSQL)
- AI 에이전트 모듈 11개 매핑
- 실제 디렉터리 구조 + 핵심 파일 링크
- 빠른 시작 (로컬/Docker), 엣지 배포 절차
- 데이터 흐름 다이어그램 (PLC → Pipeline → IDC TimescaleDB + retry queue)
- 주요 DB 테이블 카테고리별 정리
- 운영 메모 (이중 push, Python 이관 대상)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 17:42:33 +09:00
chpark 4c1dc4082e feat: Fleet/Collector/엣지 배포 관련 누적 작업 일괄 커밋
Build and Push Images / build-and-push (push) Has been cancelled
이전 세션들에서 작업된 아래 범위를 모두 포함:

Fleet 서브시스템 (src/fleet/)
- fleetDeviceService / fleetCommandService / fleetDeploymentService / fleetReleaseService
- fleetMetricsService, fleetScriptService, fleetEdgeConfigService
- Edge 디바이스 관리, 커맨드 발행, 배포/릴리스, 스크립트 동기화

Collector 확장
- centralMqttForwarder / centralForwarderConfigService
- equipmentStateService, pythonHookRunner, scriptCache
- Modbus/OPC-UA/S7/XGT 프로토콜 클라이언트
- targetDbIntrospection (저장 DB 조회)

Routes / API
- automationDashboardRoutes, centralForwarderRoutes, equipmentStateRoutes

DB
- importEdgeConfig (Python cached config → Pipeline DB)
- seedDataSources (external_db_connections 초기 시드)

엣지 배포 리소스
- docker/edge/Dockerfile.backend.prod, Dockerfile.frontend.prod
- docker/edge/docker-compose.edge.yml

프론트엔드
- admin/automaticMng (centralForwarder, dashboard, equipmentState)
- admin/fleet (commands, devices, deployments, releases, scripts, alerts)
- admin/pipeline-device 개선 (저장 DB 드롭다운, 태그 매핑 등)
- ExternalDbConnectionModal, ScriptsManagerDialog 등 신규 컴포넌트
- lib/api: automationDashboard, centralForwarder, equipmentState, fleet

docs/
- EDGE_SERVER_STRUCTURE, FLEET_COMPLETE, FLEET_EDGE_INTEGRATION, FLEET_HOOK_INTEGRATION

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 20:00:06 +09:00
chpark 01625d9efd feat(collector): MSSQL/MQTT-Sub 수집기 + target DB retry queue + watermark 영속화
MSSQL 수집기 (새 파일 mssqlClient.ts)
- Python sql_collector.py 의 MSSQL 모드 포팅
- watermark 기반 증분 SELECT, batch_mode (row 당 장비), fetch_size 지원
- timestamp_expression 으로 CONVERT/LEFT/RIGHT 등 복합 타임스탬프 표현 가능
- Protocol: MSSQL_DB

MQTT 구독 수집기 (새 파일 mqttCollectorClient.ts)
- tag.address = 토픽, 메시지 캐시 후 readTags() 호출 시 최신값 반환
- payload JSON 파싱 시 json_path 로 특정 필드 추출 가능
- Protocol: MQTT_SUB

Target DB retry queue (pipeline_target_retry_queue)
- 기존 in-memory Array → PG 영속화
- 실패 → enqueue(exp.backoff), 30s 워커가 재시도, 10회 초과 시 폐기
- IDC TimescaleDB 일시 다운 시 데이터 유실 방지 (기존 단순 warn → 적재)

Watermark 영속화 (pipeline_collector_watermark)
- connection_id 당 마지막으로 읽은 타임스탬프 기록
- MSSQL 증분 수집의 핵심, 재기동에도 중복 없음

deviceCollectorService.ts
- case "MSSQL_DB", "MQTT_SUB" 분기 추가
- clientCache 타입에 MssqlClient, MqttCollectorClient 추가
- publishData 5단계 실패 시 enqueueTargetRetry 호출
- startRetryWorker()/stopRetryWorker() 수명 주기 관리

app.ts
- 기동 시 startRetryWorker() 호출

pipelineDeviceTypes.ts
- DeviceProtocol union 에 MSSQL_DB, MQTT_SUB 추가
- PROTOCOL_OPTIONS / PROTOCOL_DEFAULTS 에 등록
- UI 드롭다운 및 기본값 지원

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 18:20:31 +09:00
chpark 156dd1ddb1 fix(pipeline): XGT 프로토콜/이벤트 리포터/라우트 순서 수정
XGT FEnet 클라이언트
- 응답 data_length offset [12] → [16] (요청 시에만 [12,16] 둘 다 씀; 응답은 PLC가 [12:14]를 CPU 정보로 덮음)
- socket.setTimeout idle 타임아웃 제거 → connect 전용 수동 타이머 + setKeepAlive(10s). 폴링 간격(5s)마다 재연결되던 문제 해결

Edge 이벤트 리포터
- edgeStatusReporter.ts 추가: 60초 간격 edge_status_1 하트비트 + edge_events_1 이벤트 기록
- 기동/종료 이벤트 + PLC 상태 전이(connected/disconnected/error) 자동 기록
- PIPELINE_EDGE_* env 로 edge_id/company_id/UUID/table/interval 주입

edge_telemetry metadata 포맷 교정
- migrated_at → forwarded_at, _pipeline 추가 블록 제거
- 프로덕션 원본 스키마와 완전 호환: {priority, device_id(UUID), forwarded_at}

라우트 순서 버그 수정
- pipelineDeviceConnectionRoutes.ts: /target-databases* 가 /:id 뒤에 있어 /:id 가 먼저 매칭됨 → UI 저장 DB 드롭다운 비어있던 문제
- 정적 경로를 /:id 위로 이동

프론트 API URL 해석 일반화
- NEXT_PUBLIC_API_URL 가 localhost인데 브라우저는 원격이면 env 무시하고 현재 origin의 :8080 사용 → 엣지 원격 접속 시 API 연결 보장

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:38:53 +09:00
chpark 37cac72085 refactor: Pipeline 네이밍 통일 및 AI 에이전트/장비 연결 기능 추가
- Docker/K8s 배포 설정을 pipeline-backend/pipeline-front로 통일
- 네임스페이스, 서비스, PVC 등 k8s 리소스명 pipeline-* 로 변경
- AI 에이전트 관리 기능 추가 (에이전트, 그룹, 프로바이더, 대화, API 키, 지식베이스)
- 장비 연결 관리 기능 추가 (PLC/Modbus/OPC-UA/MQTT)
- 배치 스케줄러에 AI agent/device collection/crawling 타입 추가
- 배치 편집 UI 개선 (6가지 실행 방식 지원)
- 회사별 페이지(COMPANY_*) 제거 및 AdminPageRenderer 최적화
- 메뉴 재구성: 장비 연결 관리 시스템관리로 이동, 에이전트 오케스트레이션으로 개명
- ai-assistant 디렉토리 제거 (backend-node로 통합)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 12:14:50 +09:00
jskim fdaf07896a Merge pull request 'jskim-node' (#27) from jskim-node into main
Reviewed-on: https://g.wace.me/jskim/vexplor_dev/pulls/27
2026-04-13 04:55:54 +00:00
jskim fc05650c2a Merge branch 'main' into jskim-node 2026-04-13 04:55:49 +00:00
kjs 97b23e024c Merge branch 'jskim-node' of https://g.wace.me/jskim/vexplor_dev into jskim-node 2026-04-13 13:55:05 +09:00
kjs 8a2ee0c0e7 refactor: Update API calls in inspection management pages to include company-specific filters
- Modified API requests in the inspection management pages for multiple companies to include a `filterCompanyCode` query parameter.
- This change ensures that the data fetched is specific to the respective company, enhancing data accuracy and relevance.
- Aimed at improving the user experience by providing tailored data views across different company implementations.
2026-04-13 13:55:04 +09:00
jskim aad40c79a1 Merge pull request 'jskim-node' (#26) from jskim-node into main
Reviewed-on: https://g.wace.me/jskim/vexplor_dev/pulls/26
2026-04-13 04:40:22 +00:00
jskim 5441337a15 Merge branch 'main' into jskim-node 2026-04-13 04:40:16 +00:00
kjs 77b7a0cdbb refactor: Update table column widths and improve pagination settings in purchase and sales order pages
- Changed column width definitions from fixed to minimum widths for better responsiveness in the purchase order and sales order pages.
- Increased the pagination size from 500 to 5000 for supplier and user data fetching to accommodate larger datasets.
- Enhanced item search functionality by including management item filters in server queries, improving data handling and user experience.
- These changes aim to provide a more flexible and user-friendly interface across multiple company implementations.
2026-04-13 13:38:44 +09:00
kjs 4267b42fdf refactor: Streamline logistics pages by removing unused variables and enhancing header filters
- Removed unnecessary variables and commented-out code related to master-detail grouping in the outbound and receiving pages.
- Simplified the header filter and sorting logic to improve performance and readability.
- Updated the column mapping and filtering mechanisms to ensure a more efficient data handling process.
- These changes aim to enhance the overall user experience and maintainability of the logistics management interface across multiple company implementations.
2026-04-13 13:15:28 +09:00
kjs 9272ddb345 refactor: Improve table header and cell styling for production plan management and item inspection pages
- Updated the table header and cell styles to enhance visibility and usability, including adjustments to z-index and sticky positioning.
- Implemented dynamic label mapping for inspection types in the item inspection page to improve clarity.
- Enhanced the sales order page by including management item filters in server queries, allowing for better data handling and user experience.
- These changes aim to provide a more intuitive interface and improve data representation across multiple company implementations.
2026-04-13 11:58:26 +09:00
jskim b7846c0d4b Merge pull request 'jskim-node' (#25) from jskim-node into main
Reviewed-on: https://g.wace.me/jskim/vexplor_dev/pulls/25
2026-04-13 01:55:33 +00:00
kjs b28e8e206c feat: Implement drag-and-drop functionality for modal column reordering in purchase order page
- Added DnD (Drag and Drop) capabilities to allow users to reorder columns in the modal for purchase orders.
- Introduced a new `SortableModalHead` component to manage the sortable headers.
- Implemented local storage functionality to save and retrieve the column order, enhancing user customization.
- This feature aims to improve the user experience by providing flexibility in how data is displayed across multiple company implementations.
2026-04-13 10:55:11 +09:00
kjs 2776437702 refactor: Simplify customer form validation and remove unused fields
- Updated the customer form validation to only check for the business number, removing checks for contact phone and email.
- Removed unused input fields for contact person, phone, and email from the customer management page to streamline the form and improve user experience.
- This change aims to enhance the clarity and usability of the customer management interface across multiple company implementations.
2026-04-13 10:52:48 +09:00
jskim 8524c80cab Merge pull request 'jskim-node' (#24) from jskim-node into main
Reviewed-on: https://g.wace.me/jskim/vexplor_dev/pulls/24
2026-04-13 01:37:09 +00:00
jskim 58564f2528 Merge branch 'main' into jskim-node 2026-04-13 01:37:04 +00:00
kjs f1d01d0eed feat: Update progress label mapping in work instruction pages
- Enhanced the `getProgressLabel` function to utilize a mapping for progress statuses, improving clarity in status representation.
- The mapping includes translations for statuses such as "completed", "in_progress", and "pending", ensuring a more user-friendly display across multiple company implementations.
- This change aims to improve the overall user experience by providing clearer information regarding work progress.
2026-04-13 10:36:41 +09:00
kjs 72aa401da5 Merge branch 'jskim-node' of https://g.wace.me/jskim/vexplor_dev into jskim-node 2026-04-13 10:26:24 +09:00
kjs e693963c2a feat: Enhance inbound-outbound and material status pages with remark parsing and category mapping
- Implemented a `parseRemark` function to convert JSON remarks into human-readable text, improving clarity in the inbound-outbound page.
- Updated the category filtering logic to utilize parsed remarks, enhancing data representation.
- Added unit label mapping for better display of item units in the inbound-outbound page.
- Enhanced the material status page with a status mapping feature, allowing for dynamic styling based on status labels.
- These changes aim to improve user experience by providing clearer information and better data management across multiple company implementations.
2026-04-13 10:26:23 +09:00
jskim c3f4e2b54c Merge pull request 'jskim-node' (#23) from jskim-node into main
Reviewed-on: https://g.wace.me/jskim/vexplor_dev/pulls/23
2026-04-12 13:08:02 +00:00
jskim d1331a4cad Merge branch 'main' into jskim-node 2026-04-12 13:06:05 +00:00
kjs 702d37e096 Merge branch 'jskim-node' of https://g.wace.me/jskim/vexplor_dev into jskim-node 2026-04-12 22:05:15 +09:00
kjs 59f60799ab feat: Increase data retrieval limits in purchase and sales pages
- Updated API calls in the purchase and sales item pages to increase the data size limit from 500 to 5000, enhancing the ability to fetch larger datasets.
- This change aims to improve performance and user experience by allowing more data to be loaded in a single request across multiple company implementations.
2026-04-12 22:04:09 +09:00
jskim 0485a3715d Merge pull request 'jskim-node' (#22) from jskim-node into main
Reviewed-on: https://g.wace.me/jskim/vexplor_dev/pulls/22
2026-04-12 12:58:42 +00:00
jskim 8d8cd5fbb7 Merge branch 'main' into jskim-node 2026-04-12 12:58:36 +00:00
kjs 1709ba6fbb feat: Implement searchable category comboboxes and enhance item management
- Added searchable category combobox and multi-category combobox components to improve item selection in the purchase and sales item pages.
- Updated the supplier management page to utilize useCallback for item search, enhancing performance and responsiveness.
- Implemented real-time search functionality for item selection, ensuring a smoother user experience.
- Enhanced the handling of item mappings and prices, allowing for soft deletion of supplier connections while retaining data integrity.

These changes aim to improve the overall user experience by providing more intuitive item management and selection processes across multiple company implementations.
2026-04-12 21:57:03 +09:00
kjs 96b9ac78db feat: Enhance user mapping in BOM and inventory pages
- Updated API calls in the InventoryStatusPage and BomManagementPage to fetch user data with a limit of 9999 users, improving performance and ensuring all users are loaded.
- Implemented user mapping to display user names instead of IDs, enhancing clarity in user-related data across multiple company implementations.
- These changes aim to improve the overall user experience by providing clearer information and better data management in the logistics and BOM sections.
2026-04-12 21:31:36 +09:00
kjs e8eeef1e53 fix: Update error handling and warehouse code rendering in inventory and outbound pages
- Enhanced error handling in the OutboundPage component to capture and display error messages from API responses, improving user feedback during operations.
- Updated the InventoryStatusPage to render warehouse names instead of codes, providing clearer information to users.
- These changes aim to enhance the user experience by ensuring better error visibility and more informative data representation across multiple company implementations.
2026-04-12 21:16:09 +09:00
kjs 31bdbe1331 feat: Enhance inventory and outbound pages with category mapping and user information
- Implemented user mapping to display user names instead of IDs in the inventory and receiving pages.
- Added category mapping for materials and units in the outbound page, improving data representation.
- Updated API calls to fetch user and category data, ensuring accurate and user-friendly displays.
- These enhancements aim to improve the overall user experience by providing clearer information and better data management across multiple company implementations.
2026-04-12 19:34:45 +09:00
kjs 3a63cafea1 fix: Update dependency array in SalesOrderPage component
- Added `categoryOptions` to the dependency array of the useEffect hook that fetches orders, ensuring that the component re-fetches orders when category options change.
- This change improves the responsiveness of the SalesOrderPage when category options are updated, enhancing the overall user experience across multiple company implementations.
2026-04-12 19:02:54 +09:00
kjs 2598fc24d7 Merge branch 'jskim-node' of https://g.wace.me/jskim/vexplor_dev into jskim-node 2026-04-11 23:03:14 +09:00
kjs 05f08ee04a refactor: Enhance TableSettingsModal column management
- Updated column visibility logic to filter based on defaultVisibleKeys, ensuring only relevant columns are displayed.
- Improved merging of saved column settings by filtering out invalid columns from the saved settings.
- Adjusted the order of visible columns to prioritize those defined in defaultVisibleKeys, enhancing user experience in table settings.

These changes aim to provide a more intuitive and efficient column management experience in the TableSettingsModal component.
2026-04-11 23:03:12 +09:00
jskim c6c9fdddf0 Merge pull request 'jskim-node' (#21) from jskim-node into main
Reviewed-on: https://g.wace.me/jskim/vexplor_dev/pulls/21
2026-04-11 13:21:48 +00:00
jskim 5ccde46028 Merge branch 'main' into jskim-node 2026-04-11 13:21:41 +00:00