From 7c0a8a91ae6d1c684e7a358929f4bd04f3f4bfe8 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期四, 18 九月 2025 21:01:21 +0800
Subject: [PATCH] 资产管理-资产入库列表接口 资产管理-资产领用申请接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java                             |   44 +++
 ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml                                     |   49 +++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java            |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java                             |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java            |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java          |   21 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java |  127 ++++++--
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java                       |   26 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java    |    8 
 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml                  |   30 ++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java            |   16 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java          |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java          |   50 +++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java     |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java     |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java                               |   16 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java      |   28 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java    |   68 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java                                      |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java                    |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java               |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java       |   73 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java                             |   30 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java   |  113 ++++++++
 24 files changed, 729 insertions(+), 75 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java
index 54c123d..4d1beb1 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java
@@ -1,6 +1,17 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.query.AssetMainPageQuery;
+import com.ruoyi.system.service.AssetMainService;
+import com.ruoyi.system.vo.asset.AssetMainPageVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -9,12 +20,23 @@
  * 资产主表 前端控制器
  * </p>
  *
- * @author WuGuanFengYue
- * @since 2025-09-15
+ * 用于资产主数据的查询,新增:查询审批通过的资产分页列表接口
  */
+@Api(tags = {"资产-资产主数据相关接口"})
+@Validated
 @RestController
 @RequestMapping("/asset-main")
+@RequiredArgsConstructor
 public class AssetMainController {
 
+    private final AssetMainService assetMainService;
+
+    @ApiOperation("获取审批通过且可用的资产分页列表(排除已领用、已处置、未归还借用)")
+    @PostMapping("/page-list")
+    public R<IPage<AssetMainPageVO>> getApprovedAssetPageList(@RequestBody AssetMainPageQuery pageQuery) {
+        IPage<AssetMainPageVO> page = assetMainService.getApprovedPageList(pageQuery);
+        return R.ok(page);
+    }
+
 }
 
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 7432256..b5d1163 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
@@ -1,20 +1,42 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO;
+import com.ruoyi.system.service.OaApprovalApplicationAssetService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
 
 /**
  * <p>
  * 资产领用单明细表 前端控制器
  * </p>
- *
- * @author WuGuanFengYue
- * @since 2025-09-15
  */
+@Api(tags = {"OA审批-资产领用相关接口"})
+@Validated
 @RestController
 @RequestMapping("/oa-approval-application-asset")
+@RequiredArgsConstructor
 public class OaApprovalApplicationAssetController {
 
+    private final OaApprovalApplicationAssetService oaApprovalApplicationAssetService;
+
+    @ApiOperation("提交资产领用申请")
+    @PostMapping("/submit-receive")
+    @Log(title = "资产领用申请-提交", businessType = BusinessType.INSERT)
+    public R<Void> submitReceive(@Valid @RequestBody OaApprovalApplicationAssetReceiveDTO dto) {
+        oaApprovalApplicationAssetService.submitReceive(dto);
+        return R.ok();
+    }
 }
 
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 483dcdb..1c64940 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
@@ -1,12 +1,22 @@
 package com.ruoyi.web.controller.api;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.core.domain.entity.TDept;
+import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageDTO;
 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.OaApprovalApplicationStorageService;
