Lorsque vous enregistrez des données qui ont une période par date, je veux m'assurer qu'elles ne chevauchent pas la période déjà enregistrée. Je n'ai pas trouvé beaucoup d'exemples Java utilisant LocalDate, je vais donc les publier.
Il existe au total quatre modèles avec des périodes de dates qui se chevauchent.
L'expression conditionnelle qui peut couvrir tous les modèles est la suivante.
Expression conditionnelle
vert.date de début<=noir.Date de fin&& vert.Date de fin=>noir.date de début
Un échantillon qui vous permet de saisir la date de début et la date de fin à partir de l'écran et de vous inscrire uniquement si la période de saisie ne chevauche pas la ou les périodes existantes.
Classe de modèle à passer à l'écran avec la date de début et la date de fin à enregistrer et l'ID de numérotation automatique.
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 lors de l'enregistrement_Numérotation avec incrément
private int id;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate startDate;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate endDate;
}
Classe de service appelée depuis le contrôleur.
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 {
/**
*Vérifiez s'il est déjà enregistré
*/
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()));
}
/**
*Obtenir la liste
*/
private List<DurationModel> getDurationList() {
//TODO Obtenez des données déjà enregistrées
}
/**
*s'inscrire/mise à jour
*/
@Transactional
public void saveDuration(DurationModel model) {
//Processus de stockage des données dans TODO DB, etc.
}
}
this.getDurationList ()
lors de la mise à jour des données, elles seront donc traitées comme des doublons et seront interceptées lors de la validation.
Si vous pensez uniquement à une nouvelle inscription, cette ligne est inutile.En fait, «@ Validated» et «BindingResult» sont utilisés pour le contrôle de validation, mais cette partie est omise.
DurationController.java
/**
*
* @author tamorieeeen
*
*/
@Controller
public class DurationController {
@Autowired
private DurationService durationService;
/**
*s'inscrire
*/
@GetMapping("/duration/register")
public String register(Model model) {
model.addAttribute("duration", new DurationModel());
return "duration/register";
}
/**
*Nouveau processus d'inscription
*/
@PostMapping("/duration/register")
public String registerComplete(Model model,
@ModelAttribute("duration") DurationModel duration,
RedirectAttributes redirect) {
//Contrôle de validation
if (durationService.isInvalid(duration)) {
model.addAttribute("invalid", true);
return "duration/register";
}
durationService.saveDuration(duration);
redirect.addFlashAttribute("complete", true);
return "redirect:/duration/register";
}
}
L'en-tête html est courant, mais il n'est pas pertinent cette fois-ci, il est donc omis.
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>J'ai enregistré la période.</p>
</div>
<div th:if="${invalid}">
<p>L'inscription n'est pas possible car la période est dupliquée.</p>
</div>
<form th:action="@{/duration/register}" method="post" th:object="${duration}">
<table>
<tr><td>date de début</td><td>
<input type="date" th:field="*{startDate}" th:value="*{startDate}" />
</td></tr>
<tr><td>Date de fin</td><td>
<input type="date" th:field="*{endDate}" th:value="*{endDate}" />
</td></tr>
</table>
<input type="button" th:value="s'inscrire" onclick="submit();" />
</form>
</body>
</html>
Recommended Posts