diff --git a/src/main/java/com/factoreal/backend/controller/SensorController.java b/src/main/java/com/factoreal/backend/controller/SensorController.java deleted file mode 100644 index 30cf0088..00000000 --- a/src/main/java/com/factoreal/backend/controller/SensorController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.factoreal.backend.controller; - -import com.factoreal.backend.dto.SensorDto; -import com.factoreal.backend.dto.SensorUpdateDto; -import com.factoreal.backend.service.SensorService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/api/sensors") -@Tag(name = "센서 정보 API", description = "센서 정보 처리 API입니다.") -public class SensorController { - - private final SensorService service; - - public SensorController(SensorService service) { - this.service = service; - } - - // // 센서 등록 (임시 코드) - // @PostMapping - // // @Operation(summary = "센서 등록 (임시 기능)", description = "센서 정보를 수동으로 등록하는 임시 메서드", hidden = true) - // @Operation(summary = "센서 등록 (임시 기능)", description = "센서 정보를 수동으로 등록하는 임시 메서드", hidden = false) - // public ResponseEntity> createSensor(@RequestBody SensorDto dto) { - // Map response = new HashMap<>(); - // try { - // Sensor sens = service.saveSensor(dto); - // response.put("success", true); - // return ResponseEntity.ok(response); - // } catch (Exception e) { - // response.put("success", false); - // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response); - // } - // } - - // 전체 센서 리스트 조회 ( BE -> FE 센서ID, 센서종류 넘기기 ) - @GetMapping - @Operation(summary = "전체 센서 리스트 조회", description = "전체 센서 정보를 조회하는 기능") - public ResponseEntity> list() { - return ResponseEntity.ok(service.getAllSensors()); - } - - // DB Sensor Table 업데이트 ( FE -> BE 센서ID 매핑해서 센서목적, 위치, 임계치 업데이트 ) - @PostMapping("/{sensorId}") - @Operation(summary = "센서 정보 업데이트", description = "센서ID 매핑해서 임계치(sensorThres)와 허용치(allowVal) 업데이트 (FE -> BE) ") - public ResponseEntity update( - @PathVariable("sensorId") String sensorId, - @RequestBody SensorUpdateDto dto) { - service.updateSensor(sensorId, dto); - return ResponseEntity.noContent().build(); - } -} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/controller/SystemLogController.java b/src/main/java/com/factoreal/backend/controller/SystemLogController.java deleted file mode 100644 index dfeb3839..00000000 --- a/src/main/java/com/factoreal/backend/controller/SystemLogController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.factoreal.backend.controller; - -import com.factoreal.backend.dto.abnormalLog.AbnormalPagingDto; -import com.factoreal.backend.dto.abnormalLog.SystemLogResponseDto; -import com.factoreal.backend.service.AbnormalLogService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@Tag(name = "시스템 로그 API", description = "공간별 시스템 로그 조회 API") -@RestController -@RequestMapping("/api/system-logs") -@RequiredArgsConstructor -public class SystemLogController { - private final AbnormalLogService abnormalLogService; - - @Operation(summary = "공간별 시스템 로그 조회", description = "특정 공간(zone)의 시스템 로그를 페이징 처리하여 조회합니다.") - @GetMapping("/zone/{zoneId}") - public ResponseEntity> getSystemLogsByZone( - @Parameter(description = "조회할 공간 ID", required = true) - @PathVariable String zoneId, - @Parameter(description = "페이징 정보 (page: 페이지 번호, size: 페이지 크기)") - @ModelAttribute AbnormalPagingDto pagingDto) { - Page logs = abnormalLogService.findSystemLogsByZoneId(zoneId, pagingDto); - return ResponseEntity.ok(logs); - } -} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/controller/ZoneController.java b/src/main/java/com/factoreal/backend/controller/ZoneController.java deleted file mode 100644 index 77d24d1f..00000000 --- a/src/main/java/com/factoreal/backend/controller/ZoneController.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.factoreal.backend.controller; - -import java.util.List; -import java.util.Map; - -import com.factoreal.backend.dto.ZoneItemDto; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.factoreal.backend.dto.ZoneDto; -import com.factoreal.backend.dto.ZoneUpdateDto; -import com.factoreal.backend.service.ZoneService; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; - -import org.springframework.web.bind.annotation.RequestBody; -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/api/zones") -@RequiredArgsConstructor -@Tag(name = "공간 정보 API", description = "공간(Zone) 매핑 처리 API") -public class ZoneController { - private final ZoneService service; - - @PostMapping - @Operation(summary = "공간 생성", description = "UI에서 입력한 공간명으로 Zone을 등록하고 고유 zoneId를 생성하여 반환합니다.") - public ResponseEntity createZone(@RequestBody Map req) { - // 1. 공간명 받아오기 - String zoneName = req.get("zoneName"); - // 2. service 호출 - ZoneDto created = service.createZone(zoneName); - // 3. 201 CREATED 응답으로 DTO 반환 - return ResponseEntity.status(HttpStatus.CREATED).body(created); - } - - @PostMapping("/{zoneName}") - @Operation(summary = "공간 정보 수정", description = "기존 공간의 이름을 수정합니다.") - public ResponseEntity updateZone( - @PathVariable String zoneName, - @RequestBody ZoneUpdateDto dto) { - ZoneDto updated = service.updateZone(zoneName, dto); - return ResponseEntity.ok(updated); - } - - @GetMapping - @Operation(summary = "공간 리스트 조회", description = "등록된 모든 공간 정보를 조회합니다.") - public ResponseEntity> listZones() { - List list = service.getAllZones(); - return ResponseEntity.ok(list); - } - - @GetMapping("/zoneitems") - @Operation(summary = "공간별 설비,센서 데이터 조회", description = "등록된 공간들의 각 정보를 조회합니다.") - public ResponseEntity> listZoneItems() { - return ResponseEntity.ok(service.getZoneItems()); - } -} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/controller/AbnormalController.java b/src/main/java/com/factoreal/backend/domain/abnormalLog/api/AbnormalController.java similarity index 68% rename from src/main/java/com/factoreal/backend/controller/AbnormalController.java rename to src/main/java/com/factoreal/backend/domain/abnormalLog/api/AbnormalController.java index 9cfbbdd0..291ac94c 100644 --- a/src/main/java/com/factoreal/backend/controller/AbnormalController.java +++ b/src/main/java/com/factoreal/backend/domain/abnormalLog/api/AbnormalController.java @@ -1,8 +1,8 @@ -package com.factoreal.backend.controller; +package com.factoreal.backend.domain.abnormalLog.api; -import com.factoreal.backend.dto.abnormalLog.AbnormalLogDto; -import com.factoreal.backend.dto.abnormalLog.AbnormalPagingDto; -import com.factoreal.backend.service.AbnormalLogService; +import com.factoreal.backend.domain.abnormalLog.application.AbnormalLogService; +import com.factoreal.backend.domain.abnormalLog.dto.request.AbnormalPagingRequest; +import com.factoreal.backend.domain.abnormalLog.dto.response.AbnormalLogResponse; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; @@ -17,27 +17,27 @@ public class AbnormalController { // 전체 로그 조회 @GetMapping - public Page getAllAbnormalLogs(@ModelAttribute AbnormalPagingDto pagingDto) { + public Page getAllAbnormalLogs(@ModelAttribute AbnormalPagingRequest pagingDto) { return abnormalLogService.findAllAbnormalLogs(pagingDto); } @GetMapping("/unread") - public Page getAllAbnormalLogsUnRead(@ModelAttribute AbnormalPagingDto pagingDto) { + public Page getAllAbnormalLogsUnRead(@ModelAttribute AbnormalPagingRequest pagingDto) { return abnormalLogService.findAllAbnormalLogsUnRead(pagingDto); } // 특정 이상 유형으로 필터링 @GetMapping("/type/{abnormalType}") - public Page getAbnormalLogsByType( - @ModelAttribute AbnormalPagingDto pagingDto, + public Page getAbnormalLogsByType( + @ModelAttribute AbnormalPagingRequest pagingDto, @PathVariable String abnormalType) { return abnormalLogService.findAbnormalLogsByAbnormalType(pagingDto, abnormalType); } // 특정 타겟 ID로 필터링 @GetMapping("/target/{targetType}/{targetId}") - public Page getAbnormalLogsByTarget( - @ModelAttribute AbnormalPagingDto pagingDto, + public Page getAbnormalLogsByTarget( + @ModelAttribute AbnormalPagingRequest pagingDto, @PathVariable String targetType, @PathVariable String targetId) { return abnormalLogService.findAbnormalLogsByTargetId(pagingDto, targetType, targetId); diff --git a/src/main/java/com/factoreal/backend/service/AbnormalLogService.java b/src/main/java/com/factoreal/backend/domain/abnormalLog/application/AbnormalLogService.java similarity index 70% rename from src/main/java/com/factoreal/backend/service/AbnormalLogService.java rename to src/main/java/com/factoreal/backend/domain/abnormalLog/application/AbnormalLogService.java index 6e8ca23e..f4acddb9 100644 --- a/src/main/java/com/factoreal/backend/service/AbnormalLogService.java +++ b/src/main/java/com/factoreal/backend/domain/abnormalLog/application/AbnormalLogService.java @@ -1,17 +1,16 @@ -package com.factoreal.backend.service; - -import com.factoreal.backend.dto.abnormalLog.AbnormalLogDto; -import com.factoreal.backend.dto.abnormalLog.AbnormalPagingDto; -import com.factoreal.backend.dto.abnormalLog.LogType; -import com.factoreal.backend.dto.abnormalLog.SystemLogResponseDto; -import com.factoreal.backend.dto.SensorKafkaDto; -import com.factoreal.backend.entity.AbnormalLog; -import com.factoreal.backend.entity.Zone; -import com.factoreal.backend.repository.AbnLogRepository; -import com.factoreal.backend.sender.WebSocketSender; -import com.factoreal.backend.kafka.strategy.alarmMessage.RiskMessageProvider; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; -import com.factoreal.backend.kafka.strategy.enums.SensorType; +package com.factoreal.backend.domain.abnormalLog.application; + +import com.factoreal.backend.domain.abnormalLog.dto.LogType; +import com.factoreal.backend.domain.abnormalLog.dto.request.AbnormalPagingRequest; +import com.factoreal.backend.domain.abnormalLog.dto.response.AbnormalLogResponse; +import com.factoreal.backend.domain.sensor.dto.SensorKafkaDto; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; +import com.factoreal.backend.domain.zone.dao.ZoneRepository; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.abnormalLog.dao.AbnLogRepository; +import com.factoreal.backend.messaging.kafka.strategy.alarmMessage.RiskMessageProvider; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -24,18 +23,15 @@ import org.springframework.web.server.ResponseStatusException; import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; @Service @Slf4j @RequiredArgsConstructor public class AbnormalLogService { private final AbnLogRepository abnLogRepository; - private final ZoneService zoneService; + private final ZoneRepository zoneRepository; private final RiskMessageProvider riskMessageProvider; private final ObjectMapper objectMapper; - private final WebSocketSender webSocketSender; // 알람 객체를 받아와서 로그 객체 생성. @Transactional(rollbackFor = Exception.class) @@ -47,7 +43,7 @@ public AbnormalLog saveAbnormalLogFromKafkaDto( ) throws Exception{ - Zone zone = zoneService.getZone(sensorKafkaDto.getZoneId()); + Zone zone = zoneRepository.findByZoneId(sensorKafkaDto.getZoneId()); if (zone == null) { @@ -73,12 +69,12 @@ public AbnormalLog saveAbnormalLogFromKafkaDto( } - public Page findAllAbnormalLogs(AbnormalPagingDto abnormalPagingDto) { + public Page findAllAbnormalLogs(AbnormalPagingRequest abnormalPagingDto) { // 한번에 DB전체를 주는 것이 아닌 구간 나눠서 전달하기 위함 Pageable pageable = getPageable(abnormalPagingDto); Page abnormalLogs = abnLogRepository.findAll(pageable); return abnormalLogs.map(abn_log -> - AbnormalLogDto.builder() + AbnormalLogResponse.builder() .id(abn_log.getId()) .targetType(abn_log.getTargetType()) .targetId(abn_log.getTargetId()) @@ -91,12 +87,12 @@ public Page findAllAbnormalLogs(AbnormalPagingDto abnormalPaging ); } - public Page findAllAbnormalLogsUnRead(AbnormalPagingDto abnormalPagingDto) { + public Page findAllAbnormalLogsUnRead(AbnormalPagingRequest abnormalPagingRequest) { // 한번에 DB전체를 주는 것이 아닌 구간 나눠서 전달하기 위함 - Pageable pageable = getPageable(abnormalPagingDto); + Pageable pageable = getPageable(abnormalPagingRequest); Page abnormalLogs = abnLogRepository.findAllByIsReadIsFalse(pageable); return abnormalLogs.map(abn_log -> - AbnormalLogDto.builder() + AbnormalLogResponse.builder() .id(abn_log.getId()) .targetType(abn_log.getTargetType()) .targetId(abn_log.getTargetId()) @@ -109,12 +105,12 @@ public Page findAllAbnormalLogsUnRead(AbnormalPagingDto abnormal ); } - public Page findAbnormalLogsByAbnormalType(AbnormalPagingDto abnormalPagingDto, String abnormalType){ + public Page findAbnormalLogsByAbnormalType(AbnormalPagingRequest abnormalPagingRequest, String abnormalType){ // 한번에 DB전체를 주는 것이 아닌 구간 나눠서 전달하기 위함 - Pageable pageable = getPageable(abnormalPagingDto); + Pageable pageable = getPageable(abnormalPagingRequest); Page abnormalLogs = abnLogRepository.findAbnormalLogsByAbnormalType(abnormalType,pageable); return abnormalLogs.map(abn_log -> - AbnormalLogDto.builder() + AbnormalLogResponse.builder() .id(abn_log.getId()) .targetType(abn_log.getTargetType()) .targetId(abn_log.getTargetId()) @@ -128,15 +124,15 @@ public Page findAbnormalLogsByAbnormalType(AbnormalPagingDto abn } // - public Page findAbnormalLogsByTargetId(AbnormalPagingDto abnormalPagingDto, String targetType, String targetId){ + public Page findAbnormalLogsByTargetId(AbnormalPagingRequest abnormalPagingRequest, String targetType, String targetId){ // 한번에 DB전체를 주는 것이 아닌 구간 나눠서 전달하기 위함 - Pageable pageable = getPageable(abnormalPagingDto); + Pageable pageable = getPageable(abnormalPagingRequest); Page abnormalLogs = abnLogRepository.findAbnormalLogsByTargetTypeAndTargetId( targetType, targetId, pageable); return abnormalLogs.map( - abn_log -> objectMapper.convertValue(abn_log, AbnormalLogDto.class) + abn_log -> objectMapper.convertValue(abn_log, AbnormalLogResponse.class) ); } @@ -162,20 +158,10 @@ public Long readRequired(){ return count; } - @Transactional(readOnly = true) - public Page findSystemLogsByZoneId(String zoneId, AbnormalPagingDto pagingDto) { - log.info("공간 ID: {}의 시스템 로그 조회", zoneId); - Pageable pageable = getPageable(pagingDto); - - // zoneId로 직접 필터링된 로그 조회 - Page logs = abnLogRepository.findByZone_ZoneIdOrderByDetectedAtDesc(zoneId, pageable); - return logs.map(SystemLogResponseDto::fromEntity); - } - - private Pageable getPageable(AbnormalPagingDto abnormalPagingDto){ + private Pageable getPageable(AbnormalPagingRequest abnormalPagingRequest){ return PageRequest.of( - abnormalPagingDto.getPage(), - abnormalPagingDto.getSize() + abnormalPagingRequest.getPage(), + abnormalPagingRequest.getSize() ); } } diff --git a/src/main/java/com/factoreal/backend/repository/AbnLogRepository.java b/src/main/java/com/factoreal/backend/domain/abnormalLog/dao/AbnLogRepository.java similarity index 85% rename from src/main/java/com/factoreal/backend/repository/AbnLogRepository.java rename to src/main/java/com/factoreal/backend/domain/abnormalLog/dao/AbnLogRepository.java index b066b882..04b39da9 100644 --- a/src/main/java/com/factoreal/backend/repository/AbnLogRepository.java +++ b/src/main/java/com/factoreal/backend/domain/abnormalLog/dao/AbnLogRepository.java @@ -1,6 +1,6 @@ -package com.factoreal.backend.repository; +package com.factoreal.backend.domain.abnormalLog.dao; -import com.factoreal.backend.entity.AbnormalLog; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/factoreal/backend/dto/abnormalLog/LogType.java b/src/main/java/com/factoreal/backend/domain/abnormalLog/dto/LogType.java similarity index 52% rename from src/main/java/com/factoreal/backend/dto/abnormalLog/LogType.java rename to src/main/java/com/factoreal/backend/domain/abnormalLog/dto/LogType.java index 43c17a91..d79e6efc 100644 --- a/src/main/java/com/factoreal/backend/dto/abnormalLog/LogType.java +++ b/src/main/java/com/factoreal/backend/domain/abnormalLog/dto/LogType.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto.abnormalLog; +package com.factoreal.backend.domain.abnormalLog.dto; public enum LogType { Sensor, diff --git a/src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalPagingDto.java b/src/main/java/com/factoreal/backend/domain/abnormalLog/dto/request/AbnormalPagingRequest.java similarity index 62% rename from src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalPagingDto.java rename to src/main/java/com/factoreal/backend/domain/abnormalLog/dto/request/AbnormalPagingRequest.java index 7c90ea2a..a32238a0 100644 --- a/src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalPagingDto.java +++ b/src/main/java/com/factoreal/backend/domain/abnormalLog/dto/request/AbnormalPagingRequest.java @@ -1,11 +1,11 @@ -package com.factoreal.backend.dto.abnormalLog; +package com.factoreal.backend.domain.abnormalLog.dto.request; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data -@Schema(description = "페이징 정보 DTO") -public class AbnormalPagingDto { +@Schema(description = "\uD398\uC774\uC9D5 \uC815\uBCF4 DTO") +public class AbnormalPagingRequest { @Schema(description = "페이지 번호 (0부터 시작)", example = "0") private int page; diff --git a/src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalLogDto.java b/src/main/java/com/factoreal/backend/domain/abnormalLog/dto/response/AbnormalLogResponse.java similarity index 73% rename from src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalLogDto.java rename to src/main/java/com/factoreal/backend/domain/abnormalLog/dto/response/AbnormalLogResponse.java index fd57c79e..209f88f1 100644 --- a/src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalLogDto.java +++ b/src/main/java/com/factoreal/backend/domain/abnormalLog/dto/response/AbnormalLogResponse.java @@ -1,5 +1,6 @@ -package com.factoreal.backend.dto.abnormalLog; +package com.factoreal.backend.domain.abnormalLog.dto.response; +import com.factoreal.backend.domain.abnormalLog.dto.LogType; import lombok.Builder; import lombok.Data; @@ -7,7 +8,7 @@ @Data @Builder -public class AbnormalLogDto { +public class AbnormalLogResponse { private Long id; private LogType targetType; private String targetId; diff --git a/src/main/java/com/factoreal/backend/entity/AbnormalLog.java b/src/main/java/com/factoreal/backend/domain/abnormalLog/entity/AbnormalLog.java similarity index 88% rename from src/main/java/com/factoreal/backend/entity/AbnormalLog.java rename to src/main/java/com/factoreal/backend/domain/abnormalLog/entity/AbnormalLog.java index d3f53ae9..a1918ae5 100644 --- a/src/main/java/com/factoreal/backend/entity/AbnormalLog.java +++ b/src/main/java/com/factoreal/backend/domain/abnormalLog/entity/AbnormalLog.java @@ -1,6 +1,7 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.abnormalLog.entity; -import com.factoreal.backend.dto.abnormalLog.LogType; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.abnormalLog.dto.LogType; import jakarta.persistence.*; import lombok.*; import org.springframework.data.annotation.CreatedDate; @@ -14,13 +15,12 @@ @NoArgsConstructor @AllArgsConstructor @Builder -// 이상 감지 LOG ENTITY public class AbnormalLog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) - private Long id; // ID + private Long id; @Enumerated(EnumType.STRING) @Column(name = "target_type", length = 50) diff --git a/src/main/java/com/factoreal/backend/entity/ControlLog.java b/src/main/java/com/factoreal/backend/domain/controlLog/entity/ControlLog.java similarity index 83% rename from src/main/java/com/factoreal/backend/entity/ControlLog.java rename to src/main/java/com/factoreal/backend/domain/controlLog/entity/ControlLog.java index 9e2d1bbc..77bd352b 100644 --- a/src/main/java/com/factoreal/backend/entity/ControlLog.java +++ b/src/main/java/com/factoreal/backend/domain/controlLog/entity/ControlLog.java @@ -1,5 +1,7 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.controlLog.entity; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; +import com.factoreal.backend.domain.zone.entity.Zone; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/factoreal/backend/controller/EquipController.java b/src/main/java/com/factoreal/backend/domain/equip/api/EquipController.java similarity index 63% rename from src/main/java/com/factoreal/backend/controller/EquipController.java rename to src/main/java/com/factoreal/backend/domain/equip/api/EquipController.java index 5cf310c4..12d5b1a1 100644 --- a/src/main/java/com/factoreal/backend/controller/EquipController.java +++ b/src/main/java/com/factoreal/backend/domain/equip/api/EquipController.java @@ -1,9 +1,9 @@ -package com.factoreal.backend.controller; +package com.factoreal.backend.domain.equip.api; -import com.factoreal.backend.dto.EquipCreateRequest; -import com.factoreal.backend.dto.EquipDto; -import com.factoreal.backend.dto.EquipUpdateDto; -import com.factoreal.backend.service.EquipService; +import com.factoreal.backend.domain.equip.dto.request.EquipCreateRequest; +import com.factoreal.backend.domain.equip.application.EquipService; +import com.factoreal.backend.domain.equip.dto.request.EquipUpdateRequest; +import com.factoreal.backend.domain.equip.dto.response.EquipInfoResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -21,30 +21,24 @@ public class EquipController { private final EquipService service; - // 설비 등록 @PostMapping @Operation(summary = "설비 등록", description = "UI로부터 설비명과 공간명을 입력받아 고유 ID를 생성하여 설비 정보를 등록합니다.") - public ResponseEntity createEquip(@Valid @RequestBody EquipCreateRequest req) { - EquipDto created = service.createEquip(req); - return ResponseEntity.status(HttpStatus.CREATED).body(created); + public EquipInfoResponse createEquip(@Valid @RequestBody EquipCreateRequest equipCreateRequest) { + return service.createEquip(equipCreateRequest); } - // 설비 정보 수정 @PostMapping("/{equipId}") @Operation(summary = "설비 정보 수정", description = "기존 설비의 이름을 수정합니다.") - public ResponseEntity updateEquip( + public EquipInfoResponse updateEquip( @PathVariable String equipId, - @RequestBody EquipUpdateDto dto) { - - EquipDto updated = service.updateEquip(equipId, dto); - return ResponseEntity.ok(updated); + @RequestBody EquipUpdateRequest dto) { + return service.updateEquip(equipId, dto); } - // 설비 목록 조회 @GetMapping @Operation(summary = "설비 목록 조회", description = "등록된 모든 설비 정보를 조회합니다.") - public ResponseEntity> listEquips() { - return ResponseEntity.ok(service.getAllEquips()); + public List listEquips() { + return service.getAllEquips(); } // // 공간별로 구분된 설비 조회 diff --git a/src/main/java/com/factoreal/backend/domain/equip/application/EquipService.java b/src/main/java/com/factoreal/backend/domain/equip/application/EquipService.java new file mode 100644 index 00000000..1e58f0ba --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/equip/application/EquipService.java @@ -0,0 +1,86 @@ +package com.factoreal.backend.domain.equip.application; + +import com.factoreal.backend.domain.equip.dto.request.EquipCreateRequest; +import com.factoreal.backend.domain.equip.dto.request.EquipUpdateRequest; +import com.factoreal.backend.domain.equip.dto.response.EquipInfoResponse; +import com.factoreal.backend.domain.equip.entity.Equip; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.equip.dao.EquipRepository; +import com.factoreal.backend.domain.zone.dao.ZoneRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; +import com.factoreal.backend.global.util.IdGenerator; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class EquipService { + private final EquipRepository equipRepo; + private final ZoneRepository zoneRepo; + + @Transactional + public EquipInfoResponse createEquip(EquipCreateRequest req) { + // 1. UI에서 입력받은 zoneName으로 zoneId 조회 + Zone zone = findByZoneName(req.getZoneName()); + + // 2. 고유한 설비ID 생성 + String equipId = IdGenerator.generateId(); + + // 3. 설비 정보 저장 + equipRepo.save(new Equip(equipId, req.getEquipName(), zone)); + + return new EquipInfoResponse(equipId, req.getEquipName(), zone.getZoneName(), zone.getZoneId()); + } + + @Transactional + public EquipInfoResponse updateEquip(String equipId, EquipUpdateRequest dto) { + // 1. 수정할 설비가 존재하는지 확인 + Equip equip = equipRepo.findById(equipId) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.NOT_FOUND, "존재하지 않는 설비 ID: " + equipId)); + + // 2. 설비명 업데이트 + equip.setEquipName(dto.getEquipName()); + Equip updated = equipRepo.save(equip); + + Zone zone = findByZoneId(updated.getZone().getZoneId()); + + return new EquipInfoResponse( + updated.getEquipId(), + updated.getEquipName(), + zone.getZoneName(), + zone.getZoneId() + ); + + } + + public List getAllEquips() { + return equipRepo.findAll().stream() + .map(equip -> { + Zone zone = findByZoneId(equip.getZone().getZoneId()); + return new EquipInfoResponse( + equip.getEquipId(), + equip.getEquipName(), + zone.getZoneName(), + equip.getZone().getZoneId() + ); + }) + .collect(Collectors.toList()); + } + + private Zone findByZoneName(String zoneName) { + return zoneRepo.findByZoneName(zoneName) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.BAD_REQUEST, "존재하지 않는 공간명: " + zoneName)); + } + + private Zone findByZoneId(String zoneId) { + return zoneRepo.findById(zoneId) + .orElse(new Zone("", "미등록 공간")); + } +} diff --git a/src/main/java/com/factoreal/backend/repository/EquipRepository.java b/src/main/java/com/factoreal/backend/domain/equip/dao/EquipRepository.java similarity index 81% rename from src/main/java/com/factoreal/backend/repository/EquipRepository.java rename to src/main/java/com/factoreal/backend/domain/equip/dao/EquipRepository.java index 4ce6e26f..d9aaae14 100644 --- a/src/main/java/com/factoreal/backend/repository/EquipRepository.java +++ b/src/main/java/com/factoreal/backend/domain/equip/dao/EquipRepository.java @@ -1,12 +1,12 @@ -package com.factoreal.backend.repository; +package com.factoreal.backend.domain.equip.dao; import java.util.List; import java.util.Optional; -import com.factoreal.backend.entity.Zone; +import com.factoreal.backend.domain.zone.entity.Zone; import org.springframework.data.jpa.repository.JpaRepository; -import com.factoreal.backend.entity.Equip; +import com.factoreal.backend.domain.equip.entity.Equip; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/com/factoreal/backend/dto/EquipCreateRequest.java b/src/main/java/com/factoreal/backend/domain/equip/dto/request/EquipCreateRequest.java similarity index 79% rename from src/main/java/com/factoreal/backend/dto/EquipCreateRequest.java rename to src/main/java/com/factoreal/backend/domain/equip/dto/request/EquipCreateRequest.java index d40e5aae..17415042 100644 --- a/src/main/java/com/factoreal/backend/dto/EquipCreateRequest.java +++ b/src/main/java/com/factoreal/backend/domain/equip/dto/request/EquipCreateRequest.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.equip.dto.request; import lombok.Getter; import lombok.Setter; @@ -9,7 +9,6 @@ @Setter @NoArgsConstructor @AllArgsConstructor -// 설비 생성 요청 DTO ( FE -> BE ) public class EquipCreateRequest { private String equipName; private String zoneName; // 사용자가 선택한 공간명 diff --git a/src/main/java/com/factoreal/backend/dto/EquipUpdateDto.java b/src/main/java/com/factoreal/backend/domain/equip/dto/request/EquipUpdateRequest.java similarity index 71% rename from src/main/java/com/factoreal/backend/dto/EquipUpdateDto.java rename to src/main/java/com/factoreal/backend/domain/equip/dto/request/EquipUpdateRequest.java index c3c2a7bd..de04346d 100644 --- a/src/main/java/com/factoreal/backend/dto/EquipUpdateDto.java +++ b/src/main/java/com/factoreal/backend/domain/equip/dto/request/EquipUpdateRequest.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.equip.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; @@ -9,6 +9,6 @@ @Setter @NoArgsConstructor @AllArgsConstructor -public class EquipUpdateDto { +public class EquipUpdateRequest { private String equipName; // 수정할 설비명 } diff --git a/src/main/java/com/factoreal/backend/domain/equip/dto/response/EquipDetailResponse.java b/src/main/java/com/factoreal/backend/domain/equip/dto/response/EquipDetailResponse.java new file mode 100644 index 00000000..60c25f82 --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/equip/dto/response/EquipDetailResponse.java @@ -0,0 +1,17 @@ +package com.factoreal.backend.domain.equip.dto.response; + +import com.factoreal.backend.domain.sensor.dto.response.SensorInfoResponse; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class EquipDetailResponse { + private String equipId; + private String equipName; + private List facSensor; +} diff --git a/src/main/java/com/factoreal/backend/dto/EquipDto.java b/src/main/java/com/factoreal/backend/domain/equip/dto/response/EquipInfoResponse.java similarity index 68% rename from src/main/java/com/factoreal/backend/dto/EquipDto.java rename to src/main/java/com/factoreal/backend/domain/equip/dto/response/EquipInfoResponse.java index 2b79c9e0..fbbe95a7 100644 --- a/src/main/java/com/factoreal/backend/dto/EquipDto.java +++ b/src/main/java/com/factoreal/backend/domain/equip/dto/response/EquipInfoResponse.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.equip.dto.response; import lombok.*; @@ -7,8 +7,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -// 설비 정보 DTO -public class EquipDto { +public class EquipInfoResponse { private String equipId; private String equipName; private String zoneName; diff --git a/src/main/java/com/factoreal/backend/entity/Equip.java b/src/main/java/com/factoreal/backend/domain/equip/entity/Equip.java similarity index 88% rename from src/main/java/com/factoreal/backend/entity/Equip.java rename to src/main/java/com/factoreal/backend/domain/equip/entity/Equip.java index 80a39fea..7d01fa1c 100644 --- a/src/main/java/com/factoreal/backend/entity/Equip.java +++ b/src/main/java/com/factoreal/backend/domain/equip/entity/Equip.java @@ -1,5 +1,6 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.equip.entity; +import com.factoreal.backend.domain.zone.entity.Zone; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; diff --git a/src/main/java/com/factoreal/backend/controller/NotificationController.java b/src/main/java/com/factoreal/backend/domain/notifyLog/api/NotificationController.java similarity index 94% rename from src/main/java/com/factoreal/backend/controller/NotificationController.java rename to src/main/java/com/factoreal/backend/domain/notifyLog/api/NotificationController.java index 72465913..a9e4d49c 100644 --- a/src/main/java/com/factoreal/backend/controller/NotificationController.java +++ b/src/main/java/com/factoreal/backend/domain/notifyLog/api/NotificationController.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.controller; +package com.factoreal.backend.domain.notifyLog.api; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -19,6 +19,7 @@ public class NotificationController { // 3. swagger에서 아래 api 호출 // https://jiangxy.github.io/websocket-debug-tool/ @PostMapping("/api/notify") + @Deprecated public ResponseEntity notify(@RequestBody Map body) { String message = body.get("message"); simpMessagingTemplate.convertAndSend("/topic/notify", message); diff --git a/src/main/java/com/factoreal/backend/entity/NotifyLog.java b/src/main/java/com/factoreal/backend/domain/notifyLog/entity/NotifyLog.java similarity index 82% rename from src/main/java/com/factoreal/backend/entity/NotifyLog.java rename to src/main/java/com/factoreal/backend/domain/notifyLog/entity/NotifyLog.java index 784c32e8..a6fe9a68 100644 --- a/src/main/java/com/factoreal/backend/entity/NotifyLog.java +++ b/src/main/java/com/factoreal/backend/domain/notifyLog/entity/NotifyLog.java @@ -1,5 +1,7 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.notifyLog.entity; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; +import com.factoreal.backend.domain.wearable.entity.Wearable; import jakarta.persistence.*; import lombok.*; @@ -12,7 +14,6 @@ @NoArgsConstructor @AllArgsConstructor @Builder -// 알림 로그 ENTITY public class NotifyLog { @Id diff --git a/src/main/java/com/factoreal/backend/domain/sensor/api/SensorController.java b/src/main/java/com/factoreal/backend/domain/sensor/api/SensorController.java new file mode 100644 index 00000000..8c3e654d --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/sensor/api/SensorController.java @@ -0,0 +1,35 @@ +package com.factoreal.backend.domain.sensor.api; + +import com.factoreal.backend.domain.sensor.dto.response.SensorInfoResponse; +import com.factoreal.backend.domain.sensor.application.SensorService; +import com.factoreal.backend.domain.sensor.dto.request.SensorUpdateRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/sensors") +@RequiredArgsConstructor +@Tag(name = "센서 정보 API", description = "센서 정보 처리 API입니다.") +public class SensorController { + private final SensorService service; + + @GetMapping + @Operation(summary = "전체 센서 리스트 조회", description = "센서 ID, 센서 종류를 포함한 전체 센서 정보를 조회하는 기능") + public List getSensorList() { + return service.getAllSensors(); + } + + @PostMapping("/{sensorId}") + @Operation(summary = "센서 정보 업데이트", description = "센서ID 매핑해서 임계치(sensorThres)와 허용치(allowVal) 업데이트 (FE -> BE) ") + public ResponseEntity update( + @PathVariable("sensorId") String sensorId, + @RequestBody SensorUpdateRequest sensorUpdateRequest) { + service.updateSensor(sensorId, sensorUpdateRequest); + return ResponseEntity.ok().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/domain/sensor/application/SensorService.java b/src/main/java/com/factoreal/backend/domain/sensor/application/SensorService.java new file mode 100644 index 00000000..f9cd2472 --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/sensor/application/SensorService.java @@ -0,0 +1,84 @@ +package com.factoreal.backend.domain.sensor.application; + +import java.util.List; +import java.util.stream.Collectors; + +import com.factoreal.backend.domain.sensor.dto.request.SensorCreateRequest; +import com.factoreal.backend.domain.sensor.dto.response.SensorInfoResponse; +import com.factoreal.backend.domain.sensor.dto.request.SensorUpdateRequest; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; + +import com.factoreal.backend.domain.equip.entity.Equip; +import com.factoreal.backend.domain.sensor.entity.Sensor; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.equip.dao.EquipRepository; +import com.factoreal.backend.domain.sensor.dao.SensorRepository; +import com.factoreal.backend.domain.zone.dao.ZoneRepository; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SensorService { + private final SensorRepository sensorRepository; + private final ZoneRepository zoneRepository; + private final EquipRepository equipRepository; + + @Transactional + public Sensor saveSensor(SensorCreateRequest dto) { + Zone zone = getZoneById(dto.getZoneId()); + Equip equip = getEquipById(dto.getEquipId()); + + Sensor sens = new Sensor(); + sens.setSensorId(dto.getSensorId()); + sens.setSensorType(SensorType.valueOf(dto.getSensorType())); + sens.setZone(zone); + sens.setEquip(equip); + sens.setIsZone(dto.getIsZone()); + return sensorRepository.save(sens); + } + + public List getAllSensors() { + return sensorRepository.findAll().stream() + .map(s -> new SensorInfoResponse( + s.getSensorId(), + s.getSensorType().toString(), + s.getZone().getZoneId(), + s.getEquip().getEquipId(), + s.getSensorThres(), + s.getAllowVal(), + s.getIsZone() + )) + .collect(Collectors.toList()); + } + + @Transactional + public void updateSensor(String sensorId, SensorUpdateRequest dto) { + Sensor sensor = getSensorById(sensorId); + sensor.setSensorThres(dto.getSensorThres()); + sensor.setAllowVal(dto.getAllowVal()); + sensorRepository.save(sensor); + } + + private Zone getZoneById(String zoneId) { + return zoneRepository.findById(zoneId) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.NOT_FOUND, "존재하지 않는 공간 ID: " + zoneId)); + } + private Equip getEquipById(String eqiuipId) { + return equipRepository.findById(eqiuipId) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.NOT_FOUND, "존재하지 않는 센서 ID: " + eqiuipId)); + } + public Sensor getSensorById(String sensorId) { + return sensorRepository.findById(sensorId) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.NOT_FOUND, "존재하지 않는 센서 ID: " + sensorId)); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/repository/SensorRepository.java b/src/main/java/com/factoreal/backend/domain/sensor/dao/SensorRepository.java similarity index 56% rename from src/main/java/com/factoreal/backend/repository/SensorRepository.java rename to src/main/java/com/factoreal/backend/domain/sensor/dao/SensorRepository.java index 99928960..66997b5d 100644 --- a/src/main/java/com/factoreal/backend/repository/SensorRepository.java +++ b/src/main/java/com/factoreal/backend/domain/sensor/dao/SensorRepository.java @@ -1,15 +1,14 @@ -package com.factoreal.backend.repository; +package com.factoreal.backend.domain.sensor.dao; import java.util.Optional; -import com.factoreal.backend.entity.Zone; +import com.factoreal.backend.domain.zone.entity.Zone; import org.springframework.data.jpa.repository.JpaRepository; -import com.factoreal.backend.entity.Sensor; +import com.factoreal.backend.domain.sensor.entity.Sensor; import java.util.List; public interface SensorRepository extends JpaRepository { - Optional findBySensorId(String sensorId); List findByZone(Zone zone); } \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/dto/SensorKafkaDto.java b/src/main/java/com/factoreal/backend/domain/sensor/dto/SensorKafkaDto.java similarity index 93% rename from src/main/java/com/factoreal/backend/dto/SensorKafkaDto.java rename to src/main/java/com/factoreal/backend/domain/sensor/dto/SensorKafkaDto.java index f1ae5000..2da45c8b 100644 --- a/src/main/java/com/factoreal/backend/dto/SensorKafkaDto.java +++ b/src/main/java/com/factoreal/backend/domain/sensor/dto/SensorKafkaDto.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.sensor.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/factoreal/backend/domain/sensor/dto/request/SensorCreateRequest.java b/src/main/java/com/factoreal/backend/domain/sensor/dto/request/SensorCreateRequest.java new file mode 100644 index 00000000..e627ec2d --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/sensor/dto/request/SensorCreateRequest.java @@ -0,0 +1,34 @@ +package com.factoreal.backend.domain.sensor.dto.request; + +import com.factoreal.backend.domain.sensor.dto.response.SensorInfoResponse; +import com.factoreal.backend.domain.sensor.entity.Sensor; +import lombok.*; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SensorCreateRequest { + private String sensorId; + private String sensorType; + private String zoneId; + private String equipId; + private Double sensorThres; // 임계치 + private Double allowVal; // 허용치 + private Integer isZone; + + public static SensorInfoResponse from (Sensor sensor) { + if (sensor == null) return null; + + return SensorInfoResponse.builder() + .sensorId(sensor.getSensorId()) + .sensorType(sensor.getSensorType().toString()) + .zoneId(sensor.getZone().getZoneId()) + .equipId(sensor.getEquip().getEquipId()) + .sensorThres(sensor.getSensorThres()) + .allowVal(sensor.getAllowVal()) + .isZone(sensor.getIsZone()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/dto/SensorUpdateDto.java b/src/main/java/com/factoreal/backend/domain/sensor/dto/request/SensorUpdateRequest.java similarity index 76% rename from src/main/java/com/factoreal/backend/dto/SensorUpdateDto.java rename to src/main/java/com/factoreal/backend/domain/sensor/dto/request/SensorUpdateRequest.java index 5bccb428..3557d740 100644 --- a/src/main/java/com/factoreal/backend/dto/SensorUpdateDto.java +++ b/src/main/java/com/factoreal/backend/domain/sensor/dto/request/SensorUpdateRequest.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.sensor.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; @@ -7,11 +7,9 @@ @Getter @Setter @AllArgsConstructor -public class SensorUpdateDto { +public class SensorUpdateRequest { // private String sensorPurpose; // 센서목적 // private String location; // 위치 private Double sensorThres; // 임계치 private Double allowVal; // 허용치(오차범위) - - public SensorUpdateDto() {} } \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/dto/SensorDto.java b/src/main/java/com/factoreal/backend/domain/sensor/dto/response/SensorInfoResponse.java similarity index 61% rename from src/main/java/com/factoreal/backend/dto/SensorDto.java rename to src/main/java/com/factoreal/backend/domain/sensor/dto/response/SensorInfoResponse.java index 5e13afe9..783961b5 100644 --- a/src/main/java/com/factoreal/backend/dto/SensorDto.java +++ b/src/main/java/com/factoreal/backend/domain/sensor/dto/response/SensorInfoResponse.java @@ -1,6 +1,6 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.sensor.dto.response; -import com.factoreal.backend.entity.Sensor; +import com.factoreal.backend.domain.sensor.entity.Sensor; import lombok.*; @Getter @@ -8,19 +8,19 @@ @Builder @AllArgsConstructor @NoArgsConstructor -public class SensorDto { // BE -> FE 용 DTO - private String sensorId; // 센서ID - private String sensorType; // 센서종류 - private String zoneId; // zoneId 저장 +public class SensorInfoResponse { + private String sensorId; + private String sensorType; + private String zoneId; private String equipId; - private Double sensorThres; // 임계치 + private Double sensorThres; // 임계치 private Double allowVal; // 허용치 private Integer isZone; - public static SensorDto fromEntity(Sensor sensor) { + public static SensorInfoResponse from (Sensor sensor) { if (sensor == null) return null; - return SensorDto.builder() + return SensorInfoResponse.builder() .sensorId(sensor.getSensorId()) .sensorType(sensor.getSensorType().toString()) .zoneId(sensor.getZone().getZoneId()) diff --git a/src/main/java/com/factoreal/backend/entity/Sensor.java b/src/main/java/com/factoreal/backend/domain/sensor/entity/Sensor.java similarity index 83% rename from src/main/java/com/factoreal/backend/entity/Sensor.java rename to src/main/java/com/factoreal/backend/domain/sensor/entity/Sensor.java index 2c9d7835..409ee7ff 100644 --- a/src/main/java/com/factoreal/backend/entity/Sensor.java +++ b/src/main/java/com/factoreal/backend/domain/sensor/entity/Sensor.java @@ -1,6 +1,8 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.sensor.entity; -import com.factoreal.backend.kafka.strategy.enums.SensorType; +import com.factoreal.backend.domain.equip.entity.Equip; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/factoreal/backend/entity/Wearable.java b/src/main/java/com/factoreal/backend/domain/wearable/entity/Wearable.java similarity index 92% rename from src/main/java/com/factoreal/backend/entity/Wearable.java rename to src/main/java/com/factoreal/backend/domain/wearable/entity/Wearable.java index f6caaf2f..ff571ea3 100644 --- a/src/main/java/com/factoreal/backend/entity/Wearable.java +++ b/src/main/java/com/factoreal/backend/domain/wearable/entity/Wearable.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.wearable.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/com/factoreal/backend/entity/WearableHist.java b/src/main/java/com/factoreal/backend/domain/wearable/entity/WearableHist.java similarity index 87% rename from src/main/java/com/factoreal/backend/entity/WearableHist.java rename to src/main/java/com/factoreal/backend/domain/wearable/entity/WearableHist.java index 18bb9c49..a77e6c5b 100644 --- a/src/main/java/com/factoreal/backend/entity/WearableHist.java +++ b/src/main/java/com/factoreal/backend/domain/wearable/entity/WearableHist.java @@ -1,5 +1,7 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.wearable.entity; +import com.factoreal.backend.domain.worker.entity.Worker; +import com.factoreal.backend.domain.zone.entity.Zone; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/factoreal/backend/controller/WorkerController.java b/src/main/java/com/factoreal/backend/domain/worker/api/WorkerController.java similarity index 60% rename from src/main/java/com/factoreal/backend/controller/WorkerController.java rename to src/main/java/com/factoreal/backend/domain/worker/api/WorkerController.java index e4efd46f..20c2b97c 100644 --- a/src/main/java/com/factoreal/backend/controller/WorkerController.java +++ b/src/main/java/com/factoreal/backend/domain/worker/api/WorkerController.java @@ -1,14 +1,13 @@ -package com.factoreal.backend.controller; +package com.factoreal.backend.domain.worker.api; -import com.factoreal.backend.dto.WorkerDto; -import com.factoreal.backend.dto.ZoneManagerResponseDto; -import com.factoreal.backend.service.WorkerService; +import com.factoreal.backend.domain.worker.dto.response.WorkerInfoResponse; +import com.factoreal.backend.domain.worker.dto.response.ZoneManagerResponse; +import com.factoreal.backend.domain.worker.application.WorkerService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -23,26 +22,23 @@ public class WorkerController { @Operation(summary = "전체 작업자 목록 조회", description = "전체 작업자 목록을 조회합니다.") @GetMapping - public ResponseEntity> getAllWorkers() { + public List getAllWorkers() { log.info("전체 작업자 목록 조회 요청"); - List workers = workerService.getAllWorkers(); - return ResponseEntity.ok(workers); + return workerService.getAllWorkers(); } @Operation(summary = "공간별 작업자 목록 조회", description = "공간 ID를 기반으로 현재 해당 공간에 들어가있는 작업자 리스트를 조회합니다.") @GetMapping("/zone/{zoneId}") - public ResponseEntity> getWorkersByZoneId(@PathVariable String zoneId) { + public List getWorkersByZoneId(@PathVariable String zoneId) { log.info("공간 ID: {}의 작업자 목록 조회 요청", zoneId); - List zoneWorkers = workerService.getWorkersByZoneId(zoneId); - return ResponseEntity.ok(zoneWorkers); + return workerService.getWorkersByZoneId(zoneId); } @Operation(summary = "공간 담당자 정보 조회", description = "공간 ID를 기반으로 해당 공간의 담당자와 현재 위치 정보를 조회합니다.") @GetMapping("/zone/{zoneId}/manager") - public ResponseEntity getZoneManager(@PathVariable String zoneId) { + public ZoneManagerResponse getZoneManager(@PathVariable String zoneId) { log.info("공간 ID: {}의 담당자 정보 조회 요청", zoneId); - ZoneManagerResponseDto manager = workerService.getZoneManagerWithLocation(zoneId); - return ResponseEntity.ok(manager); + return workerService.getZoneManagerWithLocation(zoneId); } } \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/service/WorkerService.java b/src/main/java/com/factoreal/backend/domain/worker/application/WorkerService.java similarity index 63% rename from src/main/java/com/factoreal/backend/service/WorkerService.java rename to src/main/java/com/factoreal/backend/domain/worker/application/WorkerService.java index 27b49682..452f52ce 100644 --- a/src/main/java/com/factoreal/backend/service/WorkerService.java +++ b/src/main/java/com/factoreal/backend/domain/worker/application/WorkerService.java @@ -1,13 +1,14 @@ -package com.factoreal.backend.service; +package com.factoreal.backend.domain.worker.application; -import com.factoreal.backend.dto.WorkerDto; -import com.factoreal.backend.dto.ZoneManagerResponseDto; -import com.factoreal.backend.entity.Worker; -import com.factoreal.backend.entity.WorkerZone; -import com.factoreal.backend.entity.Zone; -import com.factoreal.backend.entity.ZoneHist; -import com.factoreal.backend.repository.WorkerRepository; -import com.factoreal.backend.repository.WorkerZoneRepository; +import com.factoreal.backend.domain.worker.dto.response.WorkerInfoResponse; +import com.factoreal.backend.domain.worker.dto.response.ZoneManagerResponse; +import com.factoreal.backend.domain.zone.dao.ZoneHistoryRepository; +import com.factoreal.backend.domain.worker.entity.Worker; +import com.factoreal.backend.domain.worker.entity.WorkerZone; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.zone.entity.ZoneHist; +import com.factoreal.backend.domain.worker.dao.WorkerRepository; +import com.factoreal.backend.domain.worker.dao.WorkerZoneRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -21,15 +22,15 @@ @RequiredArgsConstructor public class WorkerService { private final WorkerRepository workerRepository; - private final WorkerLocationService workerLocationService; + private final ZoneHistoryRepository zoneHistoryRepository; private final WorkerZoneRepository workerZoneRepository; @Transactional(readOnly = true) - public List getAllWorkers() { + public List getAllWorkers() { log.info("전체 작업자 목록 조회"); List workers = workerRepository.findAll(); return workers.stream() - .map(worker -> WorkerDto.fromEntity(worker, false)) + .map(worker -> WorkerInfoResponse.from(worker, false)) .collect(Collectors.toList()); } @@ -37,15 +38,11 @@ public List getAllWorkers() { * 특정 공간에 현재 들어가있는 작업자 목록 조회 */ @Transactional(readOnly = true) - public List getWorkersByZoneId(String zoneId) { + public List getWorkersByZoneId(String zoneId) { log.info("공간 ID: {}의 현재 작업자 목록 조회", zoneId); - - // 현재 해당 공간에 있는 작업자 이력 조회 (existFlag = 1) - List currentWorkers = workerLocationService.getCurrentWorkersByZoneId(zoneId); - - // ZoneHist에서 Worker 정보만 추출하여 DTO로 변환 + List currentWorkers = zoneHistoryRepository.findByZone_ZoneIdAndExistFlag(zoneId, 1); return currentWorkers.stream() - .map(zoneHist -> WorkerDto.fromEntity(zoneHist.getWorker(), false)) + .map(zoneHist -> WorkerInfoResponse.from(zoneHist.getWorker(), false)) .collect(Collectors.toList()); } @@ -53,23 +50,21 @@ public List getWorkersByZoneId(String zoneId) { * 특정 공간의 담당자와 현재 위치 정보 조회 */ @Transactional(readOnly = true) - public ZoneManagerResponseDto getZoneManagerWithLocation(String zoneId) { + public ZoneManagerResponse getZoneManagerWithLocation(String zoneId) { log.info("공간 ID: {}의 담당자 정보 조회", zoneId); - // 1. 해당 공간의 담당자 조회 (manageYn = true) WorkerZone zoneManager = workerZoneRepository.findByZoneZoneIdAndManageYnIsTrue(zoneId) .orElseThrow(() -> new IllegalArgumentException("해당 공간의 담당자를 찾을 수 없습니다: " + zoneId)); Worker manager = zoneManager.getWorker(); // 2. 담당자의 현재 위치 조회 (existFlag = 1) - ZoneHist currentLocation = workerLocationService.getCurrentWorkerLocation(manager.getWorkerId()); - + ZoneHist currentLocation = zoneHistoryRepository.findByWorker_WorkerIdAndExistFlag(manager.getWorkerId(), 1); + // 3. 현재 위치한 공간 정보 (없을 수 있음) Zone currentZone = currentLocation != null ? currentLocation.getZone() : null; - - // 4. DTO 변환 및 반환 - return ZoneManagerResponseDto.fromEntity(manager, currentZone); + + return ZoneManagerResponse.from(manager, currentZone); } } diff --git a/src/main/java/com/factoreal/backend/repository/WorkerRepository.java b/src/main/java/com/factoreal/backend/domain/worker/dao/WorkerRepository.java similarity index 56% rename from src/main/java/com/factoreal/backend/repository/WorkerRepository.java rename to src/main/java/com/factoreal/backend/domain/worker/dao/WorkerRepository.java index b6b15dd9..144e43fc 100644 --- a/src/main/java/com/factoreal/backend/repository/WorkerRepository.java +++ b/src/main/java/com/factoreal/backend/domain/worker/dao/WorkerRepository.java @@ -1,6 +1,6 @@ -package com.factoreal.backend.repository; +package com.factoreal.backend.domain.worker.dao; -import com.factoreal.backend.entity.Worker; +import com.factoreal.backend.domain.worker.entity.Worker; import org.springframework.data.jpa.repository.JpaRepository; public interface WorkerRepository extends JpaRepository { diff --git a/src/main/java/com/factoreal/backend/repository/WorkerZoneRepository.java b/src/main/java/com/factoreal/backend/domain/worker/dao/WorkerZoneRepository.java similarity index 72% rename from src/main/java/com/factoreal/backend/repository/WorkerZoneRepository.java rename to src/main/java/com/factoreal/backend/domain/worker/dao/WorkerZoneRepository.java index ab3dd503..ccda65b1 100644 --- a/src/main/java/com/factoreal/backend/repository/WorkerZoneRepository.java +++ b/src/main/java/com/factoreal/backend/domain/worker/dao/WorkerZoneRepository.java @@ -1,7 +1,7 @@ -package com.factoreal.backend.repository; +package com.factoreal.backend.domain.worker.dao; -import com.factoreal.backend.entity.WorkerZone; -import com.factoreal.backend.entity.WorkerZoneId; +import com.factoreal.backend.domain.worker.entity.WorkerZone; +import com.factoreal.backend.domain.worker.entity.WorkerZoneId; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/src/main/java/com/factoreal/backend/dto/WorkerDto.java b/src/main/java/com/factoreal/backend/domain/worker/dto/response/WorkerInfoResponse.java similarity index 64% rename from src/main/java/com/factoreal/backend/dto/WorkerDto.java rename to src/main/java/com/factoreal/backend/domain/worker/dto/response/WorkerInfoResponse.java index b79b04b7..1c0a7f29 100644 --- a/src/main/java/com/factoreal/backend/dto/WorkerDto.java +++ b/src/main/java/com/factoreal/backend/domain/worker/dto/response/WorkerInfoResponse.java @@ -1,6 +1,6 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.worker.dto.response; -import com.factoreal.backend.entity.Worker; +import com.factoreal.backend.domain.worker.entity.Worker; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -10,16 +10,15 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class WorkerDto { +public class WorkerInfoResponse { private String workerId; private String name; private String phoneNumber; private String email; - private Boolean isManager; // 관리자 여부 + private Boolean isManager; - // Entity -> DTO 변환 - public static WorkerDto fromEntity(Worker worker, Boolean isManager) { - return WorkerDto.builder() + public static WorkerInfoResponse from(Worker worker, Boolean isManager) { + return WorkerInfoResponse.builder() .workerId(worker.getWorkerId()) .name(worker.getName()) .phoneNumber(worker.getPhoneNumber()) diff --git a/src/main/java/com/factoreal/backend/domain/worker/dto/response/ZoneManagerResponse.java b/src/main/java/com/factoreal/backend/domain/worker/dto/response/ZoneManagerResponse.java new file mode 100644 index 00000000..32a713c3 --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/worker/dto/response/ZoneManagerResponse.java @@ -0,0 +1,32 @@ +package com.factoreal.backend.domain.worker.dto.response; + +import com.factoreal.backend.domain.worker.entity.Worker; +import com.factoreal.backend.domain.zone.entity.Zone; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ZoneManagerResponse { + private String workerId; + private String name; + private String phoneNumber; + private String email; + private String currentZoneId; + private String currentZoneName; + + public static ZoneManagerResponse from(Worker worker, Zone currentZone) { + return ZoneManagerResponse.builder() + .workerId(worker.getWorkerId()) + .name(worker.getName()) + .phoneNumber(worker.getPhoneNumber()) + .email(worker.getEmail()) + .currentZoneId(currentZone != null ? currentZone.getZoneId() : null) + .currentZoneName(currentZone != null ? currentZone.getZoneName() : null) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/entity/Worker.java b/src/main/java/com/factoreal/backend/domain/worker/entity/Worker.java similarity index 70% rename from src/main/java/com/factoreal/backend/entity/Worker.java rename to src/main/java/com/factoreal/backend/domain/worker/entity/Worker.java index 6f68d4c4..3c42e417 100644 --- a/src/main/java/com/factoreal/backend/entity/Worker.java +++ b/src/main/java/com/factoreal/backend/domain/worker/entity/Worker.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.worker.entity; import jakarta.persistence.*; import lombok.*; @@ -10,19 +10,18 @@ @NoArgsConstructor @AllArgsConstructor @Builder -// 작업자 정보 Table public class Worker { @Id @Column(name = "worker_id", length = 100, nullable = false) - private String workerId; //작업자 고유 ID + private String workerId; @Column(name = "name", length = 100) - private String name; // 작업자 이름 + private String name; @Column(name = "phone_number", length = 50) private String phoneNumber; // 작업자 번호 (국가번호+전화번호의 조합) ex) +8201012345678 @Column(name = "email", length = 100) - private String email; // 작업자 이메일 + private String email; } \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/entity/WorkerZone.java b/src/main/java/com/factoreal/backend/domain/worker/entity/WorkerZone.java similarity index 84% rename from src/main/java/com/factoreal/backend/entity/WorkerZone.java rename to src/main/java/com/factoreal/backend/domain/worker/entity/WorkerZone.java index 7b5ddc69..9c945225 100644 --- a/src/main/java/com/factoreal/backend/entity/WorkerZone.java +++ b/src/main/java/com/factoreal/backend/domain/worker/entity/WorkerZone.java @@ -1,5 +1,6 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.worker.entity; +import com.factoreal.backend.domain.zone.entity.Zone; import jakarta.persistence.*; import lombok.*; @@ -18,7 +19,6 @@ public class WorkerZone { @Column(name = "manage_yn", nullable = false) private Boolean manageYn; // 공간담당자 여부 - // 연관관계 @ManyToOne(fetch = FetchType.LAZY) @MapsId("workerId") @JoinColumn(name = "worker_id") diff --git a/src/main/java/com/factoreal/backend/entity/WorkerZoneId.java b/src/main/java/com/factoreal/backend/domain/worker/entity/WorkerZoneId.java similarity index 88% rename from src/main/java/com/factoreal/backend/entity/WorkerZoneId.java rename to src/main/java/com/factoreal/backend/domain/worker/entity/WorkerZoneId.java index 6c44a049..7bf29deb 100644 --- a/src/main/java/com/factoreal/backend/entity/WorkerZoneId.java +++ b/src/main/java/com/factoreal/backend/domain/worker/entity/WorkerZoneId.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.worker.entity; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/src/main/java/com/factoreal/backend/domain/zone/api/ZoneController.java b/src/main/java/com/factoreal/backend/domain/zone/api/ZoneController.java new file mode 100644 index 00000000..a7ac6cd6 --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/zone/api/ZoneController.java @@ -0,0 +1,64 @@ +package com.factoreal.backend.domain.zone.api; + +import java.util.List; + +import com.factoreal.backend.domain.abnormalLog.dto.request.AbnormalPagingRequest; +import com.factoreal.backend.domain.zone.dto.response.ZoneLogResponse; +import com.factoreal.backend.domain.zone.dto.request.ZoneCreateRequest; +import com.factoreal.backend.domain.zone.dto.request.ZoneUpdateRequest; +import com.factoreal.backend.domain.zone.dto.response.ZoneDetailResponse; +import com.factoreal.backend.domain.zone.dto.response.ZoneInfoResponse; +import io.swagger.v3.oas.annotations.Parameter; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.*; + +import com.factoreal.backend.domain.zone.application.ZoneService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/zones") +@RequiredArgsConstructor +@Tag(name = "공간 정보 API", description = "공간(Zone) 매핑 처리 API") +public class ZoneController { + private final ZoneService service; + + @PostMapping + @Operation(summary = "공간 생성", description = "UI에서 입력한 공간명으로 Zone을 등록하고 고유 zoneId를 생성하여 반환합니다.") + public ZoneInfoResponse createZone (@RequestBody ZoneCreateRequest zoneCreateRequest) { + return service.createZone(zoneCreateRequest); + } + + @PostMapping("/{zoneName}") + @Operation(summary = "공간 정보 수정", description = "기존 공간의 이름을 수정합니다.") + public ZoneInfoResponse updateZone( + @PathVariable String zoneName, + @RequestBody ZoneUpdateRequest dto) { + return service.updateZone(zoneName, dto); + } + + @GetMapping + @Operation(summary = "공간 리스트 조회", description = "등록된 모든 공간 정보를 조회합니다.") + public List listZones() { + return service.getAllZones(); + } + + @GetMapping("/zoneitems") + @Operation(summary = "공간별 설비,센서 데이터 조회", description = "등록된 공간들의 각 정보를 조회합니다.") + public List listZoneItems() { + return service.getZoneItems(); + } + + @Operation(summary = "공간별 시스템 로그 조회", description = "특정 공간(zone)의 시스템 로그를 페이징 처리하여 조회합니다.") + @GetMapping("/{zoneId}/logs") + public Page getSystemLogsByZone( + @Parameter(description = "조회할 공간 ID", required = true) + @PathVariable String zoneId, + @Parameter(description = "페이징 정보 (page: 페이지 번호, size: 페이지 크기)") + @ModelAttribute AbnormalPagingRequest pagingDto) { + return service.findSystemLogsByZoneId(zoneId, pagingDto); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/controller/WorkerLocationController.java b/src/main/java/com/factoreal/backend/domain/zone/api/ZoneHistoryController.java similarity index 64% rename from src/main/java/com/factoreal/backend/controller/WorkerLocationController.java rename to src/main/java/com/factoreal/backend/domain/zone/api/ZoneHistoryController.java index 74bb5a8b..ce38c8ca 100644 --- a/src/main/java/com/factoreal/backend/controller/WorkerLocationController.java +++ b/src/main/java/com/factoreal/backend/domain/zone/api/ZoneHistoryController.java @@ -1,7 +1,7 @@ -package com.factoreal.backend.controller; +package com.factoreal.backend.domain.zone.api; -import com.factoreal.backend.dto.WorkerLocationRequest; -import com.factoreal.backend.service.WorkerLocationService; +import com.factoreal.backend.domain.zone.application.ZoneHistoryService; +import com.factoreal.backend.domain.zone.dto.request.ZoneHistoryRequest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -15,22 +15,20 @@ @Slf4j @Tag(name = "작업자 위치 API", description = "작업자의 실시간 위치 정보를 관리하는 API") @RestController -@RequestMapping("/api/worker-locations") +@RequestMapping("/api/zone-history") @RequiredArgsConstructor -// 웨어러블 디바이스에서 받아오는 데이터를 업데이트하는 컨트롤러 -public class WorkerLocationController { - - private final WorkerLocationService workerLocationService; +public class ZoneHistoryController { + private final ZoneHistoryService zoneHistoryService; @Operation(summary = "작업자 위치 업데이트", description = "웨어러블 디바이스로부터 받은 작업자의 위치 정보를 업데이트합니다.") @PostMapping("/update") - public ResponseEntity updateWorkerLocation(@RequestBody WorkerLocationRequest request) { + public ResponseEntity updateWorkerLocation(@RequestBody ZoneHistoryRequest request) { log.info("작업자 위치 업데이트 요청: {}", request); - workerLocationService.updateWorkerLocation( + zoneHistoryService.updateWorkerLocation( request.getWorkerId(), request.getZoneId(), request.getTimestamp() != null ? request.getTimestamp() : LocalDateTime.now() ); - return ResponseEntity.ok().build(); // 200 OK 응답 + return ResponseEntity.ok().build(); } } \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/service/WorkerLocationService.java b/src/main/java/com/factoreal/backend/domain/zone/application/ZoneHistoryService.java similarity index 66% rename from src/main/java/com/factoreal/backend/service/WorkerLocationService.java rename to src/main/java/com/factoreal/backend/domain/zone/application/ZoneHistoryService.java index b647e731..9ae17a76 100644 --- a/src/main/java/com/factoreal/backend/service/WorkerLocationService.java +++ b/src/main/java/com/factoreal/backend/domain/zone/application/ZoneHistoryService.java @@ -1,25 +1,24 @@ -package com.factoreal.backend.service; - -import com.factoreal.backend.entity.Worker; -import com.factoreal.backend.entity.Zone; -import com.factoreal.backend.entity.ZoneHist; -import com.factoreal.backend.repository.WorkerRepository; -import com.factoreal.backend.repository.ZoneHistRepository; -import com.factoreal.backend.repository.ZoneRepository; +package com.factoreal.backend.domain.zone.application; + +import com.factoreal.backend.domain.worker.entity.Worker; +import com.factoreal.backend.domain.zone.dao.ZoneHistoryRepository; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.zone.entity.ZoneHist; +import com.factoreal.backend.domain.worker.dao.WorkerRepository; +import com.factoreal.backend.domain.zone.dao.ZoneRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.List; @Slf4j @Service @RequiredArgsConstructor -public class WorkerLocationService { +public class ZoneHistoryService { - private final ZoneHistRepository zoneHistRepository; + private final ZoneHistoryRepository zoneHistRepository; private final WorkerRepository workerRepository; private final ZoneRepository zoneRepository; @@ -61,20 +60,4 @@ public void updateWorkerLocation(String workerId, String zoneId, LocalDateTime t currentLocation != null ? currentLocation.getZone().getZoneId() : "없음", zoneId); } - - /** - * 특정 공간에 현재 들어가있는 작업자 리스트 조회 - */ - @Transactional(readOnly = true) - public List getCurrentWorkersByZoneId(String zoneId) { - return zoneHistRepository.findByZone_ZoneIdAndExistFlag(zoneId, 1); // 해당 공간의 existFlag가 1인 모든 작업자 리스트 - } - - /** - * 특정 작업자의 현재 위치 조회 - */ - @Transactional(readOnly = true) - public ZoneHist getCurrentWorkerLocation(String workerId) { - return zoneHistRepository.findByWorker_WorkerIdAndExistFlag(workerId, 1); - } } \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/domain/zone/application/ZoneService.java b/src/main/java/com/factoreal/backend/domain/zone/application/ZoneService.java new file mode 100644 index 00000000..0c08699b --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/zone/application/ZoneService.java @@ -0,0 +1,163 @@ +package com.factoreal.backend.domain.zone.application; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.factoreal.backend.domain.abnormalLog.dao.AbnLogRepository; +import com.factoreal.backend.domain.abnormalLog.dto.request.AbnormalPagingRequest; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; +import com.factoreal.backend.domain.equip.dto.response.EquipDetailResponse; +import com.factoreal.backend.domain.sensor.dto.response.SensorInfoResponse; +import com.factoreal.backend.domain.equip.entity.Equip; +import com.factoreal.backend.domain.sensor.entity.Sensor; +import com.factoreal.backend.domain.equip.dao.EquipRepository; +import com.factoreal.backend.domain.sensor.dao.SensorRepository; +import com.factoreal.backend.domain.zone.dto.request.ZoneCreateRequest; +import com.factoreal.backend.domain.zone.dto.request.ZoneUpdateRequest; +import com.factoreal.backend.domain.zone.dto.response.ZoneDetailResponse; +import com.factoreal.backend.domain.zone.dto.response.ZoneInfoResponse; +import com.factoreal.backend.domain.zone.dto.response.ZoneLogResponse; +import com.factoreal.backend.global.util.IdGenerator; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.zone.dao.ZoneRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +@Service +@Slf4j +@RequiredArgsConstructor +public class ZoneService { + private final ZoneRepository zoneRepository; + private final SensorRepository sensorRepository; + private final EquipRepository equipRepository; + private final AbnLogRepository abnLogRepository; + + @Transactional + public ZoneInfoResponse createZone(ZoneCreateRequest zoneCreateRequest) { + String zoneName = zoneCreateRequest.getZoneName(); + String zoneId = IdGenerator.generateId(); + + validateZoneName(zoneName); + + Zone zone = zoneRepository.save(new Zone(zoneId, zoneName)); + return ZoneInfoResponse.from(zone); + } + + @Transactional + public ZoneInfoResponse updateZone(String zoneName, ZoneUpdateRequest dto) { + // 1. 수정할 공간이 존재하는지 확인 + Zone zone = getZoneByName(zoneName); + + // 2. 새로운 공간명이 이미 존재하는지 확인 + if (!zone.getZoneName().equals(dto.getZoneName())) { + validateZoneName(dto.getZoneName()); + } + + zone.setZoneName(dto.getZoneName()); + Zone updatedZone = zoneRepository.save(zone); + return ZoneInfoResponse.from(updatedZone); + } + + public List getAllZones() { + return zoneRepository.findAll().stream() + .map(ZoneInfoResponse::from) + .collect(Collectors.toList()); + } + + @Transactional + public List getZoneItems() { + + List zones = zoneRepository.findAll(); + + return zones.stream() + .map(zone -> { + + List sensors = sensorRepository.findByZone(zone); + + // 환경 센서 + List envSensors = sensors.stream() + .filter(s -> Objects.equals(s.getZone().getZoneId(), s.getEquip().getEquipId())) + .toList(); + + // 1) Sensor 엔티티 → SensorDto 변환 + List envSensorDtos = envSensors.stream() // List + .map(SensorInfoResponse::from) // Sensor → SensorDto + .toList(); + + + List equips = equipRepository.findEquipsByZone(zone).stream() + .filter(e -> e.getEquipName() != null && !e.getEquipName().equalsIgnoreCase("empty")) + .toList(); // empty이름을 가진 설비(환경센서)는 설비 목록에서 제외하기 + + // 설비 센서 그룹핑 + Map> facGroup = sensors.stream() + .filter(s -> !Objects.equals(s.getZone().getZoneId(), s.getEquip().getEquipId())) + .map(SensorInfoResponse::from) // ★ Sensor → SensorDto + .collect(Collectors.groupingBy(SensorInfoResponse::getEquipId)); + + List facilities = equips.stream() + .map(entry -> { + + String equipId = entry.getEquipId(); + String equipName = equipRepository.findEquipNameByEquipId(equipId); // 1-row 조회 + + List facSensors = facGroup.getOrDefault(equipId, List.of()); + + return EquipDetailResponse.builder() + .equipName(equipName) + .facSensor(facSensors) + .equipId(equipId) + .build(); + }) + .toList(); + + /* 4) ZoneItemDto 조립 */ + return ZoneDetailResponse.builder() + .zoneName(zone.getZoneName()) + .zoneSensorList(envSensorDtos) + .equipList(facilities) + .build(); + }) + .toList(); + } + + @Transactional + public Page findSystemLogsByZoneId(String zoneId, AbnormalPagingRequest pagingDto) { + log.info("공간 ID: {}의 시스템 로그 조회", zoneId); + Pageable pageable = getPageable(pagingDto); + + Page logs = abnLogRepository.findByZone_ZoneIdOrderByDetectedAtDesc(zoneId, pageable); + return logs.map(ZoneLogResponse::from); + } + + private Zone getZoneByName(String zoneName) { + return zoneRepository.findByZoneName(zoneName) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.NOT_FOUND, "존재하지 않는 공간: " + zoneName)); + } + + private void validateZoneName(String zoneName) { + if (zoneRepository.findByZoneName(zoneName).isPresent()) { + throw new ResponseStatusException( + HttpStatus.BAD_REQUEST, "이미 존재하는 공간명: " + zoneName); + } + } + + private Pageable getPageable(AbnormalPagingRequest abnormalPagingDto){ + return PageRequest.of( + abnormalPagingDto.getPage(), + abnormalPagingDto.getSize() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/repository/ZoneHistRepository.java b/src/main/java/com/factoreal/backend/domain/zone/dao/ZoneHistoryRepository.java similarity index 68% rename from src/main/java/com/factoreal/backend/repository/ZoneHistRepository.java rename to src/main/java/com/factoreal/backend/domain/zone/dao/ZoneHistoryRepository.java index ba438d4b..b810d6b7 100644 --- a/src/main/java/com/factoreal/backend/repository/ZoneHistRepository.java +++ b/src/main/java/com/factoreal/backend/domain/zone/dao/ZoneHistoryRepository.java @@ -1,11 +1,11 @@ -package com.factoreal.backend.repository; +package com.factoreal.backend.domain.zone.dao; -import com.factoreal.backend.entity.ZoneHist; +import com.factoreal.backend.domain.zone.entity.ZoneHist; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; -public interface ZoneHistRepository extends JpaRepository { +public interface ZoneHistoryRepository extends JpaRepository { // 특정 공간에 현재 있는 작업자들 조회 (existFlag = 1) List findByZone_ZoneIdAndExistFlag(String zoneId, Integer existFlag); diff --git a/src/main/java/com/factoreal/backend/repository/ZoneRepository.java b/src/main/java/com/factoreal/backend/domain/zone/dao/ZoneRepository.java similarity index 71% rename from src/main/java/com/factoreal/backend/repository/ZoneRepository.java rename to src/main/java/com/factoreal/backend/domain/zone/dao/ZoneRepository.java index 1fee969f..89d65fd7 100644 --- a/src/main/java/com/factoreal/backend/repository/ZoneRepository.java +++ b/src/main/java/com/factoreal/backend/domain/zone/dao/ZoneRepository.java @@ -1,6 +1,6 @@ -package com.factoreal.backend.repository; +package com.factoreal.backend.domain.zone.dao; -import com.factoreal.backend.entity.Zone; +import com.factoreal.backend.domain.zone.entity.Zone; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/src/main/java/com/factoreal/backend/dto/ZoneDto.java b/src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneCreateRequest.java similarity index 68% rename from src/main/java/com/factoreal/backend/dto/ZoneDto.java rename to src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneCreateRequest.java index 23037044..21f5f610 100644 --- a/src/main/java/com/factoreal/backend/dto/ZoneDto.java +++ b/src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneCreateRequest.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.zone.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; @@ -9,7 +9,6 @@ @Setter @NoArgsConstructor @AllArgsConstructor -public class ZoneDto { - private String zoneId; +public class ZoneCreateRequest { private String zoneName; -} \ No newline at end of file +} diff --git a/src/main/java/com/factoreal/backend/dto/WorkerLocationRequest.java b/src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneHistoryRequest.java similarity index 64% rename from src/main/java/com/factoreal/backend/dto/WorkerLocationRequest.java rename to src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneHistoryRequest.java index 7530a47e..4bbb2ad8 100644 --- a/src/main/java/com/factoreal/backend/dto/WorkerLocationRequest.java +++ b/src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneHistoryRequest.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.zone.dto.request; import lombok.Getter; import lombok.Setter; @@ -10,8 +10,8 @@ @Setter @ToString // Wearable 장치에서 받아오는 데이터 by 우영. 추후 논의 예정 -public class WorkerLocationRequest { +public class ZoneHistoryRequest { private String workerId; private String zoneId; - private LocalDateTime timestamp; // 장치에서 받아오는 데이터 + private LocalDateTime timestamp; } \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/dto/ZoneUpdateDto.java b/src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneUpdateRequest.java similarity index 71% rename from src/main/java/com/factoreal/backend/dto/ZoneUpdateDto.java rename to src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneUpdateRequest.java index 3aae102e..e291dcdd 100644 --- a/src/main/java/com/factoreal/backend/dto/ZoneUpdateDto.java +++ b/src/main/java/com/factoreal/backend/domain/zone/dto/request/ZoneUpdateRequest.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.domain.zone.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; @@ -9,6 +9,6 @@ @Setter @NoArgsConstructor @AllArgsConstructor -public class ZoneUpdateDto { +public class ZoneUpdateRequest { private String zoneName; // 수정할 공간명 } diff --git a/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneDetailResponse.java b/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneDetailResponse.java new file mode 100644 index 00000000..20c5a0fa --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneDetailResponse.java @@ -0,0 +1,18 @@ +package com.factoreal.backend.domain.zone.dto.response; + +import com.factoreal.backend.domain.equip.dto.response.EquipDetailResponse; +import com.factoreal.backend.domain.sensor.dto.response.SensorInfoResponse; +import lombok.*; + +import java.util.List; + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ZoneDetailResponse { + private String zoneName; + private List zoneSensorList; + private List equipList; +} diff --git a/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneInfoResponse.java b/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneInfoResponse.java new file mode 100644 index 00000000..424ab3de --- /dev/null +++ b/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneInfoResponse.java @@ -0,0 +1,20 @@ +package com.factoreal.backend.domain.zone.dto.response; + +import com.factoreal.backend.domain.zone.entity.Zone; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ZoneInfoResponse { + private String zoneId; + private String zoneName; + + public static ZoneInfoResponse from(Zone zone) { + return new ZoneInfoResponse(zone.getZoneId(), zone.getZoneName()); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/dto/abnormalLog/SystemLogResponseDto.java b/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneLogResponse.java similarity index 85% rename from src/main/java/com/factoreal/backend/dto/abnormalLog/SystemLogResponseDto.java rename to src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneLogResponse.java index c6fe9ea6..2246a303 100644 --- a/src/main/java/com/factoreal/backend/dto/abnormalLog/SystemLogResponseDto.java +++ b/src/main/java/com/factoreal/backend/domain/zone/dto/response/ZoneLogResponse.java @@ -1,6 +1,7 @@ -package com.factoreal.backend.dto.abnormalLog; +package com.factoreal.backend.domain.zone.dto.response; -import com.factoreal.backend.entity.AbnormalLog; +import com.factoreal.backend.domain.abnormalLog.dto.LogType; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -12,7 +13,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class SystemLogResponseDto { +public class ZoneLogResponse { private String zoneId; private String targetType; private String sensorType; @@ -22,8 +23,8 @@ public class SystemLogResponseDto { private String abnormalType; private String targetId; - public static SystemLogResponseDto fromEntity(AbnormalLog abnormalLog) { - return SystemLogResponseDto.builder() + public static ZoneLogResponse from (AbnormalLog abnormalLog) { + return ZoneLogResponse.builder() .zoneId(abnormalLog.getZone().getZoneId()) .targetType(convertLogTypeToKorean(abnormalLog.getTargetType())) .sensorType(abnormalLog.getTargetType().toString()) diff --git a/src/main/java/com/factoreal/backend/entity/Zone.java b/src/main/java/com/factoreal/backend/domain/zone/entity/Zone.java similarity index 91% rename from src/main/java/com/factoreal/backend/entity/Zone.java rename to src/main/java/com/factoreal/backend/domain/zone/entity/Zone.java index 349e804a..1633e3b2 100644 --- a/src/main/java/com/factoreal/backend/entity/Zone.java +++ b/src/main/java/com/factoreal/backend/domain/zone/entity/Zone.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.zone.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/com/factoreal/backend/entity/ZoneHist.java b/src/main/java/com/factoreal/backend/domain/zone/entity/ZoneHist.java similarity index 89% rename from src/main/java/com/factoreal/backend/entity/ZoneHist.java rename to src/main/java/com/factoreal/backend/domain/zone/entity/ZoneHist.java index d35caa20..1ce251c1 100644 --- a/src/main/java/com/factoreal/backend/entity/ZoneHist.java +++ b/src/main/java/com/factoreal/backend/domain/zone/entity/ZoneHist.java @@ -1,5 +1,6 @@ -package com.factoreal.backend.entity; +package com.factoreal.backend.domain.zone.entity; +import com.factoreal.backend.domain.worker.entity.Worker; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/factoreal/backend/dto/FacilityDto.java b/src/main/java/com/factoreal/backend/dto/FacilityDto.java deleted file mode 100644 index ebcc98ac..00000000 --- a/src/main/java/com/factoreal/backend/dto/FacilityDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.factoreal.backend.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.*; - -import java.util.List; - -@Getter // ← 모든 필드 Getter -@Setter // ← Setter (원하면 삭제) -@Builder // ← ⭐ Builder 자동 생성 -@AllArgsConstructor -@NoArgsConstructor -public class FacilityDto { - - @JsonProperty("name") - private String name; - @JsonProperty("id") - private String id; - @JsonProperty("fac_sensor") - private List facSensor; -} diff --git a/src/main/java/com/factoreal/backend/dto/SensorDataDto.java b/src/main/java/com/factoreal/backend/dto/SensorDataDto.java deleted file mode 100644 index 12fc3224..00000000 --- a/src/main/java/com/factoreal/backend/dto/SensorDataDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.factoreal.backend.dto; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class SensorDataDto { // Kafka -> BE 용 Dto - private String zoneId; - private String equipId; - private String sensorId; - private String sensorType; - private Float val; - private String time; -} diff --git a/src/main/java/com/factoreal/backend/dto/ZoneItemDto.java b/src/main/java/com/factoreal/backend/dto/ZoneItemDto.java deleted file mode 100644 index 46a920c0..00000000 --- a/src/main/java/com/factoreal/backend/dto/ZoneItemDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.factoreal.backend.dto; - - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Builder; - -import java.util.List; - -@Builder -public class ZoneItemDto { - @JsonProperty("title") - private String title; - - @JsonProperty("env_sensor") - private List envSensor; - @JsonProperty("facility") - private List facility; -} diff --git a/src/main/java/com/factoreal/backend/dto/ZoneManagerResponseDto.java b/src/main/java/com/factoreal/backend/dto/ZoneManagerResponseDto.java deleted file mode 100644 index 476c5883..00000000 --- a/src/main/java/com/factoreal/backend/dto/ZoneManagerResponseDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.factoreal.backend.dto; - -import com.factoreal.backend.entity.Worker; -import com.factoreal.backend.entity.Zone; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -// 공간 담당자 정보 조회 시 사용되는 DTO (BE -> FE) -public class ZoneManagerResponseDto { - private String workerId; // 작업자 ID - private String name; // 작업자 이름 - private String phoneNumber; // 연락처 - private String email; // 이메일 - private String currentZoneId; // 현재 위치한 공간 ID - private String currentZoneName; // 현재 위치한 공간 이름 - - public static ZoneManagerResponseDto fromEntity(Worker worker, Zone currentZone) { - return ZoneManagerResponseDto.builder() - .workerId(worker.getWorkerId()) - .name(worker.getName()) - .phoneNumber(worker.getPhoneNumber()) - .email(worker.getEmail()) - .currentZoneId(currentZone != null ? currentZone.getZoneId() : null) - .currentZoneName(currentZone != null ? currentZone.getZoneName() : null) - .build(); - } -} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalTargetTypeDto.java b/src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalTargetTypeDto.java deleted file mode 100644 index b7f7b30d..00000000 --- a/src/main/java/com/factoreal/backend/dto/abnormalLog/AbnormalTargetTypeDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.factoreal.backend.dto.abnormalLog; - -import lombok.Data; - -@Data -public class AbnormalTargetTypeDto { - LogType targetType; - String targetId; -} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/global/common/response/CommonResponse.java b/src/main/java/com/factoreal/backend/global/common/response/CommonResponse.java new file mode 100644 index 00000000..41fa1033 --- /dev/null +++ b/src/main/java/com/factoreal/backend/global/common/response/CommonResponse.java @@ -0,0 +1,37 @@ +package com.factoreal.backend.global.common.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Data +public class CommonResponse { + private boolean success; + private int status; + private T data; + private LocalDateTime timestamp; + + public static CommonResponse onSuccess(int status, T data) { + return CommonResponse.builder() + .success(true) + .status(status) + .data(data) + .timestamp(LocalDateTime.now()) + .build(); + } + + public static CommonResponse onFailure(int status, T data) { + return CommonResponse.builder() + .success(false) + .status(status) + .data(data) + .timestamp(LocalDateTime.now()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/global/common/response/CommonResponseAdvice.java b/src/main/java/com/factoreal/backend/global/common/response/CommonResponseAdvice.java new file mode 100644 index 00000000..b879b54a --- /dev/null +++ b/src/main/java/com/factoreal/backend/global/common/response/CommonResponseAdvice.java @@ -0,0 +1,44 @@ +package com.factoreal.backend.global.common.response; + +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.core.MethodParameter; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +@RestControllerAdvice(basePackages = "com.factoreal.backend") +public class CommonResponseAdvice implements ResponseBodyAdvice { + @Override + public boolean supports(MethodParameter returnType, Class converterType) { + return true; // 어떤 응답을 가로채서 반환할 것인지 -> 모든 응답 가로채기 + } + + @Override + public Object beforeBodyWrite( + Object body, + MethodParameter returnType, + MediaType selectedContentType, + Class selectedConverterType, + ServerHttpRequest request, + ServerHttpResponse response) { + HttpServletResponse httpServletResponse = + ((ServletServerHttpResponse) response).getServletResponse(); + int status = httpServletResponse.getStatus(); + HttpStatus resolve = HttpStatus.resolve(status); + + if (resolve == null || body instanceof String || body instanceof Resource) { + return body; + } + + if (resolve.is2xxSuccessful()) { + return CommonResponse.onSuccess(status, body); + } + + return body; + } +} diff --git a/src/main/java/com/factoreal/backend/config/AwsServiceConfig.java b/src/main/java/com/factoreal/backend/global/config/AwsServiceConfig.java similarity index 97% rename from src/main/java/com/factoreal/backend/config/AwsServiceConfig.java rename to src/main/java/com/factoreal/backend/global/config/AwsServiceConfig.java index 78603cbd..11301acc 100644 --- a/src/main/java/com/factoreal/backend/config/AwsServiceConfig.java +++ b/src/main/java/com/factoreal/backend/global/config/AwsServiceConfig.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.config; +package com.factoreal.backend.global.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/com/factoreal/backend/config/ElasticsearchConfig.java b/src/main/java/com/factoreal/backend/global/config/ElasticsearchConfig.java similarity index 94% rename from src/main/java/com/factoreal/backend/config/ElasticsearchConfig.java rename to src/main/java/com/factoreal/backend/global/config/ElasticsearchConfig.java index 817a6615..c31a1ea5 100644 --- a/src/main/java/com/factoreal/backend/config/ElasticsearchConfig.java +++ b/src/main/java/com/factoreal/backend/global/config/ElasticsearchConfig.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.config; +package com.factoreal.backend.global.config; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; diff --git a/src/main/java/com/factoreal/backend/config/WebConfig.java b/src/main/java/com/factoreal/backend/global/config/WebConfig.java similarity index 95% rename from src/main/java/com/factoreal/backend/config/WebConfig.java rename to src/main/java/com/factoreal/backend/global/config/WebConfig.java index 040b5848..0d0b32ee 100644 --- a/src/main/java/com/factoreal/backend/config/WebConfig.java +++ b/src/main/java/com/factoreal/backend/global/config/WebConfig.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.config; +package com.factoreal.backend.global.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/factoreal/backend/util/ZoneIdGenerator.java b/src/main/java/com/factoreal/backend/global/util/IdGenerator.java similarity index 79% rename from src/main/java/com/factoreal/backend/util/ZoneIdGenerator.java rename to src/main/java/com/factoreal/backend/global/util/IdGenerator.java index c5273512..0298e52f 100644 --- a/src/main/java/com/factoreal/backend/util/ZoneIdGenerator.java +++ b/src/main/java/com/factoreal/backend/global/util/IdGenerator.java @@ -1,17 +1,17 @@ -package com.factoreal.backend.util; +package com.factoreal.backend.global.util; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Random; -public class ZoneIdGenerator { + +public class IdGenerator { private static final Random RANDOM = new Random(); private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); - public static String generateZoneId() { + public static String generateId() { String now = LocalDateTime.now().format(FORMATTER); int randomSuffix = RANDOM.nextInt(900) + 100; // 100~999 return now + "-" + randomSuffix; } - -} \ No newline at end of file +} diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/alarmMessage/RiskMessageProvider.java b/src/main/java/com/factoreal/backend/kafka/strategy/alarmMessage/RiskMessageProvider.java deleted file mode 100644 index 97516636..00000000 --- a/src/main/java/com/factoreal/backend/kafka/strategy/alarmMessage/RiskMessageProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.factoreal.backend.kafka.strategy.alarmMessage; - -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; -import com.factoreal.backend.kafka.strategy.enums.SensorType; - -public interface RiskMessageProvider { - String getMessage(SensorType sensorType, RiskLevel riskLevel); -} diff --git a/src/main/java/com/factoreal/backend/dto/SystemLogDto.java b/src/main/java/com/factoreal/backend/messaging/common/dto/SystemLogDto.java similarity index 92% rename from src/main/java/com/factoreal/backend/dto/SystemLogDto.java rename to src/main/java/com/factoreal/backend/messaging/common/dto/SystemLogDto.java index dc1b07c9..91d03be2 100644 --- a/src/main/java/com/factoreal/backend/dto/SystemLogDto.java +++ b/src/main/java/com/factoreal/backend/messaging/common/dto/SystemLogDto.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.messaging.common.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/factoreal/backend/dto/ZoneDangerDto.java b/src/main/java/com/factoreal/backend/messaging/common/dto/ZoneDangerDto.java similarity index 84% rename from src/main/java/com/factoreal/backend/dto/ZoneDangerDto.java rename to src/main/java/com/factoreal/backend/messaging/common/dto/ZoneDangerDto.java index bc77c7d2..cbfdf6d8 100644 --- a/src/main/java/com/factoreal/backend/dto/ZoneDangerDto.java +++ b/src/main/java/com/factoreal/backend/messaging/common/dto/ZoneDangerDto.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.dto; +package com.factoreal.backend.messaging.common.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/factoreal/backend/util/SslUtil.java b/src/main/java/com/factoreal/backend/messaging/common/util/SslUtil.java similarity index 99% rename from src/main/java/com/factoreal/backend/util/SslUtil.java rename to src/main/java/com/factoreal/backend/messaging/common/util/SslUtil.java index 535d1453..2096819e 100644 --- a/src/main/java/com/factoreal/backend/util/SslUtil.java +++ b/src/main/java/com/factoreal/backend/messaging/common/util/SslUtil.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.util; +package com.factoreal.backend.messaging.common.util; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/com/factoreal/backend/config/AwsMqttListener.java b/src/main/java/com/factoreal/backend/messaging/config/AwsMqttListener.java similarity index 93% rename from src/main/java/com/factoreal/backend/config/AwsMqttListener.java rename to src/main/java/com/factoreal/backend/messaging/config/AwsMqttListener.java index 4cef5777..0c07e061 100644 --- a/src/main/java/com/factoreal/backend/config/AwsMqttListener.java +++ b/src/main/java/com/factoreal/backend/messaging/config/AwsMqttListener.java @@ -1,10 +1,10 @@ -package com.factoreal.backend.config; +package com.factoreal.backend.messaging.config; +import com.factoreal.backend.domain.sensor.dto.request.SensorCreateRequest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.factoreal.backend.dto.SensorDto; -import com.factoreal.backend.service.SensorService; -import com.factoreal.backend.util.SslUtil; +import com.factoreal.backend.domain.sensor.application.SensorService; +import com.factoreal.backend.messaging.common.util.SslUtil; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -86,7 +86,7 @@ public void connect() throws Exception { String sensorId = jsonNode.at("/id").asText(); String type = jsonNode.at("/type").asText(); // SensorDto dto = new SensorDto(sensorId, type); - SensorDto dto = new SensorDto(); + SensorCreateRequest dto = new SensorCreateRequest(); sensorService.saveSensor(dto); // 중복이면 예외 발생 log.info("✅ 센서 저장 완료: {}", sensorId); } catch (DataIntegrityViolationException e) { diff --git a/src/main/java/com/factoreal/backend/config/MqttConfig.java b/src/main/java/com/factoreal/backend/messaging/config/MqttConfig.java similarity index 95% rename from src/main/java/com/factoreal/backend/config/MqttConfig.java rename to src/main/java/com/factoreal/backend/messaging/config/MqttConfig.java index d201773e..22244ea9 100644 --- a/src/main/java/com/factoreal/backend/config/MqttConfig.java +++ b/src/main/java/com/factoreal/backend/messaging/config/MqttConfig.java @@ -1,6 +1,6 @@ -package com.factoreal.backend.config; +package com.factoreal.backend.messaging.config; -import com.factoreal.backend.util.SslUtil; +import com.factoreal.backend.messaging.common.util.SslUtil; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; diff --git a/src/main/java/com/factoreal/backend/config/WebSocketConfig.java b/src/main/java/com/factoreal/backend/messaging/config/WebSocketConfig.java similarity index 94% rename from src/main/java/com/factoreal/backend/config/WebSocketConfig.java rename to src/main/java/com/factoreal/backend/messaging/config/WebSocketConfig.java index 50d6c27c..8edae0f2 100644 --- a/src/main/java/com/factoreal/backend/config/WebSocketConfig.java +++ b/src/main/java/com/factoreal/backend/messaging/config/WebSocketConfig.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.config; +package com.factoreal.backend.messaging.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; diff --git a/src/main/java/com/factoreal/backend/kafka/KafkaConsumerD.java b/src/main/java/com/factoreal/backend/messaging/kafka/KafkaConsumerD.java similarity index 92% rename from src/main/java/com/factoreal/backend/kafka/KafkaConsumerD.java rename to src/main/java/com/factoreal/backend/messaging/kafka/KafkaConsumerD.java index e79d016d..ffd2ea11 100644 --- a/src/main/java/com/factoreal/backend/kafka/KafkaConsumerD.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/KafkaConsumerD.java @@ -1,17 +1,18 @@ -package com.factoreal.backend.kafka; - -import com.factoreal.backend.dto.SensorKafkaDto; -import com.factoreal.backend.dto.abnormalLog.LogType; -import com.factoreal.backend.entity.AbnormalLog; -import com.factoreal.backend.dto.SystemLogDto; -import com.factoreal.backend.sender.WebSocketSender; -import com.factoreal.backend.service.ZoneService; -import com.factoreal.backend.service.AbnormalLogService; -import com.factoreal.backend.kafka.strategy.alarmList.NotificationStrategy; -import com.factoreal.backend.kafka.strategy.NotificationStrategyFactory; -import com.factoreal.backend.kafka.strategy.enums.AlarmEventDto; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; -import com.factoreal.backend.kafka.strategy.enums.SensorType; +package com.factoreal.backend.messaging.kafka; + +import com.factoreal.backend.domain.sensor.dto.SensorKafkaDto; +import com.factoreal.backend.domain.abnormalLog.dto.LogType; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; +import com.factoreal.backend.domain.zone.dao.ZoneRepository; +import com.factoreal.backend.messaging.common.dto.SystemLogDto; +import com.factoreal.backend.messaging.sender.WebSocketSender; +import com.factoreal.backend.domain.zone.application.ZoneService; +import com.factoreal.backend.domain.abnormalLog.application.AbnormalLogService; +import com.factoreal.backend.messaging.kafka.strategy.alarmList.NotificationStrategy; +import com.factoreal.backend.messaging.kafka.strategy.NotificationStrategyFactory; +import com.factoreal.backend.messaging.kafka.strategy.enums.AlarmEventDto; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -22,8 +23,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import com.factoreal.backend.service.SensorService; -import com.factoreal.backend.entity.Sensor; +import com.factoreal.backend.domain.sensor.application.SensorService; +import com.factoreal.backend.domain.sensor.entity.Sensor; import java.time.ZonedDateTime; import java.time.ZoneId; @@ -40,6 +41,7 @@ public class KafkaConsumerD { private final ObjectMapper objectMapper; private final WebSocketSender webSocketSender; + private final ZoneRepository zoneRepository; private final ZoneService zoneService; // 알람 푸시 용 @@ -259,7 +261,7 @@ private AlarmEventDto generateAlarmDto(SensorKafkaDto data, AbnormalLog abnormal String source = data.getZoneId().equals(data.getEquipId()) ? "공간 센서" : "설비 센서"; SensorType sensorType = SensorType.valueOf(data.getSensorType()); - String zoneName = zoneService.getZone(data.getZoneId()).getZoneName(); + String zoneName = zoneRepository.findByZoneId(data.getZoneId()).getZoneName(); // 알람 이벤트 객체 반환 return AlarmEventDto.builder() .eventId(abnormalLog.getId()) diff --git a/src/main/java/com/factoreal/backend/kafka/consumer/KafkaConsumer.java b/src/main/java/com/factoreal/backend/messaging/kafka/consumer/KafkaConsumer.java similarity index 90% rename from src/main/java/com/factoreal/backend/kafka/consumer/KafkaConsumer.java rename to src/main/java/com/factoreal/backend/messaging/kafka/consumer/KafkaConsumer.java index 7a3cfff5..4e888aff 100644 --- a/src/main/java/com/factoreal/backend/kafka/consumer/KafkaConsumer.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/consumer/KafkaConsumer.java @@ -1,7 +1,7 @@ -package com.factoreal.backend.kafka.consumer; +package com.factoreal.backend.messaging.kafka.consumer; -import com.factoreal.backend.dto.SensorKafkaDto; -import com.factoreal.backend.kafka.processor.SensorEventProcessor; +import com.factoreal.backend.domain.sensor.dto.SensorKafkaDto; +import com.factoreal.backend.messaging.kafka.processor.SensorEventProcessor; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/factoreal/backend/kafka/processor/SensorEventProcessor.java b/src/main/java/com/factoreal/backend/messaging/kafka/processor/SensorEventProcessor.java similarity index 86% rename from src/main/java/com/factoreal/backend/kafka/processor/SensorEventProcessor.java rename to src/main/java/com/factoreal/backend/messaging/kafka/processor/SensorEventProcessor.java index 32c2764a..b4c89ced 100644 --- a/src/main/java/com/factoreal/backend/kafka/processor/SensorEventProcessor.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/processor/SensorEventProcessor.java @@ -1,14 +1,14 @@ -package com.factoreal.backend.kafka.processor; - -import com.factoreal.backend.dto.SensorKafkaDto; -import com.factoreal.backend.dto.abnormalLog.LogType; -import com.factoreal.backend.entity.AbnormalLog; -import com.factoreal.backend.sender.WebSocketSender; -import com.factoreal.backend.service.AbnormalLogService; -import com.factoreal.backend.service.AlarmEventService; -import com.factoreal.backend.service.AutoControlService; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; -import com.factoreal.backend.kafka.strategy.enums.SensorType; +package com.factoreal.backend.messaging.kafka.processor; + +import com.factoreal.backend.domain.sensor.dto.SensorKafkaDto; +import com.factoreal.backend.domain.abnormalLog.dto.LogType; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; +import com.factoreal.backend.messaging.sender.WebSocketSender; +import com.factoreal.backend.domain.abnormalLog.application.AbnormalLogService; +import com.factoreal.backend.messaging.service.AlarmEventService; +import com.factoreal.backend.messaging.service.AutoControlService; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/NotificationStrategyFactory.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/NotificationStrategyFactory.java similarity index 88% rename from src/main/java/com/factoreal/backend/kafka/strategy/NotificationStrategyFactory.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/NotificationStrategyFactory.java index 34b0a58f..afd38964 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/NotificationStrategyFactory.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/NotificationStrategyFactory.java @@ -1,7 +1,7 @@ -package com.factoreal.backend.kafka.strategy; +package com.factoreal.backend.messaging.kafka.strategy; -import com.factoreal.backend.kafka.strategy.alarmList.NotificationStrategy; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.alarmList.NotificationStrategy; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; import org.springframework.stereotype.Component; import java.util.List; diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/AppPushNotificationStrategy.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/AppPushNotificationStrategy.java similarity index 67% rename from src/main/java/com/factoreal/backend/kafka/strategy/alarmList/AppPushNotificationStrategy.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/AppPushNotificationStrategy.java index b0279f22..61bc0814 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/AppPushNotificationStrategy.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/AppPushNotificationStrategy.java @@ -1,7 +1,7 @@ -package com.factoreal.backend.kafka.strategy.alarmList; +package com.factoreal.backend.messaging.kafka.strategy.alarmList; -import com.factoreal.backend.kafka.strategy.enums.AlarmEventDto; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.AlarmEventDto; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/NotificationStrategy.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/NotificationStrategy.java similarity index 63% rename from src/main/java/com/factoreal/backend/kafka/strategy/alarmList/NotificationStrategy.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/NotificationStrategy.java index 0f1fd6c8..02242a5b 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/NotificationStrategy.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/NotificationStrategy.java @@ -1,7 +1,7 @@ -package com.factoreal.backend.kafka.strategy.alarmList; +package com.factoreal.backend.messaging.kafka.strategy.alarmList; -import com.factoreal.backend.kafka.strategy.enums.AlarmEventDto; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.AlarmEventDto; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; public interface NotificationStrategy { void send(AlarmEventDto alarmEventDto); diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/SmsNotificationStrategy.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/SmsNotificationStrategy.java similarity index 85% rename from src/main/java/com/factoreal/backend/kafka/strategy/alarmList/SmsNotificationStrategy.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/SmsNotificationStrategy.java index 76c84cf6..f88bc7c5 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/SmsNotificationStrategy.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/SmsNotificationStrategy.java @@ -1,9 +1,9 @@ -package com.factoreal.backend.kafka.strategy.alarmList; +package com.factoreal.backend.messaging.kafka.strategy.alarmList; -import com.factoreal.backend.kafka.strategy.enums.AlarmEventDto; -import com.factoreal.backend.entity.Worker; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; -import com.factoreal.backend.repository.WorkerRepository; +import com.factoreal.backend.messaging.kafka.strategy.enums.AlarmEventDto; +import com.factoreal.backend.domain.worker.entity.Worker; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.domain.worker.dao.WorkerRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/WebSocketNotificationStrategy.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/WebSocketNotificationStrategy.java similarity index 78% rename from src/main/java/com/factoreal/backend/kafka/strategy/alarmList/WebSocketNotificationStrategy.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/WebSocketNotificationStrategy.java index 269da77d..237f2c91 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/alarmList/WebSocketNotificationStrategy.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmList/WebSocketNotificationStrategy.java @@ -1,8 +1,8 @@ -package com.factoreal.backend.kafka.strategy.alarmList; +package com.factoreal.backend.messaging.kafka.strategy.alarmList; -import com.factoreal.backend.sender.WebSocketSender; -import com.factoreal.backend.kafka.strategy.enums.AlarmEventDto; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.sender.WebSocketSender; +import com.factoreal.backend.messaging.kafka.strategy.enums.AlarmEventDto; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/alarmMessage/DefaultRiskMessageProvider.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmMessage/DefaultRiskMessageProvider.java similarity index 90% rename from src/main/java/com/factoreal/backend/kafka/strategy/alarmMessage/DefaultRiskMessageProvider.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmMessage/DefaultRiskMessageProvider.java index 347deedd..3e8315dc 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/alarmMessage/DefaultRiskMessageProvider.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmMessage/DefaultRiskMessageProvider.java @@ -1,7 +1,7 @@ -package com.factoreal.backend.kafka.strategy.alarmMessage; +package com.factoreal.backend.messaging.kafka.strategy.alarmMessage; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; -import com.factoreal.backend.kafka.strategy.enums.SensorType; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; import org.springframework.stereotype.Component; @Component diff --git a/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmMessage/RiskMessageProvider.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmMessage/RiskMessageProvider.java new file mode 100644 index 00000000..9e0ffd2b --- /dev/null +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/alarmMessage/RiskMessageProvider.java @@ -0,0 +1,8 @@ +package com.factoreal.backend.messaging.kafka.strategy.alarmMessage; + +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; + +public interface RiskMessageProvider { + String getMessage(SensorType sensorType, RiskLevel riskLevel); +} diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/enums/AlarmEventDto.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/AlarmEventDto.java similarity index 95% rename from src/main/java/com/factoreal/backend/kafka/strategy/enums/AlarmEventDto.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/AlarmEventDto.java index caf29649..e62cca36 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/enums/AlarmEventDto.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/AlarmEventDto.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.kafka.strategy.enums; +package com.factoreal.backend.messaging.kafka.strategy.enums; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/enums/RiskLevel.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/RiskLevel.java similarity index 93% rename from src/main/java/com/factoreal/backend/kafka/strategy/enums/RiskLevel.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/RiskLevel.java index f0f232bc..462751be 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/enums/RiskLevel.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/RiskLevel.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.kafka.strategy.enums; +package com.factoreal.backend.messaging.kafka.strategy.enums; import lombok.Getter; diff --git a/src/main/java/com/factoreal/backend/kafka/strategy/enums/SensorType.java b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/SensorType.java similarity index 77% rename from src/main/java/com/factoreal/backend/kafka/strategy/enums/SensorType.java rename to src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/SensorType.java index e036b306..3971321c 100644 --- a/src/main/java/com/factoreal/backend/kafka/strategy/enums/SensorType.java +++ b/src/main/java/com/factoreal/backend/messaging/kafka/strategy/enums/SensorType.java @@ -1,4 +1,4 @@ -package com.factoreal.backend.kafka.strategy.enums; +package com.factoreal.backend.messaging.kafka.strategy.enums; public enum SensorType { current, diff --git a/src/main/java/com/factoreal/backend/mqtt/MqttService.java b/src/main/java/com/factoreal/backend/messaging/mqtt/MqttService.java similarity index 89% rename from src/main/java/com/factoreal/backend/mqtt/MqttService.java rename to src/main/java/com/factoreal/backend/messaging/mqtt/MqttService.java index c6ca290a..fc1a6f68 100644 --- a/src/main/java/com/factoreal/backend/mqtt/MqttService.java +++ b/src/main/java/com/factoreal/backend/messaging/mqtt/MqttService.java @@ -1,8 +1,7 @@ -package com.factoreal.backend.mqtt; +package com.factoreal.backend.messaging.mqtt; -import com.factoreal.backend.dto.EquipDto; -import com.factoreal.backend.dto.SensorDto; -import com.factoreal.backend.service.SensorService; +import com.factoreal.backend.domain.sensor.application.SensorService; +import com.factoreal.backend.domain.sensor.dto.request.SensorCreateRequest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.PostConstruct; @@ -12,7 +11,6 @@ import org.eclipse.paho.client.mqttv3.MqttException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; @@ -53,7 +51,7 @@ public void SensorShadowSubscription() throws MqttException { Integer iszone = equipId.equals(zoneId) ? 1 : 0; - SensorDto dto = new SensorDto(sensorId, type , zoneId, equipId, null, null, iszone); + SensorCreateRequest dto = new SensorCreateRequest(sensorId, type , zoneId, equipId, null, null, iszone); sensorService.saveSensor(dto); // 중복이면 예외 발생 log.info("✅ 센서 저장 완료: {}", sensorId); } catch (DataIntegrityViolationException e) { diff --git a/src/main/java/com/factoreal/backend/sender/WebSocketSender.java b/src/main/java/com/factoreal/backend/messaging/sender/WebSocketSender.java similarity index 83% rename from src/main/java/com/factoreal/backend/sender/WebSocketSender.java rename to src/main/java/com/factoreal/backend/messaging/sender/WebSocketSender.java index b57e485d..8d5a4111 100644 --- a/src/main/java/com/factoreal/backend/sender/WebSocketSender.java +++ b/src/main/java/com/factoreal/backend/messaging/sender/WebSocketSender.java @@ -1,8 +1,8 @@ -package com.factoreal.backend.sender; +package com.factoreal.backend.messaging.sender; -import com.factoreal.backend.dto.SystemLogDto; -import com.factoreal.backend.dto.ZoneDangerDto; -import com.factoreal.backend.kafka.strategy.enums.AlarmEventDto; +import com.factoreal.backend.messaging.common.dto.SystemLogDto; +import com.factoreal.backend.messaging.common.dto.ZoneDangerDto; +import com.factoreal.backend.messaging.kafka.strategy.enums.AlarmEventDto; import lombok.RequiredArgsConstructor; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/factoreal/backend/service/AlarmEventService.java b/src/main/java/com/factoreal/backend/messaging/service/AlarmEventService.java similarity index 82% rename from src/main/java/com/factoreal/backend/service/AlarmEventService.java rename to src/main/java/com/factoreal/backend/messaging/service/AlarmEventService.java index 206c703f..0b462454 100644 --- a/src/main/java/com/factoreal/backend/service/AlarmEventService.java +++ b/src/main/java/com/factoreal/backend/messaging/service/AlarmEventService.java @@ -1,12 +1,13 @@ -package com.factoreal.backend.service; +package com.factoreal.backend.messaging.service; -import com.factoreal.backend.dto.SensorKafkaDto; -import com.factoreal.backend.entity.AbnormalLog; -import com.factoreal.backend.kafka.strategy.alarmList.NotificationStrategy; -import com.factoreal.backend.kafka.strategy.NotificationStrategyFactory; -import com.factoreal.backend.kafka.strategy.enums.AlarmEventDto; -import com.factoreal.backend.kafka.strategy.enums.RiskLevel; -import com.factoreal.backend.kafka.strategy.enums.SensorType; +import com.factoreal.backend.domain.sensor.dto.SensorKafkaDto; +import com.factoreal.backend.domain.abnormalLog.entity.AbnormalLog; +import com.factoreal.backend.domain.zone.dao.ZoneRepository; +import com.factoreal.backend.messaging.kafka.strategy.alarmList.NotificationStrategy; +import com.factoreal.backend.messaging.kafka.strategy.NotificationStrategyFactory; +import com.factoreal.backend.messaging.kafka.strategy.enums.AlarmEventDto; +import com.factoreal.backend.messaging.kafka.strategy.enums.RiskLevel; +import com.factoreal.backend.messaging.kafka.strategy.enums.SensorType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -20,7 +21,7 @@ public class AlarmEventService { // 위험 레벨별 알람 전략을 가져오기 위한 팩토리 서비스 private final NotificationStrategyFactory notificationStrategyFactory; - private final ZoneService zoneService; + private final ZoneRepository zoneRepository; // Todo 추후 Flink에서 SensorKafkaDto에 dangerLevel을 포함하면 제거 public void startAlarm(SensorKafkaDto sensorData, AbnormalLog abnormalLog, int dangerLevel) { AlarmEventDto alarmEventDto; @@ -50,7 +51,7 @@ private AlarmEventDto generateAlarmDto(SensorKafkaDto data, AbnormalLog abnormal String source = data.getZoneId().equals(data.getEquipId()) ? "공간 센서" : "설비 센서"; SensorType sensorType = SensorType.valueOf(data.getSensorType()); - String zoneName = zoneService.getZone(data.getZoneId()).getZoneName(); + String zoneName = zoneRepository.findByZoneId(data.getZoneId()).getZoneName(); // 알람 이벤트 객체 반환 return AlarmEventDto.builder() .eventId(abnormalLog.getId()) diff --git a/src/main/java/com/factoreal/backend/service/AutoControlService.java b/src/main/java/com/factoreal/backend/messaging/service/AutoControlService.java similarity index 91% rename from src/main/java/com/factoreal/backend/service/AutoControlService.java rename to src/main/java/com/factoreal/backend/messaging/service/AutoControlService.java index 09fafc20..344c792d 100644 --- a/src/main/java/com/factoreal/backend/service/AutoControlService.java +++ b/src/main/java/com/factoreal/backend/messaging/service/AutoControlService.java @@ -1,8 +1,8 @@ -package com.factoreal.backend.service; +package com.factoreal.backend.messaging.service; -import com.factoreal.backend.dto.SensorKafkaDto; -import com.factoreal.backend.entity.Sensor; -import com.factoreal.backend.repository.SensorRepository; +import com.factoreal.backend.domain.sensor.dto.SensorKafkaDto; +import com.factoreal.backend.domain.sensor.entity.Sensor; +import com.factoreal.backend.domain.sensor.dao.SensorRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/factoreal/backend/service/EquipService.java b/src/main/java/com/factoreal/backend/service/EquipService.java deleted file mode 100644 index daed1256..00000000 --- a/src/main/java/com/factoreal/backend/service/EquipService.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.factoreal.backend.service; - -import com.factoreal.backend.dto.EquipCreateRequest; -import com.factoreal.backend.dto.EquipDto; -import com.factoreal.backend.dto.EquipUpdateDto; -import com.factoreal.backend.entity.Equip; -import com.factoreal.backend.entity.Zone; -import com.factoreal.backend.repository.EquipRepository; -import com.factoreal.backend.repository.ZoneRepository; -import com.factoreal.backend.util.EquipIdGenerator; -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.web.server.ResponseStatusException; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class EquipService { - private final EquipRepository equipRepo; - private final ZoneRepository zoneRepo; - - // 설비 등록 - @Transactional - public Equip saveEquip(EquipDto dto) { - Zone zone = zoneRepo.findById(dto.getZoneId()) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.NOT_FOUND, "존재하지 않는 공간 ID: " + dto.getZoneId())); - // 설비 정보 저장 - Equip equips = new Equip(); - equips.setEquipId(zone.getZoneId()); - equips.setEquipName(dto.getEquipName()); - equips.setZone(zone); - return equipRepo.save(equips); - } - - - // 설비 생성 - @Transactional - public EquipDto createEquip(EquipCreateRequest req) { - // 1. UI에서 입력받은 zoneName으로 zoneId 조회 - Zone zone = zoneRepo.findByZoneName(req.getZoneName()) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.BAD_REQUEST, "존재하지 않는 공간명: " + req.getZoneName())); - - // 2. 고유한 설비ID 생성 - String equipId = EquipIdGenerator.generateEquipId(); - - // 3. 설비 정보 저장 - Equip equip = new Equip(equipId, req.getEquipName(), zone); - equipRepo.save(equip); - - // 4. DTO로 반환 - return new EquipDto(equipId, req.getEquipName(), zone.getZoneName(), zone.getZoneId()); - - } - - // 설비 정보 수정 - @Transactional - public EquipDto updateEquip(String equipId, EquipUpdateDto dto) { - // 1. 수정할 설비가 존재하는지 확인 - Equip equip = equipRepo.findById(equipId) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.NOT_FOUND, "존재하지 않는 설비 ID: " + equipId)); - - // 2. 설비명 업데이트 - equip.setEquipName(dto.getEquipName()); - Equip updated = equipRepo.save(equip); - - // 3. DTO로 반환 - Zone zone = zoneRepo.findById(updated.getZone().getZoneId()) - .orElse(new Zone("", "미등록 공간")); - - return new EquipDto( - updated.getEquipId(), - updated.getEquipName(), - zone.getZoneName(), - zone.getZoneId() - ); - - } - - - // 모든 설비 조회 - public List getAllEquips() { - return equipRepo.findAll().stream() - .map(equip -> { - Zone zone = zoneRepo.findById(equip.getZone().getZoneId()) - .orElse(new Zone("", "미등록 공간")); - return new EquipDto( - equip.getEquipId(), - equip.getEquipName(), - zone.getZoneName(), - equip.getZone().getZoneId() - ); - }) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/factoreal/backend/service/SensorService.java b/src/main/java/com/factoreal/backend/service/SensorService.java deleted file mode 100644 index 3e78d1d4..00000000 --- a/src/main/java/com/factoreal/backend/service/SensorService.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.factoreal.backend.service; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import com.factoreal.backend.kafka.strategy.enums.SensorType; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.server.ResponseStatusException; - -import com.factoreal.backend.dto.SensorDto; -import com.factoreal.backend.dto.SensorUpdateDto; -import com.factoreal.backend.entity.Equip; -import com.factoreal.backend.entity.Sensor; -import com.factoreal.backend.entity.Zone; -import com.factoreal.backend.repository.EquipRepository; -import com.factoreal.backend.repository.SensorRepository; -import com.factoreal.backend.repository.ZoneRepository; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class SensorService { - private final SensorRepository repo; - private final ZoneRepository zoneRepo; - private final EquipRepository equipRepo; - - // 센서 등록 - @Transactional - public Sensor saveSensor(SensorDto dto) { - // 1. Zone 존재 여부 확인 - Zone zone = zoneRepo.findById(dto.getZoneId()) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.NOT_FOUND, "존재하지 않는 공간 ID: " + dto.getZoneId())); - - // 2. Equip 존재 여부 확인 - Optional equip = Optional.ofNullable(equipRepo.findByEquipId(dto.getEquipId()) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.NOT_FOUND, "존재하지 않는 설비 ID: " + dto.getEquipId()))); - if(equip.isEmpty()) { - log.info("존재하지 않는 설비 ID"); - - } - // 3. 센서 정보 저장 - Sensor sens = new Sensor(); - sens.setSensorId(dto.getSensorId()); - sens.setSensorType(SensorType.valueOf(dto.getSensorType())); - sens.setZone(zone); - sens.setEquip(equip.get()); - sens.setIsZone(dto.getIsZone()); - return repo.save(sens); - } - - // 센서 전체 리스트 조회 - public List getAllSensors() { - return repo.findAll().stream() - .map(s -> new SensorDto( - s.getSensorId(), - s.getSensorType().toString(), - s.getZone().getZoneId(), - s.getEquip().getEquipId(), - s.getSensorThres(), - s.getAllowVal(), - s.getIsZone() - )) - .collect(Collectors.toList()); - } - - // Sensor Table 업데이트 - @Transactional - public void updateSensor(String sensorId, SensorUpdateDto dto) { - Sensor sensor = repo.findBySensorId(sensorId) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.NOT_FOUND, "존재하지 않는 센서 ID: " + sensorId)); - sensor.setSensorThres(dto.getSensorThres()); - sensor.setAllowVal(dto.getAllowVal()); - repo.save(sensor); - } - - /** 이전에 repository를 직접 호출하던 부분을 메서드로 분리 */ - // 센서 ID로 Sensor 엔티티 조회 - public Sensor getSensorById(String sensorId) { - return repo.findBySensorId(sensorId) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.NOT_FOUND, "존재하지 않는 센서 ID: " + sensorId)); - } -} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/service/ZoneService.java b/src/main/java/com/factoreal/backend/service/ZoneService.java deleted file mode 100644 index 39517073..00000000 --- a/src/main/java/com/factoreal/backend/service/ZoneService.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.factoreal.backend.service; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -import com.factoreal.backend.dto.*; -import com.factoreal.backend.entity.Equip; -import com.factoreal.backend.entity.Sensor; -import com.factoreal.backend.repository.EquipRepository; -import com.factoreal.backend.repository.SensorRepository; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.web.server.ResponseStatusException; - -import com.factoreal.backend.entity.Zone; -import com.factoreal.backend.repository.ZoneRepository; -import com.factoreal.backend.util.ZoneIdGenerator; - -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class ZoneService { - private final ZoneRepository repo; - - private final SensorRepository sensorRepo; - private final EquipRepository equipRepo; - - private final EquipService equipService; - // 1. 공간명 중복 체크 -> 2. 고유한 공간ID 할당 -> 3. save 한 뒤 DTO로 반환 - @Transactional - public ZoneDto createZone(String zoneName) { - // 1. 공간명 중복 체크 - if (repo.findByZoneName(zoneName).isPresent()) { - throw new ResponseStatusException( - HttpStatus.BAD_REQUEST, "이미 존재하는 공간명: " + zoneName); - } - // 2. 고유한 공간ID 할당 - String zoneId = ZoneIdGenerator.generateZoneId(); - // 3. save 한 뒤 DTO로 반환 - Zone zone = repo.save(new Zone(zoneId, zoneName)); - // 4. equip_id 가 없는 (설비 명이 없는 데이터를 위한 빈 equip_객체 생성) - //equipRepo. - EquipDto equipDto = EquipDto - .builder() - .equipName("empty") - .zoneId(zoneId) - .zoneName(zoneName) - .build(); - equipService.saveEquip(equipDto); - return new ZoneDto(zone.getZoneId(), zone.getZoneName()); - } - - // 공간정보 업데이트 - @Transactional - public ZoneDto updateZone(String zoneName, ZoneUpdateDto dto) { - // 1. 수정할 공간이 존재하는지 확인 - Zone zone = repo.findByZoneName(zoneName) - .orElseThrow(() -> new ResponseStatusException( - HttpStatus.NOT_FOUND, "존재하지 않는 공간: " + zoneName)); - - // 2. 새로운 공간명이 이미 존재하는지 확인 - if (!zone.getZoneName().equals(dto.getZoneName()) && - repo.findByZoneName(dto.getZoneName()).isPresent()) { - throw new ResponseStatusException( - HttpStatus.BAD_REQUEST, "이미 존재하는 공간명: " + dto.getZoneName()); - } - - // 3. 공간명 업데이트 - zone.setZoneName(dto.getZoneName()); - Zone updatedZone = repo.save(zone); - - // 4. DTO로 반환 - return new ZoneDto(updatedZone.getZoneId(), updatedZone.getZoneName()); - } - - // 모든 공간 조회 - public List getAllZones() { - return repo.findAll().stream() - .map(zone -> new ZoneDto(zone.getZoneId(), zone.getZoneName())) - .collect(Collectors.toList()); - } - - @Transactional - public List getZoneItems() { - - List zones = repo.findAll(); - - return zones.stream() - .map(zone -> { - - List sensors = sensorRepo.findByZone(zone); - - // 환경 센서 - List envSensors = sensors.stream() - .filter(s -> Objects.equals(s.getZone().getZoneId(), s.getEquip().getEquipId())) - .toList(); - - // 1) Sensor 엔티티 → SensorDto 변환 - List envSensorDtos = envSensors.stream() // List - .map(SensorDto::fromEntity) // Sensor → SensorDto - .toList(); - - - List equips = equipRepo.findEquipsByZone(zone).stream() - .filter(e -> e.getEquipName() != null && !e.getEquipName().equalsIgnoreCase("empty")) - .toList(); // empty이름을 가진 설비(환경센서)는 설비 목록에서 제외하기 - - // 설비 센서 그룹핑 - Map> facGroup = sensors.stream() - .filter(s -> !Objects.equals(s.getZone().getZoneId(), s.getEquip().getEquipId())) - .map(SensorDto::fromEntity) // ★ Sensor → SensorDto - .collect(Collectors.groupingBy(SensorDto::getEquipId)); - - List facilities = equips.stream() - .map(entry -> { - - String equipId = entry.getEquipId(); - String equipName = equipRepo.findEquipNameByEquipId(equipId); // 1-row 조회 - - List facSensors = facGroup.getOrDefault(equipId, List.of()); - - return FacilityDto.builder() - .name(equipName) - .facSensor(facSensors) - .id(equipId) - .build(); - }) - .toList(); - - /* 4) ZoneItemDto 조립 */ - return ZoneItemDto.builder() - .title(zone.getZoneName()) - .envSensor(envSensorDtos) - .facility(facilities) - .build(); - }) - .toList(); - } - - public Zone getZone(String zoneId) { - return repo.findByZoneId(zoneId); - } -} \ No newline at end of file diff --git a/src/main/java/com/factoreal/backend/util/EquipIdGenerator.java b/src/main/java/com/factoreal/backend/util/EquipIdGenerator.java deleted file mode 100644 index 347c8581..00000000 --- a/src/main/java/com/factoreal/backend/util/EquipIdGenerator.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.factoreal.backend.util; - -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Random; - - -public class EquipIdGenerator { - private static final Random RANDOM = new Random(); - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); - - public static String generateEquipId() { - String now = LocalDateTime.now().format(FORMATTER); - int randomSuffix = RANDOM.nextInt(900) + 100; // 100~999 - return now + "-" + randomSuffix; - } -} diff --git a/src/test/java/com/factoreal/backend/service/WorkerServiceTest.java b/src/test/java/com/factoreal/backend/service/WorkerServiceTest.java index 5e527e98..fa6354f2 100644 --- a/src/test/java/com/factoreal/backend/service/WorkerServiceTest.java +++ b/src/test/java/com/factoreal/backend/service/WorkerServiceTest.java @@ -1,10 +1,12 @@ package com.factoreal.backend.service; -import com.factoreal.backend.dto.WorkerDto; -import com.factoreal.backend.entity.Worker; -import com.factoreal.backend.entity.Zone; -import com.factoreal.backend.entity.ZoneHist; -import com.factoreal.backend.repository.WorkerRepository; +import com.factoreal.backend.domain.worker.application.WorkerService; +import com.factoreal.backend.domain.worker.dto.response.WorkerInfoResponse; +import com.factoreal.backend.domain.worker.entity.Worker; +import com.factoreal.backend.domain.zone.dao.ZoneHistoryRepository; +import com.factoreal.backend.domain.zone.entity.Zone; +import com.factoreal.backend.domain.zone.entity.ZoneHist; +import com.factoreal.backend.domain.worker.dao.WorkerRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -25,7 +27,7 @@ public class WorkerServiceTest { private WorkerRepository workerRepository; @Mock - private WorkerLocationService workerLocationService; + private ZoneHistoryRepository zoneHistoryRepository; @InjectMocks private WorkerService workerService; @@ -77,7 +79,7 @@ public void testGetAllWorkers() { when(workerRepository.findAll()).thenReturn(Arrays.asList(worker1, worker2)); // 서비스 메소드 호출 - List result = workerService.getAllWorkers(); + List result = workerService.getAllWorkers(); // 결과 검증 assertNotNull(result); @@ -101,10 +103,10 @@ public void testGetAllWorkers() { @Test void testGetWorkersByZoneId() { // Mock 설정 - when(workerLocationService.getCurrentWorkersByZoneId("zone1")).thenReturn(Arrays.asList(zoneHist1)); + when(zoneHistoryRepository.findByZone_ZoneIdAndExistFlag("zone1", 1)).thenReturn(Arrays.asList(zoneHist1)); // 테스트 실행 - List workers = workerService.getWorkersByZoneId("zone1"); + List workers = workerService.getWorkersByZoneId("zone1"); // 검증 assertEquals(1, workers.size()); diff --git a/src/test/java/com/factoreal/backend/strategy/SmsNotificationStrategyTest.java b/src/test/java/com/factoreal/backend/strategy/SmsNotificationStrategyTest.java index da92c7e7..fa46821a 100644 --- a/src/test/java/com/factoreal/backend/strategy/SmsNotificationStrategyTest.java +++ b/src/test/java/com/factoreal/backend/strategy/SmsNotificationStrategyTest.java @@ -1,7 +1,7 @@ //package com.factoreal.backend.strategy; // -//import com.factoreal.backend.entity.Worker; -//import com.factoreal.backend.repository.WorkerRepository; +//import com.factoreal.backend.domain.worker.entity.Worker; +//import com.factoreal.backend.domain.worker.dao.WorkerRepository; //import com.factoreal.backend.strategy.enums.AlarmEventDto; //import com.factoreal.backend.strategy.enums.AlarmType; //import com.factoreal.backend.strategy.enums.RiskLevel;