From 7c3331d7be7c10059cc82586852d562f566a5087 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 19 九月 2025 14:08:11 +0800
Subject: [PATCH] 资产管理-资产入库列表详情、撤销接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java  |  144 +++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java                     |   23 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java  |  150 ++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java           |   21 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java                              |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java |    5 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java     |   35 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java           |   22 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java            |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java  |  284 ++++++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java        |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java |  168 +++++++++++
 12 files changed, 857 insertions(+), 7 deletions(-)

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 1c64940..89ae307 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
@@ -17,14 +17,20 @@
 import com.ruoyi.system.service.OaApprovalApplicationStorageService;
 import com.ruoyi.system.service.TDeptService;
 import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO;
 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.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.GetMapping;
 
 import javax.validation.Valid;
 
@@ -81,6 +87,35 @@
         return R.ok(page);
     }
 
+    @ApiOperation("删除资产入库申请")
+    @DeleteMapping("/{id}")
+    @Log(title = "资产入库申请-删除", businessType = BusinessType.DELETE)
+    public R<Void> delete(@PathVariable Integer id) {
+        oaApprovalApplicationStorageService.removeById(id);
+        return R.ok();
+    }
+
+    @ApiOperation("获取通用资产入库申请详情")
+    @GetMapping("/detail/general/{id}")
+    public R<OaApprovalApplicationStorageGeneralDetailVO> getGeneralDetail(@PathVariable Integer id) {
+        OaApprovalApplicationStorageGeneralDetailVO detail = oaApprovalApplicationStorageService.getGeneralDetail(id);
+        return R.ok(detail);
+    }
+
+    @ApiOperation("获取房产资产入库申请详情")
+    @GetMapping("/detail/property/{id}")
+    public R<OaApprovalApplicationStoragePropertyDetailVO> getPropertyDetail(@PathVariable Integer id) {
+        OaApprovalApplicationStoragePropertyDetailVO detail = oaApprovalApplicationStorageService.getPropertyDetail(id);
+        return R.ok(detail);
+    }
+
+    @ApiOperation("获取车辆资产入库申请详情")
+    @GetMapping("/detail/vehicle/{id}")
+    public R<OaApprovalApplicationStorageVehicleDetailVO> getVehicleDetail(@PathVariable Integer id) {
+        OaApprovalApplicationStorageVehicleDetailVO detail = oaApprovalApplicationStorageService.getVehicleDetail(id);
+        return R.ok(detail);
+    }
+
     /**
      * 校验位置类型与相关名称/地址
      */
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
index 60f51a2..a159ee5 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java
@@ -16,6 +16,8 @@
 import com.ruoyi.system.utils.UUIDUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -25,6 +27,8 @@
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.util.Date;
+import com.ruoyi.system.emums.ApprovalStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
 
 /**
  * <p>
@@ -73,5 +77,23 @@
         approvalApplicationsService.save(oaApprovalApplications);
         return R.ok();
     }
+
+    @Log(title = "审批-撤回通用审批单", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "撤回审批单:仅更新状态为已撤回")
+    @PutMapping(value = "/withdraw/{id}")
+    public R withdraw(@PathVariable Integer id) {
+        OaApprovalApplications current = approvalApplicationsService.getById(id);
+        if (current == null) {
+            throw new ServiceException("审批单不存在");
+        }
+        if (!ApprovalStatusEnum.PENDING.getCode().equals(current.getApprovalStatus())) {
+            throw new ServiceException("仅待审批状态可撤回");
+        }
+        OaApprovalApplications update = new OaApprovalApplications();
+        update.setId(id);
+        update.setApprovalStatus(ApprovalStatusEnum.CANCELED.getCode());
+        approvalApplicationsService.updateById(update);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java
index 8ecc57e..c151a49 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java
@@ -3,6 +3,7 @@
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
@@ -48,6 +49,7 @@
 
     @ApiModelProperty("领用日期")
     @NotNull(message = "领用日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate operateTime;
 
     @ApiModelProperty("资产类型ID")
@@ -55,6 +57,7 @@
     private Integer assetTypeId;
 
     @ApiModelProperty("预计退还日期,可为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate expectReturnDate;
 
     @ApiModelProperty("领用资产列表")
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
index 5a5c334..7659043 100644
--- 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
@@ -23,10 +23,6 @@
 @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;
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 5f32c7f..6ee3172 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
@@ -8,6 +8,9 @@
 import com.ruoyi.system.model.OaApprovalApplicationStorage;
 import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery;
 import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO;
 
 /**
  * <p>
@@ -46,4 +49,22 @@
      * @return 分页数据
      */
     IPage<OaApprovalApplicationStoragePageVO> getPageList(OaApprovalApplicationStoragePageQuery pageQuery);
