Admin:建立客户端与采购员绑定管理 #54

Closed
opened 2026-08-09 15:46:49 +08:00 by ila · 3 comments
Owner

基本信息

  • 状态:已完成
  • 类型:功能
  • 父级大工单:#14
  • 所属 MVP/版本:#15 Admin 四模块可用闭环
  • 阶段:Admin 登录与最小账号管理

要解决什么

当前 users 与 clients 互不关联,管理员无法说明某台客户端当前由哪位采购员负责,采购员登录后也会看到全部客户端。

需要建立“采购员—客户端”的当前归属及历史记录:

  • 一个采购员可以绑定多台客户端。
  • 一台客户端同一时间最多绑定一个采购员,也允许未绑定。
  • 客户端可从采购员 A 转交给采购员 B,并保留完整历史。
  • 只有管理员可以绑定、转交和解绑。
  • 管理员看到全部客户端;采购员只读看到当前绑定给自己的客户端。

做什么 / 不做什么

做什么

  • 新增仅追加的数据库迁移,保存客户端绑定历史、开始/结束时间和操作管理员。
  • 客户端列表按当前网页登录用户过滤,并显示当前负责人。
  • 管理员可在客户端列表绑定、转交、解绑;采购员不显示这些操作入口。
  • 管理员选择目标时只列出启用中的采购员。
  • 解绑必须二次确认;操作后给出明确成功或失败反馈。
  • 提供按网页登录用户查询可分配客户端的服务能力,供后续采购任务创建入口复用。
  • 同步更新 Admin 需求、数据模型、UI 与安全文档。

不做什么

  • 不合并 users 与 clients 表。
  • 不修改 Client 登记、领取、提交结果、提交失败四个接口的请求、响应或认证方式。
  • 不限制 Client 按 client_id 登记或领取任务。
  • 不改动已经分配、领取或执行中的任务。
  • 不在本工单实现仍为骨架的顺运宝采购任务创建全流程。
  • 不增加公开注册、复杂 RBAC、API Key 或 Client 登录。

已确认的实现方案

  1. 数据库版本升级到 v7,新增 client_user_assignments 历史表;使用“仅一个未结束记录”的唯一索引保证一台客户端最多一个当前负责人。
  2. 转交在同一事务中结束旧记录并创建新记录;解绑只结束当前记录,不删除历史。
  3. 绑定历史的 client_id 不级联删除;客户端删除后重新以同一稳定编号登记时仍能恢复其当前归属。
  4. Web 服务根据当前用户角色过滤列表:管理员全量,采购员仅当前绑定给自己的记录。
  5. 新增管理员专用 POST 路由,复用现有 Session、CSRF 和 AdminRequired 中间件。
  6. 采购员客户端列表为只读;客户端删除也仅允许管理员,避免采购员绕过归属管理。
  7. UI 延续现有三段式表格:新增“当前负责人”列;管理员使用绑定/转交弹窗和带确认的解绑按钮。提示文案明确“只改变负责人和网页可见范围,不影响 Client 接口与既有任务”。

预计修改文件:

  • admin/repository/db.go
  • admin/repository/client.go
  • admin/model/model.go
  • admin/service/service.go 及相关测试
  • admin/handler/web/others.go
  • admin/handler/web/web.go 及相关测试
  • admin/templates/client/list.html
  • admin/static/js/app.js(如弹窗数据回填需要)
  • docs/admin/01-requirements.md
  • docs/admin/03-data-model.md
  • docs/admin/05-ui-specification.md
  • docs/admin/06-quality-security.md

