1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
package com.example.task.ejb.service;
import com.example.task.ejb.entity.Task;
import com.example.task.ejb.entity.User;
import com.example.task.common.exception.ResourceNotFoundException;
import com.example.task.common.exception.BusinessException;
import com.example.task.ejb.event.TaskCreatedEvent;
import com.example.task.ejb.event.TaskStatusChangedEvent;
import jakarta.ejb.Stateless;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.PermitAll;
import jakarta.enterprise.event.Event;
import java.time.LocalDateTime;
import java.util.List;
@Stateless
public class TaskService {
@PersistenceContext
private EntityManager em;
@Inject
private UserService userService;
@Inject
private AuditService auditService;
@Inject
private Event<TaskCreatedEvent> taskCreatedEvent; // CDI 事件
@Inject
private Event<TaskStatusChangedEvent> taskStatusEvent; // CDI 事件
// 创建任务
@RolesAllowed({"USER", "ADMIN"})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Task createTask(String title, String description,
Long assigneeId, String priority, LocalDateTime dueDate,
Long creatorId) {
User creator = userService.findUserById(creatorId);
User assignee = userService.findUserById(assigneeId);
Task task = new Task();
task.setTitle(title);
task.setDescription(description);
task.setAssignee(assignee);
task.setCreator(creator);
task.setPriority(Task.Priority.valueOf(priority));
task.setDueDate(dueDate);
task.setStatus(Task.Status.PENDING);
em.persist(task);
auditService.log(creatorId, creator.getUsername(), "CREATE_TASK",
"创建任务:" + title + ",分配给:" + assignee.getUsername());
// 发布 CDI 事件(异步通知)
taskCreatedEvent.fire(new TaskCreatedEvent(task.getId(), title,
assignee.getId(), creator.getId()));
return task;
}
// 查询分配给当前用户的任务
@RolesAllowed({"USER", "ADMIN"})
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List<Task> findTasksByAssignee(Long userId) {
return em.createNamedQuery("Task.findByAssignee", Task.class)
.setParameter("userId", userId)
.getResultList();
}
// 查询由当前用户创建的任务
@RolesAllowed({"USER", "ADMIN"})
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List<Task> findTasksByCreator(Long userId) {
return em.createNamedQuery("Task.findByCreator", Task.class)
.setParameter("userId", userId)
.getResultList();
}
// 查询所有任务(仅管理员)
@RolesAllowed("ADMIN")
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List<Task> findAllTasks(int page, int size) {
return em.createQuery("SELECT t FROM Task t ORDER BY t.createTime DESC", Task.class)
.setFirstResult((page - 1) * size)
.setMaxResults(size)
.getResultList();
}
// 更新任务状态
@RolesAllowed({"USER", "ADMIN"})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Task updateTaskStatus(Long taskId, String newStatus, Long operatorId) {
Task task = findTaskById(taskId);
User operator = userService.findUserById(operatorId);
Task.Status oldStatus = task.getStatus();
Task.Status status = Task.Status.valueOf(newStatus);
// 验证状态流转合法性
if (task.getStatus() == Task.Status.COMPLETED ||
task.getStatus() == Task.Status.CANCELLED) {
throw new BusinessException("任务已完成或已取消,无法更改状态");
}
task.setStatus(status);
auditService.log(operatorId, operator.getUsername(), "UPDATE_TASK_STATUS",
"任务 " + task.getTitle() + " 状态从 " + oldStatus + " 变更为 " + status);
// 发布状态变更事件
taskStatusEvent.fire(new TaskStatusChangedEvent(taskId, task.getTitle(),
oldStatus.toString(), newStatus,
task.getAssignee().getId()));
return task;
}
// 删除任务(仅管理员)
@RolesAllowed("ADMIN")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteTask(Long taskId, Long operatorId) {
Task task = findTaskById(taskId);
User operator = userService.findUserById(operatorId);
em.remove(task);
auditService.log(operatorId, operator.getUsername(), "DELETE_TASK",
"删除任务:" + task.getTitle());
}
// 按状态统计任务数量
@RolesAllowed("ADMIN")
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public long countTasksByStatus(String status) {
return em.createNamedQuery("Task.countByStatus", Long.class)
.setParameter("status", Task.Status.valueOf(status))
.getSingleResult();
}
// 查询超时未完成的任务
@RolesAllowed("ADMIN")
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List<Task> findOverdueTasks() {
return em.createNamedQuery("Task.findOverdue", Task.class)
.setParameter("now", LocalDateTime.now())
.getResultList();
}
private Task findTaskById(Long id) {
Task task = em.find(Task.class, id);
if (task == null) {
throw new ResourceNotFoundException("任务不存在,ID:" + id);
}
return task;
}
}
|