
1. 项目概述这个中药实验管理系统是我去年为某中医药研究所开发的实际项目采用SpringBootVue的前后端分离架构完整实现了从药材入库到实验数据管理的全流程数字化。系统上线后帮助研究所将实验记录错误率降低了73%数据查询效率提升了5倍以上。传统中药实验管理普遍存在纸质记录易丢失、数据追溯困难、统计分析效率低下等问题。我们设计的这套系统特别针对中药实验的特殊性做了优化比如药材批次与实验数据的强关联、药性分析模板、复方配伍禁忌提醒等功能。2. 技术架构设计2.1 后端技术栈选型选择SpringBoot 2.7 MyBatis-Plus的组合主要基于以下考虑中药实验数据具有明显的层级关系药材→炮制→配伍→实验MyBatis-Plus的Lambda查询能优雅处理这种嵌套结构药材属性字段多变如产地、采收季节、炮制方法采用JSON字段存储配合MyBatis的类型处理器事务管理要求严格使用Transactional注解确保如药材出库-实验记录-库存更新的原子性数据库选用MySQL 8.0关键配置CREATE TABLE herb ( id bigint NOT NULL AUTO_INCREMENT, name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 药材名, attributes json DEFAULT NULL COMMENT 扩展属性, batch_no varchar(20) NOT NULL COMMENT 批次号, stock decimal(10,3) NOT NULL COMMENT 库存(克), PRIMARY KEY (id), UNIQUE KEY idx_batch (batch_no) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin;2.2 前端技术方案Vue 3 Element Plus的组合解决了以下痛点复杂表单场景实验记录涉及动态添加药材、剂量换算数据可视化药材使用趋势、实验成功率等图表展示权限细分不同角色研究员、审核员、管理员的界面差异化特别开发的几个自定义组件药材选择器支持拼音首字母检索剂量单位换算器克↔钱↔两配伍禁忌提示浮窗基于《中国药典》数据3. 核心功能实现3.1 药材生命周期管理从采购入库到实验消耗的全流程跟踪入库时生成唯一批次号规则药材拼音首字母年月序号库存采用总库存-已分配-已消耗三级状态实验申请时自动检查库存并发起审批流关键代码片段库存检查逻辑public boolean checkStock(Long herbId, BigDecimal requireAmount) { Herb herb herbMapper.selectById(herbId); BigDecimal available herb.getStock() .subtract(herb.getAllocatedAmount()) .subtract(herb.getLockedAmount()); return available.compareTo(requireAmount) 0; }3.2 实验数据建模采用实验-组别-样本三级结构{ expNo: ZY202305001, groups: [ { name: 对照组, samples: [ { herbId: 123, dosage: 5.0, processing: 酒炙 } ] } ] }3.3 智能提醒功能配伍禁忌检查基于规则引擎public class CompatibilityRule implements Rule { public boolean check(Herb h1, Herb h2) { return !十八反.equals(h1.getConflictWith(h2)); } }剂量超标预警根据药典标准实验流程时效提醒如煎煮时间倒计时4. 关键技术难点解决方案4.1 复杂事务处理典型场景实验审批通过后执行扣减库存生成实验记录更新仪器使用状态采用Spring事件机制解耦Transactional public void approveExperiment(Long expId) { // 1. 更新审批状态 experimentService.updateStatus(expId, APPROVED); // 2. 发布领域事件 eventPublisher.publishEvent(new ExperimentApprovedEvent(expId)); } EventListener Transactional(propagation REQUIRES_NEW) public void handleApprovedEvent(ExperimentApprovedEvent event) { // 执行后续操作 }4.2 大数据量导出实验数据导出涉及多表关联采用MyBatis的流式查询分页批量处理POI的SXSSFWorkbook优化前后对比数据量原方案优化后1万条12s3s10万条内存溢出28s4.3 前后端数据交互特殊处理药材剂量精度问题后端用BigDecimal前端用字符串传输实验时间处理统一UTC时间戳文件分块上传大附件采用webuploader5. 部署与性能优化5.1 服务器配置生产环境部署方案2核4G云服务器 × 2负载均衡Redis缓存药材基础数据Nginx静态资源托管关键JVM参数-Xms512m -Xmx1024m -XX:MaxMetaspaceSize256m5.2 性能优化措施药材列表缓存带版本号控制实验记录分表按年月分表慢SQL监控通过阿里云DMS优化效果API平均响应时间从320ms降至90ms99%的请求在200ms内完成6. 踩坑实录6.1 MyBatis类型处理器问题现象JSON字段更新时报类型转换异常 原因MyBatis默认的Jackson配置不兼容Java8新日期API 解决自定义类型处理器public class JsonTypeHandler extends BaseTypeHandlerObject { private static final ObjectMapper mapper new ObjectMapper() .registerModule(new JavaTimeModule()); // 实现省略... }6.2 Vue响应式丢失场景动态添加实验组时界面不更新 原因直接给数组索引赋值不触发响应 正确做法// 错误 this.groups[index] newGroup // 正确 this.$set(this.groups, index, newGroup)6.3 并发修改冲突现象多人同时修改实验记录导致数据覆盖 解决方案前端提交带版本号后端乐观锁控制UPDATE experiment SET version version 1 WHERE id #{id} AND version #{version}7. 扩展建议接入微信小程序现场实验数据录入增加药材图像识别功能基于OpenCV实验数据区块链存证使用蚂蚁链这个项目让我深刻体会到传统行业数字化过程中的特殊需求比如中药领域的剂量单位换算、配伍禁忌等业务规则都需要在技术方案中特别考虑。源码中我最满意的部分是配伍规则引擎的设计通过策略模式规则链实现了灵活的禁忌检查。