mitao
2 天以前 4ad572c4e51e44e3134def3c70879b3a698ab1d8
资产变更
2 文件已重命名
26个文件已修改
5个文件已添加
1106 ■■■■ 已修改文件
generator/src/test/java/com/xizang/CodeGeneratorTests.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationChangeDTO.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationDisposeDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationChangeMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationChange.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorageAsset.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationAssetPageQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationChangePageQuery.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationChangeService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java 161 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationChangeDetailVO.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationChangePageVO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationDisposeDetailVO.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationDisposePageVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generator/src/test/java/com/xizang/CodeGeneratorTests.java
@@ -3,7 +3,12 @@
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java
@@ -1,8 +1,31 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO;
import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OaApprovalApplicationChangeService;
import com.ruoyi.system.vo.asset.OaApprovalApplicationChangeDetailVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
 * <p>
@@ -12,9 +35,68 @@
 * @author WuGuanFengYue
 * @since 2025-09-15
 */
@Validated
@RestController
@Api(tags = {"OA审批-资产变更相关接口"})
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
@RequestMapping("/oa-approval-application-change")
public class OaApprovalApplicationChangeController {
    private final OaApprovalApplicationChangeService oaApprovalApplicationChangeService;
    private final ISysUserService sysUserService;
    @ApiOperation("提交资产变更申请")
    @PostMapping("/submit-change")
    @Log(title = "资产变更申请-提交", businessType = BusinessType.INSERT)
    public R<Void> submitChange(@Valid @RequestBody OaApprovalApplicationChangeDTO dto) {
        oaApprovalApplicationChangeService.submitChange(dto);
        return R.ok();
    }
    @ApiOperation("获取资产变更申请分页列表")
    @PostMapping("/page-list")
    public R<IPage<OaApprovalApplicationChangePageVO>> getChangePageList(@RequestBody OaApprovalApplicationChangePageQuery pageQuery) {
        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
        Long userId = SecurityUtils.getUserId();
        boolean isAdmin = SecurityUtils.isAdmin(userId);
        if (!isAdmin) {
            try {
                // 获取当前用户的部门名称
                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
                // 非超级管理员且非资产管理部,设置部门权限
                if (!"资产管理部".equals(deptName)) {
                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
                }
            } catch (Exception e) {
                // 如果获取部门信息失败,默认设置部门权限
                try {
                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
                } catch (Exception ex) {
                    // ignore parse, leave null if cannot parse
                }
            }
        }
        IPage<OaApprovalApplicationChangePageVO> page = oaApprovalApplicationChangeService.getChangePageList(pageQuery);
        return R.ok(page);
    }
    @ApiOperation("获取资产变更申请详情")
    @GetMapping("/detail/{id}")
    public R<OaApprovalApplicationChangeDetailVO> getChangeDetail(@ApiParam(name = "id", value = "申请单ID", required = true) @PathVariable Integer id) {
        OaApprovalApplicationChangeDetailVO detail = oaApprovalApplicationChangeService.getChangeDetail(id);
        return R.ok(detail);
    }
    @ApiOperation("删除资产变更申请")
    @DeleteMapping("/{id}")
    public R<?> deleteByApplicationId(@ApiParam(name = "id", value = "申请单ID", required = true) @PathVariable Integer id) {
        oaApprovalApplicationChangeService.deleteByApplicationId(id);
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
@@ -5,11 +5,12 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO;
import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO;
import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
import com.ruoyi.system.service.OaApprovalApplicationDisposeService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposeDetailVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@@ -17,6 +18,7 @@
import org.springframework.context.annotation.Lazy;
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.RequestBody;
@@ -87,5 +89,12 @@
        oaApprovalApplicationDisposeService.deleteByApplicationId(id);
        return R.ok();
    }
    @ApiOperation("获取资产处置申请详情")
    @GetMapping("/detail/{id}")
    public R<OaApprovalApplicationDisposeDetailVO> getDisposeDetail(@ApiParam(name = "id", value = "申请单ID", required = true) @PathVariable Integer id) {
        OaApprovalApplicationDisposeDetailVO detail = oaApprovalApplicationDisposeService.getDisposeDetail(id);
        return R.ok(detail);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationChangeDTO.java
New file
@@ -0,0 +1,63 @@
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.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.List;
/**
 * 资产变更申请DTO
 * @author mitao
 * @date 2025/9/29
 */
@Data
@ApiModel("资产变更申请DTO")
public class OaApprovalApplicationChangeDTO {
    @ApiModelProperty("事项标题")
    @NotNull(message = "事项标题不能为空")
    private String title;
    @ApiModelProperty("资产类型ID")
    @NotNull(message = "资产类型不能为空")
    private Integer assetTypeId;
    @ApiModelProperty("变更日期")
    @NotNull(message = "变更日期不能为空")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate changeTime;
    @ApiModelProperty("变更备注")
    private String applicationReason;
    @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址")
    @NotNull(message = "使用/位置类型不能为空")
    private Integer addressType;
    @ApiModelProperty(value = "使用部门ID")
    private Integer useDeptId;
    @ApiModelProperty(value = "仓库ID")
    private Integer warehouseId;
    @ApiModelProperty(value = "所在位置")
    private String address;
    @ApiModelProperty(value = "管理部门ID")
    @NotNull(message = "管理部门不能为空")
    private Integer  ownershipDeptId;
    @ApiModelProperty(value = "使用人")
    @NotBlank(message = "使用人不能为空")
    private String userName;
    @ApiModelProperty("资产列表")
    @NotEmpty(message = "资产列表不能为空")
    private List<Integer> assetMainIds;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationDisposeDTO.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/dto/dispose/OaApprovalApplicationDisposeDTO.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.dto.dispose;
package com.ruoyi.system.dto.asset;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java
@@ -55,7 +55,7 @@
        @ApiModelProperty(value = "数量")
        @NotNull(message = "数量不能为空")
        private BigDecimal quantity;
        private Integer quantity;
        @ApiModelProperty(value = "单价")
        @NotNull(message = "单价不能为空")
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java
@@ -55,7 +55,7 @@
        @ApiModelProperty(value = "数量")
        @NotNull(message = "数量不能为空")
        private BigDecimal quantity;
        private Integer quantity;
        @ApiModelProperty(value = "单价")
        @NotNull(message = "单价不能为空")
ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java
@@ -55,7 +55,7 @@
        @ApiModelProperty(value = "数量")
        @NotNull(message = "数量不能为空")
        private BigDecimal quantity;
        private Integer quantity;
        @ApiModelProperty(value = "单价")
        @NotNull(message = "单价不能为空")
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationChangeMapper.java
@@ -1,7 +1,11 @@
package com.ruoyi.system.mapper;
import com.ruoyi.system.model.OaApprovalApplicationChange;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.system.model.OaApprovalApplicationChange;
import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery;
import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
@@ -13,4 +17,12 @@
 */
public interface OaApprovalApplicationChangeMapper extends BaseMapper<OaApprovalApplicationChange> {
    /**
     * 分页查询资产变更申请列表
     * @param page 分页参数
     * @param pageQuery 查询条件
     * @return 分页结果
     */
    IPage<OaApprovalApplicationChangePageVO> selectChangePage(IPage<OaApprovalApplicationChangePageVO> page, @Param("query") OaApprovalApplicationChangePageQuery pageQuery);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java
@@ -5,7 +5,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.system.model.OaApprovalApplicationDispose;
import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO;
import org.apache.ibatis.annotations.Param;
/**
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationChange.java
@@ -52,12 +52,16 @@
    @TableField("ownership_dept_id")
    private Integer ownershipDeptId;
    @ApiModelProperty(value = "仓库ID,关联warehouse表")
    @TableField("warehouse_id")
    @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址")
    private Integer addressType;
    @ApiModelProperty(value = "使用部门ID")
    private Integer useDeptId;
    @ApiModelProperty(value = "仓库ID")
    private Integer warehouseId;
    @ApiModelProperty(value = "存放地点")
    @TableField("address")
    @ApiModelProperty(value = "所在位置")
    private String address;
    @ApiModelProperty(value = "使用人")
ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorageAsset.java
@@ -64,7 +64,7 @@
    private String measurementUnit;
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    private Integer quantity;
    @ApiModelProperty(value = "单价")
    private BigDecimal unitPrice;
ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationAssetPageQuery.java
@@ -23,5 +23,8 @@
    @ApiModelProperty("操作类型 前端不传")
    private Integer type; // 0-领用,1-借用,2-归还
    @ApiModelProperty("是否查询归还提醒 前端不传")
    private Integer returnNotify = 0;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationChangePageQuery.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.system.query;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * 资产变更申请分页查询参数
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "资产变更申请分页查询参数")
public class OaApprovalApplicationChangePageQuery extends BasePage {
    private static final long serialVersionUID = 5275799518107306565L;
    @ApiModelProperty(value = "标题/单号")
    private String keyword;
    @ApiModelProperty(value = "部门ID")
    private Integer deptId;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
@@ -98,4 +98,6 @@
     * @param applicationId
     */
    void deleteByApplicationId(Integer applicationId);
    OaApprovalApplicationAsset getOaApprovalApplicationAssetByApplicationId(Integer applicationId);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationChangeService.java
@@ -1,7 +1,12 @@
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.OaApprovalApplicationChangeDTO;
import com.ruoyi.system.model.OaApprovalApplicationChange;
import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery;
import com.ruoyi.system.vo.asset.OaApprovalApplicationChangeDetailVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO;
/**
 * <p>
@@ -13,4 +18,29 @@
 */
public interface OaApprovalApplicationChangeService extends IService<OaApprovalApplicationChange> {
    /**
     * 提交变更申请
     * @param dto 变更申请数据
     */
    void submitChange(OaApprovalApplicationChangeDTO dto);
    /**
     * 获取资产变更申请分页列表
     * @param pageQuery 分页查询参数
     * @return 分页结果
     */
    IPage<OaApprovalApplicationChangePageVO> getChangePageList(OaApprovalApplicationChangePageQuery pageQuery);
    /**
     * 获取资产变更申请详情
     * @param id 申请单ID
     * @return 详情信息
     */
    OaApprovalApplicationChangeDetailVO getChangeDetail(Integer id);
    /**
     * 删除资产变更申请
     * @param id
     */
    void deleteByApplicationId(Integer id);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java
@@ -2,10 +2,11 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO;
import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO;
import com.ruoyi.system.model.OaApprovalApplicationDispose;
import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposeDetailVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO;
/**
 * <p>
@@ -35,4 +36,11 @@
     * @param applicationId
     */
    void deleteByApplicationId(Integer applicationId);
    /**
     * 获取处置申请详情
     * @param id 申请单ID
     * @return 处置申请详情
     */
    OaApprovalApplicationDisposeDetailVO getDisposeDetail(Integer id);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
@@ -41,11 +41,12 @@
import org.springframework.stereotype.Service;
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.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -115,20 +116,45 @@
            return;
        }
        
        List<AssetMain> assetMainList = new ArrayList<>();
        Map<Integer, Integer> storageAssetIdToAssetMainIdMap = new HashMap<>();
        Map<Integer, Integer> storageAssetIdToAssetTypeMap = new HashMap<>();
        // 预查询当天已存在的资产编码数量
        LocalDate currentDate = LocalDate.now();
        Map<Integer, Long> assetTypeCountMap = new HashMap<>();
        for (OaApprovalApplicationStorageAsset storageAsset : storageAssets) {
            Integer assetTypeId = storageAsset.getAssetTypeId();
            Integer assetMainType = storageAsset.getAssetMainType();
            BigDecimal quantity = storageAsset.getQuantity();
            Integer quantity = storageAsset.getQuantity();
            
            // 根据数量生成对应条数的资产记录
            int assetCount = quantity != null ? quantity.intValue() : 1;
            int assetCount = quantity != null ? quantity : 1;
            // 获取该类型资产的编码前缀和当前数量
            String typeCodePrefix = assetTypeService.getAssetCodePrefix(assetTypeId);
            String dateStr = currentDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
            String prefix = typeCodePrefix + dateStr + "-";
            // 获取当天该类型资产的当前数量(只查询一次)
            Long currentCount = assetTypeCountMap.computeIfAbsent(assetTypeId, k ->
                this.lambdaQuery()
                    .like(AssetMain::getAssetCode, prefix)
                    .ge(AssetMain::getCreateTime, currentDate.atStartOfDay())
                    .lt(AssetMain::getCreateTime, currentDate.plusDays(1).atStartOfDay())
                    .count()
            );
            
            for (int i = 0; i < assetCount; i++) {
                // 创建资产主表记录
                AssetMain assetMain = new AssetMain();
                BeanUtil.copyProperties(storageAsset, assetMain);
                BeanUtil.copyProperties(storageAsset, assetMain, "id");
                
                // 为每个资产生成编码
                String assetCode = generateAssetCode(storageAsset.getAssetTypeId(), LocalDate.now());
                // 生成资产编码,使用递增的序号
                int sequence = (currentCount != null ? currentCount.intValue() : 0) + i + 1;
                String sequenceStr = String.format("%04d", sequence);
                String assetCode = prefix + sequenceStr;
                assetMain.setAssetCode(assetCode);
                
                // 单个资产的数量设为1
@@ -141,66 +167,102 @@
                assetMain.setCreateBy(SecurityUtils.getUsername());
                assetMain.setDisabled(false);
                
                // 保存资产主表
                assetMainMapper.insert(assetMain);
                assetMainList.add(assetMain);
                
                // 2. 根据资产类型保存扩展信息
                if (assetMainType != null) {
                    if (assetMainType == 1) {
                        // 房产资产 - 保存房产扩展信息
                        savePropertyExtension(storageAsset.getId(), assetMain.getId());
                    } else if (assetMainType == 2) {
                        // 车辆资产 - 保存车辆扩展信息
                        saveVehicleExtension(storageAsset.getId(), assetMain.getId());
                    }
                    // assetMainType == 0 为通用资产,无需保存扩展信息
                }
                // 记录storageAssetId和资产类型的映射关系,用于后续创建扩展信息
                storageAssetIdToAssetTypeMap.put(storageAsset.getId(), assetMainType);
            }
            // 更新计数器,确保下一个storageAsset的编码序号正确
            if (currentCount != null) {
                assetTypeCountMap.put(assetTypeId, currentCount + assetCount);
            }
        }
    }
    /**
     * 保存房产资产扩展信息
     */
    private void savePropertyExtension(Integer storageAssetId, Integer assetMainId) {
        // 查询房产扩展信息
        OaApprovalApplicationStorageAssetPropertyExt propertyExt = oaApprovalApplicationStorageAssetPropertyExtMapper
                .selectOne(new LambdaQueryWrapper<OaApprovalApplicationStorageAssetPropertyExt>()
                        .eq(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, storageAssetId));
        
        if (propertyExt != null) {
            AssetPropertyExt assetPropertyExt = new AssetPropertyExt();
            BeanUtil.copyProperties(propertyExt, assetPropertyExt);
            assetPropertyExt.setAssetMainId(assetMainId);
            assetPropertyExt.setCreateTime(LocalDateTime.now());
            assetPropertyExt.setCreateBy(SecurityUtils.getUsername());
            assetPropertyExt.setDisabled(false);
        // 批量保存资产主表
        if (!assetMainList.isEmpty()) {
            this.saveBatch(assetMainList);
            
            assetPropertyExtMapper.insert(assetPropertyExt);
            // 建立storageAssetId到assetMainId的映射关系
            int assetMainIndex = 0;
            for (OaApprovalApplicationStorageAsset storageAsset : storageAssets) {
                int quantity = storageAsset.getQuantity() != null ? storageAsset.getQuantity() : 1;
                for (int i = 0; i < quantity; i++) {
                    if (assetMainIndex < assetMainList.size()) {
                        storageAssetIdToAssetMainIdMap.put(storageAsset.getId(), assetMainList.get(assetMainIndex).getId());
                        assetMainIndex++;
                    }
                }
            }
            // 准备并保存扩展信息
            saveExtensionInfoBatch(storageAssetIdToAssetMainIdMap, storageAssetIdToAssetTypeMap);
        }
    }
    
    /**
     * 保存车辆资产扩展信息
     * 批量保存扩展信息
     */
    private void saveVehicleExtension(Integer storageAssetId, Integer assetMainId) {
        // 查询车辆扩展信息
        OaApprovalApplicationStorageAssetVehicleExt vehicleExt = oaApprovalApplicationStorageAssetVehicleExtMapper
                .selectOne(new QueryWrapper<OaApprovalApplicationStorageAssetVehicleExt>()
                        .eq("storage_asset_id", storageAssetId));
    private void saveExtensionInfoBatch(Map<Integer, Integer> storageAssetIdToAssetMainIdMap, Map<Integer, Integer> storageAssetIdToAssetTypeMap) {
        List<AssetPropertyExt> propertyExtList = new ArrayList<>();
        List<AssetVehicleExt> vehicleExtList = new ArrayList<>();
        
        if (vehicleExt != null) {
            AssetVehicleExt assetVehicleExt = new AssetVehicleExt();
            BeanUtil.copyProperties(vehicleExt, assetVehicleExt);
            assetVehicleExt.setAssetMainId(assetMainId);
            assetVehicleExt.setCreateTime(LocalDateTime.now());
            assetVehicleExt.setCreateBy(SecurityUtils.getUsername());
            assetVehicleExt.setDisabled(false);
        // 遍历所有需要扩展信息的storageAsset
        for (Map.Entry<Integer, Integer> entry : storageAssetIdToAssetMainIdMap.entrySet()) {
            Integer storageAssetId = entry.getKey();
            Integer assetMainId = entry.getValue();
            Integer assetMainType = storageAssetIdToAssetTypeMap.get(storageAssetId);
            
            assetVehicleExtMapper.insert(assetVehicleExt);
            if (assetMainType == null) {
                continue;
            }
            if (assetMainType == 1) {
                // 房产资产 - 查询并准备房产扩展信息
                OaApprovalApplicationStorageAssetPropertyExt propertyExt = oaApprovalApplicationStorageAssetPropertyExtMapper
                        .selectOne(new LambdaQueryWrapper<OaApprovalApplicationStorageAssetPropertyExt>()
                                .eq(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, storageAssetId));
                if (propertyExt != null) {
                    AssetPropertyExt assetPropertyExt = new AssetPropertyExt();
                    BeanUtil.copyProperties(propertyExt, assetPropertyExt,"id");
                    assetPropertyExt.setAssetMainId(assetMainId);
                    assetPropertyExt.setCreateTime(LocalDateTime.now());
                    assetPropertyExt.setCreateBy(SecurityUtils.getUsername());
                    assetPropertyExt.setDisabled(false);
                    propertyExtList.add(assetPropertyExt);
                }
            } else if (assetMainType == 2) {
                // 车辆资产 - 查询并准备车辆扩展信息
                OaApprovalApplicationStorageAssetVehicleExt vehicleExt = oaApprovalApplicationStorageAssetVehicleExtMapper
                        .selectOne(new QueryWrapper<OaApprovalApplicationStorageAssetVehicleExt>()
                                .eq("storage_asset_id", storageAssetId));
                if (vehicleExt != null) {
                    AssetVehicleExt assetVehicleExt = new AssetVehicleExt();
                    BeanUtil.copyProperties(vehicleExt, assetVehicleExt,"id");
                    assetVehicleExt.setAssetMainId(assetMainId);
                    assetVehicleExt.setCreateTime(LocalDateTime.now());
                    assetVehicleExt.setCreateBy(SecurityUtils.getUsername());
                    assetVehicleExt.setDisabled(false);
                    vehicleExtList.add(assetVehicleExt);
                }
            }
            // assetMainType == 0 为通用资产,无需保存扩展信息
        }
        // 批量保存扩展信息
        if (!propertyExtList.isEmpty()) {
            assetPropertyExtService.saveBatch(propertyExtList);
        }
        if (!vehicleExtList.isEmpty()) {
            assetVehicleExtService.saveBatch(vehicleExtList);
        }
    }
    @Override
    public List<AssetMainVO> getListByIds(List<Integer> assetMainIds) {
        if (!CollectionUtils.isEmpty(assetMainIds)) {
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
@@ -166,7 +166,7 @@
        if (app == null) {
            throw new ServiceException("审批主记录不存在");
        }
        OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one();
        OaApprovalApplicationAsset detail = getOaApprovalApplicationAssetByApplicationId(app.getId());
        if (detail == null) {
            throw new ServiceException("记录不存在");
        }
@@ -198,7 +198,7 @@
        if (app == null) {
            throw new ServiceException("审批主记录不存在");
        }
        OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one();
        OaApprovalApplicationAsset detail = getOaApprovalApplicationAssetByApplicationId(app.getId());
        if (detail == null) {
            throw new ServiceException("记录不存在");
        }
@@ -228,6 +228,7 @@
        vo.setAssetTypeId(detail.getAssetTypeId());
        vo.setOperateTime(detail.getOperateTime());
        vo.setExpectReturnDate(detail.getExpectReturnDate());
        vo.setReturnStatus(detail.getReturnStatus());
        vo.setItems(assetMainVOS);
        return vo;
    }
@@ -266,6 +267,7 @@
        OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
        applications.setApplicationCode(generateApplicationCode("GH"));
        applications.setApprovalId(ApprovalTypeEnum.RETURN.getCode());
        applications.setApplicationDate(LocalDate.now());
        // 2. 获取流程首节点,设置当前节点,并保存
        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.RETURN.getCode());
@@ -308,11 +310,14 @@
    @Override
    public IPage<OaApprovalApplicationAssetPageVO> getReturnNotifyPageList(OaApprovalApplicationAssetPageQuery pageQuery) {
        Page<OaApprovalApplicationAssetPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
        pageQuery.setType(AssetOperateTypeEnum.RETURN.getCode());
        pageQuery.setType(AssetOperateTypeEnum.BORROW.getCode());
        pageQuery.setReturnNotify(1);
        IPage<OaApprovalApplicationAssetPageVO> pageByType = this.baseMapper.getPageByType(page, pageQuery);
        LocalDate toDay = LocalDate.now();
        pageByType.getRecords().forEach(item->{
            item.setDueDays(toDay.until(item.getExpectReturnDate()).getDays());
            if (Objects.nonNull(item.getExpectReturnDate())) {
                item.setDueDays(toDay.until(item.getExpectReturnDate()).getDays());
            }
        });
        return pageByType;
    }
@@ -323,11 +328,17 @@
        if (app == null) {
            throw new ServiceException("审批主记录不存在");
        }
        OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one();
        OaApprovalApplicationAsset detail = getOaApprovalApplicationAssetByApplicationId(id);
        if (detail == null) {
            throw new ServiceException("记录不存在");
        }
        oaApprovalApplicationsService.assembleApplicationDetail(app);
        //查询借用申请单
        OaApprovalApplications borrowApprovalApplication = oaApprovalApplicationsService.getById(detail.getBorrowApplicationId());
        OaApprovalApplicationAsset borrowApprovalApplicationAsset = null;
        if (Objects.nonNull(borrowApprovalApplication)) {
            borrowApprovalApplicationAsset = getOaApprovalApplicationAssetByApplicationId(borrowApprovalApplication.getId());
        }
        List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery()
                .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId())
                .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId)
@@ -335,9 +346,12 @@
        List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds);
        OaApprovalApplicationAssetDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationAssetDetailVO.class);
        vo.setTitle(detail.getTitle());
        vo.setAssetTypeId(detail.getAssetTypeId());
        vo.setOperateTime(detail.getOperateTime());
        vo.setBorrowDate(Objects.nonNull(borrowApprovalApplicationAsset) ? borrowApprovalApplicationAsset.getOperateTime() : null);
        vo.setReturnStatus(detail.getReturnStatus());
        vo.setItems(assetMainVOS);
        return vo;
    }
@@ -348,4 +362,9 @@
        oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId).remove();
        oaApprovalApplicationsService.removeById(applicationId);
    }
    @Override
    public OaApprovalApplicationAsset getOaApprovalApplicationAssetByApplicationId(Integer applicationId) {
        return this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, applicationId).one();
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
@@ -1,10 +1,40 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO;
import com.ruoyi.system.emums.ApprovalStatusEnum;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.mapper.OaApprovalApplicationChangeMapper;
import com.ruoyi.system.model.OaApprovalApplicationAssetItem;
import com.ruoyi.system.model.OaApprovalApplicationChange;
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery;
import com.ruoyi.system.service.AssetMainService;
import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
import com.ruoyi.system.service.OaApprovalApplicationChangeService;
import com.ruoyi.system.service.OaApprovalApplicationsService;
import com.ruoyi.system.service.OaApprovalFlowNodeService;
import com.ruoyi.system.service.OaApprovalTodoService;
import com.ruoyi.system.vo.asset.AssetMainVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationChangeDetailVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO;
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.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * <p>
@@ -15,6 +45,136 @@
 * @since 2025-09-15
 */