+
+    /**
+     * 获取通用资产入库申请详情
+     * @param storageId 入库申请存储表ID
+     */
+    OaApprovalApplicationStorageGeneralDetailVO getGeneralDetail(Integer storageId);
+
+    /**
+     * 获取房产资产入库申请详情
+     * @param storageId 入库申请存储表ID
+     */
+    OaApprovalApplicationStoragePropertyDetailVO getPropertyDetail(Integer storageId);
+
+    /**
+     * 获取车辆资产入库申请详情
+     * @param storageId 入库申请存储表ID
+     */
+    OaApprovalApplicationStorageVehicleDetailVO getVehicleDetail(Integer storageId);
 }
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 583b616..f69ae9b 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
@@ -3,6 +3,7 @@
 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.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -21,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -53,10 +55,31 @@
         // 转换为VO对象
         List<AssetTypeTreeVO> assetTypeVOs = BeanUtil.copyToList(allAssetTypes, AssetTypeTreeVO.class);
         
+        // 预查询:找出存在资产关联的资产类型ID集合(去重)
+        List<Integer> allTypeIds = allAssetTypes.stream().map(AssetType::getId).collect(Collectors.toList());
+        QueryWrapper<AssetMain> usedTypeQuery = new QueryWrapper<>();
+        usedTypeQuery.select("distinct asset_type_id").in("asset_type_id", allTypeIds);
+        List<AssetMain> usedTypeRows = assetMainService.list(usedTypeQuery);
+        Set<Integer> usedTypeIdSet = usedTypeRows.stream()
+                .map(AssetMain::getAssetTypeId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
         // 按父级ID分组
         Map<Integer, List<AssetTypeTreeVO>> parentIdMap = assetTypeVOs.stream()
                 .collect(Collectors.groupingBy(AssetTypeTreeVO::getParentId));
         
+        // 计算可删除标记:一级仅判断是否有子分类;二级仅判断是否有关联资产
+        for (AssetTypeTreeVO vo : assetTypeVOs) {
+            if (Objects.equals(vo.getLevel(), 1)) {
+                boolean hasChildren = parentIdMap.containsKey(vo.getId()) && CollUtil.isNotEmpty(parentIdMap.get(vo.getId()));
+                vo.setCanDelete(!hasChildren);
+            } else {
+                boolean hasAssets = usedTypeIdSet.contains(vo.getId());
+                vo.setCanDelete(!hasAssets);
+            }
+        }
+
         // 构建树形结构
         List<AssetTypeTreeVO> rootNodes = parentIdMap.get(0);
         if (CollUtil.isEmpty(rootNodes)) {
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 7d928d4..50069a7 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
@@ -4,6 +4,7 @@
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationPurchaseDTO;
 import com.ruoyi.system.emums.ApprovalStatusEnum;
+import com.ruoyi.system.emums.ApprovalTypeEnum;
 import com.ruoyi.system.mapper.OaApprovalApplicationPurchaseMapper;
 import com.ruoyi.system.model.OaApprovalApplicationPurchase;
 import com.ruoyi.system.model.OaApprovalApplicationPurchaseItem;
@@ -51,7 +52,7 @@
         OaApprovalApplications applications = buildOaApprovalApplications(dto);
         
         // 2. 如果是提交操作,获取流程节点并创建待办
-        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(dto.getApprovalId());
+        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.PURCHASE.getCode());
         applications.setCurrentFlowNodeId(firstFlowNode.getId());
         oaApprovalApplicationsService.save(applications);
 
@@ -91,7 +92,7 @@
     private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationPurchaseDTO dto) {
         OaApprovalApplications applications = new OaApprovalApplications();
         applications.setApplicationCode(generateApplicationCode());
-        applications.setApprovalId(dto.getApprovalId());
+        applications.setApprovalId(ApprovalTypeEnum.PURCHASE.getCode());
         applications.setApplicantUserId(dto.getApplicantUserId());
         applications.setApplicantName(dto.getApplicantName());
         applications.setDeptId(dto.getDeptId());
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 f56632b..8b336fd 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
@@ -34,6 +34,9 @@
 import com.ruoyi.system.service.OaApprovalTodoService;
 import com.ruoyi.system.service.TDeptService;
 import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO;
+import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -44,6 +47,8 @@
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -576,4 +581,283 @@
         Page<OaApprovalApplicationStoragePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
         return this.baseMapper.selectApplicationStoragePage(page, pageQuery);
     }
