From 27d8f8fbb2e02be63338b80f808969faa35adac0 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 19 九月 2025 11:36:49 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java | 44 +++ ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml | 49 +++ ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java | 14 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java | 15 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java | 6 ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java | 21 + ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java | 127 ++++++-- ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java | 26 + ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java | 8 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml | 30 ++ ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java | 16 + ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java | 10 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java | 50 +++ ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java | 8 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java | 8 ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java | 16 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java | 28 + ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java | 68 ++++ ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java | 13 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java | 14 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java | 17 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java | 73 +++++ ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java | 30 ++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java | 113 ++++++++ 24 files changed, 729 insertions(+), 75 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java index 54c123d..4d1beb1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java +++ b/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); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java index 7432256..b5d1163 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java +++ b/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(); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java index 483dcdb..1c64940 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java @@ -1,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(); } -} \ No newline at end of file + + @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); + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java new file mode 100644 index 0000000..8ecc57e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java @@ -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; + } +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java index 8aef70f..56155a6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java @@ -64,4 +64,18 @@ @NotNull(message = "入库日期不能为空") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate storageTime; -} \ No newline at end of file + + // 新增:统一的资产所在单位信息(用于整单校验) + @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; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java index 3848cb6..63d5584 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java @@ -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; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java index 06ec290..d74064c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java @@ -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; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java index e0d5a2a..ec0146a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java @@ -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; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java index eca0dea..3abb27a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java +++ b/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); + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java index 1940a85..b48ae0d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageMapper.java +++ b/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); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java index 8be23d1..1cc1695 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java @@ -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; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java new file mode 100644 index 0000000..b5af8fa --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java @@ -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; +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java new file mode 100644 index 0000000..a2c6084 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationStoragePageQuery.java @@ -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; +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java index 96b37f8..143d07a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java +++ b/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); + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java index 4c4251e..abf9846 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java +++ b/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); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java index 3c8ead4..5f32c7f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java @@ -1,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); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java index 231a1bb..cc1dd58 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java +++ b/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); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java index 0d0db98..9bab973 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetWarehouseServiceImpl.java @@ -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(), "")); }); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java index 1769d10..0640ed2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java +++ b/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; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java index a043153..f56632b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java @@ -1,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); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java new file mode 100644 index 0000000..03360cc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java @@ -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; +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java new file mode 100644 index 0000000..d174a7a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java @@ -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; +} + diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml index 1ecd079..5bb2d5c 100644 --- a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml +++ b/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> diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml index 65e8625..119f496 100644 --- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml +++ b/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> -- Gitblit v1.7.1