好库管 (GoodKeeper) 小程序测试流程图

分端 · 分角色 · 分功能 — 完整测试路径参考

📋 系统角色 & 页面总览
好库管共 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 已成功绑定」)
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 已成功绑定」
商户老板功能流程
老板拥有所有权限,包括员工管理、审批作废、经营分析、期初录入等
老板首页 & 导航全景 老板
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」
⑤ 老板点击进入详情 →「通过」或「驳回」
⑥ 通过 → 正式作废,数据回滚;驳回 → 恢复正常状态
供应商视角流程
供应商 = 往来单位 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),尚未入库
③ 此时不影响库存、不影响往来余额
进货单确认入库 关键操作 — 状态流转 & 数据联动
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:进货金额/进货笔数更新
供应商端:出货单详情可查看收款进度
进货单取消 草稿状态可取消
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 → 提示「库存不足」
出货单确认出库 关键操作 — 需校验库存
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:出货金额/出货笔数更新
客户端:进货单详情可查看付款进度
注意:如果库存不足,后端返回错误,无法出库
💰 收付款完整流程
收款 = 客户付钱给商家(应收减少) | 付款 = 商家付钱给供应商(应付减少)
收付款创建(单页表单) 老板/员工
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:收付款金额更新
进出货详情:付款状态和已收/已付金额更新
收付款作废流程 老板直接作废 / 员工需审批
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)
③ 收付款列表中该记录标记为「已作废」,金额加删除线
🏪 库存 & 基础数据管理
库存管理、商品管理、分类管理、往来单位管理、期初录入、对账
库存管理流程 老板/员工
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)
③ 不影响往来余额(非进销存单据)
商品管理 老板增删改 / 员工只读
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)
④ 已核销的期初记录不可作废(弹出提示)
对账页面 所有角色可见
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
对账余额公式:
供应商应付 = 期初应付 + 已确认进货 − 已付款
客户应收 = 期初应收 + 已确认出货 − 已收款
合伙人模式视角翻转:应收↔应付、已收↔已付、出货↔进货 标签互换
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-01 12:43:11 HTTP/2.0 GET : https://apitest.goodkeeper.yigeyunerp.com/
  2. 运行时间 : 0.064017s [ 吞吐率:15.62req/s ] 内存消耗:2,411.07kb 文件加载:107
  3. 缓存信息 : 0 reads,0 writes
  1. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/public/index.php ( 0.79 KB )
  2. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/autoload.php ( 0.75 KB )
  3. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/composer/autoload_real.php ( 1.63 KB )
  4. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/composer/ClassLoader.php ( 15.99 KB )
  6. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/composer/autoload_static.php ( 5.24 KB )
  7. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.60 KB )
  17. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/symfony/var-dumper/VarDumper.php ( 3.96 KB )
  19. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/App.php ( 15.00 KB )
  20. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-container/src/Container.php ( 15.62 KB )
  21. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  23. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  24. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  25. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  26. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  27. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/app.php ( 0.95 KB )
  28. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/cache.php ( 0.78 KB )
  29. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/console.php ( 0.23 KB )
  30. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/cookie.php ( 0.56 KB )
  31. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/database.php ( 2.13 KB )
  32. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  33. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/filesystem.php ( 0.67 KB )
  34. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/lang.php ( 0.91 KB )
  35. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/log.php ( 1.35 KB )
  36. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/middleware.php ( 0.30 KB )
  37. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/oss.php ( 0.87 KB )
  38. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/route.php ( 1.88 KB )
  39. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/session.php ( 0.57 KB )
  40. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/trace.php ( 0.34 KB )
  41. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/config/view.php ( 0.82 KB )
  42. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  43. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  44. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  46. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  47. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/services.php ( 0.18 KB )
  48. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  49. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  50. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  51. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/service/ModelService.php ( 1.75 KB )
  52. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-multi-app/src/Service.php ( 1.08 KB )
  53. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  54. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  55. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  56. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  57. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  58. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  59. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  60. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  61. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  62. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  63. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  64. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  65. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  66. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  67. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  68. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  69. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  70. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  71. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  72. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  73. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/psr/log/src/LoggerInterface.php ( 2.68 KB )
  74. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  75. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  76. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  77. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  78. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  79. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  80. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Console.php ( 22.81 KB )
  81. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Request.php ( 55.74 KB )
  82. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  83. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  84. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-multi-app/src/MultiApp.php ( 7.06 KB )
  85. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/app/index/common.php ( 0.03 KB )
  86. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/app/index/event.php ( 0.25 KB )
  87. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/app/index/middleware.php ( 0.26 KB )
  88. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/app/index/provider.php ( 0.20 KB )
  89. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Route.php ( 23.56 KB )
  90. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.34 KB )
  91. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/route/Domain.php ( 1.25 KB )
  92. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 20.45 KB )
  93. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.35 KB )
  94. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  95. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 3.75 KB )
  96. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.54 KB )
  97. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/app/index/controller/Index.php ( 0.89 KB )
  98. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/app/index/BaseController.php ( 2.05 KB )
  99. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/app/index/Request.php ( 0.09 KB )
  100. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/facade/App.php ( 2.73 KB )
  101. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  102. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/response/Html.php ( 0.97 KB )
  103. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  104. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  105. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/log/driver/File.php ( 6.19 KB )
  106. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  107. /www/wwwroot/apitest.goodkeeper.yigeyunerp.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.88 KB )
0.065838s