分派配置审批

liweidong
张乾翔 1 week ago
parent 3ff71c93a1
commit c26e6f3f5e
  1. 11
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/constant/DispatchConfigApprovalConst.java
  2. 37
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/dto/DispatchConfigApprovalSearch.java
  3. 87
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/DispatchConfigApprovalRecord.java
  4. 40
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java
  5. 37
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java
  6. 15
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java
  7. 36
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.java
  8. 74
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml
  9. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IDispatchConfigApprovalService.java
  10. 225
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.java

@ -14,9 +14,9 @@ public interface DispatchConfigApprovalConst {
Integer STATUS_DRAFT = 0;
/**
* 状态-审批中
* 状态-一级审批中室主任审批
*/
Integer STATUS_APPROVING = 1;
Integer STATUS_LEVEL1_APPROVING = 1;
/**
* 状态-审批通过
@ -28,10 +28,15 @@ public interface DispatchConfigApprovalConst {
*/
Integer STATUS_REJECTED = 3;
/**
* 状态-二级审批中领导审批
*/
Integer STATUS_LEVEL2_APPROVING = 4;
/**
* 状态-已撤销
*/
Integer STATUS_CANCELLED = 4;
Integer STATUS_CANCELLED = 5;
/**
* 审批结果-通过

@ -0,0 +1,37 @@
package org.springblade.desk.quality.pojo.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* 分派配置审批查询条件
*
* @author AI
* @since 2026-05-19
*/
@Data
@Schema(description = "分派配置审批查询条件")
public class DispatchConfigApprovalSearch implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 申请单号模糊查询
*/
@Schema(description = "申请单号")
private String applicationNo;
/**
* 申请人姓名模糊查询
*/
@Schema(description = "申请人姓名")
private String applicantName;
/**
* 状态
*/
@Schema(description = "状态: 0-草稿, 1-审批中, 2-审批通过, 3-审批驳回, 4-已撤销")
private Integer status;
}

@ -0,0 +1,87 @@
package org.springblade.desk.quality.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import java.util.Date;
/**
* 分派配置审批记录实体类
*
* @author AI
* @since 2026-05-20
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("QA_DISPATCH_CFG_APPR_REC")
@Schema(description = "分派配置审批记录实体")
public class DispatchConfigApprovalRecord extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "ID", type = IdType.ASSIGN_ID)
@Schema(description = "主键ID")
private Long id;
/**
* 审批主表ID
*/
@Schema(description = "审批主表ID")
private Long approvalId;
/**
* 审批节点1-室主任审批2-领导审批
*/
@Schema(description = "审批节点:1-室主任审批,2-领导审批")
private Integer approvalNode;
/**
* 审批节点名称
*/
@Schema(description = "审批节点名称")
private String approvalNodeName;
/**
* 审批人ID
*/
@Schema(description = "审批人ID")
private Long auditorId;
/**
* 审批人姓名
*/
@Schema(description = "审批人姓名")
private String auditorName;
/**
* 审批结果1-通过2-驳回
*/
@Schema(description = "审批结果:1-通过,2-驳回")
private Integer auditResult;
/**
* 审批意见
*/
@Schema(description = "审批意见")
private String auditRemark;
/**
* 审批时间
*/
@Schema(description = "审批时间")
private Date auditTime;
/**
* 排序号
*/
@Schema(description = "排序号")
private Integer sortOrder;
}

@ -0,0 +1,40 @@
package org.springblade.desk.quality.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* 分派配置审批时间线数据VO
*
* @author AI
* @since 2026-05-20
*/
@Data
@Schema(description = "分派配置审批时间线数据VO")
public class DispatchConfigApprovalTimelineVO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "类型: submit-提交, audit-审核")
private String type;
@Schema(description = "标签: 提交人/审核人")
private String label;
@Schema(description = "值: 人员姓名")
private String value;
@Schema(description = "时间")
private String time;
@Schema(description = "状态: pending-待处理, success-已完成, rejected-已驳回")
private String status;
@Schema(description = "审批节点:1-室主任审批,2-领导审批")
private Integer approvalNode;
@Schema(description = "审批意见")
private String remark;
}

