# Pipeline: ERP Node.js → Spring Boot Full Migration ## config - max_retries: 5 - parallel: true - timeout: 15m - design_first: false - model: sonnet - max_concurrent: 3 ## tasks # ============================================================ # Infrastructure (task-1 ~ task-5) # ============================================================ ### task-1: Spring Boot Project Init [backend] - depends: none - done_when: ./gradlew bootJar success - files: backend-spring/build.gradle, backend-spring/settings.gradle, backend-spring/src/main/resources/application.yml, backend-spring/src/main/java/com/erp/ErpApplication.java - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - verify: cd backend-spring && ./gradlew bootJar 2>&1 | tail -20 - context: | Spring Boot 3.3.x + Gradle (Groovy DSL) + Java 21 Dependencies: spring-boot-starter-web, mybatis-spring-boot-starter (3.0.x), spring-boot-starter-security, postgresql, lombok, jjwt MyBatis Config: mybatis.mapper-locations=classpath:mapper/*.xml mybatis.configuration.map-underscore-to-camel-case=true application.yml: - DB: postgresql://postgres:ph0909!!@39.117.244.52:11132/plm - Port: 8081, Timezone: Asia/Seoul - HikariCP: min 2, max 10, timeout 30s ### task-2: BigDecimal Utility [backend] - depends: task-1 - done_when: DecimalUtils all unit tests pass - files: backend-spring/src/main/java/com/erp/util/DecimalUtils.java, backend-spring/src/test/java/com/erp/util/DecimalUtilsTest.java - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - verify: cd backend-spring && ./gradlew test --tests "*DecimalUtils*" 2>&1 | tail -20 - context: | parse(String), multiply(String,String), addTax(String,String), divide(String,String,int scale), sum(List) float/double FORBIDDEN. new BigDecimal("string") enforced. Test: parse(null)→ZERO, multiply("100","0.1")→10.0000, 0.1+0.2=0.3 ### task-3: Common Response Format + Error Handler [backend] - depends: task-1 - done_when: ApiResponse + GlobalExceptionHandler build pass - files: backend-spring/src/main/java/com/erp/dto/ApiResponse.java, backend-spring/src/main/java/com/erp/config/GlobalExceptionHandler.java - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - context: | Identical to Node response format: { success, data, message } ApiResponse.success(data), ApiResponse.error(message) GlobalExceptionHandler: @ControllerAdvice, 500/404 Processing ### task-4: Security + JWT Filter [backend] - depends: task-1 - done_when: SecurityConfig + JwtTokenProvider + JwtAuthenticationFilter build pass - files: backend-spring/src/main/java/com/erp/config/SecurityConfig.java, backend-spring/src/main/java/com/erp/config/JwtTokenProvider.java, backend-spring/src/main/java/com/erp/filter/JwtAuthenticationFilter.java - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - ref_files: backend-node/src/middleware/authMiddleware.ts, backend-node/src/utils/jwtUtils.ts - context: | JWT secret: ilshin-plm-super-secret-jwt-key-2024 expiresIn: 24h, refreshExpiresIn: 7d payload: { userId, companyCode, role } JwtAuthenticationFilter → injects companyCode as RequestAttribute /api/auth/login, /api/auth/refresh → permitAll, rest authenticated ### task-5: Common Layer (CommonMapper + CommonService) [backend] - depends: task-1 - done_when: CommonMapper + CommonService build pass - files: backend-spring/src/main/java/com/erp/mapper/CommonMapper.java, backend-spring/src/main/resources/mapper/CommonMapper.xml, backend-spring/src/main/java/com/erp/service/CommonService.java - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - context: | Common layer managing shared queries/logic in one place. CommonMapper.xml: Shared SQL fragments (company_code Filter, Pagination, Dynamic WHERE) - : company_code filter fragment - : OFFSET/LIMIT fragment - selectCommonCode: Common code lookup (code_group, code_value) - selectByTableDynamic: Dynamic table generic query CommonService.java: Shared business logic - getCompanyCodeFilter(companyCode): company_code branching util - applyPagination(params): Pagination param normalization All other Mapper XMLs reuse via ### task-6: Auth Login/Refresh API [backend] - depends: task-3, task-4, task-5 - done_when: /api/auth/login JWT issuance success - files: backend-spring/src/main/java/com/erp/controller/AuthController.java, backend-spring/src/main/java/com/erp/service/AuthService.java, backend-spring/src/main/java/com/erp/mapper/AuthMapper.java, backend-spring/src/main/resources/mapper/AuthMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $API_POST(/api/auth/login, {"userId":"wace","password":"qlalfqjsgh11"}) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/authRoutes.ts, backend-node/src/controllers/authController.ts, backend-node/src/services/authService.ts - context: | Login: userId + password → JWT (accessToken + refreshToken) Refresh: refreshToken → new accessToken bcrypt (Spring Security PasswordEncoder), DB: user_info table (MyBatis Mapper + XML) Response: { success: true, data: { accessToken, refreshToken, user } } # ============================================================ # Auth/Admin (task-7 ~ task-13) # ============================================================ ### task-7: Admin Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/AdminController.java, backend-spring/src/main/java/com/erp/service/AdminService.java, backend-spring/src/main/java/com/erp/mapper/AdminMapper.java, backend-spring/src/main/resources/mapper/AdminMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/admin/users) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/adminRoutes.ts, backend-node/src/controllers/adminController.ts, backend-node/src/services/adminService.ts - context: | Admin user CRUD. company_code filter required. Super Admin branching. ### task-8: Role Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/RoleController.java, backend-spring/src/main/java/com/erp/service/RoleService.java, backend-spring/src/main/java/com/erp/mapper/RoleMapper.java, backend-spring/src/main/resources/mapper/RoleMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/role/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/roleRoutes.ts, backend-node/src/controllers/roleController.ts ### task-9: Department Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DepartmentController.java, backend-spring/src/main/java/com/erp/service/DepartmentService.java, backend-spring/src/main/java/com/erp/mapper/DepartmentMapper.java, backend-spring/src/main/resources/mapper/DepartmentMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/department/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/departmentRoutes.ts, backend-node/src/controllers/departmentController.ts ### task-10: Company Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CompanyManagementController.java, backend-spring/src/main/java/com/erp/service/CompanyManagementService.java, backend-spring/src/main/java/com/erp/mapper/CompanyManagementMapper.java, backend-spring/src/main/resources/mapper/CompanyManagementMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/company-management/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/companyManagementRoutes.ts, backend-node/src/controllers/companyManagementController.ts ### task-11: System Notice API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/SystemNoticeController.java, backend-spring/src/main/java/com/erp/service/SystemNoticeService.java, backend-spring/src/main/java/com/erp/mapper/SystemNoticeMapper.java, backend-spring/src/main/resources/mapper/SystemNoticeMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/system-notice/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/systemNoticeRoutes.ts, backend-node/src/controllers/systemNoticeController.ts ### task-12: Audit Log API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/AuditLogController.java, backend-spring/src/main/java/com/erp/service/AuditLogService.java, backend-spring/src/main/java/com/erp/mapper/AuditLogMapper.java, backend-spring/src/main/resources/mapper/AuditLogMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/audit-log/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/auditLogRoutes.ts, backend-node/src/controllers/auditLogController.ts, backend-node/src/services/auditLogService.ts ### task-13: Approval API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ApprovalController.java, backend-spring/src/main/java/com/erp/service/ApprovalService.java, backend-spring/src/main/java/com/erp/mapper/ApprovalMapper.java, backend-spring/src/main/resources/mapper/ApprovalMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/approval/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/approvalRoutes.ts, backend-node/src/controllers/approvalController.ts # ============================================================ # Table/Entity Management # ============================================================ ### task-14: Table Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/TableManagementController.java, backend-spring/src/main/java/com/erp/service/TableManagementService.java, backend-spring/src/main/java/com/erp/mapper/TableManagementMapper.java, backend-spring/src/main/resources/mapper/TableManagementMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/table-management/tables) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/tableManagementRoutes.ts, backend-node/src/controllers/tableManagementController.ts ### task-15: Entity Join API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/EntityJoinController.java, backend-spring/src/main/java/com/erp/service/EntityJoinService.java, backend-spring/src/main/java/com/erp/mapper/EntityJoinMapper.java, backend-spring/src/main/resources/mapper/EntityJoinMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/entity-join/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/entityJoinRoutes.ts, backend-node/src/controllers/entityJoinController.ts, backend-node/src/services/entityJoinService.ts ### task-16: Entity Reference API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/EntityReferenceController.java, backend-spring/src/main/java/com/erp/service/EntityReferenceService.java, backend-spring/src/main/java/com/erp/mapper/EntityReferenceMapper.java, backend-spring/src/main/resources/mapper/EntityReferenceMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/entity-reference/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/entityReferenceRoutes.ts, backend-node/src/controllers/entityReferenceController.ts ### task-17: Entity Search API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/EntitySearchController.java, backend-spring/src/main/java/com/erp/service/EntitySearchService.java, backend-spring/src/main/java/com/erp/mapper/EntitySearchMapper.java, backend-spring/src/main/resources/mapper/EntitySearchMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/entity-search/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/entitySearchRoutes.ts, backend-node/src/controllers/entitySearchController.ts ### task-18: DDL Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DdlController.java, backend-spring/src/main/java/com/erp/service/DdlService.java, backend-spring/src/main/java/com/erp/mapper/DdlMapper.java, backend-spring/src/main/resources/mapper/DdlMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/ddl/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/ddlRoutes.ts, backend-node/src/controllers/ddlController.ts ### task-19: Table History API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/TableHistoryController.java, backend-spring/src/main/java/com/erp/service/TableHistoryService.java, backend-spring/src/main/java/com/erp/mapper/TableHistoryMapper.java, backend-spring/src/main/resources/mapper/TableHistoryMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/table-history/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/tableHistoryRoutes.ts ### task-20: Table Category Value API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/TableCategoryValueController.java, backend-spring/src/main/java/com/erp/service/TableCategoryValueService.java, backend-spring/src/main/java/com/erp/mapper/TableCategoryValueMapper.java, backend-spring/src/main/resources/mapper/TableCategoryValueMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/table-category-value/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/tableCategoryValueRoutes.ts ### task-21: DB Type Category API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DbTypeCategoryController.java, backend-spring/src/main/java/com/erp/service/DbTypeCategoryService.java, backend-spring/src/main/java/com/erp/mapper/DbTypeCategoryMapper.java, backend-spring/src/main/resources/mapper/DbTypeCategoryMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/db-type-category/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dbTypeCategoryRoutes.ts # ============================================================ # Screen/Layout # ============================================================ ### task-22: Screen Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ScreenManagementController.java, backend-spring/src/main/java/com/erp/service/ScreenManagementService.java, backend-spring/src/main/java/com/erp/mapper/ScreenManagementMapper.java, backend-spring/src/main/resources/mapper/ScreenManagementMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/screen-management/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/screenManagementRoutes.ts, backend-node/src/controllers/screenManagementController.ts ### task-23: Screen Standard API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ScreenStandardController.java, backend-spring/src/main/java/com/erp/service/ScreenStandardService.java, backend-spring/src/main/java/com/erp/mapper/ScreenStandardMapper.java, backend-spring/src/main/resources/mapper/ScreenStandardMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/screen-standard/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/screenStandardRoutes.ts ### task-24: Screen File API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ScreenFileController.java, backend-spring/src/main/java/com/erp/service/ScreenFileService.java, backend-spring/src/main/java/com/erp/mapper/ScreenFileMapper.java, backend-spring/src/main/resources/mapper/ScreenFileMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/screen-file/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/screenFileRoutes.ts ### task-25: Screen Group API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ScreenGroupController.java, backend-spring/src/main/java/com/erp/service/ScreenGroupService.java, backend-spring/src/main/java/com/erp/mapper/ScreenGroupMapper.java, backend-spring/src/main/resources/mapper/ScreenGroupMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/screen-group/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/screenGroupRoutes.ts ### task-26: Screen Embedding API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ScreenEmbeddingController.java, backend-spring/src/main/java/com/erp/service/ScreenEmbeddingService.java, backend-spring/src/main/java/com/erp/mapper/ScreenEmbeddingMapper.java, backend-spring/src/main/resources/mapper/ScreenEmbeddingMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/screen-embedding/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/screenEmbeddingRoutes.ts ### task-27: Layout API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/LayoutController.java, backend-spring/src/main/java/com/erp/service/LayoutService.java, backend-spring/src/main/java/com/erp/mapper/LayoutMapper.java, backend-spring/src/main/resources/mapper/LayoutMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/layout/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/layoutRoutes.ts, backend-node/src/controllers/layoutController.ts ### task-28: Web Type Standard API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/WebTypeStandardController.java, backend-spring/src/main/java/com/erp/service/WebTypeStandardService.java, backend-spring/src/main/java/com/erp/mapper/WebTypeStandardMapper.java, backend-spring/src/main/resources/mapper/WebTypeStandardMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/web-type-standard/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/webTypeStandardRoutes.ts # ============================================================ # Dataflow/Flow # ============================================================ ### task-29: Dataflow API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DataflowController.java, backend-spring/src/main/java/com/erp/service/DataflowService.java, backend-spring/src/main/java/com/erp/mapper/DataflowMapper.java, backend-spring/src/main/resources/mapper/DataflowMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/dataflow/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dataflowRoutes.ts, backend-node/src/controllers/dataflowController.ts, backend-node/src/services/dataflowService.ts ### task-30: Dataflow Diagram API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DataflowDiagramController.java, backend-spring/src/main/java/com/erp/service/DataflowDiagramService.java, backend-spring/src/main/java/com/erp/mapper/DataflowDiagramMapper.java, backend-spring/src/main/resources/mapper/DataflowDiagramMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/dataflow-diagram/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dataflowDiagramRoutes.ts, backend-node/src/controllers/dataflowDiagramController.ts, backend-node/src/services/dataflowDiagramService.ts ### task-31: Dataflow Execution API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DataflowExecutionController.java, backend-spring/src/main/java/com/erp/service/DataflowExecutionService.java, backend-spring/src/main/java/com/erp/mapper/DataflowExecutionMapper.java, backend-spring/src/main/resources/mapper/DataflowExecutionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/dataflow-execution/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dataflowExecutionRoutes.ts, backend-node/src/controllers/dataflowExecutionController.ts ### task-32: Flow API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/FlowController.java, backend-spring/src/main/java/com/erp/service/FlowService.java, backend-spring/src/main/java/com/erp/mapper/FlowMapper.java, backend-spring/src/main/resources/mapper/FlowMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/flow/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/flowRoutes.ts, backend-node/src/controllers/flowController.ts ### task-33: Flow External DB Connection API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/FlowExternalDbConnectionController.java, backend-spring/src/main/java/com/erp/service/FlowExternalDbConnectionService.java, backend-spring/src/main/java/com/erp/mapper/FlowExternalDbConnectionMapper.java, backend-spring/src/main/resources/mapper/FlowExternalDbConnectionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/flow-external-db-connection/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/flowExternalDbConnectionRoutes.ts ### task-34: Button Dataflow API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ButtonDataflowController.java, backend-spring/src/main/java/com/erp/service/ButtonDataflowService.java, backend-spring/src/main/java/com/erp/mapper/ButtonDataflowMapper.java, backend-spring/src/main/resources/mapper/ButtonDataflowMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/button-dataflow/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/buttonDataflowRoutes.ts, backend-node/src/controllers/buttonDataflowController.ts ### task-35: Test Button Dataflow API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/TestButtonDataflowController.java, backend-spring/src/main/java/com/erp/service/TestButtonDataflowService.java, backend-spring/src/main/java/com/erp/mapper/TestButtonDataflowMapper.java, backend-spring/src/main/resources/mapper/TestButtonDataflowMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/test-button-dataflow/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/testButtonDataflowRoutes.ts ### task-36: Node Flow API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/NodeFlowController.java, backend-spring/src/main/java/com/erp/service/NodeFlowService.java, backend-spring/src/main/java/com/erp/mapper/NodeFlowMapper.java, backend-spring/src/main/resources/mapper/NodeFlowMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/dataflow/node-flows) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dataflow/node-flows.ts, backend-node/src/services/nodeFlowExecutionService.ts - context: | Node-based dataflow CRUD + Execute API. Endpoints: GET / (List), GET /:flowId (Detail), POST / (Create), PUT / (Modification), DELETE /:flowId (Deletion), GET /:flowId/source-table (source table extraction), POST /:flowId/execute (Execute). flow_data JSON, includes topology summary extraction logic. ### task-37: Node External Connection API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/NodeExternalConnectionController.java, backend-spring/src/main/java/com/erp/service/NodeExternalConnectionService.java, backend-spring/src/main/java/com/erp/mapper/NodeExternalConnectionMapper.java, backend-spring/src/main/resources/mapper/NodeExternalConnectionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/dataflow/node-external-connections/tested) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dataflow/node-external-connections.ts, backend-node/src/services/externalDbConnectionService.ts - context: | External DB connection for node flows API. Endpoints: GET /tested (tested connection List), GET /:id/tables (external DB table List), GET /:id/tables/:tableName/columns (external DB table column List). Connection test in chunks (3 parallel) with 3s timeout. # ============================================================ # Common Code/Config (task-38 ~ task-44) # ============================================================ ### task-38: Common Code API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CommonCodeController.java, backend-spring/src/main/java/com/erp/service/CommonCodeService.java, backend-spring/src/main/java/com/erp/mapper/CommonCodeMapper.java, backend-spring/src/main/resources/mapper/CommonCodeMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/common-code/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/commonCodeRoutes.ts, backend-node/src/controllers/commonCodeController.ts, backend-node/src/services/commonCodeService.ts ### task-39: Multilang i18n API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MultilangController.java, backend-spring/src/main/java/com/erp/service/MultilangService.java, backend-spring/src/main/java/com/erp/mapper/MultilangMapper.java, backend-spring/src/main/resources/mapper/MultilangMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/multilang/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/multilangRoutes.ts ### task-40: Component Standard API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ComponentStandardController.java, backend-spring/src/main/java/com/erp/service/ComponentStandardService.java, backend-spring/src/main/java/com/erp/mapper/ComponentStandardMapper.java, backend-spring/src/main/resources/mapper/ComponentStandardMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/component-standard/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/componentStandardRoutes.ts, backend-node/src/services/componentStandardService.ts ### task-41: Template Standard API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/TemplateStandardController.java, backend-spring/src/main/java/com/erp/service/TemplateStandardService.java, backend-spring/src/main/java/com/erp/mapper/TemplateStandardMapper.java, backend-spring/src/main/resources/mapper/TemplateStandardMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/template-standard/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/templateStandardRoutes.ts ### task-42: Button Action Standard API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ButtonActionStandardController.java, backend-spring/src/main/java/com/erp/service/ButtonActionStandardService.java, backend-spring/src/main/java/com/erp/mapper/ButtonActionStandardMapper.java, backend-spring/src/main/resources/mapper/ButtonActionStandardMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/button-action-standard/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/buttonActionStandardRoutes.ts, backend-node/src/controllers/buttonActionStandardController.ts ### task-43: Dynamic Form API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DynamicFormController.java, backend-spring/src/main/java/com/erp/service/DynamicFormService.java, backend-spring/src/main/java/com/erp/mapper/DynamicFormMapper.java, backend-spring/src/main/resources/mapper/DynamicFormMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/dynamic-form/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dynamicFormRoutes.ts, backend-node/src/services/dynamicFormService.ts ### task-44: Category Tree API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CategoryTreeController.java, backend-spring/src/main/java/com/erp/service/CategoryTreeService.java, backend-spring/src/main/java/com/erp/mapper/CategoryTreeMapper.java, backend-spring/src/main/resources/mapper/CategoryTreeMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/category-tree/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/categoryTreeRoutes.ts, backend-node/src/services/categoryTreeService.ts # ============================================================ # Finance/Tax — BigDecimal Core (task-45 ~ task-51) # ============================================================ ### task-45: Tax Invoice Tax Invoice API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/TaxInvoiceController.java, backend-spring/src/main/java/com/erp/service/TaxInvoiceService.java, backend-spring/src/main/java/com/erp/mapper/TaxInvoiceMapper.java, backend-spring/src/main/resources/mapper/TaxInvoiceMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/tax-invoice/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/taxInvoiceRoutes.ts, backend-node/src/controllers/taxInvoiceController.ts, backend-node/src/services/taxInvoiceService.ts - context: | Tax Invoice = BigDecimal most critical domain. Supply amount, tax, total all BigDecimal Required. DecimalUtils.parse()via DB string conversion. tax = supplyAmount * taxRate (scale 4, HALF_UP). ### task-46: BOM Management API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/BomController.java, backend-spring/src/main/java/com/erp/service/BomService.java, backend-spring/src/main/java/com/erp/mapper/BomMapper.java, backend-spring/src/main/resources/mapper/BomMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/bom/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/bomRoutes.ts, backend-node/src/controllers/bomController.ts, backend-node/src/services/bomService.ts - context: | BOM part qty * unit price → total = BigDecimal. Recursive sub-part cost aggregation. Preventing cumulative decimal errors is key. ### task-47: Production ProductionPlan API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/ProductionController.java, backend-spring/src/main/java/com/erp/service/ProductionService.java, backend-spring/src/main/java/com/erp/mapper/ProductionMapper.java, backend-spring/src/main/resources/mapper/ProductionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/production/plans) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/productionRoutes.ts, backend-node/src/controllers/productionController.ts - context: | qty, unit price, amount fields all BigDecimal. ### task-48: Sales Report Sales Report API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/SalesReportController.java, backend-spring/src/main/java/com/erp/service/SalesReportService.java, backend-spring/src/main/java/com/erp/mapper/SalesReportMapper.java, backend-spring/src/main/resources/mapper/SalesReportMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/sales-report/summary) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/salesReportRoutes.ts, backend-node/src/controllers/salesReportController.ts - context: | Sales total, avg unit price aggregate ops BigDecimal. ### task-49: Analytics Report API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/AnalyticsReportController.java, backend-spring/src/main/java/com/erp/service/AnalyticsReportService.java, backend-spring/src/main/java/com/erp/mapper/AnalyticsReportMapper.java, backend-spring/src/main/resources/mapper/AnalyticsReportMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/report/production/summary) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/analyticsReportRoutes.ts, backend-node/src/controllers/analyticsReportController.ts ### task-50: Delivery Delivery API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/DeliveryController.java, backend-spring/src/main/java/com/erp/service/DeliveryService.java, backend-spring/src/main/java/com/erp/mapper/DeliveryMapper.java, backend-spring/src/main/resources/mapper/DeliveryMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/delivery/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/deliveryRoutes.ts, backend-node/src/controllers/deliveryController.ts, backend-node/src/services/deliveryService.ts ### task-51: Packaging Packaging API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/PackagingController.java, backend-spring/src/main/java/com/erp/service/PackagingService.java, backend-spring/src/main/java/com/erp/mapper/PackagingMapper.java, backend-spring/src/main/resources/mapper/PackagingMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/packaging/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/packagingRoutes.ts # ============================================================ # external Connection (task-52 ~ task-57) # ============================================================ ### task-52: External DB Connection API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ExternalDbConnectionController.java, backend-spring/src/main/java/com/erp/service/ExternalDbConnectionService.java, backend-spring/src/main/java/com/erp/mapper/ExternalDbConnectionMapper.java, backend-spring/src/main/resources/mapper/ExternalDbConnectionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/external-db-connection/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/externalDbConnectionRoutes.ts, backend-node/src/services/externalDbConnectionService.ts ### task-53: External REST API Connection API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ExternalRestApiConnectionController.java, backend-spring/src/main/java/com/erp/service/ExternalRestApiConnectionService.java, backend-spring/src/main/java/com/erp/mapper/ExternalRestApiConnectionMapper.java, backend-spring/src/main/resources/mapper/ExternalRestApiConnectionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/external-rest-api-connection/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/externalRestApiConnectionRoutes.ts, backend-node/src/services/externalRestApiConnectionService.ts ### task-54: External Call API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ExternalCallController.java, backend-spring/src/main/java/com/erp/service/ExternalCallService.java, backend-spring/src/main/java/com/erp/mapper/ExternalCallMapper.java, backend-spring/src/main/resources/mapper/ExternalCallMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/external-call/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/externalCallRoutes.ts, backend-node/src/services/externalCallService.ts ### task-55: External Call Config API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ExternalCallConfigController.java, backend-spring/src/main/java/com/erp/service/ExternalCallConfigService.java, backend-spring/src/main/java/com/erp/mapper/ExternalCallConfigMapper.java, backend-spring/src/main/resources/mapper/ExternalCallConfigMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/external-call-config/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/externalCallConfigRoutes.ts, backend-node/src/services/externalCallConfigService.ts ### task-56: Multi Connection API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MultiConnectionController.java, backend-spring/src/main/java/com/erp/service/MultiConnectionService.java, backend-spring/src/main/java/com/erp/mapper/MultiConnectionMapper.java, backend-spring/src/main/resources/mapper/MultiConnectionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/multi-connection/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/multiConnectionRoutes.ts ### task-57: OpenAPI Proxy API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/OpenApiProxyController.java, backend-spring/src/main/java/com/erp/service/OpenApiProxyService.java, backend-spring/src/main/java/com/erp/mapper/OpenApiProxyMapper.java, backend-spring/src/main/resources/mapper/OpenApiProxyMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/open-api-proxy/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/openApiProxyRoutes.ts # ============================================================ # Batch/Schedule (task-58 ~ task-64) # ============================================================ ### task-58: Batch API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/BatchController.java, backend-spring/src/main/java/com/erp/service/BatchService.java, backend-spring/src/main/java/com/erp/mapper/BatchMapper.java, backend-spring/src/main/resources/mapper/BatchMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/batch/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/batchRoutes.ts, backend-node/src/controllers/batchController.ts, backend-node/src/services/batchService.ts ### task-59: Batch Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/BatchManagementController.java, backend-spring/src/main/java/com/erp/service/BatchManagementService.java, backend-spring/src/main/java/com/erp/mapper/BatchManagementMapper.java, backend-spring/src/main/resources/mapper/BatchManagementMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/batch-management/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/batchManagementRoutes.ts, backend-node/src/controllers/batchManagementController.ts, backend-node/src/services/batchManagementService.ts ### task-60: Batch Execution Log API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/BatchExecutionLogController.java, backend-spring/src/main/java/com/erp/service/BatchExecutionLogService.java, backend-spring/src/main/java/com/erp/mapper/BatchExecutionLogMapper.java, backend-spring/src/main/resources/mapper/BatchExecutionLogMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/batch-execution-log/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/batchExecutionLogRoutes.ts, backend-node/src/controllers/batchExecutionLogController.ts, backend-node/src/services/batchExecutionLogService.ts ### task-61: Schedule API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ScheduleController.java, backend-spring/src/main/java/com/erp/service/ScheduleService.java, backend-spring/src/main/java/com/erp/mapper/ScheduleMapper.java, backend-spring/src/main/resources/mapper/ScheduleMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/schedule/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/scheduleRoutes.ts ### task-62: Numbering Rule Numbering API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/NumberingRuleController.java, backend-spring/src/main/java/com/erp/service/NumberingRuleService.java, backend-spring/src/main/java/com/erp/mapper/NumberingRuleMapper.java, backend-spring/src/main/resources/mapper/NumberingRuleMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/numbering-rule/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/numberingRuleRoutes.ts ### task-63: Process Work Standard API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ProcessWorkStandardController.java, backend-spring/src/main/java/com/erp/service/ProcessWorkStandardService.java, backend-spring/src/main/java/com/erp/mapper/ProcessWorkStandardMapper.java, backend-spring/src/main/resources/mapper/ProcessWorkStandardMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/process-work-standard/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/processWorkStandardRoutes.ts ### task-64: Code Merge API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CodeMergeController.java, backend-spring/src/main/java/com/erp/service/CodeMergeService.java, backend-spring/src/main/java/com/erp/mapper/CodeMergeMapper.java, backend-spring/src/main/resources/mapper/CodeMergeMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/code-merge/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/codeMergeRoutes.ts # ============================================================ # Mail (task-65 ~ task-69) # ============================================================ ### task-65: Mail Account File API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MailAccountFileController.java, backend-spring/src/main/java/com/erp/service/MailAccountFileService.java, backend-spring/src/main/java/com/erp/mapper/MailAccountFileMapper.java, backend-spring/src/main/resources/mapper/MailAccountFileMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/mail-account-file/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/mailAccountFileRoutes.ts, backend-node/src/controllers/mailAccountFileController.ts ### task-66: Mail Receive Basic API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MailReceiveBasicController.java, backend-spring/src/main/java/com/erp/service/MailReceiveBasicService.java, backend-spring/src/main/java/com/erp/mapper/MailReceiveBasicMapper.java, backend-spring/src/main/resources/mapper/MailReceiveBasicMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/mail-receive-basic/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/mailReceiveBasicRoutes.ts ### task-67: Mail Send Simple API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MailSendSimpleController.java, backend-spring/src/main/java/com/erp/service/MailSendSimpleService.java, backend-spring/src/main/java/com/erp/mapper/MailSendSimpleMapper.java, backend-spring/src/main/resources/mapper/MailSendSimpleMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/mail-send-simple/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/mailSendSimpleRoutes.ts ### task-68: Mail Sent History API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MailSentHistoryController.java, backend-spring/src/main/java/com/erp/service/MailSentHistoryService.java, backend-spring/src/main/java/com/erp/mapper/MailSentHistoryMapper.java, backend-spring/src/main/resources/mapper/MailSentHistoryMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/mail-sent-history/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/mailSentHistoryRoutes.ts ### task-69: Mail Template File API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MailTemplateFileController.java, backend-spring/src/main/java/com/erp/service/MailTemplateFileService.java, backend-spring/src/main/java/com/erp/mapper/MailTemplateFileMapper.java, backend-spring/src/main/resources/mapper/MailTemplateFileMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/mail-template-file/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/mailTemplateFileRoutes.ts # ============================================================ # Chain/Cascading (task-70 ~ task-75) # ============================================================ ### task-70: Cascading Relation API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CascadingRelationController.java, backend-spring/src/main/java/com/erp/service/CascadingRelationService.java, backend-spring/src/main/java/com/erp/mapper/CascadingRelationMapper.java, backend-spring/src/main/resources/mapper/CascadingRelationMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/cascading-relation/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/cascadingRelationRoutes.ts ### task-71: Cascading Auto Fill API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CascadingAutoFillController.java, backend-spring/src/main/java/com/erp/service/CascadingAutoFillService.java, backend-spring/src/main/java/com/erp/mapper/CascadingAutoFillMapper.java, backend-spring/src/main/resources/mapper/CascadingAutoFillMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/cascading-auto-fill/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/cascadingAutoFillRoutes.ts ### task-72: Cascading Condition API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CascadingConditionController.java, backend-spring/src/main/java/com/erp/service/CascadingConditionService.java, backend-spring/src/main/java/com/erp/mapper/CascadingConditionMapper.java, backend-spring/src/main/resources/mapper/CascadingConditionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/cascading-condition/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/cascadingConditionRoutes.ts ### task-73: Cascading Mutual Exclusion API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CascadingMutualExclusionController.java, backend-spring/src/main/java/com/erp/service/CascadingMutualExclusionService.java, backend-spring/src/main/java/com/erp/mapper/CascadingMutualExclusionMapper.java, backend-spring/src/main/resources/mapper/CascadingMutualExclusionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/cascading-mutual-exclusion/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/cascadingMutualExclusionRoutes.ts ### task-74: Cascading Hierarchy API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CascadingHierarchyController.java, backend-spring/src/main/java/com/erp/service/CascadingHierarchyService.java, backend-spring/src/main/java/com/erp/mapper/CascadingHierarchyMapper.java, backend-spring/src/main/resources/mapper/CascadingHierarchyMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/cascading-hierarchy/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/cascadingHierarchyRoutes.ts ### task-75: Category Value Cascading API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CategoryValueCascadingController.java, backend-spring/src/main/java/com/erp/service/CategoryValueCascadingService.java, backend-spring/src/main/java/com/erp/mapper/CategoryValueCascadingMapper.java, backend-spring/src/main/resources/mapper/CategoryValueCascadingMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/category-value-cascading/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/categoryValueCascadingRoutes.ts # ============================================================ # Logistics/Vehicle (task-76 ~ task-83) # ============================================================ ### task-76: Shipping Plan API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/ShippingPlanController.java, backend-spring/src/main/java/com/erp/service/ShippingPlanService.java, backend-spring/src/main/java/com/erp/mapper/ShippingPlanMapper.java, backend-spring/src/main/resources/mapper/ShippingPlanMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/shipping-plan/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/shippingPlanRoutes.ts ### task-77: Shipping Order API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/ShippingOrderController.java, backend-spring/src/main/java/com/erp/service/ShippingOrderService.java, backend-spring/src/main/java/com/erp/mapper/ShippingOrderMapper.java, backend-spring/src/main/resources/mapper/ShippingOrderMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/shipping-order/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/shippingOrderRoutes.ts ### task-78: Booking API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/BookingController.java, backend-spring/src/main/java/com/erp/service/BookingService.java, backend-spring/src/main/java/com/erp/mapper/BookingMapper.java, backend-spring/src/main/resources/mapper/BookingMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/booking/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/bookingRoutes.ts, backend-node/src/services/bookingService.ts ### task-79: Driver API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DriverController.java, backend-spring/src/main/java/com/erp/service/DriverService.java, backend-spring/src/main/java/com/erp/mapper/DriverMapper.java, backend-spring/src/main/resources/mapper/DriverMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/driver/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/driverRoutes.ts, backend-node/src/controllers/driverController.ts ### task-80: Vehicle API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/VehicleController.java, backend-spring/src/main/java/com/erp/service/VehicleService.java, backend-spring/src/main/java/com/erp/mapper/VehicleMapper.java, backend-spring/src/main/resources/mapper/VehicleMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/vehicle/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/vehicleRoutes.ts ### task-81: Vehicle Trip API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/VehicleTripController.java, backend-spring/src/main/java/com/erp/service/VehicleTripService.java, backend-spring/src/main/java/com/erp/mapper/VehicleTripMapper.java, backend-spring/src/main/resources/mapper/VehicleTripMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/vehicle-trip/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/vehicleTripRoutes.ts ### task-82: Yard Layout API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/YardLayoutController.java, backend-spring/src/main/java/com/erp/service/YardLayoutService.java, backend-spring/src/main/java/com/erp/mapper/YardLayoutMapper.java, backend-spring/src/main/resources/mapper/YardLayoutMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/yard-layout/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/yardLayoutRoutes.ts, backend-node/src/controllers/YardLayoutController.ts, backend-node/src/services/YardLayoutService.ts ### task-83: Digital Twin API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DigitalTwinController.java, backend-spring/src/main/java/com/erp/service/DigitalTwinService.java, backend-spring/src/main/java/com/erp/mapper/DigitalTwinMapper.java, backend-spring/src/main/resources/mapper/DigitalTwinMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/digital-twin/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/digitalTwinRoutes.ts # ============================================================ # Report/Dashboard (task-84 ~ task-90) # ============================================================ ### task-84: Dashboard API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DashboardController.java, backend-spring/src/main/java/com/erp/service/DashboardService.java, backend-spring/src/main/java/com/erp/mapper/DashboardMapper.java, backend-spring/src/main/resources/mapper/DashboardMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/dashboard/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dashboardRoutes.ts, backend-node/src/controllers/DashboardController.ts, backend-node/src/services/DashboardService.ts ### task-85: Report API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ReportController.java, backend-spring/src/main/java/com/erp/service/ReportService.java, backend-spring/src/main/java/com/erp/mapper/ReportMapper.java, backend-spring/src/main/resources/mapper/ReportMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/report/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/reportRoutes.ts ### task-86: Barcode Label API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/BarcodeLabelController.java, backend-spring/src/main/java/com/erp/service/BarcodeLabelService.java, backend-spring/src/main/java/com/erp/mapper/BarcodeLabelMapper.java, backend-spring/src/main/resources/mapper/BarcodeLabelMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/barcode-label/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/barcodeLabelRoutes.ts, backend-node/src/controllers/barcodeLabelController.ts, backend-node/src/services/barcodeLabelService.ts ### task-87: Map Data API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MapDataController.java, backend-spring/src/main/java/com/erp/service/MapDataService.java, backend-spring/src/main/java/com/erp/mapper/MapDataMapper.java, backend-spring/src/main/resources/mapper/MapDataMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/map-data/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/mapDataRoutes.ts ### task-88: Excel Mapping API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/ExcelMappingController.java, backend-spring/src/main/java/com/erp/service/ExcelMappingService.java, backend-spring/src/main/java/com/erp/mapper/ExcelMappingMapper.java, backend-spring/src/main/resources/mapper/ExcelMappingMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/excel-mapping/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/excelMappingRoutes.ts, backend-node/src/services/excelMappingService.ts ### task-89: Risk Alert API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/RiskAlertController.java, backend-spring/src/main/java/com/erp/service/RiskAlertService.java, backend-spring/src/main/java/com/erp/mapper/RiskAlertMapper.java, backend-spring/src/main/resources/mapper/RiskAlertMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/risk-alert/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/riskAlertRoutes.ts ### task-90: Todo API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/TodoController.java, backend-spring/src/main/java/com/erp/service/TodoService.java, backend-spring/src/main/java/com/erp/mapper/TodoMapper.java, backend-spring/src/main/resources/mapper/TodoMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/todo/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/todoRoutes.ts # ============================================================ # Data Generic CRUD (task-91 ~ task-92) — split: dataRoutes 1270 lines + dataService 1540 lines # ============================================================ ### task-91: Data Generic CRUD — Basic Query/Registration [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DataController.java, backend-spring/src/main/java/com/erp/service/DataService.java, backend-spring/src/main/java/com/erp/mapper/DataMapper.java, backend-spring/src/main/resources/mapper/DataMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/data/test_table) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dataRoutes.ts, backend-node/src/services/dataService.ts - context: | Low-code Generic CRUD basic features. dataRoutes.ts(1270 lines) + dataService.ts(1540 lines) split 1/2. Endpoints: - GET /api/data/{tableName} (table data query, paging/filter/sort) - GET /api/data/{tableName}/columns (column meta query) - GET /api/data/{tableName}/{id} (single record detail) - POST /api/data/{tableName} (single INSERT) - PUT /api/data/{tableName}/{id} (single UPDATE) - DELETE /api/data/{tableName}/{id} (single DELETE) - GET /api/data/join (join query) DataService: getTableData, getTableColumns, getRecordDetail, createRecord, updateRecord, deleteRecord, getJoinedData. Dynamic table name → SQL injection prevention via whitelist required. ### task-92: Data Generic CRUD — Advanced (Bulk/Excel/Transaction) [backend] - depends: task-91 - files: backend-spring/src/main/java/com/erp/controller/DataAdvancedController.java, backend-spring/src/main/java/com/erp/service/DataAdvancedService.java, backend-spring/src/main/java/com/erp/mapper/DataAdvancedMapper.java, backend-spring/src/main/resources/mapper/DataAdvancedMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_POST(/api/data/upsert-grouped, {"groups":[]}) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/dataRoutes.ts, backend-node/src/services/dataService.ts - context: | Low-code Generic CRUD advanced features. dataRoutes.ts + dataService.ts split 2/2. Endpoints: - POST /api/data/upsert-grouped (grouped upsert — multi-table transaction) - POST /api/data/{tableName}/delete (conditional bulk delete) - POST /api/data/{tableName}/delete-group (grouped bulk delete) - GET /api/data/multi-table/auto-detect (multi-table auto-detect) - POST /api/data/multi-table/upload (multi-table Excel upload) - GET /api/data/master-detail/relation/:screenId (master-detail relation query) - POST /api/data/master-detail/download (master-detail Excel download) - POST /api/data/master-detail/upload (master-detail Excel upload) - POST /api/data/master-detail/upload-simple (simple Excel upload) DataAdvancedService: upsertGroupedRecords, deleteGroupRecords, master-detail/multi-table Excel processing. @Transactional required. Injects task-91's DataService for basic CRUD delegation. # ============================================================ # Other Backend (task-93 ~ task-99) # ============================================================ ### task-93: POP Action API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/PopActionController.java, backend-spring/src/main/java/com/erp/service/PopActionService.java, backend-spring/src/main/java/com/erp/mapper/PopActionMapper.java, backend-spring/src/main/resources/mapper/PopActionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/pop-action/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/popActionRoutes.ts ### task-94: POP Production API [backend] - depends: task-2, task-5 - files: backend-spring/src/main/java/com/erp/controller/PopProductionController.java, backend-spring/src/main/java/com/erp/service/PopProductionService.java, backend-spring/src/main/java/com/erp/mapper/PopProductionMapper.java, backend-spring/src/main/resources/mapper/PopProductionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/pop-production/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/popProductionRoutes.ts ### task-95: Work History API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/WorkHistoryController.java, backend-spring/src/main/java/com/erp/service/WorkHistoryService.java, backend-spring/src/main/java/com/erp/mapper/WorkHistoryMapper.java, backend-spring/src/main/resources/mapper/WorkHistoryMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/work-history/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/workHistoryRoutes.ts ### task-96: Mold Mold Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/MoldController.java, backend-spring/src/main/java/com/erp/service/MoldService.java, backend-spring/src/main/java/com/erp/mapper/MoldMapper.java, backend-spring/src/main/resources/mapper/MoldMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/mold/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/moldRoutes.ts ### task-97: Design Design Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/DesignController.java, backend-spring/src/main/java/com/erp/service/DesignService.java, backend-spring/src/main/java/com/erp/mapper/DesignMapper.java, backend-spring/src/main/resources/mapper/DesignMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/design/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/designRoutes.ts, backend-node/src/controllers/designController.ts ### task-98: Collection Collection Management API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/CollectionController.java, backend-spring/src/main/java/com/erp/service/CollectionService.java, backend-spring/src/main/java/com/erp/mapper/CollectionMapper.java, backend-spring/src/main/resources/mapper/CollectionMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/collection/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/collectionRoutes.ts, backend-node/src/services/collectionService.ts ### task-99: AI Assistant Proxy API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/AiAssistantProxyController.java, backend-spring/src/main/java/com/erp/service/AiAssistantProxyService.java, backend-spring/src/main/java/com/erp/mapper/AiAssistantProxyMapper.java, backend-spring/src/main/resources/mapper/AiAssistantProxyMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/ai-assistant/status) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/aiAssistantProxy.ts ### task-100: File Upload/Download API [backend] - depends: task-5 - files: backend-spring/src/main/java/com/erp/controller/FileController.java, backend-spring/src/main/java/com/erp/service/FileService.java, backend-spring/src/main/java/com/erp/mapper/FileMapper.java, backend-spring/src/main/resources/mapper/FileMapper.xml - test: cd backend-spring && ./gradlew compileJava 2>&1 | tail -20 - api_test: $LOGIN && $API_GET(/api/file/list) && $EXPECT_SUCCESS - ref_files: backend-node/src/routes/fileRoutes.ts, backend-node/src/controllers/fileController.ts - context: | Existing multer → Spring Multipart conversion. File upload/download/delete CRUD. # ============================================================ # Frontend API Integration (task-101 ~ task-102) # ============================================================ ### task-101: Frontend API Client baseURL Change [frontend] # NOTE: task-100 = last backend task. Executes after all APIs complete. - depends: task-100 - files: frontend/lib/api/client.ts - test: cd frontend && npx tsc --noEmit --pretty 2>&1 | head -50 - browser_test: | "http://localhost:9771 Access → Login (wace / qlalfqjsgh11) → Dashboard Load check → Left menu displays correctly" - context: | Change API baseURL to Spring Boot server (8081). Env var NEXT_PUBLIC_API_URL or client.ts baseURL modification. Minimal frontend code change. URL patterns and response format are identical, only baseURL needs to change. ### task-102: Frontend Integration E2E Verification [frontend] # NOTE: Depends on task-101 (last FE task). Executes after all complete. - depends: task-101 - files: frontend/lib/api/client.ts - browser_test: | "http://localhost:9771 access (backend: Spring Boot 8081) → Login (wace / qlalfqjsgh11) → Dashboard load check → BOM Management menu → list display check → Tax Invoice menu → list display check → amount field decimal check → Production Plan menu → list display check → Sales Report → total amount check" - context: | Spring Boot server 8081 running state, Frontend integration final check. Finance-related screens, BigDecimal precision visual check.