+
+    @Override
+    public OaApprovalApplicationStorageGeneralDetailVO getGeneralDetail(Integer storageId) {
+        OaApprovalApplicationStorage storage = this.getById(storageId);
+        if (storage == null) {
+            throw new ServiceException("入库申请不存在");
+        }
+        OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId());
+        if (app == null) {
+            throw new ServiceException("审批主记录不存在");
+        }
+
+        OaApprovalApplicationStorageGeneralDetailVO vo = new OaApprovalApplicationStorageGeneralDetailVO();
+        fillBaseFields(vo, app, storage);
+
+        List<AssetMain> mains = assetMainService.lambdaQuery()
+                .eq(AssetMain::getApprovalApplicationId, app.getId())
+                .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId())
+                .list();
+        setAddressInfo(vo, mains);
+
+        if (!CollectionUtils.isEmpty(mains)) {
+            List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList());
+            List<AssetGeneralExt> exts = assetGeneralExtService.lambdaQuery().in(AssetGeneralExt::getAssetMainId, mainIds).list();
+            Map<Integer, AssetGeneralExt> extMap = exts.stream().collect(Collectors.toMap(AssetGeneralExt::getAssetMainId, e -> e));
+
+            List<OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO> items = mains.stream().map(m -> {
+                OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO item = new OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO();
+                item.setAssetOriginalCode(m.getAssetOriginalCode());
+                item.setAssetName(m.getAssetName());
+                item.setSpecificationModel(m.getSpecificationModel());
+                item.setMeasurementUnit(m.getMeasurementUnit());
+                item.setQuantity(m.getQuantity());
+                item.setUnitPrice(m.getUnitPrice());
+                item.setUsefulLife(m.getUsefulLife());
+                item.setOwnershipDeptId(m.getOwnershipDeptId());
+                item.setUserName(m.getUserName());
+                item.setAssetStatus(m.getAssetStatus());
+                item.setRemarks(m.getRemarks());
+                item.setAccountingStatus(m.getAccountingStatus());
+                item.setAccountingDate(m.getAccountingDate());
+                item.setAccountingVoucherNo(m.getAccountingVoucherNo());
+                item.setAccountingSubject(m.getAccountingSubject());
+                item.setAccountingAmount(m.getAccountingAmount());
+                AssetGeneralExt ext = extMap.get(m.getId());
+                if (ext != null) {
+                    item.setSupplierName(ext.getSupplierName());
+                    item.setPurchaseDate(ext.getPurchaseDate());
+                    item.setWarrantyPeriod(ext.getWarrantyPeriod());
+                    item.setWarrantyExpireDate(ext.getWarrantyExpireDate());
+                    item.setDepreciationMethod(ext.getDepreciationMethod());
+                    item.setDepreciationRate(ext.getDepreciationRate());
+                    item.setNetValue(ext.getNetValue());
+                    item.setMaintenanceCycle(ext.getMaintenanceCycle());
+                    item.setLastMaintenanceDate(ext.getLastMaintenanceDate());
+                    item.setNextMaintenanceDate(ext.getNextMaintenanceDate());
+                }
+                return item;
+            }).collect(Collectors.toList());
+            vo.setAssetItems(items);
+        }
+        return vo;
+    }
+
+    @Override
+    public OaApprovalApplicationStoragePropertyDetailVO getPropertyDetail(Integer storageId) {
+        OaApprovalApplicationStorage storage = this.getById(storageId);
+        if (storage == null) {
+            throw new ServiceException("入库申请不存在");
+        }
+        OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId());
+        if (app == null) {
+            throw new ServiceException("审批主记录不存在");
+        }
+
+        OaApprovalApplicationStoragePropertyDetailVO vo = new OaApprovalApplicationStoragePropertyDetailVO();
+        fillBaseFields(vo, app, storage);
+
+        List<AssetMain> mains = assetMainService.lambdaQuery()
+                .eq(AssetMain::getApprovalApplicationId, app.getId())
+                .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId())
+                .list();
+        setAddressInfo(vo, mains);
+
+        if (!CollectionUtils.isEmpty(mains)) {
+            List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList());
+            List<AssetPropertyExt> exts = assetPropertyExtService.lambdaQuery().in(AssetPropertyExt::getAssetMainId, mainIds).list();
+            Map<Integer, AssetPropertyExt> extMap = exts.stream().collect(Collectors.toMap(AssetPropertyExt::getAssetMainId, e -> e));
+
+            List<OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO> items = mains.stream().map(m -> {
+                OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO item = new OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO();
+                item.setAssetOriginalCode(m.getAssetOriginalCode());
+                item.setAssetName(m.getAssetName());
+                item.setSpecificationModel(m.getSpecificationModel());
+                item.setMeasurementUnit(m.getMeasurementUnit());
+                item.setQuantity(m.getQuantity());
+                item.setUnitPrice(m.getUnitPrice());
+                item.setUsefulLife(m.getUsefulLife());
+                item.setOwnershipDeptId(m.getOwnershipDeptId());
+                item.setUserName(m.getUserName());
+                item.setAssetStatus(m.getAssetStatus());
+                item.setRemarks(m.getRemarks());
+                item.setAccountingStatus(m.getAccountingStatus());
+                item.setAccountingDate(m.getAccountingDate());
+                item.setAccountingVoucherNo(m.getAccountingVoucherNo());
+                item.setAccountingSubject(m.getAccountingSubject());
+                item.setAccountingAmount(m.getAccountingAmount());
+                AssetPropertyExt ext = extMap.get(m.getId());
+                if (ext != null) {
+                    item.setRegion(ext.getRegion());
+                    item.setDesignPurpose(ext.getDesignPurpose());
+                    item.setBuilding(ext.getBuilding());
+                    item.setRoomNumber(ext.getRoomNumber());
+                    item.setConstructionArea(ext.getConstructionArea());
+                    item.setStructureType(ext.getStructureType());
+                    item.setCertificateNumber(ext.getCertificateNumber());
+                    item.setCompletionDate(ext.getCompletionDate());
+                    item.setDetailedLocation(ext.getDetailedLocation());
+                    item.setProvincialPlatformValue(ext.getProvincialPlatformValue());
+                    item.setResettlementSituation(ext.getResettlementSituation());
+                    item.setIsMortgaged(ext.getIsMortgaged());
+                    item.setTenantName(ext.getTenantName());
+                    item.setRentalAmount(ext.getRentalAmount());
+                    item.setLeaseStartDate(ext.getLeaseStartDate());
+                    item.setLeaseEndDate(ext.getLeaseEndDate());
+                }
+                return item;
+            }).collect(Collectors.toList());
+            vo.setAssetItems(items);
+        }
+        return vo;
+    }
+
+    @Override
+    public OaApprovalApplicationStorageVehicleDetailVO getVehicleDetail(Integer storageId) {
+        OaApprovalApplicationStorage storage = this.getById(storageId);
+        if (storage == null) {
+            throw new ServiceException("入库申请不存在");
+        }
+        OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId());
+        if (app == null) {
+            throw new ServiceException("审批主记录不存在");
+        }
+
+        OaApprovalApplicationStorageVehicleDetailVO vo = new OaApprovalApplicationStorageVehicleDetailVO();
+        fillBaseFields(vo, app, storage);
+
+        List<AssetMain> mains = assetMainService.lambdaQuery()
+                .eq(AssetMain::getApprovalApplicationId, app.getId())
+                .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId())
+                .list();
+        setAddressInfo(vo, mains);
+
+        if (!CollectionUtils.isEmpty(mains)) {
+            List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList());
+            List<AssetVehicleExt> exts = assetVehicleExtService.lambdaQuery().in(AssetVehicleExt::getAssetMainId, mainIds).list();
+            Map<Integer, AssetVehicleExt> extMap = exts.stream().collect(Collectors.toMap(AssetVehicleExt::getAssetMainId, e -> e));
+
+            List<OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO> items = mains.stream().map(m -> {
+                OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO item = new OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO();
+                item.setAssetOriginalCode(m.getAssetOriginalCode());
+                item.setAssetName(m.getAssetName());
+                item.setSpecificationModel(m.getSpecificationModel());
+                item.setMeasurementUnit(m.getMeasurementUnit());
+                item.setQuantity(m.getQuantity());
+                item.setUnitPrice(m.getUnitPrice());
+                item.setUsefulLife(m.getUsefulLife());
+                item.setOwnershipDeptId(m.getOwnershipDeptId());
+                item.setUserName(m.getUserName());
+                item.setAssetStatus(m.getAssetStatus());
+                item.setRemarks(m.getRemarks());
+                item.setAccountingStatus(m.getAccountingStatus());
+                item.setAccountingDate(m.getAccountingDate());
+                item.setAccountingVoucherNo(m.getAccountingVoucherNo());
+                item.setAccountingSubject(m.getAccountingSubject());
+                item.setAccountingAmount(m.getAccountingAmount());
+                AssetVehicleExt ext = extMap.get(m.getId());
+                if (ext != null) {
+                    item.setLicensePlate(ext.getLicensePlate());
+                    item.setVinCode(ext.getVinCode());
+                    item.setEngineNumber(ext.getEngineNumber());
+                    item.setDisplacement(ext.getDisplacement());
+                    item.setStaffingSituation(ext.getStaffingSituation());
+                    item.setOrigin(ext.getOrigin());
+                    item.setAcquisitionDate(ext.getAcquisitionDate());
+                    item.setPropertyRightForm(ext.getPropertyRightForm());
+                }
+                return item;
+            }).collect(Collectors.toList());
+            vo.setAssetItems(items);
+        }
+        return vo;
+    }
+
+    private void fillBaseFields(Object vo, OaApprovalApplications app, OaApprovalApplicationStorage storage) {
+        if (vo instanceof OaApprovalApplicationStorageGeneralDetailVO) {
+            OaApprovalApplicationStorageGeneralDetailVO v = (OaApprovalApplicationStorageGeneralDetailVO) vo;
+            v.setDeptId(app.getDeptId());
+            v.setDeptName(app.getDeptName());
+            v.setApplicantUserId(app.getApplicantUserId());
+            v.setApplicantName(app.getApplicantName());
+            v.setApplicationDate(app.getApplicationDate());
+            v.setApplicationReason(app.getApplicationReason());
+            v.setAttachmentUrl(app.getAttachmentUrl());
+            v.setTitle(storage.getTitle());
+            v.setAssetTypeId(storage.getAssetTypeId());
+            v.setStorageType(storage.getStorageType());
+            v.setStorageTime(storage.getStorageTime());
+        } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) {
+            OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo;
+            v.setDeptId(app.getDeptId());
+            v.setDeptName(app.getDeptName());
+            v.setApplicantUserId(app.getApplicantUserId());
+            v.setApplicantName(app.getApplicantName());
+            v.setApplicationDate(app.getApplicationDate());
+            v.setApplicationReason(app.getApplicationReason());
+            v.setAttachmentUrl(app.getAttachmentUrl());
+            v.setTitle(storage.getTitle());
+            v.setAssetTypeId(storage.getAssetTypeId());
+            v.setStorageType(storage.getStorageType());
+            v.setStorageTime(storage.getStorageTime());
+        } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) {
+            OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo;
+            v.setDeptId(app.getDeptId());
+            v.setDeptName(app.getDeptName());
+            v.setApplicantUserId(app.getApplicantUserId());
+            v.setApplicantName(app.getApplicantName());
+            v.setApplicationDate(app.getApplicationDate());
+            v.setApplicationReason(app.getApplicationReason());
+            v.setAttachmentUrl(app.getAttachmentUrl());
+            v.setTitle(storage.getTitle());
+            v.setAssetTypeId(storage.getAssetTypeId());
+            v.setStorageType(storage.getStorageType());
+            v.setStorageTime(storage.getStorageTime());
+        }
+    }
+
+    private void setAddressInfo(Object vo, List<AssetMain> mains) {
+        if (CollectionUtils.isEmpty(mains)) {
+            return;
+        }
+        AssetMain sample = mains.get(0);
+        Integer addressType = null;
+        String useDeptName = null;
+        String warehouseName = null;
+        String address = null;
+        if (sample.getUseDeptId() != null) {
+            addressType = 0;
+            TDept dept = tDeptService.getById(sample.getUseDeptId());
+            useDeptName = dept != null ? dept.getDeptName() : null;
+        } else if (sample.getWarehouseId() != null) {
+            addressType = 1;
+            AssetWarehouse wh = assetWarehouseService.getById(sample.getWarehouseId());
+            warehouseName = wh != null ? wh.getWarehouseName() : null;
+        } else if (sample.getAddress() != null && !sample.getAddress().isEmpty()) {
+            addressType = 2;
+            address = sample.getAddress();
+        }
+
+        if (vo instanceof OaApprovalApplicationStorageGeneralDetailVO) {
+            OaApprovalApplicationStorageGeneralDetailVO v = (OaApprovalApplicationStorageGeneralDetailVO) vo;
+            v.setAddressType(addressType);
+            v.setUseDeptName(useDeptName);
+            v.setWarehouseName(warehouseName);
+            v.setAddress(address);
+        } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) {
+            OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo;
+            v.setAddressType(addressType);
+            v.setUseDeptName(useDeptName);
+            v.setWarehouseName(warehouseName);
+            v.setAddress(address);
+        } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) {
+            OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo;
+            v.setAddressType(addressType);
+            v.setUseDeptName(useDeptName);
+            v.setWarehouseName(warehouseName);
+            v.setAddress(address);
+        }
+    }
 }
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
index 8d9c135..56a6eb8 100644
--- 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
@@ -52,6 +52,9 @@
     @ApiModelProperty(value = "更新人")
     private String updateBy;
 