@Service
@RequiredArgsConstructor
public class OaApprovalApplicationChangeServiceImpl extends ServiceImpl<OaApprovalApplicationChangeMapper, OaApprovalApplicationChange> implements OaApprovalApplicationChangeService {
    private final OaApprovalApplicationsService oaApprovalApplicationsService;
    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
    private final OaApprovalTodoService oaApprovalTodoService;
    private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService;
    private final AssetMainService assetMainService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitChange(OaApprovalApplicationChangeDTO dto) {
        if (CollUtil.isEmpty(dto.getAssetMainIds())) {
            throw new ServiceException("资产ID列表不能为空");
        }
        // 1. 构建并保存审批主表
        OaApprovalApplications applications = buildOaApprovalApplications(dto);
        // 2. 获取流程首节点,设置当前节点,并保存
        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.ASSET_CHANGE.getCode());
        applications.setCurrentFlowNodeId(firstFlowNode.getId());
        oaApprovalApplicationsService.save(applications);
        // 3. 创建待办
        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getOwnershipDeptId());
        // 4. 保存变更明细
        OaApprovalApplicationChange detail = buildOaApprovalApplicationChange(dto, applications.getId());
        this.save(detail);
        // 5. 保存关联的资产项
        List<OaApprovalApplicationAssetItem> items = dto.getAssetMainIds().stream()
                .map(i -> {
                    OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem();
                    item.setApprovalApplicationId(applications.getId());
                    item.setAssetMainId(i);
                    return item;
                })
                .collect(Collectors.toList());
        oaApprovalApplicationAssetItemService.saveBatch(items);
    }
    private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationChangeDTO dto) {
        OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
        applications.setApplicationCode(generateApplicationCode("BG"));
        applications.setApprovalId(ApprovalTypeEnum.ASSET_CHANGE.getCode());
        applications.setApplicationDate(LocalDate.now());
        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
        return applications;
    }
    private OaApprovalApplicationChange buildOaApprovalApplicationChange(OaApprovalApplicationChangeDTO dto, Integer applicationId) {
        OaApprovalApplicationChange change = BeanUtil.copyProperties(dto, OaApprovalApplicationChange.class);
        change.setApprovalApplicationId(applicationId);
        return change;
    }
    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);
    }
    /**
     * 生成申请单号:BG + yyyyMMdd + 3位序号
     */
    private String generateApplicationCode(String prefix) {
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        prefix = prefix + dateStr;
        Long count = oaApprovalApplicationsService.lambdaQuery()
                .like(OaApprovalApplications::getApplicationCode, prefix)
                .count();
        return prefix + String.format("%03d", count + 1);
    }
    @Override
    public IPage<OaApprovalApplicationChangePageVO> getChangePageList(OaApprovalApplicationChangePageQuery pageQuery) {
        Page<OaApprovalApplicationChangePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
        return this.baseMapper.selectChangePage(page, pageQuery);
    }
    @Override
    public OaApprovalApplicationChangeDetailVO getChangeDetail(Integer id) {
        OaApprovalApplications app = oaApprovalApplicationsService.getById(id);
        if (app == null) {
            throw new ServiceException("审批主记录不存在");
        }
        OaApprovalApplicationChange detail = this.lambdaQuery().eq(OaApprovalApplicationChange::getApprovalApplicationId, app.getId()).one();
        if (detail == null) {
            throw new ServiceException("记录不存在");
        }
        oaApprovalApplicationsService.assembleApplicationDetail(app);
        List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery()
                .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId())
                .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId)
                .distinct().collect(Collectors.toList());
        List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds);
        OaApprovalApplicationChangeDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationChangeDetailVO.class);
        vo.setTitle(detail.getTitle());
        vo.setAssetTypeId(detail.getAssetTypeId());
        vo.setAddressType(detail.getAddressType());
        vo.setUseDeptId(detail.getUseDeptId());
        vo.setWarehouseId(detail.getWarehouseId());
        vo.setAddress(detail.getAddress());
        vo.setOwnershipDeptId(detail.getOwnershipDeptId());
        vo.setUserName(detail.getUserName());
        vo.setItems(assetMainVOS);
        return vo;
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void deleteByApplicationId(Integer id) {
        OaApprovalApplications applications = oaApprovalApplicationsService.getById(id);
        if (Objects.isNull(applications)) {
            throw new ServiceException("申请记录不存在");
        }
        if (!applications.getApprovalStatus().equals(ApprovalStatusEnum.REFUSED.getCode())) {
            throw new ServiceException("该申请不能删除");
        }
        this.lambdaUpdate().eq(OaApprovalApplicationChange::getApprovalApplicationId, id).remove();
        oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, id).remove();
        oaApprovalApplicationsService.removeById(id);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
