From 01f0e3e3dcc06f06bd7aae3061d0e5b718048d2f Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 31 Jan 2026 15:12:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=A4=A7=E5=8E=85=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=8D=E5=AE=8C=E6=95=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:导出功能只导出主任务,但前端任务大厅显示的是子任务 修复:按子任务行导出,与前端显示一致 - 查询可接单的子任务(task_item表status=pending) - 每个子任务导出一行数据 - 包含子任务的任务编号、积分、数量等信息 Co-authored-by: Cursor --- .../com/designhub/service/ExportService.java | 120 ++++++++++++------ 1 file changed, 83 insertions(+), 37 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/ExportService.java b/backend/src/main/java/com/designhub/service/ExportService.java index 63c5cbf..1f0187f 100644 --- a/backend/src/main/java/com/designhub/service/ExportService.java +++ b/backend/src/main/java/com/designhub/service/ExportService.java @@ -42,44 +42,90 @@ public class ExportService { /** * 导出任务大厅数据 + * 🔥 修复:按子任务行导出,与前端任务大厅显示一致 + * 前端显示的是每个可接单的子任务,导出也应该按子任务行导出 */ public void exportTaskHall(HttpServletResponse response, String status, Long publisherDeptId, Long receiverDeptId, Long brandId, Long categoryId, Long platformId) throws IOException { log.info("开始导出任务大厅数据: status={}, publisherDeptId={}, receiverDeptId={}, brandId={}, categoryId={}, platformId={}", status, publisherDeptId, receiverDeptId, brandId, categoryId, platformId); - // 构建查询条件 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Task::getDeleted, 0); - queryWrapper.eq(Task::getApprovalStatus, "approved"); // 只导出已审批的任务 + String effectiveStatus = (status != null && !status.isEmpty()) ? status : "pending"; - if (status != null && !status.isEmpty()) { - queryWrapper.eq(Task::getStatus, status); - } else { - // 默认导出待接单任务 - queryWrapper.eq(Task::getStatus, "pending"); - } - - if (publisherDeptId != null) { - queryWrapper.eq(Task::getPublisherDeptId, publisherDeptId); - } + // 🔥 查询可接单的子任务(这是前端任务大厅实际显示的数据) + LambdaQueryWrapper itemQueryWrapper = new LambdaQueryWrapper<>(); + itemQueryWrapper.eq(TaskItem::getStatus, effectiveStatus); if (receiverDeptId != null) { - queryWrapper.eq(Task::getReceiverDeptId, receiverDeptId); + itemQueryWrapper.eq(TaskItem::getReceiverDeptId, receiverDeptId); } - if (brandId != null) { - queryWrapper.eq(Task::getBrandId, brandId); - } - if (categoryId != null) { - queryWrapper.eq(Task::getCategoryId, categoryId); - } - if (platformId != null) { - queryWrapper.eq(Task::getPlatformId, platformId); + itemQueryWrapper.orderByDesc(TaskItem::getCreateTime); + + List pendingItems = taskItemMapper.selectList(itemQueryWrapper); + log.info("查询到 {} 条可接单子任务", pendingItems.size()); + + // 🔥 获取子任务对应的主任务信息 + List taskIds = pendingItems.stream() + .map(TaskItem::getTaskId) + .distinct() + .toList(); + Map taskMap = new HashMap<>(); + if (!taskIds.isEmpty()) { + List parentTasks = taskMapper.selectBatchIds(taskIds); + for (Task t : parentTasks) { + taskMap.put(t.getId(), t); + } } - queryWrapper.orderByDesc(Task::getCreateTime); + // 🔥 过滤:应用筛选条件到主任务 + List filteredItems = pendingItems.stream() + .filter(item -> { + Task task = taskMap.get(item.getTaskId()); + if (task == null) return false; + if (publisherDeptId != null && !publisherDeptId.equals(task.getPublisherDeptId())) return false; + if (brandId != null && !brandId.equals(task.getBrandId())) return false; + if (categoryId != null && !categoryId.equals(task.getCategoryId())) return false; + if (platformId != null && !platformId.equals(task.getPlatformId())) return false; + return true; + }) + .toList(); - List tasks = taskMapper.selectList(queryWrapper); - log.info("查询到 {} 条任务", tasks.size()); + log.info("过滤后 {} 条子任务", filteredItems.size()); + + // 🔥 将子任务转换为虚拟Task对象用于导出(保持现有导出格式兼容) + List tasks = new ArrayList<>(); + for (TaskItem item : filteredItems) { + Task parentTask = taskMap.get(item.getTaskId()); + if (parentTask == null) continue; + + // 创建虚拟Task对象,包含子任务信息 + Task virtualTask = new Task(); + virtualTask.setId(parentTask.getId()); + virtualTask.setTaskNo(item.getItemNo() != null ? item.getItemNo() : parentTask.getTaskNo()); + virtualTask.setTitle(parentTask.getTitle()); + virtualTask.setTaskTypeId(item.getTaskTypeId() != null ? item.getTaskTypeId() : parentTask.getTaskTypeId()); + virtualTask.setTaskSubType(parentTask.getTaskSubType()); + virtualTask.setBrandId(parentTask.getBrandId()); + virtualTask.setCategoryId(parentTask.getCategoryId()); + virtualTask.setPlatformId(parentTask.getPlatformId()); + virtualTask.setSpuInfo(parentTask.getSpuInfo()); + virtualTask.setScore(item.getTotalScore() != null ? item.getTotalScore() : parentTask.getScore()); + virtualTask.setEstimatedHours(item.getEstimatedHours() != null ? item.getEstimatedHours() : parentTask.getEstimatedHours()); + virtualTask.setQuantity(item.getQuantity() != null ? item.getQuantity() : parentTask.getQuantity()); + virtualTask.setPublisherId(parentTask.getPublisherId()); + virtualTask.setPublisherDeptId(parentTask.getPublisherDeptId()); + virtualTask.setReceiverId(item.getReceiverId()); + virtualTask.setReceiverDeptId(item.getReceiverDeptId()); + virtualTask.setStatus(item.getStatus()); + virtualTask.setReleaseType(parentTask.getReleaseType()); + virtualTask.setIsUrgent(parentTask.getIsUrgent()); + virtualTask.setIsPipeline(1); + virtualTask.setCreateTime(item.getCreateTime() != null ? item.getCreateTime() : parentTask.getCreateTime()); + virtualTask.setDeadline(item.getDeadline() != null ? item.getDeadline() : parentTask.getDeadline()); + + tasks.add(virtualTask); + } + + log.info("转换后共 {} 条任务用于导出", tasks.size()); // 预加载关联数据 Map taskTypeMap = loadTaskTypeMap(); @@ -90,18 +136,18 @@ public class ExportService { Map userMap = loadUserMap(); Map deptMap = loadDeptMap(); - // 预加载所有相关任务的子任务明细 - List taskIds = tasks.stream().map(Task::getId).toList(); + // 🔥 为每个虚拟Task创建对应的子任务映射(每个Task对应一个子任务) Map> taskItemsMap = new HashMap<>(); - if (!taskIds.isEmpty()) { - List allItems = taskItemMapper.selectList( - new LambdaQueryWrapper() - .in(TaskItem::getTaskId, taskIds) - .orderBy(true, true, TaskItem::getGroupNo) - ); - for (TaskItem item : allItems) { - taskItemsMap.computeIfAbsent(item.getTaskId(), k -> new ArrayList<>()).add(item); - } + // 使用子任务的ID作为虚拟Task的唯一标识(避免同一主任务多个子任务冲突) + Map virtualTaskToItemMap = new HashMap<>(); + for (int i = 0; i < tasks.size(); i++) { + Task virtualTask = tasks.get(i); + TaskItem correspondingItem = filteredItems.get(i); + // 使用负数ID区分虚拟Task(避免与真实TaskID冲突) + Long virtualId = -(correspondingItem.getId()); + virtualTask.setId(virtualId); + taskItemsMap.put(virtualId, List.of(correspondingItem)); + virtualTaskToItemMap.put(virtualId, correspondingItem); } // 🔥 第一遍遍历:收集所有出现的任务类型名称(用于动态列)