From 1093b185322515aebcccee208018346e7f9edbb3 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期二, 14 十月 2025 16:51:25 +0800
Subject: [PATCH] 资产盘点任务接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java                   |   89 +++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetInventoryTaskService.java          |   13 +
 ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml                           |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java     |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTaskItem.java               |    8 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetInventoryTaskController.java    |   23 ++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairRecordAddDTO.java          |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetInventoryTaskStatusEnum.java         |   24 +++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryTaskItemUpdateDTO.java  |   32 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryUserUpdateDTO.java      |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainInventoryVO.java              |   24 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetInventoryTaskServiceImpl.java |  140 ++++++++++++++++
 ruoyi-system/src/main/resources/mapper/system/AssetInventoryTaskMapper.xml                  |   46 +++-
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTask.java                   |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/query/InventoryTaskQuery.java                   |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java           |    2 
 17 files changed, 384 insertions(+), 39 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetInventoryTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetInventoryTaskController.java
index e79f2e8..8739ae6 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetInventoryTaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetInventoryTaskController.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.dto.asset.AssetInventoryTaskDTO;
 import com.ruoyi.system.dto.asset.AssetInventoryTaskItemDTO;
+import com.ruoyi.system.dto.asset.AssetInventoryTaskItemUpdateDTO;
 import com.ruoyi.system.dto.asset.AssetInventoryUserUpdateDTO;
 import com.ruoyi.system.query.AssertInventoryQuery;
 import com.ruoyi.system.query.InventoryTaskQuery;
@@ -114,7 +115,7 @@
 
     @ApiOperation("开始盘点")
     @GetMapping("/start/{id}")
