From 50ee6ccb8d8036ffaa2aabb4e4999c14a05b45a3 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期二, 30 九月 2025 16:35:12 +0800
Subject: [PATCH] 资产管理数据权限修改

---
 ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml                                       |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java            |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java      |    5 
 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml                      |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java                          |    8 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java   |    6 
 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml                    |   36 +++--
 ruoyi-system/src/main/java/com/ruoyi/system/constants/AssetDeptConstant.java                            |   12 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java                      |   13 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java       |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java                    |   10 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetItemService.java          |    8 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java        |   58 ++++++++-
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java      |   25 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java    |   12 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java                 |    7 +
 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml                     |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java     |   16 --
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetItemServiceImpl.java |   68 +++++++++++
 19 files changed, 241 insertions(+), 62 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java
index 071962b..2d258b7 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java
@@ -7,12 +7,15 @@
 import com.ruoyi.system.query.AssetWarehousePageQuery;
 import com.ruoyi.system.service.AssetWarehouseService;
 import com.ruoyi.system.vo.asset.AssetWarehouseVO;
+
+import java.util.List;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
@@ -66,5 +69,12 @@
         return R.ok();
     }
 
+    @ApiOperation("获取仓库列表(不分页)")
+    @GetMapping("/list")
+    public R<List<AssetWarehouseVO>> getList() {
+        List<AssetWarehouseVO> list = assetWarehouseService.getAllList();
+        return R.ok(list);
+    }
+
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java
index 7f04abe..b684ab7 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java
@@ -6,9 +6,11 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.constants.AssetDeptConstant;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReturnDTO;
 import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.OaApprovalApplicationAssetService;
 import com.ruoyi.system.vo.asset.AssetMainVO;
 import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO;
@@ -42,12 +44,12 @@
 public class OaApprovalApplicationAssetController {
 
     private final OaApprovalApplicationAssetService oaApprovalApplicationAssetService;
+    private final ISysUserService sysUserService;
 
     @ApiOperation("提交资产领用申请")
     @PostMapping("/submit-receive")
     @Log(title = "资产领用申请-提交", businessType = BusinessType.INSERT)
     public R<Void> submitReceive(@Valid @RequestBody OaApprovalApplicationAssetReceiveDTO dto) {
-        //TODO 提交时需要校验资产状态,是否已经被领用借用处置
         oaApprovalApplicationAssetService.submitReceiveBorrow(dto);
         return R.ok();
     }
@@ -55,14 +57,26 @@
     @ApiOperation("获取资产领用申请分页列表")
     @PostMapping("/page-list")
     public R<IPage<OaApprovalApplicationAssetPageVO>> getReceivePageList(@RequestBody OaApprovalApplicationAssetPageQuery pageQuery) {
-        // 数据权限:非管理员仅能查看本部门
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
         Long userId = SecurityUtils.getUserId();
         boolean isAdmin = SecurityUtils.isAdmin(userId);
+
         if (!isAdmin) {
             try {
-                pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getDeptId()));
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
+
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                }
             } catch (Exception e) {
-                // ignore parse, leave null if cannot parse
+                // 如果获取部门信息失败,默认设置部门权限
+                try {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                } catch (Exception ex) {
+                    // ignore parse, leave null if cannot parse
+                }
             }
         }
         IPage<OaApprovalApplicationAssetPageVO> page = oaApprovalApplicationAssetService.getReceivePageList(pageQuery);
@@ -133,14 +147,26 @@
     @ApiOperation("获取资产归还申请分页列表")
     @PostMapping("/page-return-list")
     public R<IPage<OaApprovalApplicationAssetPageVO>> getReturnPageList(@RequestBody OaApprovalApplicationAssetPageQuery pageQuery) {
-        // 数据权限:非管理员仅能查看本部门
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
         Long userId = SecurityUtils.getUserId();
         boolean isAdmin = SecurityUtils.isAdmin(userId);
+
         if (!isAdmin) {
             try {
-                pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getDeptId()));
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
+
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                }
             } catch (Exception e) {
-                // ignore parse, leave null if cannot parse
+                // 如果获取部门信息失败,默认设置部门权限
+                try {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                } catch (Exception ex) {
+                    // ignore parse, leave null if cannot parse
+                }
             }
         }
         IPage<OaApprovalApplicationAssetPageVO> page = oaApprovalApplicationAssetService.getReturnPageList(pageQuery);
