Spring AI + Qwen2.5 實(shí)現(xiàn)智能搶票助手:搶票系統(tǒng)核心業(yè)務(wù)規(guī)則 + 數(shù)據(jù)庫(kù)設(shè)計(jì)全解析!
在一個(gè)真實(shí)的“搶票”業(yè)務(wù)系統(tǒng)中,模型的智能并不能替代業(yè)務(wù)底層邏輯。搶票助手的 AI 決策,需要基于完整的數(shù)據(jù)結(jié)構(gòu)和業(yè)務(wù)規(guī)則才能發(fā)揮作用。因此,我們本篇將聚焦以下幾個(gè)核心目標(biāo):
- 設(shè)計(jì)車(chē)票、用戶(hù)、訂單等基本數(shù)據(jù)模型
- 搭建數(shù)據(jù)庫(kù)(H2 或 MySQL)
- 實(shí)現(xiàn)“搶票排隊(duì) + 余票判斷 + 下單”的業(yè)務(wù)規(guī)則
- 提供查詢(xún)車(chē)票與發(fā)起搶票等 API
- 完成第一個(gè)小練習(xí):車(chē)票查詢(xún)接口(無(wú) AI)
基本數(shù)據(jù)模型設(shè)計(jì)
使用 Spring Data JPA 進(jìn)行數(shù)據(jù)建模。
車(chē)票實(shí)體 Ticket
package com.icoderoad.ticket.model;
import jakarta.persistence.*;
import lombok.*;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Ticket {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fromCity;
private String toCity;
private String trainNumber;
private String departureTime;
private Integer totalSeats;
private Integer remainingSeats;
}用戶(hù)實(shí)體 User
package com.icoderoad.ticket.model;
import jakarta.persistence.*;
import lombok.*;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String phone;
}訂單實(shí)體 Order
package com.icoderoad.ticket.model;
import jakarta.persistence.*;
import lombok.*;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "`order`")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long userId;
private Long ticketId;
private String status; // SUCCESS, FAILED, WAITING
}數(shù)據(jù)庫(kù)初始化(使用 H2)
application.yml 配置(支持切換 H2/MySQL)
spring:
datasource:
url: jdbc:h2:mem:ticketdb
driver-class-name: org.h2.Driver
username: sa
password:
h2:
console:
enabled: true
jpa:
hibernate:
ddl-auto: update
show-sql: true模擬數(shù)據(jù)初始化
@Component
@RequiredArgsConstructor
public class DataInitRunner implements CommandLineRunner {
private final TicketRepository ticketRepo;
@Override
public void run(String... args) {
ticketRepo.save(Ticket.builder()
.fromCity("上海")
.toCity("杭州")
.trainNumber("G123")
.departureTime("2025-06-01 09:00")
.totalSeats(100)
.remainingSeats(20)
.build());
}
}核心搶票業(yè)務(wù)邏輯設(shè)計(jì)
搶票請(qǐng)求結(jié)構(gòu)
@Data
public class GrabRequest {
private Long userId;
private Long ticketId;
}搶票服務(wù) TicketService
@Service
@RequiredArgsConstructor
public class TicketService {
private final TicketRepository ticketRepo;
private final OrderRepository orderRepo;
@Transactional
public String grabTicket(Long userId, Long ticketId) {
Optional<Ticket> opt = ticketRepo.findById(ticketId);
if (opt.isEmpty()) return "車(chē)票不存在";
Ticket ticket = opt.get();
if (ticket.getRemainingSeats() <= 0) {
return "搶票失敗:無(wú)余票";
}
// 模擬排隊(duì) & 搶票邏輯
ticket.setRemainingSeats(ticket.getRemainingSeats() - 1);
ticketRepo.save(ticket);
orderRepo.save(Order.builder()
.userId(userId)
.ticketId(ticketId)
.status("SUCCESS")
.build());
return "搶票成功";
}
}接口設(shè)計(jì)與實(shí)現(xiàn)
TicketController
@RestController
@RequestMapping("/api/ticket")
@RequiredArgsConstructor
public class TicketController {
private final TicketRepository ticketRepo;
private final TicketService ticketService;
// 查詢(xún)所有車(chē)票
@GetMapping("/list")
public List<Ticket> listTickets() {
return ticketRepo.findAll();
}
// 發(fā)起搶票請(qǐng)求
@PostMapping("/grab")
public String grabTicket(@RequestBody GrabRequest request) {
return ticketService.grabTicket(request.getUserId(), request.getTicketId());
}
}小練習(xí):車(chē)票查詢(xún)接口(無(wú) AI)
你可以通過(guò)如下接口查看數(shù)據(jù)庫(kù)中車(chē)票信息:
請(qǐng)求:
GET http://localhost:8080/api/ticket/list響應(yīng)(JSON 示例):
[
{
"id": 1,
"fromCity": "上海",
"toCity": "杭州",
"trainNumber": "G123",
"departureTime": "2025-06-01 09:00",
"totalSeats": 100,
"remainingSeats": 19
}
]結(jié)語(yǔ)
通過(guò)本篇文章,我們完成了一個(gè)“可運(yùn)行的車(chē)票系統(tǒng)原型”,包含了數(shù)據(jù)建模、數(shù)據(jù)庫(kù)初始化、搶票核心業(yè)務(wù)邏輯、接口設(shè)計(jì)等關(guān)鍵內(nèi)容。
這些功能雖然尚未接入 AI,但已經(jīng)為智能搶票助手的接入打下堅(jiān)實(shí)基礎(chǔ)。下一步,我們將使用 Spring AI + 通義 Qwen2.5 接入大模型,實(shí)現(xiàn)基于用戶(hù)指令、行程偏好等的自動(dòng)搶票、智能推薦和對(duì)話(huà)式交互。



