+import com.ruoyi.system.service.TDeptService;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -34,11 +44,14 @@
 public class OaApprovalApplicationStorageController {
 
     private final OaApprovalApplicationStorageService oaApprovalApplicationStorageService;
+    private final TDeptService deptService;
+    private final AssetWarehouseService assetWarehouseService;
 
     @ApiOperation("提交通用资产入库申请")
     @PostMapping("/submit-general")
     @Log(title = "通用资产入库申请-提交", businessType = BusinessType.INSERT)
     public R<Void> submitGeneralAssetStorage(@Valid @RequestBody OaApprovalApplicationStorageGeneralDTO dto) {
+        validateAddress(dto);
         oaApprovalApplicationStorageService.submitGeneralAssetStorage(dto);
         return R.ok();
     }
@@ -47,6 +60,7 @@
     @PostMapping("/submit-property")
     @Log(title = "房产资产入库申请-提交", businessType = BusinessType.INSERT)
     public R<Void> submitPropertyAssetStorage(@Valid @RequestBody OaApprovalApplicationStoragePropertyDTO dto) {
+        validateAddress(dto);
         oaApprovalApplicationStorageService.submitPropertyAssetStorage(dto);
         return R.ok();
     }
@@ -55,7 +69,59 @@
     @PostMapping("/submit-vehicle")
     @Log(title = "车辆资产入库申请-提交", businessType = BusinessType.INSERT)
     public R<Void> submitVehicleAssetStorage(@Valid @RequestBody OaApprovalApplicationStorageVehicleDTO dto) {
+        validateAddress(dto);
         oaApprovalApplicationStorageService.submitVehicleAssetStorage(dto);
         return R.ok();
     }
-}
\ No newline at end of file
+
+    @ApiOperation("获取资产入库申请分页列表")
+    @PostMapping("/page-list")
+    public R<IPage<OaApprovalApplicationStoragePageVO>> getPageList(@RequestBody OaApprovalApplicationStoragePageQuery pageQuery) {
+        IPage<OaApprovalApplicationStoragePageVO> page = oaApprovalApplicationStorageService.getPageList(pageQuery);
+        return R.ok(page);
+    }
+
+    /**
+     * 校验位置类型与相关名称/地址
+     */
+    private void validateAddress(OaApprovalApplicationStorageDTO dto) {
+        Integer addressType = dto.getAddressType();
+        if (addressType == null) {
+            throw new ServiceException("位置类型不能为空");
+        }
+        switch (addressType) {
+            case 0:
+                // 部门
+                if (StringUtils.isEmpty(dto.getUseDeptName())) {
+                    throw new ServiceException("使用部门名称不能为空");
+                }
+                TDept dept = deptService.lambdaQuery()
+                        .eq(TDept::getDeptName, dto.getUseDeptName())
+                        .one();
+                if (dept == null) {
+                    throw new ServiceException("使用部门不存在: " + dto.getUseDeptName());
+                }
+                break;
+            case 1:
+                // 仓库
+                if (StringUtils.isEmpty(dto.getWarehouseName())) {
+                    throw new ServiceException("仓库名称不能为空");
+                }
+                AssetWarehouse wh = assetWarehouseService.lambdaQuery()
+                        .eq(AssetWarehouse::getWarehouseName, dto.getWarehouseName())
+                        .one();
+                if (wh == null) {
+                    throw new ServiceException("仓库不存在: " + dto.getWarehouseName());
+                }
+                break;
+            case 2:
+                // 地址
+                if (StringUtils.isEmpty(dto.getAddress())) {
+                    throw new ServiceException("所在位置不能为空");
+                }
+                break;
+            default:
+                throw new ServiceException("位置类型不支持: " + addressType);
+        }
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java
new file mode 100644
index 0000000..8ecc57e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java
@@ -0,0 +1,73 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 资产领用申请 DTO
+ */
+@Data
+@ApiModel("资产领用申请DTO")
+public class OaApprovalApplicationAssetReceiveDTO implements Serializable {
+    private static final long serialVersionUID = 2025091801L;
+
+    // 公共字段:领用部门、领用人、领用备注
+    @ApiModelProperty("领用部门ID")
+    @NotNull(message = "领用部门不能为空")
+    private Integer deptId;
+
+    @ApiModelProperty("领用部门名称")
+    @NotNull(message = "领用部门名称不能为空")
+    private String deptName;
+
+    @ApiModelProperty("领用人用户ID")
+    @NotNull(message = "领用人不能为空")
+    private Integer applicantUserId;
+
+    @ApiModelProperty("领用人名称")
+    @NotNull(message = "领用人名称不能为空")
+    private String applicantName;
+
+    @ApiModelProperty("领用备注")
+    private String applicationReason;
+
+    @ApiModelProperty("附件URL,多个使用英文逗号拼接")
+    private String attachmentUrl;
+
+    // 独有字段:事项标题、领用日期、资产类型、预计退还日期、领用资产列表
+    @ApiModelProperty("事项标题")
+    @NotNull(message = "事项标题不能为空")
+    private String title;
+
+    @ApiModelProperty("领用日期")
+    @NotNull(message = "领用日期不能为空")
+    private LocalDate operateTime;
+
+    @ApiModelProperty("资产类型ID")
+    @NotNull(message = "资产类型不能为空")
+    private Integer assetTypeId;
+
+    @ApiModelProperty("预计退还日期,可为空")
+    private LocalDate expectReturnDate;
+
+    @ApiModelProperty("领用资产列表")
+    @NotEmpty(message = "领用资产列表不能为空")
+    private List<ReceiveAssetItemDTO> assetItems;
+
+    @Data
+    public static class ReceiveAssetItemDTO implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        @ApiModelProperty("资产主表ID")
+        @NotNull(message = "资产ID不能为空")
+        private Integer assetMainId;
+    }
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java
index 8aef70f..56155a6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java
@@ -64,4 +64,18 @@
     @NotNull(message = "入库日期不能为空")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate storageTime;
-}
\ No newline at end of file
+
+    // 新增:统一的资产所在单位信息(用于整单校验)
+    @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+    @NotNull(message = "位置类型不能为空")
+    private Integer addressType;
+
+    @ApiModelProperty(value = "使用部门/位置名称")
+    private String useDeptName;
+
+    @ApiModelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "所在位置")
+    private String address;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java
index 3848cb6..63d5584 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java
@@ -66,11 +66,11 @@
         @ApiModelProperty(value = "使用人")
         private String userName;
 
-        @ApiModelProperty(value = "使用部门/位置ID")
-        private Integer useDeptId;
+        @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+        private Integer addressType;
 
-        @ApiModelProperty(value = "仓库ID")
-        private Integer warehouseId;
+        @ApiModelProperty(value = "使用部门/位置名称")
+        private String useDeptName;
 
         @ApiModelProperty(value = "仓库名称")
         private String warehouseName;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java
index 06ec290..d74064c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java
@@ -66,11 +66,11 @@
         @ApiModelProperty(value = "使用人")
         private String userName;
 
-        @ApiModelProperty(value = "使用部门/位置ID")
-        private Integer useDeptId;
+        @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+        private Integer addressType;
 
