用户端的反馈工单

main
forely 4 weeks ago
parent 1934fc460b
commit 4aaaa1fc6a

@ -0,0 +1,67 @@
package com.luojia_channel.modules.feedback.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeedbackRabbitMQConfig {
// 反馈工单交换机
public static final String FEEDBACK_EXCHANGE = "feedback.exchange";
// 延迟队列 - 消息先进入此队列,过期后转发到死信队列
public static final String FEEDBACK_DELAY_QUEUE = "feedback.delay.queue";
// 死信交换机 - 延迟队列的死信会转发到此交换机
public static final String FEEDBACK_DLX_EXCHANGE = "feedback.dlx.exchange";
// 死信队列 - 最终消费者监听此队列
public static final String FEEDBACK_DLX_QUEUE = "feedback.dlx.queue";
// 路由键
public static final String FEEDBACK_ROUTING_KEY = "feedback.routing.key";
// 声明反馈交换机
@Bean
DirectExchange feedbackExchange() {
return new DirectExchange(FEEDBACK_EXCHANGE, true, false);
}
// 声明死信交换机
@Bean
DirectExchange feedbackDlxExchange() {
return new DirectExchange(FEEDBACK_DLX_EXCHANGE, true, false);
}
// 声明延迟队列,并绑定到死信交换机
@Bean
Queue feedbackDelayQueue() {
return QueueBuilder.durable(FEEDBACK_DELAY_QUEUE)
.withArgument("x-dead-letter-exchange", FEEDBACK_DLX_EXCHANGE)
.withArgument("x-dead-letter-routing-key", FEEDBACK_ROUTING_KEY)
.build();
}
// 声明死信队列
@Bean
Queue feedbackDlxQueue() {
return new Queue(FEEDBACK_DLX_QUEUE, true);
}
// 绑定延迟队列到反馈交换机
@Bean
Binding feedbackDelayBinding() {
return BindingBuilder.bind(feedbackDelayQueue())
.to(feedbackExchange())
.with(FEEDBACK_ROUTING_KEY);
}
// 绑定死信队列到死信交换机
@Bean
Binding feedbackDlxBinding() {
return BindingBuilder.bind(feedbackDlxQueue())
.to(feedbackDlxExchange())
.with(FEEDBACK_ROUTING_KEY);
}
}

@ -0,0 +1,51 @@
package com.luojia_channel.modules.feedback.controller;
import com.luojia_channel.common.domain.Result;
import com.luojia_channel.common.domain.page.PageRequest;
import com.luojia_channel.common.domain.page.PageResponse;
import com.luojia_channel.modules.feedback.entity.FeedbackTicket;
import com.luojia_channel.modules.feedback.service.FeedbackTicketService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/feedback")
@Tag(name = "反馈工单模块", description = "反馈工单相关接口")
@RequiredArgsConstructor
public class FeedbackTicketController {
private final FeedbackTicketService feedbackTicketService;
@PostMapping
@Operation(summary = "创建反馈工单", description = "用户创建反馈工单")
public Result<Long> createFeedbackTicket(@RequestBody FeedbackTicket feedbackTicket) {
Long id = feedbackTicketService.createFeedbackTicket(feedbackTicket);
return Result.success(id);
}
@PutMapping
@Operation(summary = "编辑反馈工单", description = "编辑已有的反馈工单")
public Result<Void> updateFeedbackTicket(@RequestBody FeedbackTicket feedbackTicket) {
feedbackTicketService.updateFeedbackTicket(feedbackTicket);
return Result.success();
}
@GetMapping("/personal")
@Operation(summary = "个人反馈工单查询", description = "查询当前用户的反馈工单")
public Result<List<FeedbackTicket>> getPersonalFeedbackTickets(@RequestParam Long userId) {
List<FeedbackTicket> tickets = feedbackTicketService.getPersonalFeedbackTickets(userId);
return Result.success(tickets);
}
@GetMapping("/admin")
@Operation(summary = "管理员反馈工单分页查询", description = "管理员分页查询所有反馈工单")
public Result<PageResponse<FeedbackTicket>> getAdminFeedbackTickets(PageRequest request) {
PageResponse<FeedbackTicket> pageResponse = feedbackTicketService.getAdminFeedbackTickets(request);
return Result.success(pageResponse);
}
}

@ -0,0 +1,2 @@
package com.luojia_channel.modules.feedback.dto;public class FeedbackTicketBasicInfoDTO {
}

