소스 검색

调整目录结构

wwh 2 주 전
부모
커밋
16c874cc99
41개의 변경된 파일2117개의 추가작업 그리고 1개의 파일을 삭제
  1. 439 0
      doc/农资商城web/关联需求分析.md
  2. 0 0
      doc/农资商城web/商品管理/商品分类/Snipaste_2026-05-28_10-59-33.jpg
  3. 0 0
      doc/农资商城web/商品管理/商品分类/Snipaste_2026-05-28_10-59-54.jpg
  4. 0 0
      doc/农资商城web/商品管理/商品分类/商品分类功能需求-草稿.md
  5. 0 0
      doc/农资商城web/商品管理/商品分类/商品分类功能需求.md
  6. 0 0
      doc/农资商城web/商品管理/商品分类/商品分类技术方案.md
  7. 0 0
      doc/农资商城web/商品管理/商品分类/商品分类测试用例.md
  8. 0 0
      doc/农资商城web/商品管理/商品审核/商品审核功能需求-草稿.md
  9. 0 0
      doc/农资商城web/商品管理/商品审核/商品审核功能需求.md
  10. 0 0
      doc/农资商城web/商品管理/商品审核/商品审核技术方案.md
  11. 0 0
      doc/农资商城web/商品管理/商品审核/商品审核测试用例.md
  12. 0 0
      doc/农资商城web/商品管理/商品服务/商品服务管理功能需求-草稿.md
  13. 0 0
      doc/农资商城web/商品管理/商品服务/商品服务管理功能需求.md
  14. 0 0
      doc/农资商城web/商品管理/商品服务/商品服务管理技术方案.md
  15. 0 0
      doc/农资商城web/商品管理/商品服务/商品服务管理测试用例.md
  16. 136 0
      doc/农资商城web/文档索引.md
  17. 0 0
      doc/农资商城web/组织管理/入驻审核/商户入驻审核功能需求-草稿.md
  18. 0 0
      doc/农资商城web/组织管理/入驻审核/商户入驻审核功能需求.md
  19. 0 0
      doc/农资商城web/组织管理/入驻审核/商户入驻审核技术方案.md
  20. 0 0
      doc/农资商城web/组织管理/入驻审核/商户入驻审核测试用例.md
  21. 0 0
      doc/农资商城web/组织管理/商户管理/Snipaste_2026-05-28_10-57-48.jpg
  22. 0 0
      doc/农资商城web/组织管理/商户管理/Snipaste_2026-05-28_10-58-29.jpg
  23. 0 0
      doc/农资商城web/组织管理/商户管理/商户管理功能需求-草稿.md
  24. 0 0
      doc/农资商城web/组织管理/商户管理/商户管理功能需求.md
  25. 0 0
      doc/农资商城web/组织管理/商户管理/商户管理技术方案.md
  26. 0 0
      doc/农资商城web/组织管理/商户管理/商户管理测试用例.md
  27. 0 0
      doc/农资商城web/组织管理/店铺管理/Snipaste_2026-05-28_10-58-49.jpg
  28. 0 0
      doc/农资商城web/组织管理/店铺管理/Snipaste_2026-05-28_10-59-13.jpg
  29. 0 0
      doc/农资商城web/组织管理/店铺管理/店铺管理功能需求-草稿.md
  30. 0 0
      doc/农资商城web/组织管理/店铺管理/店铺管理功能需求.md
  31. 1 1
      doc/农资商城web/店铺管理/店铺管理技术方案.md
  32. 0 0
      doc/农资商城web/组织管理/店铺管理/店铺管理测试用例.md
  33. 0 0
      doc/农资商城web/组织管理/店铺设置/店铺设置功能需求-草稿.md
  34. 0 0
      doc/农资商城web/组织管理/店铺设置/店铺设置功能需求.md
  35. 0 0
      doc/农资商城web/组织管理/店铺设置/店铺设置技术方案.md
  36. 0 0
      doc/农资商城web/组织管理/店铺设置/店铺设置测试用例.md
  37. BIN
      doc/农资商城web/订单管理/Snipaste_2026-05-28_10-21-43.jpg
  38. 16 0
      doc/农资商城web/订单管理/订单管理功能需求-草稿.md
  39. 477 0
      doc/农资商城web/订单管理/订单管理功能需求.md
  40. 510 0
      doc/农资商城web/订单管理/订单管理技术方案.md
  41. 538 0
      doc/农资商城web/订单管理/订单管理测试用例.md

+ 439 - 0
doc/农资商城web/关联需求分析.md