@ -0,0 +1,37 @@
package org.springblade.desk.quality.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* 过程记录模板审核时间线数据VO
*
* @author AI
* @since 2026-05-20
*/
@Data
@Schema(description = "过程记录模板审核时间线数据VO")
public class ProReTemplateTimelineVO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "类型: submit-提交, audit-审核")
private String type;
@Schema(description = "标签: 提交人/审核人")
private String label;
@Schema(description = "值: 人员姓名")
private String value;
@Schema(description = "时间")
private String time;
@Schema(description = "状态: pending-待处理, success-已完成")
private String status;
@Schema(description = "备注")
private String remark;
}

@ -25,6 +25,7 @@ import org.springblade.desk.quality.constant.QAModuleConst;
import org.springblade.desk.quality.excel.DispatchConfigApprovalExcel;
import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval;
import org.springblade.desk.quality.pojo.request.DispatchConfigApprovalRequest;
import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalTimelineVO;
import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalVO;
import org.springblade.desk.quality.service.IDispatchConfigApprovalService;
import org.springblade.desk.quality.wrapper.DispatchConfigApprovalWrapper;
@ -178,12 +179,12 @@ public class DispatchConfigApprovalController extends BladeController {
}
/**
* [分派配置审批] 审批待实现
* [分派配置审批] 审批两级审批
*/
@PostMapping("/audit")
@ApiOperationSupport(order = 80)
@ApiLog("审批分派配置")
@Operation(summary = "审批", description = "审批功能待实现")
@Operation(summary = "审批", description = "根据当前状态自动判断是一级还是二级审批")
public R audit(@Parameter(description = "主键ID", required = true) @RequestParam Long id,
@Parameter(description = "审批结果: 1-通过, 2-驳回", required = true) @RequestParam Integer result,
@Parameter(description = "审批意见") @RequestParam(required = false) String remark) {
@ -191,12 +192,12 @@ public class DispatchConfigApprovalController extends BladeController {
}
/**
* [分派配置审批] 查询审批历史
* [分派配置审批] 查询审批时间线
*/
@GetMapping("/auditHistory/{id}")
@GetMapping("/auditTimeline/{id}")
@ApiOperationSupport(order = 90)
@Operation(summary = "查询审批历史", description = "传入主键ID")
public R<DispatchConfigApprovalVO> getAuditHistory(@Parameter(description = "主键ID", required = true) @PathVariable Long id) {
return R.data(service.getAuditHistory(id));
@Operation(summary = "查询审批时间线", description = "传入主键ID")
public R<List<DispatchConfigApprovalTimelineVO>> getAuditTimeline(@Parameter(description = "主键ID", required = true) @PathVariable Long id) {
return R.data(service.getAuditTimeline(id));
}
}

@ -0,0 +1,36 @@
package org.springblade.desk.quality.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;
import org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord;
import java.util.List;
/**
* 分派配置审批记录 Mapper 接口
*
* @author AI
* @since 2026-05-20
*/
public interface DispatchConfigApprovalRecordMapper extends BaseMapper<DispatchConfigApprovalRecord> {
/**
* 查询室主任审批节点的所有审批人
*/
List<DispatchConfigApprovalRecord> selectLevel1Auditors();
/**
* 查询领导审批节点的所有审批人
*/
List<DispatchConfigApprovalRecord> selectLevel2Auditors();
/**
* 根据审批ID查询审批记录
*/
List<DispatchConfigApprovalRecord> selectByApprovalId(Long approvalId);
/**
* 根据审批ID和审批节点查询审批记录
*/
List<DispatchConfigApprovalRecord> selectByApprovalIdAndNode(Long approvalId, Integer approvalNode);
}

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.quality.mapper.DispatchConfigApprovalRecordMapper">
<!-- 查询室主任审批节点的所有审批人 -->
<!-- 角色:热表-厂内调度室主任、热表-外协调度室主任 -->
<select id="selectLevel1Auditors" resultType="org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord">
SELECT
sr.ID as auditorId,
sr.REAL_NAME as auditorName,
1 as sortOrder
FROM BLADE_USER_ROLE sur
JOIN BLADE_ROLE r ON sur.ROLE_ID = r.ID
JOIN BLADE_USER sr ON sur.USER_ID = sr.ID
WHERE r.ROLE_ALIAS IN ('热表-厂内调度室主任', '热表-外协调度室主任')
AND sr.IS_DELETED = 0
ORDER BY sortOrder
</select>
<!-- 查询领导审批节点的所有审批人 -->
<!-- 角色:热表-副厂长、热表-主任、热表-厂长 -->
<select id="selectLevel2Auditors" resultType="org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord">
SELECT
sr.ID as auditorId,
sr.REAL_NAME as auditorName,
2 as sortOrder
FROM BLADE_USER_ROLE sur
JOIN BLADE_ROLE r ON sur.ROLE_ID = r.ID
JOIN BLADE_USER sr ON sur.USER_ID = sr.ID
WHERE r.ROLE_ALIAS IN ('热表-副厂长', '热表-主任', '热表-厂长')
AND sr.IS_DELETED = 0
ORDER BY sortOrder
</select>
<!-- 根据审批ID查询审批记录 -->
<select id="selectByApprovalId" resultType="org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord">
SELECT
ID,
APPROVAL_ID,
APPROVAL_NODE,
APPROVAL_NODE_NAME,
AUDITOR_ID,
AUDITOR_NAME,
AUDIT_RESULT,
AUDIT_REMARK,
AUDIT_TIME,
SORT_ORDER
FROM QA_DISPATCH_CFG_APPR_REC
WHERE APPROVAL_ID = #{approvalId}
AND IS_DELETED = 0
ORDER BY APPROVAL_NODE, SORT_ORDER
</select>
<!-- 根据审批ID和审批节点查询审批记录 -->
<select id="selectByApprovalIdAndNode" resultType="org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord">
SELECT
ID,
APPROVAL_ID,
APPROVAL_NODE,
APPROVAL_NODE_NAME,
AUDITOR_ID,
AUDITOR_NAME,
AUDIT_RESULT,
AUDIT_REMARK,
AUDIT_TIME,
SORT_ORDER
FROM QA_DISPATCH_CFG_APPR_REC
WHERE APPROVAL_ID = #{approvalId}
AND APPROVAL_NODE = #{approvalNode}
AND IS_DELETED = 0
ORDER BY SORT_ORDER
</select>
</mapper>

@ -5,6 +5,7 @@ import org.springblade.core.tool.api.R;
import org.springblade.desk.basic.service.en.EnBaseService;
import org.springblade.desk.quality.excel.DispatchConfigApprovalExcel;
import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval;
import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalTimelineVO;
import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalVO;
import java.util.List;
@ -67,7 +68,7 @@ public interface IDispatchConfigApprovalService extends EnBaseService<DispatchCo
R submitApproval(Long id);
/**
* 审批待实现
* 审批两级审批
*
* @param id 主键ID
* @param result 审批结果: 1-通过, 2-驳回
@ -77,10 +78,10 @@ public interface IDispatchConfigApprovalService extends EnBaseService<DispatchCo
R audit(Long id, Integer result, String remark);
/**
* 查询审批历史
* 查询审批时间线
*
* @param id 主键ID
* @return 审批历史信息
* @return 审批时间线数据列表
*/
DispatchConfigApprovalVO getAuditHistory(Long id);
List<DispatchConfigApprovalTimelineVO> getAuditTimeline(Long id);
}

