Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix bugs in planning and minor planning improvements #228

Merged
merged 10 commits into from
Jul 26, 2023
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
Loading