一、系统架构设计:分层与模块化
审批工单系统的核心架构需遵循高内聚低耦合原则,推荐采用经典的三层架构:表现层(Spring MVC)、业务逻辑层(Service)、数据访问层(DAO)。表现层负责接收HTTP请求并返回JSON/XML响应,业务逻辑层处理审批规则、状态流转等核心逻辑,数据访问层通过MyBatis或JPA实现数据库操作。
模块化设计方面,建议将系统拆分为四大核心模块:
- 工单管理模块:处理工单的创建、查询、修改、删除等基础操作
- 审批流程模块:定义审批节点、流转规则、条件判断等流程配置
- 权限控制模块:基于RBAC模型实现角色、权限、用户的三级管理
- 通知模块:集成邮件、短信、站内信等通知方式
技术选型上,Spring Boot作为基础框架可快速搭建项目,结合Spring Security实现安全控制,使用Redis缓存频繁访问的审批流程数据。对于分布式场景,可引入Spring Cloud Alibaba实现服务治理。
二、审批流程建模:状态机与规则引擎
审批流程的核心是状态机设计,典型工单状态包括:草稿、待审批、审批中、已通过、已拒绝、已撤回。状态转换需定义明确的触发条件,例如:
- 草稿→待审批:提交操作触发
- 待审批→审批中:第一个审批人处理时触发
- 审批中→已通过:所有审批人通过时触发
规则引擎的实现可采用两种方式:
- 硬编码方式:适合简单固定流程,通过if-else判断流转
public class ApprovalFlowEngine {public String process(ApprovalContext context) {if (context.getCurrentState().equals("DRAFT") && context.getAction().equals("SUBMIT")) {return "PENDING_APPROVAL";}// 其他状态转换逻辑...}}
- 动态规则引擎:适合复杂多变流程,通过XML/JSON配置流程
{"flowId": "leave_approval","nodes": [{"id": "n1", "type": "start", "next": "n2"},{"id": "n2", "type": "approver", "role": "manager", "next": "n3"},{"id": "n3", "type": "approver", "role": "hr", "next": "end"}]}
三、数据库设计:关系模型与优化
核心表结构应包含:
- 工单表(work_order):id、title、content、creator、create_time等字段
- 审批流程表(approval_flow):id、name、description、version等字段
- 审批节点表(approval_node):id、flow_id、node_type、approver_role等字段
- 审批记录表(approval_record):id、order_id、node_id、approver、action等字段
索引优化方面,应在工单表的creator、status字段,审批记录表的order_id、node_id字段建立复合索引。对于高频查询的审批流程,可采用Redis缓存流程配置,设置5分钟过期时间。
四、核心功能实现:关键代码解析
1. 工单创建接口
@RestController@RequestMapping("/api/work-order")public class WorkOrderController {@Autowiredprivate WorkOrderService workOrderService;@PostMappingpublic ResponseEntity<WorkOrderDTO> create(@RequestBody WorkOrderCreateDTO dto) {// 参数校验if (StringUtils.isEmpty(dto.getTitle())) {throw new IllegalArgumentException("标题不能为空");}// 业务逻辑处理WorkOrder workOrder = new WorkOrder();workOrder.setTitle(dto.getTitle());workOrder.setContent(dto.getContent());workOrder.setCreator(SecurityUtils.getCurrentUsername());workOrder.setStatus("DRAFT");// 保存到数据库WorkOrder saved = workOrderService.save(workOrder);// 返回结果return ResponseEntity.ok(WorkOrderConverter.toDTO(saved));}}
2. 审批处理接口
@Servicepublic class ApprovalServiceImpl implements ApprovalService {@Autowiredprivate WorkOrderRepository workOrderRepository;@Autowiredprivate ApprovalRecordRepository approvalRecordRepository;@Transactionalpublic ApprovalResult approve(Long orderId, String action, String comment) {// 查询工单WorkOrder order = workOrderRepository.findById(orderId).orElseThrow(() -> new RuntimeException("工单不存在"));// 验证状态if (!"PENDING_APPROVAL".equals(order.getStatus())) {throw new IllegalStateException("当前状态不允许审批");}// 记录审批操作ApprovalRecord record = new ApprovalRecord();record.setOrderId(orderId);record.setApprover(SecurityUtils.getCurrentUsername());record.setAction(action);record.setComment(comment);record.setCreateTime(LocalDateTime.now());approvalRecordRepository.save(record);// 更新工单状态String newStatus;if ("APPROVE".equals(action)) {newStatus = checkAllApproved(orderId) ? "APPROVED" : "APPROVING";} else {newStatus = "REJECTED";}order.setStatus(newStatus);workOrderRepository.save(order);return new ApprovalResult(orderId, newStatus);}private boolean checkAllApproved(Long orderId) {// 实现检查所有审批人是否已通过的逻辑// ...}}
五、扩展性优化:高级功能实现
1. 并行审批实现
对于需要多人同时审批的场景,可采用以下方案:
public class ParallelApprovalStrategy implements ApprovalStrategy {@Overridepublic boolean isCompleted(Long orderId) {List<ApprovalNode> nodes = approvalNodeRepository.findByOrderId(orderId);long approvedCount = approvalRecordRepository.countByOrderIdAndAction(orderId, "APPROVE");return approvedCount >= nodes.stream().filter(n -> n.getNodeType().equals("PARALLEL")).count();}}
2. 审批超时处理
通过Spring的@Scheduled注解实现定时检查:
@Componentpublic class ApprovalTimeoutScheduler {@Autowiredprivate WorkOrderService workOrderService;@Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次public void checkTimeout() {List<WorkOrder> timeoutOrders = workOrderService.findTimeoutOrders();timeoutOrders.forEach(order -> {order.setStatus("TIMEOUT");workOrderService.update(order);// 发送超时通知});}}
六、部署与运维建议
- 环境隔离:开发、测试、生产环境严格分离,使用不同的数据库和配置文件
- 日志管理:通过Logback实现分级日志,关键操作记录审计日志
- 监控告警:集成Prometheus+Grafana监控系统指标,设置异常状态告警
- 备份策略:每日全量备份,每小时增量备份,保留30天历史数据
七、最佳实践总结
- 流程配置化:将审批流程配置存储在数据库或配置文件中,避免硬编码
- 状态一致性:采用事务管理确保状态变更和记录保存的原子性
- 性能优化:对高频查询使用缓存,对复杂计算采用异步处理
- 安全加固:实现操作日志、数据加密、防SQL注入等安全措施
通过以上架构设计和实现方案,可构建出稳定、高效、可扩展的Java审批工单系统。实际开发中应根据具体业务需求调整流程设计和功能实现,持续优化系统性能和用户体验。