From 7c3331d7be7c10059cc82586852d562f566a5087 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期五, 19 九月 2025 14:08:11 +0800 Subject: [PATCH] 资产管理-资产入库列表详情、撤销接口 --- ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java | 144 +++++++++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java | 23 + ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java | 150 ++++++++++ ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java | 21 + ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java | 5 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java | 5 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java | 35 ++ ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java | 22 + ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java | 284 ++++++++++++++++++ ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java | 3 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java | 168 +++++++++++ 12 files changed, 857 insertions(+), 7 deletions(-) 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 1c64940..89ae307 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 @@ -17,14 +17,20 @@ import com.ruoyi.system.service.OaApprovalApplicationStorageService; import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO; 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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; import javax.validation.Valid; @@ -81,6 +87,35 @@ return R.ok(page); } + @ApiOperation("删除资产入库申请") + @DeleteMapping("/{id}") + @Log(title = "资产入库申请-删除", businessType = BusinessType.DELETE) + public R<Void> delete(@PathVariable Integer id) { + oaApprovalApplicationStorageService.removeById(id); + return R.ok(); + } + + @ApiOperation("获取通用资产入库申请详情") + @GetMapping("/detail/general/{id}") + public R<OaApprovalApplicationStorageGeneralDetailVO> getGeneralDetail(@PathVariable Integer id) { + OaApprovalApplicationStorageGeneralDetailVO detail = oaApprovalApplicationStorageService.getGeneralDetail(id); + return R.ok(detail); + } + + @ApiOperation("获取房产资产入库申请详情") + @GetMapping("/detail/property/{id}") + public R<OaApprovalApplicationStoragePropertyDetailVO> getPropertyDetail(@PathVariable Integer id) { + OaApprovalApplicationStoragePropertyDetailVO detail = oaApprovalApplicationStorageService.getPropertyDetail(id); + return R.ok(detail); + } + + @ApiOperation("获取车辆资产入库申请详情") + @GetMapping("/detail/vehicle/{id}") + public R<OaApprovalApplicationStorageVehicleDetailVO> getVehicleDetail(@PathVariable Integer id) { + OaApprovalApplicationStorageVehicleDetailVO detail = oaApprovalApplicationStorageService.getVehicleDetail(id); + return R.ok(detail); + } + /** * 校验位置类型与相关名称/地址 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java index 60f51a2..a159ee5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java @@ -16,6 +16,8 @@ import com.ruoyi.system.utils.UUIDUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -25,6 +27,8 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.Date; +import com.ruoyi.system.emums.ApprovalStatusEnum; +import com.ruoyi.common.exception.ServiceException; /** * <p> @@ -73,5 +77,23 @@ approvalApplicationsService.save(oaApprovalApplications); return R.ok(); } + + @Log(title = "审批-撤回通用审批单", businessType = BusinessType.UPDATE) + @ApiOperation(value = "撤回审批单:仅更新状态为已撤回") + @PutMapping(value = "/withdraw/{id}") + public R withdraw(@PathVariable Integer id) { + OaApprovalApplications current = approvalApplicationsService.getById(id); + if (current == null) { + throw new ServiceException("审批单不存在"); + } + if (!ApprovalStatusEnum.PENDING.getCode().equals(current.getApprovalStatus())) { + throw new ServiceException("仅待审批状态可撤回"); + } + OaApprovalApplications update = new OaApprovalApplications(); + update.setId(id); + update.setApprovalStatus(ApprovalStatusEnum.CANCELED.getCode()); + approvalApplicationsService.updateById(update); + return R.ok(); + } } 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 index 8ecc57e..c151a49 100644 --- 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 @@ -3,6 +3,7 @@ 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; @@ -48,6 +49,7 @@ @ApiModelProperty("领用日期") @NotNull(message = "领用日期不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate operateTime; @ApiModelProperty("资产类型ID") @@ -55,6 +57,7 @@ private Integer assetTypeId; @ApiModelProperty("预计退还日期,可为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate expectReturnDate; @ApiModelProperty("领用资产列表") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java index 5a5c334..7659043 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java @@ -23,10 +23,6 @@ @ApiModel(value = "OaApprovalApplicationPurchaseDTO", description = "采购申请DTO") public class OaApprovalApplicationPurchaseDTO { - @ApiModelProperty(value = "审批ID") - @NotNull(message = "审批ID不能为空") - private Integer approvalId; - @ApiModelProperty(value = "申请部门ID") @NotNull(message = "申请部门不能为空") private Integer deptId; 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 5f32c7f..6ee3172 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 @@ -8,6 +8,9 @@ import com.ruoyi.system.model.OaApprovalApplicationStorage; import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO; /** * <p> @@ -46,4 +49,22 @@ * @return 分页数据 */ IPage<OaApprovalApplicationStoragePageVO> getPageList(OaApprovalApplicationStoragePageQuery pageQuery); + + /** + * 获取通用资产入库申请详情 + * @param storageId 入库申请存储表ID + */ + OaApprovalApplicationStorageGeneralDetailVO getGeneralDetail(Integer storageId); + + /** + * 获取房产资产入库申请详情 + * @param storageId 入库申请存储表ID + */ + OaApprovalApplicationStoragePropertyDetailVO getPropertyDetail(Integer storageId); + + /** + * 获取车辆资产入库申请详情 + * @param storageId 入库申请存储表ID + */ + OaApprovalApplicationStorageVehicleDetailVO getVehicleDetail(Integer storageId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java index 583b616..f69ae9b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; @@ -21,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; /** @@ -53,10 +55,31 @@ // 转换为VO对象 List<AssetTypeTreeVO> assetTypeVOs = BeanUtil.copyToList(allAssetTypes, AssetTypeTreeVO.class); + // 预查询:找出存在资产关联的资产类型ID集合(去重) + List<Integer> allTypeIds = allAssetTypes.stream().map(AssetType::getId).collect(Collectors.toList()); + QueryWrapper<AssetMain> usedTypeQuery = new QueryWrapper<>(); + usedTypeQuery.select("distinct asset_type_id").in("asset_type_id", allTypeIds); + List<AssetMain> usedTypeRows = assetMainService.list(usedTypeQuery); + Set<Integer> usedTypeIdSet = usedTypeRows.stream() + .map(AssetMain::getAssetTypeId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + // 按父级ID分组 Map<Integer, List<AssetTypeTreeVO>> parentIdMap = assetTypeVOs.stream() .collect(Collectors.groupingBy(AssetTypeTreeVO::getParentId)); + // 计算可删除标记:一级仅判断是否有子分类;二级仅判断是否有关联资产 + for (AssetTypeTreeVO vo : assetTypeVOs) { + if (Objects.equals(vo.getLevel(), 1)) { + boolean hasChildren = parentIdMap.containsKey(vo.getId()) && CollUtil.isNotEmpty(parentIdMap.get(vo.getId())); + vo.setCanDelete(!hasChildren); + } else { + boolean hasAssets = usedTypeIdSet.contains(vo.getId()); + vo.setCanDelete(!hasAssets); + } + } + // 构建树形结构 List<AssetTypeTreeVO> rootNodes = parentIdMap.get(0); if (CollUtil.isEmpty(rootNodes)) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java index 7d928d4..50069a7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java @@ -4,6 +4,7 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.dto.asset.OaApprovalApplicationPurchaseDTO; import com.ruoyi.system.emums.ApprovalStatusEnum; +import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.mapper.OaApprovalApplicationPurchaseMapper; import com.ruoyi.system.model.OaApprovalApplicationPurchase; import com.ruoyi.system.model.OaApprovalApplicationPurchaseItem; @@ -51,7 +52,7 @@ OaApprovalApplications applications = buildOaApprovalApplications(dto); // 2. 如果是提交操作,获取流程节点并创建待办 - OaApprovalFlowNode firstFlowNode = getFirstFlowNode(dto.getApprovalId()); + OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.PURCHASE.getCode()); applications.setCurrentFlowNodeId(firstFlowNode.getId()); oaApprovalApplicationsService.save(applications); @@ -91,7 +92,7 @@ private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationPurchaseDTO dto) { OaApprovalApplications applications = new OaApprovalApplications(); applications.setApplicationCode(generateApplicationCode()); - applications.setApprovalId(dto.getApprovalId()); + applications.setApprovalId(ApprovalTypeEnum.PURCHASE.getCode()); applications.setApplicantUserId(dto.getApplicantUserId()); applications.setApplicantName(dto.getApplicantName()); applications.setDeptId(dto.getDeptId()); 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 f56632b..8b336fd 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 @@ -34,6 +34,9 @@ import com.ruoyi.system.service.OaApprovalTodoService; import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,6 +47,8 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * <p> @@ -576,4 +581,283 @@ Page<OaApprovalApplicationStoragePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); return this.baseMapper.selectApplicationStoragePage(page, pageQuery); } + + @Override + public OaApprovalApplicationStorageGeneralDetailVO getGeneralDetail(Integer storageId) { + OaApprovalApplicationStorage storage = this.getById(storageId); + if (storage == null) { + throw new ServiceException("入库申请不存在"); + } + OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId()); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + + OaApprovalApplicationStorageGeneralDetailVO vo = new OaApprovalApplicationStorageGeneralDetailVO(); + fillBaseFields(vo, app, storage); + + List<AssetMain> mains = assetMainService.lambdaQuery() + .eq(AssetMain::getApprovalApplicationId, app.getId()) + .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) + .list(); + setAddressInfo(vo, mains); + + if (!CollectionUtils.isEmpty(mains)) { + List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList()); + List<AssetGeneralExt> exts = assetGeneralExtService.lambdaQuery().in(AssetGeneralExt::getAssetMainId, mainIds).list(); + Map<Integer, AssetGeneralExt> extMap = exts.stream().collect(Collectors.toMap(AssetGeneralExt::getAssetMainId, e -> e)); + + List<OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO> items = mains.stream().map(m -> { + OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO item = new OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO(); + item.setAssetOriginalCode(m.getAssetOriginalCode()); + item.setAssetName(m.getAssetName()); + item.setSpecificationModel(m.getSpecificationModel()); + item.setMeasurementUnit(m.getMeasurementUnit()); + item.setQuantity(m.getQuantity()); + item.setUnitPrice(m.getUnitPrice()); + item.setUsefulLife(m.getUsefulLife()); + item.setOwnershipDeptId(m.getOwnershipDeptId()); + item.setUserName(m.getUserName()); + item.setAssetStatus(m.getAssetStatus()); + item.setRemarks(m.getRemarks()); + item.setAccountingStatus(m.getAccountingStatus()); + item.setAccountingDate(m.getAccountingDate()); + item.setAccountingVoucherNo(m.getAccountingVoucherNo()); + item.setAccountingSubject(m.getAccountingSubject()); + item.setAccountingAmount(m.getAccountingAmount()); + AssetGeneralExt ext = extMap.get(m.getId()); + if (ext != null) { + item.setSupplierName(ext.getSupplierName()); + item.setPurchaseDate(ext.getPurchaseDate()); + item.setWarrantyPeriod(ext.getWarrantyPeriod()); + item.setWarrantyExpireDate(ext.getWarrantyExpireDate()); + item.setDepreciationMethod(ext.getDepreciationMethod()); + item.setDepreciationRate(ext.getDepreciationRate()); + item.setNetValue(ext.getNetValue()); + item.setMaintenanceCycle(ext.getMaintenanceCycle()); + item.setLastMaintenanceDate(ext.getLastMaintenanceDate()); + item.setNextMaintenanceDate(ext.getNextMaintenanceDate()); + } + return item; + }).collect(Collectors.toList()); + vo.setAssetItems(items); + } + return vo; + } + + @Override + public OaApprovalApplicationStoragePropertyDetailVO getPropertyDetail(Integer storageId) { + OaApprovalApplicationStorage storage = this.getById(storageId); + if (storage == null) { + throw new ServiceException("入库申请不存在"); + } + OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId()); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + + OaApprovalApplicationStoragePropertyDetailVO vo = new OaApprovalApplicationStoragePropertyDetailVO(); + fillBaseFields(vo, app, storage); + + List<AssetMain> mains = assetMainService.lambdaQuery() + .eq(AssetMain::getApprovalApplicationId, app.getId()) + .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) + .list(); + setAddressInfo(vo, mains); + + if (!CollectionUtils.isEmpty(mains)) { + List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList()); + List<AssetPropertyExt> exts = assetPropertyExtService.lambdaQuery().in(AssetPropertyExt::getAssetMainId, mainIds).list(); + Map<Integer, AssetPropertyExt> extMap = exts.stream().collect(Collectors.toMap(AssetPropertyExt::getAssetMainId, e -> e)); + + List<OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO> items = mains.stream().map(m -> { + OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO item = new OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO(); + item.setAssetOriginalCode(m.getAssetOriginalCode()); + item.setAssetName(m.getAssetName()); + item.setSpecificationModel(m.getSpecificationModel()); + item.setMeasurementUnit(m.getMeasurementUnit()); + item.setQuantity(m.getQuantity()); + item.setUnitPrice(m.getUnitPrice()); + item.setUsefulLife(m.getUsefulLife()); + item.setOwnershipDeptId(m.getOwnershipDeptId()); + item.setUserName(m.getUserName()); + item.setAssetStatus(m.getAssetStatus()); + item.setRemarks(m.getRemarks()); + item.setAccountingStatus(m.getAccountingStatus()); + item.setAccountingDate(m.getAccountingDate()); + item.setAccountingVoucherNo(m.getAccountingVoucherNo()); + item.setAccountingSubject(m.getAccountingSubject()); + item.setAccountingAmount(m.getAccountingAmount()); + AssetPropertyExt ext = extMap.get(m.getId()); + if (ext != null) { + item.setRegion(ext.getRegion()); + item.setDesignPurpose(ext.getDesignPurpose()); + item.setBuilding(ext.getBuilding()); + item.setRoomNumber(ext.getRoomNumber()); + item.setConstructionArea(ext.getConstructionArea()); + item.setStructureType(ext.getStructureType()); + item.setCertificateNumber(ext.getCertificateNumber()); + item.setCompletionDate(ext.getCompletionDate()); + item.setDetailedLocation(ext.getDetailedLocation()); + item.setProvincialPlatformValue(ext.getProvincialPlatformValue()); + item.setResettlementSituation(ext.getResettlementSituation()); + item.setIsMortgaged(ext.getIsMortgaged()); + item.setTenantName(ext.getTenantName()); + item.setRentalAmount(ext.getRentalAmount()); + item.setLeaseStartDate(ext.getLeaseStartDate()); + item.setLeaseEndDate(ext.getLeaseEndDate()); + } + return item; + }).collect(Collectors.toList()); + vo.setAssetItems(items); + } + return vo; + } + + @Override + public OaApprovalApplicationStorageVehicleDetailVO getVehicleDetail(Integer storageId) { + OaApprovalApplicationStorage storage = this.getById(storageId); + if (storage == null) { + throw new ServiceException("入库申请不存在"); + } + OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId()); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + + OaApprovalApplicationStorageVehicleDetailVO vo = new OaApprovalApplicationStorageVehicleDetailVO(); + fillBaseFields(vo, app, storage); + + List<AssetMain> mains = assetMainService.lambdaQuery() + .eq(AssetMain::getApprovalApplicationId, app.getId()) + .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) + .list(); + setAddressInfo(vo, mains); + + if (!CollectionUtils.isEmpty(mains)) { + List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList()); + List<AssetVehicleExt> exts = assetVehicleExtService.lambdaQuery().in(AssetVehicleExt::getAssetMainId, mainIds).list(); + Map<Integer, AssetVehicleExt> extMap = exts.stream().collect(Collectors.toMap(AssetVehicleExt::getAssetMainId, e -> e)); + + List<OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO> items = mains.stream().map(m -> { + OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO item = new OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO(); + item.setAssetOriginalCode(m.getAssetOriginalCode()); + item.setAssetName(m.getAssetName()); + item.setSpecificationModel(m.getSpecificationModel()); + item.setMeasurementUnit(m.getMeasurementUnit()); + item.setQuantity(m.getQuantity()); + item.setUnitPrice(m.getUnitPrice()); + item.setUsefulLife(m.getUsefulLife()); + item.setOwnershipDeptId(m.getOwnershipDeptId()); + item.setUserName(m.getUserName()); + item.setAssetStatus(m.getAssetStatus()); + item.setRemarks(m.getRemarks()); + item.setAccountingStatus(m.getAccountingStatus()); + item.setAccountingDate(m.getAccountingDate()); + item.setAccountingVoucherNo(m.getAccountingVoucherNo()); + item.setAccountingSubject(m.getAccountingSubject()); + item.setAccountingAmount(m.getAccountingAmount()); + AssetVehicleExt ext = extMap.get(m.getId()); + if (ext != null) { + item.setLicensePlate(ext.getLicensePlate()); + item.setVinCode(ext.getVinCode()); + item.setEngineNumber(ext.getEngineNumber()); + item.setDisplacement(ext.getDisplacement()); + item.setStaffingSituation(ext.getStaffingSituation()); + item.setOrigin(ext.getOrigin()); + item.setAcquisitionDate(ext.getAcquisitionDate()); + item.setPropertyRightForm(ext.getPropertyRightForm()); + } + return item; + }).collect(Collectors.toList()); + vo.setAssetItems(items); + } + return vo; + } + + private void fillBaseFields(Object vo, OaApprovalApplications app, OaApprovalApplicationStorage storage) { + if (vo instanceof OaApprovalApplicationStorageGeneralDetailVO) { + OaApprovalApplicationStorageGeneralDetailVO v = (OaApprovalApplicationStorageGeneralDetailVO) vo; + v.setDeptId(app.getDeptId()); + v.setDeptName(app.getDeptName()); + v.setApplicantUserId(app.getApplicantUserId()); + v.setApplicantName(app.getApplicantName()); + v.setApplicationDate(app.getApplicationDate()); + v.setApplicationReason(app.getApplicationReason()); + v.setAttachmentUrl(app.getAttachmentUrl()); + v.setTitle(storage.getTitle()); + v.setAssetTypeId(storage.getAssetTypeId()); + v.setStorageType(storage.getStorageType()); + v.setStorageTime(storage.getStorageTime()); + } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) { + OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo; + v.setDeptId(app.getDeptId()); + v.setDeptName(app.getDeptName()); + v.setApplicantUserId(app.getApplicantUserId()); + v.setApplicantName(app.getApplicantName()); + v.setApplicationDate(app.getApplicationDate()); + v.setApplicationReason(app.getApplicationReason()); + v.setAttachmentUrl(app.getAttachmentUrl()); + v.setTitle(storage.getTitle()); + v.setAssetTypeId(storage.getAssetTypeId()); + v.setStorageType(storage.getStorageType()); + v.setStorageTime(storage.getStorageTime()); + } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) { + OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo; + v.setDeptId(app.getDeptId()); + v.setDeptName(app.getDeptName()); + v.setApplicantUserId(app.getApplicantUserId()); + v.setApplicantName(app.getApplicantName()); + v.setApplicationDate(app.getApplicationDate()); + v.setApplicationReason(app.getApplicationReason()); + v.setAttachmentUrl(app.getAttachmentUrl()); + v.setTitle(storage.getTitle()); + v.setAssetTypeId(storage.getAssetTypeId()); + v.setStorageType(storage.getStorageType()); + v.setStorageTime(storage.getStorageTime()); + } + } + + private void setAddressInfo(Object vo, List<AssetMain> mains) { + if (CollectionUtils.isEmpty(mains)) { + return; + } + AssetMain sample = mains.get(0); + Integer addressType = null; + String useDeptName = null; + String warehouseName = null; + String address = null; + if (sample.getUseDeptId() != null) { + addressType = 0; + TDept dept = tDeptService.getById(sample.getUseDeptId()); + useDeptName = dept != null ? dept.getDeptName() : null; + } else if (sample.getWarehouseId() != null) { + addressType = 1; + AssetWarehouse wh = assetWarehouseService.getById(sample.getWarehouseId()); + warehouseName = wh != null ? wh.getWarehouseName() : null; + } else if (sample.getAddress() != null && !sample.getAddress().isEmpty()) { + addressType = 2; + address = sample.getAddress(); + } + + if (vo instanceof OaApprovalApplicationStorageGeneralDetailVO) { + OaApprovalApplicationStorageGeneralDetailVO v = (OaApprovalApplicationStorageGeneralDetailVO) vo; + v.setAddressType(addressType); + v.setUseDeptName(useDeptName); + v.setWarehouseName(warehouseName); + v.setAddress(address); + } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) { + OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo; + v.setAddressType(addressType); + v.setUseDeptName(useDeptName); + v.setWarehouseName(warehouseName); + v.setAddress(address); + } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) { + OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo; + v.setAddressType(addressType); + v.setUseDeptName(useDeptName); + v.setWarehouseName(warehouseName); + v.setAddress(address); + } + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java index 8d9c135..56a6eb8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java @@ -52,6 +52,9 @@ @ApiModelProperty(value = "更新人") private String updateBy; + @ApiModelProperty(value = "是否可删除:无子类型且无资产关联时为true") + private Boolean canDelete; + @ApiModelProperty(value = "子节点列表") private List<AssetTypeTreeVO> children; -} \ No newline at end of file +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java new file mode 100644 index 0000000..ec1cde5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java @@ -0,0 +1,150 @@ +package com.ruoyi.system.vo.asset; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 通用资产入库申请详情VO(返回新增时填写的所有字段) + */ +@Data +@ApiModel("通用资产入库申请详情VO") +public class OaApprovalApplicationStorageGeneralDetailVO implements Serializable { + + @ApiModelProperty(value = "申请部门ID") + private Integer deptId; + + @ApiModelProperty(value = "申请部门名称") + private String deptName; + + @ApiModelProperty(value = "申请人ID") + private Integer applicantUserId; + + @ApiModelProperty(value = "申请人姓名") + private String applicantName; + + @ApiModelProperty(value = "申请日期") + private LocalDate applicationDate; + + @ApiModelProperty(value = "入库备注") + private String applicationReason; + + @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接") + private String attachmentUrl; + + @ApiModelProperty(value = "事项标题") + private String title; + + @ApiModelProperty(value = "资产类型ID") + private Integer assetTypeId; + + @ApiModelProperty(value = "入库类型 0-正常入库") + private Boolean storageType; + + @ApiModelProperty(value = "入库日期") + private LocalDate storageTime; + + @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + private Integer addressType; + + @ApiModelProperty(value = "使用部门/位置名称") + private String useDeptName; + + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + @ApiModelProperty(value = "所在位置") + private String address; + + @ApiModelProperty(value = "通用资产明细列表(按保存展开后的一条资产记录对应一条明细)") + private List<GeneralAssetItemVO> assetItems; + + @Data + @ApiModel("通用资产明细VO") + public static class GeneralAssetItemVO implements Serializable { + @ApiModelProperty(value = "资产原编码") + private String assetOriginalCode; + + @ApiModelProperty(value = "资产名称") + private String assetName; + + @ApiModelProperty(value = "规格型号") + private String specificationModel; + + @ApiModelProperty(value = "计量单位") + private String measurementUnit; + + @ApiModelProperty(value = "数量") + private BigDecimal quantity; + + @ApiModelProperty(value = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty(value = "使用年限(年)") + private Integer usefulLife; + + @ApiModelProperty(value = "权属单位/部门ID") + private Integer ownershipDeptId; + + @ApiModelProperty(value = "使用人") + private String userName; + + @ApiModelProperty(value = "资产状态") + private String assetStatus; + + @ApiModelProperty(value = "备注") + private String remarks; + + @ApiModelProperty(value = "入账状态") + private String accountingStatus; + + @ApiModelProperty(value = "入账时间") + private LocalDate accountingDate; + + @ApiModelProperty(value = "会计凭证号") + private String accountingVoucherNo; + + @ApiModelProperty(value = "会计科目") + private String accountingSubject; + + @ApiModelProperty(value = "入账金额") + private BigDecimal accountingAmount; + + // 通用资产扩展表字段 + @ApiModelProperty(value = "供应商名称") + private String supplierName; + + @ApiModelProperty(value = "采购日期") + private LocalDate purchaseDate; + + @ApiModelProperty(value = "保修期(月)") + private Integer warrantyPeriod; + + @ApiModelProperty(value = "保修到期日期") + private LocalDate warrantyExpireDate; + + @ApiModelProperty(value = "折旧方法") + private String depreciationMethod; + + @ApiModelProperty(value = "折旧率") + private java.math.BigDecimal depreciationRate; + + @ApiModelProperty(value = "净值") + private java.math.BigDecimal netValue; + + @ApiModelProperty(value = "维护周期(月)") + private Integer maintenanceCycle; + + @ApiModelProperty(value = "上次维护日期") + private LocalDate lastMaintenanceDate; + + @ApiModelProperty(value = "下次维护日期") + private LocalDate nextMaintenanceDate; + } +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java new file mode 100644 index 0000000..e1e2179 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java @@ -0,0 +1,168 @@ +package com.ruoyi.system.vo.asset; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 房产资产入库申请详情VO(返回新增时填写的所有字段) + */ +@Data +@ApiModel("房产资产入库申请详情VO") +public class OaApprovalApplicationStoragePropertyDetailVO implements Serializable { + + @ApiModelProperty(value = "申请部门ID") + private Integer deptId; + + @ApiModelProperty(value = "申请部门名称") + private String deptName; + + @ApiModelProperty(value = "申请人ID") + private Integer applicantUserId; + + @ApiModelProperty(value = "申请人姓名") + private String applicantName; + + @ApiModelProperty(value = "申请日期") + private LocalDate applicationDate; + + @ApiModelProperty(value = "入库备注") + private String applicationReason; + + @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接") + private String attachmentUrl; + + @ApiModelProperty(value = "事项标题") + private String title; + + @ApiModelProperty(value = "资产类型ID") + private Integer assetTypeId; + + @ApiModelProperty(value = "入库类型 0-正常入库") + private Boolean storageType; + + @ApiModelProperty(value = "入库日期") + private LocalDate storageTime; + + @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + private Integer addressType; + + @ApiModelProperty(value = "使用部门/位置名称") + private String useDeptName; + + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + @ApiModelProperty(value = "所在位置") + private String address; + + @ApiModelProperty(value = "房产资产明细列表(按保存展开后的一条资产记录对应一条明细)") + private List<PropertyAssetItemVO> assetItems; + + @Data + @ApiModel("房产资产明细VO") + public static class PropertyAssetItemVO implements Serializable { + @ApiModelProperty(value = "资产原编码") + private String assetOriginalCode; + + @ApiModelProperty(value = "资产名称") + private String assetName; + + @ApiModelProperty(value = "规格型号") + private String specificationModel; + + @ApiModelProperty(value = "计量单位") + private String measurementUnit; + + @ApiModelProperty(value = "数量") + private BigDecimal quantity; + + @ApiModelProperty(value = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty(value = "使用年限(年)") + private Integer usefulLife; + + @ApiModelProperty(value = "权属单位/部门ID") + private Integer ownershipDeptId; + + @ApiModelProperty(value = "使用人") + private String userName; + + @ApiModelProperty(value = "资产状态") + private String assetStatus; + + @ApiModelProperty(value = "备注") + private String remarks; + + @ApiModelProperty(value = "入账状态") + private String accountingStatus; + + @ApiModelProperty(value = "入账时间") + private LocalDate accountingDate; + + @ApiModelProperty(value = "会计凭证号") + private String accountingVoucherNo; + + @ApiModelProperty(value = "会计科目") + private String accountingSubject; + + @ApiModelProperty(value = "入账金额") + private BigDecimal accountingAmount; + + // 房产资产扩展表字段 + @ApiModelProperty(value = "所在区域") + private String region; + + @ApiModelProperty(value = "设计用途") + private String designPurpose; + + @ApiModelProperty(value = "楼栋") + private String building; + + @ApiModelProperty(value = "房间号") + private String roomNumber; + + @ApiModelProperty(value = "建筑面积(平方米)") + private BigDecimal constructionArea; + + @ApiModelProperty(value = "结构") + private String structureType; + + @ApiModelProperty(value = "权证编号") + private String certificateNumber; + + @ApiModelProperty(value = "建成年月") + private LocalDate completionDate; + + @ApiModelProperty(value = "详细位置") + private String detailedLocation; + + @ApiModelProperty(value = "省资产平台填报价值") + private BigDecimal provincialPlatformValue; + + @ApiModelProperty(value = "安置情况") + private String resettlementSituation; + + @ApiModelProperty(value = "是否抵押:0-否,1-是") + private Boolean isMortgaged; + + @ApiModelProperty(value = "承租方") + private String tenantName; + + @ApiModelProperty(value = "租金") + private BigDecimal rentalAmount; + + @ApiModelProperty(value = "租赁期限起") + private LocalDate leaseStartDate; + + @ApiModelProperty(value = "租赁期限止") + private LocalDate leaseEndDate; + } +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java new file mode 100644 index 0000000..114a50a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java @@ -0,0 +1,144 @@ +package com.ruoyi.system.vo.asset; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 车辆资产入库申请详情VO(返回新增时填写的所有字段) + */ +@Data +@ApiModel("车辆资产入库申请详情VO") +public class OaApprovalApplicationStorageVehicleDetailVO implements Serializable { + + @ApiModelProperty(value = "申请部门ID") + private Integer deptId; + + @ApiModelProperty(value = "申请部门名称") + private String deptName; + + @ApiModelProperty(value = "申请人ID") + private Integer applicantUserId; + + @ApiModelProperty(value = "申请人姓名") + private String applicantName; + + @ApiModelProperty(value = "申请日期") + private LocalDate applicationDate; + + @ApiModelProperty(value = "入库备注") + private String applicationReason; + + @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接") + private String attachmentUrl; + + @ApiModelProperty(value = "事项标题") + private String title; + + @ApiModelProperty(value = "资产类型ID") + private Integer assetTypeId; + + @ApiModelProperty(value = "入库类型 0-正常入库") + private Boolean storageType; + + @ApiModelProperty(value = "入库日期") + private LocalDate storageTime; + + @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + private Integer addressType; + + @ApiModelProperty(value = "使用部门/位置名称") + private String useDeptName; + + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + @ApiModelProperty(value = "所在位置") + private String address; + + @ApiModelProperty(value = "车辆资产明细列表(按保存展开后的一条资产记录对应一条明细)") + private List<VehicleAssetItemVO> assetItems; + + @Data + @ApiModel("车辆资产明细VO") + public static class VehicleAssetItemVO implements Serializable { + @ApiModelProperty(value = "资产原编码") + private String assetOriginalCode; + + @ApiModelProperty(value = "资产名称") + private String assetName; + + @ApiModelProperty(value = "规格型号") + private String specificationModel; + + @ApiModelProperty(value = "计量单位") + private String measurementUnit; + + @ApiModelProperty(value = "数量") + private BigDecimal quantity; + + @ApiModelProperty(value = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty(value = "使用年限(年)") + private Integer usefulLife; + + @ApiModelProperty(value = "权属单位/部门ID") + private Integer ownershipDeptId; + + @ApiModelProperty(value = "使用人") + private String userName; + + @ApiModelProperty(value = "资产状态") + private String assetStatus; + + @ApiModelProperty(value = "备注") + private String remarks; + + @ApiModelProperty(value = "入账状态") + private String accountingStatus; + + @ApiModelProperty(value = "入账时间") + private LocalDate accountingDate; + + @ApiModelProperty(value = "会计凭证号") + private String accountingVoucherNo; + + @ApiModelProperty(value = "会计科目") + private String accountingSubject; + + @ApiModelProperty(value = "入账金额") + private BigDecimal accountingAmount; + + // 车辆资产扩展表字段 + @ApiModelProperty(value = "车牌号") + private String licensePlate; + + @ApiModelProperty(value = "车辆识别代码") + private String vinCode; + + @ApiModelProperty(value = "发动机号") + private String engineNumber; + + @ApiModelProperty(value = "排量") + private String displacement; + + @ApiModelProperty(value = "编制情况") + private String staffingSituation; + + @ApiModelProperty(value = "产地") + private String origin; + + @ApiModelProperty(value = "取得日期") + private LocalDate acquisitionDate; + + @ApiModelProperty(value = "产权形式") + private String propertyRightForm; + } +} + -- Gitblit v1.7.1