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); } } ruoyi-system/src/main/java/com/ruoyi/system/bo/OaApprovalApplicationAssetReturnBO.java
New file @@ -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; } ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReturnDTO.java
New file @@ -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; } ruoyi-system/src/main/java/com/ruoyi/system/emums/ReturnStatusEnum.java
New file @@ -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; } } 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); } 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; 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; } 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); } 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); } 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(); } } 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; } } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainVO.java
New file @@ -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; } 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; } 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; } 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>