验收标准

  • 管理员能把未绑定客户端绑定给一个启用中的采购员。
  • 管理员能把客户端从采购员 A 转交给采购员 B,A 的历史记录保留且只有 B 为当前负责人。
  • 管理员能解绑客户端,解绑前有明确确认,解绑后客户端回到未绑定状态。
  • 同一客户端任何时刻最多一个当前负责人;一个采购员可以有多台客户端。
  • 管理员看到全部客户端及负责人;采购员只看到自己的客户端且没有绑定、解绑、删除入口。
  • 禁用中的采购员不能成为新���绑定目标,现有历史���被删除。
  • 绑定、转交、解绑均记录操作管理员和时间。
  • 删除并以同一 client_id 重新登记客户端后,当前绑定仍可识别。
  • 已有任务的 assigned_client、状态与执行流程不因绑定变化而修改。
  • Client 四个接口契约与 #52 回归测试保持通过。
  • 页面在 1366×768 下可完成操作,表单标签、焦点和反馈可用。
  • gofmt、go vet、go test ./... 通过。

验证方式

从仓库根目录执行:

cd admin
gofmt -w .
go vet ./...
go test ./...

浏览器人工验证:

  1. 管理员登录,在“客户端”页完成绑定、A→B 转交、解绑。
  2. 分别以 A、B 登录,确认只能看到当前归属自己的客户端且页面只读。
  3. 在 1366×768 窗口检查表格、弹窗、确认提示和操作反馈。
  4. 调用 Client 四接口回归用例,确认不受网页登录归属影响。

风险和回退

  • 风险:并发转交产生两个当前负责人。用事务和部分唯一索引双重约束。
  • 风险:误把网页登录归属用于 Client API,破坏现有领取流程。路由分组保持隔离并运行 #52 回归测试。
  • 风险:解绑或转交误改既有任务。实现只写绑定历史表,测试断言 tasks 不变化。
  • 回退:代码可回退到本工单前提交;v7 表为独立附加数据,不改写既有业务表。
