package com.chinaztt.mes.quality.service.impl;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.chinaztt.mes.common.numgen.NumberGenerator;
|
import com.chinaztt.mes.quality.dto.ReliabilityTestPlanDTO;
|
import com.chinaztt.mes.quality.entity.ReliabilityTestPlan;
|
import com.chinaztt.mes.quality.entity.ReliabilityTestPlanStandard;
|
import com.chinaztt.mes.quality.entity.TestStandard;
|
import com.chinaztt.mes.quality.mapper.ReliabilityTestPlanMapper;
|
import com.chinaztt.mes.quality.mapper.ReliabilityTestPlanStandardMapper;
|
import com.chinaztt.mes.quality.mapper.TestStandardMapper;
|
import com.chinaztt.mes.quality.service.ReliabilityTestPlanService;
|
import com.chinaztt.ztt.common.core.util.R;
|
import lombok.AllArgsConstructor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.time.Duration;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 检测周期计划
|
*
|
* @author xucg
|
* @date 2022-04-29
|
*/
|
@Service
|
@AllArgsConstructor
|
@Transactional(rollbackFor = Exception.class)
|
public class ReliabilityTestPlanServiceImpl extends ServiceImpl<ReliabilityTestPlanMapper, ReliabilityTestPlan> implements ReliabilityTestPlanService {
|
|
private NumberGenerator<ReliabilityTestPlan> reliabilityTestPlanNumberGenerator;
|
private ReliabilityTestPlanStandardMapper reliabilityTestPlanStandardMapper;
|
private TestStandardMapper testStandardMapper;
|
|
@Override
|
public R doSave(ReliabilityTestPlan reliabilityTestPlan) {
|
reliabilityTestPlan.setTestPlanNo(reliabilityTestPlanNumberGenerator.generateNumberWithPrefix(ReliabilityTestPlan.DIGIT, ReliabilityTestPlan.PREFIX, ReliabilityTestPlan::getTestPlanNo));
|
baseMapper.insert(reliabilityTestPlan);
|
return R.ok(reliabilityTestPlan.getId());
|
}
|
|
@Override
|
public R addStandard(List<ReliabilityTestPlanStandard> list) {
|
List<ReliabilityTestPlanStandard> result = new ArrayList<>();
|
list.forEach(ReliabilityTestPlanStandard -> {
|
TestStandard standard = testStandardMapper.selectById(ReliabilityTestPlanStandard.getStandardId());
|
ReliabilityTestPlanStandard.setInspectionType(standard.getInspectionType());
|
ReliabilityTestPlanStandard.setStandardName(standard.getStandardName());
|
ReliabilityTestPlanStandard.setStandardNo(standard.getStandardNo());
|
reliabilityTestPlanStandardMapper.insert(ReliabilityTestPlanStandard);
|
result.add(ReliabilityTestPlanStandard);
|
});
|
return R.ok(result);
|
}
|
|
@Override
|
public ReliabilityTestPlanDTO getDtoById(Long id) {
|
return baseMapper.getDtoById(id);
|
}
|
|
|
@Override
|
public Boolean removeAll(Long id) {
|
baseMapper.deleteById(id);
|
reliabilityTestPlanStandardMapper.delete(Wrappers.<ReliabilityTestPlanStandard>lambdaQuery().eq(ReliabilityTestPlanStandard::getTestPlanId, id));
|
return true;
|
}
|
|
@Override
|
public R calCountDown(Long id) {
|
List<ReliabilityTestPlan> reliabilityTestPlanList = baseMapper.selectList(Wrappers.<ReliabilityTestPlan>lambdaQuery()
|
.isNotNull(ReliabilityTestPlan::getStartExecutionTime)
|
.isNotNull(ReliabilityTestPlan::getCyclePeriod)
|
.isNotNull(ReliabilityTestPlan::getCycleUnit)
|
.eq(id != null, ReliabilityTestPlan::getId, id));
|
reliabilityTestPlanList.forEach(reliabilityTestPlan -> {
|
Long days = calCountDown(reliabilityTestPlan.getStartExecutionTime(), reliabilityTestPlan.getEndExecutionTime(), new BigDecimal(reliabilityTestPlan.getCyclePeriod()), reliabilityTestPlan.getCycleUnit());
|
reliabilityTestPlan.setExpireTime(new BigDecimal(days));
|
baseMapper.updateById(reliabilityTestPlan);
|
});
|
return R.ok();
|
}
|
|
/**
|
* @param startExecutionTime 开始时间
|
* @param endExecutionTime 结束时间
|
* @param cyclePeriod 周期
|
* @param cycleUnit 周期单位 d = 1 天 w = 7 天 m = 30 天
|
* @return
|
*/
|
private Long calCountDown(LocalDateTime startExecutionTime, LocalDateTime endExecutionTime, BigDecimal cyclePeriod, String cycleUnit) {
|
if (cycleUnit.equals("w")) {
|
cyclePeriod = cyclePeriod.multiply(new BigDecimal(7));
|
}
|
if (cycleUnit.equals("m")) {
|
cyclePeriod = cyclePeriod.multiply(new BigDecimal(30));
|
}
|
Long days = new Long(0);
|
//当前时间必须在结束时间之前
|
if (endExecutionTime.toLocalDate().toEpochDay() >= LocalDate.now().toEpochDay() && LocalDate.now().toEpochDay() >= startExecutionTime.toLocalDate().toEpochDay()) {
|
//现在距离开始时间的天数差
|
Long nowStartdif = Duration.between(startExecutionTime, LocalDateTime.now()).toDays();
|
//计算一共多少个周期
|
BigDecimal cyclePeriodTimes = new BigDecimal(nowStartdif).divide(cyclePeriod, 0, BigDecimal.ROUND_DOWN).add(BigDecimal.ONE);
|
//计算下一个时间节点
|
LocalDateTime calEndTime = startExecutionTime.plusDays(cyclePeriodTimes.multiply(cyclePeriod).longValue()).minusDays(new Long(1));
|
if (endExecutionTime.toLocalDate().toEpochDay() - calEndTime.toLocalDate().toEpochDay() > 0) {
|
endExecutionTime = calEndTime;
|
}
|
days = endExecutionTime.toLocalDate().toEpochDay() - LocalDate.now().toEpochDay() + 1;
|
}
|
return days;
|
}
|
}
|