@@ -0,0 +1,439 @@
1
+# 农资商城 Web — 关联需求分析
2
+
3
+> **范围:** 基于 `doc/农资商城web/` 下各模块 **功能需求定稿** 梳理跨模块关系;**不涉及** 数据库表结构、接口路径、技术实现。  
4
+> **目录(v3.0):** 组织管理(商户/店铺/店铺设置/入驻审核)、商品管理(主模块 + 分类/服务/审核)、内容管理、会员管理、订单管理;详见 [文档索引.md](文档索引.md)。  
5
+> **依据:** 《商户管理功能需求》v1.3.1、《店铺管理功能需求》v1.3.2、《商品分类功能需求》v1.3.1、《商品管理功能需求》v1.3.3、《商品服务管理功能需求》v1.0.1、《会员管理功能需求》v1.0、《订单管理功能需求》v1.0.1。  
6
+> **说明:** 不修改任何 `*-草稿.md`;技术方案、测试用例为验收参考,本分析以功能需求为准。  
7
+> **v1.1:** 纳入 **商品服务管理**(平台主数据 + 商品勾选快照)。  
8
+> **v1.2:** 纳入 **用户链**(会员、订单);定稿 **未完成订单 O10**、待支付自动关闭 **O8**、消费统计 **O11**。  
9
+> **v1.3:** 文档目录重组(组织管理 / 商品管理 / 内容管理);路径见 [文档索引.md](文档索引.md) v3.0。
10
+
11
+---
12
+
13
+## 1. 分析目的
14
+
15
+| 目标 | 说明 |
16
+|------|------|
17
+| 统一业务链 | 说明「商户 → 店铺 → 服务目录 → 分类 → 商品 → C 端」先后依赖与谁配置、谁消费 |
18
+| 划清边界 | 避免平台端与商家端职责混淆(如分类谁维护、账号谁配置) |
19
+| 收敛规则 | 将分散在各模块的 R/S/G/P 规则归纳为可执行的跨模块约束 |
20
+| 明确不联动 | 列出「状态变更不自动级联」场景,防止产品设计遗漏 |
21
+
22
+---
23
+
24
+## 2. 系统定位与三端
25
+
26
+```text
27
+                    ┌──────────────────────────────────────────┐
28
+                    │            平台管理端(Web)                 │
29
+                    │  商户 │ 店铺 │ 商品服务 │ 商品管理(监管)      │
30
+                    └──────────────────┬───────────────────────────┘
31
+                                       │ 主体、开店、服务目录、审核
32
+                    ┌──────────────────▼───────────────────────────┐
33
+                    │         店铺经营管理端(商家后台)               │
34
+                    │  经营账号登录 → 选当前店铺                     │
35
+                    │  商品分类 │ 商品发布(含服务勾选)/上架/下架      │
36
+                    └──────────────────┬───────────────────────────┘
37
+                                       │ 出售中且满足条件
38
+                    ┌──────────────────▼───────────────────────────┐
39
+                    │              C 端(用户商城)                  │
40
+                    │  浏览分类/商品、服务快照展示、下单              │
41
+                    └──────────────────────────────────────────┘
42
+```
43
+
44
+| 端 | 主要角色 | 本分析涉及模块 |
45
+|----|----------|----------------|
46
+| 平台管理端 | 平台管理员 | **组织管理**(商户/店铺/入驻)、**商品管理**(服务/审核/监管)、**内容管理** |
47
+| 店铺经营管理端 | 店铺经营账号、子管理员(上限由平台配置,子账号能力 **非本期**) | 商品分类、商品管理(商家侧,含服务勾选) |
48
+| C 端 | 用户 | 不单独成稿;可售条件在商品/店铺/分类需求中定义;服务展示读商品快照 |
49
+
50
+**供给链共性(商户/店铺/商品 v1.3):** 商家登录使用 **平台配置的店铺经营账号**,**不校验** C 端会员注册。
51
+
52
+### 2.1 双业务链(v1.2)
53
+
54
+```text
55
+【供给链】商户 → 店铺 → 商品服务 → 分类 → 商品 → C 端可购
56
+【用户链】C 端会员注册 → 下单/支付 → 订单履约(平台)→ 会员管理(只读订单/消费统计)
57
+```
58
+
59
+| 链 | 账号对象 | 平台模块 |
60
+|----|----------|----------|
61
+| 供给链 | 店铺经营账号 | 商户、店铺、商品服务、商品(监管) |
62
+| 用户链 | C 端买家会员 | 会员管理、订单管理 |
63
+
64
+两链 **账号不混用**;店铺经营账号 **不是** 会员账号。
65
+
66
+---
67
+
68
+## 3. 模块职责与边界
69
+
70
+> **菜单分组(文档目录 v3.0):** **组织管理**(商户、店铺、店铺设置、入驻审核)· **商品管理**(商品、分类、服务、审核)· **内容管理**(协议、Banner)· **会员/订单**(用户链,顶层目录)。
71
+
72
+| 模块 | 端 | 核心职责 | 明确不做 |
73
+|------|-----|----------|----------|
74
+| **商户管理** | 平台 | 主体入驻(仅主体资质)、补全经营信息、认证状态、删除商户主体 | 不配置商家登录账号;不管理店铺/商品/分类 |
75
+| **店铺管理** | 平台 | 为合格商户开店、店铺开业/停业、**配置商户级经营账号**、删店;商家端可改店资料(列表同源) | 不维护商品分类;店铺策略见《店铺设置》;不审核商品 |
76
+| **店铺设置** | 平台 | 全平台 **商品默认审核**、**子管理员上限**(针对所有店铺) | 非逐店配置;见 `组织管理/店铺设置/` |
77
+| **入驻审核** | 平台 + C 端 | 用户商城入驻申请、平台审核、首店创建 | 不替代商户管理日常维护;协议见内容管理 |
78
+| **商品分类** | **商家** | 当前店铺下二级分类树维护(增删改、显示/热门) | 平台端 **无** 分类 CRUD;商品 **不可** 挂一级分类 |
79
+| **商品管理** | 平台 + 商家 | 商家发品与状态流转;平台审核、下架、全平台检索;勾选服务并保存 **快照** | 不创建平台级统一分类;不维护服务目录 |
80
+| **商品审核** | 平台 | 待审/出售中商品 **监管列表**、审核、下架(与商品管理同源状态机) | 不重复商家发品表单;见专册或合入商品管理菜单 |
81
+| **商品服务管理** | 平台 | 全平台服务目录(名称、简介、图标、默认显示、排序) | 非店铺维度;商家/C 端 **不维护** 目录 |
82
+
83
+### 3.1 模块依赖方向(功能层)
84
+
85
+```text
86
+商户管理 ──前置──► 店铺管理 ──前置──► 商品分类(商家)
87
+                              ├──► 商品服务管理(平台,可与开店并行)
88
+                              └──► 商品管理(商家发品 + 平台监管)
89
+```
90
+
91
+- **硬前置:** 无商户 → 无店;无店 → 商家无法维护分类/发品。  
92
+- **软前置:** 商户 **经营信息未完整** → 不可被选为开店对象(仍可先入驻主体)。  
93
+- **并行:** 平台可先配 **商品服务目录** 再发品;同一店铺下商家可先建分类再发品;分类、商品服务勾选、商品均在 **当前店铺** 上下文(服务目录本身全平台共用)。
94
+
95
+### 3.2 商品服务与商品的边界(定稿)
96
+
97
+| 问题 | 定稿 |
98
+|------|------|
99
+| 谁维护目录? | **仅平台** · 商品服务管理 |
100
+| 谁勾选? | **商家** 发品/编辑商品时多选(可零项) |
101
+| 展示用哪份数据? | 保存商品时的 **展示快照**(P18);非实时跟目录 |
102
+| 删服务项 | 有被未删商品勾选则 **不可删**;删后 C 端 **不展示**(P20) |
103
+| 改服务文案 | **不自动** 改已售商品 C 端展示(P19) |
104
+
105
+---
106
+
107
+## 4. 核心业务对象(功能视角)
108
+
109
+| 对象 | 归属 | 关键属性(功能语义) | 主要维护方 |
110
+|------|------|----------------------|------------|
111
+| **商户** | 平台 | 个人/企业、主体资质、经营信息、认证状态(正常/冻结/注销)、已绑定店铺数 | 平台 · 商户管理 |
112
+| **店铺** | 商户下 | 名称、头像、开业/停业、商家电话;**默认审核/子管理员上限** 见《店铺设置》全局 | 平台 · 店铺管理;商家端可改名称/头像/描述/电话 |
113
+| **商户经营账号** | 商户下 **一套**(多店共用登录名) | 登录名、管理员姓名、密码;首家店创建,后续店须一致 | 平台 · 店铺管理(开店/账号管理) |
114
+| **子管理员** | 店铺维度配额 | 仅 **人数上限** 在店铺设置;具体人员 **非本期** | 预留 · 商家端(待建设) |
115
+| **商品分类** | 店铺下 | 一级+二级;显示/热门/排序;店间独立 | 商家 · 商品分类 |
116
+| **商品** | 店铺下 | 编号(系统生成)、单规格价/库存、五态、二级分类、**服务展示快照** | 商家创建;平台审核/下架 |
117
+| **商品服务项** | 全平台 | 名称、简介、图标、默认显示、排序 | 平台 · 商品服务管理 |
118
+
119
+**命名说明(需求用语):** 产品称「店铺经营账号」;业务上为 **一商户一套登录凭证、多店共用**,与「每店一条账号」不同。
120
+
121
+---
122
+
123
+## 5. 端到端主流程
124
+
125
+### 5.1 标准开业流程(平台 + 商家)
126
+
127
+```text
128
+【平台】添加商户
129
+    → 仅填写主体资质(个人 / 企业)
130
+    → 认证状态 = 正常,提示后续补全经营信息
131
+        ↓
132
+【平台】编辑商户
133
+    → 补全商户经营信息(名称、联系人、结算银行等)
134
+    → 经营信息完整后,方可被店铺管理选为开店对象
135
+        ↓
136
+【平台】添加店铺
137
+    → 选择商户(须:未删除 + 认证正常 + 经营信息完整)
138
+    → 配置经营账号(首家:登录名/姓名/密码;非首家:须与已有账号一致)
139
+    → 店铺默认开业;**全局** 店铺策略见独立菜单「店铺设置」
140
+    → 商户「已绑定店铺数量」+1
141
+        ↓
142
+【平台】商品服务管理:配置服务目录(可与开店并行,建议发品前完成)
143
+        ↓
144
+【商家】经营账号登录 → 选择当前店铺
145
+        ↓
146
+【商家】商品分类:添加一级 / 二级分类
147
+        ↓
148
+【商家】商品管理:发布商品 → 未上架(草稿)
149
+    → 选择本店二级分类 → 勾选商品服务(可选,默认显示项预勾选)→ 保存生成快照
150
+    → 提交上架
151
+        ↓
152
+    ┌─ 店铺「默认审核通过」= 关 ─► 待审核 ──【平台】审核──► 出售中 / 审核失败
153
+    └─ 店铺「默认审核通过」= 开 ─► 直接出售中
154
+        ↓
155
+【C 端】出售中 + 店铺开业 + 分类显示 + 库存>0 → 可下单
156
+    → 商品详情展示服务 **快照**(已删服务项不展示)
157
+```
158
+
159
+### 5.2 商户认证异常对下游的影响
160
+
161
+| 商户认证变更 | 店铺管理 | 已有店铺 | 商品状态 | C 端 |
162
+|--------------|----------|----------|----------|------|
163
+| → **已冻结** | 不可 **新开店** | 不自动停业 | 不自动下架 | 不停业店仍可售(若店铺仍开业) |
164
+| → **已注销** | 不可新开店;不可编辑商户 | 不自动停业 | 不自动下架 | 同上 |
165
+| → **正常**(恢复) | 可开店(须经营信息完整) | — | — | — |
166
+
167
+运营可 **人工** 将店铺改为停业;改停业须二次确认,C 端该店 **禁止下单**,商品后台状态 **不变**。
168
+
169
+### 5.3 店铺停业与商品、C 端
170
+
171
+```text
172
+平台:店铺 开业 → 停业(二次确认)
173
+    ↓
174
+商品:仍为出售中(及其他原状态,不批量变更)
175
+    ↓
176
+C 端:该店禁止下单(购物车/立即购买均拦截)
177
+    ↓
178
+商家端:仍可维护分类、商品资料(需求允许)
179
+```
180
+
181
+### 5.4 商品状态闭环(跨端摘要)
182
+
183
+| 状态 | 商家端 | 平台列表 | 进入方式 | 离开方式 |
184
+|------|:------:|:--------:|----------|----------|
185
+| 未上架 | ✓ | ✗ | 保存商品 | 提交上架 |
186
+| 待审核 | ✓ | ✓ | 提交上架(店免审关) | 平台通过→出售中;驳回→审核失败 |
187
+| 出售中 | ✓ | ✓ | 审核通过或店免审开 | 平台/商家下架→已下架 |
188
+| 审核失败 | ✓ | ✓ | 平台驳回 | 修改后重新提交上架 |
189
+| 已下架 | ✓ | ✓ | 下架 | 重新提交上架 |
190
+
191
+**刚性约束(P17):** 状态 **只能** 通过「提交上架、平台审核、下架」变更;编辑保存 **不得** 直接改为出售中,也 **不得** 改回未上架。
192
+
193
+**待审核期间(P14):** 商家可改资料,保存后 **仍为待审核**,不自动通过,不视为重新排队(以首次提交上架时间为准)。
194
+
195
+---
196
+
197
+## 6. 跨模块业务规则总表
198
+
199
+### 6.1 商户 ↔ 店铺
200
+
201
+| 编号 | 规则 | 触发模块 | 消费模块 |
202
+|------|------|----------|----------|
203
+| M-S1 | 开店可选商户:未删除 + 认证 **正常** + 经营信息 **完整** | 商户 R6 | 店铺 S1 |
204
+| M-S2 | 单商户可开 **多个** 店;**不设** 开店数量上限 | 商户 R1 | 店铺 S2 |
205
+| M-S3 | 同商户下所有店 **同一套** 经营账号(登录名一致) | 店铺 S4/S5 | 开店、账号管理 |
206
+| M-S4 | 经营账号在 **添加店铺** 时配置(首家必填密码) | 店铺 | 商户不采集 |
207
+| M-S5 | 商户冻结/注销 → **不可新开店**;**不自动** 改店铺状态 | 商户 7.5 | 店铺 S9 |
208
+| M-S6 | 商户详情可跳转店铺列表(按商户名筛选) | 商户 8.1 | 店铺列表 |
209
+| M-S7 | 末店删除后经营账号 **保留**,便于再开店沿用 | 店铺 11.5 | 再次开店 |
210
+
211
+### 6.2 店铺 ↔ 商品
212
+
213
+| 编号 | 规则 | 说明 |
214
+|------|------|------|
215
+| S-P1 | 「默认审核通过」默认 **关闭** | 新提交上架 → **待审核**;开启则 → **出售中** |
216
+| S-P2 | 修改审核开关 **不追溯** 已存在商品 | 仅影响 **此后** 新提交上架 |
217
+| S-P3 | 店铺 **停业** → C 端禁单;**不自动** 下架商品 | 商品可仍为出售中 |
218
+| S-P4 | 删店前置:无 **出售中**、无 **待审核** 商品 | 已下架/审核失败/未上架不阻塞删店 |
219
+| S-P5 | 商品创建后 **不可换店** | 归属店铺固定 |
220
+| S-P6 | 子管理员上限仅数字配置;人员管理 **非本期** | 店铺 10.4 |
221
+
222
+### 6.3 分类 ↔ 商品
223
+
224
+| 编号 | 规则 | 说明 |
225
+|------|------|------|
226
+| C-P1 | 商品 **仅可关联本店二级分类** | 不可挂一级 |
227
+| C-P2 | 删二级分类前须无关联商品 | 须先改商品分类或处理商品 |
228
+| C-P3 | 删一级:子级无商品方可删;通过则 **级联删** 下属二级 | 批量删整批失败 |
229
+| C-P4 | 改分类显示/排序 **不自动** 改商品上下架状态 | 分类 G8 |
230
+| C-P5 | 分类「不显示」→ C 端无分类入口;商品 **不自动** 下架 | 与 P9 衔接 |
231
+
232
+### 6.4 平台商品监管
233
+
234
+| 编号 | 规则 | 说明 |
235
+|------|------|------|
236
+| P-PL1 | 平台列表 **不含** 未上架 | 草稿仅商家可见 |
237
+| P-PL2 | 仅 **待审核** 可审核;仅 **出售中** 可下架 | 其他状态操作阻断 |
238
+| P-PL3 | 批量审核/下架:含不符合状态 → **整批失败** | 与分类批量删一致 |
239
+| P-PL4 | 审核驳回 **必填原因** | 商家可见 |
240
+| P-PL5 | 平台可按店铺、分类路径检索 | 分类由商家维护,平台只读引用 |
241
+
242
+### 6.5 商品服务 ↔ 商品
243
+
244
+| 编号 | 规则 | 说明 |
245
+|------|------|------|
246
+| GS-P1 | 服务目录 **全平台一份**,非店铺维度 | 商品服务 GS1 |
247
+| GS-P2 | 商家发品 **多选** 服务,**可不选** | 商品 §10.6 |
248
+| GS-P3 | 保存商品时写 **展示快照** | 商品 P18 |
249
+| GS-P4 | C 端/详情展示 **快照**,平台改目录 **不追溯** | 商品 P19;商品服务 GS13 |
250
+| GS-P5 | 逻辑删除服务项 → C 端 **不展示** | 商品 P20 |
251
+| GS-P6 | 商家再次保存商品 → **自动剔除** 已删服务项 | 商品 P21 |
252
+| GS-P7 | 删服务项:有被未删商品勾选 → **不可删** | 商品服务 GS7 |
253
+| GS-P8 | 批量删服务:**整批失败** | 商品服务 GS8 |
254
+| GS-P9 | 改/删服务 **不改变** 商品上下架状态 | 商品服务 GS9 |
255
+
256
+---
257
+
258
+## 7. 删除与注销顺序(逻辑严谨)
259
+
260
+### 7.1 推荐操作顺序
261
+
262
+```text
263
+处理商品(出售中下架、待审核审完)
264
+    ↓
265
+删除店铺(满足:无未完成订单、无出售中/待审核商品)
266
+    ↓
267
+删除商户(满足:无下属店铺、无未完成订单、认证非注销等)
268
+```
269
+
270
+**禁止:** 在仍有未删除店铺时删除商户;在仍有出售中/待审核商品时删除店铺。
271
+
272
+### 7.2 各层删除前置(功能条件)
273
+
274
+| 对象 | 全部满足方可删除 | 不满足时典型提示方向 |
275
+|------|------------------|----------------------|
276
+| **二级分类** | 该分类下无未删除商品 | 先处理商品 |
277
+| **一级分类** | 其下任一二级都无商品;确认后级联删二级 | 子分类有商品则整棵不可删 |
278
+| **店铺** | 无未完成订单(**O10**:待支付+待发货+已发货);无出售中/待审核商品 | 先下架或审完商品 |
279
+| **商户** | 正常或冻结;**0** 下属店铺;无未完成订单(**O10**) | 先删店铺 |
280
+
281
+**订单 O10 说明:** **已关闭**(含待支付超时自动关闭 **O8**)、**已完成**、**已删除** **不属于** 未完成订单。
282
+
283
+均为 **逻辑删除**;删除后列表默认不展示,历史数据保留策略以各模块为准。
284
+
285
+### 7.3 逻辑删除后的经营能力
286
+
287
+| 事件 | 分类维护 | 商品新发/上架 | 经营账号 |
288
+|------|:--------:|:-------------:|----------|
289
+| 店铺逻辑删除 | 不可用 | 不可用 | 同商户仍有店则保留 |
290
+| 商户末店删除 | — | — | **保留**,再开店可沿用 |
291
+| 商户注销 | — | — | 不可新开店;商户资料只读 |
292
+
293
+---
294
+
295
+## 8. 状态与事件「不自动级联」清单
296
+
297
+以下场景需求 **明确不自动联动**,实现与测试须避免「误级联」:
298
+
299
+| 事件 | 不自动发生的变更 |
300
+|------|------------------|
301
+| 商户 → 已冻结/已注销 | 店铺不停业;商品不下架 |
302
+| 店铺 → 停业 | 商品状态不变;仅 C 端禁单 |
303
+| 店铺「默认审核通过」开关变更 | 已有商品状态不批量重算 |
304
+| 分类 → 不显示 | 商品不下架;C 端分类入口隐藏 |
305
+| 商家编辑待审核商品 | 不自动变为出售中 |
306
+| 商家编辑出售中商品 | 状态仍为出售中(资料可变) |
307
+| 平台编辑/删除商品服务项 | 商品状态不变;C 端展示 **不自动** 跟目录变(读快照);已删服务 C 端不展示 |
308
+| 平台改服务「默认显示」 | **不追溯** 已保存商品的勾选与快照 |
309
+
310
+---
311
+
312
+## 9. 账号体系(功能层)
313
+
314
+### 9.1 商户经营账号
315
+
316
+| 项 | 定稿 |
317
+|----|------|
318
+| 配置时机 | **添加店铺**(通常首家店) |
319
+| 维度 | **一商户一套**,非每店一套 |
320
+| 维护入口 | 平台 · 店铺管理 · 店铺账号管理 |
321
+| 修改影响 | 改登录名/密码后,同商户下所有店 **展示同步** |
322
+| 与会员 | **无** 关联 |
323
+| 登录后 | 商家须 **切换当前店铺**,再操作分类/商品 |
324
+
325
+### 9.2 子管理员
326
+
327
+| 项 | 定稿 |
328
+|----|------|
329
+| 配置 | 平台在 **店铺设置** 配置 **最大人数**(默认 5,1~99) |
330
+| 使用 | 商品分类/商品需求中写明可由子管理员操作,但 **增删子账号、权限分配非本期** |
331
+| 依赖 | 待「商家端账号/权限」模块建设后落地 |
332
+
333
+---
334
+
335
+## 10. 批量操作统一原则
336
+
337
+各模块对「勾选多条后批量处理」采用一致策略,便于产品与测试统一预期:
338
+
339
+| 模块 | 操作 | 规则 |
340
+|------|------|------|
341
+| 商品管理 | 批量审核 | 仅待审核;含其他状态 → **整批失败**,不变更任一条 |
342
+| 商品管理 | 批量下架 | 仅出售中;含其他状态 → **整批失败** |
343
+| 商品分类 | 批量删除 | 任一条校验失败 → **整批不删**,汇总原因 |
344
+| 商品服务管理 | 批量删除 | 任一条有关联商品或校验失败 → **整批不删**,汇总原因 |
345
+
346
+---
347
+
348
+## 11. C 端可售条件(四模块交汇)
349
+
350
+用户下单须 **同时** 满足(商品需求第 11 节):
351
+
352
+| # | 条件 | 来源模块 |
353
+|---|------|----------|
354
+| 1 | 商品状态 = **出售中** | 商品管理 |
355
+| 2 | 店铺 = **开业** | 店铺管理 |
356
+| 3 | 商品所属分类 **显示** = 是(且父级一级亦显示,技术方案有父级联动;功能上为「分类可见」) | 商品分类 |
357
+| 4 | 库存 **> 0** | 商品管理 |
358
+
359
+任一不满足即拦截下单;**店铺停业** 与 **库存为 0** 须分别提示。
360
+
361
+**说明:** 商品服务项 **不参与** 可下单校验(商品服务 GS、商品 §11.1)。
362
+
363
+---
364
+
365
+## 12. 模块依赖矩阵(谁依赖谁的数据)
366
+
367
+|  | 商户 | 店铺 | 商品服务 | 分类 | 商品 | 会员 | 订单 |
368
+|--|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
369
+| **商户** | — | 主体 | — | — | 间接 | 无 | 删商户 O10 |
370
+| **店铺** | 依赖 | — | — | 店/账号 | 删店校验 | 无 | 删店 O10 |
371
+| **商品服务** | — | — | — | — | 目录 | — | — |
372
+| **商品分类** | — | 店 | — | — | 分类 | — | — |
373
+| **商品管理** | 间接 | 店态 | 勾选 | 分类 | — | — | 支付扣库存 |
374
+| **会员管理** | 无 | 无 | — | — | 间接 | — | 只读订单/O11 |
375
+| **订单管理** | 间接 | 店 | 快照展示 | — | 库存 | 数据源 | — |
376
+
377
+---
378
+
379
+## 12.1 订单 ↔ 会员 / 店铺 / 商品(v1.2)
380
+
381
+| 编号 | 规则 | 说明 |
382
+|------|------|------|
383
+| O-P1 | **未完成订单 O10** = 待支付 + 待发货 + 已发货 | 删店/删商户 |
384
+| O-P2 | 待支付超时 **O8** → 已关闭,**不计入** O10 | 订单 §3.4 |
385
+| O-P3 | 累计消费 **O11** 仅 **已完成** | 会员 §6.5 |
386
+| O-P4 | 支付成功扣库存;待支付不扣 | 订单 §12.2;商品 P15 |
387
+| O-P5 | 整单发货,**本期不拆单** | 订单 O5、§17 |
388
+| O-P6 | 会员管理内订单 **只读** | 订单 O12;会员 M6 |
389
+
390
+---
391
+
392
+## 13. 非本期与待建设(关联影响)
393
+
394
+| 项 | 影响范围 | 当前文档处理 |
395
+|----|----------|--------------|
396
+| C 端下单/支付页面细则 | 用户链 | 订单需求含协作规则;C 端另述 |
397
+| 子管理员 CRUD 与权限 | 商家端 | 仅上限数字;分类/商品写明可含子管理员,能力预留 |
398
+| 分批发货/拆单 | 订单 | 草稿有;**本期不做**(订单 §17) |
399
+| 支付渠道、退款、售后 | 订单 | 另册 |
400
+| 多 SKU / 多规格 | 商品 | 首期单规格 |
401
+| 平台代发、商品导出、C 端商品列表 API | 商品 | 非本期 |
402
+| 三级分类 | 分类 | 禁止 |
403
+| 商户/店铺逻辑删除恢复 | 各模块 | 删除后须新建,不恢复 |
404
+| 按服务项检索全平台商品 | 商品服务 | 非本期 |
405
+| 服务分组、多语言 | 商品服务 | 非本期 |
406
+
407
+---
408
+
409
+## 14. 源文档索引
410
+
411
+| 文档 | 版本 | 角色 |
412
+|------|------|------|
413
+| 组织管理/商户管理/商户管理功能需求.md | v1.4 | 主体与认证 |
414
+| 组织管理/店铺管理/店铺管理功能需求.md | v1.3.4 | 开店、账号、商家端店资料 |
415
+| 组织管理/店铺设置/店铺设置功能需求.md | v1.1 | 全平台店铺策略 |
416
+| 组织管理/入驻审核/商户入驻审核功能需求.md | v1.0.2 | C 端入驻审核 |
417
+| 商品管理/商品分类/商品分类功能需求.md | v1.3.1 | 商家端分类 |
418
+| 商品管理/商品管理功能需求.md | v1.3.3 | 商品状态与商家发品 |
419
+| 商品管理/商品审核/商品审核功能需求.md | v1.0 | 平台审核/下架 |
420
+| 商品管理/商品服务/商品服务管理功能需求.md | v1.0.1 | 平台服务目录 |
421
+| 内容管理/商城入驻协议/商城入驻协议功能需求.md | v1.0 | 入驻协议文案 |
422
+| 会员管理/会员管理功能需求.md | v1.0.1 | C 端买家 |
423
+| 订单管理/订单管理功能需求.md | v1.0.1 | 履约、O8/O10/O11 |
424
+| 文档索引.md | v3.0 | 版本与路径入口 |
425
+
426
+---
427
+
428
+## 15. 分析结论(给产品 / 研发 / 测试)
429
+
430
+1. **主链路清晰:** 商户(主体+经营)→ 店铺(+经营账号)→ **商品服务目录** → 商家分类 → 商家商品(含服务勾选与快照)→ 平台审核 → C 端;缺店则无法发品,无服务目录仍可发品(服务可选)。  
431
+2. **边界清晰:** 平台不建分类;商户不建登录账号;店铺不审商品;商品不建平台统一类目;**商品服务仅平台维护目录**,商品负责勾选与快照。  
432
+3. **逻辑一致:** 批量整批失败、删除顺序、状态不级联在多模块重复出现;**服务展示快照**(P18~P21)与「目录变更不级联商品状态」已纳入 §6.5、§8。  
433
+4. **用户链已衔接:** 会员只读订单;订单 O8/O10/O11 与删店、消费统计一致;整单发货、不拆单。  
434
+5. **缺口显性:** 子管理员、C 端交易页、支付退款/售后、拆单为非本期或另册。  
435
+6. **测试建议:** 供给链见各模块测试用例;用户链见《订单管理测试用例》v1.0(49)、《会员管理测试用例》v1.0(39):下单 → O8 超时关闭 → 支付 → 发货 → 确认收货 → O11 消费统计;删店 **O10**。
436
+
437
+---
438
+
439
+*文档版本:v1.3 · 仅功能需求关联分析 · 不修改草稿 · 路径对齐文档索引 v3.0*

