Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion resources/data.csv
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
id,type,name,status,description,epic
id,type,name,status,description,epic, startTime, duration
5,TASK,Name,NEW,Desc,,2025-07-22T21:18:17.670284500,30
9,TASK,Непересекающаяся,NEW,Описание,,2025-07-24T01:18:17.673142600,60
6,EPIC,Отпуск,NEW,Организовать отпуск,,2025-07-23T20:18:17.673142600,
7,SUBTASK,Путёвка,NEW,Выбрать путёвку,6,2025-07-23T20:18:17.673142600,120
8,SUBTASK,Билеты,NEW,Купить билеты,6,2025-07-23T23:18:17.673142600,60
75 changes: 74 additions & 1 deletion src/Main.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import manager.FileBackedTaskManager;
import manager.Managers;
import manager.TaskManager;
import manager.exceptions.ManagerSaveException;
import tasks.Task;
import tasks.TaskStatus;
import tasks.Subtask;
import tasks.Epic;

import java.io.File;
import java.time.Duration;
import java.time.LocalDateTime;

public class Main {

Expand Down Expand Up @@ -96,5 +99,75 @@ public static void main(String[] args) {
System.out.println("Загруженные эпики: " + newLoadedManager.getEpics());
System.out.println("Загруженные сабтаски: " + newLoadedManager.getSubtasks());
System.out.println();

// 13. Создать таску с временными параметрами.
System.out.println("Создаем задачу с временным интервалом");
LocalDateTime taskTime = LocalDateTime.now().plusHours(1);
Task task2 = new Task("Name", "Desc", TaskStatus.NEW,
taskTime, Duration.ofMinutes(30));
taskManager.createTask(task2);
System.out.println("Задача создана: " + task2);
System.out.println("Время задачи: " + task2.getStartTime() + " - " + task2.getEndTime());
System.out.println();

// 14. Проверка пересечения задач
System.out.println("Проверка запрета пересечения задач");
Task overlappingTask = new Task("Пересекающаяся", "Описание", TaskStatus.NEW,
taskTime.plusMinutes(15), Duration.ofMinutes(30));
try {
taskManager.createTask(overlappingTask);
System.err.println("ОШИБКА: Система разрешила создать пересекающуюся задачу!");
} catch (ManagerSaveException e) {
System.out.println("КОРРЕКТНО: " + e.getMessage());
System.out.println("Пересекающиеся задачи не добавлены - система работает правильно");
}
System.out.println();

// 15. Создаём Эпик с подзадачами с временем.
System.out.println("Создаем эпик с временными подзадачами");
Epic epic2 = new Epic("Отпуск", "Организовать отпуск");
taskManager.createEpic(epic2);

LocalDateTime subtask1Time = LocalDateTime.now().plusDays(1);
Subtask subtask3 = new Subtask("Путёвка", "Выбрать путёвку", TaskStatus.NEW,
epic2.getId(), subtask1Time, Duration.ofHours(2));

LocalDateTime subtask2Time = subtask1Time.plusHours(3);
Subtask subtask4 = new Subtask("Билеты", "Купить билеты", TaskStatus.NEW,
epic2.getId(), subtask2Time, Duration.ofHours(1));

taskManager.createSubtask(subtask3);
taskManager.createSubtask(subtask4);

System.out.println("Время эпика: " + epic2.getStartTime() + " - " + epic2.getEndTime());
System.out.println("Длительность эпика: " +
taskManager.getEpicDuration(epic2.getId()).toHours() + " часов");
System.out.println();

// 16. Проверка пересечения с подзадачами
System.out.println("Проверка запрета пересечения с подзадачами");
Task overlappingWithSubtask = new Task("Пересекается с подзадачей", "Описание",
TaskStatus.NEW, subtask1Time.plusMinutes(30),
Duration.ofHours(1));
try {
taskManager.createTask(overlappingWithSubtask);
System.err.println("ОШИБКА: Система разрешила пересечение с подзадачей!");
} catch (ManagerSaveException e) {
System.out.println("КОРРЕКТНО: " + e.getMessage());
System.out.println("Пересечения с подзадачами запрещены - система работает правильно");
}
System.out.println();

// 17. Проверка НЕпересекающихся задач
System.out.println("Проверка создания НЕпересекающихся задач");
Task nonOverlappingTask = new Task("Непересекающаяся", "Описание", TaskStatus.NEW,
subtask1Time.plusHours(5), Duration.ofHours(1));
try {
taskManager.createTask(nonOverlappingTask);
System.out.println("КОРРЕКТНО: Непересекающаяся задача создана успешно");
System.out.println("Все задачи: " + taskManager.getTasks());
} catch (ManagerSaveException e) {
System.err.println("ОШИБКА: " + e.getMessage());
}
}
}
}
27 changes: 23 additions & 4 deletions src/manager/CsvFormatter.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package manager;
import tasks.*;

