功能:Agent 采集任务详情页显示颜色图片 #185

Open
opened 2026-09-01 09:23:10 +08:00 by ila · 5 comments
Owner

Gitea MCP 未向当前会话暴露,按仓库规则回退项目根目录安全配置与 Gitea API 维护本工单;凭据未写入工单、代码或日志。

2026-09-01 界面细节确认(已确认):图片区域固定放在详情卡片内「SKU:N 条」这一行下方(同一张卡片内新增子视图,紧跟现有信息文本),支持点击缩略图放大查看;放大查看用一个简单的对话框展示大图(点击缩略图弹出、点击空白或返回关闭),不引入额外图库依赖。

原始需求摘要

来源:用户于 2026-09-01 提出,Agent 端采集任务详情和采购任务详情都不能查看图片,问是否合理加上。经讨论后用户明确要求:先做采集任务详情(数据现成、价值直接),采购任务详情作为后续可选项,本单不做。

目的:让现场作业能在 Agent 手机上直接核对采集到的颜色截图是否正确、清晰、对应正确颜色,不用切到 admin 才能看。

基线与已核实事实

代码基线:5338dd0(2026-09-01)。核验日期 2026-09-01。

  • 颜色图片数据已存在:pdd_product_color_image 表(SourceTaskID 记录来源采集任务,SourceDeviceID 记录来源设备),由 task.UploadColorImage(task/color_image_service.go:40)在采集提交后写入,公开路径前缀 /static/uploadfile/goauto-color/(color_image_service.go:30),经 sys_router.go:54 的 r.Static("/static", "./static") 无鉴权对外提供,Agent 已配置的服务端地址可直接拼接访问,无需新增网络权限或域名白名单。
  • Android 端 AndroidManifest.xml:19 已声明 usesCleartextTraffic="true",明文/加密访问均不受阻。
  • 该表为每商品每颜色最多一行(ux_pdd_product_color_image 唯一索引 on pdd_product_id, color),新采集会覆盖旧图(color_image_service.go 的 clause.OnConflict upsert,旧文件由 removeReplacedColorImage 删除)。因此若同一 PDD 商品的同一颜色被后续任务重新采集,source_task_id 会指向最新那次任务,较早任务的详情将不再显示该颜色的图——这是准确行为(图确实已被覆盖),需要在文案里说明,不是缺陷。
  • Agent 端采集详情接口 task.AgentHistoryDetail(task/agent_history.go:138-184)当前只查询并返回 colorPrices、skus、dimensions、missing 等字段,完全没有查询或返回颜色图片;admin 端等价接口 product.Detail(product/service.go:227-237)已有现成的查询与响应模式(ColorImageView{Color, ImagePath, Width, Height, UpdatedAt})可直接参考复用查询写法。
  • Android 端响应结构 CollectionHistoryDetail(AgentApiClient.kt:115-125)与其 JSON 解析(:442-465)均无图片字段,需要同步扩展。
  • Agent 应用目前没有任何图片渲染能力:TaskHistoryFragment 及其余 UI 代码里没有 ImageView,build.gradle 未引入 Glide/Coil 等图片加载库,采集/采购详情页目前全部由纯文字标签拼成。本单是 Agent 第一次需要展示图片,需新增基础设施(图片加载库或使用系统原生方案)而不只是加字段。
  • 采集失败的图片诊断原因(COLOR_IMAGE_LOCATE_FAILED/CROP_FAILED/UNSUPPORTED/UPLOAD_FAILED 等,定义于 persistence/AgentDiagnosticStore.kt:47-52)目前只写入设备本地 SQLite(agent_diagnostic 表),服务端和 Agent 的历史详情接口均未读取;本单不涉及把诊断原因接入详情页,只做"展示已成功采集到的图片"。

目标

  1. Agent 采集任务详情页新增颜色图片展示区,显示该任务当前仍归属的颜色图片(按颜色分组,缩略图形式)。
  2. 服务端 AgentHistoryDetail 响应扩展颜色图片字段,只返回归属于本任务(source_task_id = 本任务ID)的记录,不返回该 PDD 商品下由其他任务采集的图片。
  3. 无图片时显示明确的空状态,不报错、不显示破图。

