gaoluyang
6 天以前 8e4eee5ad4d74e1a4e6ab4de3a9c28000700dce0
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;
@@ -137,7 +138,6 @@
            @Parameter(name = "workstationId", description = "工作站编号", required = true),
            @Parameter(name = "quantity", description = "排产数量", required = true)
    })
    @PreAuthorize("@ss.hasPermission('mes:pro-task:query')")
    public CommonResult<java.util.Map<String, Object>> calculateDuration(
            @RequestParam("workstationId") Long workstationId,
            @RequestParam("quantity") BigDecimal quantity) {
@@ -190,7 +190,6 @@
    @GetMapping("/get")
    @Operation(summary = "获得生产任务")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:pro-task:query')")
    public CommonResult<MesProTaskRespVO> getTask(@RequestParam("id") Long id) {
        MesProTaskDO task = taskService.getTask(id);
        if (task == null) {
@@ -201,7 +200,6 @@
    @GetMapping("/page")
    @Operation(summary = "获得生产任务分页")
    @PreAuthorize("@ss.hasPermission('mes:pro-task:query')")
    public CommonResult<PageResult<MesProTaskRespVO>> getTaskPage(@Valid MesProTaskPageReqVO pageReqVO) {
        PageResult<MesProTaskDO> pageResult = taskService.getTaskPage(pageReqVO);
        return success(new PageResult<>(buildTaskRespVOList(pageResult.getList()), pageResult.getTotal()));
@@ -209,7 +207,6 @@
    @GetMapping("/pending-feedback-page")
    @Operation(summary = "获得待报工台账分页", description = "已排产且仍有待报工数量的任务(状态=进行中)")
    @PreAuthorize("@ss.hasPermission('mes:pro-task:query')")
    public CommonResult<PageResult<MesProTaskRespVO>> getPendingFeedbackPage(@Valid MesProTaskPageReqVO pageReqVO) {
        Long loginUserId = cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId();
        // 如果当前登录人不是超级管理员,则仅查询分配给自己的生产工单
@@ -250,7 +247,6 @@
    @GetMapping("/gantt-list")
    @Operation(summary = "获得甘特图任务列表", description = "后端组装工单=project + 任务=task 列表")
    @PreAuthorize("@ss.hasPermission('mes:pro-task:query')")
    public CommonResult<List<GanttDataRespVO>> listGanttTaskList(@Valid MesProWorkOrderPageReqVO reqVO) {
        // 1.1 查询匹配的工单(不分页)
        reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
@@ -278,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() : "";
@@ -288,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
@@ -298,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());