多人同时使用系统时,每个采购员账号拥有自己的一个或多个 Android 手机,手机不在采购员之间混用。为支持 #328 的一键关联/一键替换隔离,需要先建立可靠的“采购员 ↔ 手机”归属数据和维护入口。
建立设备归属的前置能力,供 #328 消费。交付范围:
不实现一键关联/替换候选过滤(由 #328 实施);不改 Android Agent、采集流程、采购流程、付款/下单、全局菜单权限或历史任务;不自动迁移设备归属;不执行真实采购。
这是新的设备管理界面和权限/数据功能,实施前必须先制作可访问的 QuantUX 或低保真原型并由用户确认。原型至少覆盖:正常列表、空状态、加载、无归属、分配/变更确认、解除归属确认、失败/冲突、无权限状态。原型确认前不得编写生产 UI。
设备归属、权限和数据库迁移属于高风险修改,实施前需明确授权。服务端必须最终校验归属,不能只信任前端。归属变更应记录操作者、时间和前后归属;并发分配冲突不得静默覆盖。解除归属后设备不再出现在采购员候选中,但不删除设备或历史任务。
完成并验收本单后,#328 才可解除阻塞并实施。#328 不得在本单完成前自行创建归属字段或临时绕过归属校验。
本单仅创建需求记录,保持待实施。Gitea MCP 未暴露,使用项目安全配置 API 回退创建。
6ab086dd191a826306a7fed7
请先审核并确认该 v1 原型;确认后再授权实施数据库迁移、权限写入和管理员维护界面。
核对确认:QuantUX 的 Label/Button 渲染使用 props.label;原型控件创建时只写入了 props.text,因此预览/导出可能出现空白。该判断正确。
props.label
props.text
已对 App 6ab086dd191a826306a7fed7 的全部 Label/Button 补齐对应 props.label,保留原 props.text 作为兼容字段。重新执行 QuantUX 导出一致性验证:PASS,4 个页面、31 个控件、无运行时错误。
更新后的预览链接不变: https://qux.ilapage.cn/#/apps/6ab086dd191a826306a7fed7.html
仍未修改生产代码、数据库、权限或设备归属数据;请按修正后的原型审核。
按确认方案,本单不再新增独立设备管理页面,也不改变采集/采购流程。
不新增独立管理页面;复用现有设备列表/编辑交互。原型仅作为现有列表新增归属字段和编辑状态的设计证据,已修正 QuantUX props.label 显示问题: https://qux.ilapage.cn/#/apps/6ab086dd191a826306a7fed7.html
本评论是范围更新和实施起点;不新增菜单权限,不执行真实采购/下单。数据库迁移、权限写入、发布/重启仍按项目高风险规则在对应动作前确认授权。
提交:bb1a410(已推送 main)。
bb1a410
agent_device.owner_user_id
GET /api/admin/v1/devices/owners
PATCH /api/admin/v1/devices/:deviceId/owner
1789800300000_device_owner.go
go test ./app/goauto/device ./app/goauto/migrations ./cmd/migrate/migration/...
npm run build:prod
已按授权使用本地 D:\OPC\goauto\config.yaml 执行迁移,连接本机 MySQL(未触碰线上)。
D:\OPC\goauto\config.yaml
结果:
sys_migration
1789800300000
beec630
当前仍需在本地 Admin 设备列表给手机分配采购员,之后采购员才能在 #328 一键关联/替换中看到自己的设备。
已按授权发布 main 提交 5e0a9d1,发布标识 20260922-5e0a9d1-328-330。
5e0a9d1
20260922-5e0a9d1-328-330
/home/goauto/current
goauto.service
4a6806759108901808acaf162959909ece6c46d5dab02acdd56df30bccd315e8
状态:待线上功能验收。
No dependencies set.
The note is not visible to the blocked user.
原始需求
多人同时使用系统时,每个采购员账号拥有自己的一个或多个 Android 手机,手机不在采购员之间混用。为支持 #328 的一键关联/一键替换隔离,需要先建立可靠的“采购员 ↔ 手机”归属数据和维护入口。
本单目标
建立设备归属的前置能力,供 #328 消费。交付范围:
非目标
不实现一键关联/替换候选过滤(由 #328 实施);不改 Android Agent、采集流程、采购流程、付款/下单、全局菜单权限或历史任务;不自动迁移设备归属;不执行真实采购。
设计门禁
这是新的设备管理界面和权限/数据功能,实施前必须先制作可访问的 QuantUX 或低保真原型并由用户确认。原型至少覆盖:正常列表、空状态、加载、无归属、分配/变更确认、解除归属确认、失败/冲突、无权限状态。原型确认前不得编写生产 UI。
安全与风险
设备归属、权限和数据库迁移属于高风险修改,实施前需明确授权。服务端必须最终校验归属,不能只信任前端。归属变更应记录操作者、时间和前后归属;并发分配冲突不得静默覆盖。解除归属后设备不再出现在采购员候选中,但不删除设备或历史任务。
验收标准
依赖关系
完成并验收本单后,#328 才可解除阻塞并实施。#328 不得在本单完成前自行创建归属字段或临时绕过归属校验。
当前状态
本单仅创建需求记录,保持待实施。Gitea MCP 未暴露,使用项目安全配置 API 回退创建。
v1 低保真原型已创建,待审核
6ab086dd191a826306a7fed7请先审核并确认该 v1 原型;确认后再授权实施数据库迁移、权限写入和管理员维护界面。
原型显示问题已修正(2026-09-21)
核对确认:QuantUX 的 Label/Button 渲染使用
props.label;原型控件创建时只写入了props.text,因此预览/导出可能出现空白。该判断正确。已对 App
6ab086dd191a826306a7fed7的全部 Label/Button 补齐对应props.label,保留原props.text作为兼容字段。重新执行 QuantUX 导出一致性验证:PASS,4 个页面、31 个控件、无运行时错误。更新后的预览链接不变:
https://qux.ilapage.cn/#/apps/6ab086dd191a826306a7fed7.html
仍未修改生产代码、数据库、权限或设备归属数据;请按修正后的原型审核。
方案补充与范围收敛(2026-09-21)
按确认方案,本单不再新增独立设备管理页面,也不改变采集/采购流程。
最终范围
原型门禁调整
不新增独立管理页面;复用现有设备列表/编辑交互。原型仅作为现有列表新增归属字段和编辑状态的设计证据,已修正 QuantUX props.label 显示问题:
https://qux.ilapage.cn/#/apps/6ab086dd191a826306a7fed7.html
实施顺序
本评论是范围更新和实施起点;不新增菜单权限,不执行真实采购/下单。数据库迁移、权限写入、发布/重启仍按项目高风险规则在对应动作前确认授权。
实施完成,待验收(2026-09-21)
提交:
bb1a410(已推送 main)。已实现
agent_device.owner_user_id可空字段及索引;未归属设备保持可表示。GET /api/admin/v1/devices/ownersPATCH /api/admin/v1/devices/:deviceId/owner1789800300000_device_owner.go,复用 GoAuto 迁移集合创建字段。验证
go test ./app/goauto/device ./app/goauto/migrations ./cmd/migrate/migration/...npm run build:prod通过(保留既有 Vite CSS/大包警告)。待验收/待后续
本地迁移完成(2026-09-21)
已按授权使用本地
D:\OPC\goauto\config.yaml执行迁移,连接本机 MySQL(未触碰线上)。结果:
agent_device.owner_user_id已存在。sys_migration已记录1789800300000。beec630(记录迁移版本),已推送 main。当前仍需在本地 Admin 设备列表给手机分配采购员,之后采购员才能在 #328 一键关联/替换中看到自己的设备。
线上发布完成(2026-09-22)
已按授权发布 main 提交
5e0a9d1,发布标识20260922-5e0a9d1-328-330。/home/goauto/current已原子切换到该 release。1789800300000),其余 53 个已应用;未修改定时任务启停状态。goauto.service状态为 active,Nginx reload 成功。4a6806759108901808acaf162959909ece6c46d5dab02acdd56df30bccd315e8。状态:待线上功能验收。