1. 项目概述:中药材进存销管理系统
这个基于SpringBoot的中药材进存销管理系统,是我去年为一家中药饮片企业开发的实战项目。系统从药材采购入库开始,覆盖库存管理、销售出库、财务对账等全业务流程,解决了传统中药企业手工记账效率低、库存不准、批次追溯难等痛点。
系统采用B/S架构,前端用Vue+ElementUI实现响应式界面,后端基于SpringBoot+MyBatis技术栈,数据库选用MySQL 8.0。特别针对中药行业特性,开发了药材属性管理(如产地、等级、炮制方法)、效期预警、配伍禁忌检查等特色功能。系统上线后,客户库存准确率从78%提升至99.6%,月均盘库时间从3天缩短到4小时。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块解析
2.1 采购管理模块
中药采购有其特殊性,我们设计了多维度的药材属性体系:
- 基础属性:品名、规格、产地(道地药材需特别标注)
- 质量属性:水分含量、杂质比例、外观性状
- 业务属性:采购单价(区分统货和选货)、供应商资质
采购单审批采用工作流引擎,支持根据金额自动路由:
- 5万元以下:部门经理审批
- 5-20万元:质量负责人会签
- 20万元以上:需要总经理终审
java复制// 采购单状态机配置示例
StateMachineConfigurer<PurchaseStatus, PurchaseEvent> configurer = ...
.withExternal()
.source(DRAFT).target(SUBMITTED)
.event(SUBMIT)
.and()
.withExternal()
.source(SUBMITTED).target(APPROVED)
.event(APPROVE)
.guard(purchaseAmountGuard());
2.2 库存管理特色实现
中药库存管理有三个技术难点:
- 计量单位复杂(公斤、克、包、把等)
- 需要支持单位换算(如1包=15克)
- 效期管理要求严格
我们的解决方案:
- 采用组合计量单位设计,基础单位统一为克
- 建立单位换算系数表,实现自动转换
- 开发效期看板,提前30天预警
sql复制-- 库存批次表设计
CREATE TABLE `herb_batch` (
`batch_id` VARCHAR(20) PRIMARY KEY,
`herb_id` INT NOT NULL,
`storage_unit` DECIMAL(12,3) COMMENT '入库单位数量',
`base_unit_amount` DECIMAL(12,3) COMMENT '换算为基础单位数量',
`product_date` DATE NOT NULL,
`expire_date` DATE NOT NULL,
`supplier_id` INT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.3 销售管理中的配伍禁忌检查
系统内置《中国药典》配伍禁忌规则库,在开销售订单时自动检查:
- 十八反药对检测(如甘草反甘遂)
- 十九畏药对检测(如硫黄畏朴硝)
- 妊娠禁忌药品提示
采用规则引擎实现实时校验:
java复制// 配伍禁忌规则示例
rule "十八反-甘草反甘遂"
when
$order : SalesOrder()
$item1 : OrderItem(herb.name contains "甘草") from $order.items
$item2 : OrderItem(herb.name contains "甘遂") from $order.items
then
throw new CompatibilityException("甘草与甘遂存在配伍禁忌");
end
3. 技术架构详解
3.1 SpringBoot定制化配置
针对中药行业特点做了多项定制:
- 日期处理:统一使用
yyyy-MM-dd格式 - 数字精度:金额保留4位小数,重量保留3位
- 异常处理:自定义
HerbBusinessException
yaml复制# 自定义配置示例
herb:
inventory:
expire-warning-days: 30
unit-conversion:
default-base-unit: g
rules:
- name: 包
to-base: 15.0
- name: 把
to-base: 10.0
3.2 多维度报表设计
中药企业常用的统计报表:
- 库存周转率报表(按药材品类)
- 供应商到货合格率统计
- 销售趋势分析(季节性波动明显)
采用动态SQL构建报表查询:
xml复制<!-- 动态报表查询示例 -->
<select id="selectInventoryTurnover" resultType="map">
SELECT
h.herb_name,
SUM(s.amount) AS total_sale,
AVG(i.quantity) AS avg_stock,
ROUND(SUM(s.amount)/AVG(i.quantity),2) AS turnover_rate
FROM
herb_info h
JOIN inventory i ON h.herb_id = i.herb_id
JOIN sales_detail s ON h.herb_id = s.herb_id
WHERE
1=1
<if test="beginDate != null">
AND s.sale_date >= #{beginDate}
</if>
<if test="endDate != null">
AND s.sale_date <= #{endDate}
</if>
GROUP BY
h.herb_name
</select>
4. 部署与运维实践
4.1 生产环境部署方案
推荐部署架构:
- 应用服务器:2台4核8G的ECS做集群
- 数据库:RDS MySQL 8.0 主从配置
- 文件存储:OSS存储药材图片和文档
Jenkins部署关键配置:
groovy复制pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Deploy') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'prod-server',
transfers: [
sshTransfer(
sourceFiles: 'target/herb-system.jar',
removePrefix: 'target',
remoteDirectory: '/app/herb',
execCommand: '''
cd /app/herb
./stop.sh
./start.sh
'''
)
]
)
]
)
}
}
}
}
4.2 常见问题排查指南
-
单位换算异常
- 检查
herb_unit_conversion表数据完整性 - 验证基础单位是否统一为克
- 检查
-
效期预警不触发
- 确认定时任务
HerbExpireJob是否启用 - 检查
herb_config表中预警天数配置
- 确认定时任务
-
配伍禁忌检查失效
- 查看Drools规则文件是否加载成功
- 验证药材别名匹配规则
5. 项目优化方向
在实际运行中,我们总结了几个优化点:
- 引入Elasticsearch实现药材多维度搜索(按功效、性味归经等)
- 开发微信小程序版,支持扫码快速入库
- 对接电子秤硬件,自动读取药材重量
- 增加GSP质量管理模块,满足认证要求
java复制// 药材搜索DSL示例
SearchRequest request = new SearchRequest("herb_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.multiMatchQuery("清热解毒",
"herb_name", "efficacy", "flavor"));
request.source(sourceBuilder);
这个项目让我深刻体会到,行业专用系统必须吃透业务细节。比如中药的"酒当归"和"当归"要作为不同品种管理,而"黄芪"和"北芪"又需要合并处理。只有深入行业,才能做出真正好用的系统。
