产品需求文档
版本:MVP V1.0
日期:2026-03-22
目录
-
-
-
-
-
-
-
-
-
-
-
-
-
1. 产品概述
1.1 产品定位
小店智脑是一款智能收银助手,支持收款机、平板、手机多终端,专为街边小店设计。
1.2 核心价值
“收银快、库存准、商品库共享、自由牵线拉客”
1.3 平台定位
“我们是桥接器,不是管理者”
1.4 核心特点
2. 用户与场景
2.1 目标用户
2.2 核心场景
3. 功能清单
4. 收银模块
4.1 加商品方式
|
|
|
|
|
| 扫码加商品 |
|
|
|
| 语音加商品 |
|
|
|
| 称重计价 |
|
|
|
| 快捷商品 |
|
|
|
| 手动输入 |
|
|
|
| 快速金额 |
|
|
|
4.2 收银界面
收款机端(横屏):
┌─────────────────────────────────────────────────────────────────────────────────┐
│ F1可乐 F2农夫山泉 F3薯片 F4苹果 F5香蕉 F6挂单 F7结算 F8优惠券 F9打印 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 购物车 │ 商品分类 │
│ ┌────────────────────────────┐ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 可乐 x2 6.00 │ │ │ 饮料 │ │ 零食 │ │ 水果 │ │
│ │ [ - ] [ + ] [删除] │ │ └──────────┘ └──────────┘ └──────────┘ │
│ ├────────────────────────────┤ │ │
│ │ 农夫山泉 x1 2.00 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ [ - ] [ + ] [删除] │ │ │ 蔬菜 │ │ 熟食 │ │ 其他 │ │
│ ├────────────────────────────┤ │ └──────────┘ └──────────┘ └──────────┘ │
│ │ 合计: 8.00 │ │ │
│ └────────────────────────────┘ │ 商品列表 │
│ │ ┌────────────────────────────────────┐ │
│ [使用优惠券] │ │ 可乐 3.00 [ + ] │ │
│ │ │ 雪碧 3.00 [ + ] │ │
└─────────────────────────────────────────────────────────────────────────────────┘
平板端(竖屏):
┌─────────────────────────────────────────┐
│ [离线] [搜索] [扫码] [语音] │
├─────────────────────────────────────────┤
│ 购物车 │
│ ┌───────────────────────────────────┐ │
│ │ 可乐 x2 6.00 │ │
│ │ 农夫山泉 x1 2.00 │ │
│ │ 合计: 8.00 │ │
│ └───────────────────────────────────┘ │
│ │
│ [使用优惠券] [结算] │
│ ────────────────────────────────────── │
│ 快捷商品 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 苹果 │ │ 香蕉 │ │ 橙子 │ │
│ │ 6元/斤 │ │ 5元/斤 │ │ 8元/斤 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ────────────────────────────────────── │
│ 商品分类 │
│ [饮料] [零食] [水果] [蔬菜] [更多] │
└─────────────────────────────────────────┘
手机端(竖屏,极简):
┌─────────────────────────────────────────┐
│ [扫码] [语音] [搜索] │
├─────────────────────────────────────────┤
│ │
│ 当前订单: 8.00 ▼ │
│ (点击展开购物车) │
│ │
│ ┌───────────────────────────────────┐ │
│ │ 快捷商品 │ │
│ └───────────────────────────────────┘ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 苹果 │ │ 香蕉 │ │ 橙子 │ │
│ │ 6元/斤 │ │ 5元/斤 │ │ 8元/斤 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ [结算] │
└─────────────────────────────────────────┘
4.3 电子秤接入
支持型号:大华ACS-15(USB串口)
交互流程:
-
-
-
-
-
4.4 支付流程
1. 点击"生成收款码"
2. 调用聚合支付API,生成二维码
3. 显示二维码,顾客扫码支付
4. 轮询支付结果(每2秒,最多30次)
5. 支付成功:
├── 扣减库存(检查库存,不足时弹窗确认)
├── 记录库存流水
├── 保存订单到SQLite
├── 发送电子小票
├── 如失败,记录日志
└── 标记订单待同步
6. 支付回调失败:店员可手动标记“已支付”
4.5 库存不足处理
收银时库存不足 → 弹窗提示“库存仅剩X,是否继续销售?”
选项:
- 继续销售(允许负数,记录原因)
- 取消销售(返回修改)
- 查看库存详情
4.6 电子小票优先
4.7 纸质小票内容
小店智脑 - XX便利店
----------------
可乐 x2 6.00
农夫山泉 x1 2.00
苹果 1.2kg 7.20
----------------
合计: 15.20
支付: 微信
时间: 2026-03-22 14:30
订单号: 202603220001
----------------
谢谢光临
5. 商品库模块
5.1 核心理念
“谁录入,谁受益,大家共享”
5.2 商品录入流程
扫码/输入条码
│
▼
查询本地库
│
├── 存在 → 直接使用
│
└── 不存在
│
▼
查询标准库缓存(本地)
│
├── 存在 → 复制到本地 → 使用
│
└── 不存在
│
▼
查询云端标准库
│
├── 存在 → 复制到本地+缓存 → 使用
│
└── 不存在
│
▼
弹出录入界面
│
▼
保存到本地(允许使用)
│
▼
提交审核(异步)
│
▼
审核通过 → 进入标准库
5.3 待审核商品临时使用
其他商家扫码时,若商品在待审核中:
弹出提示:“该商品待审核,是否临时使用?”
选项:
- 是 → 复制到本地,标记“临时商品”
- 否 → 继续等待审核
审核通过后,临时商品自动转为正式商品
5.4 商品录入界面
┌─────────────────────────────────────────────────────────────────┐
│ 录入新商品 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 条码:6901234567890 │
│ │
│ * 商品名称:_______________ │
│ * 分类: [饮料 ▼] │
│ 品牌: _______________ │
│ 规格: _______________ (如 550ml) │
│ * 单位: [瓶 ▼] │
│ * 建议售价:_______________ │
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 提交 │ │ 取消 │ │
│ └─────────┘ └─────────┘ │
│ │
│ 💡 提示:提交后即可使用,审核通过后其他商家也可使用 │
└─────────────────────────────────────────────────────────────────┘
5.5 快捷商品管理
┌─────────────────────────────────────────────────────────────────┐
│ 快捷商品管理 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 常用快捷商品: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 苹果 6元/斤 计重 有库存 [编辑] [删除] │ │
│ │ 香蕉 5元/斤 计重 有库存 [编辑] [删除] │ │
│ │ 散装瓜子 15元/斤 计重 无库存 [编辑] [删除] │ │
│ │ 手工面包 5元/个 普通 有库存 [编辑] [删除] │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────┐ │
│ │ 添加快捷 │ │
│ └─────────┘ │
└─────────────────────────────────────────────────────────────────┘
5.6 审核机制
6. 库存模块
6.1 商品管理字段
6.2 入库流程
1. 扫码枪扫描商品条码
2. 自动填充商品信息
3. 输入数量、采购价
4. 提交
5. 更新products.stock(累加)
6. 记录inbound入库记录
7. 记录stock_log库存流水
8. 标记待同步
6.3 库存扣减(乐观锁)
-- 扣减库存时使用版本号
UPDATE products
SET stock = stock - ?, version = version + 1, updated_at = ?
WHERE id = ? AND version = ?;
-- 受影响行数为0则重试(最多3次)
6.4 库存流水
6.5 低库存预警
触发条件:stock < safety_stock
推送方式:企业微信/小程序消息
推送内容:
【库存预警】农夫山泉 550ml 库存仅剩3箱,
低于安全库存(5箱),建议补货。
7. 异业桥接模块
7.1 核心理念
“平台是桥接器,只牵线,不管理”
7.2 完整流程
商家A创建券 → 生成二维码 → 分享给商家B → 商家B打印二维码 → 顾客扫码领券 → 顾客到店核销
7.3 找商家界面
┌─────────────────────────────────────────────────────────────────┐
│ 找商家 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 筛选:距离 [3公里 ▼] 行业 [全部 ▼] │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 🏪 XX便利店 1.2km │ │
│ │ 零售 · 张老板 [已合作] │ │
│ │ 电话:138****1234 │ │
│ │ 微信:zhang***** │ │
│ │ ┌─────────┐ │ │
│ │ │ 联系TA │ │ │
│ │ └─────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
7.4 创建优惠券界面
┌─────────────────────────────────────────────────────────────────┐
│ 创建优惠券 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ * 券名称:满50减5元 │
│ │
│ * 券类型:○ 满减券 ● 折扣券 ○ 代金券 ○ 赠品券 │
│ │
│ * 满减门槛:50 元 │
│ * 优惠金额:5 元 │
│ │
│ * 有效期:2026-03-22 至 2026-03-29 │
│ │
│ * 每人限领:1 张 │
│ * 总发行量:100 张 │
│ │
│ ┌─────────┐ │
│ │ 创建 │ │
│ └─────────┘ │
│ │
│ 💡 每人每日最多创建10张券 │
└─────────────────────────────────────────────────────────────────┘
7.5 优惠券二维码
┌─────────────────────────────────────────────────────────────────┐
│ 优惠券二维码 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 优惠券:满50减5元 │
│ 来源:XX便利店 │
│ 有效期:2026-03-22 至 2026-03-29 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ [二维码] │ │
│ │ 扫码领XX便利店满50减5元券 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ [保存图片] [分享给好友] │
└─────────────────────────────────────────────────────────────────┘
7.6 收银核销
点击"使用优惠券"后:
┌─────────────────────────────────────────────────────────────────┐
│ 使用优惠券 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 请扫描顾客出示的优惠券码: │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ [扫码区域] │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 扫码后: │
│ │
│ 优惠券:满50减5元 │
│ 来源:XX便利店 │
│ 当前订单金额:52.00元 │
│ 优惠后金额:47.00元 │
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 确认核销│ │ 取消 │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────────┘
7.7 核销并发锁
7.8 商家合作标记
7.9 过期券清理
定时任务(每日凌晨1点):
7.10 举报机制
┌─────────────────────────────────────────────────────────────────┐
│ 举报商家 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 举报原因: │
│ ○ 虚假宣传 │
│ ○ 恶意骚扰 │
│ ○ 违法内容 │
│ ○ 其他 │
│ │
│ 描述:_________________________________ │
│ │
│ ┌─────────┐ │
│ │ 提交 │ │
│ └─────────┘ │
└─────────────────────────────────────────────────────────────────┘
8. 报表模块
8.1 日报表
┌─────────────────────────────────────────────────────────────────┐
│ 2026-03-22 销售日报 [刷新] [分享] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 📊 今日数据 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 销售额:1,280元 │ │
│ │ 订单数:32 │ │
│ │ 毛利:320元(估算) │ │
│ │ 数据同步时间:2026-03-22 23:55 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 🔥 商品排行(按销售额) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 1. 农夫山泉 550ml 234元 │ │
│ │ 2. 可乐 189元 │ │
│ │ 3. 薯片 156元 │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
8.2 月报表
┌─────────────────────────────────────────────────────────────────┐
│ 2026年3月 销售月报 [导出] [分享] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 📊 本月数据 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 总销售额:38,240元 │ │
│ │ 总订单数:856 │ │
│ │ 总毛利:9,560元(估算) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 📈 销售趋势图 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ┌──┐ │ │
│ │ │ │ ┌──┐ │ │
│ │ ┌──┤ │ │ │ ┌──┐ │ │
│ │ │ │ │ │ │ │ │ │ │
│ │ └──┴──┴──┴──┴──┴──┘ │ │
│ │ 1 5 10 15 20 25 30 │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
9. 多终端支持
9.1 终端对比
9.2 各终端功能支持
9.3 多端数据同步
9.4 手机端称重处理
手机端遇到称重商品:
-
-
显示最近常用重量选项(0.5kg, 1kg, 1.5kg, 2kg)
-
10. 技术架构
10.1 整体架构
┌─────────────────────────────────────────────────────────────────┐
│ 多终端(收款机/平板/手机) │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Flutter App (统一代码) │ │
│ │ ├── UI适配:横屏/竖屏/极简,根据终端自适应 │ │
│ │ ├── 业务逻辑:收银、库存扣减、打印、券核销 │ │
│ │ ├── 本地存储:SQLite (商品、订单、库存、标准库缓存、券) │ │
│ │ ├── 硬件驱动:扫码枪(USB)、电子秤(USB)、打印机(蓝牙) │ │
│ │ ├── 语音识别:讯飞离线SDK │ │
│ │ └── 同步模块:队列化上传、冲突解决(乐观锁) │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │ │
│ │ HTTP 异步同步 │
│ ▼ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ UniApp Cloud (轻量辅助) │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 云函数: │ │
│ │ - 商品库: searchProduct、submitProduct、auditProduct │ │
│ │ - 订单: syncOrder、getReport │ │
│ │ - 异业: searchStores、createCoupon、claimCoupon、useCoupon│ │
│ │ - 系统: login、getStoreInfo │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 云数据库: │ │
│ │ - stores (商家) │ │
│ │ - standard_products (标准库) │ │
│ │ - pending_products (待审核) │ │
│ │ - coupons (优惠券) │ │
│ │ - claimed_coupons (已领券) │ │
│ │ - orders_cloud (订单) │ │
│ │ - daily_reports (日报) │ │
│ │ - sync_conflicts (同步冲突) │ │
│ │ - partnerships (合作记录) │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 小程序 (老板端 + 顾客端) │ │
│ │ - 老板: 找商家、创建券、看报表 │ │
│ │ - 顾客: 领券、我的券包 │ │
│ └───────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
10.2 技术选型
10.3 同步冲突解决(乐观锁)
-- 商品表增加版本号
ALTER TABLE products ADD COLUMN version INTEGER DEFAULT 1;
-- 扣减库存时
UPDATE products
SET stock = stock - ?, version = version + 1, updated_at = ?
WHERE id = ? AND version = ?;
-- 受影响行数为0则重试(最多3次)
10.4 成本估算
11. 数据模型
11.1 本地SQLite表
-- 店铺表
CREATE TABLE stores (
id TEXT PRIMARY KEY,
name TEXT,
phone TEXT,
wechat TEXT,
industry_id TEXT,
address TEXT,
latitude REAL,
longitude REAL,
is_public INTEGER DEFAULT 1,
status TEXT DEFAULT 'active',
created_at INTEGER
);
-- 商品表
CREATE TABLE products (
id TEXT PRIMARY KEY,
store_id TEXT,
barcode TEXT,
name TEXT,
category TEXT,
price REAL,
cost_price REAL,
stock REAL,
safety_stock REAL,
unit TEXT,
is_weighted INTEGER DEFAULT 0,
shelf_life_days INTEGER DEFAULT 0,
expiry_date TEXT,
standard_id TEXT,
version INTEGER DEFAULT 1,
track_stock INTEGER DEFAULT 1,
updated_at INTEGER,
sync_status TEXT DEFAULT 'synced'
);
-- 快捷商品表
CREATE TABLE quick_products (
id TEXT PRIMARY KEY,
store_id TEXT,
name TEXT,
price REAL,
unit TEXT,
is_weighted INTEGER DEFAULT 0,
stock REAL DEFAULT 0,
track_stock INTEGER DEFAULT 0,
category TEXT,
sort_order INTEGER DEFAULT 0,
created_at INTEGER
);
-- 订单表
CREATE TABLE orders (
id TEXT PRIMARY KEY,
store_id TEXT,
order_no TEXT,
total_amount REAL,
pay_status TEXT,
pay_time INTEGER,
pay_method TEXT,
cashier_id TEXT,
version INTEGER DEFAULT 1,
created_at INTEGER,
sync_status TEXT DEFAULT 'pending'
);
-- 订单明细表
CREATE TABLE order_items (
id TEXT PRIMARY KEY,
order_id TEXT,
product_id TEXT,
product_name TEXT,
quantity REAL,
price REAL,
amount REAL
);
-- 入库记录表
CREATE TABLE inbound (
id TEXT PRIMARY KEY,
store_id TEXT,
product_id TEXT,
product_name TEXT,
quantity REAL,
cost_price REAL,
supplier TEXT,
sync_status TEXT DEFAULT 'pending',
created_at INTEGER
);
-- 库存流水表
CREATE TABLE stock_log (
id TEXT PRIMARY KEY,
product_id TEXT,
store_id TEXT,
change_type TEXT,
change_quantity REAL,
before_stock REAL,
after_stock REAL,
order_id TEXT,
created_at INTEGER
);
-- 优惠券表
CREATE TABLE coupons (
id TEXT PRIMARY KEY,
store_id TEXT,
name TEXT,
type TEXT,
threshold REAL,
discount REAL,
start_time INTEGER,
end_time INTEGER,
total_quantity INTEGER,
per_user_limit INTEGER DEFAULT 1,
claimed_count INTEGER DEFAULT 0,
used_count INTEGER DEFAULT 0,
status TEXT,
sync_status TEXT DEFAULT 'synced',
created_at INTEGER
);
-- 已领券表
CREATE TABLE claimed_coupons (
id TEXT PRIMARY KEY,
coupon_id TEXT,
store_id TEXT,
coupon_code TEXT UNIQUE,
user_openid TEXT,
status TEXT,
claimed_at INTEGER,
used_at INTEGER,
order_id TEXT,
sync_status TEXT DEFAULT 'pending'
);
-- 合作记录表
CREATE TABLE partnerships (
id TEXT PRIMARY KEY,
store_id TEXT,
partner_store_id TEXT,
status TEXT,
created_at INTEGER
);
-- 标准库缓存表
CREATE TABLE standard_cache (
id TEXT PRIMARY KEY,
barcode TEXT UNIQUE,
name TEXT,
category TEXT,
brand TEXT,
spec TEXT,
unit TEXT,
default_price REAL,
image_url TEXT,
created_at INTEGER
);
-- 同步冲突表
CREATE TABLE sync_conflicts (
id TEXT PRIMARY KEY,
table_name TEXT,
record_id TEXT,
local_data TEXT,
remote_data TEXT,
resolution TEXT,
resolved INTEGER DEFAULT 0,
created_at INTEGER
);
11.2 云端数据库集合
|
|
|
|
|
|
|
id, name, phone, wechat, industry, lat, lng
|
|
|
|
id, barcode, name, category, brand, spec, unit, status
|
|
|
|
id, barcode, name, store_id, submit_time
|
|
|
|
id, store_id, name, type, threshold, discount
|
|
|
|
id, coupon_id, coupon_code, user_openid, status
|
|
|
|
id, store_id, total_amount, pay_time
|
|
|
|
id, store_id, date, total_amount, order_count
|
|
|
|
id, store_id, partner_store_id, status
|
|
|
|
id, table_name, record_id, local_data, remote_data
|
12. 实施计划
12.1 团队配置
12.2 时间线
12.3 里程碑
13. 验收标准
13.1 收银模块
13.2 商品库模块
13.3 库存模块
13.4 异业桥接模块
13.5 报表模块
13.6 系统模块
文档结束
完整业务闭环图
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 小店智脑 - 完整业务闭环 │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ 收银闭环 │ │
│ │ 顾客进店 → 加商品 → 购物车 → 支付 → 小票 → 库存扣减 → 订单保存 → 顾客离开 │ │
│ │ ↓ ↓ │ │
│ │ 扫码/语音/称重 电子小票优先 │ │
│ │ 快捷/手动/快速 纸质小票兜底 │ │
│ │ ↓ │ │
│ │ 库存不足弹窗确认 │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ 商品库闭环 │ │
│ │ 新商品录入 → 本地保存(可用) → 提交审核 → 待审核 → 审核通过 → 标准库 → 共享 │ │
│ │ ↓ │ │
│ │ 其他商家可临时使用 │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ 库存闭环 │ │
│ │ 销售扣减 → 库存不足处理 → 记录流水 → 低库存预警 → 老板补货 → 入库 → 解除 │ │
│ │ ↓ ↓ │ │
│ │ 乐观锁防并发 推送通知 │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ 异业闭环 │ │
│ │ 商家A创建券 → 生成二维码 → 分享给商家B → 顾客领券 → 到店核销 → 券状态更新 │ │
│ │ ↓ ↓ ↓ │ │
│ │ 每日限10张 打印贴收银台 每人限领 │ │
│ │ 合作标记防重复 │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ 同步闭环 │ │
│ │ 本地操作 → SQLite存储 → 队列上传 → 云端存储 → 冲突解决 → 多端拉取 → 一致 │ │
│ │ ↓ ↓ │ │
│ │ 断网可用 乐观锁+版本号 │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────┘