doc/农资商城web/商品分类/Snipaste_2026-05-28_10-59-33.jpg → doc/农资商城web/商品管理/商品分类/Snipaste_2026-05-28_10-59-33.jpg


doc/农资商城web/商品分类/Snipaste_2026-05-28_10-59-54.jpg → doc/农资商城web/商品管理/商品分类/Snipaste_2026-05-28_10-59-54.jpg


doc/农资商城web/商品分类/商品分类功能需求-草稿.md → doc/农资商城web/商品管理/商品分类/商品分类功能需求-草稿.md


doc/农资商城web/商品分类/商品分类功能需求.md → doc/农资商城web/商品管理/商品分类/商品分类功能需求.md


doc/农资商城web/商品分类/商品分类技术方案.md → doc/农资商城web/商品管理/商品分类/商品分类技术方案.md


doc/农资商城web/商品分类/商品分类测试用例.md → doc/农资商城web/商品管理/商品分类/商品分类测试用例.md


doc/农资商城web/商品审核/商品审核功能需求-草稿.md → doc/农资商城web/商品管理/商品审核/商品审核功能需求-草稿.md


doc/农资商城web/商品审核/商品审核功能需求.md → doc/农资商城web/商品管理/商品审核/商品审核功能需求.md


doc/农资商城web/商品审核/商品审核技术方案.md → doc/农资商城web/商品管理/商品审核/商品审核技术方案.md


doc/农资商城web/商品审核/商品审核测试用例.md → doc/农资商城web/商品管理/商品审核/商品审核测试用例.md


doc/农资商城web/商品服务/商品服务管理功能需求-草稿.md → doc/农资商城web/商品管理/商品服务/商品服务管理功能需求-草稿.md


doc/农资商城web/商品服务/商品服务管理功能需求.md → doc/农资商城web/商品管理/商品服务/商品服务管理功能需求.md


doc/农资商城web/商品服务/商品服务管理技术方案.md → doc/农资商城web/商品管理/商品服务/商品服务管理技术方案.md


doc/农资商城web/商品服务/商品服务管理测试用例.md → doc/农资商城web/商品管理/商品服务/商品服务管理测试用例.md


+ 136 - 0
doc/农资商城web/文档索引.md

@@ -0,0 +1,136 @@
1
+# 农资商城 Web — 文档索引
2
+
3
+> 统一版本对照表(2026-05 对齐)。实现与测试以各模块 **功能需求(定稿)** + **技术方案** 为准;测试用例 **依据** 字段须与下表一致。  
4
+> **v3.0:** 文档按 **组织管理 / 商品管理 / 内容管理** 分组目录;旧版扁平路径(如 `商户管理/`)已废止。
5
+
6
+---
7
+
8
+## 0. 目录结构
9
+
10
+```text
11
+doc/农资商城web/
12
+├── 文档索引.md
13
+├── 关联需求分析.md
14
+├── 组织管理/
15
+│   ├── 商户管理/
16
+│   ├── 店铺管理/
17
+│   ├── 店铺设置/
18
+│   └── 入驻审核/
19
+├── 商品管理/
20
+│   ├── 商品管理功能需求.md          # 主模块(根目录)
21
+│   ├── 商品管理技术方案.md
22
+│   ├── 商品管理测试用例.md
23
+│   ├── 商品分类/
24
+│   ├── 商品服务/
25
+│   └── 商品审核/
26
+├── 内容管理/
27
+│   ├── 商城入驻协议/
28
+│   ├── 商城服务协议/
29
+│   └── 首页banner设置/
30
+├── 会员管理/
31
+└── 订单管理/
32
+```
33
+
34
+草稿(各模块 `*-草稿.md`)仅作历史参考,**不以草稿为准**(会员/订单功能需求 v1.0 定稿除外)。
35
+
36
+---
37
+
38
+## 1. 模块文档一览
39
+
40
+### 1.1 组织管理
41
+
42
+| 模块 | 功能需求 | 技术方案 | 测试用例 | 说明 |
43
+|------|----------|----------|----------|------|
44
+| 商户管理 | [v1.4](组织管理/商户管理/商户管理功能需求.md) | [v1.4](组织管理/商户管理/商户管理技术方案.md) | [v1.2](组织管理/商户管理/商户管理测试用例.md) | 平台端 |
45
+| 店铺管理 | [v1.3.4](组织管理/店铺管理/店铺管理功能需求.md) | [v1.2.3](组织管理/店铺管理/店铺管理技术方案.md) | [v1.0](组织管理/店铺管理/店铺管理测试用例.md) | 平台 + 商家端店资料 |
46
+| 店铺设置 | [v1.1](组织管理/店铺设置/店铺设置功能需求.md) | [v1.1.1](组织管理/店铺设置/店铺设置技术方案.md) | [v1.1](组织管理/店铺设置/店铺设置测试用例.md) | 全平台全局策略 |
47
+| 入驻审核 | [v1.0.2](组织管理/入驻审核/商户入驻审核功能需求.md) | [v1.0.2](组织管理/入驻审核/商户入驻审核技术方案.md) | [v1.0.2](组织管理/入驻审核/商户入驻审核测试用例.md) | C 端入驻 + 平台审核 |
48
+
49
+### 1.2 商品管理
50
+
51
+| 模块 | 功能需求 | 技术方案 | 测试用例 | 说明 |
52
+|------|----------|----------|----------|------|
53
+| 商品管理 | [v1.3.3](商品管理/商品管理功能需求.md) | [v1.2](商品管理/商品管理技术方案.md) | [v1.0](商品管理/商品管理测试用例.md) | 平台 + 商家端;P18~P21 |
54
+| 商品分类 | [v1.3.1](商品管理/商品分类/商品分类功能需求.md) | [v1.1](商品管理/商品分类/商品分类技术方案.md) | [v1.0](商品管理/商品分类/商品分类测试用例.md) | **商家端** |
55
+| 商品服务 | [v1.0.1](商品管理/商品服务/商品服务管理功能需求.md) | [v1.0.1](商品管理/商品服务/商品服务管理技术方案.md) | [v1.0](商品管理/商品服务/商品服务管理测试用例.md) | **平台端**;`biz_goods_service` |
56
+| 商品审核 | [v1.0](商品管理/商品审核/商品审核功能需求.md) | [v1.0](商品管理/商品审核/商品审核技术方案.md) | [v1.0](商品管理/商品审核/商品审核测试用例.md) | 平台审核/下架专册 |
57
+
58
+### 1.3 内容管理
59
+
60
+| 模块 | 功能需求 | 技术方案 | 测试用例 | 说明 |
61
+|------|----------|----------|----------|------|
62
+| 商城入驻协议 | [v1.0](内容管理/商城入驻协议/商城入驻协议功能需求.md) | [v1.0](内容管理/商城入驻协议/商城入驻协议技术方案.md) | [v1.0](内容管理/商城入驻协议/商城入驻协议测试用例.md) | 入驻勾选协议 |
63
+| 商城服务协议 | [v1.0](内容管理/商城服务协议/商城服务协议功能需求.md) | [v1.0](内容管理/商城服务协议/商城服务协议技术方案.md) | [v1.0](内容管理/商城服务协议/商城服务协议测试用例.md) | 注册/登录协议 |
64
+| 首页 Banner | [v1.0.1](内容管理/首页banner设置/首页banner设置功能需求.md) | [v1.0](内容管理/首页banner设置/首页banner设置技术方案.md) | [v1.0](内容管理/首页banner设置/首页banner设置测试用例.md) | C 端 Banner |
65
+
66
+### 1.4 用户与交易
67
+
68
+| 模块 | 功能需求 | 技术方案 | 测试用例 | 说明 |
69
+|------|----------|----------|----------|------|
70
+| 会员管理 | [v1.0.1](会员管理/会员管理功能需求.md) | [v1.0.1](会员管理/会员管理技术方案.md) | [v1.0](会员管理/会员管理测试用例.md) | `biz_member` |
71
+| 订单管理 | [v1.0.1](订单管理/订单管理功能需求.md) | [v1.0](订单管理/订单管理技术方案.md) | [v1.0](订单管理/订单管理测试用例.md) | `biz_order` |
72
+
73
+**跨模块(仅功能、无库表/接口):** [关联需求分析.md](关联需求分析.md) v1.3
74
+
75
+---
76
+
77
+## 2. 跨模块定稿要点
78
+
79
+| 要点 | 规则编号(示例) |
80
+|------|------------------|
81
+| 商家链不考虑会员(经营账号≠会员) | 商户/店铺/商品/分类 v1.3 |
82
+| C 端买家会员(用户链) | [会员管理功能需求](会员管理/会员管理功能需求.md) v1.0.1 |
83
+| 单商户 **不设** 开店数量上限 | 商户 R1 v1.3.1;店铺 S2 |
84
+| 开店可选商户:正常 + 经营信息完整 | 商户 R6;店铺 S1 |
85
+| 商户经营账号 `biz_merchant_account`;同商户多店同登录名 | 店铺 S4/S5 |
86
+| 店铺策略(免审、子管理员)**全平台全局** | [店铺设置](组织管理/店铺设置/店铺设置功能需求.md) v1.1 |
87
+| 分类仅两级;商品仅挂二级 | 分类 C1/C5;商品 P1 |
88
+| 商品五态;未上架不进平台审核列表 | 商品 P3;[商品审核](商品管理/商品审核/商品审核功能需求.md) GR1 |
89
+| 状态仅 submit / audit / offShelf | 商品 P17 |
90
+| 批量审核/下架/删类:**整批失败** | 商品 P7;分类 G9 |
91
+| 删店:无出售中、待审核商品 | 店铺 11.2 |
92
+| 商品服务全平台一份;商家只勾选 | 商品服务 GS1/GS2 |
93
+| 订单 O8/O10/O11 | 订单 v1.0.1;删店/会员消费 |
94
+
95
+---
96
+
97
+## 3. 接口路径速查
98
+
99
+| 端 | 模块 | 基路径 |
100
+|----|------|--------|
101
+| 平台 | 商户 | `/agri/merchant` |
102
+| 平台 | 店铺 | `/agri/shop` |
103
+| 平台 | 店铺设置(全局) | `/agri/shopSetting` |
104
+| 平台 | 商品 | `/agri/goods` |
105
+| 平台 | 商品服务 | `/agri/goodsService` |
106
+| 平台 | 入驻审核 | `/agri/entry` |
107
+| 商家 | 分类 | `/agri/seller/category` |
108
+| 商家 | 商品 | `/agri/seller/goods` |
109
+| 商家 | 店铺资料 | `/agri/seller/shop` |
110
+
111
+商家端须 **当前店铺** 上下文(`X-Shop-Id` 或 Session)。
112
+
113
+---
114
+
115
+## 4. 业务链(文档协作顺序)
116
+
117
+```text
118
+【组织】商户 → 店铺(+经营账号)→ 店铺设置(全局)
119
+【入驻】内容管理·入驻协议 → 入驻审核 → 首店
120
+【供给链】商品服务 → 商品分类 → 商品管理 → 商品审核 → C 端
121
+【用户链】会员注册 → 下单 → 订单管理
122
+【内容】Banner / 服务协议 / 入驻协议(与交易链弱耦合)
123
+```
124
+
125
+---
126
+
127
+## 5. 修订记录
128
+
129
+| 日期 | 说明 |
130
+|------|------|
131
+| 2026-05 | **v3.0** 目录重组:`组织管理/`、`商品管理/`子模块、`内容管理/`;修正 `商品管理/商品审核/` 文档归属 |
132
+| 2026-05 | v2.4 及以前:扁平模块路径、经营账号表名统一等(见历史条目) |
133
+
134
+---
135
+
136
+*索引版本:v3.0*

doc/农资商城web/入驻审核/商户入驻审核功能需求-草稿.md → doc/农资商城web/组织管理/入驻审核/商户入驻审核功能需求-草稿.md


doc/农资商城web/入驻审核/商户入驻审核功能需求.md → doc/农资商城web/组织管理/入驻审核/商户入驻审核功能需求.md


doc/农资商城web/入驻审核/商户入驻审核技术方案.md → doc/农资商城web/组织管理/入驻审核/商户入驻审核技术方案.md


doc/农资商城web/入驻审核/商户入驻审核测试用例.md → doc/农资商城web/组织管理/入驻审核/商户入驻审核测试用例.md


