From b84fc1807a6ce71f4d10cdb10da186abc5dcc173 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 19 九月 2025 19:37:21 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java | 143 +++++ ruoyi-admin/src/main/resources/application-test.yml | 11 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java | 5 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml | 8 ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java | 9 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java | 361 +++++++++++- ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml | 36 + pom.xml | 7 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java | 12 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java | 23 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java | 21 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java | 47 + ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java | 10 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetGeneralExt.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationAssetPageQuery.java | 24 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java | 48 - ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java | 28 + ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java | 9 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java | 63 ++ ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java | 78 ++ ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java | 170 ++++++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java | 32 + ruoyi-system/src/main/java/com/ruoyi/system/model/AssetPropertyExt.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java | 15 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java | 61 ++ ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java | 4 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FileUploadController.java | 43 + ruoyi-common/pom.xml | 5 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java | 119 ++++ ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java | 5 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java | 118 ++++ ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java | 59 ++ ruoyi-admin/src/main/resources/application-prod.yml | 9 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java | 33 + ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java | 3 ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java | 7 39 files changed, 1,525 insertions(+), 115 deletions(-) diff --git a/pom.xml b/pom.xml index 0e23835..f9a01cd 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,7 @@ <poi.version>4.1.2</poi.version> <velocity.version>2.3</velocity.version> <jwt.version>0.9.1</jwt.version> + <aliyun-oss.version>3.17.4</aliyun-oss.version> </properties> <!-- 依赖声明 --> @@ -156,6 +157,12 @@ <version>${ruoyi.version}</version> </dependency> + <!--阿里云oss--> + <dependency> + <groupId>com.aliyun.oss</groupId> + <artifactId>aliyun-sdk-oss</artifactId> + <version>${aliyun-oss.version}</version> + </dependency> </dependencies> </dependencyManagement> diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java index b5d1163..7540da5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java @@ -1,16 +1,23 @@ 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.OaApprovalApplicationAssetReceiveDTO; +import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery; import com.ruoyi.system.service.OaApprovalApplicationAssetService; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO; 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.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -38,5 +45,29 @@ oaApprovalApplicationAssetService.submitReceive(dto); return R.ok(); } -} + @ApiOperation("获取资产领用申请分页列表") + @PostMapping("/page-list") + public R<IPage<OaApprovalApplicationAssetPageVO>> getReceivePageList(@RequestBody OaApprovalApplicationAssetPageQuery pageQuery) { + // 数据权限:非管理员仅能查看本部门 + Long userId = SecurityUtils.getUserId(); + boolean isAdmin = SecurityUtils.isAdmin(userId); + if (!isAdmin) { + try { + pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getDeptId())); + } catch (Exception e) { + // ignore parse, leave null if cannot parse + } + } + IPage<OaApprovalApplicationAssetPageVO> page = oaApprovalApplicationAssetService.getReceivePageList(pageQuery); + return R.ok(page); + } + + @ApiOperation("获取资产领用详情") + @GetMapping("/detail/receive/{id}") + public R<OaApprovalApplicationAssetDetailVO> getReceiveDetail(@PathVariable Integer id) { + OaApprovalApplicationAssetDetailVO detail = oaApprovalApplicationAssetService.getDetail(id); + return R.ok(detail); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java index 1c64940..92e6aad 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationStorageController.java @@ -17,14 +17,20 @@ import com.ruoyi.system.service.OaApprovalApplicationStorageService; import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; import javax.validation.Valid; @@ -52,6 +58,16 @@ @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())) { + throw new ServiceException("权属单位/部门名称不能为空"); + } + TDept owner = deptService.lambdaQuery().eq(TDept::getDeptName, item.getOwnershipDeptName()).one(); + if (owner == null) { + throw new ServiceException("权属单位/部门不存在: " + item.getOwnershipDeptName()); + } + } oaApprovalApplicationStorageService.submitGeneralAssetStorage(dto); return R.ok(); } @@ -61,6 +77,15 @@ @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("权属单位/部门名称不能为空"); + } + TDept owner = deptService.lambdaQuery().eq(TDept::getDeptName, item.getOwnershipDeptName()).one(); + if (owner == null) { + throw new ServiceException("权属单位/部门不存在: " + item.getOwnershipDeptName()); + } + } oaApprovalApplicationStorageService.submitPropertyAssetStorage(dto); return R.ok(); } @@ -70,6 +95,15 @@ @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("权属单位/部门名称不能为空"); + } + TDept owner = deptService.lambdaQuery().eq(TDept::getDeptName, item.getOwnershipDeptName()).one(); + if (owner == null) { + throw new ServiceException("权属单位/部门不存在: " + item.getOwnershipDeptName()); + } + } oaApprovalApplicationStorageService.submitVehicleAssetStorage(dto); return R.ok(); } @@ -81,6 +115,35 @@ return R.ok(page); } + @ApiOperation("删除资产入库申请") + @DeleteMapping("/{id}") + @Log(title = "资产入库申请-删除", businessType = BusinessType.DELETE) + public R<Void> delete(@PathVariable Integer id) { + oaApprovalApplicationStorageService.removeById(id); + return R.ok(); + } + + @ApiOperation("获取通用资产入库申请详情") + @GetMapping("/detail/general/{id}") + public R<OaApprovalApplicationStorageGeneralDetailVO> getGeneralDetail(@PathVariable Integer id) { + OaApprovalApplicationStorageGeneralDetailVO detail = oaApprovalApplicationStorageService.getGeneralDetail(id); + return R.ok(detail); + } + + @ApiOperation("获取房产资产入库申请详情") + @GetMapping("/detail/property/{id}") + public R<OaApprovalApplicationStoragePropertyDetailVO> getPropertyDetail(@PathVariable Integer id) { + OaApprovalApplicationStoragePropertyDetailVO detail = oaApprovalApplicationStorageService.getPropertyDetail(id); + return R.ok(detail); + } + + @ApiOperation("获取车辆资产入库申请详情") + @GetMapping("/detail/vehicle/{id}") + public R<OaApprovalApplicationStorageVehicleDetailVO> getVehicleDetail(@PathVariable Integer id) { + OaApprovalApplicationStorageVehicleDetailVO detail = oaApprovalApplicationStorageService.getVehicleDetail(id); + return R.ok(detail); + } + /** * 校验位置类型与相关名称/地址 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java index 78be207..29b8690 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationsController.java @@ -6,21 +6,54 @@ import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.TDept; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.framework.web.service.TokenService; -import com.ruoyi.system.dto.*; -import com.ruoyi.system.emums.ApprovalFlowNodeEnum; +import com.ruoyi.system.dto.AddAdvertisementDTO; +import com.ruoyi.system.dto.AddBusinessTripDTO; +import com.ruoyi.system.dto.AddContactDTO; +import com.ruoyi.system.dto.AddContractDTO; +import com.ruoyi.system.dto.AddLeaveDTO; +import com.ruoyi.system.dto.AddLeaveDestroyDTO; +import com.ruoyi.system.dto.AddMoneyDTO; +import com.ruoyi.system.dto.AddOutDTO; +import com.ruoyi.system.dto.AddPaymentDTO; +import com.ruoyi.system.dto.AddReimbursementDTO; +import com.ruoyi.system.emums.ApprovalStatusEnum; import com.ruoyi.system.emums.ApprovalTypeEnum; -import com.ruoyi.system.model.*; -import com.ruoyi.system.service.*; +import com.ruoyi.system.model.OaApprovalApplicationAdvertisement; +import com.ruoyi.system.model.OaApprovalApplicationAttendance; +import com.ruoyi.system.model.OaApprovalApplicationContact; +import com.ruoyi.system.model.OaApprovalApplicationContract; +import com.ruoyi.system.model.OaApprovalApplicationMoney; +import com.ruoyi.system.model.OaApprovalApplicationPayment; +import com.ruoyi.system.model.OaApprovalApplicationReimbursement; +import com.ruoyi.system.model.OaApprovalApplicationReimbursementItem; +import com.ruoyi.system.model.OaApprovalApplications; +import com.ruoyi.system.model.OaApprovalFlowNode; +import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.system.service.OaApprovalApplicationAdvertisementService; +import com.ruoyi.system.service.OaApprovalApplicationAttendanceService; +import com.ruoyi.system.service.OaApprovalApplicationContactService; +import com.ruoyi.system.service.OaApprovalApplicationContractService; +import com.ruoyi.system.service.OaApprovalApplicationMoneyService; +import com.ruoyi.system.service.OaApprovalApplicationPaymentService; +import com.ruoyi.system.service.OaApprovalApplicationReimbursementItemService; +import com.ruoyi.system.service.OaApprovalApplicationReimbursementService; +import com.ruoyi.system.service.OaApprovalApplicationsService; +import com.ruoyi.system.service.OaApprovalFlowNodeService; +import com.ruoyi.system.service.OaApprovalService; +import com.ruoyi.system.service.OaApprovalTodoService; +import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.utils.UUIDUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import oshi.driver.mac.net.NetStat; import javax.annotation.Resource; import java.math.BigDecimal; @@ -561,5 +594,23 @@ Integer.valueOf(sysUser.getDeptId())); return R.ok(); } + + @Log(title = "审批-撤回通用审批单", businessType = BusinessType.UPDATE) + @ApiOperation(value = "撤回审批单(通用接口)") + @PutMapping(value = "/withdraw/{id}") + public R<?> withdraw(@PathVariable Integer id) { + OaApprovalApplications current = approvalApplicationsService.getById(id); + if (current == null) { + throw new ServiceException("审批单不存在"); + } + if (!ApprovalStatusEnum.PENDING.getCode().equals(current.getApprovalStatus())) { + throw new ServiceException("仅待审批状态可撤回"); + } + OaApprovalApplications update = new OaApprovalApplications(); + update.setId(id); + update.setApprovalStatus(ApprovalStatusEnum.CANCELED.getCode()); + approvalApplicationsService.updateById(update); + return R.ok(); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FileUploadController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FileUploadController.java new file mode 100644 index 0000000..2df854a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/FileUploadController.java @@ -0,0 +1,43 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.service.OssService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * @author mitao + * @date 2025/9/19 + */ +@Api(tags = {"文件上传接口"}) +@RestController +@RequestMapping("/file-upload/") +public class FileUploadController { + @Autowired + private OssService ossService; + /** + * 上传文件 + * + * @param file + * @return + */ + @ApiOperation(value = "OSS文件上传") + @PostMapping("/upload-oss") + public R<String> upload(@RequestPart("file") MultipartFile file) { + String fileUrl; + try { + fileUrl = ossService.uploadFile(file); + } catch (IOException e) { + throw new RuntimeException(e); + } + return R.ok(fileUrl); + } +} diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 1da9602..8576c1d 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -220,3 +220,12 @@ bucketAddr: rootSrc: location: /clean + +# 阿里云对象存储 +oss: + accessKeyId: LTAI5tNW8B4CYP1WK7yS3bfW + accessKeySecret: 9RrPDLd7wh4VGCjXxD8ULIdKiuY5Ly + upload-endpoint: https://oss-cn-chengdu.aliyuncs.com + download-endpoint: https://zhpt-oss.oss-cn-chengdu.aliyuncs.com + bucketName: zhpt + folder: shehongchengtou diff --git a/ruoyi-admin/src/main/resources/application-test.yml b/ruoyi-admin/src/main/resources/application-test.yml index b03fdda..a0ed1ba 100644 --- a/ruoyi-admin/src/main/resources/application-test.yml +++ b/ruoyi-admin/src/main/resources/application-test.yml @@ -65,7 +65,7 @@ devtools: restart: # 热部署开关 - enabled: true + enabled: false # redis 配置 redis: # 地址 @@ -221,6 +221,15 @@ bucketAddr: rootSrc: location: /clean + +# 阿里云对象存储 +oss: + accessKeyId: LTAI5tNW8B4CYP1WK7yS3bfW + accessKeySecret: 9RrPDLd7wh4VGCjXxD8ULIdKiuY5Ly + upload-endpoint: https://oss-cn-chengdu.aliyuncs.com + download-endpoint: https://zhpt-oss.oss-cn-chengdu.aliyuncs.com + bucketName: zhpt + folder: shehongchengtou sms: enable: true appId: 1400957506 diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 99ab005..acb0c99 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -210,6 +210,11 @@ <artifactId>javax.mail</artifactId> <version>1.6.2</version> <!-- 请检查是否有更新的版本 --> </dependency> + <!--阿里云oss--> + <dependency> + <groupId>com.aliyun.oss</groupId> + <artifactId>aliyun-sdk-oss</artifactId> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java new file mode 100644 index 0000000..0e42529 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.config; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * 存储-配置 + * + * @author mitao + */ +@ConfigurationProperties(prefix = "oss") +@Component +@Slf4j +@Data +public class OssConfig { + + private String folder = "dev"; + + private String accessKeyId; + + private String accessKeySecret; + + private String uploadEndpoint; + + private String downloadEndpoint; + + private String bucketName; + + public static String FOLDER; + public static String ACCESS_KEY_ID; + public static String ACCESS_KEY_SECRET; + public static String UPLOAD_ENDPOINT; + public static String DOWNLOAD_ENDPOINT; + public static String BUCKET_NAME; + + + @PostConstruct + public void init() { + + log.debug("OSS配置信息:" + JSONObject.toJSONString(this)); + FOLDER = folder; + ACCESS_KEY_ID = accessKeyId; + ACCESS_KEY_SECRET = accessKeySecret; + UPLOAD_ENDPOINT = uploadEndpoint; + DOWNLOAD_ENDPOINT = downloadEndpoint; + BUCKET_NAME = bucketName; + } + + public String getStoreFolder() { + + return getFolder(); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java index c02d68a..132ef6d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java @@ -5,10 +5,13 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import java.awt.*; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java index 8ecc57e..c151a49 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationAssetReceiveDTO.java @@ -3,6 +3,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -48,6 +49,7 @@ @ApiModelProperty("领用日期") @NotNull(message = "领用日期不能为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate operateTime; @ApiModelProperty("资产类型ID") @@ -55,6 +57,7 @@ private Integer assetTypeId; @ApiModelProperty("预计退还日期,可为空") + @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate expectReturnDate; @ApiModelProperty("领用资产列表") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java index 5a5c334..7659043 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationPurchaseDTO.java @@ -23,10 +23,6 @@ @ApiModel(value = "OaApprovalApplicationPurchaseDTO", description = "采购申请DTO") public class OaApprovalApplicationPurchaseDTO { - @ApiModelProperty(value = "审批ID") - @NotNull(message = "审批ID不能为空") - private Integer approvalId; - @ApiModelProperty(value = "申请部门ID") @NotNull(message = "申请部门不能为空") private Integer deptId; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java index 56155a6..9daa4d7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageDTO.java @@ -36,11 +36,6 @@ @NotBlank(message = "申请人姓名不能为空") private String applicantName; - @ApiModelProperty(value = "申请日期") - @NotNull(message = "申请日期不能为空") - @DateTimeFormat(pattern = "yyyy-MM-dd") - private LocalDate applicationDate; - @ApiModelProperty(value = "入库备注") @Size(max = 500, message = "入库备注不能超过500字符") private String applicationReason; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java index 63d5584..7e64a27 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageGeneralDTO.java @@ -42,6 +42,10 @@ @NotBlank(message = "资产名称不能为空") private String assetName; + @ApiModelProperty(value = "类别") + @NotBlank(message = "类别不能为空") + private String category; + @ApiModelProperty(value = "规格型号") private String specificationModel; @@ -60,13 +64,16 @@ @ApiModelProperty(value = "使用年限(年)") private Integer usefulLife; - @ApiModelProperty(value = "权属单位/部门ID") - private Integer ownershipDeptId; + @ApiModelProperty(value = "总金额") + private BigDecimal totalValue; + + @ApiModelProperty(value = "权属单位/部门名称") + private String ownershipDeptName; @ApiModelProperty(value = "使用人") private String userName; - @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门/位置名称") @@ -99,40 +106,5 @@ @ApiModelProperty(value = "入账金额") private BigDecimal accountingAmount; - - // 通用资产扩展表字段 - @ApiModelProperty(value = "供应商名称") - private String supplierName; - - @ApiModelProperty(value = "采购日期") - @DateTimeFormat(pattern = "yyyy-MM-dd") - private LocalDate purchaseDate; - - @ApiModelProperty(value = "保修期(月)") - private Integer warrantyPeriod; - - @ApiModelProperty(value = "保修到期日期") - @DateTimeFormat(pattern = "yyyy-MM-dd") - private LocalDate warrantyExpireDate; - - @ApiModelProperty(value = "折旧方法") - private String depreciationMethod; - - @ApiModelProperty(value = "折旧率") - private BigDecimal depreciationRate; - - @ApiModelProperty(value = "净值") - private BigDecimal netValue; - - @ApiModelProperty(value = "维护周期(月)") - private Integer maintenanceCycle; - - @ApiModelProperty(value = "上次维护日期") - @DateTimeFormat(pattern = "yyyy-MM-dd") - private LocalDate lastMaintenanceDate; - - @ApiModelProperty(value = "下次维护日期") - @DateTimeFormat(pattern = "yyyy-MM-dd") - private LocalDate nextMaintenanceDate; } } \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java index d74064c..f38430e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStoragePropertyDTO.java @@ -42,6 +42,10 @@ @NotBlank(message = "资产名称不能为空") private String assetName; + @ApiModelProperty(value = "类别") + @NotBlank(message = "类别不能为空") + private String category; + @ApiModelProperty(value = "规格型号") private String specificationModel; @@ -60,13 +64,13 @@ @ApiModelProperty(value = "使用年限(年)") private Integer usefulLife; - @ApiModelProperty(value = "权属单位/部门ID") - private Integer ownershipDeptId; + @ApiModelProperty(value = "权属单位/部门名称") + private String ownershipDeptName; @ApiModelProperty(value = "使用人") private String userName; - @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门/位置名称") @@ -136,7 +140,7 @@ private String resettlementSituation; @ApiModelProperty(value = "是否抵押:0-否,1-是") - private Boolean isMortgaged; + private Integer mortgaged; @ApiModelProperty(value = "承租方") private String tenantName; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java index ec0146a..73e8116 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/OaApprovalApplicationStorageVehicleDTO.java @@ -42,6 +42,10 @@ @NotBlank(message = "资产名称不能为空") private String assetName; + @ApiModelProperty(value = "类别") + @NotBlank(message = "类别不能为空") + private String category; + @ApiModelProperty(value = "规格型号") private String specificationModel; @@ -60,13 +64,13 @@ @ApiModelProperty(value = "使用年限(年)") private Integer usefulLife; - @ApiModelProperty(value = "权属单位/部门ID") - private Integer ownershipDeptId; + @ApiModelProperty(value = "权属单位/部门名称") + private String ownershipDeptName; @ApiModelProperty(value = "使用人") private String userName; - @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + @ApiModelProperty(value = "使用/位置类型 0-部门,1-仓库,2-录入地址") private Integer addressType; @ApiModelProperty(value = "使用部门/位置名称") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java index 56dce6a..862157f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationAssetMapper.java @@ -1,7 +1,12 @@ package com.ruoyi.system.mapper; -import com.ruoyi.system.model.OaApprovalApplicationAsset; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.system.model.OaApprovalApplicationAsset; +import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; +import org.apache.ibatis.annotations.Param; /** * <p> @@ -13,4 +18,6 @@ */ public interface OaApprovalApplicationAssetMapper extends BaseMapper<OaApprovalApplicationAsset> { + IPage<OaApprovalApplicationAssetPageVO> selectReceivePage(Page<OaApprovalApplicationAssetPageVO> page, + @Param("query") OaApprovalApplicationAssetPageQuery query); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetGeneralExt.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetGeneralExt.java index d6930dd..214b556 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetGeneralExt.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetGeneralExt.java @@ -18,7 +18,7 @@ * <p> * 通用资产扩展表 * </p> - * + * 已弃用 * @author WuGuanFengYue * @since 2025-09-15 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java index 1cc1695..d557b64 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetMain.java @@ -54,6 +54,10 @@ @TableField("specification_model") private String specificationModel; + @ApiModelProperty(value = "类别") + @TableField("category") + private String category; + @ApiModelProperty(value = "资产类别ID,关联asset_type表") @TableField("asset_type_id") private Integer assetTypeId; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetPropertyExt.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetPropertyExt.java index e0c1bb0..74c5526 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetPropertyExt.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetPropertyExt.java @@ -84,7 +84,7 @@ @ApiModelProperty(value = "是否抵押:0-否,1-是") @TableField("is_mortgaged") - private Boolean isMortgaged; + private Integer mortgaged; @ApiModelProperty(value = "承租方") @TableField("tenant_name") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java index 5c8f830..71bc14c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplicationAsset.java @@ -54,7 +54,7 @@ @ApiModelProperty(value = "操作类型 0-领用,1-借用,2-归还") @TableField("type") - private Boolean type; + private Integer type; @ApiModelProperty(value = "借用审批ID,类型为归还时使用。") @TableField("borrow_application_id") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java index f120640..dd7282c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/OaApprovalApplications.java @@ -48,14 +48,14 @@ @ApiModelProperty(value = "申请人") @TableField("applicant_name") private String applicantName; + @ApiModelProperty(value = "所属部门") @TableField("dept_name") private String deptName; + @ApiModelProperty(value = "部门ID") @TableField("dept_id") private Integer deptId; - - @ApiModelProperty(value = "申请日期") @TableField("application_date") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationAssetPageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationAssetPageQuery.java new file mode 100644 index 0000000..9c63463 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationAssetPageQuery.java @@ -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("资产领用申请分页查询对象") +public class OaApprovalApplicationAssetPageQuery extends BasePage { + private static final long serialVersionUID = 5202319182345234524L; + + @ApiModelProperty("关键词(标题/单据号/部门/领用人)") + private String keyword; + + @ApiModelProperty("部门ID(非管理员时作为数据权限过滤)") + private Integer deptId; +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java index abf9846..e1b747b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java @@ -1,8 +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.model.OaApprovalApplicationAsset; import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO; +import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO; /** * <p> @@ -19,4 +23,15 @@ * @param dto 领用申请DTO */ void submitReceive(OaApprovalApplicationAssetReceiveDTO dto); + + /** + * 获取资产领用申请分页列表 + */ + IPage<OaApprovalApplicationAssetPageVO> getReceivePageList(OaApprovalApplicationAssetPageQuery pageQuery); + + /** + * 获取资产领用/借用/归还详情 + * @param id 领用/借用/归还明细表ID(oa_approval_application_asset.id) + */ + OaApprovalApplicationAssetDetailVO getDetail(Integer id); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java index af0d170..2df657c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationStorageService.java @@ -11,6 +11,9 @@ import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery; import com.ruoyi.system.vo.StorageListVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO; /** * <p> @@ -50,5 +53,23 @@ */ IPage<OaApprovalApplicationStoragePageVO> getPageList(OaApprovalApplicationStoragePageQuery pageQuery); + /** + * 获取通用资产入库申请详情 + * @param storageId 入库申请存储表ID + */ + OaApprovalApplicationStorageGeneralDetailVO getGeneralDetail(Integer storageId); + + /** + * 获取房产资产入库申请详情 + * @param storageId 入库申请存储表ID + */ + OaApprovalApplicationStoragePropertyDetailVO getPropertyDetail(Integer storageId); + + /** + * 获取车辆资产入库申请详情 + * @param storageId 入库申请存储表ID + */ + OaApprovalApplicationStorageVehicleDetailVO getVehicleDetail(Integer storageId); + PageInfo<StorageListVO> pageList(ApprovalDetailQuery query); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java new file mode 100644 index 0000000..2b6d049 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java @@ -0,0 +1,28 @@ +package com.ruoyi.system.service; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * @author mitao + * @date 2024/12/23 + */ +public interface OssService { + /** + * 文件上传 + * + * @param file + * @return + */ + String uploadFile(MultipartFile file) throws IOException; + + /** + * 文件上传,指定上传路径 + * + * @param storagePath + * @param file + * @return + */ + String upload(String storagePath, MultipartFile file) throws IOException; +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java index 583b616..f69ae9b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetTypeServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; @@ -21,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; /** @@ -53,10 +55,31 @@ // 转换为VO对象 List<AssetTypeTreeVO> assetTypeVOs = BeanUtil.copyToList(allAssetTypes, AssetTypeTreeVO.class); + // 预查询:找出存在资产关联的资产类型ID集合(去重) + List<Integer> allTypeIds = allAssetTypes.stream().map(AssetType::getId).collect(Collectors.toList()); + QueryWrapper<AssetMain> usedTypeQuery = new QueryWrapper<>(); + usedTypeQuery.select("distinct asset_type_id").in("asset_type_id", allTypeIds); + List<AssetMain> usedTypeRows = assetMainService.list(usedTypeQuery); + Set<Integer> usedTypeIdSet = usedTypeRows.stream() + .map(AssetMain::getAssetTypeId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + // 按父级ID分组 Map<Integer, List<AssetTypeTreeVO>> parentIdMap = assetTypeVOs.stream() .collect(Collectors.groupingBy(AssetTypeTreeVO::getParentId)); + // 计算可删除标记:一级仅判断是否有子分类;二级仅判断是否有关联资产 + for (AssetTypeTreeVO vo : assetTypeVOs) { + if (Objects.equals(vo.getLevel(), 1)) { + boolean hasChildren = parentIdMap.containsKey(vo.getId()) && CollUtil.isNotEmpty(parentIdMap.get(vo.getId())); + vo.setCanDelete(!hasChildren); + } else { + boolean hasAssets = usedTypeIdSet.contains(vo.getId()); + vo.setCanDelete(!hasAssets); + } + } + // 构建树形结构 List<AssetTypeTreeVO> rootNodes = parentIdMap.get(0); if (CollUtil.isEmpty(rootNodes)) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java index 0640ed2..051d780 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java @@ -1,5 +1,7 @@ package com.ruoyi.system.service.impl; +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.OaApprovalApplicationAssetReceiveDTO; @@ -10,11 +12,14 @@ import com.ruoyi.system.model.OaApprovalApplicationAssetItem; import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowNode; +import com.ruoyi.system.query.OaApprovalApplicationAssetPageQuery; import com.ruoyi.system.service.OaApprovalApplicationAssetItemService; import com.ruoyi.system.service.OaApprovalApplicationAssetService; import com.ruoyi.system.service.OaApprovalApplicationsService; import com.ruoyi.system.service.OaApprovalFlowNodeService; import com.ruoyi.system.service.OaApprovalTodoService; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationAssetDetailVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -111,7 +116,7 @@ asset.setAssetTypeId(dto.getAssetTypeId()); asset.setOperateTime(dto.getOperateTime()); asset.setExpectReturnDate(dto.getExpectReturnDate()); - asset.setType(Boolean.FALSE); // 0-领用 + asset.setType(0); // 0-领用 return asset; } @@ -130,4 +135,29 @@ String sequenceStr = String.format("%03d", sequence); return prefix + sequenceStr; } + + @Override + public IPage<OaApprovalApplicationAssetPageVO> getReceivePageList(OaApprovalApplicationAssetPageQuery pageQuery) { + Page<OaApprovalApplicationAssetPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + return this.baseMapper.selectReceivePage(page, pageQuery); + } + + @Override + public OaApprovalApplicationAssetDetailVO getDetail(Integer id) { + OaApprovalApplicationAsset detail = this.getById(id); + if (detail == null) { + throw new ServiceException("记录不存在"); + } + OaApprovalApplications app = oaApprovalApplicationsService.getById(detail.getApprovalApplicationId()); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + List<OaApprovalApplicationAssetItem> items = oaApprovalApplicationAssetItemService.lambdaQuery() + .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId()) + .list(); + + OaApprovalApplicationAssetDetailVO vo = new OaApprovalApplicationAssetDetailVO(); + vo.setItems(items); + return vo; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java index 7d928d4..33e9534 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java @@ -4,13 +4,12 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.dto.asset.OaApprovalApplicationPurchaseDTO; import com.ruoyi.system.emums.ApprovalStatusEnum; +import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.mapper.OaApprovalApplicationPurchaseMapper; import com.ruoyi.system.model.OaApprovalApplicationPurchase; import com.ruoyi.system.model.OaApprovalApplicationPurchaseItem; import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowNode; -import com.ruoyi.system.service.ISysDeptService; -import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.OaApprovalApplicationPurchaseItemService; import com.ruoyi.system.service.OaApprovalApplicationPurchaseService; import com.ruoyi.system.service.OaApprovalApplicationsService; @@ -41,8 +40,6 @@ private final OaApprovalApplicationPurchaseItemService oaApprovalApplicationPurchaseItemService; private final OaApprovalFlowNodeService oaApprovalFlowNodeService; private final OaApprovalTodoService oaApprovalTodoService; - private final ISysUserService sysUserService; - private final ISysDeptService sysDeptService; @Override @Transactional(rollbackFor = Exception.class) @@ -51,7 +48,7 @@ OaApprovalApplications applications = buildOaApprovalApplications(dto); // 2. 如果是提交操作,获取流程节点并创建待办 - OaApprovalFlowNode firstFlowNode = getFirstFlowNode(dto.getApprovalId()); + OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.PURCHASE.getCode()); applications.setCurrentFlowNodeId(firstFlowNode.getId()); oaApprovalApplicationsService.save(applications); @@ -91,7 +88,7 @@ private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationPurchaseDTO dto) { OaApprovalApplications applications = new OaApprovalApplications(); applications.setApplicationCode(generateApplicationCode()); - applications.setApprovalId(dto.getApprovalId()); + applications.setApprovalId(ApprovalTypeEnum.PURCHASE.getCode()); applications.setApplicantUserId(dto.getApplicantUserId()); applications.setApplicantName(dto.getApplicantName()); applications.setDeptId(dto.getDeptId()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java index eb5a97d..d875739 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java @@ -22,6 +22,7 @@ import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowNode; import com.ruoyi.system.query.ApprovalDetailQuery; +import com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery; import com.ruoyi.system.service.AssetGeneralExtService; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.AssetPropertyExtService; @@ -37,7 +38,10 @@ import com.ruoyi.system.service.TDeptService; import com.ruoyi.system.vo.PurchaseListVO; import com.ruoyi.system.vo.StorageListVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageGeneralDetailVO; import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePageVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStoragePropertyDetailVO; +import com.ruoyi.system.vo.asset.OaApprovalApplicationStorageVehicleDetailVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -48,6 +52,8 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * <p> @@ -145,8 +151,7 @@ */ private void saveGeneralAssets(List<OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO> assetItems, Integer applicationId, Integer assetTypeId, LocalDate storageDate, OaApprovalApplicationStorageGeneralDTO baseDto) { List<AssetMain> allAssetMains = new ArrayList<>(); - List<AssetGeneralExt> allGeneralExts = new ArrayList<>(); - + for (OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item : assetItems) { // 根据数量创建对应数量的资产记录 int quantity = item.getQuantity().intValue(); @@ -161,19 +166,6 @@ // 批量保存资产主表数据 assetMainService.saveBatch(allAssetMains); - - // 为每个资产主表记录创建对应的扩展信息 - int assetMainIndex = 0; - for (OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item : assetItems) { - int quantity = item.getQuantity().intValue(); - for (int i = 0; i < quantity; i++) { - AssetGeneralExt generalExt = buildAssetGeneralExt(item, allAssetMains.get(assetMainIndex).getId()); - allGeneralExts.add(generalExt); - assetMainIndex++; - } - } - - assetGeneralExtService.saveBatch(allGeneralExts); } /** @@ -257,12 +249,21 @@ assetMain.setAssetOriginalCode(item.getAssetOriginalCode()); assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate)); // 系统生成资产编码 assetMain.setAssetName(item.getAssetName()); + assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); assetMain.setAssetTypeId(assetTypeId); assetMain.setMeasurementUnit(item.getMeasurementUnit()); assetMain.setUnitPrice(item.getUnitPrice()); assetMain.setUsefulLife(item.getUsefulLife()); - assetMain.setOwnershipDeptId(item.getOwnershipDeptId()); + // 根据权属单位/部门名称填充ID + if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) { + TDept ownerDept = tDeptService.lambdaQuery() + .eq(TDept::getDeptName, item.getOwnershipDeptName()) + .one(); + if (ownerDept != null) { + assetMain.setOwnershipDeptId(ownerDept.getId()); + } + } assetMain.setUserName(item.getUserName()); // 根据整单 addressType 写入使用部门ID或仓库ID applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress()); @@ -287,12 +288,20 @@ assetMain.setAssetOriginalCode(item.getAssetOriginalCode()); assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate)); assetMain.setAssetName(item.getAssetName()); + assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); assetMain.setAssetTypeId(assetTypeId); assetMain.setMeasurementUnit(item.getMeasurementUnit()); assetMain.setUnitPrice(item.getUnitPrice()); assetMain.setUsefulLife(item.getUsefulLife()); - assetMain.setOwnershipDeptId(item.getOwnershipDeptId()); + if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) { + TDept ownerDept = tDeptService.lambdaQuery() + .eq(TDept::getDeptName, item.getOwnershipDeptName()) + .one(); + if (ownerDept != null) { + assetMain.setOwnershipDeptId(ownerDept.getId()); + } + } assetMain.setUserName(item.getUserName()); applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress()); assetMain.setAssetMainType(baseDto.getAddressType()); @@ -316,12 +325,20 @@ assetMain.setAssetOriginalCode(item.getAssetOriginalCode()); assetMain.setAssetCode(generateAssetCode(assetTypeId, storageDate)); assetMain.setAssetName(item.getAssetName()); + assetMain.setCategory(item.getCategory()); assetMain.setSpecificationModel(item.getSpecificationModel()); assetMain.setAssetTypeId(assetTypeId); assetMain.setMeasurementUnit(item.getMeasurementUnit()); assetMain.setUnitPrice(item.getUnitPrice()); assetMain.setUsefulLife(item.getUsefulLife()); - assetMain.setOwnershipDeptId(item.getOwnershipDeptId()); + if (item.getOwnershipDeptName() != null && !item.getOwnershipDeptName().isEmpty()) { + TDept ownerDept = tDeptService.lambdaQuery() + .eq(TDept::getDeptName, item.getOwnershipDeptName()) + .one(); + if (ownerDept != null) { + assetMain.setOwnershipDeptId(ownerDept.getId()); + } + } assetMain.setUserName(item.getUserName()); applyAddressToAssetMain(assetMain, baseDto.getAddressType(), baseDto.getUseDeptName(), baseDto.getWarehouseName(), baseDto.getAddress()); assetMain.setAssetMainType(baseDto.getAddressType()); @@ -382,16 +399,6 @@ private AssetGeneralExt buildAssetGeneralExt(OaApprovalApplicationStorageGeneralDTO.GeneralAssetItemDTO item, Integer assetMainId) { AssetGeneralExt generalExt = new AssetGeneralExt(); generalExt.setAssetMainId(assetMainId); - generalExt.setSupplierName(item.getSupplierName()); - generalExt.setPurchaseDate(item.getPurchaseDate()); - generalExt.setWarrantyPeriod(item.getWarrantyPeriod()); - generalExt.setWarrantyExpireDate(item.getWarrantyExpireDate()); - generalExt.setDepreciationMethod(item.getDepreciationMethod()); - generalExt.setDepreciationRate(item.getDepreciationRate()); - generalExt.setNetValue(item.getNetValue()); - generalExt.setMaintenanceCycle(item.getMaintenanceCycle()); - generalExt.setLastMaintenanceDate(item.getLastMaintenanceDate()); - generalExt.setNextMaintenanceDate(item.getNextMaintenanceDate()); generalExt.setDisabled(false); return generalExt; } @@ -413,7 +420,7 @@ propertyExt.setDetailedLocation(item.getDetailedLocation()); propertyExt.setProvincialPlatformValue(item.getProvincialPlatformValue()); propertyExt.setResettlementSituation(item.getResettlementSituation()); - propertyExt.setIsMortgaged(item.getIsMortgaged()); + propertyExt.setMortgaged(item.getMortgaged()); propertyExt.setTenantName(item.getTenantName()); propertyExt.setRentalAmount(item.getRentalAmount()); propertyExt.setLeaseStartDate(item.getLeaseStartDate()); @@ -471,7 +478,7 @@ applications.setApplicantName(generalDTO.getApplicantName()); applications.setDeptId(generalDTO.getDeptId()); applications.setDeptName(generalDTO.getDeptName()); - applications.setApplicationDate(generalDTO.getApplicationDate()); + applications.setApplicationDate(LocalDate.now()); applications.setApplicationReason(generalDTO.getApplicationReason()); applications.setAttachmentUrl(generalDTO.getAttachmentUrl()); } else if (dto instanceof OaApprovalApplicationStoragePropertyDTO) { @@ -480,7 +487,7 @@ applications.setApplicantName(propertyDTO.getApplicantName()); applications.setDeptId(propertyDTO.getDeptId()); applications.setDeptName(propertyDTO.getDeptName()); - applications.setApplicationDate(propertyDTO.getApplicationDate()); + applications.setApplicationDate(LocalDate.now()); applications.setApplicationReason(propertyDTO.getApplicationReason()); applications.setAttachmentUrl(propertyDTO.getAttachmentUrl()); } else if (dto instanceof OaApprovalApplicationStorageVehicleDTO) { @@ -489,7 +496,7 @@ applications.setApplicantName(vehicleDTO.getApplicantName()); applications.setDeptId(vehicleDTO.getDeptId()); applications.setDeptName(vehicleDTO.getDeptName()); - applications.setApplicationDate(vehicleDTO.getApplicationDate()); + applications.setApplicationDate(LocalDate.now()); applications.setApplicationReason(vehicleDTO.getApplicationReason()); applications.setAttachmentUrl(vehicleDTO.getAttachmentUrl()); } @@ -576,12 +583,300 @@ } @Override - public IPage<OaApprovalApplicationStoragePageVO> getPageList(com.ruoyi.system.query.OaApprovalApplicationStoragePageQuery pageQuery) { + public IPage<OaApprovalApplicationStoragePageVO> getPageList(OaApprovalApplicationStoragePageQuery pageQuery) { Page<OaApprovalApplicationStoragePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); return this.baseMapper.selectApplicationStoragePage(page, pageQuery); } @Override + public OaApprovalApplicationStorageGeneralDetailVO getGeneralDetail(Integer storageId) { + OaApprovalApplicationStorage storage = this.getById(storageId); + if (storage == null) { + throw new ServiceException("入库申请不存在"); + } + OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId()); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + + OaApprovalApplicationStorageGeneralDetailVO vo = new OaApprovalApplicationStorageGeneralDetailVO(); + fillBaseFields(vo, app, storage); + + List<AssetMain> mains = assetMainService.lambdaQuery() + .eq(AssetMain::getApprovalApplicationId, app.getId()) + .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) + .list(); + setAddressInfo(vo, mains); + + if (!CollectionUtils.isEmpty(mains)) { + List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList()); + // 批量查询权属部门,避免循环内查询 + List<Integer> ownerIds = mains.stream().map(AssetMain::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)); + + List<OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO> items = mains.stream().map(m -> { + OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO item = new OaApprovalApplicationStorageGeneralDetailVO.GeneralAssetItemVO(); + item.setAssetOriginalCode(m.getAssetOriginalCode()); + item.setAssetName(m.getAssetName()); + item.setSpecificationModel(m.getSpecificationModel()); + item.setMeasurementUnit(m.getMeasurementUnit()); + item.setQuantity(m.getQuantity()); + item.setUnitPrice(m.getUnitPrice()); + item.setUsefulLife(m.getUsefulLife()); + if (m.getOwnershipDeptId() != null) { + TDept dept = ownerDeptMap.get(m.getOwnershipDeptId()); + item.setOwnerShipDeptName(dept != null ? dept.getDeptName() : null); + } + item.setUserName(m.getUserName()); + item.setAssetStatus(m.getAssetStatus()); + item.setRemarks(m.getRemarks()); + item.setAccountingStatus(m.getAccountingStatus()); + item.setAccountingDate(m.getAccountingDate()); + item.setAccountingVoucherNo(m.getAccountingVoucherNo()); + item.setAccountingSubject(m.getAccountingSubject()); + item.setAccountingAmount(m.getAccountingAmount()); + return item; + }).collect(Collectors.toList()); + vo.setAssetItems(items); + } + return vo; + } + + @Override + public OaApprovalApplicationStoragePropertyDetailVO getPropertyDetail(Integer storageId) { + OaApprovalApplicationStorage storage = this.getById(storageId); + if (storage == null) { + throw new ServiceException("入库申请不存在"); + } + OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId()); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + + OaApprovalApplicationStoragePropertyDetailVO vo = new OaApprovalApplicationStoragePropertyDetailVO(); + fillBaseFields(vo, app, storage); + + List<AssetMain> mains = assetMainService.lambdaQuery() + .eq(AssetMain::getApprovalApplicationId, app.getId()) + .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) + .list(); + setAddressInfo(vo, mains); + + if (!CollectionUtils.isEmpty(mains)) { + List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList()); + List<AssetPropertyExt> exts = assetPropertyExtService.lambdaQuery().in(AssetPropertyExt::getAssetMainId, mainIds).list(); + Map<Integer, AssetPropertyExt> extMap = exts.stream().collect(Collectors.toMap(AssetPropertyExt::getAssetMainId, e -> e)); + // 批量查询权属部门 + List<Integer> ownerIds = mains.stream().map(AssetMain::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)); + + List<OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO> items = mains.stream().map(m -> { + OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO item = new OaApprovalApplicationStoragePropertyDetailVO.PropertyAssetItemVO(); + item.setAssetOriginalCode(m.getAssetOriginalCode()); + item.setAssetName(m.getAssetName()); + item.setSpecificationModel(m.getSpecificationModel()); + item.setMeasurementUnit(m.getMeasurementUnit()); + item.setQuantity(m.getQuantity()); + item.setUnitPrice(m.getUnitPrice()); + item.setUsefulLife(m.getUsefulLife()); + if (m.getOwnershipDeptId() != null) { + TDept dept = ownerDeptMap.get(m.getOwnershipDeptId()); + item.setOwnerShipDeptName(dept != null ? dept.getDeptName() : null); + } + item.setUserName(m.getUserName()); + item.setAssetStatus(m.getAssetStatus()); + item.setRemarks(m.getRemarks()); + item.setAccountingStatus(m.getAccountingStatus()); + item.setAccountingDate(m.getAccountingDate()); + item.setAccountingVoucherNo(m.getAccountingVoucherNo()); + item.setAccountingSubject(m.getAccountingSubject()); + item.setAccountingAmount(m.getAccountingAmount()); + AssetPropertyExt ext = extMap.get(m.getId()); + if (ext != null) { + item.setRegion(ext.getRegion()); + item.setDesignPurpose(ext.getDesignPurpose()); + item.setBuilding(ext.getBuilding()); + item.setRoomNumber(ext.getRoomNumber()); + item.setConstructionArea(ext.getConstructionArea()); + item.setStructureType(ext.getStructureType()); + item.setCertificateNumber(ext.getCertificateNumber()); + item.setCompletionDate(ext.getCompletionDate()); + item.setDetailedLocation(ext.getDetailedLocation()); + item.setProvincialPlatformValue(ext.getProvincialPlatformValue()); + item.setResettlementSituation(ext.getResettlementSituation()); + item.setMortgaged(ext.getMortgaged()); + item.setTenantName(ext.getTenantName()); + item.setRentalAmount(ext.getRentalAmount()); + item.setLeaseStartDate(ext.getLeaseStartDate()); + item.setLeaseEndDate(ext.getLeaseEndDate()); + } + return item; + }).collect(Collectors.toList()); + vo.setAssetItems(items); + } + return vo; + } + + @Override + public OaApprovalApplicationStorageVehicleDetailVO getVehicleDetail(Integer storageId) { + OaApprovalApplicationStorage storage = this.getById(storageId); + if (storage == null) { + throw new ServiceException("入库申请不存在"); + } + OaApprovalApplications app = oaApprovalApplicationsService.getById(storage.getApprovalApplicationId()); + if (app == null) { + throw new ServiceException("审批主记录不存在"); + } + + OaApprovalApplicationStorageVehicleDetailVO vo = new OaApprovalApplicationStorageVehicleDetailVO(); + fillBaseFields(vo, app, storage); + + List<AssetMain> mains = assetMainService.lambdaQuery() + .eq(AssetMain::getApprovalApplicationId, app.getId()) + .eq(AssetMain::getAssetTypeId, storage.getAssetTypeId()) + .list(); + setAddressInfo(vo, mains); + + if (!CollectionUtils.isEmpty(mains)) { + List<Integer> mainIds = mains.stream().map(AssetMain::getId).collect(Collectors.toList()); + List<AssetVehicleExt> exts = assetVehicleExtService.lambdaQuery().in(AssetVehicleExt::getAssetMainId, mainIds).list(); + Map<Integer, AssetVehicleExt> extMap = exts.stream().collect(Collectors.toMap(AssetVehicleExt::getAssetMainId, e -> e)); + // 批量查询权属部门 + List<Integer> ownerIds = mains.stream().map(AssetMain::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)); + + List<OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO> items = mains.stream().map(m -> { + OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO item = new OaApprovalApplicationStorageVehicleDetailVO.VehicleAssetItemVO(); + item.setAssetOriginalCode(m.getAssetOriginalCode()); + item.setAssetName(m.getAssetName()); + item.setSpecificationModel(m.getSpecificationModel()); + item.setMeasurementUnit(m.getMeasurementUnit()); + item.setQuantity(m.getQuantity()); + item.setUnitPrice(m.getUnitPrice()); + item.setUsefulLife(m.getUsefulLife()); + if (m.getOwnershipDeptId() != null) { + TDept dept = ownerDeptMap.get(m.getOwnershipDeptId()); + item.setOwnerShipDeptName(dept != null ? dept.getDeptName() : null); + } + item.setUserName(m.getUserName()); + item.setAssetStatus(m.getAssetStatus()); + item.setRemarks(m.getRemarks()); + item.setAccountingStatus(m.getAccountingStatus()); + item.setAccountingDate(m.getAccountingDate()); + item.setAccountingVoucherNo(m.getAccountingVoucherNo()); + item.setAccountingSubject(m.getAccountingSubject()); + item.setAccountingAmount(m.getAccountingAmount()); + AssetVehicleExt ext = extMap.get(m.getId()); + if (ext != null) { + item.setLicensePlate(ext.getLicensePlate()); + item.setVinCode(ext.getVinCode()); + item.setEngineNumber(ext.getEngineNumber()); + item.setDisplacement(ext.getDisplacement()); + item.setStaffingSituation(ext.getStaffingSituation()); + item.setOrigin(ext.getOrigin()); + item.setAcquisitionDate(ext.getAcquisitionDate()); + item.setPropertyRightForm(ext.getPropertyRightForm()); + } + return item; + }).collect(Collectors.toList()); + vo.setAssetItems(items); + } + return vo; + } + + private void fillBaseFields(Object vo, OaApprovalApplications app, OaApprovalApplicationStorage storage) { + if (vo instanceof OaApprovalApplicationStorageGeneralDetailVO) { + OaApprovalApplicationStorageGeneralDetailVO v = (OaApprovalApplicationStorageGeneralDetailVO) vo; + v.setDeptId(app.getDeptId()); + v.setDeptName(app.getDeptName()); + v.setApplicantUserId(app.getApplicantUserId()); + v.setApplicantName(app.getApplicantName()); + v.setApplicationDate(app.getApplicationDate()); + v.setApplicationReason(app.getApplicationReason()); + v.setAttachmentUrl(app.getAttachmentUrl()); + v.setTitle(storage.getTitle()); + v.setAssetTypeId(storage.getAssetTypeId()); + v.setStorageType(storage.getStorageType()); + v.setStorageTime(storage.getStorageTime()); + } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) { + OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo; + v.setDeptId(app.getDeptId()); + v.setDeptName(app.getDeptName()); + v.setApplicantUserId(app.getApplicantUserId()); + v.setApplicantName(app.getApplicantName()); + v.setApplicationDate(app.getApplicationDate()); + v.setApplicationReason(app.getApplicationReason()); + v.setAttachmentUrl(app.getAttachmentUrl()); + v.setTitle(storage.getTitle()); + v.setAssetTypeId(storage.getAssetTypeId()); + v.setStorageType(storage.getStorageType()); + v.setStorageTime(storage.getStorageTime()); + } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) { + OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo; + v.setDeptId(app.getDeptId()); + v.setDeptName(app.getDeptName()); + v.setApplicantUserId(app.getApplicantUserId()); + v.setApplicantName(app.getApplicantName()); + v.setApplicationDate(app.getApplicationDate()); + v.setApplicationReason(app.getApplicationReason()); + v.setAttachmentUrl(app.getAttachmentUrl()); + v.setTitle(storage.getTitle()); + v.setAssetTypeId(storage.getAssetTypeId()); + v.setStorageType(storage.getStorageType()); + v.setStorageTime(storage.getStorageTime()); + } + } + + private void setAddressInfo(Object vo, List<AssetMain> mains) { + if (CollectionUtils.isEmpty(mains)) { + return; + } + AssetMain sample = mains.get(0); + Integer addressType = null; + String useDeptName = null; + String warehouseName = null; + String address = null; + if (sample.getUseDeptId() != null) { + addressType = 0; + TDept dept = tDeptService.getById(sample.getUseDeptId()); + useDeptName = dept != null ? dept.getDeptName() : null; + } else if (sample.getWarehouseId() != null) { + addressType = 1; + AssetWarehouse wh = assetWarehouseService.getById(sample.getWarehouseId()); + warehouseName = wh != null ? wh.getWarehouseName() : null; + } else if (sample.getAddress() != null && !sample.getAddress().isEmpty()) { + addressType = 2; + address = sample.getAddress(); + } + + if (vo instanceof OaApprovalApplicationStorageGeneralDetailVO) { + OaApprovalApplicationStorageGeneralDetailVO v = (OaApprovalApplicationStorageGeneralDetailVO) vo; + v.setAddressType(addressType); + v.setUseDeptName(useDeptName); + v.setWarehouseName(warehouseName); + v.setAddress(address); + } else if (vo instanceof OaApprovalApplicationStoragePropertyDetailVO) { + OaApprovalApplicationStoragePropertyDetailVO v = (OaApprovalApplicationStoragePropertyDetailVO) vo; + v.setAddressType(addressType); + v.setUseDeptName(useDeptName); + v.setWarehouseName(warehouseName); + v.setAddress(address); + } else if (vo instanceof OaApprovalApplicationStorageVehicleDetailVO) { + OaApprovalApplicationStorageVehicleDetailVO v = (OaApprovalApplicationStorageVehicleDetailVO) vo; + v.setAddressType(addressType); + v.setUseDeptName(useDeptName); + v.setWarehouseName(warehouseName); + v.setAddress(address); + } + } + + @Override public PageInfo<StorageListVO> pageList(ApprovalDetailQuery query) { PageInfo<StorageListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); List<StorageListVO> list = this.baseMapper.pageList(query,pageInfo); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java new file mode 100644 index 0000000..2d53aea --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java @@ -0,0 +1,119 @@ +package com.ruoyi.system.service.impl; + +import com.aliyun.oss.ClientBuilderConfiguration; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.common.auth.CredentialsProvider; +import com.aliyun.oss.common.auth.DefaultCredentialProvider; +import com.aliyun.oss.common.comm.SignVersion; +import com.aliyun.oss.model.PutObjectRequest; +import com.aliyun.oss.model.PutObjectResult; +import com.ruoyi.common.config.FileUploadConfig; +import com.ruoyi.common.config.OssConfig; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.system.service.OssService; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.Objects; +import java.util.UUID; + +/** + * @author mitao + * @date 2024/12/23 + */ +@Service +public class OssServiceImpl implements OssService { + @Autowired + private FileUploadConfig fileUploadConfig; + /** + * 文件上传 + * + * @param file + * @return + */ + @Override + public String uploadFile(MultipartFile file) throws IOException { + if (Objects.isNull(file)) { + throw new ServiceException("文件不能为空"); + } + // 获取文件名称 + String filename = file.getOriginalFilename(); + // 获取文件后缀 + String ext = filename.substring(filename.lastIndexOf("."), filename.length()); + // 检查文件类型 + if (!fileUploadConfig.getAllowExt().contains(ext)) { + throw new ServiceException("上传文件格式不正确,仅支持"+ fileUploadConfig.getAllowExt()); + } + return upload(OssConfig.FOLDER, file); + } + + /** + * 文件上传,指定上传路径 + * + * @param storagePath + * @param file + * @return + */ + @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(); + + 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; + } + + /** + * <pre> + * 获取存储的相对路径 + * 规则path + / + yyyyMMddHH + uuid + * </pre> + * + * @param storagePath + * @return + */ + private static String generateRelativeStoragePath(String storagePath, String fileType, String fileName) { + + String time = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"); + String uuid = UUID.randomUUID().toString(); + StringBuilder sb = new StringBuilder(); + if (StringUtils.isNotBlank(storagePath)) { + sb.append(storagePath).append("/"); + } + if (fileName == null) { + sb.append(time).append(uuid); + } else { + sb.append(fileName).append(time); + } + if (StringUtils.isNotBlank(fileType)) { + sb.append(".").append(fileType); + } + return sb.toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java index 8d9c135..56a6eb8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetTypeTreeVO.java @@ -52,6 +52,9 @@ @ApiModelProperty(value = "更新人") private String updateBy; + @ApiModelProperty(value = "是否可删除:无子类型且无资产关联时为true") + private Boolean canDelete; + @ApiModelProperty(value = "子节点列表") private List<AssetTypeTreeVO> children; -} \ No newline at end of file +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java new file mode 100644 index 0000000..a3eea4e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetDetailVO.java @@ -0,0 +1,78 @@ +package com.ruoyi.system.vo.asset; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.system.model.OaApprovalApplicationAssetItem; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; + +/** + * 资产领用/借用/归还 详情VO + */ +@Data +@ApiModel("资产领用/借用/归还 详情VO") +public class OaApprovalApplicationAssetDetailVO implements Serializable { + + @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(value = "领用/借用日期") + private LocalDate operateTime; + + @ApiModelProperty(value = "预计退还日期") + private LocalDate expectReturnDate; + + @ApiModelProperty(value = "操作类型 0-领用,1-借用,2-归还") + private Integer type; + + @ApiModelProperty(value = "借用审批ID,类型为归还时使用。") + private Integer borrowApplicationId; + + @ApiModelProperty("关联资产项列表") + private List<OaApprovalApplicationAssetItem> items; +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java new file mode 100644 index 0000000..c420e67 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationAssetPageVO.java @@ -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; + +/** + * 资产领用申请分页列表返回对象 + */ +@Data +@ApiModel("资产领用申请分页列表返回对象") +public class OaApprovalApplicationAssetPageVO implements Serializable { + private static final long serialVersionUID = 4352345234523452346L; + + @ApiModelProperty("主键ID") + private Integer id; + + @ApiModelProperty("单据号") + private String applicationCode; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("领用部门") + private String deptName; + + @ApiModelProperty("领用人") + private String applicantName; + + @ApiModelProperty("资产一级类型名称") + private String firstAssetTypeName; + + @ApiModelProperty("资产二级类型名称") + private String secondAssetTypeName; + + @ApiModelProperty("领用日期") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate operateTime; + + @ApiModelProperty("状态 0-草稿,1-待审批,2-通过,3-拒绝,4-撤回") + private Integer approvalStatus; +} + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java new file mode 100644 index 0000000..a4edb80 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageGeneralDetailVO.java @@ -0,0 +1,118 @@ +package com.ruoyi.system.vo.asset; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 通用资产入库申请详情VO(返回新增时填写的所有字段) + */ +@Data +@ApiModel("通用资产入库申请详情VO") +public class OaApprovalApplicationStorageGeneralDetailVO implements Serializable { + + @ApiModelProperty(value = "申请部门ID") + private Integer deptId; + + @ApiModelProperty(value = "申请部门名称") + private String deptName; + + @ApiModelProperty(value = "申请人ID") + private Integer applicantUserId; + + @ApiModelProperty(value = "申请人姓名") + private String applicantName; + + @ApiModelProperty(value = "申请日期") + private LocalDate applicationDate; + + @ApiModelProperty(value = "入库备注") + private String applicationReason; + + @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接") + private String attachmentUrl; + + @ApiModelProperty(value = "事项标题") + private String title; + + @ApiModelProperty(value = "资产类型ID") + private Integer assetTypeId; + + @ApiModelProperty(value = "入库类型 0-正常入库") + private Boolean storageType; + + @ApiModelProperty(value = "入库日期") + private LocalDate storageTime; + + @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + private Integer addressType; + + @ApiModelProperty(value = "使用部门/位置名称") + private String useDeptName; + + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + @ApiModelProperty(value = "所在位置") + private String address; + + @ApiModelProperty(value = "通用资产明细列表(按保存展开后的一条资产记录对应一条明细)") + private List<GeneralAssetItemVO> assetItems; + + @Data + @ApiModel("通用资产明细VO") + public static class GeneralAssetItemVO implements Serializable { + @ApiModelProperty(value = "资产原编码") + private String assetOriginalCode; + + @ApiModelProperty(value = "资产名称") + private String assetName; + + @ApiModelProperty(value = "规格型号") + private String specificationModel; + + @ApiModelProperty(value = "计量单位") + private String measurementUnit; + + @ApiModelProperty(value = "数量") + private BigDecimal quantity; + + @ApiModelProperty(value = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty(value = "使用年限(年)") + private Integer usefulLife; + + @ApiModelProperty(value = "权属单位/部门名称") + private String ownerShipDeptName; + + @ApiModelProperty(value = "使用人") + private String userName; + + @ApiModelProperty(value = "资产状态") + private String assetStatus; + + @ApiModelProperty(value = "备注") + private String remarks; + + @ApiModelProperty(value = "入账状态") + private String accountingStatus; + + @ApiModelProperty(value = "入账时间") + private LocalDate accountingDate; + + @ApiModelProperty(value = "会计凭证号") + private String accountingVoucherNo; + + @ApiModelProperty(value = "会计科目") + private String accountingSubject; + + @ApiModelProperty(value = "入账金额") + private BigDecimal accountingAmount; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java new file mode 100644 index 0000000..10c6515 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStoragePropertyDetailVO.java @@ -0,0 +1,170 @@ +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.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 房产资产入库申请详情VO(返回新增时填写的所有字段) + */ +@Data +@ApiModel("房产资产入库申请详情VO") +public class OaApprovalApplicationStoragePropertyDetailVO implements Serializable { + + @ApiModelProperty(value = "申请部门ID") + private Integer deptId; + + @ApiModelProperty(value = "申请部门名称") + private String deptName; + + @ApiModelProperty(value = "申请人ID") + private Integer applicantUserId; + + @ApiModelProperty(value = "申请人姓名") + private String applicantName; + + @ApiModelProperty(value = "申请日期") + private LocalDate applicationDate; + + @ApiModelProperty(value = "入库备注") + private String applicationReason; + + @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接") + private String attachmentUrl; + + @ApiModelProperty(value = "事项标题") + private String title; + + @ApiModelProperty(value = "资产类型ID") + private Integer assetTypeId; + + @ApiModelProperty(value = "入库类型 0-正常入库") + private Boolean storageType; + + @ApiModelProperty(value = "入库日期") + private LocalDate storageTime; + + @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + private Integer addressType; + + @ApiModelProperty(value = "使用部门/位置名称") + private String useDeptName; + + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + @ApiModelProperty(value = "所在位置") + private String address; + + @ApiModelProperty(value = "房产资产明细列表(按保存展开后的一条资产记录对应一条明细)") + private List<PropertyAssetItemVO> assetItems; + + @Data + @ApiModel("房产资产明细VO") + public static class PropertyAssetItemVO implements Serializable { + @ApiModelProperty(value = "资产原编码") + private String assetOriginalCode; + + @ApiModelProperty(value = "资产名称") + private String assetName; + + @ApiModelProperty(value = "规格型号") + private String specificationModel; + + @ApiModelProperty(value = "计量单位") + private String measurementUnit; + + @ApiModelProperty(value = "数量") + private BigDecimal quantity; + + @ApiModelProperty(value = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty(value = "使用年限(年)") + private Integer usefulLife; + + @ApiModelProperty(value = "权属单位/部门名称") + private String ownerShipDeptName; + + @ApiModelProperty(value = "使用人") + private String userName; + + @ApiModelProperty(value = "资产状态") + private String assetStatus; + + @ApiModelProperty(value = "备注") + private String remarks; + + @ApiModelProperty(value = "入账状态") + private String accountingStatus; + + @ApiModelProperty(value = "入账时间") + private LocalDate accountingDate; + + @ApiModelProperty(value = "会计凭证号") + private String accountingVoucherNo; + + @ApiModelProperty(value = "会计科目") + private String accountingSubject; + + @ApiModelProperty(value = "入账金额") + private BigDecimal accountingAmount; + + // 房产资产扩展表字段 + @ApiModelProperty(value = "所在区域") + private String region; + + @ApiModelProperty(value = "设计用途") + private String designPurpose; + + @ApiModelProperty(value = "楼栋") + private String building; + + @ApiModelProperty(value = "房间号") + private String roomNumber; + + @ApiModelProperty(value = "建筑面积(平方米)") + private BigDecimal constructionArea; + + @ApiModelProperty(value = "结构") + private String structureType; + + @ApiModelProperty(value = "权证编号") + private String certificateNumber; + + @ApiModelProperty(value = "建成年月") + private LocalDate completionDate; + + @ApiModelProperty(value = "详细位置") + private String detailedLocation; + + @ApiModelProperty(value = "省资产平台填报价值") + private BigDecimal provincialPlatformValue; + + @ApiModelProperty(value = "安置情况") + private String resettlementSituation; + + @ApiModelProperty(value = "是否抵押:0-否,1-是") + private Integer mortgaged; + + @ApiModelProperty(value = "承租方") + private String tenantName; + + @ApiModelProperty(value = "租金") + private BigDecimal rentalAmount; + + @ApiModelProperty(value = "租赁期限起") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate leaseStartDate; + + @ApiModelProperty(value = "租赁期限止") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate leaseEndDate; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java new file mode 100644 index 0000000..d44729a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/OaApprovalApplicationStorageVehicleDetailVO.java @@ -0,0 +1,143 @@ +package com.ruoyi.system.vo.asset; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 车辆资产入库申请详情VO(返回新增时填写的所有字段) + */ +@Data +@ApiModel("车辆资产入库申请详情VO") +public class OaApprovalApplicationStorageVehicleDetailVO implements Serializable { + + @ApiModelProperty(value = "申请部门ID") + private Integer deptId; + + @ApiModelProperty(value = "申请部门名称") + private String deptName; + + @ApiModelProperty(value = "申请人ID") + private Integer applicantUserId; + + @ApiModelProperty(value = "申请人姓名") + private String applicantName; + + @ApiModelProperty(value = "申请日期") + private LocalDate applicationDate; + + @ApiModelProperty(value = "入库备注") + private String applicationReason; + + @ApiModelProperty(value = "附件地址,多个使用英文逗号拼接") + private String attachmentUrl; + + @ApiModelProperty(value = "事项标题") + private String title; + + @ApiModelProperty(value = "资产类型ID") + private Integer assetTypeId; + + @ApiModelProperty(value = "入库类型 0-正常入库") + private Boolean storageType; + + @ApiModelProperty(value = "入库日期") + private LocalDate storageTime; + + @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址") + private Integer addressType; + + @ApiModelProperty(value = "使用部门/位置名称") + private String useDeptName; + + @ApiModelProperty(value = "仓库名称") + private String warehouseName; + + @ApiModelProperty(value = "所在位置") + private String address; + + @ApiModelProperty(value = "车辆资产明细列表(按保存展开后的一条资产记录对应一条明细)") + private List<VehicleAssetItemVO> assetItems; + + @Data + @ApiModel("车辆资产明细VO") + public static class VehicleAssetItemVO implements Serializable { + @ApiModelProperty(value = "资产原编码") + private String assetOriginalCode; + + @ApiModelProperty(value = "资产名称") + private String assetName; + + @ApiModelProperty(value = "规格型号") + private String specificationModel; + + @ApiModelProperty(value = "计量单位") + private String measurementUnit; + + @ApiModelProperty(value = "数量") + private BigDecimal quantity; + + @ApiModelProperty(value = "单价") + private BigDecimal unitPrice; + + @ApiModelProperty(value = "使用年限(年)") + private Integer usefulLife; + + @ApiModelProperty(value = "权属单位/部门名称") + private String ownerShipDeptName; + + @ApiModelProperty(value = "使用人") + private String userName; + + @ApiModelProperty(value = "资产状态") + private String assetStatus; + + @ApiModelProperty(value = "备注") + private String remarks; + + @ApiModelProperty(value = "入账状态") + private String accountingStatus; + + @ApiModelProperty(value = "入账时间") + private LocalDate accountingDate; + + @ApiModelProperty(value = "会计凭证号") + private String accountingVoucherNo; + + @ApiModelProperty(value = "会计科目") + private String accountingSubject; + + @ApiModelProperty(value = "入账金额") + private BigDecimal accountingAmount; + + // 车辆资产扩展表字段 + @ApiModelProperty(value = "车牌号") + private String licensePlate; + + @ApiModelProperty(value = "车辆识别代码") + private String vinCode; + + @ApiModelProperty(value = "发动机号") + private String engineNumber; + + @ApiModelProperty(value = "排量") + private String displacement; + + @ApiModelProperty(value = "编制情况") + private String staffingSituation; + + @ApiModelProperty(value = "产地") + private String origin; + + @ApiModelProperty(value = "取得日期") + private LocalDate acquisitionDate; + + @ApiModelProperty(value = "产权形式") + private String propertyRightForm; + } +} diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml index 1974701..4f1cd2e 100644 --- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationAssetMapper.xml @@ -17,6 +17,40 @@ <!-- 通用查询结果列 --> <sql id="Base_Column_List"> id, approval_application_id, title, asset_type_id, operate_time, expect_return_date, type, borrow_application_id - </sql> +</sql> + + <!-- 分页查询:资产领用申请列表(关联审批记录与资产类型) --> + <select id="selectReceivePage" resultType="com.ruoyi.system.vo.asset.OaApprovalApplicationAssetPageVO"> + SELECT + oaa.id AS id, + aaa.application_code AS applicationCode, + oaa.title AS title, + aaa.dept_name AS deptName, + aaa.applicant_name AS applicantName, + CASE WHEN at2.level = 2 THEN at1.type_name ELSE at2.type_name END AS firstAssetTypeName, + CASE WHEN at2.level = 2 THEN at2.type_name ELSE NULL END AS secondAssetTypeName, + oaa.operate_time AS operateTime, + aaa.approval_status AS approvalStatus + FROM oa_approval_application_asset oaa + INNER JOIN oa_approval_applications aaa ON aaa.id = oaa.approval_application_id + LEFT JOIN asset_type at2 ON at2.id = oaa.asset_type_id + LEFT JOIN asset_type at1 ON at1.id = (CASE WHEN at2.level = 2 THEN at2.parent_id ELSE at2.id END) + <where> + AND aaa.disabled = 0 + AND oaa.type = 0 + <if test="query != null and query.keyword != null and query.keyword != ''"> + AND ( + oaa.title LIKE CONCAT('%', #{query.keyword}, '%') + OR aaa.application_code LIKE CONCAT('%', #{query.keyword}, '%') + OR aaa.dept_name LIKE CONCAT('%', #{query.keyword}, '%') + OR aaa.applicant_name LIKE CONCAT('%', #{query.keyword}, '%') + ) + </if> + <if test="query != null and query.deptId != null"> + AND aaa.dept_id = #{query.deptId} + </if> + </where> + ORDER BY oaa.operate_time DESC, oaa.id DESC + </select> </mapper> diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index d40bcf5..d960d8d 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -267,7 +267,7 @@ select * from sys_user where 1=1 <if test="ids != null and ids.size()>0"> - AND deptId IN + AND dept_id IN <foreach collection="ids" separator="," item="id" open="(" close=")"> #{id} </foreach> @@ -278,7 +278,7 @@ <select id="selectListByDeptId" resultType="com.ruoyi.common.core.domain.entity.SysUser"> select u.* - from sys_user u where u.deptId = #{deptId} and u.status = 0 and u.del_flag = 0 + from sys_user u where u.dept_id = #{deptId} and u.status = 0 and u.del_flag = 0 </select> <select id="selectListByDeptType" resultType="com.ruoyi.common.core.domain.entity.SysUser"> select u.* @@ -288,7 +288,7 @@ select u.* from sys_user u where u.status = 0 and u.del_flag = 0 <if test="projectIds != null and projectIds.size() > 0"> - and u.deptId in + and u.dept_id in <foreach item="item" collection="projectIds" open="(" separator="," close=")"> #{item} </foreach> @@ -300,7 +300,7 @@ and deptType = #{deptType} </if> <if test="projectIds != null and projectIds.size() > 0"> - and deptId in + and dept_id in <foreach item="item" collection="projectIds" open="(" separator="," close=")"> #{item} </foreach> -- Gitblit v1.7.1