From 2aa0dd9c34c6be86e70b1d2d939d3660552cb514 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期三, 17 九月 2025 14:44:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java                                  |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetTypeService.java                              |   41 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java                              |   57 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetTypeDTO.java                                |   37 
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                                        |   16 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetTypeController.java                        |   59 +
 ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetTypeEnum.java                                   |   23 
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java                          |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java  |  504 ++++++++++++
 pom.xml                                                                                                |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationPurchase.java                   |    5 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationPurchaseController.java    |   28 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java     |  155 +++
 ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml                                        |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java                     |  246 ++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java           |   23 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java      |  129 +++
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetType.java                                       |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java                   |   50 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java      |  138 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java                               |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java |  143 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java     |   51 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java                                  |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java                                       |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/query/AssetWarehousePageQuery.java                         |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalTypeEnum.java                                |   37 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryRecord.java                            |   25 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java            |  107 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java                         |   26 
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalTodoService.java                         |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetWarehouseDTO.java                           |   47 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java             |   67 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalFlowNode.java                              |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java                       |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalStatusEnum.java                              |   25 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetWarehouseVO.java                             |   49 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalTodo.java                                  |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalTodoServiceImpl.java                |  142 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java                |  102 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationPurchaseService.java          |    7 
 41 files changed, 2,415 insertions(+), 35 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1bceba9..0e23835 100644
--- a/pom.xml
+++ b/pom.xml
@@ -166,7 +166,6 @@
         <module>ruoyi-quartz</module>
         <module>ruoyi-generator</module>
         <module>ruoyi-common</module>
-        <module>ruoyi-applet</module>
     </modules>
     <packaging>pom</packaging>
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetTypeController.java
index 34f52b3..6d6c444 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetTypeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetTypeController.java
@@ -1,8 +1,25 @@
 package com.ruoyi.web.controller.api;
 
-
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.dto.asset.AssetTypeDTO;
+import com.ruoyi.system.service.AssetTypeService;
+import com.ruoyi.system.vo.asset.AssetTypeTreeVO;
+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;
+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;
+import java.util.List;
 
 /**
  * <p>
@@ -12,9 +29,49 @@
  * @author WuGuanFengYue
  * @since 2025-09-15
  */
+@Api(tags = {"资产-资产类型管理相关接口"})
+@Validated
 @RestController
 @RequestMapping("/asset-type")
