package com.zcloud.safetyDutyList.job;

import com.jjb.saas.framework.job.Job;
import com.jjb.saas.framework.job.annotation.JobRegister;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.zcloud.safetyDutyList.api.tasklist.TaskListServiceI;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 安全责任清单 - 定时任务：更新清单状态和任务状态
 * <p>
 * 执行周期：每月1日0时（cron = "0 0 0 1 * ?"）
 * <p>
 * 业务场景：
 *   当清单的周期结束时间已过（即当前时间 > period_end_time），说明该清单已到期，
 *   需要自动将其状态从"进行中"变更为"已完成"，同时将该清单下所有进行中的任务也标记为已完成。
 * <p>
 * 调用层级：Job → TaskListServiceI → TaskListServiceImpl → TaskListStatusUpdateExe → Gateway
 * <p>
 * 遵循COLA架构规范，Job仅负责调度入口，业务逻辑由Exe执行器处理。
 */
@RequiredArgsConstructor
@Component
@Slf4j
public class TaskStatusUpdateJob implements Job {

    /** 安全责任清单服务接口，用于调用定时任务业务方法 */
    private final TaskListServiceI taskListService;

    /**
     * 定时任务入口方法
     * <p>
     * 由XXL-Job调度框架调用，执行清单和任务状态更新逻辑。
     * 执行成功返回SUCCESS，异常时返回FAIL及错误信息。
     *
     * @param param XXL-Job传入的参数（当前任务未使用）
     * @return 执行结果，成功返回ReturnT.SUCCESS，失败返回ReturnT.FAIL_CODE及异常信息
     */
    @Override
    @JobRegister(cron = "0 0 0 1 * ?", jobDesc = "安全责任清单-更新清单和任务状态", triggerStatus = 1)
    @XxlJob("com.zcloud.safetyDutyList.job.TaskStatusUpdateJob")
    public ReturnT<String> execute(String param) {
        log.info("【定时任务-安全责任清单-检测任务完成】开始执行更新清单和任务状态定时任务");
        try {
            taskListService.updateExpiredTaskListStatus();
            log.info("【定时任务-安全责任清单-检测任务完成】更新清单和任务状态定时任务执行完成");
        } catch (Exception e) {
            log.error("【定时任务-安全责任清单-检测任务完成】更新清单和任务状态定时任务执行异常", e);
            return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage());
        }
        return ReturnT.SUCCESS;
    }
}