## 基本信息 - 状态:已完成 - 类型:功能 - 父级大工单:#14 - 所属 MVP/版本:#15 Admin 四模块可用闭环 - 阶段:Admin 登录与最小账号管理 ## 要解决什么 当前 `users` 与 `clients` 互不关联,管理员无法说明某台客户端当前由哪位采购员负责,采购员登录后也会看到全部客户端。 需要建立“采购员—客户端”的当前归属及历史记录: - 一个采购员可以绑定多台客户端。 - 一台客户端同一时间最多绑定一个采购员,也允许未绑定。 - 客户端可从采购员 A 转交给采购员 B,并保留完整历史。 - 只有管理员可以绑定、转交和解绑。 - 管理员看到全部客户端;采购员只读看到当前绑定给自己的客户端。 ## 做什么 / 不做什么 ### 做什么 - 新增仅追加的数据库迁移,保存客户端绑定历史、开始/结束时间和操作管理员。 - 客户端列表按当前网页登录用户过滤,并显示当前负责人。 - 管理员可在客户端列表绑定、转交、解绑;采购员不显示这些操作入口。 - 管理员选择目标时只列出启用中的采购员。 - 解绑必须二次确认;操作后给出明确成功或失败反馈。 - 提供按网页登录用户查询可分配客户端的服务能力,供后续采购任务创建入口复用。 - 同步更新 Admin 需求、数据模型、UI 与安全文档。 ### 不做什么 - 不合并 `users` 与 `clients` 表。 - 不修改 Client 登记、领取、提交结果、提交失败四个接口的请求、响应或认证方式。 - 不限制 Client 按 `client_id` 登记或领取任务。 - 不改动已经分配、领取或执行中的任务。 - 不在本工单实现仍为骨架的顺运宝采购任务创建全流程。 - 不增加公开注册、复杂 RBAC、API Key 或 Client 登录。 ## 已确认的实现方案 1. 数据库版本升级到 v7,新增 `client_user_assignments` 历史表;使用“仅一个未结束记录”的唯一索引保证一台客户端最多一个当前负责人。 2. 转交在同一事务中结束旧记录并创建新记录;解绑只结束当前记录,不删除历史。 3. 绑定历史的 `client_id` 不级联删除;客户端删除后重新以同一稳定编号登记时仍能恢复其当前归属。 4. Web 服务根据当前用户角色过滤列表:管理员全量,采购员仅当前绑定给自己的记录。 5. 新增管理员专用 POST 路由,复用现有 Session、CSRF 和 `AdminRequired` 中间件。 6. 采购员客户端列表为只读;客户端删除也仅允许管理员,避免采购员绕过归属管理。 7. UI 延续现有三段式表格:新增“当前负责人”列;管理员使用绑定/转交弹窗和带确认的解绑按钮。提示文案明确“只改变负责人和网页可见范围,不影响 Client 接口与既有任务”。 预计修改文件: - `admin/repository/db.go` - `admin/repository/client.go` - `admin/model/model.go` - `admin/service/service.go` 及相关测试 - `admin/handler/web/others.go` - `admin/handler/web/web.go` 及相关测试 - `admin/templates/client/list.html` - `admin/static/js/app.js`(如弹窗数据回填需要) - `docs/admin/01-requirements.md` - `docs/admin/03-data-model.md` - `docs/admin/05-ui-specification.md` - `docs/admin/06-quality-security.md` ## 验收标准 - [x] 管理员能把未绑定客户端绑定给一个启用中的采购员。 - [x] 管理员能把客户端从采购员 A 转交给采购员 B,A 的历史记录保留且只有 B 为当前负责人。 - [x] 管理员能解绑客户端,解绑前有明确确认,解绑后客户端回到未绑定状态。 - [x] 同一客户端任何时刻最多一个当前负责人;一个采购员可以有多台客户端。 - [x] 管理员看到全部客户端及负责人;采购员只看到自己的客户端且没有绑定、解绑、删除入口。 - [x] 禁用中的采购员不能成为新���绑定目标,现有历史���被删除。 - [x] 绑定、转交、解绑均记录操作管理员和时间。 - [x] 删除并以同一 `client_id` 重新登记客户端后,当前绑定仍可识别。 - [x] 已有任务的 `assigned_client`、状态与执行流程不因绑定变化而修改。 - [x] Client 四个接口契约与 #52 回归测试保持通过。 - [x] 页面在 1366×768 下可完成操作,表单标签、焦点和反馈可用。 - [x] `gofmt`、`go vet`、`go test ./...` 通过。 ## 验证方式 从仓库根目录执行: ```powershell cd admin gofmt -w . go vet ./... go test ./... ``` 浏览器人工验证: 1. 管理员登录,在“客户端”页完成绑定、A→B 转交、解绑。 2. 分别以 A、B 登录,确认只能看到当前归属自己的客户端且页面只读。 3. 在 1366×768 窗口检查表格、弹窗、确认提示和操作反馈。 4. 调用 Client 四接口回归用例,确认不受网页登录归属影响。 ## 风险和回退 - 风险:并发转交产生两个当前负责人。用事务和部分唯一索引双重约束。 - 风险:误把网页登录归属用于 Client API,破坏现有领取流程。路由分组保持隔离并运行 #52 回归测试。 - 风险:解绑或转交误改既有任务。实现只写绑定历史表,测试断言 `tasks` 不变化。 - 回退:代码可回退到本工单前提交;v7 表为独立附加数据,不改写既有业务表。
Author
Owner

实施进度

已完成主要实现并进入回归阶段:

  • 数据库新增 v7 client_user_assignments 归属历史表和“每台客户端唯一当前负责人”索引。
  • 管理员可绑定、转交、解绑;采购员客户端列表只读且只显示自己的客户端。
  • 删除客户端也收紧为管理员操作;删除后同一 client_id 重新登记仍保留归属。
  • 转交/解绑只写归属历史,不修改 tasks,不改变 Client 四接口。
  • 已补服务层、迁移和真实 HTTP/模板权限测试。
  • 已同步需求、数据模型、UI、安全基线文档。