@ -1,5 +1,6 @@
package org.springblade.desk.quality.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -11,8 +12,11 @@ import org.springblade.desk.basic.service.en.impl.EnBaseServiceImpl;
import org.springblade.desk.quality.constant.DispatchConfigApprovalConst;
import org.springblade.desk.quality.excel.DispatchConfigApprovalExcel;
import org.springblade.desk.quality.mapper.DispatchConfigApprovalMapper;
import org.springblade.desk.quality.mapper.DispatchConfigApprovalRecordMapper;
import org.springblade.desk.quality.pojo.entity.DispatchConfigApproval;
import org.springblade.desk.quality.pojo.entity.DispatchConfigApprovalRecord;
import org.springblade.desk.quality.pojo.request.DispatchConfigApprovalRequest;
import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalTimelineVO;
import org.springblade.desk.quality.pojo.vo.DispatchConfigApprovalVO;
import org.springblade.desk.quality.service.IDispatchConfigApprovalService;
import org.springblade.desk.quality.wrapper.DispatchConfigApprovalWrapper;
@ -20,10 +24,9 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 分派配置审批服务实现类
@ -35,6 +38,9 @@ import java.util.Objects;
@Service
public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<DispatchConfigApprovalMapper, DispatchConfigApproval> implements IDispatchConfigApprovalService {
@jakarta.annotation.Resource
private DispatchConfigApprovalRecordMapper approvalRecordMapper;
@Override
public IPage<DispatchConfigApprovalVO> selectDispatchConfigApprovalPage(IPage<DispatchConfigApproval> page, DispatchConfigApprovalVO entity) {
QueryWrapper<DispatchConfigApproval> queryWrapper = new QueryWrapper<>();
@ -168,29 +174,218 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
return R.fail("只有草稿状态的记录可以提交审批");
}
// 更新状态为审批中
entity.setStatus(DispatchConfigApprovalConst.STATUS_APPROVING);
// 更新状态为一级审批中
entity.setStatus(DispatchConfigApprovalConst.STATUS_LEVEL1_APPROVING);
updateById(entity);
// TODO: 发送消息通知给审批人
return R.success("提交审批成功");
}
@Override
@Transactional(rollbackFor = Exception.class)
public R audit(Long id, Integer result, String remark) {
// TODO: 审批功能逻辑待确认,暂时返回提示信息
return R.fail("审批功能待实现");
DispatchConfigApproval entity = getById(id);
if (entity == null) {
return R.fail("记录不存在");
}
// 只有审批中状态才能审批(一级或二级)
if (!DispatchConfigApprovalConst.STATUS_LEVEL1_APPROVING.equals(entity.getStatus())
&& !DispatchConfigApprovalConst.STATUS_LEVEL2_APPROVING.equals(entity.getStatus())
&& !DispatchConfigApprovalConst.STATUS_REJECTED.equals(entity.getStatus())) {
return R.fail("只有审批中的记录才能进行审批");
}
// 校验审批结果
if (result == null || (!DispatchConfigApprovalConst.AUDIT_RESULT_PASS.equals(result)
&& !DispatchConfigApprovalConst.AUDIT_RESULT_REJECT.equals(result))) {
return R.fail("审批结果错误,1-通过,2-驳回");
}
// 审批不通过时,意见必填
if (DispatchConfigApprovalConst.AUDIT_RESULT_REJECT.equals(result) && StrUtil.isBlank(remark)) {
return R.fail("审批不通过时,必须填写审批意见");
}
// 获取当前用户
Long currentUserId = AuthUtil.getUserId();
String currentUserName = AuthUtil.getUserName();
Date now = new Date();
// 根据当前状态判断属于哪个审批节点
Integer currentNode = null;
String currentNodeName = null;
if (DispatchConfigApprovalConst.STATUS_LEVEL1_APPROVING.equals(entity.getStatus())) {
currentNode = 1;
currentNodeName = "室主任审批";
} else if (DispatchConfigApprovalConst.STATUS_LEVEL2_APPROVING.equals(entity.getStatus())) {
currentNode = 2;
currentNodeName = "领导审批";
}
// 动态查询当前节点的所有审批人
List<DispatchConfigApprovalRecord> currentLevelAuditors =
currentNode == 1 ? approvalRecordMapper.selectLevel1Auditors() : approvalRecordMapper.selectLevel2Auditors();
if (CollUtil.isEmpty(currentLevelAuditors)) {
return R.fail("当前节点没有审批人");
}
// 检查当前用户是否在当前节点的审批人列表中
boolean isAuditor = false;
for (DispatchConfigApprovalRecord auditor : currentLevelAuditors) {
if (auditor.getAuditorId().equals(currentUserId)) {
isAuditor = true;
break;
}
}
// 如果当前用户不是当前节点的审批人
if (!isAuditor) {
return R.fail("您不是当前审批节点的审批人");
}
// 检查当前用户是否已经审批过
QueryWrapper<DispatchConfigApprovalRecord> recordQuery = new QueryWrapper<>();
recordQuery.eq("APPROVAL_ID", id)
.eq("AUDITOR_ID", currentUserId)
.eq("APPROVAL_NODE", currentNode)
.eq("IS_DELETED", 0);
DispatchConfigApprovalRecord existingRecord = approvalRecordMapper.selectOne(recordQuery);
if (existingRecord != null) {
return R.fail("您已经完成审批,不能重复审批");
}
// 创建新的审批记录
DispatchConfigApprovalRecord newRecord = new DispatchConfigApprovalRecord();
newRecord.setApprovalId(id);
newRecord.setApprovalNode(currentNode);
newRecord.setApprovalNodeName(currentNodeName);
newRecord.setAuditorId(currentUserId);
newRecord.setAuditorName(currentUserName);
newRecord.setAuditResult(result);
newRecord.setAuditRemark(remark);
newRecord.setAuditTime(now);
approvalRecordMapper.insert(newRecord);
// 如果审批驳回,直接驳回到发起人,并删除审批记录
if (DispatchConfigApprovalConst.AUDIT_RESULT_REJECT.equals(result)) {
entity.setStatus(DispatchConfigApprovalConst.STATUS_REJECTED);
entity.setUpdateUser(currentUserId);
entity.setUpdateTime(now);
updateById(entity);
// 删除当前节点的审批记录,以便重新审批
QueryWrapper<DispatchConfigApprovalRecord> deleteQuery = new QueryWrapper<>();
deleteQuery.eq("APPROVAL_ID", id);
approvalRecordMapper.delete(deleteQuery);
return R.success("审批已驳回");
}
// 审批通过,检查当前节点是否全部通过
// 查询当前节点已通过的审批人数
QueryWrapper<DispatchConfigApprovalRecord> passedQuery = new QueryWrapper<>();
passedQuery.eq("APPROVAL_ID", id)
.eq("APPROVAL_NODE", currentNode)
.eq("AUDIT_RESULT", DispatchConfigApprovalConst.AUDIT_RESULT_PASS)
.eq("IS_DELETED", 0);
List<DispatchConfigApprovalRecord> passedList = approvalRecordMapper.selectList(passedQuery);
Set<Long> passedAuditorIds
= passedList.stream().map(DispatchConfigApprovalRecord::getAuditorId).collect(Collectors.toSet());
Set<Long> auditorIds = currentLevelAuditors.stream().map(DispatchConfigApprovalRecord::getAuditorId).collect(Collectors.toSet());
// 检查当前节点的所有审批人是否都已通过
boolean allPassed = passedAuditorIds.containsAll(auditorIds);
if (allPassed) {
// 当前节点所有人都通过了
if (currentNode == 1) {
// 一级审批全部通过,进入二级审批
entity.setStatus(DispatchConfigApprovalConst.STATUS_LEVEL2_APPROVING);
entity.setUpdateUser(currentUserId);
entity.setUpdateTime(now);
updateById(entity);
} else if (currentNode == 2) {
// 二级审批全部通过,审批完成
entity.setStatus(DispatchConfigApprovalConst.STATUS_APPROVED);
entity.setUpdateUser(currentUserId);
entity.setUpdateTime(now);
updateById(entity);
}
}
return R.success("审批成功");
}
@Override
public DispatchConfigApprovalVO getAuditHistory(Long id) {
public List<DispatchConfigApprovalTimelineVO> getAuditTimeline(Long id) {
DispatchConfigApproval entity = getById(id);
if (entity == null) {
return null;
}
return DispatchConfigApprovalVO.fromEntity(entity);
return new ArrayList<>();
}
List<DispatchConfigApprovalTimelineVO> timelineList = new ArrayList<>();
// 1. 添加提交记录
DispatchConfigApprovalTimelineVO submitNode = new DispatchConfigApprovalTimelineVO();
submitNode.setType("submit");
submitNode.setLabel("提交人:");
submitNode.setValue(entity.getApplicantName() != null ? entity.getApplicantName() : "未知");
submitNode.setTime(entity.getApplicationTime() != null ? DateUtil.format(entity.getApplicationTime(), "yyyy-MM-dd HH:mm:ss") : "");
submitNode.setStatus("success");
submitNode.setApprovalNode(0);
timelineList.add(submitNode);
// 2. 查询所有审批记录
List<DispatchConfigApprovalRecord> allRecords = approvalRecordMapper.selectByApprovalId(id);
// 按审批节点分组
Map<Integer, List<DispatchConfigApprovalRecord>> nodeMap = allRecords.stream()
.collect(Collectors.groupingBy(DispatchConfigApprovalRecord::getApprovalNode));
// 3. 添加一级审批节点(如果有审批记录)
if (nodeMap.containsKey(1)) {
List<DispatchConfigApprovalRecord> 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);
}
// 4. 添加二级审批节点(如果有审批记录)
if (nodeMap.containsKey(2)) {
List<DispatchConfigApprovalRecord> level2Records = nodeMap.get(2);
// 只展示第一个通过的审批人
DispatchConfigApprovalRecord firstRecord = level2Records.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(2);
node.setStatus("success");
timelineList.add(node);
}
// 按时间倒序排列(最新的在前面)
timelineList.sort((a, b) -> {
if (a.getTime() == null || b.getTime() == null) {
return 0;
}
return b.getTime().compareTo(a.getTime());
});
return timelineList;
}
/**

Loading…
Cancel
Save