非目标

  • 不实现采购任务详情的图片查看,另行评估、需要时另建工单。
  • 不修改颜色图片的采集、上传、覆盖(upsert)逻辑,不改变"同颜色只保留最新一次采集"的既有行为。
  • 不新增图片鉴权机制,沿用现有 /static 无鉴权公开路径;如需收紧鉴权是更大范围的改动,不在本单处理。
  • 不接入 Agent 本地诊断原因(agent_diagnostic)到详情页,只展示已成功采集到的图片本身。
  • 不支持点击放大查看之外的编辑、下载、分享等操作。
  • 不涉及权限、并发、迁移、订单、支付。

前置依赖与并行性

  • 无服务端数据依赖(数据已存在),纯"新增读取与展示"改动。
  • 与 #164、#165、#178、#179、#184 均无代码重叠,可并行。
  • Android 端需要先确定图片加载方案(新增依赖库 vs 用系统 BitmapFactory/ImageView 手动加载),属于本单实施前需要确定的技术选型,不预先假定。

固定实施方案(含 2026-09-01 界面细节确认)

1. 服务端

  • task/agent_history.go 的 AgentHistoryDetail:新增查询 pdd_product_color_image where source_task_id = taskID,按 color ASC 排序。
  • AgentCollectionDetail 新增字段 ColorImages []AgentColorImage,AgentColorImage{Color, ImagePath, Width, Height}(复用 admin 端 ColorImageView 的字段命名习惯,保持跨端一致)。
  • 不新增接口,不改变现有字段的语义和既有响应结构。

2. Android 网络层

  • AgentApiClient.kt 的 CollectionHistoryDetail 新增 colorImages: List<HistoryColorImage> 字段及对应 JSON 解析,模式与现有 colorPrices 解析一致。
  • 图片 URL 由服务端返回的相对路径 + 已配置的 serverUrl() 拼接得到完整地址,不新增单独的图片域名配置。

3. Android UI

  • 先确定图片加载方案(新增依赖或原生方案),评估包体积、加载失败处理、内存占用后再实施。
  • TaskHistoryFragment.renderCollectionDetail 在现有 info 文本控件(以"SKU:N 条"结尾)之后,同一张卡片内新增颜色图片区域:按颜色分组展示缩略图,加载失败显示占位而非崩溃或空白,无图片时显示"暂无颜色图片"一类空状态文案。位置已确认,紧跟 SKU 行,不跳到卡片外。
  • 点击缩略图弹出放大查看 Dialog:展示同一张图的原图,点击空白处或返回键关闭;复用缩略图的图片加载能力,不引入独立的图库/相册类依赖,不做裁剪、旋转、缩放手势之外的编辑。

设计证据

新增展示区域涉及采集详情页的布局调整,且是 Agent 首次引入图片渲染,按规则需要标注截图或低保真图交用户确认,覆盖:有图片(单色/多色)、无图片、加载失败、点击放大四个状态。图片位置(紧跟 SKU 行)与是否支持点击放大已于 2026-09-01 确认,标注截图只需体现具体视觉呈现,无需重新讨论这两点。

验收标准

  • 采集任务详情页正确显示该任务当前仍归属的颜色图片,按颜色分组。
  • 该 PDD 商品的某颜色已被后续任务重新采集覆盖时,本任务详情不再显示该颜色的图(准确反映"已被覆盖",不报错)。
  • 无任何颜色图片时显示明确空状态,不显示破图或崩溃。
  • 图片加载失败(网络异常等)有明确占位,不影响页面其余内容正常显示。
  • 图片区域位于详情卡片内「SKU:N 条」这一行下方,同一张卡片内,不跳出卡片。
  • 点击缩略图弹出放大查看 Dialog,展示原图;点击空白处或返回键可关闭,不影响详情页其余交互。
  • 服务端只返回归属于该任务本身的颜色图片,不泄露同一 PDD 商品下其他任务采集的图片。
  • 未修改颜色图片采集、上传、覆盖的既有逻辑;未新增图片鉴权机制。
  • 采购任务详情页未受影响,无图片相关改动。
  • Android 与 Server 单元测试、契约测试与构建通过。

