diff --git a/_pipeline b/_pipeline new file mode 120000 index 00000000..0c56a44d --- /dev/null +++ b/_pipeline @@ -0,0 +1 @@ +/Users/gbpark/agent-pipeline/test-vex \ No newline at end of file diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/heartbeat.json b/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/heartbeat.json deleted file mode 100644 index 961cec9d..00000000 --- a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/heartbeat.json +++ /dev/null @@ -1 +0,0 @@ -{"pid":10584,"round":3,"status":"running","timestamp":"2026-03-28T04:44:15.604Z","uptimeMs":1569419.41675} \ No newline at end of file diff --git a/_pipeline/knowledge/failure-patterns.json b/_pipeline_backup/knowledge/failure-patterns.json similarity index 93% rename from _pipeline/knowledge/failure-patterns.json rename to _pipeline_backup/knowledge/failure-patterns.json index 0be7514f..32717b53 100644 --- a/_pipeline/knowledge/failure-patterns.json +++ b/_pipeline_backup/knowledge/failure-patterns.json @@ -1,7 +1,7 @@ { "version": 1, - "lastUpdated": "2026-03-27T20:12:58.287Z", - "totalRuns": 3, + "lastUpdated": "2026-03-28T04:44:35.408Z", + "totalRuns": 4, "patterns": [ { "id": "fp-zhbg8k", @@ -1851,6 +1851,136 @@ "pipelineIds": [ "pipe-20260327153425-pn5v" ] + }, + { + "id": "sp-jewito", + "agent": "backend", + "taskDescription": "Screen/Layout XML 포맷팅 (3+4 분리)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-ipd5bs", + "agent": "backend", + "taskDescription": "Screen/Layout XML 포맷팅 나머지 (4개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-rauju9", + "agent": "backend", + "taskDescription": "Finance/Tax XML 포맷팅 (4개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-b6r56p", + "agent": "backend", + "taskDescription": "Finance/Report XML 포맷팅 (3개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-b2s4w4", + "agent": "backend", + "taskDescription": "Logistics XML 포맷팅 1 (7개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-bjtrab", + "agent": "backend", + "taskDescription": "Logistics XML 포맷팅 2 (7개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-c0vdoi", + "agent": "backend", + "taskDescription": "Logistics XML 포맷팅 3 (7개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-e3xl7u", + "agent": "backend", + "taskDescription": "나머지 XML 포맷팅 (9개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-p8uj34", + "agent": "backend", + "taskDescription": "XML 파일명 변경 (96개)", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ls src/main/resources/mapper/ | grep -c - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] + }, + { + "id": "sp-2qzrp6", + "agent": "backend", + "taskDescription": "전체 빌드 검증", + "files": [], + "keyApproach": "- 에이전트: backend - 시도: 1회 - 검증 로그: - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa", + "occurrences": 1, + "firstSeen": "2026-03-28T04:44:35.407Z", + "lastSeen": "2026-03-28T04:44:35.407Z", + "pipelineIds": [ + "pipe-20260328041806-pbum" + ] } ] } \ No newline at end of file diff --git a/_pipeline/knowledge/incident-history.json b/_pipeline_backup/knowledge/incident-history.json similarity index 100% rename from _pipeline/knowledge/incident-history.json rename to _pipeline_backup/knowledge/incident-history.json diff --git a/_pipeline/knowledge/rule-proposals.json b/_pipeline_backup/knowledge/rule-proposals.json similarity index 100% rename from _pipeline/knowledge/rule-proposals.json rename to _pipeline_backup/knowledge/rule-proposals.json diff --git a/_pipeline/mailbox/mcp-backend.json b/_pipeline_backup/mailbox/mcp-backend.json similarity index 100% rename from _pipeline/mailbox/mcp-backend.json rename to _pipeline_backup/mailbox/mcp-backend.json diff --git a/_pipeline/mailbox/mcp-frontend.json b/_pipeline_backup/mailbox/mcp-frontend.json similarity index 100% rename from _pipeline/mailbox/mcp-frontend.json rename to _pipeline_backup/mailbox/mcp-frontend.json diff --git a/_pipeline/pipeline-state.json b/_pipeline_backup/pipeline-state.json similarity index 99% rename from _pipeline/pipeline-state.json rename to _pipeline_backup/pipeline-state.json index 9b552cb1..949579c6 100644 --- a/_pipeline/pipeline-state.json +++ b/_pipeline_backup/pipeline-state.json @@ -1,6 +1,6 @@ { "id": "pipe-20260328041806-pbum", - "status": "running", + "status": "completed", "config": { "maxRetries": 3, "parallel": true, @@ -485,5 +485,6 @@ "failedTasks": 0, "runningTasks": 0, "startedAt": "2026-03-28T04:18:06.314Z", - "runDir": "/Users/gbpark/TEST-VEX/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum" + "runDir": "/Users/gbpark/TEST-VEX/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum", + "completedAt": "2026-03-28T04:44:35.399Z" } \ No newline at end of file diff --git a/_pipeline/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327014616-cori/rounds/round-2.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/heartbeat.json b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/heartbeat.json similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/heartbeat.json rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/heartbeat.json diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/metrics.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/metrics.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/metrics.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/metrics.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/plan.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/plan.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/plan.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/plan.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/progress.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/progress.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/progress.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/progress.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/result.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/result.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/result.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/result.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/resume-state.json b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/resume-state.json similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/resume-state.json rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/resume-state.json diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-1.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-2.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-2.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-2.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-2.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-3.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-4.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-5.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-5.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-5.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-5.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327021752-7ctg/rounds/round-6.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/heartbeat.json b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/heartbeat.json similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/heartbeat.json rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/heartbeat.json diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/metrics.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/metrics.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/metrics.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/metrics.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/plan.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/plan.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/plan.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/plan.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/progress.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/progress.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/progress.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/progress.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/result.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/result.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/result.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/result.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/resume-state.json b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/resume-state.json similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/resume-state.json rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/resume-state.json diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-1.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-2.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-2.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-2.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-2.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-3.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-3.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-3.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-3.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-4.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-5.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6-pm.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6-pm.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6-pm.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6-pm.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327131904-jedw/rounds/round-6.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/heartbeat.json b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/heartbeat.json similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/heartbeat.json rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/heartbeat.json diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/metrics.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/metrics.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/metrics.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/metrics.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/plan.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/plan.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/plan.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/plan.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/progress.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/progress.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/progress.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/progress.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/result.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/result.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/result.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/result.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/resume-state.json b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/resume-state.json similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/resume-state.json rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/resume-state.json diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-1.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-1.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-1.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-1.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-2.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-2.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-2.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-2.md diff --git a/_pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-3.md b/_pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-3.md similarity index 100% rename from _pipeline/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-3.md rename to _pipeline_backup/runs/2026-03-27_pipe-20260327153425-pn5v/rounds/round-3.md diff --git a/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/heartbeat.json b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/heartbeat.json new file mode 100644 index 00000000..7172d103 --- /dev/null +++ b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/heartbeat.json @@ -0,0 +1 @@ +{"pid":10584,"round":3,"status":"completed","timestamp":"2026-03-28T04:44:35.402Z","uptimeMs":1589217.470125} \ No newline at end of file diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/metrics.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/metrics.md similarity index 64% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/metrics.md rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/metrics.md index ed680f65..826a0538 100644 --- a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/metrics.md +++ b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/metrics.md @@ -2,21 +2,21 @@ | 항목 | 값 | |------|------| -| 총 에이전트 호출 | 11회 | -| 총 소요 시간 | 4670초 | -| 평균 호출 시간 | 425초 | +| 총 에이전트 호출 | 13회 | +| 총 소요 시간 | 4780초 | +| 평균 호출 시간 | 368초 | ## 토큰 사용량 | 항목 | 값 | |------|------| -| input_tokens | 23249 | -| output_tokens | 373951 | -| cache_read_tokens | 6930735 | -| cache_write_tokens | 1218035 | -| 입력 비용 | $0.3487 | -| 출력 비용 | $28.0463 | -| 총 비용 | $28.3951 | +| input_tokens | 23257 | +| output_tokens | 374387 | +| cache_read_tokens | 7001778 | +| cache_write_tokens | 1222760 | +| 입력 비용 | $0.3489 | +| 출력 비용 | $28.0790 | +| 총 비용 | $28.4279 | ## 호출 상세 | 에이전트 | 라운드 | 소요(s) | 입력토큰 | 출력토큰 | 시간 | @@ -31,4 +31,6 @@ | backend | 1 | 796 | 2.6K | 63.4K | 오후 1:38:47 | | pm | 1 | 23 | 0 | 0 | 오후 1:39:10 | | backend | 2 | 101 | 12 | 5.1K | 오후 1:40:51 | -| pm | 2 | 114 | 0 | 0 | 오후 1:42:45 | \ No newline at end of file +| pm | 2 | 114 | 0 | 0 | 오후 1:42:45 | +| backend | 3 | 92 | 8 | 436 | 오후 1:44:18 | +| pm | 3 | 17 | 0 | 0 | 오후 1:44:35 | \ No newline at end of file diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/plan.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/plan.md similarity index 100% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/plan.md rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/plan.md diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/progress.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/progress.md similarity index 63% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/progress.md rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/progress.md index 75261c0b..b59da0ae 100644 --- a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/progress.md +++ b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/progress.md @@ -1,9 +1,9 @@ # Pipeline: pipe-20260328041806-pbum - 시작: 2026. 3. 28. 오후 1:18:06 -- 상태: **running** +- 상태: **completed** - 현재 라운드: 3/25 -- 경과 시간: 26분 9초 -- 성공: 9 / 실패: 0 / 전체: 10 +- 경과 시간: 26분 29초 +- 성공: 10 / 실패: 0 / 전체: 10 ## 태스크 현황 | 태스크 | 에이전트 | 상태 | 시도 | 검증 | @@ -17,13 +17,14 @@ | task-7 | backend | 완료 | 1/3 | L2 통과: cd /Users/gbpark/TEST-V | | task-8 | backend | 완료 | 1/3 | L2 통과: cd /Users/gbpark/TEST-V | | task-9 | backend | 완료 | 1/3 | L2 통과: cd /Users/gbpark/TEST-V | -| task-10 | backend | 대기 | 0/3 | - | +| task-10 | backend | 완료 | 1/3 | L2 통과: cd /Users/gbpark/TEST-V | ## PM 판단 이력 - R2 [continue]: → 목표: task-9, task-10 실행 및 검증하여 파이프라인 완료. task-10(bootJar)은 이미 L2에서 빌드 성공이 확인되었으므로 빠르게 통과할 것으로 예상. +- R3 [complete]: → 목표: 모든 태스크 완료. L5 브라우저 테스트 자동 실행 대기. ## PM 마지막 판단 -Round 2에서 backend 에이전트가 96개 XML Mapper 파일명을 PascalCase+Mapper.xml → camelCase.xml로 git mv를 사용해 일괄 변환 완료. 파일 내용 변경 없이 순수 rename만 수행하여 git 이력 보존됨. L1(파일명 패턴 검증) 통과, L2(bootJar 빌드) 통과. application.yml의 m +Round 3에서 task-10(bootJar 빌드) 완료. backend 에이전트가 bootJar BUILD SUCCESSFUL 확인. L1(compileJava), L2(bootJar) 모두 통과. git diff를 보면 실제 코드 변경은 없고 파이프라인 상태 파일과 incident-history(이전 라운드 범위 밖 파일 롤백 기록)만 업데이트됨. 이 --- -마지막 업데이트: 2026. 3. 28. 오후 1:44:15 \ No newline at end of file +마지막 업데이트: 2026. 3. 28. 오후 1:44:35 \ No newline at end of file diff --git a/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/result.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/result.md new file mode 100644 index 00000000..5b6eb78b --- /dev/null +++ b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/result.md @@ -0,0 +1,82 @@ +# Pipeline 결과 보고서 + +| 항목 | 값 | +|------|------| +| ID | pipe-20260328041806-pbum | +| 상태 | **completed** | +| 시작 | 2026. 3. 28. 오후 1:18:06 | +| 완료 | 2026. 3. 28. 오후 1:44:35 | +| 소요 시간 | 26분 29초 | +| 총 라운드 | 3 | +| 태스크 | 10 성공 / 0 실패 / 10 전체 | + +## 태스크 상세 +### [OK] Screen/Layout XML 포맷팅 (3+4 분리) (task-1) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] Screen/Layout XML 포맷팅 나머지 (4개) (task-2) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] Finance/Tax XML 포맷팅 (4개) (task-3) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] Finance/Report XML 포맷팅 (3개) (task-4) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] Logistics XML 포맷팅 1 (7개) (task-5) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] Logistics XML 포맷팅 2 (7개) (task-6) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] Logistics XML 포맷팅 3 (7개) (task-7) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] 나머지 XML 포맷팅 (9개) (task-8) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] XML 파일명 변경 (96개) (task-9) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ls src/main/resources/mapper/ | grep -c + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa + +### [OK] 전체 빌드 검증 (task-10) +- 에이전트: backend +- 시도: 1회 +- 검증 로그: + - L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 + - L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/resume-state.json b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/resume-state.json similarity index 100% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/resume-state.json rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/resume-state.json diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1-pm.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1-pm.md similarity index 100% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1-pm.md rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1-pm.md diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1.md similarity index 100% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1.md rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-1.md diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2-pm.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2-pm.md similarity index 100% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2-pm.md rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2-pm.md diff --git a/_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2.md similarity index 100% rename from _pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2.md rename to _pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2.md diff --git a/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-3-pm.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-3-pm.md new file mode 100644 index 00000000..3e7bc7d2 --- /dev/null +++ b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-3-pm.md @@ -0,0 +1,22 @@ +# PM 판단 - Round 3 +- 시간: 2026. 3. 28. 오후 1:44:35 + +## 분석 +Round 3에서 task-10(bootJar 빌드) 완료. backend 에이전트가 bootJar BUILD SUCCESSFUL 확인. L1(compileJava), L2(bootJar) 모두 통과. git diff를 보면 실제 코드 변경은 없고 파이프라인 상태 파일과 incident-history(이전 라운드 범위 밖 파일 롤백 기록)만 업데이트됨. 이는 task-10이 빌드 성공 확인 태스크이므로 정상적인 결과. 전체 10개 태스크 현황: task-1~8(SQL 대문자+줄띄움) 완료, task-9(XML 파일명 camelCase 변환) 완료, task-10(bootJar 성공) 완료. 모든 done_when 조건 충족, 모든 검증(L1, L2) 통과. + +## 판정: **complete** +## 다음 라운드 핵심: 모든 태스크 완료. L5 브라우저 테스트 자동 실행 대기. + +--- +## PM 원본 응답 +``` +```json +{ + "analysis": "Round 3에서 task-10(bootJar 빌드) 완료. backend 에이전트가 bootJar BUILD SUCCESSFUL 확인. L1(compileJava), L2(bootJar) 모두 통과. git diff를 보면 실제 코드 변경은 없고 파이프라인 상태 파일과 incident-history(이전 라운드 범위 밖 파일 롤백 기록)만 업데이트됨. 이는 task-10이 빌드 성공 확인 태스크이므로 정상적인 결과. 전체 10개 태스크 현황: task-1~8(SQL 대문자+줄띄움) 완료, task-9(XML 파일명 camelCase 변환) 완료, task-10(bootJar 성공) 완료. 모든 done_when 조건 충족, 모든 검증(L1, L2) 통과.", + "taskUpdates": [], + "newTasks": [], + "overallStatus": "complete", + "nextRoundFocus": "모든 태스크 완료. L5 브라우저 테스트 자동 실행 대기." +} +``` +``` \ No newline at end of file diff --git a/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-3.md b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-3.md new file mode 100644 index 00000000..d2453ef1 --- /dev/null +++ b/_pipeline_backup/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-3.md @@ -0,0 +1,261 @@ +# Round 3 +- 시간: 2026. 3. 28. 오후 1:44:18 + +## backend (성공) + +### 에이전트 응답 +``` +task-10 완료. `./gradlew bootJar` BUILD SUCCESSFUL. +``` + +## 코드 변경 (git diff) +### Unstaged 변경 +``` +_pipeline/knowledge/incident-history.json | 866 ++++++++++++++++++++- + _pipeline/pipeline-state.json | 37 +- + .../heartbeat.json | 2 +- + .../2026-03-28_pipe-20260328041806-pbum/metrics.md | 24 +- + .../progress.md | 15 +- + .../resume-state.json | 41 +- + 6 files changed, 951 insertions(+), 34 deletions(-) +``` + +### 새 파일 +``` +_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2-pm.md +_pipeline/runs/2026-03-28_pipe-20260328041806-pbum/rounds/round-2.md +``` + +### 상세 diff +```diff +diff --git a/_pipeline/knowledge/incident-history.json b/_pipeline/knowledge/incident-history.json +index 448f9f19..db889b0d 100644 +--- a/_pipeline/knowledge/incident-history.json ++++ b/_pipeline/knowledge/incident-history.json +@@ -1,6 +1,6 @@ + { + "version": 1, +- "lastUpdated": "2026-03-27T15:01:33.842Z", ++ "lastUpdated": "2026-03-28T04:40:51.875Z", + "incidents": [ + { + "type": "out-of-scope-change", +@@ -2053,6 +2053,870 @@ + "action": "rolled-back", + "id": "inc-mn914lqq-ijr6", + "timestamp": "2026-03-27T15:01:33.842Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/admin.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-9df9", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/aiAssistantProxy.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-cxc4", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/analyticsReport.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-h2dc", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/approval.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-ogli", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/auditLog.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-183g", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/auth.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-hf52", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/barcodeLabel.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-43h7", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/batch.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-ktd6", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/batchExecutionLog.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-zc4h", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/batchManagement.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-okx0", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/bom.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-70ql", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/booking.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-wery", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/buttonActionStandard.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-9to2", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/buttonDataflow.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-9bli", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/cascadingAutoFill.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-mm92", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/cascadingCondition.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-sswf", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/cascadingHierarchy.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-2niv", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/cascadingMutualExclusion.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-7z9i", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/cascadingRelation.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-pj51", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/categoryTree.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-j0ds", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/categoryValueCascading.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-3i58", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", ++ "pipelineId": "pipe-20260328041806-pbum", ++ "file": "backend-spring/src/main/resources/mapper/codeMerge.xml", ++ "description": "범위 밖 파일 변경 → 자동 롤백", ++ "action": "rolled-back", ++ "id": "inc-mn9ue8bn-ibtb", ++ "timestamp": "2026-03-28T04:40:51.875Z" ++ }, ++ { ++ "type": "out-of-scope-change", + +... (truncated) +``` + +## 검증 결과 +### L1 [PASS]: L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 +``` +L1 통과: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 +``` + +### L2 [PASS]: L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa +``` +L2 통과: cd /Users/gbpark/TEST-VEX/backend-spring && ./gradlew bootJa +``` diff --git a/backend-spring/src/main/java/com/erp/service/AdminService.java b/backend-spring/src/main/java/com/erp/service/AdminService.java index 0c41876c..bbf15640 100644 --- a/backend-spring/src/main/java/com/erp/service/AdminService.java +++ b/backend-spring/src/main/java/com/erp/service/AdminService.java @@ -46,7 +46,7 @@ public class AdminService extends BaseService { } Map parent = parents.get(0); Object parentObjid = parent.get("objid"); - Object parentCompanyCode = parent.get("companyCode"); + Object parentCompanyCode = parent.get("company_code"); Map childParams = new HashMap<>(); childParams.put("parentObjid", parentObjid); @@ -55,7 +55,7 @@ public class AdminService extends BaseService { Map landingMenu = children.stream() .filter(m -> { - Object desc = m.get("menuDesc"); + Object desc = m.get("menu_desc"); return desc != null && desc.toString().contains("[POP_LANDING]"); }) .findFirst() @@ -196,10 +196,10 @@ public class AdminService extends BaseService { if (userInfo == null) return null; List> depts = sqlSession.selectList("admin.selectUserDeptList", params); Map mainDept = depts.stream() - .filter(d -> Boolean.TRUE.equals(d.get("isPrimary"))) + .filter(d -> Boolean.TRUE.equals(d.get("is_primary"))) .findFirst().orElse(null); List> subDepts = depts.stream() - .filter(d -> !Boolean.TRUE.equals(d.get("isPrimary"))) + .filter(d -> !Boolean.TRUE.equals(d.get("is_primary"))) .collect(Collectors.toList()); Map result = new HashMap<>(); result.put("userInfo", userInfo); @@ -276,12 +276,12 @@ public class AdminService extends BaseService { // 1. 기존 부서 목록 조회 List> existingDepts = sqlSession.selectList("admin.selectUserDeptList", Map.of("userId", userId)); Map existingMain = existingDepts.stream() - .filter(d -> Boolean.TRUE.equals(d.get("isPrimary"))) + .filter(d -> Boolean.TRUE.equals(d.get("is_primary"))) .findFirst().orElse(null); // 2. 메인 부서 변경 시 기존 메인을 겸직으로 전환 if (mainDept != null && deptCode != null && existingMain != null) { - String existingMainCode = (String) existingMain.get("deptCode"); + String existingMainCode = (String) existingMain.get("dept_code"); if (existingMainCode != null && !existingMainCode.equals(deptCode)) { sqlSession.update("admin.updateUserDeptNotPrimary", Map.of("userId", userId, "deptCode", existingMainCode)); } diff --git a/backend-spring/src/main/java/com/erp/service/ApprovalService.java b/backend-spring/src/main/java/com/erp/service/ApprovalService.java index 824ba3c5..fe0f79c0 100644 --- a/backend-spring/src/main/java/com/erp/service/ApprovalService.java +++ b/backend-spring/src/main/java/com/erp/service/ApprovalService.java @@ -79,7 +79,7 @@ public class ApprovalService extends BaseService { if (template == null) throw new IllegalArgumentException("결재선 템플릿을 찾을 수 없습니다."); Map stepP = new HashMap<>(); - stepP.put("templateId", template.get("templateId")); + stepP.put("templateId", template.get("template_id")); stepP.put("companyCode", params.get("companyCode")); template.put("steps", sqlSession.selectList("approval.selectTemplateSteps", stepP)); return template; @@ -171,7 +171,7 @@ public class ApprovalService extends BaseService { if (request == null) throw new IllegalArgumentException("결재 요청을 찾을 수 없습니다."); Map lineP = new HashMap<>(); - lineP.put("requestId", request.get("requestId")); + lineP.put("requestId", request.get("request_id")); lineP.put("companyCode", params.get("companyCode")); request.put("lines", sqlSession.selectList("approval.selectLinesByRequestId", lineP)); return request; @@ -209,7 +209,7 @@ public class ApprovalService extends BaseService { defP.put("companyCode", companyCode); Map def = sqlSession.selectOne("approval.selectDefinitionById", defP); if (def != null) { - Object allow = def.get("allowSelfApproval"); + Object allow = def.get("allow_self_approval"); boolean allowed = allow == null || Boolean.TRUE.equals(allow) || "true".equalsIgnoreCase(allow.toString()); if (!allowed) @@ -314,7 +314,7 @@ public class ApprovalService extends BaseService { reqP.put("companyCode", companyCode); Map request = sqlSession.selectOne("approval.selectRequestById", reqP); if (request == null) throw new IllegalArgumentException("결재 요청을 찾을 수 없습니다."); - if (!userId.equals(String.valueOf(request.get("requesterId")))) + if (!userId.equals(String.valueOf(request.get("requester_id")))) throw new IllegalArgumentException("본인이 요청한 건만 회수할 수 있습니다."); String status = (String) request.get("status"); if (!List.of("requested", "in_progress", "post_pending").contains(status)) @@ -336,9 +336,9 @@ public class ApprovalService extends BaseService { reqP.put("companyCode", companyCode); Map request = sqlSession.selectOne("approval.selectRequestById", reqP); if (request == null) throw new IllegalArgumentException("결재 요청을 찾을 수 없습니다."); - if (!"post".equals(request.get("approvalType"))) + if (!"post".equals(request.get("approval_type"))) throw new IllegalArgumentException("후결 유형의 결재 요청만 후결 처리할 수 있습니다."); - if (Boolean.TRUE.equals(request.get("isPostApproved"))) + if (Boolean.TRUE.equals(request.get("is_post_approved"))) throw new IllegalArgumentException("이미 후결 처리된 요청입니다."); Number pendingNum = sqlSession.selectOne("approval.countPendingLinesForRequest", reqP); @@ -378,10 +378,10 @@ public class ApprovalService extends BaseService { if (line == null) throw new IllegalArgumentException("결재 라인을 찾을 수 없습니다."); if (!"pending".equals(line.get("status"))) throw new IllegalArgumentException("대기 중인 결재만 처리할 수 있습니다."); - String lineCC = (String) line.get("companyCode"); - String approverId = (String) line.get("approverId"); - long requestId = toLong(line.get("requestId")); - int stepOrder = toInt(line.get("stepOrder")); + String lineCC = (String) line.get("company_code"); + String approverId = (String) line.get("approver_id"); + long requestId = toLong(line.get("request_id")); + int stepOrder = toInt(line.get("step_order")); String proxyFor = null; String proxyReasonVal = null; @@ -416,9 +416,9 @@ public class ApprovalService extends BaseService { Map.of("requestId", requestId, "companyCode", lineCC)); if (reqForUpdate == null) return; - int totalSteps = toInt(reqForUpdate.get("totalSteps")); - String stepType = (String) line.getOrDefault("stepType", "approval"); - boolean isLegacy = isLegacyParallel(reqForUpdate.get("targetRecordData"), stepType); + int totalSteps = toInt(reqForUpdate.get("total_steps")); + String stepType = (String) line.getOrDefault("step_type", "approval"); + boolean isLegacy = isLegacyParallel(reqForUpdate.get("target_record_data"), stepType); if ("rejected".equals(action)) { Map rejP = new HashMap<>(); @@ -537,7 +537,7 @@ public class ApprovalService extends BaseService { return; } - String nextStepType = (String) nextLines.get(0).getOrDefault("stepType", "approval"); + String nextStepType = (String) nextLines.get(0).getOrDefault("step_type", "approval"); if ("notification".equals(nextStepType)) { Map notifP = new HashMap<>(); @@ -569,8 +569,8 @@ public class ApprovalService extends BaseService { Map req = sqlSession.selectOne("approval.selectRequestForSync", syncP); if (req == null) return; - String targetTable = (String) req.get("targetTable"); - Object targetRecordId = req.get("targetRecordId"); + String targetTable = (String) req.get("target_table"); + Object targetRecordId = req.get("target_record_id"); if (targetTable == null || targetRecordId == null || "0".equals(targetRecordId.toString()) || targetRecordId.toString().isBlank()) return; diff --git a/backend-spring/src/main/java/com/erp/service/AuditLogService.java b/backend-spring/src/main/java/com/erp/service/AuditLogService.java index 5ede7b44..ebbbb8e5 100644 --- a/backend-spring/src/main/java/com/erp/service/AuditLogService.java +++ b/backend-spring/src/main/java/com/erp/service/AuditLogService.java @@ -105,7 +105,7 @@ public class AuditLogService extends BaseService { json, new TypeReference>() {}); if (!isSuperAdmin) { - String tableName = (String) entry.get("tableName"); + String tableName = (String) entry.get("table_name"); if (tableName != null && SECURED_TABLES.contains(tableName)) { maskMapValues(changes, "before"); maskMapValues(changes, "after"); diff --git a/backend-spring/src/main/java/com/erp/service/AuthService.java b/backend-spring/src/main/java/com/erp/service/AuthService.java index d09d5898..b59a9493 100644 --- a/backend-spring/src/main/java/com/erp/service/AuthService.java +++ b/backend-spring/src/main/java/com/erp/service/AuthService.java @@ -93,26 +93,27 @@ public class AuthService extends BaseService { return result; } - String companyCode = getStr(userInfoRow, "companyCode", null); - String userType = getStr(userInfoRow, "userType", "USER"); + // DB resultType="map" → 키가 DB 컬럼명 소문자(PostgreSQL)로 옴 + String companyCode = getStr(userInfoRow, "company_code", null); + String userType = getStr(userInfoRow, "user_type", "USER"); // 4. 회사명 조회 String companyName = ""; if (companyCode != null) { Map companyRow = sqlSession.selectOne("auth.selectCompanyName", Map.of("companyCode", companyCode)); - companyName = companyRow != null ? getStr(companyRow, "companyName", "") : ""; + companyName = companyRow != null ? getStr(companyRow, "company_name", "") : ""; } // 5. JWT 토큰 생성 — Node.js 동일 페이로드 구조 Map personBean = new HashMap<>(); personBean.put("userId", userId); - personBean.put("userName", getStr(userInfoRow, "userName", "")); - personBean.put("deptName", getStr(userInfoRow, "deptName", "")); + personBean.put("userName", getStr(userInfoRow, "user_name", "")); + personBean.put("deptName", getStr(userInfoRow, "dept_name", "")); personBean.put("companyCode", companyCode); personBean.put("companyName", companyName); personBean.put("userType", userType); - personBean.put("userTypeName", getStr(userInfoRow, "userTypeName", "일반사용자")); + personBean.put("userTypeName", getStr(userInfoRow, "user_type_name", "일반사용자")); String token = jwtTokenProvider.generateToken(personBean); // 6. firstMenuPath 계산 (Node.js authController 동일 로직) @@ -169,8 +170,8 @@ public class AuthService extends BaseService { // 8. 응답 data 구성 (Node.js 응답 형식 일치) Map userInfo = new HashMap<>(); userInfo.put("userId", userId); - userInfo.put("userName", getStr(userInfoRow, "userName", "")); - userInfo.put("deptName", getStr(userInfoRow, "deptName", "")); + userInfo.put("userName", getStr(userInfoRow, "user_name", "")); + userInfo.put("deptName", getStr(userInfoRow, "dept_name", "")); userInfo.put("companyCode", companyCode); Map data = new HashMap<>(); @@ -223,13 +224,13 @@ public class AuthService extends BaseService { // 권한명 목록 조회 List> authList = sqlSession.selectList("auth.selectUserAuth", Map.of("userId", userId)); String authNames = authList.stream() - .map(a -> getStr(a, "authName", "")) + .map(a -> getStr(a, "auth_name", "")) .collect(Collectors.joining(",")); String companyCode = jwtCompanyCode != null ? jwtCompanyCode - : getStr(dbUser, "companyCode", null); + : getStr(dbUser, "company_code", null); String userType = jwtUserType != null ? jwtUserType - : getStr(dbUser, "userType", "USER"); + : getStr(dbUser, "user_type", "USER"); // photo 변환 (byte[] → base64) Object rawPhoto = dbUser.get("photo"); @@ -240,16 +241,16 @@ public class AuthService extends BaseService { Map result = new HashMap<>(); result.put("userId", userId); - result.put("userName", getStr(dbUser, "userName", "")); - result.put("deptName", getStr(dbUser, "deptName", "")); + result.put("userName", getStr(dbUser, "user_name", "")); + result.put("deptName", getStr(dbUser, "dept_name", "")); result.put("companyCode", companyCode); result.put("company_code", companyCode); result.put("userType", userType); - result.put("userTypeName", getStr(dbUser, "userTypeName", "일반사용자")); + result.put("userTypeName", getStr(dbUser, "user_type_name", "일반사용자")); result.put("email", getStr(dbUser, "email", "")); result.put("photo", photoStr); result.put("locale", getStr(dbUser, "locale", "KR")); - result.put("deptCode", dbUser.get("deptCode")); + result.put("deptCode", dbUser.get("dept_code")); result.put("authName", authNames); result.put("isAdmin", "ADMIN".equals(userType) || "wace".equals(userId) || "SUPER_ADMIN".equals(userType)); diff --git a/backend-spring/src/main/java/com/erp/service/BatchManagementService.java b/backend-spring/src/main/java/com/erp/service/BatchManagementService.java index 2b782a66..2ef097f8 100644 --- a/backend-spring/src/main/java/com/erp/service/BatchManagementService.java +++ b/backend-spring/src/main/java/com/erp/service/BatchManagementService.java @@ -111,7 +111,7 @@ public class BatchManagementService extends BaseService { if (batchConfig == null) throw new RuntimeException("배치 설정을 찾을 수 없습니다."); long startTime = System.currentTimeMillis(); - String batchName = str(batchConfig.getOrDefault("batchName", batchConfig.get("batch_name"))); + String batchName = str(batchConfig.get("batch_name")); log.info("배치 수동 실행: id={}, name={}", id, batchName); long duration = System.currentTimeMillis() - startTime; diff --git a/backend-spring/src/main/java/com/erp/service/BatchService.java b/backend-spring/src/main/java/com/erp/service/BatchService.java index b1195b38..06f2d0c8 100644 --- a/backend-spring/src/main/java/com/erp/service/BatchService.java +++ b/backend-spring/src/main/java/com/erp/service/BatchService.java @@ -77,9 +77,9 @@ public class BatchService extends BaseService { for (Map conn : externalConns) { Map item = new LinkedHashMap<>(); item.put("id", conn.get("id")); - item.put("name", conn.get("connectionName") != null ? conn.get("connectionName") : conn.get("connection_name")); + item.put("name", conn.get("connection_name")); item.put("type", "external"); - item.put("dbType", conn.get("dbType") != null ? conn.get("dbType") : conn.get("db_type")); + item.put("dbType", conn.get("db_type")); result.add(item); } } catch (Exception e) { diff --git a/backend-spring/src/main/java/com/erp/service/ButtonActionStandardService.java b/backend-spring/src/main/java/com/erp/service/ButtonActionStandardService.java index e653f899..81b00a5f 100644 --- a/backend-spring/src/main/java/com/erp/service/ButtonActionStandardService.java +++ b/backend-spring/src/main/java/com/erp/service/ButtonActionStandardService.java @@ -149,14 +149,14 @@ public class ButtonActionStandardService extends BaseService { /** * JSON String → Java Object (SELECT 결과 후처리용) - * map-underscore-to-camel-case=true 이므로 결과 키는 camelCase + * resultType="map"은 DB 컬럼명 그대로 snake_case 반환 */ private void parseJsonFields(Map row) { - for (String camelKey : List.of("validationRules", "actionConfig")) { - Object val = row.get(camelKey); + for (String snakeKey : List.of("validation_rules", "action_config")) { + Object val = row.get(snakeKey); if (val instanceof String s && !s.isBlank()) { try { - row.put(camelKey, objectMapper.readValue(s, Object.class)); + row.put(snakeKey, objectMapper.readValue(s, Object.class)); } catch (Exception ignored) { // 파싱 실패 시 원문 String 유지 } diff --git a/backend-spring/src/main/java/com/erp/service/CascadingConditionService.java b/backend-spring/src/main/java/com/erp/service/CascadingConditionService.java index 405c8e77..5a5cd389 100644 --- a/backend-spring/src/main/java/com/erp/service/CascadingConditionService.java +++ b/backend-spring/src/main/java/com/erp/service/CascadingConditionService.java @@ -78,8 +78,8 @@ public class CascadingConditionService extends BaseService { Map matchedCondition = null; if (conditionFieldValue != null) { for (Map cond : conditions) { - String operator = (String) cond.get("conditionOperator"); - String expectedValue = (String) cond.get("conditionValue"); + String operator = (String) cond.get("condition_operator"); + String expectedValue = (String) cond.get("condition_value"); if (evaluateCondition(conditionFieldValue, operator, expectedValue)) { matchedCondition = cond; break; @@ -88,15 +88,15 @@ public class CascadingConditionService extends BaseService { } // 4. 동적 옵션 쿼리 생성 - String childTable = String.valueOf(relation.get("childTable")); - String valueCol = String.valueOf(relation.get("childValueColumn")); - String labelCol = String.valueOf(relation.get("childLabelColumn")); - Object filterColObj = relation.get("childFilterColumn"); - Object orderColObj = relation.get("childOrderColumn"); + String childTable = String.valueOf(relation.get("child_table")); + String valueCol = String.valueOf(relation.get("child_value_column")); + String labelCol = String.valueOf(relation.get("child_label_column")); + Object filterColObj = relation.get("child_filter_column"); + Object orderColObj = relation.get("child_order_column"); String filterCol = filterColObj != null ? String.valueOf(filterColObj) : null; String orderCol = orderColObj != null ? String.valueOf(orderColObj) : null; - String orderDir = relation.get("childOrderDirection") != null - ? String.valueOf(relation.get("childOrderDirection")) : "ASC"; + String orderDir = relation.get("child_order_direction") != null + ? String.valueOf(relation.get("child_order_direction")) : "ASC"; StringBuilder sql = new StringBuilder("SELECT ") .append(valueCol).append(" as value, ") diff --git a/backend-spring/src/main/java/com/erp/service/CascadingRelationService.java b/backend-spring/src/main/java/com/erp/service/CascadingRelationService.java index 50bcf556..2da2ed70 100644 --- a/backend-spring/src/main/java/com/erp/service/CascadingRelationService.java +++ b/backend-spring/src/main/java/com/erp/service/CascadingRelationService.java @@ -91,9 +91,9 @@ public class CascadingRelationService extends BaseService { throw new NoSuchElementException("연쇄 관계를 찾을 수 없습니다."); } - String parentTable = (String) relation.get("parentTable"); - String parentValueColumn = (String) relation.get("parentValueColumn"); - String parentLabelColumn = (String) relation.get("parentLabelColumn"); + String parentTable = (String) relation.get("parent_table"); + String parentValueColumn = (String) relation.get("parent_value_column"); + String parentLabelColumn = (String) relation.get("parent_label_column"); if (parentLabelColumn == null || parentLabelColumn.isEmpty()) { parentLabelColumn = parentValueColumn; } @@ -149,12 +149,12 @@ public class CascadingRelationService extends BaseService { throw new NoSuchElementException("연쇄 관계를 찾을 수 없습니다."); } - String childTable = (String) relation.get("childTable"); - String childFilterColumn = (String) relation.get("childFilterColumn"); - String childValueColumn = (String) relation.get("childValueColumn"); - String childLabelColumn = (String) relation.get("childLabelColumn"); - String childOrderColumn = (String) relation.get("childOrderColumn"); - String childOrderDir = (String) relation.get("childOrderDirection"); + String childTable = (String) relation.get("child_table"); + String childFilterColumn = (String) relation.get("child_filter_column"); + String childValueColumn = (String) relation.get("child_value_column"); + String childLabelColumn = (String) relation.get("child_label_column"); + String childOrderColumn = (String) relation.get("child_order_column"); + String childOrderDir = (String) relation.get("child_order_direction"); if (childOrderDir == null || childOrderDir.isEmpty()) childOrderDir = "ASC"; boolean hasCompanyCode = hasColumn(childTable, "company_code"); diff --git a/backend-spring/src/main/java/com/erp/service/CategoryTreeService.java b/backend-spring/src/main/java/com/erp/service/CategoryTreeService.java index 6feba807..cdde499c 100644 --- a/backend-spring/src/main/java/com/erp/service/CategoryTreeService.java +++ b/backend-spring/src/main/java/com/erp/service/CategoryTreeService.java @@ -128,10 +128,10 @@ public class CategoryTreeService extends BaseService { Map current = sqlSession.selectOne(NS + "getCategoryTreeInfo", currentParams); if (current == null) return null; - String currentLabel = (String) current.get("valueLabel"); + String currentLabel = (String) current.get("value_label"); int currentDepth = ((Number) current.get("depth")).intValue(); String currentPath = (String) current.get("path"); - Object currentParentId = current.get("parentValueId"); + Object currentParentId = current.get("parent_value_id"); String newLabel = body.containsKey("valueLabel") ? (String) body.get("valueLabel") : currentLabel; int newDepth = currentDepth; @@ -233,7 +233,7 @@ public class CategoryTreeService extends BaseService { int count = ((Number) usage.get("count")).intValue(); Map res = new LinkedHashMap<>(); res.put("canDelete", false); - res.put("reason", "이 카테고리 값(" + value.get("valueLabel") + ")은 " + count + "건의 데이터에서 사용 중이므로 삭제할 수 없습니다."); + res.put("reason", "이 카테고리 값(" + value.get("value_label") + ")은 " + count + "건의 데이터에서 사용 중이므로 삭제할 수 없습니다."); return res; } @@ -267,8 +267,8 @@ public class CategoryTreeService extends BaseService { if (inUse) { int count = ((Number) usage.get("count")).intValue(); throw new IllegalStateException( - "VALIDATION:이 카테고리 값(" + value.get("valueLabel") + ")은 " - + value.get("tableName") + " 테이블에서 " + count + "건의 데이터가 사용 중이므로 삭제할 수 없습니다."); + "VALIDATION:이 카테고리 값(" + value.get("value_label") + ")은 " + + value.get("table_name") + " 테이블에서 " + count + "건의 데이터가 사용 중이므로 삭제할 수 없습니다."); } // 3. 삭제 @@ -309,12 +309,12 @@ public class CategoryTreeService extends BaseService { for (Map item : flatList) { Map node = new LinkedHashMap<>(item); node.put("children", new ArrayList<>()); - map.put(item.get("valueId"), node); + map.put(item.get("value_id"), node); } for (Map item : flatList) { - Object parentId = item.get("parentValueId"); - Map node = map.get(item.get("valueId")); + Object parentId = item.get("parent_value_id"); + Map node = map.get(item.get("value_id")); if (parentId != null && map.containsKey(parentId)) { @SuppressWarnings("unchecked") List> children = @@ -338,15 +338,15 @@ public class CategoryTreeService extends BaseService { List> children = sqlSession.selectList(NS + "getCategoryTreeChildrenList", params); for (Map child : children) { - String valueLabel = (String) child.get("valueLabel"); + String valueLabel = (String) child.get("value_label"); String newPath = parentPath + "/" + valueLabel; Map updateParams = new HashMap<>(); - updateParams.put("valueId", child.get("valueId")); + updateParams.put("valueId", child.get("value_id")); updateParams.put("path", newPath); sqlSession.update(NS + "updateCategoryTreeChildPath", updateParams); - int childId = ((Number) child.get("valueId")).intValue(); + int childId = ((Number) child.get("value_id")).intValue(); updateChildrenPaths(companyCode, childId, newPath); } } @@ -356,9 +356,9 @@ public class CategoryTreeService extends BaseService { * 오류 발생 시 무시하고 삭제 허용 (Node.js 동일 동작) */ private Map checkCategoryValueInUse(String companyCode, Map value) { - String tableName = (String) value.get("tableName"); - String columnName = (String) value.get("columnName"); - String valueCode = (String) value.get("valueCode"); + String tableName = (String) value.get("table_name"); + String columnName = (String) value.get("column_name"); + String valueCode = (String) value.get("value_code"); Map notInUse = Map.of("inUse", false, "count", 0); diff --git a/backend-spring/src/main/java/com/erp/service/CodeMergeService.java b/backend-spring/src/main/java/com/erp/service/CodeMergeService.java index d98471ea..4fbe86c6 100644 --- a/backend-spring/src/main/java/com/erp/service/CodeMergeService.java +++ b/backend-spring/src/main/java/com/erp/service/CodeMergeService.java @@ -30,11 +30,9 @@ public class CodeMergeService extends BaseService { params.put("columnName", columnName); List> rows = sqlSession.selectList(NS + "getTablesWithColumn", params); - // map-underscore-to-camel-case: true 적용 → key = "tableName" List tables = rows.stream() .map(r -> { - Object val = r.get("tableName"); - if (val == null) val = r.get("table_name"); + Object val = r.get("table_name"); return val != null ? val.toString() : null; }) .filter(Objects::nonNull) @@ -72,8 +70,7 @@ public class CodeMergeService extends BaseService { int totalRows = 0; for (Map tableRow : tableRows) { - Object nameVal = tableRow.get("tableName"); - if (nameVal == null) nameVal = tableRow.get("table_name"); + Object nameVal = tableRow.get("table_name"); if (nameVal == null) continue; String tableName = nameVal.toString(); diff --git a/backend-spring/src/main/java/com/erp/service/CompanyManagementService.java b/backend-spring/src/main/java/com/erp/service/CompanyManagementService.java index ea55d053..84bbb241 100644 --- a/backend-spring/src/main/java/com/erp/service/CompanyManagementService.java +++ b/backend-spring/src/main/java/com/erp/service/CompanyManagementService.java @@ -44,7 +44,7 @@ public class CompanyManagementService extends BaseService { throw new IllegalArgumentException("존재하지 않는 회사입니다."); } - String companyName = (String) existing.get("companyName"); + String companyName = (String) existing.get("company_name"); // 2. 파일 정리 try { @@ -98,7 +98,7 @@ public class CompanyManagementService extends BaseService { "companyManagement.selectAllCompanyCodes", new HashMap<>()); for (Map row : companyCodes) { - String code = (String) row.get("companyCode"); + String code = (String) row.get("company_code"); Path dir = Paths.get(uploadBasePath, code); long[] stats = calculateDirStats(dir); diff --git a/backend-spring/src/main/java/com/erp/service/ComponentStandardService.java b/backend-spring/src/main/java/com/erp/service/ComponentStandardService.java index 99e663c6..e53de99b 100644 --- a/backend-spring/src/main/java/com/erp/service/ComponentStandardService.java +++ b/backend-spring/src/main/java/com/erp/service/ComponentStandardService.java @@ -212,7 +212,7 @@ public class ComponentStandardService extends BaseService { List> byStatus = new ArrayList<>(); for (Map row : byStatusRaw) { Map item = new LinkedHashMap<>(); - item.put("status", row.get("isActive")); // camelCase (map-underscore-to-camel) + item.put("status", row.get("is_active")); item.put("count", toLong(row.get("count"))); byStatus.add(item); } diff --git a/backend-spring/src/main/java/com/erp/service/DdlService.java b/backend-spring/src/main/java/com/erp/service/DdlService.java index e3e170c4..7d096687 100644 --- a/backend-spring/src/main/java/com/erp/service/DdlService.java +++ b/backend-spring/src/main/java/com/erp/service/DdlService.java @@ -280,17 +280,17 @@ public class DdlService extends BaseService { Map byDdlType = new LinkedHashMap<>(); for (Map row : byType) { - byDdlType.put(String.valueOf(row.get("ddlType")), toLong(row.get("count"))); + byDdlType.put(String.valueOf(row.get("ddl_type")), toLong(row.get("count"))); } Map byUserMap = new LinkedHashMap<>(); for (Map row : byUser) { - byUserMap.put(String.valueOf(row.get("userId")), toLong(row.get("count"))); + byUserMap.put(String.valueOf(row.get("user_id")), toLong(row.get("count"))); } return Map.of( - "totalExecutions", toLong(totalStats != null ? totalStats.get("totalExecutions") : null), - "successfulExecutions", toLong(totalStats != null ? totalStats.get("successfulExecutions") : null), - "failedExecutions", toLong(totalStats != null ? totalStats.get("failedExecutions") : null), + "totalExecutions", toLong(totalStats != null ? totalStats.get("total_executions") : null), + "successfulExecutions", toLong(totalStats != null ? totalStats.get("successful_executions") : null), + "failedExecutions", toLong(totalStats != null ? totalStats.get("failed_executions") : null), "byDDLType", byDdlType, "byUser", byUserMap, "recentFailures", recentFailures diff --git a/backend-spring/src/main/java/com/erp/service/DepartmentService.java b/backend-spring/src/main/java/com/erp/service/DepartmentService.java index 5e1b8418..25365913 100644 --- a/backend-spring/src/main/java/com/erp/service/DepartmentService.java +++ b/backend-spring/src/main/java/com/erp/service/DepartmentService.java @@ -24,7 +24,7 @@ public class DepartmentService extends BaseService { // member_count를 int로 변환 for (Map dept : departments) { - Object cnt = dept.get("memberCount"); + Object cnt = dept.get("member_count"); if (cnt != null) { dept.put("memberCount", ((Number) cnt).intValue()); } else { @@ -61,13 +61,13 @@ public class DepartmentService extends BaseService { Map companyParams = new HashMap<>(); companyParams.put("companyCode", companyCode); Map company = sqlSession.selectOne("department.selectCompanyName", companyParams); - String companyName = (company != null && company.get("companyName") != null) - ? (String) company.get("companyName") + String companyName = (company != null && company.get("company_name") != null) + ? (String) company.get("company_name") : companyCode; // 부서 코드 생성 Map codeResult = sqlSession.selectOne("department.selectNextDeptNumber", null); - long nextNumber = codeResult != null ? ((Number) codeResult.get("nextNumber")).longValue() : 1L; + long nextNumber = codeResult != null ? ((Number) codeResult.get("next_number")).longValue() : 1L; String deptCode = "DEPT_" + nextNumber; // 부서 생성 diff --git a/backend-spring/src/main/java/com/erp/service/DriverService.java b/backend-spring/src/main/java/com/erp/service/DriverService.java index ad844769..6feaec5b 100644 --- a/backend-spring/src/main/java/com/erp/service/DriverService.java +++ b/backend-spring/src/main/java/com/erp/service/DriverService.java @@ -30,14 +30,14 @@ public class DriverService extends BaseService { Map vehicle = sqlSession.selectOne("driver.getDriverVehicle", params); Map result = new LinkedHashMap<>(); - result.put("userId", userInfo.get("userId")); - result.put("userName", userInfo.get("userName")); - result.put("phoneNumber", userInfo.get("cellPhone")); - result.put("licenseNumber", userInfo.get("licenseNumber")); - result.put("vehicleNumber", userInfo.get("vehicleNumber")); - result.put("vehicleType", vehicle != null ? vehicle.get("vehicleType") : null); + result.put("userId", userInfo.get("user_id")); + result.put("userName", userInfo.get("user_name")); + result.put("phoneNumber", userInfo.get("cell_phone")); + result.put("licenseNumber", userInfo.get("license_number")); + result.put("vehicleNumber", userInfo.get("vehicle_number")); + result.put("vehicleType", vehicle != null ? vehicle.get("vehicle_type") : null); result.put("vehicleStatus", vehicle != null ? vehicle.get("status") : null); - result.put("branchName", userInfo.get("branchName")); + result.put("branchName", userInfo.get("branch_name")); return result; } @@ -69,9 +69,9 @@ public class DriverService extends BaseService { throw new IllegalArgumentException("사용자를 찾을 수 없습니다."); } // user_info에서 이름/전화번호 보완 - if (params.get("userName") == null) params.put("userName", userInfo.get("userName")); - if (params.get("phoneNumber") == null) params.put("phoneNumber", userInfo.get("cellPhone")); - if (params.get("companyCode") == null) params.put("companyCode", userInfo.get("companyCode")); + if (params.get("userName") == null) params.put("userName", userInfo.get("user_name")); + if (params.get("phoneNumber") == null) params.put("phoneNumber", userInfo.get("cell_phone")); + if (params.get("companyCode") == null) params.put("companyCode", userInfo.get("company_code")); sqlSession.insert("driver.insertDriverVehicle", params); diff --git a/backend-spring/src/main/java/com/erp/service/EntityJoinService.java b/backend-spring/src/main/java/com/erp/service/EntityJoinService.java index 5bf284b9..5c8c7776 100644 --- a/backend-spring/src/main/java/com/erp/service/EntityJoinService.java +++ b/backend-spring/src/main/java/com/erp/service/EntityJoinService.java @@ -129,11 +129,11 @@ public class EntityJoinService extends BaseService { } for (Map col : entityColumns) { - String columnName = (String) col.get("columnName"); - String inputType = (String) col.get("inputType"); - String refTable = (String) col.get("referenceTable"); - String refCol = (String) col.get("referenceColumn"); - String displayCol = (String) col.get("displayColumn"); + String columnName = (String) col.get("column_name"); + String inputType = (String) col.get("input_type"); + String refTable = (String) col.get("reference_table"); + String refCol = (String) col.get("reference_column"); + String displayCol = (String) col.get("display_column"); if ("category".equals(inputType)) { refTable = notBlank(refTable) ? refTable : "category_values"; @@ -182,17 +182,17 @@ public class EntityJoinService extends BaseService { List> metaCols = sqlSession.selectList(NS + "selectColumnMetadata", metaParams); Map> metaByCol = metaCols.stream() .collect(Collectors.toMap( - m -> (String) m.get("columnName"), + m -> (String) m.get("column_name"), m -> m, (a, b) -> a)); List> result = new ArrayList<>(); for (Map col : schemaCols) { - String colName = (String) col.get("columnName"); - String dataType = (String) col.get("dataType"); + String colName = (String) col.get("column_name"); + String dataType = (String) col.get("data_type"); Map meta = metaByCol.getOrDefault(colName, Collections.emptyMap()); - String label = (String) meta.getOrDefault("columnLabel", colName); - String inputType = (String) meta.get("inputType"); + String label = (String) meta.getOrDefault("column_label", colName); + String inputType = (String) meta.get("input_type"); Map item = new LinkedHashMap<>(); item.put("columnName", colName); @@ -411,7 +411,7 @@ public class EntityJoinService extends BaseService { p.put("tableName", refTable); List> cols = sqlSession.selectList(NS + "selectTableSchemaColumns", p); List colNames = cols.stream() - .map(c -> (String) c.get("columnName")) + .map(c -> (String) c.get("column_name")) .collect(Collectors.toList()); return colNames.stream() diff --git a/backend-spring/src/main/java/com/erp/service/EntityReferenceService.java b/backend-spring/src/main/java/com/erp/service/EntityReferenceService.java index 6dfe841b..e4dd99db 100644 --- a/backend-spring/src/main/java/com/erp/service/EntityReferenceService.java +++ b/backend-spring/src/main/java/com/erp/service/EntityReferenceService.java @@ -27,16 +27,16 @@ public class EntityReferenceService extends BaseService { "컬럼 정보를 찾을 수 없습니다: " + tableName + "." + columnName); } - String inputType = (String) columnInfo.get("inputType"); + String inputType = (String) columnInfo.get("input_type"); if (!"entity".equals(inputType)) { throw new IllegalStateException( "컬럼 '" + tableName + "." + columnName + "'은 entity 타입이 아닙니다. inputType: " + inputType); } - String referenceTable = (String) columnInfo.get("referenceTable"); - String referenceColumn = (String) columnInfo.get("referenceColumn"); - String displayColumn = columnInfo.get("displayColumn") != null - ? (String) columnInfo.get("displayColumn") : "name"; + String referenceTable = (String) columnInfo.get("reference_table"); + String referenceColumn = (String) columnInfo.get("reference_column"); + String displayColumn = columnInfo.get("display_column") != null + ? (String) columnInfo.get("display_column") : "name"; if (referenceTable == null || referenceColumn == null) { throw new IllegalStateException( @@ -81,8 +81,8 @@ public class EntityReferenceService extends BaseService { List> options = new ArrayList<>(); for (Map row : rows) { - Object val = row.get("refValue"); - Object disp = row.get("displayName"); + Object val = row.get("ref_value"); + Object disp = row.get("display_name"); Map opt = new LinkedHashMap<>(); opt.put("value", val != null ? val.toString() : ""); opt.put("label", disp != null ? disp.toString() : (val != null ? val.toString() : "")); @@ -121,8 +121,8 @@ public class EntityReferenceService extends BaseService { List> options = new ArrayList<>(); for (Map row : rows) { Map opt = new LinkedHashMap<>(); - opt.put("value", String.valueOf(row.get("codeValue"))); - opt.put("label", String.valueOf(row.get("codeName"))); + opt.put("value", String.valueOf(row.get("code_value"))); + opt.put("label", String.valueOf(row.get("code_name"))); options.add(opt); } diff --git a/backend-spring/src/main/java/com/erp/service/EntitySearchService.java b/backend-spring/src/main/java/com/erp/service/EntitySearchService.java index 880df387..afa2296c 100644 --- a/backend-spring/src/main/java/com/erp/service/EntitySearchService.java +++ b/backend-spring/src/main/java/com/erp/service/EntitySearchService.java @@ -34,7 +34,7 @@ public class EntitySearchService extends BaseService { p.put("tableName", tableName); List> rows = sqlSession.selectList(NS + "getTableColumnList", p); return rows.stream() - .map(r -> (String) r.get("columnName")) + .map(r -> (String) r.get("column_name")) .filter(Objects::nonNull) .collect(Collectors.toSet()); } @@ -239,8 +239,8 @@ public class EntitySearchService extends BaseService { Map pkp = new HashMap<>(); pkp.put("tableName", tableName); Map pk = sqlSession.selectOne(NS + "getPrimaryKeyInfo", pkp); - if (pk != null && pk.get("columnName") != null) { - orderByColumn = "\"" + sanitize((String) pk.get("columnName")) + "\""; + if (pk != null && pk.get("column_name") != null) { + orderByColumn = "\"" + sanitize((String) pk.get("column_name")) + "\""; } } catch (Exception e) { log.warn("PK 조회 실패 table={}", tableName); @@ -384,7 +384,7 @@ public class EntitySearchService extends BaseService { cvp.put("companyCode", companyCode); List> cvRows = sqlSession.selectList(NS + "getCategoryValueList", cvp); for (Map r : cvRows) { - labelMap.put((String) r.get("valueCode"), (String) r.get("valueLabel")); + labelMap.put((String) r.get("value_code"), (String) r.get("value_label")); } } catch (Exception e) { log.debug("category_values 조회 실패 (무시): {}", e.getMessage()); @@ -395,7 +395,7 @@ public class EntitySearchService extends BaseService { ttcp.put("tableName", tableName); ttcp.put("columnName", columnName); Map ttcRow = sqlSession.selectOne(NS + "getCodeCategoryInfo", ttcp); - String codeCategory = ttcRow != null ? (String) ttcRow.get("codeCategory") : null; + String codeCategory = ttcRow != null ? (String) ttcRow.get("code_category") : null; if (codeCategory != null) { Map cip = new HashMap<>(); @@ -404,9 +404,9 @@ public class EntitySearchService extends BaseService { cip.put("companyCode", companyCode); List> ciRows = sqlSession.selectList(NS + "getCodeInfoList", cip); for (Map r : ciRows) { - String codeValue = (String) r.get("codeValue"); + String codeValue = (String) r.get("code_value"); if (!labelMap.containsKey(codeValue)) { - labelMap.put(codeValue, (String) r.get("codeName")); + labelMap.put(codeValue, (String) r.get("code_name")); } } } diff --git a/backend-spring/src/main/java/com/erp/service/ExternalCallConfigService.java b/backend-spring/src/main/java/com/erp/service/ExternalCallConfigService.java index 5370edf1..061e7ab3 100644 --- a/backend-spring/src/main/java/com/erp/service/ExternalCallConfigService.java +++ b/backend-spring/src/main/java/com/erp/service/ExternalCallConfigService.java @@ -46,9 +46,9 @@ public class ExternalCallConfigService extends BaseService { parseConfigData(config); Map simplified = new LinkedHashMap<>(); simplified.put("id", config.get("id") != null ? config.get("id").toString() : null); - simplified.put("name", config.get("configName") != null ? config.get("configName") : config.get("config_name")); + simplified.put("name", config.get("config_name")); simplified.put("description", config.get("description")); - Object configData = config.get("configData") != null ? config.get("configData") : config.get("config_data"); + Object configData = config.get("config_data"); if (configData instanceof Map) { @SuppressWarnings("unchecked") Map cd = (Map) configData; @@ -150,17 +150,15 @@ public class ExternalCallConfigService extends BaseService { return resultMap(false, "외부 호출 설정을 찾을 수 없습니다: ID " + id); } - Object configDataRaw = config.get("configData") != null ? config.get("configData") : config.get("config_data"); + Object configDataRaw = config.get("config_data"); if (!(configDataRaw instanceof Map)) { return resultMap(false, "config_data가 유효하지 않습니다."); } @SuppressWarnings("unchecked") Map configData = (Map) configDataRaw; - String apiType = str(config, "apiType"); - if (apiType == null) apiType = str(config, "api_type"); - String callType = str(config, "callType"); - if (callType == null) callType = str(config, "call_type"); + String apiType = str(config, "api_type"); + String callType = str(config, "call_type"); // Node.js와 동일한 검증 로직 if ("discord".equals(apiType) || "slack".equals(apiType)) { @@ -196,7 +194,7 @@ public class ExternalCallConfigService extends BaseService { return r; } - Object configDataRaw = config.get("configData") != null ? config.get("configData") : config.get("config_data"); + Object configDataRaw = config.get("config_data"); if (!(configDataRaw instanceof Map)) { Map r = resultMap(false, "config_data가 유효하지 않습니다."); r.put("executionTime", System.currentTimeMillis() - startTime); @@ -248,7 +246,7 @@ public class ExternalCallConfigService extends BaseService { Map result = new LinkedHashMap<>(); result.put("success", success); - result.put("message", success ? "외부호출 '" + config.get("configName") + "' 실행 완료" : "외부호출 실행 실패"); + result.put("message", success ? "외부호출 '" + config.get("config_name") + "' 실행 완료" : "외부호출 실행 실패"); result.put("data", responseData); result.put("executionTime", executionTime); return result; @@ -266,7 +264,7 @@ public class ExternalCallConfigService extends BaseService { @SuppressWarnings("unchecked") private void parseConfigData(Map row) { - String key = row.containsKey("configData") ? "configData" : "config_data"; + String key = "config_data"; Object raw = row.get(key); if (raw instanceof String s && !s.isBlank()) { try { diff --git a/backend-spring/src/main/java/com/erp/service/ExternalDbConnectionService.java b/backend-spring/src/main/java/com/erp/service/ExternalDbConnectionService.java index a07ecf5d..6e878666 100644 --- a/backend-spring/src/main/java/com/erp/service/ExternalDbConnectionService.java +++ b/backend-spring/src/main/java/com/erp/service/ExternalDbConnectionService.java @@ -105,8 +105,7 @@ public class ExternalDbConnectionService extends BaseService { // 카테고리 초기화 Map> grouped = new LinkedHashMap<>(); for (Map cat : categories) { - String typeCode = str(cat, "typeCode"); - if (typeCode == null) typeCode = str(cat, "type_code"); + String typeCode = str(cat, "type_code"); if (typeCode == null) continue; Map entry = new LinkedHashMap<>(); entry.put("category", cat); @@ -116,8 +115,7 @@ public class ExternalDbConnectionService extends BaseService { // 연결을 타입 그룹에 배치 for (Map conn : connections) { - String dbType = str(conn, "dbType"); - if (dbType == null) dbType = str(conn, "db_type"); + String dbType = str(conn, "db_type"); if (dbType == null) continue; if (grouped.containsKey(dbType)) { @@ -291,8 +289,7 @@ public class ExternalDbConnectionService extends BaseService { } } - String dbType = str(conn, "dbType"); - if (dbType == null) dbType = str(conn, "db_type"); + String dbType = str(conn, "db_type"); return executeConnectionTest(dbType, conn, password); } @@ -302,12 +299,10 @@ public class ExternalDbConnectionService extends BaseService { String host = str(conn, "host"); int port = toInt(conn, "port", 5432); - String database = str(conn, "databaseName"); - if (database == null) database = str(conn, "database_name"); + String database = str(conn, "database_name"); String username = str(conn, "username"); - String sslEnabled = str(conn, "sslEnabled"); - if (sslEnabled == null) sslEnabled = str(conn, "ssl_enabled"); - int connTimeout = toInt(conn, "connectionTimeout", toInt(conn, "connection_timeout", 30)); + String sslEnabled = str(conn, "ssl_enabled"); + int connTimeout = toInt(conn, "connection_timeout", 30); if (!"postgresql".equalsIgnoreCase(dbType)) { Map result = new LinkedHashMap<>(); @@ -369,8 +364,7 @@ public class ExternalDbConnectionService extends BaseService { throw new NoSuchElementException("연결 정보를 찾을 수 없습니다."); } - String dbType = str(conn, "dbType"); - if (dbType == null) dbType = str(conn, "db_type"); + String dbType = str(conn, "db_type"); if (!"postgresql".equalsIgnoreCase(dbType)) { throw new UnsupportedOperationException( @@ -414,8 +408,7 @@ public class ExternalDbConnectionService extends BaseService { throw new NoSuchElementException("연결 정보를 찾을 수 없습니다."); } - String dbType = str(conn, "dbType"); - if (dbType == null) dbType = str(conn, "db_type"); + String dbType = str(conn, "db_type"); if (!"postgresql".equalsIgnoreCase(dbType)) { return Collections.emptyList(); } @@ -455,8 +448,7 @@ public class ExternalDbConnectionService extends BaseService { throw new NoSuchElementException("연결 정보를 찾을 수 없습니다."); } - String dbType = str(conn, "dbType"); - if (dbType == null) dbType = str(conn, "db_type"); + String dbType = str(conn, "db_type"); if (!"postgresql".equalsIgnoreCase(dbType)) { return Collections.emptyList(); } @@ -554,8 +546,7 @@ public class ExternalDbConnectionService extends BaseService { private String buildJdbcUrl(Map conn) { String host = str(conn, "host"); int port = toInt(conn, "port", 5432); - String database = str(conn, "databaseName"); - if (database == null) database = str(conn, "database_name"); + String database = str(conn, "database_name"); return String.format("jdbc:postgresql://%s:%d/%s", host, port, database); } @@ -564,12 +555,10 @@ public class ExternalDbConnectionService extends BaseService { String username = str(conn, "username"); props.setProperty("user", username != null ? username : ""); props.setProperty("password", password != null ? password : ""); - int connTimeout = toInt(conn, "connectionTimeout", - toInt(conn, "connection_timeout", 30)); + int connTimeout = toInt(conn, "connection_timeout", 30); props.setProperty("connectTimeout", String.valueOf(connTimeout)); props.setProperty("socketTimeout", "60"); - String ssl = str(conn, "sslEnabled"); - if (ssl == null) ssl = str(conn, "ssl_enabled"); + String ssl = str(conn, "ssl_enabled"); if ("Y".equalsIgnoreCase(ssl)) { props.setProperty("ssl", "true"); props.setProperty("sslmode", "require"); @@ -580,7 +569,7 @@ public class ExternalDbConnectionService extends BaseService { @SuppressWarnings("unchecked") private void parseConnectionOptions(Map conn) { // connection_options 가 JSON 문자열이면 Map으로 파싱 - String key = conn.containsKey("connectionOptions") ? "connectionOptions" : "connection_options"; + String key = "connection_options"; Object raw = conn.get(key); if (raw instanceof String s && !s.isBlank()) { try { diff --git a/backend-spring/src/main/java/com/erp/service/ExternalRestApiConnectionService.java b/backend-spring/src/main/java/com/erp/service/ExternalRestApiConnectionService.java index 1870d8d8..4fa1bd54 100644 --- a/backend-spring/src/main/java/com/erp/service/ExternalRestApiConnectionService.java +++ b/backend-spring/src/main/java/com/erp/service/ExternalRestApiConnectionService.java @@ -216,19 +216,19 @@ public class ExternalRestApiConnectionService extends BaseService { decryptAuthConfig(conn); String effectiveEndpoint = endpoint != null ? endpoint - : (String) conn.get("endpointPath"); + : (String) conn.get("endpoint_path"); Map testRequest = new LinkedHashMap<>(); - testRequest.put("base_url", conn.get("baseUrl")); + testRequest.put("base_url", conn.get("base_url")); testRequest.put("endpoint", effectiveEndpoint); - testRequest.put("method", conn.getOrDefault("defaultMethod", "GET")); - testRequest.put("headers", conn.get("defaultHeaders")); - testRequest.put("body", conn.get("defaultBody")); - testRequest.put("auth_type", conn.get("authType")); - testRequest.put("auth_config", conn.get("authConfig")); + testRequest.put("method", conn.getOrDefault("default_method", "GET")); + testRequest.put("headers", conn.get("default_headers")); + testRequest.put("body", conn.get("default_body")); + testRequest.put("auth_type", conn.get("auth_type")); + testRequest.put("auth_config", conn.get("auth_config")); testRequest.put("timeout", conn.get("timeout")); - String companyCode = (String) conn.get("companyCode"); + String companyCode = (String) conn.get("company_code"); Map result = testConnection(testRequest, companyCode); try { @@ -257,24 +257,24 @@ public class ExternalRestApiConnectionService extends BaseService { parseJsonFields(conn); decryptAuthConfig(conn); - if (!"Y".equals(conn.get("isActive"))) { + if (!"Y".equals(conn.get("is_active"))) { return Map.of("success", false, "message", "비활성화된 REST API 연결입니다."); } String effectiveEndpoint = endpoint != null ? endpoint - : (String) conn.getOrDefault("endpointPath", ""); + : (String) conn.getOrDefault("endpoint_path", ""); Map testRequest = new LinkedHashMap<>(); - testRequest.put("base_url", conn.get("baseUrl")); + testRequest.put("base_url", conn.get("base_url")); testRequest.put("endpoint", effectiveEndpoint); - testRequest.put("method", conn.getOrDefault("defaultMethod", "GET")); - testRequest.put("headers", conn.get("defaultHeaders")); - testRequest.put("body", conn.get("defaultBody")); - testRequest.put("auth_type", conn.get("authType")); - testRequest.put("auth_config", conn.get("authConfig")); + testRequest.put("method", conn.getOrDefault("default_method", "GET")); + testRequest.put("headers", conn.get("default_headers")); + testRequest.put("body", conn.get("default_body")); + testRequest.put("auth_type", conn.get("auth_type")); + testRequest.put("auth_config", conn.get("auth_config")); testRequest.put("timeout", conn.get("timeout")); - String companyCode = (String) conn.get("companyCode"); + String companyCode = (String) conn.get("company_code"); Map testResult = testConnection(testRequest, companyCode); if (!Boolean.TRUE.equals(testResult.get("success"))) { @@ -309,8 +309,8 @@ public class ExternalRestApiConnectionService extends BaseService { Map connectionInfo = new LinkedHashMap<>(); connectionInfo.put("connectionId", conn.get("id")); - connectionInfo.put("connectionName", conn.get("connectionName")); - connectionInfo.put("baseUrl", conn.get("baseUrl")); + connectionInfo.put("connectionName", conn.get("connection_name")); + connectionInfo.put("baseUrl", conn.get("base_url")); connectionInfo.put("endpoint", effectiveEndpoint); Map data = new LinkedHashMap<>(); @@ -401,8 +401,8 @@ public class ExternalRestApiConnectionService extends BaseService { @SuppressWarnings("unchecked") private void parseJsonFields(Map row) { - parseJsonField(row, "defaultHeaders"); - parseJsonField(row, "authConfig"); + parseJsonField(row, "default_headers"); + parseJsonField(row, "auth_config"); } private void parseJsonField(Map row, String key) { @@ -463,7 +463,7 @@ public class ExternalRestApiConnectionService extends BaseService { @SuppressWarnings("unchecked") private void decryptAuthConfig(Map row) { - Object authConfigObj = row.get("authConfig"); + Object authConfigObj = row.get("auth_config"); if (authConfigObj == null) return; Map authConfig; @@ -478,7 +478,7 @@ public class ExternalRestApiConnectionService extends BaseService { decryptField(authConfig, "token"); decryptField(authConfig, "password"); decryptField(authConfig, "clientSecret"); - row.put("authConfig", authConfig); + row.put("auth_config", authConfig); } catch (Exception e) { log.warn("민감 정보 복호화 실패 (암호화되지 않은 데이터일 수 있음)"); } diff --git a/backend-spring/src/main/java/com/erp/service/FlowExternalDbConnectionService.java b/backend-spring/src/main/java/com/erp/service/FlowExternalDbConnectionService.java index 4cff9487..2853a7bd 100644 --- a/backend-spring/src/main/java/com/erp/service/FlowExternalDbConnectionService.java +++ b/backend-spring/src/main/java/com/erp/service/FlowExternalDbConnectionService.java @@ -142,7 +142,7 @@ public class FlowExternalDbConnectionService extends BaseService { Map conn = findById(id); if (conn == null) return result(false, "연결 정보를 찾을 수 없습니다."); - String dbType = strOf(conn.get("dbType")); + String dbType = strOf(conn.get("db_type")); String query; switch (dbType) { case "postgresql": @@ -176,7 +176,7 @@ public class FlowExternalDbConnectionService extends BaseService { Map conn = findById(id); if (conn == null) return result(false, "연결 정보를 찾을 수 없습니다."); - String dbType = strOf(conn.get("dbType")); + String dbType = strOf(conn.get("db_type")); String sql; Object[] args; switch (dbType) { @@ -218,10 +218,10 @@ public class FlowExternalDbConnectionService extends BaseService { /** DB row의 JSONB 컬럼(connection_options) 파싱 */ private void parseJsonFields(Map row) { - Object opts = row.get("connectionOptions"); + Object opts = row.get("connection_options"); if (opts instanceof String) { try { - row.put("connectionOptions", objectMapper.readValue((String) opts, Object.class)); + row.put("connection_options", objectMapper.readValue((String) opts, Object.class)); } catch (Exception ignored) {} } } @@ -257,17 +257,17 @@ public class FlowExternalDbConnectionService extends BaseService { /** 외부 DB JDBC 연결 생성 (PostgreSQL, MySQL 지원) */ private Connection openJdbc(Map conn) throws Exception { - String dbType = strOf(conn.get("dbType")); + String dbType = strOf(conn.get("db_type")); String host = strOf(conn.get("host")); int port = ((Number) conn.get("port")).intValue(); - String dbName = strOf(conn.get("databaseName")); + String dbName = strOf(conn.get("database_name")); String user = strOf(conn.get("username")); - String encPwd = strOf(conn.get("passwordEncrypted")); + String encPwd = strOf(conn.get("password_encrypted")); String password; try { password = encryption.decrypt(encPwd); } catch (Exception e) { password = encPwd; /* fallback */ } - boolean ssl = Boolean.TRUE.equals(conn.get("sslEnabled")); + boolean ssl = Boolean.TRUE.equals(conn.get("ssl_enabled")); String jdbcUrl; switch (dbType) { diff --git a/backend-spring/src/main/java/com/erp/service/MailReceiveBasicService.java b/backend-spring/src/main/java/com/erp/service/MailReceiveBasicService.java index acc9349d..8df81a63 100644 --- a/backend-spring/src/main/java/com/erp/service/MailReceiveBasicService.java +++ b/backend-spring/src/main/java/com/erp/service/MailReceiveBasicService.java @@ -65,8 +65,8 @@ public class MailReceiveBasicService extends BaseService { result.put("message", "메일 계정을 찾을 수 없습니다."); return result; } - String host = (String) account.get("imapHost"); - Object portObj = account.get("imapPort"); + String host = (String) account.get("imap_host"); + Object portObj = account.get("imap_port"); int port = portObj != null ? ((Number) portObj).intValue() : 993; try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress(host, port), 5000); diff --git a/backend-spring/src/main/java/com/erp/service/MailSendSimpleService.java b/backend-spring/src/main/java/com/erp/service/MailSendSimpleService.java index 7731f90b..b144f64e 100644 --- a/backend-spring/src/main/java/com/erp/service/MailSendSimpleService.java +++ b/backend-spring/src/main/java/com/erp/service/MailSendSimpleService.java @@ -98,7 +98,7 @@ public class MailSendSimpleService extends BaseService { if (htmlContent.isBlank()) throw new IllegalArgumentException("메일 내용이 없습니다."); // 비밀번호 복호화 - String decryptedPassword = passwordEncryption.decrypt(str(account.get("smtpPassword"))); + String decryptedPassword = passwordEncryption.decrypt(str(account.get("smtp_password"))); // JavaMailSender 동적 생성 및 발송 JavaMailSenderImpl sender = createMailSender(account, decryptedPassword); @@ -263,7 +263,7 @@ public class MailSendSimpleService extends BaseService { return r; } try { - String decryptedPassword = passwordEncryption.decrypt(str(account.get("smtpPassword"))); + String decryptedPassword = passwordEncryption.decrypt(str(account.get("smtp_password"))); JavaMailSenderImpl sender = createMailSender(account, decryptedPassword); sender.testConnection(); Map r = new LinkedHashMap<>(); @@ -283,19 +283,19 @@ public class MailSendSimpleService extends BaseService { private JavaMailSenderImpl createMailSender(Map account, String decryptedPassword) { JavaMailSenderImpl sender = new JavaMailSenderImpl(); - sender.setHost(str(account.get("smtpHost"))); + sender.setHost(str(account.get("smtp_host"))); - Object portObj = account.get("smtpPort"); + Object portObj = account.get("smtp_port"); int port = portObj != null ? ((Number) portObj).intValue() : 587; sender.setPort(port); - sender.setUsername(str(account.get("smtpUsername"))); + sender.setUsername(str(account.get("smtp_username"))); sender.setPassword(decryptedPassword); sender.setDefaultEncoding("UTF-8"); Properties props = sender.getJavaMailProperties(); boolean secure = (port == 465); if (!secure) { - Object smtpSecureObj = account.get("smtpSecure"); + Object smtpSecureObj = account.get("smtp_secure"); secure = Boolean.TRUE.equals(smtpSecureObj) || "true".equalsIgnoreCase(str(smtpSecureObj)); } diff --git a/backend-spring/src/main/java/com/erp/service/MailSentHistoryService.java b/backend-spring/src/main/java/com/erp/service/MailSentHistoryService.java index 4545b512..64e1fdae 100644 --- a/backend-spring/src/main/java/com/erp/service/MailSentHistoryService.java +++ b/backend-spring/src/main/java/com/erp/service/MailSentHistoryService.java @@ -139,8 +139,8 @@ public class MailSentHistoryService extends BaseService { Map stats = sqlSession.selectOne(NS + "getMailSentHistoryStatistics", params); if (stats == null) stats = new HashMap<>(); - long totalSent = toLong(stats.get("totalSent")); - long successCount = toLong(stats.get("successCount")); + long totalSent = toLong(stats.get("total_sent")); + long successCount = toLong(stats.get("success_count")); long successRate = totalSent > 0 ? Math.round((double) successCount / totalSent * 100) : 0; stats.put("successRate", successRate); return stats; diff --git a/backend-spring/src/main/java/com/erp/service/MultiConnectionService.java b/backend-spring/src/main/java/com/erp/service/MultiConnectionService.java index d037f17d..222e2593 100644 --- a/backend-spring/src/main/java/com/erp/service/MultiConnectionService.java +++ b/backend-spring/src/main/java/com/erp/service/MultiConnectionService.java @@ -302,8 +302,7 @@ public class MultiConnectionService extends BaseService { private Connection openExtConn(Map connInfo) throws SQLException { String host = str(connInfo, "host"); int port = toIntMap(connInfo, "port", 5432); - String database = str(connInfo, "databaseName"); - if (database == null) database = str(connInfo, "database_name"); + String database = str(connInfo, "database_name"); String url = String.format("jdbc:postgresql://%s:%d/%s", host, port, database); Properties props = new Properties(); diff --git a/backend-spring/src/main/java/com/erp/service/MultilangService.java b/backend-spring/src/main/java/com/erp/service/MultilangService.java index b16906a9..47b617c4 100644 --- a/backend-spring/src/main/java/com/erp/service/MultilangService.java +++ b/backend-spring/src/main/java/com/erp/service/MultilangService.java @@ -45,7 +45,7 @@ public class MultilangService extends BaseService { if (current == null) { throw new IllegalArgumentException("언어를 찾을 수 없습니다: " + langCode); } - String newStatus = "Y".equals(current.get("isActive")) ? "N" : "Y"; + String newStatus = "Y".equals(current.get("is_active")) ? "N" : "Y"; Map params = new HashMap<>(); params.put("langCode", langCode); params.put("newStatus", newStatus); @@ -119,7 +119,7 @@ public class MultilangService extends BaseService { if (current == null) { throw new IllegalArgumentException("다국어 키를 찾을 수 없습니다: " + keyId); } - String newStatus = "Y".equals(current.get("isActive")) ? "N" : "Y"; + String newStatus = "Y".equals(current.get("is_active")) ? "N" : "Y"; Map params = new HashMap<>(); params.put("keyId", keyId); params.put("newStatus", newStatus); @@ -147,14 +147,14 @@ public class MultilangService extends BaseService { "companyCode", companyCode, "menuCode", menuCode, "langKey", langKey, "userLang", userLang); Map result = sqlSession.selectOne(NS + "getMultilangUserText", params); - return result != null ? str(result.get("langText")) : langKey; + return result != null ? str(result.get("lang_text")) : langKey; } public String getLangText(String companyCode, String langKey, String langCode) { Map params = Map.of( "companyCode", companyCode, "langKey", langKey, "langCode", langCode); Map result = sqlSession.selectOne(NS + "getMultilangSingleText", params); - return result != null ? str(result.get("langText")) : langKey; + return result != null ? str(result.get("lang_text")) : langKey; } public Map getBatchTranslations(String companyCode, String menuCode, @@ -169,9 +169,9 @@ public class MultilangService extends BaseService { Map result = new LinkedHashMap<>(); Set processed = new HashSet<>(); for (Map t : translations) { - String key = str(t.get("langKey")); + String key = str(t.get("lang_key")); if (langKeys.contains(key) && !processed.contains(key)) { - result.put(key, str(t.get("langText"))); + result.put(key, str(t.get("lang_text"))); processed.add(key); } } @@ -183,9 +183,9 @@ public class MultilangService extends BaseService { List> fallback = sqlSession.selectList(NS + "getMultilangFallbackTranslationList", fallbackParams); Set fbProcessed = new HashSet<>(); for (Map t : fallback) { - String key = str(t.get("langKey")); + String key = str(t.get("lang_key")); if (!result.containsKey(key) && !fbProcessed.contains(key)) { - result.put(key, str(t.get("langText"))); + result.put(key, str(t.get("lang_text"))); fbProcessed.add(key); } } @@ -212,11 +212,11 @@ public class MultilangService extends BaseService { for (Map cat : flat) { Map node = new LinkedHashMap<>(cat); node.put("children", new ArrayList<>()); - byId.put(toInt(cat.get("categoryId")), node); + byId.put(toInt(cat.get("category_id")), node); } List> roots = new ArrayList<>(); for (Map node : byId.values()) { - Object parentIdObj = node.get("parentId"); + Object parentIdObj = node.get("parent_id"); if (parentIdObj == null) { roots.add(node); } else { @@ -280,7 +280,7 @@ public class MultilangService extends BaseService { result.put("langKey", langKey); result.put("exists", companyKey != null); result.put("isOverride", commonKey != null && companyKey == null); - if (commonKey != null) result.put("baseKeyId", toInt(commonKey.get("keyId"))); + if (commonKey != null) result.put("baseKeyId", toInt(commonKey.get("key_id"))); return result; } @@ -290,16 +290,16 @@ public class MultilangService extends BaseService { String companyCode = str(params.get("companyCode")); Map baseKey = sqlSession.selectOne(NS + "getMultilangBaseKeyInfo", Map.of("keyId", baseKeyId)); if (baseKey == null) throw new IllegalArgumentException("원본 키를 찾을 수 없습니다"); - if (!"*".equals(str(baseKey.get("companyCode")))) throw new IllegalArgumentException("공통 키(*)만 오버라이드 할 수 있습니다"); - String langKey = str(baseKey.get("langKey")); + if (!"*".equals(str(baseKey.get("company_code")))) throw new IllegalArgumentException("공통 키(*)만 오버라이드 할 수 있습니다"); + String langKey = str(baseKey.get("lang_key")); if (sqlSession.selectOne(NS + "getMultilangKeyByCompanyAndKey", Map.of("companyCode", companyCode, "langKey", langKey)) != null) { throw new IllegalArgumentException("이미 해당 회사의 오버라이드 키가 존재합니다"); } Map insertParams = new HashMap<>(); insertParams.put("companyCode", companyCode); insertParams.put("langKey", langKey); - insertParams.put("categoryId", baseKey.get("categoryId")); - insertParams.put("keyMeaning", baseKey.get("keyMeaning")); + insertParams.put("categoryId", baseKey.get("category_id")); + insertParams.put("keyMeaning", baseKey.get("key_meaning")); insertParams.put("baseKeyId", baseKeyId); insertParams.put("createdBy", params.getOrDefault("createdBy", "system")); sqlSession.insert(NS + "insertMultilangOverrideKey", insertParams); @@ -327,20 +327,20 @@ public class MultilangService extends BaseService { public List> generateScreenLabelKeys(Map params) { int screenId = toInt(params.get("screenId")); Map screenInfo = sqlSession.selectOne(NS + "getMultilangScreenCompanyCode", Map.of("screenId", screenId)); - String companyCode = (screenInfo != null && !str(screenInfo.get("companyCode")).isEmpty()) - ? str(screenInfo.get("companyCode")) : str(params.getOrDefault("companyCode", "*")); + String companyCode = (screenInfo != null && !str(screenInfo.get("company_code")).isEmpty()) + ? str(screenInfo.get("company_code")) : str(params.getOrDefault("companyCode", "*")); String companyName; if ("*".equals(companyCode)) { companyName = "공통"; } else { Map companyInfo = sqlSession.selectOne(NS + "getMultilangCompanyName", Map.of("companyCode", companyCode)); - companyName = (companyInfo != null) ? str(companyInfo.get("companyName")) : companyCode; + companyName = (companyInfo != null) ? str(companyInfo.get("company_name")) : companyCode; } List groupPath = getScreenGroupPath(screenId); int categoryId = ensureScreenGroupCategory(companyCode, companyName, groupPath); List> categoryPath = getCategoryPath(categoryId); List keyPrefixParts = new ArrayList<>(); - for (Map c : categoryPath) keyPrefixParts.add(str(c.get("keyPrefix"))); + for (Map c : categoryPath) keyPrefixParts.add(str(c.get("key_prefix"))); @SuppressWarnings("unchecked") List> labels = (List>) params.get("labels"); List> results = new ArrayList<>(); @@ -354,7 +354,7 @@ public class MultilangService extends BaseService { Map existing = sqlSession.selectOne(NS + "getMultilangKeyByCompanyAndKey", Map.of("companyCode", companyCode, "langKey", langKey)); int keyId; if (existing != null) { - keyId = toInt(existing.get("keyId")); + keyId = toInt(existing.get("key_id")); } else { Map insertParams = new HashMap<>(); insertParams.put("companyCode", companyCode); @@ -379,10 +379,10 @@ public class MultilangService extends BaseService { private List getScreenGroupPath(int screenId) { Map groupRow = sqlSession.selectOne(NS + "getMultilangScreenGroupId", Map.of("screenId", screenId)); if (groupRow == null) return Collections.emptyList(); - int groupId = toInt(groupRow.get("groupId")); + int groupId = toInt(groupRow.get("group_id")); List> groups = sqlSession.selectList(NS + "getMultilangScreenGroupPath", Map.of("groupId", groupId)); List path = new ArrayList<>(); - for (Map g : groups) path.add(str(g.get("groupName"))); + for (Map g : groups) path.add(str(g.get("group_name"))); return path; } @@ -393,7 +393,7 @@ public class MultilangService extends BaseService { for (String groupName : groupPath) { Map existing = sqlSession.selectOne(NS + "getMultilangCategoryByNameAndParent", Map.of("categoryName", groupName, "parentId", parentId)); if (existing != null) { - parentId = toInt(existing.get("categoryId")); + parentId = toInt(existing.get("category_id")); } else { Map insertParams = new HashMap<>(); insertParams.put("categoryCode", (companyCode + "_GROUP_" + groupName).replace("\\s+", "_")); @@ -414,7 +414,7 @@ public class MultilangService extends BaseService { private int ensureCompanyCategory(String companyCode, String companyName) { int screenRootId = ensureScreenRootCategory(); Map existing = sqlSession.selectOne(NS + "getMultilangCategoryByCodeAndParent", Map.of("categoryCode", companyCode, "parentId", screenRootId)); - if (existing != null) return toInt(existing.get("categoryId")); + if (existing != null) return toInt(existing.get("category_id")); String displayName = "*".equals(companyCode) ? "공통" : companyName; String keyPrefix = "*".equals(companyCode) ? "common" : companyCode.toLowerCase(); Map insertParams = new HashMap<>(); @@ -431,7 +431,7 @@ public class MultilangService extends BaseService { private int ensureScreenRootCategory() { Map existing = sqlSession.selectOne(NS + "getMultilangRootCategoryByCode", Map.of("categoryCode", "screen")); - if (existing != null) return toInt(existing.get("categoryId")); + if (existing != null) return toInt(existing.get("category_id")); Map insertParams = new HashMap<>(); insertParams.put("categoryCode", "screen"); insertParams.put("categoryName", "화면"); @@ -446,7 +446,7 @@ public class MultilangService extends BaseService { private String buildLangKey(List> categoryPath, String keyMeaning) { List parts = new ArrayList<>(); - for (Map c : categoryPath) parts.add(str(c.get("keyPrefix"))); + for (Map c : categoryPath) parts.add(str(c.get("key_prefix"))); parts.add(keyMeaning); return String.join(".", parts); } diff --git a/backend-spring/src/main/java/com/erp/service/NodeExternalConnectionService.java b/backend-spring/src/main/java/com/erp/service/NodeExternalConnectionService.java index 6360f847..63e599ea 100644 --- a/backend-spring/src/main/java/com/erp/service/NodeExternalConnectionService.java +++ b/backend-spring/src/main/java/com/erp/service/NodeExternalConnectionService.java @@ -59,7 +59,7 @@ public class NodeExternalConnectionService extends BaseService { .orTimeout(TIMEOUT_SEC, TimeUnit.SECONDS) .exceptionally(e -> { log.warn("커넥션 테스트 타임아웃/오류 ({}): {}", - conn.get("connectionName"), e.getMessage()); + conn.get("connection_name"), e.getMessage()); return null; })) .toList(); @@ -87,7 +87,7 @@ public class NodeExternalConnectionService extends BaseService { Map conn = loadConnection(id); if (conn == null) return fail("연결 ID " + id + "를 찾을 수 없습니다."); - String dbType = str(conn.get("dbType")).toLowerCase(); + String dbType = str(conn.get("db_type")).toLowerCase(); String sql; switch (dbType) { case "postgresql": @@ -129,7 +129,7 @@ public class NodeExternalConnectionService extends BaseService { Map conn = loadConnection(id); if (conn == null) return fail("연결 ID " + id + "를 찾을 수 없습니다."); - String dbType = str(conn.get("dbType")).toLowerCase(); + String dbType = str(conn.get("db_type")).toLowerCase(); String sql; switch (dbType) { case "postgresql": @@ -179,15 +179,15 @@ public class NodeExternalConnectionService extends BaseService { Map entry = new LinkedHashMap<>(); entry.put("id", conn.get("id")); - entry.put("connection_name", conn.get("connectionName")); + entry.put("connection_name", conn.get("connection_name")); entry.put("description", conn.get("description")); - entry.put("db_type", conn.get("dbType")); + entry.put("db_type", conn.get("db_type")); entry.put("host", conn.get("host")); entry.put("port", conn.get("port")); - entry.put("database_name", conn.get("databaseName")); + entry.put("database_name", conn.get("database_name")); return entry; } catch (Exception e) { - log.warn("연결 테스트 실패 ({}): {}", conn.get("connectionName"), e.getMessage()); + log.warn("연결 테스트 실패 ({}): {}", conn.get("connection_name"), e.getMessage()); return null; } } @@ -203,13 +203,13 @@ public class NodeExternalConnectionService extends BaseService { * ssl_enabled = 'Y'/'N' 문자열 처리 (Node.js 저장 형식과 동일). */ private Connection openJdbc(Map conn) throws Exception { - String dbType = str(conn.get("dbType")).toLowerCase(); + String dbType = str(conn.get("db_type")).toLowerCase(); String host = str(conn.get("host")); int port = ((Number) conn.get("port")).intValue(); - String dbName = str(conn.get("databaseName")); + String dbName = str(conn.get("database_name")); String user = str(conn.get("username")); String encPwd = str(conn.get("password")); - boolean ssl = "Y".equalsIgnoreCase(str(conn.get("sslEnabled"))); + boolean ssl = "Y".equalsIgnoreCase(str(conn.get("ssl_enabled"))); String password; try { diff --git a/backend-spring/src/main/java/com/erp/service/NodeFlowService.java b/backend-spring/src/main/java/com/erp/service/NodeFlowService.java index 3021630e..97e7ba53 100644 --- a/backend-spring/src/main/java/com/erp/service/NodeFlowService.java +++ b/backend-spring/src/main/java/com/erp/service/NodeFlowService.java @@ -58,7 +58,7 @@ public class NodeFlowService extends BaseService { if (flow == null) return null; // flowData JSONB → Java 객체 - parseFlowDataField(flow, "flowData"); + parseFlowDataField(flow, "flow_data"); return flow; } @@ -130,8 +130,8 @@ public class NodeFlowService extends BaseService { String companyCode = (String) params.get("companyCode"); Map changes = new LinkedHashMap<>(); if (oldFlow != null) changes.put("before", Map.of( - "flowName", oldFlow.getOrDefault("flowName", ""), - "flowDescription", oldFlow.getOrDefault("flowDescription", ""))); + "flowName", oldFlow.getOrDefault("flow_name", ""), + "flowDescription", oldFlow.getOrDefault("flow_description", ""))); changes.put("after", Map.of("flowName", flowName, "flowDescription", params.getOrDefault("flowDescription", ""))); @@ -158,13 +158,13 @@ public class NodeFlowService extends BaseService { log.info("플로우 삭제 성공: {}", flowId); String flowName = oldFlow != null - ? (String) oldFlow.getOrDefault("flowName", "ID:" + flowId) + ? (String) oldFlow.getOrDefault("flow_name", "ID:" + flowId) : "ID:" + flowId; Map changes = new LinkedHashMap<>(); if (oldFlow != null) changes.put("before", Map.of( - "flowName", oldFlow.getOrDefault("flowName", ""), - "flowDescription", oldFlow.getOrDefault("flowDescription", ""))); + "flowName", oldFlow.getOrDefault("flow_name", ""), + "flowDescription", oldFlow.getOrDefault("flow_description", ""))); insertAuditLog(companyCode, userId, userName, "DELETE", String.valueOf(flowId), flowName, @@ -179,7 +179,7 @@ public class NodeFlowService extends BaseService { Map row = sqlSession.selectOne("nodeFlow.getNodeFlowData", Map.of("flowId", flowId)); if (row == null) return null; - Map flowData = parseJsonToMap(row.get("flowData")); + Map flowData = parseJsonToMap(row.get("flow_data")); @SuppressWarnings("unchecked") List> nodes = (List>) flowData.getOrDefault("nodes", List.of()); @@ -229,7 +229,7 @@ public class NodeFlowService extends BaseService { Map row = sqlSession.selectOne("nodeFlow.getNodeFlowData", Map.of("flowId", flowId)); if (row == null) throw new IllegalArgumentException("플로우를 찾을 수 없습니다: flowId=" + flowId); - Map flowData = parseJsonToMap(row.get("flowData")); + Map flowData = parseJsonToMap(row.get("flow_data")); @SuppressWarnings("unchecked") List> nodes = (List>) flowData.getOrDefault("nodes", List.of()); @@ -237,7 +237,7 @@ public class NodeFlowService extends BaseService { List> edges = (List>) flowData.getOrDefault("edges", List.of()); log.info("플로우 정보: flowName={}, nodes={}, edges={}", - row.get("flowName"), nodes.size(), edges.size()); + row.get("flow_name"), nodes.size(), edges.size()); // ── 위상 정렬 (레벨별) List> levels = topologicalSort(nodes, edges); diff --git a/backend-spring/src/main/java/com/erp/service/NumberingRuleService.java b/backend-spring/src/main/java/com/erp/service/NumberingRuleService.java index f8f1b197..e1098818 100644 --- a/backend-spring/src/main/java/com/erp/service/NumberingRuleService.java +++ b/backend-spring/src/main/java/com/erp/service/NumberingRuleService.java @@ -153,7 +153,7 @@ public class NumberingRuleService extends BaseService { // 수동 값 추출 List extractedManualValues = new ArrayList<>(); boolean hasManualPart = sortedParts.stream() - .anyMatch(p -> "manual".equals(p.get("generationMethod"))); + .anyMatch(p -> "manual".equals(p.get("generation_method"))); if (hasManualPart && userInputCode != null) { extractedManualValues = extractManualValues(rule, sortedParts, userInputCode, formData); } @@ -162,7 +162,7 @@ public class NumberingRuleService extends BaseService { String prefixKey = buildPrefixKey(rule, formData, extractedManualValues.isEmpty() ? null : extractedManualValues); boolean hasSequence = sortedParts.stream() - .anyMatch(p -> "sequence".equals(p.get("partType"))); + .anyMatch(p -> "sequence".equals(p.get("part_type"))); long allocatedSequence = 0; if (hasSequence) { @@ -246,7 +246,7 @@ public class NumberingRuleService extends BaseService { if (rule != null) { // column_name 자동 업데이트 (레거시 마이그레이션) Map upParams = new HashMap<>(); - upParams.put("ruleId", rule.get("ruleId")); + upParams.put("ruleId", rule.get("rule_id")); upParams.put("companyCode", companyCode); upParams.put("columnName", columnName); sqlSession.update(NS + "updateRuleColumnName", upParams); @@ -326,7 +326,7 @@ public class NumberingRuleService extends BaseService { int skipped = 0; for (Map rule : sourceRules) { - String ruleId = (String) rule.get("ruleId"); + String ruleId = (String) rule.get("rule_id"); // 대상 회사에 이미 존재하는지 확인 Map checkParams = new HashMap<>(); @@ -374,7 +374,7 @@ public class NumberingRuleService extends BaseService { partParams.put("companyCode", companyCode); // auto_config: separatorAfter 통합 - Map autoConfig = parseAutoConfig(part.get("autoConfig")); + Map autoConfig = parseAutoConfig(part.get("auto_config")); Object sepAfter = part.getOrDefault("separatorAfter", "-"); autoConfig.put("separatorAfter", sepAfter); partParams.put("autoConfig", toJsonString(autoConfig)); @@ -393,14 +393,14 @@ public class NumberingRuleService extends BaseService { } private void loadPartsForRule(Map rule, String companyCode) { - String ruleId = (String) rule.get("ruleId"); + String ruleId = (String) rule.get("rule_id"); Map params = new HashMap<>(); params.put("ruleId", ruleId); params.put("companyCode", companyCode); List> parts = sqlSession.selectList(NS + "getRulePartsByRuleId", params); // autoConfig에서 separatorAfter 추출 for (Map part : parts) { - Map ac = parseAutoConfig(part.get("autoConfig")); + Map ac = parseAutoConfig(part.get("auto_config")); if (ac.containsKey("separatorAfter")) { part.put("separatorAfter", ac.get("separatorAfter")); } @@ -422,7 +422,7 @@ public class NumberingRuleService extends BaseService { params.put("prefixKey", prefixKey); Map row = sqlSession.selectOne(NS + "getSequenceForPrefix", params); if (row == null) return 0L; - Object seq = row.get("currentSequence"); + Object seq = row.get("current_sequence"); return seq == null ? 0L : ((Number) seq).longValue(); } @@ -455,8 +455,8 @@ public class NumberingRuleService extends BaseService { int manualIndex = 0; for (Map part : sortedParts) { - String partType = (String) part.get("partType"); - String generationMethod = (String) part.get("generationMethod"); + String partType = (String) part.get("part_type"); + String generationMethod = (String) part.get("generation_method"); if ("sequence".equals(partType)) continue; @@ -468,7 +468,7 @@ public class NumberingRuleService extends BaseService { continue; } - Map ac = parseAutoConfig(part.get("autoConfig")); + Map ac = parseAutoConfig(part.get("auto_config")); String computed = computeSinglePartValue(partType, ac, formData); if (computed != null && !computed.isEmpty()) { prefixParts.add(computed); @@ -485,9 +485,9 @@ public class NumberingRuleService extends BaseService { boolean isPreview) { List values = new ArrayList<>(); for (Map part : sortedParts) { - String partType = (String) part.get("partType"); - String generationMethod = (String) part.get("generationMethod"); - Map ac = parseAutoConfig(part.get("autoConfig")); + String partType = (String) part.get("part_type"); + String generationMethod = (String) part.get("generation_method"); + Map ac = parseAutoConfig(part.get("auto_config")); if ("manual".equals(generationMethod)) { values.add(isPreview ? "____" : ""); @@ -512,9 +512,9 @@ public class NumberingRuleService extends BaseService { int manualIndex = 0; for (Map part : sortedParts) { - String partType = (String) part.get("partType"); - String generationMethod = (String) part.get("generationMethod"); - Map ac = parseAutoConfig(part.get("autoConfig")); + String partType = (String) part.get("part_type"); + String generationMethod = (String) part.get("generation_method"); + Map ac = parseAutoConfig(part.get("auto_config")); if ("manual".equals(generationMethod)) { String val = (manualValues != null && manualIndex < manualValues.size()) @@ -630,7 +630,7 @@ public class NumberingRuleService extends BaseService { sb.append(values.get(i)); if (i < values.size() - 1) { Map part = sortedParts.get(i); - Map ac = parseAutoConfig(part.get("autoConfig")); + Map ac = parseAutoConfig(part.get("auto_config")); Object sep = part.containsKey("separatorAfter") ? part.get("separatorAfter") : ac.getOrDefault("separatorAfter", globalSeparator != null ? globalSeparator : ""); sb.append(sep != null ? sep.toString() : ""); @@ -648,7 +648,7 @@ public class NumberingRuleService extends BaseService { String userInputCode, Map formData) { List> manualParts = sortedParts.stream() - .filter(p -> "manual".equals(p.get("generationMethod"))) + .filter(p -> "manual".equals(p.get("generation_method"))) .toList(); if (manualParts.isEmpty() || userInputCode == null) return new ArrayList<>(); diff --git a/backend-spring/src/main/java/com/erp/service/ReportService.java b/backend-spring/src/main/java/com/erp/service/ReportService.java index cf8d3539..55fd160b 100644 --- a/backend-spring/src/main/java/com/erp/service/ReportService.java +++ b/backend-spring/src/main/java/com/erp/service/ReportService.java @@ -48,7 +48,7 @@ public class ReportService extends BaseService { List menuObjids = new ArrayList<>(); if (menuMappings != null) { for (Map m : menuMappings) { - menuObjids.add(m.get("menuObjid") != null ? m.get("menuObjid") : m.get("menu_objid")); + menuObjids.add(m.get("menu_objid")); } } diff --git a/backend-spring/src/main/java/com/erp/service/RoleService.java b/backend-spring/src/main/java/com/erp/service/RoleService.java index c8184e68..5b4da3d9 100644 --- a/backend-spring/src/main/java/com/erp/service/RoleService.java +++ b/backend-spring/src/main/java/com/erp/service/RoleService.java @@ -87,7 +87,7 @@ public class RoleService extends BaseService { findParams.put("masterObjid", masterObjid); List> existingMembers = sqlSession.selectList("role.getRoleMemberList", findParams); List existingIds = existingMembers.stream() - .map(m -> (String) m.get("userId")) + .map(m -> (String) m.get("user_id")) .collect(Collectors.toList()); // 추가할 멤버 diff --git a/backend-spring/src/main/java/com/erp/service/ScheduleService.java b/backend-spring/src/main/java/com/erp/service/ScheduleService.java index 848b456d..91e65515 100644 --- a/backend-spring/src/main/java/com/erp/service/ScheduleService.java +++ b/backend-spring/src/main/java/com/erp/service/ScheduleService.java @@ -197,7 +197,7 @@ public class ScheduleService extends BaseService { if (deleteExisting && !toDelete.isEmpty()) { List deleteIds = toDelete.stream() .map(s -> { - Object id = s.get("scheduleId") != null ? s.get("scheduleId") : s.get("schedule_id"); + Object id = s.get("schedule_id"); return id != null ? ((Number) id).intValue() : null; }) .filter(Objects::nonNull).collect(Collectors.toList()); diff --git a/backend-spring/src/main/java/com/erp/service/ScreenManagementService.java b/backend-spring/src/main/java/com/erp/service/ScreenManagementService.java index 09b3d824..bf7e07c1 100644 --- a/backend-spring/src/main/java/com/erp/service/ScreenManagementService.java +++ b/backend-spring/src/main/java/com/erp/service/ScreenManagementService.java @@ -197,7 +197,7 @@ public class ScreenManagementService extends BaseService { layoutParams.put("companyCode", companyCode); List> layouts = sqlSession.selectList(NS + "selectLayoutsV2ForFlowCleanup", layoutParams); if (!layouts.isEmpty()) { - Object layoutDataRaw = layouts.get(0).get("layoutData"); + Object layoutDataRaw = layouts.get(0).get("layout_data"); Set flowIds = collectFlowIds(layoutDataRaw); for (Integer flowId : flowIds) { Map usageParams = new HashMap<>(); @@ -274,7 +274,7 @@ public class ScreenManagementService extends BaseService { if (screen == null) throw new IllegalArgumentException("화면을 찾을 수 없습니다."); // 동일 screen_code가 이미 활성인지 체크 - String screenCode = (String) screen.get("screenCode"); + String screenCode = (String) screen.get("screen_code"); if (screenCode != null) { Map ckParams = new HashMap<>(); ckParams.put("screenCode", screenCode); @@ -341,7 +341,7 @@ public class ScreenManagementService extends BaseService { Pattern numPattern = Pattern.compile("^" + Pattern.quote(companyCode) + "_(\\d+)$"); int maxNumber = existing.stream() - .map(row -> String.valueOf(row.get("screenCode"))) + .map(row -> String.valueOf(row.get("screen_code"))) .mapToInt(code -> { Matcher m = numPattern.matcher(code); return m.matches() ? Integer.parseInt(m.group(1)) : 0; @@ -370,21 +370,21 @@ public class ScreenManagementService extends BaseService { String newCode = generateScreenCode(companyCode); Map insertParams = new HashMap<>(); - insertParams.put("screenName", newName != null ? newName : original.get("screenName") + " Copy"); + insertParams.put("screenName", newName != null ? newName : original.get("screen_name") + " Copy"); insertParams.put("screenCode", newCode); - insertParams.put("tableName", original.get("tableName")); + insertParams.put("tableName", original.get("table_name")); insertParams.put("companyCode", companyCode); insertParams.put("description", original.get("description")); insertParams.put("createdBy", userId); - insertParams.put("dbSourceType", original.get("dbSourceType")); - insertParams.put("dbConnectionId", original.get("dbConnectionId")); - insertParams.put("dataSourceType", original.get("dataSourceType")); - insertParams.put("restApiConnectionId", original.get("restApiConnectionId")); - insertParams.put("restApiEndpoint", original.get("restApiEndpoint")); - insertParams.put("restApiJsonPath", original.get("restApiJsonPath")); + insertParams.put("dbSourceType", original.get("db_source_type")); + insertParams.put("dbConnectionId", original.get("db_connection_id")); + insertParams.put("dataSourceType", original.get("data_source_type")); + insertParams.put("restApiConnectionId", original.get("rest_api_connection_id")); + insertParams.put("restApiEndpoint", original.get("rest_api_endpoint")); + insertParams.put("restApiJsonPath", original.get("rest_api_json_path")); Map newScreen = sqlSession.selectOne(NS + "insertScreenCopy", insertParams); - Integer newScreenId = toInteger(newScreen.get("screenId")); + Integer newScreenId = toInteger(newScreen.get("screen_id")); // Layout V1 복사 List> v1Rows = sqlSession.selectList(NS + "selectLayoutV1ForCopy", Map.of("screenId", screenId)); @@ -414,7 +414,7 @@ public class ScreenManagementService extends BaseService { // 메인 화면 복사 Map mainScreen = copyScreen(screenId, newBaseName, companyCode, userId); - Integer newMainScreenId = toInteger(mainScreen.get("screenId")); + Integer newMainScreenId = toInteger(mainScreen.get("screen_id")); // 연결된 모달 화면들 탐색 후 복사 List> linkedScreens = detectLinkedScreensInternal(screenId, companyCode); @@ -423,10 +423,10 @@ public class ScreenManagementService extends BaseService { List> copiedScreens = new ArrayList<>(); for (Map linked : linkedScreens) { - Integer linkedId = toInteger(linked.get("screenId")); - String linkedName = (String) linked.get("screenName"); + Integer linkedId = toInteger(linked.get("screen_id")); + String linkedName = (String) linked.get("screen_name"); Map copied = copyScreen(linkedId, linkedName + " Copy", companyCode, userId); - idMapping.put(linkedId, toInteger(copied.get("screenId"))); + idMapping.put(linkedId, toInteger(copied.get("screen_id"))); copiedScreens.add(copied); } @@ -730,10 +730,10 @@ public class ScreenManagementService extends BaseService { // screen_code 조회 → menu_info 업데이트 Map screenCodeRow = sqlSession.selectOne(NS + "selectScreenCode", Map.of("screenId", screenId)); - String screenCode = screenCodeRow != null ? (String) screenCodeRow.get("screenCode") : null; + String screenCode = screenCodeRow != null ? (String) screenCodeRow.get("screen_code") : null; Map menuTypeRow = sqlSession.selectOne(NS + "selectMenuType", Map.of("menuObjid", menuObjid)); - String menuType = menuTypeRow != null ? (String) menuTypeRow.get("menuType") : null; + String menuType = menuTypeRow != null ? (String) menuTypeRow.get("menu_type") : null; if (screenCode != null) { String menuUrl = "/screen/" + screenCode; @@ -816,10 +816,10 @@ public class ScreenManagementService extends BaseService { int count = 0; for (Map a : assignments) { Map ip = new HashMap<>(); - ip.put("screenId", a.get("screenId")); - ip.put("menuObjid", a.get("menuObjid")); + ip.put("screenId", a.get("screen_id")); + ip.put("menuObjid", a.get("menu_objid")); ip.put("companyCode", targetCompanyCode); - ip.put("displayOrder", a.get("displayOrder")); + ip.put("displayOrder", a.get("display_order")); ip.put("createdBy", userId); sqlSession.insert(NS + "insertMenuAssignmentCopy", ip); count++; @@ -845,7 +845,7 @@ public class ScreenManagementService extends BaseService { Map codeParams = new HashMap<>(); codeParams.put("sourceCompanyCode", sourceCompanyCode); - codeParams.put("codeCategory", cat.get("categoryCode")); + codeParams.put("codeCategory", cat.get("category_code")); List> codes = sqlSession.selectList(NS + "selectCodeInfoForCopy", codeParams); for (Map code : codes) { Map cop = new HashMap<>(code); @@ -927,7 +927,7 @@ public class ScreenManagementService extends BaseService { List linkedScreenIds = new ArrayList<>(); if (popLayout != null) { - Object layoutDataRaw = popLayout.get("layoutData"); + Object layoutDataRaw = popLayout.get("layout_data"); linkedScreenIds = extractScreenIdsFromLayout(layoutDataRaw); } @@ -974,9 +974,9 @@ public class ScreenManagementService extends BaseService { insertParams.put("dbSourceType", screenDef.get("dbSourceType")); insertParams.put("dataSourceType", screenDef.get("dataSourceType")); Map created = sqlSession.selectOne(NS + "insertScreenForDeploy", insertParams); - targetScreenId = toInteger(created.get("screenId")); + targetScreenId = toInteger(created.get("screen_id")); } else { - targetScreenId = toInteger(existing.get("screenId")); + targetScreenId = toInteger(existing.get("screen_id")); } // POP 레이아웃 복사 @@ -989,7 +989,7 @@ public class ScreenManagementService extends BaseService { Map deployParams = new HashMap<>(); deployParams.put("screenId", targetScreenId); deployParams.put("companyCode", targetCompanyCode); - deployParams.put("layoutData", toJsonString(sourceLayout.get("layoutData"))); + deployParams.put("layoutData", toJsonString(sourceLayout.get("layout_data"))); deployParams.put("userId", userId); sqlSession.insert(NS + "upsertPopLayoutDeploy", deployParams); } @@ -1136,7 +1136,7 @@ public class ScreenManagementService extends BaseService { String updated = replaceScreenIdsInJson(propsRaw.toString(), idMapping); if (updated != null) { Map up = new HashMap<>(); - up.put("layoutId", layout.get("layoutId")); + up.put("layoutId", layout.get("layout_id")); up.put("properties", updated); sqlSession.update(NS + "updateLayoutV1Properties", up); } @@ -1145,14 +1145,14 @@ public class ScreenManagementService extends BaseService { // V2 List> v2Layouts = sqlSession.selectList(NS + "selectLayoutsV2ForScreen", p); for (Map layout : v2Layouts) { - Object dataRaw = layout.get("layoutData"); + Object dataRaw = layout.get("layout_data"); if (dataRaw == null) continue; String updated = replaceScreenIdsInJson(dataRaw.toString(), idMapping); if (updated != null) { Map up = new HashMap<>(); - up.put("screenId", layout.get("screenId")); - up.put("layerId", layout.get("layerId")); - up.put("companyCode", layout.get("companyCode")); + up.put("screenId", layout.get("screen_id")); + up.put("layerId", layout.get("layer_id")); + up.put("companyCode", layout.get("company_code")); up.put("layoutData", updated); sqlSession.update(NS + "updateLayoutV2Data", up); } @@ -1179,7 +1179,7 @@ public class ScreenManagementService extends BaseService { private void enrichWithTableLabels(List> screens) { Set tableNames = new LinkedHashSet<>(); for (Map s : screens) { - Object tn = s.get("tableName"); + Object tn = s.get("table_name"); if (tn != null && !tn.toString().isBlank()) tableNames.add(tn.toString()); } if (tableNames.isEmpty()) return; @@ -1190,10 +1190,10 @@ public class ScreenManagementService extends BaseService { List> labels = sqlSession.selectList(NS + "selectTableLabelsByNames", params); Map labelMap = new HashMap<>(); for (Map row : labels) { - labelMap.put((String) row.get("tableName"), (String) row.get("tableLabel")); + labelMap.put((String) row.get("table_name"), (String) row.get("table_label")); } for (Map s : screens) { - Object tn = s.get("tableName"); + Object tn = s.get("table_name"); if (tn != null) s.put("tableLabel", labelMap.get(tn.toString())); } } catch (Exception ignored) {} @@ -1207,7 +1207,7 @@ public class ScreenManagementService extends BaseService { Pattern numPattern = Pattern.compile("^" + Pattern.quote(companyCode) + "_(\\d+)$"); int maxNumber = existing.stream() - .map(row -> String.valueOf(row.get("screenCode"))) + .map(row -> String.valueOf(row.get("screen_code"))) .mapToInt(code -> { Matcher m = numPattern.matcher(code); return m.matches() ? Integer.parseInt(m.group(1)) : 0; @@ -1224,7 +1224,7 @@ public class ScreenManagementService extends BaseService { params.put("screenId", screenId); params.put("companyCode", companyCode); Map row = sqlSession.selectOne(NS + "selectMaxLayerId", params); - int maxId = row != null ? toInt(row.getOrDefault("maxId", 1), 1) : 1; + int maxId = row != null ? toInt(row.getOrDefault("max_id", 1), 1) : 1; return maxId + 1; } diff --git a/backend-spring/src/main/java/com/erp/service/TableCategoryValueService.java b/backend-spring/src/main/java/com/erp/service/TableCategoryValueService.java index 5a061dfb..60f2c91e 100644 --- a/backend-spring/src/main/java/com/erp/service/TableCategoryValueService.java +++ b/backend-spring/src/main/java/com/erp/service/TableCategoryValueService.java @@ -97,9 +97,9 @@ public class TableCategoryValueService extends BaseService { Map.of("valueId", valueId)); if (current != null) { Map labelP = new HashMap<>(); - labelP.put("tableName", current.get("tableName")); - labelP.put("columnName", current.get("columnName")); - labelP.put("companyCode", current.get("companyCode")); + labelP.put("tableName", current.get("table_name")); + labelP.put("columnName", current.get("column_name")); + labelP.put("companyCode", current.get("company_code")); labelP.put("valueLabel", params.get("valueLabel")); labelP.put("valueId", valueId); Integer dup = sqlSession.selectOne(NS + "countDuplicateLabelExcludeSelf", labelP); @@ -137,7 +137,7 @@ public class TableCategoryValueService extends BaseService { List> childRows = sqlSession.selectList(NS + "getChildValueIdList", params); List allIds = new ArrayList<>(); allIds.add(valueId); - childRows.forEach(r -> allIds.add(toLong(r.get("valueId")))); + childRows.forEach(r -> allIds.add(toLong(r.get("value_id")))); log.info("삭제 대상 카테고리 값 수집 완료: 자신={}, 하위={}", valueId, childRows.size()); @@ -192,8 +192,8 @@ public class TableCategoryValueService extends BaseService { Map mapping = new LinkedHashMap<>(); for (Map row : rows) { - mapping.put(String.valueOf(row.get("logicalColumnName")), - String.valueOf(row.get("physicalColumnName"))); + mapping.put(String.valueOf(row.get("logical_column_name")), + String.valueOf(row.get("physical_column_name"))); } log.info("컬럼 매핑 {}개 조회 완료", mapping.size()); return mapping; @@ -261,9 +261,9 @@ public class TableCategoryValueService extends BaseService { Map labels = new LinkedHashMap<>(); for (Map row : rows) { - String code = String.valueOf(row.get("valueCode")); + String code = String.valueOf(row.get("value_code")); if (!labels.containsKey(code)) { - labels.put(code, row.get("valueLabel")); + labels.put(code, row.get("value_label")); } } log.info("카테고리 라벨 {}개 조회 완료", labels.size()); @@ -300,10 +300,10 @@ public class TableCategoryValueService extends BaseService { throw new IllegalArgumentException("카테고리 값을 찾을 수 없습니다"); } - String tableName = String.valueOf(valueInfo.get("tableName")); - String columnName = String.valueOf(valueInfo.get("columnName")); - String valueCode = String.valueOf(valueInfo.get("valueCode")); - String valueLabel = String.valueOf(valueInfo.get("valueLabel")); + String tableName = String.valueOf(valueInfo.get("table_name")); + String columnName = String.valueOf(valueInfo.get("column_name")); + String valueCode = String.valueOf(valueInfo.get("value_code")); + String valueLabel = String.valueOf(valueInfo.get("value_label")); String safeTable = sanitize(tableName); String safeColumn = sanitize(columnName); @@ -331,7 +331,7 @@ public class TableCategoryValueService extends BaseService { if (!menus.isEmpty()) { String menuNames = menus.stream() - .map(m -> String.valueOf(m.get("menuName"))) + .map(m -> String.valueOf(m.get("menu_name"))) .collect(Collectors.joining(", ")); msg.append("\n\n다음 메뉴에서 사용 중입니다:\n").append(menuNames); } @@ -345,9 +345,9 @@ public class TableCategoryValueService extends BaseService { List> values, Object parentId) { List> result = new ArrayList<>(); for (Map v : values) { - Object pid = v.get("parentValueId"); + Object pid = v.get("parent_value_id"); if (Objects.equals(pid, parentId)) { - List> children = buildHierarchy(values, v.get("valueId")); + List> children = buildHierarchy(values, v.get("value_id")); v.put("children", children); result.add(v); } diff --git a/backend-spring/src/main/java/com/erp/service/TableManagementService.java b/backend-spring/src/main/java/com/erp/service/TableManagementService.java index 28493e12..e10666ff 100644 --- a/backend-spring/src/main/java/com/erp/service/TableManagementService.java +++ b/backend-spring/src/main/java/com/erp/service/TableManagementService.java @@ -32,10 +32,10 @@ public class TableManagementService extends BaseService { public List> getTableList() { List> tables = sqlSession.selectList(NS + "getTableList"); - // columnCount BigInt → Integer 변환 + // column_count BigInt → Integer 변환 for (Map t : tables) { - Object cnt = t.get("columnCount"); - if (cnt instanceof Number) t.put("columnCount", ((Number) cnt).intValue()); + Object cnt = t.get("column_count"); + if (cnt instanceof Number) t.put("column_count", ((Number) cnt).intValue()); } return tables; } @@ -234,7 +234,7 @@ public class TableManagementService extends BaseService { Map primaryKey = new HashMap<>(); if (!pkResult.isEmpty()) { Map pk = pkResult.get(0); - primaryKey.put("name", pk.get("constraintName")); + primaryKey.put("name", pk.get("constraint_name")); primaryKey.put("columns", parseColumnArray(pk.get("columns"))); } else { primaryKey.put("name", ""); @@ -244,9 +244,9 @@ public class TableManagementService extends BaseService { List> indexResult = sqlSession.selectList(NS + "getTableIndexList", params); List> indexes = indexResult.stream().map(row -> { Map idx = new HashMap<>(); - idx.put("name", row.get("indexName")); + idx.put("name", row.get("index_name")); idx.put("columns", parseColumnArray(row.get("columns"))); - idx.put("isUnique", row.get("isUnique")); + idx.put("isUnique", row.get("is_unique")); return idx; }).collect(Collectors.toList()); @@ -264,7 +264,7 @@ public class TableManagementService extends BaseService { params.put("tableName", safeTable); List> existingPk = sqlSession.selectList(NS + "getTablePrimaryKeyList", params); if (!existingPk.isEmpty()) { - String constraintName = (String) existingPk.get(0).get("constraintName"); + String constraintName = (String) existingPk.get(0).get("constraint_name"); jdbcTemplate.execute( String.format("ALTER TABLE \"public\".\"%s\" DROP CONSTRAINT \"%s\"", safeTable, sanitize(constraintName))); @@ -343,7 +343,7 @@ public class TableManagementService extends BaseService { List violations = new ArrayList<>(); for (Map col : notNullCols) { - String colName = (String) col.get("columnName"); + String colName = (String) col.get("column_name"); Object val = data.get(colName); if (val == null || val.toString().isBlank()) { violations.add(colName); @@ -365,7 +365,7 @@ public class TableManagementService extends BaseService { List violations = new ArrayList<>(); for (Map col : uniqueCols) { - String colName = (String) col.get("columnName"); + String colName = (String) col.get("column_name"); Object val = data.get(colName); if (val == null) continue; diff --git a/backend-spring/src/main/java/com/erp/service/TemplateStandardService.java b/backend-spring/src/main/java/com/erp/service/TemplateStandardService.java index fb36f8dd..20c86c3d 100644 --- a/backend-spring/src/main/java/com/erp/service/TemplateStandardService.java +++ b/backend-spring/src/main/java/com/erp/service/TemplateStandardService.java @@ -32,10 +32,10 @@ public class TemplateStandardService extends BaseService { } } - /** DB에서 읽은 JSON 문자열 필드를 Object로 역직렬화 (MyBatis camelCase 변환 결과) */ + /** DB에서 읽은 JSON 문자열 필드를 Object로 역직렬화 (snake_case 컬럼명 그대로) */ private void deserializeJsonFields(Map row) { if (row == null) return; - for (String field : List.of("layoutConfig", "defaultSize")) { + for (String field : List.of("layout_config", "default_size")) { Object val = row.get(field); if (val instanceof String s && !s.isBlank()) { try { @@ -171,18 +171,18 @@ public class TemplateStandardService extends BaseService { throw new IllegalArgumentException("템플릿 코드 '" + newCode + "'는 이미 존재합니다."); } - // 원본 기반 신규 템플릿 데이터 구성 (DB 결과는 camelCase) + // 원본 기반 신규 템플릿 데이터 구성 (DB 결과는 snake_case) Map newTemplate = new LinkedHashMap<>(); newTemplate.put("template_code", newCode); newTemplate.put("template_name", newName); - String origEngName = (String) original.get("templateNameEng"); + String origEngName = (String) original.get("template_name_eng"); newTemplate.put("template_name_eng", origEngName != null ? origEngName + " (Copy)" : null); newTemplate.put("description", original.get("description")); newTemplate.put("category", original.get("category")); - newTemplate.put("icon_name", original.get("iconName")); - newTemplate.put("default_size", original.get("defaultSize")); - newTemplate.put("layout_config", original.get("layoutConfig")); - newTemplate.put("preview_image", original.get("previewImage")); + newTemplate.put("icon_name", original.get("icon_name")); + newTemplate.put("default_size", original.get("default_size")); + newTemplate.put("layout_config", original.get("layout_config")); + newTemplate.put("preview_image", original.get("preview_image")); newTemplate.put("sort_order", 0); newTemplate.put("is_active", "Y"); newTemplate.put("is_public", "N"); diff --git a/backend-spring/src/main/java/com/erp/service/VehicleTripService.java b/backend-spring/src/main/java/com/erp/service/VehicleTripService.java index ce8c703b..cc0d7366 100644 --- a/backend-spring/src/main/java/com/erp/service/VehicleTripService.java +++ b/backend-spring/src/main/java/com/erp/service/VehicleTripService.java @@ -63,18 +63,18 @@ public class VehicleTripService extends BaseService { // 2. 종료 위치 INSERT Map locParams = new LinkedHashMap<>(params); - locParams.put("vehicleId", activeTrip.get("vehicleId")); + locParams.put("vehicleId", activeTrip.get("vehicle_id")); locParams.put("tripStatus", "end"); locParams.put("departure", activeTrip.get("departure")); locParams.put("arrival", activeTrip.get("arrival")); - locParams.put("departureName", activeTrip.get("departureName")); - locParams.put("destinationName", activeTrip.get("destinationName")); + locParams.put("departureName", activeTrip.get("departure_name")); + locParams.put("destinationName", activeTrip.get("destination_name")); sqlSession.insert("vehicleTrip.insertVehicleTripLocation", locParams); // 3. 통계 조회 (COUNT, duration) Map stats = sqlSession.selectOne("vehicleTrip.getVehicleTripLocationStats", params); - int locationCount = ((Number) stats.get("locationCount")).intValue(); - int durationMinutes = ((Number) stats.get("durationMinutes")).intValue(); + int locationCount = ((Number) stats.get("location_count")).intValue(); + int durationMinutes = ((Number) stats.get("duration_minutes")).intValue(); // 4. 모든 위치 좌표 → Haversine 총 거리 계산 List> locations = sqlSession.selectList("vehicleTrip.getVehicleTripLocationListAll", params); @@ -130,12 +130,12 @@ public class VehicleTripService extends BaseService { // 3. 위치 INSERT Map locParams = new LinkedHashMap<>(params); - locParams.put("vehicleId", activeTrip.get("vehicleId")); + locParams.put("vehicleId", activeTrip.get("vehicle_id")); locParams.put("tripStatus", "tracking"); locParams.put("departure", activeTrip.get("departure")); locParams.put("arrival", activeTrip.get("arrival")); - locParams.put("departureName", activeTrip.get("departureName")); - locParams.put("destinationName", activeTrip.get("destinationName")); + locParams.put("departureName", activeTrip.get("departure_name")); + locParams.put("destinationName", activeTrip.get("destination_name")); locParams.put("distanceFromPrev", distanceFromPrev > 0 ? distanceFromPrev : null); sqlSession.insert("vehicleTrip.insertVehicleTripLocation", locParams); @@ -267,8 +267,8 @@ public class VehicleTripService extends BaseService { Map row = sqlSession.selectOne("vehicleTrip.getVehicleTripSummaryReport", params); if (row == null) row = new LinkedHashMap<>(); - long totalTrips = toLong(row.get("totalTrips")); - long completedTrips = toLong(row.get("completedTrips")); + long totalTrips = toLong(row.get("total_trips")); + long completedTrips = toLong(row.get("completed_trips")); double completionRate = totalTrips > 0 ? Math.round((double) completedTrips / totalTrips * 1000.0) / 10.0 : 0.0; @@ -276,14 +276,14 @@ public class VehicleTripService extends BaseService { result.put("period", params.get("period")); result.put("totalTrips", totalTrips); result.put("completedTrips", completedTrips); - result.put("activeTrips", toLong(row.get("activeTrips"))); - result.put("cancelledTrips", toLong(row.get("cancelledTrips"))); + result.put("activeTrips", toLong(row.get("active_trips"))); + result.put("cancelledTrips", toLong(row.get("cancelled_trips"))); result.put("completionRate", completionRate); - result.put("totalDistance", toDouble(row.get("totalDistance"))); - result.put("totalDuration", toLong(row.get("totalDuration"))); - result.put("avgDistance", toDouble(row.get("avgDistance"))); - result.put("avgDuration", toDouble(row.get("avgDuration"))); - result.put("activeDrivers", toLong(row.get("activeDrivers"))); + result.put("totalDistance", toDouble(row.get("total_distance"))); + result.put("totalDuration", toLong(row.get("total_duration"))); + result.put("avgDistance", toDouble(row.get("avg_distance"))); + result.put("avgDuration", toDouble(row.get("avg_duration"))); + result.put("activeDrivers", toLong(row.get("active_drivers"))); return result; } diff --git a/backend-spring/src/main/java/com/erp/service/WebTypeStandardService.java b/backend-spring/src/main/java/com/erp/service/WebTypeStandardService.java index e3cf7a93..848161d5 100644 --- a/backend-spring/src/main/java/com/erp/service/WebTypeStandardService.java +++ b/backend-spring/src/main/java/com/erp/service/WebTypeStandardService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -19,9 +20,19 @@ public class WebTypeStandardService extends BaseService { private final ObjectMapper objectMapper; + // input params (camelCase) → DB 저장 시 직렬화용 private static final List JSONB_FIELDS = Arrays.asList("defaultConfig", "validationRules", "defaultStyle", "inputProperties"); + // DB 컬럼명(snake_case) → 응답 필드명(camelCase) 매핑 + private static final Map JSONB_DB_TO_RESPONSE = new LinkedHashMap<>(); + static { + JSONB_DB_TO_RESPONSE.put("default_config", "defaultConfig"); + JSONB_DB_TO_RESPONSE.put("validation_rules", "validationRules"); + JSONB_DB_TO_RESPONSE.put("default_style", "defaultStyle"); + JSONB_DB_TO_RESPONSE.put("input_properties", "inputProperties"); + } + // ── 목록 조회 ────────────────────────────────────────────────── public List> getWebTypes(Map params) { // ILIKE 검색을 위해 % 와일드카드 추가 @@ -122,16 +133,22 @@ public class WebTypeStandardService extends BaseService { // ══ private helpers ═══════════════════════════════════════════ /** - * JSONB 컬럼 → Java 객체 역직렬화 - * map-underscore-to-camel-case=true 이므로 Map 키는 camelCase + * JSONB 컬럼(snake_case) → Java 객체 역직렬화 후 camelCase 키로 재매핑 + * resultType="map"은 map-underscore-to-camel-case 미적용 → snake_case로 반환 */ private void parseJsonFields(Map row) { - for (String field : JSONB_FIELDS) { - Object val = row.get(field); + for (Map.Entry entry : JSONB_DB_TO_RESPONSE.entrySet()) { + String dbKey = entry.getKey(); + String responseKey = entry.getValue(); + Object val = row.remove(dbKey); if (val instanceof String s && !s.isBlank()) { try { - row.put(field, objectMapper.readValue(s, Object.class)); - } catch (Exception ignored) { /* 파싱 실패 시 원본 유지 */ } + row.put(responseKey, objectMapper.readValue(s, Object.class)); + } catch (Exception ignored) { + row.put(responseKey, val); + } + } else if (val != null) { + row.put(responseKey, val); } } } diff --git a/backend-spring/src/main/java/com/erp/service/WorkHistoryService.java b/backend-spring/src/main/java/com/erp/service/WorkHistoryService.java index eed4fbb6..b96ddcf9 100644 --- a/backend-spring/src/main/java/com/erp/service/WorkHistoryService.java +++ b/backend-spring/src/main/java/com/erp/service/WorkHistoryService.java @@ -53,16 +53,16 @@ public class WorkHistoryService extends BaseService { typeDistribution.put("transfer", 0); typeDistribution.put("maintenance", 0); for (Map row : typeList) { - String type = String.valueOf(row.get("workType")); + String type = String.valueOf(row.get("work_type")); typeDistribution.put(type, row.get("count")); } Map result = new LinkedHashMap<>(); - result.put("todayTotal", todayStats != null ? todayStats.get("todayTotal") : 0); - result.put("todayCompleted", todayStats != null ? todayStats.get("todayCompleted") : 0); - result.put("totalWeight", totalStats != null ? totalStats.get("totalWeight") : 0); - result.put("totalDistance", totalStats != null ? totalStats.get("totalDistance") : 0); - result.put("onTimeRate", onTimeStats != null ? onTimeStats.get("onTimeRate") : 0); + result.put("todayTotal", todayStats != null ? todayStats.get("today_total") : 0); + result.put("todayCompleted", todayStats != null ? todayStats.get("today_completed") : 0); + result.put("totalWeight", totalStats != null ? totalStats.get("total_weight") : 0); + result.put("totalDistance", totalStats != null ? totalStats.get("total_distance") : 0); + result.put("onTimeRate", onTimeStats != null ? onTimeStats.get("on_time_rate") : 0); result.put("typeDistribution", typeDistribution); return result; } diff --git a/backend-spring/src/main/java/com/erp/service/YardLayoutService.java b/backend-spring/src/main/java/com/erp/service/YardLayoutService.java index 70590cda..eb8157c4 100644 --- a/backend-spring/src/main/java/com/erp/service/YardLayoutService.java +++ b/backend-spring/src/main/java/com/erp/service/YardLayoutService.java @@ -91,7 +91,7 @@ public class YardLayoutService extends BaseService { Map newLayout = new HashMap<>(); newLayout.put("name", "Copy of " + original.get("name")); newLayout.put("description", original.get("description")); - newLayout.put("createdBy", original.get("createdBy")); + newLayout.put("createdBy", original.get("created_by")); newLayout.put("companyCode", params.get("companyCode")); sqlSession.insert("yardLayout.insertYardLayout", newLayout); Long newId = ((Number) newLayout.get("id")).longValue(); diff --git a/backend-spring/src/main/resources/mapper/batch.xml b/backend-spring/src/main/resources/mapper/batch.xml index 9bf28d1c..c74fec12 100644 --- a/backend-spring/src/main/resources/mapper/batch.xml +++ b/backend-spring/src/main/resources/mapper/batch.xml @@ -5,122 +5,137 @@ - AND (batch_name ILIKE '%' || #{search} || '%' - OR description ILIKE '%' || #{search} || '%') + AND (BATCH_NAME ILIKE '%' || #{search} || '%' + OR DESCRIPTION ILIKE '%' || #{search} || '%') - AND is_active = #{is_active} + AND IS_ACTIVE = #{is_active} - INSERT INTO batch_configs ( - batch_name, description, cron_schedule, is_active, company_code, - save_mode, conflict_key, auth_service_name, data_array_path, - execution_type, node_flow_id, node_flow_context, - created_by, created_date, updated_date + INSERT INTO BATCH_CONFIGS ( + BATCH_NAME + , DESCRIPTION + , CRON_SCHEDULE + , IS_ACTIVE + , COMPANY_CODE + , SAVE_MODE + , CONFLICT_KEY + , AUTH_SERVICE_NAME + , DATA_ARRAY_PATH + , EXECUTION_TYPE + , NODE_FLOW_ID + , NODE_FLOW_CONTEXT + , CREATED_BY + , CREATED_DATE + , UPDATED_DATE ) VALUES ( - #{batch_name}, #{description}, #{cron_schedule}, - - #{is_active} - 'Y' - , - #{companyCode}, - - #{save_mode} - 'INSERT' - , - #{conflict_key}, #{auth_service_name}, #{data_array_path}, - - #{execution_type} - 'mapping' - , - #{node_flow_id}, - - #{node_flow_context}::jsonb - NULL - , - #{created_by}, NOW(), NOW() + #{batch_name} + , #{description} + , #{cron_schedule} + , + #{is_active} + 'Y' + + , #{companyCode} + , + #{save_mode} + 'INSERT' + + , #{conflict_key} + , #{auth_service_name} + , #{data_array_path} + , + #{execution_type} + 'mapping' + + , #{node_flow_id} + , + #{node_flow_context}::jsonb + NULL + + , #{created_by} + , NOW() + , NOW() ) - UPDATE batch_configs + UPDATE BATCH_CONFIGS - batch_name = #{batch_name}, - description = #{description}, - cron_schedule = #{cron_schedule}, - is_active = #{is_active}, - save_mode = #{save_mode}, - conflict_key = #{conflict_key}, - auth_service_name = #{auth_service_name}, - data_array_path = #{data_array_path}, - execution_type = #{execution_type}, - node_flow_id = #{node_flow_id}, - node_flow_context = #{node_flow_context}::jsonb, - updated_by = #{updated_by}, - updated_date = NOW() + BATCH_NAME = #{batch_name}, + DESCRIPTION = #{description}, + CRON_SCHEDULE = #{cron_schedule}, + IS_ACTIVE = #{is_active}, + SAVE_MODE = #{save_mode}, + CONFLICT_KEY = #{conflict_key}, + AUTH_SERVICE_NAME = #{auth_service_name}, + DATA_ARRAY_PATH = #{data_array_path}, + EXECUTION_TYPE = #{execution_type}, + NODE_FLOW_ID = #{node_flow_id}, + NODE_FLOW_CONTEXT = #{node_flow_context}::jsonb, + UPDATED_BY = #{updated_by}, + UPDATED_DATE = NOW() - - WHERE id = #{id} + WHERE ID = #{id} - DELETE FROM batch_configs - - WHERE id = #{id} + DELETE FROM BATCH_CONFIGS + WHERE ID = #{id} diff --git a/backend-spring/src/main/resources/mapper/cascadingMutualExclusion.xml b/backend-spring/src/main/resources/mapper/cascadingMutualExclusion.xml index bb582f40..9def2d2c 100644 --- a/backend-spring/src/main/resources/mapper/cascadingMutualExclusion.xml +++ b/backend-spring/src/main/resources/mapper/cascadingMutualExclusion.xml @@ -13,10 +13,19 @@ - SELECT EXCLUSION_ID, EXCLUSION_CODE, EXCLUSION_NAME, FIELD_NAMES, - SOURCE_TABLE, VALUE_COLUMN, LABEL_COLUMN, - EXCLUSION_TYPE, ERROR_MESSAGE, - COMPANY_CODE, IS_ACTIVE + SELECT + EXCLUSION_ID + , EXCLUSION_CODE + , EXCLUSION_NAME + , FIELD_NAMES + , SOURCE_TABLE + , VALUE_COLUMN + , LABEL_COLUMN + , EXCLUSION_TYPE + , ERROR_MESSAGE + , COMPANY_CODE + , IS_ACTIVE FROM CASCADING_MUTUAL_EXCLUSION WHERE EXCLUSION_CODE = #{code} AND IS_ACTIVE = 'Y' @@ -58,7 +85,8 @@ @@ -66,35 +94,43 @@ INSERT INTO CASCADING_MUTUAL_EXCLUSION ( - EXCLUSION_CODE, EXCLUSION_NAME, FIELD_NAMES, - SOURCE_TABLE, VALUE_COLUMN, LABEL_COLUMN, - EXCLUSION_TYPE, ERROR_MESSAGE, - COMPANY_CODE, IS_ACTIVE, CREATED_DATE + EXCLUSION_CODE + , EXCLUSION_NAME + , FIELD_NAMES + , SOURCE_TABLE + , VALUE_COLUMN + , LABEL_COLUMN + , EXCLUSION_TYPE + , ERROR_MESSAGE + , COMPANY_CODE + , IS_ACTIVE + , CREATED_DATE ) VALUES ( - #{exclusionCode, jdbcType=VARCHAR}, - #{exclusionName, jdbcType=VARCHAR}, - #{fieldNames, jdbcType=VARCHAR}, - #{sourceTable, jdbcType=VARCHAR}, - #{valueColumn, jdbcType=VARCHAR}, - #{labelColumn, jdbcType=VARCHAR}, - #{exclusionType, jdbcType=VARCHAR}, - #{errorMessage, jdbcType=VARCHAR}, - #{companyCode}, - 'Y', - CURRENT_TIMESTAMP + #{exclusionCode, jdbcType=VARCHAR} + , #{exclusionName, jdbcType=VARCHAR} + , #{fieldNames, jdbcType=VARCHAR} + , #{sourceTable, jdbcType=VARCHAR} + , #{valueColumn, jdbcType=VARCHAR} + , #{labelColumn, jdbcType=VARCHAR} + , #{exclusionType, jdbcType=VARCHAR} + , #{errorMessage, jdbcType=VARCHAR} + , #{companyCode} + , 'Y' + , CURRENT_TIMESTAMP ) - UPDATE CASCADING_MUTUAL_EXCLUSION SET - EXCLUSION_NAME = COALESCE(#{exclusionName, jdbcType=VARCHAR}, EXCLUSION_NAME), - FIELD_NAMES = COALESCE(#{fieldNames, jdbcType=VARCHAR}, FIELD_NAMES), - SOURCE_TABLE = COALESCE(#{sourceTable, jdbcType=VARCHAR}, SOURCE_TABLE), - VALUE_COLUMN = COALESCE(#{valueColumn, jdbcType=VARCHAR}, VALUE_COLUMN), - LABEL_COLUMN = COALESCE(#{labelColumn, jdbcType=VARCHAR}, LABEL_COLUMN), - EXCLUSION_TYPE = COALESCE(#{exclusionType, jdbcType=VARCHAR}, EXCLUSION_TYPE), - ERROR_MESSAGE = COALESCE(#{errorMessage, jdbcType=VARCHAR}, ERROR_MESSAGE), - IS_ACTIVE = COALESCE(#{isActive, jdbcType=VARCHAR}, IS_ACTIVE) + UPDATE CASCADING_MUTUAL_EXCLUSION + SET + EXCLUSION_NAME = COALESCE(#{exclusionName, jdbcType=VARCHAR}, EXCLUSION_NAME) + , FIELD_NAMES = COALESCE(#{fieldNames, jdbcType=VARCHAR}, FIELD_NAMES) + , SOURCE_TABLE = COALESCE(#{sourceTable, jdbcType=VARCHAR}, SOURCE_TABLE) + , VALUE_COLUMN = COALESCE(#{valueColumn, jdbcType=VARCHAR}, VALUE_COLUMN) + , LABEL_COLUMN = COALESCE(#{labelColumn, jdbcType=VARCHAR}, LABEL_COLUMN) + , EXCLUSION_TYPE = COALESCE(#{exclusionType, jdbcType=VARCHAR}, EXCLUSION_TYPE) + , ERROR_MESSAGE = COALESCE(#{errorMessage, jdbcType=VARCHAR}, ERROR_MESSAGE) + , IS_ACTIVE = COALESCE(#{isActive, jdbcType=VARCHAR}, IS_ACTIVE) WHERE EXCLUSION_ID = #{id} diff --git a/backend-spring/src/main/resources/mapper/categoryValueCascading.xml b/backend-spring/src/main/resources/mapper/categoryValueCascading.xml index 95523de3..ea2e6c97 100644 --- a/backend-spring/src/main/resources/mapper/categoryValueCascading.xml +++ b/backend-spring/src/main/resources/mapper/categoryValueCascading.xml @@ -13,7 +13,8 @@ - SELECT MAPPING_ID, PARENT_VALUE_CODE, PARENT_VALUE_LABEL, - CHILD_VALUE_CODE, CHILD_VALUE_LABEL, DISPLAY_ORDER, IS_ACTIVE + SELECT + MAPPING_ID + , PARENT_VALUE_CODE + , PARENT_VALUE_LABEL + , CHILD_VALUE_CODE + , CHILD_VALUE_LABEL + , DISPLAY_ORDER + , IS_ACTIVE FROM CATEGORY_VALUE_CASCADING_MAPPING WHERE GROUP_ID = #{groupId} AND IS_ACTIVE = 'Y' @@ -123,13 +154,25 @@ INSERT INTO CATEGORY_VALUE_CASCADING_MAPPING ( - GROUP_ID, PARENT_VALUE_CODE, PARENT_VALUE_LABEL, - CHILD_VALUE_CODE, CHILD_VALUE_LABEL, DISPLAY_ORDER, - COMPANY_CODE, IS_ACTIVE, CREATED_DATE + GROUP_ID + , PARENT_VALUE_CODE + , PARENT_VALUE_LABEL + , CHILD_VALUE_CODE + , CHILD_VALUE_LABEL + , DISPLAY_ORDER + , COMPANY_CODE + , IS_ACTIVE + , CREATED_DATE ) VALUES ( - #{groupId}, #{parentValueCode}, #{parentValueLabel}, - #{childValueCode}, #{childValueLabel}, COALESCE(#{displayOrder}, 0), - #{companyCode}, 'Y', NOW() + #{groupId} + , #{parentValueCode} + , #{parentValueLabel} + , #{childValueCode} + , #{childValueLabel} + , COALESCE(#{displayOrder}, 0) + , #{companyCode} + , 'Y' + , NOW() ) diff --git a/backend-spring/src/main/resources/mapper/collection.xml b/backend-spring/src/main/resources/mapper/collection.xml index e2f81210..6ae35804 100644 --- a/backend-spring/src/main/resources/mapper/collection.xml +++ b/backend-spring/src/main/resources/mapper/collection.xml @@ -5,35 +5,43 @@ - AND config_name ILIKE '%' || #{configName} || '%' + AND CONFIG_NAME ILIKE '%' || #{configName} || '%' - AND source_connection_id = #{sourceConnectionId} + AND SOURCE_CONNECTION_ID = #{sourceConnectionId} - AND collection_type = #{collectionType} + AND COLLECTION_TYPE = #{collectionType} - AND is_active = (#{isActive} = 'Y') + AND IS_ACTIVE = (#{isActive} = 'Y') - AND (config_name ILIKE '%' || #{search} || '%' - OR description ILIKE '%' || #{search} || '%') + AND (CONFIG_NAME ILIKE '%' || #{search} || '%' + OR DESCRIPTION ILIKE '%' || #{search} || '%') - AND (config_name ILIKE '%' || #{keyword} || '%' - OR description ILIKE '%' || #{keyword} || '%') + AND (CONFIG_NAME ILIKE '%' || #{keyword} || '%' + OR DESCRIPTION ILIKE '%' || #{keyword} || '%') - INSERT INTO data_collection_configs ( - company_code, config_name, description, source_connection_id, - collection_type, collection_options, schedule_cron, is_active, - created_by, updated_by, created_date, updated_date + INSERT INTO DATA_COLLECTION_CONFIGS ( + COMPANY_CODE + , CONFIG_NAME + , DESCRIPTION + , SOURCE_CONNECTION_ID + , COLLECTION_TYPE + , COLLECTION_OPTIONS + , SCHEDULE_CRON + , IS_ACTIVE + , CREATED_BY + , UPDATED_BY + , CREATED_DATE + , UPDATED_DATE ) VALUES ( - #{companyCode}, #{configName}, #{description}, #{sourceConnectionId, jdbcType=INTEGER}, - #{collectionType}, - - #{collectionOptions}::JSONB - NULL - , - #{scheduleCron}, - - (#{isActive} = 'Y') - TRUE - , - #{createdBy}, #{updatedBy}, NOW(), NOW() + #{companyCode} + , #{configName} + , #{description} + , #{sourceConnectionId, jdbcType=INTEGER} + , #{collectionType} + , + #{collectionOptions}::JSONB + NULL + + , #{scheduleCron} + , + (#{isActive} = 'Y') + TRUE + + , #{createdBy} + , #{updatedBy} + , NOW() + , NOW() ) - UPDATE data_collection_configs SET - config_name = COALESCE(#{configName}, config_name), - description = #{description}, - source_connection_id = COALESCE(#{sourceConnectionId, jdbcType=INTEGER}, source_connection_id), - collection_type = COALESCE(#{collectionType}, collection_type), - collection_options = CASE WHEN #{collectionOptions} IS NOT NULL - THEN #{collectionOptions}::JSONB - ELSE collection_options END, - schedule_cron = #{scheduleCron}, - is_active = CASE WHEN #{isActive} IS NOT NULL - THEN (#{isActive} = 'Y') - ELSE is_active END, - updated_by = #{updatedBy}, - updated_date = NOW() - - WHERE id = #{id} + UPDATE DATA_COLLECTION_CONFIGS + SET + CONFIG_NAME = COALESCE(#{configName}, CONFIG_NAME) + , DESCRIPTION = #{description} + , SOURCE_CONNECTION_ID = COALESCE(#{sourceConnectionId, jdbcType=INTEGER}, SOURCE_CONNECTION_ID) + , COLLECTION_TYPE = COALESCE(#{collectionType}, COLLECTION_TYPE) + , COLLECTION_OPTIONS = CASE WHEN #{collectionOptions} IS NOT NULL + THEN #{collectionOptions}::JSONB + ELSE COLLECTION_OPTIONS END + , SCHEDULE_CRON = #{scheduleCron} + , IS_ACTIVE = CASE WHEN #{isActive} IS NOT NULL + THEN (#{isActive} = 'Y') + ELSE IS_ACTIVE END + , UPDATED_BY = #{updatedBy} + , UPDATED_DATE = NOW() + WHERE ID = #{id} - DELETE FROM data_collection_configs - - WHERE id = #{id} + DELETE FROM DATA_COLLECTION_CONFIGS + WHERE ID = #{id} - INSERT INTO data_collection_jobs ( - config_id, job_status, started_at, created_date + INSERT INTO DATA_COLLECTION_JOBS ( + CONFIG_ID + , JOB_STATUS + , STARTED_AT + , CREATED_DATE ) VALUES ( - #{configId}, #{jobStatus}, NOW(), NOW() + #{configId} + , #{jobStatus} + , NOW() + , NOW() ) - UPDATE data_collection_jobs SET - job_status = #{jobStatus}, - completed_at = NOW() - , records_processed = #{recordsProcessed} - , error_message = #{errorMessage} - - WHERE id = #{id} + UPDATE DATA_COLLECTION_JOBS + SET + JOB_STATUS = #{jobStatus} + , COMPLETED_AT = NOW() + , RECORDS_PROCESSED = #{recordsProcessed} + , ERROR_MESSAGE = #{errorMessage} + WHERE ID = #{id} diff --git a/backend-spring/src/main/resources/mapper/ddl.xml b/backend-spring/src/main/resources/mapper/ddl.xml index a8ea5ec1..53f6c6ee 100644 --- a/backend-spring/src/main/resources/mapper/ddl.xml +++ b/backend-spring/src/main/resources/mapper/ddl.xml @@ -4,181 +4,166 @@ - INSERT INTO ddl_execution_log ( - user_id, - company_code, - ddl_type, - table_name, - ddl_query, - success, - error_message, - executed_at + INSERT INTO DDL_EXECUTION_LOG ( + USER_ID + , COMPANY_CODE + , DDL_TYPE + , TABLE_NAME + , DDL_QUERY + , SUCCESS + , ERROR_MESSAGE + , EXECUTED_AT ) VALUES ( - #{userId}, - #{companyCode}, - #{ddlType}, - #{tableName}, - #{ddlQuery}, - #{success}, - #{errorMessage}, - NOW() + #{userId} + , #{companyCode} + , #{ddlType} + , #{tableName} + , #{ddlQuery} + , #{success} + , #{errorMessage} + , NOW() ) - DELETE FROM ddl_execution_log - WHERE executed_at < CAST(#{cutoffDate} AS TIMESTAMP) + DELETE FROM DDL_EXECUTION_LOG + WHERE EXECUTED_AT < CAST(#{cutoffDate} AS TIMESTAMP) diff --git a/backend-spring/src/main/resources/mapper/dynamicForm.xml b/backend-spring/src/main/resources/mapper/dynamicForm.xml index e559cfb2..b0cb8ae3 100644 --- a/backend-spring/src/main/resources/mapper/dynamicForm.xml +++ b/backend-spring/src/main/resources/mapper/dynamicForm.xml @@ -6,30 +6,39 @@ @@ -136,45 +139,82 @@ - INSERT INTO vehicle_location_history ( - user_id, company_code, latitude, longitude, - accuracy, altitude, speed, heading, - trip_id, trip_status, departure, arrival, - departure_name, destination_name, recorded_at, vehicle_id + INSERT INTO VEHICLE_LOCATION_HISTORY ( + USER_ID + , COMPANY_CODE + , LATITUDE + , LONGITUDE + , ACCURACY + , ALTITUDE + , SPEED + , HEADING + , TRIP_ID + , TRIP_STATUS + , DEPARTURE + , ARRIVAL + , DEPARTURE_NAME + , DESTINATION_NAME + , RECORDED_AT + , VEHICLE_ID ) VALUES ( - #{userId}, #{companyCode}, #{latitude}, #{longitude}, - #{accuracy}, #{altitude}, #{speed}, #{heading}, - #{tripId}, #{tripStatus}, #{departure}, #{arrival}, - #{departureName}, #{destinationName}, #{recordedAt}, #{vehicleId} + #{userId} + , #{companyCode} + , #{latitude} + , #{longitude} + , #{accuracy} + , #{altitude} + , #{speed} + , #{heading} + , #{tripId} + , #{tripStatus} + , #{departure} + , #{arrival} + , #{departureName} + , #{destinationName} + , #{recordedAt} + , #{vehicleId} ) diff --git a/backend-spring/src/main/resources/mapper/entityReference.xml b/backend-spring/src/main/resources/mapper/entityReference.xml index e68598a7..8a439c25 100644 --- a/backend-spring/src/main/resources/mapper/entityReference.xml +++ b/backend-spring/src/main/resources/mapper/entityReference.xml @@ -6,10 +6,10 @@ - SELECT ${referenceColumn} AS "refValue", - ${displayColumn} AS "displayName" + SELECT ${referenceColumn} AS ref_value, + ${displayColumn} AS display_name FROM ${tableName} @@ -66,7 +66,7 @@ - SELECT objid, target_objid, saved_file_name, real_file_name, - doc_type, doc_type_name, file_size, file_ext, file_path, - company_code, writer, regdate, status, is_representative - - FROM attach_file_info - - WHERE 1=1 AND status != 'DELETED' + SELECT + OBJID + , TARGET_OBJID + , SAVED_FILE_NAME + , REAL_FILE_NAME + , DOC_TYPE + , DOC_TYPE_NAME + , FILE_SIZE + , FILE_EXT + , FILE_PATH + , COMPANY_CODE + , WRITER + , REGDATE + , STATUS + , IS_REPRESENTATIVE + FROM ATTACH_FILE_INFO + WHERE 1=1 + AND STATUS != 'DELETED' - - ORDER BY regdate DESC + ORDER BY REGDATE DESC - INSERT INTO attach_file_info ( - objid, target_objid, saved_file_name, real_file_name, - doc_type, doc_type_name, file_size, file_ext, file_path, - company_code, writer, regdate, status, parent_target_objid, is_representative + INSERT INTO ATTACH_FILE_INFO ( + OBJID + , TARGET_OBJID + , SAVED_FILE_NAME + , REAL_FILE_NAME + , DOC_TYPE + , DOC_TYPE_NAME + , FILE_SIZE + , FILE_EXT + , FILE_PATH + , COMPANY_CODE + , WRITER + , REGDATE + , STATUS + , PARENT_TARGET_OBJID + , IS_REPRESENTATIVE ) VALUES ( - #{objid}, #{targetObjid}, #{savedFileName}, #{realFileName}, - #{docType}, #{docTypeName}, #{fileSize}, #{fileExt}, #{filePath}, - #{companyCode}, #{writer}, NOW(), COALESCE(#{status}, 'ACTIVE'), - #{parentTargetObjid}, COALESCE(#{isRepresentative}, FALSE) + #{objid} + , #{targetObjid} + , #{savedFileName} + , #{realFileName} + , #{docType} + , #{docTypeName} + , #{fileSize} + , #{fileExt} + , #{filePath} + , #{companyCode} + , #{writer} + , NOW() + , COALESCE(#{status}, 'ACTIVE') + , #{parentTargetObjid} + , COALESCE(#{isRepresentative}, FALSE) ) - UPDATE attach_file_info SET - doc_type = COALESCE(#{docType}, doc_type), - doc_type_name = COALESCE(#{docTypeName}, doc_type_name), - target_objid = COALESCE(#{targetObjid}, target_objid), - is_representative = COALESCE(#{isRepresentative}, is_representative) - - WHERE objid = #{objid} + UPDATE ATTACH_FILE_INFO + SET + DOC_TYPE = COALESCE(#{docType}, DOC_TYPE) + , DOC_TYPE_NAME = COALESCE(#{docTypeName}, DOC_TYPE_NAME) + , TARGET_OBJID = COALESCE(#{targetObjid}, TARGET_OBJID) + , IS_REPRESENTATIVE = COALESCE(#{isRepresentative}, IS_REPRESENTATIVE) + WHERE OBJID = #{objid} - UPDATE attach_file_info SET status = 'DELETED' - - WHERE objid = #{objid} + UPDATE ATTACH_FILE_INFO + SET STATUS = 'DELETED' + WHERE OBJID = #{objid} diff --git a/backend-spring/src/main/resources/mapper/multilang.xml b/backend-spring/src/main/resources/mapper/multilang.xml index 86b8fe19..a277db0c 100644 --- a/backend-spring/src/main/resources/mapper/multilang.xml +++ b/backend-spring/src/main/resources/mapper/multilang.xml @@ -8,59 +8,85 @@ ═══════════════════════════════════════════════════════════════════════ --> - INSERT INTO language_master - (lang_code, lang_name, lang_native, is_active, sort_order, created_by, updated_by) - VALUES - (#{langCode}, #{langName}, #{langNative}, #{isActive}, #{sortOrder}, #{createdBy}, #{updatedBy}) + INSERT INTO LANGUAGE_MASTER ( + LANG_CODE + , LANG_NAME + , LANG_NATIVE + , IS_ACTIVE + , SORT_ORDER + , CREATED_BY + , UPDATED_BY + ) VALUES ( + #{langCode} + , #{langName} + , #{langNative} + , #{isActive} + , #{sortOrder} + , #{createdBy} + , #{updatedBy} + ) - UPDATE language_master + UPDATE LANGUAGE_MASTER - lang_name = #{langName}, - lang_native = #{langNative}, - is_active = #{isActive}, - sort_order = #{sortOrder}, - updated_by = #{updatedBy}, - updated_date = NOW() + LANG_NAME = #{langName}, + LANG_NATIVE = #{langNative}, + IS_ACTIVE = #{isActive}, + SORT_ORDER = #{sortOrder}, + UPDATED_BY = #{updatedBy}, + UPDATED_DATE = NOW() - - WHERE lang_code = #{langCode} + WHERE LANG_CODE = #{langCode} - UPDATE language_master - SET is_active = #{newStatus}, - updated_by = #{updatedBy}, - updated_date = NOW() - - WHERE lang_code = #{langCode} + UPDATE LANGUAGE_MASTER + SET + IS_ACTIVE = #{newStatus} + , UPDATED_BY = #{updatedBy} + , UPDATED_DATE = NOW() + WHERE LANG_CODE = #{langCode} - DELETE FROM multi_lang_text WHERE lang_code = #{langCode} + DELETE FROM MULTI_LANG_TEXT + WHERE LANG_CODE = #{langCode} - DELETE FROM language_master WHERE lang_code = #{langCode} + DELETE FROM LANGUAGE_MASTER + WHERE LANG_CODE = #{langCode} - INSERT INTO multi_lang_key_master - (company_code, usage_note, lang_key, description, is_active, created_by, updated_by) - VALUES - (#{companyCode}, #{menuName}, #{langKey}, #{description}, #{isActive}, #{createdBy}, #{updatedBy}) + INSERT INTO MULTI_LANG_KEY_MASTER ( + COMPANY_CODE + , USAGE_NOTE + , LANG_KEY + , DESCRIPTION + , IS_ACTIVE + , CREATED_BY + , UPDATED_BY + ) VALUES ( + #{companyCode} + , #{menuName} + , #{langKey} + , #{description} + , #{isActive} + , #{createdBy} + , #{updatedBy} + ) - INSERT INTO multi_lang_key_master - (company_code, lang_key, category_id, key_meaning, usage_note, description, is_active, created_by, updated_by) - VALUES - (#{companyCode}, #{langKey}, #{categoryId}, #{keyMeaning}, #{usageNote}, #{description}, 'Y', - #{createdBy}, #{createdBy}) + INSERT INTO MULTI_LANG_KEY_MASTER ( + COMPANY_CODE + , LANG_KEY + , CATEGORY_ID + , KEY_MEANING + , USAGE_NOTE + , DESCRIPTION + , IS_ACTIVE + , CREATED_BY + , UPDATED_BY + ) VALUES ( + #{companyCode} + , #{langKey} + , #{categoryId} + , #{keyMeaning} + , #{usageNote} + , #{description} + , 'Y' + , #{createdBy} + , #{createdBy} + ) - UPDATE multi_lang_key_master + UPDATE MULTI_LANG_KEY_MASTER - company_code = #{companyCode}, - usage_note = #{menuName}, - lang_key = #{langKey}, - description = #{description}, - updated_by = #{updatedBy} + COMPANY_CODE = #{companyCode}, + USAGE_NOTE = #{menuName}, + LANG_KEY = #{langKey}, + DESCRIPTION = #{description}, + UPDATED_BY = #{updatedBy} - - WHERE key_id = #{keyId} + WHERE KEY_ID = #{keyId} - UPDATE multi_lang_key_master - SET is_active = #{newStatus}, - updated_by = #{updatedBy} - - WHERE key_id = #{keyId} + UPDATE MULTI_LANG_KEY_MASTER + SET + IS_ACTIVE = #{newStatus} + , UPDATED_BY = #{updatedBy} + WHERE KEY_ID = #{keyId} - DELETE FROM multi_lang_text WHERE key_id = #{keyId} + DELETE FROM MULTI_LANG_TEXT + WHERE KEY_ID = #{keyId} - DELETE FROM multi_lang_key_master WHERE key_id = #{keyId} + DELETE FROM MULTI_LANG_KEY_MASTER + WHERE KEY_ID = #{keyId} - INSERT INTO multi_lang_text - (key_id, lang_code, lang_text, is_active, created_by, updated_by) - VALUES - (#{keyId}, #{langCode}, #{langText}, #{isActive}, #{createdBy}, #{updatedBy}) + INSERT INTO MULTI_LANG_TEXT ( + KEY_ID + , LANG_CODE + , LANG_TEXT + , IS_ACTIVE + , CREATED_BY + , UPDATED_BY + ) VALUES ( + #{keyId} + , #{langCode} + , #{langText} + , #{isActive} + , #{createdBy} + , #{updatedBy} + ) - INSERT INTO multi_lang_text - (key_id, lang_code, lang_text, is_active, created_date, created_by) - VALUES - (#{keyId}, #{langCode}, #{langText}, 'Y', NOW(), 'system') - ON CONFLICT (key_id, lang_code) - DO UPDATE SET lang_text = #{langText}, updated_date = NOW() + INSERT INTO MULTI_LANG_TEXT ( + KEY_ID + , LANG_CODE + , LANG_TEXT + , IS_ACTIVE + , CREATED_DATE + , CREATED_BY + ) VALUES ( + #{keyId} + , #{langCode} + , #{langText} + , 'Y' + , NOW() + , 'system' + ) + ON CONFLICT (KEY_ID, LANG_CODE) + DO UPDATE SET LANG_TEXT = #{langText}, UPDATED_DATE = NOW() - INSERT INTO multi_lang_category - (category_code, category_name, parent_id, level, key_prefix, description, sort_order, is_active, created_date) - VALUES - (#{categoryCode}, #{categoryName}, #{parentId, jdbcType=INTEGER}, #{level}, #{keyPrefix}, #{description}, #{sortOrder}, 'Y', NOW()) + INSERT INTO MULTI_LANG_CATEGORY ( + CATEGORY_CODE + , CATEGORY_NAME + , PARENT_ID + , LEVEL + , KEY_PREFIX + , DESCRIPTION + , SORT_ORDER + , IS_ACTIVE + , CREATED_DATE + ) VALUES ( + #{categoryCode} + , #{categoryName} + , #{parentId, jdbcType=INTEGER} + , #{level} + , #{keyPrefix} + , #{description} + , #{sortOrder} + , 'Y' + , NOW() + ) - INSERT INTO multi_lang_key_master - (company_code, lang_key, category_id, key_meaning, base_key_id, is_active, created_by, updated_by) - VALUES - (#{companyCode}, #{langKey}, #{categoryId}, #{keyMeaning}, #{baseKeyId}, 'Y', #{createdBy}, #{createdBy}) + INSERT INTO MULTI_LANG_KEY_MASTER ( + COMPANY_CODE + , LANG_KEY + , CATEGORY_ID + , KEY_MEANING + , BASE_KEY_ID + , IS_ACTIVE + , CREATED_BY + , UPDATED_BY + ) VALUES ( + #{companyCode} + , #{langKey} + , #{categoryId} + , #{keyMeaning} + , #{baseKeyId} + , 'Y' + , #{createdBy} + , #{createdBy} + ) diff --git a/backend-spring/src/main/resources/mapper/numberingRule.xml b/backend-spring/src/main/resources/mapper/numberingRule.xml index c10a5939..3ecb04f5 100644 --- a/backend-spring/src/main/resources/mapper/numberingRule.xml +++ b/backend-spring/src/main/resources/mapper/numberingRule.xml @@ -4,29 +4,29 @@ - rule_id AS ruleId, - rule_name AS ruleName, + rule_id AS rule_id, + rule_name AS rule_name, description, separator, - reset_period AS resetPeriod, - current_sequence AS currentSequence, - table_name AS tableName, - column_name AS columnName, - company_code AS companyCode, - category_column AS categoryColumn, - category_value_id AS categoryValueId, - created_by AS createdBy, - created_at AS createdAt, - updated_at AS updatedAt + reset_period AS reset_period, + current_sequence AS current_sequence, + table_name AS table_name, + column_name AS column_name, + company_code AS company_code, + category_column AS category_column, + category_value_id AS category_value_id, + created_by AS created_by, + created_at AS created_at, + updated_at AS updated_at id, part_order AS "order", - part_type AS partType, - generation_method AS generationMethod, - auto_config AS autoConfig, - manual_config AS manualConfig + part_type AS part_type, + generation_method AS generation_method, + auto_config AS auto_config, + manual_config AS manual_config @@ -145,7 +145,7 @@ SELECT - r.rule_id AS ruleId, - r.rule_name AS ruleName, + r.rule_id AS rule_id, + r.rule_name AS rule_name, r.description, r.separator, - r.reset_period AS resetPeriod, - r.current_sequence AS currentSequence, - r.table_name AS tableName, - r.column_name AS columnName, - r.company_code AS companyCode, - r.category_column AS categoryColumn, - r.category_value_id AS categoryValueId, - cv.value_label AS categoryValueLabel, - r.created_by AS createdBy, - r.created_at AS createdAt, - r.updated_at AS updatedAt + r.reset_period AS reset_period, + r.current_sequence AS current_sequence, + r.table_name AS table_name, + r.column_name AS column_name, + r.company_code AS company_code, + r.category_column AS category_column, + r.category_value_id AS category_value_id, + cv.value_label AS category_value_label, + r.created_by AS created_by, + r.created_at AS created_at, + r.updated_at AS updated_at FROM numbering_rules r @@ -234,21 +234,21 @@ - SELECT OBJID, AUTH_NAME, AUTH_CODE, COMPANY_CODE, STATUS, WRITER, REGDATE + SELECT + OBJID + , AUTH_NAME + , AUTH_CODE + , COMPANY_CODE + , STATUS + , WRITER + , REGDATE FROM AUTHORITY_MASTER WHERE 1=1 @@ -21,7 +28,14 @@ @@ -29,8 +43,21 @@ - INSERT INTO AUTHORITY_MASTER (AUTH_NAME, AUTH_CODE, COMPANY_CODE, STATUS, WRITER, REGDATE) - VALUES (#{authName}, #{authCode}, #{companyCode}, 'active', #{writer}, NOW()) + INSERT INTO AUTHORITY_MASTER ( + AUTH_NAME + , AUTH_CODE + , COMPANY_CODE + , STATUS + , WRITER + , REGDATE + ) VALUES ( + #{authName} + , #{authCode} + , #{companyCode} + , 'active' + , #{writer} + , NOW() + ) @@ -60,8 +87,15 @@ 멤버 관리 ────────────────────────────────────────────────── --> - SELECT ASM.OBJID, ASM.MASTER_OBJID, ASM.MENU_OBJID, ASM.WRITER, ASM.REGDATE, - MI.MENU_NAME, MI.MENU_URL, MI.LEV, MI.SORT_ORDER + SELECT + ASM.OBJID + , ASM.MASTER_OBJID + , ASM.MENU_OBJID + , ASM.WRITER + , ASM.REGDATE + , MI.MENU_NAME + , MI.MENU_URL + , MI.LEV + , MI.SORT_ORDER FROM AUTHORITY_SUB_MENU ASM INNER JOIN MENU_INFO MI ON ASM.MENU_OBJID = MI.OBJID WHERE ASM.MASTER_OBJID = #{authObjid} @@ -113,8 +159,12 @@ - INSERT INTO AUTHORITY_SUB_MENU (MASTER_OBJID, MENU_OBJID, WRITER, REGDATE) - VALUES + INSERT INTO AUTHORITY_SUB_MENU ( + MASTER_OBJID + , MENU_OBJID + , WRITER + , REGDATE + ) VALUES (#{authObjid}, #{perm.menuObjid}, #{writer}, NOW()) @@ -124,7 +174,15 @@ 전체 메뉴 목록 (권한 설정용) ────────────────────────────────────────────────── --> - SELECT AM.OBJID, AM.AUTH_NAME, AM.AUTH_CODE, AM.COMPANY_CODE, AM.STATUS + SELECT + AM.OBJID + , AM.AUTH_NAME + , AM.AUTH_CODE + , AM.COMPANY_CODE + , AM.STATUS FROM AUTHORITY_MASTER AM INNER JOIN AUTHORITY_SUB_USER ASU ON AM.OBJID = ASU.MASTER_OBJID WHERE ASU.USER_ID = #{userId} diff --git a/backend-spring/src/main/resources/mapper/tableCategoryValue.xml b/backend-spring/src/main/resources/mapper/tableCategoryValue.xml index 4d2aabdb..cd0bb40e 100644 --- a/backend-spring/src/main/resources/mapper/tableCategoryValue.xml +++ b/backend-spring/src/main/resources/mapper/tableCategoryValue.xml @@ -67,13 +67,13 @@ - + - + SELECT DISTINCT mi.objid AS "menuObjid", - mi.menu_name_kor AS "menuName", + mi.menu_name_kor AS menu_name, mi.menu_url AS "menuUrl" FROM menu_info mi @@ -289,7 +289,7 @@ WHERE (cv.company_code = #{companyCode} OR cv.company_code = '*') ) - SELECT value_id AS "valueId" FROM category_tree + SELECT value_id AS value_id FROM category_tree @@ -334,8 +334,8 @@ SELECT DISTINCT - value_code AS "valueCode", - value_label AS "valueLabel" + value_code AS value_code, + value_label AS value_label FROM category_values diff --git a/backend-spring/src/main/resources/mapper/tableManagement.xml b/backend-spring/src/main/resources/mapper/tableManagement.xml index 8e61ccc5..3aa26070 100644 --- a/backend-spring/src/main/resources/mapper/tableManagement.xml +++ b/backend-spring/src/main/resources/mapper/tableManagement.xml @@ -8,30 +8,29 @@ ═══════════════════════════════════════════════════ --> @@ -92,55 +91,55 @@ ═══════════════════════════════════════════════════ --> @@ -149,34 +148,31 @@ ═══════════════════════════════════════════════════ --> @@ -195,129 +191,196 @@ 테이블 라벨 ═══════════════════════════════════════════════════ --> - INSERT INTO table_labels (table_name, table_label, description, created_date, updated_date) - VALUES (#{tableName}, #{displayName}, #{description}, NOW(), NOW()) - ON CONFLICT (table_name) + INSERT INTO TABLE_LABELS ( + TABLE_NAME + , TABLE_LABEL + , DESCRIPTION + , CREATED_DATE + , UPDATED_DATE + ) VALUES ( + #{tableName} + , #{displayName} + , #{description} + , NOW() + , NOW() + ) + ON CONFLICT (TABLE_NAME) DO UPDATE SET - table_label = EXCLUDED.table_label, - description = EXCLUDED.description, - updated_date = NOW() + TABLE_LABEL = EXCLUDED.TABLE_LABEL + , DESCRIPTION = EXCLUDED.DESCRIPTION + , UPDATED_DATE = NOW() - INSERT INTO table_labels (table_name, table_label, description, created_date, updated_date) - VALUES (#{tableName}, #{tableName}, '', NOW(), NOW()) - ON CONFLICT (table_name) DO NOTHING + INSERT INTO TABLE_LABELS ( + TABLE_NAME + , TABLE_LABEL + , DESCRIPTION + , CREATED_DATE + , UPDATED_DATE + ) VALUES ( + #{tableName} + , #{tableName} + , '' + , NOW() + , NOW() + ) + ON CONFLICT (TABLE_NAME) DO NOTHING - INSERT INTO table_type_columns ( - table_name, column_name, column_label, input_type, detail_settings, - code_category, code_value, reference_table, reference_column, - display_column, display_order, is_visible, is_nullable, - company_code, category_ref, created_date, updated_date + INSERT INTO TABLE_TYPE_COLUMNS ( + TABLE_NAME + , COLUMN_NAME + , COLUMN_LABEL + , INPUT_TYPE + , DETAIL_SETTINGS + , CODE_CATEGORY + , CODE_VALUE + , REFERENCE_TABLE + , REFERENCE_COLUMN + , DISPLAY_COLUMN + , DISPLAY_ORDER + , IS_VISIBLE + , IS_NULLABLE + , COMPANY_CODE + , CATEGORY_REF + , CREATED_DATE + , UPDATED_DATE ) VALUES ( - #{tableName}, #{columnName}, #{columnLabel}, #{inputType}, #{detailSettings}::jsonb, - #{codeCategory}, #{codeValue}, #{referenceTable}, #{referenceColumn}, - #{displayColumn}, #{displayOrder}, #{isVisible}, 'Y', - #{companyCode}, #{categoryRef}, NOW(), NOW() + #{tableName} + , #{columnName} + , #{columnLabel} + , #{inputType} + , #{detailSettings}::JSONB + , #{codeCategory} + , #{codeValue} + , #{referenceTable} + , #{referenceColumn} + , #{displayColumn} + , #{displayOrder} + , #{isVisible} + , 'Y' + , #{companyCode} + , #{categoryRef} + , NOW() + , NOW() ) - ON CONFLICT (table_name, column_name, company_code) + ON CONFLICT (TABLE_NAME, COLUMN_NAME, COMPANY_CODE) DO UPDATE SET - column_label = COALESCE(EXCLUDED.column_label, table_type_columns.column_label), - input_type = COALESCE(EXCLUDED.input_type, table_type_columns.input_type), - detail_settings = COALESCE(EXCLUDED.detail_settings, table_type_columns.detail_settings), - code_category = EXCLUDED.code_category, - code_value = EXCLUDED.code_value, - reference_table = EXCLUDED.reference_table, - reference_column = EXCLUDED.reference_column, - display_column = EXCLUDED.display_column, - display_order = COALESCE(EXCLUDED.display_order, table_type_columns.display_order), - is_visible = COALESCE(EXCLUDED.is_visible, table_type_columns.is_visible), - category_ref = EXCLUDED.category_ref, - updated_date = NOW() + COLUMN_LABEL = COALESCE(EXCLUDED.COLUMN_LABEL, TABLE_TYPE_COLUMNS.COLUMN_LABEL) + , INPUT_TYPE = COALESCE(EXCLUDED.INPUT_TYPE, TABLE_TYPE_COLUMNS.INPUT_TYPE) + , DETAIL_SETTINGS = COALESCE(EXCLUDED.DETAIL_SETTINGS, TABLE_TYPE_COLUMNS.DETAIL_SETTINGS) + , CODE_CATEGORY = EXCLUDED.CODE_CATEGORY + , CODE_VALUE = EXCLUDED.CODE_VALUE + , REFERENCE_TABLE = EXCLUDED.REFERENCE_TABLE + , REFERENCE_COLUMN = EXCLUDED.REFERENCE_COLUMN + , DISPLAY_COLUMN = EXCLUDED.DISPLAY_COLUMN + , DISPLAY_ORDER = COALESCE(EXCLUDED.DISPLAY_ORDER, TABLE_TYPE_COLUMNS.DISPLAY_ORDER) + , IS_VISIBLE = COALESCE(EXCLUDED.IS_VISIBLE, TABLE_TYPE_COLUMNS.IS_VISIBLE) + , CATEGORY_REF = EXCLUDED.CATEGORY_REF + , UPDATED_DATE = NOW() - INSERT INTO table_type_columns ( - table_name, column_name, input_type, detail_settings, - is_nullable, display_order, company_code, created_date, updated_date + INSERT INTO TABLE_TYPE_COLUMNS ( + TABLE_NAME + , COLUMN_NAME + , INPUT_TYPE + , DETAIL_SETTINGS + , IS_NULLABLE + , DISPLAY_ORDER + , COMPANY_CODE + , CREATED_DATE + , UPDATED_DATE ) VALUES ( - #{tableName}, #{columnName}, #{inputType}, #{detailSettings}::jsonb, - 'Y', 0, #{companyCode}, NOW(), NOW() + #{tableName} + , #{columnName} + , #{inputType} + , #{detailSettings}::JSONB + , 'Y' + , 0 + , #{companyCode} + , NOW() + , NOW() ) - ON CONFLICT (table_name, column_name, company_code) + ON CONFLICT (TABLE_NAME, COLUMN_NAME, COMPANY_CODE) DO UPDATE SET - input_type = EXCLUDED.input_type, - detail_settings = EXCLUDED.detail_settings, - reference_table = CASE WHEN #{clearEntity} = TRUE THEN NULL ELSE table_type_columns.reference_table END, - reference_column= CASE WHEN #{clearEntity} = TRUE THEN NULL ELSE table_type_columns.reference_column END, - display_column = CASE WHEN #{clearEntity} = TRUE THEN NULL ELSE table_type_columns.display_column END, - code_category = CASE WHEN #{clearCode} = TRUE THEN NULL ELSE table_type_columns.code_category END, - code_value = CASE WHEN #{clearCode} = TRUE THEN NULL ELSE table_type_columns.code_value END, - category_ref = CASE WHEN #{clearCategory} = TRUE THEN NULL ELSE table_type_columns.category_ref END, - updated_date = NOW() + INPUT_TYPE = EXCLUDED.INPUT_TYPE + , DETAIL_SETTINGS = EXCLUDED.DETAIL_SETTINGS + , REFERENCE_TABLE = CASE WHEN #{clearEntity} = TRUE THEN NULL ELSE TABLE_TYPE_COLUMNS.REFERENCE_TABLE END + , REFERENCE_COLUMN= CASE WHEN #{clearEntity} = TRUE THEN NULL ELSE TABLE_TYPE_COLUMNS.REFERENCE_COLUMN END + , DISPLAY_COLUMN = CASE WHEN #{clearEntity} = TRUE THEN NULL ELSE TABLE_TYPE_COLUMNS.DISPLAY_COLUMN END + , CODE_CATEGORY = CASE WHEN #{clearCode} = TRUE THEN NULL ELSE TABLE_TYPE_COLUMNS.CODE_CATEGORY END + , CODE_VALUE = CASE WHEN #{clearCode} = TRUE THEN NULL ELSE TABLE_TYPE_COLUMNS.CODE_VALUE END + , CATEGORY_REF = CASE WHEN #{clearCategory} = TRUE THEN NULL ELSE TABLE_TYPE_COLUMNS.CATEGORY_REF END + , UPDATED_DATE = NOW() - INSERT INTO table_type_columns (table_name, column_name, is_nullable, company_code, created_date, updated_date) - VALUES (#{tableName}, #{columnName}, #{isNullable}, #{companyCode}, NOW(), NOW()) - ON CONFLICT (table_name, column_name, company_code) - DO UPDATE SET is_nullable = #{isNullable}, updated_date = NOW() + INSERT INTO TABLE_TYPE_COLUMNS ( + TABLE_NAME + , COLUMN_NAME + , IS_NULLABLE + , COMPANY_CODE + , CREATED_DATE + , UPDATED_DATE + ) VALUES ( + #{tableName} + , #{columnName} + , #{isNullable} + , #{companyCode} + , NOW() + , NOW() + ) + ON CONFLICT (TABLE_NAME, COLUMN_NAME, COMPANY_CODE) + DO UPDATE SET + IS_NULLABLE = #{isNullable} + , UPDATED_DATE = NOW() - INSERT INTO table_type_columns (table_name, column_name, is_unique, company_code, created_date, updated_date) - VALUES (#{tableName}, #{columnName}, #{isUnique}, #{companyCode}, NOW(), NOW()) - ON CONFLICT (table_name, column_name, company_code) - DO UPDATE SET is_unique = #{isUnique}, updated_date = NOW() + INSERT INTO TABLE_TYPE_COLUMNS ( + TABLE_NAME + , COLUMN_NAME + , IS_UNIQUE + , COMPANY_CODE + , CREATED_DATE + , UPDATED_DATE + ) VALUES ( + #{tableName} + , #{columnName} + , #{isUnique} + , #{companyCode} + , NOW() + , NOW() + ) + ON CONFLICT (TABLE_NAME, COLUMN_NAME, COMPANY_CODE) + DO UPDATE SET + IS_UNIQUE = #{isUnique} + , UPDATED_DATE = NOW() - INSERT INTO log_tables (table_name, is_active, log_columns, created_date, updated_date) - VALUES (#{tableName}, #{isActive}, #{logColumns}, NOW(), NOW()) - ON CONFLICT (table_name) + INSERT INTO LOG_TABLES ( + TABLE_NAME + , IS_ACTIVE + , LOG_COLUMNS + , CREATED_DATE + , UPDATED_DATE + ) VALUES ( + #{tableName} + , #{isActive} + , #{logColumns} + , NOW() + , NOW() + ) + ON CONFLICT (TABLE_NAME) DO UPDATE SET - is_active = #{isActive}, - log_columns = #{logColumns}, - updated_date = NOW() + IS_ACTIVE = #{isActive} + , LOG_COLUMNS = #{logColumns} + , UPDATED_DATE = NOW() - UPDATE screen_layouts sl - SET properties = jsonb_set( - jsonb_set( - sl.properties, - '{widgetType}', to_jsonb(#{componentId}::text) - ), - '{componentType}', to_jsonb(#{componentId}::text) - ) - FROM screen_definitions sd - WHERE sl.screen_id = sd.screen_id - AND sl.properties->>'tableName' = #{tableName} - AND sl.properties->>'columnName' = #{columnName} - AND ((sd.company_code = #{companyCode} OR sd.company_code = '*') OR #{companyCode} = '*') + UPDATE SCREEN_LAYOUTS SL + SET + PROPERTIES = JSONB_SET( + JSONB_SET( + SL.PROPERTIES, + '{widgetType}', TO_JSONB(#{componentId}::TEXT) + ), + '{componentType}', TO_JSONB(#{componentId}::TEXT) + ) + FROM SCREEN_DEFINITIONS SD + WHERE SL.SCREEN_ID = SD.SCREEN_ID + AND SL.PROPERTIES->>'tableName' = #{tableName} + AND SL.PROPERTIES->>'columnName' = #{columnName} + AND ((SD.COMPANY_CODE = #{companyCode} OR SD.COMPANY_CODE = '*') OR #{companyCode} = '*') diff --git a/backend-spring/src/main/resources/mapper/todo.xml b/backend-spring/src/main/resources/mapper/todo.xml index 48558d59..d5a88b27 100644 --- a/backend-spring/src/main/resources/mapper/todo.xml +++ b/backend-spring/src/main/resources/mapper/todo.xml @@ -5,98 +5,130 @@ - AND (title ILIKE '%' || #{keyword} || '%' - OR description ILIKE '%' || #{keyword} || '%') + AND (TITLE ILIKE '%' || #{keyword} || '%' + OR DESCRIPTION ILIKE '%' || #{keyword} || '%') - AND status = #{status} + AND STATUS = #{status} - AND priority = #{priority} + AND PRIORITY = #{priority} - AND assigned_to = #{assignedTo} + AND ASSIGNED_TO = #{assignedTo} - INSERT INTO todo_items ( - id, title, description, priority, status, - assigned_to, due_date, is_urgent, display_order, - created_at, updated_at + INSERT INTO TODO_ITEMS ( + ID + , TITLE + , DESCRIPTION + , PRIORITY + , STATUS + , ASSIGNED_TO + , DUE_DATE + , IS_URGENT + , DISPLAY_ORDER + , CREATED_AT + , UPDATED_AT ) VALUES ( - #{id}, #{title}, #{description, jdbcType=VARCHAR}, - COALESCE(#{priority, jdbcType=VARCHAR}, 'normal'), - COALESCE(#{status, jdbcType=VARCHAR}, 'pending'), - #{assignedTo, jdbcType=VARCHAR}, - #{dueDate, jdbcType=DATE}, - COALESCE(#{isUrgent, jdbcType=BOOLEAN}, FALSE), - COALESCE((SELECT COALESCE(MAX(display_order), -1) + 1 FROM todo_items), 0), - NOW(), NOW() + #{id} + , #{title} + , #{description, jdbcType=VARCHAR} + , COALESCE(#{priority, jdbcType=VARCHAR}, 'normal') + , COALESCE(#{status, jdbcType=VARCHAR}, 'pending') + , #{assignedTo, jdbcType=VARCHAR} + , #{dueDate, jdbcType=DATE} + , COALESCE(#{isUrgent, jdbcType=BOOLEAN}, FALSE) + , COALESCE((SELECT COALESCE(MAX(DISPLAY_ORDER), -1) + 1 FROM TODO_ITEMS), 0) + , NOW() + , NOW() ) - UPDATE todo_items SET updated_at = NOW() - , title = #{title} - , description = #{description} - , priority = #{priority} + UPDATE TODO_ITEMS + SET UPDATED_AT = NOW() + , TITLE = #{title} + , DESCRIPTION = #{description} + , PRIORITY = #{priority} - , status = #{status} - , completed_at = NOW() + , STATUS = #{status} + , COMPLETED_AT = NOW() - , assigned_to = #{assignedTo} - , due_date = #{dueDate} - , is_urgent = #{isUrgent} - - WHERE id = #{id} + , ASSIGNED_TO = #{assignedTo} + , DUE_DATE = #{dueDate} + , IS_URGENT = #{isUrgent} + WHERE ID = #{id} - DELETE FROM todo_items WHERE id = #{id} + DELETE FROM TODO_ITEMS + WHERE ID = #{id} - UPDATE todo_items SET display_order = #{displayOrder}, updated_at = NOW() - - WHERE id = #{id} + UPDATE TODO_ITEMS + SET + DISPLAY_ORDER = #{displayOrder} + , UPDATED_AT = NOW() + WHERE ID = #{id} diff --git a/frontend/lib/api/screen.ts b/frontend/lib/api/screen.ts index 178e14cc..31919340 100644 --- a/frontend/lib/api/screen.ts +++ b/frontend/lib/api/screen.ts @@ -8,6 +8,33 @@ import { LayoutData, } from "@/types/screen"; +// Spring은 DB Map을 그대로 반환(snake_case), Node.js는 camelCase로 반환 +// 두 형식 모두 ScreenDefinition(camelCase)으로 정규화 +function mapRawScreen(raw: any): ScreenDefinition { + const createdRaw = raw.createdDate ?? raw.created_date; + const updatedRaw = raw.updatedDate ?? raw.updated_date; + return { + ...raw, + screenId: raw.screenId ?? raw.screen_id, + screenName: raw.screenName ?? raw.screen_name, + screenCode: raw.screenCode ?? raw.screen_code, + tableName: raw.tableName ?? raw.table_name, + tableLabel: raw.tableLabel ?? raw.table_label, + companyCode: raw.companyCode ?? raw.company_code, + isActive: raw.isActive ?? raw.is_active, + createdDate: createdRaw ? new Date(createdRaw) : undefined, + updatedDate: updatedRaw ? new Date(updatedRaw) : undefined, + createdBy: raw.createdBy ?? raw.created_by, + updatedBy: raw.updatedBy ?? raw.updated_by, + dbSourceType: raw.dbSourceType ?? raw.db_source_type, + dbConnectionId: raw.dbConnectionId ?? raw.db_connection_id, + dataSourceType: raw.dataSourceType ?? raw.data_source_type, + restApiConnectionId: raw.restApiConnectionId ?? raw.rest_api_connection_id, + restApiEndpoint: raw.restApiEndpoint ?? raw.rest_api_endpoint, + restApiJsonPath: raw.restApiJsonPath ?? raw.rest_api_json_path, + } as ScreenDefinition; +} + // 화면 정의 관련 API export const screenApi = { // 화면 목록 조회 @@ -21,12 +48,7 @@ export const screenApi = { const response = await apiClient.get("/screen-management/screens", { params }); const raw = response.data || {}; const items: any[] = (raw.data ?? raw.items ?? []) as any[]; - const mapped: ScreenDefinition[] = items.map((it) => ({ - ...it, - // 문자열로 온 날짜를 Date 객체로 변환 (이미 Date이면 그대로 유지) - createdDate: it.createdDate ? new Date(it.createdDate) : undefined, - updatedDate: it.updatedDate ? new Date(it.updatedDate) : undefined, - })); + const mapped: ScreenDefinition[] = items.map(mapRawScreen); const page = raw.page ?? params.page ?? 1; const size = raw.size ?? params.size ?? mapped.length; @@ -40,17 +62,18 @@ export const screenApi = { getScreen: async (screenId: number): Promise => { const response = await apiClient.get(`/screen-management/screens/${screenId}`); const raw = response.data?.data || response.data; - return { - ...raw, - createdDate: raw?.createdDate ? new Date(raw.createdDate) : undefined, - updatedDate: raw?.updatedDate ? new Date(raw.updatedDate) : undefined, - } as ScreenDefinition; + return mapRawScreen(raw); }, // 화면에 할당된 메뉴 조회 getScreenMenu: async (screenId: number): Promise<{ menuObjid: number; menuName?: string } | null> => { const response = await apiClient.get(`/screen-management/screens/${screenId}/menu`); - return response.data?.data || null; + const raw = response.data?.data; + if (!raw) return null; + return { + menuObjid: raw.menuObjid ?? raw.menu_objid, + menuName: raw.menuName ?? raw.menu_name_kor, + }; }, // 화면 생성 @@ -602,11 +625,7 @@ export const menuScreenApi = { // 메뉴별 할당된 화면 목록 조회 getScreensByMenu: async (menuObjid: number): Promise => { const response = await apiClient.get(`/screen-management/menus/${menuObjid}/screens`); - return response.data.data.map((screen: any) => ({ - ...screen, - createdDate: screen.createdDate ? new Date(screen.createdDate) : new Date(), - updatedDate: screen.updatedDate ? new Date(screen.updatedDate) : new Date(), - })); + return (response.data.data || []).map(mapRawScreen); }, // 화면-메뉴 할당 해제