@ -0,0 +1,2 @@
package com.luojia_channel.modules.feedback.dto;public class FeedbackTicketPageQueryDTO {
}

@ -0,0 +1,2 @@
package com.luojia_channel.modules.feedback.entity;public class FeedbackTicket {
}

@ -0,0 +1,10 @@
package com.luojia_channel.modules.feedback.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.luojia_channel.modules.feedback.entity.FeedbackTicket;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FeedbackTicketMapper extends BaseMapper<FeedbackTicket> {
}

@ -0,0 +1,34 @@
package com.luojia_channel.modules.feedback.mq.consumer;
import com.luojia_channel.modules.feedback.config.FeedbackRabbitMQConfig;
import com.luojia_channel.modules.feedback.entity.FeedbackTicket;
import com.luojia_channel.modules.feedback.service.FeedbackTicketService;
import com.luojia_channel.modules.message.mq.MessageWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RequiredArgsConstructor
public class FeedbackMessageConsumer {
private final FeedbackTicketService feedbackTicketService;
@RabbitListener(queues = FeedbackRabbitMQConfig.FEEDBACK_DLX_QUEUE)
public void handleFeedbackMessage(MessageWrapper<FeedbackTicket> wrapper) {
try {
FeedbackTicket ticket = wrapper.getMessage();
log.info("收到反馈工单延时消息工单ID{}", ticket.getId());
// 处理延时任务,例如更新工单状态
feedbackTicketService.processDelayedFeedback(ticket.getId());
} catch (Exception e) {
log.error("处理反馈工单延时消息失败消息ID{}", wrapper.getUuid(), e);
throw e;
}
}
}

@ -0,0 +1,2 @@
package com.luojia_channel.modules.feedback.mq.domain;public class DelayHandleTicketMessage {
}

@ -0,0 +1,47 @@
package com.luojia_channel.modules.feedback.mq.producer;
import com.luojia_channel.modules.feedback.config.FeedbackRabbitMQConfig;
import com.luojia_channel.modules.feedback.entity.FeedbackTicket;
import com.luojia_channel.modules.message.mq.AbstractSendProduceTemplate;
import com.luojia_channel.modules.message.mq.MessageWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RequiredArgsConstructor
public class FeedbackMessageProducer {
private final RabbitTemplate rabbitTemplate;
public void sendDelayMessage(FeedbackTicket ticket, Long delayTime) {
try {
// 构建消息包装器
MessageWrapper<FeedbackTicket> wrapper = MessageWrapper.<FeedbackTicket>builder()
.keys("feedback_" + ticket.getId())
.message(ticket)
.build();
// 发送消息到延迟队列设置消息TTL过期时间
rabbitTemplate.convertAndSend(
FeedbackRabbitMQConfig.FEEDBACK_EXCHANGE,
FeedbackRabbitMQConfig.FEEDBACK_ROUTING_KEY,
wrapper,
message -> {
message.getMessageProperties().setExpiration(delayTime.toString());
return message;
}
);
log.info("反馈工单延时消息发送成功工单ID{},延迟时间:{}ms",
ticket.getId(), delayTime);
} catch (Exception e) {
log.error("反馈工单延时消息发送失败工单ID{}", ticket.getId(), e);
throw e;
}
}
}

@ -0,0 +1,37 @@
package com.luojia_channel.modules.feedback.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.luojia_channel.modules.feedback.entity.FeedbackTicket;
import com.luojia_channel.common.domain.page.PageRequest;
import com.luojia_channel.common.domain.page.PageResponse;
import java.util.List;
public interface FeedbackTicketService extends IService<FeedbackTicket> {
/**
*
* @param feedbackTicket
* @return ID
*/
Long createFeedbackTicket(FeedbackTicket feedbackTicket);
/**
*
* @param feedbackTicket
*/
void updateFeedbackTicket(FeedbackTicket feedbackTicket);
/**
*
* @param userId ID
* @return
*/
List<FeedbackTicket> getPersonalFeedbackTickets(Long userId);
/**
*
* @param request
* @return
*/
PageResponse<FeedbackTicket> getAdminFeedbackTickets(PageRequest request);
}

@ -0,0 +1,2 @@
package com.luojia_channel.modules.feedback.service.impl;public class FeedbackTicketServiceImpl {
}
Loading…
Cancel
Save