必测场景

  • 单色、多色、无颜色规格三种商品的采集任务详情。
  • 该任务采集后,同商品同颜色被另一个更晚的任务重新采集覆盖,验证本任务详情图片正确消失。
  • 图片文件本身可访问 vs 服务端地址不可达(模拟网络异常),验证加载失败占位而非崩溃。
  • 点击缩略图 → 弹出大图 Dialog → 点空白/返回关闭 → 回到详情页状态不变。
  • 采购任务详情页保持无图片展示,无回归。

风险与安全门禁

  • 不新增图片鉴权,沿用现状(已知的既有暴露面,不因本单扩大——只是把已可访问的 URL 交给 Agent 展示,不改变可访问性本身)。
  • Android 引入图片渲染是新基础设施,需评估依赖库的包体积与已知漏洞情况后再引入。
  • 不涉及权限、安全、并发、迁移、订单、支付。

文档影响

有长期文档影响。 Agent 采集任务详情接口新增响应字段,需更新 docs/08-agent-api-contract.md 中对应接口说明。在线回读 revision 后完成一次 sync 和一次 sync --check,revision 回写本工单。

状态

待确认(2026-09-01 创建;图片位置(紧跟 SKU 行)与点击放大需求已于同日确认;等待用户确认界面标注截图(具体视觉呈现)后方可实施)。

