src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
@@ -2,6 +2,7 @@ import com.ruoyi.approve.pojo.ApproveNode; import com.ruoyi.approve.service.IApproveNodeService; import com.ruoyi.approve.vo.ApproveNodeVo; import com.ruoyi.framework.web.domain.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -23,12 +24,12 @@ } /** * 审æ¹èç¹ * æ´æ°å®¡æ¹èç¹ * @param approveNode * @return */ @PostMapping("/updateApproveNode") public AjaxResult updateApproveNode(@RequestBody ApproveNode approveNode) { public AjaxResult updateApproveNode(@RequestBody ApproveNodeVo approveNode) { approveNodeService.updateApproveNode(approveNode); return AjaxResult.success(); } src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -1,5 +1,6 @@ package com.ruoyi.approve.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveProcessVO; @@ -7,6 +8,10 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUserDept; import com.ruoyi.project.system.mapper.SysDeptMapper; import com.ruoyi.project.system.mapper.SysUserDeptMapper; import com.ruoyi.project.system.service.ISysUserDeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -25,6 +30,8 @@ @Autowired private IApproveProcessService approveProcessService; @Autowired private ISysUserDeptService sysUserDeptService; /**ã * è·åé¨é¨å表 * @return @@ -32,9 +39,8 @@ @GetMapping("/getDept") public AjaxResult getDept() { Long userId = SecurityUtils.getUserId(); LoginUser user = SecurityUtils.getLoginUser(); Long[] deptIds = SecurityUtils.getDeptId(); List<SysUserDept> userDeptList = sysUserDeptService.getUserDeptList(userId); Long[] deptIds = userDeptList.stream().map(SysUserDept::getDeptId).toArray(Long[]::new); List<SysDept> sysDeptList = approveProcessService.selectDeptListByDeptIds(deptIds); return AjaxResult.success(sysDeptList); } @@ -60,7 +66,7 @@ * @return */ @GetMapping("/get") public AjaxResult get(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo){ public AjaxResult get(ApproveGetAndUpdateVo approveGetAndUpdateVo){ if (approveGetAndUpdateVo.getId() == null || approveGetAndUpdateVo.getId().isEmpty()) { return AjaxResult.warn("åæ°ä¸è½ä¸ºç©º"); } @@ -81,12 +87,12 @@ return AjaxResult.success("æä½æå"); } /** * è·å审æ¹å表 * è·å审æ¹å表--å页æ¥è¯¢ * @return */ @GetMapping("/list") public AjaxResult list() { return AjaxResult.success(approveProcessService.listAll()); public AjaxResult list(Page page) { return AjaxResult.success(approveProcessService.listAll(page)); } /** @@ -94,7 +100,7 @@ * @param ids * @return */ @PostMapping("/deleteIds") @RequestMapping ("/deleteIds") public AjaxResult deleteIds(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.warn("åæ°ä¸è½ä¸ºç©º"); src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApproveNode; import org.apache.ibatis.annotations.Mapper; /** * @author Administrator @@ -9,6 +10,7 @@ * @createDate 2025-07-08 16:50:15 * @Entity com.ruoyi.approve.pojo.ApproveNode */ @Mapper public interface ApproveNodeMapper extends BaseMapper<ApproveNode> { } src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java
@@ -2,13 +2,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApproveProcess; import org.apache.ibatis.annotations.Mapper; /** * @author Administrator * @description é对表ãapprove_process(å®¡æ¹æµç¨è¡¨)ãçæ°æ®åºæä½Mapper * @createDate 2025-07-08 16:44:05 * @createDate 2025-07-09 13:52:01 * @Entity com.ruoyi.approve.pojo.ApproveProcess */ @Mapper public interface ApproveProcessMapper extends BaseMapper<ApproveProcess> { } src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
@@ -3,8 +3,7 @@ import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -13,10 +12,12 @@ * @TableName approve_node */ @Data @TableName(value ="approve_node") public class ApproveNode implements Serializable { /** * */ @TableId(type = IdType.AUTO) private Long id; /** src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -11,8 +11,8 @@ * å®¡æ¹æµç¨è¡¨ * @TableName approve_process */ @TableName(value ="approve_process") @Data @TableName("approve_process") public class ApproveProcess implements Serializable { /** * @@ -41,14 +41,24 @@ private String approveDeptName; /** * ç³è¯·ç¨æ·ids * 审æ¹ç¨æ·ids */ private String approveUserIds; /** * ç³è¯·ç¨æ·åç§° * 审æ¹ç¨æ·åç§° */ private String approveUserNames; /** * å½å审æ¹ç¨æ·id */ private Long approveUserCurrentId; /** * å½å审æ¹ç¨æ·åç§° */ private String approveUserCurrentName; /** * ç³è¯·åå @@ -68,7 +78,7 @@ private Date approveOverTime; /** * 审æ¹ç¶æï¼0å¾ å®¡æ ¸ï¼1å®¡æ ¸ä¸ï¼2å®¡æ ¸å®æ * 审æ¹ç¶æï¼0å¾ å®¡æ ¸ï¼1å®¡æ ¸ä¸ï¼2å®¡æ ¸å®æ 3å®¡æ ¸ä¸éè¿ */ private Integer approveStatus; @@ -93,6 +103,7 @@ */ private String approveRemark; @TableField(exist = false) private static final long serialVersionUID = 1L; src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.approve.pojo.ApproveNode; import com.ruoyi.approve.vo.ApproveNodeVo; import java.util.List; @@ -14,5 +15,5 @@ */ List<ApproveNode> details(String id); void updateApproveNode(ApproveNode approveNode); void updateApproveNode(ApproveNodeVo approveNode); } src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
@@ -1,9 +1,12 @@ package com.ruoyi.approve.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.approve.pojo.ApproveNode; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveNodeVo; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.project.system.domain.SysDept; @@ -21,7 +24,7 @@ */ List<SysDept> selectDeptListByDeptIds(Long[] deptIds); List<ApproveProcess> listAll(); IPage<ApproveProcess> listAll(Page page); void delApprove(Long[] ids); @@ -33,5 +36,5 @@ * 审æ¹ç¶ææ´æ° * @param approveNode */ void updateApproveProcessStatus(ApproveNode approveNode); void updateApproveProcessStatus(ApproveNodeVo approveNode); } src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -7,6 +7,7 @@ import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.IApproveNodeService; import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.approve.vo.ApproveNodeVo; import com.ruoyi.common.utils.SecurityUtils; import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; @@ -63,12 +64,30 @@ } @Override public void updateApproveNode(ApproveNode approveNode) { public void updateApproveNode(ApproveNodeVo approveNode) { //æä¸ªèç¹å®¡æ¹ä¸éè¿ if(approveNode.getApproveNodeStatus().intValue()==2){ //ä¿®æ¹å®¡æ¹æµç¨ ApproveNode node = approveNodeMapper.selectById(approveNode.getId()); Long approveProcessId = node.getApproveProcessId(); ApproveProcess approveProcess = approveProcessService.getBaseMapper().selectById(approveProcessId); approveProcess.setApproveOverTime(new Date()); approveProcess.setApproveStatus(3); approveProcessService.saveOrUpdate(approveProcess); //审æ¹èç¹ç¶ææ¹å initApproveNodes(approveProcess.getApproveId()); return; } //æ´æ°å®¡æ¹æµç¨ approveProcessService.updateApproveProcessStatus(approveNode); approveNode.setApproveNodeTime(new Date()); approveNodeMapper.updateById(approveNode); //å®¡æ¹æµç¨å½å审æ¹äººä¿®æ¹ ApproveNode node = getById(approveNode.getId()); node.setApproveNodeTime(new Date()); node.setApproveNodeStatus(approveNode.getApproveNodeStatus()); approveNodeMapper.updateById(node); } } src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -1,6 +1,8 @@ package com.ruoyi.approve.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.mapper.ApproveProcessMapper; import com.ruoyi.approve.pojo.ApproveNode; @@ -9,10 +11,13 @@ import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.approve.utils.DailyRedisCounter; import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.vo.ApproveNodeVo; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysDeptMapper; import com.ruoyi.project.system.mapper.SysUserMapper; import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; @@ -23,6 +28,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; @@ -37,6 +43,8 @@ private final SysDeptMapper sysDeptMapper; private final IApproveNodeService approveNodeService; private final SysUserMapper sysUserMapper; private final ApproveProcessMapper approveProcessMapper; @Override public void addApprove(ApproveProcessVO approveProcessVO) { @@ -50,11 +58,21 @@ //æµç¨ ID String approveID = today + formattedCount; //审æ¹äººå§åå¤ç String approverIds = approveProcessVO.getApproverIds(); String[] idArray = approverIds.split(","); String approverNames = getApproverNames(approveProcessVO.getApproverIds()); String[] namdArray = approverIds.split(","); ApproveProcess approveProcess = new ApproveProcess(); approveProcess.setApproveId(approveID); approveProcess.setApproveUser(userId); approveProcess.setApproveDeptName(approveProcessVO.getDeptName()); approveProcess.setApproveUserNames(approveProcessVO.getApproverNames()); approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId()); // approveProcess.setApproveDeptName(approveProcessVO.getDeptName()); approveProcess.setApproveUserIds(approveProcessVO.getApproverIds()); approveProcess.setApproveUserNames(approverNames); approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[0])); approveProcess.setApproveUserCurrentName(namdArray[0]); approveProcess.setApproveTime(new Date()); approveProcess.setApproveReason(approveProcessVO.getApproveReason()); approveProcess.setApproveOverTime(null); @@ -67,6 +85,22 @@ approveNodeService.initApproveNodes(approveID); } private String getApproverNames(String approverIds) { String[] idArray = approverIds.split(","); Integer[] ids = Arrays.stream(idArray) .map(Integer::parseInt) .toArray(Integer[]::new); String names = ""; StringBuilder stringBuilder = new StringBuilder(); for (Integer id : ids) { SysUser sysUser = sysUserMapper.selectUserById(id.longValue()); names = stringBuilder + "," + sysUser.getUserName(); } return names; } @Override public List<SysDept> selectDeptListByDeptIds(Long[] deptIds) { List<SysDept> sysDeptList =new ArrayList<SysDept>(); @@ -78,17 +112,17 @@ } @Override public List<ApproveProcess> listAll() { public IPage<ApproveProcess> listAll(Page page) { LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveProcess::getApproveDelete, 0); return list(queryWrapper); return approveProcessMapper.selectPage(page, queryWrapper); } @Override public void delApprove(Long[] ids) { for (Long id : ids) { LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ApproveProcess::getApproveId, id); queryWrapper.eq(ApproveProcess::getApproveDelete, 1); update(queryWrapper); } } @@ -102,18 +136,28 @@ } @Override public void updateApproveProcessStatus(ApproveNode approveNode) { ApproveProcess approveProcess = getById(approveNode.getApproveProcessId()); if(approveNode.getIsFirst()){ if(approveNode.getApproveNodeStatus() == 1){ public void updateApproveProcessStatus(ApproveNodeVo approveNodeVo) { ApproveNode node = approveNodeService.getById(approveNodeVo.getId()); ApproveProcess approveProcess = getById(node.getApproveProcessId()); 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.equals(1)){ if(approveNodeVo.getApproveNodeStatus() == 1){ approveProcess.setApproveStatus(1); } } if(approveNode.getIsLast()){ if(approveNode.getApproveNodeStatus() == 1){ if(noderOrder.equals(idArray.length)){ if(approveNodeVo.getApproveNodeStatus() == 1){ approveProcess.setApproveStatus(2); } } updateById(approveProcess); } src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
@@ -31,10 +31,10 @@ long count = redisTemplate.opsForValue().increment(key, 1); // ä» å¨ç¬¬ä¸æ¬¡è®¾ç½®æ¶è®¾ç½®è¿ææ¶é´ï¼é¿å éå¤è®¾ç½®ï¼ if (count == 1) { long secondsUntilMidnight = calculateSecondsUntilMidnight(); redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS); } // if (count == 0) { // long secondsUntilMidnight = calculateSecondsUntilMidnight(); // redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS); // } return count; } src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
@@ -7,9 +7,8 @@ @Data public class ApproveGetAndUpdateVo { //审æ¹id @NotBlank(message = "æµç¨ç¼å·ä¸è½ä¸ºç©º") // @NotBlank(message = "æµç¨ç¼å·ä¸è½ä¸ºç©º") private String id; //ç³è¯·äºç± @NotBlank(message = "ç³è¯·äºç±ä¸è½ä¸ºç©º") private String approveReason; } src/main/java/com/ruoyi/approve/vo/ApproveNodeVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.approve.vo; import lombok.Data; import javax.validation.constraints.NotNull; @Data public class ApproveNodeVo { @NotNull //æµç¨èç¹id private Long id; //æµç¨èç¹é¡ºåº private Integer approveNodeOrder; /** * 审æ¹èç¹ç¶æ:1åæï¼2æç»ï¼0å°æªå®¡æ ¸ï¼é»è®¤ä¸º0ï¼ */ private Integer approveNodeStatus; } src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -8,16 +8,13 @@ public class ApproveProcessVO { //é¨é¨id // private Long deptId; private Long approveDeptId; //é¨é¨åç§° @NotBlank(message = "é¨é¨åç§°ä¸è½ä¸ºç©º") private String deptName; //private String deptName; //审æ¹äºº ids // private String approverIds; private String approverIds; //审æ¹äººåç§° @NotBlank(message = "审æ¹äººä¸è½ä¸ºç©º") private String approverNames; //private String approverNames; //审æ¹äºç± @NotBlank(message = "11") private String approveReason; } src/main/java/com/ruoyi/framework/security/service/TokenService.java
@@ -148,6 +148,7 @@ public void refreshToken(LoginUser loginUser) { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); // æ ¹æ®uuidå°loginUserç¼å String userKey = getTokenKey(loginUser.getToken()); src/main/java/com/ruoyi/project/system/service/ISysUserDeptService.java
@@ -1,5 +1,6 @@ package com.ruoyi.project.system.service; import com.ruoyi.project.system.domain.SysUserDept; import com.ruoyi.project.system.domain.vo.SysUserDeptVo; import java.util.List; @@ -7,4 +8,6 @@ public interface ISysUserDeptService { List<SysUserDeptVo> userLoginFacotryList(SysUserDeptVo userDeptVo); List<SysUserDept> getUserDeptList(Long userId); } src/main/java/com/ruoyi/project/system/service/impl/SysUserDeptServiceImpl.java
@@ -1,11 +1,14 @@ package com.ruoyi.project.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.project.system.domain.SysUserDept; import com.ruoyi.project.system.domain.vo.SysUserDeptVo; import com.ruoyi.project.system.mapper.SysUserDeptMapper; import com.ruoyi.project.system.service.ISysUserDeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; @Service @@ -18,4 +21,11 @@ public List<SysUserDeptVo> userLoginFacotryList(SysUserDeptVo userDeptVo) { return sysUserDeptMapper.userLoginFacotryList(userDeptVo); } @Override public List<SysUserDept> getUserDeptList(Long userId) { LambdaQueryWrapper<SysUserDept> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysUserDept::getUserId, userId); return sysUserDeptMapper.selectList(queryWrapper); } } src/main/resources/application.yml
@@ -81,9 +81,9 @@ # 端å£ï¼é»è®¤ä¸º6379 port: 6379 # æ°æ®åºç´¢å¼ database: 0 database: 1 # å¯ç password: # password: # password: 123456 # è¿æ¥è¶ æ¶æ¶é´