在传统洗衣行业向数字化管理转型的背景下,一套高效稳定的业务管理系统成为提升运营效率的关键。洗衣管家系统采用经典的SSH(Struts2+Spring+Hibernate)技术栈构建,为中小型洗衣店提供全方位的数字化解决方案。系统通过模块化设计实现了洗衣服务流程管理、库存控制、财务统计和多角色协同作业等核心功能。
系统架构与技术栈选型
系统采用典型的三层架构模式,各层之间通过接口松散耦合。表现层使用Struts2框架处理用户请求和页面跳转,通过配置struts.xml文件定义Action映射关系。业务逻辑层由Spring框架管理,通过IoC容器实现依赖注入,使用声明式事务管理保证数据一致性。持久层基于Hibernate实现ORM映射,通过HQL语言和Criteria API完成数据访问操作。
Spring配置文件中定义了数据源和事务管理器的Bean配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/laundry_db"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
数据库设计解析
系统数据库包含10个核心表,采用InnoDB存储引擎确保事务完整性。订单表(laundry_order)的设计体现了业务核心逻辑:
CREATE TABLE laundry_order (
order_id VARCHAR(32) PRIMARY KEY,
customer_id INT NOT NULL,
employee_id INT,
product_type_id INT NOT NULL,
order_status ENUM('pending','washing','drying','finished') DEFAULT 'pending',
total_amount DECIMAL(10,2),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expected_finish_time TIMESTAMP,
actual_finish_time TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (employee_id) REFERENCES employee(employee_id),
FOREIGN KEY (product_type_id) REFERENCES product_type(type_id),
INDEX idx_status (order_status),
INDEX idx_customer (customer_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
库存表(inventory)的设计支持实时库存追踪和预警机制:
CREATE TABLE inventory (
inventory_id INT AUTO_INCREMENT PRIMARY KEY,
product_type_id INT NOT NULL,
current_stock INT DEFAULT 0,
min_stock_level INT DEFAULT 10,
last_restock_date DATE,
FOREIGN KEY (product_type_id) REFERENCES product_type(type_id),
INDEX idx_product (product_type_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
核心功能模块实现
1. 多角色权限管理系统
系统采用基于角色的访问控制(RBAC)模型,通过用户表(user)、角色表(role)和权限表(permission)的三元关系实现细粒度权限控制。用户登录时,系统通过Spring Security进行身份认证和授权:
public class UserAction extends ActionSupport {
private UserService userService;
private String username;
private String password;
public String login() {
User user = userService.authenticate(username, password);
if (user != null) {
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("currentUser", user);
session.put("userRole", user.getRole().getRoleName());
return SUCCESS;
}
addActionError("用户名或密码错误");
return ERROR;
}
// Getter和Setter方法
public void setUserService(UserService userService) {
this.userService = userService;
}
}

2. 洗衣订单全生命周期管理
订单管理模块实现了从接单、洗涤、烘干到完成的完整流程跟踪。OrderService类封装了核心业务逻辑:
@Service
@Transactional
public class OrderService {
@Autowired
private OrderDAO orderDAO;
@Autowired
private InventoryService inventoryService;
public String createOrder(OrderDTO orderDTO) {
// 检查库存可用性
if (!inventoryService.checkStockSufficient(orderDTO.getProductTypeId(),
orderDTO.getQuantity())) {
throw new InsufficientStockException("库存不足");
}
LaundryOrder order = new LaundryOrder();
BeanUtils.copyProperties(orderDTO, order);
order.setOrderId(generateOrderId());
order.setCreateTime(new Date());
order.setOrderStatus(OrderStatus.PENDING);
// 扣减库存
inventoryService.deductStock(orderDTO.getProductTypeId(),
orderDTO.getQuantity());
return orderDAO.save(order);
}
public void updateOrderStatus(String orderId, OrderStatus newStatus) {
LaundryOrder order = orderDAO.findById(orderId);
order.setOrderStatus(newStatus);
if (newStatus == OrderStatus.FINISHED) {
order.setActualFinishTime(new Date());
}
orderDAO.update(order);
}
}

3. 智能库存预警与补货系统
库存管理模块通过实时监控库存水平,自动触发补货预警。InventoryDAO使用Hibernate实现复杂的库存查询:
@Repository
public class InventoryDAOImpl extends HibernateDaoSupport implements InventoryDAO {
public List<Inventory> findLowStockItems() {
String hql = "FROM Inventory i WHERE i.currentStock < i.minStockLevel";
return getHibernateTemplate().find(hql);
}
public void updateStock(Integer productTypeId, Integer quantity) {
String hql = "UPDATE Inventory SET currentStock = currentStock + ? " +
"WHERE productTypeId = ?";
getHibernateTemplate().bulkUpdate(hql, quantity, productTypeId);
}
@Transactional
public boolean deductStock(Integer productTypeId, Integer quantity) {
Inventory inventory = findById(productTypeId);
if (inventory.getCurrentStock() >= quantity) {
inventory.setCurrentStock(inventory.getCurrentStock() - quantity);
getHibernateTemplate().update(inventory);
return true;
}
return false;
}
}

4. 财务统计与报表生成
财务模块通过Hibernate的投影查询和聚合函数实现数据统计:
public class FinanceService {
public FinancialReport generateDailyReport(Date reportDate) {
String hql = "SELECT new FinancialReport(SUM(o.totalAmount), COUNT(o.orderId), " +
"AVG(o.totalAmount)) FROM LaundryOrder o " +
"WHERE DATE(o.createTime) = DATE(:reportDate) " +
"AND o.orderStatus = 'FINISHED'";
Query query = getSession().createQuery(hql);
query.setParameter("reportDate", reportDate);
return (FinancialReport) query.uniqueResult();
}
public List<RevenueTrend> getRevenueTrend(Date startDate, Date endDate) {
String hql = "SELECT new RevenueTrend(DATE(o.createTime), SUM(o.totalAmount)) " +
"FROM LaundryOrder o " +
"WHERE o.createTime BETWEEN :startDate AND :endDate " +
"GROUP BY DATE(o.createTime) " +
"ORDER BY DATE(o.createTime)";
Query query = getSession().createQuery(hql);
query.setParameter("startDate", startDate);
query.setParameter("endDate", endDate);
return query.list();
}
}

实体模型设计
系统实体模型采用贫血模型设计,每个实体类对应数据库中的一张表。LaundryOrder实体类展示了Hibernate注解的运用:
@Entity
@Table(name = "laundry_order")
public class LaundryOrder implements Serializable {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "order_id", length = 32)
private String orderId;
@ManyToOne
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
@ManyToOne
@JoinColumn(name = "employee_id")
private Employee employee;
@ManyToOne
@JoinColumn(name = "product_type_id", nullable = false)
private ProductType productType;
@Enumerated(EnumType.STRING)
@Column(name = "order_status", length = 20)
private OrderStatus orderStatus;
@Column(name = "total_amount", precision = 10, scale = 2)
private BigDecimal totalAmount;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_time")
private Date createTime;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "expected_finish_time")
private Date expectedFinishTime;
// Getter和Setter方法
public String getOrderId() { return orderId; }
public void setOrderId(String orderId) { this.orderId = orderId; }
public OrderStatus getOrderStatus() { return orderStatus; }
public void setOrderStatus(OrderStatus orderStatus) {
this.orderStatus = orderStatus;
}
}
性能优化策略
系统在数据访问层实现了二级缓存机制,通过Ehcache提升查询性能:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</prop>
</props>
</property>
</bean>
对于高频查询操作,使用Hibernate的查询缓存:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ProductType implements Serializable {
// 实体类定义
}
public List<ProductType> getAllProductTypes() {
String hql = "FROM ProductType";
Query query = getSession().createQuery(hql);
query.setCacheable(true);
return query.list();
}
系统安全机制
系统通过Struts2拦截器实现访问控制,确保只有授权用户才能访问相应功能:
public class AuthorizationInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Map<String, Object> session = invocation.getInvocationContext().getSession();
User currentUser = (User) session.get("currentUser");
if (currentUser == null) {
return "login";
}
// 检查用户权限
String actionName = invocation.getProxy().getActionName();
if (!hasPermission(currentUser, actionName)) {
return "unauthorized";
}
return invocation.invoke();
}
private boolean hasPermission(User user, String actionName) {
// 实现权限检查逻辑
return user.getRole().getPermissions()
.stream()
.anyMatch(p -> p.getActionName().equals(actionName));
}
}
未来优化方向
移动端支持:开发基于React Native的跨平台移动应用,实现订单进度推送和在线支付功能。通过RESTful API与现有系统集成,使用JWT令牌进行身份认证。
物联网集成:对接智能洗衣设备,实时获取设备运行状态和能耗数据。通过MQTT协议实现设备数据采集,建立设备预测性维护模型。
大数据分析:引入Apache Spark进行客户行为分析和业务预测。建立RFM客户价值模型,实现个性化营销推荐。
微服务架构改造:将单体应用拆分为订单服务、库存服务、用户服务等微服务。使用Spring Cloud实现服务注册发现和配置管理。
自动化工作流:集成Activiti工作流引擎,实现洗衣流程的自动化调度和异常处理。建立智能排班系统优化人力资源分配。
系统通过严谨的架构设计和细致的功能实现,为洗衣行业提供了完整的数字化解决方案。SSH框架的稳定性和成熟度保证了系统的可靠运行,而模块化的设计为后续功能扩展奠定了良好基础。