package com.centreproject.system.service.job.park;

import com.centreproject.common.constant.KeyConstants;
import com.centreproject.common.utils.DateUtils;
import com.centreproject.system.service.job.factory.SyncRuleHandlerFactory;
import com.centreproject.system.service.sync.impl.KpiDailyParkRevenueSyncService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * 园区收入同步任务处理器
 * @author 调度任务
 */
@Component
@RequiredArgsConstructor
public class ParkRevenueSyncJobHandler {

    private final KpiDailyParkRevenueSyncService syncService;




    /**
     * 设置追踪id sync+模块+时间+唯一id，防止同一条数据每条更新数次追踪不到的问题可根据sync+模块+时间搜索traceId
     * 园区收入同步数据执行器
     * 频率: 暂时配置 每3分钟同步一次
     * 取出园区内总收入表数据gx_cc_daily_park_ig_revenue_ods， 取出门票总收入(gx_cc_daily_park_omni_revenue_ods) 合并
     * 存入数据库中
     * websocket推送目标数据给前端(日趋查询业务表数据)
     */
    @XxlJob("parkRevenueSyncJobHandler")
    public void execute() {
        // 生成追踪ID
        String traceId = "SYNC-" + KeyConstants.REVENUE +"-"+ DateUtils.getRiDate()+"-"+ UUID.randomUUID();
        long jobId = XxlJobHelper.getJobId();

        try {
            // 1. 记录任务开始信息
            XxlJobHelper.log("========== 开始执行园区收入同步任务 ==========");
            XxlJobHelper.log("追踪ID: {}", traceId);
            XxlJobHelper.log("开始时间: {}", new java.util.Date());
            // 2. 设置任务参数(会显示在调度日志的"任务参数"列)
            // 可以获取调度中心传入的参数
            XxlJobHelper.getJobParam();
            XxlJobHelper.log("任务参数: " + XxlJobHelper.getJobParam());

            // 3. 执行同步服务
            syncService.startSync(traceId,jobId);

            // 4. 记录成功信息
            XxlJobHelper.log("========== 园区收入同步任务执行成功 ==========");
            XxlJobHelper.handleSuccess("园区收入同步完成，追踪ID: " + traceId);

        } catch (Exception e) {
            // 5. 记录错误信息
            XxlJobHelper.log("========== 园区收入同步任务执行失败 ==========");
            XxlJobHelper.log("错误信息: {}", e.getMessage());
            XxlJobHelper.log("异常堆栈: ", e);
            // 6. 标记任务失败(会显示在调度日志的"调度备注"列)
            XxlJobHelper.handleFail("同步失败: " + e.getMessage() + "，追踪ID: " + traceId);
            // 抛出异常以便XXL-Job记录失败状态
            throw e;
        }
    }
}