当前专项测试与 go vet ./...、go test ./... 已通过一次,正在做最终代码审查、全量回归和页面尺寸验证。

## 实施进度 已完成主要实现并进入回归阶段: - 数据库新增 v7 `client_user_assignments` 归属历史表和“每台客户端唯一当前负责人”索引。 - 管理员可绑定、转交、解绑;采购员客户端列表只读且只显示自己的客户端。 - 删除客户端也收紧为管理员操作;删除后同一 `client_id` 重新登记仍保留归属。 - 转交/解绑只写归属历史,不修改 `tasks`,不改变 Client 四接口。 - 已补服务层、迁移和真实 HTTP/模板权限测试。 - 已同步需求、数据模型、UI、安全基线文档。 当前专项测试与 `go vet ./...`、`go test ./...` 已通过一次,正在做最终代码审查、全量回归和页面尺寸验证。
Author
Owner

实施完成,待用户验收

最终实现

  • v7 新增客户端—采购员归属历史表,唯一索引保证一台客户端只有一个当前负责人。
  • 管理员可在客户端页绑定、转交、解绑;采购员只读查看当前绑定给自己的客户端。
  • 新绑定目标只含启用采购员;所有归属变化保留操作管理员与时间。
  • 客户端删除后同编号重新登记仍恢复归属。
  • 归属变化不修改 tasks,Client 登记、领取、提交结果、提交失败四接口保持原契约。
  • 客户端删除入口同步收紧为管理员权限。

验证结果

cd admin
gofmt -w .
go mod verify
go vet ./...
go test ./...

结果:全部通过。

Chrome 隔离环境 1366×768 实测绑定 → 转交 → 解绑通过;页面无整页横向溢出,表格无需横向滚动,弹窗完整位于视口内,复查请求无 4xx/5xx。

未验证:未使用生产 admin.db 副本升级;尚待用户人工验收。

提交与归档

  • 实现提交:e0c0dac — feat: 增加客户端采购员归属管理 (#54)
  • 归档提交:ac9e227 — docs: 归档任务 #54
  • 归档:docs/task/54-客户端采购员归属管理.md

工单保持打开,等待用户验收后再关闭并同步 #15、#14。

## 实施完成,待用户验收 ### 最终实现 - v7 新增客户端—采购员归属历史表,唯一索引保证一台客户端只有一个当前负责人。 - 管理员可在客户端页绑定、转交、解绑;采购员只读查看当前绑定给自己的客户端。 - 新绑定目标只含启用采购员;所有归属变化保留操作管理员与时间。 - 客户端删除后同编号重新登记仍恢复归属。 - 归属变化不修改 `tasks`,Client 登记、领取、提交结果、提交失败四接口保持原契约。 - 客户端删除入口同步收紧为管理员权限。 ### 验证结果 ```powershell cd admin gofmt -w . go mod verify go vet ./... go test ./... ``` 结果:全部通过。 Chrome 隔离环境 1366×768 实测绑定 → 转交 → 解绑通过;页面无整页横向溢出,表格无需横向滚动,弹窗完整位于视口内,复查请求无 4xx/5xx。 未验证:未使用生产 `admin.db` 副本升级;尚待用户人工验收。 ### 提交与归档 - 实现提交:`e0c0dac` — `feat: 增加客户端采购员归属管理 (#54)` - 归档提交:`ac9e227` — `docs: 归档任务 #54` - 归档:`docs/task/54-客户端采购员归属管理.md` 工单保持打开,等待用户验收后再关闭并同步 #15、#14。
Author
Owner

用户已于 2026-08-09 明确通过全部 Admin 待验收工单。本工单验收通过,现关闭,并同步父级 #15、#14 的任务清单。

用户已于 2026-08-09 明确通过全部 Admin 待验收工单。本工单验收通过,现关闭,并同步父级 #15、#14 的任务清单。
ila closed this issue 2026-08-09 21:16:09 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#54