日志

parent 7c25b0fe
......@@ -9,6 +9,7 @@ import com.aps.entity.basic.Order;
import com.aps.entity.basic.TimeSegment;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
......@@ -95,6 +96,9 @@ public class KpiCalculator {
double OrderProductTime= Math.round(orderSumProductTime / chromosome.getOrders().size() * 100.0) / 100.0;
addKpi(kpiMetrics,"平均生产周期", OrderProductTime, "订单在计划中的实际存续时长", 2, 1);
double wip = calculateAverageDailyEndWipQuantity();
addKpi(kpiMetrics, "平均WIP", wip, "每天23:59已开始未完成工序的产品数量平均值,单位为数量", 1, 1);
//最大流量
double orderMaxFlow = chromosome.getOrders().stream()
.mapToDouble(Order::getOrderFlow)
......@@ -116,7 +120,6 @@ public class KpiCalculator {
//平均流量
double OrderFlow= Math.round(orderSumFlow / chromosome.getOrders().size() * 100.0) / 100.0;
addKpi(kpiMetrics,"平均流量", OrderFlow, "订单的最短理论耗时与其在计划中的实际耗时的比值", 0, 1);
chromosome.setKpiMetrics(kpiMetrics);
//总换型
......@@ -130,6 +133,7 @@ public class KpiCalculator {
.filter(changeOverTime -> changeOverTime > 0)
.count();
addKpi(kpiMetrics,"换型次数", changeOverTimeCount, "总的换型次数", 1, 1);
chromosome.setKpiMetrics(kpiMetrics);
}
......@@ -308,6 +312,78 @@ public class KpiCalculator {
return totalSeconds;
}
/**
* 计算日末快照平均WIP:每天23:59已开始且未完成工序的产品数量。
*/
private double calculateAverageDailyEndWipQuantity() {
List<GAScheduleResult> results = chromosome.getResult();
if (results == null || results.isEmpty()) {
return 0;
}
int firstTaskStart = results.stream()
.mapToInt(GAScheduleResult::getStartTime)
.min()
.orElse(0);
int lastTaskEnd = results.stream()
.mapToInt(GAScheduleResult::getEndTime)
.max()
.orElse(0);
if (lastTaskEnd <= firstTaskStart) {
return 0;
}
if (baseTime == null) {
return calculateAverageDailyEndWipQuantityByRelativeDay(results, firstTaskStart, lastTaskEnd);
}
LocalDate firstDate = baseTime.plusSeconds(firstTaskStart).toLocalDate();
LocalDate lastDate = baseTime.plusSeconds(lastTaskEnd).toLocalDate();
double totalSnapshotQuantity = 0;
int dayCount = 0;
for (LocalDate date = firstDate; !date.isAfter(lastDate); date = date.plusDays(1)) {
long snapshotSecond = Duration.between(baseTime, date.atTime(23, 59)).getSeconds();
double snapshotQuantity = results.stream()
.filter(result -> result.getEndTime() > result.getStartTime())
.filter(result -> result.getStartTime() <= snapshotSecond && snapshotSecond < result.getEndTime())
.mapToDouble(GAScheduleResult::getQuantity)
.sum();
totalSnapshotQuantity += snapshotQuantity;
dayCount++;
}
if (dayCount == 0) {
return 0;
}
return Math.round(totalSnapshotQuantity / dayCount * 100.0) / 100.0;
}
private double calculateAverageDailyEndWipQuantityByRelativeDay(List<GAScheduleResult> results, int firstTaskStart, int lastTaskEnd) {
final int secondsPerDay = 24 * 60 * 60;
final int snapshotSecondOfDay = 23 * 60 * 60 + 59 * 60;
int firstDayStart = Math.floorDiv(firstTaskStart, secondsPerDay) * secondsPerDay;
int lastDayStart = Math.floorDiv(lastTaskEnd, secondsPerDay) * secondsPerDay;
double totalSnapshotQuantity = 0;
int dayCount = 0;
for (int dayStart = firstDayStart; dayStart <= lastDayStart; dayStart += secondsPerDay) {
int snapshotSecond = dayStart + snapshotSecondOfDay;
double snapshotQuantity = results.stream()
.filter(result -> result.getEndTime() > result.getStartTime())
.filter(result -> result.getStartTime() <= snapshotSecond && snapshotSecond < result.getEndTime())
.mapToDouble(GAScheduleResult::getQuantity)
.sum();
totalSnapshotQuantity += snapshotQuantity;
dayCount++;
}
if (dayCount == 0) {
return 0;
}
return Math.round(totalSnapshotQuantity / dayCount * 100.0) / 100.0;
}
private void addKpi(List<KpiMetrics> kpiList, String name, double value, String tip, int type, int status) {
......
......@@ -718,7 +718,7 @@ if(demand==null)
childorder.setOrderId(OrderId);
childorder.setMaterialId(orderMaterial.getMaterialId());
childorder.setMaterialCode(orderMaterial.getMaterialCode());
childorder.setMaterialName(orderMaterial.getMaterialTypeName());
childorder.setMaterialName(orderMaterial.getMaterialName());
childorder.setOrderCode("M_"+orderMaterial.getMaterialCode());
childorder.setQuantity((int) orderMaterial.getQjQty());
childorder.setFinishOrderId(new ArrayList<>());
......@@ -985,7 +985,7 @@ if(demand==null)
childorder.setOrderId(OrderId);
childorder.setMaterialId(orderMaterial.getMaterialId());
childorder.setMaterialCode(orderMaterial.getMaterialCode());
childorder.setMaterialName(orderMaterial.getMaterialTypeName());
childorder.setMaterialName(orderMaterial.getMaterialName());
childorder.setOrderCode("M_"+orderMaterial.getMaterialCode());
childorder.setQuantity((int) orderMaterial.getQjQty());
childorder.setFinishOrderId(new ArrayList<>());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment