青城
4 天以前 6437bdc301a3738b3e6f3be9913a41a45d9f96d9
协调审批
已修改1个文件
已添加18个文件
886 ■■■■■ 文件已修改
src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveLog.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveNode.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/IApproveNodeService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/ApproveLogMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/ApproveNodeMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/ApproveProcessMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.ruoyi.approve.controller;
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/approveNode")
public class ApproveNodeController {
    @Autowired
    private IApproveNodeService approveNodeService;
    /**
     * æµç¨‹çŠ¶æ€è¯¦æƒ…
     * @param id æµç¨‹å®¡æ‰¹id approve_id
     * @return
     */
    @GetMapping("/details")
    public AjaxResult details(@PathVariable String id) {
        return AjaxResult.success(approveNodeService.details(id));
    }
    /**
     * å®¡æ‰¹èŠ‚ç‚¹
     * @param approveNode
     * @return
     */
    @PostMapping("/updateApproveNode")
    public AjaxResult updateApproveNode(@RequestBody ApproveNode approveNode) {
        approveNodeService.updateApproveNode(approveNode);
        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
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.ruoyi.approve.controller;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysDept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/approveProcess")
public class ApproveProcessController {
    @GetMapping("/test")
    public AjaxResult test() {
        System.out.println(1111);
        return AjaxResult.success("测试");
    }
    @Autowired
    private IApproveProcessService approveProcessService;
    /**、
     * èŽ·å–éƒ¨é—¨åˆ—è¡¨
     * @return
     */
    @GetMapping("/getDept")
    public AjaxResult getDept() {
        Long userId = SecurityUtils.getUserId();
        LoginUser user = SecurityUtils.getLoginUser();
        Long[] deptIds = SecurityUtils.getDeptId();
        List<SysDept> sysDeptList = approveProcessService.selectDeptListByDeptIds(deptIds);
        return AjaxResult.success(sysDeptList);
    }
    /**
     * æ·»åŠ å®¡æ‰¹
     * @param approveProcessVO
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody ApproveProcessVO approveProcessVO) {
        if (approveProcessVO == null) {
            return AjaxResult.warn("参数不能为空");
        }
        approveProcessService.addApprove(approveProcessVO);
        return AjaxResult.success("添加成功");
    }
    /**
     * å®¡æ‰¹è¯¦æƒ…
     * @param approveGetAndUpdateVo
     * @return
     */
    @GetMapping("/get")
    public AjaxResult get(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo){
        if (approveGetAndUpdateVo.getId() == null || approveGetAndUpdateVo.getId().isEmpty()) {
            return AjaxResult.warn("参数不能为空");
        }
        return AjaxResult.success(approveProcessService.getApproveById(approveGetAndUpdateVo.getId()));
    }
    /**
     * æ›´æ–°å®¡æ‰¹
     * @param approveGetAndUpdateVo
     * @return
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo) {
        if (approveGetAndUpdateVo == null) {
            return AjaxResult.warn("参数不能为空");
        }
        approveProcessService.updateByApproveId(approveGetAndUpdateVo);
        return AjaxResult.success("操作成功");
    }
    /**
     * èŽ·å–å®¡æ‰¹åˆ—è¡¨
     * @return
     */
    @GetMapping("/list")
    public AjaxResult list() {
        return AjaxResult.success(approveProcessService.listAll());
    }
    /**
     * åˆ é™¤å®¡æ‰¹
     * @param ids
     * @return
     */
    @PostMapping("/deleteIds")
    public AjaxResult deleteIds(@RequestBody Long[] ids) {
        if (ids == null || ids.length == 0) {
            return AjaxResult.warn("参数不能为空");
        }
        approveProcessService.delApprove(ids);
        return AjaxResult.success("操作成功");
    }
}
src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.approve.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.approve.pojo.ApproveLog;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€approve_log(审批日志表)】的数据库操作Mapper
* @createDate 2025-07-07 14:47:01
* @Entity com.ruoyi.approve.pojo.ApproveLog
*/
@Mapper
public interface ApproveLogMapper extends BaseMapper<ApproveLog> {
}
src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.approve.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.approve.pojo.ApproveNode;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€approve_node(审批节点表)】的数据库操作Mapper
* @createDate 2025-07-08 16:50:15
* @Entity com.ruoyi.approve.pojo.ApproveNode
*/
public interface ApproveNodeMapper extends BaseMapper<ApproveNode> {
}
src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.approve.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.approve.pojo.ApproveProcess;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€approve_process(审批流程表)】的数据库操作Mapper
* @createDate 2025-07-08 16:44:05
* @Entity com.ruoyi.approve.pojo.ApproveProcess
*/
public interface ApproveProcessMapper extends BaseMapper<ApproveProcess> {
}
src/main/java/com/ruoyi/approve/pojo/ApproveLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * å®¡æ‰¹æ—¥å¿—表
 * @TableName approve_log
 */
@Data
@TableName("approve_log")
public class ApproveLog implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * å®¡æ‰¹id
     */
    private Long approveId;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹é¡ºåº
     */
    private Integer approveNodeOrder;
    /**
     * å®¡æ‰¹äººid
     */
    private Long approveUser;
    /**
     * å®¡æ‰¹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date approveTime;
    /**
     * å®¡æ‰¹çŠ¶æ€
     */
    private Integer approveStatus;
    /**
     * å®¡æ‰¹å¤‡æ³¨
     */
    private String approveRemark;
}
src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.ruoyi.approve.pojo;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
/**
 * å®¡æ‰¹èŠ‚ç‚¹è¡¨
 * @TableName approve_node
 */
@Data
public class ApproveNode implements Serializable {
    /**
     *
     */
    private Long id;
    /**
     * å®¡æ‰¹id
     */
    private Long approveProcessId;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹é¡ºåº
     */
    private Integer approveNodeOrder;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹ç”¨æˆ·åå­—
     */
    private String approveNodeUser;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date approveNodeTime;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹çŠ¶æ€:1同意,2拒绝,0尚未审核(默认为0)
     */
    private Integer approveNodeStatus;
    @TableField(exist = false)
    private Boolean isFirst;
    @TableField(exist = false)
    private Boolean isLast;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * åˆ é™¤æ ‡è®°:0正常,1删除
     */
    private Integer deleteFlag;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹æ‹’ç»åŽŸå› 
     */
    private String approveNodeReason;
    /**
     * å®¡æ‰¹èŠ‚ç‚¹å¤‡æ³¨
     */
    private String approveNodeRemark;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.ruoyi.approve.pojo;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
/**
 * å®¡æ‰¹æµç¨‹è¡¨
 * @TableName approve_process
 */
@Data
@TableName("approve_process")
public class ApproveProcess implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * å®¡æ‰¹id
     */
    private String approveId;
    /**
     * ç”³è¯·äººid
     */
    private Long approveUser;
    /**
     * ç”³è¯·éƒ¨é—¨id
     */
    private Long approveDeptId;
    /**
     * ç”³è¯·éƒ¨é—¨åç§°
     */
    private String approveDeptName;
    /**
     * ç”³è¯·ç”¨æˆ·ids
     */
    private String approveUserIds;
    /**
     * ç”³è¯·ç”¨æˆ·åç§°
     */
    private String approveUserNames;
    /**
     * ç”³è¯·åŽŸå› 
     */
    private String approveReason;
    /**
     * ç”³è¯·æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date approveTime;
    /**
     * å®¡æ‰¹å®Œæˆæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date approveOverTime;
    /**
     * å®¡æ‰¹çŠ¶æ€ï¼š0待审核,1审核中,2审核完成
     */
    private Integer approveStatus;
    /**
     * å®¡æ‰¹æ˜¯å¦åˆ é™¤ï¼š0正常,1删除
     */
    private Integer approveDelete;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * å®¡æ‰¹ç±»åž‹
     */
    private Integer approveType;
    /**
     * å®¡æ‰¹å¤‡æ³¨
     */
    private String approveRemark;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.approve.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.approve.pojo.ApproveNode;
import java.util.List;
public interface IApproveNodeService extends IService<ApproveNode> {
    void initApproveNodes(String id);
    /**
     * è¯¦æƒ…
     * @param id
     */
    List<ApproveNode> details(String id);
    void updateApproveNode(ApproveNode approveNode);
}
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.approve.service;
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.ApproveProcessVO;
import com.ruoyi.project.system.domain.SysDept;
import java.util.List;
public interface IApproveProcessService extends IService<ApproveProcess> {
    /**
     * æ·»åŠ å®¡æ‰¹æµç¨‹
     * @param approveProcessVO å®¡æ‰¹æµç¨‹VO对象
     */
    void addApprove(ApproveProcessVO approveProcessVO);
    /**
     * æ ¹æ®éƒ¨é—¨id查询部门信息
     * @param deptIds éƒ¨é—¨ID数组
     */
    List<SysDept> selectDeptListByDeptIds(Long[] deptIds);
    List<ApproveProcess> listAll();
    void delApprove(Long[] ids);
    void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo);
    ApproveProcess getApproveById(String id);
    /**
     * å®¡æ‰¹çŠ¶æ€æ›´æ–°
     * @param approveNode
     */
    void updateApproveProcessStatus(ApproveNode approveNode);
}
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.approve.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.mapper.ApproveNodeMapper;
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
@Service
@RequiredArgsConstructor
public class ApproveNodeServiceImpl extends ServiceImpl<ApproveNodeMapper, ApproveNode> implements IApproveNodeService {
    @Autowired
    private  ApproveNodeMapper approveNodeMapper;
    @Autowired
    private  IApproveProcessService approveProcessService;
    @Override
    public void initApproveNodes(String id) {
        //租户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);
            approveNode.setApproveNodeOrder(i +1);
            approveNode.setApproveNodeUser(names[i]);
            approveNode.setApproveNodeTime(new Date());
            approveNode.setApproveNodeStatus(0);
            approveNode.setTenantId(tenantId);
            approveNode.setDeleteFlag(0);
            approveNodeMapper.insert(approveNode);
        }
    }
    @Override
    public List<ApproveNode> details(String id) {
        ApproveProcess approve = approveProcessService.getApproveById(id);
        Long approveId = approve.getId();
        LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ApproveNode::getApproveProcessId, approveId);
        List<ApproveNode> list = list(queryWrapper);
        // æŒ‰ç…§ approveNodeOrder å­—段升序排序
        list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder));
        return list;
    }
    @Override
    public void updateApproveNode(ApproveNode approveNode) {
         approveProcessService.updateApproveProcessStatus(approveNode);
        approveNode.setApproveNodeTime(new Date());
        approveNodeMapper.updateById(approveNode);
    }
}
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
package com.ruoyi.approve.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.utils.DailyRedisCounter;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Service
@RequiredArgsConstructor
public class ApproveProcessServiceImpl extends ServiceImpl<ApproveProcessMapper, ApproveProcess> implements IApproveProcessService {
    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd");
    private final StringRedisTemplate redisTemplate;
    private final DailyRedisCounter dailyRedisCounter;
    private final SysDeptMapper sysDeptMapper;
    private final IApproveNodeService approveNodeService;
    @Override
    public void addApprove(ApproveProcessVO approveProcessVO) {
        Long userId = SecurityUtils.getUserId();
        //租户id
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        String today = LocalDate.now().format(DATE_FORMAT);
        Long approveId = dailyRedisCounter.incrementAndGet("approveId");
        String formattedCount = String.format("%03d", approveId);
        //流程 ID
        String approveID = today + formattedCount;
        ApproveProcess approveProcess = new ApproveProcess();
        approveProcess.setApproveId(approveID);
        approveProcess.setApproveUser(userId);
        approveProcess.setApproveDeptName(approveProcessVO.getDeptName());
        approveProcess.setApproveUserNames(approveProcessVO.getApproverNames());
        approveProcess.setApproveTime(new Date());
        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
        approveProcess.setApproveOverTime(null);
        approveProcess.setApproveStatus(0);
        approveProcess.setApproveDelete(0);
        approveProcess.setTenantId(tenantId);
        save(approveProcess);
        //初始化审批节点
        approveNodeService.initApproveNodes(approveID);
    }
    @Override
    public List<SysDept> selectDeptListByDeptIds(Long[] deptIds) {
        List<SysDept> sysDeptList =new ArrayList<SysDept>();
        for (Long deptId : deptIds) {
            SysDept sysDept = sysDeptMapper.selectDeptById(deptId);
            sysDeptList.add(sysDept);
        }
        return sysDeptList;
    }
    @Override
    public List<ApproveProcess> listAll() {
        LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ApproveProcess::getApproveDelete, 0);
        return list(queryWrapper);
    }
    @Override
    public void delApprove(Long[] ids) {
        for (Long id : ids) {
            LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(ApproveProcess::getApproveId, id);
            update(queryWrapper);
        }
    }
    @Override
    public ApproveProcess getApproveById(String id) {
        LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ApproveProcess::getApproveId, id);
        queryWrapper.eq(ApproveProcess::getApproveDelete, 0);
        return getOne(queryWrapper);
    }
    @Override
    public void updateApproveProcessStatus(ApproveNode approveNode) {
        ApproveProcess approveProcess = getById(approveNode.getApproveProcessId());
        if(approveNode.getIsFirst()){
            if(approveNode.getApproveNodeStatus() == 1){
                approveProcess.setApproveStatus(1);
            }
        }
        if(approveNode.getIsLast()){
            if(approveNode.getApproveNodeStatus() == 1){
                approveProcess.setApproveStatus(2);
            }
        }
    }
    @Override
    public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) {
        ApproveProcess approve = getApproveById(approveGetAndUpdateVo.getId());
        approve.setApproveReason(approveGetAndUpdateVo.getApproveReason());
        updateById(approve);
    }
}
src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.approve.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;
//基于redis的一个每日计数器
@Component
public class DailyRedisCounter {
    private static final String KEY_PREFIX = "daily_counter:";
    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd");
    private final StringRedisTemplate redisTemplate;
    public DailyRedisCounter(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    /**
     * èŽ·å–æŒ‡å®šè®¡æ•°å™¨åœ¨ä»Šæ—¥çš„æ•°å€¼ï¼Œå¹¶è‡ªå¢ž1
     * @param counterName è®¡æ•°å™¨åç§°ï¼ˆä¾‹å¦‚:login_count、order_count)
     * @return ä»Šæ—¥è‡ªå¢žåŽçš„计数值
     */
    public long incrementAndGet(String counterName) {
        String key = getKey(counterName);
        long count = redisTemplate.opsForValue().increment(key, 1);
        // ä»…在第一次设置时设置过期时间(避免重复设置)
        if (count == 1) {
            long secondsUntilMidnight = calculateSecondsUntilMidnight();
            redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS);
        }
        return count;
    }
    /**
     * èŽ·å–æŒ‡å®šè®¡æ•°å™¨åœ¨ä»Šæ—¥çš„å½“å‰æ•°å€¼
     * @param counterName è®¡æ•°å™¨åç§°
     * @return ä»Šæ—¥å½“前计数值,若不存在则返回0
     */
    public long getCurrentCount(String counterName) {
        String key = getKey(counterName);
        String value = redisTemplate.opsForValue().get(key);
        return value != null ? Long.parseLong(value) : 0;
    }
    /**
     * è®¡ç®—距离次日凌晨的秒数
     */
    private long calculateSecondsUntilMidnight() {
        LocalDate tomorrow = LocalDate.now().plusDays(1);
        LocalDate midnight = tomorrow.atStartOfDay().toLocalDate();
        return java.time.Duration.between(
                LocalDate.now().atTime(23, 59, 59),
                midnight.atTime(0, 0, 0)
        ).getSeconds() + 1;
    }
    /**
     * ç”ŸæˆRedis键
     */
    private String getKey(String counterName) {
        String today = LocalDate.now().format(DATE_FORMAT);
        return KEY_PREFIX + counterName + ":" + today;
    }
}
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.approve.vo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApproveGetAndUpdateVo {
    //审批id
    @NotBlank(message = "流程编号不能为空")
    private String id;
    //申请事由
    @NotBlank(message = "申请事由不能为空")
    private String approveReason;
}
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.approve.vo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApproveProcessVO {
    //部门id
  //  private Long deptId;
    //部门名称
    @NotBlank(message = "部门名称不能为空")
    private String deptName;
    //审批人 ids
 //   private String approverIds;
    //审批人名称
    @NotBlank(message = "审批人不能为空")
    private String approverNames;
    //审批事由
    @NotBlank(message = "11")
    private String approveReason;
}
src/main/resources/application.yml
@@ -83,7 +83,7 @@
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password:
    password: root2022!
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
src/main/resources/mapper/approve/ApproveLogMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.approve.mapper.ApproveLogMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApproveLog">
            <id property="id" column="id" />
            <result property="approveId" column="approve_id" />
            <result property="approveNodeOrder" column="approve_node_order" />
            <result property="approveUser" column="approve_user" />
            <result property="approveTime" column="approve_time" />
            <result property="approveStatus" column="approve_status" />
            <result property="approveRemark" column="approve_remark" />
    </resultMap>
    <sql id="Base_Column_List">
        id,approve_id,approve_node_order,approve_user,approve_time,approve_status,
        approve_remark
    </sql>
