Jelajahi Sumber

调整闪送时段运价规格

闪送计价改为与外卖一致的时段、起送及里程规则,移除时长费、尖峰倍率、最低价与启停状态,并统一整数新台币金额。
qmj 3 hari lalu
induk
melakukan
136f0df989

+ 3 - 0
specs/024-flash-delivery/checklists/requirements.md

@@ -18,6 +18,9 @@
 
 - [x] 三种服务类型和帮取非代购语义已明确
 - [x] 计价公式、配置版本和距离降级规则已明确
+- [x] 三种服务的独立时段运价、重叠限制和保存即生效规则已明确
+- [x] 外卖同规则的 0.5 公里边界及整数新台币取整规则已明确
+- [x] 每分钟价格、尖峰倍率、最低价和启停状态已明确移除
 - [x] 用户创建幂等和服务端重新报价已明确
 - [x] 骑手主动抢单与并发唯一接单规则已明确
 - [x] 取件、送达图片必填规则已明确

+ 9 - 5
specs/024-flash-delivery/contracts/api.md

@@ -5,7 +5,7 @@
 - 用户/骑手端要求请求头 `token`,身份字段不进入请求体。
 - 平台权限:`flash:pricing:list/edit`、`flash:order:list/query/cancel/complete`。
 - 响应沿用 `AjaxResult`:`{"code":200,"msg":"...","data":...}`;分页 data 为 `records,total,current,size`。
-- 金额为 TWD 两位小数,距离为米
+- 金额为整数 TWD;路线距离为米,运价配置距离为公里
 - `serviceType`:`HELP_SEND`、`HELP_PICKUP`、`URGENT`。
 - `packageType`:`DOCUMENT`、`GIFT`、`CLOTHING`、`BEAUTY`、`DAILY_NECESSITIES`、`FOOD_INGREDIENTS`、`ELECTRONICS`、`SMALL_APPLIANCE`、`OTHER`。
 - `packageSize`:`SMALL`(不超过 5kg)、`MEDIUM`(不超过 12kg)、`LARGE`(不超过 20kg);不提交精确重量。
@@ -30,7 +30,7 @@
 
 | 方法 | 路径 | 请求/说明 |
 |---|---|---|
-| GET | `/system/flashDelivery/home` | 三类启用服务和计价摘要 `serviceType,startPrice,minimumPrice,startDistanceMeters,perKmPrice,perMinutePrice,peakMultiplier,pricingVersion,currency`;不返回内部更新人、时间或地图密钥 |
+| GET | `/system/flashDelivery/home` | 返回当前时间存在运价时段的服务及摘要 `serviceType,pricingId,startTime,endTime,startingDistance,startingFare,distance,freight,pricingVersion,currency`;不返回内部更新人、时间或地图密钥 |
 | POST | `/system/flashDelivery/quote` | `serviceType,packageType,packageSize,pickup,delivery` |
 | POST | `/system/flashDelivery/orders` | 报价请求字段 + `clientRequestId,deliveryMode,scheduledPickupStartAt?,scheduledPickupEndAt?,pinRequired?,senderImageUrls?,userNote?`;服务端重算并幂等创建 |
 | GET | `/system/flashDelivery/orders` | `pageNum,pageSize,status?,scene?,serviceType?`;`scene=matching/progress/done/cancelled`;仅本人 |
@@ -38,7 +38,7 @@
 | POST | `/system/flashDelivery/orders/{id}/cancel` | `{"reason":"行程变化"}`;仅待接/已接 |
 | POST | `/system/flashDelivery/orders/{id}/confirmReceipt` | 无 body;仅 DELIVERED |
 
