|
|
@@ -73,46 +73,71 @@ public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractMa
|
|
|
*/
|
|
|
@Override
|
|
|
public TableDataInfo<SupplierContractVo> queryPageList(SupplierContractBo bo, PageQuery pageQuery) {
|
|
|
- // 首先从SupplierInfo表进行分页查询
|
|
|
+ // 1. 先查询所有有合同的供应商ID(先过滤)
|
|
|
+ LambdaQueryWrapper<SupplierContract> contractWrapper = Wrappers.lambdaQuery();
|
|
|
+ contractWrapper.select(SupplierContract::getSupplierId)
|
|
|
+ .isNotNull(SupplierContract::getSupplierId)
|
|
|
+ .groupBy(SupplierContract::getSupplierId)
|
|
|
+ .having("COUNT(*) > 0");
|
|
|
+ List<SupplierContract> contractList = baseMapper.selectList(contractWrapper);
|
|
|
+
|
|
|
+ // 提取有合同的供应商ID集合(防止contractList为null)
|
|
|
+ Set<Long> supplierIdsWithContracts = (contractList == null ? new ArrayList<SupplierContract>() : contractList).stream()
|
|
|
+ .map(SupplierContract::getSupplierId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 如果没有供应商有合同,直接返回空结果
|
|
|
+ if (supplierIdsWithContracts.isEmpty()) {
|
|
|
+ Page<SupplierContractVo> emptyResult = new Page<>();
|
|
|
+ emptyResult.setRecords(new ArrayList<>());
|
|
|
+ emptyResult.setTotal(0L);
|
|
|
+ emptyResult.setSize(pageQuery.getPageSize());
|
|
|
+ emptyResult.setCurrent(pageQuery.getPageNum());
|
|
|
+ return TableDataInfo.build(emptyResult);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 根据有合同的供应商ID查询供应商信息(带分页)
|
|
|
LambdaQueryWrapper<SupplierInfo> supplierInfoWrapper = Wrappers.lambdaQuery();
|
|
|
+ supplierInfoWrapper.in(SupplierInfo::getId, supplierIdsWithContracts);
|
|
|
+
|
|
|
+ // 添加查询条件
|
|
|
if (bo.getSupplierName() != null) {
|
|
|
supplierInfoWrapper.eq(SupplierInfo::getEnterpriseName, bo.getSupplierName());
|
|
|
}
|
|
|
- if (bo.getSupplierId()!=null){
|
|
|
+ if (bo.getSupplierId() != null) {
|
|
|
supplierInfoWrapper.eq(SupplierInfo::getId, bo.getSupplierId());
|
|
|
}
|
|
|
- if (bo.getSupplierNo()!=null){
|
|
|
+ if (bo.getSupplierNo() != null) {
|
|
|
supplierInfoWrapper.eq(SupplierInfo::getSupplierNo, bo.getSupplierNo());
|
|
|
}
|
|
|
-
|
|
|
- // 添加其他SupplierInfo表的查询条件
|
|
|
+
|
|
|
+ // 排序
|
|
|
supplierInfoWrapper.orderByDesc(SupplierInfo::getSupplierNo);
|
|
|
-
|
|
|
- // 执行分页查询供应商信息
|
|
|
+
|
|
|
+ // 执行分页查询
|
|
|
Page<SupplierInfo> supplierPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
IPage<SupplierInfo> supplierInfoPage = supplierInfoService.page(supplierPage, supplierInfoWrapper);
|
|
|
List<SupplierInfo> supplierInfoList = supplierInfoPage.getRecords();
|
|
|
-
|
|
|
- // 获取所有供应商ID,用于后续查询合同统计信息
|
|
|
- List<Long> supplierIds = supplierInfoList.stream()
|
|
|
+
|
|
|
+ // 3. 查询这些供应商的合同统计信息(防止supplierInfoList为null)
|
|
|
+ List<Long> currentSupplierIds = (supplierInfoList == null ? new ArrayList<SupplierInfo>() : supplierInfoList).stream()
|
|
|
.map(SupplierInfo::getId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
.collect(Collectors.toList());
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // 查询所有供应商的合同统计信息
|
|
|
+
|
|
|
Map<Long, ContractCountDTO> contractStatsMap = new HashMap<>();
|
|
|
- if (!supplierIds.isEmpty()) {
|
|
|
- // 查询所有相关合同
|
|
|
- LambdaQueryWrapper<SupplierContract> contractWrapper = Wrappers.lambdaQuery();
|
|
|
- contractWrapper.in(SupplierContract::getSupplierId, supplierIds);
|
|
|
- List<SupplierContract> allContracts = baseMapper.selectList(contractWrapper);
|
|
|
-
|
|
|
- // 获取当前时间(用于判断合同是否过期)
|
|
|
+ if (!currentSupplierIds.isEmpty()) {
|
|
|
+ // 查询当前页供应商的所有合同
|
|
|
+ LambdaQueryWrapper<SupplierContract> pageContractWrapper = Wrappers.lambdaQuery();
|
|
|
+ pageContractWrapper.in(SupplierContract::getSupplierId, currentSupplierIds);
|
|
|
+ List<SupplierContract> pageContracts = baseMapper.selectList(pageContractWrapper);
|
|
|
+
|
|
|
+ // 获取当前时间(用于判断合同是否过期)
|
|
|
Date now = new Date();
|
|
|
-
|
|
|
+
|
|
|
// 按供应商ID分组统计合同信息
|
|
|
- contractStatsMap = allContracts.stream()
|
|
|
+ contractStatsMap = pageContracts.stream()
|
|
|
.collect(Collectors.groupingBy(
|
|
|
SupplierContract::getSupplierId,
|
|
|
Collectors.collectingAndThen(
|
|
|
@@ -120,43 +145,43 @@ public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractMa
|
|
|
list -> {
|
|
|
// 统计总数
|
|
|
long total = list.size();
|
|
|
- // 统计有效期内合同数(状态为已生效 且 到期时间晚于当前时间)
|
|
|
+ // 统计有效期内合同数(状态为已生效 且 到期时间晚于当前时间)
|
|
|
long validCount = list.stream()
|
|
|
.filter(contract ->
|
|
|
2L != (contract.getContractStatus())
|
|
|
&& contract.getContractEndTime() != null && contract.getContractEndTime().after(now)
|
|
|
).count();
|
|
|
- // 统计失效合同数(总数 - 有效数)
|
|
|
+ // 统计失效合同数(总数 - 有效数)
|
|
|
long invalidCount = total - validCount;
|
|
|
return new ContractCountDTO(total, validCount, invalidCount);
|
|
|
}
|
|
|
)
|
|
|
));
|
|
|
}
|
|
|
-
|
|
|
- // 将供应商信息和合同统计信息组合成VO列表
|
|
|
- final Map<Long, ContractCountDTO> finalContractStatsMap = contractStatsMap; // 创建final副本
|
|
|
- List<SupplierContractVo> contractStats = supplierInfoList.stream()
|
|
|
+
|
|
|
+ // 4. 将供应商信息和合同统计信息组合成VO列表(防止supplierInfoList为null)
|
|
|
+ final Map<Long, ContractCountDTO> finalContractStatsMap = contractStatsMap;
|
|
|
+ List<SupplierContractVo> contractStats = (supplierInfoList == null ? new ArrayList<SupplierInfo>() : supplierInfoList).stream()
|
|
|
.map(supplierInfo -> {
|
|
|
SupplierContractVo vo = new SupplierContractVo();
|
|
|
vo.setSupplierId(supplierInfo.getId());
|
|
|
vo.setSupplierNo(supplierInfo.getSupplierNo());
|
|
|
vo.setSupplierName(supplierInfo.getEnterpriseName());
|
|
|
-
|
|
|
- // 获取合同统计信息,如果没有则创建默认值为0的统计对象
|
|
|
- ContractCountDTO defaultCountDTO = new ContractCountDTO(0, 0, 0);
|
|
|
+
|
|
|
+ // 获取合同统计信息
|
|
|
ContractCountDTO countDTO = finalContractStatsMap.getOrDefault(supplierInfo.getId(),
|
|
|
- defaultCountDTO);
|
|
|
-
|
|
|
+ new ContractCountDTO(0, 0, 0));
|
|
|
+
|
|
|
// 设置合同数统计
|
|
|
vo.setContractNum(String.valueOf(countDTO.getTotal()));
|
|
|
vo.setValidContract(String.valueOf(countDTO.getValidCount()));
|
|
|
vo.setInvalidContract(String.valueOf(countDTO.getInvalidCount()));
|
|
|
-
|
|
|
+
|
|
|
return vo;
|
|
|
})
|
|
|
.collect(Collectors.toList());
|
|
|
- // 构建分页结果
|
|
|
+
|
|
|
+ // 5. 构建分页结果
|
|
|
Page<SupplierContractVo> result = new Page<>();
|
|
|
result.setRecords(contractStats);
|
|
|
result.setTotal(supplierInfoPage.getTotal());
|