Browse Source

1、资产、领用、归还、流转记录相关部分接口

dongpo 8 months ago
parent
commit
2fefd49a20
15 changed files with 418 additions and 124 deletions
  1. 29 0
      yudao-module-finance/yudao-module-asset-api/src/main/java/cn/iocoder/yudao/module/asset/enums/AssetReturnStateEnum.java
  2. 7 0
      yudao-module-finance/yudao-module-asset-api/src/main/java/cn/iocoder/yudao/module/asset/enums/ErrorCodeConstants.java
  3. 11 0
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetinfo/AssetInfoController.java
  4. 25 0
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetinfo/vo/AssetInfoRetireReqVO.java
  5. 76 10
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/AssetReceiveInfoController.java
  6. 8 34
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoPageReqVO.java
  7. 42 27
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoRespVO.java
  8. 12 19
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoSaveReqVO.java
  9. 25 0
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoUpdateReqVO.java
  10. 4 14
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/assetreceiveinfo/AssetReceiveInfoMapper.java
  11. 14 0
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetinfo/AssetInfoService.java
  12. 34 0
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetinfo/AssetInfoServiceImpl.java
  13. 7 6
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetreceiveinfo/AssetReceiveInfoService.java
  14. 120 14
      yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetreceiveinfo/AssetReceiveInfoServiceImpl.java
  15. 4 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/api/info/EmployeeApiImpl.java

+ 29 - 0
yudao-module-finance/yudao-module-asset-api/src/main/java/cn/iocoder/yudao/module/asset/enums/AssetReturnStateEnum.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.asset.enums;
+
+public enum AssetReturnStateEnum {
+    /**
+     * 0未归还
+     */
+    NOT_RETURNED(0, "未归还"),
+    /**
+     * 1已归还
+     */
+    RETURNED(1, "已归还"),
+    ;
+
+    private final Integer state;
+    private final String desc;
+
+    AssetReturnStateEnum(Integer state, String desc) {
+        this.state = state;
+        this.desc = desc;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 7 - 0
yudao-module-finance/yudao-module-asset-api/src/main/java/cn/iocoder/yudao/module/asset/enums/ErrorCodeConstants.java

@@ -7,7 +7,14 @@ public interface ErrorCodeConstants {
     // ========== 固定资产信息 1_051_001_001 ==========
     ErrorCode INFO_NOT_EXISTS = new ErrorCode(1_051_001_001, "固定资产信息不存在");
     ErrorCode OCCUPIED_ASSET_NOT_ALLOWED_DELETE = new ErrorCode(1_051_001_002, "该资产已被占用,不允许删除");
+    ErrorCode ASSET_INFO_NOT_AVAILABLE = new ErrorCode(1_051_001_003, "该资产不是可用状态,无法领用");
+    ErrorCode ASSET_INFO_NOT_OCCUPIED = new ErrorCode(1_051_001_004, "该资产不是占用状态,无需归还");
 
     // ========== 固定资产领用信息 1_051_002_001 ==========
     ErrorCode RECEIVE_INFO_NOT_EXISTS = new ErrorCode(1_051_002_001, "固定资产领用信息不存在");
+    ErrorCode ASSET_RECEIVE_EMPLOYEE_NOT_NULL = new ErrorCode(1_051_002_002, "领用人不能为空");
+    ErrorCode ASSET_RECEIVE_DATE_NOT_BLANK = new ErrorCode(1_051_002_003, "领用日期不能为空");
+    ErrorCode ASSET_RECEIVE_REASON_NOT_BLANK = new ErrorCode(1_051_002_004, "领用原因不能为空");
+    ErrorCode ASSET_RETURN_DATE_NOT_BLANK = new ErrorCode(1_051_002_005, "归还日期不能为空");
+    ErrorCode ASSET_RETURN_REASON_NOT_BLANK = new ErrorCode(1_051_002_006, "归还原因不能为空");
 }

+ 11 - 0
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetinfo/AssetInfoController.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoPageReqVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoRespVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoRetireReqVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoSaveReqVO;
 import cn.iocoder.yudao.module.asset.dal.dataobject.assetinfo.AssetInfoDO;
 import cn.iocoder.yudao.module.asset.enums.AssetStateEnum;
@@ -141,4 +142,14 @@ public class AssetInfoController {
                 list);
     }
 
+    @PostMapping("/retire")
+    @Operation(summary = "报废固定资产信息")
+    @ApiOperationSupport(order = 7)
+    // @PreAuthorize("@ss.hasPermission('asset:info:delete')")
+    public CommonResult<Boolean> retireInfo(@Valid @RequestBody AssetInfoRetireReqVO retireReqVO) {
+        infoService.retireInfo(retireReqVO);
+        return success(true);
+    }
+
+
 }