-报价响应 data:`serviceType,distanceMeters,distanceSource,estimatedDurationSeconds?,startPrice,minimumPrice,distanceFee,durationFee,subtotal,peakMultiplier,peakFee,amount,currency,pricingVersion`。地址快照字段为联系人、电话、市/区、交付方式、地址、详细地址和经纬度。客户端传入的金额/距离不会被使用。用户详情响应为 `order,images,logs,rider,deliveryPinCode?`,其中 PIN 仅在订单启用时向订单用户返回;骑手详情永不返回 PIN,用户仅在 `ACCEPTED`、`PICKED_UP` 阶段获得骑手位置。
+报价响应 data:`serviceType,pricingId,startTime,endTime,distanceMeters,distanceSource,estimatedDurationSeconds?,startingDistance,startingFare,distance,freight,billableDistance,distanceFee,amount,currency,pricingVersion`。`billableDistance` 为按外卖规则处理 0.5 公里边界后的计费公里数,`distanceFee` 与 `amount` 为整数 TWD。地址快照字段为联系人、电话、市/区、交付方式、地址、详细地址和经纬度。客户端传入的金额/距离不会被使用。用户详情响应为 `order,images,logs,rider,deliveryPinCode?`,其中 PIN 仅在订单启用时向订单用户返回;骑手详情永不返回 PIN,用户仅在 `ACCEPTED`、`PICKED_UP` 阶段获得骑手位置。
 
 ## 骑手端
 
@@ -59,11 +59,15 @@
 
 | 方法 | 路径 | 请求/说明 |
 |---|---|---|
-| GET | `/system/flashDelivery/admin/pricing` | 三类当前计价 |
-| PUT | `/system/flashDelivery/admin/pricing/{serviceType}` | `startPrice,minimumPrice,startDistanceMeters,perKmPrice,perMinutePrice,peakMultiplier,enabled`;起步价、最低价、距离和公里价为正,每分钟价格非负,尖峰倍率不小于 1,版本原子加一;并发覆盖返回业务错误 |
+| GET | `/system/flashDelivery/admin/pricing` | 返回全部运价时段,按服务类型和开始时间排序 |
+| POST | `/system/flashDelivery/admin/pricing` | `serviceType,startTime,endTime,startingDistance,startingFare,distance,freight`;保存即生效 |
+| PUT | `/system/flashDelivery/admin/pricing/{id}` | 与新增相同的完整请求体;版本原子加一,并发覆盖返回业务错误 |
+| DELETE | `/system/flashDelivery/admin/pricing/{id}` | 删除运价时段并立即停止用于报价 |
 | GET | `/system/flashDelivery/admin/orders` | 分页;可按状态、类型、订单号、用户、骑手筛选 |
 | GET | `/system/flashDelivery/admin/orders/{id}` | 完整详情、凭证、日志 |
 | POST | `/system/flashDelivery/admin/orders/{id}/cancel` | `reason` 必填;非终态可取消 |
 | POST | `/system/flashDelivery/admin/orders/{id}/complete` | 无 body;仅 DELIVERED |
 
 本期没有支付、退款、取消费、退回费、结算、骑手收入、代购/垫付、精确重量、件数、违禁品电子确认、骑手放弃或自动派单字段和接口。
+
+运价时段使用业务当地时间和 `HH:mm` 格式,采用开始时间包含、结束时间不包含的匹配语义;`24:00` 只允许作为结束时间,跨午夜时段必须拆成两个配置。同一服务类型的时间段不得重叠。起送距离和计价距离必须为正数,起送价格和计价金额必须为正整数;当前时间没有匹配时段时,用户首页不返回该服务,报价和创建接口返回“当前时段暂无可用运价”。

+ 2 - 2
specs/024-flash-delivery/data-model.md

@@ -2,13 +2,13 @@
 
 ## `flash_delivery_order`
 
-核心字段:`id`、唯一 `order_no`、与用户联合唯一的 `client_request_id`、`user_id`、`rider_id`、`service_type`、`status`;`package_type`、`package_size`;`delivery_mode`、预约开始/结束时间;`pin_required`、四位交付 PIN;取件/收件联系人、电话、市/区、交付方式、地址、详细地址和经纬度快照;`distance_meters`、`distance_source`、`estimated_duration_seconds`;`amount`、`currency`、`pricing_version`、完整计价配置与费用明细快照;`user_note`、`version`、关键状态时间、取消审计及创建/更新时间。
+核心字段:`id`、唯一 `order_no`、与用户联合唯一的 `client_request_id`、`user_id`、`rider_id`、`service_type`、`status`;`package_type`、`package_size`;`delivery_mode`、预约开始/结束时间;`pin_required`、四位交付 PIN;取件/收件联系人、电话、市/区、交付方式、地址、详细地址和经纬度快照;`distance_meters`、`distance_source`、`estimated_duration_seconds`;整数 `amount`、`currency`、`pricing_id`、`pricing_version`、`pricing_start_time`、`pricing_end_time`、`starting_distance`、`starting_fare`、`distance`、`freight`、`distance_fee` 计价快照;`user_note`、`version`、关键状态时间、取消审计及创建/更新时间。
 
 索引:订单号唯一、用户幂等号唯一、待抢排序、用户列表、骑手列表、自动完成扫描。
 
 ## `flash_delivery_pricing`
 
