Sfoglia il codice sorgente

新增038夜市商家自配送闭环spec草稿

qmj 1 settimana fa
parent
commit
6b707a7982

+ 1 - 3
.specify/feature.json

@@ -1,3 +1 @@
-{
-  "feature_directory": "specs/032-self-hosted-map-integration"
-}
+{"feature_directory": "specs/038-self-delivery-completion"}

+ 35 - 0
specs/038-self-delivery-completion/checklists/requirements.md

@@ -0,0 +1,35 @@
+# Specification Quality Checklist: 夜市商家自配送订单闭环
+
+**Purpose**: Validate specification completeness and quality before proceeding to planning
+**Created**: 2026-10-16
+**Feature**: [spec.md](../spec.md)
+
+## Content Quality
+
+- [x] No implementation details (languages, frameworks, APIs)
+- [x] Focused on user value and business needs
+- [x] Written for non-technical stakeholders
+- [x] All mandatory sections completed
+
+## Requirement Completeness
+
+- [ ] No [NEEDS CLARIFICATION] markers remain
+- [x] Requirements are testable and unambiguous
+- [x] Success criteria are measurable
+- [x] Success criteria are technology-agnostic (no implementation details)
+- [x] All acceptance scenarios are defined
+- [x] Edge cases are identified
+- [x] Scope is clearly bounded
+- [x] Dependencies and assumptions identified
+
+## Feature Readiness
+
+- [x] All functional requirements have clear acceptance criteria
+- [x] User scenarios cover primary flows
+- [x] Feature meets measurable outcomes defined in Success Criteria
+- [x] No implementation details leak into specification
+
+## Notes
+
+- FR-010 保留 1 个 [NEEDS CLARIFICATION](msd-user 界面实现是否纳入本 feature 范围),已按规范以选项形式向用户提问,待答复后消除并复检。
+- 首轮其余各项均通过:三个 User Story 独立可测、P1 为纯后端最小闭环;边缘情况覆盖售后时序竞争、凌晨边界、人工完成并发、任务补偿、开关事后变化。

+ 99 - 0
specs/038-self-delivery-completion/spec.md

