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 implements ReliabilityTestPlanService { private NumberGenerator 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 list) { List 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.lambdaQuery().eq(ReliabilityTestPlanStandard::getTestPlanId, id)); return true; } @Override public R calCountDown(Long id) { List reliabilityTestPlanList = baseMapper.selectList(Wrappers.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; } }