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