@@ -6,7 +6,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO;
import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO;
import com.ruoyi.system.emums.ApprovalStatusEnum;
import com.ruoyi.system.emums.ApprovalTypeEnum;
import com.ruoyi.system.mapper.OaApprovalApplicationDisposeMapper;
@@ -15,12 +15,15 @@
import com.ruoyi.system.model.OaApprovalApplications;
import com.ruoyi.system.model.OaApprovalFlowNode;
import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
import com.ruoyi.system.service.AssetMainService;
import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
import com.ruoyi.system.service.OaApprovalApplicationDisposeService;
import com.ruoyi.system.service.OaApprovalApplicationsService;
import com.ruoyi.system.service.OaApprovalFlowNodeService;
import com.ruoyi.system.service.OaApprovalTodoService;
import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
import com.ruoyi.system.vo.asset.AssetMainVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposeDetailVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -28,6 +31,7 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -47,6 +51,7 @@
    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
    private final OaApprovalTodoService oaApprovalTodoService;
    private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService;
    private final AssetMainService assetMainService;
    @Override
    public IPage<OaApprovalApplicationDisposePageVO> getDisposePageList(OaApprovalApplicationDisposePageQuery pageQuery) {
@@ -133,4 +138,31 @@
        oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId).remove();
        oaApprovalApplicationsService.removeById(applicationId);
    }
    @Override
    public OaApprovalApplicationDisposeDetailVO getDisposeDetail(Integer id) {
        OaApprovalApplications app = oaApprovalApplicationsService.getById(id);
        if (app == null) {
            throw new ServiceException("审批主记录不存在");
        }
        OaApprovalApplicationDispose detail = this.lambdaQuery().eq(OaApprovalApplicationDispose::getApprovalApplicationId, app.getId()).one();
        if (detail == null) {
            throw new ServiceException("记录不存在");
        }
        oaApprovalApplicationsService.assembleApplicationDetail(app);
        List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery()
                .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId())
                .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId)
                .distinct().collect(Collectors.toList());
        List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds);
        OaApprovalApplicationDisposeDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationDisposeDetailVO.class);
        vo.setTitle(detail.getTitle());
        vo.setAssetTypeId(detail.getAssetTypeId());
        vo.setDisposeTime(detail.getDisposeTime());
        vo.setDisposeType(detail.getDisposeType());
        vo.setDisposeTotalAmount(detail.getDisposeTotalAmount());
        vo.setItems(assetMainVOS);
        return vo;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -38,6 +39,7 @@
