[Java] Exemple de contrôle de duplication de période de date

Aperçu

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.

environnement

Motif avec des périodes qui se chevauchent

Il existe au total quatre modèles avec des périodes de dates qui se chevauchent. Qiita用画像.png

  1. Patron que porte la première moitié (y compris la même date de fin de ① et la date de début verte)
  2. Motif selon lequel la seconde moitié est couverte (y compris la même date de début de ② et la même date de fin verte)
  3. Modèle tout-usage (y compris exactement la même date de début et la même date de fin)
  4. Motif partiellement usé

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

échantillon

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 modèle avec une période de date pour s'inscrire

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

Logique de jugement de duplication de période Classe de service

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.
    }
}

Classe de contrôleur

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";
    }
}

Html côté écran (thymeleaf)

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>

référence

Recommended Posts

[Java] Exemple de contrôle de duplication de période de date
Contrôle de duplication de période (LocalTime, LocalDate, LocalDateTime)
Exemple de code Java 02
Vérification de la version Java
Exemple de code Java 03
Échantillon de sélénium (Java)
Exemple d'interface graphique Java
Période de support Java
Période de support Java8, 9, 10
Processus de vérification Java
Exemple de code Java 01
Vérifier l'implémentation de Java toString ()
[Java] Exemple de jugement de vacances
Manipulation de base de la date Java
[Java] exemple de logback slf4j
Manipulation de la date dans Java 8
java: Ajouter une date [Note]
[Java] Conversion de type de date
Exemple de code pour analyser la date et l'heure avec SimpleDateFormat de Java
Exemple de code de signature électronique (JAVA)
Collection d'exemples de code parallèle Java
Vérifier la méthode privée de l'interface Java9
Vérifiez la connexion https avec Java
Exemple de sortie de journal standard Java
[Java] Date Termes associés mémo
Formulaire de réservation d'échantillons de sélénium (Java)
Afficher la date actuelle en Java