📋 系统角色 & 页面总览
好库管共 4 种用户角色,TabBar 4 个页签,29 个页面
老板 Boss(role=1)
员工 Staff(role=2)
供应商 Supplier(partner_type=1)
客户 Customer(partner_type=2)
系统整体架构流程
graph TD
A[打开小程序] --> B{是否有Token?}
B -->|无| C[登录页]
B -->|有/过期| C
B -->|有效| D{是否已选商家?}
C -->|微信一键登录| E[获取Token]
E --> F{是否需要绑定手机?}
F -->|需要| G[绑定手机号页]
F -->|不需要| H{资料是否完整?}
G --> H
H -->|需补全| I[补全资料弹窗]
H -->|已完整| D
I --> D
D -->|未选| J[选择商家页]
D -->|已选| K{判断角色}
J -->|选择商家| K
J -->|创建商家| L[创建商家页] --> K
K -->|老板| M["🏠 首页 · 老板视图"]
K -->|员工| N["🏠 首页 · 员工视图"]
K -->|供应商| O["🏠 首页 · 供应商视图"]
K -->|客户| P["🏠 首页 · 客户视图"]
style A fill:#0057FF,color:#fff
style C fill:#FEF3C7,color:#92400E
style M fill:#DBEAFE,color:#1D4ED8
style N fill:#E0E7FF,color:#4338CA
style O fill:#D1FAE5,color:#059669
style P fill:#FCE7F3,color:#DB2777
TabBar 页签对比(商户端 vs 往来端)
graph LR
subgraph 商户端-老板/员工
T1["首页"] --- T2["进货"] --- T3["出货"] --- T4["我的"]
end
subgraph 往来端-供应商/客户
P1["首页"] --- P2["出货(原进货Tab)"] --- P3["进货(原出货Tab)"] --- P4["我的"]
end
style T1 fill:#DBEAFE,color:#1D4ED8
style T2 fill:#DBEAFE,color:#1D4ED8
style T3 fill:#DBEAFE,color:#1D4ED8
style T4 fill:#DBEAFE,color:#1D4ED8
style P1 fill:#D1FAE5,color:#059669
style P2 fill:#D1FAE5,color:#059669
style P3 fill:#D1FAE5,color:#059669
style P4 fill:#D1FAE5,color:#059669
角色权限对比表
| 功能模块 | 老板 | 员工 | 供应商 | 客户 |
|---|---|---|---|---|
| 进货管理(创建/确认入库/取消) | ✅ 全部 | ✅ 全部 | 👁 只读查看(出货视角) | — |
| 出货管理(创建/确认出库/取消) | ✅ 全部 | ✅ 全部 | — | 👁 只读查看(进货视角) |
| 收付款(创建/核销) | ✅ 全部 | ✅ 全部 | 👁 只读查看 | 👁 只读查看 |
| 收付款作废 | ✅ 直接作废 | ⏳ 申请→老板审批 | — | — |
| 库存查看 / 流水 | ✅ | ✅ | — | — |
| 库存调整 | ✅ | ✅ | — | — |
| 商品管理 CRUD | ✅ 增删改 | 👁 只读 | — | — |
| 分类管理 CRUD | ✅ 增删改 | 👁 只读 | — | — |
| 往来单位管理 | ✅ 增删改+邀请 | 👁 只读 | — | — |
| 对账查看 | ✅ | ✅ | ✅ 视角翻转 | ✅ 视角翻转 |
| 经营分析 Dashboard | ✅ | ❌ | — | — |
| 期初录入 | ✅ | ❌ | — | — |
| 员工管理(生成绑定码/移除) | ✅ | ❌ | — | — |
🔐 登录注册流程
包含微信登录、手机绑定、资料补全、商家选择/创建、员工绑定、往来单位绑定
1. 新用户首次登录 所有角色
graph TD
A["📱 打开小程序"] --> B["登录页 login/login"]
B --> C["点击「微信一键登录」按钮"]
C --> D["调用 wx.login 获取 code"]
D --> E["POST /api/auth/login"]
E --> F{返回结果}
F -->|需绑定手机| G["跳转「绑定手机号」页"]
F -->|登录成功| H{资料是否完整?}
G --> G1["点击「获取手机号」按钮"]
G1 --> G2["微信授权手机号"]
G2 --> G3["POST /api/auth/bind_phone"]
G3 --> H
H -->|需补全| I["弹出「补全资料」底部弹窗(不可关闭)"]
H -->|不需要| J{merchants 数量?}
I --> I1["填写昵称 + 上传头像"]
I1 --> I2["点击「保存并继续」"]
I2 --> J
J -->|0个商家| K["跳转「选择商家」页"]
J -->|1个商家| L["自动选择该商家"]
J -->|多个商家| K
K --> K1{操作选择}
K1 -->|点击商家卡片| M["POST /api/auth/select_merchant"]
K1 -->|点击「创建新商家」| N["填写商家名称"]
N --> N1["点击「创建商家」"]
N1 --> N2["POST /api/merchant/create"]
N2 --> M
L --> M
M --> O["获取新Token,含商家ID和角色"]
O --> P["syncPartnerTabBar 同步TabBar"]
P --> Q["🏠 switchTab 进入首页"]
style A fill:#0057FF,color:#fff
style Q fill:#22C55E,color:#fff
style G fill:#FEF3C7,color:#92400E
style I fill:#FEF3C7,color:#92400E
2. 员工扫码绑定 员工
graph TD
A["老板 → 员工管理页"] --> B["点击「生成绑定码」"]
B --> C["填写:员工姓名 + 手机号"]
C --> D["POST /api/merchant/create_staff_bind"]
D --> E["显示:8位绑定码 + 小程序码"]
E --> F["老板端:每3秒轮询检测绑定状态"]
E --> G["员工微信扫码"]
G --> H["进入 bind/join 页"]
H --> I["显示:商家名称 + 身份标签(员工)"]
I --> J["点击「确认加入」"]
J --> K["POST /api/bind/confirm"]
K --> L["✅ 绑定成功"]
L --> M["自动选择商家 → 进入首页"]
F --> F1["轮询检测到绑定 → Toast提示"]
style A fill:#DBEAFE,color:#1D4ED8
style L fill:#22C55E,color:#fff
绑定成功后:
① gk_merchant_user 新增一条记录(role=2 员工)
② 员工的商家选择列表出现该商家
③ 老板端员工管理列表显示新员工(轮询自动检测,Toast「xxx 已成功绑定」)
① gk_merchant_user 新增一条记录(role=2 员工)
② 员工的商家选择列表出现该商家
③ 老板端员工管理列表显示新员工(轮询自动检测,Toast「xxx 已成功绑定」)
3. 往来单位扫码绑定 供应商 客户
graph TD
A["老板 → 往来单位列表"] --> B{绑定方式}
B -->|新单位| C["点击「新单位扫码绑定」"]
B -->|已建档单位| D["点击单位 →「邀请绑定」"]
C --> C1["填写:名称+类型+手机号"]
C1 --> C2["POST /api/partner/create_bind"]
D --> D1["输入手机号"]
D1 --> D2["POST /api/partner/invite_bind"]
C2 --> E["显示:8位绑定码 + 小程序码"]
D2 --> E
E --> F["每3秒轮询检测绑定状态"]
E --> G["供应商/客户微信扫码"]
G --> H["进入 bind/join 页"]
H --> I{是否已登录?}
I -->|未登录| J["先微信登录"]
I -->|已登录| K["显示邀请卡片(商家名+身份+倒计时)"]
J --> K
K --> L["点击「确认绑定」"]
L --> M["POST /api/bind/confirm"]
M --> N["✅ 绑定成功"]
N --> O["以往来身份进入首页"]
style A fill:#DBEAFE,color:#1D4ED8
style N fill:#22C55E,color:#fff
绑定成功后:
① gk_partner 的 user_id 字段关联该微信用户
② 往来单位在商家选择页看到对应商家(role=partner, partner_type=1/2/3)
③ TabBar 文案翻转:Tab2「出货」、Tab3「进货」
④ 老板端轮询检测到绑定 → Toast「xxx 已成功绑定」
① gk_partner 的 user_id 字段关联该微信用户
② 往来单位在商家选择页看到对应商家(role=partner, partner_type=1/2/3)
③ TabBar 文案翻转:Tab2「出货」、Tab3「进货」
④ 老板端轮询检测到绑定 → Toast「xxx 已成功绑定」
商户老板功能流程
老板拥有所有权限,包括员工管理、审批作废、经营分析、期初录入等
老板首页 & 导航全景 老板
graph TD
HOME["🏠 首页 · 老板视图 HomeStaff"] --> CARD["顶部:商家名 + 角色标签 + 切换商家按钮"]
HOME --> STATS["4个统计卡片"]
STATS --> S1["出货金额 → 点击进sales/list"]
STATS --> S2["进货金额 → 点击进purchase/list"]
STATS --> S3["库存预警 → 点击进stock/list"]
STATS --> S4["商品总数 → 点击进product/list"]
HOME --> TREND["趋势图 → 点击详情进dashboard"]
HOME --> QUICK["4个快捷操作"]
QUICK --> QA["新建进货 → purchase/create"]
QUICK --> QB["新建出货 → sales/create"]
QUICK --> QC["收款 → 新建收款"]
QUICK --> QD["付款 → 新建付款"]
HOME --> TOP3["待收款/待付款 TOP3 → 对账"]
HOME --> MORE["更多功能网格(12项)"]
MORE --> MF1["进货单 / 出货单 / 库存"]
MORE --> MF2["收付款 / 对账 / 商品"]
MORE --> MF3["分类 / 往来 / 概览"]
MORE --> MF4["员工管理 / 期初录入 / 我的"]
HOME --> TB["TabBar 底部导航"]
TB --> TB1["首页 index/index"]
TB --> TB2["进货 purchase/list"]
TB --> TB3["出货 sales/list"]
TB --> TB4["我的 mine/index"]
style HOME fill:#DBEAFE,color:#1D4ED8
老板专属功能 仅老板可用
graph TD
A["老板专属权限"] --> B["员工管理 merchant/staff"]
A --> C["审批收付款作废"]
A --> D["经营分析 dashboard/index"]
A --> E["期初录入 opening/index"]
B --> B1["查看员工列表(头像+昵称+手机)"]
B --> B2["生成员工绑定码(3s轮询检测)"]
B --> B3["移除员工(确认弹窗)"]
C --> C1["查看待审批Banner"]
C --> C2["点击「通过作废」→ approve_void"]
C --> C3["点击「驳回」→ reject_void"]
D --> D1["核心指标 6 格网格"]
D --> D2["进出货金额趋势 + 笔数趋势"]
D --> D3["资金概览(待收vs待付 百分比条形图)"]
D --> D4["TOP5 待收/待付往来单位"]
E --> E1["Tab1: 期初应收(选客户→输入金额)"]
E --> E2["Tab2: 期初应付(选供应商→输入金额)"]
E --> E3["Tab3: 期初库存(选商品→输入数量)"]
style A fill:#DBEAFE,color:#1D4ED8
style C fill:#FEF2F2,color:#DC2626
我的页面 · 老板菜单 老板
graph TD
MINE["我的 mine/index"] --> HEAD["顶部个人卡片"]
HEAD --> H1["头像 + 问候语 + 用户名 + 手机(脱敏)"]
HEAD --> H2["当前商家名 + 角色标签 + 切换按钮"]
MINE --> QK["快捷操作栏:收款 / 付款 / 库存 / 对账"]
MINE --> MENU["菜单列表"]
MENU --> M1["经营概览 → dashboard/index"]
MENU --> M2["对账管理 → reconciliation/index"]
MENU --> M3["收付款 → payment/list"]
MENU --> M4["员工管理 → merchant/staff ★老板独有"]
MENU --> M5["期初录入 → opening/index ★老板独有"]
MENU --> M6["库存调整 → stock/adjust ★老板独有"]
MENU --> M7["商品分类 / 商品管理 / 往来单位"]
MENU --> M8["编辑资料(badge) / 绑定手机号(badge)"]
MENU --> M9["扫码绑定 / 退出登录"]
style MINE fill:#F3F4F6,color:#374151
员工功能流程
员工与老板共享大部分操作,但无法管理员工、审批作废、查看经营分析、期初录入
员工首页 & 可用功能 员工
graph TD
HOME["🏠 首页 · 员工视图 HomeStaff"] --> STATS["4个统计卡片(同老板)"]
HOME --> TREND["趋势图"]
HOME --> QUICK["快捷操作:新建进货/新建出货/收款/付款"]
HOME --> MORE["更多功能网格(10项,少员工管理/期初录入)"]
HOME --> TB["TabBar:首页/进货/出货/我的"]
TB --> MINE["我的页面"]
MINE --> MQ["快捷操作:收款 / 付款 / 对账 / 扫码绑定"]
MINE --> ML["菜单列表(无员工管理/期初录入/库存调整)"]
MINE --> M8["编辑资料 / 绑定手机号 / 退出登录"]
style HOME fill:#E0E7FF,color:#4338CA
员工 vs 老板权限差异
| 功能 | 老板 | 员工 |
|---|---|---|
| 进货单 创建/确认/取消 | ✅ | ✅ |
| 出货单 创建/确认/取消 | ✅ | ✅ |
| 收付款 创建 | ✅ | ✅ |
| 收付款 作废 | ✅ 直接作废 | ⏳ 需老板审批 |
| 商品 增删改 | ✅ | ❌ 只读 |
| 分类 增删改 | ✅ | ❌ 只读 |
| 往来单位 增删改 | ✅ | ❌ 只读 |
| 员工管理 | ✅ | ❌ 不可见 |
| 经营分析 | ✅ | ❌ 不可见 |
| 期初录入 | ✅ | ❌ 不可见 |
| 库存调整 | ✅ | ✅ |
员工特有交互
收付款作废流程(员工视角):
① 员工在收付款详情页点击「申请作废」
② POST /api/payment/apply_void
③ 状态变为「待审批」,不会立即作废
④ 老板在收付款列表看到「待审批 Banner」
⑤ 老板点击进入详情 →「通过」或「驳回」
⑥ 通过 → 正式作废,数据回滚;驳回 → 恢复正常状态
① 员工在收付款详情页点击「申请作废」
② POST /api/payment/apply_void
③ 状态变为「待审批」,不会立即作废
④ 老板在收付款列表看到「待审批 Banner」
⑤ 老板点击进入详情 →「通过」或「驳回」
⑥ 通过 → 正式作废,数据回滚;驳回 → 恢复正常状态
供应商视角流程
供应商 = 往来单位 partner_type=1,视角翻转:商家进货 = 供应商出货
供应商首页 & 功能范围 供应商 partner_type=1
graph TD
HOME["🏠 首页 · 供应商视图 HomePartner"] --> INFO["顶部:商家名 + 身份标签「供应商」+ 单位名"]
HOME --> STATS["统计卡片:出货金额 + 应收余额"]
HOME --> TREND["出货趋势图 → 点击进对账"]
HOME --> QUICK["快捷入口"]
QUICK --> Q1["出货单 → purchase/list(镜像)"]
QUICK --> Q2["对账 → reconciliation/index"]
QUICK --> Q3["收付款 → payment/list"]
HOME --> RECON["应收对账卡片(余额+公式)"]
Q1 --> OL["出货单列表"]
OL --> OD["出货单详情(只读,不可操作)"]
Q2 --> RC["对账页"]
RC --> RC1["自动选中自身 → 跳过选择单位"]
RC1 --> RC2["查看应收金额 + 往来明细"]
Q3 --> PL["收付款列表:仅看商家付款即供应商收款"]
PL --> PD["收付款详情(只读)"]
style HOME fill:#D1FAE5,color:#059669
视角翻转规则
| 商家视角 | → | 供应商视角 |
|---|---|---|
| 进货单 | → | 出货单 |
| 应付金额 | → | 应收金额 |
| 商家付款 | → | 供应商收款 |
| TabBar「进货」 | → | TabBar「出货」 |
| TabBar「出货」 | → | TabBar「进货」 |
供应商我的页面
graph TD
MINE["我的 mine/index"] --> QK["快捷操作:对账 / 出货单 / 收付款"]
MINE --> MENU["菜单列表"]
MENU --> M1["对账中心 → reconciliation"]
MENU --> M2["收付款记录 → payment/list"]
MENU --> M3["切换身份/商家 → merchant/select"]
MENU --> M4["编辑资料 / 扫码绑定"]
MENU --> M5["退出登录"]
style MINE fill:#D1FAE5,color:#059669
客户视角流程
客户 = 往来单位 partner_type=2,视角翻转:商家出货 = 客户进货
客户首页 & 功能范围 客户 partner_type=2
graph TD
HOME["🏠 首页 · 客户视图 HomePartner"] --> INFO["顶部:商家名 + 身份标签「客户」+ 单位名"]
HOME --> STATS["统计卡片:进货金额 + 应付余额"]
HOME --> TREND["进货趋势图 → 点击进对账"]
HOME --> QUICK["快捷入口"]
QUICK --> Q1["进货单 → sales/list(镜像)"]
QUICK --> Q2["对账 → reconciliation/index"]
QUICK --> Q3["收付款 → payment/list"]
HOME --> RECON["应付对账卡片(余额+公式)"]
Q1 --> IL["进货单列表"]
IL --> ID["进货单详情(只读,不可操作)"]
Q2 --> RC["对账页"]
RC --> RC1["自动选中自身 → 跳过选择单位"]
RC1 --> RC2["查看应付金额 + 往来明细"]
Q3 --> PL["收付款列表:仅看商家收款即客户付款"]
PL --> PD["收付款详情(只读)"]
style HOME fill:#FCE7F3,color:#DB2777
视角翻转规则
| 商家视角 | → | 客户视角 |
|---|---|---|
| 出货单 | → | 进货单 |
| 应收金额 | → | 应付金额 |
| 商家收款 | → | 客户付款 |
| TabBar「进货」 | → | TabBar「出货」 |
| TabBar「出货」 | → | TabBar「进货」 |
客户我的页面
graph TD
MINE["我的 mine/index"] --> QK["快捷操作:对账 / 进货单 / 收付款"]
MINE --> MENU["菜单列表"]
MENU --> M1["对账中心 → reconciliation"]
MENU --> M2["收付款记录 → payment/list"]
MENU --> M3["切换身份/商家 → merchant/select"]
MENU --> M4["编辑资料 / 扫码绑定"]
MENU --> M5["退出登录"]
style MINE fill:#FCE7F3,color:#DB2777
📦 进货单据完整流程
进货单状态:草稿(status=1) → 已入库(status=2) / 已取消(status=3)
进货单创建(3步向导) 老板/员工
graph TD
A["进货单列表 purchase/list"] --> B["点击右下角 FAB「+」"]
B --> C["进入创建页 purchase/create"]
C --> STEP["进度条:供应商 → 商品 → 确认"]
STEP --> S1["Step 1:选择供应商"]
S1 --> S1a["搜索输入框:前端过滤"]
S1a --> S1b["供应商卡片列表(头像+名称+联系人)"]
S1b --> S1c["点击选中 ✓ → 「下一步」"]
S1c --> S2["Step 2:选择商品 OrderCreateProductStep"]
S2 --> S2a["左侧:分类导航列表"]
S2 --> S2b["右侧:商品列表(名称+库存+价格参考)"]
S2b --> S2c["点击「添加」→ FAB显示已选数量"]
S2c --> S2d["点击FAB → 弹出编辑Sheet"]
S2d --> S2e["逐个编辑:数量/单价/小计"]
S2e --> S2f["自动带入上次进货价"]
S2e --> S2g["「下一步」"]
S2g --> S3["Step 3:确认提交"]
S3 --> S3a["供应商名称 + 商品明细(OrderGoodsCardList) + 合计金额"]
S3a --> S3b["可选:备注(200字) + 单据日期"]
S3b --> S3c["点击「提交进货单」"]
S3c --> S3d["POST /api/purchase/create"]
S3d --> S3e["✅ Toast 创建成功"]
S3e --> S3f["1秒后 navigateBack → 列表"]
style A fill:#F3F4F6,color:#374151
style S3e fill:#22C55E,color:#fff
提交成功效果:
① 显示成功 Toast → 1秒后返回列表页
② 进货单列表新增一条记录,状态 = 草稿(status=1),尚未入库
③ 此时不影响库存、不影响往来余额
① 显示成功 Toast → 1秒后返回列表页
② 进货单列表新增一条记录,状态 = 草稿(status=1),尚未入库
③ 此时不影响库存、不影响往来余额
进货单确认入库 关键操作 — 状态流转 & 数据联动
graph TD
A["进货单详情 purchase/detail"] --> B{单据状态?}
B -->|草稿| C["显示按钮:取消单据 + 确认入库"]
B -->|已入库| D["显示按钮:去付款"]
B -->|已取消| E["无操作按钮"]
C --> F["点击「确认入库」"]
F --> G["确认弹窗:确认后库存将增加,是否继续?"]
G -->|确认| H["POST /api/purchase/confirm"]
G -->|取消| A
H --> I["✅ Toast 入库成功 → 刷新详情"]
I --> J["📦 gk_stock:商品库存 +N"]
I --> K["📝 gk_stock_log:新增入库记录"]
I --> L["💰 供应商应付增加进货总额"]
I --> M["📊 Dashboard 进货统计更新"]
I --> SYNC["markListSyncOnBack"]
SYNC --> SYNC1["purchase 列表增量同步"]
SYNC --> SYNC2["stock 列表增量同步"]
style I fill:#22C55E,color:#fff
style J fill:#E0F2FE,color:#0369A1
style K fill:#E0F2FE,color:#0369A1
style L fill:#E0F2FE,color:#0369A1
style M fill:#E0F2FE,color:#0369A1
确认入库后各页面数据变化:
① 进货单详情页:状态 草稿→已入库,按钮变为「去付款」
② 进货单列表:状态标签变绿色「已入库」(增量同步 markListSyncOnBack)
③ 库存列表 stock/list:对应商品库存数量增加
④ 库存流水 stock/log:新增入库记录(type=1, ref_type=1, ref_id=该进货单ID)
⑤ 对账 reconciliation:该供应商应付余额增加
⑥ 收付款创建:该供应商待核销单据新增一条
⑦ 经营分析 Dashboard:进货金额/进货笔数更新
⑧ 供应商端:出货单详情可查看收款进度
① 进货单详情页:状态 草稿→已入库,按钮变为「去付款」
② 进货单列表:状态标签变绿色「已入库」(增量同步 markListSyncOnBack)
③ 库存列表 stock/list:对应商品库存数量增加
④ 库存流水 stock/log:新增入库记录(type=1, ref_type=1, ref_id=该进货单ID)
⑤ 对账 reconciliation:该供应商应付余额增加
⑥ 收付款创建:该供应商待核销单据新增一条
⑦ 经营分析 Dashboard:进货金额/进货笔数更新
⑧ 供应商端:出货单详情可查看收款进度
进货单取消 草稿状态可取消
graph TD
A["进货单详情 · 草稿状态"] --> B["点击「取消单据」"]
B --> C["确认弹窗"]
C -->|确认| D["POST /api/purchase/cancel"]
D --> E["✅ Toast 已取消"]
E --> F["0.8秒后 navigateBack"]
F --> G["列表同步刷新"]
style E fill:#EF4444,color:#fff
注意:草稿取消不影响库存(未入库的草稿)。已入库(status=2)的单据取消将回滚库存。
📤 出货单据完整流程
出货单状态:草稿(status=1) → 已出库(status=2) / 已取消(status=3)
出货单创建(3步向导) 老板/员工
graph TD
A["出货单列表 sales/list"] --> B["点击FAB「+」"]
B --> C["进入创建页 sales/create"]
C --> STEP["进度条:客户 → 商品 → 确认"]
STEP --> S1["Step 1:选择客户"]
S1 --> S1a["搜索+选择客户卡片"]
S1a --> S1b["「下一步」"]
S1b --> S2["Step 2:选择商品 OrderCreateProductStep"]
S2 --> S2a["左侧分类 + 右侧商品列表"]
S2 --> S2b["⚠️ 开启库存检查"]
S2b --> S2c["添加商品 → 编辑数量/单价"]
S2c --> S2d["自动带入上次售价"]
S2d --> S2e["库存不足时显示红色警告"]
S2e --> S2f["「下一步」前校验库存充足"]
S2f --> S3["Step 3:确认提交"]
S3 --> S3a["客户名称 + 商品明细 + 合计金额"]
S3a --> S3b["备注 + 单据日期"]
S3b --> S3c["点击「提交出货单」"]
S3c --> S3d["POST /api/sales/create"]
S3d --> S3e["✅ Toast 创建成功"]
S3e --> S3f["1秒后 navigateBack → 列表"]
style A fill:#F3F4F6,color:#374151
style S3e fill:#22C55E,color:#fff
style S2e fill:#FEF2F2,color:#B91C1C
与进货单差异:
① Step 1 选客户(非供应商),API 用 partnerApi.getCustomerList
② Step 2 价格默认取售价 sales_price(非 purchase_price)
③ Step 2 检查库存:checkStock=true,库存不足时红色警告
④ 进入 Step 3 前校验 quantity > maxStock → 提示「库存不足」
① Step 1 选客户(非供应商),API 用 partnerApi.getCustomerList
② Step 2 价格默认取售价 sales_price(非 purchase_price)
③ Step 2 检查库存:checkStock=true,库存不足时红色警告
④ 进入 Step 3 前校验 quantity > maxStock → 提示「库存不足」
出货单确认出库 关键操作 — 需校验库存
graph TD
A["出货单详情 sales/detail"] --> B{单据状态?}
B -->|草稿| C["显示按钮:取消单据 + 确认出库"]
B -->|已出库| D["显示按钮:去收款"]
B -->|已取消| E["无操作按钮"]
C --> F["点击「确认出库」"]
F --> G["确认弹窗:确认后库存将扣减,是否继续?"]
G -->|确认| H["POST /api/sales/confirm"]
H --> I{后端校验库存}
I -->|充足| J["✅ Toast 出库成功"]
I -->|不足| K["❌ 返回错误:库存不足"]
J --> L["📦 gk_stock:商品库存 -N"]
J --> M["📝 gk_stock_log:新增出库记录"]
J --> N["💰 客户应收增加出货总额"]
J --> O["📊 Dashboard 出货统计更新"]
style J fill:#22C55E,color:#fff
style K fill:#EF4444,color:#fff
style L fill:#E0F2FE,color:#0369A1
style M fill:#E0F2FE,color:#0369A1
style N fill:#E0F2FE,color:#0369A1
style O fill:#E0F2FE,color:#0369A1
确认出库后各页面数据变化:
① 出货单详情页:状态 草稿→已出库,按钮变为「去收款」
② 出货单列表:状态标签变绿色「已出库」
③ 库存列表 stock/list:对应商品库存数量减少
④ 库存流水 stock/log:新增出库记录(type=2, ref_type=2, ref_id=该出货单ID)
⑤ 对账 reconciliation:该客户应收余额增加
⑥ 收付款创建:该客户待核销单据新增一条
⑦ 经营分析 Dashboard:出货金额/出货笔数更新
⑧ 客户端:进货单详情可查看付款进度
⑨ 注意:如果库存不足,后端返回错误,无法出库
① 出货单详情页:状态 草稿→已出库,按钮变为「去收款」
② 出货单列表:状态标签变绿色「已出库」
③ 库存列表 stock/list:对应商品库存数量减少
④ 库存流水 stock/log:新增出库记录(type=2, ref_type=2, ref_id=该出货单ID)
⑤ 对账 reconciliation:该客户应收余额增加
⑥ 收付款创建:该客户待核销单据新增一条
⑦ 经营分析 Dashboard:出货金额/出货笔数更新
⑧ 客户端:进货单详情可查看付款进度
⑨ 注意:如果库存不足,后端返回错误,无法出库
💰 收付款完整流程
收款 = 客户付钱给商家(应收减少) | 付款 = 商家付钱给供应商(应付减少)
收付款创建(单页表单) 老板/员工
graph TD
A["收付款列表 payment/list"] --> B["点击FAB「+」"]
B --> C["进入创建页 payment/create"]
C --> D["收/付款切换Tab"]
D -->|收款| E1["选择客户(Bottom Sheet搜索选择)"]
D -->|付款| E2["选择供应商(Bottom Sheet搜索选择)"]
E1 --> F["加载对账摘要"]
E2 --> F
F --> F1["显示对账摘要:期初、出入库、收付款、余额"]
F1 --> G{有待核销单据?}
G -->|有| H["勾选要核销的单据"]
G -->|无/跳过| I["手动输入金额(预收/预付)"]
H --> H1["每笔展开金额输入 +「全额」快捷按钮"]
H1 --> H2["支持互冲(双重身份反向单据)"]
H2 --> H3["金额自动计算:正常核销 − 互冲"]
H3 --> J["选择付款方式"]
I --> J
J --> J1["微信/支付宝/银行转账/现金/其他"]
J1 --> K["可选:备注"]
K --> L["点击「确认收款/确认付款」"]
L --> M["POST /api/payment/create"]
M --> N["✅ Toast 操作成功"]
N --> O["1秒后 redirectTo → 收付款详情"]
style N fill:#22C55E,color:#fff
收付款提交成功后:
① 收付款列表:新增一条记录(绿点=收款,红点=付款)
② 对账 reconciliation:对应往来单位余额减少
③ 关联单据:被核销单据付款状态更新(unpaid→partial→paid)
④ 经营分析 Dashboard:收付款金额更新
⑤ 进出货详情:付款状态和已收/已付金额更新
① 收付款列表:新增一条记录(绿点=收款,红点=付款)
② 对账 reconciliation:对应往来单位余额减少
③ 关联单据:被核销单据付款状态更新(unpaid→partial→paid)
④ 经营分析 Dashboard:收付款金额更新
⑤ 进出货详情:付款状态和已收/已付金额更新
收付款作废流程 老板直接作废 / 员工需审批
graph TD
A["收付款详情 payment/detail"] --> B{正常状态且当日创建?}
B -->|满足| C["显示「作废/申请作废」按钮"]
B -->|不满足| X["无操作按钮"]
C --> D{当前角色?}
D -->|老板| E["点击「作废」"]
D -->|员工| F["点击「申请作废」"]
E --> E1["POST /api/payment/apply_void"]
E1 --> E2["✅ 直接作废成功"]
E2 --> E3["状态 → 已作废"]
F --> F1["POST /api/payment/apply_void"]
F1 --> F2["状态 → 待审批"]
F2 --> G["老板收付款列表显示「待审批」Banner"]
G --> G1["老板点击进入详情"]
G1 --> H{老板审批}
H -->|通过| I["POST /api/payment/approve_void"]
H -->|驳回| J["POST /api/payment/reject_void"]
I --> I1["✅ 作废成功 → 数据回滚"]
J --> J1["❌ 驳回 → 恢复正常"]
I1 --> K["往来余额回滚"]
I1 --> L["关联单据核销状态回滚"]
style E2 fill:#EF4444,color:#fff
style I1 fill:#EF4444,color:#fff
style J1 fill:#F59E0B,color:#fff
作废成功后数据回滚:
① 对应往来单位余额恢复(收款被作废→应收恢复,付款被作废→应付恢复)
② 被核销的单据付款状态回滚(paid→partial→unpaid)
③ 收付款列表中该记录标记为「已作废」,金额加删除线
① 对应往来单位余额恢复(收款被作废→应收恢复,付款被作废→应付恢复)
② 被核销的单据付款状态回滚(paid→partial→unpaid)
③ 收付款列表中该记录标记为「已作废」,金额加删除线
🏪 库存 & 基础数据管理
库存管理、商品管理、分类管理、往来单位管理、期初录入、对账
库存管理流程 老板/员工
graph TD
A["库存列表 stock/list"] --> LAYOUT["左侧分类导航 + 右侧库存卡片列表"]
LAYOUT --> CARD["每张卡片:商品名+库存数量+进价+售价+货值"]
CARD --> WARN["库存低于预警值 → 红色「低于预警」标签"]
CARD --> CLICK["点击卡片"]
CLICK --> LOG["库存流水 stock/log"]
LOG --> LOG1["入库记录 · 绿色标签"]
LOG --> LOG2["出库记录 · 红色标签"]
LOG --> LOG3["进货冲销 · 橙色标签"]
LOG --> LOG4["出货冲销 · 橙色标签"]
LOG --> LOG5["库存调整 · 蓝色标签"]
LOG --> LOG6["期初库存 · 灰色标签"]
LOG1 --> LOGCLICK["点击有ref_id的记录 → 跳转进货/出货详情"]
LOG2 --> LOGCLICK
A --> ADJ["点击「库存调整」"]
ADJ --> ADJP["stock/adjust 页面"]
ADJP --> ADJP1["ProductPickModal 选商品"]
ADJP1 --> ADJP2["输入变动数量:正数盘盈,负数盘亏"]
ADJP2 --> ADJP3["填写调整原因"]
ADJP3 --> ADJP4["点击「确认调整」"]
ADJP4 --> ADJP5["POST /api/stock/adjust"]
ADJP5 --> ADJP6["✅ 调整成功 → 返回上页"]
style A fill:#F3F4F6,color:#374151
style ADJP6 fill:#22C55E,color:#fff
style WARN fill:#FEF2F2,color:#B91C1C
库存调整成功后:
① 库存列表中对应商品数量更新
② 库存流水新增一条调整记录(type=5)
③ 不影响往来余额(非进销存单据)
① 库存列表中对应商品数量更新
② 库存流水新增一条调整记录(type=5)
③ 不影响往来余额(非进销存单据)
商品管理 老板增删改 / 员工只读
graph TD
A["商品列表 product/list"] --> B["顶部搜索 + 分类筛选Pill"]
B --> C{角色}
C -->|老板| D["可见:添加/编辑/删除"]
C -->|员工| E["只读列表"]
D --> D1["「+添加」→ Bottom Sheet"]
D1 --> D2["名称* + 分类* + 单位* + 进价 + 售价 + 预警值"]
D2 --> D3["POST /api/product/create"]
D --> D4["点击商品 → 编辑Sheet"]
D4 --> D5["POST /api/product/update"]
D --> D6["删除 → 确认弹窗"]
D6 --> D7["POST /api/product/delete"]
style D fill:#DBEAFE,color:#1D4ED8
style E fill:#F3F4F6,color:#6B7280
分类管理 老板增删改 / 员工只读
graph TD
A["分类列表 category/list"] --> B{角色}
B -->|老板| C["可见:添加/编辑/删除"]
B -->|员工| D["只读列表"]
C --> C1["「+添加」→ Sheet:名称*+排序"]
C1 --> C2["POST /api/category/create"]
C --> C3["编辑 → POST /api/category/update"]
C --> C4["删除 → 需确认(有商品则禁止)"]
C4 --> C5["POST /api/category/delete"]
style C fill:#DBEAFE,color:#1D4ED8
style D fill:#F3F4F6,color:#6B7280
往来单位管理 老板专属操作
graph TD
A["往来单位列表 partner/list"] --> B["顶部搜索 + 类型筛选Tab"]
B --> BIND["待绑定微信区域(金黄色卡片)"]
B --> LIST["已建档区域(头像+名称+类型+绑定状态)"]
LIST --> OP["操作栏(仅老板可见)"]
OP --> OP1["对账 → 往来对账页"]
OP --> OP2["分析 → 往来分析页"]
OP --> OP3["邀请绑定(未绑微信时)→ 生成绑定码"]
OP --> OP4["编辑 → Bottom Sheet"]
OP --> OP5["删除 → 确认弹窗"]
A --> ADD["底部双按钮"]
ADD --> ADD1["「添加单位」→ Sheet"]
ADD --> ADD2["「新单位扫码绑定」→ Sheet"]
ADD1 --> MODE{模式切换}
MODE -->|先建档| M1["名称*+类型*+手机+联系人"]
MODE -->|建档+出码| M2["名称*+类型*+手机*(必填)+联系人"]
M1 --> M1a["POST /api/partner/create"]
M2 --> M2a["POST /api/partner/create_bind"]
M2a --> M2b["显示绑定码 + 3秒轮询检测"]
style A fill:#F3F4F6,color:#374151
期初录入 仅老板
graph TD
A["期初录入 opening/index"] --> B["三个Tab"]
B --> T1["Tab 期初应收"]
B --> T2["Tab 期初应付"]
B --> T3["Tab 期初库存"]
T1 --> T1a["选择客户"]
T1a --> T1b["实时加载对账预览"]
T1b --> T1c["输入金额 → POST /api/opening/receivable"]
T1 --> T1d["已录入列表:可修改金额/可作废"]
T2 --> T2a["选择供应商"]
T2a --> T2b["输入金额 → POST /api/opening/payable"]
T3 --> T3a["选择商品"]
T3a --> T3b["输入数量 → POST /api/opening/stock"]
style A fill:#F3F4F6,color:#374151
期初录入影响:
① 期初应收 → 对账中该客户初始应收余额,公式:期末 = 期初应收 + 已确认出货 − 已收款
② 期初应付 → 对账中该供应商初始应付余额,公式:期末 = 期初应付 + 已确认进货 − 已付款
③ 期初库存 → 库存列表初始数量 + 库存流水新增期初记录(type=6)
④ 已核销的期初记录不可作废(弹出提示)
① 期初应收 → 对账中该客户初始应收余额,公式:期末 = 期初应收 + 已确认出货 − 已收款
② 期初应付 → 对账中该供应商初始应付余额,公式:期末 = 期初应付 + 已确认进货 − 已付款
③ 期初库存 → 库存列表初始数量 + 库存流水新增期初记录(type=6)
④ 已核销的期初记录不可作废(弹出提示)
对账页面 所有角色可见
graph TD
A["对账 reconciliation/index"] --> B{是合伙人?}
B -->|是| C["自动选中自身 → 直接进入详情"]
B -->|否| D["阶段1:搜索+选择往来单位"]
D --> E["阶段2:对账详情"]
C --> E
E --> F["PeriodFilterBar 周期筛选"]
F --> G["并行加载5个API"]
G --> G1["统计卡片(出货/进货+已收/已付+余额)"]
G --> G2["进出货金额趋势图"]
G --> G3["收付款趋势图"]
G --> G4["商品排行榜"]
G --> G5["应收/应付公式卡片"]
E --> REC["往来明细列表"]
REC --> R1["点击出货记录 → sales/detail"]
REC --> R2["点击进货记录 → purchase/detail"]
REC --> R3["点击收付款 → payment/detail"]
E --> BTN["底部操作栏(仅商家端)"]
BTN --> BTN1["去收款 → 新建收款"]
BTN --> BTN2["去付款 → 新建付款"]
style A fill:#F3F4F6,color:#374151
对账余额公式:
供应商应付 = 期初应付 + 已确认进货 − 已付款
客户应收 = 期初应收 + 已确认出货 − 已收款
合伙人模式视角翻转:应收↔应付、已收↔已付、出货↔进货 标签互换
供应商应付 = 期初应付 + 已确认进货 − 已付款
客户应收 = 期初应收 + 已确认出货 − 已收款
合伙人模式视角翻转:应收↔应付、已收↔已付、出货↔进货 标签互换