========================================================================
钱包自动创建补漏检查 - 定时任务手工添加清单 (2026-10-08)
========================================================================

说明：以下内容需要管理员在对应环境手工执行（直接执行 SQL）。
SQL 按租户幂等，风格与 db/20260924_钱包预约执行定时任务.txt 一致。
注意库名：sys_job 在 `pjcloudx_job` 库（与 qrtz_* / sys_job_log 同库）。

一、迁移背景与功能说明：
  用户开通钱包依赖创建入口调用 wallet 服务 createWallet（内部按 WALLET_AUTO_CREATE
  参数配置的角色控制自动开户）。用户导入、历史数据或调用方漏调等原因可能造成
  「拥有自动开户角色但从未执行过创建钱包」的用户（无 wallet_manage 记录、无饭卡）。
  本任务每天凌晨跨租户扫描这类用户并补建钱包（饭卡钱包照常自动绑卡），属于检查
  补漏性质，不改变任何已有钱包数据；补建复用现有幂等创建逻辑，重复触发安全。

  执行链路（daemon-quartz sys_job → Feign → wallet 内部端点 → UPMS 内部端点）：
    walletManageTask.ensureAutoCreateWallets
      → POST /wallet/wallet-manage/inner/ensure-auto-create-wallets（@Inner）
        → 遍历全部有效租户（RemoteTenantService.list）
        → 逐租户读 WALLET_AUTO_CREATE 参数（角色编码）
        → GET  /upms/user/inner/user-ids-by-role-code（@Inner，本次新增，按角色编码
          查当前有效用户 ID 列表，已过滤角色关系里残留的已删除用户）
        → 分批比对 wallet_manage，筛出完全没有钱包记录的用户
        → 逐个调用既有 createWallet(userId, false) 幂等补建（已有即跳过）

二、部署顺序（硬前提，反序部署会导致任务首轮回调失败并记失败日志）：
  1. 部署包含本次改动的 pjcloud-upms-biz（新增内部端点
     GET /user/inner/user-ids-by-role-code）；
  2. 部署包含本次改动的 pjcloud-wallet-biz（新增内部端点
     POST /wallet-manage/inner/ensure-auto-create-wallets 及补漏实现）；
  3. 部署包含本次改动的 pjcloud-daemon-quartz（新增 spring bean walletManageTask）；
  4. 执行下方 sys_job INSERT（job_status='2' 运行中）；
  5. daemon-quartz 重启时由 PjcloudInitQuartzJob 自动注册进 Quartz；服务不重启可调
     管理端 POST /sys-job/refresh-jobs（权限 job_sys_job_refresh_job）手动加载。

  空窗期影响：任务每天 04:00 才触发，部署顺序颠倒最多造成首轮回调失败并记一条
  失败日志，下一个调度周期自动恢复，无数据风险。

三、行为说明：
  - cron '0 0 4 * * ?'：每天凌晨 4 点执行一次；
  - misfire_policy='3'，@DisallowConcurrentExecution 由统一 PjcloudQuartzFactory 保证，
    多实例部署下 Quartz 集群锁兜底，任务不会并发执行；
  - 单个租户失败不影响其余租户，单个用户补建失败不影响其余用户（记 error 日志），
    均由下一轮任务自动重试；
  - 租户未配置 WALLET_AUTO_CREATE 参数时该租户跳过（info 日志），不影响其他租户；
  - 任务 sys_job 行 tenant_id=1 仅用于 daemon 侧调度上下文，wallet 端点内部自行
    遍历全部有效租户，所有租户的角色用户都会被覆盖。

------------------------------------------------------------------------
四、sys_job：钱包自动创建补漏检查（job_type=2，反射调 daemon 内 spring bean）
------------------------------------------------------------------------

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), 2026100800000000000) FROM `pjcloudx_job`.`sys_job`) + 1,
       '钱包自动创建补漏检查', 'WALLET', '3', '2', NULL, 'walletManageTask', 'ensureAutoCreateWallets',
       NULL, '0 0 4 * * ?', '3', '1', '2',
       '0', 'system', NOW(), 'system', NOW(), 1, '每天凌晨检查拥有WALLET_AUTO_CREATE角色但未创建钱包的用户并补建'
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1 FROM `pjcloudx_job`.`sys_job`
    WHERE `job_name` = '钱包自动创建补漏检查' AND `job_group` = 'WALLET' AND `tenant_id` = 1
);

------------------------------------------------------------------------
五、内部端点与任务对应关系（@Inner + @NoToken 仅服务间调用，勿对外）
------------------------------------------------------------------------
  GET  /upms/user/inner/user-ids-by-role-code        按角色编码查当前有效用户ID列表
                                                     （本次新增，RemoteUserService
                                                      getInnerUserIdsByRoleCode）
  POST /wallet/wallet-manage/inner/ensure-auto-create-wallets
                                                     跨租户补建缺失钱包（本次新增，
                                                     RemoteWalletService
                                                      ensureAutoCreateWallets）

------------------------------------------------------------------------
六、回滚说明
------------------------------------------------------------------------
  停用任务：将 sys_job 该行 job_status 改为 '4'（删除）或 '3'（暂停）并重启
  daemon-quartz（或调 POST /sys-job/refresh-jobs）；
  代码回滚：回滚 upms-biz / wallet-biz / daemon-quartz 三个服务即可，本次无
  表结构变更、无菜单权限变更；已补建的钱包数据与正常创建的钱包一致，
  如确需清理请先与业务确认后按 wallet_manage / wallet_active 记录逐条核对处理。
