diff --git a/src/main/java/com/goi/erp/controller/EmployeeExternalMapController.java b/src/main/java/com/goi/erp/controller/EmployeeExternalMapController.java new file mode 100644 index 0000000..d185b6a --- /dev/null +++ b/src/main/java/com/goi/erp/controller/EmployeeExternalMapController.java @@ -0,0 +1,33 @@ +package com.goi.erp.controller; + +import com.goi.erp.dto.EmployeeExternalMapResponseDto; +import com.goi.erp.service.EmployeeExternalMapService; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/employee") +@RequiredArgsConstructor +public class EmployeeExternalMapController { + + private final EmployeeExternalMapService externalMapService; + + /** + * 외부 시스템의 employeeId → 내부 employee 매핑 조회 + * 목적: customer_daily_order.driver_id 설정 + * + * 예: GET /employee/external?solutionType=SAMSARA&externalId=28147... + */ + @GetMapping("/external") + public ResponseEntity getEmployeeMapping( + @RequestParam String solutionType, + @RequestParam String externalId + ) { + EmployeeExternalMapResponseDto dto = + externalMapService.findMapping(solutionType, externalId); + + return ResponseEntity.ok(dto); + } +} diff --git a/src/main/java/com/goi/erp/dto/EmployeeExternalMapRequestDto.java b/src/main/java/com/goi/erp/dto/EmployeeExternalMapRequestDto.java new file mode 100644 index 0000000..c606e64 --- /dev/null +++ b/src/main/java/com/goi/erp/dto/EmployeeExternalMapRequestDto.java @@ -0,0 +1,11 @@ +package com.goi.erp.dto; + +import lombok.Data; + +@Data +public class EmployeeExternalMapRequestDto { + private Long eexEmpId; // 매핑할 내부 employee ID + private String eexSolutionType; // 'SAMSARA', 'MIS', ... + private String eexExternalId; // 외부 ID + private String eexStatus; // A / I (옵션) +} diff --git a/src/main/java/com/goi/erp/dto/EmployeeExternalMapResponseDto.java b/src/main/java/com/goi/erp/dto/EmployeeExternalMapResponseDto.java new file mode 100644 index 0000000..9462704 --- /dev/null +++ b/src/main/java/com/goi/erp/dto/EmployeeExternalMapResponseDto.java @@ -0,0 +1,20 @@ +package com.goi.erp.dto; + +import lombok.Data; + +import java.util.UUID; + +@Data +public class EmployeeExternalMapResponseDto { + + private UUID eexUuid; + private Long eexEmpId; + + private String eexSolutionType; + private String eexExternalId; + + private String eexStatus; + + private String eexCreatedBy; + private String eexUpdatedBy; +} diff --git a/src/main/java/com/goi/erp/entity/EmployeeExternalMap.java b/src/main/java/com/goi/erp/entity/EmployeeExternalMap.java new file mode 100644 index 0000000..0c2c60b --- /dev/null +++ b/src/main/java/com/goi/erp/entity/EmployeeExternalMap.java @@ -0,0 +1,77 @@ +package com.goi.erp.entity; + +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Table( + name = "employee_external_map", + uniqueConstraints = { + @UniqueConstraint( + name = "uk_employee_external_map", + columnNames = {"eex_emp_id", "eex_solution_type", "eex_external_id"} + ) + } +) +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EntityListeners(AuditingEntityListener.class) +public class EmployeeExternalMap { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "eex_id") + private Long eexId; + + @Column(name = "eex_uuid", nullable = false) + private UUID eexUuid; + + @Column(name = "eex_emp_id", nullable = false) + private Long eexEmpId; + + @Column(name = "eex_solution_type", nullable = false, length = 50) + private String eexSolutionType; + + @Column(name = "eex_external_id", nullable = false, length = 100) + private String eexExternalId; + + @Column(name = "eex_status", length = 1) + private String eexStatus; // A / I + + @CreatedDate + @Column(name = "eex_created_at", updatable = false) + private LocalDateTime eexCreatedAt; + + @CreatedBy + @Column(name = "eex_created_by") + private String eexCreatedBy; + + @LastModifiedDate + @Column(name = "eex_updated_at") + private LocalDateTime eexUpdatedAt; + + @LastModifiedBy + @Column(name = "eex_updated_by") + private String eexUpdatedBy; +} diff --git a/src/main/java/com/goi/erp/repository/EmployeeExternalMapRepository.java b/src/main/java/com/goi/erp/repository/EmployeeExternalMapRepository.java new file mode 100644 index 0000000..3dc40f6 --- /dev/null +++ b/src/main/java/com/goi/erp/repository/EmployeeExternalMapRepository.java @@ -0,0 +1,17 @@ +package com.goi.erp.repository; + +import com.goi.erp.entity.EmployeeExternalMap; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface EmployeeExternalMapRepository extends JpaRepository { + + Optional findByEexSolutionTypeAndEexExternalIdAndEexStatus( + String eexSolutionType, + String eexExternalId, + String eexStatus + ); +} diff --git a/src/main/java/com/goi/erp/service/EmployeeExternalMapService.java b/src/main/java/com/goi/erp/service/EmployeeExternalMapService.java new file mode 100644 index 0000000..0671574 --- /dev/null +++ b/src/main/java/com/goi/erp/service/EmployeeExternalMapService.java @@ -0,0 +1,46 @@ +package com.goi.erp.service; + +import com.goi.erp.dto.EmployeeExternalMapResponseDto; +import com.goi.erp.entity.EmployeeExternalMap; +import com.goi.erp.repository.EmployeeExternalMapRepository; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class EmployeeExternalMapService { + + private final EmployeeExternalMapRepository externalMapRepository; + + /** + * 외부 솔루션의 ID로 내부 employee 매핑 정보 조회 + * 목적: customer_daily_order.driver_id 에 들어갈 내부 emp_id 조회 + */ + @Transactional(readOnly = true) + public EmployeeExternalMapResponseDto findMapping(String solutionType, String externalId) { + + EmployeeExternalMap map = externalMapRepository + .findByEexSolutionTypeAndEexExternalIdAndEexStatus( + solutionType, + externalId, + "A" // 활성 매핑만 사용 + ) + .orElseThrow(() -> + new RuntimeException("Employee external mapping not found for externalId: " + externalId) + ); + + // Entity → ResponseDto 변환 + EmployeeExternalMapResponseDto dto = new EmployeeExternalMapResponseDto(); + dto.setEexUuid(map.getEexUuid()); + dto.setEexEmpId(map.getEexEmpId()); + dto.setEexSolutionType(map.getEexSolutionType()); + dto.setEexExternalId(map.getEexExternalId()); + dto.setEexStatus(map.getEexStatus()); + dto.setEexCreatedBy(map.getEexCreatedBy()); + dto.setEexUpdatedBy(map.getEexUpdatedBy()); + + return dto; + } +}