> Gitea MCP 未向当前会话暴露,按仓库规则回退项目根目录安全配置与 Gitea API 维护本工单;凭据未写入工单、代码或日志。 > > **2026-09-01 界面细节确认(已确认)**:图片区域固定放在详情卡片内「SKU:N 条」这一行下方(同一张卡片内新增子视图,紧跟现有信息文本),支持点击缩略图放大查看;放大查看用一个简单的对话框展示大图(点击缩略图弹出、点击空白或返回关闭),不引入额外图库依赖。 ## 原始需求摘要 来源:用户于 2026-09-01 提出,Agent 端采集任务详情和采购任务详情都不能查看图片,问是否合理加上。经讨论后用户明确要求:先做采集任务详情(数据现成、价值直接),采购任务详情作为后续可选项,本单不做。 目的:让现场作业能在 Agent 手机上直接核对采集到的颜色截图是否正确、清晰、对应正确颜色,不用切到 admin 才能看。 ## 基线与已核实事实 代码基线:`5338dd0`(2026-09-01)。核验日期 2026-09-01。 - 颜色图片数据已存在:`pdd_product_color_image` 表(`SourceTaskID` 记录来源采集任务,`SourceDeviceID` 记录来源设备),由 `task.UploadColorImage`(`task/color_image_service.go:40`)在采集提交后写入,公开路径前缀 `/static/uploadfile/goauto-color/`(`color_image_service.go:30`),经 `sys_router.go:54` 的 `r.Static("/static", "./static")` **无鉴权**对外提供,Agent 已配置的服务端地址可直接拼接访问,无需新增网络权限或域名白名单。 - Android 端 `AndroidManifest.xml:19` 已声明 `usesCleartextTraffic="true"`,明文/加密访问均不受阻。 - 该表为**每商品每颜色最多一行**(`ux_pdd_product_color_image` 唯一索引 on `pdd_product_id, color`),新采集会覆盖旧图(`color_image_service.go` 的 `clause.OnConflict` upsert,旧文件由 `removeReplacedColorImage` 删除)。因此若同一 PDD 商品的同一颜色被后续任务重新采集,`source_task_id` 会指向最新那次任务,**较早任务的详情将不再显示该颜色的图**——这是准确行为(图确实已被覆盖),需要在文案里说明,不是缺陷。 - Agent 端采集详情接口 `task.AgentHistoryDetail`(`task/agent_history.go:138-184`)当前只查询并返回 `colorPrices`、`skus`、`dimensions`、`missing` 等字段,**完全没有查询或返回颜色图片**;admin 端等价接口 `product.Detail`(`product/service.go:227-237`)已有现成的查询与响应模式(`ColorImageView{Color, ImagePath, Width, Height, UpdatedAt}`)可直接参考复用查询写法。 - Android 端响应结构 `CollectionHistoryDetail`(`AgentApiClient.kt:115-125`)与其 JSON 解析(`:442-465`)均无图片字段,需要同步扩展。 - **Agent 应用目前没有任何图片渲染能力**:`TaskHistoryFragment` 及其余 UI 代码里没有 `ImageView`,`build.gradle` 未引入 Glide/Coil 等图片加载库,采集/采购详情页目前全部由纯文字标签拼成。本单是 Agent 第一次需要展示图片,需新增基础设施(图片加载库或使用系统原生方案)而不只是加字段。 - 采集失败的图片诊断原因(`COLOR_IMAGE_LOCATE_FAILED`/`CROP_FAILED`/`UNSUPPORTED`/`UPLOAD_FAILED` 等,定义于 `persistence/AgentDiagnosticStore.kt:47-52`)目前只写入设备本地 SQLite(`agent_diagnostic` 表),服务端和 Agent 的历史详情接口均未读取;本单不涉及把诊断原因接入详情页,只做"展示已成功采集到的图片"。 ## 目标 1. Agent 采集任务详情页新增颜色图片展示区,显示该任务当前仍归属的颜色图片(按颜色分组,缩略图形式)。 2. 服务端 `AgentHistoryDetail` 响应扩展颜色图片字段,只返回归属于本任务(`source_task_id = 本任务ID`)的记录,不返回该 PDD 商品下由其他任务采集的图片。 3. 无图片时显示明确的空状态,不报错、不显示破图。 ## 非目标 - 不实现采购任务详情的图片查看,另行评估、需要时另建工单。 - 不修改颜色图片的采集、上传、覆盖(upsert)逻辑,不改变"同颜色只保留最新一次采集"的既有行为。 - 不新增图片鉴权机制,沿用现有 `/static` 无鉴权公开路径;如需收紧鉴权是更大范围的改动,不在本单处理。 - 不接入 Agent 本地诊断原因(`agent_diagnostic`)到详情页,只展示已成功采集到的图片本身。 - 不支持点击放大查看之外的编辑、下载、分享等操作。 - 不涉及权限、并发、迁移、订单、支付。 ## 前置依赖与并行性 - 无服务端数据依赖(数据已存在),纯"新增读取与展示"改动。 - 与 #164、#165、#178、#179、#184 均无代码重叠,可并行。 - Android 端需要先确定图片加载方案(新增依赖库 vs 用系统 `BitmapFactory`/`ImageView` 手动加载),属于本单实施前需要确定的技术选型,不预先假定。 ## 固定实施方案(含 2026-09-01 界面细节确认) ### 1. 服务端 - `task/agent_history.go` 的 `AgentHistoryDetail`:新增查询 `pdd_product_color_image` where `source_task_id = taskID`,按 `color ASC` 排序。 - `AgentCollectionDetail` 新增字段 `ColorImages []AgentColorImage`,`AgentColorImage{Color, ImagePath, Width, Height}`(复用 admin 端 `ColorImageView` 的字段命名习惯,保持跨端一致)。 - 不新增接口,不改变现有字段的语义和既有响应结构。 ### 2. Android 网络层 - `AgentApiClient.kt` 的 `CollectionHistoryDetail` 新增 `colorImages: List<HistoryColorImage>` 字段及对应 JSON 解析,模式与现有 `colorPrices` 解析一致。 - 图片 URL 由服务端返回的相对路径 + 已配置的 `serverUrl()` 拼接得到完整地址,不新增单独的图片域名配置。 ### 3. Android UI - 先确定图片加载方案(新增依赖或原生方案),评估包体积、加载失败处理、内存占用后再实施。 - `TaskHistoryFragment.renderCollectionDetail` 在现有 `info` 文本控件(以"SKU:N 条"结尾)之后,**同一张卡片内**新增颜色图片区域:按颜色分组展示缩略图,加载失败显示占位而非崩溃或空白,无图片时显示"暂无颜色图片"一类空状态文案。位置已确认,紧跟 SKU 行,不跳到卡片外。 - 点击缩略图弹出放大查看 Dialog:展示同一张图的原图,点击空白处或返回键关闭;复用缩略图的图片加载能力,不引入独立的图库/相册类依赖,不做裁剪、旋转、缩放手势之外的编辑。 ## 设计证据 新增展示区域涉及采集详情页的布局调整,且是 Agent 首次引入图片渲染,按规则需要标注截图或低保真图交用户确认,覆盖:有图片(单色/多色)、无图片、加载失败、点击放大四个状态。图片位置(紧跟 SKU 行)与是否支持点击放大已于 2026-09-01 确认,标注截图只需体现具体视觉呈现,无需重新讨论这两点。 ## 验收标准 - [ ] 采集任务详情页正确显示该任务当前仍归属的颜色图片,按颜色分组。 - [ ] 该 PDD 商品的某颜色已被后续任务重新采集覆盖时,本任务详情不再显示该颜色的图(准确反映"已被覆盖",不报错)。 - [ ] 无任何颜色图片时显示明确空状态,不显示破图或崩溃。 - [ ] 图片加载失败(网络异常等)有明确占位,不影响页面其余内容正常显示。 - [ ] 图片区域位于详情卡片内「SKU:N 条」这一行下方,同一张卡片内,不跳出卡片。 - [ ] 点击缩略图弹出放大查看 Dialog,展示原图;点击空白处或返回键可关闭,不影响详情页其余交互。 - [ ] 服务端只返回归属于该任务本身的颜色图片,不泄露同一 PDD 商品下其他任务采集的图片。 - [ ] 未修改颜色图片采集、上传、覆盖的既有逻辑;未新增图片鉴权机制。 - [ ] 采购任务详情页未受影响,无图片相关改动。 - [ ] Android 与 Server 单元测试、契约测试与构建通过。 ## 必测场景 - 单色、多色、无颜色规格三种商品的采集任务详情。 - 该任务采集后,同商品同颜色被另一个更晚的任务重新采集覆盖,验证本任务详情图片正确消失。 - 图片文件本身可访问 vs 服务端地址不可达(模拟网络异常),验证加载失败占位而非崩溃。 - 点击缩略图 → 弹出大图 Dialog → 点空白/返回关闭 → 回到详情页状态不变。 - 采购任务详情页保持无图片展示,无回归。 ## 风险与安全门禁 - 不新增图片鉴权,沿用现状(已知的既有暴露面,不因本单扩大——只是把已可访问的 URL 交给 Agent 展示,不改变可访问性本身)。 - Android 引入图片渲染是新基础设施,需评估依赖库的包体积与已知漏洞情况后再引入。 - 不涉及权限、安全、并发、迁移、订单、支付。 ## 文档影响 **有长期文档影响。** Agent 采集任务详情接口新增响应字段,需更新 `docs/08-agent-api-contract.md` 中对应接口说明。在线回读 revision 后完成一次 `sync` 和一次 `sync --check`,revision 回写本工单。 ## 状态 待确认(2026-09-01 创建;图片位置(紧跟 SKU 行)与点击放大需求已于同日确认;等待用户确认界面标注截图(具体视觉呈现)后方可实施)。
Author
Owner

