提交图

332 次代码提交

作者 SHA1 备注 提交日期
Jenkins CI
7de609a6b8 ci: bump versions [tenant-service=1.0.10] [skip ci] 2026-07-04 03:20:42 +08:00
XuqmGroup
2937fb7cfb fix(tenant-service): 私有部署"一键更新"因异步请求超时半途失败
一键更新/重置接口用 StreamingResponseBody 长连接执行 docker pull + 重建容器,
docker pull 大镜像耗时经常超过 Tomcat 默认 30s 异步超时,导致处理线程被
InterruptedException 中断,更新流程半途而废(例如 pull tenant-web 卡住后
整个流程直接失败退出)。禁用该接口所在服务的异步请求超时。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 03:18:44 +08:00
Jenkins CI
cee8d8ba61 ci: bump versions [file-service=1.0.5] [skip ci] 2026-07-04 02:50:14 +08:00
XuqmGroup
e34ef26d73 feat(update-service,file-service): 下载页对已丢失的历史APK显示"无法下载"
新增 file-service GET /api/file/{hash}/exists 轻量存在性检查(不读取文件内容),
下载页为每个历史版本调用该接口确认文件是否真实存在;若已丢失(如本次修复之前
就已被 30 天回收任务误删),不再展示会 404 的下载按钮,改为显示"无法下载"提示。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 02:47:50 +08:00
Jenkins CI
25e39386d9 ci: bump versions [file-service=1.0.4] [skip ci] 2026-07-04 02:41:11 +08:00
Jenkins CI
319804d7de ci: bump versions [update-service=1.0.5] [skip ci] 2026-07-04 02:40:54 +08:00
XuqmGroup
9be2e71b82 feat(update-service,file-service): 按占用空间阈值清理历史APK,下载页兼容"从未点击发布"的真实数据
- 下载页/公开接口重新定义"曾上架":不再要求内部 PublishStatus=PUBLISHED,
  实际生产数据显示大多数租户只提交应用商店从不点击"发布",现改为
  PublishStatus 已发布 或 任一厂商 storeReviewStatus 显示 liveOnStore
- 新增 file-service DELETE /api/file/{hash}(X-Internal-Token 保护,销毁性操作不能像
  pin/GET 一样完全公开)
- 新增 ApkRetentionService:按 appKey 分组,从最新版本往回累加安装包大小,
  超过阈值(默认 5GB,可通过发布配置 JSON 里 apkRetentionMaxTotalSizeMb 按应用覆盖)
  即清理更旧版本的安装包,但永远保留最新版本
- AppVersionEntity 新增 fileSize 字段,上传时记录(本地存储路径直接取
  MultipartFile.getSize(),file-service 路径由前端一并上传时的 size 回传)
- 新增每日 02:00 自动重新 pin 所有历史 APK 的兜底任务,保护本次修复之前已上传、
  尚未被 pin 保护的历史版本

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 02:38:35 +08:00
Jenkins CI
acad056e55 ci: bump versions [file-service=1.0.3] [skip ci] 2026-07-04 02:20:15 +08:00
XuqmGroup
00fb02dff4 fix(file-service): add Flyway migration for pinned column, fix production crash
file-service uses ddl-auto=validate (Flyway-managed schema), not auto-DDL — the
previous commit added a pinned field to FileEntity with no matching migration,
so Hibernate schema validation failed at startup and crash-looped the service
in production. Add V2__add_pinned.sql to actually create the column.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 02:18:48 +08:00
Jenkins CI
efc12762e0 ci: bump versions [file-service=1.0.2] [skip ci] 2026-07-04 02:15:32 +08:00
XuqmGroup
eb0e3a1877 fix(file-service,update-service): APK 下载 500、文件被误回收;下载页支持历史版本
file-service:
- 新增 GlobalExceptionHandler(此前完全缺失,任何异常都变成裸 500,包括文件不存在)
- 修复 Content-Disposition 文件名未按 RFC 5987 编码,中文应用名会导致下载响应异常
- 新增 pinned 标记 + POST /api/file/{hash}/pin,30 天未访问自动回收任务不再误删仍被引用的文件

