# 订单服务 简化的订单 HTTP 服务,支持创建订单、服务者接单、取消订单三个操作。 ## 需求 Go 后端小测试,建议投入 1.5~2 小时,并在收到后 48 小时内提交。请实现一个可在本地运行的简化订单 HTTP 服务,数据保存在内存即可,无需数据库、登录、Docker、Swagger、支付、退款或线上部署。服务只需支持三个操作:创建订单(包含服务时间、时长和地址,初始状态为 pending)、服务者接单(提交 provider_id,仅 pending 订单可以接单)和取消订单(pending 或 accepted 状态可以取消,取消后变为 canceled)。重点验证两种情况:同一订单被两名服务者先后接单时,只允许第一次成功,第二次必须失败且不能覆盖原接单人;订单取消后再次接单或取消时,必须拒绝并返回容易理解的业务错误。有余力可任选自动化测试、并发接单处理或 SQLite 存储之一,但不做也不影响结果。 ## 快速启动 ```bash # 启动服务(内存存储 — 默认) go run main.go # 启动服务(SQLite 存储) STORAGE=sqlite go run main.go ``` 服务启动在 `http://localhost:8080` ## API ### 创建订单 ```bash curl -X POST http://localhost:8080/orders \ -H "Content-Type: application/json" \ -d '{"service_time":"2025-08-01T14:00:00Z","duration":120,"address":"北京朝阳区xxx路xxx号"}' ``` ### 服务者接单 ```bash curl -X PUT http://localhost:8080/orders/{id}/accept \ -H "Content-Type: application/json" \ -d '{"provider_id":"prov_001"}' ``` ### 取消订单 ```bash curl -X PUT http://localhost:8080/orders/{id}/cancel \ -H "Content-Type: application/json" \ -d '{}' ``` ## 测试 ```bash go test ./... -v -race ``` ### 一键端到端测试 ```bash bash test.sh ``` 运行后选择存储后端(memory/sqlite),自动启动服务并验证全部业务场景。 ```bash # 测试效果示例 $ bash test.sh 选择存储后端: 1) memory(默认) 2) sqlite 请选择 [1/2]: 1 ======================================== 订 单 服 务 — 一 键 测 试 存储: memory ======================================== 1. 创建订单... ✅ PASS: 创建订单 2. 接单(首次)... ✅ PASS: 首次接单成功 ... ======================================== 🎉 全部 7 个测试通过! ======================================== ``` ## 业务规则 - 仅 `pending` 订单可接单 - 同一订单只能被一名服务者接单(并发安全,CAS 乐观锁保证) - `pending` 或 `accepted` 订单可取消 - `canceled` 订单不可再操作 ## 项目结构 ``` ├── main.go # 入口,依赖注入,存储选择 ├── model/order.go # 数据模型、状态常量、错误类型 ├── repository/ │ ├── order.go # OrderRepository 接口 │ ├── memory.go # 内存实现(sync.RWMutex + CAS) │ └── sqlite.go # SQLite 实现(行锁 + WHERE CAS) ├── service/order.go # 业务逻辑(状态机) ├── handler/order.go # HTTP handler(Gin) └── */*_test.go # 单元测试 + 集成测试 ``` ## 技术栈 - **语言**: Go - **框架**: Gin - **存储**: 内存 / SQLite(mattn/go-sqlite3) - **测试**: testing + httptest