gaoluyang
6 天以前 1941191efdb8386207722b05ac8a0bacfbafa139
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java
@@ -59,6 +59,7 @@
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@@ -273,6 +274,18 @@
        List<GanttDataRespVO> ganttData = new java.util.ArrayList<>();
        Set<Long> visibleWorkOrderIds = convertSet(workOrders, MesProWorkOrderDO::getId);
        for (MesProWorkOrderDO workOrder : workOrders) {
            List<MesProTaskDO> woTasks = taskMap.getOrDefault(workOrder.getId(), Collections.emptyList());
            // 工单(project)行本身没有计划时间,取该工单任务的最早开始、最晚结束
            LocalDateTime planStart = woTasks.stream()
                    .map(MesProTaskDO::getStartTime).filter(Objects::nonNull)
                    .min(LocalDateTime::compareTo).orElse(null);
            LocalDateTime planEnd = woTasks.stream()
                    .map(MesProTaskDO::getEndTime).filter(Objects::nonNull)
                    .max(LocalDateTime::compareTo).orElse(null);
            // 未排产(没有任何带计划时间的任务)的工单无法在时间轴上展示,直接跳过
            if (planStart == null || planEnd == null) {
                continue;
            }
            // 2.2.a 工单 -> project 行
            MesMdItemDO item = itemMap.get(workOrder.getProductId());
            String productName = item != null ? item.getName() : "";
@@ -283,6 +296,8 @@
                    .setText(buildGanttText(item, workOrder.getQuantity(), unitMap))
                    .setProduct(productName)
                    .setQuantity(workOrder.getQuantity())
                    .setStartDate(planStart)
                    .setEndDate(planEnd)
                    .setDuration(0L)
                    .setProgress(calcProgress(workOrder.getQuantityProduced(), workOrder.getQuantity()));
            if (workOrder.getParentId() != null
@@ -293,9 +308,11 @@
            }
            ganttData.add(woData);
            // 2.2.b 任务 -> task 行
            List<MesProTaskDO> woTasks = taskMap.getOrDefault(workOrder.getId(), Collections.emptyList());
            // 2.2.b 任务 -> task 行(缺计划时间的任务无法渲染在时间轴上)
            for (MesProTaskDO task : woTasks) {
                if (task.getStartTime() == null || task.getEndTime() == null) {
                    continue;
                }
                MesMdWorkstationDO ws = workstationMap.get(task.getWorkstationId());
                MesProProcessDO proc = processMap.get(task.getProcessId());
                MesMdItemDO taskItem = itemMap.get(task.getItemId());