Browse Source

外呼系统开发

anderx 1 year ago
parent
commit
8bf9aba973

+ 27 - 0
src/main/java/com/goafanti/customer/bo/SseEmitterUTF8.java

@@ -0,0 +1,27 @@
+package com.goafanti.customer.bo;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+import java.nio.charset.Charset;
+
+/**
+ * 直接使用会有乱码问题,继承一下,重写下修改后就没有问题了
+ */
+public class SseEmitterUTF8 extends SseEmitter {
+
+        public SseEmitterUTF8(Long timeout) {
+            super(timeout);
+        }
+
+        @Override
+        protected void extendResponse(ServerHttpResponse outputMessage) {
+            super.extendResponse(outputMessage);
+
+            HttpHeaders headers = outputMessage.getHeaders();
+            headers.setContentType( new MediaType("text", "event-stream", Charset.forName("UTF-8")));
+        }
+    }
+

+ 9 - 0
src/main/java/com/goafanti/customer/bo/SseMap.java

@@ -0,0 +1,9 @@
+package com.goafanti.customer.bo;
+
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class SseMap {
+    public static final Map<String, SseResult> sseEmitterMap = new ConcurrentHashMap<>();
+}

+ 41 - 0
src/main/java/com/goafanti/customer/bo/SseResult.java

@@ -0,0 +1,41 @@
+package com.goafanti.customer.bo;
+
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+public class SseResult {
+
+        public String clientId;
+        public long timestamp;
+        public SseEmitterUTF8 sseEmitter;
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public SseEmitter getSseEmitter() {
+        return sseEmitter;
+    }
+
+    public SseResult(String clientId, long timestamp, SseEmitterUTF8 sseEmitter) {
+        this.clientId = clientId;
+        this.timestamp = timestamp;
+        this.sseEmitter = sseEmitter;
+    }
+
+    public SseResult() {
+    }
+}
+
+

+ 13 - 2
src/main/java/com/goafanti/customer/controller/UserOutboundApiController.java

@@ -5,13 +5,13 @@ import com.goafanti.common.bo.Result;
 import com.goafanti.common.controller.BaseApiController;
 import com.goafanti.common.model.Admin;
 import com.goafanti.core.shiro.token.TokenManager;
-import com.goafanti.customer.bo.InputCallNumber;
-import com.goafanti.customer.bo.InputUserCallList;
+import com.goafanti.customer.bo.*;
 import com.goafanti.customer.service.UserOutboundService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import javax.annotation.Resource;
 
@@ -108,4 +108,15 @@ public class UserOutboundApiController  extends BaseApiController {
     public Result userCallList(InputUserCallList in) {
         return new Result<>().data(this.userOutboundService.userCallList(in));
     }
+
+    /**
+     * 开启长连接
+     */
+    @RequestMapping("/SSeStart")
+    public SseEmitter testSseEmitter() {
+        // 默认30秒超时,设置为0L则永不超时
+        SseEmitterUTF8 sseEmitter = new SseEmitterUTF8(3600_000L);
+        SseMap.sseEmitterMap.put(TokenManager.getAdminId(), new SseResult(TokenManager.getAdminId(), System.currentTimeMillis(), sseEmitter));
+        return sseEmitter;
+    }
 }

+ 12 - 4
src/main/java/com/goafanti/customer/service/impl/UserOutboundServiceImpl.java

@@ -13,13 +13,15 @@ import com.goafanti.common.utils.LoggerUtils;
 import com.goafanti.common.utils.StringUtils;
 import com.goafanti.core.mybatis.BaseMybatisDao;
 import com.goafanti.core.mybatis.page.Pagination;
+import com.goafanti.core.shiro.token.TokenManager;
 import com.goafanti.core.websocket.SystemWebSocketHandler;
 import com.goafanti.customer.bo.InputCallNumber;
 import com.goafanti.customer.bo.InputUserCallList;
+import com.goafanti.customer.bo.SseMap;
+import com.goafanti.customer.bo.SseResult;
 import com.goafanti.customer.service.UserOutboundService;
 import org.apache.shiro.crypto.hash.SimpleHash;
 import org.springframework.stereotype.Service;
-import org.springframework.web.socket.TextMessage;
 
 import javax.annotation.Resource;
 import java.util.HashMap;
@@ -195,11 +197,17 @@ public class UserOutboundServiceImpl extends BaseMybatisDao<CallLogMapper> imple
         callLogMapper.insert(callLog);
         pushCountUser(uid);
         //需要关闭客户呼叫中
+        SseResult res =  SseMap.sseEmitterMap.get(TokenManager.getAdminId());
+
         try {
-            LoggerUtils.debug(getClass(),String.format("websocket通信成功=》%s=%s",callResult,callResultMsg));
-            systemWebSocketHandler.sendMessageToUser(admin.getId(), new TextMessage(callResult));
+        res.sseEmitter.send(callResult);
+//            systemWebSocketHandler.sendMessageToUser(admin.getId(), new TextMessage(callResult));
+            LoggerUtils.debug(getClass(),String.format("通信成功=》%s=%s",callResult,callResultMsg));
         }catch (Exception e ){
-            LoggerUtils.error(getClass(),"websocket通信失败");
+            LoggerUtils.error(getClass(),"通信失败");
+        }finally {
+            res.sseEmitter.complete();
+            SseMap.sseEmitterMap.remove(TokenManager.getAdminId());
         }
         return 1;
     }