界面低保真草案 v1(2026-09-01,待用户确认;尚未编写生产代码)。当前会话未暴露 Gitea MCP,按仓库规则回退 Gitea API。

设计依据:沿用 Agent 当前详情卡片、Roboto/系统主题与 4/8dp 间距;缩略图触控区 88 x 88dp(高于 48dp 无障碍下限),图片加载时预留固定尺寸避免跳动;每张图提供“颜色 + 查看大图”的无障碍描述。

【有图:SKU 行下方,同一详情卡片内】
SKU:11 条

颜色图片
[ 88dp 图 ]  [ 88dp 图 ]  [ 88dp 图 ]
    红色         深蓝色        米白色
(3 列网格,8dp 间距;多色自动换行;点击任一缩略图放大)

【无图】
颜色图片
暂无颜色图片
同色图片被后续采集覆盖后,也不会在本任务中显示。

【加载中 / 失败:尺寸不变】
[ 进度指示 ]  ->  [ 图片加载失败 ]
     红色                 红色
失败不影响详情中的文字、规格和操作按钮。

【点击放大】
+----------------+
| 红色            |
|                |
|    自适应大图    |
|                |
|          [关闭] |
+----------------+
点击遮罩、系统返回或“关闭”均可退出;不提供下载、分享、编辑。