doc/农资商城web/商户管理/Snipaste_2026-05-28_10-57-48.jpg → doc/农资商城web/组织管理/商户管理/Snipaste_2026-05-28_10-57-48.jpg


doc/农资商城web/商户管理/Snipaste_2026-05-28_10-58-29.jpg → doc/农资商城web/组织管理/商户管理/Snipaste_2026-05-28_10-58-29.jpg


doc/农资商城web/商户管理/商户管理功能需求-草稿.md → doc/农资商城web/组织管理/商户管理/商户管理功能需求-草稿.md


doc/农资商城web/商户管理/商户管理功能需求.md → doc/农资商城web/组织管理/商户管理/商户管理功能需求.md


doc/农资商城web/商户管理/商户管理技术方案.md → doc/农资商城web/组织管理/商户管理/商户管理技术方案.md


doc/农资商城web/商户管理/商户管理测试用例.md → doc/农资商城web/组织管理/商户管理/商户管理测试用例.md


doc/农资商城web/店铺管理/Snipaste_2026-05-28_10-58-49.jpg → doc/农资商城web/组织管理/店铺管理/Snipaste_2026-05-28_10-58-49.jpg


doc/农资商城web/店铺管理/Snipaste_2026-05-28_10-59-13.jpg → doc/农资商城web/组织管理/店铺管理/Snipaste_2026-05-28_10-59-13.jpg


doc/农资商城web/店铺管理/店铺管理功能需求-草稿.md → doc/农资商城web/组织管理/店铺管理/店铺管理功能需求-草稿.md


doc/农资商城web/店铺管理/店铺管理功能需求.md → doc/农资商城web/组织管理/店铺管理/店铺管理功能需求.md


+ 1 - 1
doc/农资商城web/店铺管理/店铺管理技术方案.md

@@ -1,7 +1,7 @@
1 1
 # 店铺管理 — 技术方案
2 2
 
3 3
 > **依据:** 《店铺管理功能需求.md》v1.3.4  
4
-> **关联:** 《商户管理》《商品分类》《商品管理》功能需求(`doc/农资商城web/`)、《商户管理技术方案.md》v1.3、《店铺设置技术方案.md》v1.1.1  
4
+> **关联:** 《商户管理》《商品分类》《商品管理》功能需求(`doc/农资商城web/`)、《商户管理技术方案.md》v1.4、《店铺设置技术方案.md》v1.1.1    
5 5
 > **范围:** 本文以 **店铺模块** 的数据库、接口为主;商品/分类/订单/商家端登录给出 **表关系、Facade、联动**;不展开商品/C 端完整设计。  
6 6
 > **原则:** **不考虑会员**;**店铺经营账号** 由本模块维护(平台账号体系,BCrypt 密码)。  
7 7
 > **v1.2.3:** 商家端 **`GET/PUT /agri/seller/shop`** 维护店资料,与平台列表 **同源** `biz_shop`。  

doc/农资商城web/店铺管理/店铺管理测试用例.md → doc/农资商城web/组织管理/店铺管理/店铺管理测试用例.md


doc/农资商城web/店铺设置/店铺设置功能需求-草稿.md → doc/农资商城web/组织管理/店铺设置/店铺设置功能需求-草稿.md


doc/农资商城web/店铺设置/店铺设置功能需求.md → doc/农资商城web/组织管理/店铺设置/店铺设置功能需求.md


doc/农资商城web/店铺设置/店铺设置技术方案.md → doc/农资商城web/组织管理/店铺设置/店铺设置技术方案.md


doc/农资商城web/店铺设置/店铺设置测试用例.md → doc/农资商城web/组织管理/店铺设置/店铺设置测试用例.md


BIN
doc/农资商城web/订单管理/Snipaste_2026-05-28_10-21-43.jpg


+ 16 - 0
doc/农资商城web/订单管理/订单管理功能需求-草稿.md

@@ -0,0 +1,16 @@
1
+做一个订单管理模块:
2
+
3
+
4
+
5
+1. 全部订单列表:订单信息(订单编号、商品主图、商品名称、商品规格、数量、单价、下单时间)、订单金额、会员名称、收货人信息(收货人、手机号、收货地址)、配送方式、订单状态、操作;
6
+2. 订单状态:全部、待发货、已发货、已关闭、已完成、已删除;
7
+3. 订单高级检索:根据订单编号、商品名称、发货状态、收货人姓名、收货人手机号、收货地址、下单时间、配送方式检索;
8
+4. 操作:
9
+   (1)查看详情:全部订单均可查看详情(包括物流节点信息);
10
+   (2)去发货:待发货订单可去发货,选择【发货时间、配送方式(物流配送/商家配送)、物流公司+快递单号/车辆号码+配送员+配送员手机号、发货备注、发货商品及数量】,如果订单分开发货,系统会自动将订单拆分为不同订单,发货后订单状态更新为“已发货”;
11
+   (3)更新物流信息:运输中订单可多次更新物流,选择【运输更新时间、运输状态描述】;
12
+   (4)商品到货:订单送达后选择【送达时间 、送达说明】,买家确认收货后订单状态更新为“已完成”;
13
+   (5)删除订单:已关闭订单可删除订单,删除订单后订单状态更新为“已删除”
14
+5. 
15
+6. 异常返回:统一格式 code、msg、data。
16
+7. 技术栈:RuoYi v3.9.2-springboot2 分支 + MySQL-5.7.39。

+ 477 - 0
doc/农资商城web/订单管理/订单管理功能需求.md

