From ba4af275c3b8d073f863be7b12e43974b3ef14a2 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 12 七月 2025 10:27:06 +0800
Subject: [PATCH] Merge branch 'master' of http://114.132.189.42:9002/r/product-inventory-management-after into pim_ly

---
 src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java                            |   22 
 src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java                 |    1 
 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java                       |    4 
 src/main/java/com/ruoyi/approve/service/IApproveProcessService.java                         |   40 +
 src/main/resources/mapper/purchase/ProductRecordMapper.xml                                  |    2 
 src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml                              |    8 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java                    |    5 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java                |    5 
 pom.xml                                                                                     |    2 
 src/main/java/com/ruoyi/framework/security/service/TokenService.java                        |   17 
 src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml                  |    1 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java       |   28 
 src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java                                |   20 
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java                            |    8 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java                         |    2 
 src/main/resources/mapper/approve/ApproveNodeMapper.xml                                     |   24 
 src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java                                |  129 ++++
 src/main/java/com/ruoyi/project/system/controller/SysUserController.java                    |   14 
 src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java                    |  112 ++++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java                       |   15 
 src/main/java/com/ruoyi/approve/pojo/ApproveNode.java                                       |  116 ++++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java              |    5 
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java                 |  162 +++++
 src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java                                    |  120 ++++
 src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java                         |    5 
 src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java                               |   15 
 src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java                                    |   22 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java           |   27 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                   |  128 ++++
 src/main/resources/mapper/approve/ApproveLogMapper.xml                                      |   21 
 src/main/java/com/ruoyi/approve/pojo/ApproveLog.java                                        |   57 ++
 src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java                               |    2 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java    |  146 +++++
 src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java                         |   11 
 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java                          |    9 
 src/main/resources/mapper/approve/ApproveProcessMapper.xml                                  |   36 +
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java                    |  116 ++++
 src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java                               |   18 
 src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java                               |   21 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java             |   11 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java |    3 
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java               |    5 
 src/main/resources/mapper/system/SysUserMapper.xml                                          |   13 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                     |   59 ++
 src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java                       |   47 +
 src/main/resources/mapper/system/SysDeptMapper.xml                                          |    2 
 src/main/resources/application.yml                                                          |    2 
 src/main/java/com/ruoyi/approve/service/IApproveNodeService.java                            |   20 
 48 files changed, 1,627 insertions(+), 31 deletions(-)

diff --git a/pom.xml b/pom.xml
index 14851a3..51d1a67 100644
--- a/pom.xml
+++ b/pom.xml
@@ -288,7 +288,7 @@
 	                <fork>true</fork> <!-- 濡傛灉娌℃湁璇ラ厤缃紝devtools涓嶄細鐢熸晥 -->
 	            </configuration>
 	        </plugin>