覆盖状态:单色/多色、有图、无图、加载中、加载失败、点击放大。实现选型拟采用 Android 原生 ImageView + 后台 HttpURLConnection/BitmapFactory、内存缩放与主线程回填,不新增第三方图库依赖;详情退出时取消或忽略过期回调。

界面低保真草案 v1(2026-09-01,待用户确认;尚未编写生产代码)。当前会话未暴露 Gitea MCP,按仓库规则回退 Gitea API。 设计依据:沿用 Agent 当前详情卡片、Roboto/系统主题与 4/8dp 间距;缩略图触控区 88 x 88dp(高于 48dp 无障碍下限),图片加载时预留固定尺寸避免跳动;每张图提供“颜色 + 查看大图”的无障碍描述。 ```text 【有图:SKU 行下方,同一详情卡片内】 SKU:11 条 颜色图片 [ 88dp 图 ] [ 88dp 图 ] [ 88dp 图 ] 红色 深蓝色 米白色 (3 列网格,8dp 间距;多色自动换行;点击任一缩略图放大) 【无图】 颜色图片 暂无颜色图片 同色图片被后续采集覆盖后,也不会在本任务中显示。 【加载中 / 失败:尺寸不变】 [ 进度指示 ] -> [ 图片加载失败 ] 红色 红色 失败不影响详情中的文字、规格和操作按钮。 【点击放大】 +----------------+ | 红色 | | | | 自适应大图 | | | | [关闭] | +----------------+ 点击遮罩、系统返回或“关闭”均可退出;不提供下载、分享、编辑。 ``` 覆盖状态:单色/多色、有图、无图、加载中、加载失败、点击放大。实现选型拟采用 Android 原生 ImageView + 后台 HttpURLConnection/BitmapFactory、内存缩放与主线程回填,不新增第三方图库依赖;详情退出时取消或忽略过期回调。
Author
Owner

