From 44683931d3ca09cf2a062b6ef6cffb4624a18c4d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 24 八月 2026 12:29:36 +0800
Subject: [PATCH] feat(approve): 支持审批流程多选部门功能
---
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java | 106 ++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 89 insertions(+), 17 deletions(-)
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index 9e74e2a..d0b0c7a 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -3,13 +3,16 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.mapper.ApproveNodeMapper;
+import com.ruoyi.approve.mapper.ApproveProcessDeptMapper;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.pojo.ApproveProcessDept;
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.utils.DailyRedisCounter;
@@ -51,7 +54,10 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Map;
import java.util.List;
+import java.util.Set;
import java.util.stream.Collectors;
@Service
@@ -70,7 +76,9 @@
@Autowired
private SysUserMapper sysUserMapper;
@Autowired
- private ApproveProcessMapper approveProcessMapper;
+ private ApproveProcessMapper approveProcessMapper;
+ @Autowired
+ private ApproveProcessDeptMapper approveProcessDeptMapper;
@Autowired
private TempFileServiceImpl tempFileService;
@Autowired
@@ -83,7 +91,11 @@
@Override
public void addApprove(ApproveProcessVO approveProcessVO) throws Exception {
SysUser sysUser = sysUserMapper.selectUserById(approveProcessVO.getApproveUser());
- SysDept sysDept = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId());
+ List<Long> approveDeptIds = normalizeDeptIds(approveProcessVO.getApproveDeptIdArray(), approveProcessVO.getApproveDeptId());
+ List<SysDept> sysDepts = sysDeptMapper.selectBatchIds(approveDeptIds);
+ Map<Long, SysDept> deptMap = sysDepts.stream().collect(Collectors.toMap(SysDept::getDeptId, dept -> dept));
+ if (deptMap.size() != approveDeptIds.size()) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
+ SysDept sysDept = deptMap.get(approveDeptIds.get(0));
String[] split = approveProcessVO.getApproveUserIds().split(",");
List<Long> longList = Arrays.stream(split)
.map(Long::valueOf) // 灏嗘瘡涓� String 杞崲涓� Long
@@ -99,12 +111,14 @@
// String approveID = today + formattedCount;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
ApproveProcess approveProcess = new ApproveProcess();
- String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "SP","approveId");
+ String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "","approve_id");
approveProcess.setApproveId(no);
approveProcess.setApproveUser(approveProcessVO.getApproveUser());
approveProcess.setApproveUserName(sysUser.getNickName());
- approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId());
- approveProcess.setApproveDeptName(sysDept.getDeptName());
+ approveProcess.setApproveDeptId(approveDeptIds.get(0));
+ approveProcess.setApproveDeptName(approveDeptIds.stream().map(deptMap::get).map(SysDept::getDeptName).collect(Collectors.joining(",")));
+ approveProcess.setApproveDeptIdArray(approveDeptIds);
+ approveProcess.setApproveDeptNameArray(approveDeptIds.stream().map(deptMap::get).map(SysDept::getDeptName).collect(Collectors.toList()));
approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime()));
approveProcess.setApproveReason(approveProcessVO.getApproveReason());
@@ -117,9 +131,10 @@
approveProcess.setApproveDelete(0);
approveProcess.setApproveType(approveProcessVO.getApproveType());
approveProcess.setCreateTime(LocalDateTime.now());
- approveProcess.setTenantId(approveProcessVO.getApproveDeptId());
+ approveProcess.setTenantId(approveDeptIds.get(0));
approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds());
approveProcess.setApproveUserCurrentId(longList.get(0));
+ approveProcess.setApproveTitle(ObjectUtils.isNotEmpty(approveProcessVO.getApproveTitle()) ? approveProcessVO.getApproveTitle() : "");
approveProcess.setApproveUserCurrentName(sysUsers
.stream()
.filter(SysUser -> SysUser.getUserId().equals(longList.get(0)))
@@ -133,8 +148,9 @@
approveProcessMapper.updateById(approveProcess1);
}
save(approveProcess);
+ saveProcessDepartments(approveProcess.getId(), approveDeptIds, deptMap);
//鍒濆鍖栧鎵硅妭鐐�
- approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(), no, approveProcessVO.getApproveDeptId());
+ approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(), no, approveDeptIds.get(0));
// 闄勪欢缁戝畾
tempFileService.migrateTempFilesToFormal(approveProcess.getId(), approveProcessVO.getTempFileIds(), FileNameType.ApproveProcess.getValue());
/*娑堟伅閫氱煡*/
@@ -171,6 +187,7 @@
@Override
public IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess) {
IPage<ApproveProcess> approveProcessIPage = approveProcessMapper.listPage(page, approveProcess);
+ fillDepartmentArrays(approveProcessIPage.getRecords());
List<ApproveProcess> records = approveProcessIPage.getRecords();
for (ApproveProcess record : records) {
@@ -221,20 +238,19 @@
return approveProcessIPage;
}
- public void delByIds(List<Long> ids) {
- for (Long approveId : ids) {
+ @Override
+ public void delByIds(List<Long> longs) {
+ ApproveProcess approveProcess;
+ for (Long approveId : longs) {
// 閫昏緫鍒犻櫎瀹℃壒娴佺▼
update(new UpdateWrapper<ApproveProcess>()
.lambda()
.set(ApproveProcess::getApproveDelete, 1)
- .eq(ApproveProcess::getId, approveId));
- // 鍒犻櫎瀵瑰簲鐨勯檮浠�
- commonFileService.deleteByBusinessId(approveId, FileNameType.ApproveProcess.getValue());
- ApproveProcess approveProcess = approveProcessMapper.selectById(approveId);
+ .eq(ApproveProcess::getApproveId, approveId));
// 鍒犻櫎瀹℃壒鑺傜偣
- approveNodeService.delApproveNodeByApproveId(approveProcess.getApproveId());
+ approveNodeService.delApproveNodeByApproveId(approveId);
// 鍙煡鏈�鏂颁竴鏉″鎵规祦绋�
ApproveProcess latestProcess = approveProcessMapper.selectOne(
@@ -247,14 +263,12 @@
continue;
}
-
// 鍒犻櫎瀵瑰簲鐨勬秷鎭�氱煡
sysNoticeService.remove(new LambdaQueryWrapper<SysNotice>()
.eq(SysNotice::getNoticeTitle, approveProcessType(latestProcess.getApproveType()))
.eq(SysNotice::getSenderId, latestProcess.getApproveUser())
.apply("CAST(notice_content AS CHAR) LIKE CONCAT('%', {0}, '%')", latestProcess.getApproveId()));
}
-
}
@Override
@@ -272,7 +286,7 @@
// 鍒犻櫎瀵瑰簲鐨勯檮浠�
commonFileService.deleteByBusinessId(approveProcess.getId(), FileNameType.ApproveProcess.getValue());
// 鍒犻櫎瀹℃壒鑺傜偣
- approveNodeService.delApproveNodeByApproveId(approveId.toString());
+ approveNodeService.delApproveNodeByApproveId(approveId);
// 鍙煡鏈�鏂颁竴鏉″鎵规祦绋�
ApproveProcess latestProcess = approveProcessMapper.selectOne(
@@ -302,6 +316,7 @@
one.setCommonFileList(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
.eq(CommonFile::getCommonId, one.getId())
.eq(CommonFile::getType, FileNameType.ApproveProcess.getValue())));
+ fillDepartmentArrays(Arrays.asList(one));
return one;
}
@@ -373,10 +388,24 @@
if (sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
approve.setApproveUserName(sysUser.getNickName());
approve.setApproveUser(sysUser.getUserId());
+ approve.setApproveTitle(approveGetAndUpdateVo.getApproveTitle());
//瀹℃牳涓笉鍙互缂栬緫瀹℃牳浜�
if (approve.getApproveStatus() != 1) {
approve.setApproveUserCurrentId(Long.parseLong(split[0]));
+
approve.setApproveUserCurrentName(sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[0]))).collect(Collectors.toList()).get(0).getNickName());
+ }
+ if (approveGetAndUpdateVo.getApproveDeptIdArray() != null || approveGetAndUpdateVo.getApproveDeptId() != null) {
+ if (approve.getApproveStatus() == 1) throw new RuntimeException("瀹℃牳涓笉鍙互淇敼瀹℃壒閮ㄩ棬");
+ List<Long> deptIds = normalizeDeptIds(approveGetAndUpdateVo.getApproveDeptIdArray(), approveGetAndUpdateVo.getApproveDeptId());
+ List<SysDept> departments = sysDeptMapper.selectBatchIds(deptIds);
+ Map<Long, SysDept> deptMap = departments.stream().collect(Collectors.toMap(SysDept::getDeptId, dept -> dept));
+ if (deptMap.size() != deptIds.size()) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
+ approve.setApproveDeptId(deptIds.get(0));
+ approve.setApproveDeptName(deptIds.stream().map(deptMap::get).map(SysDept::getDeptName).collect(Collectors.joining(",")));
+ approve.setTenantId(deptIds.get(0));
+ approveProcessDeptMapper.delete(Wrappers.<ApproveProcessDept>lambdaUpdate().eq(ApproveProcessDept::getApproveProcessId, approve.getId()));
+ saveProcessDepartments(approve.getId(), deptIds, deptMap);
}
updateById(approve);
//淇敼瀹℃壒浜�
@@ -423,6 +452,45 @@
}
+ private List<Long> normalizeDeptIds(List<Long> deptIds, Long deptId) {
+ List<Long> ids = deptIds == null || deptIds.isEmpty() ? (deptId == null ? new ArrayList<>() : Arrays.asList(deptId)) : deptIds;
+ if (ids.isEmpty()) throw new RuntimeException("璇烽�夋嫨瀹℃壒閮ㄩ棬");
+ Set<Long> uniqueIds = new LinkedHashSet<>(ids);
+ if (uniqueIds.size() != ids.size() || uniqueIds.stream().anyMatch(id -> id == null || id <= 0)) {
+ throw new RuntimeException("瀹℃壒閮ㄩ棬鍙傛暟涓嶆纭�");
+ }
+ return new ArrayList<>(uniqueIds);
+ }
+
+ private void saveProcessDepartments(Long processId, List<Long> deptIds, Map<Long, SysDept> deptMap) {
+ for (int i = 0; i < deptIds.size(); i++) {
+ ApproveProcessDept processDept = new ApproveProcessDept();
+ processDept.setApproveProcessId(processId);
+ processDept.setApproveDeptId(deptIds.get(i));
+ processDept.setApproveDeptName(deptMap.get(deptIds.get(i)).getDeptName());
+ processDept.setDeptOrder(i + 1);
+ processDept.setDeleteFlag(0);
+ processDept.setCreateTime(LocalDateTime.now());
+ approveProcessDeptMapper.insert(processDept);
+ }
+ }
+
+ private void fillDepartmentArrays(List<ApproveProcess> processes) {
+ for (ApproveProcess process : processes) {
+ List<ApproveProcessDept> departments = approveProcessDeptMapper.selectList(Wrappers.<ApproveProcessDept>lambdaQuery()
+ .eq(ApproveProcessDept::getApproveProcessId, process.getId())
+ .eq(ApproveProcessDept::getDeleteFlag, 0)
+ .orderByAsc(ApproveProcessDept::getDeptOrder));
+ if (departments.isEmpty()) {
+ process.setApproveDeptIdArray(process.getApproveDeptId() == null ? new ArrayList<>() : Arrays.asList(process.getApproveDeptId()));
+ process.setApproveDeptNameArray(process.getApproveDeptName() == null ? new ArrayList<>() : Arrays.asList(process.getApproveDeptName()));
+ } else {
+ process.setApproveDeptIdArray(departments.stream().map(ApproveProcessDept::getApproveDeptId).collect(Collectors.toList()));
+ process.setApproveDeptNameArray(departments.stream().map(ApproveProcessDept::getApproveDeptName).collect(Collectors.toList()));
+ }
+ }
+ }
+
//瀹℃壒绫诲瀷鑾峰彇(涓庡墠绔〉闈㈠搴�)
private String approveProcessType(Integer approveType) {
switch (approveType) {
@@ -442,6 +510,10 @@
return "鍙戣揣瀹℃壒";
case 8:
return "鍗遍櫓浣滀笟瀹℃壒";
+ case 9:
+ return "閿�鍞鎵�";
+ case 10:
+ return "鑷敱鍗忓悓瀹℃壒";
}
return null;
}
--
Gitblit v1.9.3