src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
@@ -15,11 +15,11 @@ /** * 流程状态详情 * @param id 流程审批id approve_id * @param id 流程审批编号 approve_id * @return */ @GetMapping("/details") public AjaxResult details(@PathVariable String id) { @GetMapping("/details/{id}") public AjaxResult details(@PathVariable("id") String id) { return AjaxResult.success(approveNodeService.details(id)); } @@ -34,15 +34,6 @@ return AjaxResult.success(); } /** * 初始化审批节点 * @param id * @return */ @PostMapping("/init") public AjaxResult init(String id) { approveNodeService.initApproveNodes(id); return AjaxResult.success(); } } src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -91,8 +91,8 @@ * @return */ @GetMapping("/list") public AjaxResult list(Page page) { return AjaxResult.success(approveProcessService.listAll(page)); public AjaxResult list(Page page,String id) { return AjaxResult.success(approveProcessService.listAll(page,id)); } /** @@ -100,7 +100,7 @@ * @param ids * @return */ @RequestMapping ("/deleteIds") @DeleteMapping("/deleteIds") public AjaxResult deleteIds(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.warn("参数不能为空"); src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java
@@ -13,6 +13,7 @@ @Mapper public interface ApproveProcessMapper extends BaseMapper<ApproveProcess> { void updateApproveDeptId(ApproveProcess approveProcess); } src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
@@ -69,7 +69,7 @@ private String approveNodeReason; /** * 审批节点备注 * 审批节点备注 (是否到当前节点:0否,1是(默认0)) */ private String approveNodeRemark; src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -31,6 +31,11 @@ private Long approveUser; /** * 当前申请人姓名 */ private String approveUserName; /** * 申请部门id */ private Long approveDeptId; src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
@@ -8,7 +8,11 @@ public interface IApproveNodeService extends IService<ApproveNode> { void initApproveNodes(String id); /** * 初始化 * @param id 流程编号 */ void initApproveNodes(String id,int delFlag); /** * 详情 * @param id src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
@@ -24,12 +24,17 @@ */ List<SysDept> selectDeptListByDeptIds(Long[] deptIds); IPage<ApproveProcess> listAll(Page page); IPage<ApproveProcess> listAll(Page page,String id); void delApprove(Long[] ids); void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo); /** * 根据流程编号进行查找 * @param id * @return */ ApproveProcess getApproveById(String id); /** src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -30,13 +30,14 @@ @Override public void initApproveNodes(String id) { public void initApproveNodes(String id,int deleteFlag) { //租户id Long tenantId = SecurityUtils.getLoginUser().getTenantId(); ApproveProcess approve = approveProcessService.getApproveById(id); String[] names = approve.getApproveUserNames().split(","); Long approveId = approve.getId(); for (int i = 0; i < names.length; i++) { ApproveNode approveNode = new ApproveNode(); approveNode.setApproveProcessId(approveId); @@ -45,7 +46,12 @@ approveNode.setApproveNodeTime(new Date()); approveNode.setApproveNodeStatus(0); approveNode.setTenantId(tenantId); approveNode.setDeleteFlag(0); approveNode.setDeleteFlag(deleteFlag); approveNode.setApproveNodeReason(null); approveNode.setApproveNodeRemark("0"); if(i==0){ approveNode.setApproveNodeRemark("1"); } approveNodeMapper.insert(approveNode); } } @@ -57,6 +63,8 @@ LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveNode::getApproveProcessId, approveId); queryWrapper.eq(ApproveNode::getDeleteFlag, 0); List<ApproveNode> list = list(queryWrapper); // 按照 approveNodeOrder 字段升序排序 list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder)); @@ -73,21 +81,58 @@ ApproveProcess approveProcess = approveProcessService.getBaseMapper().selectById(approveProcessId); approveProcess.setApproveOverTime(new Date()); approveProcess.setApproveStatus(3); //设置当前审批人为第一个 approveProcess.setApproveUserCurrentId(Long.valueOf(approveProcess.getApproveUserIds().split(",")[0])); approveProcess.setApproveUserCurrentName(approveProcess.getApproveUserNames().split(",")[0]); approveProcessService.saveOrUpdate(approveProcess); //审批节点状态改变 initApproveNodes(approveProcess.getApproveId()); updateApproveNodes(approveProcess.getApproveId(),1); initApproveNodes(approveProcess.getApproveId(),0); return; } //更新审批流程 //更新审批流程 当前审批人修改 approveProcessService.updateApproveProcessStatus(approveNode); //审批流程当前审批人修改 //审批流程 节点状态改变 ApproveNode node = getById(approveNode.getId()); node.setApproveNodeRemark("0"); node.setApproveNodeTime(new Date()); node.setApproveNodeReason(approveNode.getApproveNodeReason()); node.setApproveNodeStatus(approveNode.getApproveNodeStatus()); approveNodeMapper.updateById(node); //下一个节点状态改变 ApproveNode node1 = approveNodeMapper.selectById(approveNode.getId()); Long approveProcessId = node1.getApproveProcessId(); ApproveProcess approveProcess = approveProcessService.getBaseMapper().selectById(approveProcessId); int length = approveProcess.getApproveUserIds().split(",").length; //此时是最后一个节点了 if (length==node.getApproveNodeOrder()){ return; } LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveNode::getApproveNodeOrder, node.getApproveNodeOrder()+1); queryWrapper.eq(ApproveNode::getApproveProcessId, node.getApproveProcessId()); queryWrapper.eq(ApproveNode::getDeleteFlag, 0); ApproveNode nextNode = getOne(queryWrapper); nextNode.setApproveNodeRemark("1"); approveNodeMapper.updateById(nextNode); } private void updateApproveNodes(String id, int delFlag) { ApproveProcess approve = approveProcessService.getApproveById(id); Long approveId = approve.getId(); LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveNode::getApproveProcessId, approveId); List<ApproveNode> list = list(queryWrapper); for (ApproveNode approveNode : list) { approveNode.setDeleteFlag(delFlag); approveNodeMapper.updateById(approveNode); } } } src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -13,7 +13,9 @@ import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveNodeVo; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysDeptMapper; @@ -27,10 +29,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.*; @Service @RequiredArgsConstructor @@ -46,11 +45,14 @@ private final SysUserMapper sysUserMapper; private final ApproveProcessMapper approveProcessMapper; @Override public void addApprove(ApproveProcessVO approveProcessVO) { Long userId = SecurityUtils.getUserId(); String nickName = SecurityUtils.getLoginUser().getNickName(); //租户id Long tenantId = SecurityUtils.getLoginUser().getTenantId(); String deptName = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId()).getDeptName(); String today = LocalDate.now().format(DATE_FORMAT); Long approveId = dailyRedisCounter.incrementAndGet("approveId"); @@ -59,17 +61,18 @@ String approveID = today + formattedCount; //审批人姓名处理 String approverIds = approveProcessVO.getApproverIds(); String approverIds = approveProcessVO.getApproveUserIds(); String[] idArray = approverIds.split(","); String approverNames = getApproverNames(approveProcessVO.getApproverIds()); String[] namdArray = approverIds.split(","); String approverNames = getApproverNames(approveProcessVO.getApproveUserIds()); String[] namdArray = approverNames.split(","); ApproveProcess approveProcess = new ApproveProcess(); approveProcess.setApproveId(approveID); approveProcess.setApproveUser(userId); approveProcess.setApproveUserName(nickName); approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId()); // approveProcess.setApproveDeptName(approveProcessVO.getDeptName()); approveProcess.setApproveUserIds(approveProcessVO.getApproverIds()); approveProcess.setApproveDeptName(deptName); approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds()); approveProcess.setApproveUserNames(approverNames); approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[0])); approveProcess.setApproveUserCurrentName(namdArray[0]); @@ -82,7 +85,7 @@ save(approveProcess); //初始化审批节点 approveNodeService.initApproveNodes(approveID); approveNodeService.initApproveNodes(approveID,0); } private String getApproverNames(String approverIds) { @@ -91,13 +94,14 @@ Integer[] ids = Arrays.stream(idArray) .map(Integer::parseInt) .toArray(Integer[]::new); String names = ""; StringBuilder stringBuilder = new StringBuilder(); List<String> names = new ArrayList<String>(); for (Integer id : ids) { SysUser sysUser = sysUserMapper.selectUserById(id.longValue()); names = stringBuilder + "," + sysUser.getUserName(); names.add(sysUser.getNickName()); } return names; return String.join(",", names); } @@ -112,9 +116,16 @@ } @Override public IPage<ApproveProcess> listAll(Page page) { public IPage<ApproveProcess> listAll(Page page,String id) { // 1. 处理空值场景(参数校验) if (page == null) { page = Page.of(1, 10); // 默认第1页,每页10条数据 } LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveProcess::getApproveDelete, 0); if (StringUtils.isNotBlank(id)) { queryWrapper.like(ApproveProcess::getApproveId, id); } return approveProcessMapper.selectPage(page, queryWrapper); } @@ -122,8 +133,10 @@ public void delApprove(Long[] ids) { for (Long id : ids) { LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveProcess::getApproveDelete, 1); update(queryWrapper); queryWrapper.eq(ApproveProcess::getApproveId, id); ApproveProcess process = getOne(queryWrapper); process.setApproveDelete(1); saveOrUpdate(process); } } @@ -143,9 +156,16 @@ String[] idArray = approveProcess.getApproveUserIds().split(","); String[] nameArray = approveProcess.getApproveUserNames().split(","); Integer noderOrder = approveNodeVo.getApproveNodeOrder(); approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[noderOrder])); approveProcess.setApproveUserCurrentName(nameArray[noderOrder]); //设置当前审批人 if (noderOrder ==idArray.length){ approveProcess.setApproveUserCurrentId(null); approveProcess.setApproveUserCurrentName(null); }else { approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[noderOrder])); approveProcess.setApproveUserCurrentName(nameArray[noderOrder]); } if(noderOrder.equals(1)){ if(approveNodeVo.getApproveNodeStatus() == 1){ @@ -155,12 +175,16 @@ if(noderOrder.equals(idArray.length)){ if(approveNodeVo.getApproveNodeStatus() == 1){ approveProcess.setApproveStatus(2); approveProcess.setApproveOverTime(new Date()); } } updateById(approveProcess); // updateById(approveProcess); approveProcessMapper.updateApproveDeptId(approveProcess); } @Override public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) { ApproveProcess approve = getApproveById(approveGetAndUpdateVo.getId()); src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
@@ -64,6 +64,7 @@ /** * 生成Redis键 * 格式 daily_counter:counterName:yyyyMMdd */ private String getKey(String counterName) { String today = LocalDate.now().format(DATE_FORMAT); src/main/java/com/ruoyi/approve/vo/ApproveNodeVo.java
@@ -16,4 +16,6 @@ */ private Integer approveNodeStatus; private String approveNodeReason; } src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -12,7 +12,7 @@ //部门名称 //private String deptName; //审批人 ids private String approverIds; private String approveUserIds; //审批人名称 //private String approverNames; //审批事由 src/main/resources/mapper/approve/ApproveProcessMapper.xml
@@ -27,4 +27,12 @@ approve_user_names,approve_reason,approve_time,approve_over_time,approve_status, approve_delete,tenant_id,approve_type,approve_remark </sql> <update id="updateApproveDeptId" parameterType="com.ruoyi.approve.pojo.ApproveProcess"> update approve_process set approve_user_current_id = #{approveUserCurrentId}, approve_user_current_name = #{approveUserCurrentName}, approve_status = #{approveStatus}, approve_over_time = #{approveOverTime} where id = #{id} </update> </mapper>