Skip to content

Commit

Permalink
Merge pull request #228 from kbss-cvut/feature/plan_according_wp_sche…
Browse files Browse the repository at this point in the history
…dule

Fix bugs in planning and minor planning improvements
  • Loading branch information
kostobog authored Jul 26, 2023
2 parents cb7cfd8 + 625f15d commit 4a6737d
Show file tree
Hide file tree
Showing 13 changed files with 204 additions and 132 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public void exportPlan(@RequestParam String revisionId, HttpServletRequest reque

String fileName = String.format("%s--planned-on-%s.zip",
revisionId.replaceAll("[^\\w\\d-_ ]", "--"),
DateUtils.formatDate(new Date()).replace(":","-")
DateUtils.formatDateTime(new Date()).replace(":","-")
);

response.setHeader(HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.attachment()
Expand All @@ -73,7 +73,6 @@ public void exportPlan(@RequestParam String revisionId, HttpServletRequest reque
}
}


/**
* Create a new plan based on plan type fragment, no other information is required. Accepted plan type fragments are :
* workpackage-plan, phase-plan, general-task-plan, task-plan, work-session-plan.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,23 @@ public class RevisionPlanCSVConverter {

public String convert(Workpackage workpackage, RevisionPlan plan){
init();
taskExecutionMap = new HashMap<>();
workpackage.getTaskExecutions().stream()
.filter(te -> te.getTaskType() != null)
.forEach(te -> taskExecutionMap.put(te.getTaskType(), te));

header();
body(workpackage, plan);
finish();

return sb.toString();
}

protected void init(){
public String getContent(){
try {
printer.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
return sb.toString();
}

public void init(){
sb = new StringBuilder();
try {
printer = new CSVPrinter(sb, CSVFormat.DEFAULT);
Expand All @@ -41,7 +45,7 @@ protected void init(){
}
}

protected void finish(){
public void finish(){
try {
printer.flush();
printer.close();
Expand All @@ -50,13 +54,18 @@ protected void finish(){
}
}

protected void header(){
public void header(){
_row(
new Row().listColumns().stream().map(Column::getName)
);
}

protected void body(Workpackage workpackage, RevisionPlan plan){
public void body(Workpackage workpackage, RevisionPlan plan){
taskExecutionMap = new HashMap<>();
workpackage.getTaskExecutions().stream()
.filter(te -> te.getTaskType() != null)
.forEach(te -> taskExecutionMap.put(te.getTaskType(), te));

for(TaskPlan taskPlan : plan.streamPlanParts()
.filter(p -> p instanceof TaskPlan).map(p -> (TaskPlan)p).collect(Collectors.toList())){
Row row = createRow(workpackage, plan, taskPlan);
Expand Down Expand Up @@ -88,7 +97,11 @@ protected Row createRow(Workpackage wp, RevisionPlan plan, TaskPlan task) {
.filter(s -> s != null)
.min(Date::compareTo)
.orElse(null);
row.wp_start_session_based.setValue(wp_start_session_based);
setDateTimeColumns(wp_start_session_based,
row.wp_start_session_based,
row.wp_start_session_based_date,
row.wp_start_session_based_time
);

Date wp_end_session_based = wp.getTaskExecutions() == null || wp.getTaskExecutions().isEmpty() ?
null:
Expand All @@ -97,15 +110,26 @@ protected Row createRow(Workpackage wp, RevisionPlan plan, TaskPlan task) {
.filter(s -> s != null)
.max(Date::compareTo)
.orElse(null);
setDateTimeColumns(wp_end_session_based,
row.wp_end_session_based,
row.wp_end_session_based_date,
row.wp_end_session_based_time
);

row.wp_end_session_based.setValue(wp_end_session_based);

row.wp_start_planned_by_alg.setValue(
plan == null ? null : plan.getPlannedStartTime()
setDateTimeColumns(
plan == null ? null : plan.getPlannedStartTime(),
row.wp_start_planned_by_alg,
row.wp_start_planned_by_alg_date,
row.wp_start_planned_by_alg_time
);
row.wp_end_planned_by_alg.setValue(
plan == null ? null : plan.getPlannedEndTime()

setDateTimeColumns(
plan == null ? null : plan.getPlannedEndTime(),
row.wp_end_planned_by_alg,
row.wp_end_planned_by_alg_date,
row.wp_end_planned_by_alg_time
);

row.wp_duration_planned_by_alg.setValue(
plan == null || plan.getPlannedStartTime() == null || plan.getPlannedEndTime() == null ?
"" :
Expand All @@ -128,8 +152,11 @@ protected Row createRow(Workpackage wp, RevisionPlan plan, TaskPlan task) {
);

row.referenced_task_type.setValue(Optional.ofNullable(taskExecution.getReferencedTasks())
.map(c -> c.stream().map(rt -> rt.getTaskType().getCode())
.filter(s -> s!= null).collect(Collectors.joining(";"))
.map(c -> c.stream()
.filter(rt -> rt != null && rt.getTaskType() != null)
.map(rt -> rt.getTaskType().getCode())
.filter(s -> s != null)
.collect(Collectors.joining(";"))
).orElse(null)
);

Expand All @@ -147,11 +174,17 @@ protected Row createRow(Workpackage wp, RevisionPlan plan, TaskPlan task) {
row.est_min.setValue(
taskExecution == null ? null : taskExecution.getEstMin() + ""
);
row.task_start_planned_by_alg.setValue(
task == null ? null : task.getPlannedStartTime()
setDateTimeColumns(
task == null ? null : task.getPlannedStartTime(),
row.task_start_planned_by_alg,
row.task_start_planned_by_alg_date,
row.task_start_planned_by_alg_time
);
row.task_end_planned_by_alg.setValue(
task == null ? null : task.getPlannedEndTime()
setDateTimeColumns(
task == null ? null : task.getPlannedEndTime(),
row.task_end_planned_by_alg,
row.task_end_planned_by_alg_date,
row.task_end_planned_by_alg_time
);
row.task_duration_planned_by_alg.setValue(
task == null || task.getPlannedStartTime() == null || task.getPlannedEndTime() == null ?
Expand All @@ -166,6 +199,18 @@ protected Row createRow(Workpackage wp, RevisionPlan plan, TaskPlan task) {
return row;
}

protected void setDateTimeColumns(Date date, Column dt, Column d, Column t ){
if(date == null){
dt.setValue("");
d.setValue("");
t.setValue("");
}else {
dt.setValue(date);
d.setValue(DateUtils.formatDate(date));
t.setValue(DateUtils.formatTime(date));
}
}

protected void _row(Stream<String> columns){
try {
printer.printRecord(columns.collect(Collectors.toList()));
Expand Down Expand Up @@ -201,7 +246,7 @@ public String getValue() {


public void setValue(Date date){
setValue(date == null ? "" : DateUtils.formatDate(date));
setValue(date == null ? "" : DateUtils.formatDateTime(date));
}

public void setValue(LocalDate date){
Expand All @@ -218,9 +263,18 @@ class Row {
Column wp_duration_planned_by_csat = new Column("wp_duration_planned_by_csat");
Column wp_end_planned_by_csat = new Column("wp_end_planned_by_csat");
Column wp_start_session_based = new Column("wp_start_session_based");
Column wp_start_session_based_date = new Column("wp_start_session_based_date");
Column wp_start_session_based_time = new Column("wp_start_session_based_time");

Column wp_end_session_based = new Column("wp_end_session_based");
Column wp_end_session_based_date = new Column("wp_end_session_based_date");
Column wp_end_session_based_time = new Column("wp_end_session_based_time");
Column wp_start_planned_by_alg = new Column("wp_start_planned_by_alg");
Column wp_start_planned_by_alg_date = new Column("wp_start_planned_by_alg_date");
Column wp_start_planned_by_alg_time = new Column("wp_start_planned_by_alg_time");
Column wp_end_planned_by_alg = new Column("wp_end_planned_by_alg");
Column wp_end_planned_by_alg_date = new Column("wp_end_planned_by_alg_date");
Column wp_end_planned_by_alg_time = new Column("wp_end_planned_by_alg_time");
Column wp_duration_planned_by_alg = new Column("wp_duration_planned_by_alg");
Column task_code = new Column("task_code");
Column general_task_type = new Column("general_task_type");
Expand All @@ -233,7 +287,11 @@ class Row {
Column task_work_time_session_based = new Column("task_work_time_session_based");
Column est_min = new Column("est_min");
Column task_start_planned_by_alg = new Column("task_start_planned_by_alg");
Column task_start_planned_by_alg_date = new Column("task_start_planned_by_alg_date");
Column task_start_planned_by_alg_time = new Column("task_start_planned_by_alg_time");
Column task_end_planned_by_alg = new Column("task_end_planned_by_alg");
Column task_end_planned_by_alg_date = new Column("task_end_planned_by_alg");
Column task_end_planned_by_alg_time = new Column("task_end_planned_by_alg_time");
Column task_duration_planned_by_alg = new Column("task_duration_planned_by_alg");
Column task_work_time_planned_by_alg = new Column("task_work_time_planned_by_alg");

Expand All @@ -242,10 +300,13 @@ class Row {
public Row() {
columns = Arrays.asList(
wp, wp_start_planned_by_csat, wp_duration_planned_by_csat, wp_end_planned_by_csat, wp_start_session_based,
wp_end_session_based, wp_start_planned_by_alg, wp_end_planned_by_alg, wp_duration_planned_by_alg,
task_category, general_task_type, task_code, task_main_scope, referenced_task_type, task_description, task_start_session_base,
task_end_session_base, task_work_time_session_based, est_min, task_start_planned_by_alg,
task_end_planned_by_alg, task_duration_planned_by_alg, task_work_time_planned_by_alg
wp_start_session_based_date, wp_start_session_based_time, wp_end_session_based, wp_end_session_based_date,
wp_end_session_based_time, wp_start_planned_by_alg, wp_start_planned_by_alg_date, wp_start_planned_by_alg_time,
wp_end_planned_by_alg, wp_end_planned_by_alg_date, wp_end_planned_by_alg_time, wp_duration_planned_by_alg,
task_category, general_task_type, task_code, task_main_scope, referenced_task_type, task_description,
task_start_session_base, task_end_session_base, task_work_time_session_based, est_min, task_start_planned_by_alg,
task_start_planned_by_alg_date, task_start_planned_by_alg_time, task_end_planned_by_alg, task_end_planned_by_alg_date,
task_end_planned_by_alg_time, task_duration_planned_by_alg, task_work_time_planned_by_alg
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,17 @@ public class AbstractEntityWithDescription extends AbstractEntity {

@OWLDataProperty(iri = Vocabulary.s_p_description)
protected String description;
@Properties(fetchType = FetchType.EAGER)
protected Map<URI, Set<Object>> properties;
// // TODO - check if deleting/setting-lazy will make reading objects faster
// @Properties(fetchType = FetchType.LAZY)
// protected Map<URI, Set<Object>> properties;

public Map<URI, Set<Object>> getProperties() {
return properties;
}

public void setProperties(Map<URI, Set<Object>> properties) {
this.properties = properties;
}
// public Map<URI, Set<Object>> getProperties() {
// return properties;
// }
//
// public void setProperties(Map<URI, Set<Object>> properties) {
// this.properties = properties;
// }


public String getId(){
Expand Down Expand Up @@ -72,7 +73,7 @@ public String toString() {
", id=" + id +
", title='" + title + '\'' +
", description='" + description + '\'' +
", properties=" + properties +
// ", properties=" + properties +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,6 @@ public void setMpdtask(String mpdtask) {
this.mpdtask = mpdtask;
}

public static Map<String, TaskType> getTaskTypeMap() {
return taskTypeMap;
}

public static void setTaskTypeMap(Map<String, TaskType> taskTypeMap) {
TaskType.taskTypeMap = taskTypeMap;
}

public String getPhase() {
return phase;
}
Expand Down Expand Up @@ -279,38 +271,6 @@ public String toString() {
return getTCOrMPDCode();
}

@Transient
public static Map<String, TaskType> taskTypeMap;

/**
* Normalize the codes (ids), labels/titles of TaskTypes. Creates a TaskType.code -> TaskType map and stores it in
* TaskType.taskTypeMap static variable to be used by other t
* - for codes "%20" is replaced with " "
* - for labels the longest label is used for all task cards using the same code
* @param taskTypes
* @return
*/
public static Map<String, TaskType> normalizeTaskTypes(List<TaskType> taskTypes){
// normalize type codes
taskTypes.forEach(t ->
t.code = Optional
.of(t.getCode())
.map(l -> l.replace("%20", " "))
.orElse(null)
);

Map<String, TaskType> taskTypeMap = new HashMap<>();
taskTypes.stream()
.collect(Collectors.groupingBy(t -> t.getCode())).entrySet().stream()
.forEach(e -> taskTypeMap.put(
e.getKey(),
// FIX bug - selecting longest task type title
e.getValue().stream().sorted(Comparator.comparing((TaskType t) -> t.getTitle().length()).reversed()).findFirst().get()
));
TaskType.taskTypeMap = taskTypeMap;
return taskTypeMap;
}

public static int is_TCCode_Match_v3(String sl, String sr){
if(sl == null)
return -1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ public void schedule(RevisionPlan revisionPlan) {
// Do not schedule tasks (e.g. maintenance wo) which reference other tasks.
if(edge == null && source == null && findingOrder.containsVertex(node) && !findingOrder.incomingEdgesOf(node).isEmpty())
return;

long duration = (long)(node.getTaskType().getAverageTime() * 3600000); //end - taskExecution.getStart().getTime();
// TODO - there should be a default duration or task should not be scheduled?
Double dDuration = node.getTaskType().getAverageTime();
long duration = (long)( (dDuration != null ? dDuration : 4.) * 3600000); //end - taskExecution.getStart().getTime();

Long workTime = null; // TODO - replace with node.getTaskType().getAverageWorkTime()
if(edge == null || edge.patternType == null){
Expand All @@ -62,6 +63,9 @@ public void schedule(RevisionPlan revisionPlan) {
workTime = targetHistory.getWorkTime(); // TODO - replace with node.getTaskType().getAverageWorkTime()

TaskPlan sourceTaskPlan = taskPlanMap.get(source.getTaskType());
if(sourceTaskPlan.getPlannedStartTime() == null) // do not schedule if the source plan is not scheduled
return;

if(edge.patternType == PatternType.EQUALITY){
plannedStartTime = sourceTaskPlan.getPlannedStartTime().getTime();
} else if(edge.patternType == PatternType.STRICT_DIRECT_ORDER || edge.patternType == PatternType.STRICT_INDIRECT_ORDER){
Expand All @@ -74,15 +78,15 @@ public void schedule(RevisionPlan revisionPlan) {
(sourceTaskPlan.getPlannedEndTime().getTime() - sourceTaskPlan.getPlannedStartTime().getTime())*( targetStart - sourceStart)*1./(sourceEnd - sourceStart)
);
else
plannedStartTime = sourceTaskPlan.getPlannedEndTime().getTime() + defaultBufferBetweenSchedules;
plannedStartTime = sourceTaskPlan.getPlannedEndTime().getTime() + defaultBufferBetweenSchedules;// TODO sourceTaskPlan.getPlannedEndTime() == null ????

}
}

taskPlan.setPlannedStartTime(new Date(plannedStartTime));
taskPlan.setPlannedEndTime(new Date(plannedStartTime + duration));

taskPlan.setPlannedWorkTime(workTime);
if(taskPlan.getPlannedStartTime() == null || taskPlan.getPlannedStartTime().getTime() < plannedStartTime) {
taskPlan.setPlannedStartTime(new Date(plannedStartTime));
taskPlan.setPlannedEndTime(new Date(plannedStartTime + duration));
taskPlan.setPlannedWorkTime(workTime);
}
});
}
// schedule WOs
Expand Down
Loading

0 comments on commit 4a6737d

Please sign in to comment.