update-service:
- 上传 APK 到 file-service 后自动调用 pin,防止已发布版本的安装包被回收站清理
- PublicDownloadController 返回 Android 全部曾发布版本(PUBLISHED+DEPRECATED)历史列表,而非仅最新版本

tenant-platform:
- 下载页展示历史版本列表,支持下载任意历史 APK
- 版本管理页新增"复制对外下载页链接"入口,便于管理员查找/分享

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 02:12:55 +08:00
Jenkins CI
d9b87237a2 ci: bump versions [update-service=1.0.4] [skip ci] 2026-07-04 01:55:41 +08:00
XuqmGroup
7db07cc5fc fix(update-service): OPPO 商店状态字段读取修复、避免重复审核通知,新增默认更新说明与公开下载接口
- 修复 OPPO 状态查询读取 snake_case 字段名(version_code/version_name),解决版本已上线仍显示"审核中"
- 手动刷新厂商状态时若已是干净的 APPROVED+live 状态则跳过重复通知,避免重复发送【应用审核通知】
- 各厂商提交分支统一走 effectiveChangeLog(),更新说明为空时兜底默认文案
- 新增 GET /api/v1/updates/public/download-info 公开接口,支撑新的应用下载页

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 01:50:42 +08:00
Jenkins CI
032dd4be61 ci: bump versions [update-service=1.0.3] [skip ci] 2026-07-02 19:38:01 +08:00
XuqmGroup
8c0bcef237 fix: update store state to APPROVED when app is live even if version code doesn't match exactly
- When polled state is ONLINE but version codes don't match, still mark as APPROVED with nonCurrentRelease=true
- Prevents state getting stuck at UNDER_REVIEW when Huawei shows the app is already live
- Fixes issue where Huawei app is live but system still shows '审核中'

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 19:34:28 +08:00
Jenkins CI
a023e7faab ci: bump versions [update-service=1.0.2] [skip ci] 2026-07-02 18:59:46 +08:00
XuqmGroup
a6da4f3560 fix: prevent duplicate store submissions by adding SUBMITTING state guard
- Add SUBMITTING to skip guard in executeSubmitAsync to prevent concurrent uploads
- Add getSubmittingStores() public method to check SUBMITTING state
- Add controller-level check to reject submissions when stores are already uploading
- Prevents VIVO/Honor 'app is under review' errors from duplicate uploads

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 18:56:33 +08:00
Jenkins CI
786051510b ci: bump versions [push-service=1.0.9] [skip ci] 2026-06-26 18:27:27 +08:00
XuqmGroup
dedd5a61a0 fix(xiaomi): 增加 payload 传递和 extra.notify_effect=1 确保点击打开应用
- 推送请求携带 payload,SDK 点击通知后可从中解析 URL
- 固定设置 extra.notify_effect=1 确保 HyperOS 点击通知时打开应用

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:26:21 +08:00
Jenkins CI
ac2f83668e ci: bump versions [push-service=1.0.8] [skip ci] 2026-06-26 18:24:38 +08:00
XuqmGroup
ff9f91d341 fix(xiaomi): 修复 HyperOS 推送参数错误(channel_id → extra.channel_id)
旧 API 用 channel_id 字段,HyperOS V3 API 要求改用 extra.channel_id。
错误参数名导致所有小米推送返回 27001(channel相关信息不匹配)。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:16:41 +08:00
Jenkins CI
bc6135027f ci: bump versions [push-service=1.0.7] [skip ci] 2026-06-26 17:37:23 +08:00
XuqmGroup
60bc428e02 fix(xiaomi): 推送请求增加 INFO 日志,方便排查 27001 问题 2026-06-26 17:33:18 +08:00
Jenkins CI
7eb4d5ca1a ci: bump versions [tenant-service=1.0.9] [skip ci] 2026-06-26 16:21:59 +08:00
XuqmGroup
a20dd0db16 fix(tenant): listByApp 按平台去重,返回每个平台的服务记录
原实现按 serviceType findFirst,导致同一 serviceType 下不同平台
的配置(如 ANDROID/IOS/HARMONY PUSH)只返回第一条,ANDROID 推送
配置对外不可见。改为按 (serviceType, platform) 组合去重。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 16:17:01 +08:00
Jenkins CI
6830237a0e ci: bump versions [push-service=1.0.6] [skip ci] 2026-06-26 13:50:58 +08:00
XuqmGroup
7194126a4c fix(push): 修复设备换绑驱逐时 NonUniqueResultException
findByAppKeyAndDeviceId / findByAppKeyAndToken 改为返回 List,
避免 DB 中存在多条同 appKey+deviceId 记录时 Hibernate 抛出
NonUniqueResultException(HTTP 500)。
驱逐逻辑改为 stream + forEach,将所有旧用户记录一并清除。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 13:49:39 +08:00
Jenkins CI
86ab6e73ba ci: bump versions [push-service=1.0.5] [skip ci] 2026-06-26 13:44:39 +08:00
XuqmGroup
b4c236d234 fix(push): InternalPushController 补传 deviceId;设备换绑时驱逐原用户
- InternalPushController.testOffline 补传 deviceId=null,修复编译失败
- DeviceTokenRepository 新增 findByAppKeyAndDeviceId / findByAppKeyAndToken
- registerToken 在同 appKey 下同设备/同 token 被新用户注册时,
  自动删除旧用户的 push token,防止旧用户继续收到新用户的消息

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 13:42:48 +08:00
XuqmGroup
68f6145c71 feat(push): 测试推送支持指定设备;改进小米/VIVO 错误日志
- TestOfflineRequest 新增 deviceId 字段,可直接推送到指定设备
- PushDispatcher 新增 pushToSpecificDevice(绕过 receivePush 过滤,适合测试)
- sendTestOfflineMessage:指定设备时 targetCount=1(设备已找到),sent=false 表示厂商拒绝
- XiaomiPushProvider:21301 鉴权失败时打印 appKey + 前缀供排查
- VivoPushProvider:发送失败时打印 VIVO 返回的错误码和描述

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 13:21:23 +08:00
Jenkins CI
c1a96af765 ci: bump versions [push-service=1.0.4] [skip ci] 2026-06-26 13:00:06 +08:00
XuqmGroup
a1f231ae10 fix(push): 改 ddl-auto 为 none,解决自定义迁移与 Hibernate 验证的启动顺序冲突
Hibernate validate 在 ApplicationReadyEvent 之前执行,
PushSchemaMigrationService 在 ApplicationReadyEvent 触发,导致每次
新增实体字段时服务启动失败(502)。
改为 none 后由 PushSchemaMigrationService 负责所有 DDL 变更。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 12:58:53 +08:00
Jenkins CI
f920da042e ci: bump versions [push-service=1.0.3] [skip ci] 2026-06-26 12:46:25 +08:00
XuqmGroup
18efcc1364 fix(push): PushAuthController.login 补传 romVersion 参数
registerToken 新增了 romVersion 参数,/auth/login 端点漏传导致编译失败。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 12:41:49 +08:00
XuqmGroup
83ca8c0f49 feat(push): 添加 romVersion 字段及设备 Token 查询接口
- DeviceTokenEntity: 新增 rom_version 字段(厂商系统版本)
- PushController: register 接口添加可选 romVersion 参数
- PushDispatcher: 注册时保存 romVersion
- PushDiagnosticsService.DeviceInfo: 返回 romVersion
- PushManagementController: 新增 GET /admin/devices/{id}/token 接口(管理端查完整 token)
- PushSchemaMigrationService: 添加 v20260626_add_rom_version 迁移

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 12:24:58 +08:00
Jenkins CI
0b1b4af8b3 ci: bump versions [push-service=1.0.2] [skip ci] 2026-06-26 11:26:41 +08:00
XuqmGroup
46b437d5c9 fix(push): 删除 push 表中遗留的 app_id 字段
push_device_token 和 push_device_login_log 中存在 NOT NULL 的 app_id 列,
为历史遗留字段(系统已统一使用 appKey),导致 INSERT 时报错 500。
通过 PushSchemaMigrationService 新增迁移删除该字段及对应的旧索引/约束,
并重建 idx_push_device_log_user_time 索引到正确的 app_key 列。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 11:25:27 +08:00
Jenkins CI
74028060a8 ci: bump versions [push-service=1.0.1] [skip ci] 2026-06-26 11:04:00 +08:00
2b2144fc6b fix(push): 开放 SDK 设备注册相关接口,无需 JWT
register/unregister/receive-push 只需 appKey+userId,
外部用户(无 userSig)应可正常完成 push 设备注册。
send 接口保持需要认证。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 10:54:25 +08:00
Jenkins CI
4c2e66eb72 ci: bump versions [tenant-service=1.0.8] [skip ci] 2026-06-25 17:25:23 +08:00
XuqmGroup
1bd9a39422 fix(push-config): 解决 schemaV2 vendors 嵌套与 upsert 问题
- SdkConfigController: 向 SDK 下发 pushConfig 时自动解包 vendors 层,客户端 SDK 读取 xiaomi/vivo 等顶层字段
- FeatureServiceManager.updateConfig: 改为 upsert 模式,服务未激活时先创建再更新,不再报 404

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 16:58:30 +08:00
Jenkins CI
6b73a757fb ci: bump xuqm-bugcollect-service=1.0.19 [skip ci] 2026-06-24 20:34:34 +08:00
Jenkins CI
71821f1862 ci: bump versions [file-service=1.0.1] [skip ci] 2026-06-24 19:05:33 +08:00
XuqmGroup
227425b80a fix(bugcollect): 修复 trend 接口 500 — GROUP BY 兼容 MySQL only_full_group_by
SELECT e.createdAt 配合 GROUP BY DATE(e.createdAt) 在 MySQL strict mode
下触发 Expression #1 of SELECT list is not in GROUP BY clause 错误。
改为 MIN(e.createdAt) 作为聚合列,类型不变,LogService 无需修改。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 18:53:49 +08:00
Jenkins CI
16dcd5ebac ci: bump versions [tenant-service=1.0.7] [skip ci] 2026-06-24 18:25:59 +08:00
XuqmGroup
beb8b57fc1 fix: checkForUpdates 中排除 nginx 版本对比
nginx 使用官方镜像,不携带语义版本标签,在版本对比表格中显示
"未知 / 未知" 无实际意义。将 nginx 保留在 OTHER_SERVICES(一键更新
时仍会重建容器),但从 checkForUpdates() 的 services map 中移除。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 18:20:25 +08:00
Jenkins CI
e402366f0d ci: bump versions [tenant-service=1.0.6] [skip ci] 2026-06-24 17:04:44 +08:00
XuqmGroup
1151724a2a fix: readCurrentVersion 优先读 /app/SERVICE_VERSION,修复 currentVersion 永远返回 "1.0.0"
Dockerfile 中 COPY VERSION /app/VERSION 拷贝的是 repo 根目录的静态文件(始终是 "1.0.0"),
实际构建版本通过 build-arg SERVICE_VERSION 写入 /app/SERVICE_VERSION。
改为优先读 /app/SERVICE_VERSION,使 check-update 返回正确的 currentVersion。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 17:01:59 +08:00
Jenkins CI
b851a83e10 ci: bump versions [tenant-service=1.0.5] [skip ci] 2026-06-24 16:46:14 +08:00
XuqmGroup
9580f77b68 fix: 服务 changed 状态以本地/云端版本比对为准,不依赖 manifest 的 changed 字段
manifest.changed 是 Jenkins 构建时标记的,表示"本次 release 有改动",
不能反映私有部署是否需要更新。改为 current != latest 比对,
避免 current==latest 时误报"有更新"。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 16:42:56 +08:00