From 6437bdc301a3738b3e6f3be9913a41a45d9f96d9 Mon Sep 17 00:00:00 2001
From: 青城 <1662047068@qq.com>
Date: 星期四, 10 七月 2025 17:06:27 +0800
Subject: [PATCH] 协调审批

---
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java |  128 ++++++++
 src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java                    |   99 ++++++
 src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java            |   18 +
 src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java               |   15 +
 src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java                    |   23 +
 src/main/resources/mapper/approve/ApproveLogMapper.xml                      |   21 +
 src/main/java/com/ruoyi/approve/service/IApproveProcessService.java         |   37 ++
 src/main/java/com/ruoyi/approve/pojo/ApproveLog.java                        |   57 +++
 src/main/resources/mapper/approve/ApproveProcessMapper.xml                  |   30 ++
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java    |   74 ++++
 src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java               |   18 +
 src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java                |   20 +
 src/main/resources/mapper/approve/ApproveNodeMapper.xml                     |   24 +
 src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java                |   72 ++++
 src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java    |  105 +++++++
 src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java       |   47 +++
 src/main/java/com/ruoyi/approve/pojo/ApproveNode.java                       |   78 +++++
 src/main/resources/application.yml                                          |    2 
 src/main/java/com/ruoyi/approve/service/IApproveNodeService.java            |   18 +
 19 files changed, 885 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
new file mode 100644
index 0000000..a4d815e
--- /dev/null
+++ b/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();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
new file mode 100644
index 0000000..25fd122
--- /dev/null
+++ b/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("鎿嶄綔鎴愬姛");
+    }
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java b/src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java
new file mode 100644
index 0000000..3218ed6
--- /dev/null
+++ b/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 閽堝琛ㄣ�恆pprove_log(瀹℃壒鏃ュ織琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-07-07 14:47:01
+* @Entity com.ruoyi.approve.pojo.ApproveLog
+*/
+@Mapper
+public interface ApproveLogMapper extends BaseMapper<ApproveLog> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java b/src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java
new file mode 100644
index 0000000..648d04a
--- /dev/null
+++ b/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 閽堝琛ㄣ�恆pprove_node(瀹℃壒鑺傜偣琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-07-08 16:50:15
+* @Entity com.ruoyi.approve.pojo.ApproveNode
+*/
+public interface ApproveNodeMapper extends BaseMapper<ApproveNode> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java b/src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java
new file mode 100644
index 0000000..ce1b362
--- /dev/null
+++ b/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 閽堝琛ㄣ�恆pprove_process(瀹℃壒娴佺▼琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-07-08 16:44:05
+* @Entity com.ruoyi.approve.pojo.ApproveProcess
+*/
+public interface ApproveProcessMapper extends BaseMapper<ApproveProcess> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveLog.java b/src/main/java/com/ruoyi/approve/pojo/ApproveLog.java
new file mode 100644
index 0000000..8952e0d
--- /dev/null
+++ b/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;
+
+    /**
+     * 瀹℃壒浜篿d
+     */
+    private Long approveUser;
+
+    /**
+     * 瀹℃壒鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date approveTime;
+
+    /**
+     * 瀹℃壒鐘舵��
+     */
+    private Integer approveStatus;
+
+    /**
+     * 瀹℃壒澶囨敞
+     */
+    private String approveRemark;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java b/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
new file mode 100644
index 0000000..de3a255
--- /dev/null
+++ b/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姝e父锛�1鍒犻櫎
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 瀹℃壒鑺傜偣鎷掔粷鍘熷洜
+     */
+    private String approveNodeReason;
+
+    /**
+     * 瀹℃壒鑺傜偣澶囨敞
+     */
+    private String approveNodeRemark;
+
+    private static final long serialVersionUID = 1L;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
new file mode 100644
index 0000000..58cdddb
--- /dev/null
+++ b/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;
+
+    /**
+     * 鐢宠浜篿d
+     */
+    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姝e父锛�1鍒犻櫎
+     */
+    private Integer approveDelete;
+
+    /**
+     * 绉熸埛id
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    /**
+     * 瀹℃壒绫诲瀷
+     */
+    private Integer approveType;
+
+    /**
+     * 瀹℃壒澶囨敞
+     */
+    private String approveRemark;
+
+    private static final long serialVersionUID = 1L;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java b/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
new file mode 100644
index 0000000..14ff91f
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java b/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
new file mode 100644
index 0000000..5ed770d
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
new file mode 100644
index 0000000..1bc54ed
--- /dev/null
+++ b/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);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
new file mode 100644
index 0000000..322a498
--- /dev/null
+++ b/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);
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java b/src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
new file mode 100644
index 0000000..eec0e4a
--- /dev/null
+++ b/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 璁℃暟鍣ㄥ悕绉帮紙渚嬪锛歭ogin_count銆乷rder_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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java b/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
new file mode 100644
index 0000000..bd9ebd9
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
new file mode 100644
index 0000000..5835645
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index a987879..f4a6083 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -83,7 +83,7 @@
     # 鏁版嵁搴撶储寮�
     database: 0
     # 瀵嗙爜
-    password:
+    password: root2022!
 #    password: 123456
 
     # 杩炴帴瓒呮椂鏃堕棿
diff --git a/src/main/resources/mapper/approve/ApproveLogMapper.xml b/src/main/resources/mapper/approve/ApproveLogMapper.xml
new file mode 100644
index 0000000..e47dbbc
--- /dev/null
+++ b/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>
diff --git a/src/main/resources/mapper/approve/ApproveNodeMapper.xml b/src/main/resources/mapper/approve/ApproveNodeMapper.xml
new file mode 100644
index 0000000..d5863ed
--- /dev/null
+++ b/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>
diff --git a/src/main/resources/mapper/approve/ApproveProcessMapper.xml b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
new file mode 100644
index 0000000..da0d5f7
--- /dev/null
+++ b/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>

--
Gitblit v1.9.3