传统中医药领域长期面临着药方管理效率低下、信息标准化程度不足的挑战。纸质药方易损毁、手写记录易出错、历史数据检索困难等问题严重制约了中医药服务的质量与安全性。针对这些痛点,基于SSM框架的中药药方在线管理系统应运而生,该系统被命名为"智慧方剂数字化平台",实现了中医药方从采集、存储到应用的全流程数字化管理。
系统架构与技术栈
系统采用经典的三层架构模式,通过Spring、SpringMVC和MyBatis三大框架的有机整合,构建了高内聚、低耦合的现代化Web应用。
控制层设计基于SpringMVC框架,通过注解驱动的控制器简化了请求处理逻辑。以下代码展示了药方查询功能的控制器实现:
@Controller
@RequestMapping("/prescription")
public class PrescriptionController {
@Autowired
private PrescriptionService prescriptionService;
@RequestMapping(value = "/search", method = RequestMethod.GET)
@ResponseBody
public ResultDTO searchPrescriptions(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "category", required = false) String category,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
PrescriptionQuery query = new PrescriptionQuery();
query.setName(name);
query.setCategory(category);
query.setPageNum(pageNum);
query.setPageSize(10);
PageInfo<PrescriptionVO> pageInfo = prescriptionService.searchPrescriptions(query);
return ResultDTO.success(pageInfo);
}
}
服务层实现依托Spring的IoC容器进行依赖管理,通过声明式事务确保数据一致性:
@Service
@Transactional
public class PrescriptionServiceImpl implements PrescriptionService {
@Autowired
private PrescriptionMapper prescriptionMapper;
@Override
public PageInfo<PrescriptionVO> searchPrescriptions(PrescriptionQuery query) {
PageHelper.startPage(query.getPageNum(), query.getPageSize());
List<PrescriptionVO> list = prescriptionMapper.selectByCondition(query);
return new PageInfo<>(list);
}
}
数据持久层采用MyBatis框架,通过XML映射文件实现复杂的动态SQL查询:
<!-- 药方多条件查询映射 -->
<select id="selectByCondition" parameterType="PrescriptionQuery" resultMap="PrescriptionVOResultMap">
SELECT p.*, d.name as doctor_name, c.name as category_name
FROM prescription p
LEFT JOIN doctor d ON p.doctor_id = d.id
LEFT JOIN category c ON p.category_id = c.id
<where>
<if test="name != null and name != ''">
AND p.name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="category != null and category != ''">
AND c.name = #{category}
</if>
<if test="status != null">
AND p.status = #{status}
</if>
</where>
ORDER BY p.create_time DESC
</select>
前端采用JSP结合jQuery的技术组合,通过Ajax实现异步数据交互:
// 药方搜索功能前端实现
function searchPrescriptions() {
var formData = {
name: $('#nameInput').val(),
category: $('#categorySelect').val(),
pageNum: currentPage
};
$.ajax({
url: '/prescription/search',
type: 'GET',
data: formData,
success: function(result) {
if (result.success) {
renderPrescriptionList(result.data.list);
renderPagination(result.data);
}
}
});
}
数据库设计亮点分析
系统数据库包含7张核心表,其中药方主表(prescription)和药材信息表(herb)的设计体现了专业化的数据建模思路。
药方主表设计采用模块化结构,将药方基本信息、组成配方、用法用量等关键信息进行规范化存储:
CREATE TABLE prescription (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL COMMENT '方剂名称',
pinyin_name VARCHAR(150) COMMENT '拼音名称',
composition TEXT NOT NULL COMMENT '组成药材JSON格式',
dosage TEXT COMMENT '用法用量',
indications TEXT COMMENT '主治功能',
contraindications TEXT COMMENT '禁忌说明',
category_id INT COMMENT '方剂分类',
doctor_id BIGINT COMMENT '开方医师',
status TINYINT DEFAULT 1 COMMENT '状态:0-停用 1-启用',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_name (name),
KEY idx_category (category_id),
KEY idx_doctor (doctor_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药方主表';
药材信息表设计充分考虑中医药特性,包含性味、归经、功效等专业字段:
CREATE TABLE herb (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL COMMENT '药材名称',
latin_name VARCHAR(100) COMMENT '拉丁学名',
pinyin_name VARCHAR(100) COMMENT '拼音名称',
property VARCHAR(20) COMMENT '药性:寒、凉、平、温、热',
flavor VARCHAR(50) COMMENT '五味:辛、甘、酸、苦、咸',
meridian_tropism VARCHAR(100) COMMENT '归经',
efficacy TEXT COMMENT '功效说明',
dosage_range VARCHAR(100) COMMENT '常用剂量范围',
contraindication TEXT COMMENT '禁忌说明',
storage_condition VARCHAR(200) COMMENT '存储条件',
stock_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '库存数量',
unit VARCHAR(20) COMMENT '计量单位',
status TINYINT DEFAULT 1 COMMENT '状态',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_name (name),
KEY idx_property (property),
KEY idx_flavor (flavor)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药材信息表';
药方-药材关联表采用中间表设计,支持复杂的药材配伍关系管理:
CREATE TABLE prescription_herb (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
prescription_id BIGINT NOT NULL COMMENT '药方ID',
herb_id BIGINT NOT NULL COMMENT '药材ID',
dosage DECIMAL(8,2) NOT NULL COMMENT '用量',
unit VARCHAR(20) COMMENT '单位',
processing_method VARCHAR(100) COMMENT '炮制方法',
notes VARCHAR(200) COMMENT '备注说明',
sort_order INT DEFAULT 0 COMMENT '排序序号',
FOREIGN KEY (prescription_id) REFERENCES prescription(id),
FOREIGN KEY (herb_id) REFERENCES herb(id),
KEY idx_prescription (prescription_id),
KEY idx_herb (herb_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药方药材关联表';
核心功能深度解析
1. 智能药方检索系统
系统提供多维度药方检索功能,支持按方名、分类、药材组成等条件进行组合查询。检索算法采用倒排索引思想,通过数据库索引优化查询性能。

查询服务层实现了复杂查询条件的动态构建:
public class PrescriptionQueryBuilder {
public static String buildConditionSQL(PrescriptionQuery query) {
StringBuilder sql = new StringBuilder();
List<Object> params = new ArrayList<>();
if (StringUtils.isNotBlank(query.getName())) {
sql.append(" AND p.name LIKE ?");
params.add("%" + query.getName() + "%");
}
if (StringUtils.isNotBlank(query.getCategory())) {
sql.append(" AND c.name = ?");
params.add(query.getCategory());
}
if (query.getHerbList() != null && !query.getHerbList().isEmpty()) {
sql.append(" AND EXISTS (SELECT 1 FROM prescription_herb ph
WHERE ph.prescription_id = p.id AND ph.herb_id IN (");
// 动态生成IN语句参数占位符
String placeholders = String.join(",",
Collections.nCopies(query.getHerbList().size(), "?"));
sql.append(placeholders).append("))");
params.addAll(query.getHerbList());
}
return sql.toString();
}
}
2. 药材库存动态管理
系统实现实时库存监控和预警机制,通过事务控制确保库存数据的准确性。

库存更新服务采用悲观锁机制防止超卖:
@Service
public class InventoryServiceImpl implements InventoryService {
@Autowired
private HerbMapper herbMapper;
@Override
@Transactional
public boolean updateHerbStock(Long herbId, BigDecimal quantity, OperationType operation) {
// 通过SELECT FOR UPDATE锁定记录
Herb herb = herbMapper.selectForUpdate(herbId);
if (herb == null) {
throw new BusinessException("药材不存在");
}
BigDecimal newStock;
if (operation == OperationType.IN) {
newStock = herb.getStockQuantity().add(quantity);
} else {
if (herb.getStockQuantity().compareTo(quantity) < 0) {
throw new BusinessException("库存不足");
}
newStock = herb.getStockQuantity().subtract(quantity);
}
herb.setStockQuantity(newStock);
return herbMapper.updateStock(herb) > 0;
}
}
3. 多角色权限管理体系
系统设计了三类用户角色:医师、药房人员和管理员,各角色具有不同的操作权限和数据视图。

权限控制通过自定义注解和拦截器实现:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {
UserRole[] value();
}
@Component
public class RoleInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
RequireRole requireRole = handlerMethod.getMethodAnnotation(RequireRole.class);
if (requireRole != null) {
UserRole currentRole = getCurrentUserRole(request);
if (!Arrays.asList(requireRole.value()).contains(currentRole)) {
response.sendError(403, "权限不足");
return false;
}
}
return true;
}
}
4. 药方配伍智能校验
系统集成中医药理论知识,实现药方配伍的智能校验功能:
@Service
public class CompatibilityCheckService {
private static final Map<String, Set<String>> INCOMPATIBLE_HERBS =
loadIncompatibleHerbs();
public CompatibilityResult checkCompatibility(List<Long> herbIds) {
CompatibilityResult result = new CompatibilityResult();
// 检查十八反、十九畏等禁忌配伍
for (Long herbId : herbIds) {
Herb herb = herbMapper.selectById(herbId);
Set<String> incompatible = INCOMPATIBLE_HERBS.get(herb.getName());
if (incompatible != null) {
for (Long otherHerbId : herbIds) {
if (!herbId.equals(otherHerbId)) {
Herb otherHerb = herbMapper.selectById(otherHerbId);
if (incompatible.contains(otherHerb.getName())) {
result.addWarning(String.format(
"%s与%s存在配伍禁忌", herb.getName(), otherHerb.getName()));
}
}
}
}
}
return result;
}
}
实体模型设计
系统核心实体模型采用领域驱动设计思想,确保业务逻辑的完整性和一致性:
// 药方聚合根实体
public class Prescription {
private Long id;
private String name;
private String composition;
private List<PrescriptionHerb> herbs;
private PrescriptionCategory category;
private Doctor doctor;
private PrescriptionStatus status;
// 业务方法
public void addHerb(Herb herb, BigDecimal dosage, String unit) {
PrescriptionHerb prescriptionHerb = new PrescriptionHerb(this, herb, dosage, unit);
this.herbs.add(prescriptionHerb);
}
public BigDecimal calculateTotalCost() {
return herbs.stream()
.map(ph -> ph.getHerb().getPrice().multiply(ph.getDosage()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
// 值对象:药材用量
public class HerbDosage {
private final BigDecimal value;
private final String unit;
public HerbDosage(BigDecimal value, String unit) {
if (value.compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("用量必须大于0");
}
this.value = value;
this.unit = unit;
}
}
性能优化策略
系统在数据访问层实施了多重性能优化措施:
数据库连接池配置:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="5"/>
<property name="minIdle" value="5"/>
<property name="maxActive" value="20"/>
<property name="maxWait" value="60000"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
</bean>
MyBatis二级缓存配置:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
未来优化方向
智能推荐引擎:基于机器学习算法分析历史药方数据,构建药材配伍推荐模型,为医师开方提供智能辅助。可采用协同过滤算法实现相似方剂推荐。
移动端适配:开发响应式前端或独立移动应用,支持医师通过移动设备随时查阅药方和药材信息。可采用Vue.js + Vant UI构建移动端界面。
知识图谱集成:构建中医药知识图谱,将药材、方剂、病症等实体关系可视化,支持更复杂的语义查询。可基于Neo4j图数据库实现。
大数据分析平台:集成Hadoop/Spark大数据处理框架,对海量药方数据进行深度挖掘,发现用药规律和疗效关联性。
区块链存证:利用区块链技术对重要药方进行数字存证,确保处方的不可篡改性和溯源能力。可采用Hyperledger Fabric框架实现。
智慧方剂数字化平台通过系统化的架构设计和专业化的功能实现,为中医药行业提供了完整的数字化解决方案。系统不仅提升了药方管理效率,更重要的是通过技术手段保障了中医药服务的规范性和安全性,为中医药的现代化发展奠定了坚实的技术基础。随着人工智能、大数据等新技术的持续集成,该系统将在智慧医疗领域发挥更加重要的作用。