@@ -0,0 +1,99 @@
+# Feature Specification: 夜市商家自配送订单闭环
+
+**Feature Branch**: `test-202609v2`(按现行惯例不开独立分支,共享工作区有并行会话)
+
+**Created**: 2026-10-16
+
+**Status**: Draft
+
+**Input**: User description: "夜市商家自配送订单闭环:商家只管出餐,自配送外卖单用户侧显示商家配送中且不显示骑手UI,未发起售后的单次日凌晨由定时任务自动完成并生成商家账单;统一订单列表补充selfDelivery字段;商家端PC订单列表标记自配送"
+
+## User Scenarios & Testing *(mandatory)*
+
+### User Story 1 - 自配送订单次日自动完成(核心闭环) (Priority: P1)
+
+夜市开启了自配送后,用户下的外送单由夜市自己的人配送。摊位主和夜市主都不掌握送达时刻,商家只做现有操作(接单、出餐)。系统在次日凌晨自动把前一天仍处于"配送中"的自配送订单置为完成,并按现有规则生成商家账单(运费归商家)。用户未发起售后的单才自动完成;已发起售后的单跳过,等售后流程了结后按同一规则再处理。
+
+**Why this priority**: 没有完成路径,自配送订单会永远停留在"进行中",商家运费结算缺失,整个自配送功能不可用。这是闭环的最小可用切片,仅后端即可独立交付价值。
+
+**Independent Test**: 构造一笔已出餐、无售后的自配送订单,触发次日自动处理后,订单状态变为已完成且生成商家账单;构造一笔有售后的同状态订单,验证其不被处理。
+
+**Acceptance Scenarios**:
+
+1. **Given** 自配送外送单已出餐(配送中)且用户未发起售后,**When** 次日凌晨自动处理执行,**Then** 该订单变为已完成,商家账单按现有完成口径生成(含运费归商家)。
+2. **Given** 自配送外送单已出餐且用户已发起售后,**When** 次日凌晨自动处理执行,**Then** 该订单不被自动完成,保持原状态等待售后处理。
+3. **Given** 自配送单在自动处理执行前已被人工完成或取消,**When** 自动处理执行,**Then** 该订单不被重复处理(幂等)。
+4. **Given** 售后被驳回或撤销、订单回到配送中,**When** 之后的某次凌晨自动处理执行,**Then** 该订单按规则正常自动完成。
+
+### User Story 2 - 用户能识别商家自配送订单 (Priority: P2)
+
+用户查看自配送订单时,列表和详情明确显示"商家配送中"等商家配送语义的文案,不显示骑手姓名、电话、实时位置,也不提供"联系骑手"入口;订单完成后与普通订单展示一致。
+
+**Why this priority**: 现状用户会看到骑手式界面(配送状态、联系骑手按钮),既误导又在点击后无响应,属于必须消除的体验缺陷;依赖 P1 的字段约定但不依赖其完成逻辑。
+
+**Independent Test**: 用自配送订单分别打开用户订单列表与详情,可见"商家配送中"文案且无任何骑手信息或联系骑手入口。
+
+**Acceptance Scenarios**:
+
+1. **Given** 自配送外送单处于配送中,**When** 用户打开订单列表或详情,**Then** 显示商家配送语义文案,不显示骑手信息与联系骑手入口。
+2. **Given** 骑手配送的普通外送单,**When** 用户打开列表或详情,**Then** 展示与现状完全一致(骑手信息、联系骑手入口不变)。
+3. **Given** 统一订单列表接口返回自配送单条目,**When** 前端渲染,**Then** 条目携带可供区分的自配送标识。
+
+### User Story 3 - 商家端能识别自配送订单 (Priority: P3)
+
+商家 PC 订单列表对自配送单显示"自配送"标记,摊位主一眼可知该单不会进骑手池、无需等待骑手接单;商家端不新增任何履约操作按钮。
+
+**Why this priority**: 提升商家认知、减少"为什么没骑手接单"的困惑,但不阻塞闭环,价值独立且实现轻量。
+
+**Independent Test**: 在商家 PC 订单列表中,自配送单与骑手单可通过标记区分;自配送单无新增操作按钮。
+
+**Acceptance Scenarios**:
+
+1. **Given** 商家查看订单列表,**When** 存在自配送订单,**Then** 该单显示自配送标记,且不出现"开始配送/确认送达"类新按钮。
+
+### Edge Cases
+
+- 自动处理执行与用户发起售后的时序竞争:以处理时刻的售后状态为准,已发起售后的跳过;处理完成后用户再发起售走的按现有售后规则走,不回滚完成。
+- 出餐时刻临近凌晨边界:口径为"次日凌晨处理此前所有仍处配送中的自配送单",不依赖出餐后满 N 小时。
+- 自动处理执行时订单恰好被商家通过既有自配送完成接口人工完成:人工结果优先,任务幂等跳过。
+- 任务当天失败/停机:下次执行时按同一条件补偿处理(条件天然覆盖更早的订单)。
+- 夜市当日关闭自配送开关:按订单上的自配送快照判定,不受开关事后变化影响。
+
+## Requirements *(mandatory)*
+
+### Functional Requirements
+
+- **FR-001**: 统一订单列表的每个外卖条目 MUST 携带该订单的自配送标识(依据下单时的自配送快照)。
+- **FR-002**: 用户侧对配送中的自配送外送单 MUST 展示商家配送语义文案,MUST NOT 展示骑手姓名/电话/位置或提供联系骑手入口;对骑手配送订单的展示 MUST 与现状完全一致。
+- **FR-003**: 系统 MUST 在每日凌晨(默认 04:30,可配置)自动完成满足以下全部条件的订单:外送类型、自配送快照=1、处于配送中、用户未发起售后。
+- **FR-004**: 已发起售后的订单 MUST 被自动完成处理跳过;售后驳回/撤销后订单回到配送中的,后续执行按同一规则处理。
+- **FR-005**: 自动完成 MUST 复用与商家人工完成相同的商家账单生成口径(含自配送运费归商家),确保结算一致。
+- **FR-006**: 自动完成 MUST NOT 向用户或商家发送任何推送通知,仅变更订单状态并落操作日志。
+- **FR-007**: 自动完成 MUST 幂等:已处于终态(已完成/已取消)或已有售后的订单不受影响;重复执行不产生重复账单。
+- **FR-008**: 商家 PC 订单列表 MUST 以标记区分自配送订单,且 MUST NOT 新增商家履约操作入口。
+- **FR-009**: 本功能 MUST 仅作用于自配送快照=1 的外送单;骑手配送单、自取/堂食单、闪送单的现有流转 MUST NOT 受任何影响。
+- **FR-010**: 用户 App(msd-user)展示改造的实施方为 [NEEDS CLARIFICATION: 本 feature 是否包含 msd-user 的界面实现,还是仅交付接口/状态约定由他人实施?]
+
+### Key Entities
+
+- **订单**: 新增依赖现有自配送快照字段;本功能涉及其状态(配送中→已完成)、售后状态与操作日志的联动。
+- **商家账单**: 复用现有完成时生成口径;自配送单运费归商家。
+
+## Success Criteria *(mandatory)*
+
+### Measurable Outcomes
+
+- **SC-001**: 开启自配送的夜市产生的无售后自配送订单,100% 在次日上午 10 点前离开"进行中"分类。
+- **SC-002**: 抽样对比自动完成与人工完成的商家账单金额与构成,差异为 0。
+- **SC-003**: 用户侧自配送订单不再出现骑手信息或联系骑手入口(回归用例 0 例出现)。
+- **SC-004**: 自动完成过程产生的用户/商家推送为 0 条。
+- **SC-005**: 骑手配送订单的列表归类、详情展示、状态流转与改造前完全一致(回归通过)。
+
+## Assumptions
+
+- 自配送配置能力维持现状:仅夜市主可配置(2026-09-10 收窄后的范围),本功能不改变配置入口与生效规则。
+- 自动完成时点默认凌晨 04:30(夜市已收摊、避开整点高峰),作为可配置参数而非硬编码口径。
+- 不提供用户"确认收货"入口(产品决策:完成由系统统一触发)。
+- 既有的商家端自配送开始/完成接口保留不删、无界面对接,作为兜底与运维手段。
+- 送达拍照凭据不纳入本功能(夜市主不掌握送达时刻,无意义)。
+- 037 无骑手自动取消已排除自配送单,无需调整;本功能不改动取消类任务。