用户已于 2026-09-01 确认低保真草案 v1(评论 #6703),覆盖位置、三列缩略图、有图/无图/加载失败和大图对话框状态。现进入生产代码实施。

用户已于 2026-09-01 确认低保真草案 v1(评论 #6703),覆盖位置、三列缩略图、有图/无图/加载失败和大图对话框状态。现进入生产代码实施。
Author
Owner

v1 实施完成,等待验收

实现

  • Agent 采集任务详情接口新增 colorImages,只返回 source_task_id 仍指向当前任务的颜色图片;旧任务图片被后续采集覆盖后返回空数组。
  • Android 采集详情在 SKU 行后展示“颜色图片”:三列、88dp 缩略图、8dp 间距,覆盖空、加载、失败状态。
  • 点击缩略图打开大图对话框,可通过遮罩、返回键或“关闭”退出;补充可访问性描述。
  • 图片加载使用原生 HttpURLConnection、BitmapFactory、下采样与 LRU 缓存;仅允许服务端 /static/uploadfile/goauto-color/ 路径,限制 5MB、超时且不跟随重定向,不引入第三方图片库。
  • Android 版本升级为 0.9.37(versionCode 50)。

验证与证据

  • 服务端颜色图片来源归属、空数组兼容测试通过;go test ./... 与服务端构建通过。
  • Android JSON 兼容、图片 URL 边界/下采样、debug/release 单测与 debug APK 构建通过。
  • Web 生产构建、DevHarness strict、Wiki 一次同步与一次一致性检查通过。
  • 一键全量验证只被本次未改动的采购任务页面存量 Web lint 错误阻断,未扩大本工单修复。
  • 提交并推送:3aab1f0 feat(goauto): 完善替代采集与颜色图片详情 (#184 #185)。
  • Wiki:Business-Rules-and-Glossary revision 36d7285beb3f0c8441e38b4e9e81e5cf7256b603;Android-Agent-API-Contract revision 0f448673dbec00a351c397d30926f0c5090a1141。
  • APK:6,255,365 bytes,SHA-256 8612553a28524d72e095e8e855a5b6a9789db59f0ff9c521e8a37b551c64cb71。

发布与未验证项

  • 已打包本地发布物;线上发布和设置当前 Agent 版本等待发布前人工确认。
  • 尚未安装到真机,因此未完成真实颜色图片的视觉/点击验收;未保存整屏截图或控件树。
## v1 实施完成,等待验收 ### 实现 - Agent 采集任务详情接口新增 `colorImages`,只返回 `source_task_id` 仍指向当前任务的颜色图片;旧任务图片被后续采集覆盖后返回空数组。 - Android 采集详情在 SKU 行后展示“颜色图片”:三列、88dp 缩略图、8dp 间距,覆盖空、加载、失败状态。 - 点击缩略图打开大图对话框,可通过遮罩、返回键或“关闭”退出;补充可访问性描述。 - 图片加载使用原生 `HttpURLConnection`、`BitmapFactory`、下采样与 LRU 缓存;仅允许服务端 `/static/uploadfile/goauto-color/` 路径,限制 5MB、超时且不跟随重定向,不引入第三方图片库。 - Android 版本升级为 0.9.37(versionCode 50)。 ### 验证与证据 - 服务端颜色图片来源归属、空数组兼容测试通过;`go test ./...` 与服务端构建通过。 - Android JSON 兼容、图片 URL 边界/下采样、debug/release 单测与 debug APK 构建通过。 - Web 生产构建、DevHarness strict、Wiki 一次同步与一次一致性检查通过。 - 一键全量验证只被本次未改动的采购任务页面存量 Web lint 错误阻断,未扩大本工单修复。 - 提交并推送:`3aab1f0 feat(goauto): 完善替代采集与颜色图片详情 (#184 #185)`。 - Wiki:Business-Rules-and-Glossary revision `36d7285beb3f0c8441e38b4e9e81e5cf7256b603`;Android-Agent-API-Contract revision `0f448673dbec00a351c397d30926f0c5090a1141`。 - APK:6,255,365 bytes,SHA-256 `8612553a28524d72e095e8e855a5b6a9789db59f0ff9c521e8a37b551c64cb71`。 ### 发布与未验证项 - 已打包本地发布物;线上发布和设置当前 Agent 版本等待发布前人工确认。 - 尚未安装到真机,因此未完成真实颜色图片的视觉/点击验收;未保存整屏截图或控件树。
Author
Owner

线上发布完成

  • 发布提交:3aab1f0。
  • 新发布目录:/home/goauto/releases/20260901-102000-3aab1f0;回滚目录:/home/goauto/releases/20260901-090504-c07c345,旧发布未删除。
  • 发布前/后运行中采集任务均为 0;处于 running、order_submit_started、order_result_unknown 的采购任务均为 0。
  • goauto.service 为 active;内部及外部 /api/v1/health 均为 HTTP 200,外部 Admin 首页为 HTTP 200;最近发布窗口无 service error 日志。
  • 服务二进制 SHA-256:40569d90bc6bcbd3b3edb14aca41f336a09c07f9a6b2dcadc1b06eca1184ca88。
  • Agent 0.9.37(versionCode 50)已登记为版本 ID 3 并设为当前;线上文件 6,255,365 bytes,SHA-256 8612553a28524d72e095e8e855a5b6a9789db59f0ff9c521e8a37b551c64cb71,与本地构建一致。
  • Agent /api/agent/v1/app/latest 无 Token 返回预期 DEVICE_TOKEN_INVALID,证明外部路由进入业务鉴权层。
  • Admin 页面可访问,但浏览器自动化读取设备页连续超时;因此在复核 Manifest 测试、文件哈希/大小、versionCode 唯一性、任务安全前置条件后,按 agent_app_release / agent_app_release_setting 现有服务契约完成登记与当前版本切换,并回读数据库及文件验证。
  • 已删除服务器 /tmp 上传包与解压暂存目录;正式发布目录、历史发布和 APK 版本均保留。
  • 未安装真机、未执行真实替代操作、采购、创建订单或付款;工单继续保持待用户验收。
## 线上发布完成 - 发布提交:`3aab1f0`。 - 新发布目录:`/home/goauto/releases/20260901-102000-3aab1f0`;回滚目录:`/home/goauto/releases/20260901-090504-c07c345`,旧发布未删除。 - 发布前/后运行中采集任务均为 0;处于 `running`、`order_submit_started`、`order_result_unknown` 的采购任务均为 0。 - `goauto.service` 为 `active`;内部及外部 `/api/v1/health` 均为 HTTP 200,外部 Admin 首页为 HTTP 200;最近发布窗口无 service error 日志。 - 服务二进制 SHA-256:`40569d90bc6bcbd3b3edb14aca41f336a09c07f9a6b2dcadc1b06eca1184ca88`。 - Agent 0.9.37(versionCode 50)已登记为版本 ID 3 并设为当前;线上文件 6,255,365 bytes,SHA-256 `8612553a28524d72e095e8e855a5b6a9789db59f0ff9c521e8a37b551c64cb71`,与本地构建一致。 - Agent `/api/agent/v1/app/latest` 无 Token 返回预期 `DEVICE_TOKEN_INVALID`,证明外部路由进入业务鉴权层。 - Admin 页面可访问,但浏览器自动化读取设备页连续超时;因此在复核 Manifest 测试、文件哈希/大小、versionCode 唯一性、任务安全前置条件后,按 `agent_app_release` / `agent_app_release_setting` 现有服务契约完成登记与当前版本切换,并回读数据库及文件验证。 - 已删除服务器 `/tmp` 上传包与解压暂存目录;正式发布目录、历史发布和 APK 版本均保留。 - 未安装真机、未执行真实替代操作、采购、创建订单或付款;工单继续保持待用户验收。
Author
Owner

线上 Agent APK 下载权限修复

用户在 Agent 0.9.35 点击“下载新版本”时收到“服务端处理失败”。根因确认:goauto.service 以 goauto:goauto 运行,但当前发布目录的 var/goauto-agent-releases 及 APK 属主为 root:root;目录 750、文件 640 导致服务进程无法 stat/open APK,版本检查可成功而下载接口返回 INTERNAL_ERROR。

已修复当前发布 /home/goauto/releases/20260901-102000-3aab1f0:

  • 先校验 current 解析目标及目录内无符号链接;
  • 目录和 48/49/50 三个 APK 属主改为 goauto:goauto;
  • 保持目录 750、文件 640,未放宽公开读取;
  • 以 goauto 用户成功完整读取 versionCode 50 APK,SHA-256 为 8612553a28524d72e095e8e855a5b6a9789db59f0ff9c521e8a37b551c64cb71;
  • goauto.service 为 active,内部和外部健康接口均为 HTTP 200。

未安装手机、未触发采购/订单/付款。等待用户在手机重新点击下载验证真实设备链路。

## 线上 Agent APK 下载权限修复 用户在 Agent 0.9.35 点击“下载新版本”时收到“服务端处理失败”。根因确认:`goauto.service` 以 `goauto:goauto` 运行,但当前发布目录的 `var/goauto-agent-releases` 及 APK 属主为 `root:root`;目录 `750`、文件 `640` 导致服务进程无法 `stat/open` APK,版本检查可成功而下载接口返回 `INTERNAL_ERROR`。 已修复当前发布 `/home/goauto/releases/20260901-102000-3aab1f0`: - 先校验 `current` 解析目标及目录内无符号链接; - 目录和 48/49/50 三个 APK 属主改为 `goauto:goauto`; - 保持目录 `750`、文件 `640`,未放宽公开读取; - 以 `goauto` 用户成功完整读取 versionCode 50 APK,SHA-256 为 `8612553a28524d72e095e8e855a5b6a9789db59f0ff9c521e8a37b551c64cb71`; - `goauto.service` 为 `active`,内部和外部健康接口均为 HTTP 200。 未安装手机、未触发采购/订单/付款。等待用户在手机重新点击下载验证真实设备链路。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#185