@@ -150,14 +176,26 @@
     @ApiOperation("获取资产归还提醒分页列表")
     @PostMapping("/page-return-notify-list")
     public R<IPage<OaApprovalApplicationAssetPageVO>> getReturnNotifyPageList(@RequestBody OaApprovalApplicationAssetPageQuery pageQuery) {
-        // 数据权限:非管理员仅能查看本部门
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
         Long userId = SecurityUtils.getUserId();
         boolean isAdmin = SecurityUtils.isAdmin(userId);
+
         if (!isAdmin) {
             try {
-                pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getDeptId()));
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
+
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                }
             } catch (Exception e) {
-                // ignore parse, leave null if cannot parse
+                // 如果获取部门信息失败,默认设置部门权限
+                try {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                } catch (Exception ex) {
+                    // ignore parse, leave null if cannot parse
+                }
             }
         }
         IPage<OaApprovalApplicationAssetPageVO> page = oaApprovalApplicationAssetService.getReturnNotifyPageList(pageQuery);
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java
index 120bb3e..249a1d9 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.constants.AssetDeptConstant;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO;
 import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery;
 import com.ruoyi.system.service.ISysUserService;
@@ -66,7 +67,7 @@
                 String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
                 
                 // 非超级管理员且非资产管理部,设置部门权限
-                if (!"资产管理部".equals(deptName)) {
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
                     pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
                 }
             } catch (Exception e) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
index ad93aec..d0e754f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
@@ -5,10 +5,11 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.constants.AssetDeptConstant;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO;
 import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
-import com.ruoyi.system.service.OaApprovalApplicationDisposeService;
 import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.OaApprovalApplicationDisposeService;
 import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposeDetailVO;
 import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO;
 import io.swagger.annotations.Api;
@@ -66,7 +67,7 @@
                 String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
                 
                 // 非超级管理员且非资产管理部,设置部门权限
-                if (!"资产管理部".equals(deptName)) {
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
                     pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
                 }
             } catch (Exception e) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java
index 515d92c..a0c5174 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java
@@ -9,12 +9,14 @@
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.constants.AssetDeptConstant;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageGeneralDTO;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStoragePropertyDTO;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageVehicleDTO;
 import com.ruoyi.system.model.AssetWarehouse;
 import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery;
 import com.ruoyi.system.service.AssetWarehouseService;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.OaApprovalApplicationStorageService;
 import com.ruoyi.system.service.TDeptService;
 import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO;
@@ -56,6 +58,7 @@
     private final OaApprovalApplicationStorageService oaApprovalApplicationStorageService;
     private final TDeptService deptService;
     private final AssetWarehouseService assetWarehouseService;
+    private final ISysUserService sysUserService;
 
     @ApiOperation("提交通用资产入库申请")
     @PostMapping("/submit-general")
