1. 项目背景与核心需求
胶州作为山东半岛重要的商贸集散地,酒水批发行业具有明显的区域集群特征。当地酒水供应商普遍面临客户信息分散、订单跟踪困难、促销活动触达率低等痛点。传统的手工记账或Excel管理方式已无法满足日均200+订单的业务规模,急需一套轻量化的移动端客户关系管理解决方案。
经过对当地12家酒水批发商的实地调研,我们发现以下核心需求:
- 客户分级管理(批发商/零售商/终端客户)
- 扫码快速建档(减少手工输入错误)
- 促销活动精准推送(基于消费频次和金额)
- 账期管理(30/60/90天不同结算周期)
- 移动开单(支持离线模式应对仓库网络不稳定)
2. 技术架构设计
2.1 整体技术栈选型
采用SpringBoot 2.7 + Uni-app + MySQL 8.0组合,主要考虑因素:
- 开发效率:SpringBoot的自动配置特性可快速搭建RESTful API
- 跨平台兼容:Uni-app编译生成微信小程序代码,后续可扩展H5版本
- 数据安全:MySQL的RBAC权限控制满足多角色访问需求
- 成本控制:全部使用开源技术栈,避免商业软件授权费用
技术架构图:
[小程序端] -- HTTPS --> [SpringBoot API] -- JPA --> [MySQL] ↑ ↑ JWT认证 Spring Security2.2 数据库关键设计
客户表核心字段示例:
CREATE TABLE `customer` ( `id` bigint NOT NULL AUTO_INCREMENT, `qr_code` varchar(32) COMMENT '扫码生成的唯一标识', `type` tinyint NOT NULL COMMENT '1-批发商 2-零售商 3-终端', `credit_line` decimal(10,2) DEFAULT 0, `payment_terms` tinyint DEFAULT 30 COMMENT '账期天数', `location` point NOT NULL COMMENT 'GIS坐标', PRIMARY KEY (`id`), SPATIAL KEY `idx_location` (`location`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;特别注意:point类型字段需MySQL 5.7+版本支持,用于后续LBS营销功能扩展
3. 核心功能实现
3.1 客户二维码管理
采用ZXing库生成包含客户ID的QR Code,实现:
- 小程序端扫码自动填充客户基础信息
- 仓库人员快速核对出货单
- 地推人员现场登记时防重复录入
关键代码片段:
@GetMapping("/qrcode/{customerId}") public void generateQRCode(HttpServletResponse response, @PathVariable Long customerId) { String content = "cust://" + customerId + "?v=" + DigestUtils.md5Hex(customerId + salt); QRCodeWriter.writeToStream(content, 300, 300, "PNG", response.getOutputStream()); }3.2 账期预警功能
通过Spring Schedule定时任务,每日凌晨统计即将到期账款:
@Scheduled(cron = "0 0 3 * * ?") public void checkPaymentDue() { LocalDate warningDate = LocalDate.now().plusDays(3); List<Order> orders = orderRepository.findByPaymentDueDateBetween( LocalDate.now(), warningDate ); orders.forEach(order -> { String openid = customerService.getOpenid(order.getCustomerId()); wxPushService.sendTemplateMsg(openid, "您的订单即将到期", ...); }); }4. 性能优化实践
4.1 小程序端缓存策略
- 首次加载全量客户列表(最多500条)
- 后续更新采用增量同步(lastUpdateTime过滤)
- 本地SQLite存储关键数据支持离线操作
4.2 服务端响应优化
实测对比效果:
| 优化措施 | 平均响应时间(ms) | QPS |
|---|---|---|
| 原生JPA | 320 | 45 |
| 增加二级缓存 | 180 | 78 |
| 启用Gzip压缩 | 150 | 105 |
| SQL语句优化后 | 90 | 132 |
5. 典型问题解决方案
5.1 微信小程序审核驳回
问题:首次提交因"虚拟支付"被拒 解决方案:
- 移除"预存金额"功能入口
- 将"账期结算"改为线下流程说明
- 增加明显的"本小程序不直接处理资金"提示
5.2 高并发下单冲突
场景:促销活动期间出现超卖 处理方案:
@Transactional public OrderResult createOrder(OrderDTO dto) { // 使用SELECT...FOR UPDATE加锁 Product product = productRepository.findLockById(dto.getProductId()); if (product.getStock() < dto.getQuantity()) { throw new BusinessException("库存不足"); } // 扣减库存 productRepository.reduceStock(dto.getProductId(), dto.getQuantity()); // 创建订单记录 return orderRepository.save(dto.toOrder()); }6. 部署实施要点
6.1 服务器配置建议
- 最低配置:2核4G(实测支持50并发)
- 推荐配置:4核8G(带Redis缓存)
- 必须设置:JVM参数-Xmx不要超过物理内存70%
6.2 微信小程序配置
- 域名备案(必须HTTPS)
- 业务域名设置(包含图片存储域名)
- 消息模板ID申请(至少需要3个模板)
在胶州某酒水批发商的实际运行数据显示,系统上线后:
- 客户信息录入时间减少65%
- 订单错误率下降82%
- 促销活动参与率提升3倍 这套方案特别适合年营业额在500-2000万的中小型酒水批发企业,后续可扩展供应商管理模块实现全链路数字化。