import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO;
import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -213,16 +215,9 @@
     * 构建通用资产主表数据
     */
    private OaApprovalApplicationStorageAsset buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) {
        OaApprovalApplicationStorageAsset assetMain = new OaApprovalApplicationStorageAsset();
        assetMain.setApprovalApplicationId(applicationId.intValue());
        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
        assetMain.setAssetName(item.getAssetName());
        assetMain.setCategory(item.getCategory());
        assetMain.setSpecificationModel(item.getSpecificationModel());
        OaApprovalApplicationStorageAsset assetMain = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAsset.class);
        assetMain.setApprovalApplicationId(applicationId);
        assetMain.setAssetTypeId(assetTypeId);
        assetMain.setMeasurementUnit(item.getMeasurementUnit());
        assetMain.setUnitPrice(item.getUnitPrice());
        assetMain.setUsefulLife(item.getUsefulLife());
        // 根据权属单位/部门名称填充ID
        if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) {
            TDept ownerDept = tDeptService.lambdaQuery()
@@ -232,19 +227,9 @@
                assetMain.setOwnershipDeptId(ownerDept.getId());
            }
        }
        assetMain.setUserName(item.getUserName());
        // 根据整单 addressType 写入使用部门ID或仓库ID
        applyAddressToAssetMain(assetMain, item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress());
        assetMain.setAddressType(item.getAddressType());
        assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode());
        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;
    }
