分派配置审批联调

liweidong
张乾翔 1 week ago
parent e5beba75f7
commit b3d5670012
  1. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/DispatchConfigApprovalTimelineVO.java
  2. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/ProReTemplateTimelineVO.java
  3. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/DispatchConfigApprovalController.java
  4. 36
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/DispatchConfigApprovalRecordMapper.xml
  5. 123
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/DispatchConfigApprovalServiceImpl.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<DispatchConfigApprovalTimelineVO> children;
}

@ -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 = "备注")

@ -194,7 +194,7 @@ public class DispatchConfigApprovalController extends BladeController {
/**
* [分派配置审批] 查询审批时间线
*/
@GetMapping("/auditTimeline/{id}")
@GetMapping("/auditHistory/{id}")
@ApiOperationSupport(order = 90)
@Operation(summary = "查询审批时间线", description = "传入主键ID")
public R<List<DispatchConfigApprovalTimelineVO>> getAuditTimeline(@Parameter(description = "主键ID", required = true) @PathVariable Long id) {

@ -5,30 +5,30 @@
<!-- 查询室主任审批节点的所有审批人 -->
<!-- 角色:热表-厂内调度室主任、热表-外协调度室主任 -->
<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
SELECT DISTINCT
u.ID AS auditorId,
u.REAL_NAME AS auditorName,
1 AS sortOrder
FROM BLADE_USER u
INNER JOIN BLADE_ROLE r ON INSTR(',' || u.ROLE_ID || ',', ',' || r.ID || ',') > 0
WHERE r.ROLE_ALIAS IN ('dispatch_manger', 'supplier_dispatch_manger')
AND u.IS_DELETED = 0
AND r.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
SELECT DISTINCT
u.ID AS auditorId,
u.REAL_NAME AS auditorName,
2 AS sortOrder
FROM BLADE_USER u
INNER JOIN BLADE_ROLE r ON INSTR(',' || u.ROLE_ID || ',', ',' || r.ID || ',') > 0
WHERE r.ROLE_ALIAS IN ('deputy_plant_manager', 'rb_manager', 'plant_manager')
AND u.IS_DELETED = 0
AND r.IS_DELETED = 0
ORDER BY sortOrder
</select>

@ -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<Dispatc
// 更新状态为一级审批中
entity.setStatus(DispatchConfigApprovalConst.STATUS_LEVEL1_APPROVING);
updateById(entity);
// 删除当前节点的审批记录,以便重新审批
QueryWrapper<DispatchConfigApprovalRecord> deleteQuery = new QueryWrapper<>();
deleteQuery.eq("APPROVAL_ID", id);
approvalRecordMapper.delete(deleteQuery);
return R.success("提交审批成功");
}
@ -267,6 +274,10 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
newRecord.setAuditResult(result);
newRecord.setAuditRemark(remark);
newRecord.setAuditTime(now);
newRecord.setCreateTime(now);
newRecord.setCreateUser(currentUserId);
newRecord.setUpdateTime(now);
newRecord.setUpdateUser(currentUserId);
approvalRecordMapper.insert(newRecord);
// 如果审批驳回,直接驳回到发起人,并删除审批记录
@ -276,11 +287,6 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
entity.setUpdateTime(now);
updateById(entity);
// 删除当前节点的审批记录,以便重新审批
QueryWrapper<DispatchConfigApprovalRecord> deleteQuery = new QueryWrapper<>();
deleteQuery.eq("APPROVAL_ID", id);
approvalRecordMapper.delete(deleteQuery);
return R.success("审批已驳回");
}
@ -323,6 +329,7 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
@Override
public List<DispatchConfigApprovalTimelineVO> getAuditTimeline(Long id) {
DispatchConfigApproval entity = getById(id);
if (entity == null) {
return new ArrayList<>();
@ -333,59 +340,91 @@ public class DispatchConfigApprovalServiceImpl extends EnBaseServiceImpl<Dispatc
// 1. 添加提交记录
DispatchConfigApprovalTimelineVO submitNode = new DispatchConfigApprovalTimelineVO();
submitNode.setType("submit");
submitNode.setLabel("提交人");
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);
// 提交节点不需要children
DispatchConfigApprovalTimelineVO dispatchConfigApprovalTimelineVO = BeanUtil.copyProperties(submitNode, DispatchConfigApprovalTimelineVO.class);
submitNode.setChildren(List.of(dispatchConfigApprovalTimelineVO));
timelineList.add(submitNode);
// 2. 查询所有审批记录
// 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);
// 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<DispatchConfigApprovalRecord> records,
Integer approvalNode,
List<DispatchConfigApprovalTimelineVO> 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<DispatchConfigApprovalRecord> level2Records = nodeMap.get(2);
// 只展示第一个通过的审批人
DispatchConfigApprovalRecord firstRecord = level2Records.get(0);
// 为每个审批人创建一条时间线记录
List<DispatchConfigApprovalTimelineVO> 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);
}
/**

Loading…
Cancel
Save