ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java
@@ -24,6 +24,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -43,6 +44,7 @@ * @author CodeBuddy * @since 2025-09-17 */ @Slf4j @Api(tags = {"OA审批-资产入库申请相关接口"}) @Validated @RestController @@ -122,7 +124,13 @@ @ApiOperation("获取资产入库申请分页列表") @PostMapping("/page-list") public R<IPage<OaApprovalApplicationStoragePageVO>> getPageList(@RequestBody OaApprovalApplicationStoragePageQuery pageQuery) { IPage<OaApprovalApplicationStoragePageVO> page = oaApprovalApplicationStorageService.getPageList(pageQuery); IPage<OaApprovalApplicationStoragePageVO> page = null; try { page = oaApprovalApplicationStorageService.getPageList(pageQuery); } catch (Exception e) { log.error("获取资产入库申请分页列表失败", e); return R.fail("服务器开小差啦"); } return R.ok(page); } ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalFlowAuditController.java
@@ -7,22 +7,89 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.TDept; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.dto.AddLeaveDTO; import com.ruoyi.system.dto.AuditDTO; import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.model.*; import com.ruoyi.system.model.AssetMain; import com.ruoyi.system.model.AssetType; import com.ruoyi.system.model.OaApproval; import com.ruoyi.system.model.OaApprovalApplicationAdvertisement; import com.ruoyi.system.model.OaApprovalApplicationAsset; import com.ruoyi.system.model.OaApprovalApplicationAssetItem; import com.ruoyi.system.model.OaApprovalApplicationAttendance; import com.ruoyi.system.model.OaApprovalApplicationChange; import com.ruoyi.system.model.OaApprovalApplicationContract; import com.ruoyi.system.model.OaApprovalApplicationDispose; import com.ruoyi.system.model.OaApprovalApplicationMoney; import com.ruoyi.system.model.OaApprovalApplicationPayment; import com.ruoyi.system.model.OaApprovalApplicationPurchase; import com.ruoyi.system.model.OaApprovalApplicationReimbursement; import com.ruoyi.system.model.OaApprovalApplicationReimbursementItem; import com.ruoyi.system.model.OaApprovalApplicationStorage; import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowAudit; import com.ruoyi.system.model.OaApprovalFlowNode; import com.ruoyi.system.model.OaApprovalTodo; import com.ruoyi.system.query.ApprovalDetailQuery; import com.ruoyi.system.query.ApprovalTodoListQuery; import com.ruoyi.system.service.*; import com.ruoyi.system.vo.*; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.AssetTypeService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.OaApprovalApplicationAdvertisementService; import com.ruoyi.system.service.OaApprovalApplicationAssetItemService; import com.ruoyi.system.service.OaApprovalApplicationAssetService; import com.ruoyi.system.service.OaApprovalApplicationAttendanceService; import com.ruoyi.system.service.OaApprovalApplicationChangeService; import com.ruoyi.system.service.OaApprovalApplicationContactService; import com.ruoyi.system.service.OaApprovalApplicationContractService; import com.ruoyi.system.service.OaApprovalApplicationDisposeService; import com.ruoyi.system.service.OaApprovalApplicationMoneyService; import com.ruoyi.system.service.OaApprovalApplicationPaymentService; import com.ruoyi.system.service.OaApprovalApplicationPurchaseItemService; import com.ruoyi.system.service.OaApprovalApplicationPurchaseService; import com.ruoyi.system.service.OaApprovalApplicationReimbursementItemService; import com.ruoyi.system.service.OaApprovalApplicationReimbursementService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetService; import com.ruoyi.system.service.OaApprovalApplicationStorageService; import com.ruoyi.system.service.OaApprovalApplicationsService; import com.ruoyi.system.service.OaApprovalFlowAuditService; import com.ruoyi.system.service.OaApprovalFlowNodeService; import com.ruoyi.system.service.OaApprovalFlowService; import com.ruoyi.system.service.OaApprovalService; import com.ruoyi.system.service.OaApprovalTodoService; import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.vo.AdvertisementDetailVO; import com.ruoyi.system.vo.ApprovalFlowNodeListVO; import com.ruoyi.system.vo.ApprovalTodoVO; import com.ruoyi.system.vo.BackDetailVO; import com.ruoyi.system.vo.BorrowDetailVO; import com.ruoyi.system.vo.BusinessTripDetailVO; import com.ruoyi.system.vo.ChangeDetailVO; import com.ruoyi.system.vo.ContactDetailVO; import com.ruoyi.system.vo.ContractDetailVO; import com.ruoyi.system.vo.DisposeDetailVO; import com.ruoyi.system.vo.GrabDetailVO; import com.ruoyi.system.vo.GrabListVO; import com.ruoyi.system.vo.LeaveDestroyDetailVO; import com.ruoyi.system.vo.LeaveDetailVO; import com.ruoyi.system.vo.MoneyDetailVO; import com.ruoyi.system.vo.OutDetailVO; import com.ruoyi.system.vo.PaymentDetailVO; import com.ruoyi.system.vo.PurchaseDetailVO; import com.ruoyi.system.vo.PurchaseListVO; import com.ruoyi.system.vo.ReimbursementDetailVO; import com.ruoyi.system.vo.StorageDetailVO; import com.ruoyi.system.vo.StorageListVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping; 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.annotation.Resource; import java.time.LocalDateTime; @@ -74,6 +141,8 @@ private OaApprovalApplicationMoneyService approvalApplicationMoneyService; @Resource private AssetMainService assetMainService; @Resource private OaApprovalApplicationStorageAssetService oaApprovalApplicationStorageAssetService; @Resource private OaApprovalApplicationReimbursementService approvalApplicationReimbursementService; @Resource @@ -1076,6 +1145,10 @@ } assetMainService.updateBatchById(assetMains); } //如果为资产入库审批,处理审批通过逻辑,创建该审批的资产信息 if (approval.getApprovalCategory().equals(ApprovalTypeEnum.IN_STOCK.getCode())) { assetMainService.saveAssetByApprovalApplicationId(approvalApplications.getId()); } }else{ // 生成下一个节点的待办事项 for (int i = 0; i < approvalFlowNodes.size(); i++) { ruoyi-system/src/main/java/com/ruoyi/system/model/AssetPropertyExt.java
@@ -82,9 +82,9 @@ @TableField("resettlement_situation") private String resettlementSituation; @ApiModelProperty(value = "是否抵押:0-否,1-是") @ApiModelProperty(value = "是否抵押:否,是") @TableField("is_mortgaged") private Integer mortgaged; private String mortgaged; @ApiModelProperty(value = "承租方") @TableField("tenant_name") ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorageAsset.java
@@ -81,9 +81,6 @@ @ApiModelProperty(value = "使用人") private String userName; @ApiModelProperty(value = "使用类型") private String useType; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java
@@ -6,6 +6,8 @@ import com.ruoyi.system.query.AssetMainPageQuery; import com.ruoyi.system.vo.asset.AssetMainPageVO; import java.time.LocalDate; /** * 资产主表 服务类 */ @@ -18,4 +20,17 @@ */ IPage<AssetMainPageVO> getApprovedPageList(AssetMainPageQuery pageQuery); /** * 生成资产编码 * @param assetTypeId * @param storageDate * @return */ String generateAssetCode(Integer assetTypeId, LocalDate storageDate); /** * 根据审批单ID保存资产信息 * @param id */ void saveAssetByApprovalApplicationId(Integer id); } ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageAssetVehicleExtService.java
@@ -1,7 +1,7 @@ package com.ruoyi.system.service; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetVehicleExt; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetVehicleExt; /** * <p> ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
@@ -1,24 +1,187 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import org.springframework.util.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.utils.SecurityUtils; import com.ruoyi.system.mapper.AssetMainMapper; import com.ruoyi.system.mapper.AssetPropertyExtMapper; import com.ruoyi.system.mapper.AssetVehicleExtMapper; import com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetMapper; import com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetPropertyExtMapper; import com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetVehicleExtMapper; import com.ruoyi.system.model.AssetMain; import com.ruoyi.system.model.AssetPropertyExt; import com.ruoyi.system.model.AssetVehicleExt; import com.ruoyi.system.model.OaApprovalApplicationStorageAsset; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetPropertyExt; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetVehicleExt; import com.ruoyi.system.query.AssetMainPageQuery; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.AssetPropertyExtService; import com.ruoyi.system.service.AssetTypeService; import com.ruoyi.system.service.AssetVehicleExtService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetPropertyExtService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetVehicleExtService; import com.ruoyi.system.vo.asset.AssetMainPageVO; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; /** * 资产主表 服务实现类 */ @Service @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class AssetMainServiceImpl extends ServiceImpl<AssetMainMapper, AssetMain> implements AssetMainService { private final AssetTypeService assetTypeService; private final OaApprovalApplicationStorageAssetService oaApprovalApplicationStorageAssetService; private final OaApprovalApplicationStorageAssetPropertyExtService oaApprovalApplicationStorageAssetPropertyExtService; private final OaApprovalApplicationStorageAssetVehicleExtService oaApprovalApplicationStorageAssetVehicleExtService; private final AssetVehicleExtService assetVehicleExtService; private final AssetPropertyExtService assetPropertyExtService; private final AssetMainMapper assetMainMapper; private final OaApprovalApplicationStorageAssetMapper oaApprovalApplicationStorageAssetMapper; private final OaApprovalApplicationStorageAssetPropertyExtMapper oaApprovalApplicationStorageAssetPropertyExtMapper; private final OaApprovalApplicationStorageAssetVehicleExtMapper oaApprovalApplicationStorageAssetVehicleExtMapper; private final AssetPropertyExtMapper assetPropertyExtMapper; private final AssetVehicleExtMapper assetVehicleExtMapper; @Override public IPage<AssetMainPageVO> getApprovedPageList(AssetMainPageQuery pageQuery) { Page<AssetMainPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); return this.baseMapper.selectApprovedAssetPage(page, pageQuery); } /** * 生成资产编码 * 格式:资产类型一级分类简写+资产类型子类简写+入库日期+【-】+数量顺序编号(4位) * 例如:GDFC20250917-0001 */ @Override public String generateAssetCode(Integer assetTypeId, LocalDate storageDate) { // 根据资产类型ID获取资产编码前缀 String typeCodePrefix = assetTypeService.getAssetCodePrefix(assetTypeId); String dateStr = storageDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); String prefix = typeCodePrefix + dateStr + "-"; // 查询当天该类型资产的数量 Long count = this.lambdaQuery() .like(AssetMain::getAssetCode, prefix) .ge(AssetMain::getCreateTime, storageDate.atStartOfDay()) .lt(AssetMain::getCreateTime, storageDate.plusDays(1).atStartOfDay()) .count(); int sequence = (count != null ? count.intValue() : 0) + 1; String sequenceStr = String.format("%04d", sequence); return prefix + sequenceStr; } @Override public void saveAssetByApprovalApplicationId(Integer approvalApplicationId) { // 1. 根据approvalApplicationId查询审批通过的资产列表 List<OaApprovalApplicationStorageAsset> storageAssets = oaApprovalApplicationStorageAssetMapper .selectList(new QueryWrapper<OaApprovalApplicationStorageAsset>() .eq("approval_application_id", approvalApplicationId)); if (CollectionUtils.isEmpty(storageAssets)) { return; } for (OaApprovalApplicationStorageAsset storageAsset : storageAssets) { Integer assetMainType = storageAsset.getAssetMainType(); BigDecimal quantity = storageAsset.getQuantity(); // 根据数量生成对应条数的资产记录 int assetCount = quantity != null ? quantity.intValue() : 1; for (int i = 0; i < assetCount; i++) { // 创建资产主表记录 AssetMain assetMain = new AssetMain(); BeanUtil.copyProperties(storageAsset, assetMain); // 为每个资产生成编码 String assetCode = generateAssetCode(storageAsset.getAssetTypeId(), LocalDate.now()); assetMain.setAssetCode(assetCode); // 单个资产的数量设为1 assetMain.setQuantity(BigDecimal.ONE); // 单个资产的总价值等于单价 assetMain.setTotalValue(storageAsset.getUnitPrice()); // 设置创建信息 assetMain.setCreateTime(LocalDateTime.now()); assetMain.setCreateBy(SecurityUtils.getUsername()); assetMain.setDisabled(false); // 保存资产主表 assetMainMapper.insert(assetMain); // 2. 根据资产类型保存扩展信息 if (assetMainType != null) { if (assetMainType == 1) { // 房产资产 - 保存房产扩展信息 savePropertyExtension(storageAsset.getId(), assetMain.getId()); } else if (assetMainType == 2) { // 车辆资产 - 保存车辆扩展信息 saveVehicleExtension(storageAsset.getId(), assetMain.getId()); } // assetMainType == 0 为通用资产,无需保存扩展信息 } } } } /** * 保存房产资产扩展信息 */ private void savePropertyExtension(Integer storageAssetId, Integer assetMainId) { // 查询房产扩展信息 OaApprovalApplicationStorageAssetPropertyExt propertyExt = oaApprovalApplicationStorageAssetPropertyExtMapper .selectOne(new QueryWrapper<OaApprovalApplicationStorageAssetPropertyExt>() .eq("storage_asset_id", storageAssetId)); if (propertyExt != null) { AssetPropertyExt assetPropertyExt = new AssetPropertyExt(); BeanUtil.copyProperties(propertyExt, assetPropertyExt); assetPropertyExt.setAssetMainId(assetMainId); assetPropertyExt.setCreateTime(LocalDateTime.now()); assetPropertyExt.setCreateBy(SecurityUtils.getUsername()); assetPropertyExt.setDisabled(false); assetPropertyExtMapper.insert(assetPropertyExt); } } /** * 保存车辆资产扩展信息 */ private void saveVehicleExtension(Integer storageAssetId, Integer assetMainId) { // 查询车辆扩展信息 OaApprovalApplicationStorageAssetVehicleExt vehicleExt = oaApprovalApplicationStorageAssetVehicleExtMapper .selectOne(new QueryWrapper<OaApprovalApplicationStorageAssetVehicleExt>() .eq("storage_asset_id", storageAssetId)); if (vehicleExt != null) { AssetVehicleExt assetVehicleExt = new AssetVehicleExt(); BeanUtil.copyProperties(vehicleExt, assetVehicleExt); assetVehicleExt.setAssetMainId(assetMainId); assetVehicleExt.setCreateTime(LocalDateTime.now()); assetVehicleExt.setCreateBy(SecurityUtils.getUsername()); assetVehicleExt.setDisabled(false); assetVehicleExtMapper.insert(assetVehicleExt); } } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java
@@ -15,6 +15,7 @@ import com.ruoyi.system.service.AssetTypeService; import com.ruoyi.system.vo.asset.AssetTypeTreeVO; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,7 +35,7 @@ * @since 2025-09-15 */ @Service @RequiredArgsConstructor @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class AssetTypeServiceImpl extends ServiceImpl<AssetTypeMapper, AssetType> implements AssetTypeService { private final AssetMainService assetMainService; ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
@@ -1,5 +1,6 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -13,7 +14,6 @@ import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.emums.AssetTypeEnum; import com.ruoyi.system.mapper.OaApprovalApplicationStorageMapper; import com.ruoyi.system.model.AssetMain; import com.ruoyi.system.model.AssetWarehouse; import com.ruoyi.system.model.OaApprovalApplicationStorage; import com.ruoyi.system.model.OaApprovalApplicationStorageAsset; @@ -23,10 +23,6 @@ import com.ruoyi.system.model.OaApprovalFlowNode; import com.ruoyi.system.query.ApprovalDetailQuery; import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.AssetPropertyExtService; import com.ruoyi.system.service.AssetTypeService; import com.ruoyi.system.service.AssetVehicleExtService; import com.ruoyi.system.service.AssetWarehouseService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetPropertyExtService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetService; @@ -36,7 +32,6 @@ import com.ruoyi.system.service.OaApprovalFlowNodeService; import com.ruoyi.system.service.OaApprovalTodoService; import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.vo.PurchaseListVO; import com.ruoyi.system.vo.StorageListVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; @@ -50,8 +45,10 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** @@ -70,10 +67,6 @@ private final OaApprovalApplicationStorageAssetService oaApprovalApplicationStorageAssetService; private final OaApprovalApplicationStorageAssetPropertyExtService oaApprovalApplicationStorageAssetPropertyExtService; private final OaApprovalApplicationStorageAssetVehicleExtService oaApprovalApplicationStorageAssetVehicleExtService; private final AssetMainService assetMainService; private final AssetPropertyExtService assetPropertyExtService; private final AssetVehicleExtService assetVehicleExtService; private final AssetTypeService assetTypeService; private final OaApprovalFlowNodeService oaApprovalFlowNodeService; private final OaApprovalTodoService oaApprovalTodoService; private final TDeptService tDeptService; @@ -239,7 +232,8 @@ } assetMain.setUserName(item.getUserName()); // 根据整单 addressType 写入使用部门ID或仓库ID applyUseDeptInfoToAssetMain(assetMain, baseDto.getUseDeptName()); applyAddressToAssetMain(assetMain, item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress()); assetMain.setAddressType(item.getAddressType()); assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode()); assetMain.setAssetStatus(item.getAssetStatus()); assetMain.setRemarks(item.getRemarks()); @@ -275,7 +269,8 @@ } } assetMain.setUserName(item.getUserName()); applyUseDeptInfoToAssetMain(assetMain, baseDto.getUseDeptName()); applyAddressToAssetMain(assetMain, item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress()); assetMain.setAddressType(item.getAddressType()); assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode()); assetMain.setAssetStatus(item.getAssetStatus()); assetMain.setRemarks(item.getRemarks()); @@ -311,7 +306,8 @@ } } assetMain.setUserName(item.getUserName()); applyUseDeptInfoToAssetMain(assetMain, baseDto.getUseDeptName()); applyAddressToAssetMain(assetMain, item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress()); assetMain.setAddressType(item.getAddressType()); assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode()); assetMain.setAssetStatus(item.getAssetStatus()); assetMain.setRemarks(item.getRemarks()); @@ -327,17 +323,43 @@ /** * 按整单地址类型设置资产主表位置信息(使用部门ID或仓库ID或地址) */ private void applyUseDeptInfoToAssetMain(OaApprovalApplicationStorageAsset assetMain, String useDeptName) { // 使用部门 if (useDeptName != null && !useDeptName.isEmpty()) { TDept dept = tDeptService.lambdaQuery() .eq(TDept::getDeptName, useDeptName) .one(); if (dept != null) { assetMain.setUseDeptId(dept.getId()); } private void applyAddressToAssetMain(OaApprovalApplicationStorageAsset assetMain, Integer addressType, String useDeptName, String warehouseName, String address) { if (addressType == null) { return; } switch (addressType) { case 0: // 使用部门 if (useDeptName != null && !useDeptName.isEmpty()) { TDept dept = tDeptService.lambdaQuery() .eq(TDept::getDeptName, useDeptName) .one(); if (dept != null) { assetMain.setUseDeptId(dept.getId()); } } break; case 1: if (warehouseName != null && !warehouseName.isEmpty()) { AssetWarehouse warehouse = assetWarehouseService.lambdaQuery() .eq(AssetWarehouse::getWarehouseName, warehouseName) .one(); if (warehouse != null) { assetMain.setWarehouseId(warehouse.getId()); assetMain.setWarehouseName(warehouse.getWarehouseName()); } } break; case 2: if (address != null && !address.isEmpty()) { assetMain.setAddress(address); } break; default: // ignore } } /** @@ -494,31 +516,6 @@ return prefix + sequenceStr; } /** * 生成资产编码 * 格式:资产类型一级分类简写+资产类型子类简写+入库日期+【-】+数量顺序编号(4位) * 例如:GDFC20250917-0001 */ private String generateAssetCode(Integer assetTypeId, LocalDate storageDate) { // 根据资产类型ID获取资产编码前缀 String typeCodePrefix = assetTypeService.getAssetCodePrefix(assetTypeId); String dateStr = storageDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); String prefix = typeCodePrefix + dateStr + "-"; // 查询当天该类型资产的数量 Long count = assetMainService.lambdaQuery() .like(AssetMain::getAssetCode, prefix) .ge(AssetMain::getCreateTime, storageDate.atStartOfDay()) .lt(AssetMain::getCreateTime, storageDate.plusDays(1).atStartOfDay()) .count(); int sequence = (count != null ? count.intValue() : 0) + 1; String sequenceStr = String.format("%04d", sequence); return prefix + sequenceStr; } @Override public IPage<OaApprovalApplicationStoragePageVO> getPageList(OaApprovalApplicationStoragePageQuery pageQuery) { Page<OaApprovalApplicationStoragePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); @@ -543,36 +540,35 @@ .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, app.getId()) .eq(OaApprovalApplicationStorageAsset::getAssetTypeId, storage.getAssetTypeId()) .list(); setAddressInfo(vo, mains); if (!CollectionUtils.isEmpty(mains)) { // 批量查询权属部门,避免循环内查询 // 批量查询权属部门 List<Integer> ownerIds = mains.stream().map(OaApprovalApplicationStorageAsset::getOwnershipDeptId) .filter(id -> id != null).distinct().collect(Collectors.toList()); Map<Integer, TDept> ownerDeptMap = ownerIds.isEmpty() ? java.util.Collections.emptyMap() .filter(Objects::nonNull).distinct().collect(Collectors.toList()); Map<Integer, TDept> ownerDeptMap = ownerIds.isEmpty() ? Collections.emptyMap() : tDeptService.listByIds(ownerIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); // 批量查询使用部门 List<Integer> useDeptIds = mains.stream().map(OaApprovalApplicationStorageAsset::getUseDeptId) .filter(Objects::nonNull).distinct().collect(Collectors.toList()); Map<Integer, TDept> useDeptMap = ownerIds.isEmpty() ? Collections.emptyMap() : tDeptService.listByIds(useDeptIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); // 批量查询仓库 List<Integer> warehouseIds = mains.stream().map(OaApprovalApplicationStorageAsset::getWarehouseId) .filter(Objects::nonNull).distinct().collect(Collectors.toList()); Map<Integer, AssetWarehouse> warehouseMap = warehouseIds.isEmpty() ? Collections.emptyMap() : assetWarehouseService.listByIds(useDeptIds).stream().collect(Collectors.toMap(AssetWarehouse::getId, d -> d)); 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()); OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO item = BeanUtil.copyProperties(m, OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO.class); if (m.getOwnershipDeptId() != null) { TDept dept = ownerDeptMap.get(m.getOwnershipDeptId()); item.setOwnerShipDeptName(dept != null ? dept.getDeptName() : null); } 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()); if (m.getAddressType().equals(0) && m.getUseDeptId() != null) { TDept dept = useDeptMap.get(m.getUseDeptId()); item.setUseDeptName(dept != null ? dept.getDeptName() : null); } else if (m.getAddressType().equals(1) && m.getWarehouseId() != null){ AssetWarehouse assetWarehouse = warehouseMap.get(m.getWarehouseId()); item.setWarehouseName(assetWarehouse != null ? assetWarehouse.getWarehouseName() : null); } return item; }).collect(Collectors.toList()); vo.setAssetItems(items); @@ -598,7 +594,6 @@ .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, app.getId()) .eq(OaApprovalApplicationStorageAsset::getAssetTypeId, storage.getAssetTypeId()) .list(); setAddressInfo(vo, mains); if (!CollectionUtils.isEmpty(mains)) { List<Integer> mainIds = mains.stream().map(OaApprovalApplicationStorageAsset::getId).collect(Collectors.toList()); @@ -609,28 +604,30 @@ .filter(id -> id != null).distinct().collect(Collectors.toList()); Map<Integer, TDept> ownerDeptMap = ownerIds.isEmpty() ? java.util.Collections.emptyMap() : tDeptService.listByIds(ownerIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); // 批量查询使用部门 List<Integer> useDeptIds = mains.stream().map(OaApprovalApplicationStorageAsset::getUseDeptId) .filter(Objects::nonNull).distinct().collect(Collectors.toList()); Map<Integer, TDept> useDeptMap = ownerIds.isEmpty() ? Collections.emptyMap() : tDeptService.listByIds(useDeptIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); // 批量查询仓库 List<Integer> warehouseIds = mains.stream().map(OaApprovalApplicationStorageAsset::getWarehouseId) .filter(Objects::nonNull).distinct().collect(Collectors.toList()); Map<Integer, AssetWarehouse> warehouseMap = warehouseIds.isEmpty() ? Collections.emptyMap() : assetWarehouseService.listByIds(useDeptIds).stream().collect(Collectors.toMap(AssetWarehouse::getId, d -> d)); 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()); OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO item = BeanUtil.copyProperties(m, OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO.class); if (m.getOwnershipDeptId() != null) { TDept dept = ownerDeptMap.get(m.getOwnershipDeptId()); item.setOwnerShipDeptName(dept != null ? dept.getDeptName() : null); } 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()); if (m.getAddressType().equals(0) && m.getUseDeptId() != null) { TDept dept = useDeptMap.get(m.getUseDeptId()); item.setUseDeptName(dept != null ? dept.getDeptName() : null); } else if (m.getAddressType().equals(1) && m.getWarehouseId() != null){ AssetWarehouse assetWarehouse = warehouseMap.get(m.getWarehouseId()); item.setWarehouseName(assetWarehouse != null ? assetWarehouse.getWarehouseName() : null); } OaApprovalApplicationStorageAssetPropertyExt ext = extMap.get(m.getId()); if (ext != null) { item.setRegion(ext.getRegion()); @@ -675,7 +672,6 @@ .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, app.getId()) .eq(OaApprovalApplicationStorageAsset::getAssetTypeId, storage.getAssetTypeId()) .list(); setAddressInfo(vo, mains); if (!CollectionUtils.isEmpty(mains)) { List<Integer> mainIds = mains.stream().map(OaApprovalApplicationStorageAsset::getId).collect(Collectors.toList()); @@ -686,28 +682,29 @@ .filter(id -> id != null).distinct().collect(Collectors.toList()); Map<Integer, TDept> ownerDeptMap = ownerIds.isEmpty() ? java.util.Collections.emptyMap() : tDeptService.listByIds(ownerIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); // 批量查询使用部门 List<Integer> useDeptIds = mains.stream().map(OaApprovalApplicationStorageAsset::getUseDeptId) .filter(Objects::nonNull).distinct().collect(Collectors.toList()); Map<Integer, TDept> useDeptMap = ownerIds.isEmpty() ? Collections.emptyMap() : tDeptService.listByIds(useDeptIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); // 批量查询仓库 List<Integer> warehouseIds = mains.stream().map(OaApprovalApplicationStorageAsset::getWarehouseId) .filter(Objects::nonNull).distinct().collect(Collectors.toList()); Map<Integer, AssetWarehouse> warehouseMap = warehouseIds.isEmpty() ? Collections.emptyMap() : assetWarehouseService.listByIds(useDeptIds).stream().collect(Collectors.toMap(AssetWarehouse::getId, d -> d)); 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()); OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO item = BeanUtil.copyProperties(m, OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO.class); if (m.getOwnershipDeptId() != null) { TDept dept = ownerDeptMap.get(m.getOwnershipDeptId()); item.setOwnerShipDeptName(dept != null ? dept.getDeptName() : null); } 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()); if (m.getAddressType().equals(0) && m.getUseDeptId() != null) { TDept dept = useDeptMap.get(m.getUseDeptId()); item.setUseDeptName(dept != null ? dept.getDeptName() : null); } else if (m.getAddressType().equals(1) && m.getWarehouseId() != null){ AssetWarehouse assetWarehouse = warehouseMap.get(m.getWarehouseId()); item.setWarehouseName(assetWarehouse != null ? assetWarehouse.getWarehouseName() : null); } OaApprovalApplicationStorageAssetVehicleExt ext = extMap.get(m.getId()); if (ext != null) { item.setLicensePlate(ext.getLicensePlate()); @@ -766,51 +763,6 @@ v.setAssetTypeId(storage.getAssetTypeId()); v.setStorageType(storage.getStorageType()); v.setStorageTime(storage.getStorageTime()); } } private void setAddressInfo(Object vo, List<OaApprovalApplicationStorageAsset> mains) { if (CollectionUtils.isEmpty(mains)) { return; } OaApprovalApplicationStorageAsset sample = mains.get(0); Integer addressType = null; String useDeptName = null; String warehouseName = null; String address = null; switch (sample.getAddressType()) { case 0: TDept dept = tDeptService.getById(sample.getUseDeptId()); useDeptName = dept != null ? dept.getDeptName() : null; break; case 1: AssetWarehouse wh = assetWarehouseService.getById(sample.getWarehouseId()); warehouseName = wh != null ? wh.getWarehouseName() : null; break; case 2: break; default: return; } if (vo instanceof OaApprovalApplicationStorageGeneralDetailVO) { OaApprovalApplicationStorageGeneralDetailVO v = (OaApprovalApplicationStorageGeneralDetailVO) vo; v.setAddressType(sample.getAddressType()); v.setUseDeptName(useDeptName); v.setWarehouseName(warehouseName); v.setAddress(sample.getAddress()); } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) { OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo; v.setAddressType(sample.getAddressType()); v.setUseDeptName(useDeptName); v.setWarehouseName(warehouseName); v.setAddress(sample.getAddress()); } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) { OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo; v.setAddressType(sample.getAddressType()); v.setUseDeptName(useDeptName); v.setWarehouseName(warehouseName); v.setAddress(sample.getAddress()); } } ruoyi-system/src/main/java/com/ruoyi/system/vo/StorageDetailVO.java
@@ -8,7 +8,6 @@ import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @Data @@ -24,7 +23,7 @@ @ApiModelProperty(value = "标题") private String title; @ApiModelProperty(value = "入库类型 0-正常入库") private Boolean storageType; private Integer storageType; @ApiModelProperty(value = "入库日期") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDate storageTime; ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java
@@ -52,18 +52,6 @@ @JsonFormat(pattern = "yyyy-MM-dd") 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; @@ -117,5 +105,17 @@ @ApiModelProperty(value = "入账金额") private BigDecimal accountingAmount; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门/位置名称") private String useDeptName; @ApiModelProperty(value = "仓库名称") private String warehouseName; @ApiModelProperty(value = "所在位置") private String address; } } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePageVO.java
@@ -19,6 +19,9 @@ @ApiModelProperty("主键ID") private Integer id; @ApiModelProperty("资产类型ID") private Integer assetTypeId; @ApiModelProperty("所属部门") private String deptName; ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java
@@ -52,18 +52,6 @@ @JsonFormat(pattern = "yyyy-MM-dd") 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; @@ -168,5 +156,17 @@ @ApiModelProperty(value = "租赁期限止") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate leaseEndDate; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门/位置名称") private String useDeptName; @ApiModelProperty(value = "仓库名称") private String warehouseName; @ApiModelProperty(value = "所在位置") private String address; } } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java
@@ -52,18 +52,6 @@ @JsonFormat(pattern = "yyyy-MM-dd") 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; @@ -142,5 +130,18 @@ @ApiModelProperty(value = "产权形式") private String propertyRightForm; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门/位置名称") private String useDeptName; @ApiModelProperty(value = "仓库名称") private String warehouseName; @ApiModelProperty(value = "所在位置") private String address; } } ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageMapper.xml
@@ -21,6 +21,7 @@ <select id="selectApplicationStoragePage" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO"> SELECT oas.id AS id, oas.asset_type_id AS assetTypeId, aaa.dept_name AS deptName, aaa.application_code AS applicationCode, oas.title AS title, @@ -56,9 +57,9 @@ end as useName from asset_main t1 left join asset_type t2 on t3.id = t1.asset_type_id left join t_dept t3 on t4.id = t3.ownership_dept_id from oa_approval_application_storage_asset t1 left join asset_type t2 on t2.id = t1.asset_type_id left join t_dept t3 on t3.id = t1.ownership_dept_id where t1.approval_application_id = #{query.approvalApplicationId} order by t1.create_time desc