-按 `service_type` 唯一,保存 `start_price`、`minimum_price`、`start_distance_meters`、`per_km_price`、`per_minute_price`、`peak_multiplier`、`enabled`、`config_version`、`updated_by` 和时间。有效修改后版本加一,历史订单不回写。
+每个服务类型可保存多个运价时段。字段为 `service_type`、`start_time`、`end_time`、`starting_distance`、整数 `starting_fare`、`distance`、整数 `freight`、`config_version`、`updated_by` 和创建/更新时间。配置保存即生效,不保存 `enabled`;同一服务类型的时间段不得重叠,索引支持按服务类型和时间匹配当前时段。有效修改后版本加一,历史订单不回写。
 
 ## `flash_delivery_order_image`
 

+ 14 - 13
specs/024-flash-delivery/design.md

@@ -63,7 +63,9 @@ ruoyi-system
 ### 3.3 平台端
 
 - `GET /system/flashDelivery/admin/pricing`
-- `PUT /system/flashDelivery/admin/pricing/{serviceType}`
+- `POST /system/flashDelivery/admin/pricing`
+- `PUT /system/flashDelivery/admin/pricing/{id}`
+- `DELETE /system/flashDelivery/admin/pricing/{id}`
 - `GET /system/flashDelivery/admin/orders`
 - `GET /system/flashDelivery/admin/orders/{id}`
 - `POST /system/flashDelivery/admin/orders/{id}/cancel`
@@ -72,8 +74,8 @@ ruoyi-system
 平台管理前端沿用 `foodie-admin-vue` 的 Vue 2、Element UI、动态菜单和权限指令,不额外引入 UI 或状态管理依赖:
 
 - “闪送管理”作为父菜单,“价格配置”和“闪送订单”作为两个子页面。
-- `src/api/flashDelivery/index.js` 集中封装六个平台接口,页面不直接拼接请求。
-- 价格配置页以三种服务配置表为主体,编辑弹窗承载数值校验;保存后以服务端响应刷新当前行
+- `src/api/flashDelivery/index.js` 集中封装平台接口,页面不直接拼接请求。
+- 价格配置页按帮送、帮取和加急送展示运价时段,新增与编辑弹窗承载时间、距离和整数金额校验,支持删除不再需要的时段;配置保存即生效,不提供启停开关
 - 订单页以服务端分页表格为主体,详情弹窗分区展示概况、地址、费用、凭证和日志;取消原因使用独立输入弹窗,完成操作使用二次确认。
 - 操作按钮同时使用状态条件和 `v-hasPermi` 控制可见性,后端权限与状态机仍是最终安全边界。
 - 所有新增文本集中在四个前端语言文件的 `flashDelivery` 对象中,key 集合保持一致。
@@ -92,11 +94,11 @@ ruoyi-system
 
 ### 4.1 `flash_delivery_order`
 
-保存订单号、客户端请求号、用户、骑手、服务类型、包裹类别、重量档、配送方式、预约时段、交付 PIN、取件与收件信息快照、路线距离、距离来源、预计时长、报价金额与费用明细、币种、计价配置版本、备注、状态、并发版本号、关键操作时间与取消信息。
+保存订单号、客户端请求号、用户、骑手、服务类型、包裹类别、重量档、配送方式、预约时段、交付 PIN、取件与收件信息快照、路线距离、距离来源、预计时长、报价金额、匹配时段的起送与里程计价快照、币种、计价配置版本、备注、状态、并发版本号、关键操作时间与取消信息。
 
 ### 4.2 `flash_delivery_pricing`
 
