配送补给
云桥门店 · 杭州
库存预计可用 12 天
2 类耗材接近安全库存,请及时补货
一个小程序承载客户下单、库存消耗预测、商家经营管理和配送履约;配套 React PC 管理后台,后端采用 Spring Boot + MyBatis + Redis + MySQL。
首期目标不是做一个复杂平台,而是把“客户持续消耗 → 预测见底 → 商家接单 → 商家配送 → 结算与统计”跑通。配送员是可选角色,没有配送员时由商家直接完成履约。
一套代码覆盖微信小程序,并保留 H5 扩展能力。
桌面端适合订单表格、报表导出和权限配置。
模块化单体起步,后续可拆分,不提前引入微服务复杂度。
MySQL 做事实数据,Redis 做缓存、幂等、提醒任务和限流。
建议采用“模块化单体 + 清晰领域边界”。早期部署和排错简单,业务量上升后可以按模块拆分服务。
认证与权限 · 客户与商家 · 商品库存 · 订单支付 · 配送履约 · 消耗预测 · 统计报表
REST + SSE 可选微信原生风格的可交互原型。选择角色后,可通过左侧页面目录或手机底部 TabBar 浏览完整工作区。
每条流程都必须有可追踪状态、操作人和审计记录,避免只改一个“已完成”字段导致无法对账。
所有业务表建议带 `tenant_id`,即使首期只有一个商家,也为后续多商家隔离预留。金额使用分为单位,数量使用高精度 decimal。
| 表 | 关键字段 | 用途 | 重要约束 |
|---|---|---|---|
| tenant | id, name, status, settlement_config | 商家/组织租户 | 所有商家数据按 tenant_id 隔离 |
| user / user_role | id, openid, mobile, role, tenant_id | 微信用户与 RBAC | customer 可跨组织;merchant_staff 绑定租户 |
| customer_profile | id, user_id, customer_type, credit_limit, settlement_type | 个人/企业客户档案 | customer_type: PERSONAL / BUSINESS |
| product_category / product | category_id, sku, name, unit, price, safety_days | 品类、商品、价格、安全线 | 订单保存商品和价格快照 |
| customer_inventory | customer_id, product_id, quantity, counted_at | 客户当前库存盘点 | 唯一键 customer_id + product_id |
| consumption_record | customer_id, product_id, quantity, source, recorded_at | 手动/订单/导入消耗 | source 区分 MANUAL、DELIVERY、IMPORT |
| sales_order / sales_order_item | order_no, customer_id, status, payment_status, total_amount | 订单主表和明细 | 状态只允许状态机迁移;金额不可直接覆盖 |
| payment / settlement_bill | payment_no, method, amount, paid_at, due_at | 线上支付、货到付款、月结 | 支付回调幂等;月结必须生成账单 |
| delivery_task | order_id, assignee_id, assignee_type, status, signed_at | 配送任务与签收 | assignee_id 可为空;商家自配送使用 tenant_user |
| inventory_alert | customer_id, product_id, level, predicted_days, notified_at | 低库存提醒去重 | 同一客户商品 24 小时内不重复推送 |
| daily_stat | tenant_id, stat_date, orders, quantity, amount | 日汇总事实 | 月/季/年由日事实聚合,避免重复口径 |
接口按业务域分组,统一返回 request_id,错误码可被小程序和 React 后台分别翻译。前端只依赖接口契约,不直接依赖数据库字段。
| 接口 | 用途 | 权限 | 关键行为 |
|---|---|---|---|
| POST /api/v1/auth/wechat-login | 微信登录换取 token | 公开 | 服务端校验 code,签发 access_token + refresh_token |
| GET /api/v1/me/workspace | 返回当前角色工作区 | 登录用户 | 根据 role 返回客户/商家/配送员导航和待办数量 |
| POST /api/v1/orders | 创建订单 | 客户 | 重新计算价格、库存、可用支付方式,写订单快照 |
| POST /api/v1/orders/{id}/accept | 商家接单 | 商家 | 乐观锁防重复接单,生成备货任务 |
| POST /api/v1/orders/{id}/delivery/claim | 我来配送 | 商家/员工 | delivery_task.assignee_type = TENANT_USER |
| POST /api/v1/orders/{id}/delivery/assign | 分配履约人 | 商家 | 可分配员工或配送员;校验租户关系 |
| POST /api/v1/orders/{id}/sign | 签收并上传凭证 | 履约人 | 签收图片先入对象存储,成功后更新订单状态 |
| POST /api/v1/consumption-records | 提交手动消耗 | 客户 | 校验商品归属,记录来源和操作者 |
| GET /api/v1/inventory/forecast | 库存可用天数 | 客户/商家 | 缓存 5 分钟;返回预测值、依据和更新时间 |
| GET /api/v1/reports/overview | 经营统计 | 商家 | 按 range=daily|monthly|quarterly|yearly 聚合 |
| POST /api/v1/payments/wechat/notify | 微信支付回调 | 微信服务 | 验签、幂等、更新支付状态、投递订单事件 |
支付不强行统一。客户类型、商家授信和订单金额共同决定可用结算方式。
默认微信支付,下单后支付。支持支付超时取消、退款和支付凭证。
商家审核后授信,可选择货到付款或月结。每月生成对账单,支持部分核销。
授信余额不足不可提交月结订单;退款、取消、异常签收都需要操作记录。
| 客户类型 | 默认方式 | 可选方式 | 完成条件 |
|---|---|---|---|
| 个人 | 线上支付 | 商家配置的货到付款 | 线上支付回调成功,或商家确认现金收款 |
| 企业/门店 | 月结/货到付款 | 线上支付 | 授信订单签收后入账;账单核销后已结算 |
所有统计默认按商家租户隔离,时间以商家配置时区为准。金额按订单明细实际成交金额,不用商品当前价格回算历史。
按客户累计消耗数量或金额排序,可切换个人/企业。
订单明细金额按 SKU 聚合,商品改名不影响历史快照。
按实付金额 + 已确认月结金额统计,未确认账单单独标识。
customer:自己的订单、库存、消耗、地址;
merchant_owner:全部经营数据、支付配置;
merchant_staff:被授权订单、履约和客户;
delivery_staff:分配给自己的任务;
admin:租户和系统级配置。
低库存:客户 + 商家;订单状态:客户 + 当前履约人;支付回调:客户;月结到期:客户 + 商家财务;异常签收:商家 + 客户。通知失败写入重试队列。
JWT 短 token + refresh token;接口按租户隔离;支付回调验签;所有状态迁移写 order_event;敏感字段脱敏日志,签收图片走私有对象存储。
能登录、维护地址、浏览商品、选择个人线上支付或企业授信方式、查看订单状态、填写日消耗、看到预计可用天数并收到低库存提醒。
能维护商品和客户、接单、点击“我来配送”、分配员工、完成签收、处理异常、查看日/月/季/年统计和客户/商品排行。
支付回调重复不会重复记账;订单状态不能跳跃;取消订单不会计入配送统计;月结订单与已收款订单分开统计。
完成微信支付沙箱/正式配置、隐私和订阅消息审核、备份恢复演练、接口限流、日志审计、移动端和 PC 端权限测试。