From 1941191efdb8386207722b05ac8a0bacfbafa139 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 03 十一月 2026 13:19:18 +0800
Subject: [PATCH] 甘特图接口补齐工单计划时间,未排产工单不再返回空日期节点
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 50 insertions(+), 10 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java
index 469aed2..d437268 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/MesProTaskController.java
+++ b/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;
@@ -71,6 +72,25 @@
@RequestMapping("/mes/pro/task")
@Validated
public class MesProTaskController {
+
+ @Resource
+ private cn.iocoder.yudao.module.mes.service.pro.task.schedule.MesProBatchScheduleService batchScheduleService;
+
+ @PostMapping("/auto-schedule/preview")
+ @Operation(summary = "鎵归噺涓�閿帓浜ч瑙堬紙09鈥�18鐐癸紝鎺掗櫎鍛ㄦ湯鍜岃妭鍋囨棩锛�")
+ @PreAuthorize("@ss.hasPermission('mes:pro-task:create')")
+ public CommonResult<cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProBatchSchedulePreviewRespVO> previewBatchSchedule(
+ @Valid @RequestBody cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProBatchScheduleReqVO request) {
+ return success(batchScheduleService.preview(request));
+ }
+
+ @PostMapping("/auto-schedule")
+ @Operation(summary = "纭鎵归噺涓�閿帓浜э紙閲嶆柊鏍¢獙棰勮锛屾暣鎵瑰師瀛愭彁浜わ級")
+ @PreAuthorize("@ss.hasPermission('mes:pro-task:create')")
+ public CommonResult<java.util.Map<String, Object>> executeBatchSchedule(
+ @Valid @RequestBody cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProBatchScheduleReqVO request) {
+ return success(java.util.Map.of("taskIds", batchScheduleService.execute(request)));
+ }
@Resource
private MesProTaskService taskService;
@@ -94,6 +114,8 @@
private MesProTaskPauseRecordMapper pauseRecordMapper;
@Resource
private AdminUserApi adminUserApi;
+ @Resource
+ private cn.iocoder.yudao.module.system.api.permission.PermissionApi permissionApi;
@PostMapping("/create")
@Operation(summary = "鍒涘缓鐢熶骇浠诲姟")
@@ -116,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) {
@@ -169,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) {
@@ -180,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()));
@@ -188,10 +207,12 @@
@GetMapping("/pending-feedback-page")
@Operation(summary = "鑾峰緱寰呮姤宸ュ彴璐﹀垎椤�", description = "宸叉帓浜т笖浠嶆湁寰呮姤宸ユ暟閲忕殑浠诲姟锛堢姸鎬�=杩涜涓級")
- @PreAuthorize("@ss.hasPermission('mes:pro-task:query')")
public CommonResult<PageResult<MesProTaskRespVO>> getPendingFeedbackPage(@Valid MesProTaskPageReqVO pageReqVO) {
- // 鏍规嵁褰撳墠鐧诲綍浜虹敤鎴穒d 鑾峰彇瀵瑰簲鐨勭敓浜у伐鍗曞垪琛�
- pageReqVO.setAssigneeUserId(cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId());
+ Long loginUserId = cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId();
+ // 濡傛灉褰撳墠鐧诲綍浜轰笉鏄秴绾х鐞嗗憳锛屽垯浠呮煡璇㈠垎閰嶇粰鑷繁鐨勭敓浜у伐鍗�
+ if (loginUserId != null && !permissionApi.hasAnyRoles(loginUserId, cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum.SUPER_ADMIN.getCode())) {
+ pageReqVO.setAssigneeUserId(loginUserId);
+ }
PageResult<MesProTaskDO> pageResult = taskService.getPendingFeedbackPage(pageReqVO);
List<MesProTaskRespVO> respVOList = buildTaskRespVOList(pageResult.getList());
@@ -226,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);
@@ -252,7 +272,20 @@
convertSet(allTasks, MesProTaskDO::getProcessId));
// 2.2 缁勮鐢樼壒鍥炬暟鎹�
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() : "";
@@ -263,16 +296,23 @@
.setText(buildGanttText(item, workOrder.getQuantity(), unitMap))
.setProduct(productName)
.setQuantity(workOrder.getQuantity())
+ .setStartDate(planStart)
+ .setEndDate(planEnd)
.setDuration(0L)
.setProgress(calcProgress(workOrder.getQuantityProduced(), workOrder.getQuantity()));
- if (ObjUtil.notEqual(workOrder.getParentId(), MesProWorkOrderDO.PARENT_ID_NULL)) {
+ if (workOrder.getParentId() != null
+ && !Objects.equals(workOrder.getParentId(), MesProWorkOrderDO.PARENT_ID_NULL)
+ && !Objects.equals(workOrder.getParentId(), workOrder.getId())
+ && visibleWorkOrderIds.contains(workOrder.getParentId())) {
woData.setParent(MesBizTypeConstants.PRO_WORKORDER + "_" + workOrder.getParentId());
}
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());
--
Gitblit v1.9.3