From c39bfd39ddcb2434baaff02a82f9d19b1439739f Mon Sep 17 00:00:00 2001 From: shanshanzhong147 Date: Thu, 11 Jun 2026 02:47:48 -0700 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(#21):=20=E7=A6=81=E6=AD=A2?= =?UTF-8?q?=E9=80=9A=E7=94=A8=E8=AE=A2=E5=8D=95=E7=8A=B6=E6=80=81=E5=86=99?= =?UTF-8?q?=E5=85=A5claimed=20(#20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复(#21): 禁止通用订单状态写入claimed Co-authored-by: multica-agent * 文档(#21): 补充PR说明 Co-authored-by: multica-agent --------- Co-authored-by: multica-agent --- .../admin/order/updateOrderStatusLogic.go | 8 ++- .../order/updateOrderStatusLogic_test.go | 14 +++-- pr-body-hif-21.md | 57 +++++++++++++++++++ 3 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 pr-body-hif-21.md diff --git a/internal/logic/admin/order/updateOrderStatusLogic.go b/internal/logic/admin/order/updateOrderStatusLogic.go index 2164652..c9df995 100644 --- a/internal/logic/admin/order/updateOrderStatusLogic.go +++ b/internal/logic/admin/order/updateOrderStatusLogic.go @@ -15,6 +15,10 @@ import ( queue "github.com/perfect-panel/server/queue/types" ) +const ( + orderStatusClaimed = 6 +) + type UpdateOrderStatusLogic struct { logger.Logger ctx context.Context @@ -31,8 +35,8 @@ func NewUpdateOrderStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) } func (l *UpdateOrderStatusLogic) UpdateOrderStatus(req *types.UpdateOrderStatusRequest) error { - if req.Status == orderStatusRefunded { - return errors.Wrapf(xerr.NewErrCode(xerr.OrderStatusError), "refund status must use refund order endpoint") + if req.Status == orderStatusClaimed || req.Status == orderStatusRefunded { + return errors.Wrapf(xerr.NewErrCode(xerr.OrderStatusError), "claimed/refund statuses are reserved for internal refund and activation flows") } info, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id) diff --git a/internal/logic/admin/order/updateOrderStatusLogic_test.go b/internal/logic/admin/order/updateOrderStatusLogic_test.go index d867b92..8c3f344 100644 --- a/internal/logic/admin/order/updateOrderStatusLogic_test.go +++ b/internal/logic/admin/order/updateOrderStatusLogic_test.go @@ -17,11 +17,13 @@ func TestUpdateOrderStatus_RejectsRefundStatus(t *testing.T) { svcCtx: &svc.ServiceContext{}, } - err := logic.UpdateOrderStatus(&types.UpdateOrderStatusRequest{ - Id: 1001, - Status: orderStatusRefunded, - }) - if !isErrCode(err, xerr.OrderStatusError) { - t.Fatalf("UpdateOrderStatus error code = %v, want OrderStatusError; raw=%v", errCodeOf(err), err) + for _, status := range []uint8{orderStatusClaimed, orderStatusRefunded} { + err := logic.UpdateOrderStatus(&types.UpdateOrderStatusRequest{ + Id: 1001, + Status: status, + }) + if !isErrCode(err, xerr.OrderStatusError) { + t.Fatalf("status %d: UpdateOrderStatus error code = %v, want OrderStatusError; raw=%v", status, errCodeOf(err), err) + } } } diff --git a/pr-body-hif-21.md b/pr-body-hif-21.md new file mode 100644 index 0000000..f828754 --- /dev/null +++ b/pr-body-hif-21.md @@ -0,0 +1,57 @@ +## 关联 Issue + +Closes HIF-21 + +## 改动摘要 + +禁止 `PUT /v1/admin/order/status` 通过通用改状态入口把订单写成 `status=6`(claimed)或 `status=7`(refunded)。 +这两个状态分别保留给激活 worker 临时 claim 流程和专用退款流程,避免后台或旧前端绕过退款副作用只改订单状态。 + +## 改动细节 + +- `internal/logic/admin/order/updateOrderStatusLogic.go`:在入口校验中同时拒绝 `status=6` 和 `status=7`,统一返回 `OrderStatusError`。 +- `internal/logic/admin/order/updateOrderStatusLogic_test.go`:扩充单测,覆盖通用改状态接口对 `claimed` / `refunded` 两个保留状态的拒绝行为。 + +## 测试计划 + +- [x] `go build ./...` 通过 +- [x] `go vet ./...` 通过 +- [ ] `go test -race ./... -count=1` 通过 +- [ ] golangci-lint 通过 +- [x] 新增/修改的逻辑有对应单测覆盖 +- [ ] (如涉及 DB 变更)migration up/down 双向验证 +- [ ] (如涉及 API)curl / Postman 验证命令贴在下面 + + + +```bash +go test ./internal/logic/admin/order/... +ok github.com/perfect-panel/server/internal/logic/admin/order 4.224s + +go test ./... +# 业务相关包通过;tests/acceptance 因 staging https://tapi.hifast.biz 请求超时失败 +# FAIL: TestPublicSmoke/error_path_missing_auth +# GET https://tapi.hifast.biz/v1/public/user/info: context deadline exceeded + +golangci-lint run +# 当前基线存在与本次改动无关的历史问题,例如: +# pkg/updater/updater.go:301 errcheck +# internal/logic/admin/group/exportGroupResultLogic.go:110 errcheck +# pkg/proc/shutdown.go:19 unused +``` + +## 风险 / 回滚 + +- 风险较低:仅收紧 admin 通用改状态接口的允许输入,不改退款逻辑、不改队列状态流转。 +- 若需回滚,直接回退本 PR 即可;不会涉及数据迁移或额外清理。 + +## Reviewer 自检清单 + +- [x] PR 标题符合 commitlint 规范(`修复/新功能/重构/文档/配置(#): ...`) +- [x] 分支命名 `fix/-…` / `feat/-…` / `chore/…` +- [x] 目标分支 = `internal` +- [x] 改动 scope 与 Issue 描述一致,无 scope creep +- [x] **无无关代码改动**(架构师红线) +- [x] 无密钥/凭证泄露 +- [ ] CI 全绿 +- [ ] 测试工程师已验收(如涉及业务逻辑)