@@ -0,0 +1,477 @@
1
+# 订单管理 — 功能需求说明
2
+
3
+> 本文档在《订单管理功能需求-草稿》基础上整理,并关联《农资商城web》目录下 **会员管理 v1.0**、**商品管理 v1.3.3**、**店铺管理 v1.3.2**、**商户管理 v1.3.1**、《关联需求分析.md》v1.2 及目录内原型截图做边界与流程对齐。  
4
+> 范围:**平台管理端** 全平台订单查询、履约(发货/物流/完成/关闭/删除)及与会员累计消费统计;不涉及数据库结构、接口定义及技术实现细节。  
5
+> **说明:** 订单由 **C 端会员** 在 **店铺** 下购买 **商品** 产生;首期 **单规格** 商品(商品 P16)。  
6
+> **v1.0:** 状态机与草稿对齐并补充 **待支付**;会员消费统计口径定稿。  
7
+> **v1.0.1:** **不做分批发货/拆单**(草稿拆单能力划入非本期);**待支付超时未付款自动关闭**(§3.4)。
8
+
9
+---
10
+
11
+## 1. 模块定位
12
+
13
+### 1.1 业务目标
14
+
15
+在农资商城 **平台管理端(Web)** 提供:
16
+
17
+- **全平台订单** 列表、状态筛选与高级检索;
18
+- 订单 **详情**(含物流节点时间轴);
19
+- **履约操作**:**整单一次发货**、更新物流、登记送达、配合 C 端 **确认收货** 完成订单;
20
+- **待支付**:超时未支付 **系统自动关闭**(§3.4);
21
+- **关闭** 与 **逻辑删除** 已关闭订单;
22
+- 为 **会员管理** 提供会员维度订单只读数据及 **累计消费** 统计口径。
23
+
24
+**不包含(本期):** 支付渠道对接细节、商家端独立订单后台(可后续)、Excel 批量发货/批量打印(原型有,见 §14)。
25
+
26
+### 1.2 在业务链中的位置
27
+
28
+```text
29
+【供给链】商户 → 店铺 → 商品(出售中)
30
+            ↓
31
+【用户链】C 端会员注册 → 下单/支付
32
+            ↓
33
+【本模块】平台订单管理(履约、关闭、删除)
34
+            ↓
35
+【会员管理】只读查看会员订单、展示累计消费(统计来自本模块)
36
+```
37
+
38
+| 关联模块 | 关系 | 边界说明 |
39
+|----------|------|----------|
40
+| 会员管理 v1.0 | 下游展示 | 会员「查看订单」**只读**;累计消费 **以本模块统计为准**(§11) |
41
+| 商品管理 v1.3.3 | 上游 | 下单时商品须 **出售中**、库存>0 等(P15);支付成功 **扣减库存**(§12.2) |
42
+| 店铺管理 v1.3.2 | 上游 | 店铺 **开业** 才可下单;**停业** 禁止新下单;删店校验 **未完成订单**(§10.3) |
43
+| 商户管理 v1.3.1 | 间接 | 删商户校验未完成订单;商户冻结 **不自动** 关单 |
44
+| 商品服务 v1.0.1 | 间接 | 订单展示商品快照信息(名称、规格、价格),不单独维护服务项 |
45
+
46
+### 1.3 使用端与角色
47
+
48
+| 端 | 角色 | 能力 |
49
+|----|------|------|
50
+| **平台管理端** | 平台管理员/运营/客服 | 全部订单列表、检索、详情、发货、物流、送达登记、关闭、删除 |
51
+| **C 端** | 买家会员 | 下单、支付、**确认收货**;查看本人订单(C 端页面另述) |
52
+| **会员管理(平台)** | 同平台角色 | 仅 **查看** 某会员订单,**不可** 在本模块外执行发货 |
53
+| 商家端 | 店铺经营账号 | **本期定稿以平台履约为准**;商家端订单处理若建设,单独立项 |
54
+
55
+---
56
+
57
+## 2. 业务概念
58
+
59
+| 概念 | 说明 |
60
+|------|------|
61
+| 订单 | 会员在某 **店铺** 一次交易单据;含一行或多行 **商品明细**(首期每行对应单规格 SKU) |
62
+| 订单编号 | 系统生成,全平台唯一 |
63
+| 交易单号 | 支付渠道返回的支付流水号(若有);用于检索 |
64
+| 订单金额 | 商品金额 + 运费等;展示 **应付/实付** 以产品口径为准(含运费 0 展示) |
65
+| 会员 | 下单的 C 端买家;展示 **会员名称**(昵称等) |
66
+| 收货人信息 | 收货人、手机号、收货地址(下单快照) |
67
+| 配送方式 | **物流配送** / **商家配送**(草稿发货时选择) |
68
+| 物流节点 | 发货、运输更新、送达、确认收货等 **时间轴** 记录 |
69
+| 支付超时时间 | 平台可配置;自下单起在该时长内须完成支付,否则 **自动关闭**(§3.4) |
70
+| 未完成订单 | 用于删店/删商户校验;见 §10.3 |
71
+| 逻辑删除 | 仅 **已关闭** 订单可「删除」为 **已删除**;列表默认不展示 |
72
+
73
+---
74
+
75
+## 3. 订单状态(定稿)
76
+
77
+### 3.1 状态枚举与页签
78
+
79
+| 状态 | 含义 | 列表页签(建议) |
80
+|------|------|----------------|
81
+| **待支付** | 已下单未支付(**定稿补充**,C 端闭环必需;草稿页签未列) | 待支付 |
82
+| **待发货** | 已支付,待平台/运营发货 | 待发货 |
83
+| **已发货** | 已发货,运输中或待买家确认收货 | 已发货 |
84
+| **已完成** | 买家 **确认收货** 后完结 | 已完成 |
85
+| **已关闭** | 交易终止(未支付超时、取消、运营关闭等) | 已关闭 |
86
+| **已删除** | 由 **已关闭** 逻辑删除 | 已删除 |
87
+| **全部** | 以上所有未物理清除的订单 | 全部 |
88
+
89
+> 原型另有「已取消」「无效」等标签,**本期与「已关闭」合并归类** 为 **已关闭**,关闭原因在详情中区分(§3.3)。
90
+
91
+### 3.2 状态流转(主路径)
92
+
93
+```text
94
+【C 端】提交订单
95
+    ↓
96
+待支付 ──支付成功──► 待发货 ──整单发货──► 已发货
97
+    │                    │                      │
98
+    │                    │                      ├── 更新物流(可多次,仍为已发货)
99
+    │                    │                      ├── 平台登记「商品到货/送达」
100
+    │                    │                      └── 买家确认收货 ──► 已完成
101
+    │                    │
102
+    ├── 支付超时(系统自动)──► 已关闭
103
+    ├── 买家取消 / 运营关闭 ──┤
104
+    └── 待支付/待发货/已发货运营关闭 ──┴──► 已关闭 ──删除──► 已删除
105
+```
106
+
107
+| 规则 | 说明 |
108
+|------|------|
109
+| 支付成功 | 待支付 → **待发货**;触发 **库存扣减**(§12.2) |
110
+| 发货 | **待发货** 须 **整单一次发完** → **已发货**(本期不支持部分发货、不拆单) |
111
+| 完成 | **买家** C 端确认收货 → **已完成**(平台登记送达 **不替代** 完成) |
112
+| 自动关闭 | **待支付** 超过 **支付超时时间** 仍未支付成功 → **已关闭**(§3.4) |
113
+| 手动关闭 | 待支付/待发货/已发货(未完成)可由运营关闭 → **已关闭** |
114
+| 删除 | **仅已关闭** → **已删除** |
115
+
116
+### 3.3 已关闭(定稿分类)
117
+
118
+| 关闭类型(详情展示) | 典型前置状态 | 触发方式 |
119
+|----------------------|--------------|----------|
120
+| **未支付超时** | 待支付 | **系统自动**(§3.4) |
121
+| 买家取消 | 待支付 | C 端(若开放) |
122
+| 运营关闭 | 待支付、待发货、已发货 | 平台手工 |
123
+| 支付失败/退款关闭 | 待支付或待发货 | 支付/售后流程(另册) |
124
+
125
+### 3.4 待支付与自动关闭(v1.0.1 定稿)
126
+
127
+| 项 | 定稿 |
128
+|----|------|
129
+| 适用状态 | 仅 **待支付** |
130
+| 触发条件 | 自 **下单时间** 起,超过 **支付超时时间** 仍未 **支付成功** |
131
+| 支付超时时间 | **平台系统参数** 可配置(单位:分钟);**首期建议默认 1440(24 小时)**,上线前由产品确认 |
132
+| 执行方式 | **定时任务** 扫描到期待支付单,批量置为 **已关闭** |
133
+| 关闭类型 | **未支付超时**(§3.3) |
134
+| 库存 | **不扣减**(扣减仅在支付成功,§12.2);自动关闭 **无需** 回滚库存 |
135
+| C 端 | 关闭后该单 **不可继续支付**;买家须 **重新下单** |
136
+| 与删店 | 自动关闭后状态为 **已关闭**,**不属于** 未完成订单(O10) |
137
+| 运营 | 待支付单在超时前仍可 **手工关闭**;关闭类型记「运营关闭」 |
138
+
139
+```text
140
+【C 端】提交订单 → 待支付
141
+    ↓
142
+    ├── 在支付超时时间内支付成功 → 待发货
143
+    └── 超时仍未支付成功
144
+            ↓
145
+        【系统】自动关闭 → 已关闭(未支付超时)
146
+```
147
+
148
+---
149
+
150
+## 4. 功能结构
151
+
152
+```text
153
+订单管理(平台)
154
+├── 全部订单列表(状态页签 + 高级检索)
155
+├── 查看详情(含物流节点)
156
+├── 去发货(待发货)
157
+├── 更新物流信息(已发货)
158
+├── 商品到货 / 送达登记(已发货)
159
+├── 关闭订单(符合条件的在途订单)
160
+└── 删除订单(已关闭 → 已删除)
161
+```
162
+
163
+---
164
+
165
+## 5. 全部订单列表
166
+
167
+### 5.1 列表字段(定稿 · 对齐草稿)
168
+
169
+| 字段 | 说明 |
170
+|------|------|
171
+| 订单信息 | **订单编号**;**商品主图**;**商品名称**;**商品规格**(首期单规格可展示规格文案或「默认」);**数量**;**单价**;**下单时间** |
172
+| 订单金额 | 合计金额;含运费时展示「含运费:xx」(原型) |
173
+| 会员名称 | 买家昵称/会员名 |
174
+| 收货人信息 | 收货人、手机号(可脱敏)、收货地址 |
175
+| 配送方式 | 物流配送 / 商家配送等 |
176
+| 订单状态 | 见 §3 |
177
+| 操作 | 按状态展示:查看详情、去发货、更新物流、到货登记、关闭、删除等 |
178
+
179
+- 一单多商品时:列表可 **折叠摘要** 或展示主商品 +「共 N 件」(UI 以前台为准)。
180
+
181
+### 5.2 状态页签
182
+
183
+与 §3.1 一致:**全部、待支付、待发货、已发货、已关闭、已完成、已删除**。
184
+
185
+- 各页签仅统计对应状态订单数(可选角标)。
186
+- 默认进入 **全部** 或 **待发货**(产品可配置)。
187
+
188
+### 5.3 高级检索(定稿 · 对齐草稿)
189
+
190
+| 条件 | 说明 |
191
+|------|------|
192
+| 订单编号 | 精确或模糊 |
193
+| 商品名称 | 模糊(匹配订单内任一行商品) |
194
+| 发货状态 | 下拉(与订单状态或履约子状态对应) |
195
+| 收货人姓名 | 模糊 |
196
+| 收货人手机号 | 模糊 |
197
+| 收货地址 | 模糊 |
198
+| 下单时间 | 起止日期 |
199
+| 配送方式 | 下拉 |
200
+
201
+**会员管理 §6.3 另需(平台订单列表建议一并支持):** 支付方式、支付状态、物流公司、交易单号、会员信息(名称/手机号)、店铺名称(多店场景)。
202
+
203
+### 5.4 列表行为
204
+
205
+- 默认 **下单时间降序**。
206
+- 默认 **不展示** `已删除`(在「已删除」页签查看)。
207
+- 手机号、姓名等 **脱敏** 展示,详情按权限展示完整信息。
208
+
209
+### 5.5 原型扩展(非草稿必选项)
210
+
211
+原型含:**待支付** 页签(已纳入 §3)、**标记**、**Excel 批量发货**、**批量打印**、订单来源(PC/小程序/代客下单)、店铺标签 —— 见 §14。
212
+
213
+---
214
+
215
+## 6. 查看详情
216
+
217
+### 6.1 范围
218
+
219
+**全部状态** 订单均可查看详情(草稿定稿),含 **已删除**(审计只读)。
220
+
221
+### 6.2 详情内容(建议分区)
222
+
223
+| 分区 | 内容 |
224
+|------|------|
225
+| 基本信息 | 订单编号、交易单号、下单时间、订单状态、店铺名称、会员名称、订单金额、配送方式、支付方式和支付状态 |
226
+| 商品明细 | 主图、名称、规格、单价、数量、小计 |
227
+| 收货信息 | 收货人、手机号、地址 |
228
+| 物流信息 | 物流公司/单号 或 车辆/配送员信息;**物流节点时间轴**(发货、运输更新、送达、确认收货) |
229
+| 操作记录 | 关闭原因、操作人、操作时间(建议) |
230
+
231
+### 6.3 与会员管理边界
232
+
233
+- 在 **会员管理 → 查看订单** 打开的详情,内容与本文 **一致**,但 **不展示** 发货/关闭/删除等写操作按钮(会员模块 M6)。
234
+
235
+---
236
+
237
+## 7. 去发货(待发货)
238
+
239
+### 7.1 前置条件
240
+
241
+- 订单状态 = **待发货**。
242
+- 支付已成功。
243
+
244
+### 7.2 发货表单(定稿 · 对齐草稿,整单发货)
245
+
246
+| 字段 | 必填 | 说明 |
247
+|------|:----:|------|
248
+| 发货时间 | 是 | 默认当前时间,可改 |
249
+| 配送方式 | 是 | **物流配送** / **商家配送** |
250
+| 物流配送 | 选物流时 | **物流公司** + **快递单号** |
251
+| 商家配送 | 选商家配送时 | **车辆号码**、**配送员**、**配送员手机号** |
252
+| 发货备注 | 否 | 文本 |
253
+| 发货商品 | 展示 | **展示本单全部商品行及数量**;本期 **须整单一次发完**,**不可** 只发部分数量、**不拆单** |
254
+
255
+| 规则 | 说明 |
256
+|------|------|
257
+| 整单发货 | 一次操作发齐订单内全部商品;订单状态 → **已发货** |
258
+| 库存 | 发货 **不重复** 扣库存(已在支付成功扣减,§12.2) |
259
+| 与草稿差异 | 草稿「分开发货自动拆单」**本期不做**,见 §17 |
260
+
261
+### 7.3 发货后
262
+
263
+- 订单状态 → **已发货**。
264
+- 写入物流节点:「已发货」+ 发货时间 + 物流信息摘要。
265
+
266
+---
267
+
268
+## 8. 更新物流信息(已发货)
269
+
270
+### 8.1 前置条件
271
+
272
+- 订单状态 = **已发货**。
273
+- 配送方式为 **物流配送** 时为主;商家配送也可记录运输状态描述。
274
+
275
+### 8.2 表单
276
+
277
+| 字段 | 必填 | 说明 |
278
+|------|:----:|------|
279
+| 运输更新时间 | 是 | 默认当前 |
280
+| 运输状态描述 | 是 | 文本,如「到达 XX 中转站」 |
281
+
282
+### 8.3 规则
283
+
284
+- **可多次** 更新(草稿:运输中订单可多次更新)。
285
+- 每次更新 **追加** 一条物流节点,不覆盖历史。
286
+- 更新物流 **不改变** 订单主状态(仍为已发货),直至买家确认收货。
287
+
288
+---
289
+
290
+## 9. 商品到货 / 送达与完成
291
+
292
+### 9.1 平台登记送达(已发货)
293
+
294
+| 字段 | 必填 | 说明 |
295
+|------|:----:|------|
296
+| 送达时间 | 是 | |
297
+| 送达说明 | 否 | 文本 |
298
+
299
+- 登记后写入物流节点「已送达/到货」。
300
+- **不自动** 变为已完成(草稿:买家确认收货后 → 已完成)。
301
+
302
+### 9.2 买家确认收货(C 端)
303
+
304
+```text
305
+订单:已发货(已登记送达可选)
306
+    ↓
307
+【C 端】买家点击「确认收货」
308
+    ↓
309
+订单状态 → 已完成
310
+    ↓
311
+计入会员累计消费(§11)
312
+```
313
+
314
+| 规则 | 说明 |
315
+|------|------|
316
+| 完成时点 | 以 **买家确认收货** 为准 |
317
+| 运营代确认 | 若业务需要「平台代确认」,单独立项并记操作日志 |
318
+
319
+---
320
+
321
+## 10. 关闭与删除
322
+
323
+### 10.1 关闭订单
324
+
325
+| 项 | 定稿 |
326
+|----|------|
327
+| 适用状态 | **待支付、待发货、已发货**(未至已完成) |
328
+| 不适用 | 已完成、已关闭、已删除 |
329
+| 支付后关闭 | 若已支付待发货/已发货关闭,须走 **退款/售后流程**(本期仅记关闭原因,退款对接另册) |
330
+| 库存 | 待发货关闭且已支付:须 **回滚库存**(与支付扣减对称) |
331
+| 待支付关闭 | **自动超时** 或运营关闭:未扣库存,**无需** 回滚 |
332
+
333
+### 10.2 删除订单
334
+
335
+| 项 | 定稿 |
336
+|----|------|
337
+| 前置状态 | **仅已关闭** |
338
+| 结果状态 | **已删除** |
339
+| 列表 | 默认不可见;在「已删除」页签可查 |
340
+| 数据 | **逻辑删除**;不物理清除,供审计 |
341
+
342
+```text
343
+点击删除(已关闭订单)
344
+    → 二次确认
345
+    → 状态变为已删除
346
+```
347
+
348
+### 10.3 未完成订单(删店/删商户 · 定稿)
349
+
350
+供 **店铺管理**、**商户管理** 调用的统一口径:
351
+
352
+| 属于「未完成」 | 不属于「未完成」 |
353
+|----------------|----------------|
354
+| 待支付、待发货、已发货 | 已完成、已关闭、已删除 |
355
+
356
+> 删店/删商户前须 **无未完成订单**;与店铺 §11.2、关联分析 §7.2 一致。
357
+
358
+---
359
+
360
+## 11. 会员累计消费统计(与会员管理对齐)
361
+
362
+| 项 | 定稿 |
363
+|----|------|
364
+| 累计消费次数 | 状态 = **已完成** 的订单 **笔数**(一单计 1 笔) |
365
+| 累计消费金额 | 上述订单 **实付金额** 合计 |
366
+| 更新时机 | 订单变为 **已完成** 时计入;**已关闭/已删除** 不计入 |
367
+| 会员列表展示 | 与会员管理 §6.5 一致;**以本模块统计服务为准** |
368
+
369
+---
370
+
371
+## 12. 下单与库存(C 端 · 协作规则)
372
+
373
+### 12.1 下单前置(商品/店铺)
374
+
375
+须满足《商品管理》第 11 节:**出售中、店铺开业、分类显示、库存>0**;会员 **已注册且启用**。
376
+
377
+### 12.2 库存扣减
378
+
379
+```text
380
+待支付 ──支付成功──► 待发货
381
+    同时:扣减商品库存(商品模块)
382
+    失败:支付不成功,订单保持待支付或关闭
383
+```
384
+
385
+| 规则 | 说明 |
386
+|------|------|
387
+| 超卖防护 | 下单/支付时校验库存;与商品技术方案一致 |
388
+| 关闭回滚 | 已支付订单 **关闭** 时 **回滚** 对应数量(§10.1) |
389
+
390
+---
391
+
392
+## 13. 业务规则汇总
393
+
394
+| 编号 | 规则 |
395
+|------|------|
396
+| **O1** | 订单归属 **店铺**;展示 **会员** 信息;全平台列表可查 |
397
+| **O2** | 订单编号 **全平台唯一** |
398
+| **O3** | 状态:**待支付、待发货、已发货、已完成、已关闭、已删除** |
399
+| **O4** | 支付成功:待支付→待发货,**扣库存** |
400
+| **O5** | **待发货** 须 **整单一次发货** → **已发货**;**不支持** 部分发货与拆单 |
401
+| **O6** | **已发货** 可多次更新物流 |
402
+| **O7** | **买家确认收货**→**已完成**;平台送达登记 **不替代** 完成 |
403
+| **O8** | **待支付** 超过 **支付超时时间** 未支付成功 → **系统自动关闭**(已关闭,未支付超时) |
404
+| **O9** | **仅已关闭** 可删除为 **已删除** |
405
+| **O10** | **未完成订单** = 待支付+待发货+已发货 |
406
+| **O11** | 累计消费仅统计 **已完成** 订单 |
407
+| **O12** | 会员管理内订单 **只读**,写操作仅本模块 |
408
+| **O13** | 商户/店铺/商品状态变更 **不自动** 改已有订单状态(停业仅禁 **新** 下单) |
409
+| **O14** | 详情含 **物流节点时间轴** |
410
+| **O15** | 物流配送与商家配送 **字段不同**(§7.2) |
411
+| **O16** | 列表高级检索 **不少于** 草稿 §3 所列字段 |
412
+
413
+---
414
+
415
+## 14. 页面与交互要点
416
+
417
+| 场景 | 要求 |
418
+|------|------|
419
+| 待发货 | 突出「去发货」 |
420
+| 发货 | 配送方式切换时 **显隐** 物流/配送员字段;展示 **整单商品** |
421
+| 待支付 | C 端展示剩余支付时间(可选);超时后展示已关闭 |
422
+| 关闭/删除 | 二次确认;运营手工关闭建议填原因 |
423
+| 物流时间轴 | 时间倒序展示 |
424
+| 脱敏 | 列表手机号脱敏 |
425
+
426
+---
427
+
428
+## 15. 与关联模块协作流程
429
+
430
+```text
431
+【C 端】选店 → 加购 → 下单 → 支付
432
+    ↓
433
+【平台】订单管理:待发货 → 发货 → 已发货 → 买家确认收货 → 已完成
434
+    ↓
435
+【平台】会员管理:累计消费更新;会员订单只读查询
436
+    ↓
437
+【删店】须无 O10 未完成订单 + 无阻塞商品
438
+```
439
+
440
+---
441
+
442
+## 16. 草稿对照与修订说明
443
+
444
+| 草稿条目 | 本文档处理 |
445
+|----------|------------|
446
+| 列表字段、状态页签、检索 | §5 |
447
+| 查看详情、物流节点 | §6 |
448
+| 去发货、配送字段 | §7(整单发货;草稿拆单 **不做**) |
449
+| 待支付自动关闭 | §3.4、O8 |
450
+| 更新物流 | §8 |
451
+| 商品到货 + 买家确认收货→已完成 | §9 |
452
+| 已关闭删除→已删除 | §10 |
453
+| 异常返回、技术栈 | **不纳入** |
454
+| 补充待支付 | §3(C 端与原型) |
455
+| 已取消/无效 | 并入 **已关闭** §3.3 |
456
+| 会员/删店/库存/统计 | §10~§12、O10/O11 |
457
+| 原型批量/标记/代客下单 | §14 非本期 |
458
+
459
+---
460
+
461
+## 17. 非本期范围
462
+
463
+| 项 | 说明 |
464
+|----|------|
465
+| **分批发货 / 自动拆单** | 草稿有描述;**本期不做** |
466
+| 商家端订单列表与发货 | 平台代运营;或二期 |
467
+| Excel 批量发货、批量打印小票/配送单 | 原型有 |
468
+| 订单标记/标签 | 原型有 |
469
+| 代客下单 | 原型有 |
470
+| 支付渠道对接、退款原路退回 | 另册 |
471
+| 售后/退货换货 | 另册 |
472
+| 多 SKU 规格矩阵 | 商品 P16 非本期 |
473
+| 发票 | 另册 |
474
+
475
+---
476
+
477
+*文档版本:v1.0.1(定稿)· 关联《订单管理技术方案.md》v1.0、《订单管理测试用例.md》v1.0、《会员管理功能需求.md》v1.0、《商品管理功能需求.md》v1.3.3、《店铺管理功能需求.md》v1.3.2、《商户管理功能需求.md》v1.3.1、《关联需求分析.md》v1.2 · 草稿《订单管理功能需求-草稿.md》保持不变。*

+ 510 - 0
doc/农资商城web/订单管理/订单管理技术方案.md

