========================================================================
thirdparty App消息Push定时任务迁移 daemon-quartz - sys_job 手工添加清单 (2026-09-24)
========================================================================

说明：以下内容需要管理员在对应环境手工添加（Quartz 任务管理页或直接执行 SQL）。
SQL 幂等，可重复执行。
注意库名：sys_job 在 `pjcloudx_job` 库（与 qrtz_* / sys_job_log 同库）。

迁移背景：
  thirdparty 原本地 @Scheduled 定时任务（ThirdAppMessagePushJob：每10秒Push投递扫描 +
  每日02:10过期清理）已迁移到 daemon-quartz 统一调度，集群部署下避免各实例重复触发，
  且可在任务管理页暂停/改cron/手动执行/看执行日志。
  thirdparty 侧新增内部端点 /third-push-delivery/inner/process-due 与 /inner/cleanup，
  由 daemon 的 thirdPushTask bean（class_name=thirdPushTask）通过 Feign 反射调用。

部署顺序（硬前提，顺序不能颠倒）：
  1. 部署 pjcloud-thirdparty-biz（新增内部端点、已移除本地 @Scheduled 与 @EnableScheduling）；
  2. 部署 pjcloud-daemon-quartz（新增 thirdPushTask bean）；
  3. 执行下方 sys_job INSERT；
  4. 重启 daemon-quartz 自动加载（或调 POST /sys-job/refresh-jobs，权限 job_sys_job_refresh_job）。

行为说明：
  原 fixedDelay=10s（上轮结束后再计时）改为固定 10 秒 cron 节奏；Quartz 任务带
  @DisallowConcurrentExecution，单轮未结束时下一触发自动顺延，不会重叠。
  投递任务内部由条件更新（status CAS）领取，多节点/重复触发幂等安全。

------------------------------------------------------------------------
一、sys_job：App消息Push投递扫描（每10秒）
------------------------------------------------------------------------

INSERT INTO `pjcloudx_job`.`sys_job`
(`job_id`, `job_name`, `job_group`, `job_order`, `job_type`, `execute_path`, `class_name`, `method_name`,
 `method_params_value`, `cron_expression`, `misfire_policy`, `job_tenant_type`, `job_status`,
 `job_execute_status`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `remark`)
SELECT (SELECT GREATEST(COALESCE(MAX(`job_id`), 0), 2026092400000000000) FROM `pjcloudx_job`.`sys_job`) + 3,
       'App消息Push投递扫描', 'THIRDPARTY', '1', '2', NULL, 'thirdPushTask', 'processDue',
       NULL, '0/10 * * * * ?', '3', '1', '2',
       '0', 'system', NOW(), 'system', NOW(), 1, '每10秒扫描到期App消息Push投递任务并投递'
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1 FROM `pjcloudx_job`.`sys_job`
    WHERE `job_name` = 'App消息Push投递扫描' AND `job_group` = 'THIRDPARTY' AND `tenant_id` = 1
);

------------------------------------------------------------------------
二、sys_job：App消息Push过期清理（每日 02:10，与原本地任务一致）
------------------------------------------------------------------------

INSERT INTO `pjcloudx_job`.`sys_job`
(`job_id`, `job_name`, `job_group`, `job_order`, `job_type`, `execute_path`, `class_name`, `method_name`,
 `method_params_value`, `cron_expression`, `misfire_policy`, `job_tenant_type`, `job_status`,
 `job_execute_status`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `remark`)
SELECT (SELECT GREATEST(COALESCE(MAX(`job_id`), 0), 2026092400000000000) FROM `pjcloudx_job`.`sys_job`) + 4,
       'App消息Push过期清理', 'THIRDPARTY', '2', '2', NULL, 'thirdPushTask', 'cleanup',
       NULL, '0 10 2 * * ?', '3', '1', '2',
       '0', 'system', NOW(), 'system', NOW(), 1, '每日02:10清理超保留期的Push消息/终态投递/尝试日志'
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1 FROM `pjcloudx_job`.`sys_job`
    WHERE `job_name` = 'App消息Push过期清理' AND `job_group` = 'THIRDPARTY' AND `tenant_id` = 1
);

------------------------------------------------------------------------
三、内部端点与任务对应关系（勿对外暴露）
------------------------------------------------------------------------

thirdPushTask.processDue:
  POST /third-push-delivery/inner/process-due  扫描并处理到期Push投递（@Inner 鉴权）

thirdPushTask.cleanup:
  POST /third-push-delivery/inner/cleanup      清理超保留期记录（@Inner 鉴权）

------------------------------------------------------------------------
四、回滚说明
------------------------------------------------------------------------
  1. 停用任务：将两条 sys_job 的 job_status 改为 '4'（删除）或 '3'（暂停）并重启 daemon-quartz
     （或调 POST /sys-job/refresh-jobs）；
  2. 恢复本地调度：回滚 thirdparty 代码（ThirdAppMessagePushJob + @EnableScheduling）并重新部署。