@@ -126,6 +129,28 @@
     @PostMapping("/page-list")
     public R<IPage<OaApprovalApplicationStoragePageVO>> getPageList(@RequestBody OaApprovalApplicationStoragePageQuery pageQuery) {
         IPage<OaApprovalApplicationStoragePageVO> page = null;
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
+        Long userId = SecurityUtils.getUserId();
+        boolean isAdmin = SecurityUtils.isAdmin(userId);
+
+        if (!isAdmin) {
+            try {
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
+
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                }
+            } catch (Exception e) {
+                // 如果获取部门信息失败,默认设置部门权限
+                try {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                } catch (Exception ex) {
+                    // ignore parse, leave null if cannot parse
+                }
+            }
+        }
         try {
             page = oaApprovalApplicationStorageService.getPageList(pageQuery);
         } catch (Exception e) {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/constants/AssetDeptConstant.java b/ruoyi-system/src/main/java/com/ruoyi/system/constants/AssetDeptConstant.java
new file mode 100644
index 0000000..8c0ddc3
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/constants/AssetDeptConstant.java
@@ -0,0 +1,12 @@
+package com.ruoyi.system.constants;
+
+/**
+ * @author mitao
+ * @date 2025/9/30
+ */
+public interface AssetDeptConstant {
+    /**
+     * 资产管理部名称,用于写死资产管理模块数据权限
+     */
+    String ASSET_DEPARTMENT_NAME = "资产管理部";
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java
index a2c6084..8a0994c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java
@@ -17,5 +17,8 @@
 
     @ApiModelProperty("关键词(标题/入库单号/所属部门)")
     private String keyword;
+
+    @ApiModelProperty(value = "部门ID")
+    private Integer deptId;
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java
index ba42580..7bafe2e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java
@@ -7,6 +7,8 @@
 import com.ruoyi.system.query.AssetWarehousePageQuery;
 import com.ruoyi.system.vo.asset.AssetWarehouseVO;
 
+import java.util.List;
+
 /**
  * <p>
  * 仓库信息表 服务类
@@ -39,4 +41,10 @@
      * @param id
      */
     void delete(Integer id);
+
+    /**
+     * 获取所有仓库列表
+     * @return
+     */
+    List<AssetWarehouseVO> getAllList();
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetItemService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetItemService.java
index 3e5a129..9bca775 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetItemService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetItemService.java
@@ -6,6 +6,8 @@
 import com.ruoyi.system.query.ApprovalDetailQuery;
 import com.ruoyi.system.vo.GrabListVO;
 
+import java.util.List;
+
 /**
  * <p>
  * 资产领用/借用/归还/处置审批关系表 服务类
@@ -17,4 +19,10 @@
 public interface OaApprovalApplicationAssetItemService extends IService<OaApprovalApplicationAssetItem> {
 
     PageInfo<GrabListVO> pageList(ApprovalDetailQuery query);
+
+    /**
+     * 校验资产状态,检查是否存在待审批的记录
+     * @param assetMainIds 资产ID列表
+     */
+    void validateAssetStatus(List<Integer> assetMainIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java
index 46354d3..fb4d5ed 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java
@@ -6,7 +6,6 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
-import com.ruoyi.common.core.domain.entity.TDept;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.dto.asset.AssetTypeDTO;
@@ -21,14 +20,12 @@
 import com.ruoyi.system.service.AssetInventoryRecordService;
 import com.ruoyi.system.service.AssetMainService;
 import com.ruoyi.system.service.AssetTypeService;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.vo.AssetIdleListVO;
 import com.ruoyi.system.vo.AssetInventoryVO;
 import com.ruoyi.system.vo.AssetStatisticsDetailVO;
 import com.ruoyi.system.vo.AssetStatisticsVO;
 import com.ruoyi.system.vo.asset.AssetTypeTreeVO;
-import com.ruoyi.system.vo.system.NotificationVO;
-import io.swagger.annotations.ApiModelProperty;
-import io.swagger.models.auth.In;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -37,7 +34,12 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -55,6 +57,7 @@
     private final AssetMainService assetMainService;
     private final AssetTypeService assetTypeService;
     private final AssetInventoryRecordService assetInventoryRecordService;
+    private final ISysUserService sysUserService;
 
     @Override
     public List<AssetTypeTreeVO> getAssetTypeTree() {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java
index 9bab973..a2dad76 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java
@@ -120,4 +120,11 @@
         }
         this.removeById(id);
     }
+
+    @Override
+    public List<AssetWarehouseVO> getAllList() {
+        LambdaQueryWrapper<AssetWarehouse> queryWrapper = new LambdaQueryWrapper<>();
+        List<AssetWarehouse> list = this.list(queryWrapper);
+        return BeanUtil.copyToList(list, AssetWarehouseVO.class);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetItemServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetItemServiceImpl.java
index b307d20..652a386 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetItemServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetItemServiceImpl.java
@@ -1,16 +1,26 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.emums.ApprovalStatusEnum;
 import com.ruoyi.system.mapper.OaApprovalApplicationAssetItemMapper;
+import com.ruoyi.system.model.AssetMain;
 import com.ruoyi.system.model.OaApprovalApplicationAssetItem;
+import com.ruoyi.system.model.OaApprovalApplications;
 import com.ruoyi.system.query.ApprovalDetailQuery;
+import com.ruoyi.system.service.AssetMainService;
 import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
+import com.ruoyi.system.service.OaApprovalApplicationsService;
 import com.ruoyi.system.vo.GrabListVO;
-import com.ruoyi.system.vo.PurchaseListVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -21,8 +31,10 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class OaApprovalApplicationAssetItemServiceImpl extends ServiceImpl<OaApprovalApplicationAssetItemMapper, OaApprovalApplicationAssetItem> implements OaApprovalApplicationAssetItemService {
-
+    private final AssetMainService assetMainService;
+    private final OaApprovalApplicationsService oaApprovalApplicationsService;
     @Override
     public PageInfo<GrabListVO> pageList(ApprovalDetailQuery query) {
         PageInfo<GrabListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
@@ -30,4 +42,56 @@
         pageInfo.setRecords(list);
         return pageInfo;
     }
+
+    @Override
+    public void validateAssetStatus(List<Integer> assetMainIds) {
+        if (CollUtil.isEmpty(assetMainIds)) {
+            return;
+        }
+
+        // 1. 根据资产ID列表查询资产关联表
+        List<OaApprovalApplicationAssetItem> assetItems = this.lambdaQuery()
+                .in(OaApprovalApplicationAssetItem::getAssetMainId, assetMainIds)
+                .list();
+
+        if (CollUtil.isEmpty(assetItems)) {
+            return;
+        }
+
+        // 2. 收集所有资产关联表中的审批申请ID
+        List<Integer> approvalApplicationIds = assetItems.stream()
+                .map(OaApprovalApplicationAssetItem::getApprovalApplicationId)
+                .distinct()
+                .collect(Collectors.toList());
+
+        // 3. 查询待审核状态的审批记录
+        List<OaApprovalApplications> pendingApplications = oaApprovalApplicationsService.lambdaQuery()
+                .in(OaApprovalApplications::getId, approvalApplicationIds)
+                .eq(OaApprovalApplications::getApprovalStatus, ApprovalStatusEnum.PENDING.getCode())
+                .list();
+
+        if (CollUtil.isNotEmpty(pendingApplications)) {
+            // 4. 如果存在待审批记录,获取涉及的资产ID
+            Set<Integer> pendingAssetIds = this.lambdaQuery()
+                    .in(OaApprovalApplicationAssetItem::getApprovalApplicationId,
+                            pendingApplications.stream()
+                                    .map(OaApprovalApplications::getId)
+                                    .collect(Collectors.toList()))
+                    .list()
+                    .stream()
+                    .map(OaApprovalApplicationAssetItem::getAssetMainId)
+                    .distinct()
+                    .collect(Collectors.toSet());
+            //取交集
+            pendingAssetIds.retainAll(assetMainIds);
+            // 获取资产信息用于错误提示
+            List<AssetMain> pendingAssets = assetMainService.listByIds(pendingAssetIds);
+            String assetNames = pendingAssets.stream()
+                    .map(AssetMain::getAssetName)
+                    .collect(Collectors.joining("、"));
+
+            throw new ServiceException("操作失败," + assetNames + "资产已存在待审批的记录");
+        }
+    }
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
index 0f91b35..0232b33 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
@@ -65,10 +65,8 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void submitReceiveBorrow(OaApprovalApplicationAssetReceiveDTO dto) {
-        if (CollUtil.isEmpty(dto.getAssetMainIds())) {
-            throw new ServiceException("资产ID列表不能为空");
-        }
-        validateAssetStatus(dto.getAssetMainIds());
+        //校验资产状态
+        oaApprovalApplicationAssetItemService.validateAssetStatus(dto.getAssetMainIds());
         // 1. 构建并保存审批主表
         OaApprovalApplications applications = buildOaApprovalApplications(dto);
 
@@ -95,11 +93,6 @@
                 })
                 .collect(Collectors.toList());
         oaApprovalApplicationAssetItemService.saveBatch(items);
-    }
-
-    //TODO 是否需要限制只有未提交审批的资产才能提交
-    private void validateAssetStatus(List<Integer> assetMainIds) {
-
     }
 
     private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) {
@@ -260,9 +253,8 @@
     }
     @Override
     public void submitReturn(OaApprovalApplicationAssetReturnDTO dto) {
-        if (CollUtil.isEmpty(dto.getAssetMainIds())) {
-            throw new ServiceException("资产ID列表不能为空");
-        }
+        //校验资产状态
+        oaApprovalApplicationAssetItemService.validateAssetStatus(dto.getAssetMainIds());
         // 1. 构建并保存审批主表
         OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
         applications.setApplicationCode(generateApplicationCode("GH"));
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
index e73f360..5caf438 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
@@ -1,11 +1,11 @@
 package com.ruoyi.system.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
 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.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO;
 import com.ruoyi.system.emums.ApprovalStatusEnum;
 import com.ruoyi.system.emums.ApprovalTypeEnum;
@@ -57,10 +57,8 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void submitChange(OaApprovalApplicationChangeDTO dto) {
-        if (CollUtil.isEmpty(dto.getAssetMainIds())) {
-            throw new ServiceException("资产ID列表不能为空");
-        }
-        
+        //校验资产状态
+        oaApprovalApplicationAssetItemService.validateAssetStatus(dto.getAssetMainIds());
         // 1. 构建并保存审批主表
         OaApprovalApplications applications = buildOaApprovalApplications(dto);
 
@@ -94,6 +92,10 @@
         applications.setApprovalId(ApprovalTypeEnum.ASSET_CHANGE.getCode());
         applications.setApplicationDate(LocalDate.now());
         applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
+        applications.setApplicantUserId(SecurityUtils.getUserId().intValue());
+        applications.setApplicantName(SecurityUtils.getLoginUser().getUser().getNickName());
+        applications.setDeptId(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getDeptId()));
+        applications.setDeptName(SecurityUtils.getLoginUser().getUser().getDeptName());
         return applications;
     }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
index 6659bdc..15a4143 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
@@ -1,7 +1,6 @@
 package com.ruoyi.system.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -62,9 +61,8 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void submitDispose(OaApprovalApplicationDisposeDTO dto) {
-        if (CollUtil.isEmpty(dto.getAssetMainIds())) {
-            throw new ServiceException("资产ID列表不能为空");
-        }
+        //校验资产状态
+        oaApprovalApplicationAssetItemService.validateAssetStatus(dto.getAssetMainIds());
         
         // 1. 构建并保存审批主表
         OaApprovalApplications applications = buildOaApprovalApplications(dto);
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
index 5bb2d5c..6927d64 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
@@ -69,6 +69,8 @@
             LEFT JOIN asset_type at ON at.id = am.asset_type_id
             LEFT JOIN t_dept od ON od.id = am.ownership_dept_id
             LEFT JOIN t_dept ud ON ud.id = am.use_dept_id
+            LEFT JOIN oa_approval_application_asset_item oaaai ON oaaai.asset_main_id = am.id
+            LEFT JOIN oa_approval_applications oaa ON oaa.id = oaaai.approval_application_id
         <where>
             AND IFNULL(am.disabled, 0) = 0
             AND IFNULL(aaa.disabled, 0) = 0
@@ -76,6 +78,7 @@
             AND IFNULL(am.is_disposed, 0) = 0
             AND IFNULL(am.is_in_use, 0) = 0
             AND IFNULL(am.is_borrowed, 0) = 0
+            AND ( oaa.id IS NULL OR oaa.approval_status != 0 )
             <if test="query != null and query.assetTypeId != null">
                 AND am.asset_type_id = #{query.assetTypeId}
             </if>
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml
index 5c0e42c..31ea207 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml
@@ -54,7 +54,7 @@
                 )
             </if>
             <if test="query != null and query.deptId != null">
-                AND aaa.dept_id = #{query.deptId}
+                AND (td.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, td.parent_id))
             </if>
         </where>
         ORDER BY oaa.operate_time DESC, oaa.id DESC
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml
index ff77153..e423268 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml
@@ -25,7 +25,7 @@
         SELECT 
             app.id,
             app.application_code AS applicationCode,
