|
|
@@ -1,5 +1,6 @@
|
|
|
package org.dromara.customer.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
@@ -11,10 +12,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.redis.utils.RedisUtils;
|
|
|
import org.dromara.customer.domain.SupplierInfo;
|
|
|
import org.dromara.customer.domain.dto.ContractCountDTO;
|
|
|
import org.dromara.customer.domain.vo.SupplierContactVo;
|
|
|
import org.dromara.customer.service.ISupplierInfoService;
|
|
|
+import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.dromara.customer.domain.bo.SupplierContractBo;
|
|
|
import org.dromara.customer.domain.vo.SupplierContractVo;
|
|
|
@@ -22,6 +25,8 @@ import org.dromara.customer.domain.SupplierContract;
|
|
|
import org.dromara.customer.mapper.SupplierContractMapper;
|
|
|
import org.dromara.customer.service.ISupplierContractService;
|
|
|
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -40,6 +45,14 @@ public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractMa
|
|
|
|
|
|
private final ISupplierInfoService supplierInfoService;
|
|
|
|
|
|
+ private final StringRedisTemplate redisTemplate;
|
|
|
+
|
|
|
+ private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
|
|
|
+ // 合同编号固定前缀
|
|
|
+ private static final String CONTRACT_NO_PREFIX = "contractNo";
|
|
|
+ // Redis Key前缀
|
|
|
+ private static final String REDIS_KEY_PREFIX = "contract_no:";
|
|
|
+
|
|
|
/**
|
|
|
* 查询合同管理
|
|
|
*
|
|
|
@@ -60,76 +73,92 @@ public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractMa
|
|
|
*/
|
|
|
@Override
|
|
|
public TableDataInfo<SupplierContractVo> queryPageList(SupplierContractBo bo, PageQuery pageQuery) {
|
|
|
- if (bo.getSupplierName() != null){
|
|
|
- SupplierInfo one = supplierInfoService.getOne(new LambdaQueryWrapper<SupplierInfo>().eq(SupplierInfo::getEnterpriseName, bo.getSupplierName()));
|
|
|
- bo.setSupplierId(one.getId());
|
|
|
+ // 首先从SupplierInfo表进行分页查询
|
|
|
+ LambdaQueryWrapper<SupplierInfo> supplierInfoWrapper = Wrappers.lambdaQuery();
|
|
|
+ if (bo.getSupplierName() != null) {
|
|
|
+ supplierInfoWrapper.eq(SupplierInfo::getEnterpriseName, bo.getSupplierName());
|
|
|
}
|
|
|
- LambdaQueryWrapper<SupplierContract> lqw = buildQueryWrapper(bo);
|
|
|
- // 查询所有符合条件的记录
|
|
|
- List<SupplierContract> allRecords = baseMapper.selectList(lqw);
|
|
|
- // 获取当前时间(用于判断合同是否过期)
|
|
|
- Date now = new Date();
|
|
|
-
|
|
|
- // 按供应商ID分组,同时统计总数、有效数、失效数
|
|
|
- Map<Long, ContractCountDTO> countMap = allRecords.stream()
|
|
|
- .collect(Collectors.groupingBy(
|
|
|
- SupplierContract::getSupplierId,
|
|
|
- Collectors.collectingAndThen(
|
|
|
- Collectors.toList(),
|
|
|
- list -> {
|
|
|
- // 统计总数
|
|
|
- long total = list.size();
|
|
|
- // 统计有效期内合同数
|
|
|
- long validCount = list.stream()
|
|
|
- .filter(contract ->
|
|
|
- // 状态为已生效 且 到期时间晚于当前时间
|
|
|
- 1L == (contract.getContractStatus())
|
|
|
- && contract.getContractEndTime().after(now)
|
|
|
- ).count();
|
|
|
- // 统计失效合同数(总数 - 有效数)
|
|
|
- long invalidCount = total - validCount;
|
|
|
- return new ContractCountDTO(total, validCount, invalidCount);
|
|
|
- }
|
|
|
- )
|
|
|
- ));
|
|
|
-
|
|
|
- // 转换为VO列表并排序
|
|
|
- List<SupplierContractVo> contractStats = countMap.entrySet().stream()
|
|
|
- .map(entry -> {
|
|
|
- Long supplierId = entry.getKey();
|
|
|
- ContractCountDTO countDTO = entry.getValue();
|
|
|
+ if (bo.getSupplierId()!=null){
|
|
|
+ supplierInfoWrapper.eq(SupplierInfo::getId, bo.getSupplierId());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加其他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()
|
|
|
+ .map(SupplierInfo::getId)
|
|
|
+ .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);
|
|
|
+
|
|
|
+ // 获取当前时间(用于判断合同是否过期)
|
|
|
+ Date now = new Date();
|
|
|
+
|
|
|
+ // 按供应商ID分组统计合同信息
|
|
|
+ contractStatsMap = allContracts.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ SupplierContract::getSupplierId,
|
|
|
+ Collectors.collectingAndThen(
|
|
|
+ Collectors.toList(),
|
|
|
+ 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()
|
|
|
+ .map(supplierInfo -> {
|
|
|
SupplierContractVo vo = new SupplierContractVo();
|
|
|
- vo.setSupplierId(supplierId);
|
|
|
- // 合同总数
|
|
|
+ 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);
|
|
|
+
|
|
|
+ // 设置合同数统计
|
|
|
vo.setContractNum(String.valueOf(countDTO.getTotal()));
|
|
|
- // 有效期内合同数
|
|
|
vo.setValidContract(String.valueOf(countDTO.getValidCount()));
|
|
|
- // 失效合同数
|
|
|
vo.setInvalidContract(String.valueOf(countDTO.getInvalidCount()));
|
|
|
|
|
|
- // 查询供应商基本信息
|
|
|
- SupplierInfo supplier = supplierInfoService.getById(supplierId);
|
|
|
- if (supplier != null) { // 增加空指针防护
|
|
|
- vo.setSupplierName(supplier.getEnterpriseName());
|
|
|
- vo.setSupplierNo(supplier.getSupplierNo());
|
|
|
- }
|
|
|
return vo;
|
|
|
})
|
|
|
- .sorted((a, b) -> b.getSupplierNo().compareTo(a.getSupplierNo()))
|
|
|
.collect(Collectors.toList());
|
|
|
-
|
|
|
- // 分页处理
|
|
|
- int total = contractStats.size();
|
|
|
- int start = (int) ((pageQuery.getPageNum() - 1) * pageQuery.getPageSize());
|
|
|
- int end = Math.min(start + pageQuery.getPageSize(), total);
|
|
|
- List<SupplierContractVo> pagedResult = start > end ? List.of() : contractStats.subList(start, end);
|
|
|
-
|
|
|
+ // 构建分页结果
|
|
|
Page<SupplierContractVo> result = new Page<>();
|
|
|
- result.setRecords(pagedResult);
|
|
|
- result.setTotal(total);
|
|
|
- result.setSize(pageQuery.getPageSize());
|
|
|
- result.setCurrent(pageQuery.getPageNum());
|
|
|
+ result.setRecords(contractStats);
|
|
|
+ result.setTotal(supplierInfoPage.getTotal());
|
|
|
+ result.setSize(supplierInfoPage.getSize());
|
|
|
+ result.setCurrent(supplierInfoPage.getCurrent());
|
|
|
return TableDataInfo.build(result);
|
|
|
}
|
|
|
|
|
|
@@ -195,10 +224,11 @@ public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractMa
|
|
|
lqw.like(StringUtils.isNotBlank(bo.getContractName()), SupplierContract::getContractName, bo.getSupplierName());
|
|
|
lqw.eq(StringUtils.isNotBlank(bo.getSupplierNo()), SupplierContract::getSupplierNo, bo.getSupplierNo());
|
|
|
lqw.eq(bo.getContractStatus()!=null, SupplierContract::getContractStatus, bo.getContractStatus());
|
|
|
- lqw.gt(bo.getContractStartTime() !=null, SupplierContract::getContractStartTime, bo.getContractStartTime());
|
|
|
- lqw.lt(bo.getContractEndTime() !=null, SupplierContract::getContractEndTime, bo.getContractEndTime());
|
|
|
+ lqw.ge(bo.getContractStartTime() !=null, SupplierContract::getContractStartTime, bo.getContractStartTime());
|
|
|
+ lqw.le(bo.getContractEndTime() !=null, SupplierContract::getContractEndTime, bo.getContractEndTime());
|
|
|
lqw.eq(bo.getContractStatus() != null, SupplierContract::getContractStatus, bo.getContractStatus());
|
|
|
lqw.eq(bo.getSupplierId() != null && !bo.getSupplierId().equals(""),SupplierContract::getSupplierId, bo.getSupplierId());
|
|
|
+ lqw.eq(bo.getContractType() !=null, SupplierContract::getContractType, bo.getContractType());
|
|
|
return lqw;
|
|
|
}
|
|
|
|
|
|
@@ -213,13 +243,33 @@ public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractMa
|
|
|
SupplierContract add = MapstructUtils.convert(bo, SupplierContract.class);
|
|
|
validEntityBeforeSave(add);
|
|
|
add.setContractStatus(0L);
|
|
|
+
|
|
|
+ // 1. 生成当日Redis Key(按日期分桶)
|
|
|
+ String today = LocalDate.now().format(DATE_FORMATTER);
|
|
|
+ String redisKey = REDIS_KEY_PREFIX + today;
|
|
|
+
|
|
|
+ // 2. Redis原子自增,保证并发安全(初始值为1,每次+1)
|
|
|
+ Long incrementNum = redisTemplate.opsForValue().increment(redisKey, 1);
|
|
|
+
|
|
|
+ // 3. 自增数字补零为4位(比如1→0001,12→0012,123→0123)
|
|
|
+ String seqNum = String.format("%04d", incrementNum);
|
|
|
+
|
|
|
+ // 4. 拼接最终合同编号
|
|
|
+ String contractNo =today + seqNum;
|
|
|
+ add.setContractNo(contractNo); // 设置到实体中
|
|
|
+
|
|
|
+ // 5. 设置Redis Key过期时间(可选,避免Key堆积,比如保留7天)
|
|
|
+ redisTemplate.expire(redisKey, 1, java.util.concurrent.TimeUnit.DAYS);
|
|
|
+
|
|
|
+ // 6. 执行数据库插入操作(这里补充你的插入逻辑)
|
|
|
+ // supplierContractMapper.insert(add);
|
|
|
boolean flag = baseMapper.insert(add) > 0;
|
|
|
- if (flag) {
|
|
|
-// bo.setId(add.getId());
|
|
|
- }
|
|
|
+
|
|
|
return flag;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 修改合同管理
|
|
|
*
|
|
|
@@ -255,5 +305,14 @@ public class SupplierContractServiceImpl extends ServiceImpl<SupplierContractMa
|
|
|
return baseMapper.deleteByIds(ids) > 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ @Override
|
|
|
+ public int updateExpiredContractStatus() {
|
|
|
+ // 创建更新条件:合同到期时间小于当前时间且合同状态不是已到期、已终止或已作废
|
|
|
+ LambdaUpdateWrapper<SupplierContract> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
+ updateWrapper.lt(SupplierContract::getContractEndTime, new Date()); // 合同到期时间小于当前时间
|
|
|
+ updateWrapper.notIn(SupplierContract::getContractStatus, 2L); // 不是已到期、已终止或已作废状态
|
|
|
+ updateWrapper.set(SupplierContract::getContractStatus, 2L); // 设置为已到期状态
|
|
|
+ // 执行更新操作
|
|
|
+ return baseMapper.update(null, updateWrapper);
|
|
|
+ }
|
|
|
}
|