From 8343cb5272cfb37edeb9767d8bcc5fc107be3874 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期二, 23 九月 2025 20:59:18 +0800 Subject: [PATCH] 资产借用归还接口 --- ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java | 9 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java | 48 ++++ ruoyi-system/src/main/java/com/ruoyi/system/emums/ReturnStatusEnum.java | 23 ++ ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java | 8 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReturnDTO.java | 56 +++++ ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml | 44 ++++ ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java | 7 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java | 70 ++++++ ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java | 6 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java | 1 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainVO.java | 48 ++++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java | 41 +++ ruoyi-system/src/main/java/com/ruoyi/system/bo/OaApprovalApplicationAssetReturnBO.java | 28 ++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java | 177 +++++++++++++++- ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java | 5 15 files changed, 539 insertions(+), 32 deletions(-) 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 c83e622..1c1835a 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 @@ -7,23 +7,26 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO; +import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReturnDTO; import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery; import com.ruoyi.system.service.OaApprovalApplicationAssetService; -import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; +import com.ruoyi.system.vo.asset.AssetMainVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; +import java.util.List; /** * <p> @@ -43,6 +46,7 @@ @PostMapping("/submit-receive") @Log(title = "资产领用申请-提交", businessType = BusinessType.INSERT) public R<Void> submitReceive(@Valid @RequestBody OaApprovalApplicationAssetReceiveDTO dto) { + //TODO 提交时需要校验资产状态,是否已经被领用借用处置 oaApprovalApplicationAssetService.submitReceiveBorrow(dto); return R.ok(); } @@ -96,4 +100,66 @@ return R.ok(page); } + @ApiOperation("获取资产借用详情") + @GetMapping("/detail/borrow/{id}") + public R<OaApprovalApplicationAssetDetailVO> getBorrowDetail(@ApiParam(name = "id", value = "审批单ID", required = true) @PathVariable Integer id) { + OaApprovalApplicationAssetDetailVO detail = oaApprovalApplicationAssetService.getBorrowDetail(id); + return R.ok(detail); + } + + @ApiOperation("查询当前登录用户提交的借用申请记录列表") + @GetMapping("/borrow-list") + public R<List<OaApprovalApplicationAssetDetailVO>> getBorrowDetailByApplicationCode() { + List<OaApprovalApplicationAssetDetailVO> detail = oaApprovalApplicationAssetService.getBorrowDetailByApplicationCode(); + return R.ok(detail); + } + + @ApiOperation(("根据借用单ID获取借用资产列表")) + @GetMapping("/borrow-detail-list/{id}") + public R<List<AssetMainVO>> getBorrowDetailList(@ApiParam(name = "id", value = "审批单ID", required = true) @PathVariable Integer id) { + List<AssetMainVO> list = oaApprovalApplicationAssetService.getBorrowDetailList(id); + return R.ok(list); + } + + @ApiOperation("提交资产归还申请") + @PostMapping("/submit-return") + @Log(title = "资产归还申请-提交", businessType = BusinessType.INSERT) + public R<Void> submitReturn(@Valid @RequestBody OaApprovalApplicationAssetReturnDTO dto) { + oaApprovalApplicationAssetService.submitReturn(dto); + return R.ok(); + } + + @ApiOperation("获取资产归还申请分页列表") + @PostMapping("/page-return-list") + public R<IPage<OaApprovalApplicationAssetPageVO>> getReturnPageList(@RequestBody OaApprovalApplicationAssetPageQuery pageQuery) { + // 数据权限:非管理员仅能查看本部门 + Long userId = SecurityUtils.getUserId(); + boolean isAdmin = SecurityUtils.isAdmin(userId); + if (!isAdmin) { + try { + pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getDeptId())); + } catch (Exception e) { + // ignore parse, leave null if cannot parse + } + } + IPage<OaApprovalApplicationAssetPageVO> page = oaApprovalApplicationAssetService.getReturnPageList(pageQuery); + return R.ok(page); + } + + @ApiOperation("获取资产归还提醒分页列表") + @PostMapping("/page-return-notify-list") + public R<IPage<OaApprovalApplicationAssetPageVO>> getReturnNotifyPageList(@RequestBody OaApprovalApplicationAssetPageQuery pageQuery) { + // 数据权限:非管理员仅能查看本部门 + Long userId = SecurityUtils.getUserId(); + boolean isAdmin = SecurityUtils.isAdmin(userId); + if (!isAdmin) { + try { + pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getDeptId())); + } catch (Exception e) { + // ignore parse, leave null if cannot parse + } + } + IPage<OaApprovalApplicationAssetPageVO> page = oaApprovalApplicationAssetService.getReturnNotifyPageList(pageQuery); + return R.ok(page); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/OaApprovalApplicationAssetReturnBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/OaApprovalApplicationAssetReturnBO.java new file mode 100644 index 0000000..43ac50f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/OaApprovalApplicationAssetReturnBO.java @@ -0,0 +1,28 @@ +package com.ruoyi.system.bo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author mitao + * @date 2025/9/23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel("资产归还业务对象") +public class OaApprovalApplicationAssetReturnBO { + + @ApiModelProperty(value = "资产ID") + @TableField("asset_main_id") + private Integer assetMainId; + + @ApiModelProperty(value = "申请单号") + @TableField("application_code") + private String applicationCode; + + @ApiModelProperty(value = "归还状态 1-归还中(已有归还审批,待审批状态),2-已归还(已有归还审批,审批通过状态)") + private Integer returnStatus; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReturnDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReturnDTO.java new file mode 100644 index 0000000..568505f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReturnDTO.java @@ -0,0 +1,56 @@ +package com.ruoyi.system.dto.asset; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; +import java.util.List; + +/** + * @author mitao + * @date 2025/9/23 + */ +@Data +@ApiModel("资产归还申请DTO") +public class OaApprovalApplicationAssetReturnDTO { + + @ApiModelProperty(value = "借用审批申请记录ID") + private Integer approvalApplicationId; + + @ApiModelProperty("事项标题") + @NotNull(message = "事项标题不能为空") + private String title; + + @ApiModelProperty("归还日期") + @NotNull(message = "归还日期不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate operateTime; + + @ApiModelProperty("借用人用户ID") + @NotNull(message = "借用人不能为空") + private Integer applicantUserId; + + @ApiModelProperty("借用人名称") + @NotNull(message = "借用人名称不能为空") + private String applicantName; + + @ApiModelProperty("借用部门ID") + @NotNull(message = "借用部门不能为空") + private Integer deptId; + + @ApiModelProperty("借用部门名称") + @NotNull(message = "借用部门名称不能为空") + private String deptName; + + @ApiModelProperty("归还备注") + private String applicationReason; + + @ApiModelProperty("归还资产列表") + @NotEmpty(message = "归还资产列表不能为空") + private List<Integer> assetMainIds; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/emums/ReturnStatusEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/emums/ReturnStatusEnum.java new file mode 100644 index 0000000..ccc1bc7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/emums/ReturnStatusEnum.java @@ -0,0 +1,23 @@ +package com.ruoyi.system.emums; + +import lombok.Getter; +import lombok.AllArgsConstructor; +@Getter +@AllArgsConstructor +public enum ReturnStatusEnum { + NOT_RETURN(0, "未归还"), + RETURNING(1, "归还中"), + RETURNED(2, "已归还"); + + private final Integer code; + private final String desc; + + public static ReturnStatusEnum getEnumByCode(Integer code) { + for (ReturnStatusEnum e : ReturnStatusEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java index 848141c..a69ea14 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java @@ -3,10 +3,14 @@ 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.bo.OaApprovalApplicationAssetReturnBO; import com.ruoyi.system.model.OaApprovalApplicationAsset; import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * <p> @@ -20,4 +24,8 @@ IPage<OaApprovalApplicationAssetPageVO> getPageByType(Page<OaApprovalApplicationAssetPageVO> page, @Param("query") OaApprovalApplicationAssetPageQuery query); + + List<OaApprovalApplicationAssetReturnBO> selectReturnByAssetIds(@Param("assetMainIds") List<Integer> assetMainIds, @Param("applicationId") Integer applicationId); + + List<OaApprovalApplicationAssetDetailVO> getBorrowDetailByApplicationCode(@Param("userId") Long userId); } 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 d557b64..7c6da6b 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 @@ -158,7 +158,6 @@ @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/model/OaApprovalApplicationAsset.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java index 71bc14c..7f98adb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java @@ -60,5 +60,10 @@ @TableField("borrow_application_id") private Integer borrowApplicationId; + @ApiModelProperty(value = "归还状态 0-未归还,1-部分归还,2-已归还") + @TableField("return_status") + private Integer returnStatus; + + } 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 bf213e6..ba22234 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 @@ -5,8 +5,10 @@ import com.ruoyi.system.model.AssetMain; import com.ruoyi.system.query.AssetMainPageQuery; import com.ruoyi.system.vo.asset.AssetMainPageVO; +import com.ruoyi.system.vo.asset.AssetMainVO; import java.time.LocalDate; +import java.util.List; /** * 资产主表 服务类 @@ -33,4 +35,11 @@ * @param id */ void saveAssetByApprovalApplicationId(Integer id); + + /** + * 根据资产ID列表获取资产信息 + * @param assetMainIds + * @return + */ + List<AssetMainVO> getListByIds(List<Integer> assetMainIds); } 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 840988e..6b16899 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,11 +2,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import com.ruoyi.system.model.OaApprovalApplicationAsset; import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO; +import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReturnDTO; +import com.ruoyi.system.model.OaApprovalApplicationAsset; import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery; -import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; +import com.ruoyi.system.vo.asset.AssetMainVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; + +import java.util.List; /** * <p> @@ -41,4 +45,44 @@ * @return */ IPage<OaApprovalApplicationAssetPageVO> getBorrowPageList(OaApprovalApplicationAssetPageQuery pageQuery); + + /** + * 获取借用单详情 + * @param id + * @return + */ + OaApprovalApplicationAssetDetailVO getBorrowDetail(Integer id); + + /** + * 查询当前登录人未归还的借用单列表 + * @return + */ + List<OaApprovalApplicationAssetDetailVO> getBorrowDetailByApplicationCode(); + + /** + * 根据审批单ID获取借用单详情列表 + * @param id + * @return + */ + List<AssetMainVO> getBorrowDetailList(Integer applicationId); + + /** + * 归还申请 + * @param dto + */ + void submitReturn(OaApprovalApplicationAssetReturnDTO dto); + + /** + * 归还列表 + * @param pageQuery + * @return + */ + IPage<OaApprovalApplicationAssetPageVO> getReturnPageList(OaApprovalApplicationAssetPageQuery pageQuery); + + /** + * 获取归还提醒列表 + * @param pageQuery + * @return + */ + IPage<OaApprovalApplicationAssetPageVO> getReturnNotifyPageList(OaApprovalApplicationAssetPageQuery 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 055b0e6..3840bd6 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,6 +1,11 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.core.domain.entity.TDept; +import com.ruoyi.system.model.AssetType; +import com.ruoyi.system.service.TDeptService; +import com.ruoyi.system.vo.asset.AssetMainVO; import org.springframework.util.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -36,7 +41,10 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 资产主表 服务实现类 @@ -57,6 +65,7 @@ private final OaApprovalApplicationStorageAssetVehicleExtMapper oaApprovalApplicationStorageAssetVehicleExtMapper; private final AssetPropertyExtMapper assetPropertyExtMapper; private final AssetVehicleExtMapper assetVehicleExtMapper; + private final TDeptService tDeptService; @Override public IPage<AssetMainPageVO> getApprovedPageList(AssetMainPageQuery pageQuery) { Page<AssetMainPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); @@ -92,8 +101,8 @@ public void saveAssetByApprovalApplicationId(Integer approvalApplicationId) { // 1. 根据approvalApplicationId查询审批通过的资产列表 List<OaApprovalApplicationStorageAsset> storageAssets = oaApprovalApplicationStorageAssetMapper - .selectList(new QueryWrapper<OaApprovalApplicationStorageAsset>() - .eq("approval_application_id", approvalApplicationId)); + .selectList(new LambdaQueryWrapper<OaApprovalApplicationStorageAsset>() + .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, approvalApplicationId)); if (CollectionUtils.isEmpty(storageAssets)) { return; @@ -149,8 +158,8 @@ private void savePropertyExtension(Integer storageAssetId, Integer assetMainId) { // 查询房产扩展信息 OaApprovalApplicationStorageAssetPropertyExt propertyExt = oaApprovalApplicationStorageAssetPropertyExtMapper - .selectOne(new QueryWrapper<OaApprovalApplicationStorageAssetPropertyExt>() - .eq("storage_asset_id", storageAssetId)); + .selectOne(new LambdaQueryWrapper<OaApprovalApplicationStorageAssetPropertyExt>() + .eq(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, storageAssetId)); if (propertyExt != null) { AssetPropertyExt assetPropertyExt = new AssetPropertyExt(); @@ -184,4 +193,28 @@ assetVehicleExtMapper.insert(assetVehicleExt); } } + + @Override + public List<AssetMainVO> getListByIds(List<Integer> assetMainIds) { + if (!CollectionUtils.isEmpty(assetMainIds)) { + List<AssetMain> assetMains = this.lambdaQuery() + .in(AssetMain::getId, assetMainIds) + .list(); + //查询资产类型名称 + List<Integer> assetTypeIds = assetMains.stream().map(AssetMain::getAssetTypeId).distinct().collect(Collectors.toList()); + Map<Integer, String> typeNameMap = assetTypeIds.isEmpty() ? Collections.emptyMap() : assetTypeService.listByIds(assetTypeIds).stream() + .collect(Collectors.toMap(AssetType::getId, AssetType::getTypeName)); + //查询归属部门名称 + List<Integer> deptIds = assetMains.stream().map(AssetMain::getOwnershipDeptId).distinct().collect(Collectors.toList()); + Map<Integer, String> deptNameMap = deptIds.isEmpty() ? Collections.emptyMap() : tDeptService.listByIds(deptIds).stream() + .collect(Collectors.toMap(TDept::getId, TDept::getDeptName)); + List<AssetMainVO> voList = BeanUtil.copyToList(assetMains, AssetMainVO.class); + for (AssetMainVO assetMainVO : voList) { + assetMainVO.setAssetTypeName(typeNameMap.get(assetMainVO.getAssetTypeId())); + assetMainVO.setOwnershipDeptName(deptNameMap.get(assetMainVO.getOwnershipDeptId())); + } + return voList; + } + return Collections.emptyList(); + } } 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 d87033e..8fcf871 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,34 +1,47 @@ package com.ruoyi.system.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.system.bo.OaApprovalApplicationAssetReturnBO; import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO; +import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReturnDTO; import com.ruoyi.system.emums.ApprovalStatusEnum; import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.emums.AssetOperateTypeEnum; +import com.ruoyi.system.emums.ReturnStatusEnum; 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.query.OaApprovalApplicationAssetPageQuery; +import com.ruoyi.system.service.AssetMainService; 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 com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; +import com.ruoyi.system.vo.asset.AssetMainVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -40,21 +53,22 @@ * @since 2025-09-15 */ @Service -@RequiredArgsConstructor +@RequiredArgsConstructor(onConstructor_ = {@Lazy}) 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; + private final AssetMainService assetMainService; @Override @Transactional(rollbackFor = Exception.class) public void submitReceiveBorrow(OaApprovalApplicationAssetReceiveDTO dto) { - if (CollectionUtils.isEmpty(dto.getAssetMainIds())) { - throw new ServiceException("领用资产ID列表不能为空"); + if (CollUtil.isEmpty(dto.getAssetMainIds())) { + throw new ServiceException("资产ID列表不能为空"); } - + validateAssetStatus(dto.getAssetMainIds()); // 1. 构建并保存审批主表 OaApprovalApplications applications = buildOaApprovalApplications(dto); @@ -83,6 +97,11 @@ oaApprovalApplicationAssetItemService.saveBatch(items); } + //TODO 是否需要限制只有未提交审批的资产才能提交 + private void validateAssetStatus(List<Integer> assetMainIds) { + + } + private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) { List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery() .eq(OaApprovalFlowNode::getApprovalId, approvalId) @@ -97,8 +116,8 @@ private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationAssetReceiveDTO dto) { OaApprovalApplications applications = new OaApprovalApplications(); - applications.setApplicationCode(generateApplicationCode()); - applications.setApprovalId(ApprovalTypeEnum.GRAB.getCode()); + applications.setApplicationCode(generateApplicationCode(dto.getType().equals(0) ? "LY" : "JY")); + applications.setApprovalId(dto.getType().equals(0) ? ApprovalTypeEnum.GRAB.getCode() : ApprovalTypeEnum.BORROW.getCode()); applications.setApplicantUserId(dto.getApplicantUserId()); applications.setApplicantName(dto.getApplicantName()); applications.setDeptId(dto.getDeptId()); @@ -114,9 +133,6 @@ 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.setType(AssetOperateTypeEnum.RECEIVE.getCode()); return asset; } @@ -124,9 +140,9 @@ /** * 生成申请单号:LY + yyyyMMdd + 3位序号 */ - private String generateApplicationCode() { + private String generateApplicationCode(String prefix) { String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); - String prefix = "LY" + dateStr; + prefix = prefix + dateStr; Long count = oaApprovalApplicationsService.lambdaQuery() .like(OaApprovalApplications::getApplicationCode, prefix) .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay()) @@ -140,7 +156,7 @@ @Override public IPage<OaApprovalApplicationAssetPageVO> getReceivePageList(OaApprovalApplicationAssetPageQuery pageQuery) { Page<OaApprovalApplicationAssetPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); - pageQuery.setType(0);//领用 + pageQuery.setType(AssetOperateTypeEnum.RECEIVE.getCode());//领用 return this.baseMapper.getPageByType(page, pageQuery); } @@ -155,19 +171,144 @@ throw new ServiceException("记录不存在"); } - List<OaApprovalApplicationAssetItem> items = oaApprovalApplicationAssetItemService.lambdaQuery() + List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery() .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId()) - .list(); + .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId) + .distinct().collect(Collectors.toList()); - OaApprovalApplicationAssetDetailVO vo = new OaApprovalApplicationAssetDetailVO(); - vo.setItems(items); + List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds); + OaApprovalApplicationAssetDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationAssetDetailVO.class); + vo.setTitle(detail.getTitle()); + vo.setAssetTypeId(detail.getAssetTypeId()); + vo.setOperateTime(detail.getOperateTime()); + vo.setItems(assetMainVOS); return vo; } @Override public IPage<OaApprovalApplicationAssetPageVO> getBorrowPageList(OaApprovalApplicationAssetPageQuery pageQuery) { Page<OaApprovalApplicationAssetPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); - pageQuery.setType(1); + pageQuery.setType(AssetOperateTypeEnum.BORROW.getCode()); return this.baseMapper.getPageByType(page, pageQuery); } + + @Override + public OaApprovalApplicationAssetDetailVO getBorrowDetail(Integer id) { + OaApprovalApplications app = oaApprovalApplicationsService.getById(id); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one(); + if (detail == null) { + throw new ServiceException("记录不存在"); + } + + List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery() + .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId()) + .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId) + .distinct().collect(Collectors.toList()); + List<AssetMainVO> assetMainVOS = Collections.emptyList(); + if (CollUtil.isNotEmpty(assetMainIds)) { + assetMainVOS = assetMainService.getListByIds(assetMainIds); + //查询是否有关联的归还申请 + Map<Integer, OaApprovalApplicationAssetReturnBO> assetReturnBOMap = this.baseMapper.selectReturnByAssetIds(assetMainIds, app.getId()) + .stream().collect(Collectors.toMap(OaApprovalApplicationAssetReturnBO::getAssetMainId, Function.identity())); + assetMainVOS.forEach(item->{ + OaApprovalApplicationAssetReturnBO returnBO = assetReturnBOMap.get(item.getId()); + if (returnBO != null) { + item.setReturnStatus(returnBO.getReturnStatus()); + item.setApplicationCode(returnBO.getApplicationCode()); + } else { + item.setReturnStatus(ReturnStatusEnum.NOT_RETURN.getCode()); + } + }); + } + OaApprovalApplicationAssetDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationAssetDetailVO.class); + vo.setTitle(detail.getTitle()); + vo.setAssetTypeId(detail.getAssetTypeId()); + vo.setOperateTime(detail.getOperateTime()); + vo.setItems(assetMainVOS); + return vo; + } + @Override + public List<OaApprovalApplicationAssetDetailVO> getBorrowDetailByApplicationCode() { + Long userId = SecurityUtils.getUserId(); + List<OaApprovalApplicationAssetDetailVO> list = baseMapper.getBorrowDetailByApplicationCode(userId); + return list; + } + + @Override + public List<AssetMainVO> getBorrowDetailList(Integer applicationId) { + List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery() + .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId) + .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId) + .distinct().collect(Collectors.toList()); + List<AssetMainVO> returnList = Collections.emptyList(); + if (CollUtil.isNotEmpty(assetMainIds)) { + List<AssetMainVO> assetMainVOS = assetMainService.getListByIds(assetMainIds); + //查询是否有关联的归还申请 + Map<Integer, OaApprovalApplicationAssetReturnBO> assetReturnBOMap = this.baseMapper.selectReturnByAssetIds(assetMainIds, applicationId) + .stream().collect(Collectors.toMap(OaApprovalApplicationAssetReturnBO::getAssetMainId, Function.identity())); + returnList = assetMainVOS.stream().filter(item -> { + OaApprovalApplicationAssetReturnBO returnBO = assetReturnBOMap.get(item.getId()); + return Objects.isNull(returnBO); + }).collect(Collectors.toList()); + } + return returnList; + } + @Override + public void submitReturn(OaApprovalApplicationAssetReturnDTO dto) { + if (CollUtil.isEmpty(dto.getAssetMainIds())) { + throw new ServiceException("资产ID列表不能为空"); + } + // 1. 构建并保存审批主表 + OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class); + applications.setApplicationCode(generateApplicationCode("GH")); + applications.setApprovalId(ApprovalTypeEnum.RETURN.getCode()); + + // 2. 获取流程首节点,设置当前节点,并保存 + OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.RETURN.getCode()); + applications.setCurrentFlowNodeId(firstFlowNode.getId()); + oaApprovalApplicationsService.save(applications); + + // 3. 创建待办 + oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId()); + + // 4. 保存归还明细 + OaApprovalApplicationAsset detail = BeanUtil.copyProperties(dto, OaApprovalApplicationAsset.class); + detail.setApprovalApplicationId(applications.getId()); + detail.setType(AssetOperateTypeEnum.RETURN.getCode()); + + this.save(detail); + + // 5. 保存关联的资产项 + List<OaApprovalApplicationAssetItem> items = dto.getAssetMainIds().stream() + .map(i -> { + OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem(); + item.setApprovalApplicationId(applications.getId()); + item.setAssetMainId(i); + return item; + }) + .collect(Collectors.toList()); + oaApprovalApplicationAssetItemService.saveBatch(items); + } + + @Override + public IPage<OaApprovalApplicationAssetPageVO> getReturnPageList(OaApprovalApplicationAssetPageQuery pageQuery) { + Page<OaApprovalApplicationAssetPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + pageQuery.setType(AssetOperateTypeEnum.RETURN.getCode()); + return this.baseMapper.getPageByType(page, pageQuery); + } + + @Override + public IPage<OaApprovalApplicationAssetPageVO> getReturnNotifyPageList(OaApprovalApplicationAssetPageQuery pageQuery) { + Page<OaApprovalApplicationAssetPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + pageQuery.setType(AssetOperateTypeEnum.RETURN.getCode()); + IPage<OaApprovalApplicationAssetPageVO> pageByType = this.baseMapper.getPageByType(page, pageQuery); + LocalDate toDay = LocalDate.now(); + pageByType.getRecords().forEach(item->{ + item.setDueDays(toDay.until(item.getExpectReturnDate()).getDays()); + }); + return pageByType; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainVO.java new file mode 100644 index 0000000..ddb939b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainVO.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.vo.asset; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 审批通过资产分页视图对象 + */ +@Data +@ApiModel("审批通过资产分页视图对象") +public class AssetMainVO 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 = "归还状态 0-未归还,1-归还中,2-已归还") + private Integer returnStatus; + + @ApiModelProperty(value = "关联归还单号") + private String applicationCode; + + @ApiModelProperty(value = "权属单位/部门ID") + private Integer ownershipDeptId; + + @ApiModelProperty(value = "资产类别ID,关联asset_type表") + private Integer assetTypeId; + +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java index 87fa269..6cc9e09 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java @@ -1,7 +1,6 @@ package com.ruoyi.system.vo.asset; import com.fasterxml.jackson.annotation.JsonFormat; -import com.ruoyi.system.model.OaApprovalApplicationAssetItem; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -61,10 +60,11 @@ private Integer assetTypeId; @ApiModelProperty(value = "领用/借用日期") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private LocalDate operateTime; @ApiModelProperty(value = "预计退还日期") - @JsonFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private LocalDate expectReturnDate; @ApiModelProperty(value = "操作类型 0-领用,1-借用,2-归还") @@ -74,6 +74,6 @@ private Integer borrowApplicationId; @ApiModelProperty("关联资产项列表") - private List<OaApprovalApplicationAssetItem> items; + private List<AssetMainVO> items; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java index 92c1663..7064d10 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java @@ -46,5 +46,12 @@ @ApiModelProperty("归还状态 0-待归还,1-部分归还,2-全部归还") private Integer returnStatus; + + @ApiModelProperty("预计归还日期") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate expectReturnDate; + + @ApiModelProperty("到期天数,小于0表示已过期,0表示今天到期,大于0表示还有多少天到期") + private Integer dueDays; } diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml index c6ead5d..352646b 100644 --- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml @@ -30,8 +30,9 @@ 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, oaa.operate_time AS operateTime, - aaa.approval_status AS approvalStatus - oaa.return_status AS returnStatus + aaa.approval_status AS approvalStatus, + oaa.return_status AS returnStatus, + oaa.expect_return_date AS expectReturnDate FROM oa_approval_application_asset oaa INNER JOIN oa_approval_applications aaa ON aaa.id = oaa.approval_application_id LEFT JOIN asset_type at2 ON at2.id = oaa.asset_type_id @@ -53,5 +54,44 @@ </where> ORDER BY oaa.operate_time DESC, oaa.id DESC </select> + <select id="selectReturnByAssetIds" resultType="com.ruoyi.system.bo.OaApprovalApplicationAssetReturnBO"> + SELECT + oaa.application_code, + CASE + WHEN oaa.approval_status = 0 THEN + 1 + WHEN oaa.approval_status = 1 THEN + 2 + END AS return_status, + oaaai.asset_main_id + FROM + oa_approval_application_asset_item oaaai + LEFT JOIN oa_approval_application_asset oaaa ON oaaai.approval_application_id = oaaa.approval_application_id + LEFT JOIN oa_approval_applications oaa ON oaaai.approval_application_id = oaa.id + <where> + oaaa.type = 2 AND oaaa.borrow_application_id = #{applicationId} + <if test="assetIds != null and assetIds.size() > 0"> + AND oaaai.asset_main_id IN + <foreach collection="assetIds" item="id" open="(" separator="," close=")"> + #{id} + </foreach> + </if> + </where> + ORDER BY oaa.create_time DESC + </select> + <select id="getBorrowDetailByApplicationCode" + resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO" + parameterType="java.lang.Long"> + SELECT + oaa.*, + oaaa.operate_time + FROM + oa_approval_applications oaa + LEFT JOIN oa_approval_application_asset oaaa ON oaa.id = oaaa.approval_application_id + WHERE + oaa.applicant_user_id = #{userId} + AND oaa.approval_status = 1 + AND oaaa.type = 1 + </select> </mapper> -- Gitblit v1.7.1