import java.time.Duration;
import java.time.LocalDateTime;

public class CsvFormatter {

public static final String CSV_HEADER = "id,type,name,status,description,epic";
public static final String CSV_HEADER = "id,type,name,status,description,epic, startTime, duration";


// Преобразование задачи в CSV строку
Expand All @@ -15,13 +18,18 @@ public static String toString(Task task) {
epicField = String.valueOf(((Subtask) task).getEpicId());
}

String startTime = task.getStartTime() != null ? task.getStartTime().toString() : "";
String duration = task.getDuration() != null ? String.valueOf(task.getDuration().toMinutes()) : "";

return String.join(",",
String.valueOf(task.getId()),
task.getType().name(),
task.getName(),
task.getTaskStatus().name(),
task.getDescription(),
epicField);
epicField,
startTime,
duration);
}

// Создание задачи из CSV строки
Expand All @@ -36,19 +44,30 @@ public static Task fromString(String value) {
String name = fields[2];
TaskStatus status = TaskStatus.valueOf(fields[3]);
String description = fields[4];
String epicIdStr = fields.length > 5 ? fields[5] : "";
String startTimeStr = fields.length > 6 ? fields[6] : "";
String durationStr = fields.length > 7 ? fields[7] : "";

LocalDateTime startTime = !startTimeStr.isEmpty() ? LocalDateTime.parse(startTimeStr) : null;
Duration duration = !durationStr.isEmpty() ? Duration.ofMinutes(Long.parseLong(durationStr)) : null;

switch (type) {
case TASK:
return new Task(id, name, description, status);
Task task = new Task(id, name, description, status);
task.setStartTime(startTime);
task.setDuration(duration);
return task;
case EPIC:
Epic epic = new Epic(name, description);
epic.setId(id);
epic.setTaskStatus(status);
return epic;
case SUBTASK:
int epicId = fields.length > 5 ? Integer.parseInt(fields[5]) : 0;
int epicId = !epicIdStr.isEmpty() ? Integer.parseInt(epicIdStr) : 0;
Subtask subtask = new Subtask(name, description, status, epicId);
subtask.setId(id);
subtask.setStartTime(startTime);
subtask.setDuration(duration);
return subtask;
default:
return null;
Expand Down
11 changes: 10 additions & 1 deletion src/manager/FileBackedTaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ public class FileBackedTaskManager extends InMemoryTaskManager {

private final File file;


public FileBackedTaskManager(File file, HistoryManager historyManager) {
this.file = file;
this.historyManager = historyManager;
Expand Down Expand Up @@ -164,20 +163,30 @@ private void load() {
switch (task.getType()) {
case TASK:
tasks.put(task.getId(), task);
if (task.getStartTime() != null) {
addToPrioritizedTasks(task);
}
break;
case EPIC:
epics.put(task.getId(), (Epic) task);
break;
case SUBTASK:
Subtask subtask = (Subtask) task;
subtasks.put(task.getId(), subtask);
if (subtask.getStartTime() != null) {
addToPrioritizedTasks(task);
}
Epic epic = epics.get(subtask.getEpicId());
if (epic != null) {
epic.addSubtaskId(subtask.getId());
}
break;
}
}
epics.values().forEach(epic -> {
super.updateEpicStatus(epic); // Явно вызываем родительский метод
super.updateEpicTime(epic); // Явно вызываем родительский метод
});
generatorId = maxId + 1;
} catch (IOException e) {
throw new ManagerLoadException("Не удалось загрузить задачи из файла: " + file.getPath(), e);
Expand Down
Loading