-    public R<?> start( @ApiParam(name = "id", value = "盘点任务ID", required = true)
+    public R<?> start(@ApiParam(name = "id", value = "盘点任务ID", required = true)
                            @PathVariable Integer id){
         assetInventoryTaskService.start(id);
         return R.ok();
@@ -132,9 +133,27 @@
 
     @ApiOperation("盘点结果处理")
     @PostMapping("/result")
-    public R<?> handleResult(@RequestBody List<AssetInventoryTaskItemDTO> dtoList) {
+    public R<?> handleResult(@Valid @RequestBody List<AssetInventoryTaskItemDTO> dtoList) {
         assetInventoryTaskService.handleResult(dtoList);
         return R.ok();
     }
+
+    @ApiOperation("取消盘点")
+    @PostMapping("/cancel/{id}")
+    public R<?> cancel (@ApiParam(name = "id", value = "盘点任务ID", required = true)
+                            @PathVariable Integer id){
+        if (assetInventoryTaskService.cancel(id)) {
+            return R.ok();
+        } else {
+            return R.fail("取消失败");
+        }
+    }
+
+    @ApiOperation("保存盘点")
+    @PostMapping("/save")
+    public R<?> saveInventory(@Valid @RequestBody List<AssetInventoryTaskItemUpdateDTO> dtoList) {
+        assetInventoryTaskService.saveInventory(dtoList);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java
index 0d9bfda..84275e7 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java
@@ -5,7 +5,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.constants.AssetDeptConstant;
-import com.ruoyi.system.dto.AssetRepairRecordAddDTO;
+import com.ruoyi.system.dto.asset.AssetRepairRecordAddDTO;
 import com.ruoyi.system.dto.asset.AssetRepairCompleteDTO;
 import com.ruoyi.system.query.AssetRepairRecordPageQuery;
 import com.ruoyi.system.service.AssetRepairRecordService;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryTaskItemUpdateDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryTaskItemUpdateDTO.java
new file mode 100644
index 0000000..3eaf942
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryTaskItemUpdateDTO.java
@@ -0,0 +1,32 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author mitao
+ * @date 2025/10/13
+ */
+@Data
+@ApiModel("保存盘点数据传输对象")
+public class AssetInventoryTaskItemUpdateDTO {
+
+    @ApiModelProperty("盘点任务关联表ID")
+    @NotNull(message = "盘点任务关联表ID不能为空")
+    private Integer assetInventoryTaskItemId;
+
+    @ApiModelProperty(value = "盘点结果 0-未盘点,1-正常,2-异常")
+    private Integer resultStatus;
+
+    @ApiModelProperty(value = "实存部门名称")
+    private String realDeptName;
+
+    @ApiModelProperty(value = "实存使用人")
+    private String realUserName;
+
+    @ApiModelProperty(value = "异常说明")
+    private String exceptionExplain;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryUserUpdateDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryUserUpdateDTO.java
index 9709b6f..399cf38 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryUserUpdateDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetInventoryUserUpdateDTO.java
@@ -4,8 +4,10 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 修改盘点人DTO
@@ -24,8 +26,8 @@
     private Integer taskId;
 
     @ApiModelProperty("资产ID")
-    @NotNull(message = "资产ID不能为空")
-    private Integer assetId;
+    @NotEmpty(message = "资产ID列表不能为空")
+    private List<Integer> assetIds;
 
     @ApiModelProperty("用户ID")
     @NotNull(message = "用户ID不能为空")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/AssetRepairRecordAddDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairRecordAddDTO.java
similarity index 98%
rename from ruoyi-system/src/main/java/com/ruoyi/system/dto/AssetRepairRecordAddDTO.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairRecordAddDTO.java
index f3fd8a7..8f6c3d3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/AssetRepairRecordAddDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairRecordAddDTO.java
@@ -1,4 +1,4 @@
-package com.ruoyi.system.dto;
+package com.ruoyi.system.dto.asset;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetInventoryTaskStatusEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetInventoryTaskStatusEnum.java
new file mode 100644
index 0000000..da4fbee
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/emums/AssetInventoryTaskStatusEnum.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.emums;
+
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum AssetInventoryTaskStatusEnum {
+	NOT_STARTED(0, "未开始"),
+	IN_PROGRESS(1, "进行中"),
+	COMPLETED(2, "已完成"),
+	CANCELED(3, "已取消");
+
+	private final Integer code;
+	private final String desc;
+
+	public static AssetInventoryTaskStatusEnum getEnumByCode(Integer code) {
+		for (AssetInventoryTaskStatusEnum e : AssetInventoryTaskStatusEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTask.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTask.java
index 5ce2a1d..f71d1bc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTask.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTask.java
@@ -49,8 +49,8 @@
     @ApiModelProperty(value = "盘点日期")
     @TableField("execute_date")
     private LocalDate executeDate;
-
-    @ApiModelProperty(value = "盘点状态 0-未开始,1-进行中,2-已完成")
+//0:未开始;1:进行中;2:已完成;3:已取消;
+    @ApiModelProperty(value = "盘点状态 0-未开始,1-进行中,2-已完成, 3-已取消")
     @TableField("status")
     private Integer status;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTaskItem.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTaskItem.java
index 62c122f..bda959e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTaskItem.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetInventoryTaskItem.java
@@ -50,9 +50,13 @@
     @TableField("real_dept_id")
     private Integer realDeptId;
 
+    @ApiModelProperty(value = "实存部门名称")
+    @TableField("real_dept_name")
+    private String realDeptName;
+
     @ApiModelProperty(value = "实存使用人")
-    @TableField("real_user_id")
-    private Integer realUserId;
+    @TableField("real_user_name")
+    private String realUserName;
 
     @ApiModelProperty(value = "异常说明")
     @TableField("exception_explain")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/InventoryTaskQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/InventoryTaskQuery.java
index a77face..3e25899 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/InventoryTaskQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/InventoryTaskQuery.java
@@ -14,7 +14,7 @@
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@ApiModel("资产盘点分页列表query")
+@ApiModel("资产盘点任务分页列表query")
 public class InventoryTaskQuery extends BasePage {
     private static final long serialVersionUID = 5972537443752522968L;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetInventoryTaskService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetInventoryTaskService.java
index 8ba4500..e9ca8e3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetInventoryTaskService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetInventoryTaskService.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.dto.asset.AssetInventoryTaskDTO;
 import com.ruoyi.system.dto.asset.AssetInventoryTaskItemDTO;
+import com.ruoyi.system.dto.asset.AssetInventoryTaskItemUpdateDTO;
 import com.ruoyi.system.dto.asset.AssetInventoryUserUpdateDTO;
 import com.ruoyi.system.model.AssetInventoryTask;
 import com.ruoyi.system.query.AssertInventoryQuery;
@@ -86,4 +87,16 @@
      * @param dtoList
      */
     void handleResult(List<AssetInventoryTaskItemDTO> dtoList);
+
+    /**
+     * 取消盘点
+     * @param id
+     */
+    boolean cancel(Integer id);
+
+    /**
+     * 保存盘点
+     * @param dtoList
+     */
+    void saveInventory(List<AssetInventoryTaskItemUpdateDTO> dtoList);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java
index 0b24b6f..e10b057 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
-import com.ruoyi.system.dto.AssetRepairRecordAddDTO;
+import com.ruoyi.system.dto.asset.AssetRepairRecordAddDTO;
 import com.ruoyi.system.dto.asset.AssetRepairCompleteDTO;
 import com.ruoyi.system.model.AssetRepairRecord;
 import com.ruoyi.system.query.AssetRepairRecordPageQuery;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetInventoryTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetInventoryTaskServiceImpl.java
index d048667..ba48eb4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetInventoryTaskServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetInventoryTaskServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,7 +13,9 @@
 import com.ruoyi.system.constants.AssetDeptConstant;
 import com.ruoyi.system.dto.asset.AssetInventoryTaskDTO;
 import com.ruoyi.system.dto.asset.AssetInventoryTaskItemDTO;
+import com.ruoyi.system.dto.asset.AssetInventoryTaskItemUpdateDTO;
 import com.ruoyi.system.dto.asset.AssetInventoryUserUpdateDTO;
+import com.ruoyi.system.emums.AssetInventoryTaskStatusEnum;
 import com.ruoyi.system.mapper.AssetInventoryTaskMapper;
 import com.ruoyi.system.model.AssetInventoryRecord;
 import com.ruoyi.system.model.AssetInventoryTask;
@@ -208,6 +211,7 @@
         // 1. 查询所有有效的盘点任务,支持筛选条件
         LambdaQueryWrapper<AssetInventoryTask> taskWrapper = new LambdaQueryWrapper<>();
         taskWrapper.eq(AssetInventoryTask::getDisabled, false)
+                .ne(AssetInventoryTask::getStatus, AssetInventoryTaskStatusEnum.CANCELED.getCode())
                    .orderByDesc(AssetInventoryTask::getCreateTime);
         // 按部门筛选
         if (hasNoPermission) {
@@ -399,24 +403,24 @@
         // 3. 查询并更新对应的资产盘点项
         LambdaQueryWrapper<AssetInventoryTaskItem> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(AssetInventoryTaskItem::getInventoryTaskId, dto.getTaskId())
-               .eq(AssetInventoryTaskItem::getAssetMainId, dto.getAssetId());
+               .in(AssetInventoryTaskItem::getAssetMainId, dto.getAssetIds());
 
-        AssetInventoryTaskItem taskItem = assetInventoryTaskItemService.getOne(wrapper);
-        if (taskItem == null) {
+        List<AssetInventoryTaskItem> taskItems = assetInventoryTaskItemService.list(wrapper);
+        if (CollUtil.isEmpty(taskItems)) {
             throw new ServiceException("未找到对应的盘点资产项");
         }
 
         // 4. 更新盘点人
         String currentUserName = SecurityUtils.getLoginUser().getUser().getNickName();
-        taskItem.setUserId(dto.getUserId());
-        boolean updated = assetInventoryTaskItemService.updateById(taskItem);
+        taskItems.forEach(item->item.setUserId(dto.getUserId()));
+        boolean updated = assetInventoryTaskItemService.updateBatchById(taskItems);
 
         if (!updated) {
             throw new ServiceException("修改盘点人失败");
         }
 
         log.info("成功修改盘点人,任务ID:{},资产ID:{},新盘点人ID:{},操作人:{}",
-                dto.getTaskId(), dto.getAssetId(), dto.getUserId(), currentUserName);
+                dto.getTaskId(), dto.getAssetIds(), dto.getUserId(), currentUserName);
     }
 
     /**
@@ -456,6 +460,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void handleResult(List<AssetInventoryTaskItemDTO> dtoList) {
         Map<Integer, Integer> taskItemMap = dtoList.stream()
                 .collect(Collectors.toMap(AssetInventoryTaskItemDTO::getAssetInventoryTaskItemId, AssetInventoryTaskItemDTO::getDeal));
@@ -471,5 +476,128 @@
             }
         }
         assetInventoryTaskItemService.updateBatchById(assetInventoryTaskItems);
+
+        // 更新任务状态为已完成(盘点结果处理完成)
+        if (CollUtil.isNotEmpty(dtoList) && CollUtil.isNotEmpty(assetInventoryTaskItems)) {
+            // 获取任务ID(从第一个盘点项获取)
+            Integer taskId = assetInventoryTaskItems.get(0).getInventoryTaskId();
+            updateTaskStatusToCompleted(taskId);
+        }
+    }
+
+    /**
+     * 直接更新任务状态为已完成
+     *
+     * @param taskId 盘点任务ID
+     */
+    private void updateTaskStatusToCompleted(Integer taskId) {
+        // 参数验证
+        if (taskId == null) {
+            log.warn("任务ID为空,无法更新任务状态");
+            return;
+        }
+
+        // 检查任务是否存在
+        AssetInventoryTask task = this.getById(taskId);
+        if (task == null) {
+            log.warn("任务不存在,任务ID:{}", taskId);
+            return;
+        }
+
+        // 检查任务是否已经是已完成状态
+        if (task.getStatus() != null && task.getStatus().equals(AssetInventoryTaskStatusEnum.COMPLETED.getCode())) {
+            log.debug("任务已经是已完成状态,任务ID:{}", taskId);
+            return;
+        }
+
+        // 更新任务状态为已完成
+        task.setStatus(AssetInventoryTaskStatusEnum.COMPLETED.getCode());
+        task.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+        this.updateById(task);
+        log.info("盘点任务状态更新为已完成,任务ID:{},任务名称:{},操作人:{}",
+                taskId, task.getTaskName(), task.getUpdateBy());
+    }
+
+    @Override
+    public boolean cancel(Integer id) {
+        AssetInventoryTask assetInventoryTask = this.getById(id);
+        if (Objects.nonNull(assetInventoryTask) && !assetInventoryTask.getStatus() .equals(AssetInventoryTaskStatusEnum.COMPLETED.getCode())) {
+            assetInventoryTask.setStatus(AssetInventoryTaskStatusEnum.CANCELED.getCode()); //已取消
+            assetInventoryTask.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+            return this.updateById(assetInventoryTask);
+        }
+        return false;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveInventory(List<AssetInventoryTaskItemUpdateDTO> dtoList) {
+        Map<Integer, AssetInventoryTaskItemUpdateDTO> dtoMap = dtoList.stream()
+                .collect(Collectors.toMap(AssetInventoryTaskItemUpdateDTO::getAssetInventoryTaskItemId, dto -> dto));
+        List<AssetInventoryTaskItem> assetInventoryTaskItems = assetInventoryTaskItemService.listByIds(dtoMap.keySet());
+
+        for (AssetInventoryTaskItem assetInventoryTaskItem : assetInventoryTaskItems) {
+            AssetInventoryTaskItemUpdateDTO dto = dtoMap.get(assetInventoryTaskItem.getId());
+            assetInventoryTaskItem.setResultStatus(dto.getResultStatus());
+            assetInventoryTaskItem.setRealDeptName(dto.getRealDeptName());
+            assetInventoryTaskItem.setRealUserName(dto.getRealUserName());
+            assetInventoryTaskItem.setExceptionExplain(dto.getExceptionExplain());
+        }
+        assetInventoryTaskItemService.updateBatchById(assetInventoryTaskItems);
+
+        // 检查并更新任务状态(保存盘点数据完成)
+        if (CollUtil.isNotEmpty(dtoList) && CollUtil.isNotEmpty(assetInventoryTaskItems)) {
+            // 获取任务ID(从第一个盘点项获取)
+            Integer taskId = assetInventoryTaskItems.get(0).getInventoryTaskId();
+            checkAndUpdateTaskCompletionStatus(taskId);
+        }
+    }
+
+    /**
+     * 检查并更新任务完成状态
+     * 如果任务的所有盘点项都为正常状态,则将任务状态更新为已完成
+     *
+     * @param taskId                  盘点任务ID
+     */
+    private void checkAndUpdateTaskCompletionStatus(Integer taskId) {
+        // 参数验证
+        if (taskId == null) {
+            log.warn("任务ID为空,无法检查任务完成状态");
+            return;
+        }
+
+        // 1. 检查任务是否存在
+        AssetInventoryTask task = this.getById(taskId);
+        if (task == null) {
+            log.warn("任务不存在,任务ID:{}", taskId);
+            return;
+        }
+
+        // 2. 查询任务的所有盘点项
+        LambdaQueryWrapper<AssetInventoryTaskItem> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(AssetInventoryTaskItem::getInventoryTaskId, taskId);
+        List<AssetInventoryTaskItem> allTaskItems = assetInventoryTaskItemService.list(wrapper);
+
+        // 3. 检查是否所有项都已完成且为正常状态(resultStatus = 1)
+        boolean allNormal = !allTaskItems.isEmpty() &&
+                allTaskItems.stream()
+                        .allMatch(item -> item.getResultStatus() != null && item.getResultStatus() == 1);
+
+        // 4. 如果都正常,更新任务状态为已完成
+        if (allNormal) {
+            // 检查任务是否已经是已完成状态
+            if (task.getStatus() != null && !task.getStatus().equals(AssetInventoryTaskStatusEnum.COMPLETED.getCode())) {
+                task.setStatus(AssetInventoryTaskStatusEnum.COMPLETED.getCode());
+                task.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+                this.updateById(task);
+                log.info("盘点任务已完成,任务ID:{},任务名称:{},操作人:{}",
+                        taskId, task.getTaskName(), task.getUpdateBy());
+            } else {
+                log.debug("任务已经是已完成状态,任务ID:{}", taskId);
+            }
+        } else {
+            log.debug("任务未完全完成,跳过状态更新,任务ID:{},盘点项总数:{}",
+                    taskId, allTaskItems.size());
+        }
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java
index 9959fbf..8ad7121 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java
@@ -8,7 +8,7 @@
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.constants.ApprovalApplicationCodePrefix;
-import com.ruoyi.system.dto.AssetRepairRecordAddDTO;
+import com.ruoyi.system.dto.asset.AssetRepairRecordAddDTO;
 import com.ruoyi.system.dto.asset.AssetRepairCompleteDTO;
 import com.ruoyi.system.mapper.AssetRepairRecordMapper;
 import com.ruoyi.system.model.AssetRepairRecord;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainInventoryVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainInventoryVO.java
index a5e79a9..4aea4e3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainInventoryVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainInventoryVO.java
@@ -20,9 +20,11 @@
     @ApiModelProperty(value = "资产ID")
     private Integer id;
 
+    @ApiModelProperty(value = "盘点任务关联表ID")
+    private Integer assetInventoryTaskItemId;
+
     @ApiModelProperty(value = "资产编码")
     private String assetCode;
-
 
     @ApiModelProperty(value = "资产名称")
     private String assetName;
@@ -85,8 +87,23 @@
     @ApiModelProperty(value = "使用部门")
     private String useDeptName;
 
-    @ApiModelProperty(value = "盘点人")
+    @ApiModelProperty(value = "使用部门/位置ID")
+    private Integer useDeptId;
+
+    @ApiModelProperty(value = "仓库ID,关联warehouse表")
+    private Integer warehouseId;
+
+    @ApiModelProperty(value = "仓库名称(冗余字段)")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "所在位置")
+    private String address;
+
+    @ApiModelProperty(value = "使用人")
     private String userName;
+
+    @ApiModelProperty(value = "盘点人")
+    private String checkUserName;
 
     @ApiModelProperty(value = "盘点状态 盘点结果 0-未盘点,1-正常,2-异常 未找到资产")
     private Integer inventoryStatus;
@@ -96,5 +113,8 @@
 
     @ApiModelProperty(value = "实存使用人")
     private String realUserName;
+
+    @ApiModelProperty(value = "异常说明")
+    private String exceptionExplain;
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java
index 03360cc..6ab5d90 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetMainPageVO.java
@@ -6,6 +6,7 @@
 import lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 
 /**
@@ -40,5 +41,93 @@
 
     @ApiModelProperty(value = "使用部门/位置")
     private String useDeptOrLocation;
+
+    @ApiModelProperty(value = "审批申请记录ID")
+    private Integer approvalApplicationId;
+
+    @ApiModelProperty(value = "资产原编码")
+    private String assetOriginalCode;
+
+    @ApiModelProperty(value = "规格型号")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "类别")
+    private String category;
+
+    @ApiModelProperty(value = "资产类别ID,关联asset_type表")
+    private Integer assetTypeId;
+
+    @ApiModelProperty(value = "类别名称(冗余字段)")
+    private String assetCategory;
+
+    @ApiModelProperty(value = "资产主类型:0-通用资产,1-房产资产,2-车辆资产")
+    private Integer assetMainType;
+
+    @ApiModelProperty(value = "计量单位")
+    private String measurementUnit;
+
+    @ApiModelProperty(value = "数量")
+    private Integer quantity;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "总价值(数量*单价)")
+    private BigDecimal totalValue;
+
+    @ApiModelProperty(value = "使用年限(年)")
+    private Integer usefulLife;
+
+    @ApiModelProperty(value = "权属单位/部门ID")
+    private Integer ownershipDeptId;
+
+    @ApiModelProperty(value = "使用人")
+    private String userName;
+
+    @ApiModelProperty(value = "位置类型 0-部门,1-仓库,2-录入地址")
+    private Integer addressType;
+
+    @ApiModelProperty(value = "使用部门/位置ID")
+    private Integer useDeptId;
+
+    @ApiModelProperty(value = "仓库ID,关联warehouse表")
+    private Integer warehouseId;
+
+    @ApiModelProperty(value = "仓库名称(冗余字段)")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "所在位置")
+    private String address;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+    @ApiModelProperty(value = "入账状态")
+    private String accountingStatus;
+
+    @ApiModelProperty(value = "入账时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate accountingDate;
+
+    @ApiModelProperty(value = "会计凭证号")
+    private String accountingVoucherNo;
+
+    @ApiModelProperty(value = "会计科目")
+    private String accountingSubject;
+
+    @ApiModelProperty(value = "入账金额")
+    private BigDecimal accountingAmount;
+
+    @ApiModelProperty(value = "附件URL列表(多个附件使用英文逗号拼接)")
+    private String attachmentUrls;
+
+    @ApiModelProperty(value = "是否被处置")
+    private Integer disposed;
+
+    @ApiModelProperty(value = "是否借用未归还")
+    private Integer borrowed;
+
+    @ApiModelProperty(value = "是否被领用")
+    private Integer inUse;
 }
 
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetInventoryTaskMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetInventoryTaskMapper.xml
index 61d57b7..0c7a40f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetInventoryTaskMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetInventoryTaskMapper.xml
@@ -36,37 +36,45 @@
             am.measurement_unit,
             am.quantity,
             am.unit_price,
-            ( am.quantity * am.unit_price ) AS total_value,
+            am.total_value,
             am.accounting_voucher_no,
             am.accounting_subject,
             am.accounting_status,
             am.accounting_amount,
             am.accounting_date,
             am.asset_status,
-            od.dept_name AS ownership_dept_name,
+            td.dept_name AS ownership_dept_name,
             am.ownership_dept_id,
             am.asset_type_id,
             am.address_type,
+            am.address,
             am.use_dept_id,
             am.warehouse_id,
-            od2.dept_name AS use_dept_name,
-            su.nick_name AS user_name,
+            am.user_name,
+            aw.warehouse_name,
+            td2.dept_name AS use_dept_name,
+            su.nick_name AS check_user_name,
             aiti.result_status AS inventory_status,
             aiti.real_dept_name,
-            aiti.real_user_name
+            aiti.real_user_name,
+            aiti.id AS asset_inventory_task_item_id,
+            aiti.exception_explain
         FROM
             asset_inventory_task_item aiti
         INNER JOIN
             asset_main am ON aiti.asset_main_id = am.id
         LEFT JOIN
-            asset_type at2 ON am.asset_type_id = at.id
+            asset_type at2 ON am.asset_type_id = at2.id
         LEFT JOIN
             asset_type at1 ON at1.id = (CASE WHEN at2.level = 2 THEN at2.parent_id ELSE at2.id END)
         LEFT JOIN
-            sys_dept od ON am.ownership_dept_id = od.dept_id
+            t_dept td ON am.ownership_dept_id = td.id
         LEFT JOIN
             sys_user su ON aiti.user_id = su.user_id
-        LEFT JOIN sys_dept od2 ON am.address_type = 0 AND am.use_dept_id = od2.id
+        LEFT JOIN
+            t_dept td2 ON am.address_type = 0 AND am.use_dept_id = td2.id
+        LEFT JOIN
+            asset_warehouse aw ON am.address_type = 1 AND am.warehouse_id = aw.id
         WHERE
             aiti.inventory_task_id = #{taskId}
         ORDER BY
@@ -99,24 +107,29 @@
         am.measurement_unit,
         am.quantity,
         am.unit_price,
-        ( am.quantity * am.unit_price ) AS total_value,
+        am.total_value,
         am.accounting_voucher_no,
         am.accounting_subject,
         am.accounting_status,
         am.accounting_amount,
         am.accounting_date,
         am.asset_status,
-        od.dept_name AS ownership_dept_name,
+        td.dept_name AS ownership_dept_name,
         am.ownership_dept_id,
         am.asset_type_id,
         am.address_type,
+        am.address,
         am.use_dept_id,
         am.warehouse_id,
-        od2.dept_name AS use_dept_name,
-        su.nick_name AS user_name,
+        am.user_name,
+        aw.warehouse_name,
+        td2.dept_name AS use_dept_name,
+        su.nick_name AS check_user_name,
         aiti.result_status AS inventory_status,
         aiti.real_dept_name,
-        aiti.real_user_name
+        aiti.real_user_name,
+        aiti.id AS asset_inventory_task_item_id,
+        aiti.exception_explain
         FROM
         asset_inventory_task_item aiti
         INNER JOIN
@@ -124,10 +137,13 @@
         LEFT JOIN
         asset_type at ON am.asset_type_id = at.id
         LEFT JOIN
-        sys_dept od ON am.ownership_dept_id = od.dept_id
+        t_dept td ON am.ownership_dept_id = td.id
         LEFT JOIN
         sys_user su ON aiti.user_id = su.user_id
-        LEFT JOIN sys_dept od2 ON am.address_type = 0 AND am.use_dept_id = od2.id
+        LEFT JOIN
+            t_dept td2 ON am.address_type = 0 AND am.use_dept_id = td2.id
+        LEFT JOIN
+            asset_warehouse aw ON am.address_type = 1 AND am.warehouse_id = aw.id
         <where>
             aiti.inventory_task_id = #{query.id}
             <if test="query.keyword != null and query.keyword != ''">
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
index 5ecaeba..5b99324 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
@@ -100,9 +100,7 @@
     </select>
     <select id="getAssetPageList" resultType="com.ruoyi.system.vo.asset.AssetMainPageVO">
         SELECT
-        am.id AS id,
-        am.asset_code AS assetCode,
-        am.asset_name AS assetName,
+        am.*,
         at.type_name AS assetTypeName,
         od.dept_name AS ownershipDeptName,
         am.asset_status AS assetStatus,

--
Gitblit v1.7.1