+    @ApiModelProperty(value = "是否可删除:无子类型且无资产关联时为true")
+    private Boolean canDelete;
+
     @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/OaApprovalApplicationStorageGeneralDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java
new file mode 100644
index 0000000..ec1cde5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java
@@ -0,0 +1,150 @@
+package com.ruoyi.system.vo.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 通用资产入库申请详情VO(返回新增时填写的所有字段)
+ */
+@Data
+@ApiModel("通用资产入库申请详情VO")
+public class OaApprovalApplicationStorageGeneralDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "申请部门ID")
+    private Integer deptId;
+
+    @ApiModelProperty(value = "申请部门名称")
+    private String deptName;
+
+    @ApiModelProperty(value = "申请人ID")
+    private Integer applicantUserId;
+
+    @ApiModelProperty(value = "申请人姓名")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请日期")
+    private LocalDate applicationDate;
+
+    @ApiModelProperty(value = "入库备注")
+    private String applicationReason;
+
+    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
+    private String attachmentUrl;
+
+    @ApiModelProperty(value = "事项标题")
+    private String title;
+
+    @ApiModelProperty(value = "资产类型ID")
+    private Integer assetTypeId;
+
+    @ApiModelProperty(value = "入库类型 0-正常入库")
+    private Boolean storageType;
+
+    @ApiModelProperty(value = "入库日期")
+    private LocalDate storageTime;
+
+    @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+    private Integer addressType;
+
+    @ApiModelProperty(value = "使用部门/位置名称")
+    private String useDeptName;
+
+    @ApiModelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "所在位置")
+    private String address;
+
+    @ApiModelProperty(value = "通用资产明细列表(按保存展开后的一条资产记录对应一条明细)")
+    private List<GeneralAssetItemVO> assetItems;
+
+    @Data
+    @ApiModel("通用资产明细VO")
+    public static class GeneralAssetItemVO implements Serializable {
+        @ApiModelProperty(value = "资产原编码")
+        private String assetOriginalCode;
+
+        @ApiModelProperty(value = "资产名称")
+        private String assetName;
+
+        @ApiModelProperty(value = "规格型号")
+        private String specificationModel;
+
+        @ApiModelProperty(value = "计量单位")
+        private String measurementUnit;
+
+        @ApiModelProperty(value = "数量")
+        private BigDecimal quantity;
+
+        @ApiModelProperty(value = "单价")
+        private BigDecimal unitPrice;
+
+        @ApiModelProperty(value = "使用年限(年)")
+        private Integer usefulLife;
+
+        @ApiModelProperty(value = "权属单位/部门ID")
+        private Integer ownershipDeptId;
+
+        @ApiModelProperty(value = "使用人")
+        private String userName;
+
+        @ApiModelProperty(value = "资产状态")
+        private String assetStatus;
+
+        @ApiModelProperty(value = "备注")
+        private String remarks;
+
+        @ApiModelProperty(value = "入账状态")
+        private String accountingStatus;
+
+        @ApiModelProperty(value = "入账时间")
+        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 = "采购日期")
+        private LocalDate purchaseDate;
+
+        @ApiModelProperty(value = "保修期(月)")
+        private Integer warrantyPeriod;
+
+        @ApiModelProperty(value = "保修到期日期")
+        private LocalDate warrantyExpireDate;
+
+        @ApiModelProperty(value = "折旧方法")
+        private String depreciationMethod;
+
+        @ApiModelProperty(value = "折旧率")
+        private java.math.BigDecimal depreciationRate;
+
+        @ApiModelProperty(value = "净值")
+        private java.math.BigDecimal netValue;
+
+        @ApiModelProperty(value = "维护周期(月)")
+        private Integer maintenanceCycle;
+
+        @ApiModelProperty(value = "上次维护日期")
+        private LocalDate lastMaintenanceDate;
+
+        @ApiModelProperty(value = "下次维护日期")
+        private LocalDate nextMaintenanceDate;
+    }
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java
new file mode 100644
index 0000000..e1e2179
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java
@@ -0,0 +1,168 @@
+package com.ruoyi.system.vo.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 房产资产入库申请详情VO(返回新增时填写的所有字段)
+ */
+@Data
+@ApiModel("房产资产入库申请详情VO")
+public class OaApprovalApplicationStoragePropertyDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "申请部门ID")
+    private Integer deptId;
+
+    @ApiModelProperty(value = "申请部门名称")
+    private String deptName;
+
+    @ApiModelProperty(value = "申请人ID")
+    private Integer applicantUserId;
+
+    @ApiModelProperty(value = "申请人姓名")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请日期")
+    private LocalDate applicationDate;
+
+    @ApiModelProperty(value = "入库备注")
+    private String applicationReason;
+
+    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
+    private String attachmentUrl;
+
+    @ApiModelProperty(value = "事项标题")
+    private String title;
+
+    @ApiModelProperty(value = "资产类型ID")
+    private Integer assetTypeId;
+
+    @ApiModelProperty(value = "入库类型 0-正常入库")
+    private Boolean storageType;
+
+    @ApiModelProperty(value = "入库日期")
+    private LocalDate storageTime;
+
+    @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+    private Integer addressType;
+
+    @ApiModelProperty(value = "使用部门/位置名称")
+    private String useDeptName;
+
+    @ApiModelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "所在位置")
+    private String address;
+
+    @ApiModelProperty(value = "房产资产明细列表(按保存展开后的一条资产记录对应一条明细)")
+    private List<PropertyAssetItemVO> assetItems;
+
+    @Data
+    @ApiModel("房产资产明细VO")
+    public static class PropertyAssetItemVO implements Serializable {
+        @ApiModelProperty(value = "资产原编码")
+        private String assetOriginalCode;
+
+        @ApiModelProperty(value = "资产名称")
+        private String assetName;
+
+        @ApiModelProperty(value = "规格型号")
+        private String specificationModel;
+
+        @ApiModelProperty(value = "计量单位")
+        private String measurementUnit;
+
+        @ApiModelProperty(value = "数量")
+        private BigDecimal quantity;
+
+        @ApiModelProperty(value = "单价")
+        private BigDecimal unitPrice;
+
+        @ApiModelProperty(value = "使用年限(年)")
+        private Integer usefulLife;
+
+        @ApiModelProperty(value = "权属单位/部门ID")
+        private Integer ownershipDeptId;
+
+        @ApiModelProperty(value = "使用人")
+        private String userName;
+
+        @ApiModelProperty(value = "资产状态")
+        private String assetStatus;
+
+        @ApiModelProperty(value = "备注")
+        private String remarks;
+
+        @ApiModelProperty(value = "入账状态")
+        private String accountingStatus;
+
+        @ApiModelProperty(value = "入账时间")
+        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 = "建成年月")
+        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 = "租赁期限起")
+        private LocalDate leaseStartDate;
+
+        @ApiModelProperty(value = "租赁期限止")
+        private LocalDate leaseEndDate;
+    }
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java
new file mode 100644
index 0000000..114a50a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java
@@ -0,0 +1,144 @@
+package com.ruoyi.system.vo.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 车辆资产入库申请详情VO(返回新增时填写的所有字段)
+ */
+@Data
+@ApiModel("车辆资产入库申请详情VO")
+public class OaApprovalApplicationStorageVehicleDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "申请部门ID")
+    private Integer deptId;
+
+    @ApiModelProperty(value = "申请部门名称")
+    private String deptName;
+
+    @ApiModelProperty(value = "申请人ID")
+    private Integer applicantUserId;
+
+    @ApiModelProperty(value = "申请人姓名")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请日期")
+    private LocalDate applicationDate;
+
+    @ApiModelProperty(value = "入库备注")
+    private String applicationReason;
+
+    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
+    private String attachmentUrl;
+
+    @ApiModelProperty(value = "事项标题")
+    private String title;
+
+    @ApiModelProperty(value = "资产类型ID")
+    private Integer assetTypeId;
+
+    @ApiModelProperty(value = "入库类型 0-正常入库")
+    private Boolean storageType;
+
+    @ApiModelProperty(value = "入库日期")
+    private LocalDate storageTime;
+
+    @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+    private Integer addressType;
+
+    @ApiModelProperty(value = "使用部门/位置名称")
+    private String useDeptName;
+
+    @ApiModelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "所在位置")
+    private String address;
+
+    @ApiModelProperty(value = "车辆资产明细列表(按保存展开后的一条资产记录对应一条明细)")
+    private List<VehicleAssetItemVO> assetItems;
+
+    @Data
+    @ApiModel("车辆资产明细VO")
+    public static class VehicleAssetItemVO implements Serializable {
+        @ApiModelProperty(value = "资产原编码")
+        private String assetOriginalCode;
+
+        @ApiModelProperty(value = "资产名称")
+        private String assetName;
+
+        @ApiModelProperty(value = "规格型号")
+        private String specificationModel;
+
+        @ApiModelProperty(value = "计量单位")
+        private String measurementUnit;
+
+        @ApiModelProperty(value = "数量")
+        private BigDecimal quantity;
+
+        @ApiModelProperty(value = "单价")
+        private BigDecimal unitPrice;
+
+        @ApiModelProperty(value = "使用年限(年)")
+        private Integer usefulLife;
+
+        @ApiModelProperty(value = "权属单位/部门ID")
+        private Integer ownershipDeptId;
+
+        @ApiModelProperty(value = "使用人")
+        private String userName;
+
+        @ApiModelProperty(value = "资产状态")
+        private String assetStatus;
+
+        @ApiModelProperty(value = "备注")
+        private String remarks;
+
+        @ApiModelProperty(value = "入账状态")
+        private String accountingStatus;
+
+        @ApiModelProperty(value = "入账时间")
+        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 = "取得日期")
+        private LocalDate acquisitionDate;
+
+        @ApiModelProperty(value = "产权形式")
+        private String propertyRightForm;
+    }
+}
+

--
Gitblit v1.7.1