ruoyi-admin/pom.xml
@@ -17,11 +17,6 @@ <dependencies> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.8.0</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> <!-- 请根据需要选择合适的版本 --> ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java
@@ -3,11 +3,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.R; 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.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.entity.TDept; import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageDTO; import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageGeneralDTO; import com.ruoyi.system.dto.asset.OaApprovalApplicationStoragePropertyDTO; import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageVehicleDTO; @@ -16,21 +17,21 @@ import com.ruoyi.system.service.AssetWarehouseService; import com.ruoyi.system.service.OaApprovalApplicationStorageService; import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; 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.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 org.springframework.web.bind.annotation.GetMapping; import javax.validation.Valid; @@ -57,7 +58,7 @@ @PostMapping("/submit-general") @Log(title = "通用资产入库申请-提交", businessType = BusinessType.INSERT) public R<Void> submitGeneralAssetStorage(@Valid @RequestBody OaApprovalApplicationStorageGeneralDTO dto) { validateAddress(dto); // 校验每条明细的权属单位/部门名称是否存在 for (OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item : dto.getAssetItems()) { if (StringUtils.isEmpty(item.getOwnershipDeptName())) { @@ -67,7 +68,11 @@ if (owner == null) { throw new ServiceException("权属单位/部门不存在: " + item.getOwnershipDeptName()); } validateAddress(item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress()); } LoginUser loginUser = SecurityUtils.getLoginUser(); dto.setApplicantUserId(loginUser.getUserId().intValue()); dto.setApplicantName(loginUser.getUser().getNickName()); oaApprovalApplicationStorageService.submitGeneralAssetStorage(dto); return R.ok(); } @@ -76,7 +81,6 @@ @PostMapping("/submit-property") @Log(title = "房产资产入库申请-提交", businessType = BusinessType.INSERT) public R<Void> submitPropertyAssetStorage(@Valid @RequestBody OaApprovalApplicationStoragePropertyDTO dto) { validateAddress(dto); for (OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item : dto.getAssetItems()) { if (StringUtils.isEmpty(item.getOwnershipDeptName())) { throw new ServiceException("权属单位/部门名称不能为空"); @@ -85,7 +89,11 @@ if (owner == null) { throw new ServiceException("权属单位/部门不存在: " + item.getOwnershipDeptName()); } validateAddress(item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress()); } LoginUser loginUser = SecurityUtils.getLoginUser(); dto.setApplicantUserId(loginUser.getUserId().intValue()); dto.setApplicantName(loginUser.getUser().getNickName()); oaApprovalApplicationStorageService.submitPropertyAssetStorage(dto); return R.ok(); } @@ -94,7 +102,6 @@ @PostMapping("/submit-vehicle") @Log(title = "车辆资产入库申请-提交", businessType = BusinessType.INSERT) public R<Void> submitVehicleAssetStorage(@Valid @RequestBody OaApprovalApplicationStorageVehicleDTO dto) { validateAddress(dto); for (OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item : dto.getAssetItems()) { if (StringUtils.isEmpty(item.getOwnershipDeptName())) { throw new ServiceException("权属单位/部门名称不能为空"); @@ -103,7 +110,11 @@ if (owner == null) { throw new ServiceException("权属单位/部门不存在: " + item.getOwnershipDeptName()); } validateAddress(item.getAddressType(), item.getUseDeptName(), item.getWarehouseName(), item.getAddress()); } LoginUser loginUser = SecurityUtils.getLoginUser(); dto.setApplicantUserId(loginUser.getUserId().intValue()); dto.setApplicantName(loginUser.getUser().getNickName()); oaApprovalApplicationStorageService.submitVehicleAssetStorage(dto); return R.ok(); } @@ -147,39 +158,38 @@ /** * 校验位置类型与相关名称/地址 */ private void validateAddress(OaApprovalApplicationStorageDTO dto) { Integer addressType = dto.getAddressType(); private void validateAddress(Integer addressType,String useDeptName,String wareHouseName,String address) { if (addressType == null) { throw new ServiceException("位置类型不能为空"); } switch (addressType) { case 0: // 部门 if (StringUtils.isEmpty(dto.getUseDeptName())) { if (StringUtils.isEmpty(useDeptName)) { throw new ServiceException("使用部门名称不能为空"); } TDept dept = deptService.lambdaQuery() .eq(TDept::getDeptName, dto.getUseDeptName()) .eq(TDept::getDeptName, useDeptName) .one(); if (dept == null) { throw new ServiceException("使用部门不存在: " + dto.getUseDeptName()); throw new ServiceException("使用部门不存在: " + useDeptName); } break; case 1: // 仓库 if (StringUtils.isEmpty(dto.getWarehouseName())) { if (StringUtils.isEmpty(wareHouseName)) { throw new ServiceException("仓库名称不能为空"); } AssetWarehouse wh = assetWarehouseService.lambdaQuery() .eq(AssetWarehouse::getWarehouseName, dto.getWarehouseName()) .eq(AssetWarehouse::getWarehouseName, wareHouseName) .one(); if (wh == null) { throw new ServiceException("仓库不存在: " + dto.getWarehouseName()); throw new ServiceException("仓库不存在: " + wareHouseName); } break; case 2: // 地址 if (StringUtils.isEmpty(dto.getAddress())) { if (StringUtils.isEmpty(address)) { throw new ServiceException("所在位置不能为空"); } break; ruoyi-admin/src/main/resources/application-prod.yml
@@ -226,6 +226,6 @@ accessKeyId: LTAI5tNW8B4CYP1WK7yS3bfW accessKeySecret: 9RrPDLd7wh4VGCjXxD8ULIdKiuY5Ly upload-endpoint: https://oss-cn-chengdu.aliyuncs.com download-endpoint: https://zhpt-oss.oss-cn-chengdu.aliyuncs.com bucketName: zhpt download-endpoint: https://zhpt-oss.oss-cn-chengdu.aliyuncs.com/ bucketName: zhpt-oss folder: shehongchengtou ruoyi-admin/src/main/resources/application-test.yml
@@ -227,8 +227,8 @@ accessKeyId: LTAI5tNW8B4CYP1WK7yS3bfW accessKeySecret: 9RrPDLd7wh4VGCjXxD8ULIdKiuY5Ly upload-endpoint: https://oss-cn-chengdu.aliyuncs.com download-endpoint: https://zhpt-oss.oss-cn-chengdu.aliyuncs.com bucketName: zhpt download-endpoint: https://zhpt-oss.oss-cn-chengdu.aliyuncs.com/ bucketName: zhpt-oss folder: shehongchengtou sms: enable: true ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java
@@ -29,11 +29,9 @@ private String deptName; @ApiModelProperty(value = "申请人ID") @NotNull(message = "申请人不能为空") private Integer applicantUserId; @ApiModelProperty(value = "申请人姓名") @NotBlank(message = "申请人姓名不能为空") private String applicantName; @ApiModelProperty(value = "入库备注") @@ -53,17 +51,12 @@ @ApiModelProperty(value = "入库类型 0-正常入库") @NotNull(message = "入库类型不能为空") private Boolean storageType; private Integer storageType; @ApiModelProperty(value = "入库日期") @NotNull(message = "入库日期不能为空") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate storageTime; // 新增:统一的资产所在单位信息(用于整单校验) @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") @NotNull(message = "位置类型不能为空") private Integer addressType; @ApiModelProperty(value = "使用部门/位置名称") private String useDeptName; ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java
@@ -139,8 +139,8 @@ @ApiModelProperty(value = "安置情况") private String resettlementSituation; @ApiModelProperty(value = "是否抵押:0-否,1-是") private Integer mortgaged; @ApiModelProperty(value = "是否抵押:否,是") private String mortgaged; @ApiModelProperty(value = "承租方") private String tenantName; ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageAssetMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.mapper; import com.ruoyi.system.model.OaApprovalApplicationStorageAsset; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 资产入库申请主表 Mapper 接口 * </p> * * @author mitao * @since 2025-09-22 */ public interface OaApprovalApplicationStorageAssetMapper extends BaseMapper<OaApprovalApplicationStorageAsset> { } ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageAssetPropertyExtMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.mapper; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetPropertyExt; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 资产入库申请房产资产扩展表 Mapper 接口 * </p> * * @author mitao * @since 2025-09-22 */ public interface OaApprovalApplicationStorageAssetPropertyExtMapper extends BaseMapper<OaApprovalApplicationStorageAssetPropertyExt> { } ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationStorageAssetVehicleExtMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.mapper; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetVehicleExt; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 资产入库申请车辆资产扩展表 Mapper 接口 * </p> * * @author mitao * @since 2025-09-22 */ public interface OaApprovalApplicationStorageAssetVehicleExtMapper extends BaseMapper<OaApprovalApplicationStorageAssetVehicleExt> { } ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorage.java
@@ -46,7 +46,7 @@ @ApiModelProperty(value = "入库类型 0-正常入库") @TableField("storage_type") private Boolean storageType; private Integer storageType; @ApiModelProperty(value = "入库日期") @TableField("storage_time") ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorageAsset.java
New file @@ -0,0 +1,143 @@ package com.ruoyi.system.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; /** * <p> * 资产入库申请主表 * </p> * * @author mitao * @since 2025-09-22 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("oa_approval_application_storage_asset") @ApiModel(value="OaApprovalApplicationStorageAsset对象", description="资产入库申请主表") public class OaApprovalApplicationStorageAsset implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "审批申请记录ID") private Integer approvalApplicationId; @ApiModelProperty(value = "资产原编码") private String assetOriginalCode; @ApiModelProperty(value = "资产名称") private String assetName; @ApiModelProperty(value = "规格型号") private String specificationModel; @ApiModelProperty(value = "类别") private String category; @ApiModelProperty(value = "资产类别ID,关联asset_type表") private Integer assetTypeId; @ApiModelProperty(value = "类别名称(冗余字段)") private String assetCategory; @ApiModelProperty(value = "资产主类型:0-通用资产,1-房产资产,2-车辆资产") private Integer assetMainType; @ApiModelProperty(value = "计量单位") private String measurementUnit; @ApiModelProperty(value = "数量") private BigDecimal quantity; @ApiModelProperty(value = "单价") private BigDecimal unitPrice; @ApiModelProperty(value = "总价值(数量*单价)") private BigDecimal totalValue; @ApiModelProperty(value = "使用年限(年)") private Integer usefulLife; @ApiModelProperty(value = "权属单位/部门ID") private Integer ownershipDeptId; @ApiModelProperty(value = "使用人") private String userName; @ApiModelProperty(value = "使用类型") private String useType; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门/位置ID") private Integer useDeptId; @ApiModelProperty(value = "仓库名称(冗余字段)") private String warehouseName; @ApiModelProperty(value = "所在位置") private String address; @ApiModelProperty(value = "仓库ID,关联warehouse表") private Integer warehouseId; @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 = "附件URL列表(多个附件使用英文逗号拼接)") private String attachmentUrls; @ApiModelProperty(value = "创建时间") private LocalDateTime createTime; @ApiModelProperty(value = "创建人") private String createBy; @ApiModelProperty(value = "更新时间") private LocalDateTime updateTime; @ApiModelProperty(value = "更新人") private String updateBy; @ApiModelProperty(value = "是否删除 0-否,1-是") @TableLogic private Boolean disabled; } ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorageAssetPropertyExt.java
New file @@ -0,0 +1,107 @@ package com.ruoyi.system.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; /** * <p> * 资产入库申请房产资产扩展表 * </p> * * @author mitao * @since 2025-09-22 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("oa_approval_application_storage_asset_property_ext") @ApiModel(value="OaApprovalApplicationStorageAssetPropertyExt对象", description="资产入库申请房产资产扩展表") public class OaApprovalApplicationStorageAssetPropertyExt implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "资产入库申请主表ID,关联oa_approval_application_storage_asset表") private Integer storageAssetId; @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 = "是否抵押:是,否") @TableField("is_mortgaged") private String mortgaged; @ApiModelProperty(value = "承租方") private String tenantName; @ApiModelProperty(value = "租金") private BigDecimal rentalAmount; @ApiModelProperty(value = "租赁期限起") private LocalDate leaseStartDate; @ApiModelProperty(value = "租赁期限止") private LocalDate leaseEndDate; @ApiModelProperty(value = "创建时间") private LocalDateTime createTime; @ApiModelProperty(value = "创建人") private String createBy; @ApiModelProperty(value = "更新时间") private LocalDateTime updateTime; @ApiModelProperty(value = "更新人") private String updateBy; @ApiModelProperty(value = "是否删除 0-否,1-是") private Boolean disabled; } ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorageAssetVehicleExt.java
New file @@ -0,0 +1,80 @@ package com.ruoyi.system.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; /** * <p> * 资产入库申请车辆资产扩展表 * </p> * * @author mitao * @since 2025-09-22 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("oa_approval_application_storage_asset_vehicle_ext") @ApiModel(value="OaApprovalApplicationStorageAssetVehicleExt对象", description="资产入库申请车辆资产扩展表") public class OaApprovalApplicationStorageAssetVehicleExt implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "资产入库申请主表ID,关联oa_approval_application_storage_asset表") private Integer storageAssetId; @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; @ApiModelProperty(value = "创建时间") private LocalDateTime createTime; @ApiModelProperty(value = "创建人") private String createBy; @ApiModelProperty(value = "更新时间") private LocalDateTime updateTime; @ApiModelProperty(value = "更新人") private String updateBy; @ApiModelProperty(value = "是否删除 0-否,1-是") private Boolean disabled; } ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageAssetPropertyExtService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.service; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetPropertyExt; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 资产入库申请房产资产扩展表 服务类 * </p> * * @author mitao * @since 2025-09-22 */ public interface OaApprovalApplicationStorageAssetPropertyExtService extends IService<OaApprovalApplicationStorageAssetPropertyExt> { } ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageAssetService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.service; import com.ruoyi.system.model.OaApprovalApplicationStorageAsset; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 资产入库申请主表 服务类 * </p> * * @author mitao * @since 2025-09-22 */ public interface OaApprovalApplicationStorageAssetService extends IService<OaApprovalApplicationStorageAsset> { } ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageAssetVehicleExtService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.service; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetVehicleExt; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 资产入库申请车辆资产扩展表 服务类 * </p> * * @author mitao * @since 2025-09-22 */ public interface OaApprovalApplicationStorageAssetVehicleExtService extends IService<OaApprovalApplicationStorageAssetVehicleExt> { } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageAssetPropertyExtServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.system.service.impl; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetPropertyExt; import com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetPropertyExtMapper; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetPropertyExtService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 资产入库申请房产资产扩展表 服务实现类 * </p> * * @author mitao * @since 2025-09-22 */ @Service public class OaApprovalApplicationStorageAssetPropertyExtServiceImpl extends ServiceImpl<OaApprovalApplicationStorageAssetPropertyExtMapper, OaApprovalApplicationStorageAssetPropertyExt> implements OaApprovalApplicationStorageAssetPropertyExtService { } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageAssetServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.system.service.impl; import com.ruoyi.system.model.OaApprovalApplicationStorageAsset; import com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetMapper; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 资产入库申请主表 服务实现类 * </p> * * @author mitao * @since 2025-09-22 */ @Service public class OaApprovalApplicationStorageAssetServiceImpl extends ServiceImpl<OaApprovalApplicationStorageAssetMapper, OaApprovalApplicationStorageAsset> implements OaApprovalApplicationStorageAssetService { } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageAssetVehicleExtServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.system.service.impl; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetVehicleExt; import com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetVehicleExtMapper; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetVehicleExtService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 资产入库申请车辆资产扩展表 服务实现类 * </p> * * @author mitao * @since 2025-09-22 */ @Service public class OaApprovalApplicationStorageAssetVehicleExtServiceImpl extends ServiceImpl<OaApprovalApplicationStorageAssetVehicleExtMapper, OaApprovalApplicationStorageAssetVehicleExt> implements OaApprovalApplicationStorageAssetVehicleExtService { } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
@@ -12,23 +12,23 @@ import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.emums.AssetTypeEnum; import com.ruoyi.system.mapper.OaApprovalApplicationStorageMapper; import com.ruoyi.system.model.AssetGeneralExt; import com.ruoyi.system.model.AssetMain; import com.ruoyi.system.model.AssetPropertyExt; import com.ruoyi.system.model.AssetVehicleExt; import com.ruoyi.system.model.AssetWarehouse; import com.ruoyi.system.model.OaApprovalApplicationStorage; import com.ruoyi.system.model.OaApprovalApplicationStorageAsset; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetPropertyExt; import com.ruoyi.system.model.OaApprovalApplicationStorageAssetVehicleExt; import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowNode; import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery; import com.ruoyi.system.service.AssetGeneralExtService; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.AssetPropertyExtService; import com.ruoyi.system.service.AssetTypeService; import com.ruoyi.system.service.AssetVehicleExtService; import com.ruoyi.system.service.AssetWarehouseService; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetPropertyExtService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetService; import com.ruoyi.system.service.OaApprovalApplicationStorageAssetVehicleExtService; import com.ruoyi.system.service.OaApprovalApplicationStorageService; import com.ruoyi.system.service.OaApprovalApplicationsService; import com.ruoyi.system.service.OaApprovalFlowNodeService; @@ -43,7 +43,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -64,15 +63,15 @@ public class OaApprovalApplicationStorageServiceImpl extends ServiceImpl<OaApprovalApplicationStorageMapper, OaApprovalApplicationStorage> implements OaApprovalApplicationStorageService { private final OaApprovalApplicationsService oaApprovalApplicationsService; private final OaApprovalApplicationStorageAssetService oaApprovalApplicationStorageAssetService; private final OaApprovalApplicationStorageAssetPropertyExtService oaApprovalApplicationStorageAssetPropertyExtService; private final OaApprovalApplicationStorageAssetVehicleExtService oaApprovalApplicationStorageAssetVehicleExtService; private final AssetMainService assetMainService; private final AssetGeneralExtService assetGeneralExtService; private final AssetPropertyExtService assetPropertyExtService; private final AssetVehicleExtService assetVehicleExtService; private final AssetTypeService assetTypeService; private final OaApprovalFlowNodeService oaApprovalFlowNodeService; private final OaApprovalTodoService oaApprovalTodoService; private final ISysUserService sysUserService; private final ISysDeptService sysDeptService; private final TDeptService tDeptService; private final AssetWarehouseService assetWarehouseService; @@ -146,104 +145,78 @@ * 保存通用资产数据 */ private void saveGeneralAssets(List<OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) { List<AssetMain> allAssetMains = new ArrayList<>(); List<OaApprovalApplicationStorageAsset> storageAssets = new ArrayList<>(); for (OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item : assetItems) { // 根据数量创建对应数量的资产记录 int quantity = item.getQuantity().intValue(); for (int i = 0; i < quantity; i++) { AssetMain assetMain = buildAssetMain(item, applicationId, assetTypeId, storageDate, baseDto); assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode()); assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1 assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价 allAssetMains.add(assetMain); } OaApprovalApplicationStorageAsset assetMain = buildAssetMain(item, applicationId, assetTypeId, storageDate, baseDto); assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode()); storageAssets.add(assetMain); } // 批量保存资产主表数据 assetMainService.saveBatch(allAssetMains); oaApprovalApplicationStorageAssetService.saveBatch(storageAssets); } /** * 保存房产资产数据 */ private void savePropertyAssets(List<OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) { List<AssetMain> allAssetMains = new ArrayList<>(); List<AssetPropertyExt> allPropertyExts = new ArrayList<>(); List<OaApprovalApplicationStorageAsset> allAssetMains = new ArrayList<>(); List<OaApprovalApplicationStorageAssetPropertyExt> allPropertyExts = new ArrayList<>(); for (OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item : assetItems) { // 根据数量创建对应数量的资产记录 int quantity = item.getQuantity().intValue(); for (int i = 0; i < quantity; i++) { AssetMain assetMain = buildAssetMainFromProperty(item, applicationId, assetTypeId, storageDate, baseDto); assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode()); assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1 assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价 allAssetMains.add(assetMain); } OaApprovalApplicationStorageAsset assetMain = buildAssetMainFromProperty(item, applicationId, assetTypeId, storageDate, baseDto); assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode()); allAssetMains.add(assetMain); } // 批量保存资产主表数据 assetMainService.saveBatch(allAssetMains); oaApprovalApplicationStorageAssetService.saveBatch(allAssetMains); // 为每个资产主表记录创建对应的扩展信息 int assetMainIndex = 0; for (OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item : assetItems) { int quantity = item.getQuantity().intValue(); for (int i = 0; i < quantity; i++) { AssetPropertyExt propertyExt = buildAssetPropertyExt(item, allAssetMains.get(assetMainIndex).getId()); for (OaApprovalApplicationStorageAsset allAssetMain : allAssetMains) { for (OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item : assetItems) { OaApprovalApplicationStorageAssetPropertyExt propertyExt = buildAssetPropertyExt(item, allAssetMain.getId()); allPropertyExts.add(propertyExt); assetMainIndex++; } } assetPropertyExtService.saveBatch(allPropertyExts); oaApprovalApplicationStorageAssetPropertyExtService.saveBatch(allPropertyExts); } /** * 保存车辆资产数据 */ private void saveVehicleAssets(List<OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) { List<AssetMain> allAssetMains = new ArrayList<>(); List<AssetVehicleExt> allVehicleExts = new ArrayList<>(); List<OaApprovalApplicationStorageAsset> allAssetMains = new ArrayList<>(); List<OaApprovalApplicationStorageAssetVehicleExt> allVehicleExts = new ArrayList<>(); for (OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item : assetItems) { // 根据数量创建对应数量的资产记录 int quantity = item.getQuantity().intValue(); for (int i = 0; i < quantity; i++) { AssetMain assetMain = buildAssetMainFromVehicle(item, applicationId, assetTypeId, storageDate, baseDto); assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode()); assetMain.setQuantity(BigDecimal.ONE); // 每个资产记录数量为1 assetMain.setTotalValue(item.getUnitPrice()); // 总价值等于单价 allAssetMains.add(assetMain); } OaApprovalApplicationStorageAsset assetMain = buildAssetMainFromVehicle(item, applicationId, assetTypeId, storageDate, baseDto); assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode()); allAssetMains.add(assetMain); } // 批量保存资产主表数据 assetMainService.saveBatch(allAssetMains); oaApprovalApplicationStorageAssetService.saveBatch(allAssetMains); // 为每个资产主表记录创建对应的扩展信息 int assetMainIndex = 0; for (OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item : assetItems) { int quantity = item.getQuantity().intValue(); for (int i = 0; i < quantity; i++) { AssetVehicleExt vehicleExt = buildAssetVehicleExt(item, allAssetMains.get(assetMainIndex).getId()); for (OaApprovalApplicationStorageAsset allAssetMain : allAssetMains) { for (OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item : assetItems) { OaApprovalApplicationStorageAssetVehicleExt vehicleExt = buildAssetVehicleExt(item, allAssetMain.getId()); allVehicleExts.add(vehicleExt); assetMainIndex++; } } assetVehicleExtService.saveBatch(allVehicleExts); oaApprovalApplicationStorageAssetVehicleExtService.saveBatch(allVehicleExts); } /** * 构建通用资产主表数据 */ private AssetMain buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) { AssetMain assetMain = new AssetMain(); private OaApprovalApplicationStorageAsset buildAssetMain(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) { OaApprovalApplicationStorageAsset assetMain = new OaApprovalApplicationStorageAsset(); assetMain.setApprovalApplicationId(applicationId.intValue()); assetMain.setAssetOriginalCode(item.getAssetOriginalCode()); assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate)); // 系统生成资产编码 assetMain.setAssetName(item.getAssetName()); assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); @@ -262,8 +235,8 @@ } assetMain.setUserName(item.getUserName()); // 根据整单 addressType 写入使用部门ID或仓库ID applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress()); assetMain.setAssetMainType(baseDto.getAddressType()); applyUseDeptInfoToAssetMain(assetMain, baseDto.getUseDeptName()); assetMain.setAssetMainType(AssetTypeEnum.GENERAL.getCode()); assetMain.setAssetStatus(item.getAssetStatus()); assetMain.setRemarks(item.getRemarks()); assetMain.setAccountingStatus(item.getAccountingStatus()); @@ -278,11 +251,10 @@ /** * 构建房产资产主表数据 */ private AssetMain buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) { AssetMain assetMain = new AssetMain(); private OaApprovalApplicationStorageAsset buildAssetMainFromProperty(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStoragePropertyDTO baseDto) { OaApprovalApplicationStorageAsset assetMain = new OaApprovalApplicationStorageAsset(); assetMain.setApprovalApplicationId(applicationId.intValue()); assetMain.setAssetOriginalCode(item.getAssetOriginalCode()); assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate)); assetMain.setAssetName(item.getAssetName()); assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); @@ -299,8 +271,8 @@ } } assetMain.setUserName(item.getUserName()); applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress()); assetMain.setAssetMainType(baseDto.getAddressType()); applyUseDeptInfoToAssetMain(assetMain, baseDto.getUseDeptName()); assetMain.setAssetMainType(AssetTypeEnum.HOUSE.getCode()); assetMain.setAssetStatus(item.getAssetStatus()); assetMain.setRemarks(item.getRemarks()); assetMain.setAccountingStatus(item.getAccountingStatus()); @@ -315,11 +287,10 @@ /** * 构建车辆资产主表数据 */ private AssetMain buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) { AssetMain assetMain = new AssetMain(); private OaApprovalApplicationStorageAsset buildAssetMainFromVehicle(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageVehicleDTO baseDto) { OaApprovalApplicationStorageAsset assetMain = new OaApprovalApplicationStorageAsset(); assetMain.setApprovalApplicationId(applicationId.intValue()); assetMain.setAssetOriginalCode(item.getAssetOriginalCode()); assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate)); assetMain.setAssetName(item.getAssetName()); assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); @@ -336,8 +307,8 @@ } } assetMain.setUserName(item.getUserName()); applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress()); assetMain.setAssetMainType(baseDto.getAddressType()); applyUseDeptInfoToAssetMain(assetMain, baseDto.getUseDeptName()); assetMain.setAssetMainType(AssetTypeEnum.VEHICLE.getCode()); assetMain.setAssetStatus(item.getAssetStatus()); assetMain.setRemarks(item.getRemarks()); assetMain.setAccountingStatus(item.getAccountingStatus()); @@ -352,59 +323,25 @@ /** * 按整单地址类型设置资产主表位置信息(使用部门ID或仓库ID或地址) */ private void applyAddressToAssetMain(AssetMain assetMain, Integer addressType, String useDeptName, String warehouseName, String address) { if (addressType == null) { return; } switch (addressType) { case 0: // 使用部门 if (useDeptName != null && !useDeptName.isEmpty()) { TDept dept = tDeptService.lambdaQuery() .eq(TDept::getDeptName, useDeptName) .one(); if (dept != null) { assetMain.setUseDeptId(dept.getId()); } } break; case 1: if (warehouseName != null && !warehouseName.isEmpty()) { AssetWarehouse warehouse = assetWarehouseService.lambdaQuery() .eq(AssetWarehouse::getWarehouseName, warehouseName) .one(); if (warehouse != null) { assetMain.setWarehouseId(warehouse.getId()); assetMain.setWarehouseName(warehouse.getWarehouseName()); } } break; case 2: if (address != null && !address.isEmpty()) { assetMain.setAddress(address); } break; default: // ignore 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 AssetGeneralExt buildAssetGeneralExt(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer assetMainId) { AssetGeneralExt generalExt = new AssetGeneralExt(); generalExt.setAssetMainId(assetMainId); generalExt.setDisabled(false); return generalExt; } /** * 构建房产资产扩展数据 */ private AssetPropertyExt buildAssetPropertyExt(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer assetMainId) { AssetPropertyExt propertyExt = new AssetPropertyExt(); propertyExt.setAssetMainId(assetMainId); private OaApprovalApplicationStorageAssetPropertyExt buildAssetPropertyExt(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer assetMainId) { OaApprovalApplicationStorageAssetPropertyExt propertyExt = new OaApprovalApplicationStorageAssetPropertyExt(); propertyExt.setStorageAssetId(assetMainId); propertyExt.setRegion(item.getRegion()); propertyExt.setDesignPurpose(item.getDesignPurpose()); propertyExt.setBuilding(item.getBuilding()); @@ -428,9 +365,9 @@ /** * 构建车辆资产扩展数据 */ private AssetVehicleExt buildAssetVehicleExt(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer assetMainId) { AssetVehicleExt vehicleExt = new AssetVehicleExt(); vehicleExt.setAssetMainId(assetMainId); private OaApprovalApplicationStorageAssetVehicleExt buildAssetVehicleExt(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer assetMainId) { OaApprovalApplicationStorageAssetVehicleExt vehicleExt = new OaApprovalApplicationStorageAssetVehicleExt(); vehicleExt.setStorageAssetId(assetMainId); vehicleExt.setLicensePlate(item.getLicensePlate()); vehicleExt.setVinCode(item.getVinCode()); vehicleExt.setEngineNumber(item.getEngineNumber()); @@ -598,16 +535,15 @@ OaApprovalApplicationStorageGeneralDetailVO vo = new OaApprovalApplicationStorageGeneralDetailVO(); fillBaseFields(vo, app, storage); List<AssetMain> mains = assetMainService.lambdaQuery() .eq(AssetMain::getApprovalApplicationId, app.getId()) .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) List<OaApprovalApplicationStorageAsset> mains = oaApprovalApplicationStorageAssetService.lambdaQuery() .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, app.getId()) .eq(OaApprovalApplicationStorageAsset::getAssetTypeId, storage.getAssetTypeId()) .list(); setAddressInfo(vo, mains); if (!CollectionUtils.isEmpty(mains)) { List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList()); // 批量查询权属部门,避免循环内查询 List<Integer> ownerIds = mains.stream().map(AssetMain::getOwnershipDeptId) 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() : tDeptService.listByIds(ownerIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); @@ -654,18 +590,18 @@ OaApprovalApplicationStoragePropertyDetailVO vo = new OaApprovalApplicationStoragePropertyDetailVO(); fillBaseFields(vo, app, storage); List<AssetMain> mains = assetMainService.lambdaQuery() .eq(AssetMain::getApprovalApplicationId, app.getId()) .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) List<OaApprovalApplicationStorageAsset> mains = oaApprovalApplicationStorageAssetService.lambdaQuery() .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, app.getId()) .eq(OaApprovalApplicationStorageAsset::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<Integer> mainIds = mains.stream().map(OaApprovalApplicationStorageAsset::getId).collect(Collectors.toList()); List<OaApprovalApplicationStorageAssetPropertyExt> exts = oaApprovalApplicationStorageAssetPropertyExtService.lambdaQuery().in(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, mainIds).list(); Map<Integer, OaApprovalApplicationStorageAssetPropertyExt> extMap = exts.stream().collect(Collectors.toMap(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, e -> e)); // 批量查询权属部门 List<Integer> ownerIds = mains.stream().map(AssetMain::getOwnershipDeptId) 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() : tDeptService.listByIds(ownerIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); @@ -691,7 +627,7 @@ item.setAccountingVoucherNo(m.getAccountingVoucherNo()); item.setAccountingSubject(m.getAccountingSubject()); item.setAccountingAmount(m.getAccountingAmount()); AssetPropertyExt ext = extMap.get(m.getId()); OaApprovalApplicationStorageAssetPropertyExt ext = extMap.get(m.getId()); if (ext != null) { item.setRegion(ext.getRegion()); item.setDesignPurpose(ext.getDesignPurpose()); @@ -731,18 +667,18 @@ OaApprovalApplicationStorageVehicleDetailVO vo = new OaApprovalApplicationStorageVehicleDetailVO(); fillBaseFields(vo, app, storage); List<AssetMain> mains = assetMainService.lambdaQuery() .eq(AssetMain::getApprovalApplicationId, app.getId()) .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) List<OaApprovalApplicationStorageAsset> mains = oaApprovalApplicationStorageAssetService.lambdaQuery() .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, app.getId()) .eq(OaApprovalApplicationStorageAsset::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<Integer> mainIds = mains.stream().map(OaApprovalApplicationStorageAsset::getId).collect(Collectors.toList()); List<OaApprovalApplicationStorageAssetVehicleExt> exts = oaApprovalApplicationStorageAssetVehicleExtService.lambdaQuery().in(OaApprovalApplicationStorageAssetVehicleExt::getStorageAssetId, mainIds).list(); Map<Integer, OaApprovalApplicationStorageAssetVehicleExt> extMap = exts.stream().collect(Collectors.toMap(OaApprovalApplicationStorageAssetVehicleExt::getStorageAssetId, e -> e)); // 批量查询权属部门 List<Integer> ownerIds = mains.stream().map(AssetMain::getOwnershipDeptId) 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() : tDeptService.listByIds(ownerIds).stream().collect(Collectors.toMap(TDept::getId, d -> d)); @@ -768,7 +704,7 @@ item.setAccountingVoucherNo(m.getAccountingVoucherNo()); item.setAccountingSubject(m.getAccountingSubject()); item.setAccountingAmount(m.getAccountingAmount()); AssetVehicleExt ext = extMap.get(m.getId()); OaApprovalApplicationStorageAssetVehicleExt ext = extMap.get(m.getId()); if (ext != null) { item.setLicensePlate(ext.getLicensePlate()); item.setVinCode(ext.getVinCode()); @@ -829,46 +765,48 @@ } } private void setAddressInfo(Object vo, List<AssetMain> mains) { private void setAddressInfo(Object vo, List<OaApprovalApplicationStorageAsset> mains) { if (CollectionUtils.isEmpty(mains)) { return; } AssetMain sample = mains.get(0); OaApprovalApplicationStorageAsset 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(); 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(addressType); v.setAddressType(sample.getAddressType()); v.setUseDeptName(useDeptName); v.setWarehouseName(warehouseName); v.setAddress(address); v.setAddress(sample.getAddress()); } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) { OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo; v.setAddressType(addressType); v.setAddressType(sample.getAddressType()); v.setUseDeptName(useDeptName); v.setWarehouseName(warehouseName); v.setAddress(address); v.setAddress(sample.getAddress()); } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) { OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo; v.setAddressType(addressType); v.setAddressType(sample.getAddressType()); v.setUseDeptName(useDeptName); v.setWarehouseName(warehouseName); v.setAddress(address); v.setAddress(sample.getAddress()); } } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java
@@ -63,30 +63,35 @@ */ @Override public String upload(String storagePath, MultipartFile file) throws IOException { CredentialsProvider credentialsProvider = new DefaultCredentialProvider(OssConfig.ACCESS_KEY_ID, OssConfig.ACCESS_KEY_SECRET); String region = "cn-chengdu"; // 创建OSSClient实例。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(OssConfig.UPLOAD_ENDPOINT) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); InputStream inputStream = file.getInputStream(); OSS ossClient = null; try { CredentialsProvider credentialsProvider = new DefaultCredentialProvider(OssConfig.ACCESS_KEY_ID, OssConfig.ACCESS_KEY_SECRET); String region = "cn-chengdu"; // 创建OSSClient实例。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); ossClient = OSSClientBuilder.create() .endpoint(OssConfig.UPLOAD_ENDPOINT) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); InputStream inputStream = file.getInputStream(); String originFileName = file.getOriginalFilename(); String fileExt = Objects.requireNonNull(originFileName).substring(originFileName.lastIndexOf(".") + 1); String fileName = originFileName.substring(0, originFileName.lastIndexOf(".")); // 设置文件名 String filePathName = generateRelativeStoragePath(storagePath, fileExt, fileName); // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(OssConfig.BUCKET_NAME, filePathName, inputStream); // 创建PutObject请求。 PutObjectResult result = ossClient.putObject(putObjectRequest); String originFileName = file.getOriginalFilename(); String fileExt = Objects.requireNonNull(originFileName).substring(originFileName.lastIndexOf(".") + 1); String fileName = originFileName.substring(0, originFileName.lastIndexOf(".")); // 设置文件名 String filePathName = generateRelativeStoragePath(storagePath, fileExt, fileName); // 创建PutObjectRequest对象。 PutObjectRequest putObjectRequest = new PutObjectRequest(OssConfig.BUCKET_NAME, filePathName, inputStream); // 创建PutObject请求。 PutObjectResult result = ossClient.putObject(putObjectRequest); return OssConfig.DOWNLOAD_ENDPOINT + filePathName; return OssConfig.DOWNLOAD_ENDPOINT + filePathName; } finally { ossClient.shutdown(); } } /** ruoyi-system/src/main/java/com/ruoyi/system/vo/ApprovalTodoVO.java
@@ -1,11 +1,6 @@ package com.ruoyi.system.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.system.model.OaApprovalTodo; import com.ruoyi.system.model.OaNotification; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -50,7 +45,7 @@ @ApiModelProperty(value = "报销金额/申请金额/合计金额/总金额(报销申请/款项申请/款项支付审批/广告制作)") private BigDecimal amount; @ApiModelProperty(value = "入库类型 0-正常入库(资产入库)") private Boolean storageType; private Integer storageType; @ApiModelProperty(value = "领用/借用/归还日期(物品借用/领用归还)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDate operateTime; ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java
@@ -1,5 +1,6 @@ package com.ruoyi.system.vo.asset; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -29,6 +30,7 @@ private String applicantName; @ApiModelProperty(value = "申请日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate applicationDate; @ApiModelProperty(value = "入库备注") @@ -44,9 +46,10 @@ private Integer assetTypeId; @ApiModelProperty(value = "入库类型 0-正常入库") private Boolean storageType; private Integer storageType; @ApiModelProperty(value = "入库日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate storageTime; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java
@@ -30,6 +30,7 @@ private String applicantName; @ApiModelProperty(value = "申请日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate applicationDate; @ApiModelProperty(value = "入库备注") @@ -45,9 +46,10 @@ private Integer assetTypeId; @ApiModelProperty(value = "入库类型 0-正常入库") private Boolean storageType; private Integer storageType; @ApiModelProperty(value = "入库日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate storageTime; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") @@ -150,8 +152,8 @@ @ApiModelProperty(value = "安置情况") private String resettlementSituation; @ApiModelProperty(value = "是否抵押:0-否,1-是") private Integer mortgaged; @ApiModelProperty(value = "是否抵押:否,是") private String mortgaged; @ApiModelProperty(value = "承租方") private String tenantName; ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java
@@ -1,5 +1,6 @@ package com.ruoyi.system.vo.asset; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -29,6 +30,7 @@ private String applicantName; @ApiModelProperty(value = "申请日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate applicationDate; @ApiModelProperty(value = "入库备注") @@ -44,9 +46,10 @@ private Integer assetTypeId; @ApiModelProperty(value = "入库类型 0-正常入库") private Boolean storageType; private Integer storageType; @ApiModelProperty(value = "入库日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate storageTime; @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageAssetPropertyExtMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetPropertyExtMapper"> </mapper> ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageAssetVehicleExtMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetVehicleExtMapper"> </mapper> ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationStorageAssetVehicleExtService.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.OaApprovalApplicationStorageAssetMapper"> </mapper>