-        @ApiModelProperty(value = "仓库ID")
-        private Integer warehouseId;
+        @ApiModelProperty(value = "使用部门/位置名称")
+        private String useDeptName;
 
         @ApiModelProperty(value = "仓库名称")
         private String warehouseName;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java
index e0d5a2a..ec0146a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java
@@ -66,11 +66,11 @@
         @ApiModelProperty(value = "使用人")
         private String userName;
 
-        @ApiModelProperty(value = "使用部门/位置ID")
-        private Integer useDeptId;
+        @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+        private Integer addressType;
 
-        @ApiModelProperty(value = "仓库ID")
-        private Integer warehouseId;
+        @ApiModelProperty(value = "使用部门/位置名称")
+        private String useDeptName;
 
         @ApiModelProperty(value = "仓库名称")
         private String warehouseName;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java
index eca0dea..3abb27a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java
@@ -1,16 +1,26 @@
 package com.ruoyi.system.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.system.model.AssetMain;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.query.AssetMainPageQuery;
+import com.ruoyi.system.vo.asset.AssetMainPageVO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
  * 资产主表 Mapper 接口
  * </p>
- *
- * @author WuGuanFengYue
- * @since 2025-09-15
  */
 public interface AssetMainMapper extends BaseMapper<AssetMain> {
 
+    /**
+     * 分页查询审批通过的资产
+     * @param page 分页参数
+     * @param query 查询条件
+     * @return 分页数据
+     */
+    IPage<AssetMainPageVO> selectApprovedAssetPage(Page<?> page, @Param("query") AssetMainPageQuery query);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java
index 1940a85..b48ae0d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java
@@ -1,7 +1,12 @@
 package com.ruoyi.system.mapper;
 
-import com.ruoyi.system.model.OaApprovalApplicationStorage;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.OaApprovalApplicationStorage;
+import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -13,4 +18,11 @@
  */
 public interface OaApprovalApplicationStorageMapper extends BaseMapper<OaApprovalApplicationStorage> {
 
+    /**
+     * 分页查询资产入库申请列表
+     * @param page 分页参数
+     * @param query 查询条件
+     * @return 分页数据
+     */
+    IPage<OaApprovalApplicationStoragePageVO> selectApplicationStoragePage(Page<?> page, @Param("query") OaApprovalApplicationStoragePageQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java
index 8be23d1..1cc1695 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java
@@ -142,6 +142,19 @@
     @TableField("attachment_urls")
     private String attachmentUrls;
 
+    @ApiModelProperty(value = "是否被处置")
+    @TableField("is_disposed")
+    private Integer disposed;
+
+    @ApiModelProperty(value = "是否借用未归还")
+    @TableField("is_borrowed")
+    private Integer borrowed;
+
+    @ApiModelProperty(value = "是否被领用")
+    @TableField("is_in_use")
+    private Integer inUse;
+
+
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
     private LocalDateTime createTime;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java
new file mode 100644
index 0000000..b5af8fa
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java
@@ -0,0 +1,30 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 资产主数据分页查询对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("资产主数据分页查询对象")
+public class AssetMainPageQuery extends BasePage {
+    private static final long serialVersionUID = 4159237423452345234L;
+
+    @ApiModelProperty("资产类型ID")
+    private Integer assetTypeId;
+
+    @ApiModelProperty("归属部门ID")
+    private Integer ownershipDeptId;
+
+    @ApiModelProperty("资产状态")
+    private String assetStatus;
+
+    @ApiModelProperty("关键字(资产名称/资产编码)")
+    private String keyword;
+}
+
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
new file mode 100644
index 0000000..a2c6084
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 资产入库申请分页查询对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("资产入库申请分页查询对象")
+public class OaApprovalApplicationStoragePageQuery extends BasePage {
+    private static final long serialVersionUID = 5202319182345234523L;
+
+    @ApiModelProperty("关键词(标题/入库单号/所属部门)")
+    private String keyword;
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java
index 96b37f8..143d07a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java
@@ -1,16 +1,21 @@
 package com.ruoyi.system.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.model.AssetMain;
+import com.ruoyi.system.query.AssetMainPageQuery;
+import com.ruoyi.system.vo.asset.AssetMainPageVO;
 
 /**
- * <p>
  * 资产主表 服务类
- * </p>
- *
- * @author WuGuanFengYue
- * @since 2025-09-15
  */
 public interface AssetMainService extends IService<AssetMain> {
 
+    /**
+     * 获取审批通过的资产分页列表
+     * @param pageQuery 查询条件
+     * @return 分页数据
+     */
+    IPage<AssetMainPageVO> getApprovedPageList(AssetMainPageQuery pageQuery);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
index 4c4251e..abf9846 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.model.OaApprovalApplicationAsset;
+import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO;
 
 /**
  * <p>
@@ -13,4 +14,9 @@
  */
 public interface OaApprovalApplicationAssetService extends IService<OaApprovalApplicationAsset> {
 
+    /**
+     * 提交资产领用申请
+     * @param dto 领用申请DTO
+     */
+    void submitReceive(OaApprovalApplicationAssetReceiveDTO dto);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java
index 3c8ead4..5f32c7f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java
@@ -1,10 +1,13 @@
 package com.ruoyi.system.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 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.OaApprovalApplicationStorage;
+import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
 
 /**
  * <p>
@@ -36,4 +39,11 @@
      * @param dto 车辆资产入库申请DTO
      */
     void submitVehicleAssetStorage(OaApprovalApplicationStorageVehicleDTO dto);
+
+    /**
+     * 获取资产入库申请分页列表
+     * @param pageQuery 查询条件
+     * @return 分页数据
+     */
+    IPage<OaApprovalApplicationStoragePageVO> getPageList(OaApprovalApplicationStoragePageQuery pageQuery);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
index 231a1bb..cc1dd58 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
@@ -1,20 +1,24 @@
 package com.ruoyi.system.service.impl;
 
+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.system.mapper.AssetMainMapper;
 import com.ruoyi.system.model.AssetMain;
+import com.ruoyi.system.query.AssetMainPageQuery;
 import com.ruoyi.system.service.AssetMainService;
+import com.ruoyi.system.vo.asset.AssetMainPageVO;
 import org.springframework.stereotype.Service;
 
 /**
- * <p>
  * 资产主表 服务实现类
- * </p>
- *
- * @author WuGuanFengYue
- * @since 2025-09-15
  */
 @Service
 public class AssetMainServiceImpl extends ServiceImpl<AssetMainMapper, AssetMain> implements AssetMainService {
 
+    @Override
+    public IPage<AssetMainPageVO> getApprovedPageList(AssetMainPageQuery pageQuery) {
+        Page<AssetMainPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
+        return this.baseMapper.selectApprovedAssetPage(page, pageQuery);
+    }
 }
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 0d0db98..9bab973 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
@@ -6,18 +6,18 @@
 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.core.domain.entity.SysDept;
+import com.ruoyi.common.core.domain.entity.TDept;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.dto.asset.AssetWarehouseDTO;
 import com.ruoyi.system.mapper.AssetWarehouseMapper;
-import com.ruoyi.system.mapper.SysDeptMapper;
 import com.ruoyi.system.model.AssetInventoryRecord;
 import com.ruoyi.system.model.AssetWarehouse;
 import com.ruoyi.system.query.AssetWarehousePageQuery;
 import com.ruoyi.system.service.AssetInventoryRecordService;
 import com.ruoyi.system.service.AssetWarehouseService;
+import com.ruoyi.system.service.TDeptService;
 import com.ruoyi.system.vo.asset.AssetWarehouseVO;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -40,7 +40,7 @@
 public class AssetWarehouseServiceImpl extends ServiceImpl<AssetWarehouseMapper, AssetWarehouse> implements AssetWarehouseService {
 
     private final AssetInventoryRecordService assetInventoryRecordService;
-    private final SysDeptMapper sysDeptMapper;
+    private final TDeptService deptService;
 
     @Override
     public IPage<AssetWarehouseVO> getPageList(AssetWarehousePageQuery pageQuery) {
@@ -60,9 +60,9 @@
         List<Integer> warehouseIds = assetWarehouseVOS.stream().map(AssetWarehouseVO::getId).collect(Collectors.toList());
         List<Integer> deptIds = assetWarehouseVOS.stream().map(AssetWarehouseVO::getDeptId).distinct().collect(Collectors.toList());
 
-        List<SysDept> sysDepts = sysDeptMapper.selectByIds(deptIds);
+        List<TDept> sysDepts = deptService.listByIds(deptIds);
         Map<Integer, String> deptMap = sysDepts.stream()
-                .collect(Collectors.toMap(item->item.getDeptId().intValue(), SysDept::getDeptName));
+                .collect(Collectors.toMap(TDept::getId, TDept::getDeptName));
         //查询库存数量
         Map<Integer, List<AssetInventoryRecord>> inventoryRecordMap = assetInventoryRecordService.lambdaQuery()
                 .in(AssetInventoryRecord::getWarehouseId, warehouseIds)
@@ -72,10 +72,11 @@
             List<AssetInventoryRecord> assetInventoryRecords = inventoryRecordMap.get(warehouseVO.getId());
             if (CollUtil.isEmpty(assetInventoryRecords)) {
                 warehouseVO.setCurrentStock(0);
+            } else {
+                long inStock = assetInventoryRecords.stream().filter(item -> item.getType().equals(0)).count();
+                long outStock = assetInventoryRecords.stream().filter(item -> item.getType().equals(1)).count();
+                warehouseVO.setCurrentStock((int) (inStock - outStock));
             }
-            long inStock = assetInventoryRecords.stream().filter(item -> item.getType().equals(0)).count();
-            long outStock = assetInventoryRecords.stream().filter(item -> item.getType().equals(1)).count();
-            warehouseVO.setCurrentStock((int) (inStock - outStock));
             //设置部门名称
             warehouseVO.setDeptName(deptMap.getOrDefault(warehouseVO.getDeptId(), ""));
         });
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 1769d10..0640ed2 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
@@ -1,10 +1,29 @@
 package com.ruoyi.system.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO;
+import com.ruoyi.system.emums.ApprovalStatusEnum;
+import com.ruoyi.system.emums.ApprovalTypeEnum;
 import com.ruoyi.system.mapper.OaApprovalApplicationAssetMapper;
 import com.ruoyi.system.model.OaApprovalApplicationAsset;
+import com.ruoyi.system.model.OaApprovalApplicationAssetItem;
+import com.ruoyi.system.model.OaApprovalApplications;
+import com.ruoyi.system.model.OaApprovalFlowNode;
+import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
 import com.ruoyi.system.service.OaApprovalApplicationAssetService;
+import com.ruoyi.system.service.OaApprovalApplicationsService;
+import com.ruoyi.system.service.OaApprovalFlowNodeService;
+import com.ruoyi.system.service.OaApprovalTodoService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +34,100 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor
 public class OaApprovalApplicationAssetServiceImpl extends ServiceImpl<OaApprovalApplicationAssetMapper, OaApprovalApplicationAsset> implements OaApprovalApplicationAssetService {
 
+    private final OaApprovalApplicationsService oaApprovalApplicationsService;
+    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
+    private final OaApprovalTodoService oaApprovalTodoService;
+    private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submitReceive(OaApprovalApplicationAssetReceiveDTO dto) {
+        if (CollectionUtils.isEmpty(dto.getAssetItems())) {
+            throw new ServiceException("领用资产列表不能为空");
+        }
+
+        // 1. 构建并保存审批主表
+        OaApprovalApplications applications = buildOaApprovalApplications(dto);
+
+        // 2. 获取流程首节点,设置当前节点,并保存
+        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.GRAB.getCode());
+        applications.setCurrentFlowNodeId(firstFlowNode.getId());
+        oaApprovalApplicationsService.save(applications);
+
+        // 3. 创建待办
+        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
+
+        // 4. 保存领用明细
+        OaApprovalApplicationAsset detail = buildOaApprovalApplicationAsset(dto, applications.getId());
+        this.save(detail);
+
+        // 5. 保存关联的资产项
+        List<OaApprovalApplicationAssetItem> items = dto.getAssetItems().stream()
+                .map(i -> {
+                    OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem();
+                    item.setApprovalApplicationId(applications.getId());
+                    item.setAssetMainId(i.getAssetMainId());
+                    return item;
+                })
+                .collect(Collectors.toList());
+        oaApprovalApplicationAssetItemService.saveBatch(items);
+    }
+
+    private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) {
+        List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery()
+                .eq(OaApprovalFlowNode::getApprovalId, approvalId)
+                .eq(OaApprovalFlowNode::getStatus, 1)
+                .orderByAsc(OaApprovalFlowNode::getSortOrder)
+                .list();
+        if (CollectionUtils.isEmpty(flowNodes)) {
+            throw new ServiceException("未找到有效的审批流程配置");
+        }
+        return flowNodes.get(0);
+    }
+
+    private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationAssetReceiveDTO dto) {
+        OaApprovalApplications applications = new OaApprovalApplications();
+        applications.setApplicationCode(generateApplicationCode());
+        applications.setApprovalId(ApprovalTypeEnum.GRAB.getCode());
+        applications.setApplicantUserId(dto.getApplicantUserId());
+        applications.setApplicantName(dto.getApplicantName());
+        applications.setDeptId(dto.getDeptId());
+        applications.setDeptName(dto.getDeptName());
+        applications.setApplicationDate(dto.getOperateTime());
+        applications.setApplicationReason(dto.getApplicationReason());
+        applications.setAttachmentUrl(dto.getAttachmentUrl());
+        applications.setDisabled(0);
+        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
+        return applications;
+    }
+
+    private OaApprovalApplicationAsset buildOaApprovalApplicationAsset(OaApprovalApplicationAssetReceiveDTO dto, Integer applicationId) {
+        OaApprovalApplicationAsset asset = new OaApprovalApplicationAsset();
+        asset.setApprovalApplicationId(applicationId);
+        asset.setTitle(dto.getTitle());
+        asset.setAssetTypeId(dto.getAssetTypeId());
+        asset.setOperateTime(dto.getOperateTime());
+        asset.setExpectReturnDate(dto.getExpectReturnDate());
+        asset.setType(Boolean.FALSE); // 0-领用
+        return asset;
+    }
+
+    /**
+     * 生成申请单号:LY + yyyyMMdd + 3位序号
+     */
+    private String generateApplicationCode() {
+        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String prefix = "LY" + dateStr;
+        Long count = oaApprovalApplicationsService.lambdaQuery()
+                .like(OaApprovalApplications::getApplicationCode, prefix)
+                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
+                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
+                .count();
+        int sequence = (count != null ? count.intValue() : 0) + 1;
+        String sequenceStr = String.format("%03d", sequence);
+        return prefix + sequenceStr;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
index a043153..f56632b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
@@ -1,9 +1,9 @@
 package com.ruoyi.system.service.impl;
 
-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.core.domain.entity.SysDept;
-import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.entity.TDept;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageGeneralDTO;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStoragePropertyDTO;
@@ -12,22 +12,38 @@
 import com.ruoyi.system.emums.ApprovalTypeEnum;
 import com.ruoyi.system.emums.AssetTypeEnum;
 import com.ruoyi.system.mapper.OaApprovalApplicationStorageMapper;
-import com.ruoyi.system.model.*;
-import com.ruoyi.system.service.*;
+import com.ruoyi.system.model.AssetGeneralExt;
+import com.ruoyi.system.model.AssetMain;
+import com.ruoyi.system.model.AssetPropertyExt;
+import com.ruoyi.system.model.AssetVehicleExt;
+import com.ruoyi.system.model.AssetWarehouse;
+import com.ruoyi.system.model.OaApprovalApplicationStorage;
+import com.ruoyi.system.model.OaApprovalApplications;
+import com.ruoyi.system.model.OaApprovalFlowNode;
+import com.ruoyi.system.service.AssetGeneralExtService;
+import com.ruoyi.system.service.AssetMainService;
+import com.ruoyi.system.service.AssetPropertyExtService;
+import com.ruoyi.system.service.AssetTypeService;
+import com.ruoyi.system.service.AssetVehicleExtService;
+import com.ruoyi.system.service.AssetWarehouseService;
+import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.OaApprovalApplicationStorageService;
+import com.ruoyi.system.service.OaApprovalApplicationsService;
+import com.ruoyi.system.service.OaApprovalFlowNodeService;
+import com.ruoyi.system.service.OaApprovalTodoService;
+import com.ruoyi.system.service.TDeptService;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -51,6 +67,8 @@
     private final OaApprovalTodoService oaApprovalTodoService;
     private final ISysUserService sysUserService;
     private final ISysDeptService sysDeptService;
+    private final TDeptService tDeptService;
+    private final AssetWarehouseService assetWarehouseService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -71,7 +89,7 @@
         save(storage);
 
         // 5. 保存通用资产数据
-        saveGeneralAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
+        saveGeneralAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime(), dto);
     }
 
     @Override
@@ -93,7 +111,7 @@
         save(storage);
 
         // 5. 保存房产资产数据
-        savePropertyAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
+        savePropertyAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime(), dto);
     }
 
     @Override
@@ -115,13 +133,13 @@
         save(storage);
 
         // 5. 保存车辆资产数据
-        saveVehicleAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
+        saveVehicleAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime(), dto);
     }
 
     /**
      * 保存通用资产数据
      */
