mitao
1 天以前 50ee6ccb8d8036ffaa2aabb4e4999c14a05b45a3
资产管理数据权限修改
18个文件已修改
1个文件已添加
303 ■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/constants/AssetDeptConstant.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetItemService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetItemServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
}
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);
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) {
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) {
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) {
ruoyi-system/src/main/java/com/ruoyi/system/constants/AssetDeptConstant.java
New file
@@ -0,0 +1,12 @@
package com.ruoyi.system.constants;
/**
 * @author mitao
 * @date 2025/9/30
 */
public interface AssetDeptConstant {
    /**
     * 资产管理部名称,用于写死资产管理模块数据权限
     */
    String ASSET_DEPARTMENT_NAME = "资产管理部";
}
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;
}
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();
}
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);
}
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() {
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);
    }
}
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 + "资产已存在待审批的记录");
        }
    }
}
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"));
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;
    }
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);
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>
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
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">
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>