generator/src/test/java/com/xizang/CodeGeneratorTests.java
@@ -3,7 +3,12 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.InjectionConfig; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.FileOutConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.TemplateConfig; import com.baomidou.mybatisplus.generator.config.po.LikeTable; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationChangeController.java
@@ -1,8 +1,31 @@ package com.ruoyi.web.controller.api; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO; import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.OaApprovalApplicationChangeService; import com.ruoyi.system.vo.asset.OaApprovalApplicationChangeDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.validation.annotation.Validated; 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 javax.validation.Valid; /** * <p> @@ -12,9 +35,68 @@ * @author WuGuanFengYue * @since 2025-09-15 */ @Validated @RestController @Api(tags = {"OA审批-资产变更相关接口"}) @RequiredArgsConstructor(onConstructor_ = {@Lazy}) @RequestMapping("/oa-approval-application-change") public class OaApprovalApplicationChangeController { private final OaApprovalApplicationChangeService oaApprovalApplicationChangeService; private final ISysUserService sysUserService; @ApiOperation("提交资产变更申请") @PostMapping("/submit-change") @Log(title = "资产变更申请-提交", businessType = BusinessType.INSERT) public R<Void> submitChange(@Valid @RequestBody OaApprovalApplicationChangeDTO dto) { oaApprovalApplicationChangeService.submitChange(dto); return R.ok(); } @ApiOperation("获取资产变更申请分页列表") @PostMapping("/page-list") public R<IPage<OaApprovalApplicationChangePageVO>> getChangePageList(@RequestBody OaApprovalApplicationChangePageQuery pageQuery) { // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据 Long userId = SecurityUtils.getUserId(); boolean isAdmin = SecurityUtils.isAdmin(userId); if (!isAdmin) { try { // 获取当前用户的部门名称 String deptName = sysUserService.selectUserById(userId).getDept().getDeptName(); // 非超级管理员且非资产管理部,设置部门权限 if (!"资产管理部".equals(deptName)) { pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId())); } } catch (Exception e) { // 如果获取部门信息失败,默认设置部门权限 try { pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId())); } catch (Exception ex) { // ignore parse, leave null if cannot parse } } } IPage<OaApprovalApplicationChangePageVO> page = oaApprovalApplicationChangeService.getChangePageList(pageQuery); return R.ok(page); } @ApiOperation("获取资产变更申请详情") @GetMapping("/detail/{id}") public R<OaApprovalApplicationChangeDetailVO> getChangeDetail(@ApiParam(name = "id", value = "申请单ID", required = true) @PathVariable Integer id) { OaApprovalApplicationChangeDetailVO detail = oaApprovalApplicationChangeService.getChangeDetail(id); return R.ok(detail); } @ApiOperation("删除资产变更申请") @DeleteMapping("/{id}") public R<?> deleteByApplicationId(@ApiParam(name = "id", value = "申请单ID", required = true) @PathVariable Integer id) { oaApprovalApplicationChangeService.deleteByApplicationId(id); return R.ok(); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
@@ -5,11 +5,12 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO; import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO; import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery; import com.ruoyi.system.service.OaApprovalApplicationDisposeService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposeDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -17,6 +18,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.validation.annotation.Validated; 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; @@ -87,5 +89,12 @@ oaApprovalApplicationDisposeService.deleteByApplicationId(id); return R.ok(); } @ApiOperation("获取资产处置申请详情") @GetMapping("/detail/{id}") public R<OaApprovalApplicationDisposeDetailVO> getDisposeDetail(@ApiParam(name = "id", value = "申请单ID", required = true) @PathVariable Integer id) { OaApprovalApplicationDisposeDetailVO detail = oaApprovalApplicationDisposeService.getDisposeDetail(id); return R.ok(detail); } } ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationChangeDTO.java
New file @@ -0,0 +1,63 @@ package com.ruoyi.system.dto.asset; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.time.LocalDate; import java.util.List; /** * 资产变更申请DTO * @author mitao * @date 2025/9/29 */ @Data @ApiModel("资产变更申请DTO") public class OaApprovalApplicationChangeDTO { @ApiModelProperty("事项标题") @NotNull(message = "事项标题不能为空") private String title; @ApiModelProperty("资产类型ID") @NotNull(message = "资产类型不能为空") private Integer assetTypeId; @ApiModelProperty("变更日期") @NotNull(message = "变更日期不能为空") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate changeTime; @ApiModelProperty("变更备注") private String applicationReason; @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址") @NotNull(message = "使用/位置类型不能为空") private Integer addressType; @ApiModelProperty(value = "使用部门ID") private Integer useDeptId; @ApiModelProperty(value = "仓库ID") private Integer warehouseId; @ApiModelProperty(value = "所在位置") private String address; @ApiModelProperty(value = "管理部门ID") @NotNull(message = "管理部门不能为空") private Integer ownershipDeptId; @ApiModelProperty(value = "使用人") @NotBlank(message = "使用人不能为空") private String userName; @ApiModelProperty("资产列表") @NotEmpty(message = "资产列表不能为空") private List<Integer> assetMainIds; } ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationDisposeDTO.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/dto/dispose/OaApprovalApplicationDisposeDTO.java @@ -1,4 +1,4 @@ package com.ruoyi.system.dto.dispose; package com.ruoyi.system.dto.asset; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java
@@ -55,7 +55,7 @@ @ApiModelProperty(value = "数量") @NotNull(message = "数量不能为空") private BigDecimal quantity; private Integer quantity; @ApiModelProperty(value = "单价") @NotNull(message = "单价不能为空") ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java
@@ -55,7 +55,7 @@ @ApiModelProperty(value = "数量") @NotNull(message = "数量不能为空") private BigDecimal quantity; private Integer quantity; @ApiModelProperty(value = "单价") @NotNull(message = "单价不能为空") ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java
@@ -55,7 +55,7 @@ @ApiModelProperty(value = "数量") @NotNull(message = "数量不能为空") private BigDecimal quantity; private Integer quantity; @ApiModelProperty(value = "单价") @NotNull(message = "单价不能为空") ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationChangeMapper.java
@@ -1,7 +1,11 @@ package com.ruoyi.system.mapper; import com.ruoyi.system.model.OaApprovalApplicationChange; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ruoyi.system.model.OaApprovalApplicationChange; import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery; import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO; import org.apache.ibatis.annotations.Param; /** * <p> @@ -13,4 +17,12 @@ */ public interface OaApprovalApplicationChangeMapper extends BaseMapper<OaApprovalApplicationChange> { /** * 分页查询资产变更申请列表 * @param page 分页参数 * @param pageQuery 查询条件 * @return 分页结果 */ IPage<OaApprovalApplicationChangePageVO> selectChangePage(IPage<OaApprovalApplicationChangePageVO> page, @Param("query") OaApprovalApplicationChangePageQuery pageQuery); } ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java
@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.system.model.OaApprovalApplicationDispose; import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery; import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO; import org.apache.ibatis.annotations.Param; /** ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationChange.java
@@ -52,12 +52,16 @@ @TableField("ownership_dept_id") private Integer ownershipDeptId; @ApiModelProperty(value = "仓库ID,关联warehouse表") @TableField("warehouse_id") @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门ID") private Integer useDeptId; @ApiModelProperty(value = "仓库ID") private Integer warehouseId; @ApiModelProperty(value = "存放地点") @TableField("address") @ApiModelProperty(value = "所在位置") private String address; @ApiModelProperty(value = "使用人") ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationStorageAsset.java
@@ -64,7 +64,7 @@ private String measurementUnit; @ApiModelProperty(value = "数量") private BigDecimal quantity; private Integer quantity; @ApiModelProperty(value = "单价") private BigDecimal unitPrice; ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationAssetPageQuery.java
@@ -23,5 +23,8 @@ @ApiModelProperty("操作类型 前端不传") private Integer type; // 0-领用,1-借用,2-归还 @ApiModelProperty("是否查询归还提醒 前端不传") private Integer returnNotify = 0; } ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationChangePageQuery.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.system.query; import com.ruoyi.common.core.domain.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * 资产变更申请分页查询参数 */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "资产变更申请分页查询参数") public class OaApprovalApplicationChangePageQuery extends BasePage { private static final long serialVersionUID = 5275799518107306565L; @ApiModelProperty(value = "标题/单号") private String keyword; @ApiModelProperty(value = "部门ID") private Integer deptId; } ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
@@ -98,4 +98,6 @@ * @param applicationId */ void deleteByApplicationId(Integer applicationId); OaApprovalApplicationAsset getOaApprovalApplicationAssetByApplicationId(Integer applicationId); } ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationChangeService.java
@@ -1,7 +1,12 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO; import com.ruoyi.system.model.OaApprovalApplicationChange; import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery; import com.ruoyi.system.vo.asset.OaApprovalApplicationChangeDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO; /** * <p> @@ -13,4 +18,29 @@ */ public interface OaApprovalApplicationChangeService extends IService<OaApprovalApplicationChange> { /** * 提交变更申请 * @param dto 变更申请数据 */ void submitChange(OaApprovalApplicationChangeDTO dto); /** * 获取资产变更申请分页列表 * @param pageQuery 分页查询参数 * @return 分页结果 */ IPage<OaApprovalApplicationChangePageVO> getChangePageList(OaApprovalApplicationChangePageQuery pageQuery); /** * 获取资产变更申请详情 * @param id 申请单ID * @return 详情信息 */ OaApprovalApplicationChangeDetailVO getChangeDetail(Integer id); /** * 删除资产变更申请 * @param id */ void deleteByApplicationId(Integer id); } ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java
@@ -2,10 +2,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO; import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO; import com.ruoyi.system.model.OaApprovalApplicationDispose; import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery; import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposeDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO; /** * <p> @@ -35,4 +36,11 @@ * @param applicationId */ void deleteByApplicationId(Integer applicationId); /** * 获取处置申请详情 * @param id 申请单ID * @return 处置申请详情 */ OaApprovalApplicationDisposeDetailVO getDisposeDetail(Integer id); } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
@@ -41,11 +41,12 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -115,20 +116,45 @@ return; } List<AssetMain> assetMainList = new ArrayList<>(); Map<Integer, Integer> storageAssetIdToAssetMainIdMap = new HashMap<>(); Map<Integer, Integer> storageAssetIdToAssetTypeMap = new HashMap<>(); // 预查询当天已存在的资产编码数量 LocalDate currentDate = LocalDate.now(); Map<Integer, Long> assetTypeCountMap = new HashMap<>(); for (OaApprovalApplicationStorageAsset storageAsset : storageAssets) { Integer assetTypeId = storageAsset.getAssetTypeId(); Integer assetMainType = storageAsset.getAssetMainType(); BigDecimal quantity = storageAsset.getQuantity(); Integer quantity = storageAsset.getQuantity(); // 根据数量生成对应条数的资产记录 int assetCount = quantity != null ? quantity.intValue() : 1; int assetCount = quantity != null ? quantity : 1; // 获取该类型资产的编码前缀和当前数量 String typeCodePrefix = assetTypeService.getAssetCodePrefix(assetTypeId); String dateStr = currentDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); String prefix = typeCodePrefix + dateStr + "-"; // 获取当天该类型资产的当前数量(只查询一次) Long currentCount = assetTypeCountMap.computeIfAbsent(assetTypeId, k -> this.lambdaQuery() .like(AssetMain::getAssetCode, prefix) .ge(AssetMain::getCreateTime, currentDate.atStartOfDay()) .lt(AssetMain::getCreateTime, currentDate.plusDays(1).atStartOfDay()) .count() ); for (int i = 0; i < assetCount; i++) { // 创建资产主表记录 AssetMain assetMain = new AssetMain(); BeanUtil.copyProperties(storageAsset, assetMain); BeanUtil.copyProperties(storageAsset, assetMain, "id"); // 为每个资产生成编码 String assetCode = generateAssetCode(storageAsset.getAssetTypeId(), LocalDate.now()); // 生成资产编码,使用递增的序号 int sequence = (currentCount != null ? currentCount.intValue() : 0) + i + 1; String sequenceStr = String.format("%04d", sequence); String assetCode = prefix + sequenceStr; assetMain.setAssetCode(assetCode); // 单个资产的数量设为1 @@ -141,66 +167,102 @@ assetMain.setCreateBy(SecurityUtils.getUsername()); assetMain.setDisabled(false); // 保存资产主表 assetMainMapper.insert(assetMain); assetMainList.add(assetMain); // 2. 根据资产类型保存扩展信息 if (assetMainType != null) { if (assetMainType == 1) { // 房产资产 - 保存房产扩展信息 savePropertyExtension(storageAsset.getId(), assetMain.getId()); } else if (assetMainType == 2) { // 车辆资产 - 保存车辆扩展信息 saveVehicleExtension(storageAsset.getId(), assetMain.getId()); } // assetMainType == 0 为通用资产,无需保存扩展信息 } // 记录storageAssetId和资产类型的映射关系,用于后续创建扩展信息 storageAssetIdToAssetTypeMap.put(storageAsset.getId(), assetMainType); } // 更新计数器,确保下一个storageAsset的编码序号正确 if (currentCount != null) { assetTypeCountMap.put(assetTypeId, currentCount + assetCount); } } } /** * 保存房产资产扩展信息 */ private void savePropertyExtension(Integer storageAssetId, Integer assetMainId) { // 查询房产扩展信息 OaApprovalApplicationStorageAssetPropertyExt propertyExt = oaApprovalApplicationStorageAssetPropertyExtMapper .selectOne(new LambdaQueryWrapper<OaApprovalApplicationStorageAssetPropertyExt>() .eq(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, 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); // 批量保存资产主表 if (!assetMainList.isEmpty()) { this.saveBatch(assetMainList); assetPropertyExtMapper.insert(assetPropertyExt); // 建立storageAssetId到assetMainId的映射关系 int assetMainIndex = 0; for (OaApprovalApplicationStorageAsset storageAsset : storageAssets) { int quantity = storageAsset.getQuantity() != null ? storageAsset.getQuantity() : 1; for (int i = 0; i < quantity; i++) { if (assetMainIndex < assetMainList.size()) { storageAssetIdToAssetMainIdMap.put(storageAsset.getId(), assetMainList.get(assetMainIndex).getId()); assetMainIndex++; } } } // 准备并保存扩展信息 saveExtensionInfoBatch(storageAssetIdToAssetMainIdMap, storageAssetIdToAssetTypeMap); } } /** * 保存车辆资产扩展信息 * 批量保存扩展信息 */ private void saveVehicleExtension(Integer storageAssetId, Integer assetMainId) { // 查询车辆扩展信息 OaApprovalApplicationStorageAssetVehicleExt vehicleExt = oaApprovalApplicationStorageAssetVehicleExtMapper .selectOne(new QueryWrapper<OaApprovalApplicationStorageAssetVehicleExt>() .eq("storage_asset_id", storageAssetId)); private void saveExtensionInfoBatch(Map<Integer, Integer> storageAssetIdToAssetMainIdMap, Map<Integer, Integer> storageAssetIdToAssetTypeMap) { List<AssetPropertyExt> propertyExtList = new ArrayList<>(); List<AssetVehicleExt> vehicleExtList = new ArrayList<>(); 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); // 遍历所有需要扩展信息的storageAsset for (Map.Entry<Integer, Integer> entry : storageAssetIdToAssetMainIdMap.entrySet()) { Integer storageAssetId = entry.getKey(); Integer assetMainId = entry.getValue(); Integer assetMainType = storageAssetIdToAssetTypeMap.get(storageAssetId); assetVehicleExtMapper.insert(assetVehicleExt); if (assetMainType == null) { continue; } if (assetMainType == 1) { // 房产资产 - 查询并准备房产扩展信息 OaApprovalApplicationStorageAssetPropertyExt propertyExt = oaApprovalApplicationStorageAssetPropertyExtMapper .selectOne(new LambdaQueryWrapper<OaApprovalApplicationStorageAssetPropertyExt>() .eq(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, storageAssetId)); if (propertyExt != null) { AssetPropertyExt assetPropertyExt = new AssetPropertyExt(); BeanUtil.copyProperties(propertyExt, assetPropertyExt,"id"); assetPropertyExt.setAssetMainId(assetMainId); assetPropertyExt.setCreateTime(LocalDateTime.now()); assetPropertyExt.setCreateBy(SecurityUtils.getUsername()); assetPropertyExt.setDisabled(false); propertyExtList.add(assetPropertyExt); } } else if (assetMainType == 2) { // 车辆资产 - 查询并准备车辆扩展信息 OaApprovalApplicationStorageAssetVehicleExt vehicleExt = oaApprovalApplicationStorageAssetVehicleExtMapper .selectOne(new QueryWrapper<OaApprovalApplicationStorageAssetVehicleExt>() .eq("storage_asset_id", storageAssetId)); if (vehicleExt != null) { AssetVehicleExt assetVehicleExt = new AssetVehicleExt(); BeanUtil.copyProperties(vehicleExt, assetVehicleExt,"id"); assetVehicleExt.setAssetMainId(assetMainId); assetVehicleExt.setCreateTime(LocalDateTime.now()); assetVehicleExt.setCreateBy(SecurityUtils.getUsername()); assetVehicleExt.setDisabled(false); vehicleExtList.add(assetVehicleExt); } } // assetMainType == 0 为通用资产,无需保存扩展信息 } // 批量保存扩展信息 if (!propertyExtList.isEmpty()) { assetPropertyExtService.saveBatch(propertyExtList); } if (!vehicleExtList.isEmpty()) { assetVehicleExtService.saveBatch(vehicleExtList); } } @Override public List<AssetMainVO> getListByIds(List<Integer> assetMainIds) { if (!CollectionUtils.isEmpty(assetMainIds)) { ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
@@ -166,7 +166,7 @@ if (app == null) { throw new ServiceException("审批主记录不存在"); } OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one(); OaApprovalApplicationAsset detail = getOaApprovalApplicationAssetByApplicationId(app.getId()); if (detail == null) { throw new ServiceException("记录不存在"); } @@ -198,7 +198,7 @@ if (app == null) { throw new ServiceException("审批主记录不存在"); } OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one(); OaApprovalApplicationAsset detail = getOaApprovalApplicationAssetByApplicationId(app.getId()); if (detail == null) { throw new ServiceException("记录不存在"); } @@ -228,6 +228,7 @@ vo.setAssetTypeId(detail.getAssetTypeId()); vo.setOperateTime(detail.getOperateTime()); vo.setExpectReturnDate(detail.getExpectReturnDate()); vo.setReturnStatus(detail.getReturnStatus()); vo.setItems(assetMainVOS); return vo; } @@ -266,6 +267,7 @@ OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class); applications.setApplicationCode(generateApplicationCode("GH")); applications.setApprovalId(ApprovalTypeEnum.RETURN.getCode()); applications.setApplicationDate(LocalDate.now()); // 2. 获取流程首节点,设置当前节点,并保存 OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.RETURN.getCode()); @@ -308,11 +310,14 @@ @Override public IPage<OaApprovalApplicationAssetPageVO> getReturnNotifyPageList(OaApprovalApplicationAssetPageQuery pageQuery) { Page<OaApprovalApplicationAssetPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); pageQuery.setType(AssetOperateTypeEnum.RETURN.getCode()); pageQuery.setType(AssetOperateTypeEnum.BORROW.getCode()); pageQuery.setReturnNotify(1); IPage<OaApprovalApplicationAssetPageVO> pageByType = this.baseMapper.getPageByType(page, pageQuery); LocalDate toDay = LocalDate.now(); pageByType.getRecords().forEach(item->{ item.setDueDays(toDay.until(item.getExpectReturnDate()).getDays()); if (Objects.nonNull(item.getExpectReturnDate())) { item.setDueDays(toDay.until(item.getExpectReturnDate()).getDays()); } }); return pageByType; } @@ -323,11 +328,17 @@ if (app == null) { throw new ServiceException("审批主记录不存在"); } OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one(); OaApprovalApplicationAsset detail = getOaApprovalApplicationAssetByApplicationId(id); if (detail == null) { throw new ServiceException("记录不存在"); } oaApprovalApplicationsService.assembleApplicationDetail(app); //查询借用申请单 OaApprovalApplications borrowApprovalApplication = oaApprovalApplicationsService.getById(detail.getBorrowApplicationId()); OaApprovalApplicationAsset borrowApprovalApplicationAsset = null; if (Objects.nonNull(borrowApprovalApplication)) { borrowApprovalApplicationAsset = getOaApprovalApplicationAssetByApplicationId(borrowApprovalApplication.getId()); } List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery() .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId()) .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId) @@ -335,9 +346,12 @@ List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds); OaApprovalApplicationAssetDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationAssetDetailVO.class); vo.setTitle(detail.getTitle()); vo.setAssetTypeId(detail.getAssetTypeId()); vo.setOperateTime(detail.getOperateTime()); vo.setBorrowDate(Objects.nonNull(borrowApprovalApplicationAsset) ? borrowApprovalApplicationAsset.getOperateTime() : null); vo.setReturnStatus(detail.getReturnStatus()); vo.setItems(assetMainVOS); return vo; } @@ -348,4 +362,9 @@ oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId).remove(); oaApprovalApplicationsService.removeById(applicationId); } @Override public OaApprovalApplicationAsset getOaApprovalApplicationAssetByApplicationId(Integer applicationId) { return this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, applicationId).one(); } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
@@ -1,10 +1,40 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO; import com.ruoyi.system.emums.ApprovalStatusEnum; import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.mapper.OaApprovalApplicationChangeMapper; import com.ruoyi.system.model.OaApprovalApplicationAssetItem; import com.ruoyi.system.model.OaApprovalApplicationChange; import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowNode; import com.ruoyi.system.query.OaApprovalApplicationChangePageQuery; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.OaApprovalApplicationAssetItemService; import com.ruoyi.system.service.OaApprovalApplicationChangeService; import com.ruoyi.system.service.OaApprovalApplicationsService; import com.ruoyi.system.service.OaApprovalFlowNodeService; import com.ruoyi.system.service.OaApprovalTodoService; import com.ruoyi.system.vo.asset.AssetMainVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationChangeDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * <p> @@ -15,6 +45,136 @@ * @since 2025-09-15 */ @Service @RequiredArgsConstructor public class OaApprovalApplicationChangeServiceImpl extends ServiceImpl<OaApprovalApplicationChangeMapper, OaApprovalApplicationChange> implements OaApprovalApplicationChangeService { private final OaApprovalApplicationsService oaApprovalApplicationsService; private final OaApprovalFlowNodeService oaApprovalFlowNodeService; private final OaApprovalTodoService oaApprovalTodoService; private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService; private final AssetMainService assetMainService; @Override @Transactional(rollbackFor = Exception.class) public void submitChange(OaApprovalApplicationChangeDTO dto) { if (CollUtil.isEmpty(dto.getAssetMainIds())) { throw new ServiceException("资产ID列表不能为空"); } // 1. 构建并保存审批主表 OaApprovalApplications applications = buildOaApprovalApplications(dto); // 2. 获取流程首节点,设置当前节点,并保存 OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.ASSET_CHANGE.getCode()); applications.setCurrentFlowNodeId(firstFlowNode.getId()); oaApprovalApplicationsService.save(applications); // 3. 创建待办 oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getOwnershipDeptId()); // 4. 保存变更明细 OaApprovalApplicationChange detail = buildOaApprovalApplicationChange(dto, applications.getId()); this.save(detail); // 5. 保存关联的资产项 List<OaApprovalApplicationAssetItem> items = dto.getAssetMainIds().stream() .map(i -> { OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem(); item.setApprovalApplicationId(applications.getId()); item.setAssetMainId(i); return item; }) .collect(Collectors.toList()); oaApprovalApplicationAssetItemService.saveBatch(items); } private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationChangeDTO dto) { OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class); applications.setApplicationCode(generateApplicationCode("BG")); applications.setApprovalId(ApprovalTypeEnum.ASSET_CHANGE.getCode()); applications.setApplicationDate(LocalDate.now()); applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode()); return applications; } private OaApprovalApplicationChange buildOaApprovalApplicationChange(OaApprovalApplicationChangeDTO dto, Integer applicationId) { OaApprovalApplicationChange change = BeanUtil.copyProperties(dto, OaApprovalApplicationChange.class); change.setApprovalApplicationId(applicationId); return change; } private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) { List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery() .eq(OaApprovalFlowNode::getApprovalId, approvalId) .eq(OaApprovalFlowNode::getStatus, 1) .orderByAsc(OaApprovalFlowNode::getSortOrder) .list(); if (CollectionUtils.isEmpty(flowNodes)) { throw new ServiceException("未找到有效的审批流程配置"); } return flowNodes.get(0); } /** * 生成申请单号:BG + yyyyMMdd + 3位序号 */ private String generateApplicationCode(String prefix) { String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); prefix = prefix + dateStr; Long count = oaApprovalApplicationsService.lambdaQuery() .like(OaApprovalApplications::getApplicationCode, prefix) .count(); return prefix + String.format("%03d", count + 1); } @Override public IPage<OaApprovalApplicationChangePageVO> getChangePageList(OaApprovalApplicationChangePageQuery pageQuery) { Page<OaApprovalApplicationChangePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); return this.baseMapper.selectChangePage(page, pageQuery); } @Override public OaApprovalApplicationChangeDetailVO getChangeDetail(Integer id) { OaApprovalApplications app = oaApprovalApplicationsService.getById(id); if (app == null) { throw new ServiceException("审批主记录不存在"); } OaApprovalApplicationChange detail = this.lambdaQuery().eq(OaApprovalApplicationChange::getApprovalApplicationId, app.getId()).one(); if (detail == null) { throw new ServiceException("记录不存在"); } oaApprovalApplicationsService.assembleApplicationDetail(app); List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery() .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId()) .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId) .distinct().collect(Collectors.toList()); List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds); OaApprovalApplicationChangeDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationChangeDetailVO.class); vo.setTitle(detail.getTitle()); vo.setAssetTypeId(detail.getAssetTypeId()); vo.setAddressType(detail.getAddressType()); vo.setUseDeptId(detail.getUseDeptId()); vo.setWarehouseId(detail.getWarehouseId()); vo.setAddress(detail.getAddress()); vo.setOwnershipDeptId(detail.getOwnershipDeptId()); vo.setUserName(detail.getUserName()); vo.setItems(assetMainVOS); return vo; } @Transactional(rollbackFor = Exception.class) @Override public void deleteByApplicationId(Integer id) { OaApprovalApplications applications = oaApprovalApplicationsService.getById(id); if (Objects.isNull(applications)) { throw new ServiceException("申请记录不存在"); } if (!applications.getApprovalStatus().equals(ApprovalStatusEnum.REFUSED.getCode())) { throw new ServiceException("该申请不能删除"); } this.lambdaUpdate().eq(OaApprovalApplicationChange::getApprovalApplicationId, id).remove(); oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, id).remove(); oaApprovalApplicationsService.removeById(id); } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO; import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO; import com.ruoyi.system.emums.ApprovalStatusEnum; import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.mapper.OaApprovalApplicationDisposeMapper; @@ -15,12 +15,15 @@ import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowNode; import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.OaApprovalApplicationAssetItemService; import com.ruoyi.system.service.OaApprovalApplicationDisposeService; import com.ruoyi.system.service.OaApprovalApplicationsService; import com.ruoyi.system.service.OaApprovalFlowNodeService; import com.ruoyi.system.service.OaApprovalTodoService; import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO; import com.ruoyi.system.vo.asset.AssetMainVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposeDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,6 +31,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -47,6 +51,7 @@ private final OaApprovalFlowNodeService oaApprovalFlowNodeService; private final OaApprovalTodoService oaApprovalTodoService; private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService; private final AssetMainService assetMainService; @Override public IPage<OaApprovalApplicationDisposePageVO> getDisposePageList(OaApprovalApplicationDisposePageQuery pageQuery) { @@ -133,4 +138,31 @@ oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId).remove(); oaApprovalApplicationsService.removeById(applicationId); } @Override public OaApprovalApplicationDisposeDetailVO getDisposeDetail(Integer id) { OaApprovalApplications app = oaApprovalApplicationsService.getById(id); if (app == null) { throw new ServiceException("审批主记录不存在"); } OaApprovalApplicationDispose detail = this.lambdaQuery().eq(OaApprovalApplicationDispose::getApprovalApplicationId, app.getId()).one(); if (detail == null) { throw new ServiceException("记录不存在"); } oaApprovalApplicationsService.assembleApplicationDetail(app); List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery() .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId()) .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId) .distinct().collect(Collectors.toList()); List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds); OaApprovalApplicationDisposeDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationDisposeDetailVO.class); vo.setTitle(detail.getTitle()); vo.setAssetTypeId(detail.getAssetTypeId()); vo.setDisposeTime(detail.getDisposeTime()); vo.setDisposeType(detail.getDisposeType()); vo.setDisposeTotalAmount(detail.getDisposeTotalAmount()); vo.setItems(assetMainVOS); return vo; } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -38,6 +39,7 @@ import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -213,16 +215,9 @@ * 构建通用资产主表数据 */ 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.setAssetName(item.getAssetName()); assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); OaApprovalApplicationStorageAsset assetMain = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAsset.class); assetMain.setApprovalApplicationId(applicationId); assetMain.setAssetTypeId(assetTypeId); assetMain.setMeasurementUnit(item.getMeasurementUnit()); assetMain.setUnitPrice(item.getUnitPrice()); assetMain.setUsefulLife(item.getUsefulLife()); // 根据权属单位/部门名称填充ID if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) { TDept ownerDept = tDeptService.lambdaQuery() @@ -232,19 +227,9 @@ assetMain.setOwnershipDeptId(ownerDept.getId()); } } assetMain.setUserName(item.getUserName()); // 根据整单 addressType 写入使用部门ID或仓库ID 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()); assetMain.setAccountingStatus(item.getAccountingStatus()); assetMain.setAccountingDate(item.getAccountingDate()); assetMain.setAccountingVoucherNo(item.getAccountingVoucherNo()); assetMain.setAccountingSubject(item.getAccountingSubject()); assetMain.setAccountingAmount(item.getAccountingAmount()); assetMain.setDisabled(false); return assetMain; } @@ -252,16 +237,9 @@ * 构建房产资产主表数据 */ 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.setAssetName(item.getAssetName()); assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); OaApprovalApplicationStorageAsset assetMain = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAsset.class); assetMain.setApprovalApplicationId(applicationId); assetMain.setAssetTypeId(assetTypeId); assetMain.setMeasurementUnit(item.getMeasurementUnit()); assetMain.setUnitPrice(item.getUnitPrice()); assetMain.setUsefulLife(item.getUsefulLife()); if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) { TDept ownerDept = tDeptService.lambdaQuery() .eq(TDept::getDeptName, item.getOwnershipDeptName()) @@ -270,18 +248,8 @@ assetMain.setOwnershipDeptId(ownerDept.getId()); } } assetMain.setUserName(item.getUserName()); 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()); assetMain.setAccountingStatus(item.getAccountingStatus()); assetMain.setAccountingDate(item.getAccountingDate()); assetMain.setAccountingVoucherNo(item.getAccountingVoucherNo()); assetMain.setAccountingSubject(item.getAccountingSubject()); assetMain.setAccountingAmount(item.getAccountingAmount()); assetMain.setDisabled(false); return assetMain; } @@ -289,16 +257,9 @@ * 构建车辆资产主表数据 */ 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.setAssetName(item.getAssetName()); assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); OaApprovalApplicationStorageAsset assetMain = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAsset.class); assetMain.setApprovalApplicationId(applicationId); assetMain.setAssetTypeId(assetTypeId); assetMain.setMeasurementUnit(item.getMeasurementUnit()); assetMain.setUnitPrice(item.getUnitPrice()); assetMain.setUsefulLife(item.getUsefulLife()); if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) { TDept ownerDept = tDeptService.lambdaQuery() .eq(TDept::getDeptName, item.getOwnershipDeptName()) @@ -307,18 +268,8 @@ assetMain.setOwnershipDeptId(ownerDept.getId()); } } assetMain.setUserName(item.getUserName()); 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()); assetMain.setAccountingStatus(item.getAccountingStatus()); assetMain.setAccountingDate(item.getAccountingDate()); assetMain.setAccountingVoucherNo(item.getAccountingVoucherNo()); assetMain.setAccountingSubject(item.getAccountingSubject()); assetMain.setAccountingAmount(item.getAccountingAmount()); assetMain.setDisabled(false); return assetMain; } @@ -368,25 +319,8 @@ * 构建房产资产扩展数据 */ private OaApprovalApplicationStorageAssetPropertyExt buildAssetPropertyExt(OaApprovalApplicationStoragePropertyDTO.PropertyAssetItemDTO item, Integer assetMainId) { OaApprovalApplicationStorageAssetPropertyExt propertyExt = new OaApprovalApplicationStorageAssetPropertyExt(); OaApprovalApplicationStorageAssetPropertyExt propertyExt = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAssetPropertyExt.class); propertyExt.setStorageAssetId(assetMainId); propertyExt.setRegion(item.getRegion()); propertyExt.setDesignPurpose(item.getDesignPurpose()); propertyExt.setBuilding(item.getBuilding()); propertyExt.setRoomNumber(item.getRoomNumber()); propertyExt.setConstructionArea(item.getConstructionArea()); propertyExt.setStructureType(item.getStructureType()); propertyExt.setCertificateNumber(item.getCertificateNumber()); propertyExt.setCompletionDate(item.getCompletionDate()); propertyExt.setDetailedLocation(item.getDetailedLocation()); propertyExt.setProvincialPlatformValue(item.getProvincialPlatformValue()); propertyExt.setResettlementSituation(item.getResettlementSituation()); propertyExt.setMortgaged(item.getMortgaged()); propertyExt.setTenantName(item.getTenantName()); propertyExt.setRentalAmount(item.getRentalAmount()); propertyExt.setLeaseStartDate(item.getLeaseStartDate()); propertyExt.setLeaseEndDate(item.getLeaseEndDate()); propertyExt.setDisabled(false); return propertyExt; } @@ -394,17 +328,8 @@ * 构建车辆资产扩展数据 */ private OaApprovalApplicationStorageAssetVehicleExt buildAssetVehicleExt(OaApprovalApplicationStorageVehicleDTO.VehicleAssetItemDTO item, Integer assetMainId) { OaApprovalApplicationStorageAssetVehicleExt vehicleExt = new OaApprovalApplicationStorageAssetVehicleExt(); OaApprovalApplicationStorageAssetVehicleExt vehicleExt = BeanUtil.copyProperties(item, OaApprovalApplicationStorageAssetVehicleExt.class); vehicleExt.setStorageAssetId(assetMainId); vehicleExt.setLicensePlate(item.getLicensePlate()); vehicleExt.setVinCode(item.getVinCode()); vehicleExt.setEngineNumber(item.getEngineNumber()); vehicleExt.setDisplacement(item.getDisplacement()); vehicleExt.setStaffingSituation(item.getStaffingSituation()); vehicleExt.setOrigin(item.getOrigin()); vehicleExt.setAcquisitionDate(item.getAcquisitionDate()); vehicleExt.setPropertyRightForm(item.getPropertyRightForm()); vehicleExt.setDisabled(false); return vehicleExt; } @@ -431,39 +356,20 @@ */ private OaApprovalApplications buildOaApprovalApplications(Object dto) { OaApprovalApplications applications = new OaApprovalApplications(); applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode()); applications.setApplicationDate(LocalDate.now()); if (dto instanceof OaApprovalApplicationStorageGeneralDTO) { OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto; applications.setApplicantUserId(generalDTO.getApplicantUserId()); applications.setApplicantName(generalDTO.getApplicantName()); applications.setDeptId(generalDTO.getDeptId()); applications.setDeptName(generalDTO.getDeptName()); applications.setApplicationDate(LocalDate.now()); applications.setApplicationReason(generalDTO.getApplicationReason()); applications.setAttachmentUrl(generalDTO.getAttachmentUrl()); BeanUtils.copyProperties(generalDTO, applications); } else if (dto instanceof OaApprovalApplicationStoragePropertyDTO) { OaApprovalApplicationStoragePropertyDTO propertyDTO = (OaApprovalApplicationStoragePropertyDTO) dto; applications.setApplicantUserId(propertyDTO.getApplicantUserId()); applications.setApplicantName(propertyDTO.getApplicantName()); applications.setDeptId(propertyDTO.getDeptId()); applications.setDeptName(propertyDTO.getDeptName()); applications.setApplicationDate(LocalDate.now()); applications.setApplicationReason(propertyDTO.getApplicationReason()); applications.setAttachmentUrl(propertyDTO.getAttachmentUrl()); BeanUtils.copyProperties(propertyDTO, applications); } else if (dto instanceof OaApprovalApplicationStorageVehicleDTO) { OaApprovalApplicationStorageVehicleDTO vehicleDTO = (OaApprovalApplicationStorageVehicleDTO) dto; applications.setApplicantUserId(vehicleDTO.getApplicantUserId()); applications.setApplicantName(vehicleDTO.getApplicantName()); applications.setDeptId(vehicleDTO.getDeptId()); applications.setDeptName(vehicleDTO.getDeptName()); applications.setApplicationDate(LocalDate.now()); applications.setApplicationReason(vehicleDTO.getApplicationReason()); applications.setAttachmentUrl(vehicleDTO.getAttachmentUrl()); BeanUtils.copyProperties(vehicleDTO, applications); } applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode()); applications.setApplicationDate(LocalDate.now()); applications.setApplicationCode(generateApplicationCode()); applications.setDisabled(0); applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode()); return applications; } @@ -473,26 +379,17 @@ */ private OaApprovalApplicationStorage buildOaApprovalApplicationStorage(Object dto, Integer applicationId) { OaApprovalApplicationStorage storage = new OaApprovalApplicationStorage(); storage.setApprovalApplicationId(applicationId.intValue()); storage.setApprovalApplicationId(applicationId); if (dto instanceof OaApprovalApplicationStorageGeneralDTO) { OaApprovalApplicationStorageGeneralDTO generalDTO = (OaApprovalApplicationStorageGeneralDTO) dto; storage.setTitle(generalDTO.getTitle()); storage.setAssetTypeId(generalDTO.getAssetTypeId()); storage.setStorageType(generalDTO.getStorageType()); storage.setStorageTime(generalDTO.getStorageTime()); BeanUtils.copyProperties(generalDTO, storage); } else if (dto instanceof OaApprovalApplicationStoragePropertyDTO) { OaApprovalApplicationStoragePropertyDTO propertyDTO = (OaApprovalApplicationStoragePropertyDTO) dto; storage.setTitle(propertyDTO.getTitle()); storage.setAssetTypeId(propertyDTO.getAssetTypeId()); storage.setStorageType(propertyDTO.getStorageType()); storage.setStorageTime(propertyDTO.getStorageTime()); BeanUtils.copyProperties(propertyDTO, storage); } else if (dto instanceof OaApprovalApplicationStorageVehicleDTO) { OaApprovalApplicationStorageVehicleDTO vehicleDTO = (OaApprovalApplicationStorageVehicleDTO) dto; storage.setTitle(vehicleDTO.getTitle()); storage.setAssetTypeId(vehicleDTO.getAssetTypeId()); storage.setStorageType(vehicleDTO.getStorageType()); storage.setStorageTime(vehicleDTO.getStorageTime()); BeanUtils.copyProperties(vehicleDTO, storage); } return storage; @@ -791,6 +688,24 @@ public void removeByApplicationId(Integer id) { //删除入库申请相关数据 this.lambdaUpdate().eq(OaApprovalApplicationStorage::getApprovalApplicationId, id).remove(); List<OaApprovalApplicationStorageAsset> list = oaApprovalApplicationStorageAssetService.lambdaQuery() .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, id).list(); List<Integer> storageAssetIds = list.stream().map(OaApprovalApplicationStorageAsset::getId).collect(Collectors.toList()); if (CollUtil.isNotEmpty(storageAssetIds)) { //删除资产申请扩展表数据 OaApprovalApplicationStorageAsset oaApprovalApplicationStorageAsset = list.get(0); if (oaApprovalApplicationStorageAsset.getAssetMainType().equals(AssetTypeEnum.HOUSE.getCode())) { oaApprovalApplicationStorageAssetPropertyExtService.lambdaUpdate() .in(OaApprovalApplicationStorageAssetPropertyExt::getStorageAssetId, storageAssetIds).remove(); }else if (oaApprovalApplicationStorageAsset.getAssetMainType().equals(AssetTypeEnum.VEHICLE.getCode())) { oaApprovalApplicationStorageAssetVehicleExtService.lambdaUpdate() .in(OaApprovalApplicationStorageAssetVehicleExt::getStorageAssetId, storageAssetIds).remove(); } } //删除资产申请主表数据 oaApprovalApplicationStorageAssetService.lambdaUpdate() .eq(OaApprovalApplicationStorageAsset::getApprovalApplicationId, id).remove(); //删除入库申请单 oaApprovalApplicationsService.removeById(id); } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java
@@ -73,6 +73,13 @@ @ApiModelProperty(value = "借用审批ID,类型为归还时使用。") private Integer borrowApplicationId; @ApiModelProperty(value = "归还状态 0-待归还,1-部分归还,2-全部归还") private Integer returnStatus; @ApiModelProperty(value = "借用日期") @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private LocalDate borrowDate; @ApiModelProperty("关联资产项列表") private List<AssetMainVO> items; } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationChangeDetailVO.java
New file @@ -0,0 +1,86 @@ 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; import java.io.Serializable; import java.time.LocalDate; import java.util.List; /** * 资产领用/借用/归还 详情VO */ @Data @ApiModel("资产变更详情VO") public class OaApprovalApplicationChangeDetailVO implements Serializable { private static final long serialVersionUID = -7331732809498749263L; @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "申请单号") private String applicationCode; @ApiModelProperty(value = "审批ID") private Integer approvalId; @ApiModelProperty(value = "申请人ID") private Integer applicantUserId; @ApiModelProperty(value = "申请人") private String applicantName; @ApiModelProperty(value = "所属部门") private String deptName; @ApiModelProperty(value = "部门ID") private Integer deptId; @ApiModelProperty(value = "变更日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate applicationDate; @ApiModelProperty(value = "事由/原因/说明/备注") private String applicationReason; @ApiModelProperty(value = "审批状态 0-草稿,1-待审批,2-审批通过,3-审批拒绝 ,4-已撤回") private Integer approvalStatus; @ApiModelProperty(value = "当前流程id") private Integer currentFlowNodeId; @ApiModelProperty(value = "事项标题") private String title; @ApiModelProperty(value = "资产类型") private Integer assetTypeId; @ApiModelProperty(value = "变更日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate changeTime; @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门ID") private Integer useDeptId; @ApiModelProperty(value = "仓库ID") private Integer warehouseId; @ApiModelProperty(value = "所在位置") private String address; @ApiModelProperty(value = "管理部门ID") private Integer ownershipDeptId; @ApiModelProperty(value = "使用人") private String userName; @ApiModelProperty("关联资产项列表") private List<AssetMainVO> items; } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationChangePageVO.java
New file @@ -0,0 +1,47 @@ 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; import java.io.Serializable; import java.time.LocalDate; /** * 资产变更申请分页列表VO */ @Data @ApiModel(value = "资产变更申请分页列表VO") public class OaApprovalApplicationChangePageVO implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "审批申请ID") private Integer id; @ApiModelProperty(value = "单据号") private String applicationCode; @ApiModelProperty(value = "标题") private String title; @ApiModelProperty(value = "变更部门/公司") private String deptName; @ApiModelProperty(value = "申请人") private String applicantName; @ApiModelProperty(value = "申请原因") private String applicationReason; @ApiModelProperty(value = "申请日期") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDate applicationDate; @ApiModelProperty(value = "审核状态 0-待审核,1-审核中,2-已通过,3-已拒绝") private Integer approvalStatus; @ApiModelProperty(value = "审核状态名称") private String approvalStatusName; } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationDisposeDetailVO.java
New file @@ -0,0 +1,79 @@ 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; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; /** * 资产领用/借用/归还 详情VO */ @Data @ApiModel("资产处置详情VO") public class OaApprovalApplicationDisposeDetailVO implements Serializable { private static final long serialVersionUID = -7331732809498749263L; @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "申请单号") private String applicationCode; @ApiModelProperty(value = "审批ID") private Integer approvalId; @ApiModelProperty(value = "申请人ID") private Integer applicantUserId; @ApiModelProperty(value = "申请人") private String applicantName; @ApiModelProperty(value = "所属部门") private String deptName; @ApiModelProperty(value = "部门ID") private Integer deptId; @ApiModelProperty(value = "申请日期") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate applicationDate; @ApiModelProperty(value = "事由/原因/说明/备注") private String applicationReason; @ApiModelProperty(value = "审批状态 0-草稿,1-待审批,2-审批通过,3-审批拒绝 ,4-已撤回") private Integer approvalStatus; @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接") private String attachmentUrl; @ApiModelProperty(value = "当前流程id") private Integer currentFlowNodeId; @ApiModelProperty(value = "事项标题") private String title; @ApiModelProperty(value = "资产类型") private Integer assetTypeId; @ApiModelProperty("处置日期") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate disposeTime; @ApiModelProperty("处置方式 0-报废,1-报损,2-捐赠") private Integer disposeType; @ApiModelProperty("处置总金额(元)") private BigDecimal disposeTotalAmount; @ApiModelProperty("关联资产项列表") private List<AssetMainVO> items; } ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationDisposePageVO.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/vo/dispose/OaApprovalApplicationDisposePageVO.java @@ -1,4 +1,4 @@ package com.ruoyi.system.vo.dispose; package com.ruoyi.system.vo.asset; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java
@@ -81,7 +81,7 @@ private String measurementUnit; @ApiModelProperty(value = "数量") private BigDecimal quantity; private Integer quantity; @ApiModelProperty(value = "单价") private BigDecimal unitPrice; ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java
@@ -80,7 +80,7 @@ private String measurementUnit; @ApiModelProperty(value = "数量") private BigDecimal quantity; private Integer quantity; @ApiModelProperty(value = "单价") private BigDecimal unitPrice; ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java
@@ -80,7 +80,7 @@ private String measurementUnit; @ApiModelProperty(value = "数量") private BigDecimal quantity; private Integer quantity; @ApiModelProperty(value = "单价") private BigDecimal unitPrice; ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml
@@ -42,6 +42,9 @@ <where> AND aaa.disabled = 0 AND oaa.type = #{query.type} <if test="query.returnNotify == 1"> AND oaa.return_status != 2 </if> <if test="query != null and query.keyword != null and query.keyword != ''"> AND ( oaa.title LIKE CONCAT('%', #{query.keyword}, '%') @@ -71,7 +74,7 @@ LEFT JOIN oa_approval_application_asset oaaa ON oaaai.approval_application_id = oaaa.approval_application_id LEFT JOIN oa_approval_applications oaa ON oaaai.approval_application_id = oaa.id <where> oaaa.type = 2 AND oaaa.borrow_application_id = #{applicationId} oaaa.type = 2 AND oaaa.borrow_application_id = #{applicationId} AND oaa.approval_status = 1 <if test="assetMainIds != null and assetMainIds.size() > 0"> AND oaaai.asset_main_id IN <foreach collection="assetMainIds" item="id" open="(" separator="," close=")"> @@ -86,14 +89,20 @@ parameterType="java.lang.Long"> SELECT oaa.*, oaaa.title, oaaa.asset_type_id, oaaa.operate_time FROM oa_approval_applications oaa LEFT JOIN oa_approval_application_asset oaaa ON oaa.id = oaaa.approval_application_id LEFT JOIN oa_approval_application_asset borrow_oaaa ON borrow_oaaa.borrow_application_id = oaa.id AND borrow_oaaa.return_status != 2 WHERE oaa.applicant_user_id = #{userId} AND oaa.approval_status = 1 AND oaa.approval_status = '${@com.ruoyi.system.emums.ApprovalStatusEnum@PASSED.getCode()}' AND oaaa.type = 1 AND oaa.approval_id = '${@com.ruoyi.system.emums.ApprovalTypeEnum@BORROW.getCode()}' </select> </mapper> ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationChangeMapper.xml
@@ -20,4 +20,38 @@ id, approval_application_id, title, asset_type_id, change_time, ownership_dept_id, warehouse_id, address, user_name </sql> <!-- 分页查询资产变更申请列表 --> <select id="selectChangePage" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationChangePageVO"> SELECT app.id, app.application_code AS applicationCode, change.title, d.dept_name AS deptName, u.nick_name AS applicantName, app.application_reason AS applicationReason, app.application_date AS applicationDate, app.approval_status AS approvalStatus, CASE app.approval_status WHEN 0 THEN '待审核' WHEN 1 THEN '审核中' WHEN 2 THEN '已通过' WHEN 3 THEN '已拒绝' ELSE '未知' END AS approvalStatusName FROM oa_approval_applications app INNER JOIN oa_approval_application_change change ON app.id = change.approval_application_id LEFT JOIN sys_user u ON app.applicant_user_id = u.user_id LEFT JOIN t_dept d ON app.dept_id = d.id WHERE app.disabled = 0 AND app.approval_id = 4 <!-- 资产变更审批类型 --> <if test="query.keyword != null and query.keyword != ''"> AND (change.title LIKE CONCAT('%', #{query.keyword}, '%') OR app.application_code LIKE CONCAT('%', #{query.keyword}, '%')) </if> <if test="query.deptId != null"> AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.parent_id)) </if> ORDER BY app.create_time DESC </select> </mapper> ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml
@@ -19,7 +19,7 @@ </sql> <!-- 分页查询资产处置申请列表 --> <select id="getDisposePageList" resultType="com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO"> <select id="getDisposePageList" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationDisposePageVO"> SELECT app.id, app.application_code AS applicationCode, @@ -60,7 +60,7 @@ OR app.application_code LIKE CONCAT('%', #{query.keyword}, '%')) </if> <if test="query.deptId != null"> AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.ancestors)) AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.parent_id)) </if> ORDER BY app.create_time DESC </select>