package com.bonus.material.task;

import com.bonus.material.task.domain.UseRate;
import com.bonus.material.task.mapper.UseRateMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Slf4j
@Component
public class UseRateTask {

    @Resource
    private UseRateMapper mapper;

    /**
     * 每晚11点执行：统计并保存设备当日使用情况
     * 优化点：异常处理、日志记录、事务控制、空集合判断
     */
    @Scheduled(cron = "0 0 23 * * ?")
    //@Scheduled(cron = "0/10 * * * * ?") // 每10秒执行
    @Transactional(rollbackFor = Exception.class) // 确保数据一致性，异常时回滚
    public void collectDailyDeviceUsage() {
        log.info("【设备每日使用统计】任务开始执行");
        long startTime = System.currentTimeMillis();

        try {
            // 1. 查询待统计的设备数据
            List<UseRate> useRates = mapper.selectUseRate();
            log.info("【设备每日使用统计】查询到待处理设备数量：{}", useRates.size());

            // 2. 空集合判断，避免无效插入
            if (useRates.isEmpty()) {
                log.warn("【设备每日使用统计】未查询到设备数据，无需执行插入");
                return;
            }

            // 3. 批量插入（优先使用批量插入，效率更高）
            int insertCount = mapper.insertUseRate(useRates); // 改用之前定义的批量插入方法
            log.info("【设备每日使用统计】批量插入完成，成功插入 {} 条记录", insertCount);

        } catch (Exception e) {
            // 4. 异常捕获与日志记录（避免任务中断）
            log.error("【设备每日使用统计】任务执行失败", e); // 打印完整堆栈，便于排查
            throw e; // 若有事务，抛出异常触发回滚
        } finally {
            // 5. 记录任务耗时
            long costTime = System.currentTimeMillis() - startTime;
            log.info("【设备每日使用统计】任务执行结束，耗时：{}ms", costTime);
        }
    }

}