@@ -252,16 +237,9 @@
     * 构建房产资产主表数据
     */
    private OaApprovalApplicationStorageAsset buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) {
        OaApprovalApplicationStorageAsset assetMain = new OaApprovalApplicationStorageAsset();
        assetMain.setApprovalApplicationId(applicationId.intValue());
        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
        assetMain.setAssetName(item.getAssetName());
        assetMain.setCategory(item.getCategory());
        assetMain.setSpecificationModel(item.getSpecificationModel());
        OaApprovalApplicationStorageAsset assetMain = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAsset.class);
        assetMain.setApprovalApplicationId(applicationId);
        assetMain.setAssetTypeId(assetTypeId);
        assetMain.setMeasurementUnit(item.getMeasurementUnit());
        assetMain.setUnitPrice(item.getUnitPrice());
        assetMain.setUsefulLife(item.getUsefulLife());
        if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) {
            TDept ownerDept = tDeptService.lambdaQuery()
                    .eq(TDept::getDeptName, item.getOwnershipDeptName())
@@ -270,18 +248,8 @@
                assetMain.setOwnershipDeptId(ownerDept.getId());
            }
        }
        assetMain.setUserName(item.getUserName());
        applyAddressToAssetMain(assetMain, item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress());
        assetMain.setAddressType(item.getAddressType());
        assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode());
        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;
    }