@@ -0,0 +1,510 @@
1
+# 订单管理 — 技术方案
2
+
3
+> **依据:** 《订单管理功能需求.md》v1.0.1  
4
+> **关联:** 《会员管理技术方案.md》v1.0、《商品管理技术方案.md》v1.2、《店铺管理技术方案.md》v1.2.1、《关联需求分析.md》v1.2  
5
+> **范围:** 本文以 **订单库表、平台履约接口、定时关单、跨模块 Facade** 为主;C 端下单/支付/确认收货给出 **共用表与接口占位**;支付渠道、退款、拆单 **非本期**。  
6
+> **原则:** 整单发货;支付成功扣库存;**O10** 未完成订单;**O11** 完成后刷新会员消费。
7
+
8
+---
9
+
10
+## 1. 技术架构
11
+
12
+| 项 | 选型 |
13
+|----|------|
14
+| 基础框架 | RuoYi **v3.9.2**(`springboot2` 分支) |
15
+| 数据库 | **MySQL 5.7.39** |
16
+| ORM / 权限 / 响应 | MyBatis;`@PreAuthorize`;`AjaxResult` / `TableDataInfo` |
17
+| 订单号 | Redis 或 DB 序列:`O` + `yyyyMMdd` + 6 位序号(应用保证唯一) |
18
+| 定时任务 | RuoYi `Quartz`:`OrderPayTimeoutJob`(O8) |
19
+| 配置 | `sys_config`:`order.pay.timeout.minutes`,默认 **1440** |
20
+| 日志 | 发货/关闭/删除 `@Log` |
21
+
22
+### 1.1 模块落位
23
+
24
+```text
25
+baqing-shop
26
+├── com.ruoyi.web.controller.agri.OrderController       # 平台
27
+└── com.ruoyi.web.controller.api.OrderAppController    # C 端占位
28
+ruoyi-agri
29
+├── domain.BizOrder / BizOrderItem / BizOrderLogisticsTrace
30
+├── service.IOrderService
31
+├── job.OrderPayTimeoutJob
32
+└── facade.OrderFacadeImpl → IOrderFacade
33
+```
34
+
35
+### 1.2 业务链
36
+
37
+```text
38
+C 端下单 → biz_order(待支付) + biz_order_item(快照)
39
+    ↓ 支付成功
40
+待发货 + IGoodsFacade.deductStock(按行)
41
+    ↓ 平台发货
42
+已发货 + biz_order_logistics_trace
43
+    ↓ C 端确认收货
44
+已完成 + IMemberFacade.refreshConsumption(memberId)
45
+```
46
+
47
+| 模块 | 关系 |
48
+|------|------|
49
+| **会员** | `member_id`;`IMemberFacade.isMemberEnabled`;完成后 `refreshConsumption` |
50
+| **店铺** | `shop_id`;`IShopFacade.isShopOpenForOrder`(C 端下单) |
51
+| **商品** | `IGoodsFacade.canPurchase` / `deductStock` / `restoreStock`(关闭回滚) |
52
+| **商户/店铺删除** | `IOrderFacade.hasUnfinishedOrdersByShop/Merchant`(O10) |
53
+
54
+### 1.3 跨模块 Facade
55
+
56
+| 接口 | 提供方 | 调用方 | 方法 |
57
+|------|--------|--------|------|
58
+| **`IOrderFacade`** | **本模块** | 店铺、商户 | `hasUnfinishedOrdersByShop(Long shopId)` — status∈{0,1,2} |
59
+| | | | `hasUnfinishedOrdersByMerchant(Long merchantId)` — 其下任一店存在未完成 |
60
+| | | | `pageOrdersByMember(Long memberId, OrderMemberQuery q)` → `TableDataInfo` |
61
+| | | | `getOrderDetail(Long orderId, Long memberId)` — `memberId=null` 平台;非 null 校验归属 |
62
+| **`IMemberFacade`** | 会员 | **本模块** | `isMemberEnabled`、`getMember`(下单) |
63
+| | | | `refreshConsumption(Long memberId)` — **已完成** 后重算 O11 |
64
+| **`IGoodsFacade`** | 商品 | **本模块** | `canPurchase(goodsId, qty)`;`deductStock`;`restoreStock`(已支付关闭) |
65
+| **`IShopFacade`** | 店铺 | **本模块** | `isShopOpenForOrder(shopId)` |
66
+
67
+**未完成订单 SQL(O10):**
68
+
69
+```sql
70
+SELECT 1 FROM biz_order
71
+WHERE shop_id = #{shopId} AND order_status IN ('0','1','2') AND del_flag = '0'
72
+LIMIT 1
73
+```
74
+
75
+### 1.4 状态联动
76
+
77
+| 事件 | 订单 | 库存 | 会员消费 |
78
+|------|------|------|----------|
79
+| 支付成功 | 0→1 | 扣减 | — |
80
+| 待发货关闭 | →4 | 回滚 | — |
81
+| 超时未付 | 0→4 | 无 | — |
82
+| 确认收货 | 2→3 | — | refreshConsumption |
83
+| 已关闭删除 | 4→5 | — | — |
84
+
85
+---
86
+
87
+## 2. 数据库设计
88
+
89
+### 2.1 本模块表
90
+
91
+| 表名 | 说明 |
92
+|------|------|
93
+| `biz_order` | 订单主表 |
94
+| `biz_order_item` | 商品明细(快照) |
95
+| `biz_order_logistics_trace` | 物流节点时间轴 |
96
+
97
+### 2.2 订单状态与字典
98
+
99
+**`order_status`(char(1))**
100
+
101
+| 值 | 含义 | 页签 |
102
+|----|------|------|
103
+| 0 | 待支付 | 待支付 |
104
+| 1 | 待发货 | 待发货 |
105
+| 2 | 已发货 | 已发货 |
106
+| 3 | 已完成 | 已完成 |
107
+| 4 | 已关闭 | 已关闭 |
108
+| 5 | 已删除 | 已删除 |
109
+
110
+**`close_type`(关闭时必填,order_status=4)**
111
+
112
+| 值 | 含义 |
113
+|----|------|
114
+| 1 | 未支付超时(O8) |
115
+| 2 | 买家取消 |
116
+| 3 | 运营关闭 |
117
+| 4 | 支付失败/退款(另册) |
118
+
119
+**`delivery_type`(发货时写入)**
120
+
121
+| 值 | 含义 |
122
+|----|------|
123
+| 1 | 物流配送 |
124
+| 2 | 商家配送 |
125
+
126
+**`biz_order_logistics_trace.trace_type`**
127
+
128
+| 值 | 含义 |
129
+|----|------|
130
+| 1 | 已发货 |
131
+| 2 | 运输更新 |
132
+| 3 | 已送达 |
133
+| 4 | 确认收货 |
134
+
135
+**检索 `shipStatus`(Query):** 与 `order_status` 映射 — `0/1/2` 直接等值;「运输中」= `order_status=2`。
136
+
137
+### 2.3 `biz_order`
138
+
139
+| 字段 | 类型 | 说明 |
140
+|------|------|------|
141
+| order_id | bigint PK | |
142
+| order_no | varchar(32) | 唯一 |
143
+| member_id | bigint | 买家 |
144
+| shop_id | bigint | 店铺 |
145
+| merchant_id | bigint | 冗余,便于商户维度统计 |
146
+| order_status | char(1) | §2.2 |
147
+| close_type | char(1) | 关闭类型 |
148
+| close_reason | varchar(500) | 关闭说明 |
149
+| pay_type | char(1) | 支付方式字典 |
150
+| pay_status | char(1) | 0未付 1已付 |
151
+| trade_no | varchar(64) | 交易单号 |
152
+| goods_amount | decimal(12,2) | 商品合计 |
153
+| freight_amount | decimal(12,2) | 运费,默认 0 |
154
+| pay_amount | decimal(12,2) | 实付 = goods + freight(O11 统计字段) |
155
+| consignee_name | varchar(64) | 收货快照 |
156
+| consignee_mobile | varchar(20) | |
157
+| consignee_address | varchar(512) | 完整地址文本 |
158
+| delivery_type | char(1) | 发货后填写 |
159
+| logistics_company | varchar(64) | 物流 |
160
+| tracking_no | varchar(64) | 快递单号 |
161
+| vehicle_no | varchar(32) | 商家配送 |
162
+| courier_name | varchar(64) | 配送员 |
163
+| courier_mobile | varchar(20) | |
164
+| ship_remark | varchar(500) | 发货备注 |
165
+| member_nick_name | varchar(64) | 下单时会员昵称快照 |
166
+| shop_name | varchar(128) | 店铺名快照 |
167
+| create_time | datetime | 下单时间 |
168
+| pay_time | datetime | 支付时间 |
169
+| ship_time | datetime | 发货时间 |
170
+| pay_expire_time | datetime | 支付截止时间 |
171
+| finish_time | datetime | 确认收货时间 |
172
+| del_flag | char(1) | 0 存在;**已删除** 用 status=5,del_flag 仍 0(审计) |
173
+| update_by/time, remark | | |
174
+
175
+> 列表默认:`order_status != '5'`;「已删除」页签 `order_status='5'`。
176
+
177
+### 2.4 `biz_order_item`
178
+
179
+| 字段 | 类型 | 说明 |
180
+|------|------|------|
181
+| item_id | bigint PK | |
182
+| order_id | bigint | |
183
+| goods_id | bigint | 原商品 ID |
184
+| goods_name | varchar(128) | 快照 |
185
+| goods_spec | varchar(64) | 单规格文案 |
186
+| goods_image | varchar(512) | 主图 URL |
187
+| unit_price | decimal(12,2) | |
188
+| quantity | int | |
189
+| line_amount | decimal(12,2) | unit_price * quantity |
190
+| sort_no | int | |
191
+
192
+### 2.5 `biz_order_logistics_trace`
193
+
194
+| 字段 | 类型 | 说明 |
195
+|------|------|------|
196
+| trace_id | bigint PK | |
197
+| order_id | bigint | |
198
+| trace_type | char(1) | §2.2 |
199
+| trace_time | datetime | |
200
+| content | varchar(1000) | 描述/摘要 |
201
+| create_by | varchar(64) | 操作人 |
202
+
203
+### 2.6 索引
204
+
205
+| 表 | 索引 |
206
+|----|------|
207
+| biz_order | uk_order_no;idx_member;idx_shop_status;idx_create_time;idx_pay_expire(status, pay_expire_time) |
208
+| biz_order_item | idx_order_id |
209
+| biz_order_logistics_trace | idx_order_id_time |
210
+
211
+### 2.7 DDL
212
+
213
+```sql
214
+CREATE TABLE `biz_order` (
215
+  `order_id` bigint(20) NOT NULL AUTO_INCREMENT,
216
+  `order_no` varchar(32) NOT NULL COMMENT '订单编号',
217
+  `member_id` bigint(20) NOT NULL,
218
+  `shop_id` bigint(20) NOT NULL,
219
+  `merchant_id` bigint(20) NOT NULL,
220
+  `order_status` char(1) NOT NULL DEFAULT '0' COMMENT '0待支付1待发货2已发货3已完成4已关闭5已删除',
221
+  `close_type` char(1) DEFAULT NULL,
222
+  `close_reason` varchar(500) DEFAULT NULL,
223
+  `pay_type` char(1) DEFAULT NULL,
224
+  `pay_status` char(1) NOT NULL DEFAULT '0' COMMENT '0未付1已付',
225
+  `trade_no` varchar(64) DEFAULT NULL,
226
+  `goods_amount` decimal(12,2) NOT NULL DEFAULT '0.00',
227
+  `freight_amount` decimal(12,2) NOT NULL DEFAULT '0.00',
228
+  `pay_amount` decimal(12,2) NOT NULL DEFAULT '0.00',
229
+  `consignee_name` varchar(64) NOT NULL,
230
+  `consignee_mobile` varchar(20) NOT NULL,
231
+  `consignee_address` varchar(512) NOT NULL,
232
+  `delivery_type` char(1) DEFAULT NULL,
233
+  `logistics_company` varchar(64) DEFAULT NULL,
234
+  `tracking_no` varchar(64) DEFAULT NULL,
235
+  `vehicle_no` varchar(32) DEFAULT NULL,
236
+  `courier_name` varchar(64) DEFAULT NULL,
237
+  `courier_mobile` varchar(20) DEFAULT NULL,
238
+  `ship_remark` varchar(500) DEFAULT NULL,
239
+  `member_nick_name` varchar(64) DEFAULT NULL,
240
+  `shop_name` varchar(128) DEFAULT NULL,
241
+  `create_time` datetime NOT NULL,
242
+  `pay_time` datetime DEFAULT NULL,
243
+  `ship_time` datetime DEFAULT NULL,
244
+  `pay_expire_time` datetime NOT NULL,
245
+  `finish_time` datetime DEFAULT NULL,
246
+  `del_flag` char(1) NOT NULL DEFAULT '0',
247
+  `create_by` varchar(64) DEFAULT '',
248
+  `update_by` varchar(64) DEFAULT '',
249
+  `update_time` datetime DEFAULT NULL,
250
+  `remark` varchar(500) DEFAULT NULL,
251
+  PRIMARY KEY (`order_id`),
252
+  UNIQUE KEY `uk_order_no` (`order_no`),
253
+  KEY `idx_member` (`member_id`,`create_time`),
254
+  KEY `idx_shop_status` (`shop_id`,`order_status`),
255
+  KEY `idx_create_time` (`create_time`),
256
+  KEY `idx_pay_expire` (`order_status`,`pay_expire_time`)
257
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单';
258
+
259
+CREATE TABLE `biz_order_item` (
260
+  `item_id` bigint(20) NOT NULL AUTO_INCREMENT,
261
+  `order_id` bigint(20) NOT NULL,
262
+  `goods_id` bigint(20) NOT NULL,
263
+  `goods_name` varchar(128) NOT NULL,
264
+  `goods_spec` varchar(64) DEFAULT '默认',
265
+  `goods_image` varchar(512) DEFAULT NULL,
266
+  `unit_price` decimal(12,2) NOT NULL,
267
+  `quantity` int(11) NOT NULL,
268
+  `line_amount` decimal(12,2) NOT NULL,
269
+  `sort_no` int(11) NOT NULL DEFAULT '0',
270
+  PRIMARY KEY (`item_id`),
271
+  KEY `idx_order_id` (`order_id`)
272
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细';
273
+
274
+CREATE TABLE `biz_order_logistics_trace` (
275
+  `trace_id` bigint(20) NOT NULL AUTO_INCREMENT,
276
+  `order_id` bigint(20) NOT NULL,
277
+  `trace_type` char(1) NOT NULL,
278
+  `trace_time` datetime NOT NULL,
279
+  `content` varchar(1000) NOT NULL DEFAULT '',
280
+  `create_by` varchar(64) DEFAULT '',
281
+  `create_time` datetime DEFAULT NULL,
282
+  PRIMARY KEY (`trace_id`),
283
+  KEY `idx_order_id_time` (`order_id`,`trace_time`)
284
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物流节点';
285
+```
286
+
287
+### 2.8 字典
288
+
289
+| dict_type | 用途 |
290
+|-----------|------|
291
+| biz_order_status | order_status |
292
+| biz_order_close_type | close_type |
293
+| biz_delivery_type | delivery_type |
294
+| biz_order_pay_type | pay_type |
295
+| biz_order_pay_status | pay_status |
296
+| biz_logistics_trace_type | trace_type |
297
+
298
+---
299
+
300
+## 3. 平台端接口设计
301
+
302
+**基路径:** `/agri/order`  
303
+**权限:** `agri:order:list|query|ship|edit|remove`
304
+
305
+### 3.1 接口一览
306
+
307
+| 方法 | 路径 | 权限 | 说明 |
308
+|------|------|------|------|
309
+| GET | `/list` | list | 分页列表(含页签) |
310
+| GET | `/{orderId}` | query | 详情(明细+物流轴) |
311
+| POST | `/{orderId}/ship` | ship | 整单发货 → 已发货 |
312
+| POST | `/{orderId}/logistics` | ship | 更新物流(已发货) |
313
+| POST | `/{orderId}/delivered` | ship | 登记送达 |
314
+| PUT | `/{orderId}/close` | edit | 关闭(0/1/2) |
315
+| DELETE | `/{orderId}` | remove | 已关闭 → 已删除 |
316
+
317
+### 3.2 列表 `GET /list`
318
+
319
+| Query | 说明 |
320
+|-------|------|
321
+| pageNum, pageSize | |
322
+| orderStatus | 页签:空=全部(排除5);0~5 |
323
+| orderNo | 订单编号 |
324
+| goodsName | 关联 item 模糊 |
325
+| shipStatus | 同 orderStatus 履约态(0/1/2) |
326
+| consigneeName, consigneeMobile, consigneeAddress | |
327
+| deliveryType | 1/2(已发货后有值) |
328
+| payType, payStatus | |
329
+| tradeNo | |
330
+| memberKeyword | 会员昵称/手机号 |
331
+| shopName | 店铺名模糊 |
332
+| logisticsCompany | |
333
+| beginTime, endTime | create_time |
334
+
335
+**排序:** `create_time DESC`。  
336
+**默认过滤:** 未传 `orderStatus` 时 `order_status != '5'`。
337
+
338
+**rows(摘要):**
339
+
340
+| 字段 | 说明 |
341
+|------|------|
342
+| orderId, orderNo, createTime | |
343
+| orderStatus, orderStatusLabel | |
344
+| payAmount, freightAmount | |
345
+| memberNickName, consigneeName, consigneeMobile | 手机脱敏 |
346
+| consigneeAddress, deliveryTypeLabel | |
347
+| shopName | |
348
+| items | 数组:goodsImage, goodsName, goodsSpec, quantity, unitPrice(首行+itemCount) |
349
+
350
+### 3.3 详情 `GET /{orderId}`
351
+
352
+含 §需求 6.2 各分区:`base`、`items`、`consignee`、`logistics`(当前单号/配送员)、`traceList`(时间倒序)、`closeInfo`。
353
+
354
+### 3.4 发货 `POST /{orderId}/ship`
355
+
356
+**前置:** `order_status=1`。
357
+
358
+```json
359
+{
360
+  "shipTime": "2026-05-28 14:00:00",
361
+  "deliveryType": "1",
362
+  "logisticsCompany": "顺丰",
363
+  "trackingNo": "SF123456",
364
+  "vehicleNo": null,
365
+  "courierName": null,
366
+  "courierMobile": null,
367
+  "shipRemark": ""
368
+}
369
+```
370
+
371
+| deliveryType | 必填 |
372
+|--------------|------|
373
+| 1 | logisticsCompany + trackingNo |
374
+| 2 | vehicleNo + courierName + courierMobile |
375
+
376
+**事务:** `order_status=2`;写 ship 字段;插入 trace_type=1;**不** 再扣库存。
377
+
378
+### 3.5 更新物流 `POST /{orderId}/logistics`
379
+
380
+```json
381
+{ "traceTime": "2026-05-28 18:00:00", "content": "到达拉萨中转站" }
382
+```
383
+
384
+**前置:** `order_status=2`;追加 trace_type=2。
385
+
386
+### 3.6 登记送达 `POST /{orderId}/delivered`
387
+
388
+```json
389
+{ "traceTime": "2026-05-29 10:00:00", "content": "已送达小区门口" }
390
+```
391
+
392
+追加 trace_type=3;**不** 改 order_status(仍为 2,O7)。
393
+
394
+### 3.7 关闭 `PUT /{orderId}/close`
395
+
396
+```json
397
+{ "closeType": "3", "closeReason": "运营协商关闭" }
398
+```
399
+
400
+| 前置 status | 副作用 |
401
+|-------------|--------|
402
+| 0 | 无库存操作 |
403
+| 1 | `IGoodsFacade.restoreStock` 按 item 行 |
404
+| 2 | 同上(若已发货关闭,本期仅记原因,退款另册) |
405
+
406
+→ `order_status=4`,写 close_type/reason。
407
+
408
+### 3.8 删除 `DELETE /{orderId}`
409
+
410
+**前置:** `order_status=4` → `order_status=5`。
411
+
412
+### 3.9 业务错误 msg(示例)
413
+
414
+| 场景 | msg |
415
+|------|-----|
416
+| 状态不允许发货 | 当前状态不可发货 |
417
+| 非已关闭删单 | 仅已关闭订单可删除 |
418
+| 库存回滚失败 | 库存回滚失败,请稍后重试 |
419
+
420
+---
421
+
422
+## 4. C 端接口(占位)
423
+
424
+**基路径:** `/api/order`(会员 Token)
425
+
426
+| 方法 | 路径 | 说明 |
427
+|------|------|------|
428
+| POST | `/create` | 校验 canPurchase + isMemberEnabled + isShopOpen;写 order/item;status=0;`pay_expire_time=now+timeout` |
429
+| POST | `/{orderId}/pay` | 模拟/渠道回调:status→1,pay_status=1,deductStock,pay_time |
430
+| POST | `/{orderId}/confirmReceive` | status→2 时:→3,trace_type=4,refreshConsumption |
431
+| GET | `/list` | 当前会员订单 |
432
+| GET | `/{orderId}` | 详情(校验 member_id) |
433
+
434
+| 规则 | 说明 |
435
+|------|------|
436
+| 待支付关闭后 | 支付接口拒绝,msg 订单已关闭 |
437
+| 拆单 | **不支持** |
438
+
439
+---
440
+
441
+## 5. 定时任务(O8)
442
+
443
+```text
444
+OrderPayTimeoutJob(如每 5 分钟)
445
+  SELECT order_id FROM biz_order
446
+   WHERE order_status='0' AND pay_expire_time < NOW() AND del_flag='0'
447
+  FOR EACH → close_type=1, order_status=4(批量 UPDATE)
448
+```
449
+
450
+`pay_expire_time` 在 **创建订单** 时:`create_time + ConfigService.getInt("order.pay.timeout.minutes", 1440)` 分钟。
451
+
452
+---
453
+
454
+## 6. 会员模块协作(O11)
455
+
456
+```text
457
+confirmReceive / 平台不代确认
458
+  @Transactional
459
+  → UPDATE biz_order SET order_status='3', finish_time=NOW()
460
+  → INSERT trace_type=4
461
+  → IMemberFacade.refreshConsumption(memberId)
462
+```
463
+
464
+`refreshConsumption` 实现见《会员管理技术方案》§5.2(按 member_id 重算已完成 SUM)。
465
+
466
+**`pageOrdersByMember` / `getOrderDetail`:** 与 §3.2、§3.3 共用 Service;`memberId` 强制 `WHERE member_id=?`。
467
+
468
+---
469
+
470
+## 7. 菜单与权限
471
+
472
+| 权限 | 说明 |
473
+|------|------|
474
+| agri:order:list | 列表 |
475
+| agri:order:query | 详情 |
476
+| agri:order:ship | 发货/物流/送达 |
477
+| agri:order:edit | 关闭 |
478
+| agri:order:remove | 删除 |
479
+
480
+---
481
+
482
+## 8. 非本期
483
+
484
+| 项 | 说明 |
485
+|----|------|
486
+| 分批发货/拆单 | 需求 §17 |
487
+| 支付渠道、退款 | 另册;`pay` 可先 Mock |
488
+| 商家端订单后台 | 平台代履约 |
489
+| Excel 批量发货/打印 | 需求 §17 |
490
+
491
+---
492
+
493
+## 9. 需求规则映射
494
+
495
+| 规则 | 实现 |
496
+|------|------|
497
+| O1~O3 | biz_order + 字典 |
498
+| O4 | pay 成功 deductStock |
499
+| O5 | ship 整单一次 → status=2 |
500
+| O6~O7 | logistics trace;完成仅 C 端 confirm |
501
+| O8 | Job + pay_expire_time |
502
+| O9 | DELETE status 4→5 |
503
+| O10 | Facade IN (0,1,2) |
504
+| O11 | refreshConsumption |
505
+| O12 | 写接口仅 OrderController |
506
+| O15 | delivery_type 分支校验 |
507
+
508
+---
509
+
510
+*文档版本:v1.0 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · 关联《订单管理功能需求.md》v1.0.1、《订单管理测试用例.md》v1.0、《会员管理技术方案.md》v1.0、《关联需求分析.md》v1.2*