-	    </plugins>
+        </plugins>
 	</build>
 
 	<repositories>
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..369a65e
--- /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/{id}")
+    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,1L);
+        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..9dcda81
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -0,0 +1,112 @@
+package com.ruoyi.approve.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.pojo.ApproveProcess;
+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.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+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")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult add(@RequestBody ApproveProcessVO approveProcessVO) throws ParseException {
+        if (approveProcessVO == null) {
+            return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        approveProcessService.addApprove(approveProcessVO);
+        return AjaxResult.success("娣诲姞鎴愬姛");
+    }
+
+    /**
+     * 瀹℃壒璇︽儏
+     * @param approveGetAndUpdateVo
+     * @return
+     */
+    @GetMapping("/get")
+    public AjaxResult get(ApproveGetAndUpdateVo approveGetAndUpdateVo){
+        if (approveGetAndUpdateVo.getId() == null || approveGetAndUpdateVo.getId().isEmpty()) {
+            return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖");
+        }
+        return AjaxResult.success(approveProcessService.getApproveById(approveGetAndUpdateVo.getId()));
+    }
+
+    /**
+     * 鏇存柊瀹℃壒
+     * @param approveGetAndUpdateVo
+     * @return
+     */
+    @PostMapping("/update")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult update(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo) {
+        if (approveGetAndUpdateVo == null) {
+            return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖");
+        }
+        approveProcessService.updateByApproveId(approveGetAndUpdateVo);
+        return AjaxResult.success("鎿嶄綔鎴愬姛");
+    }
+    /**
+     * 鑾峰彇瀹℃壒鍒楄〃
+     * @return
+     */
+    @GetMapping("/list")
+    public AjaxResult list(Page page, ApproveProcess approveProcess) {
+        return AjaxResult.success(approveProcessService.listAll(page, approveProcess));
+    }
+
+    /**
+     * 鍒犻櫎瀹℃壒
+     * @param ids
+     * @return
+     */
+    @DeleteMapping("/deleteIds")
+    @Transactional(rollbackFor = Exception.class)
+    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..32c6be0
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.approve.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.pojo.ApproveProcess;
+import org.apache.ibatis.annotations.Param;
+
+/**
+* @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> {
+
+    IPage<ApproveProcess> listPage(Page page,@Param("req") ApproveProcess 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..300cc32
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
@@ -0,0 +1,116 @@
+package com.ruoyi.approve.pojo;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+/**
+ * 瀹℃壒鑺傜偣琛�
+ * @TableName approve_node
+ */
+@Data
+@TableName("approve_node")
+public class ApproveNode{
+    /**
+     * 
+     */
+    private Long id;
+
+    /**
+     * 瀹℃壒缂栧彿
+     */
+    private String approveProcessId;
+
+    /**
+     * 瀹℃壒鑺傜偣椤哄簭
+     */
+    private Integer approveNodeOrder;
+
+    /**
+     * 瀹℃壒鑺傜偣鐢ㄦ埛鍚嶅瓧
+     */
+    private String approveNodeUser;
+
+    /**
+     * 瀹℃壒鑺傜偣鐢ㄦ埛id
+     */
+    private Long approveNodeUserId;
+
+    /**
+     * 瀹℃壒鑺傜偣鏃堕棿
+     */
+    @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;
+
+    /**
+     * 鏄惁涓哄綋鍓嶅鏍歌妭鐐�
+     */
+    @TableField(exist = false)
+    private Boolean isShen = false;
+
+    /**
+     * 绉熸埛id
+     */
+//    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    /**
+     * 鍒犻櫎鏍囪:0姝e父锛�1鍒犻櫎
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 鍏ュ簱鐢ㄦ埛id
+     */
+    private Long createUser;
+
+    /**
+     * 鍏ュ簱鏃堕棿
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鑰�
+     */
+    private Long updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 瀹℃壒鑺傜偣鎷掔粷鍘熷洜
+     */
+    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..57bfdb1
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -0,0 +1,120 @@
+package com.ruoyi.approve.pojo;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+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{
+    /**
+     * 
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 娴佺▼缂栧彿
+     */
+    private String approveId;
+
+    /**
+     * 鐢宠浜篿d
+     */
+    private Long approveUser;
+
+    /**
+     * 鐢宠浜哄悕绉�
+     */
+    private String approveUserName;
+
+    /**
+     * 鐢宠閮ㄩ棬id
+     */
+    private Long approveDeptId;
+
+    /**
+     * 鐢宠閮ㄩ棬鍚嶇О
+     */
+    private String approveDeptName;
+
+    /**
+     * 瀹℃壒鐢ㄦ埛ids
+     */
+    private String approveUserIds;
+
+    /**
+     * 瀹℃壒鐢ㄦ埛鍚嶇О
+     */
+    private String approveUserNames;
+
+    /**
+     * 鐢宠鍘熷洜
+     */
+    private String approveReason;
+
+    /**
+     * 褰撳墠瀹℃壒鐢ㄦ埛ID
+     */
+    private Long approveUserCurrentId;
+
+    /**
+     * 褰撳墠瀹℃壒鐢ㄦ埛鍚嶇О
+     */
+    private String approveUserCurrentName;
+
+    /**
+     * 鐢宠鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date approveTime;
+
+    /**
+     * 瀹℃壒瀹屾垚鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date approveOverTime;
+
+    /**
+     * 瀹℃壒鐘舵�侊細0寰呭鏍革紝1瀹℃牳涓紝2瀹℃牳瀹屾垚 3瀹℃牳鏈�氳繃
+     */
+    private Integer approveStatus;
+
+    /**
+     * 瀹℃壒鏄惁鍒犻櫎锛�0姝e父锛�1鍒犻櫎
+     */
+    private Integer approveDelete;
+
+    /**
+     * 绉熸埛id
+     */
+//    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    /**
+     * 瀹℃壒绫诲瀷
+     */
+    private Integer approveType;
+
+    /**
+     * 瀹℃壒澶囨敞
+     */
+    private String approveRemark;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private LocalDateTime createTime;
+
+    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..71813da
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
@@ -0,0 +1,20 @@
+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 approveUserIds,String approveID,Long tenantId);
+    /**
+     * 璇︽儏
+     * @param id
+     */
+    List<ApproveNode> details(String id);
+
+    void updateApproveNode(ApproveNode approveNode);
+
+    void delApproveNodeByApproveId(Long id);
+}
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..2606599
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
@@ -0,0 +1,40 @@
+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.ApproveProcessVO;
+import com.ruoyi.project.system.domain.SysDept;
+
+import java.text.ParseException;
+import java.util.List;
+
+public interface IApproveProcessService extends IService<ApproveProcess> {
+    /**
+     * 娣诲姞瀹℃壒娴佺▼
+     * @param approveProcessVO 瀹℃壒娴佺▼VO瀵硅薄
+     */
+    void addApprove(ApproveProcessVO approveProcessVO) throws ParseException;
+    /**
+     * 鏍规嵁閮ㄩ棬id鏌ヨ閮ㄩ棬淇℃伅
+     * @param deptIds 閮ㄩ棬ID鏁扮粍
+     */
+    List<SysDept> selectDeptListByDeptIds(Long[] deptIds);
+
+    IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess);
+
+    void delApprove(Long[] ids);
+
+    void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo);
+
+    ApproveProcess getApproveById(String id);
+
+    /**
+     * 瀹℃壒鐘舵�佹洿鏂�
+     * @param approveNode
+     */
+    void updateApproveProcessStatus(ApproveNode approveNode,Integer status);
+}
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..04adc4b
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.approve.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+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 com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+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.time.LocalDateTime;
+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;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+
+    @Override
+    public void initApproveNodes(String approveUserIds,String approveID,Long tenantId) {
+        Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
+        ApproveProcess approve = approveProcessService.getApproveById(approveID);
+        String[] names = approveUserIds.split(",");
+        String approveId = approve.getApproveId();
+        for (int i = 0; i < names.length; i++) {
+            SysUser sysUser = sysUserMapper.selectUserById(Long.parseLong(names[i]));
+            if (sysUser == null) continue;
+            ApproveNode approveNode = new ApproveNode();
+            approveNode.setApproveProcessId(approveId);
+            approveNode.setApproveNodeOrder(i +1);
+            approveNode.setApproveNodeUser(sysUser.getNickName());
+            approveNode.setApproveNodeUserId(sysUser.getUserId());
+            approveNode.setApproveNodeTime(new Date());
+            approveNode.setApproveNodeStatus(0);
+            approveNode.setTenantId(tenantId);
+            approveNode.setDeleteFlag(0);
+            approveNode.setCreateUser(userId);
+            approveNode.setUpdateUser(userId);
+            approveNode.setCreateTime(LocalDateTime.now());
+            approveNode.setUpdateTime(LocalDateTime.now());
+            approveNodeMapper.insert(approveNode);
+        }
+    }
+
+    @Override
+    public List<ApproveNode> details(String id) {
+        LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ApproveNode::getApproveProcessId, id);
+        queryWrapper.eq(ApproveNode::getDeleteFlag, 0);
+        queryWrapper.eq(ApproveNode::getTenantId, SecurityUtils.getLoginUser().getTenantId());
+        List<ApproveNode> list = list(queryWrapper);
+        // 鎸夌収 approveNodeOrder 瀛楁鍗囧簭鎺掑簭
+        list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder));
+        LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, id)
+                .eq(ApproveProcess::getApproveDelete, 0)
+                .eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId())
+                .last("limit 1");
+        ApproveProcess approveProcess = approveProcessService.getOne(approveProcessLambdaQueryWrapper);
+        if(approveProcess != null && approveProcess.getApproveStatus() == 3){
+            return list;
+        }
+        for (ApproveNode approveNode : list) {
+            if(approveNode.getApproveNodeStatus() == 1){
+                continue;
+            }
+            approveNode.setIsShen(true);
+            break;
+        }
+        return list;
+    }
+
+    @Override
+    public void updateApproveNode(ApproveNode approveNode) {
+        // 瀹℃壒鑺傜偣鐘舵��:1鍚屾剰锛�2鎷掔粷锛�0灏氭湭瀹℃牳
+        switch (approveNode.getApproveNodeStatus()){
+            case 1:
+                approveProcessService.updateApproveProcessStatus(approveNode, Boolean.TRUE.equals(approveNode.getIsLast()) ? 2 : 1);
+                break;
+            case 2:
+                approveProcessService.updateApproveProcessStatus(approveNode, 3);
+                break;
+            default:
+                break;
+        }
+        approveNode.setApproveNodeTime(new Date());
+        approveNodeMapper.updateById(approveNode);
+    }
+
+    @Override
+    public void delApproveNodeByApproveId(Long id) {
+        UpdateWrapper<ApproveNode> queryWrapper = new UpdateWrapper<>();
+        queryWrapper.lambda().set(ApproveNode::getDeleteFlag, 1)
+                .eq(ApproveNode::getApproveProcessId, id);
+        update(queryWrapper);
+    }
+
+}
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..b081070
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -0,0 +1,162 @@
+package com.ruoyi.approve.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.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;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@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;
+    private final SysUserMapper sysUserMapper;
+    private final ApproveProcessMapper approveProcessMapper;
+
+    @Override
+    public void addApprove(ApproveProcessVO approveProcessVO) throws ParseException {
+        SysUser sysUser = sysUserMapper.selectUserById(approveProcessVO.getApproveUser());
+        SysDept sysDept = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId());
+        String[] split = approveProcessVO.getApproveUserIds().split(",");
+        List<Long> longList = Arrays.stream(split)
+                .map(Long::valueOf)  // 灏嗘瘡涓� String 杞崲涓� Long
+                .collect(Collectors.toList());
+        List<SysUser> sysUsers = sysUserMapper.selectUserByIds(longList);
+        if(CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�");
+        if(sysDept == null) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
+        if(sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
+        String today = LocalDate.now().format(DATE_FORMAT);
+        Long approveId = dailyRedisCounter.incrementAndGetByDb();
+        String formattedCount = String.format("%03d", approveId);
+        //娴佺▼ ID
+        String approveID = today + formattedCount;
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        ApproveProcess approveProcess = new ApproveProcess();
+        approveProcess.setApproveId(approveID);
+        approveProcess.setApproveUser(approveProcessVO.getApproveUser());
+        approveProcess.setApproveUserName(sysUser.getNickName());
+        approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId());
+        approveProcess.setApproveDeptName(sysDept.getDeptName());
+        approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
+        approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime()));
+        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
+        approveProcess.setApproveOverTime(null);
+        approveProcess.setApproveStatus(0);
+        approveProcess.setApproveDelete(0);
+        approveProcess.setCreateTime(LocalDateTime.now());
+        approveProcess.setTenantId(approveProcessVO.getApproveDeptId());
+        approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds());
+        approveProcess.setApproveUserCurrentId(longList.get(0));
+        approveProcess.setApproveUserCurrentName(sysUsers
+                .stream()
+                .filter(SysUser -> SysUser.getUserId().equals(longList.get(0)))
+                .collect(Collectors.toList())
+                .get(0)
+                .getNickName());
+        save(approveProcess);
+        //鍒濆鍖栧鎵硅妭鐐�
+        approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(),approveID,approveProcessVO.getApproveDeptId());
+    }
+
+    @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 IPage<ApproveProcess> listAll(Page page,ApproveProcess approveProcess) {
+        IPage<ApproveProcess> approveProcessIPage = approveProcessMapper.listPage(page,approveProcess);
+        return approveProcessIPage;
+    }
+
+    @Override
+    public void delApprove(Long[] ids) {
+        for (Long id : ids) {
+            UpdateWrapper<ApproveProcess> queryWrapper = new UpdateWrapper<>();
+            queryWrapper.lambda().set(ApproveProcess::getApproveDelete, 1)
+                    .eq(ApproveProcess::getApproveId, id);
+            update(queryWrapper);
+            // 鍒犻櫎鍏宠仈鐨勫鎵硅妭鐐�
+            approveNodeService.delApproveNodeByApproveId(id);
+        }
+
+
+    }
+
+    @Override
+    public ApproveProcess getApproveById(String id) {
+        LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ApproveProcess::getApproveId, id);
+        queryWrapper.eq(ApproveProcess::getApproveDelete, 0);
+        queryWrapper.eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId());
+        queryWrapper.last("limit 1");
+        ApproveProcess one = getOne(queryWrapper);
+        return one;
+    }
+
+    @Override
+    public void updateApproveProcessStatus(ApproveNode approveNode,Integer status) {
+        LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())
+                .eq(ApproveProcess::getApproveDelete, 0)
+                .eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId())
+                .last("limit 1");
+        ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper);
+        if(approveProcess == null) throw new RuntimeException("瀹℃壒涓嶅瓨鍦�");
+        approveProcess.setApproveStatus(status);
+        updateById(approveProcess);
+    }
+
+    @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..d98a005
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
@@ -0,0 +1,129 @@
+package com.ruoyi.approve.utils;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.approve.mapper.ApproveProcessMapper;
+import com.ruoyi.approve.pojo.ApproveProcess;
+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.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.Date;
+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;
+    }
+
+    @Autowired
+    private ApproveProcessMapper approveProcessMapper;
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿鐨�  寮�濮嬫棩鏈�  锛岀粨鏉熸棩鏈�
+     * @return
+     */
+    public static StartAndEndDateDto getDateTime(){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = new Date();
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.DATE,1);
+        String startDateTime = simpleDateFormat.format(date);
+        String endDateTime = simpleDateFormat.format(cal.getTime());
+        StartAndEndDateDto startAndEndDateDto = new StartAndEndDateDto();
+        startAndEndDateDto.setStartDate(startDateTime);
+        startAndEndDateDto.setEndDate(endDateTime);
+        return startAndEndDateDto;
+    }
+
+    /**鏌ユ暟鎹簱
+     * 鑾峰彇鎸囧畾璁℃暟鍣ㄥ湪浠婃棩鐨勬暟鍊硷紝骞惰嚜澧�1
+     * @return 浠婃棩鑷鍚庣殑璁℃暟鍊�
+     */
+    public long incrementAndGetByDb() {
+        String approveId = redisTemplate.opsForValue().get("approveNum");
+        if(approveId == null){
+            StartAndEndDateDto dateTime = getDateTime();
+            LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            approveProcessLambdaQueryWrapper
+                    .eq(ApproveProcess::getApproveDelete,0)
+                    .gt(ApproveProcess::getCreateTime,dateTime.getStartDate())
+                    .lt(ApproveProcess::getCreateTime,dateTime.getEndDate());
+            Long aLong = approveProcessMapper.selectCount(approveProcessLambdaQueryWrapper);
+            if(aLong == null){
+                redisTemplate.opsForValue().set("approveNum","1",1L, TimeUnit.HOURS);
+                return 1;
+            }else{
+                aLong += 1;
+                redisTemplate.opsForValue().set("approveNum",aLong.toString(),1L, TimeUnit.HOURS);
+                return aLong;
+            }
+        }else{
+            Long num = Long.parseLong(approveId) + 1;
+            redisTemplate.opsForValue().set("approveNum",num.toString(),1L, TimeUnit.HOURS);
+            return Long.parseLong(approveId);
+        }
+
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾璁℃暟鍣ㄥ湪浠婃棩鐨勫綋鍓嶆暟鍊�
+     * @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/utils/StartAndEndDateDto.java b/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java
new file mode 100644
index 0000000..0c9eb11
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.approve.utils;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author :yys
+ * @date : 2023/9/19 10:58
+ */
+@Data
+@ApiModel
+public class StartAndEndDateDto {
+
+    @ApiModelProperty("寮�濮嬫椂闂�")
+    private String startDate;
+
+    @ApiModelProperty("缁撴潫鏃堕棿")
+    private String endDate;
+
+}
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..7885247
--- /dev/null
+++ b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -0,0 +1,22 @@
+package com.ruoyi.approve.vo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class ApproveProcessVO {
+
+
+    private Long approveDeptId;
+
+    private String approveTime;
+
+    // 鐢宠浜�
+    private Long approveUser;
+
+    // 瀹℃壒浜�
+    private String approveUserIds;
+
+    private String approveReason;
+}
diff --git a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
index 816fe04..e23355d 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
@@ -36,6 +36,11 @@
      */
     @Override
     public void saveSupplier(SupplierManage supplierManage) {
+        LambdaQueryWrapper<SupplierManage> supplierManageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        supplierManageLambdaQueryWrapper.eq(SupplierManage::getSupplierName,supplierManage.getSupplierName());
+        if (supplierMapper.selectCount(supplierManageLambdaQueryWrapper) > 0) {
+            throw new RuntimeException("渚涘簲鍟嗗凡瀛樺湪");
+        }
         supplierMapper.insert(supplierManage);
     }
 
diff --git a/src/main/java/com/ruoyi/framework/security/service/TokenService.java b/src/main/java/com/ruoyi/framework/security/service/TokenService.java
index bb7e5ca..5b7cf11 100644
--- a/src/main/java/com/ruoyi/framework/security/service/TokenService.java
+++ b/src/main/java/com/ruoyi/framework/security/service/TokenService.java
@@ -1,9 +1,15 @@
 package com.ruoyi.framework.security.service;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletRequest;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.project.system.domain.SysUserDept;
+import com.ruoyi.project.system.mapper.SysUserDeptMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +28,7 @@
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
+import org.springframework.util.CollectionUtils;
 
 /**
  * token楠岃瘉澶勭悊
@@ -140,6 +147,9 @@
         }
     }
 
+    @Autowired
+    private SysUserDeptMapper sysUserDeptMapper;
+
     /**
      * 鍒锋柊浠ょ墝鏈夋晥鏈�
      * 
@@ -149,6 +159,13 @@
     {
         loginUser.setLoginTime(System.currentTimeMillis());
         loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        LambdaQueryWrapper<SysUserDept> sysUserDeptLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        sysUserDeptLambdaQueryWrapper.eq(SysUserDept::getUserId, loginUser.getUserId());
+        List<SysUserDept> sysUserDept = sysUserDeptMapper.selectList(sysUserDeptLambdaQueryWrapper);
+        if(!CollectionUtils.isEmpty(sysUserDept)){
+            List<Long> collect = sysUserDept.stream().map(SysUserDept::getDeptId).collect(Collectors.toList());
+            loginUser.setDeptId(collect.toArray(new Long[0]));
+        }
         // 鏍规嵁uuid灏唋oginUser缂撳瓨
         String userKey = getTokenKey(loginUser.getToken());
         redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
diff --git a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
index eb801bc..61de057 100644
--- a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
+++ b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -6,6 +6,7 @@
 import com.ruoyi.other.pojo.TempFile;
 import com.ruoyi.other.service.TempFileService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.catalina.util.URLEncoder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -13,6 +14,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -35,7 +37,14 @@
     public TempFile uploadFile(MultipartFile file,Integer type) throws IOException {
         // 1. 鐢熸垚涓存椂鏂囦欢ID鍜岃矾寰�
         String tempId = UUID.randomUUID().toString();
-        Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename());
+        String originalFilename = file.getOriginalFilename();
+        if(originalFilename == null) throw new IOException("鏂囦欢鍚嶄笉鑳戒负绌�");
+        URLEncoder urlEncoder = new URLEncoder();
+        String encodedFilename = urlEncoder.encode(originalFilename, StandardCharsets.UTF_8);
+        encodedFilename = encodedFilename.replaceAll("%2E",".");
+        Path tempFilePath = Paths.get(tempDir, tempId + "_" + encodedFilename);
+
+//        Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename());
 
         // 2. 纭繚鐩綍瀛樺湪
         Path parentDir = tempFilePath.getParent();
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index 6778afc..a106fb2 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -7,10 +7,7 @@
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
-import com.ruoyi.procurementrecord.dto.ProcurementDto;
-import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
-import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
+import com.ruoyi.procurementrecord.dto.*;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.purchase.dto.InvoicePurchaseReportDto;
 import com.ruoyi.quality.pojo.QualityInspect;
@@ -56,6 +53,13 @@
         return AjaxResult.success(procurementRecordService.updatePro(procurementDto));
     }
 
+    @PostMapping("/updateManagement")
+    @Log(title = "閲囪喘鍏ュ簱-搴撳瓨鍙拌处-淇敼", businessType = BusinessType.UPDATE)
+    @Transactional
+    public AjaxResult updateManagement(@RequestBody ProcurementManagementUpdateDto procurementDto) {
+        return AjaxResult.success(procurementRecordService.updateManagement(procurementDto));
+    }
+
     @PostMapping("/del")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE)
     @Transactional
@@ -70,6 +74,22 @@
         return AjaxResult.success(result);
     }
 
+    @GetMapping("/listPageCopy")
+    @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPageCopy(Page page, ProcurementPageDto procurementDto) {
+        IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 瀵煎嚭
+     * @param response
+     */
+    @PostMapping("/exportCopy")
+    public void exportCopy(HttpServletResponse response) {
+        procurementRecordService.exportCopy(response);
+    }
+
     /**
      * 瀵煎嚭
      * @param response
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
new file mode 100644
index 0000000..ae93d84
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -0,0 +1,27 @@
+package com.ruoyi.procurementrecord.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author :yys
+ * @date : 2025/7/9 9:41
+ */
+@Data
+public class ProcurementManagementUpdateDto {
+
+    private String createBy;
+
+    private Long createUser;
+
+    private String createTime;
+
+    private String entryDate;
+
+    private Integer id;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
index 122d4b8..51ad7bd 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -16,6 +16,8 @@
 
     private Integer id;
 
+    private Long createUser;
+
     /**
      * 鍏ュ簱鎵规
      */
@@ -38,18 +40,25 @@
     /**
      * 寰呭嚭搴撴暟閲�
      */
-    @Excel(name = "寰呭嚭搴撴暟閲�")
+//    @Excel(name = "寰呭嚭搴撴暟閲�")
     private BigDecimal inboundNum0;
 
 
     /**
      * 鍑哄叆搴撴椂闂�
      */
-    @Excel(name = "鍏ュ簱鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+//    @Excel(name = "鍏ュ簱鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private LocalDateTime createTime;
 
     /**
+     * 鍑哄叆搴撴椂闂�
+     */
+    @Excel(name = "鍏ュ簱鏃堕棿")
+    private String time;
+
+
+    /**
      * 鍑哄叆搴撶敤鎴�
      */
     @Excel(name = "鍏ュ簱浜�")
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
new file mode 100644
index 0000000..9ef5677
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -0,0 +1,128 @@
+package com.ruoyi.procurementrecord.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author :yys
+ * @date : 2025/7/9 10:34
+ */
+@Data
+public class ProcurementPageDtoCopy {
+
+    private Integer id;
+
+    private Long createUser;
+
+    /**
+     * 鍏ュ簱鎵规
+     */
+    @Excel(name = "鍏ュ簱鎵规")
+    private String inboundBatches;
+
+    /**
+     * 鍚堝悓鍙�
+     */
+    private String purchaseContractNumber;
+
+    private String salesLedgerProductId;
+
+    /**
+     * 鍑哄叆搴撴暟閲�
+     */
+    @Excel(name = "鍏ュ簱鏁伴噺")
+    private BigDecimal inboundNum;
+
+    /**
+     * 寰呭嚭搴撴暟閲�
+     */
+    @Excel(name = "寰呭嚭搴撴暟閲�")
+    private BigDecimal inboundNum0;
+
+
+    /**
+     * 鍑哄叆搴撴椂闂�
+     */
+//    @Excel(name = "鍏ュ簱鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * 鍑哄叆搴撴椂闂�
+     */
+    @Excel(name = "鍏ュ簱鏃堕棿")
+    private String cTime;
+
+    /**
+     * 鍑哄叆搴撴椂闂�
+     */
+//    @Excel(name = "搴撳瓨鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    /**
+     * 鍑哄叆搴撴椂闂�
+     */
+    @Excel(name = "搴撳瓨鏃堕棿")
+    private String uTime;
+
+    /**
+     * 鍑哄叆搴撶敤鎴�
+     */
+    @Excel(name = "鍏ュ簱浜�")
+    private String createBy;
+
+    /**
+     * 渚涘簲鍟嗗悕绉�
+     */
+    @Excel(name = "渚涘簲鍟嗗悕绉�")
+    private String supplierName;
+
+
+    /**
+     * 浜у搧澶х被
+     */
+    @Excel(name = "浜у搧澶х被")
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    private String unit;
+
+    /**
+     * 绋庣巼
+     */
+    @Excel(name = "绋庣巼(%)")
+    private BigDecimal taxRate;
+
+    /**
+     * 鍚◣鍗曚环
+     */
+    @Excel(name = "鍚◣鍗曚环")
+    private BigDecimal taxInclusiveUnitPrice;
+
+    /**
+     * 鍚◣鎬讳环
+     */
+    @Excel(name = "鍚◣鎬讳环")
+    private BigDecimal taxInclusiveTotalPrice;
+
+    /**
+     * 涓嶅惈绋庢�讳环
+     */
+    @Excel(name = "涓嶅惈绋庢�讳环")
+    private BigDecimal taxExclusiveTotalPrice;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
index 62fd6f7..3dd180e 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -25,10 +25,13 @@
     /**
      * 鍑哄叆搴撴椂闂�
      */
-    @Excel(name = "鍑哄簱鏃堕棿")
+//    @Excel(name = "鍑哄簱鏃堕棿")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
+    @Excel(name = "鍑哄簱鏃堕棿")
+    private String time;
+
     /**
      * 鍑哄叆搴撶敤鎴�
      */
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
index 4121aa8..1336f39 100644
--- a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.procurementrecord.dto.ProcurementDto;
 import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
+import com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import org.apache.ibatis.annotations.Param;
 
@@ -25,5 +26,9 @@
 
     IPage<ProcurementPageDto> listPage(Page page,@Param("req")  ProcurementPageDto procurementDto);
 
+    IPage<ProcurementPageDtoCopy> listPageCopy(Page page, @Param("req")  ProcurementPageDto procurementDto);
+
+    List<ProcurementPageDtoCopy> listCopy();
+
     List<ProcurementPageDto> list();
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
index 07db479..d169692 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -1,8 +1,6 @@
 package com.ruoyi.procurementrecord.pojo;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Builder;
 import lombok.Data;
 
@@ -70,6 +68,7 @@
     /**
      * 绉熸埛ID
      */
+    @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 890dde6..495a8a6 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -1,8 +1,6 @@
 package com.ruoyi.procurementrecord.pojo;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Builder;
 import lombok.Data;
 
@@ -66,5 +64,6 @@
     /**
      * 绉熸埛ID
      */
+    @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index 41a2f44..c7e1699 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -3,10 +3,7 @@
 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.procurementrecord.dto.ProcurementAddDto;
-import com.ruoyi.procurementrecord.dto.ProcurementDto;
-import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
-import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
+import com.ruoyi.procurementrecord.dto.*;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 
 import javax.servlet.http.HttpServletResponse;
@@ -23,9 +20,15 @@
 
     IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto);
 
+    IPage<ProcurementPageDtoCopy> listPageCopy(Page page, ProcurementPageDto procurementDto);
+
     int updatePro(ProcurementUpdateDto procurementDto);
 
     int deletePro(ProcurementUpdateDto procurementDto);
 
     void export(HttpServletResponse response);
+
+    int updateManagement(ProcurementManagementUpdateDto procurementDto);
+
+    void exportCopy(HttpServletResponse response);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
index a561187..31605d7 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -56,8 +56,7 @@
                 .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                 .createBy(sysUser.getNickName())
                 .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
-                .updateTime(LocalDateTime.now())
-                .tenantId(sysUser.getTenantId());
+                .updateTime(LocalDateTime.now());
         this.save(procurementRecordOut.build());
         return 0;
     }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 92ef336..06612f6 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -4,6 +4,7 @@
 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.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
@@ -13,7 +14,10 @@
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -22,6 +26,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -120,8 +125,109 @@
     @Override
     public void export(HttpServletResponse response) {
         List<ProcurementPageDto> list =procurementRecordMapper.list();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = list.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class);
+            util.exportExcel(response, list, "鍏ュ簱鍙拌处");
+            return;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class);
+            util.exportExcel(response, list, "鍏ュ簱鍙拌处");
+            return;
+        }
+        for (ProcurementPageDto dto : list) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
         ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class);
         util.exportExcel(response, list, "鍏ュ簱鍙拌处");