-            change.title,
+            oaac.title,
             d.dept_name AS deptName,
             u.nick_name AS applicantName,
             app.application_reason AS applicationReason,
@@ -39,13 +39,13 @@
                 ELSE '未知'
             END AS approvalStatusName
         FROM oa_approval_applications app
-        INNER JOIN oa_approval_application_change change ON app.id = change.approval_application_id
+        INNER JOIN oa_approval_application_change oaac ON app.id = oaac.approval_application_id
         LEFT JOIN sys_user u ON app.applicant_user_id = u.user_id
         LEFT JOIN t_dept d ON app.dept_id = d.id
         WHERE app.disabled = 0
-        AND app.approval_id = 4  <!-- 资产变更审批类型 -->
+        AND app.approval_id = '${@com.ruoyi.system.emums.ApprovalTypeEnum@ASSET_CHANGE.getCode()}'
         <if test="query.keyword != null and query.keyword != ''">
-            AND (change.title LIKE CONCAT('%', #{query.keyword}, '%') 
+            AND (oaac.title LIKE CONCAT('%', #{query.keyword}, '%')
                  OR app.application_code LIKE CONCAT('%', #{query.keyword}, '%'))
         </if>
         <if test="query.deptId != null">
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml
index 2da4995..695809a 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml
@@ -20,30 +20,34 @@
     <!-- 分页查询:资产入库申请列表(关联审批记录与资产类型) -->
     <select id="selectApplicationStoragePage" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO">
         SELECT
-            aaa.id                               AS id,
-            oas.asset_type_id                    AS assetTypeId,
-            aaa.dept_name                        AS deptName,
-            aaa.application_code                 AS applicationCode,
-            oas.title                            AS title,
-            CASE WHEN at2.level = 2 THEN at1.type_name ELSE at2.type_name END AS firstAssetTypeName,
-            CASE WHEN at2.level = 2 THEN at2.type_name ELSE NULL END         AS secondAssetTypeName,
-            aaa.applicant_name                   AS applicantName,
-            oas.storage_time                     AS storageTime,
-            oas.storage_type                     AS storageType,
-            aaa.approval_status                  AS approvalStatus
+        aaa.id,
+        oas.asset_type_id,
+        aaa.dept_name,
+        aaa.application_code,
+        oas.title,
+        CASE WHEN at2.level = 2 THEN at1.type_name ELSE at2.type_name END AS firstAssetTypeName,
+        CASE WHEN at2.level = 2 THEN at2.type_name ELSE NULL END AS secondAssetTypeName,
+        aaa.applicant_name,
+        oas.storage_time,
+        oas.storage_type,
+        aaa.approval_status
         FROM oa_approval_application_storage oas
-                 INNER JOIN oa_approval_applications aaa ON aaa.id = oas.approval_application_id
-                 LEFT JOIN asset_type at2 ON at2.id = oas.asset_type_id
-                 LEFT JOIN asset_type at1 ON at1.id = (CASE WHEN at2.level = 2 THEN at2.parent_id ELSE at2.id END)
+        INNER JOIN oa_approval_applications aaa ON aaa.id = oas.approval_application_id
+        LEFT JOIN asset_type at2 ON at2.id = oas.asset_type_id
+        LEFT JOIN asset_type at1 ON at1.id = (CASE WHEN at2.level = 2 THEN at2.parent_id ELSE at2.id END)
+        LEFT JOIN t_dept d ON aaa.dept_id = d.id
         <where>
             AND aaa.disabled = 0
             <if test="query != null and query.keyword != null and query.keyword != ''">
                 AND (
                 oas.title LIKE CONCAT('%', #{query.keyword}, '%')
-                OR  aaa.application_code LIKE CONCAT('%', #{query.keyword}, '%')
-                OR  aaa.dept_name LIKE CONCAT('%', #{query.keyword}, '%')
+                OR aaa.application_code LIKE CONCAT('%', #{query.keyword}, '%')
+                OR aaa.dept_name LIKE CONCAT('%', #{query.keyword}, '%')
                 )
             </if>
+            <if test="query.deptId != null">
+                AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.parent_id))
+            </if>
         </where>
         ORDER BY oas.storage_time DESC, oas.id DESC
     </select>

--
Gitblit v1.7.1