mirror of
https://github.com/hpd840321/craftlabs-authorization-sdk.git
synced 2026-06-09 10:00:30 +08:00
feat: add M8 TodoService + TodoController
This commit is contained in:
+155
@@ -0,0 +1,155 @@
|
|||||||
|
package cn.craftlabs.platform.api.service;
|
||||||
|
|
||||||
|
import cn.craftlabs.platform.api.persistence.todo.PlatformNotificationConfig;
|
||||||
|
import cn.craftlabs.platform.api.persistence.todo.PlatformNotificationConfigMapper;
|
||||||
|
import cn.craftlabs.platform.api.persistence.todo.PlatformTodoItem;
|
||||||
|
import cn.craftlabs.platform.api.persistence.todo.PlatformTodoItemMapper;
|
||||||
|
import cn.craftlabs.platform.api.web.dto.PageResponse;
|
||||||
|
import cn.craftlabs.platform.api.web.dto.TodoResponse;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class TodoService {
|
||||||
|
|
||||||
|
private final PlatformTodoItemMapper todoItemMapper;
|
||||||
|
private final PlatformNotificationConfigMapper notificationConfigMapper;
|
||||||
|
|
||||||
|
public TodoService(PlatformTodoItemMapper todoItemMapper,
|
||||||
|
PlatformNotificationConfigMapper notificationConfigMapper) {
|
||||||
|
this.todoItemMapper = todoItemMapper;
|
||||||
|
this.notificationConfigMapper = notificationConfigMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public PageResponse<TodoResponse> listTodos(int page, int size, String type, String status, String role) {
|
||||||
|
LambdaQueryWrapper<PlatformTodoItem> q =
|
||||||
|
Wrappers.lambdaQuery(PlatformTodoItem.class)
|
||||||
|
.eq(type != null && !type.isEmpty(), PlatformTodoItem::getTodoType, type)
|
||||||
|
.eq(status != null && !status.isEmpty(), PlatformTodoItem::getStatus, status)
|
||||||
|
.eq(role != null && !role.isEmpty(), PlatformTodoItem::getAssignedRole, role)
|
||||||
|
.orderByDesc(PlatformTodoItem::getCreatedAt);
|
||||||
|
Page<PlatformTodoItem> mpPage = new Page<>(page + 1L, size);
|
||||||
|
todoItemMapper.selectPage(mpPage, q);
|
||||||
|
List<TodoResponse> content =
|
||||||
|
mpPage.getRecords().stream().map(this::toTodoResponse).collect(Collectors.toList());
|
||||||
|
return new PageResponse<>(content, mpPage.getTotal(), page, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void updateStatus(Long id, String status, String userId) {
|
||||||
|
PlatformTodoItem item = todoItemMapper.selectById(id);
|
||||||
|
if (item != null) {
|
||||||
|
item.setStatus(status);
|
||||||
|
item.setAssignedUserId(userId);
|
||||||
|
item.setProcessedAt(OffsetDateTime.now(ZoneOffset.UTC));
|
||||||
|
todoItemMapper.updateById(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void batchUpdateStatus(List<Long> ids, String status, String userId) {
|
||||||
|
for (Long id : ids) {
|
||||||
|
updateStatus(id, status, userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void createTodo(String type, String title, Long sourceId, String sourceType,
|
||||||
|
String priority, String assignedRole) {
|
||||||
|
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
|
||||||
|
PlatformTodoItem item = new PlatformTodoItem();
|
||||||
|
item.setTodoType(type);
|
||||||
|
item.setTitle(title);
|
||||||
|
item.setSourceId(sourceId);
|
||||||
|
item.setSourceType(sourceType);
|
||||||
|
item.setPriority(priority);
|
||||||
|
item.setStatus("PENDING");
|
||||||
|
item.setAssignedRole(assignedRole);
|
||||||
|
item.setCreatedAt(now);
|
||||||
|
todoItemMapper.insert(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public List<PlatformNotificationConfig> getNotificationConfig(String roleCode) {
|
||||||
|
if (roleCode != null && !roleCode.isEmpty()) {
|
||||||
|
LambdaQueryWrapper<PlatformNotificationConfig> q =
|
||||||
|
Wrappers.lambdaQuery(PlatformNotificationConfig.class)
|
||||||
|
.eq(PlatformNotificationConfig::getRoleCode, roleCode);
|
||||||
|
return notificationConfigMapper.selectList(q);
|
||||||
|
}
|
||||||
|
return notificationConfigMapper.selectList(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void updateNotificationConfig(List<PlatformNotificationConfig> configs) {
|
||||||
|
for (PlatformNotificationConfig config : configs) {
|
||||||
|
if (config.getId() != null) {
|
||||||
|
notificationConfigMapper.updateById(config);
|
||||||
|
} else {
|
||||||
|
config.setCreatedAt(OffsetDateTime.now(ZoneOffset.UTC));
|
||||||
|
config.setUpdatedAt(OffsetDateTime.now(ZoneOffset.UTC));
|
||||||
|
notificationConfigMapper.insert(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TodoResponse toTodoResponse(PlatformTodoItem item) {
|
||||||
|
TodoResponse r = new TodoResponse();
|
||||||
|
r.setId(item.getId());
|
||||||
|
r.setTodoType(item.getTodoType());
|
||||||
|
r.setTodoTypeLabel(todoTypeLabel(item.getTodoType()));
|
||||||
|
r.setTitle(item.getTitle());
|
||||||
|
r.setSourceId(item.getSourceId());
|
||||||
|
r.setSourceType(item.getSourceType());
|
||||||
|
r.setPriority(item.getPriority());
|
||||||
|
r.setPriorityLabel(priorityLabel(item.getPriority()));
|
||||||
|
r.setStatus(item.getStatus());
|
||||||
|
r.setStatusLabel(statusLabel(item.getStatus()));
|
||||||
|
r.setAssignedRole(item.getAssignedRole());
|
||||||
|
r.setAssignedUserId(item.getAssignedUserId());
|
||||||
|
r.setCreatedAt(item.getCreatedAt());
|
||||||
|
r.setProcessedAt(item.getProcessedAt());
|
||||||
|
r.setRemark(item.getRemark());
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String todoTypeLabel(String type) {
|
||||||
|
if (type == null) return "";
|
||||||
|
switch (type) {
|
||||||
|
case "CALLBACK": return "Callback";
|
||||||
|
case "SN_GRANT": return "SN 发放";
|
||||||
|
case "ACTIVATION_EXPIRED": return "激活超期";
|
||||||
|
case "DEVICE_SWAP": return "换机审批";
|
||||||
|
default: return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String priorityLabel(String priority) {
|
||||||
|
if (priority == null) return "";
|
||||||
|
switch (priority) {
|
||||||
|
case "HIGH": return "高";
|
||||||
|
case "MEDIUM": return "中";
|
||||||
|
case "LOW": return "低";
|
||||||
|
default: return priority;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String statusLabel(String status) {
|
||||||
|
if (status == null) return "";
|
||||||
|
switch (status) {
|
||||||
|
case "PENDING": return "待处理";
|
||||||
|
case "PROCESSED": return "已处理";
|
||||||
|
case "IGNORED": return "已忽略";
|
||||||
|
default: return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
package cn.craftlabs.platform.api.todo;
|
||||||
|
|
||||||
|
import cn.craftlabs.platform.api.persistence.todo.PlatformNotificationConfig;
|
||||||
|
import cn.craftlabs.platform.api.service.TodoService;
|
||||||
|
import cn.craftlabs.platform.api.web.dto.PageResponse;
|
||||||
|
import cn.craftlabs.platform.api.web.dto.TodoResponse;
|
||||||
|
import jakarta.validation.constraints.Max;
|
||||||
|
import jakarta.validation.constraints.Min;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PatchMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/v1")
|
||||||
|
@Validated
|
||||||
|
public class TodoController {
|
||||||
|
|
||||||
|
private final TodoService todoService;
|
||||||
|
|
||||||
|
public TodoController(TodoService todoService) {
|
||||||
|
this.todoService = todoService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/todos")
|
||||||
|
public PageResponse<TodoResponse> listTodos(
|
||||||
|
@RequestParam(value = "page", defaultValue = "0") @Min(0) int page,
|
||||||
|
@RequestParam(value = "size", defaultValue = "20") @Min(1) @Max(200) int size,
|
||||||
|
@RequestParam(value = "type", required = false) String type,
|
||||||
|
@RequestParam(value = "status", required = false) String status,
|
||||||
|
@RequestParam(value = "role", required = false) String role) {
|
||||||
|
return todoService.listTodos(page, size, type, status, role);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PatchMapping("/todos/{id}/status")
|
||||||
|
public void updateStatus(@PathVariable("id") Long id,
|
||||||
|
@RequestBody Map<String, String> body) {
|
||||||
|
todoService.updateStatus(id, body.get("status"), body.get("userId"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/todos/batch-status")
|
||||||
|
public void batchUpdateStatus(@RequestBody Map<String, Object> body) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<Long> ids = ((List<Integer>) body.get("ids")).stream()
|
||||||
|
.map(Integer::longValue)
|
||||||
|
.collect(java.util.stream.Collectors.toList());
|
||||||
|
todoService.batchUpdateStatus(ids, (String) body.get("status"), (String) body.get("userId"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/notifications/config")
|
||||||
|
public List<PlatformNotificationConfig> getNotificationConfig(
|
||||||
|
@RequestParam(value = "roleCode", required = false) String roleCode) {
|
||||||
|
return todoService.getNotificationConfig(roleCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/notifications/config")
|
||||||
|
public void updateNotificationConfig(@RequestBody List<PlatformNotificationConfig> configs) {
|
||||||
|
todoService.updateNotificationConfig(configs);
|
||||||
|
}
|
||||||
|
}
|
||||||
+142
@@ -0,0 +1,142 @@
|
|||||||
|
package cn.craftlabs.platform.api.web.dto;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
|
public class TodoResponse {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
private String todoType;
|
||||||
|
private String todoTypeLabel;
|
||||||
|
private String title;
|
||||||
|
private Long sourceId;
|
||||||
|
private String sourceType;
|
||||||
|
private String priority;
|
||||||
|
private String priorityLabel;
|
||||||
|
private String status;
|
||||||
|
private String statusLabel;
|
||||||
|
private String assignedRole;
|
||||||
|
private String assignedUserId;
|
||||||
|
private OffsetDateTime createdAt;
|
||||||
|
private OffsetDateTime processedAt;
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTodoType() {
|
||||||
|
return todoType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTodoType(String todoType) {
|
||||||
|
this.todoType = todoType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTodoTypeLabel() {
|
||||||
|
return todoTypeLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTodoTypeLabel(String todoTypeLabel) {
|
||||||
|
this.todoTypeLabel = todoTypeLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getSourceId() {
|
||||||
|
return sourceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceId(Long sourceId) {
|
||||||
|
this.sourceId = sourceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSourceType() {
|
||||||
|
return sourceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceType(String sourceType) {
|
||||||
|
this.sourceType = sourceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPriority() {
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPriority(String priority) {
|
||||||
|
this.priority = priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPriorityLabel() {
|
||||||
|
return priorityLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPriorityLabel(String priorityLabel) {
|
||||||
|
this.priorityLabel = priorityLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatusLabel() {
|
||||||
|
return statusLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatusLabel(String statusLabel) {
|
||||||
|
this.statusLabel = statusLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAssignedRole() {
|
||||||
|
return assignedRole;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAssignedRole(String assignedRole) {
|
||||||
|
this.assignedRole = assignedRole;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAssignedUserId() {
|
||||||
|
return assignedUserId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAssignedUserId(String assignedUserId) {
|
||||||
|
this.assignedUserId = assignedUserId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getCreatedAt() {
|
||||||
|
return createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreatedAt(OffsetDateTime createdAt) {
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OffsetDateTime getProcessedAt() {
|
||||||
|
return processedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProcessedAt(OffsetDateTime processedAt) {
|
||||||
|
this.processedAt = processedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRemark() {
|
||||||
|
return remark;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRemark(String remark) {
|
||||||
|
this.remark = remark;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user