-    private void saveGeneralAssets(List<OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+    private void saveGeneralAssets(List<OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) {
         List<AssetMain> allAssetMains = new ArrayList<>();
         List<AssetGeneralExt> allGeneralExts = new ArrayList<>();
         
@@ -129,7 +147,7 @@
             // 根据数量创建对应数量的资产记录
             int quantity = item.getQuantity().intValue();
             for (int i = 0; i < quantity; i++) {
-                AssetMain assetMain = buildAssetMain(item, applicationId, assetTypeId, storageDate);
+                AssetMain assetMain = buildAssetMain(item, applicationId, assetTypeId, storageDate, baseDto);
                 assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode());
                 assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
                 assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
@@ -157,7 +175,7 @@
     /**
      * 保存房产资产数据
      */
-    private void savePropertyAssets(List<OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+    private void savePropertyAssets(List<OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) {
         List<AssetMain> allAssetMains = new ArrayList<>();
         List<AssetPropertyExt> allPropertyExts = new ArrayList<>();
         
@@ -165,7 +183,7 @@
             // 根据数量创建对应数量的资产记录
             int quantity = item.getQuantity().intValue();
             for (int i = 0; i < quantity; i++) {
-                AssetMain assetMain = buildAssetMainFromProperty(item, applicationId, assetTypeId, storageDate);
+                AssetMain assetMain = buildAssetMainFromProperty(item, applicationId, assetTypeId, storageDate, baseDto);
                 assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode());
                 assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
                 assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
@@ -193,7 +211,7 @@
     /**
      * 保存车辆资产数据
      */
-    private void saveVehicleAssets(List<OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+    private void saveVehicleAssets(List<OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) {
         List<AssetMain> allAssetMains = new ArrayList<>();
         List<AssetVehicleExt> allVehicleExts = new ArrayList<>();
         
@@ -201,7 +219,7 @@
             // 根据数量创建对应数量的资产记录
             int quantity = item.getQuantity().intValue();
             for (int i = 0; i < quantity; i++) {
-                AssetMain assetMain = buildAssetMainFromVehicle(item, applicationId, assetTypeId, storageDate);
+                AssetMain assetMain = buildAssetMainFromVehicle(item, applicationId, assetTypeId, storageDate, baseDto);
                 assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode());
                 assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
                 assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
@@ -229,7 +247,7 @@
     /**
      * 构建通用资产主表数据
      */
-    private AssetMain buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+    private AssetMain buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) {
         AssetMain assetMain = new AssetMain();
         assetMain.setApprovalApplicationId(applicationId.intValue());
         assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
@@ -242,10 +260,9 @@
         assetMain.setUsefulLife(item.getUsefulLife());
         assetMain.setOwnershipDeptId(item.getOwnershipDeptId());
         assetMain.setUserName(item.getUserName());
-        assetMain.setUseDeptId(item.getUseDeptId());
-        assetMain.setWarehouseId(item.getWarehouseId());
-        assetMain.setWarehouseName(item.getWarehouseName());
-        assetMain.setAddress(item.getAddress());
+        // 根据整单 addressType 写入使用部门ID或仓库ID
+        applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress());
+        assetMain.setAssetMainType(baseDto.getAddressType());
         assetMain.setAssetStatus(item.getAssetStatus());
         assetMain.setRemarks(item.getRemarks());
         assetMain.setAccountingStatus(item.getAccountingStatus());
@@ -260,7 +277,7 @@
     /**
      * 构建房产资产主表数据
      */
-    private AssetMain buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+    private AssetMain buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) {
         AssetMain assetMain = new AssetMain();
         assetMain.setApprovalApplicationId(applicationId.intValue());
         assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
@@ -273,10 +290,8 @@
         assetMain.setUsefulLife(item.getUsefulLife());
         assetMain.setOwnershipDeptId(item.getOwnershipDeptId());
         assetMain.setUserName(item.getUserName());
-        assetMain.setUseDeptId(item.getUseDeptId());
-        assetMain.setWarehouseId(item.getWarehouseId());
-        assetMain.setWarehouseName(item.getWarehouseName());
-        assetMain.setAddress(item.getAddress());
+        applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress());
+        assetMain.setAssetMainType(baseDto.getAddressType());
         assetMain.setAssetStatus(item.getAssetStatus());
         assetMain.setRemarks(item.getRemarks());
         assetMain.setAccountingStatus(item.getAccountingStatus());
@@ -291,7 +306,7 @@
     /**
      * 构建车辆资产主表数据
      */
-    private AssetMain buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+    private AssetMain buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) {
         AssetMain assetMain = new AssetMain();
         assetMain.setApprovalApplicationId(applicationId.intValue());
         assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
@@ -304,10 +319,8 @@
         assetMain.setUsefulLife(item.getUsefulLife());
         assetMain.setOwnershipDeptId(item.getOwnershipDeptId());
         assetMain.setUserName(item.getUserName());
-        assetMain.setUseDeptId(item.getUseDeptId());
-        assetMain.setWarehouseId(item.getWarehouseId());
-        assetMain.setWarehouseName(item.getWarehouseName());
-        assetMain.setAddress(item.getAddress());
+        applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress());
+        assetMain.setAssetMainType(baseDto.getAddressType());
         assetMain.setAssetStatus(item.getAssetStatus());
         assetMain.setRemarks(item.getRemarks());
         assetMain.setAccountingStatus(item.getAccountingStatus());
@@ -317,6 +330,46 @@
         assetMain.setAccountingAmount(item.getAccountingAmount());
         assetMain.setDisabled(false);
         return assetMain;
+    }
+
+    /**
+     * 按整单地址类型设置资产主表位置信息(使用部门ID或仓库ID或地址)
+     */
+    private void applyAddressToAssetMain(AssetMain assetMain, Integer addressType, String useDeptName, String warehouseName, String address) {
+        if (addressType == null) {
+            return;
+        }
+        switch (addressType) {
+            case 0:
+                // 使用部门
+                if (useDeptName != null && !useDeptName.isEmpty()) {
+                    TDept dept = tDeptService.lambdaQuery()
+                            .eq(TDept::getDeptName, useDeptName)
+                            .one();
+                    if (dept != null) {
+                        assetMain.setUseDeptId(dept.getId());
+                    }
+                }
+                break;
+            case 1:
+                if (warehouseName != null && !warehouseName.isEmpty()) {
+                    AssetWarehouse warehouse = assetWarehouseService.lambdaQuery()
+                            .eq(AssetWarehouse::getWarehouseName, warehouseName)
+                            .one();
+                    if (warehouse != null) {
+                        assetMain.setWarehouseId(warehouse.getId());
+                        assetMain.setWarehouseName(warehouse.getWarehouseName());
+                    }
+                }
+                break;
+            case 2:
+                if (address != null && !address.isEmpty()) {
+                    assetMain.setAddress(address);
+                }
+                break;
+            default:
+                // ignore
+        }
     }
 
     /**
@@ -407,7 +460,7 @@
     private OaApprovalApplications buildOaApprovalApplications(Object dto) {
         OaApprovalApplications applications = new OaApprovalApplications();
         applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode());
-
+        applications.setApplicationDate(LocalDate.now());
         if (dto instanceof OaApprovalApplicationStorageGeneralDTO) {
             OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto;
             applications.setApplicantUserId(generalDTO.getApplicantUserId());
@@ -517,4 +570,10 @@
         
         return prefix + sequenceStr;
     }
+    
+    @Override
+    public IPage<OaApprovalApplicationStoragePageVO> getPageList(com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery pageQuery) {
+        Page<OaApprovalApplicationStoragePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
+        return this.baseMapper.selectApplicationStoragePage(page, pageQuery);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java
new file mode 100644
index 0000000..03360cc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java
@@ -0,0 +1,44 @@
+package com.ruoyi.system.vo.asset;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * 审批通过资产分页视图对象
+ */
+@Data
+@ApiModel("审批通过资产分页视图对象")
+public class AssetMainPageVO implements Serializable {
+    private static final long serialVersionUID = -1287342342234234234L;
+
+    @ApiModelProperty(value = "资产ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "资产编码")
+    private String assetCode;
+
+    @ApiModelProperty(value = "资产名称")
+    private String assetName;
+
+    @ApiModelProperty(value = "资产类型")
+    private String assetTypeName;
+
+    @ApiModelProperty(value = "归属部门")
+    private String ownershipDeptName;
+
+    @ApiModelProperty(value = "资产状态")
+    private String assetStatus;
+
+    @ApiModelProperty(value = "入库时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate storageTime;
+
+    @ApiModelProperty(value = "使用部门/位置")
+    private String useDeptOrLocation;
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java
new file mode 100644
index 0000000..d174a7a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java
@@ -0,0 +1,50 @@
+package com.ruoyi.system.vo.asset;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * 资产入库申请分页列表返回对象
+ */
+@Data
+@ApiModel("资产入库申请分页列表返回对象")
+public class OaApprovalApplicationStoragePageVO implements Serializable {
+    private static final long serialVersionUID = 4352345234523452345L;
+
+    @ApiModelProperty("主键ID")
+    private Integer id;
+
+    @ApiModelProperty("所属部门")
+    private String deptName;
+
+    @ApiModelProperty("入库单号")
+    private String applicationCode;
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("资产一级类型名称")
+    private String firstAssetTypeName;
+
+    @ApiModelProperty("资产二级类型名称")
+    private String secondAssetTypeName;
+
+    @ApiModelProperty("创建人(申请人)")
+    private String applicantName;
+
+    @ApiModelProperty("入库日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate storageTime;
+
+    @ApiModelProperty("入库类型 0-正常入库")
+    private Integer storageType;
+
+    @ApiModelProperty("审批状态 0-草稿,1-待审批,2-通过,3-拒绝,4-撤回")
+    private Integer approvalStatus;
+}
+
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
index 1ecd079..5bb2d5c 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
@@ -44,4 +44,53 @@
         id, approval_application_id, asset_original_code, asset_code, asset_name, specification_model, asset_type_id, asset_category, asset_main_type, measurement_unit, quantity, unit_price, total_value, useful_life, ownership_dept_id, user_name, use_dept_id, warehouse_id, warehouse_name, address, asset_status, remarks, accounting_status, accounting_date, accounting_voucher_no, accounting_subject, accounting_amount, attachment_urls, create_time, create_by, update_time, update_by, disabled
     </sql>
 
+    <!-- 分页查询:审批通过的资产列表(关联审批记录、资产类型与部门) -->
+    <select id="selectApprovedAssetPage" resultType="com.ruoyi.system.vo.asset.AssetMainPageVO">
+        SELECT
+            am.id AS id,
+            am.asset_code AS assetCode,
+            am.asset_name AS assetName,
+            at.type_name AS assetTypeName,
+            od.dept_name AS ownershipDeptName,
+            am.asset_status AS assetStatus,
+            oas.storage_time AS storageTime,
+            CASE
+                WHEN am.address_type = 0 THEN
+                ud.dept_name
+                WHEN am.address_type = 1 THEN
+                am.warehouse_name
+                WHEN am.address_type = 2 THEN
+                am.address
+                ELSE ''
+            END AS useDeptOrLocation
+        FROM asset_main am
+            INNER JOIN oa_approval_applications aaa ON aaa.id = am.approval_application_id
+            LEFT JOIN oa_approval_application_storage oas ON oas.approval_application_id = am.approval_application_id
+            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
+        <where>
+            AND IFNULL(am.disabled, 0) = 0
+            AND IFNULL(aaa.disabled, 0) = 0
+            AND aaa.approval_status = 2 AND aaa.approval_id = '${@com.ruoyi.system.emums.ApprovalTypeEnum@IN_STOCK.getCode()}'
+            AND IFNULL(am.is_disposed, 0) = 0
+            AND IFNULL(am.is_in_use, 0) = 0
+            AND IFNULL(am.is_borrowed, 0) = 0
+            <if test="query != null and query.assetTypeId != null">
+                AND am.asset_type_id = #{query.assetTypeId}
+            </if>
+            <if test="query != null and query.ownershipDeptId != null">
+                AND am.ownership_dept_id = #{query.ownershipDeptId}
+            </if>
+            <if test="query != null and query.assetStatus != null and query.assetStatus != ''">
+                AND am.asset_status = #{query.assetStatus}
+            </if>
+            <if test="query != null and query.keyword != null and query.keyword != ''">
+                AND (am.asset_name LIKE CONCAT('%', #{query.keyword}, '%')
+                OR am.asset_code LIKE CONCAT('%', #{query.keyword}, '%'))
+            </if>
+        </where>
+        ORDER BY COALESCE(oas.storage_time, DATE(am.create_time)) DESC, am.id DESC
+    </select>
+
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml
index 65e8625..119f496 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml
@@ -17,4 +17,34 @@
         id, approval_application_id, title, asset_type_id, storage_type, storage_time
     </sql>
 
+    <!-- 分页查询:资产入库申请列表(关联审批记录与资产类型) -->
+    <select id="selectApplicationStoragePage" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO">
+        SELECT
+            oas.id                               AS id,
+            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
+        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)
+        <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}, '%')
+                )
+            </if>
+        </where>
+        ORDER BY oas.storage_time DESC, oas.id DESC
+    </select>
+
 </mapper>

--
Gitblit v1.7.1