mitao
2 天以前 6365012e69b76d2a7804f5a462745f09a5fa0105
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.ruoyi.system.service.impl;
 
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TDept;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.dto.asset.AddInventoryTaskDTO;
import com.ruoyi.system.mapper.AssetInventoryTaskMapper;
import com.ruoyi.system.mapper.TDeptMapper;
import com.ruoyi.system.model.AssetInventoryTask;
import com.ruoyi.system.model.AssetInventoryTaskItem;
import com.ruoyi.system.query.AssertInventoryQuery;
import com.ruoyi.system.service.AssetInventoryTaskItemService;
import com.ruoyi.system.service.AssetInventoryTaskService;
import com.ruoyi.system.vo.asset.AssetInventoryTaskVO;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 盘点任务表 服务实现类
 * </p>
 *
 * @author WuGuanFengYue
 * @since 2025-09-15
 */
@Service
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class AssetInventoryTaskServiceImpl extends ServiceImpl<AssetInventoryTaskMapper, AssetInventoryTask> implements AssetInventoryTaskService {
 
    private final TDeptMapper tDeptMapper;
 
    private final AssetInventoryTaskItemService assetInventoryTaskItemService;
 
    @Override
    public IPage<AssetInventoryTaskVO> getInventoryTaskPage(AssertInventoryQuery query) {
        // 1. 构建Lambda查询条件
        LambdaQueryWrapper<AssetInventoryTask> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.isNotBlank(query.getTaskName()),
                     AssetInventoryTask::getTaskName, query.getTaskName())
               .eq(AssetInventoryTask::getDisabled, false)
               .orderByDesc(AssetInventoryTask::getCreateTime);
 
        // 2. 构建分页对象
        Page<AssetInventoryTask> page = new Page<>(query.getPageNum(), query.getPageSize());
 
        // 3. 执行分页查询
        IPage<AssetInventoryTask> taskPage = this.page(page, wrapper);
 
        // 4. 收集部门ID并去重
        List<Integer> deptIds = taskPage.getRecords().stream()
                .map(AssetInventoryTask::getDeptId)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
 
        // 5. 批量查询部门信息
        List<TDept> depts = deptIds.isEmpty() ?
                Collections.emptyList() :
                tDeptMapper.selectBatchIds(deptIds);
 
        // 6. 构建部门ID->名称的映射Map
        Map<Integer, String> deptNameMap = depts.stream()
                .collect(Collectors.toMap(TDept::getId, TDept::getDeptName));
 
        // 7. 使用BeanUtil.copyToList转换VO并填充部门名称
        List<AssetInventoryTaskVO> voList = BeanUtil.copyToList(taskPage.getRecords(), AssetInventoryTaskVO.class);
        voList.forEach(vo -> {
            if (vo.getDeptId() != null) {
                vo.setDeptName(deptNameMap.get(vo.getDeptId()));
            }
        });
 
        // 8. 构建返回的分页结果
        IPage<AssetInventoryTaskVO> resultPage = new Page<>(taskPage.getCurrent(), taskPage.getSize(), taskPage.getTotal());
        resultPage.setRecords(voList);
 
        return resultPage;
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean createInventoryTask(AddInventoryTaskDTO dto) {
        // 1. DTO转Entity
        AssetInventoryTask task = new AssetInventoryTask();
        BeanUtil.copyProperties(dto, task);
 
        // 2. 设置默认值
        SysUser currentUser = SecurityUtils.getLoginUser().getUser();
        task.setUserId(Math.toIntExact(currentUser.getUserId()));
        task.setStatus(0); // 未开始状态
        task.setCreateTime(LocalDateTime.now());
        task.setCreateBy(currentUser.getUserName());
        task.setDisabled(false);
 
        // 3. 保存主任务
        boolean saved = this.save(task);
        if (!saved) {
            throw new RuntimeException("保存盘点任务失败");
        }
 
        // 4. 批量创建资产明细
        List<AssetInventoryTaskItem> items = buildTaskItems(task.getId(), dto.getAssetMainIds());
        return assetInventoryTaskItemService.saveBatch(items);
    }
 
    /**
     * 构建盘点任务资产明细列表
     *
     * @param taskId 盘点任务ID
     * @param assetMainIds 资产ID列表
     * @return 资产明细列表
     */
    private List<AssetInventoryTaskItem> buildTaskItems(Integer taskId, List<Integer> assetMainIds) {
        SysUser currentUser = SecurityUtils.getLoginUser().getUser();
        Integer currentUserId = Math.toIntExact(currentUser.getUserId());
 
        return assetMainIds.stream()
                .map(assetId -> {
                    AssetInventoryTaskItem item = new AssetInventoryTaskItem();
                    item.setInventoryTaskId(taskId);
                    item.setAssetMainId(assetId);
                    item.setUserId(currentUserId);
                    item.setResultStatus(0); // 未盘点状态
                    return item;
                })
                .collect(Collectors.toList());
    }
}