@@ -289,16 +257,9 @@
     * 构建车辆资产主表数据
     */
    private OaApprovalApplicationStorageAsset buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) {
        OaApprovalApplicationStorageAsset assetMain = new OaApprovalApplicationStorageAsset();
        assetMain.setApprovalApplicationId(applicationId.intValue());
        assetMain.setAssetOriginalCode(item.getAssetOriginalCode());
        assetMain.setAssetName(item.getAssetName());
        assetMain.setCategory(item.getCategory());
        assetMain.setSpecificationModel(item.getSpecificationModel());
        OaApprovalApplicationStorageAsset assetMain = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAsset.class);
        assetMain.setApprovalApplicationId(applicationId);
        assetMain.setAssetTypeId(assetTypeId);
        assetMain.setMeasurementUnit(item.getMeasurementUnit());
        assetMain.setUnitPrice(item.getUnitPrice());
        assetMain.setUsefulLife(item.getUsefulLife());
        if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) {
            TDept ownerDept = tDeptService.lambdaQuery()
                    .eq(TDept::getDeptName, item.getOwnershipDeptName())
@@ -307,18 +268,8 @@
                assetMain.setOwnershipDeptId(ownerDept.getId());
            }
        }
        assetMain.setUserName(item.getUserName());
        applyAddressToAssetMain(assetMain, item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress());
        assetMain.setAddressType(item.getAddressType());
        assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode());
        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;
    }
@@ -368,25 +319,8 @@
     * 构建房产资产扩展数据
     */
    private OaApprovalApplicationStorageAssetPropertyExt buildAssetPropertyExt(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer assetMainId) {
        OaApprovalApplicationStorageAssetPropertyExt propertyExt = new OaApprovalApplicationStorageAssetPropertyExt();
        OaApprovalApplicationStorageAssetPropertyExt propertyExt = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAssetPropertyExt.class);
        propertyExt.setStorageAssetId(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.setMortgaged(item.getMortgaged());
        propertyExt.setTenantName(item.getTenantName());
        propertyExt.setRentalAmount(item.getRentalAmount());
        propertyExt.setLeaseStartDate(item.getLeaseStartDate());
        propertyExt.setLeaseEndDate(item.getLeaseEndDate());
        propertyExt.setDisabled(false);
        return propertyExt;
    }
@@ -394,17 +328,8 @@
     * 构建车辆资产扩展数据
     */
    private OaApprovalApplicationStorageAssetVehicleExt buildAssetVehicleExt(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer assetMainId) {
        OaApprovalApplicationStorageAssetVehicleExt vehicleExt = new OaApprovalApplicationStorageAssetVehicleExt();
        OaApprovalApplicationStorageAssetVehicleExt vehicleExt = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAssetVehicleExt.class);
        vehicleExt.setStorageAssetId(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;
    }
@@ -431,39 +356,20 @@
     */
    private OaApprovalApplications buildOaApprovalApplications(Object dto) {
        OaApprovalApplications applications = new OaApprovalApplications();
        applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode());
        applications.setApplicationDate(LocalDate.now());
        if (dto instanceof OaApprovalApplicationStorageGeneralDTO) {
            OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto;
            applications.setApplicantUserId(generalDTO.getApplicantUserId());
            applications.setApplicantName(generalDTO.getApplicantName());
            applications.setDeptId(generalDTO.getDeptId());
            applications.setDeptName(generalDTO.getDeptName());
            applications.setApplicationDate(LocalDate.now());
            applications.setApplicationReason(generalDTO.getApplicationReason());
            applications.setAttachmentUrl(generalDTO.getAttachmentUrl());
            BeanUtils.copyProperties(generalDTO, applications);
        } 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(LocalDate.now());
            applications.setApplicationReason(propertyDTO.getApplicationReason());
            applications.setAttachmentUrl(propertyDTO.getAttachmentUrl());
            BeanUtils.copyProperties(propertyDTO, applications);
        } 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(LocalDate.now());
            applications.setApplicationReason(vehicleDTO.getApplicationReason());
            applications.setAttachmentUrl(vehicleDTO.getAttachmentUrl());
            BeanUtils.copyProperties(vehicleDTO, applications);
        }
        applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode());
        applications.setApplicationDate(LocalDate.now());
        applications.setApplicationCode(generateApplicationCode());
        applications.setDisabled(0);
        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
        return applications;
    }
