package com.jsh.erp.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jsh.erp.datasource.dto.TaskStocktakingDTO; import com.jsh.erp.datasource.entities.*; import com.jsh.erp.datasource.mappers.MaterialExtendMapper; import com.jsh.erp.datasource.mappers.TaskStocktakingItemMapper; import com.jsh.erp.datasource.mappers.TaskStocktakingMapper; import com.jsh.erp.datasource.mappers.UserMapper; import com.jsh.erp.datasource.vo.TaskStocktakingItemVO; import com.jsh.erp.datasource.vo.TaskStocktakingVO; import com.jsh.erp.query.LambdaQueryWrapperX; import com.jsh.erp.service.DepotService; import com.jsh.erp.service.TaskStocktakingService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @Service @RequiredArgsConstructor @Slf4j public class TaskStocktakingServiceImpl extends ServiceImpl implements TaskStocktakingService { private final MaterialExtendMapper materialExtendMapper; private final UserMapper userMapper; private final DepotService depotService; private final TaskStocktakingItemMapper taskStocktakingItemMapper; /** * 创建盘点任务 * @param taskStocktakingDTO * @return */ @Override public boolean add(TaskStocktakingDTO taskStocktakingDTO) { //商品库位范围处理 List collect; if (taskStocktakingDTO.getTaskType() == 1) { collect = materialExtendMapper.selectList(new LambdaQueryWrapper().ne(MaterialExtend::getInventory, BigDecimal.ZERO)).stream().map(MaterialExtend::getPosition).collect(Collectors.toList()); } else { collect = materialExtendMapper.selectList(new LambdaQueryWrapper().in(MaterialExtend::getId, taskStocktakingDTO.getMaterialExtendIdList())).stream().map(MaterialExtend::getPosition).collect(Collectors.toList()); } String positionRange = extractRangePair(collect); this.save(taskStocktakingDTO); return true; } /** * 任务-详情 * @param id 任务ID * @return * @throws Exception */ @Override public TaskStocktakingVO detail(Long id) throws Exception{ TaskStocktaking one = getOne(new LambdaQueryWrapperX().eq(TaskStocktaking::getId, id)); TaskStocktakingVO taskStocktakingVO = new TaskStocktakingVO(); BeanUtils.copyProperties(one, taskStocktakingVO); //获取负责人名称 User user = userMapper.selectOne(new LambdaQueryWrapper().eq(User::getId, one.getCreator())); taskStocktakingVO.setCreatorName(user.getLoginName()); //获取创建人名称 User user1 = userMapper.selectOne(new LambdaQueryWrapper().eq(User::getId, one.getCreateBy())); taskStocktakingVO.setCreateByName(user1.getLoginName()); //获取仓库名称 Depot depot = depotService.getDepot(one.getDepotId()); taskStocktakingVO.setDepotName(depot.getName()); //当任务类型是抽盘时,返回商品盘点信息 return taskStocktakingVO; } /** * 任务详情-商品明细 * @param taskStocktakingId 盘点任务ID * @return */ @Override public List listByTaskStocktakingId(Long taskStocktakingId) { return taskStocktakingItemMapper.listByTaskStocktakingId(taskStocktakingId); } /** * 计算库位范围 * @param data 库位集合 * @return */ public static String extractRangePair(List data) { // 用于存储提取的前两部分 List rangeParts = new ArrayList<>(); for (String item : data) { // 提取前两部分(假设格式固定,以 "-" 分割,取前两部分) String[] parts = item.split("-"); if (parts.length >= 2) { String rangePart = parts[0] + "-" + parts[1]; rangeParts.add(rangePart); // 添加到列表 } } // 如果范围为空,直接返回空字符串 if (rangeParts.isEmpty()) { return ""; } // 找到最小和最大范围 String minRange = Collections.min(rangeParts); // 字典序最小 String maxRange = Collections.max(rangeParts); // 字典序最大 // 返回范围对 return minRange + "——" + maxRange; } }