</mapper>
src/main/resources/mapper/approve/ApproveNodeMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.approve.mapper.ApproveNodeMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApproveNode">
            <id property="id" column="id" />
            <result property="approveProcessId" column="approve_process_id" />
            <result property="approveNodeOrder" column="approve_node_order" />
            <result property="approveNodeUser" column="approve_node_user" />
            <result property="approveNodeTime" column="approve_node_time" />
            <result property="approveNodeStatus" column="approve_node_status" />
            <result property="tenantId" column="tenant_id" />
            <result property="deleteFlag" column="delete_flag" />
            <result property="approveNodeReason" column="approve_node_reason" />
            <result property="approveNodeRemark" column="approve_node_remark" />
    </resultMap>
    <sql id="Base_Column_List">
        id,approve_process_id,approve_node_order,approve_node_user,approve_node_time,approve_node_status,
        tenant_id,delete_flag,approve_node_reason,approve_node_remark
    </sql>
</mapper>
src/main/resources/mapper/approve/ApproveProcessMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.approve.mapper.ApproveProcessMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApproveProcess">
            <id property="id" column="id" />
            <result property="approveId" column="approve_id" />
            <result property="approveUser" column="approve_user" />
            <result property="approveDeptId" column="approve_dept_id" />
            <result property="approveDeptName" column="approve_dept_name" />
            <result property="approveUserIds" column="approve_user_ids" />
            <result property="approveUserNames" column="approve_user_names" />
            <result property="approveReason" column="approve_reason" />
            <result property="approveTime" column="approve_time" />
            <result property="approveOverTime" column="approve_over_time" />
            <result property="approveStatus" column="approve_status" />
            <result property="approveDelete" column="approve_delete" />
            <result property="tenantId" column="tenant_id" />
            <result property="approveType" column="approve_type" />
            <result property="approveRemark" column="approve_remark" />
    </resultMap>
    <sql id="Base_Column_List">
        id,approve_id,approve_user,approve_dept_id,approve_dept_name,approve_user_ids,
        approve_user_names,approve_reason,approve_time,approve_over_time,approve_status,
        approve_delete,tenant_id,approve_type,approve_remark
    </sql>
</mapper>