|
|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|