package com.ruoyi.system.task.utils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.uuid.UUID; import com.ruoyi.system.mapper.TBillMapper; import com.ruoyi.system.model.TBill; import com.ruoyi.system.model.TContract; import com.ruoyi.system.service.TContractService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.temporal.ChronoUnit; import java.util.List; /** * @author zhibing.pu * @date 2023/7/11 8:39 */ @Component public class TaskUtil { @Autowired private TContractService contractService; @Autowired private TBillMapper billMapper; @Autowired RedisCache redisCache; // 用于更新违约金账单 // 每分钟执行一次的定时任务 @Scheduled(cron = "0 0 0 * * ?") public void dayOfProportionBill() { try { // 查询所有未缴费账单 List list = billMapper.selectList(new LambdaQueryWrapper().ne(TBill::getPayFeesStatus, 5) .ne(TBill::getOutstandingMoney,0)); List contractList = contractService.list(); for (TBill tBill : list) { tBill.setPayFeesStatus("4"); TContract contract = contractList.stream().filter(e -> e.getId().equals(tBill.getContractId())).findFirst().orElse(null); if (contract==null)continue; if (contract.getProportion().compareTo(BigDecimal.ZERO)==0)continue; LocalDate payableFeesTime = tBill.getPayableFeesTime(); // 将LocalDate转化为LocalDateTime LocalDateTime payableFeesTime1 = LocalDateTime.of(payableFeesTime, LocalTime.of(0, 0, 0)); LocalDateTime now = LocalDateTime.now(); // 计算两个时间相差多少个小时 long hours = ChronoUnit.HOURS.between(payableFeesTime1, now); long l = hours / 24; if (l>=3){ // 违约金比例 BigDecimal proportion = contract.getProportion(); // 按每天 待缴费金额 * XX% 增加违约金费用 if (contract.getTotalYear().compareTo(new BigDecimal("0"))==0){ tBill.setPayFeesStatus("3"); billMapper.updateById(tBill); continue; } String requestId = UUID.fastUUID().toString(); String lockkey = CacheConstants.BILL_UPDATE_LOCK_KEY + tBill.getId(); boolean isok = redisCache.trylockLoop(lockkey, requestId, 60); if (isok){ try { BigDecimal money = contract.getTotalYear().multiply(proportion.divide(new BigDecimal(100),4, BigDecimal.ROUND_DOWN)); tBill.setOverDays((int) l); tBill.setPayableFeesPenalty(tBill.getPayableFeesPenalty()!=null?tBill.getPayableFeesPenalty().add(money):new BigDecimal("0").add(money)); tBill.setOutstandingMoney(money.add(tBill.getOutstandingMoney())); billMapper.updateById(tBill); }finally { redisCache.unlock(lockkey,requestId); } } } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { // LocalDateTime now = LocalDateTime.now().minusMonths(1).withDayOfMonth(31); // System.err.println(now); // LocalDateTime now2 = now.plusMonths(1); // System.err.println(now2); // // LocalDateTime now1 = LocalDateTime.now(); // long days = ChronoUnit.DAYS.between(now, now1); // long days2 = ChronoUnit.DAYS.between(now.plusDays(1), now1); // // System.err.println(days); // System.err.println(days2); // LocalDateTime endTime = now.with(TemporalAdjusters.lastDayOfMonth()).withSecond(59).withHour(23).withMinute(59); // // System.err.println(endTime); } }