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)); } //设置部门名称 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>