You've already forked FrameTour-BE
feat(integration): 添加消息服务相关接口和功能
- 新增 MessageController 类,实现消息列表查询和消息通道列表获取功能 - 新增 MessageClient 接口,用于调用消息服务的 Feign客户端 - 新增 ChannelsResponse、MessageListData 和 MessageRecordDTO 数据传输对象 - 新增 MessageIntegrationService 服务类,处理消息服务相关业务逻辑
This commit is contained in:
@@ -0,0 +1,60 @@
|
|||||||
|
package com.ycwl.basic.controller.pc;
|
||||||
|
|
||||||
|
import com.ycwl.basic.integration.message.dto.ChannelsResponse;
|
||||||
|
import com.ycwl.basic.integration.message.dto.MessageListData;
|
||||||
|
import com.ycwl.basic.integration.message.service.MessageIntegrationService;
|
||||||
|
import com.ycwl.basic.utils.ApiResponse;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/message/v1")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class MessageController {
|
||||||
|
|
||||||
|
private final MessageIntegrationService messageService;
|
||||||
|
|
||||||
|
@GetMapping("/messages")
|
||||||
|
public ApiResponse<MessageListData> listMessages(
|
||||||
|
@RequestParam(defaultValue = "1") Integer page,
|
||||||
|
@RequestParam(defaultValue = "20") Integer pageSize,
|
||||||
|
@RequestParam(required = false) String channelId,
|
||||||
|
@RequestParam(required = false) String title,
|
||||||
|
@RequestParam(required = false) String content,
|
||||||
|
@RequestParam(required = false) String sendBiz,
|
||||||
|
@RequestParam(required = false) String sentAtStart,
|
||||||
|
@RequestParam(required = false) String sentAtEnd,
|
||||||
|
@RequestParam(required = false) String createdAtStart,
|
||||||
|
@RequestParam(required = false) String createdAtEnd
|
||||||
|
) {
|
||||||
|
log.info("PC|消息列表查询 page={}, pageSize={}, channelId={}, title={}, sendBiz={}", page, pageSize, channelId, title, sendBiz);
|
||||||
|
if (pageSize > 100) {
|
||||||
|
pageSize = 100;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
MessageListData data = messageService.listMessages(page, pageSize, channelId, title, content, sendBiz,
|
||||||
|
sentAtStart, sentAtEnd, createdAtStart, createdAtEnd);
|
||||||
|
return ApiResponse.success(data);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("PC|消息列表查询失败", e);
|
||||||
|
return ApiResponse.fail("消息列表查询失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/channels")
|
||||||
|
public ApiResponse<ChannelsResponse> listChannels() {
|
||||||
|
log.info("PC|获取消息通道列表");
|
||||||
|
try {
|
||||||
|
ChannelsResponse data = messageService.listChannels();
|
||||||
|
return ApiResponse.success(data);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("PC|获取消息通道列表失败", e);
|
||||||
|
return ApiResponse.fail("获取消息通道列表失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,29 @@
|
|||||||
|
package com.ycwl.basic.integration.message.client;
|
||||||
|
|
||||||
|
import com.ycwl.basic.integration.common.response.CommonResponse;
|
||||||
|
import com.ycwl.basic.integration.message.dto.ChannelsResponse;
|
||||||
|
import com.ycwl.basic.integration.message.dto.MessageListData;
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
|
@FeignClient(name = "zt-message", contextId = "zt-message", path = "")
|
||||||
|
public interface MessageClient {
|
||||||
|
|
||||||
|
@GetMapping("/messages")
|
||||||
|
CommonResponse<MessageListData> listMessages(
|
||||||
|
@RequestParam(name = "page", defaultValue = "1") Integer page,
|
||||||
|
@RequestParam(name = "pageSize", defaultValue = "20") Integer pageSize,
|
||||||
|
@RequestParam(name = "channelId", required = false) String channelId,
|
||||||
|
@RequestParam(name = "title", required = false) String title,
|
||||||
|
@RequestParam(name = "content", required = false) String content,
|
||||||
|
@RequestParam(name = "sendBiz", required = false) String sendBiz,
|
||||||
|
@RequestParam(name = "sentAtStart", required = false) String sentAtStart,
|
||||||
|
@RequestParam(name = "sentAtEnd", required = false) String sentAtEnd,
|
||||||
|
@RequestParam(name = "createdAtStart", required = false) String createdAtStart,
|
||||||
|
@RequestParam(name = "createdAtEnd", required = false) String createdAtEnd
|
||||||
|
);
|
||||||
|
|
||||||
|
@GetMapping("/channels")
|
||||||
|
CommonResponse<ChannelsResponse> listChannels();
|
||||||
|
}
|
@@ -0,0 +1,10 @@
|
|||||||
|
package com.ycwl.basic.integration.message.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ChannelsResponse {
|
||||||
|
private List<String> channels;
|
||||||
|
}
|
@@ -0,0 +1,13 @@
|
|||||||
|
package com.ycwl.basic.integration.message.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class MessageListData {
|
||||||
|
private List<MessageRecordDTO> list;
|
||||||
|
private String total; // string to avoid JS precision
|
||||||
|
private Integer page;
|
||||||
|
private Integer pageSize;
|
||||||
|
}
|
@@ -0,0 +1,25 @@
|
|||||||
|
package com.ycwl.basic.integration.message.dto;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public class MessageRecordDTO {
|
||||||
|
private String id; // string to avoid JS precision
|
||||||
|
private String channelId;
|
||||||
|
private String title;
|
||||||
|
private String content;
|
||||||
|
private String target;
|
||||||
|
private Map<String, Object> extraJson;
|
||||||
|
private String sendReason;
|
||||||
|
private String sendBiz;
|
||||||
|
private String status;
|
||||||
|
private String errorMsg;
|
||||||
|
private Integer attempts;
|
||||||
|
private String sentAt; // RFC3339 or yyyy-MM-dd HH:mm:ss (pass-through)
|
||||||
|
private String createdAt;
|
||||||
|
private String updatedAt;
|
||||||
|
}
|
@@ -0,0 +1,57 @@
|
|||||||
|
package com.ycwl.basic.integration.message.service;
|
||||||
|
|
||||||
|
import com.ycwl.basic.integration.common.exception.IntegrationException;
|
||||||
|
import com.ycwl.basic.integration.common.response.CommonResponse;
|
||||||
|
import com.ycwl.basic.integration.common.service.IntegrationFallbackService;
|
||||||
|
import com.ycwl.basic.integration.message.client.MessageClient;
|
||||||
|
import com.ycwl.basic.integration.message.dto.ChannelsResponse;
|
||||||
|
import com.ycwl.basic.integration.message.dto.MessageListData;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class MessageIntegrationService {
|
||||||
|
|
||||||
|
private final MessageClient client;
|
||||||
|
private final IntegrationFallbackService fallbackService;
|
||||||
|
|
||||||
|
private static final String SERVICE_NAME = "zt-message";
|
||||||
|
|
||||||
|
public MessageListData listMessages(Integer page, Integer pageSize,
|
||||||
|
String channelId, String title, String content, String sendBiz,
|
||||||
|
String sentAtStart, String sentAtEnd,
|
||||||
|
String createdAtStart, String createdAtEnd) {
|
||||||
|
log.debug("查询消息列表 page={}, pageSize={}, channelId={}, title={}, sendBiz={}", page, pageSize, channelId, title, sendBiz);
|
||||||
|
CommonResponse<MessageListData> resp = client.listMessages(page, pageSize, channelId, title, content, sendBiz,
|
||||||
|
sentAtStart, sentAtEnd, createdAtStart, createdAtEnd);
|
||||||
|
return handleResponse(resp, "查询消息列表失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChannelsResponse listChannels() {
|
||||||
|
log.debug("查询消息通道列表");
|
||||||
|
// 相对稳定的数据,使用fallback缓存
|
||||||
|
return fallbackService.executeWithFallback(
|
||||||
|
SERVICE_NAME,
|
||||||
|
"channels",
|
||||||
|
() -> {
|
||||||
|
CommonResponse<ChannelsResponse> resp = client.listChannels();
|
||||||
|
return handleResponse(resp, "查询通道列表失败");
|
||||||
|
},
|
||||||
|
ChannelsResponse.class
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> T handleResponse(CommonResponse<T> response, String errorMessage) {
|
||||||
|
if (response == null || !response.isSuccess()) {
|
||||||
|
String msg = response != null && response.getMessage() != null
|
||||||
|
? response.getMessage()
|
||||||
|
: errorMessage;
|
||||||
|
Integer code = response != null ? response.getCode() : 5000;
|
||||||
|
throw new IntegrationException(code, msg, SERVICE_NAME);
|
||||||
|
}
|
||||||
|
return response.getData();
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user