+@RequiredArgsConstructor
 public class AssetTypeController {
 
+    private final AssetTypeService assetTypeService;
+
+    @ApiOperation("获取资产类型树形数据")
+    @GetMapping("/tree")
+    public R<List<AssetTypeTreeVO>> getAssetTypeTree() {
+        List<AssetTypeTreeVO> treeData = assetTypeService.getAssetTypeTree();
+        return R.ok(treeData);
+    }
+
+    @ApiOperation("新增资产类型")
+    @PostMapping("/add")
+    public R<Void> addAssetType(@Valid @RequestBody AssetTypeDTO dto) {
+        assetTypeService.addAssetType(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("编辑资产类型")
+    @PutMapping("/edit")
+    public R<Void> editAssetType(@Valid @RequestBody AssetTypeDTO dto) {
+        assetTypeService.editAssetType(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("删除资产类型")
+    @DeleteMapping("/{id}")
+    public R<Void> deleteAssetType(@ApiParam(name = "id", value = "资产类型ID", required = true) @PathVariable Integer id) {
+        assetTypeService.deleteAssetType(id);
+        return R.ok();
+    }
+
+    @ApiOperation("批量删除资产类型")
+    @PostMapping("/batch-delete")
+    public R<Void> batchDeleteAssetType(@RequestBody List<Integer> ids) {
+        assetTypeService.batchDeleteAssetType(ids);
+        return R.ok();
+    }
+    
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java
index a12aa88..071962b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetWarehouseController.java
@@ -1,8 +1,26 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.dto.asset.AssetWarehouseDTO;
+import com.ruoyi.system.query.AssetWarehousePageQuery;
+import com.ruoyi.system.service.AssetWarehouseService;
+import com.ruoyi.system.vo.asset.AssetWarehouseVO;
+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.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+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>
@@ -12,9 +30,41 @@
  * @author WuGuanFengYue
  * @since 2025-09-15
  */
+@Api(tags = {"资产-仓库管理相关接口"})
+@Validated
 @RestController
 @RequestMapping("/asset-warehouse")
+@RequiredArgsConstructor
 public class AssetWarehouseController {
+    private final AssetWarehouseService assetWarehouseService;
+
+    @ApiOperation("获取仓库分页列表")
+    @PostMapping("/page-list")
+    public R<IPage<AssetWarehouseVO>> getPageList(@RequestBody AssetWarehousePageQuery pageQuery) {
+        IPage<AssetWarehouseVO> page = assetWarehouseService.getPageList(pageQuery);
+        return R.ok(page);
+    }
+
+    @ApiOperation("新增仓库")
+    @PostMapping("/add")
+    public R<Void> addWarehouse(@Valid @RequestBody AssetWarehouseDTO dto) {
+        assetWarehouseService.add(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("编辑仓库")
+    @PutMapping("/add")
+    public R<Void> editWarehouse(@Valid @RequestBody AssetWarehouseDTO dto) {
+        assetWarehouseService.edit(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("删除仓库")
+    @DeleteMapping("/{id}")
+    public R<Void> deleteWarehouse(@ApiParam(name = "id", value = "仓库ID", required = true) @PathVariable Integer id) {
+        assetWarehouseService.delete(id);
+        return R.ok();
+    }
 
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationPurchaseController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationPurchaseController.java
index 5e3a213..0bdf9c3 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationPurchaseController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationPurchaseController.java
@@ -1,8 +1,20 @@
 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.OaApprovalApplicationPurchaseDTO;
+import com.ruoyi.system.service.OaApprovalApplicationPurchaseService;
+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>
@@ -12,9 +24,23 @@
  * @author WuGuanFengYue
  * @since 2025-09-15
  */
+@Api(tags = {"OA审批-采购申请相关接口"})
+@Validated
 @RestController
 @RequestMapping("/oa-approval-application-purchase")
+@RequiredArgsConstructor
 public class OaApprovalApplicationPurchaseController {
 
+    private final OaApprovalApplicationPurchaseService oaApprovalApplicationPurchaseService;
+
+    @ApiOperation("提交采购申请")
+    @PostMapping("/submit")
+    @Log(title = "采购申请-提交", businessType = BusinessType.INSERT)
+    public R<Void> saveOrSubmit(@Valid @RequestBody OaApprovalApplicationPurchaseDTO dto) {
+        oaApprovalApplicationPurchaseService.submit(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 449a6ac..483dcdb 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,20 +1,61 @@
 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.OaApprovalApplicationStorageGeneralDTO;
+import com.ruoyi.system.dto.asset.OaApprovalApplicationStoragePropertyDTO;
+import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageVehicleDTO;
+import com.ruoyi.system.service.OaApprovalApplicationStorageService;
+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
+ * @author CodeBuddy
+ * @since 2025-09-17
  */
+@Api(tags = {"OA审批-资产入库申请相关接口"})
+@Validated
 @RestController
 @RequestMapping("/oa-approval-application-storage")
+@RequiredArgsConstructor
 public class OaApprovalApplicationStorageController {
 
-}
+    private final OaApprovalApplicationStorageService oaApprovalApplicationStorageService;
 
+    @ApiOperation("提交通用资产入库申请")
+    @PostMapping("/submit-general")
+    @Log(title = "通用资产入库申请-提交", businessType = BusinessType.INSERT)
+    public R<Void> submitGeneralAssetStorage(@Valid @RequestBody OaApprovalApplicationStorageGeneralDTO dto) {
+        oaApprovalApplicationStorageService.submitGeneralAssetStorage(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("提交房产资产入库申请")
+    @PostMapping("/submit-property")
+    @Log(title = "房产资产入库申请-提交", businessType = BusinessType.INSERT)
+    public R<Void> submitPropertyAssetStorage(@Valid @RequestBody OaApprovalApplicationStoragePropertyDTO dto) {
+        oaApprovalApplicationStorageService.submitPropertyAssetStorage(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("提交车辆资产入库申请")
+    @PostMapping("/submit-vehicle")
+    @Log(title = "车辆资产入库申请-提交", businessType = BusinessType.INSERT)
+    public R<Void> submitVehicleAssetStorage(@Valid @RequestBody OaApprovalApplicationStorageVehicleDTO dto) {
+        oaApprovalApplicationStorageService.submitVehicleAssetStorage(dto);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetTypeDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetTypeDTO.java
new file mode 100644
index 0000000..9c95616
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetTypeDTO.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 资产类型数据传输对象
+ *
+ * @author WuGuanFengYue
+ * @date 2025/9/15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel("资产类型数据传输对象")
+public class AssetTypeDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "资产类型ID,编辑时必填")
+    private Integer id;
+
+    @ApiModelProperty(value = "父级资产类型ID,为空则添加一级资产类型")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "资产类型名称", required = true)
+    @NotBlank(message = "资产类型名称不能为空")
+    private String typeName;
+
+    @ApiModelProperty(value = "资产简写", required = true)
+    @NotBlank(message = "资产简写不能为空")
+    private String typeCode;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetWarehouseDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetWarehouseDTO.java
new file mode 100644
index 0000000..5d3b5bb
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetWarehouseDTO.java
@@ -0,0 +1,47 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author mitao
+ * @date 2025/9/15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel("仓库数据传输对象")
+public class AssetWarehouseDTO implements Serializable {
+
+    private static final long serialVersionUID = -64233615037814733L;
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "仓库名称")
+    @NotBlank(message = "仓库名称不能为空")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "权属部门ID")
+    private Integer deptId;
+
+    @ApiModelProperty(value = "面积(平方米)")
+    private BigDecimal area;
+
+    @ApiModelProperty(value = "位置")
+    private String location;
+
+    @ApiModelProperty(value = "负责人姓名")
+    @NotBlank(message = "负责人姓名不能为空")
+    private String managerName;
+
+    @ApiModelProperty(value = "联系电话")
+    @NotBlank(message = "联系电话不能为空")
+    private String managerPhone;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java
new file mode 100644
index 0000000..5a5c334
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java
@@ -0,0 +1,107 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 采购申请DTO
+ *
+ * @author Claude
+ * @since 2025-09-16
+ */
+@Data
+@ApiModel(value = "OaApprovalApplicationPurchaseDTO", description = "采购申请DTO")
+public class OaApprovalApplicationPurchaseDTO {
+
+    @ApiModelProperty(value = "审批ID")
+    @NotNull(message = "审批ID不能为空")
+    private Integer approvalId;
+
+    @ApiModelProperty(value = "申请部门ID")
+    @NotNull(message = "申请部门不能为空")
+    private Integer deptId;
+
+    @ApiModelProperty(value = "申请部门名称")
+    @NotBlank(message = "申请部门名称不能为空")
+    private String deptName;
+
+    @ApiModelProperty(value = "申请人ID")
+    @NotNull(message = "申请人不能为空")
+    private Integer applicantUserId;
+
+    @ApiModelProperty(value = "申请人姓名")
+    @NotBlank(message = "申请人姓名不能为空")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请日期")
+    @NotNull(message = "申请日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate applicationDate;
+
+    @ApiModelProperty(value = "采购说明")
+    @NotBlank(message = "采购说明不能为空")
+    @Size(max = 500, message = "采购说明不能超过500字符")
+    private String applicationReason;
+
+    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
+    private String attachmentUrl;
+
+    @ApiModelProperty(value = "事项标题")
+    @NotBlank(message = "事项标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "资产类型ID")
+    @NotNull(message = "资产类型不能为空")
+    private Integer assetTypeId;
+
+    @ApiModelProperty(value = "采购总金额")
+    @NotNull(message = "采购总金额不能为空")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "采购资产明细列表")
+    @Valid
+    @Size(min = 1, message = "采购资产明细不能为空")
+    private List<PurchaseItemDTO> purchaseItems;
+
+    @Data
+    @ApiModel(value = "PurchaseItemDTO", description = "采购资产明细DTO")
+    public static class PurchaseItemDTO {
+
+        @ApiModelProperty(value = "资产名称")
+        @NotBlank(message = "资产名称不能为空")
+        private String assetName;
+
+        @ApiModelProperty(value = "资产类型ID")
+        @NotNull(message = "资产类型不能为空")
+        private Integer assetTypeId;
+
+        @ApiModelProperty(value = "规格型号")
+        private String spec;
+
+        @ApiModelProperty(value = "计量单位")
+        @NotBlank(message = "计量单位不能为空")
+        private String unit;
+
+        @ApiModelProperty(value = "数量")
+        @NotNull(message = "数量不能为空")
+        private Integer quantity;
+
+        @ApiModelProperty(value = "单价")
+        @NotNull(message = "单价不能为空")
+        private BigDecimal price;
+
+        @ApiModelProperty(value = "总金额")
+        @NotNull(message = "总金额不能为空")
+        private BigDecimal totalAmount;
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..8aef70f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java
@@ -0,0 +1,67 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.time.LocalDate;
+
+/**
+ * 资产入库申请基础DTO
+ *
+ * @author CodeBuddy
+ * @since 2025-09-17
+ */
+@Data
+@ApiModel(value = "OaApprovalApplicationStorageDTO", description = "资产入库申请基础DTO")
+public class OaApprovalApplicationStorageDTO {
+
+    @ApiModelProperty(value = "申请部门ID")
+    @NotNull(message = "申请部门不能为空")
+    private Integer deptId;
+
+    @ApiModelProperty(value = "申请部门名称")
+    @NotBlank(message = "申请部门名称不能为空")
+    private String deptName;
+
+    @ApiModelProperty(value = "申请人ID")
+    @NotNull(message = "申请人不能为空")
+    private Integer applicantUserId;
+
+    @ApiModelProperty(value = "申请人姓名")
+    @NotBlank(message = "申请人姓名不能为空")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请日期")
+    @NotNull(message = "申请日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate applicationDate;
+
+    @ApiModelProperty(value = "入库备注")
+    @Size(max = 500, message = "入库备注不能超过500字符")
+    private String applicationReason;
+
+    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
+    private String attachmentUrl;
+
+    @ApiModelProperty(value = "事项标题")
+    @NotBlank(message = "事项标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "资产类型ID")
+    @NotNull(message = "资产类型不能为空")
+    private Integer assetTypeId;
+
+    @ApiModelProperty(value = "入库类型 0-正常入库")
+    @NotNull(message = "入库类型不能为空")
+    private Boolean storageType;
+
+    @ApiModelProperty(value = "入库日期")
+    @NotNull(message = "入库日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate storageTime;
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..3848cb6
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java
@@ -0,0 +1,138 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 通用资产入库申请DTO
+ *
+ * @author CodeBuddy
+ * @since 2025-09-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "OaApprovalApplicationStorageGeneralDTO", description = "通用资产入库申请DTO")
+public class OaApprovalApplicationStorageGeneralDTO extends OaApprovalApplicationStorageDTO {
+
+    @ApiModelProperty(value = "通用资产明细列表")
+    @Valid
+    @Size(min = 1, message = "资产明细不能为空")
+    private List<GeneralAssetItemDTO> assetItems;
+
+    @Data
+    @ApiModel(value = "GeneralAssetItemDTO", description = "通用资产明细DTO")
+    public static class GeneralAssetItemDTO {
+
+        // 资产主表字段
+        @ApiModelProperty(value = "资产原编码")
+        private String assetOriginalCode;
+
+        @ApiModelProperty(value = "资产名称")
+        @NotBlank(message = "资产名称不能为空")
+        private String assetName;
+
+        @ApiModelProperty(value = "规格型号")
+        private String specificationModel;
+
+        @ApiModelProperty(value = "计量单位")
+        @NotBlank(message = "计量单位不能为空")
+        private String measurementUnit;
+
+        @ApiModelProperty(value = "数量")
+        @NotNull(message = "数量不能为空")
+        private BigDecimal quantity;
+
+        @ApiModelProperty(value = "单价")
+        @NotNull(message = "单价不能为空")
+        private BigDecimal unitPrice;
+
+        @ApiModelProperty(value = "使用年限(年)")
+        private Integer usefulLife;
+
+        @ApiModelProperty(value = "权属单位/部门ID")
+        private Integer ownershipDeptId;
+
+        @ApiModelProperty(value = "使用人")
+        private String userName;
+
+        @ApiModelProperty(value = "使用部门/位置ID")
+        private Integer useDeptId;
+
+        @ApiModelProperty(value = "仓库ID")
+        private Integer warehouseId;
+
+        @ApiModelProperty(value = "仓库名称")
+        private String warehouseName;
+
+        @ApiModelProperty(value = "所在位置")
+        private String address;
+
+        @ApiModelProperty(value = "资产状态")
+        private String assetStatus;
+
+        @ApiModelProperty(value = "备注")
+        private String remarks;
+
+        @ApiModelProperty(value = "入账状态")
+        private String accountingStatus;
+
+        @ApiModelProperty(value = "入账时间")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate accountingDate;
+
+        @ApiModelProperty(value = "会计凭证号")
+        private String accountingVoucherNo;
+
+        @ApiModelProperty(value = "会计科目")
+        private String accountingSubject;
+
+        @ApiModelProperty(value = "入账金额")
+        private BigDecimal accountingAmount;
+
+        // 通用资产扩展表字段
+        @ApiModelProperty(value = "供应商名称")
+        private String supplierName;
+
+        @ApiModelProperty(value = "采购日期")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate purchaseDate;
+
+        @ApiModelProperty(value = "保修期(月)")
+        private Integer warrantyPeriod;
+
+        @ApiModelProperty(value = "保修到期日期")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate warrantyExpireDate;
+
+        @ApiModelProperty(value = "折旧方法")
+        private String depreciationMethod;
+
+        @ApiModelProperty(value = "折旧率")
+        private BigDecimal depreciationRate;
+
+        @ApiModelProperty(value = "净值")
+        private BigDecimal netValue;
+
+        @ApiModelProperty(value = "维护周期(月)")
+        private Integer maintenanceCycle;
+
+        @ApiModelProperty(value = "上次维护日期")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate lastMaintenanceDate;
+
+        @ApiModelProperty(value = "下次维护日期")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate nextMaintenanceDate;
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..06ec290
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java
@@ -0,0 +1,155 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 房产资产入库申请DTO
+ *
+ * @author CodeBuddy
+ * @since 2025-09-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "OaApprovalApplicationStoragePropertyDTO", description = "房产资产入库申请DTO")
+public class OaApprovalApplicationStoragePropertyDTO extends OaApprovalApplicationStorageDTO {
+
+    @ApiModelProperty(value = "房产资产明细列表")
+    @Valid
+    @Size(min = 1, message = "资产明细不能为空")
+    private List<PropertyAssetItemDTO> assetItems;
+
+    @Data
+    @ApiModel(value = "PropertyAssetItemDTO", description = "房产资产明细DTO")
+    public static class PropertyAssetItemDTO {
+
+        // 资产主表字段
+        @ApiModelProperty(value = "资产原编码")
+        private String assetOriginalCode;
+
+        @ApiModelProperty(value = "资产名称")
+        @NotBlank(message = "资产名称不能为空")
+        private String assetName;
+
+        @ApiModelProperty(value = "规格型号")
+        private String specificationModel;
+
+        @ApiModelProperty(value = "计量单位")
+        @NotBlank(message = "计量单位不能为空")
+        private String measurementUnit;
+
+        @ApiModelProperty(value = "数量")
+        @NotNull(message = "数量不能为空")
+        private BigDecimal quantity;
+
+        @ApiModelProperty(value = "单价")
+        @NotNull(message = "单价不能为空")
+        private BigDecimal unitPrice;
+
+        @ApiModelProperty(value = "使用年限(年)")
+        private Integer usefulLife;
+
+        @ApiModelProperty(value = "权属单位/部门ID")
+        private Integer ownershipDeptId;
+
+        @ApiModelProperty(value = "使用人")
+        private String userName;
+
+        @ApiModelProperty(value = "使用部门/位置ID")
+        private Integer useDeptId;
+
+        @ApiModelProperty(value = "仓库ID")
+        private Integer warehouseId;
+
+        @ApiModelProperty(value = "仓库名称")
+        private String warehouseName;
+
+        @ApiModelProperty(value = "所在位置")
+        private String address;
+
+        @ApiModelProperty(value = "资产状态")
+        private String assetStatus;
+
+        @ApiModelProperty(value = "备注")
+        private String remarks;
+
+        @ApiModelProperty(value = "入账状态")
+        private String accountingStatus;
+
+        @ApiModelProperty(value = "入账时间")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate accountingDate;
+
+        @ApiModelProperty(value = "会计凭证号")
+        private String accountingVoucherNo;
+
+        @ApiModelProperty(value = "会计科目")
+        private String accountingSubject;
+
+        @ApiModelProperty(value = "入账金额")
+        private BigDecimal accountingAmount;
+
+        // 房产资产扩展表字段
+        @ApiModelProperty(value = "所在区域")
+        private String region;
+
+        @ApiModelProperty(value = "设计用途")
+        private String designPurpose;
+
+        @ApiModelProperty(value = "楼栋")
+        private String building;
+
+        @ApiModelProperty(value = "房间号")
+        private String roomNumber;
+
+        @ApiModelProperty(value = "建筑面积(平方米)")
+        private BigDecimal constructionArea;
+
+        @ApiModelProperty(value = "结构")
+        private String structureType;
+
+        @ApiModelProperty(value = "权证编号")
+        private String certificateNumber;
+
+        @ApiModelProperty(value = "建成年月")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate completionDate;
+
+        @ApiModelProperty(value = "详细位置")
+        private String detailedLocation;
+
+        @ApiModelProperty(value = "省资产平台填报价值")
+        private BigDecimal provincialPlatformValue;
+
+        @ApiModelProperty(value = "安置情况")
+        private String resettlementSituation;
+
+        @ApiModelProperty(value = "是否抵押:0-否,1-是")
+        private Boolean isMortgaged;
+
+        @ApiModelProperty(value = "承租方")
+        private String tenantName;
+
+        @ApiModelProperty(value = "租金")
+        private BigDecimal rentalAmount;
+
+        @ApiModelProperty(value = "租赁期限起")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate leaseStartDate;
+
+        @ApiModelProperty(value = "租赁期限止")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate leaseEndDate;
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..e0d5a2a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java
@@ -0,0 +1,129 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 车辆资产入库申请DTO
+ *
+ * @author CodeBuddy
+ * @since 2025-09-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "OaApprovalApplicationStorageVehicleDTO", description = "车辆资产入库申请DTO")
+public class OaApprovalApplicationStorageVehicleDTO extends OaApprovalApplicationStorageDTO {
+
+    @ApiModelProperty(value = "车辆资产明细列表")
+    @Valid
+    @Size(min = 1, message = "资产明细不能为空")
+    private List<VehicleAssetItemDTO> assetItems;
+
+    @Data
+    @ApiModel(value = "VehicleAssetItemDTO", description = "车辆资产明细DTO")
+    public static class VehicleAssetItemDTO {
+
+        // 资产主表字段
+        @ApiModelProperty(value = "资产原编码")
+        private String assetOriginalCode;
+
+        @ApiModelProperty(value = "资产名称")
+        @NotBlank(message = "资产名称不能为空")
+        private String assetName;
+
+        @ApiModelProperty(value = "规格型号")
+        private String specificationModel;
+
+        @ApiModelProperty(value = "计量单位")
+        @NotBlank(message = "计量单位不能为空")
+        private String measurementUnit;
+
+        @ApiModelProperty(value = "数量")
+        @NotNull(message = "数量不能为空")
+        private BigDecimal quantity;
+
+        @ApiModelProperty(value = "单价")
+        @NotNull(message = "单价不能为空")
+        private BigDecimal unitPrice;
+
+        @ApiModelProperty(value = "使用年限(年)")
+        private Integer usefulLife;
+
+        @ApiModelProperty(value = "权属单位/部门ID")
+        private Integer ownershipDeptId;
+
+        @ApiModelProperty(value = "使用人")
+        private String userName;
+
+        @ApiModelProperty(value = "使用部门/位置ID")
+        private Integer useDeptId;
+
+        @ApiModelProperty(value = "仓库ID")
+        private Integer warehouseId;
+
+        @ApiModelProperty(value = "仓库名称")
+        private String warehouseName;
+
+        @ApiModelProperty(value = "所在位置")
+        private String address;
+
+        @ApiModelProperty(value = "资产状态")
+        private String assetStatus;
+
+        @ApiModelProperty(value = "备注")
+        private String remarks;
+
+        @ApiModelProperty(value = "入账状态")
+        private String accountingStatus;
+
+        @ApiModelProperty(value = "入账时间")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate accountingDate;
+
+        @ApiModelProperty(value = "会计凭证号")
+        private String accountingVoucherNo;
+
+        @ApiModelProperty(value = "会计科目")
+        private String accountingSubject;
+
+        @ApiModelProperty(value = "入账金额")
+        private BigDecimal accountingAmount;
+
+        // 车辆资产扩展表字段
+        @ApiModelProperty(value = "车牌号")
+        private String licensePlate;
+
+        @ApiModelProperty(value = "车辆识别代码")
+        private String vinCode;
+
+        @ApiModelProperty(value = "发动机号")
+        private String engineNumber;
+
+        @ApiModelProperty(value = "排量")
+        private String displacement;
+
+        @ApiModelProperty(value = "编制情况")
+        private String staffingSituation;
+
+        @ApiModelProperty(value = "产地")
+        private String origin;
+
+        @ApiModelProperty(value = "取得日期")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        private LocalDate acquisitionDate;
+
+        @ApiModelProperty(value = "产权形式")
+        private String propertyRightForm;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalStatusEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalStatusEnum.java
new file mode 100644
index 0000000..fb7738f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalStatusEnum.java
@@ -0,0 +1,25 @@
+package com.ruoyi.system.emums;
+
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum ApprovalStatusEnum {
+	DRAFT(0, "草稿"),
+	PENDING(1, "待审批"),
+	PASSED(2, "审批通过"),
+	REFUSED(3, "审批拒绝"),
+	CANCELED(4, "已撤回");
+
+	private final Integer code;
+	private final String desc;
+
+	public static ApprovalStatusEnum getEnumByCode(Integer code) {
+		for (ApprovalStatusEnum e : ApprovalStatusEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalTypeEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalTypeEnum.java
new file mode 100644
index 0000000..9adf171
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/emums/ApprovalTypeEnum.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.emums;
+
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum ApprovalTypeEnum {
+	LEAVE(1, "请假申请"),
+	OUT(2, "外出申请"),
+	BUSINESS_TRIP(3, "出差申请"),
+	LEAVE_DESTROY(4, "销假申请"),
+	PURCHASE(5, "采购申请"),
+	IN_STOCK(6, "资产入库"),
+	GRAB(7, "物品领用"),
+	BURROW(8, "物品借用"),
+	RETURN(9, "借用归还"),
+	ASSET_DISPOSE(10, "资产处置"),
+	ASSET_CHANGE(11, "资产表更"),
+	REIMBURSEMENT(12, "报销申请"),
+	MONEY(13, "款项申请"),
+	CONTRACT(14, "合同文件"),
+	PAYMENT(15, "进度款支付"),
+	CONTACT(16, "内部联系单"),
+	ADVERTISEMENT(17, "广告制作申请");
+
+	private final Integer code;
+	private final String desc;
+
+	public static ApprovalTypeEnum getEnumByCode(Integer code) {
+		for (ApprovalTypeEnum e : ApprovalTypeEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetTypeEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetTypeEnum.java
new file mode 100644
index 0000000..0fa8a1c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetTypeEnum.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.emums;
+
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum AssetTypeEnum {
+	GENERAL(0, "通用资产"),
+	HOUSE(1, "房产资产"),
+	VEHICLE(2, "车辆资产");
+
+	private final Integer code;
+	private final String desc;
+
+	public static AssetTypeEnum getEnumByCode(Integer code) {
+		for (AssetTypeEnum e : AssetTypeEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
index 384a9b6..f1944e6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
@@ -1,8 +1,9 @@
 package com.ruoyi.system.mapper;
 
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysDept;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 部门管理 数据层
@@ -115,4 +116,6 @@
      * @return 结果
      */
     public int deleteDeptById(Long deptId);
+
+    public List<SysDept> selectByIds(@Param("deptIds") List<Integer> deptIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index dcd74cf..087dcd0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -1,13 +1,13 @@
 package com.ruoyi.system.mapper;
 
-import java.util.List;
-
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.system.query.SysUserQuery;
 import com.ruoyi.system.vo.system.SysUserVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-import com.ruoyi.common.core.domain.entity.SysUser;
+
+import java.util.List;
 
 /**
  * 用户表 数据层
@@ -206,4 +206,11 @@
     Integer selectUserCount(@Param("projectIds")List<String> projectIds, @Param("deptType")Integer deptType);
 
     List<SysUser> selectUserByNickName(@Param("nickName")String nickName);
+
+    /**
+     * 根据用户id列表查询用户列表
+     * @param userIds
+     * @return
+     */
+    List<SysUser> selectListByUserIds(@Param("userIds") List<Integer> userIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryRecord.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryRecord.java
index 80682ab..2df7126 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryRecord.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryRecord.java
@@ -10,6 +10,7 @@
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -35,13 +36,35 @@
     @TableField("asset_main_id")
     private Integer assetMainId;
 
+    @ApiModelProperty(value = "仓库ID")
+    @TableField("warehouse_id")
+    private Integer warehouseId;
+
     @ApiModelProperty(value = "出入库类型 0-入库,1-出库")
     @TableField("type")
-    private Boolean type;
+    private Integer type;
 
     @ApiModelProperty(value = "备注(记录出入库类型,如资产入库、借用、借用归还、资产变更、领用、盘点、处置等)")
     @TableField("remarks")
     private String remarks;
 
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
 
+    @ApiModelProperty(value = "创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty(value = "是否删除 0-否,1-是")
+    @TableField("disabled")
+    private Boolean disabled;
 }
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 325f511..8be23d1 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
@@ -64,7 +64,7 @@
 
     @ApiModelProperty(value = "资产主类型:0-通用资产,1-房产资产,2-车辆资产")
     @TableField("asset_main_type")
-    private Boolean assetMainType;
+    private Integer assetMainType;
 
     @ApiModelProperty(value = "计量单位")
     @TableField("measurement_unit")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetType.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetType.java
index 278dfff..24fb685 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetType.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetType.java
@@ -66,7 +66,7 @@
 
     @ApiModelProperty(value = "是否删除 0-否,1-是")
     @TableField("disabled")
-    private Boolean disabled;
+    private Integer disabled;
 
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationPurchase.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationPurchase.java
index 163c0ba..53aab7e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationPurchase.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationPurchase.java
@@ -11,6 +11,7 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * <p>
@@ -40,6 +41,10 @@
     @TableField("title")
     private String title;
 
+    @ApiModelProperty(value = "申请日期")
+    @TableField("application_date")
+    private Date applicationDate;
+
     @ApiModelProperty(value = "资产类型")
     @TableField("asset_type_id")
     private Integer assetTypeId;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java
index 8510900..4e3b3a3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java
@@ -31,7 +31,7 @@
 
     @ApiModelProperty(value = "主键")
     @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
+    private Integer id;
 
     @ApiModelProperty(value = "申请单号")
     @TableField("application_code")
@@ -95,7 +95,7 @@
 
     @ApiModelProperty(value = "是否删除 0-否,1-是")
     @TableField("disabled")
-    private Boolean disabled;
+    private Integer disabled;
 
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalFlowNode.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalFlowNode.java
index efcb4ef..414940e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalFlowNode.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalFlowNode.java
@@ -50,7 +50,7 @@
 
     @ApiModelProperty(value = "审批类型 0-上级部门,1-指定部门审批,2-指定人员审批")
     @TableField("approval_type")
-    private Boolean approvalType;
+    private Integer approvalType;
 
     @ApiModelProperty(value = "审批类型上级部门为时为空,指定部门审批存部门id,指定人员审批存人员id,多个id使用英文逗号拼接")
     @TableField("approval_ids")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalTodo.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalTodo.java
index 13b1219..05f04aa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalTodo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalTodo.java
@@ -30,11 +30,11 @@
 
     @ApiModelProperty(value = "主键")
     @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
+    private Integer id;
 
     @ApiModelProperty(value = "申请ID")
     @TableField("application_id")
-    private Long applicationId;
+    private Integer applicationId;
 
     @ApiModelProperty(value = "申请单号")
     @TableField("application_code")
@@ -62,7 +62,7 @@
 
     @ApiModelProperty(value = "状态 0-待处理,1-已处理")
     @TableField("status")
-    private Boolean status;
+    private Integer status;
 
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetWarehousePageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetWarehousePageQuery.java
new file mode 100644
index 0000000..5d0f834
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetWarehousePageQuery.java
@@ -0,0 +1,20 @@
+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;
+
+/**
+ * @author mitao
+ * @date 2025/9/15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("仓库分页查询对象")
+public class AssetWarehousePageQuery extends BasePage {
+    private static final long serialVersionUID = -2968978743484299082L;
+    @ApiModelProperty("关键字" )
+    private String keyword;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetTypeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetTypeService.java
index ef81f11..a015c00 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetTypeService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetTypeService.java
@@ -1,7 +1,11 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.dto.asset.AssetTypeDTO;
 import com.ruoyi.system.model.AssetType;
+import com.ruoyi.system.vo.asset.AssetTypeTreeVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,41 @@
  */
 public interface AssetTypeService extends IService<AssetType> {
 
+    /**
+     * 获取资产类型树形数据
+     * @return 资产类型树形列表
+     */
+    List<AssetTypeTreeVO> getAssetTypeTree();
+
+    /**
+     * 新增资产类型
+     * @param dto 资产类型数据传输对象
+     */
+    void addAssetType(AssetTypeDTO dto);
+
+    /**
+     * 编辑资产类型
+     * @param dto 资产类型数据传输对象
+     */
+    void editAssetType(AssetTypeDTO dto);
+
+    /**
+     * 删除资产类型
+     * @param id 资产类型ID
+     */
+    void deleteAssetType(Integer id);
+
+    /**
+     * 批量删除资产类型
+     * @param ids 资产类型ID列表
+     */
+    void batchDeleteAssetType(List<Integer> ids);
+
+    /**
+     * 根据资产类型ID获取资产编码前缀
+     * @param assetTypeId 资产类型ID
+     * @return 资产编码前缀(一级分类简写+二级分类简写)
+     */
+    String getAssetCodePrefix(Integer assetTypeId);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java
index be89f95..ba42580 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetWarehouseService.java
@@ -1,7 +1,11 @@
 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.AssetWarehouseDTO;
 import com.ruoyi.system.model.AssetWarehouse;
+import com.ruoyi.system.query.AssetWarehousePageQuery;
+import com.ruoyi.system.vo.asset.AssetWarehouseVO;
 
 /**
  * <p>
@@ -12,5 +16,27 @@
  * @since 2025-09-15
  */
 public interface AssetWarehouseService extends IService<AssetWarehouse> {
+    /**
+     * 获取仓库分页列表
+     * @param pageQuery
+     * @return
+     */
+    IPage<AssetWarehouseVO> getPageList(AssetWarehousePageQuery pageQuery);
 
+    /**
+     * 添加仓库
+     * @param dto
+     */
+    void add(AssetWarehouseDTO dto);
+
+    /**
+     * 编辑仓库
+     * @param dto
+     */
+    void edit(AssetWarehouseDTO dto);
+    /**
+     * 删除仓库
+     * @param id
+     */
+    void delete(Integer id);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index 8ae3713..722cd55 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -1,11 +1,11 @@
 package com.ruoyi.system.service;
 
-import java.util.List;
-
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.system.query.SysUserQuery;
 import com.ruoyi.system.vo.system.SysUserVO;
+
+import java.util.List;
 
 /**
  * 用户 业务层
@@ -297,4 +297,11 @@
     Integer selectUserCount(List<String> projectId, Integer deptType);
 
     List<SysUser> selectUserByNickName(String nickName);
+
+    /**
+     * 根据用户id列表查询用户列表
+     * @param userIds
+     * @return
+     */
+    List<SysUser> selectListByUserIds(List<Integer> userIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationPurchaseService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationPurchaseService.java
index 844432e..13f37ef 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationPurchaseService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationPurchaseService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.dto.asset.OaApprovalApplicationPurchaseDTO;
 import com.ruoyi.system.model.OaApprovalApplicationPurchase;
 
 /**
@@ -13,4 +14,10 @@
  */
 public interface OaApprovalApplicationPurchaseService extends IService<OaApprovalApplicationPurchase> {
 
+    /**
+     * 保存或提交采购申请
+     *
+     * @param dto 采购申请DTO
+     */
+    void submit(OaApprovalApplicationPurchaseDTO 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 d976490..3c8ead4 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,6 +1,9 @@
 package com.ruoyi.system.service;
 
 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;
 
 /**
@@ -13,4 +16,24 @@
  */
 public interface OaApprovalApplicationStorageService extends IService<OaApprovalApplicationStorage> {
 
+    /**
+     * 提交通用资产入库申请
+     *
+     * @param dto 通用资产入库申请DTO
+     */
+    void submitGeneralAssetStorage(OaApprovalApplicationStorageGeneralDTO dto);
+
+    /**
+     * 提交房产资产入库申请
+     *
+     * @param dto 房产资产入库申请DTO
+     */
+    void submitPropertyAssetStorage(OaApprovalApplicationStoragePropertyDTO dto);
+
+    /**
+     * 提交车辆资产入库申请
+     *
+     * @param dto 车辆资产入库申请DTO
+     */
+    void submitVehicleAssetStorage(OaApprovalApplicationStorageVehicleDTO dto);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalTodoService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalTodoService.java
index a30c303..5b7f46d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalTodoService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalTodoService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.OaApprovalFlowNode;
 import com.ruoyi.system.model.OaApprovalTodo;
 
 /**
@@ -12,5 +13,13 @@
  * @since 2025-09-15
  */
 public interface OaApprovalTodoService extends IService<OaApprovalTodo> {
-
+    /**
+     * 根据流程节点与部门信息,创建对应审批待办
+     *
+     * @param applicationId   申请主表ID
+     * @param applicationCode 申请单号
+     * @param flowNode        当前流程节点配置
+     * @param deptId          申请部门ID(用于上级部门审批场景)
+     */
+    void createApprovalTodos(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, Integer deptId);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java
index 38a793d..583b616 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java
@@ -1,10 +1,27 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.AssetTypeDTO;
 import com.ruoyi.system.mapper.AssetTypeMapper;
+import com.ruoyi.system.model.AssetMain;
 import com.ruoyi.system.model.AssetType;
+import com.ruoyi.system.service.AssetMainService;
 import com.ruoyi.system.service.AssetTypeService;
+import com.ruoyi.system.vo.asset.AssetTypeTreeVO;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +32,235 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor
 public class AssetTypeServiceImpl extends ServiceImpl<AssetTypeMapper, AssetType> implements AssetTypeService {
 
+    private final AssetMainService assetMainService;
+
+    @Override
+    public List<AssetTypeTreeVO> getAssetTypeTree() {
+        // 查询所有未删除的资产类型数据
+        LambdaQueryWrapper<AssetType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByAsc(AssetType::getLevel)
+                .orderByAsc(AssetType::getId);
+        
+        List<AssetType> allAssetTypes = this.list(queryWrapper);
+        
+        if (CollUtil.isEmpty(allAssetTypes)) {
+            return new ArrayList<>();
+        }
+        
+        // 转换为VO对象
+        List<AssetTypeTreeVO> assetTypeVOs = BeanUtil.copyToList(allAssetTypes, AssetTypeTreeVO.class);
+        
+        // 按父级ID分组
+        Map<Integer, List<AssetTypeTreeVO>> parentIdMap = assetTypeVOs.stream()
+                .collect(Collectors.groupingBy(AssetTypeTreeVO::getParentId));
+        
+        // 构建树形结构
+        List<AssetTypeTreeVO> rootNodes = parentIdMap.get(0);
+        if (CollUtil.isEmpty(rootNodes)) {
+            return new ArrayList<>();
+        }
+        
+        // 为每个根节点设置子节点
+        for (AssetTypeTreeVO rootNode : rootNodes) {
+            List<AssetTypeTreeVO> children = parentIdMap.get(rootNode.getId());
+            rootNode.setChildren(children != null ? children : new ArrayList<>());
+        }
+        
+        return rootNodes;
+    }
+
+    @Override
+    public void addAssetType(AssetTypeDTO dto) {
+        // 校验资产类型名称是否重复
+        LambdaQueryWrapper<AssetType> nameQueryWrapper = new LambdaQueryWrapper<>();
+        nameQueryWrapper.eq(AssetType::getTypeName, dto.getTypeName());
+        AssetType existingByName = this.getOne(nameQueryWrapper);
+        if (Objects.nonNull(existingByName)) {
+            throw new ServiceException("资产类型名称已存在");
+        }
+
+        // 校验资产简写是否重复
+        LambdaQueryWrapper<AssetType> codeQueryWrapper = new LambdaQueryWrapper<>();
+        codeQueryWrapper.eq(AssetType::getTypeCode, dto.getTypeCode());
+        AssetType existingByCode = this.getOne(codeQueryWrapper);
+        if (Objects.nonNull(existingByCode)) {
+            throw new ServiceException("资产类型简写已存在");
+        }
+
+        // 创建资产类型对象
+        AssetType assetType = new AssetType();
+        assetType.setTypeName(dto.getTypeName());
+        assetType.setTypeCode(dto.getTypeCode());
+        
+        // 处理层级逻辑
+        if (Objects.isNull(dto.getParentId()) || dto.getParentId().equals(0)) {
+            // 添加一级资产类型
+            assetType.setParentId(0);
+            assetType.setLevel(1);
+        } else {
+            // 添加二级资产类型,先校验父级是否存在
+            AssetType parentAssetType = this.getById(dto.getParentId());
+            if (Objects.isNull(parentAssetType)) {
+                throw new ServiceException("父级资产类型不存在");
+            }
+            if (!parentAssetType.getLevel().equals(1)) {
+                throw new ServiceException("只能在一级资产类型下添加二级资产类型");
+            }
+            assetType.setParentId(dto.getParentId());
+            assetType.setLevel(2);
+        }
+
+        // 设置创建信息
+        String username = SecurityUtils.getUsername();
+        assetType.setCreateBy(username);
+        
+        // 保存资产类型
+        this.save(assetType);
+    }
+
+    @Override
+    public void editAssetType(AssetTypeDTO dto) {
+        // 校验资产类型ID是否为空
+        if (Objects.isNull(dto.getId())) {
+            throw new ServiceException("资产类型ID不能为空");
+        }
+
+        // 校验资产类型是否存在
+        AssetType existingAssetType = this.getById(dto.getId());
+        if (Objects.isNull(existingAssetType)) {
+            throw new ServiceException("资产类型不存在");
+        }
+
+        // 校验是否有关联的资产记录
+        LambdaQueryWrapper<AssetMain> assetMainQueryWrapper = new LambdaQueryWrapper<>();
+        assetMainQueryWrapper.eq(AssetMain::getAssetTypeId, dto.getId());
+        long assetMainCount = assetMainService.count(assetMainQueryWrapper);
+        if (assetMainCount > 0) {
+            throw new ServiceException("该资产类型已关联资产记录,不能编辑");
+        }
+
+        // 校验资产类型名称是否重复(排除自身)
+        LambdaQueryWrapper<AssetType> nameQueryWrapper = new LambdaQueryWrapper<>();
+        nameQueryWrapper.eq(AssetType::getTypeName, dto.getTypeName())
+                       .ne(AssetType::getId, dto.getId());
+        AssetType existingByName = this.getOne(nameQueryWrapper);
+        if (Objects.nonNull(existingByName)) {
+            throw new ServiceException("资产类型名称已存在");
+        }
+        
+        // 校验资产简写是否重复(排除自身)
+        LambdaQueryWrapper<AssetType> codeQueryWrapper = new LambdaQueryWrapper<>();
+        codeQueryWrapper.eq(AssetType::getTypeCode, dto.getTypeCode())
+                       .ne(AssetType::getId, dto.getId());
+        AssetType existingByCode = this.getOne(codeQueryWrapper);
+        if (Objects.nonNull(existingByCode)) {
+            throw new ServiceException("资产简写已存在");
+        }
+
+        // 更新资产类型信息
+        AssetType assetType = new AssetType();
+        assetType.setId(dto.getId());
+        assetType.setTypeName(dto.getTypeName());
+        assetType.setTypeCode(dto.getTypeCode());
+        
+        // 设置更新信息
+        String username = SecurityUtils.getUsername();
+        assetType.setUpdateBy(username);
+        
+        // 更新资产类型
+        this.updateById(assetType);
+    }
+
+    @Override
+    public void deleteAssetType(Integer id) {
+        // 校验资产类型ID是否为空
+        if (Objects.isNull(id)) {
+            throw new ServiceException("资产类型ID不能为空");
+        }
+
+        // 校验资产类型是否存在
+        AssetType existingAssetType = this.getById(id);
+        if (Objects.isNull(existingAssetType)) {
+            throw new ServiceException("资产类型不存在");
+        }
+
+        // 校验是否有子类型
+        LambdaQueryWrapper<AssetType> childQueryWrapper = new LambdaQueryWrapper<>();
+        childQueryWrapper.eq(AssetType::getParentId, id);
+        long childCount = this.count(childQueryWrapper);
+        if (childCount > 0) {
+            throw new ServiceException(String.format("【%s】存在子类型,不能删除", existingAssetType.getTypeName()));
+        }
+
+        // 校验是否有关联的资产记录
+        LambdaQueryWrapper<AssetMain> assetMainQueryWrapper = new LambdaQueryWrapper<>();
+        assetMainQueryWrapper.eq(AssetMain::getAssetTypeId, id);
+        long assetMainCount = assetMainService.count(assetMainQueryWrapper);
+        if (assetMainCount > 0) {
+            throw new ServiceException(String.format("【%s】已关联资产记录,不能删除", existingAssetType.getTypeName()));
+        }
+
+        // 删除资产类型
+        this.removeById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchDeleteAssetType(List<Integer> ids) {
+        // 校验ID列表是否为空
+        if (CollUtil.isEmpty(ids)) {
+            throw new ServiceException("删除的资产类型ID列表不能为空");
+        }
+
+        // 收集删除失败的信息
+        List<String> failedMessages = new ArrayList<>();
+        
+        // 逐个删除资产类型
+        for (Integer id : ids) {
+            try {
+                this.deleteAssetType(id);
+            } catch (ServiceException e) {
+                failedMessages.add(e.getMessage());
+            }
+        }
+        
+        // 如果有删除失败的情况,抛出异常
+        if (CollUtil.isNotEmpty(failedMessages)) {
+            throw new ServiceException("批量删除失败:" + String.join(";", failedMessages));
+        }
+    }
+
+    @Override
+    public String getAssetCodePrefix(Integer assetTypeId) {
+        if (assetTypeId == null) {
+            throw new ServiceException("资产类型ID不能为空");
+        }
+
+        // 查询当前资产类型
+        AssetType currentAssetType = this.getById(assetTypeId);
+        if (currentAssetType == null) {
+            throw new ServiceException("资产类型不存在");
+        }
+
+        String parentTypeCode = "";
+        String subTypeCode = currentAssetType.getTypeCode();
+
+        // 如果是二级分类,需要获取父级分类的简写
+        if (currentAssetType.getLevel() == 2 && currentAssetType.getParentId() != null && currentAssetType.getParentId() != 0) {
+            AssetType parentAssetType = this.getById(currentAssetType.getParentId());
+            if (parentAssetType != null) {
+                parentTypeCode = parentAssetType.getTypeCode();
+            }
+        } else if (currentAssetType.getLevel() == 1) {
+            // 如果是一级分类,父级简写为空,子类简写就是当前类型简写
+            parentTypeCode = currentAssetType.getTypeCode();
+            subTypeCode = "";
+        }
+
+        return parentTypeCode + subTypeCode;
+    }
+
 }
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 c50fb16..0d0db98 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
@@ -1,10 +1,31 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.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.vo.asset.AssetWarehouseVO;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +36,87 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor
 public class AssetWarehouseServiceImpl extends ServiceImpl<AssetWarehouseMapper, AssetWarehouse> implements AssetWarehouseService {
 
+    private final AssetInventoryRecordService assetInventoryRecordService;
+    private final SysDeptMapper sysDeptMapper;
+
+    @Override
+    public IPage<AssetWarehouseVO> getPageList(AssetWarehousePageQuery pageQuery) {
+        LambdaQueryWrapper<AssetWarehouse> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(pageQuery.getKeyword())) {
+            queryWrapper.like(AssetWarehouse::getWarehouseName, pageQuery.getKeyword())
+                    .or()
+                    .like(AssetWarehouse::getManagerName, pageQuery.getKeyword());
+        }
+        Page<AssetWarehouse> page = this.page(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), queryWrapper);
+        Page<AssetWarehouseVO> pageVO = new Page<>();
+        BeanUtil.copyProperties(page, pageVO, "records");
+        List<AssetWarehouseVO> assetWarehouseVOS = BeanUtil.copyToList(page.getRecords(), AssetWarehouseVO.class);
+        if (CollUtil.isEmpty(assetWarehouseVOS)) {
+            return pageVO;
+        }
+        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);
+        Map<Integer, String> deptMap = sysDepts.stream()
+                .collect(Collectors.toMap(item->item.getDeptId().intValue(), SysDept::getDeptName));
+        //查询库存数量
+        Map<Integer, List<AssetInventoryRecord>> inventoryRecordMap = assetInventoryRecordService.lambdaQuery()
+                .in(AssetInventoryRecord::getWarehouseId, warehouseIds)
+                .list().stream().collect(Collectors.groupingBy(AssetInventoryRecord::getWarehouseId));
+        //计算当前库存
+        assetWarehouseVOS.forEach(warehouseVO -> {
+            List<AssetInventoryRecord> assetInventoryRecords = inventoryRecordMap.get(warehouseVO.getId());
+            if (CollUtil.isEmpty(assetInventoryRecords)) {
+                warehouseVO.setCurrentStock(0);
+            }
+            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(), ""));
+        });
+        pageVO.setRecords(assetWarehouseVOS);
+        return pageVO;
+    }
+
+    @Override
+    public void add(AssetWarehouseDTO dto) {
+        AssetWarehouse assetWarehouse = BeanUtil.copyProperties(dto, AssetWarehouse.class);
+        String username = SecurityUtils.getUsername();
+        assetWarehouse.setCreateBy(username);
+        this.save(assetWarehouse);
+    }
+
+    @Override
+    public void edit(AssetWarehouseDTO dto) {
+        if (Objects.isNull(dto.getId())) {
+            throw new ServiceException("仓库ID不能为空");
+        }
+        AssetWarehouse assetWarehouse = BeanUtil.copyProperties(dto, AssetWarehouse.class);
+        String username = SecurityUtils.getUsername();
+        assetWarehouse.setUpdateBy(username);
+        this.updateById(assetWarehouse);
+    }
+
+    @Override
+    public void delete(Integer id) {
+        if (Objects.isNull(id)) {
+            throw new ServiceException("仓库ID不能为空");
+        }
+        List<AssetInventoryRecord> list = assetInventoryRecordService.lambdaQuery().eq(AssetInventoryRecord::getWarehouseId, id).list();
+        if (CollUtil.isNotEmpty(list)) {
+            List<Integer> inStockIds = list.stream().filter(item -> item.getType().equals(0)).map(AssetInventoryRecord::getAssetMainId).collect(Collectors.toList());
+            list.stream().filter(item -> item.getType().equals(1)).forEach(item -> {
+                inStockIds.remove(item.getAssetMainId());
+            });
+            if (CollUtil.isNotEmpty(inStockIds)) {
+                throw new ServiceException("该仓库存在库存记录,不能删除");
+            }
+        }
+        this.removeById(id);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java
index 9734010..7d928d4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.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.OaApprovalApplicationPurchaseDTO;
+import com.ruoyi.system.emums.ApprovalStatusEnum;
 import com.ruoyi.system.mapper.OaApprovalApplicationPurchaseMapper;
 import com.ruoyi.system.model.OaApprovalApplicationPurchase;
+import com.ruoyi.system.model.OaApprovalApplicationPurchaseItem;
+import com.ruoyi.system.model.OaApprovalApplications;
+import com.ruoyi.system.model.OaApprovalFlowNode;
+import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.OaApprovalApplicationPurchaseItemService;
 import com.ruoyi.system.service.OaApprovalApplicationPurchaseService;
+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;
 
 /**
  * <p>
@@ -15,6 +34,130 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor
 public class OaApprovalApplicationPurchaseServiceImpl extends ServiceImpl<OaApprovalApplicationPurchaseMapper, OaApprovalApplicationPurchase> implements OaApprovalApplicationPurchaseService {
 
+    private final OaApprovalApplicationsService oaApprovalApplicationsService;
+    private final OaApprovalApplicationPurchaseItemService oaApprovalApplicationPurchaseItemService;
+    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
+    private final OaApprovalTodoService oaApprovalTodoService;
+    private final ISysUserService sysUserService;
+    private final ISysDeptService sysDeptService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submit(OaApprovalApplicationPurchaseDTO dto) {
+        // 1. 保存审批申请主表数据
+        OaApprovalApplications applications = buildOaApprovalApplications(dto);
+        
+        // 2. 如果是提交操作,获取流程节点并创建待办
+        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(dto.getApprovalId());
+        applications.setCurrentFlowNodeId(firstFlowNode.getId());
+        oaApprovalApplicationsService.save(applications);
+
+        // 3. 创建待办事项记录(公共服务)
+        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
+
+        // 4.保存采购资产明细数据
+        List<OaApprovalApplicationPurchaseItem> items = buildOaApprovalApplicationPurchaseItems(dto, applications.getId());
+        oaApprovalApplicationPurchaseItemService.saveBatch(items);
+
+        // 5. 保存采购申请详情数据
+        OaApprovalApplicationPurchase purchase = buildOaApprovalApplicationPurchase(dto, applications.getId());
+        save(purchase);
+    }
+    /**
+     * 获取第一个流程节点
+     */
+    private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) {
+        // 1. 查询审批流程配置
+        List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery()
+                .eq(OaApprovalFlowNode::getApprovalId, approvalId)
+                .eq(OaApprovalFlowNode::getStatus, 1) // 启用状态
+                .orderByAsc(OaApprovalFlowNode::getSortOrder)
+                .list();
+
+        if (CollectionUtils.isEmpty(flowNodes)) {
+            throw new ServiceException("未找到有效的审批流程配置");
+        }
+
+        // 2. 获取第一个流程节点
+        return flowNodes.get(0);
+    }
+
+    /**
+     * 构建审批申请主表数据
+     */
+    private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationPurchaseDTO dto) {
+        OaApprovalApplications applications = new OaApprovalApplications();
+        applications.setApplicationCode(generateApplicationCode());
+        applications.setApprovalId(dto.getApprovalId());
+        applications.setApplicantUserId(dto.getApplicantUserId());
+        applications.setApplicantName(dto.getApplicantName());
+        applications.setDeptId(dto.getDeptId());
+        applications.setDeptName(dto.getDeptName());
+        applications.setApplicationDate(dto.getApplicationDate());
+        applications.setApplicationReason(dto.getApplicationReason());
+        applications.setAttachmentUrl(dto.getAttachmentUrl());
+        applications.setDisabled(0); // 未删除
+        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
+        return applications;
+    }
+
+    /**
+     * 构建采购申请详情数据
+     */
+    private OaApprovalApplicationPurchase buildOaApprovalApplicationPurchase(OaApprovalApplicationPurchaseDTO dto, Integer applicationId) {
+        OaApprovalApplicationPurchase purchase = new OaApprovalApplicationPurchase();
+        purchase.setApprovalApplicationId(applicationId);
+        // 使用事项标题,而非采购说明
+        purchase.setTitle(dto.getTitle());
+        // 表结构中无 application_date 字段,此处不再设置
+        purchase.setAssetTypeId(dto.getAssetTypeId());
+        purchase.setTotalAmount(dto.getTotalAmount());
+
+        return purchase;
+    }
+
+    /**
+     * 构建采购资产明细数据
+     */
+    private List<OaApprovalApplicationPurchaseItem> buildOaApprovalApplicationPurchaseItems(OaApprovalApplicationPurchaseDTO dto, Integer applicationId) {
+        return dto.getPurchaseItems().stream()
+                .map(item -> {
+                    OaApprovalApplicationPurchaseItem purchaseItem = new OaApprovalApplicationPurchaseItem();
+                    purchaseItem.setApprovalApplicationId(applicationId);
+                    purchaseItem.setAssetName(item.getAssetName());
+                    purchaseItem.setAssetTypeId(item.getAssetTypeId());
+                    purchaseItem.setSpec(item.getSpec());
+                    purchaseItem.setUnit(item.getUnit());
+                    purchaseItem.setQuantity(item.getQuantity());
+                    purchaseItem.setPrice(item.getPrice());
+                    purchaseItem.setTotalAmount(item.getTotalAmount());
+                    return purchaseItem;
+                })
+                .collect(java.util.stream.Collectors.toList());
+    }
+
+    /**
+     * 生成申请单号
+     * 格式:CG + 年月日 + 3位序号
+     */
+    private String generateApplicationCode() {
+        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String prefix = "CG" + dateStr;
+        
+        // 查询当天已生成的申请单号数量
+        Long count = oaApprovalApplicationsService.lambdaQuery()
+                .like(OaApprovalApplications::getApplicationCode, prefix)
+                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
+                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
+                .count();
+        
+        // 生成3位序号,从001开始
+        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 8526ff6..a043153 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,10 +1,33 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 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.exception.ServiceException;
+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.emums.ApprovalStatusEnum;
+import com.ruoyi.system.emums.ApprovalTypeEnum;
+import com.ruoyi.system.emums.AssetTypeEnum;
 import com.ruoyi.system.mapper.OaApprovalApplicationStorageMapper;
-import com.ruoyi.system.model.OaApprovalApplicationStorage;
-import com.ruoyi.system.service.OaApprovalApplicationStorageService;
+import com.ruoyi.system.model.*;
+import com.ruoyi.system.service.*;
+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>
@@ -15,6 +38,483 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor
 public class OaApprovalApplicationStorageServiceImpl extends ServiceImpl<OaApprovalApplicationStorageMapper, OaApprovalApplicationStorage> implements OaApprovalApplicationStorageService {
 
+    private final OaApprovalApplicationsService oaApprovalApplicationsService;
+    private final AssetMainService assetMainService;
+    private final AssetGeneralExtService assetGeneralExtService;
+    private final AssetPropertyExtService assetPropertyExtService;
+    private final AssetVehicleExtService assetVehicleExtService;
+    private final AssetTypeService assetTypeService;
+    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
+    private final OaApprovalTodoService oaApprovalTodoService;
+    private final ISysUserService sysUserService;
+    private final ISysDeptService sysDeptService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submitGeneralAssetStorage(OaApprovalApplicationStorageGeneralDTO dto) {
+        // 1. 保存审批申请主表数据
+        OaApprovalApplications applications = buildOaApprovalApplications(dto);
+        
+        // 2. 获取流程节点并创建待办
+        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.IN_STOCK.getCode());
+        applications.setCurrentFlowNodeId(firstFlowNode.getId());
+        oaApprovalApplicationsService.save(applications);
+
+        // 3. 创建待办事项记录(公共服务)
+        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
+
+        // 4. 保存资产入库申请明细数据
+        OaApprovalApplicationStorage storage = buildOaApprovalApplicationStorage(dto, applications.getId());
+        save(storage);
+
+        // 5. 保存通用资产数据
+        saveGeneralAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submitPropertyAssetStorage(OaApprovalApplicationStoragePropertyDTO dto) {
+        // 1. 保存审批申请主表数据
+        OaApprovalApplications applications = buildOaApprovalApplications(dto);
+        
+        // 2. 获取流程节点并创建待办
+        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.IN_STOCK.getCode());
+        applications.setCurrentFlowNodeId(firstFlowNode.getId());
+        oaApprovalApplicationsService.save(applications);
+
+        // 3. 创建待办事项记录(公共服务)
+        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
+
+        // 4. 保存资产入库申请明细数据
+        OaApprovalApplicationStorage storage = buildOaApprovalApplicationStorage(dto, applications.getId());
+        save(storage);
+
+        // 5. 保存房产资产数据
+        savePropertyAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submitVehicleAssetStorage(OaApprovalApplicationStorageVehicleDTO dto) {
+        // 1. 保存审批申请主表数据
+        OaApprovalApplications applications = buildOaApprovalApplications(dto);
+        
+        // 2. 获取流程节点并创建待办
+        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.IN_STOCK.getCode());
+        applications.setCurrentFlowNodeId(firstFlowNode.getId());
+        oaApprovalApplicationsService.save(applications);
+
+        // 3. 创建待办事项记录(公共服务)
+        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
+
+        // 4. 保存资产入库申请明细数据
+        OaApprovalApplicationStorage storage = buildOaApprovalApplicationStorage(dto, applications.getId());
+        save(storage);
+
+        // 5. 保存车辆资产数据
+        saveVehicleAssets(dto.getAssetItems(), applications.getId(), dto.getAssetTypeId(), dto.getStorageTime());
+    }
+
+    /**
+     * 保存通用资产数据
+     */
+    private void saveGeneralAssets(List<OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+        List<AssetMain> allAssetMains = new ArrayList<>();
+        List<AssetGeneralExt> allGeneralExts = new ArrayList<>();
+        
+        for (OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item : assetItems) {
+            // 根据数量创建对应数量的资产记录
+            int quantity = item.getQuantity().intValue();
+            for (int i = 0; i < quantity; i++) {
+                AssetMain assetMain = buildAssetMain(item, applicationId, assetTypeId, storageDate);
+                assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode());
+                assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
+                assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
+                allAssetMains.add(assetMain);
+            }
+        }
+        
+        // 批量保存资产主表数据
+        assetMainService.saveBatch(allAssetMains);
+
+        // 为每个资产主表记录创建对应的扩展信息
+        int assetMainIndex = 0;
+        for (OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item : assetItems) {
+            int quantity = item.getQuantity().intValue();
+            for (int i = 0; i < quantity; i++) {
+                AssetGeneralExt generalExt = buildAssetGeneralExt(item, allAssetMains.get(assetMainIndex).getId());
+                allGeneralExts.add(generalExt);
+                assetMainIndex++;
+            }
+        }
+        
+        assetGeneralExtService.saveBatch(allGeneralExts);
+    }
+
+    /**
+     * 保存房产资产数据
+     */
+    private void savePropertyAssets(List<OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+        List<AssetMain> allAssetMains = new ArrayList<>();
+        List<AssetPropertyExt> allPropertyExts = new ArrayList<>();
+        
+        for (OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item : assetItems) {
+            // 根据数量创建对应数量的资产记录
+            int quantity = item.getQuantity().intValue();
+            for (int i = 0; i < quantity; i++) {
+                AssetMain assetMain = buildAssetMainFromProperty(item, applicationId, assetTypeId, storageDate);
+                assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode());
+                assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
+                assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
+                allAssetMains.add(assetMain);
+            }
+        }
+        
+        // 批量保存资产主表数据
+        assetMainService.saveBatch(allAssetMains);
+
+        // 为每个资产主表记录创建对应的扩展信息
+        int assetMainIndex = 0;
+        for (OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item : assetItems) {
+            int quantity = item.getQuantity().intValue();
+            for (int i = 0; i < quantity; i++) {
+                AssetPropertyExt propertyExt = buildAssetPropertyExt(item, allAssetMains.get(assetMainIndex).getId());
+                allPropertyExts.add(propertyExt);
+                assetMainIndex++;
+            }
+        }
+        
+        assetPropertyExtService.saveBatch(allPropertyExts);
+    }
+
+    /**
+     * 保存车辆资产数据
+     */
+    private void saveVehicleAssets(List<OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+        List<AssetMain> allAssetMains = new ArrayList<>();
+        List<AssetVehicleExt> allVehicleExts = new ArrayList<>();
+        
+        for (OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item : assetItems) {
+            // 根据数量创建对应数量的资产记录
+            int quantity = item.getQuantity().intValue();
+            for (int i = 0; i < quantity; i++) {
+                AssetMain assetMain = buildAssetMainFromVehicle(item, applicationId, assetTypeId, storageDate);
+                assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode());
+                assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1
+                assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价
+                allAssetMains.add(assetMain);
+            }
+        }
+        
+        // 批量保存资产主表数据
+        assetMainService.saveBatch(allAssetMains);
+
+        // 为每个资产主表记录创建对应的扩展信息
+        int assetMainIndex = 0;
+        for (OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item : assetItems) {
+            int quantity = item.getQuantity().intValue();
+            for (int i = 0; i < quantity; i++) {
+                AssetVehicleExt vehicleExt = buildAssetVehicleExt(item, allAssetMains.get(assetMainIndex).getId());
+                allVehicleExts.add(vehicleExt);
+                assetMainIndex++;
+            }
+        }
+        
+        assetVehicleExtService.saveBatch(allVehicleExts);
+    }
+
+    /**
+     * 构建通用资产主表数据
+     */
+    private AssetMain buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+        AssetMain assetMain = new AssetMain();
+        assetMain.setApprovalApplicationId(applicationId.intValue());
+        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
+        assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate)); // 系统生成资产编码
+        assetMain.setAssetName(item.getAssetName());
+        assetMain.setSpecificationModel(item.getSpecificationModel());
+        assetMain.setAssetTypeId(assetTypeId);
+        assetMain.setMeasurementUnit(item.getMeasurementUnit());
+        assetMain.setUnitPrice(item.getUnitPrice());
+        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());
+        assetMain.setAssetStatus(item.getAssetStatus());
+        assetMain.setRemarks(item.getRemarks());
+        assetMain.setAccountingStatus(item.getAccountingStatus());
+        assetMain.setAccountingDate(item.getAccountingDate());
+        assetMain.setAccountingVoucherNo(item.getAccountingVoucherNo());
+        assetMain.setAccountingSubject(item.getAccountingSubject());
+        assetMain.setAccountingAmount(item.getAccountingAmount());
+        assetMain.setDisabled(false);
+        return assetMain;
+    }
+
+    /**
+     * 构建房产资产主表数据
+     */
+    private AssetMain buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+        AssetMain assetMain = new AssetMain();
+        assetMain.setApprovalApplicationId(applicationId.intValue());
+        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
+        assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate));
+        assetMain.setAssetName(item.getAssetName());
+        assetMain.setSpecificationModel(item.getSpecificationModel());
+        assetMain.setAssetTypeId(assetTypeId);
+        assetMain.setMeasurementUnit(item.getMeasurementUnit());
+        assetMain.setUnitPrice(item.getUnitPrice());
+        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());
+        assetMain.setAssetStatus(item.getAssetStatus());
+        assetMain.setRemarks(item.getRemarks());
+        assetMain.setAccountingStatus(item.getAccountingStatus());
+        assetMain.setAccountingDate(item.getAccountingDate());
+        assetMain.setAccountingVoucherNo(item.getAccountingVoucherNo());
+        assetMain.setAccountingSubject(item.getAccountingSubject());
+        assetMain.setAccountingAmount(item.getAccountingAmount());
+        assetMain.setDisabled(false);
+        return assetMain;
+    }
+
+    /**
+     * 构建车辆资产主表数据
+     */
+    private AssetMain buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate) {
+        AssetMain assetMain = new AssetMain();
+        assetMain.setApprovalApplicationId(applicationId.intValue());
+        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
+        assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate));
+        assetMain.setAssetName(item.getAssetName());
+        assetMain.setSpecificationModel(item.getSpecificationModel());
+        assetMain.setAssetTypeId(assetTypeId);
+        assetMain.setMeasurementUnit(item.getMeasurementUnit());
+        assetMain.setUnitPrice(item.getUnitPrice());
+        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());
+        assetMain.setAssetStatus(item.getAssetStatus());
+        assetMain.setRemarks(item.getRemarks());
+        assetMain.setAccountingStatus(item.getAccountingStatus());
+        assetMain.setAccountingDate(item.getAccountingDate());
+        assetMain.setAccountingVoucherNo(item.getAccountingVoucherNo());
+        assetMain.setAccountingSubject(item.getAccountingSubject());
+        assetMain.setAccountingAmount(item.getAccountingAmount());
+        assetMain.setDisabled(false);
+        return assetMain;
+    }
+
+    /**
+     * 构建通用资产扩展数据
+     */
+    private AssetGeneralExt buildAssetGeneralExt(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer assetMainId) {
+        AssetGeneralExt generalExt = new AssetGeneralExt();
+        generalExt.setAssetMainId(assetMainId);
+        generalExt.setSupplierName(item.getSupplierName());
+        generalExt.setPurchaseDate(item.getPurchaseDate());
+        generalExt.setWarrantyPeriod(item.getWarrantyPeriod());
+        generalExt.setWarrantyExpireDate(item.getWarrantyExpireDate());
+        generalExt.setDepreciationMethod(item.getDepreciationMethod());
+        generalExt.setDepreciationRate(item.getDepreciationRate());
+        generalExt.setNetValue(item.getNetValue());
+        generalExt.setMaintenanceCycle(item.getMaintenanceCycle());
+        generalExt.setLastMaintenanceDate(item.getLastMaintenanceDate());
+        generalExt.setNextMaintenanceDate(item.getNextMaintenanceDate());
+        generalExt.setDisabled(false);
+        return generalExt;
+    }
+
+    /**
+     * 构建房产资产扩展数据
+     */
+    private AssetPropertyExt buildAssetPropertyExt(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer assetMainId) {
+        AssetPropertyExt propertyExt = new AssetPropertyExt();
+        propertyExt.setAssetMainId(assetMainId);
+        propertyExt.setRegion(item.getRegion());
+        propertyExt.setDesignPurpose(item.getDesignPurpose());
+        propertyExt.setBuilding(item.getBuilding());
+        propertyExt.setRoomNumber(item.getRoomNumber());
+        propertyExt.setConstructionArea(item.getConstructionArea());
+        propertyExt.setStructureType(item.getStructureType());
+        propertyExt.setCertificateNumber(item.getCertificateNumber());
+        propertyExt.setCompletionDate(item.getCompletionDate());
+        propertyExt.setDetailedLocation(item.getDetailedLocation());
+        propertyExt.setProvincialPlatformValue(item.getProvincialPlatformValue());
+        propertyExt.setResettlementSituation(item.getResettlementSituation());
+        propertyExt.setIsMortgaged(item.getIsMortgaged());
+        propertyExt.setTenantName(item.getTenantName());
+        propertyExt.setRentalAmount(item.getRentalAmount());
+        propertyExt.setLeaseStartDate(item.getLeaseStartDate());
+        propertyExt.setLeaseEndDate(item.getLeaseEndDate());
+        propertyExt.setDisabled(false);
+        return propertyExt;
+    }
+
+    /**
+     * 构建车辆资产扩展数据
+     */
+    private AssetVehicleExt buildAssetVehicleExt(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer assetMainId) {
+        AssetVehicleExt vehicleExt = new AssetVehicleExt();
+        vehicleExt.setAssetMainId(assetMainId);
+        vehicleExt.setLicensePlate(item.getLicensePlate());
+        vehicleExt.setVinCode(item.getVinCode());
+        vehicleExt.setEngineNumber(item.getEngineNumber());
+        vehicleExt.setDisplacement(item.getDisplacement());
+        vehicleExt.setStaffingSituation(item.getStaffingSituation());
+        vehicleExt.setOrigin(item.getOrigin());
+        vehicleExt.setAcquisitionDate(item.getAcquisitionDate());
+        vehicleExt.setPropertyRightForm(item.getPropertyRightForm());
+        vehicleExt.setDisabled(false);
+        return vehicleExt;
+    }
+
+    /**
+     * 获取第一个流程节点
+     */
+    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(Object dto) {
+        OaApprovalApplications applications = new OaApprovalApplications();
+        applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode());
+
+        if (dto instanceof OaApprovalApplicationStorageGeneralDTO) {
+            OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto;
+            applications.setApplicantUserId(generalDTO.getApplicantUserId());
+            applications.setApplicantName(generalDTO.getApplicantName());
+            applications.setDeptId(generalDTO.getDeptId());
+            applications.setDeptName(generalDTO.getDeptName());
+            applications.setApplicationDate(generalDTO.getApplicationDate());
+            applications.setApplicationReason(generalDTO.getApplicationReason());
+            applications.setAttachmentUrl(generalDTO.getAttachmentUrl());
+        } else if (dto instanceof OaApprovalApplicationStoragePropertyDTO) {
+            OaApprovalApplicationStoragePropertyDTO propertyDTO = (OaApprovalApplicationStoragePropertyDTO) dto;
+            applications.setApplicantUserId(propertyDTO.getApplicantUserId());
+            applications.setApplicantName(propertyDTO.getApplicantName());
+            applications.setDeptId(propertyDTO.getDeptId());
+            applications.setDeptName(propertyDTO.getDeptName());
+            applications.setApplicationDate(propertyDTO.getApplicationDate());
+            applications.setApplicationReason(propertyDTO.getApplicationReason());
+            applications.setAttachmentUrl(propertyDTO.getAttachmentUrl());
+        } else if (dto instanceof OaApprovalApplicationStorageVehicleDTO) {
+            OaApprovalApplicationStorageVehicleDTO vehicleDTO = (OaApprovalApplicationStorageVehicleDTO) dto;
+            applications.setApplicantUserId(vehicleDTO.getApplicantUserId());
+            applications.setApplicantName(vehicleDTO.getApplicantName());
+            applications.setDeptId(vehicleDTO.getDeptId());
+            applications.setDeptName(vehicleDTO.getDeptName());
+            applications.setApplicationDate(vehicleDTO.getApplicationDate());
+            applications.setApplicationReason(vehicleDTO.getApplicationReason());
+            applications.setAttachmentUrl(vehicleDTO.getAttachmentUrl());
+        }
+        
+        applications.setApplicationCode(generateApplicationCode());
+        applications.setDisabled(0);
+        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
+        return applications;
+    }
+
+    /**
+     * 构建资产入库申请明细数据
+     */
+    private OaApprovalApplicationStorage buildOaApprovalApplicationStorage(Object dto, Integer applicationId) {
+        OaApprovalApplicationStorage storage = new OaApprovalApplicationStorage();
+        storage.setApprovalApplicationId(applicationId.intValue());
+        
+        if (dto instanceof OaApprovalApplicationStorageGeneralDTO) {
+            OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto;
+            storage.setTitle(generalDTO.getTitle());
+            storage.setAssetTypeId(generalDTO.getAssetTypeId());
+            storage.setStorageType(generalDTO.getStorageType());
+            storage.setStorageTime(generalDTO.getStorageTime());
+        } else if (dto instanceof OaApprovalApplicationStoragePropertyDTO) {
+            OaApprovalApplicationStoragePropertyDTO propertyDTO = (OaApprovalApplicationStoragePropertyDTO) dto;
+            storage.setTitle(propertyDTO.getTitle());
+            storage.setAssetTypeId(propertyDTO.getAssetTypeId());
+            storage.setStorageType(propertyDTO.getStorageType());
+            storage.setStorageTime(propertyDTO.getStorageTime());
+        } else if (dto instanceof OaApprovalApplicationStorageVehicleDTO) {
+            OaApprovalApplicationStorageVehicleDTO vehicleDTO = (OaApprovalApplicationStorageVehicleDTO) dto;
+            storage.setTitle(vehicleDTO.getTitle());
+            storage.setAssetTypeId(vehicleDTO.getAssetTypeId());
+            storage.setStorageType(vehicleDTO.getStorageType());
+            storage.setStorageTime(vehicleDTO.getStorageTime());
+        }
+        
+        return storage;
+    }
+
+    /**
+     * 生成申请单号
+     * 格式:RK + 年月日 + 3位序号
+     */
+    private String generateApplicationCode() {
+        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String prefix = "RK" + 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;
+    }
+
+    /**
+     * 生成资产编码
+     * 格式:资产类型一级分类简写+资产类型子类简写+入库日期+【-】+数量顺序编号(4位)
+     * 例如:GDFC20250917-0001
+     */
+    private String generateAssetCode(Integer assetTypeId, LocalDate storageDate) {
+        // 根据资产类型ID获取资产编码前缀
+        String typeCodePrefix = assetTypeService.getAssetCodePrefix(assetTypeId);
+        
+        String dateStr = storageDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String prefix = typeCodePrefix + dateStr + "-";
+        
+        // 查询当天该类型资产的数量
+        Long count = assetMainService.lambdaQuery()
+                .like(AssetMain::getAssetCode, prefix)
+                .ge(AssetMain::getCreateTime, storageDate.atStartOfDay())
+                .lt(AssetMain::getCreateTime, storageDate.plusDays(1).atStartOfDay())
+                .count();
+        
+        int sequence = (count != null ? count.intValue() : 0) + 1;
+        String sequenceStr = String.format("%04d", sequence);
+        
+        return prefix + sequenceStr;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalTodoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalTodoServiceImpl.java
index 8b40616..503c9d6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalTodoServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalTodoServiceImpl.java
@@ -1,10 +1,25 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 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.exception.ServiceException;
 import com.ruoyi.system.mapper.OaApprovalTodoMapper;
+import com.ruoyi.system.model.OaApprovalFlowNode;
 import com.ruoyi.system.model.OaApprovalTodo;
+import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.OaApprovalTodoService;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -15,6 +30,133 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor
 public class OaApprovalTodoServiceImpl extends ServiceImpl<OaApprovalTodoMapper, OaApprovalTodo> implements OaApprovalTodoService {
 
+    private final ISysUserService sysUserService;
+    private final ISysDeptService sysDeptService;
+
+    /**
+     * 创建审批待办(公共实现)
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void createApprovalTodos(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, Integer deptId) {
+        Integer approvalType = flowNode.getApprovalType();
+        if (approvalType == null) {
+            throw new ServiceException("审批类型不能为空");
+        }
+
+        switch (approvalType) {
+            case 0: // 上级部门审批
+                createUpperDeptTodo(applicationId, applicationCode, flowNode, deptId);
+                break;
+            case 1: // 指定部门审批
+                createSpecifiedDeptTodo(applicationId, applicationCode, flowNode);
+                break;
+            case 2: // 指定人员审批
+                createSpecifiedUserTodo(applicationId, applicationCode, flowNode);
+                break;
+            default:
+                throw new ServiceException("不支持的审批类型: " + approvalType);
+        }
+    }
+
+    /**
+     * 创建上级部门审批待办
+     */
+    private void createUpperDeptTodo(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, Integer deptId) {
+        // 1. 获取申请部门信息
+        if (deptId == null) {
+            throw new ServiceException("未填写申请部门信息");
+        }
+
+        SysDept currentDept = sysDeptService.selectDeptById(Long.valueOf(deptId));
+        if (currentDept == null) {
+            throw new ServiceException("申请部门信息不存在");
+        }
+
+        // 2. 获取上级部门信息
+        if (currentDept.getParentId() == null || currentDept.getParentId() == 0) {
+            throw new ServiceException("当前部门没有上级部门");
+        }
+
+        SysDept parentDept = sysDeptService.selectDeptById(currentDept.getParentId());
+        if (parentDept == null) {
+            throw new ServiceException("上级部门信息不存在");
+        }
+
+        // 3. 查询所有关联了该上级部门的用户
+        List<SysUser> users = sysUserService.selectListByDeptId(parentDept.getDeptId().toString());
+        if (CollUtil.isEmpty(users)) {
+            throw new ServiceException("上级部门下没有找到用户");
+        }
+
+        // 4. 为每个用户创建待办数据
+        createTodoItem(applicationId, applicationCode, flowNode, users);
+    }
+
+    /**
+     * 创建指定部门审批待办
+     */
+    private void createSpecifiedDeptTodo(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode) {
+        if (StringUtils.isBlank(flowNode.getApprovalIds())) {
+            throw new ServiceException("操作失败,审批流程配置异常");
+        }
+        // 收集部门ID
+        List<String> deptIdList = Arrays.stream(flowNode.getApprovalIds().split(",")).collect(Collectors.toList());
+
+        // 查询所有关联了这些部门的用户
+        List<SysUser> users = sysUserService.selectListByDeptIds(deptIdList);
+        if (CollUtil.isEmpty(users)) {
+            throw new ServiceException("指定部门下没有找到用户");
+        }
+
+        // 为每个用户创建待办数据
+        createTodoItem(applicationId, applicationCode, flowNode, users);
+    }
+
+    /**
+     * 创建指定人员审批待办
+     */
+    private void createSpecifiedUserTodo(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode) {
+        if (StringUtils.isBlank(flowNode.getApprovalIds())) {
+            throw new ServiceException("操作失败,审批流程配置异常");
+        }
+        List<Integer> userIds = Arrays.stream(flowNode.getApprovalIds().split(","))
+                .map(Integer::valueOf).collect(Collectors.toList());
+        // 1. 查询用户信息
+        List<SysUser> users = sysUserService.selectListByUserIds(userIds);
+        if (CollUtil.isEmpty(users)) {
+            throw new ServiceException("没有找到指定审批用户");
+        }
+        //2. 创建待办数据
+        createTodoItem(applicationId, applicationCode, flowNode, users);
+    }
+
+    /**
+     * 创建待办数据项
+     */
+    private void createTodoItem(Integer applicationId, String applicationCode, OaApprovalFlowNode flowNode, List<SysUser> userList) {
+        List<OaApprovalTodo> approvalTodoList = userList.stream().map(item -> {
+            OaApprovalTodo todo = new OaApprovalTodo();
+            todo.setApplicationId(applicationId);
+            todo.setApplicationCode(applicationCode);
+            todo.setFlowNodeId(flowNode.getId());
+            todo.setUserId(item.getUserId().intValue());
+            todo.setUserName(item.getNickName());
+
+            // 设置部门信息
+            if (item.getDeptId() != null) {
+                todo.setDeptId(Integer.valueOf(item.getDeptId()));
+            }
+
+            todo.setSortOrder(flowNode.getSortOrder());
+            todo.setStatus(0); // 0-待处理
+            todo.setCreateTime(LocalDateTime.now());
+            return todo;
+        }).collect(Collectors.toList());
+        //批量保存
+        this.saveBatch(approvalTodoList);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 77d386c..201d591 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -1,6 +1,5 @@
 package com.ruoyi.system.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.UserConstants;
@@ -14,7 +13,11 @@
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.*;
+import com.ruoyi.system.mapper.SysPostMapper;
+import com.ruoyi.system.mapper.SysRoleMapper;
+import com.ruoyi.system.mapper.SysUserMapper;
+import com.ruoyi.system.mapper.SysUserPostMapper;
+import com.ruoyi.system.mapper.SysUserRoleMapper;
 import com.ruoyi.system.query.SysUserQuery;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
@@ -27,9 +30,6 @@
 import org.springframework.util.CollectionUtils;
 
 import javax.validation.Validator;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -701,4 +701,9 @@
     public SysUser selectByPhone(String phonenumber) {
         return userMapper.selectByPhone(phonenumber);
     }
+
+    @Override
+    public List<SysUser> selectListByUserIds(List<Integer> userIds) {
+        return userMapper.selectListByUserIds(userIds);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java
new file mode 100644
index 0000000..8d9c135
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java
@@ -0,0 +1,57 @@
+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 lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 资产类型树形视图对象
+ *
+ * @author WuGuanFengYue
+ * @date 2025/9/15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel("资产类型树形视图对象")
+public class AssetTypeTreeVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "资产类型名称")
+    private String typeName;
+
+    @ApiModelProperty(value = "资产简写")
+    private String typeCode;
+
+    @ApiModelProperty(value = "父级ID,0表示一级分类")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "层级:1-一级分类,2-二级分类")
+    private Integer level;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "子节点列表")
+    private List<AssetTypeTreeVO> children;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetWarehouseVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetWarehouseVO.java
new file mode 100644
index 0000000..45d6ec0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetWarehouseVO.java
@@ -0,0 +1,49 @@
+package com.ruoyi.system.vo.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author mitao
+ * @date 2025/9/15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel("仓库视图对象")
+public class AssetWarehouseVO implements Serializable {
+
+    private static final long serialVersionUID = 6352690221179631751L;
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "权属部门ID")
+    private Integer deptId;
+
+    @ApiModelProperty(value = "权属部门名称")
+    private String deptName;
+
+    @ApiModelProperty(value = "面积(平方米)")
+    private BigDecimal area;
+
+    @ApiModelProperty(value = "位置")
+    private String location;
+
+    @ApiModelProperty(value = "负责人姓名")
+    private String managerName;
+
+    @ApiModelProperty(value = "联系电话")
+    private String managerPhone;
+
+    @ApiModelProperty(value = "当前库存数量" )
+    private Integer currentStock;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
index cf439f6..bcf65cd 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -86,7 +86,22 @@
 	    <include refid="selectDeptVo"/>
 		where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' limit 1
 	</select>
-    
+
+    <select id="selectByIds" resultType="com.ruoyi.common.core.domain.entity.SysDept"
+            parameterType="java.util.List">
+		select * from sys_dept
+		<where>
+			del_flag = '0'
+			<if test="deptIds !=null and deptIds.size() != 0">
+				and dept_id in
+				<foreach collection="deptIds" item="item" open="(" separator="," close=")">
+					#{item}
+				</foreach>
+			</if>
+		</where>
+		order by id desc
+	</select>
+
     <insert id="insertDept" parameterType="SysDept">
  		insert into sys_dept(
  			<if test="deptId != null and deptId != 0">dept_id,</if>
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index cb902a9..dd84c2d 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -313,8 +313,20 @@
 			AND nick_name = #{nickName}
 		</if>
 	</select>
-
-    <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
+	<select id="selectListByUserIds" resultType="com.ruoyi.common.core.domain.entity.SysUser"
+			parameterType="java.util.List">
+		select  * from sys_user
+		<where>
+			del_flag = '0'
+			<if test="userIds != null and userIds.size() > 0">
+				and user_id in
+				<foreach item="item" collection="userIds" open="(" separator="," close=")">
+					#{item}
+				</foreach>
+			</if>
+		</where>
+	</select>
+	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
  			<if test="deptId != null and deptId != 0">dept_id,</if>

--
Gitblit v1.7.1