# SCMTracker **Repository Path**: zjnblll/scmtracker ## Basic Information - **Project Name**: SCMTracker - **Description**: 一个模拟型供应链平台,用于实时跟踪货物运输状态、处理异步事件通知(如货物状态更新或延误警报),并进行自动化监控。该系统强调事件驱动架构(Event-Driven Architecture),聚焦于性能优化和系统扩展性。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-06-05 - **Last Updated**: 2025-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 供应链管理跟踪系统 ## 介绍 供应链管理跟踪系统(Supply Chain Management Tracking System):一个模拟型供应链平台,用于实时跟踪货物运输状态、处理异步事件通知(如货物状态更新或延误警报),并进行自动化监控。该系统强调事件驱动架构(Event-Driven Architecture),聚焦于性能优化和系统扩展性。 ## 软件架构 - JDK 21 - SpringBoot 3(虚拟线程) ```mermaid graph LR subgraph "用户端" A["用户/客户端"] end subgraph "应用层" B["API 控制器"] C["服务层处理"] end subgraph "数据存储" D["数据库 MySQL"] end subgraph "消息处理" E["RabbitMQ 队列"] end A -->|"用户请求"| B B -->|"处理请求"| C C -->|"数据访问"| D C -->|"消息发送"| E E -->|"异步通知"| A D -->|"查询响应"| B style A fill:#f9f,stroke:#333,stroke-width:2px style B fill:#bbf,stroke:#333,stroke-width:2px style C fill:#bbf,stroke:#333,stroke-width:2px style D fill:#ddf,stroke:#333,stroke-width:2px style E fill:#bbf,stroke:#333,stroke-width:2px %% 此注释用于文档说明:A 到 B 表示用户请求流程 ``` ### 功能模块设计总览 ```mermaid graph TD A[用户接口层] --> B[业务逻辑层] B --> C[数据访问层] B --> D[消息服务层] D --> E[定时任务层] C --> F[数据存储层] E --> B style A fill:#F9E79F,stroke:#F1C40F style B fill:#AED6F1,stroke:#3498DB style C fill:#ABEBC6,stroke:#27AE60 style D fill:#F5B7B1,stroke:#E74C3C style E fill:#D7BDE2,stroke:#9B59B6 style F fill:#EDBB99,stroke:#E67E22 ``` #### 模块 1:用户接口层(Spring Boot REST API) | **功能** | **接口设计** | **技术实现** | | ---------------- | ------------------------------- | ------------------------------------------------------------ | | 货物创建 | POST /cargo
参数:货物DTO | `@RestController` + Spring Validation
调用`CargoService.create()` | | 状态查询 | GET /cargo/{id}
返回:货物VO | 集成Redis缓存:
`@Cacheable(key = "#id")`
缓存穿透处理:空值缓存 | | 批量导入 | POST /cargo/batch
参数:文件 | 异步处理:
`@Async` + RabbitMQ消息队列 | | 状态更新(内部) | PUT /cargo/status
权限:内部 | Spring Security 内部认证
触发RabbitMQ事件通知 | #### 模块 2:业务逻辑层(领域服务) ##### 货物管理服务 `CargoService` ```java @Service public class CargoService { // 状态机核心逻辑(运输中 -> 已签收/异常) public void updateStatus(String cargoId, CargoStatus newStatus) { Cargo cargo = cargoRepository.findById(cargoId); // 状态校验(使用状态机模式) if (!cargo.canTransitionTo(newStatus)) { throw new IllegalStateException("状态转换无效"); } cargo.setStatus(newStatus); // 触发事件(解耦通知逻辑) eventPublisher.publishStatusEvent(cargo); } } ``` **关键技术**: - 状态机模式:使用 `Enum` + 状态转移规则 - 事件发布:`ApplicationEventPublisher` 发送领域事件 #### 模块 3:消息服务层(RabbitMQ 集成) ##### 消息架构设计 ```mermaid graph LR Producer[服务层] -->|发布事件| Exchange[状态事件交换机] Exchange -->|路由键: status.update| Queue1[状态更新队列] Exchange -->|路由键: delay.alert| Queue2[延误警报队列] Queue1 --> Consumer1[通知服务] Queue2 --> Consumer2[预警服务] ``` ##### 关键配置 ```java @Configuration public class RabbitConfig { // 定义状态事件交换机(Direct模式) @Bean public DirectExchange statusExchange() { return new DirectExchange("cargo.status.exchange"); } // 延时消息队列(TTL=1小时) @Bean public Queue delayQueue() { return QueueBuilder.durable("delay.alert.queue") .ttl(3600000) // 1小时TTL .deadLetterExchange("") // 死信直连主队列 .build(); } } ``` #### 模块 4:定时任务层(Spring Schedule) ##### 核心任务清单 | **任务** | **触发规则** | **功能** | **容错机制** | | ------------ | ------------------------- | ------------------------------ | -------------------------- | | 库存日报生成 | 每天 08:00 (0 0 8 * * *) | 查询Redis缓存数据生成PDF | `@Retryable` 最大重试3次 | | 运输时效监控 | 每30分钟 (0 */30 * * * *) | 扫描运输中超24小时货物触发警报 | 分布式锁防止多实例重复执行 | | 缓存数据预热 | 系统启动时执行 | 加载热点货物数据到Redis | 失败后记录日志不影响启动 | **任务示例**: ```java @Scheduled(cron = "0 */30 * * * *") @SchedulerLock(name = "MonitorTask_lock", lockAtMostFor = "29m") public void monitorTransportDelay() { List delayedCargos = cargoRepository.findDelayedCargos(24); delayedCargos.forEach(cargo -> rabbitTemplate.convertAndSend("ALERT_QUEUE", cargo) ); } ``` #### 模块 5:数据访问层(Spring Data JPA + Redis) ##### 双存储架构 ```mermaid graph TB Service[业务服务] -->|高频读取| Redis[Redis缓存] Service -->|持久化| JPA[MySQL/H2] Redis -->|缓存策略| Policy["缓存策略: 读写穿透(Caffeine) 失效:主动更新+TTL"] ``` ##### 缓存注解示例 ```java @Repository public class CargoRepositoryImpl implements CargoCache { @Cacheable(value = "cargo", key = "#id", unless = "#result == null") // 空值不缓存 public Cargo getById(String id) { return jpaRepository.findById(id); } @CacheEvict(value = "cargo", key = "#cargo.id") public void update(Cargo cargo) { jpaRepository.save(cargo); } } ``` #### 模块 6:安全与监控层 1. **安全控制** - API 鉴权:Spring Security + JWT - 敏感操作审计:`@Audited` 注解记录操作日志 2. **监控指标** - Prometheus 监控端点:`/actuator/prometheus` - 关键指标: - RabbitMQ 积压消息数 - 缓存命中率(Redis) - API 平均响应时间 --- #### 关键设计决策说明 1. **事件驱动优先** 状态变更全部通过 RabbitMQ 异步通知,确保核心链路高可用(即使通知服务宕机不影响主业务) 2. **缓存双策略** - 静态数据:Caffeine 本地缓存(减少 Redis 压力) - 动态数据:Redis 分布式缓存(保证一致性) 3. **定时任务容错** 集成 [ShedLock](https://github.com/lukas-krecan/ShedLock) 避免多实例任务重复执行 4. **简化持久化** MVP 阶段使用 H2 内存数据库,节省部署成本(生产环境可无缝切 MySQL) ## 加入团队 [点击加入](https://gitee.com/organizations/java-hnuit/invite?invite=b07d73cb939d0bab49853d35a1c7b131dca094eb15896a69e67a7010cd42d36ea584c1196390b6bf5f318cd36bbddc3a)