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; /** *

* 盘点任务表 服务实现类 *

* * @author WuGuanFengYue * @since 2025-09-15 */ @Service @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class AssetInventoryTaskServiceImpl extends ServiceImpl implements AssetInventoryTaskService { private final TDeptMapper tDeptMapper; private final AssetInventoryTaskItemService assetInventoryTaskItemService; @Override public IPage getInventoryTaskPage(AssertInventoryQuery query) { // 1. 构建Lambda查询条件 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(query.getTaskName()), AssetInventoryTask::getTaskName, query.getTaskName()) .eq(AssetInventoryTask::getDisabled, false) .orderByDesc(AssetInventoryTask::getCreateTime); // 2. 构建分页对象 Page page = new Page<>(query.getPageNum(), query.getPageSize()); // 3. 执行分页查询 IPage taskPage = this.page(page, wrapper); // 4. 收集部门ID并去重 List deptIds = taskPage.getRecords().stream() .map(AssetInventoryTask::getDeptId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); // 5. 批量查询部门信息 List depts = deptIds.isEmpty() ? Collections.emptyList() : tDeptMapper.selectBatchIds(deptIds); // 6. 构建部门ID->名称的映射Map Map deptNameMap = depts.stream() .collect(Collectors.toMap(TDept::getId, TDept::getDeptName)); // 7. 使用BeanUtil.copyToList转换VO并填充部门名称 List voList = BeanUtil.copyToList(taskPage.getRecords(), AssetInventoryTaskVO.class); voList.forEach(vo -> { if (vo.getDeptId() != null) { vo.setDeptName(deptNameMap.get(vo.getDeptId())); } }); // 8. 构建返回的分页结果 IPage 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 items = buildTaskItems(task.getId(), dto.getAssetMainIds()); return assetInventoryTaskItemService.saveBatch(items); } /** * 构建盘点任务资产明细列表 * * @param taskId 盘点任务ID * @param assetMainIds 资产ID列表 * @return 资产明细列表 */ private List buildTaskItems(Integer taskId, List 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()); } }