+ 538 - 0
doc/农资商城web/订单管理/订单管理测试用例.md

@@ -0,0 +1,538 @@
1
+# 订单管理 — 测试用例
2
+
3
+> **依据:** 《订单管理功能需求.md》v1.0.1、《订单管理技术方案.md》v1.0  
4
+> **关联:** 《会员管理技术方案.md》v1.0、《店铺管理测试用例.md》(删店 O10)、《商品管理测试用例.md》(库存)  
5
+> **范围:** 平台端 `/agri/order` 列表/详情/发货/物流/送达/关闭/删除;`IOrderFacade`(O10);定时关单 O8;C 端 `/api/order` 主路径(create/pay/confirmReceive)  
6
+> **排除:** 分批发货拆单、支付渠道对接、退款原路、Excel 批量发货、商家端订单后台、发票售后  
7
+> **环境:** RuoYi v3.9.2;平台 Token;`sys_config.order.pay.timeout.minutes` 可测环境设为 **2** 便于 O8
8
+
9
+---
10
+
11
+## 用例编号说明
12
+
13
+| 前缀 | 类型 | 工具 |
14
+|------|------|------|
15
+| ORD-UT-xxx | 单元测试 | JUnit 5 + Mockito |
16
+| ORD-API-xxx | 接口测试 | Apifox / REST Assured |
17
+| ORD-UI-xxx | 界面测试 | Playwright(Chromium) |
18
+| ORD-JOB-xxx | 定时任务 | 单元/集成触发 Job |
19
+
20
+---
21
+
22
+## 一、单元测试
23
+
24
+### ORD-UT-001 支付成功待支付→待发货并扣库存
25
+
26
+| 要素 | 内容 |
27
+|------|------|
28
+| **测试项** | paySuccess |
29
+| **测试目的** | 验证 O4 |
30
+| **前置条件** | 订单 status=0;Mock `IGoodsFacade.deductStock` 成功 |
31
+| **测试步骤** | `paySuccess(orderId)` |
32
+| **预期结果** | status=1;pay_status=1;pay_time 非空;每行 deductStock 调用一次 |
33
+
34
+### ORD-UT-002 支付失败不扣库存
35
+
36
+| 要素 | 内容 |
37
+|------|------|
38
+| **测试项** | paySuccess |
39
+| **测试目的** | 验证扣库存仅在成功路径 |
40
+| **前置条件** | deductStock 抛异常 |
41
+| **测试步骤** | `paySuccess` |
42
+| **预期结果** | 事务回滚;status 仍为 0 |
43
+
44
+### ORD-UT-003 整单发货待发货→已发货
45
+
46
+| 要素 | 内容 |
47
+|------|------|
48
+| **测试项** | ship |
49
+| **测试目的** | 验证 O5 |
50
+| **前置条件** | status=1 |
51
+| **测试步骤** | `ship(dto)` deliveryType=1 |
52
+| **预期结果** | status=2;写入 logistics 字段;插入 trace_type=1;**不** 调用 deductStock |
53
+
54
+### ORD-UT-004 非待发货不可发货
55
+
56
+| 要素 | 内容 |
57
+|------|------|
58
+| **测试项** | ship |
59
+| **测试目的** | 状态机 |
60
+| **前置条件** | status=0/2/3/4 |
61
+| **测试步骤** | `ship` |
62
+| **预期结果** | 失败;msg「当前状态不可发货」 |
63
+
64
+### ORD-UT-005 物流配送必填公司与单号
65
+
66
+| 要素 | 内容 |
67
+|------|------|
68
+| **测试项** | ship 校验 |
69
+| **测试目的** | 验证 O15 |
70
+| **前置条件** | status=1 |
71
+| **测试步骤** | deliveryType=1,trackingNo 空 |
72
+| **预期结果** | 失败 |
73
+
74
+### ORD-UT-006 商家配送必填车辆与配送员
75
+
76
+| 要素 | 内容 |
77
+|------|------|
78
+| **测试项** | ship 校验 |
79
+| **测试目的** | 验证 O15 |
80
+| **前置条件** | status=1 |
81
+| **测试步骤** | deliveryType=2,courierName 空 |
82
+| **预期结果** | 失败 |
83
+
84
+### ORD-UT-007 更新物流追加节点不改变主状态
85
+
86
+| 要素 | 内容 |
87
+|------|------|
88
+| **测试项** | addLogisticsTrace |
89
+| **测试目的** | 验证 O6 |
90
+| **前置条件** | status=2 |
91
+| **测试步骤** | 连续两次 `addLogisticsTrace` |
92
+| **预期结果** | status 仍为 2;trace 表 2 条 type=2 |
93
+
94
+### ORD-UT-008 登记送达不改为已完成
95
+
96
+| 要素 | 内容 |
97
+|------|------|
98
+| **测试项** | markDelivered |
99
+| **测试目的** | 验证 O7 |
100
+| **前置条件** | status=2 |
101
+| **测试步骤** | `markDelivered` |
102
+| **预期结果** | status=2;trace_type=3 一条 |
103
+
104
+### ORD-UT-009 确认收货→已完成并刷新会员消费
105
+
106
+| 要素 | 内容 |
107
+|------|------|
108
+| **测试项** | confirmReceive |
109
+| **测试目的** | 验证 O7、O11 |
110
+| **前置条件** | status=2;Mock `IMemberFacade` |
111
+| **测试步骤** | `confirmReceive(orderId, memberId)` |
112
+| **预期结果** | status=3;finish_time 非空;trace_type=4;调用 `refreshConsumption(memberId)` 一次 |
113
+
114
+### ORD-UT-010 待发货关闭回滚库存
115
+
116
+| 要素 | 内容 |
117
+|------|------|
118
+| **测试项** | closeOrder |
119
+| **测试目的** | 验证 §10.1 库存回滚 |
120
+| **前置条件** | status=1,已支付 |
121
+| **测试步骤** | `closeOrder(closeType=3)` |
122
+| **预期结果** | status=4;每 item 调用 `restoreStock` |
123
+
124
+### ORD-UT-011 待支付关闭不回滚库存
125
+
126
+| 要素 | 内容 |
127
+|------|------|
128
+| **测试项** | closeOrder |
129
+| **测试目的** | 验证待支付无扣减 |
130
+| **前置条件** | status=0 |
131
+| **测试步骤** | `closeOrder` |
132
+| **预期结果** | status=4;**不** 调用 restoreStock |
133
+
134
+### ORD-UT-012 仅已关闭可删除为已删除
135
+
136
+| 要素 | 内容 |
137
+|------|------|
138
+| **测试项** | deleteOrder |
139
+| **测试目的** | 验证 O9 |
140
+| **前置条件** | status=4 / status=1 |
141
+| **测试步骤** | 分别 `deleteOrder` |
142
+| **预期结果** | 前者 status=5;后者失败 |
143
+
144
+### ORD-UT-013 hasUnfinishedOrdersByShop O10
145
+
146
+| 要素 | 内容 |
147
+|------|------|
148
+| **测试项** | IOrderFacade |
149
+| **测试目的** | 验证 O10 |
150
+| **前置条件** | 店 A 存在 status=2 订单;店 B 仅 status=4 |
151
+| **测试步骤** | `hasUnfinishedOrdersByShop` |
152
+| **预期结果** | 店 A true;店 B false |
153
+
154
+### ORD-UT-014 已关闭/已完成不算未完成
155
+
156
+| 要素 | 内容 |
157
+|------|------|
158
+| **测试项** | IOrderFacade |
159
+| **测试目的** | 验证 O10 边界 |
160
+| **前置条件** | 仅 status=3、4、5 |
161
+| **测试步骤** | `hasUnfinishedOrdersByShop` |
162
+| **预期结果** | false |
163
+
164
+### ORD-UT-015 超时关单 Job
165
+
166
+| 要素 | 内容 |
167
+|------|------|
168
+| **测试项** | OrderPayTimeoutJob |
169
+| **测试目的** | 验证 O8 |
170
+| **前置条件** | status=0 且 pay_expire_time&lt;now |
171
+| **测试步骤** | 执行 Job |
172
+| **预期结果** | status=4;close_type=1 |
173
+
174
+### ORD-UT-016 未超时订单 Job 不关闭
175
+
176
+| 要素 | 内容 |
177
+|------|------|
178
+| **测试项** | OrderPayTimeoutJob |
179
+| **测试目的** | 验证 O8 边界 |
180
+| **前置条件** | pay_expire_time&gt;now |
181
+| **测试步骤** | 执行 Job |
182
+| **预期结果** | status 仍为 0 |
183
+
184
+### ORD-UT-017 pageOrdersByMember 强制 memberId
185
+
186
+| 要素 | 内容 |
187
+|------|------|
188
+| **测试项** | pageOrdersByMember |
189
+| **测试目的** | 验证 M9 |
190
+| **前置条件** | 会员 1、2 各有订单 |
191
+| **测试步骤** | `pageOrdersByMember(1, q)` |
192
+| **预期结果** | 仅返回 member_id=1 |
193
+
194
+### ORD-UT-018 getOrderDetail 归属校验
195
+
196
+| 要素 | 内容 |
197
+|------|------|
198
+| **测试项** | getOrderDetail |
199
+| **测试目的** | 会员只读边界 |
200
+| **前置条件** | 订单属会员 2 |
201
+| **测试步骤** | `getOrderDetail(orderId, memberId=1)` |
202
+| **预期结果** | 抛错;无权查看 |
203
+
204
+### ORD-UT-019 创建订单写入 pay_expire_time
205
+
206
+| 要素 | 内容 |
207
+|------|------|
208
+| **测试项** | createOrder |
209
+| **测试目的** | 验证 §5 定时关单字段 |
210
+| **前置条件** | timeout=1440 分钟 |
211
+| **测试步骤** | `createOrder` |
212
+| **预期结果** | pay_expire_time = create_time + 1440min |
213
+
214
+### ORD-UT-020 订单号生成唯一
215
+
216
+| 要素 | 内容 |
217
+|------|------|
218
+| **测试项** | generateOrderNo |
219
+| **测试目的** | 验证 O2 |
220
+| **前置条件** | — |
221
+| **测试步骤** | 连续生成 100 个 |
222
+| **预期结果** | 无重复;格式 O+日期+序号 |
223
+
224
+---
225
+
226
+## 二、接口测试
227
+
228
+### ORD-API-001 列表默认排除已删除
229
+
230
+| 要素 | 内容 |
231
+|------|------|
232
+| **测试项** | GET /agri/order/list |
233
+| **测试目的** | 验证 §5.4 |
234
+| **前置条件** | 存在 status=5 与 status=1 各一单 |
235
+| **测试步骤** | 不传 orderStatus |
236
+| **预期结果** | rows 不含 status=5 |
237
+
238
+### ORD-API-002 页签待支付筛选
239
+
240
+| 要素 | 内容 |
241
+|------|------|
242
+| **测试项** | GET /list?orderStatus=0 |
243
+| **测试目的** | 验证页签 |
244
+| **前置条件** | 多状态订单 |
245
+| **测试步骤** | orderStatus=0 |
246
+| **预期结果** | 仅待支付 |
247
+
248
+### ORD-API-003 页签待发货/已发货/已完成/已关闭/已删除
249
+
250
+| 要素 | 内容 |
251
+|------|------|
252
+| **测试项** | GET /list |
253
+| **测试目的** | 验证 O3 页签 |
254
+| **前置条件** | 各状态均有样本 |
255
+| **测试步骤** | orderStatus=1~5 各请求一次 |
256
+| **预期结果** | 筛选正确 |
257
+
258
+### ORD-API-004 按订单编号检索
259
+
260
+| 要素 | 内容 |
261
+|------|------|
262
+| **测试项** | GET /list |
263
+| **测试目的** | 验证 O16 |
264
+| **前置条件** | 已知 orderNo |
265
+| **测试步骤** | orderNo 模糊 |
266
+| **预期结果** | 命中目标单 |
267
+
268
+### ORD-API-005 按商品名称检索
269
+
270
+| 要素 | 内容 |
271
+|------|------|
272
+| **测试项** | GET /list |
273
+| **测试目的** | 验证 O16 |
274
+| **前置条件** | 订单含商品名「尿素」 |
275
+| **测试步骤** | goodsName=尿素 |
276
+| **预期结果** | 命中 |
277
+
278
+### ORD-API-006 按收货人手机号检索
279
+
280
+| 要素 | 内容 |
281
+|------|------|
282
+| **测试项** | GET /list |
283
+| **测试目的** | 验证 O16 |
284
+| **前置条件** | — |
285
+| **测试步骤** | consigneeMobile |
286
+| **预期结果** | 命中 |
287
+
288
+### ORD-API-007 按会员 keyword 检索
289
+
290
+| 要素 | 内容 |
291
+|------|------|
292
+| **测试项** | GET /list |
293
+| **测试目的** | 扩展检索 |
294
+| **前置条件** | memberNickName 已知 |
295
+| **测试步骤** | memberKeyword |
296
+| **预期结果** | 命中 |
297
+
298
+### ORD-API-008 详情含明细与物流轴
299
+
300
+| 要素 | 内容 |
301
+|------|------|
302
+| **测试项** | GET /{orderId} |
303
+| **测试目的** | 验证 O14 |
304
+| **前置条件** | 已发货且有多条 trace |
305
+| **测试步骤** | GET 详情 |
306
+| **预期结果** | items、traceList 非空;trace 时间倒序 |
307
+
308
+### ORD-API-009 发货成功
309
+
310
+| 要素 | 内容 |
311
+|------|------|
312
+| **测试项** | POST /{id}/ship |
313
+| **测试目的** | 验证 §7 |
314
+| **前置条件** | status=1;权限 agri:order:ship |
315
+| **测试步骤** | POST 合法物流 Body |
316
+| **预期结果** | code=200;再查 status=2 |
317
+
318
+### ORD-API-010 更新物流
319
+
320
+| 要素 | 内容 |
321
+|------|------|
322
+| **测试项** | POST /{id}/logistics |
323
+| **测试目的** | 验证 §8 |
324
+| **前置条件** | status=2 |
325
+| **测试步骤** | POST content |
326
+| **预期结果** | 详情 trace 增加 type=2 |
327
+
328
+### ORD-API-011 登记送达
329
+
330
+| 要素 | 内容 |
331
+|------|------|
332
+| **测试项** | POST /{id}/delivered |
333
+| **测试目的** | 验证 §9.1 |
334
+| **前置条件** | status=2 |
335
+| **测试步骤** | POST |
336
+| **预期结果** | status 仍为 2;trace type=3 |
337
+
338
+### ORD-API-012 运营关闭待发货
339
+
340
+| 要素 | 内容 |
341
+|------|------|
342
+| **测试项** | PUT /{id}/close |
343
+| **测试目的** | 验证 §10.1 |
344
+| **前置条件** | status=1 已支付 |
345
+| **测试步骤** | closeType=3 |
346
+| **预期结果** | status=4;商品库存已回滚(查 goods.stock) |
347
+
348
+### ORD-API-013 删除已关闭订单
349
+
350
+| 要素 | 内容 |
351
+|------|------|
352
+| **测试项** | DELETE /{id} |
353
+| **测试目的** | 验证 O9 |
354
+| **前置条件** | status=4 |
355
+| **测试步骤** | DELETE |
356
+| **预期结果** | status=5;默认列表不可见 |
357
+
358
+### ORD-API-014 非已关闭不可删除
359
+
360
+| 要素 | 内容 |
361
+|------|------|
362
+| **测试项** | DELETE /{id} |
363
+| **测试目的** | 验证 O9 负向 |
364
+| **前置条件** | status=1 |
365
+| **测试步骤** | DELETE |
366
+| **预期结果** | 失败 |
367
+
368
+### ORD-API-015 无权限发货 403
369
+
370
+| 要素 | 内容 |
371
+|------|------|
372
+| **测试项** | POST /ship |
373
+| **测试目的** | 权限 |
374
+| **前置条件** | 仅 list 权限 Token |
375
+| **测试步骤** | POST ship |
376
+| **预期结果** | 403 |
377
+
378
+### ORD-API-016 C 端创建订单
379
+
380
+| 要素 | 内容 |
381
+|------|------|
382
+| **测试项** | POST /api/order/create |
383
+| **测试目的** | C 端主路径 |
384
+| **前置条件** | 会员启用;店开业;商品出售中库存足 |
385
+| **测试步骤** | POST 下单 |
386
+| **预期结果** | status=0;有 items 快照;pay_expire_time 有值 |
387
+
388
+### ORD-API-017 C 端支付成功
389
+
390
+| 要素 | 内容 |
391
+|------|------|
392
+| **测试项** | POST /api/order/{id}/pay |
393
+| **测试目的** | C 端支付 |
394
+| **前置条件** | status=0 |
395
+| **测试步骤** | pay |
396
+| **预期结果** | status=1 |
397
+
398
+### ORD-API-018 C 端确认收货
399
+
400
+| 要素 | 内容 |
401
+|------|------|
402
+| **测试项** | POST /api/order/{id}/confirmReceive |
403
+| **测试目的** | 完成 + O11 |
404
+| **前置条件** | status=2;会员 Token |
405
+| **测试步骤** | confirmReceive |
406
+| **预期结果** | status=3;biz_member.order_count/total_amount 更新 |
407
+
408
+### ORD-API-019 已关闭订单不可再支付
409
+
410
+| 要素 | 内容 |
411
+|------|------|
412
+| **测试项** | POST /pay |
413
+| **测试目的** | 验证 §3.4 C 端 |
414
+| **前置条件** | status=4(超时关闭) |
415
+| **测试步骤** | pay |
416
+| **预期结果** | 失败;订单已关闭 |
417
+
418
+### ORD-API-020 删店预检存在未完成订单
419
+
420
+| 要素 | 内容 |
421
+|------|------|
422
+| **测试项** | GET /agri/shop/{id}/deleteCheck |
423
+| **测试目的** | 跨模块 O10 |
424
+| **前置条件** | 店下 status=0 订单 |
425
+| **测试步骤** | deleteCheck |
426
+| **预期结果** | canDelete=false;含未完成订单文案 |
427
+
428
+---
429
+
430
+## 三、界面测试
431
+
432
+### ORD-UI-001 订单列表页签切换
433
+
434
+| 要素 | 内容 |
435
+|------|------|
436
+| **测试项** | 列表 UI |
437
+| **测试工具** | Playwright |
438
+| **测试步骤** | 登录平台 → 订单管理 → 点击「待发货」页签 |
439
+| **预期结果** | 表格仅待发货;角标数量合理 |
440
+
441
+### ORD-UI-002 待发货展示去发货按钮
442
+
443
+| 要素 | 内容 |
444
+|------|------|
445
+| **测试项** | 操作列 |
446
+| **测试步骤** | 待发货行查看操作 |
447
+| **预期结果** | 有「去发货」;无删除 |
448
+
449
+### ORD-UI-003 发货弹窗配送方式切换字段显隐
450
+
451
+| 要素 | 内容 |
452
+|------|------|
453
+| **测试项** | 发货表单 |
454
+| **测试步骤** | 打开发货 → 选物流/商家配送 |
455
+| **预期结果** | 物流显示公司+单号;商家显示车辆+配送员 |
456
+
457
+### ORD-UI-004 发货成功状态变更
458
+
459
+| 要素 | 内容 |
460
+|------|------|
461
+| **测试项** | 发货 E2E |
462
+| **前置条件** | 待发货样本单 |
463
+| **测试步骤** | 填表提交发货 |
464
+| **预期结果** | 提示成功;行状态变已发货 |
465
+
466
+### ORD-UI-005 详情物流时间轴倒序
467
+
468
+| 要素 | 内容 |
469
+|------|------|
470
+| **测试项** | 详情 |
471
+| **测试步骤** | 打开已发货单详情 |
472
+| **预期结果** | 时间轴最新在上 |
473
+
474
+### ORD-UI-006 关闭二次确认
475
+
476
+| 要素 | 内容 |
477
+|------|------|
478
+| **测试项** | 关闭 |
479
+| **测试步骤** | 点击关闭 |
480
+| **预期结果** | 确认框;可填原因 |
481
+
482
+### ORD-UI-007 已删除页签可见逻辑删除单
483
+
484
+| 要素 | 内容 |
485
+|------|------|
486
+| **测试项** | 已删除 |
487
+| **测试步骤** | 切换「已删除」页签 |
488
+| **预期结果** | 可见 status=5 订单;只读 |
489
+
490
+### ORD-UI-008 列表手机号脱敏
491
+
492
+| 要素 | 内容 |
493
+|------|------|
494
+| **测试项** | 脱敏 |
495
+| **测试步骤** | 查看列表收货手机 |
496
+| **预期结果** | 中间 4 位 * |
497
+
498
+---
499
+
500
+## 四、定时任务测试
501
+
502
+### ORD-JOB-001 超时自动关闭 E2E
503
+
504
+| 要素 | 内容 |
505
+|------|------|
506
+| **测试项** | O8 集成 |
507
+| **前置条件** | timeout=2 分钟;创建待支付单并等待过期 |
508
+| **测试步骤** | 触发 Job 或等待调度 |
509
+| **预期结果** | 订单变已关闭;close_type=未支付超时 |
510
+
511
+---
512
+
513
+## 五、测试数据准备
514
+
515
+| 数据 | 说明 |
516
+|------|------|
517
+| 会员 M1 | status=0;用于下单 |
518
+| 会员 M2 | status=1 禁用;用于登录/下单阻断 |
519
+| 店铺 S1 | 开业;S2 停业 |
520
+| 商品 G1 | 出售中 stock=100 |
521
+| 订单样本 | 各 status 0~5 至少 1 条 |
522
+| 配置 | `order.pay.timeout.minutes` 测试值 |
523
+
524
+---
525
+
526
+## 六、用例统计
527
+
528
+| 类型 | 数量 |
529
+|------|------|
530
+| 单元测试 ORD-UT | 20 |
531
+| 接口测试 ORD-API | 20 |
532
+| 界面测试 ORD-UI | 8 |
533
+| 定时任务 ORD-JOB | 1 |
534
+| **合计** | **49** |
535
+
536
+---
537
+
538
+*文档版本:v1.0 · 关联《订单管理功能需求.md》v1.0.1、《订单管理技术方案.md》v1.0*