@@ -473,26 +379,17 @@
     */
    private OaApprovalApplicationStorage buildOaApprovalApplicationStorage(Object dto, Integer applicationId) {
        OaApprovalApplicationStorage storage = new OaApprovalApplicationStorage();
        storage.setApprovalApplicationId(applicationId.intValue());
        storage.setApprovalApplicationId(applicationId);
        
        if (dto instanceof OaApprovalApplicationStorageGeneralDTO) {
            OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto;
            storage.setTitle(generalDTO.getTitle());
            storage.setAssetTypeId(generalDTO.getAssetTypeId());
            storage.setStorageType(generalDTO.getStorageType());
            storage.setStorageTime(generalDTO.getStorageTime());
            BeanUtils.copyProperties(generalDTO, storage);
        } 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());
            BeanUtils.copyProperties(propertyDTO, storage);
        } 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());
            BeanUtils.copyProperties(vehicleDTO, storage);
        }
        
        return storage;
@@ -791,6 +688,24 @@
    public void removeByApplicationId(Integer id) {
        //删除入库申请相关数据
        this.lambdaUpdate().eq(OaApprovalApplicationStorage::getApprovalApplicationId, id).remove();
        List<OaApprovalApplicationStorageAsset> list = oaApprovalApplicationStorageAssetService.lambdaQuery()
                .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, id).list();
        List<Integer> storageAssetIds = list.stream().map(OaApprovalApplicationStorageAsset::getId).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(storageAssetIds)) {
            //删除资产申请扩展表数据
            OaApprovalApplicationStorageAsset oaApprovalApplicationStorageAsset = list.get(0);
            if (oaApprovalApplicationStorageAsset.getAssetMainType().equals(AssetTypeEnum.HOUSE.getCode())) {
                oaApprovalApplicationStorageAssetPropertyExtService.lambdaUpdate()
                        .in(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, storageAssetIds).remove();
            }else if (oaApprovalApplicationStorageAsset.getAssetMainType().equals(AssetTypeEnum.VEHICLE.getCode())) {
                oaApprovalApplicationStorageAssetVehicleExtService.lambdaUpdate()
                        .in(OaApprovalApplicationStorageAssetVehicleExt::getStorageAssetId, storageAssetIds).remove();
            }
        }
        //删除资产申请主表数据
        oaApprovalApplicationStorageAssetService.lambdaUpdate()
                .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, id).remove();
        //删除入库申请单
        oaApprovalApplicationsService.removeById(id);
    }
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java
@@ -73,6 +73,13 @@
    @ApiModelProperty(value = "借用审批ID,类型为归还时使用。")
    private Integer borrowApplicationId;
    @ApiModelProperty(value = "归还状态 0-待归还,1-部分归还,2-全部归还")
    private Integer returnStatus;
    @ApiModelProperty(value = "借用日期")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private LocalDate borrowDate;
    @ApiModelProperty("关联资产项列表")
    private List<AssetMainVO> items;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationChangeDetailVO.java
New file
@@ -0,0 +1,86 @@
package com.ruoyi.system.vo.asset;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
/**
 * 资产领用/借用/归还 详情VO
 */
