feat(InventoryCheckService): enhance getPreDetails method with additional filtering options

This commit is contained in:
2025-09-09 20:46:31 +08:00
parent d4087369d7
commit 711f7e41ef
2 changed files with 77 additions and 38 deletions

View File

@@ -2,9 +2,16 @@ package cn.lihongjie.coal.inventoryCheck.dto;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class GetPreDetailsDto {
private String id;
private LocalDateTime checkTime;
private String coalInfo;
private String product;
}

View File

@@ -17,13 +17,11 @@ import cn.lihongjie.coal.inventoryCheckDetail.mapper.InventoryCheckDetailMapper;
import cn.lihongjie.coal.inventoryCheckDetail.repository.InventoryCheckDetailRepository;
import cn.lihongjie.coal.inventoryCheckDetail.service.InventoryCheckDetailService;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.domain.Page;
@@ -124,49 +122,83 @@ public class InventoryCheckService
public List<InventoryCheckDetailDto> getPreDetails(GetPreDetailsDto request) {
String id = request.getId();
if (StringUtils.isNotBlank(request.getCoalInfo())) {
Page<InventoryCheckDetailEntity> page =
inventoryCheckDetailRepository.findAll(
(Specification<InventoryCheckDetailEntity>)
(root, query, criteriaBuilder) -> {
Predicate p1 =
criteriaBuilder.equal(
root.get("coalInfo").get("id"),
request.getCoalInfo());
InventoryCheckDto curr = getById(id);
Predicate p2 = criteriaBuilder.lessThan(
root.get("checkTime"),
request.getCheckTime());
query.orderBy(criteriaBuilder.desc(root.get("checkTime")));
return criteriaBuilder.and(p1, p2);
},
PageRequest.of(0, 1)); // 只取第一条记录
var prev =
repository.findOne(
new Specification<InventoryCheckEntity>() {
@Override
public Predicate toPredicate(
Root<InventoryCheckEntity> root,
CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
Predicate p1 =
criteriaBuilder.lessThan(
root.get("checkTime"), curr.getCheckTime());
Predicate p2 =
criteriaBuilder.equal(
root.get("organizationId"),
curr.getOrganizationId());
query.orderBy(criteriaBuilder.desc(root.get("checkTime")));
return criteriaBuilder.and(p1, p2);
}
});
if (prev.isEmpty()) {
return List.of();
return page.getContent().stream().map(inventoryCheckDetailMapper::toDto).toList();
}
if (StringUtils.isNotBlank(request.getProduct())) {
Page<InventoryCheckDetailEntity> page =
inventoryCheckDetailRepository.findAll(
(Specification<InventoryCheckDetailEntity>)
(root, query, criteriaBuilder) -> {
Predicate p1 =
criteriaBuilder.equal(
root.get("product").get("id"),
request.getProduct());
List<InventoryCheckDetailEntity> all =
inventoryCheckDetailRepository.findAll(
(Specification<InventoryCheckDetailEntity>)
(root, query, criteriaBuilder) ->
criteriaBuilder.equal(
root.get("inventoryCheck").get("id"), prev.get().getId()));
Predicate p2 = criteriaBuilder.lessThan(
root.get("checkTime"),
request.getCheckTime());
query.orderBy(criteriaBuilder.desc(root.get("checkTime")));
return criteriaBuilder.and(p1, p2);
},
PageRequest.of(0, 1)); // 只取第一条记录
return all.stream().map(inventoryCheckDetailMapper::toDto).toList();
return page.getContent().stream().map(inventoryCheckDetailMapper::toDto).toList();
}
// 如果只传入了时间找到距离这个时间最近的InventoryCheck对象返回全部detail
if (request.getCheckTime() != null) {
Page<InventoryCheckEntity> inventoryPage = repository.findAll(
(Specification<InventoryCheckEntity>)
(root, query, criteriaBuilder) -> {
Predicate timePredicate = criteriaBuilder.lessThan(
root.get("checkTime"),
request.getCheckTime());
query.orderBy(criteriaBuilder.desc(root.get("checkTime")));
return timePredicate;
},
PageRequest.of(0, 1)); // 只取最新的一条InventoryCheck记录
if (!inventoryPage.getContent().isEmpty()) {
InventoryCheckEntity latestInventoryCheck = inventoryPage.getContent().get(0);
// 返回这个InventoryCheck的所有详情
List<InventoryCheckDetailEntity> details =
inventoryCheckDetailRepository.findAll(
(Specification<InventoryCheckDetailEntity>)
(root, query, criteriaBuilder) ->
criteriaBuilder.equal(
root.get("inventoryCheck").get("id"),
latestInventoryCheck.getId()));
return details.stream().map(inventoryCheckDetailMapper::toDto).toList();
}
}
return List.of(); // 如果没有找到符合条件的记录,返回空列表
}
}