|
|
@@ -4,7 +4,7 @@
|
|
|
|
|
|
**创建日期**:2026-08-31
|
|
|
|
|
|
-**状态**:补充原型增量已实现并通过定向测试和模块构建;数据库迁移环境集成验证待执行
|
|
|
+**状态**:平台前端增量已实现;2026-09-01 外卖同规则时段运价调整已确认,待计划与实现
|
|
|
|
|
|
**输入**:基于蓝湖“闪送”分组 7 个设计页面及 2026-08-24 用户端/骑手端补充原型,实现帮送、帮取、加急送的完整非支付业务闭环,包括共享地址簿、路线报价、包裹信息、立即/预约配送、可选 PIN 交付、创建订单、骑手主动抢单、取件、送达、用户签收、平台配置与介入。
|
|
|
|
|
|
@@ -16,12 +16,12 @@
|
|
|
|
|
|
**优先级原因**:报价与发布订单是闪送服务成立的基础,没有该能力就无法形成可配送任务。
|
|
|
|
|
|
-**独立测试**:为同一组取件和收件坐标分别选择三种服务,验证系统按当前启用配置返回报价,并在创建订单时重新计算价格、保存地址与计价快照且进入待接单状态。
|
|
|
+**独立测试**:为同一组取件和收件坐标分别选择三种服务,验证系统按服务类型和当前时间匹配运价时段,使用与外卖订单一致的起送与里程规则返回整数新台币报价,并在创建订单时重新计算价格、保存地址与计价快照且进入待接单状态。
|
|
|
|
|
|
**验收场景**:
|
|
|
|
|
|
-1. **假如** 按起步价、实际超距、预计时长和尖峰倍率计算后的金额低于最低价,**当** 用户请求报价,**那么** 系统返回对应服务类型的最低价。
|
|
|
-2. **假如** 路线距离超过起步距离但不足下一个完整公里,**当** 用户请求报价,**那么** 超出部分按实际小数公里计价,不向上取整。
|
|
|
+1. **假如** 当前时间命中所选服务类型的运价时段,**当** 用户请求报价,**那么** 系统使用该时段的起送距离、起送价格、计价距离和计价金额计算报价。
|
|
|
+2. **假如** 路线距离超过起送距离不足 0.5 公里、达到 0.5 公里但不足 1 公里或超过 1 公里,**当** 用户请求报价,**那么** 系统分别按 0、1 公里或实际超出距离计算里程费用,并将新台币金额四舍五入为整数元。
|
|
|
3. **假如** 地图路线服务正常,**当** 用户请求报价,**那么** 系统使用路线距离并标记距离来源为路线服务。
|
|
|
4. **假如** 地图路线服务超时或失败,**当** 用户请求报价,**那么** 系统使用经纬度直线距离降级报价并明确标记距离来源。
|
|
|
5. **假如** 客户端提交伪造金额或距离,**当** 用户创建订单,**那么** 系统忽略客户端金额与距离并在服务端重新报价。
|
|
|
@@ -88,18 +88,18 @@
|
|
|
|
|
|
---
|
|
|
|
|
|
-### 用户故事 5:平台管理计价配置并介入异常订单(优先级:P2)
|
|
|
+### 用户故事 5:平台管理时段运价并介入异常订单(优先级:P2)
|
|
|
|
|
|
-平台管理员维护三种闪送服务的计价配置,查询全部闪送订单,并在取件后的异常场景中取消或完成订单。
|
|
|
+平台管理员为三种闪送服务分别维护多个运价时段,查询全部闪送订单,并在取件后的异常场景中取消或完成订单。
|
|
|
|
|
|
**优先级原因**:价格必须可运营调整,取件后的订单又必须具备受控的人工处置入口。
|
|
|
|
|
|
-**独立测试**:管理员修改加急送配置后创建新报价,验证新报价使用新版本而历史订单保持原快照;随后对已取件订单执行平台取消并检查状态日志。
|
|
|
+**独立测试**:管理员新增、修改和删除加急送运价时段,验证重叠时段被拒绝、保存后立即生效、新报价使用当前时段及最新版本;随后对已取件订单执行平台取消并检查状态日志。
|
|
|
|
|
|
**验收场景**:
|
|
|
|
|
|
-1. **假如** 管理员修改某一服务类型的计价配置,**当** 新请求报价,**那么** 新报价使用新配置且已创建订单价格不变。
|
|
|
-2. **假如** 配置值为负数、零或服务类型非法,**当** 管理员提交修改,**那么** 系统拒绝保存。
|
|
|
+1. **假如** 管理员新增或修改某一服务类型的运价时段,**当** 新请求在该时段内报价,**那么** 新报价立即使用新配置且已创建订单价格不变。
|
|
|
+2. **假如** 时间范围重叠、起止时间非法、距离或金额不是正数、金额不是整数或服务类型非法,**当** 管理员提交配置,**那么** 系统拒绝保存。
|
|
|
3. **假如** 普通用户或骑手调用平台配置或介入接口,**当** 权限校验执行,**那么** 系统拒绝操作。
|
|
|
4. **假如** 订单已取件但发生异常,**当** 有权限的管理员取消订单,**那么** 系统允许取消并记录管理员、原因和时间。
|
|
|
5. **假如** 订单已送达但用户无法确认,**当** 有权限的管理员确认完成,**那么** 系统完成订单并记录平台操作日志。
|
|
|
@@ -116,8 +116,8 @@
|
|
|
|
|
|
**验收场景**:
|
|
|
|
|
|
-1. **假如** 管理员进入价格配置页面,**当** 页面加载,**那么** 系统展示帮送、帮取和加急送的当前价格、启用状态及配置版本。
|
|
|
-2. **假如** 管理员提交合法价格,**当** 保存成功,**那么** 页面显示服务端返回的新配置和版本;非法值或并发冲突必须保留编辑内容并展示错误。
|
|
|
+1. **假如** 管理员进入价格配置页面,**当** 页面加载,**那么** 系统按帮送、帮取和加急送展示全部运价时段、起送规则、计价规则及配置版本。
|
|
|
+2. **假如** 管理员新增、修改或删除合法时段,**当** 操作成功,**那么** 页面刷新服务端配置;非法值、重叠时段或并发冲突必须保留编辑内容并展示错误。
|
|
|
3. **假如** 管理员进入订单页面,**当** 按状态、服务类型、订单号、用户 ID 或骑手 ID 查询,**那么** 表格按服务端分页结果展示并可重置条件。
|
|
|
4. **假如** 管理员查看订单详情,**当** 详情加载,**那么** 页面分区展示订单概况、取送地址、费用明细、预约与 PIN、骑手、图片凭证和状态日志。
|
|
|
5. **假如** 订单处于非终态,**当** 具有取消权限的管理员填写原因并二次确认,**那么** 页面调用平台取消接口并刷新列表与详情。
|
|
|
@@ -128,7 +128,7 @@
|
|
|
- 取件地址和收件地址相同或坐标相同,不允许创建订单。
|
|
|
- 地址缺少联系人、联系电话、完整地址或有效经纬度时,不允许用于报价和创建订单。
|
|
|
- 经纬度超出合法范围时拒绝请求,不调用地图服务。
|
|
|
-- 对应服务类型没有启用计价配置时,不允许报价或创建订单。
|
|
|
+- 对应服务类型在当前时间没有匹配的运价时段时,不允许报价或创建订单,并返回“当前时段暂无可用运价”。
|
|
|
- 地图路线结果缺少有效距离时按路线失败处理并降级为直线距离。
|
|
|
- 创建订单时当前配置与先前报价时不同,以创建时服务端重新计算结果为准。
|
|
|
- 待接单列表仅返回待接单订单;已取消或已被抢走的订单不得继续出现在新查询结果中。
|
|
|
@@ -147,9 +147,9 @@
|
|
|
- **FR-001**:系统必须提供帮送、帮取和加急送三种服务类型。
|
|
|
- **FR-002**:帮取只承担取件配送,不包含代购、垫付或商品金额。
|
|
|
- **FR-003**:三种服务必须使用同一订单履约状态机;加急送仅在排序和计价上体现优先级。
|
|
|
-- **FR-004**:系统必须按服务类型维护基础价、最低价、包含距离、每公里价格、每分钟价格和尖峰倍率,并保存配置版本与修改记录。
|
|
|
-- **FR-005**:报价必须按“基础价 + 超出包含距离的实际公里费用 + 时长费用”计算小计,再应用尖峰倍率并保证结果不低于最低价。
|
|
|
-- **FR-006**:距离、时长、尖峰和总金额必须返回可展示的费用明细,所有金额最终保留两位小数。
|
|
|
+- **FR-004**:系统必须按服务类型维护多个运价时段,每个时段保存开始时间、结束时间、起送距离、起送价格、计价距离、计价金额、配置版本与修改记录;配置保存即生效,不设置启停状态。
|
|
|
+- **FR-005**:报价必须先按服务类型和当前时间匹配唯一运价时段;同一服务类型的时间段不得重叠,没有匹配时段时必须拒绝报价和创建订单。
|
|
|
+- **FR-006**:计价必须与现有外卖订单一致:起送距离内只收起送价格;超出不足 0.5 公里不加价,超出 0.5 公里但不足 1 公里按 1 公里计,超出至少 1 公里按实际超出距离计;里程费用四舍五入到整数元后与起送价格相加,所有 TWD 金额均为整数且不再按百位或千位特殊取整。
|
|
|
- **FR-007**:系统必须优先使用地图路线距离,地图失败时使用经纬度直线距离并向客户端返回距离来源。
|
|
|
- **FR-008**:地图密钥必须从服务端配置读取,不得返回客户端或写入业务日志。
|
|
|
- **FR-009**:创建订单时必须由服务端重新计算距离和价格,并保存地址、路线、金额和计价配置快照。
|
|
|
@@ -194,8 +194,8 @@
|
|
|
- **FR-048**:路线距离不得超过 40 公里;超过限制时报价和创建均拒绝。
|
|
|
- **FR-049**:平台管理前端必须提供“闪送管理”父菜单,并提供“价格配置”和“闪送订单”两个子页面。
|
|
|
- **FR-050**:平台前端必须通过现有六个 `flash:*` 权限分别控制页面访问、价格修改、订单查看、取消和完成操作,不得仅依赖按钮隐藏代替后端鉴权。
|
|
|
-- **FR-051**:价格配置页面必须展示并可编辑 `startPrice`、`minimumPrice`、`startDistanceMeters`、`perKmPrice`、`perMinutePrice`、`peakMultiplier` 和 `enabled`,并展示只读配置版本与更新时间。
|
|
|
-- **FR-052**:价格表单必须在提交前校验起步价、最低价、起步距离和公里价为正数,每分钟价格非负,尖峰倍率不小于 1;保存成功后必须使用服务端响应覆盖本地数据。
|
|
|
+- **FR-051**:价格配置页面必须按服务类型展示全部时段,并支持新增、修改和删除;表单字段为 `startTime`、`endTime`、`startingDistance`、`startingFare`、`distance` 和 `freight`,同时展示只读配置版本与更新时间。
|
|
|
+- **FR-052**:价格表单必须校验时间范围有效、同服务时间段不重叠、距离为正数、起送价格和计价金额为正整数;配置保存即生效,删除后立即不可用于报价,操作成功后必须重新读取服务端列表。
|
|
|
- **FR-053**:订单页面必须按服务端分页,并支持状态、服务类型、订单号、用户 ID 和骑手 ID 组合筛选及一键重置。
|
|
|
- **FR-054**:平台订单详情必须展示订单概况、取送地址、路线与费用、预约与 PIN、骑手 ID 与履约时间、三类图片凭证及状态日志;不得要求管理员从列表字段拼接详情。
|
|
|
- **FR-055**:平台取消必须要求非空原因和二次确认;平台完成必须二次确认。操作成功后刷新服务端数据,操作失败时保留当前页面并显示后端错误。
|
|
|
@@ -205,14 +205,14 @@
|
|
|
### 关键实体
|
|
|
|
|
|
- **闪送订单**:用户发布的取件配送任务,持有地址、路线、价格、服务类型、履约状态和关键时间快照。
|
|
|
-- **计价配置**:某一服务类型当前启用的起步价、最低价、起步距离、每公里价格、每分钟价格、尖峰倍率及版本信息。
|
|
|
+- **计价配置**:某一服务类型在一个时间范围内立即生效的起送距离、起送价格、计价距离、计价金额及版本信息。
|
|
|
- **配送凭证**:用户下单时的可选寄件图片,以及骑手取件或送达时提交的必填图片记录。
|
|
|
- **订单状态日志**:记录订单每次有效状态变化的操作审计信息。
|
|
|
- **共享地址**:属于单一用户、可供闪送和现有收货业务共同使用的联系人与地点信息。
|
|
|
|
|
|
## 成功标准
|
|
|
|
|
|
-- **SC-001**:三种服务的最低价、实际超距小数公里、路线时长、尖峰倍率和加急配置报价测试全部通过。
|
|
|
+- **SC-001**:三种服务的当前时段匹配、起送距离、0.5 公里边界、实际超出距离、整数新台币取整和加急配置报价测试全部通过。
|
|
|
- **SC-002**:地图路线成功和失败降级场景均能在一次请求内返回可用报价,并准确标记距离来源。
|
|
|
- **SC-003**:至少 20 个并发抢单请求针对同一订单时,数据库中恰好只有一名骑手成功绑定。
|
|
|
- **SC-004**:跨用户地址和订单的详情、修改、删除、置顶、取消及签收测试拦截率达到 100%。
|