Bei der Registrierung von Daten mit einem Zeitraum nach Datum möchte ich sicherstellen, dass sie sich nicht mit dem bereits registrierten Zeitraum überschneiden. Ich habe mit LocalDate nicht viele Java-Beispiele gefunden, daher werde ich sie veröffentlichen.
Es gibt insgesamt vier Muster mit überlappenden Datumsperioden.
Der bedingte Ausdruck, der alle Muster abdecken kann, lautet wie folgt.
Bedingter Ausdruck
Grün.Anfangsdatum<=schwarz.Endtermin&& Grün.Endtermin=>schwarz.Anfangsdatum
Ein Beispiel, mit dem Sie das Start- und Enddatum auf dem Bildschirm eingeben und nur registrieren können, wenn sich die Eingabeperiode nicht mit den vorhandenen Perioden überschneidet.
Modellklasse, die mit dem zu registrierenden Start- und Enddatum sowie der ID der automatischen Nummerierung an den Bildschirm übergeben werden soll.
DurationModel.java
package com.tamorieeeen.sample.model;
import java.time.LocalDate;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
*
* @author tamorieeeen
*
*/
@Getter
@Setter
@NoArgsConstructor
public class DurationModel {
//Auto beim Speichern_Nummerierung mit Inkrement
private int id;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate startDate;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate endDate;
}
Vom Controller aufgerufene Serviceklasse.
DurationService.java
package com.tamorieeeen.sample.service;
import java.time.LocalDate;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.tamorieeeen.sample.model.DurationModel;
/**
*
* @author tamorieeeen
*
*/
@Service
public class DurationService {
/**
*Überprüfen Sie, ob es bereits registriert ist
*/
public boolean isInvalid(DurationModel model) {
return this.getDurationList()
.stream()
.filter(u -> model.getId() != u.getId()) // ※1
.anyMatch(u ->
(order.getStartDate().isBefore(u.getEndDate())
&& order.getEndDate().isAfter(u.getStartDate()))
|| order.getStartDate().isEqual(u.getEndDate())
|| order.getEndDate().isEqual(u.getStartDate()));
}
/**
*Liste abrufen
*/
private List<DurationModel> getDurationList() {
//TODO Bereits registrierte Daten abrufen
}
/**
*Anmelden/aktualisieren
*/
@Transactional
public void saveDuration(DurationModel model) {
//Datenspeicherungsprozess in TODO DB etc.
}
}
this.getDurationList ()
aufgenommen, sodass sie als Duplikat behandelt und bei der Validierung abgefangen werden.
Wenn Sie nur an eine neue Registrierung denken, ist diese Zeile nicht erforderlich.Tatsächlich werden "@ Validated" und "BindingResult" für die Validierungsprüfung verwendet, aber dieser Teil wird weggelassen.
DurationController.java
/**
*
* @author tamorieeeen
*
*/
@Controller
public class DurationController {
@Autowired
private DurationService durationService;
/**
*Anmelden
*/
@GetMapping("/duration/register")
public String register(Model model) {
model.addAttribute("duration", new DurationModel());
return "duration/register";
}
/**
*Neuer Registrierungsprozess
*/
@PostMapping("/duration/register")
public String registerComplete(Model model,
@ModelAttribute("duration") DurationModel duration,
RedirectAttributes redirect) {
//Validierungsprüfung
if (durationService.isInvalid(duration)) {
model.addAttribute("invalid", true);
return "duration/register";
}
durationService.saveDuration(duration);
redirect.addFlashAttribute("complete", true);
return "redirect:/duration/register";
}
}
Der HTML-Header ist häufig, aber diesmal nicht relevant, sodass er weggelassen wird.
register.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="common :: meta_header('sample',~{::link},~{::script},~{::meta})">
</head>
<body>
<div th:if="${complete}">
<p>Ich habe den Zeitraum registriert.</p>
</div>
<div th:if="${invalid}">
<p>Eine Registrierung ist nicht möglich, da der Zeitraum doppelt vorhanden ist.</p>
</div>
<form th:action="@{/duration/register}" method="post" th:object="${duration}">
<table>
<tr><td>Anfangsdatum</td><td>
<input type="date" th:field="*{startDate}" th:value="*{startDate}" />
</td></tr>
<tr><td>Endtermin</td><td>
<input type="date" th:field="*{endDate}" th:value="*{endDate}" />
</td></tr>
</table>
<input type="button" th:value="zu registrieren" onclick="submit();" />
</form>
</body>
</html>
Recommended Posts