@Data
@ApiModel("资产变更详情VO")
public class OaApprovalApplicationChangeDetailVO implements Serializable {
    private static final long serialVersionUID = -7331732809498749263L;
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "申请单号")
    private String applicationCode;
    @ApiModelProperty(value = "审批ID")
    private Integer approvalId;
    @ApiModelProperty(value = "申请人ID")
    private Integer applicantUserId;
    @ApiModelProperty(value = "申请人")
    private String applicantName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "部门ID")
    private Integer deptId;
    @ApiModelProperty(value = "变更日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate applicationDate;
    @ApiModelProperty(value = "事由/原因/说明/备注")
    private String applicationReason;
    @ApiModelProperty(value = "审批状态 0-草稿,1-待审批,2-审批通过,3-审批拒绝 ,4-已撤回")
    private Integer approvalStatus;
    @ApiModelProperty(value = "当前流程id")
    private Integer currentFlowNodeId;
    @ApiModelProperty(value = "事项标题")
    private String title;
    @ApiModelProperty(value = "资产类型")
    private Integer assetTypeId;
    @ApiModelProperty(value = "变更日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate changeTime;
    @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址")
    private Integer addressType;
    @ApiModelProperty(value = "使用部门ID")
    private Integer useDeptId;
    @ApiModelProperty(value = "仓库ID")
    private Integer warehouseId;
    @ApiModelProperty(value = "所在位置")
    private String address;
    @ApiModelProperty(value = "管理部门ID")
    private Integer  ownershipDeptId;
    @ApiModelProperty(value = "使用人")
    private String userName;
    @ApiModelProperty("关联资产项列表")
    private List<AssetMainVO> items;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationChangePageVO.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.system.vo.asset;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
/**
 * 资产变更申请分页列表VO
 */
@Data
@ApiModel(value = "资产变更申请分页列表VO")
public class OaApprovalApplicationChangePageVO implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "审批申请ID")
    private Integer id;
    @ApiModelProperty(value = "单据号")
    private String applicationCode;
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "变更部门/公司")
    private String deptName;
    @ApiModelProperty(value = "申请人")
    private String applicantName;
    @ApiModelProperty(value = "申请原因")
    private String applicationReason;
    @ApiModelProperty(value = "申请日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate applicationDate;
    @ApiModelProperty(value = "审核状态 0-待审核,1-审核中,2-已通过,3-已拒绝")
    private Integer approvalStatus;
    @ApiModelProperty(value = "审核状态名称")
    private String approvalStatusName;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationDisposeDetailVO.java
New file
@@ -0,0 +1,79 @@
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 org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
 * 资产领用/借用/归还 详情VO
 */
@Data
@ApiModel("资产处置详情VO")
public class OaApprovalApplicationDisposeDetailVO implements Serializable {
    private static final long serialVersionUID = -7331732809498749263L;
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "申请单号")
    private String applicationCode;
    @ApiModelProperty(value = "审批ID")
    private Integer approvalId;
    @ApiModelProperty(value = "申请人ID")
    private Integer applicantUserId;
    @ApiModelProperty(value = "申请人")
    private String applicantName;
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @ApiModelProperty(value = "部门ID")
    private Integer deptId;
    @ApiModelProperty(value = "申请日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate applicationDate;
    @ApiModelProperty(value = "事由/原因/说明/备注")
    private String applicationReason;
    @ApiModelProperty(value = "审批状态 0-草稿,1-待审批,2-审批通过,3-审批拒绝 ,4-已撤回")
    private Integer approvalStatus;
    @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接")
    private String attachmentUrl;
    @ApiModelProperty(value = "当前流程id")
    private Integer currentFlowNodeId;
    @ApiModelProperty(value = "事项标题")
    private String title;
    @ApiModelProperty(value = "资产类型")
    private Integer assetTypeId;
    @ApiModelProperty("处置日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate disposeTime;
    @ApiModelProperty("处置方式 0-报废,1-报损,2-捐赠")
    private Integer disposeType;
    @ApiModelProperty("处置总金额(元)")
    private BigDecimal disposeTotalAmount;
    @ApiModelProperty("关联资产项列表")
    private List<AssetMainVO> items;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationDisposePageVO.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/vo/dispose/OaApprovalApplicationDisposePageVO.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.vo.dispose;
package com.ruoyi.system.vo.asset;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java
@@ -81,7 +81,7 @@
        private String measurementUnit;
        @ApiModelProperty(value = "数量")
        private BigDecimal quantity;
        private Integer quantity;
        @ApiModelProperty(value = "单价")
        private BigDecimal unitPrice;
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java
@@ -80,7 +80,7 @@
        private String measurementUnit;
        @ApiModelProperty(value = "数量")
        private BigDecimal quantity;
        private Integer quantity;
        @ApiModelProperty(value = "单价")
        private BigDecimal unitPrice;
ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java
@@ -80,7 +80,7 @@
        private String measurementUnit;
        @ApiModelProperty(value = "数量")
        private BigDecimal quantity;
        private Integer quantity;
        @ApiModelProperty(value = "单价")
        private BigDecimal unitPrice;
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml
@@ -42,6 +42,9 @@
        <where>
            AND aaa.disabled = 0
            AND oaa.type = #{query.type}
           <if test="query.returnNotify == 1">
               AND oaa.return_status != 2
           </if>
            <if test="query != null and query.keyword != null and query.keyword != ''">
                AND (
                    oaa.title LIKE CONCAT('%', #{query.keyword}, '%')
@@ -71,7 +74,7 @@
        LEFT JOIN oa_approval_application_asset oaaa ON oaaai.approval_application_id = oaaa.approval_application_id
        LEFT JOIN oa_approval_applications oaa ON oaaai.approval_application_id = oaa.id
        <where>
            oaaa.type = 2 AND oaaa.borrow_application_id = #{applicationId}
            oaaa.type = 2 AND oaaa.borrow_application_id = #{applicationId} AND oaa.approval_status = 1
            <if test="assetMainIds != null and assetMainIds.size() > 0">
                AND oaaai.asset_main_id IN
                <foreach collection="assetMainIds" item="id" open="(" separator="," close=")">
@@ -86,14 +89,20 @@
            parameterType="java.lang.Long">
        SELECT
            oaa.*,
            oaaa.title,
            oaaa.asset_type_id,
            oaaa.operate_time
        FROM
            oa_approval_applications oaa
                LEFT JOIN oa_approval_application_asset oaaa ON oaa.id = oaaa.approval_application_id
                LEFT JOIN oa_approval_application_asset borrow_oaaa ON borrow_oaaa.borrow_application_id = oaa.id
                AND borrow_oaaa.return_status != 2
        WHERE
            oaa.applicant_user_id = #{userId}
          AND oaa.approval_status = 1
          AND oaa.approval_status = '${@com.ruoyi.system.emums.ApprovalStatusEnum@PASSED.getCode()}'
          AND oaaa.type = 1
        AND oaa.approval_id = '${@com.ruoyi.system.emums.ApprovalTypeEnum@BORROW.getCode()}'
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml
@@ -20,4 +20,38 @@
        id, approval_application_id, title, asset_type_id, change_time, ownership_dept_id, warehouse_id, address, user_name
    </sql>
    <!-- 分页查询资产变更申请列表 -->
    <select id="selectChangePage" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO">
        SELECT
            app.id,
            app.application_code AS applicationCode,
            change.title,
            d.dept_name AS deptName,
            u.nick_name AS applicantName,
            app.application_reason AS applicationReason,
            app.application_date AS applicationDate,
            app.approval_status AS approvalStatus,
            CASE app.approval_status
                WHEN 0 THEN '待审核'
                WHEN 1 THEN '审核中'
                WHEN 2 THEN '已通过'
                WHEN 3 THEN '已拒绝'
                ELSE '未知'
            END AS approvalStatusName
        FROM oa_approval_applications app
        INNER JOIN oa_approval_application_change change ON app.id = change.approval_application_id
        LEFT JOIN sys_user u ON app.applicant_user_id = u.user_id
        LEFT JOIN t_dept d ON app.dept_id = d.id
        WHERE app.disabled = 0
        AND app.approval_id = 4  <!-- 资产变更审批类型 -->
        <if test="query.keyword != null and query.keyword != ''">
            AND (change.title LIKE CONCAT('%', #{query.keyword}, '%')
                 OR app.application_code LIKE CONCAT('%', #{query.keyword}, '%'))
        </if>
        <if test="query.deptId != null">
            AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.parent_id))
        </if>
        ORDER BY app.create_time DESC
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml
@@ -19,7 +19,7 @@
    </sql>
    <!-- 分页查询资产处置申请列表 -->
    <select id="getDisposePageList" resultType="com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO">
    <select id="getDisposePageList" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO">
        SELECT 
            app.id,
            app.application_code AS applicationCode,
@@ -60,7 +60,7 @@
                 OR app.application_code LIKE CONCAT('%', #{query.keyword}, '%'))
        </if>
        <if test="query.deptId != null">
            AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.ancestors))
            AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.parent_id))
        </if>
        ORDER BY app.create_time DESC
    </select>