From b3d5670012cde83f8110bd93a9a9fbb5fec88c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Fri, 22 May 2026 18:07:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E6=B4=BE=E9=85=8D=E7=BD=AE=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/DispatchConfigApprovalTimelineVO.java | 3 + .../pojo/vo/ProReTemplateTimelineVO.java | 2 +- .../DispatchConfigApprovalController.java | 2 +- .../DispatchConfigApprovalRecordMapper.xml | 36 ++--- .../DispatchConfigApprovalServiceImpl.java | 123 ++++++++++++------ 5 files changed, 104 insertions(+), 62 deletions(-) diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java index de2086600..2218bb5b7 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; +import java.util.List; /** * 分派配置审批时间线数据VO @@ -37,4 +38,6 @@ public class DispatchConfigApprovalTimelineVO implements Serializable { @Schema(description = "审批意见") private String remark; + + List children; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java index 18ff7cb23..29b24f54b 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java @@ -29,7 +29,7 @@ public class ProReTemplateTimelineVO implements Serializable { @Schema(description = "时间") private String time; - @Schema(description = "状态: pending-待处理, success-已完成") + @Schema(description = "状态") private String status; @Schema(description = "备注") diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java index dd678ca9d..b1073cc07 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java @@ -194,7 +194,7 @@ public class DispatchConfigApprovalController extends BladeController { /** * [分派配置审批] 查询审批时间线 */ - @GetMapping("/auditTimeline/{id}") + @GetMapping("/auditHistory/{id}") @ApiOperationSupport(order = 90) @Operation(summary = "查询审批时间线", description = "传入主键ID") public R> getAuditTimeline(@Parameter(description = "主键ID", required = true) @PathVariable Long id) { diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml index 52bd097e8..17c6bbd51 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml @@ -5,30 +5,30 @@ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java index 0853e7763..b5edd644e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java @@ -1,5 +1,6 @@ package org.springblade.desk.quality.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -177,6 +178,12 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl deleteQuery = new QueryWrapper<>(); + deleteQuery.eq("APPROVAL_ID", id); + approvalRecordMapper.delete(deleteQuery); + return R.success("提交审批成功"); } @@ -267,6 +274,10 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl deleteQuery = new QueryWrapper<>(); - deleteQuery.eq("APPROVAL_ID", id); - approvalRecordMapper.delete(deleteQuery); return R.success("审批已驳回"); } @@ -323,6 +329,7 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl getAuditTimeline(Long id) { + DispatchConfigApproval entity = getById(id); if (entity == null) { return new ArrayList<>(); @@ -333,59 +340,91 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl allRecords = approvalRecordMapper.selectByApprovalId(id); - - // 按审批节点分组 Map> nodeMap = allRecords.stream() .collect(Collectors.groupingBy(DispatchConfigApprovalRecord::getApprovalNode)); - // 3. 添加一级审批节点(如果有审批记录) - if (nodeMap.containsKey(1)) { - List level1Records = nodeMap.get(1); - // 只展示第一个通过的审批人 - DispatchConfigApprovalRecord firstRecord = level1Records.get(0); - DispatchConfigApprovalTimelineVO node = new DispatchConfigApprovalTimelineVO(); - node.setType("audit"); - node.setLabel("一级审批:"); - node.setValue("已通过"); - node.setTime(firstRecord.getAuditTime() != null ? DateUtil.format(firstRecord.getAuditTime(), "yyyy-MM-dd HH:mm:ss") : ""); - node.setApprovalNode(1); - node.setStatus("success"); - timelineList.add(node); + // 3. 处理一级审批节点 + buildApprovalNodes(nodeMap.getOrDefault(1, new ArrayList<>()), 1, timelineList,entity); + + // 4. 处理二级审批节点 + buildApprovalNodes(nodeMap.getOrDefault(2, new ArrayList<>()), 2, timelineList,entity); + + return timelineList; + } + + /** + * 构建审批节点时间线记录 + * + * @param records 审批记录列表 + * @param approvalNode 审批节点(1-一级审批,2-二级审批) + * @param timelineList 时间线结果集 + */ + private void buildApprovalNodes(List records, + Integer approvalNode, + List timelineList, + DispatchConfigApproval entity) { + String status = "false"; + if (1 == approvalNode && DispatchConfigApprovalConst.STATUS_LEVEL2_APPROVING.equals(entity.getStatus())) { + status = "success"; + } + if (2 == approvalNode && DispatchConfigApprovalConst.STATUS_APPROVED.equals(entity.getStatus())) { + status = "success"; + } + String label; + if (1 == approvalNode) { + label = "一级审批"; + } else { + label = " 二级审批"; } + DispatchConfigApprovalTimelineVO submitNode = new DispatchConfigApprovalTimelineVO(); + submitNode.setLabel(label); + submitNode.setType("audit"); + submitNode.setStatus(status); + submitNode.setApprovalNode(approvalNode); + + if (records == null || records.isEmpty()) { + timelineList.add(submitNode); + return; + } + - // 4. 添加二级审批节点(如果有审批记录) - if (nodeMap.containsKey(2)) { - List level2Records = nodeMap.get(2); - // 只展示第一个通过的审批人 - DispatchConfigApprovalRecord firstRecord = level2Records.get(0); + // 为每个审批人创建一条时间线记录 + List childRecords = records.stream().map(record -> { DispatchConfigApprovalTimelineVO node = new DispatchConfigApprovalTimelineVO(); node.setType("audit"); - node.setLabel("二级审批:"); - node.setValue("已通过"); - node.setTime(firstRecord.getAuditTime() != null ? DateUtil.format(firstRecord.getAuditTime(), "yyyy-MM-dd HH:mm:ss") : ""); - node.setApprovalNode(2); - node.setStatus("success"); - timelineList.add(node); - } - - // 按时间倒序排列(最新的在前面) - timelineList.sort((a, b) -> { - if (a.getTime() == null || b.getTime() == null) { - return 0; + node.setLabel("审批人"); + + // 根据审批结果设置状态和值 + if (DispatchConfigApprovalConst.AUDIT_RESULT_PASS.equals(record.getAuditResult())) { + node.setValue(record.getAuditorName() != null ? record.getAuditorName() : "未知"); + node.setStatus("success"); + } else if (DispatchConfigApprovalConst.AUDIT_RESULT_REJECT.equals(record.getAuditResult())) { + node.setValue(record.getAuditorName() != null ? record.getAuditorName() : "未知"); + node.setStatus("false"); } - return b.getTime().compareTo(a.getTime()); - }); - return timelineList; + node.setTime(record.getAuditTime() != null ? DateUtil.format(record.getAuditTime(), "yyyy-MM-dd HH:mm:ss") : ""); + node.setApprovalNode(approvalNode); + node.setRemark(record.getAuditRemark()); + return node; + }).sorted(Comparator.comparing(DispatchConfigApprovalTimelineVO::getTime, Comparator.nullsLast(Comparator.naturalOrder()))) + .collect(Collectors.toList()); + + submitNode.setChildren(childRecords); + + timelineList.add(submitNode); } /**