diff --git a/src/main/java/com/example/nto/controller/EmployeeController.java b/src/main/java/com/example/nto/controller/EmployeeController.java index 14535b4..a43b3ba 100644 --- a/src/main/java/com/example/nto/controller/EmployeeController.java +++ b/src/main/java/com/example/nto/controller/EmployeeController.java @@ -42,25 +42,25 @@ public class EmployeeController { return ResponseEntity.ok(employeeService.getByTelephone(telephone)); } - @PutMapping("/{id}") + @PutMapping("/{employeeId}") public ResponseEntity updateEmployee(@PathVariable long employeeId, @RequestBody EmployeeDTO employeeDTO) { return ResponseEntity.ok(employeeService.update(employeeId, employeeDTO)); } - @DeleteMapping("/{id}") + @DeleteMapping("/{employeeId}") public ResponseEntity deleteEmployeeById(@PathVariable long employeeId) { employeeService.delete(employeeId); return ResponseEntity.noContent().build(); } - @PatchMapping("/image/profile/{id}") + @PatchMapping("/image/profile/{employeeId}") public ResponseEntity patchImageProfile(@PathVariable long employeeId, @RequestBody byte[] photo) { String imageUrl = photoService.uploadProfilePhoto(employeeId, photo); employeeService.patchProfileImage(employeeId, imageUrl); return ResponseEntity.noContent().build(); } - @PatchMapping("/block/{id}/{blockStatus}") + @PatchMapping("/block/{employeeId}/{blockStatus}") public ResponseEntity patchImageProfile(@PathVariable long employeeId, @PathVariable boolean blockStatus) { employeeService.patchBlockEmployee(employeeId, blockStatus); return ResponseEntity.noContent().build(); diff --git a/src/main/java/com/example/nto/controller/OfficeController.java b/src/main/java/com/example/nto/controller/OfficeController.java index 276935b..46d74bb 100644 --- a/src/main/java/com/example/nto/controller/OfficeController.java +++ b/src/main/java/com/example/nto/controller/OfficeController.java @@ -42,9 +42,10 @@ public class OfficeController { return ResponseEntity.ok(officeService.update(officeId, officeDTO)); } - @DeleteMapping("/{officeId}") - public ResponseEntity deleteOffice(@PathVariable long officeId) { - officeService.delete(officeId); - return ResponseEntity.noContent().build(); - } +// Тут баг с ссылочной целостностью +// @DeleteMapping("/{officeId}") +// public ResponseEntity deleteOffice(@PathVariable long officeId) { +// officeService.delete(officeId); +// return ResponseEntity.noContent().build(); +// } } diff --git a/src/main/java/com/example/nto/domain/entity/Terminal.java b/src/main/java/com/example/nto/domain/entity/Terminal.java index 2bacdf8..6808ce7 100644 --- a/src/main/java/com/example/nto/domain/entity/Terminal.java +++ b/src/main/java/com/example/nto/domain/entity/Terminal.java @@ -39,7 +39,7 @@ public class Terminal { private String code; // todo: Протестировать нужен ли тут каскад тип - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "office_id", nullable = false) private Office office; diff --git a/src/main/java/com/example/nto/domain/entity/Visit.java b/src/main/java/com/example/nto/domain/entity/Visit.java index 691cfb6..edc402f 100644 --- a/src/main/java/com/example/nto/domain/entity/Visit.java +++ b/src/main/java/com/example/nto/domain/entity/Visit.java @@ -33,11 +33,11 @@ public class Visit { private boolean isFinished = false; @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "start_terminal_id", referencedColumnName = "code", nullable = false) + @JoinColumn(name = "start_terminal_id", referencedColumnName = "id", nullable = false) private Terminal startTerminal; @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "end_terminal_id", referencedColumnName = "code") + @JoinColumn(name = "end_terminal_id", referencedColumnName = "id") private Terminal endTerminal; @ManyToOne(fetch = FetchType.EAGER) diff --git a/src/main/java/com/example/nto/dto/entity/VisitDTO.java b/src/main/java/com/example/nto/dto/entity/VisitDTO.java index 0c047f9..97c5af8 100644 --- a/src/main/java/com/example/nto/dto/entity/VisitDTO.java +++ b/src/main/java/com/example/nto/dto/entity/VisitDTO.java @@ -22,7 +22,7 @@ public class VisitDTO { // Возвращается длительность посещения в формате LocalDateTime.toString(), // превратить обратно можно с помощью LocalDateTime.parse(). - private String durationVisit; + private long durationVisit; private String officeName; private String typePassage; // Строка либо PASSAGE_CARD, либо PASSAGE_TELEPHONE diff --git a/src/main/java/com/example/nto/dto/mappers/VisitMapper.java b/src/main/java/com/example/nto/dto/mappers/VisitMapper.java index 98f44f8..0676795 100644 --- a/src/main/java/com/example/nto/dto/mappers/VisitMapper.java +++ b/src/main/java/com/example/nto/dto/mappers/VisitMapper.java @@ -18,9 +18,15 @@ public class VisitMapper { visitDTO.setId(visit.getId()); visitDTO.setStartVisit(visit.getStartVisit().toString()); - visitDTO.setEndVisit(visit.getEndVisit().toString()); + + if (visit.getEndVisit() == null) visitDTO.setEndVisit(null); + else visitDTO.setEndVisit(visit.getEndVisit().toString()); + visitDTO.setFinished(visit.isFinished()); - visitDTO.setDurationVisit(Utils.period(visit.getStartVisit(), visit.getEndVisit()).toString()); + + if (visit.getEndVisit() == null) visitDTO.setDurationVisit(Utils.period(visit.getStartVisit(), LocalDateTime.now())); + else visitDTO.setDurationVisit(Utils.period(visit.getStartVisit(), visit.getEndVisit())); + visitDTO.setOfficeName(visit.getStartTerminal().getOffice().getName()); visitDTO.setTypePassage(visit.getPassage().getPassageName()); diff --git a/src/main/java/com/example/nto/dto/mappers/employee/EmployeeMapper.java b/src/main/java/com/example/nto/dto/mappers/employee/EmployeeMapper.java index 8504852..62781e2 100644 --- a/src/main/java/com/example/nto/dto/mappers/employee/EmployeeMapper.java +++ b/src/main/java/com/example/nto/dto/mappers/employee/EmployeeMapper.java @@ -27,7 +27,7 @@ public class EmployeeMapper { employeeDTO.setOfficeImageUrl(employee.getOffice().getLinkLogo()); employeeDTO.setPositionName(employee.getPosition().getName()); employeeDTO.setRole(employee.getRole().getRoleName()); - employeeDTO.setRole(employee.getProfileImageUrl()); + employeeDTO.setProfileImageUrl(employee.getProfileImageUrl()); employeeDTO.setBlocked(employee.isBlocked()); List visitsLast30Days = Utils.filterDateLast30Days(employee.getVisits()); @@ -47,7 +47,10 @@ public class EmployeeMapper { currentOfficeName = visit.getStartTerminal().getOffice().getName(); } visitsIdLast30Days.add(visit.getId()); - periods.add(List.of(visit.getStartVisit(), visit.getEndVisit())); + + if (visit.getStartVisit() != null && visit.getEndVisit() != null) { + periods.add(List.of(visit.getStartVisit(), visit.getEndVisit())); + } } employeeDTO.setVisitStatus(visitStatus); diff --git a/src/main/java/com/example/nto/service/impl/VisitServiceImpl.java b/src/main/java/com/example/nto/service/impl/VisitServiceImpl.java index 0c462f2..ada3faf 100644 --- a/src/main/java/com/example/nto/service/impl/VisitServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/VisitServiceImpl.java @@ -101,7 +101,7 @@ public class VisitServiceImpl implements VisitService { .orElseThrow(() -> new ResourceNotFoundException("Терминал с id (" + endTerminalId + ") не найден!")); Visit activeVisit = getActiveVisit(employee); - activeVisit.setStartVisit(LocalDateTime.now()); + activeVisit.setEndVisit(LocalDateTime.now()); activeVisit.setFinished(true); activeVisit.setEndTerminal(terminal); @@ -117,7 +117,7 @@ public class VisitServiceImpl implements VisitService { } private static Visit getActiveVisit(Employee employee) { - List visits = employee.getVisits().stream().filter(Visit::isFinished).collect(Collectors.toList()); + List visits = employee.getVisits().stream().filter(visit -> !visit.isFinished()).collect(Collectors.toList()); if (visits.size() == 1) return visits.get(0); else throw new IllegalStateException("Пользователь не может находится в суперпозиции"); diff --git a/src/main/java/com/example/nto/utils/Utils.java b/src/main/java/com/example/nto/utils/Utils.java index 58ec198..7bf9b85 100644 --- a/src/main/java/com/example/nto/utils/Utils.java +++ b/src/main/java/com/example/nto/utils/Utils.java @@ -4,7 +4,8 @@ import com.example.nto.config.ObjectStorageConfig; import com.example.nto.domain.entity.Visit; import lombok.experimental.UtilityClass; -import java.time.*; +import java.time.Duration; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; @@ -41,15 +42,17 @@ public class Utils { } } - public static LocalDateTime period(LocalDateTime dtStart, LocalDateTime dtEnd) { + public static Long period(LocalDateTime dtStart, LocalDateTime dtEnd) { // Возвращает разницу между двумя LocalDateTime - Period period = Period.between(dtStart.toLocalDate(), dtEnd.toLocalDate()); - Duration duration = Duration.between(dtStart.toLocalTime(), dtEnd.toLocalTime()); +// Period period = Period.between(dtStart.toLocalDate(), dtEnd.toLocalDate()); +// Duration duration = Duration.between(dtStart.toLocalTime(), dtEnd.toLocalTime()); - LocalDate localDate = LocalDate.of(period.getYears(), period.getMonths(), period.getDays()); - LocalTime localTime = LocalTime.of(duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart()); + return Duration.between(dtStart, dtEnd).toMinutes(); - return LocalDateTime.of(localDate, localTime); +// LocalDate localDate = LocalDate.of(period.getYears(), period.getMonths(), period.getDays()); +// LocalTime localTime = LocalTime.of(duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart()); +// +// return LocalDateTime.of(localDate, localTime); } public static long periods(List> periods) { @@ -76,7 +79,7 @@ public class Utils { public static String getRandomUrlProfileImage() { int max = 26, min = 1; String fileName = profileFileName(new Random().nextInt(max - min + 1) + min) + ".jpg"; - return storageConfig.getS3Endpoint() + "/" + storageConfig.getBucketName() + "/standard/" + fileName; + return "https://storage.yandexcloud.net/spring-boot-final-nto-bacet/standard/" + fileName; } public static String convertDistance(float distance) { diff --git a/src/main/resources/db.changelog/data/csv/2025-02-19--0005-terminals-data.csv b/src/main/resources/db.changelog/data/csv/2025-02-19--0005-terminals-data.csv index 8409f28..00a2626 100644 --- a/src/main/resources/db.changelog/data/csv/2025-02-19--0005-terminals-data.csv +++ b/src/main/resources/db.changelog/data/csv/2025-02-19--0005-terminals-data.csv @@ -1,2 +1,2 @@ name;code;office_id -Первый считыватель в Москве;313123323232312;1 \ No newline at end of file +Первый считыватель в Москве;313123FFFF323232312;1 \ No newline at end of file