+    }
+
+    private final SysUserMapper sysUserMapper;
+
+    @Override
+    public int updateManagement(ProcurementManagementUpdateDto procurementDto) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser sysUser = sysUserMapper.selectUserById(procurementDto.getCreateUser());
+        if(sysUser == null){
+            throw new RuntimeException("鍏ュ簱浜轰笉瀛樺湪");
+        }
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String entryDateStr = procurementDto.getEntryDate() + " 00:00:00";
+        String createTimeStr = procurementDto.getCreateTime() + " 00:00:00";
+        ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
+        procurementRecordStorageById.setCreateBy(sysUser.getNickName());
+        procurementRecordStorageById.setCreateUser(sysUser.getUserId());
+        procurementRecordStorageById.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
+        procurementRecordStorageById.setUpdateUser(loginUser.getUserId());
+        procurementRecordStorageById.setCreateTime(LocalDateTime.parse(createTimeStr,df));
+        procurementRecordMapper.updateById(procurementRecordStorageById);
+        return 0;
+    }
+
+    @Override
+    public void exportCopy(HttpServletResponse response) {
+        List<ProcurementPageDtoCopy> list =procurementRecordMapper.listCopy();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = list.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
+            util.exportExcel(response, list, "搴撳瓨绠$悊");
+            return;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
+            util.exportExcel(response, list, "搴撳瓨绠$悊");
+            return;
+        }
+        for (ProcurementPageDtoCopy dto : list) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
+        ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
+        util.exportExcel(response, list, "搴撳瓨绠$悊");
     }
 
     @Override