+ 25 - 0
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetinfo/vo/AssetInfoRetireReqVO.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 固定资产信息报废 Request VO")
+@Data
+public class AssetInfoRetireReqVO {
+
+    @Schema(description = "资产信息主键自增id",requiredMode = Schema.RequiredMode.REQUIRED,example = "1")
+    @NotNull(message = "资产信息主键自增id不能为空")
+    private Long id;
+
+    @Schema(description = "报废日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-08-08")
+    @NotBlank(message = "报废日期不能为空")
+    private String retirementDate;
+
+    @Schema(description = "报废原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "报废原因不能为空")
+    @NotBlank(message = "报废原因不能为空")
+    private String retirementReason;
+
+}

+ 76 - 10
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/AssetReceiveInfoController.java

@@ -4,17 +4,27 @@ import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoPageReqVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoRespVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoSaveReqVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoUpdateReqVO;
 import cn.iocoder.yudao.module.asset.dal.dataobject.assetreceiveinfo.AssetReceiveInfoDO;
+import cn.iocoder.yudao.module.asset.enums.AssetReturnStateEnum;
 import cn.iocoder.yudao.module.asset.service.assetreceiveinfo.AssetReceiveInfoService;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.PostApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springdoc.api.annotations.ParameterObject;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -22,12 +32,16 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
-@Tag(name = "管理后台 - 固定资产领用信息")
+@Tag(name = "管理后台 - 固定资产领用、归还信息")
 @RestController
 @RequestMapping("/asset/receive-info")
 @Validated
@@ -36,8 +50,17 @@ public class AssetReceiveInfoController {
     @Resource
     private AssetReceiveInfoService receiveInfoService;
 
+    @Resource
+    private EmployeeApi employeeApi;
+
+    @Resource
+    private DeptApi deptApi;
+
+    @Resource
+    private PostApi postApi;
+
     @PostMapping("/create")
-    @Operation(summary = "创建固定资产领用信息")
+    @Operation(summary = "领用固定资产")
     @ApiOperationSupport(order = 1)
     // @PreAuthorize("@ss.hasPermission('asset:receive-info:create')")
     public CommonResult<Long> createReceiveInfo(@Valid @RequestBody AssetReceiveInfoSaveReqVO createReqVO) {
@@ -45,17 +68,17 @@ public class AssetReceiveInfoController {
     }
 
     @PutMapping("/update")
-    @Operation(summary = "更新固定资产领用信息")
+    @Operation(summary = "归还固定资产")
     @ApiOperationSupport(order = 2)
     // @PreAuthorize("@ss.hasPermission('asset:receive-info:update')")
-    public CommonResult<Boolean> updateReceiveInfo(@Valid @RequestBody AssetReceiveInfoSaveReqVO updateReqVO) {
+    public CommonResult<Boolean> updateReceiveInfo(@Valid @RequestBody AssetReceiveInfoUpdateReqVO updateReqVO) {
         receiveInfoService.updateReceiveInfo(updateReqVO);
         return success(true);
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "删除固定资产领用信息")
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 4)
     @Parameter(name = "id", description = "编号", required = true)
     // @PreAuthorize("@ss.hasPermission('asset:receive-info:delete')")
     public CommonResult<Boolean> deleteReceiveInfo(@RequestParam("id") Long id) {
@@ -65,7 +88,7 @@ public class AssetReceiveInfoController {
 
     @GetMapping("/get")
     @Operation(summary = "获得固定资产领用信息")
-    @ApiOperationSupport(order = 4)
+    @ApiOperationSupport(order = 5)
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     // @PreAuthorize("@ss.hasPermission('asset:receive-info:query')")
     public CommonResult<AssetReceiveInfoRespVO> getReceiveInfo(@RequestParam("id") Long id) {
@@ -74,12 +97,55 @@ public class AssetReceiveInfoController {
     }
 
     @GetMapping("/page")
-    @Operation(summary = "获得固定资产领用信息分页")
-    @ApiOperationSupport(order = 5)
+    @Operation(summary = "获得固定资产流转分页信息")
+    @ApiOperationSupport(order = 3)
     // @PreAuthorize("@ss.hasPermission('asset:receive-info:query')")
-    public CommonResult<PageResult<AssetReceiveInfoRespVO>> getReceiveInfoPage(@Valid AssetReceiveInfoPageReqVO pageReqVO) {
+    public CommonResult<PageResult<AssetReceiveInfoRespVO>> getReceiveInfoPage(@Valid @ParameterObject AssetReceiveInfoPageReqVO pageReqVO) {
         PageResult<AssetReceiveInfoDO> pageResult = receiveInfoService.getReceiveInfoPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, AssetReceiveInfoRespVO.class));
+        PageResult<AssetReceiveInfoRespVO> voPageResult = BeanUtils.toBean(pageResult, AssetReceiveInfoRespVO.class);
+        List<AssetReceiveInfoRespVO> list = voPageResult.getList();
+
+        // 领用人信息
+        Set<Long> employeeIdSet = list.stream().map(AssetReceiveInfoRespVO::getEmployeeId).collect(Collectors.toSet());
+        List<EmployeeRespDTO> employeeRespDTOList = employeeApi.getEmployeeListByIds(employeeIdSet);
+        Map<Long, EmployeeRespDTO> employeeMap = CollectionUtils.convertMap(employeeRespDTOList, EmployeeRespDTO::getId);
+        // 领用人部门信息
+        Set<Long> deptIdSet = list.stream().map(AssetReceiveInfoRespVO::getDeptId).collect(Collectors.toSet());
+        List<DeptRespDTO> deptList = deptApi.getDeptList(deptIdSet);
+        Map<Long, DeptRespDTO> deptMap = CollectionUtils.convertMap(deptList, DeptRespDTO::getId);
+        // 领用人职位信息
+        Set<Long> postIdSet = list.stream().map(AssetReceiveInfoRespVO::getPostId).collect(Collectors.toSet());
+        List<PostRespDTO> postList = postApi.getPostList(postIdSet);
+        Map<Long, PostRespDTO> postMap = CollectionUtils.convertMap(postList, PostRespDTO::getId);
+        // 操作人
+        Set<Long> updaterIdSet = list.stream().map(AssetReceiveInfoRespVO::getUpdater).collect(Collectors.toSet());
+        List<EmployeeRespDTO> updaterList = employeeApi.getEmployeeListByIds(updaterIdSet);
+        Map<Long, EmployeeRespDTO> updaterMap = CollectionUtils.convertMap(updaterList, EmployeeRespDTO::getId);
+        // 是否归还
+        Map<Integer, String> returnStateMap = Arrays.stream(AssetReturnStateEnum.values()).collect(Collectors.toMap(AssetReturnStateEnum::getState, AssetReturnStateEnum::getDesc));
+
+        for (AssetReceiveInfoRespVO assetReceiveInfoRespVO : list) {
+            EmployeeRespDTO employeeRespDTO = employeeMap.get(assetReceiveInfoRespVO.getEmployeeId());
+            if (employeeRespDTO != null) {
+                assetReceiveInfoRespVO.setEmployeeName(employeeRespDTO.getName());
+                assetReceiveInfoRespVO.setEmployeePhone(employeeRespDTO.getPhone());
+            }
+            DeptRespDTO deptRespDTO = deptMap.get(assetReceiveInfoRespVO.getDeptId());
+            if (deptRespDTO != null) {
+                assetReceiveInfoRespVO.setDeptName(deptRespDTO.getName());
+            }
+            PostRespDTO postRespDTO = postMap.get(assetReceiveInfoRespVO.getPostId());
+            if (postRespDTO != null) {
+                assetReceiveInfoRespVO.setPosition(postRespDTO.getName());
+            }
+            EmployeeRespDTO updaterRespDTO = updaterMap.get(assetReceiveInfoRespVO.getUpdater());
+            if (updaterRespDTO != null) {
+                assetReceiveInfoRespVO.setOperatorName(updaterRespDTO.getName());
+            }
+            String returnStateDesc = returnStateMap.getOrDefault(assetReceiveInfoRespVO.getReturned(), "未知");
+            assetReceiveInfoRespVO.setReturnedDesc(returnStateDesc);
+        }
+        return success(voPageResult);
     }
 
     @GetMapping("/export-excel")

+ 8 - 34
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoPageReqVO.java

@@ -1,13 +1,12 @@
 package cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo;
 
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import org.springframework.format.annotation.DateTimeFormat;
-import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+import javax.validation.constraints.NotNull;
 
 @Schema(description = "管理后台 - 固定资产领用信息分页 Request VO")
 @Data
@@ -15,33 +14,8 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @ToString(callSuper = true)
 public class AssetReceiveInfoPageReqVO extends PageParam {
 
-    @Schema(description = "领用人id", example = "4857")
-    private Long employeeId;
-
-    @Schema(description = "部门id", example = "4527")
-    private Long deptId;
-
-    @Schema(description = "职位id", example = "13139")
-    private Long postId;
-
-    @Schema(description = "固定资产名称", example = "张三")
-    private String assetInfoName;
-
-    @Schema(description = "领用日期")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private String[] receiveDate;
-
-    @Schema(description = "是否归还:0未归还,1已归还")
-    private Integer returned;
-
-    @Schema(description = "归还日期")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private String[] returnDate;
-
-    @Schema(description = "数据来源,0流程添加、1手动添加")
-    private String infoSource;
-
-    @Schema(description = "创建者")
-    private String creator;
+    @Schema(description = "固定资产信息表主键id")
+    @NotNull(message = "领用资产不能为空")
+    private Long assetInfoId;
 
 }

+ 42 - 27
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoRespVO.java

@@ -1,41 +1,56 @@
 package cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import java.util.*;
-import com.alibaba.excel.annotation.*;
+import lombok.Data;
 
 @Schema(description = "管理后台 - 固定资产领用信息 Response VO")
 @Data
 @ExcelIgnoreUnannotated
 public class AssetReceiveInfoRespVO {
 
-    @Schema(description = "主键自增id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28086")
+    @Schema(description = "主键自增id")
     @ExcelProperty("主键自增id")
     private Long id;
 
-    @Schema(description = "领用编号uuid", example = "15552")
+    @Schema(description = "领用编号uuid")
     @ExcelProperty("领用编号uuid")
     private String receiveInfoUuid;
 
-    @Schema(description = "领用人id", example = "4857")
+    @Schema(description = "领用人id")
     @ExcelProperty("领用人id")
     private Long employeeId;
 
-    @Schema(description = "部门id", example = "4527")
+    @Schema(description = "领用人姓名")
+    @ExcelProperty("领用人姓名")
+    private String employeeName;
+
+    @Schema(description = "领用人手机号")
+    @ExcelProperty("领用人手机号")
+    private String employeePhone;
+
+    @Schema(description = "部门id")
     @ExcelProperty("部门id")
     private Long deptId;
 
-    @Schema(description = "职位id", example = "13139")
+    @Schema(description = "部门名称")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+    @Schema(description = "职位id")
     @ExcelProperty("职位id")
     private Long postId;
 
-    @Schema(description = "固定资产信息表主键id", example = "23094")
+    @Schema(description = "职位名称")
+    @ExcelProperty("职位名称")
+    private String position;
+
+    @Schema(description = "固定资产信息表主键id")
     @ExcelProperty("固定资产信息表主键id")
     private Long assetInfoId;
 
-    @Schema(description = "固定资产名称", example = "张三")
+    @Schema(description = "固定资产名称")
     @ExcelProperty("固定资产名称")
     private String assetInfoName;
 
@@ -43,36 +58,36 @@ public class AssetReceiveInfoRespVO {
     @ExcelProperty("领用日期")
     private String receiveDate;
 
-    @Schema(description = "领用原因", example = "不喜欢")
+    @Schema(description = "领用原因")
     @ExcelProperty("领用原因")
     private String reason;
 
-    @Schema(description = "是否归还:0未归还,1已归还", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "是否归还:0未归还,1已归还")
     @ExcelProperty("是否归还:0未归还,1已归还")
     private Integer returned;
 
+    @Schema(description = "是否归还描述:0未归还,1已归还")
+    @ExcelProperty("是否归还描述:0未归还,1已归还")
+    private String returnedDesc;
+
     @Schema(description = "归还日期")
     @ExcelProperty("归还日期")
     private String returnDate;
 
-    @Schema(description = "归还原因", example = "不喜欢")
+    @Schema(description = "归还原因")
     @ExcelProperty("归还原因")
     private String returnReason;
 
-    @Schema(description = "数据来源,0流程添加、1手动添加")
-    @ExcelProperty("数据来源,0流程添加、1手动添加")
-    private String infoSource;
-
-    @Schema(description = "单据状态:0:已完成,1:作废", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @ExcelProperty("单据状态:0:已完成,1:作废")
-    private String status;
-
-    @Schema(description = "备注")
-    @ExcelProperty("备注")
-    private String remarks;
-
     @Schema(description = "创建者")
     @ExcelProperty("创建者")
-    private String creator;
+    private Long creator;
+
+    @Schema(description = "更新者")
+    @ExcelProperty("更新者")
+    private Long updater;
+
+    @Schema(description = "操作人姓名")
+    @ExcelProperty("操作人姓名")
+    private String operatorName;
 
 }

+ 12 - 19
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoSaveReqVO.java

@@ -1,36 +1,29 @@
 package cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import javax.validation.constraints.*;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 
 @Schema(description = "管理后台 - 固定资产领用信息新增/修改 Request VO")
 @Data
 public class AssetReceiveInfoSaveReqVO {
 
-    @Schema(description = "主键自增id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28086")
-    private Long id;
-
-    @Schema(description = "领用人id", example = "4857")
+    @Schema(description = "领用人id", example = "1")
+    @NotNull(message = "领用人不能为空")
     private Long employeeId;
 
-    @Schema(description = "固定资产信息表主键id", example = "23094")
+    @Schema(description = "固定资产信息表主键id", example = "1")
+    @NotNull(message = "领用资产不能为空")
     private Long assetInfoId;
 
-    @Schema(description = "领用日期")
+    @Schema(description = "领用日期", example = "2024-08-09")
+    @NotBlank(message = "领用日期不能为空")
     private String receiveDate;
 
-    @Schema(description = "领用原因", example = "不喜欢")
+    @Schema(description = "领用原因", example = "领用时领用原因不能为空")
+    @NotBlank(message = "领用原因不能为空")
     private String reason;
 
-    @Schema(description = "归还日期")
-    private String returnDate;
-
-    @Schema(description = "归还原因", example = "不喜欢")
-    private String returnReason;
-
-    @Schema(description = "备注")
-    private String remarks;
-
 }

+ 25 - 0
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/controller/admin/assetreceiveinfo/vo/AssetReceiveInfoUpdateReqVO.java

@@ -0,0 +1,25 @@
+package cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 固定资产归还 Request VO")
+@Data
+public class AssetReceiveInfoUpdateReqVO {
+
+    @Schema(description = "固定资产信息表主键id", example = "1")
+    @NotNull(message = "领用资产不能为空")
+    private Long assetInfoId;
+
+    @Schema(description = "归还日期", example = "2024-09-09")
+    @NotBlank(message = "归还日期不能为空")
+    private String returnDate;
+
+    @Schema(description = "归还原因", example = "归还时归还原因不能为空")
+    @NotBlank(message = "归还原因不能为空")
+    private String returnReason;
+
+}

+ 4 - 14
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/dal/mysql/assetreceiveinfo/AssetReceiveInfoMapper.java

@@ -1,13 +1,11 @@
 package cn.iocoder.yudao.module.asset.dal.mysql.assetreceiveinfo;
 
-import java.util.*;
-
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoPageReqVO;
 import cn.iocoder.yudao.module.asset.dal.dataobject.assetreceiveinfo.AssetReceiveInfoDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.*;
 
 /**
  * 固定资产领用信息 Mapper
@@ -19,16 +17,8 @@ public interface AssetReceiveInfoMapper extends BaseMapperX<AssetReceiveInfoDO>
 
     default PageResult<AssetReceiveInfoDO> selectPage(AssetReceiveInfoPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<AssetReceiveInfoDO>()
-                .eqIfPresent(AssetReceiveInfoDO::getEmployeeId, reqVO.getEmployeeId())
-                .eqIfPresent(AssetReceiveInfoDO::getDeptId, reqVO.getDeptId())
-                .eqIfPresent(AssetReceiveInfoDO::getPostId, reqVO.getPostId())
-                .likeIfPresent(AssetReceiveInfoDO::getAssetInfoName, reqVO.getAssetInfoName())
-                .betweenIfPresent(AssetReceiveInfoDO::getReceiveDate, reqVO.getReceiveDate())
-                .eqIfPresent(AssetReceiveInfoDO::getReturned, reqVO.getReturned())
-                .betweenIfPresent(AssetReceiveInfoDO::getReturnDate, reqVO.getReturnDate())
-                .eqIfPresent(AssetReceiveInfoDO::getInfoSource, reqVO.getInfoSource())
-                .eqIfPresent(AssetReceiveInfoDO::getCreator, reqVO.getCreator())
-                .orderByDesc(AssetReceiveInfoDO::getId));
+                .eqIfPresent(AssetReceiveInfoDO::getAssetInfoId, reqVO.getAssetInfoId())
+                .orderByAsc(AssetReceiveInfoDO::getId));
     }
 
 }

+ 14 - 0
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetinfo/AssetInfoService.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.asset.service.assetinfo;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoPageReqVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoRespVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoRetireReqVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoSaveReqVO;
 import cn.iocoder.yudao.module.asset.dal.dataobject.assetinfo.AssetInfoDO;
 
@@ -30,6 +31,13 @@ public interface AssetInfoService {
      */
     void updateInfo(@Valid AssetInfoSaveReqVO updateReqVO);
 
+    /**
+     * 更新固定资产信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void availableOrOccupiedAssetInfo(AssetInfoDO updateReqVO);
+
     /**
      * 删除固定资产信息
      *
@@ -53,4 +61,10 @@ public interface AssetInfoService {
      */
     PageResult<AssetInfoRespVO> getInfoPage(AssetInfoPageReqVO pageReqVO);
 
+    /**
+     * 废弃固定资产信息
+     *
+     * @param retireReqVO 报废信息
+     */
+    void retireInfo(AssetInfoRetireReqVO retireReqVO);
 }

+ 34 - 0
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetinfo/AssetInfoServiceImpl.java

@@ -1,12 +1,14 @@
 package cn.iocoder.yudao.module.asset.service.assetinfo;
 
 import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoPageReqVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoRespVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoRetireReqVO;
 import cn.iocoder.yudao.module.asset.controller.admin.assetinfo.vo.AssetInfoSaveReqVO;
 import cn.iocoder.yudao.module.asset.dal.dataobject.assetinfo.AssetInfoDO;
 import cn.iocoder.yudao.module.asset.dal.mysql.assetinfo.AssetInfoMapper;
@@ -15,6 +17,7 @@ import cn.iocoder.yudao.module.asset.enums.AssetStatusEnum;
 import cn.iocoder.yudao.module.employee.api.EmployeeApi;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 import cn.iocoder.yudao.module.infra.api.file.FileApi;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -91,6 +94,18 @@ public class AssetInfoServiceImpl implements AssetInfoService {
         infoMapper.updateById(updateObj);
     }
 
+    @Override
+    public void availableOrOccupiedAssetInfo(AssetInfoDO updateReqVO) {
+        // 校验存在
+        AssetInfoDO assetInfoDO = validateInfoExists(updateReqVO.getId());
+        LambdaUpdateWrapper<AssetInfoDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.set(AssetInfoDO::getAssetState, updateReqVO.getAssetState())
+                .set(AssetInfoDO::getReceiveEmployeeId, updateReqVO.getReceiveEmployeeId())
+                .set(AssetInfoDO::getReceiveInfoId, updateReqVO.getReceiveInfoId())
+                .eq(AssetInfoDO::getId, updateReqVO.getId());
+       infoMapper.update(lambdaUpdateWrapper);
+    }
+
     @Override
     public void deleteInfo(Long id) {
         // 校验存在
@@ -135,4 +150,23 @@ public class AssetInfoServiceImpl implements AssetInfoService {
         return new PageResult<>(pageList, pageCount);
     }
 
+    @Override
+    public void retireInfo(AssetInfoRetireReqVO retireReqVO) {
+        Long id = retireReqVO.getId();
+        AssetInfoDO assetInfoDO = validateInfoExists(id);
+        if (AssetStateEnum.OCCUPIED.getState().equals(assetInfoDO.getAssetState())) {
+            throw exception(new ErrorCode(OCCUPIED_ASSET_NOT_ALLOWED_DELETE.getCode(), "资产正在使用,不能报废"));
+        }
+        if (AssetStateEnum.RETIRED.getState().equals(assetInfoDO.getAssetState())) {
+            throw exception(new ErrorCode(OCCUPIED_ASSET_NOT_ALLOWED_DELETE.getCode(), "资产已报废,不能重复报废"));
+        }
+        AssetInfoDO build = AssetInfoDO.builder()
+                .id(id)
+                .assetState(AssetStateEnum.RETIRED.getState())
+                .retirementDate(retireReqVO.getRetirementDate())
+                .retirementReason(retireReqVO.getRetirementReason())
+                .build();
+        infoMapper.updateById(build);
+    }
+
 }

+ 7 - 6
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetreceiveinfo/AssetReceiveInfoService.java

@@ -1,11 +1,12 @@
 package cn.iocoder.yudao.module.asset.service.assetreceiveinfo;
 
-import java.util.*;
-import javax.validation.*;
-import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.*;
-import cn.iocoder.yudao.module.asset.dal.dataobject.assetreceiveinfo.AssetReceiveInfoDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoPageReqVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoSaveReqVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoUpdateReqVO;
+import cn.iocoder.yudao.module.asset.dal.dataobject.assetreceiveinfo.AssetReceiveInfoDO;
+
+import javax.validation.Valid;
 
 /**
  * 固定资产领用信息 Service 接口
@@ -27,7 +28,7 @@ public interface AssetReceiveInfoService {
      *
      * @param updateReqVO 更新信息
      */
-    void updateReceiveInfo(@Valid AssetReceiveInfoSaveReqVO updateReqVO);
+    void updateReceiveInfo(@Valid AssetReceiveInfoUpdateReqVO updateReqVO);
 
     /**
      * 删除固定资产领用信息

+ 120 - 14
yudao-module-finance/yudao-module-asset-biz/src/main/java/cn/iocoder/yudao/module/asset/service/assetreceiveinfo/AssetReceiveInfoServiceImpl.java

@@ -1,21 +1,33 @@
 package cn.iocoder.yudao.module.asset.service.assetreceiveinfo;
 
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.*;
-import cn.iocoder.yudao.module.asset.dal.dataobject.assetreceiveinfo.AssetReceiveInfoDO;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoPageReqVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoSaveReqVO;
+import cn.iocoder.yudao.module.asset.controller.admin.assetreceiveinfo.vo.AssetReceiveInfoUpdateReqVO;
+import cn.iocoder.yudao.module.asset.dal.dataobject.assetinfo.AssetInfoDO;
+import cn.iocoder.yudao.module.asset.dal.dataobject.assetreceiveinfo.AssetReceiveInfoDO;
 import cn.iocoder.yudao.module.asset.dal.mysql.assetreceiveinfo.AssetReceiveInfoMapper;
+import cn.iocoder.yudao.module.asset.enums.AssetReturnStateEnum;
+import cn.iocoder.yudao.module.asset.enums.AssetStateEnum;
+import cn.iocoder.yudao.module.asset.service.assetinfo.AssetInfoService;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.asset.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
 
 /**
  * 固定资产领用信息 Service 实现类
@@ -29,22 +41,114 @@ public class AssetReceiveInfoServiceImpl implements AssetReceiveInfoService {
     @Resource
     private AssetReceiveInfoMapper receiveInfoMapper;
 
+    @Resource
+    private AssetInfoService assetInfoService;
+
+    @Resource
+    private EmployeeApi employeeApi;
+
+    @Resource
+    private DeptApi deptApi;
+
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long createReceiveInfo(AssetReceiveInfoSaveReqVO createReqVO) {
+        // 登录人
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        EmployeeRespDTO loginEmployee = employeeApi.getEmployeeByUserId(loginUserId);
+        if (Objects.isNull(loginEmployee)) {
+            throw exception(new ErrorCode(EMPLOYEE_INFO_NOT_EXISTS.getCode(), "当前登录人员无员工信息"));
+        }
+        Long assetInfoId = createReqVO.getAssetInfoId();
+        AssetInfoDO assetInfoDO = assetInfoService.getInfo(assetInfoId);
+        if (Objects.isNull(assetInfoDO)) {
+            throw exception(INFO_NOT_EXISTS);
+        }
+        if (!AssetStateEnum.AVAILABLE.getState().equals(assetInfoDO.getAssetState())) {
+            throw exception(ASSET_INFO_NOT_AVAILABLE);
+        }
+        Long employeeId = createReqVO.getEmployeeId();
+        if (Objects.isNull(employeeId)) {
+            throw exception(ASSET_RECEIVE_EMPLOYEE_NOT_NULL);
+        }
+        String receiveDate = createReqVO.getReceiveDate();
+        if (StrUtil.isBlank(receiveDate)) {
+            throw exception(ASSET_RECEIVE_DATE_NOT_BLANK);
+        }
+        if (StrUtil.isBlank(createReqVO.getReason())) {
+            throw exception(ASSET_RECEIVE_REASON_NOT_BLANK);
+        }
         // 插入
         AssetReceiveInfoDO receiveInfo = BeanUtils.toBean(createReqVO, AssetReceiveInfoDO.class);
+        // uuid
+        receiveInfo.setReceiveInfoUuid(IdUtil.fastSimpleUUID());
+        // 资产名称
+        receiveInfo.setAssetInfoName(assetInfoDO.getName());
+        // 未归还
+        receiveInfo.setReturned(AssetReturnStateEnum.NOT_RETURNED.getState());
+        // 创建人
+        receiveInfo.setCreator(String.valueOf(loginEmployee.getId()));
+        // 操作人
+        receiveInfo.setUpdater(String.valueOf(loginEmployee.getId()));
+        // 部门
+        receiveInfo.setDeptId(loginEmployee.getDeptId());
+        // 职位
+        receiveInfo.setPostId(loginEmployee.getPostId());
         receiveInfoMapper.insert(receiveInfo);
+
+        // 领用成功后修改资产状态
+        AssetInfoDO build = AssetInfoDO.builder()
+                .id(assetInfoId)
+                .receiveEmployeeId(receiveInfo.getEmployeeId())
+                .receiveInfoId(receiveInfo.getId())
+                .assetState(AssetStateEnum.OCCUPIED.getState())
+                .build();
+        assetInfoService.availableOrOccupiedAssetInfo(build);
         // 返回
         return receiveInfo.getId();
     }
 
     @Override
-    public void updateReceiveInfo(AssetReceiveInfoSaveReqVO updateReqVO) {
+    public void updateReceiveInfo(AssetReceiveInfoUpdateReqVO updateReqVO) {
+        Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
+        EmployeeRespDTO loginEmployee = employeeApi.getEmployeeByUserId(loginUserId);
+
+        AssetInfoDO assetInfoDO = assetInfoService.getInfo(updateReqVO.getAssetInfoId());
+        if (Objects.isNull(assetInfoDO)) {
+            throw exception(INFO_NOT_EXISTS);
+        }
+        if (!AssetStateEnum.OCCUPIED.getState().equals(assetInfoDO.getAssetState())) {
+            throw exception(ASSET_INFO_NOT_OCCUPIED);
+        }
+
+        Long receiveInfoId = assetInfoDO.getReceiveInfoId();
         // 校验存在
-        validateReceiveInfoExists(updateReqVO.getId());
+        AssetReceiveInfoDO assetReceiveInfoDO = validateReceiveInfoExists(receiveInfoId);
+        String returnDate = updateReqVO.getReturnDate();
+        if (StrUtil.isBlank(returnDate)) {
+            throw exception(ASSET_RETURN_DATE_NOT_BLANK);
+        }
+        String returnReason = updateReqVO.getReturnReason();
+        if (StrUtil.isBlank(returnReason)) {
+            throw exception(ASSET_RETURN_REASON_NOT_BLANK);
+        }
         // 更新
         AssetReceiveInfoDO updateObj = BeanUtils.toBean(updateReqVO, AssetReceiveInfoDO.class);
+        // 已归还
+        updateObj.setReturned(AssetReturnStateEnum.RETURNED.getState());
+        // 操作人
+        updateObj.setUpdater(String.valueOf(loginEmployee.getId()));
+        updateObj.setId(receiveInfoId);
         receiveInfoMapper.updateById(updateObj);
+
+        // 更新对应资产状态为可用,同时置空领用信息
+        AssetInfoDO build = AssetInfoDO.builder()
+                .id(assetInfoDO.getId())
+                .assetState(AssetStateEnum.AVAILABLE.getState())
+                .receiveEmployeeId(null)
+                .receiveInfoId(null)
+                .build();
+        assetInfoService.availableOrOccupiedAssetInfo(build);
     }
 
     @Override
@@ -55,10 +159,12 @@ public class AssetReceiveInfoServiceImpl implements AssetReceiveInfoService {
         receiveInfoMapper.deleteById(id);
     }
 
-    private void validateReceiveInfoExists(Long id) {
-        if (receiveInfoMapper.selectById(id) == null) {
+    private AssetReceiveInfoDO validateReceiveInfoExists(Long id) {
+        AssetReceiveInfoDO assetReceiveInfoDO = receiveInfoMapper.selectById(id);
+        if (assetReceiveInfoDO == null) {
             throw exception(RECEIVE_INFO_NOT_EXISTS);
         }
+        return assetReceiveInfoDO;
     }
 
     @Override

+ 4 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/api/info/EmployeeApiImpl.java

@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.util.Collection;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 员工 API 实现类
@@ -46,6 +47,9 @@ public class EmployeeApiImpl implements EmployeeApi {
     @Override
     public EmployeeRespDTO getEmployeeByUserId(Long userId) {
         EmployeeInfoDO employeeInfoDO = infoService.getEmployeeByUserId(userId);
+        if (Objects.isNull(employeeInfoDO)) {
+            return null;
+        }
         EmployeeRespDTO employeeRespDTO = BeanUtils.toBean(employeeInfoDO, EmployeeRespDTO.class);
 
         // 根据员工ID查询员工当前的合同信息