-按服务类型保存起步价、最低价、起步距离、每公里价格、每分钟价格、尖峰倍率、启用状态、配置版本、修改人和修改时间
+按服务类型保存多个不重叠的运价时段;每个时段保存开始时间、结束时间、起送距离、起送价格、计价距离、计价金额、配置版本、修改人和修改时间。保存即生效,删除即失效,不设置启停字段
 
 ### 4.3 `flash_delivery_order_image`
 
@@ -113,15 +115,14 @@ ruoyi-system
 ## 5. 计价与距离
 
 ```text
-超距公里 = max(0, 距离 - 起步距离) / 1000米
-里程费 = 超距公里 * 每公里价格
-时长费 = 预计时长秒 / 60 * 每分钟价格
-小计 = 起步价 + 里程费 + 时长费
-尖峰费 = 小计 * (尖峰倍率 - 1)
-价格 = max(最低价, 小计 + 尖峰费)
+当前配置 = 按服务类型和当前时间匹配唯一运价时段
+超出公里 = max(0, 路线距离公里 - 起送距离)
+计费公里 = 超出公里 < 0.5 ? 0 : 超出公里 < 1 ? 1 : 超出公里
+里程费用 = 计费公里 * (计价金额 / 计价距离)
+价格 = 起送价格 + 四舍五入到整数元的里程费用
 ```
 
-超距公里和路线分钟按实际小数单位计费,不向上取整;里程费、时长费、小计、尖峰费和最终价格分别使用十进制定点数并保留两位小数,尖峰倍率不得小于 1。帮送、帮取和加急送分别拥有独立配置;加急送不由客户端提交系数。报价优先使用地图路线距离,失败时降级为直线距离。创建订单时服务端必须重新报价并固化快照。
+计价规则与现有外卖订单一致,但闪送使用自己的时段配置表。起送价格和计价金额为正整数新台币;距离与除法过程使用十进制定点数,里程费用采用 `HALF_UP` 四舍五入到整数元,最终价格不显示小数,也不执行外卖旧实现中金额达到 1000 后的千位特殊取整。帮送、帮取和加急送分别拥有多个互不重叠的时段;当前时间没有匹配时段时拒绝报价和创建。路线预计时长继续返回和保存,仅用于履约展示,不参与计价。报价优先使用地图路线距离,失败时降级为直线距离;创建订单时服务端必须重新匹配时段、计算价格并固化配置快照。
 
 ## 6. 状态机
 
@@ -160,7 +161,7 @@ COMPLETED
 
 ## 8. 测试方向
 
-- 计价边界和配置版本测试。
+- 时段匹配、重叠拒绝、0.5 公里边界、整数金额取整和配置版本测试。
 - 地图路线成功、失败及直线降级测试。
 - 地址和订单跨用户访问测试。
 - 多骑手并发抢单测试。

+ 1 - 1
specs/024-flash-delivery/research.md

@@ -8,7 +8,7 @@
 
 ## 降级与精度
 
-外部路线不可用时使用 Haversine 公式计算球面直线距离,四舍五入为整数米并标记 `STRAIGHT_LINE`;路线成功标记 `ROUTE`。价格使用 `BigDecimal` 和 `decimal(10,2)`;超距里程以整数米转换为实际小数公里,预计时长以秒转换为实际小数分钟,分别计算里程费和时长费后再应用不小于 1 的尖峰倍率与最低价,避免浮点边界误差
+外部路线不可用时使用 Haversine 公式计算球面直线距离,四舍五入为整数米并标记 `STRAIGHT_LINE`;路线成功标记 `ROUTE`。闪送计价与现有外卖订单保持同一业务规则:按当前时间匹配运价时段,起送距离内收起送价格,超出不足 0.5 公里不加价、0.5 至不足 1 公里按 1 公里计、至少 1 公里按实际超出距离计。距离与单价除法使用 `BigDecimal`,里程费用使用 `HALF_UP` 四舍五入为整数新台币;路线预计时长只用于履约展示,不参与金额计算
 
 ## 并发与安全
 

+ 19 - 19
specs/024-flash-delivery/spec.md

@@ -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%。