@@ -142,7 +248,6 @@
                     .createUser(loginUser.getUserId())
                     .updateTime(LocalDateTime.now())
                     .updateUser(loginUser.getUserId())
-                    .tenantId(loginUser.getTenantId())
                     .createBy(procurementDto.getNickName());
             this.save(procurementRecordBuilder.build());
             // 鍏ュ簱鎴愬姛鍑忔帀閲囪喘鏁伴噺
@@ -197,4 +302,43 @@
         return procurementPageDtoIPage;
     }
 
+    @Override
+    public IPage<ProcurementPageDtoCopy> listPageCopy(Page page, ProcurementPageDto procurementDto) {
+        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopy(page, procurementDto);
+        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            return procurementPageDtoCopyIPage;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            return procurementPageDtoCopyIPage;
+        }
+        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
+        return procurementPageDtoCopyIPage;
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
index aa787ed..14618a9 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
@@ -269,4 +269,18 @@
         List<SysUser> sysUserList = userService.userListNoPage(user);
         return AjaxResult.success(sysUserList);
     }
+
+    /**
+     * 鏌ヨ褰撳墠鐢ㄦ埛鍏徃涓嬫墍鏈夌敤鎴�
+     * @param user
+     * @return
+     */
+    @GetMapping("/userListNoPageByTenantId")
+    public AjaxResult userListNoPageByTenantId(SysUser user){
+        //鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
+        SysUser loginUser = SecurityUtils.getLoginUser().getUser();
+        user.setTenantId(loginUser.getTenantId());
+        List<SysUser> sysUserList = userService.userListNoPage(user);
+        return AjaxResult.success(sysUserList);
+    }
 }
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
index f08882a..9f7003a 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -54,6 +54,14 @@
     public SysUser selectUserById(Long userId);
 
     /**
+     * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛
+     *
+     * @param userId 鐢ㄦ埛ID
+     * @return 鐢ㄦ埛瀵硅薄淇℃伅
+     */
+    public List<SysUser> selectUserByIds(@Param("userIds") List<Long> userId);
+
+    /**
      * 鏂板鐢ㄦ埛淇℃伅
      * 
      * @param user 鐢ㄦ埛淇℃伅
diff --git a/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java b/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
index 903f7ae..6bb8927 100644
--- a/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
+++ b/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
@@ -12,6 +12,7 @@
 import com.ruoyi.project.system.mapper.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index f4ce895..8853bb0 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -178,6 +178,7 @@
         List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList());
         List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds);
         if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){
+            iPage.setTotal(iPage.getRecords().size());
             return iPage;
         }
         for (SalesLedger salesLedger : iPage.getRecords()) {
@@ -204,6 +205,7 @@
                 iPage.getRecords().removeIf(salesLedger -> Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00")));
             }
         }
+        iPage.setTotal(iPage.getRecords().size());
         return iPage;
     }
 }
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
index 9ecf442..4230695 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -36,6 +36,15 @@
     }
 
     /**
+     * 鍦ㄨ亴鍛樺伐涓嬫媺(鏂板绂昏亴鐢�)
+     * @return
+     */
+    @GetMapping("/list")
+    public AjaxResult staffOnJobList() {
+        return AjaxResult.success(staffOnJobService.staffOnJobList());
+    }
+
+    /**
      * 鍦ㄨ亴鍛樺伐璇︽儏
      * @param staffNo
      * @return
diff --git a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
index f83ddc6..8893835 100644
--- a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
+++ b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -17,4 +17,6 @@
     List<StaffJoinLeaveRecord> staffOnJobDetail(String staffNo);
 
     void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob);
+
+    List<StaffOnJob> staffOnJobList();
 }
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
index 90f884e..3a07854 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -50,6 +50,10 @@
         util.exportExcel(response, staffOnJobs, "鍦ㄨ亴鍛樺伐鍙拌处瀵煎嚭");
     }
 
+    @Override
+    public List<StaffOnJob> staffOnJobList() {
+        return staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffState,1));
+    }
 
 
 }
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..3104940
--- /dev/null
+++ b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
@@ -0,0 +1,36 @@
+<?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>
+    <select id="listPage" resultType="com.ruoyi.approve.pojo.ApproveProcess">
+        select * from approve_process where approve_delete = 0
+        <if test="req.approveId != null and req.approveId != ''">
+            and approve_id like concat('%',#{req.approveId},'%')
+        </if>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index 3548891..7d0f59b 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -33,6 +33,7 @@
         t2.product_category,
         t1.id,
         t1.sales_ledger_product_id,
+        t1.create_user,
         t2.specification_model,
         t2.unit,
         t2.tax_rate,
@@ -43,6 +44,7 @@
         t1.inbound_num,
         t1.inbound_num as inboundNum0,
         t1.create_time,
+        t1.update_time,
         t1.create_by
         from  procurement_record_storage t1
                   left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
@@ -71,6 +73,63 @@
             t1.inbound_batches,
             t1.inbound_num,
             t1.create_time,
+            t1.create_time as time,
+            t1.create_by
+        from  procurement_record_storage t1
+                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+    </select>
+    <select id="listPageCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
+        select
+        t3.supplier_name,
+        t3.purchase_contract_number,
+        t2.product_category,
+        t1.id,
+        t1.sales_ledger_product_id,
+        t1.create_user,
+        t2.specification_model,
+        t2.unit,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        t2.tax_inclusive_total_price,
+        t2.tax_exclusive_total_price,
+        t1.inbound_batches,
+        t1.inbound_num,
+        t1.inbound_num as inboundNum0,
+        t1.create_time,
+        t1.update_time,
+        t1.create_by
+        from  procurement_record_storage t1
+        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+        left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        <where>
+            1 = 1
+            <if test="req.supplierName != null and req.supplierName != ''">
+                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+            </if>
+        </where>
+    </select>
+    <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
+        select
+            t3.supplier_name,
+            t3.purchase_contract_number,
+            t2.product_category,
+            t1.id,
+            t1.sales_ledger_product_id,
+            t1.create_user,
+            t2.specification_model,
+            t2.unit,
+            t2.tax_rate,
+            t2.tax_inclusive_unit_price,
+            t2.tax_inclusive_total_price,
+            t2.tax_exclusive_total_price,
+            t1.inbound_batches,
+            t1.inbound_num,
+            t1.inbound_num as inboundNum0,
+            t1.create_time,
+            t1.update_time,
+            t1.create_time as cTime,
+            t1.update_time as uTime,
             t1.create_by
         from  procurement_record_storage t1
                   left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
index 4b8416e..a127b10 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -39,6 +39,7 @@
             t2.tax_exclusive_total_price,
             t1.inbound_num,
             t1.create_time,
+            t1.create_time as time,
             t1.create_by
         from  procurement_record_out t1
                   left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
diff --git a/src/main/resources/mapper/purchase/ProductRecordMapper.xml b/src/main/resources/mapper/purchase/ProductRecordMapper.xml
index dd5aac6..e1646b8 100644
--- a/src/main/resources/mapper/purchase/ProductRecordMapper.xml
+++ b/src/main/resources/mapper/purchase/ProductRecordMapper.xml
@@ -27,7 +27,7 @@
             and sl.sales_contract_no = #{c.salesContractNo}
         </if>
         <if test="c.supplierName != null and c.supplierName != ''">
-            and sl.supplier_name = #{c.supplierName}
+            and pl.supplier_name = #{c.supplierName}
         </if>
         <if test="c.createdAtStart != null and c.createdAtStart != ''">
             and pr.created_at &gt;= date_format(#{c.createdAtStart},'%Y-%m-%d hh:mm:ss')
diff --git a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
index 61957ac..f28dbd1 100644
--- a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
+++ b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -7,10 +7,10 @@
         FROM quality_unqualified
         where
         1=1
-        <if test="qualityUnqualified.inspectType != null and qualityUnqualified.inspectType != '' ">
+        <if test="qualityUnqualified.inspectType != null ">
             AND inspect_type = #{qualityUnqualified.inspectType}
         </if>
-        <if test="qualityUnqualified.inspectState != null and qualityUnqualified.inspectState != '' ">
+        <if test="qualityUnqualified.inspectState != null ">
             AND inspect_state = #{qualityUnqualified.inspectState}
         </if>
         <if test="qualityUnqualified.productName != null and qualityUnqualified.productName != '' ">
@@ -23,10 +23,10 @@
         FROM quality_unqualified
         where
         1=1
-        <if test="qualityUnqualified.inspectType != null and qualityUnqualified.inspectType != '' ">
+        <if test="qualityUnqualified.inspectType != null">
             AND inspect_type = #{qualityUnqualified.inspectType}
         </if>
-        <if test="qualityUnqualified.inspectState != null and qualityUnqualified.inspectState != '' ">
+        <if test="qualityUnqualified.inspectState != null">
             AND inspect_state = #{qualityUnqualified.inspectState}
         </if>
         <if test="qualityUnqualified.productName != null and qualityUnqualified.productName != '' ">
diff --git a/src/main/resources/mapper/system/SysDeptMapper.xml b/src/main/resources/mapper/system/SysDeptMapper.xml
index efebac7..5c6310a 100644
--- a/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -67,7 +67,7 @@
 	</select>
     
     <select id="checkDeptExistUser" parameterType="Long" resultType="int">
-		select count(1) from sys_user where dept_id = #{deptId} and del_flag = '0'
+		select count(1) from sys_user_dept where dept_id = #{deptId}
 	</select>
 	
 	<select id="hasChildByDeptId" parameterType="Long" resultType="int">
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index 3afcaf0..52ec0a3 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -62,6 +62,11 @@
 			FROM
 				sys_user_dept T1
 			LEFT JOIN sys_dept T2 ON T1.dept_id = T2.dept_id
+		<where>
+			<if test="tenantId != null and tenantId != 0">
+				T1.dept_id = #{tenantId}
+			</if>
+		</where>
 			GROUP BY T1.user_id
 		) T2 on T2.user_id = u.user_id
 		where u.del_flag = '0'
@@ -147,7 +152,13 @@
 	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
-	
+	<select id="selectUserByIds" resultType="com.ruoyi.project.system.domain.SysUser">
+		<include refid="selectUserVo"/>
+		where u.user_id in <foreach collection="userIds" item="item" open="(" separator="," close=")">
+ 			#{item}
+        </foreach>
+	</select>
+
 	<insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>

--
Gitblit v1.9.3