|
@@ -1,27 +1,36 @@
|
|
|
package com.jsh.erp.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.jsh.erp.datasource.dto.TaskStocktakingDTO;
|
|
|
+import com.jsh.erp.datasource.dto.TaskStocktakingItemQueryDTO;
|
|
|
+import com.jsh.erp.datasource.dto.TaskStocktakingQueryDTO;
|
|
|
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.mappers.*;
|
|
|
+import com.jsh.erp.datasource.pda.dto.PDATaskStocktakingItemDTO;
|
|
|
+import com.jsh.erp.datasource.pda.vo.PDATaskStocktakingItemVO;
|
|
|
+import com.jsh.erp.datasource.pda.vo.PDATaskStocktakingVO;
|
|
|
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.SequenceService;
|
|
|
import com.jsh.erp.service.TaskStocktakingService;
|
|
|
+import com.jsh.erp.service.UserService;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -39,22 +48,75 @@ public class TaskStocktakingServiceImpl extends ServiceImpl<TaskStocktakingMappe
|
|
|
|
|
|
private final TaskStocktakingItemMapper taskStocktakingItemMapper;
|
|
|
|
|
|
+ private final TaskStocktakingMapper taskStocktakingMapper;
|
|
|
+
|
|
|
+ private final MaterialMapper materialMapper;
|
|
|
+
|
|
|
+ private final UserService userService;
|
|
|
+
|
|
|
+ private final SequenceService sequenceService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<TaskStocktakingVO> listBy(TaskStocktakingQueryDTO taskStocktakingQueryDTO) {
|
|
|
+ return taskStocktakingMapper.listBy(taskStocktakingQueryDTO);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 创建盘点任务
|
|
|
* @param taskStocktakingDTO
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
+ @Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
|
|
public boolean add(TaskStocktakingDTO taskStocktakingDTO) {
|
|
|
- //商品库位范围处理
|
|
|
- List<String> collect;
|
|
|
- if (taskStocktakingDTO.getTaskType() == 1) {
|
|
|
- collect = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().ne(MaterialExtend::getInventory, BigDecimal.ZERO)).stream().map(MaterialExtend::getPosition).collect(Collectors.toList());
|
|
|
- } else {
|
|
|
- collect = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().in(MaterialExtend::getId, taskStocktakingDTO.getMaterialExtendIdList())).stream().map(MaterialExtend::getPosition).collect(Collectors.toList());
|
|
|
+ try {
|
|
|
+ List<String> collect;
|
|
|
+ List<MaterialExtend> materialExtendList;
|
|
|
+ //全盘,抽盘,处理任务明细
|
|
|
+ if (taskStocktakingDTO.getTaskType() == 1) {
|
|
|
+ materialExtendList = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().ne(MaterialExtend::getInventory, BigDecimal.ZERO).isNotNull(MaterialExtend::getInventory));
|
|
|
+ collect = materialExtendList
|
|
|
+ .stream()
|
|
|
+ .map(MaterialExtend::getPosition)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<Long> materialIdList = materialExtendList.stream().map(MaterialExtend::getMaterialId).distinct().collect(Collectors.toList());
|
|
|
+ List<Material> materialList = materialMapper.selectList(new LambdaQueryWrapperX<Material>().eq(Material::getId, materialIdList));
|
|
|
+ List<Long> categoryIdList = materialList.stream().map(Material::getCategoryId).distinct().collect(Collectors.toList());
|
|
|
+ taskStocktakingDTO.setCategoryCount(categoryIdList.size());
|
|
|
+ taskStocktakingDTO.setMaterialCount(materialExtendList.size());
|
|
|
+ } else {
|
|
|
+ materialExtendList = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().in(MaterialExtend::getBatchNumber, taskStocktakingDTO.getMaterialExtendIdList()));
|
|
|
+ collect = materialExtendList.stream().map(MaterialExtend::getPosition).collect(Collectors.toList());
|
|
|
+ List<Long> materialIdList = materialExtendList.stream().map(MaterialExtend::getMaterialId).collect(Collectors.toList());
|
|
|
+ List<Material> materialList = materialMapper.selectList(new LambdaQueryWrapperX<Material>().in(Material::getId, materialIdList));
|
|
|
+ List<Long> categoryIdList = materialList.stream().map(Material::getCategoryId).distinct().collect(Collectors.toList());
|
|
|
+ taskStocktakingDTO.setCategoryCount(categoryIdList.size());
|
|
|
+ taskStocktakingDTO.setMaterialCount(materialExtendList.size());
|
|
|
+ }
|
|
|
+ //处理商品库位范围处理
|
|
|
+ String positionRange = extractRangePair(collect);
|
|
|
+ taskStocktakingDTO.setPositionRange(positionRange);
|
|
|
+ User currentUser = userService.getCurrentUser();
|
|
|
+ taskStocktakingDTO.setCreateBy(currentUser.getId());
|
|
|
+ taskStocktakingDTO.setCreateTime(new Date());
|
|
|
+ taskStocktakingDTO.setTaskStatus(1);
|
|
|
+ //生成单据编号
|
|
|
+ taskStocktakingDTO.setNumber("PDRW"+sequenceService.buildOnlyNumber());
|
|
|
+ //生成任务
|
|
|
+ this.save(taskStocktakingDTO);
|
|
|
+ //生成任务明细
|
|
|
+ List<TaskStocktakingItem> taskStocktakingItemList = new ArrayList<>();
|
|
|
+ materialExtendList.forEach(item -> {
|
|
|
+ TaskStocktakingItem taskStocktakingItem = new TaskStocktakingItem();
|
|
|
+ taskStocktakingItem.setTaskStocktakingId(taskStocktakingDTO.getId());
|
|
|
+ taskStocktakingItem.setMaterialItemId(item.getId());
|
|
|
+ taskStocktakingItemList.add(taskStocktakingItem);
|
|
|
+ });
|
|
|
+ taskStocktakingItemMapper.insertBatch(taskStocktakingItemList);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("创建盘点任务失败", e);
|
|
|
+ return false;
|
|
|
}
|
|
|
- String positionRange = extractRangePair(collect);
|
|
|
- this.save(taskStocktakingDTO);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -71,10 +133,14 @@ public class TaskStocktakingServiceImpl extends ServiceImpl<TaskStocktakingMappe
|
|
|
BeanUtils.copyProperties(one, taskStocktakingVO);
|
|
|
//获取负责人名称
|
|
|
User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getId, one.getCreator()));
|
|
|
- taskStocktakingVO.setCreatorName(user.getLoginName());
|
|
|
+ if (user != null) {
|
|
|
+ taskStocktakingVO.setCreatorName(user.getLoginName());
|
|
|
+ }
|
|
|
//获取创建人名称
|
|
|
User user1 = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getId, one.getCreateBy()));
|
|
|
- taskStocktakingVO.setCreateByName(user1.getLoginName());
|
|
|
+ if (user1 != null) {
|
|
|
+ taskStocktakingVO.setCreateByName(user1.getLoginName());
|
|
|
+ }
|
|
|
//获取仓库名称
|
|
|
Depot depot = depotService.getDepot(one.getDepotId());
|
|
|
taskStocktakingVO.setDepotName(depot.getName());
|
|
@@ -83,13 +149,137 @@ public class TaskStocktakingServiceImpl extends ServiceImpl<TaskStocktakingMappe
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 任务详情-修改
|
|
|
+ * @param taskStocktakingDTO
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean detailUpdate(TaskStocktakingDTO taskStocktakingDTO) {
|
|
|
+ try {
|
|
|
+ List<String> collect;
|
|
|
+ List<MaterialExtend> materialExtendList;
|
|
|
+ //全盘,抽盘,处理任务明细
|
|
|
+ if (taskStocktakingDTO.getTaskType() == 1) {
|
|
|
+ materialExtendList = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().ne(MaterialExtend::getInventory, BigDecimal.ZERO).isNotNull(MaterialExtend::getInventory));
|
|
|
+ collect = materialExtendList
|
|
|
+ .stream()
|
|
|
+ .map(MaterialExtend::getPosition)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<Long> materialIdList = materialExtendList.stream().map(MaterialExtend::getMaterialId).distinct().collect(Collectors.toList());
|
|
|
+ List<Material> materialList = materialMapper.selectList(new LambdaQueryWrapperX<Material>().eq(Material::getId, materialIdList));
|
|
|
+ List<Long> categoryIdList = materialList.stream().map(Material::getCategoryId).distinct().collect(Collectors.toList());
|
|
|
+ taskStocktakingDTO.setCategoryCount(categoryIdList.size());
|
|
|
+ taskStocktakingDTO.setMaterialCount(materialExtendList.size());
|
|
|
+ } else {
|
|
|
+ materialExtendList = materialExtendMapper.selectList(new LambdaQueryWrapper<MaterialExtend>().in(MaterialExtend::getBatchNumber, taskStocktakingDTO.getMaterialExtendIdList()));
|
|
|
+ collect = materialExtendList.stream().map(MaterialExtend::getPosition).collect(Collectors.toList());
|
|
|
+ List<Long> materialIdList = materialExtendList.stream().map(MaterialExtend::getMaterialId).collect(Collectors.toList());
|
|
|
+ List<Material> materialList = materialMapper.selectList(new LambdaQueryWrapperX<Material>().in(Material::getId, materialIdList));
|
|
|
+ List<Long> categoryIdList = materialList.stream().map(Material::getCategoryId).distinct().collect(Collectors.toList());
|
|
|
+ taskStocktakingDTO.setCategoryCount(categoryIdList.size());
|
|
|
+ taskStocktakingDTO.setMaterialCount(materialExtendList.size());
|
|
|
+ }
|
|
|
+ //处理商品库位范围处理
|
|
|
+ String positionRange = extractRangePair(collect);
|
|
|
+ taskStocktakingDTO.setPositionRange(positionRange);
|
|
|
+ User currentUser = userService.getCurrentUser();
|
|
|
+ taskStocktakingDTO.setCreateBy(currentUser.getId());
|
|
|
+ taskStocktakingDTO.setCreateTime(new Date());
|
|
|
+ taskStocktakingDTO.setTaskStatus(1);
|
|
|
+ //生成任务
|
|
|
+ this.updateById(taskStocktakingDTO);
|
|
|
+ List<Long> taskStocktakingItemIdList = taskStocktakingItemMapper.selectList(new LambdaQueryWrapperX<TaskStocktakingItem>().eq(TaskStocktakingItem::getTaskStocktakingId, taskStocktakingDTO.getId())).stream().map(TaskStocktakingItem::getId).collect(Collectors.toList());
|
|
|
+ //生成任务明细
|
|
|
+ List<TaskStocktakingItem> addTaskStocktakingItemList = new ArrayList<>();
|
|
|
+ materialExtendList.forEach(item -> {
|
|
|
+ if (!taskStocktakingItemIdList.contains(item.getId())) {
|
|
|
+ TaskStocktakingItem taskStocktakingItem = new TaskStocktakingItem();
|
|
|
+ taskStocktakingItem.setTaskStocktakingId(taskStocktakingDTO.getId());
|
|
|
+ taskStocktakingItem.setMaterialItemId(item.getId());
|
|
|
+ addTaskStocktakingItemList.add(taskStocktakingItem);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ List<Long> materialExtendIdList = materialExtendList.stream().map(MaterialExtend::getId).collect(Collectors.toList());
|
|
|
+ taskStocktakingItemIdList.forEach(item -> {
|
|
|
+ if (!materialExtendIdList.contains(item)) {
|
|
|
+ TaskStocktakingItem taskStocktakingItem = new TaskStocktakingItem();
|
|
|
+ taskStocktakingItem.setId(item);
|
|
|
+ taskStocktakingItem.setDeleteFlag(true);
|
|
|
+ taskStocktakingItemMapper.updateById(taskStocktakingItem);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (addTaskStocktakingItemList.size() > 0) {
|
|
|
+ taskStocktakingItemMapper.insertBatch(addTaskStocktakingItemList);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("修改盘点任务失败", e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 任务详情-商品明细
|
|
|
- * @param taskStocktakingId 盘点任务ID
|
|
|
+ * @param taskStocktakingItemQueryDTO 筛选参数
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<TaskStocktakingItemVO> listByTaskStocktakingId(TaskStocktakingItemQueryDTO taskStocktakingItemQueryDTO) {
|
|
|
+ return taskStocktakingItemMapper.listByTaskStocktakingId(taskStocktakingItemQueryDTO);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PDA-盘点任务列表
|
|
|
+ * @param number 盘点单号或者任务名称
|
|
|
+ * @param taskStatus 盘点任务状态
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public List<TaskStocktakingItemVO> listByTaskStocktakingId(Long taskStocktakingId) {
|
|
|
- return taskStocktakingItemMapper.listByTaskStocktakingId(taskStocktakingId);
|
|
|
+ public List<PDATaskStocktakingVO> pdaList(String number , Integer taskStatus) {
|
|
|
+ return taskStocktakingMapper.pdaList(number , taskStatus);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PDA-盘点任务详情
|
|
|
+ * @param id 盘点任务ID
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TaskStocktakingVO pdaDetail(Long id) throws Exception{
|
|
|
+ TaskStocktakingVO detail = detail(id);
|
|
|
+ List<TaskStocktakingItem> itemList = taskStocktakingItemMapper.selectList(new LambdaQueryWrapper<TaskStocktakingItem>().eq(TaskStocktakingItem::getTaskStocktakingId, id));
|
|
|
+ //已操作数量
|
|
|
+ long finishCount = itemList.stream().filter(item -> item.getCreator() != null).count();
|
|
|
+ //商品总数量
|
|
|
+ long itemCount = itemList.size();
|
|
|
+ //商品差异条数
|
|
|
+ long itemDifferenceCount = itemList.stream().filter(item -> item.getCreator() != null
|
|
|
+ && item.getDifferenceCount() != null
|
|
|
+ && item.getDifferenceCount() > 0).count();
|
|
|
+ //差异率
|
|
|
+ double differenceRate = 0;
|
|
|
+ //准确率
|
|
|
+ double accuracyRate = 0;
|
|
|
+ if (itemDifferenceCount > 0) {
|
|
|
+ differenceRate = BigDecimal.valueOf(itemCount)
|
|
|
+ .divide(BigDecimal.valueOf(itemDifferenceCount), 4, RoundingMode.HALF_UP)
|
|
|
+ .doubleValue();
|
|
|
+ BigDecimal subtract = BigDecimal.valueOf(finishCount).subtract(BigDecimal.valueOf(itemDifferenceCount));
|
|
|
+ if (!subtract.equals(BigDecimal.ZERO)) {
|
|
|
+ accuracyRate = subtract.divide(BigDecimal.valueOf(itemCount), 4, RoundingMode.HALF_UP).doubleValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ detail.setItemCount(itemCount);
|
|
|
+ detail.setDifferenceRate(differenceRate);
|
|
|
+ detail.setAccuracyRate(accuracyRate);
|
|
|
+ detail.setFinishCount(finishCount);
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<PDATaskStocktakingItemVO> pdaItemList(PDATaskStocktakingItemDTO pdaTaskStocktakingItemDTO) {
|
|
|
+ return taskStocktakingItemMapper.pdaList(pdaTaskStocktakingItemDTO);
|
|
|
}
|
|
|
|
|
|
/**
|