lrf 8 달 전
부모
커밋
78c9d1ca84

+ 15 - 11
src/main/java/com/free/config/ExceptionEnum.java

@@ -12,17 +12,21 @@ public enum ExceptionEnum {
   APPLY_NOT_AGREE("4005", "您的转人工申请正在等待客服人员受理,请稍等片刻"),
   APPLY_NOT_ClOSE("4006", "您的转人工服务未关闭,无法再次进行转人工申请"),
   NEED_CLOSE_OTHER_APPLYS("4007", "该用户存在其他受理中的转人工服务,请关闭该用户其他的转人工服务后,再受理本次转人工申请"),
-  ACCOUNT_IS_EXIST("4002", "账号已存在"),
-  ACCOUNT_NOT_FOUND("4011", "未找到账号信息"),
-  PASSWORD_ERROR("4012", "密码错误"),
-  TOKEN_NOT_FOUND("4013", "未找到登录信息"),
-  TOKEN_INVALID("4014", "登录已超时,请重新登录"),
-  OTHER_PLACE_LOGIN("4015", "该用户已在其他地点登录,请重新登录"),
-  TOKEN_ERROR("4016", "登录信息解析发生错误,请重新登录"),
-  NO_LOGIN_RECORD("4017", "未找到登录信息,请重新登录"),
-  ACCOUNT_IS_LOGOUT("4018", "该用户已登出,如要使用请重新登录"),
-  USER_TYPE_ERROR("4019", "用户类型错误"),
-  USER_ROLE_NOT_FOUND("40110", "未找到用户角色信息"),
+  APPLY_NOT_FOUNT("4008", "未找到转人工申请信息"),
+  CHAT_APPLY_NOT_AGREE("4009", "转人工申请未通过受理"),
+  CHAT_APPLY_IS_CLOSE("40010", "转人工申请已结束"),
+  CHAT_SPEAKER_NOT_IN_APPLY("40011", "当前用户无法发言"),
+  ACCOUNT_IS_EXIST("4011", "账号已存在"),
+  ACCOUNT_NOT_FOUND("4012", "未找到账号信息"),
+  PASSWORD_ERROR("4013", "密码错误"),
+  TOKEN_NOT_FOUND("4014", "未找到登录信息"),
+  TOKEN_INVALID("4015", "登录已超时,请重新登录"),
+  OTHER_PLACE_LOGIN("4016", "该用户已在其他地点登录,请重新登录"),
+  TOKEN_ERROR("4017", "登录信息解析发生错误,请重新登录"),
+  NO_LOGIN_RECORD("4018", "未找到登录信息,请重新登录"),
+  ACCOUNT_IS_LOGOUT("4019", "该用户已登出,如要使用请重新登录"),
+  USER_TYPE_ERROR("40110", "用户类型错误"),
+  USER_ROLE_NOT_FOUND("40111", "未找到用户角色信息"),
   // 数据操作异常定义
   NOT_FOUND("404", "数据不存在或已删除!");
 

+ 42 - 5
src/main/java/com/free/controller/ChatRecordController.java

@@ -22,8 +22,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.free.config.CustomizationException;
 import com.free.config.ExceptionEnum;
 import com.free.config.ResponseFormat;
+import com.free.dto.ChatRecordCreateDTO;
 import com.free.entity.ChatRecord;
+import com.free.entity.TransferApply;
+import com.free.mq.MqService;
 import com.free.service.ChatRecordService;
+import com.free.service.TransferApplyService;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -34,22 +38,55 @@ import io.swagger.annotations.ApiOperation;
 public class ChatRecordController {
   @Autowired
   private ChatRecordService service;
+  @Autowired
+  private TransferApplyService transferApplyService;
+
+  @Autowired
+  private MqService mqService;
 
   /** 创建数据 */
   @ApiOperation("创建数据")
   @PostMapping("")
-  public Object save(@RequestBody @Valid ChatRecord data) {
+  public Object save(@RequestBody @Valid ChatRecordCreateDTO body) {
+    // 创建对话记录前,检查 转人工申请状态 及 发言人 是否在 转人工申请中;
+    TransferApply apply = transferApplyService.getById(body.getApply_id());
+    if (null == apply) {
+      throw new CustomizationException(ExceptionEnum.APPLY_NOT_FOUNT);
+    }
+    String is_agree = apply.getIs_agree();
+    if (!TransferApplyController.TransferApplyAgree.equals(is_agree)) {
+      // 抛出异常,当前申请未受理
+      throw new CustomizationException(ExceptionEnum.CHAT_APPLY_NOT_AGREE);
+    }
+    int is_close = apply.getIs_close();
+    if (TransferApplyController.TransferApplyClose == is_close) {
+      // 抛出异常,当前申请已结束
+      throw new CustomizationException(ExceptionEnum.CHAT_APPLY_IS_CLOSE);
+    }
+    Long customer_id = apply.getCustomer_id();
+    Long user_id = apply.getUser_id();
+    Long speaker = body.getSpeaker();
+    if (customer_id != speaker && user_id != speaker) {
+      // 抛出异常,发言人既不是该申请的客服人员,也不是用户
+      throw new CustomizationException(ExceptionEnum.CHAT_SPEAKER_NOT_IN_APPLY);
+    }
+    ChatRecord data = new ChatRecord();
+    data.setApply_id(body.getApply_id());
+    data.setSpeaker(body.getSpeaker());
+    data.setContent(body.getContent());
     this.service.save(data);
     QueryWrapper qw = new QueryWrapper<>();
     qw.eq("id", data.getId());
     Map returnData = this.service.getMap(qw);
+    // TODO:发送mq消息,往chat.${apply_id}中发,客服和用户都会订阅这个
+    mqService.sendChatToApply(returnData);
     return ResponseFormat.success(returnData);
     // return ResponseFormat.success();
   }
 
-  /** 修改数据 */
+  /** 修改数据, 转人工对话不修改 */
   @ApiOperation("修改数据")
-  @PostMapping("/{id}")
+  // @PostMapping("/{id}")
   public Object update(@PathVariable long id, @RequestBody ChatRecord data) {
     QueryWrapper qw = new QueryWrapper<>();
     qw.eq("id", id);
@@ -106,9 +143,9 @@ public class ChatRecordController {
     return ResponseFormat.success(newData);
   }
 
-  /** 根据id删除数据 */
+  /** 根据id删除数据 , 无删除 */
   @ApiOperation("删除数据")
-  @DeleteMapping("/{id}")
+  // @DeleteMapping("/{id}")
   public Object delete(@PathVariable long id) {
     QueryWrapper qw = new QueryWrapper<>();
     qw.eq("id", id);

+ 3 - 1
src/main/java/com/free/controller/MqController.java

@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.free.annotation.PassToken;
 import com.free.config.ResponseFormat;
 import com.free.mq.MqListeners;
 import com.free.mq.MqService;
@@ -23,6 +24,7 @@ public class MqController {
   @Autowired
   MqService mqService;
 
+  @PassToken
   @PostMapping("/mq/send")
   public Object mqSendTest(@RequestBody Map map) throws JsonProcessingException {
     System.out.println(map);
@@ -32,7 +34,7 @@ public class MqController {
     map.put("id", messageId);
     mqService.sendMsg(MqListeners.exName, queue, map);
     // 通知admin对话了
-    mqService.sendMsg(MqListeners.adminExName, null, messageId);
+    mqService.sendMsg(MqListeners.userExName, MqListeners.userQueue + ".1", map);
     return ResponseFormat.success();
   }
 

+ 6 - 3
src/main/java/com/free/controller/TestController.java

@@ -2,10 +2,12 @@ package com.free.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.free.annotation.PassToken;
 import com.free.config.CustomizationException;
 import com.free.config.ExceptionEnum;
 import com.free.config.ResponseFormat;
 import com.free.entity.Test;
+import com.free.mq.MqListeners;
 import com.free.mq.MqService;
 import com.free.service.TestService;
 
@@ -29,8 +31,9 @@ public class TestController {
 
   @Autowired
   MqService mqService;
-
-  @GetMapping("/mq/send")
+  
+  @PassToken
+  @GetMapping("/mq/send") 
   public Object mqSendTest() throws JsonProcessingException {
     String messageId = String.valueOf(UUID.randomUUID());
     String messageData = "message: M A N ";
@@ -39,7 +42,7 @@ public class TestController {
     manMap.put("messageId", messageId);
     manMap.put("messageData", messageData);
     manMap.put("createTime", createTime);
-    mqService.sendMsg("chatEx", "chat.1", manMap);
+    mqService.sendMsg(MqListeners.userExName, MqListeners.userQueue + ".1", manMap);
     return ResponseFormat.success();
   }
 

+ 10 - 7
src/main/java/com/free/controller/TransferApplyController.java

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.free.config.CustomizationException;
 import com.free.config.ExceptionEnum;
 import com.free.config.ResponseFormat;
+import com.free.dto.TransferApplyCreateDTO;
 import com.free.entity.TransferApply;
 import com.free.mq.MqService;
 import com.free.service.TransferApplyService;
@@ -38,21 +39,21 @@ public class TransferApplyController {
   @Autowired
   private MqService mqService;
   /** 转人工申请,受理转人工-受理申请标识 */
-  private final static String TransferApplyAgree = "0";
+  public final static String TransferApplyAgree = "0";
   /** 转人工申请,受理转人工-拒绝申请标识 */
-  private final static String TransferApplyNotAgree = "1";
+  public final static String TransferApplyNotAgree = "1";
   /** 转人工申请,受理转人工-结束标识 */
-  private final static String TransferApplyClose = "0";
+  public final static int TransferApplyClose = 0;
   /** 转人工申请,受理转人工-未结束标识 */
-  private final static String TransferApplyNotClose = "1";
+  public final static int TransferApplyNotClose = 1;
 
   /** 创建数据 */
   @ApiOperation("创建数据")
   @PostMapping("")
-  public Object save(@RequestBody @Valid TransferApply data) {
+  public Object save(@RequestBody @Valid TransferApplyCreateDTO body) {
     // 查询是否有申请但是未受理的数据
     QueryWrapper checkHasAppplyNotAgreeQw = new QueryWrapper<>();
-    checkHasAppplyNotAgreeQw.eq("user_id", data.getUser_id());
+    checkHasAppplyNotAgreeQw.eq("user_id", body.getUser_id());
     checkHasAppplyNotAgreeQw.eq("is_agree", TransferApplyNotAgree);
     Map hasApplyNotAgree = service.getMap(checkHasAppplyNotAgreeQw);
     if (null != hasApplyNotAgree) {
@@ -62,13 +63,15 @@ public class TransferApplyController {
     }
     // 查询是否有申请但是受理中的数据
     QueryWrapper checkHasApplyNotCloseQw = new QueryWrapper<>();
-    checkHasApplyNotCloseQw.eq("user_id", data.getUser_id());
+    checkHasApplyNotCloseQw.eq("user_id", body.getUser_id());
     checkHasApplyNotCloseQw.eq("is_agree", TransferApplyAgree);
     checkHasApplyNotCloseQw.eq("is_close", TransferApplyNotClose);
     Map hasApplyNotClose = service.getMap(checkHasApplyNotCloseQw);
     if (null != hasApplyNotClose) {
       throw new CustomizationException(ExceptionEnum.APPLY_NOT_ClOSE);
     }
+    TransferApply data = new TransferApply();
+    data.setUser_id(body.getUser_id());
     this.service.save(data);
     QueryWrapper qw = new QueryWrapper<>();
     qw.eq("id", data.getId());

+ 15 - 0
src/main/java/com/free/dto/ChatRecordCreateDTO.java

@@ -0,0 +1,15 @@
+package com.free.dto;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import lombok.Data;
+@Data
+public class ChatRecordCreateDTO {
+  @NotNull(message = "缺少当前会话信息")
+  private Long apply_id;
+  @NotNull(message = "缺少发言人信息")
+  private Long speaker;
+  @NotBlank(message = "请输入发言内容")
+  private String content;
+}

+ 12 - 0
src/main/java/com/free/dto/TransferApplyCreateDTO.java

@@ -0,0 +1,12 @@
+package com.free.dto;
+
+import javax.validation.constraints.NotNull;
+
+import lombok.Data;
+
+@Data
+public class TransferApplyCreateDTO {
+  @NotNull(message = "缺少用户信息")
+  private Long user_id;
+
+}

+ 12 - 12
src/main/java/com/free/entity/ChatRecord.java

@@ -23,25 +23,25 @@ import lombok.EqualsAndHashCode;
 @TableName(value = "chatRecord")
 @ApiModel("对话记录")
 public class ChatRecord extends BaseEntity {
-  @Column(comment = "客服人员id")
-  @TableField(value = "customer_id")
-  @ApiModelProperty("客服人员id")
-  private Long customer_id;
-  
-  @Column(comment = "用户id")
-  @TableField(value = "user_id")
-  @ApiModelProperty("用户id")
-  private Long user_id;
+  @Column(comment = "转人工申请id")
+  @TableField(value = "apply_id")
+  @ApiModelProperty("转人工申请id")
+  private Long apply_id;
+
+  @Column(comment = "发言人")
+  @TableField(value = "speaker")
+  @ApiModelProperty("发言人")
+  private Long speaker;
 
   @TableField(fill = FieldFill.INSERT, select = false)
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
   @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-  @ApiModelProperty("对话时间")
+  @ApiModelProperty("发言时间")
   private LocalDateTime time;
 
-  @Column(comment = "对话内容", type = MySqlTypeConstant.TEXT)
+  @Column(comment = "发言内容", type = MySqlTypeConstant.TEXT)
   @TableField(value = "content")
-  @ApiModelProperty("对话内容")
+  @ApiModelProperty("发言内容")
   private String content;
 
 }

+ 29 - 1
src/main/java/com/free/mq/MqListeners.java

@@ -16,13 +16,21 @@ public class MqListeners {
   /** 管理用 - 队列名 */
   public final static String adminQueue = "msg";
 
+  /** 用户用 - 交换机 */
+  public final static String userExName = "userEx";
+  /** 用户用 - 队列名 */
+  public final static String userQueue = "umsg";
+  /** 用户用 - 路由匹配 *: 用户唯一标识 */
+  public final static String userRouterMatch = userQueue + ".*";
+
   /** 对话用 - 交换机名 */
   public final static String exName = "chatEx";
   /** 对话用 - 队列名 */
   public final static String queueName = "chat";
-  /** 对话用 - 路由匹配 */
+  /** 对话用 - 路由匹配 *: 转人工申请id */
   public final static String routerMatch = queueName + ".*";
 
+  // admin
   @Bean()
   public Queue adminQueue() {
     System.out.println("create " + adminQueue + " queue");
@@ -42,6 +50,26 @@ public class MqListeners {
     return BindingBuilder.bind(adminQueue()).to(admiExchange());
   }
 
+  // user
+  @Bean
+  public Queue userQueue() {
+    System.out.println("create " + userQueue + " queue");
+    return new Queue(userQueue, true);
+  }
+
+  @Bean
+  TopicExchange userExchange() {
+    System.out.println("create " + userExName + " ex");
+    return new TopicExchange(userExName);
+  }
+
+  @Bean
+  Binding bindingUserExchangeMessage() {
+    System.out.println("bind " + userExName + " +" + userQueue + " with router key " + userRouterMatch);
+    return BindingBuilder.bind(userQueue()).to(userExchange()).with(userRouterMatch);
+  }
+
+  // chat
   /** 声明队列 */
   @Bean
   public Queue chatQueue() {

+ 17 - 0
src/main/java/com/free/mq/MqService.java

@@ -36,6 +36,23 @@ public class MqService {
     strMsg = mapper.writeValueAsString(msg);
     rabbitTemplate.convertAndSend(ex, queue, strMsg);
   }
+  /**
+   * 转人工对话mq消息
+   * @param data ChatRecord数据
+   */
+  public void sendChatToApply(Map data) {
+    Map map = new HashMap<>();
+    map.put("type", "chat");
+    map.put("data", data);
+    Long apply_id = Long.valueOf(String.valueOf(data.get("apply_id")));
+    String queue = MqListeners.queueName + "." + apply_id;
+    try {
+      this.sendMsg(MqListeners.exName, queue, map);
+    } catch (JsonProcessingException e) {
+      e.printStackTrace();
+      log.error("转人工对话通知mq发送失败", e);
+    }
+  }
 
   /**
    * 向管理员订阅队列发送消息,通知管理员去处理转人工申请