Merge pull request 'develop' (#5) from develop into master

Reviewed-on: #5
This commit is contained in:
Petr 2025-02-20 07:49:28 +00:00
commit 3fb6232b4b
10 changed files with 41 additions and 28 deletions

View File

@ -42,25 +42,25 @@ public class EmployeeController {
return ResponseEntity.ok(employeeService.getByTelephone(telephone));
}
@PutMapping("/{id}")
@PutMapping("/{employeeId}")
public ResponseEntity<EmployeeDTO> updateEmployee(@PathVariable long employeeId, @RequestBody EmployeeDTO employeeDTO) {
return ResponseEntity.ok(employeeService.update(employeeId, employeeDTO));
}
@DeleteMapping("/{id}")
@DeleteMapping("/{employeeId}")
public ResponseEntity<EmployeeDTO> deleteEmployeeById(@PathVariable long employeeId) {
employeeService.delete(employeeId);
return ResponseEntity.noContent().build();
}
@PatchMapping("/image/profile/{id}")
@PatchMapping("/image/profile/{employeeId}")
public ResponseEntity<Void> 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<Void> patchImageProfile(@PathVariable long employeeId, @PathVariable boolean blockStatus) {
employeeService.patchBlockEmployee(employeeId, blockStatus);
return ResponseEntity.noContent().build();

View File

@ -42,9 +42,10 @@ public class OfficeController {
return ResponseEntity.ok(officeService.update(officeId, officeDTO));
}
@DeleteMapping("/{officeId}")
public ResponseEntity<Void> deleteOffice(@PathVariable long officeId) {
officeService.delete(officeId);
return ResponseEntity.noContent().build();
}
// Тут баг с ссылочной целостностью
// @DeleteMapping("/{officeId}")
// public ResponseEntity<Void> deleteOffice(@PathVariable long officeId) {
// officeService.delete(officeId);
// return ResponseEntity.noContent().build();
// }
}

View File

@ -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;

View File

@ -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)

View File

@ -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

View File

@ -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());

View File

@ -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<Visit> 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);

View File

@ -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<Visit> visits = employee.getVisits().stream().filter(Visit::isFinished).collect(Collectors.toList());
List<Visit> visits = employee.getVisits().stream().filter(visit -> !visit.isFinished()).collect(Collectors.toList());
if (visits.size() == 1) return visits.get(0);
else throw new IllegalStateException("Пользователь не может находится в суперпозиции");

View File

@ -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<List<LocalDateTime>> 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) {

View File

@ -1,2 +1,2 @@
name;code;office_id
Первый считыватель в Москве;313123323232312;1
Первый считыватель в Москве;313123FFFF323232312;1
1 name code office_id
2 Первый считыватель в Москве 313123323232312 313123FFFF323232312 1