1021934019@qq.com 3 years ago
parent
commit
6af602f9b4

+ 22 - 4
blade-service/blade-client/pom.xml

@@ -13,7 +13,11 @@
     <name>${project.artifactId}</name>
     <version>2.8.2.RELEASE</version>
     <dependencies>
-
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
         <dependency>
             <groupId>org.mapstruct</groupId>
             <artifactId>mapstruct</artifactId>
@@ -86,12 +90,26 @@
             <artifactId>blade-starter-transaction</artifactId>
         </dependency>
         <!-- websocket -->
-        <dependency>
+       <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
         <!-- spring web排除tomcat -->
-     <!--   <dependency>
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
             <exclusions>
@@ -100,7 +118,7 @@
                     <artifactId>spring-boot-starter-tomcat</artifactId>
                 </exclusion>
             </exclusions>
-        </dependency>-->
+        </dependency>
     </dependencies>
 
 

+ 33 - 0
blade-service/blade-client/src/main/java/org/springblade/client/Interceptor/WebSocketInterceptor.java

@@ -0,0 +1,33 @@
+package org.springblade.client.Interceptor;
+
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+
+public class WebSocketInterceptor implements HandshakeInterceptor {
+
+	/**
+	 * handler处理前调用,attributes属性最终在WebSocketSession里,可能通过webSocketSession.getAttributes().get(key值)获得
+	 */
+	@Override
+	public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
+		if (request instanceof ServletServerHttpRequest) {
+			ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
+			// 获取请求路径携带的参数
+			String user = serverHttpRequest.getServletRequest().getParameter("user");
+			attributes.put("user", user);
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	@Override
+	public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
+
+	}
+}

+ 30 - 0
blade-service/blade-client/src/main/java/org/springblade/client/config/WebSocketAutoConfig.java

@@ -0,0 +1,30 @@
+package org.springblade.client.config;
+
+import org.springblade.client.Interceptor.WebSocketInterceptor;
+import org.springblade.client.handler.WebSocketHandler;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+@Configuration
+@EnableWebSocket
+public class WebSocketAutoConfig implements WebSocketConfigurer {
+
+	@Override
+	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+		// webSocket通道
+		// 指定处理器和路径
+		registry.addHandler(new WebSocketHandler(), "/websocket")
+			// 指定自定义拦截器
+			.addInterceptors(new WebSocketInterceptor())
+			// 允许跨域
+			.setAllowedOrigins("*");
+		// sockJs通道
+		registry.addHandler(new WebSocketHandler(), "/sock-js")
+			.addInterceptors(new WebSocketInterceptor())
+			.setAllowedOrigins("*")
+			// 开启sockJs支持
+			.withSockJS();
+	}
+}

+ 0 - 24
blade-service/blade-client/src/main/java/org/springblade/client/config/WebSocketConfig.java

@@ -1,24 +0,0 @@
-package org.springblade.client.config;
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Component;
-import org.springframework.web.socket.server.standard.ServerEndpointExporter;
-
-
-/*
-@Component
-public class WebSocketConfig
-{
-
-*/
-/*
-  *
-     * 	注入ServerEndpointExporter,
-     * 	这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket
-*//*
-
-    @Bean
-    public ServerEndpointExporter serverEndpointExporter() {
-        return new ServerEndpointExporter();
-    }
-}
-*/

+ 127 - 0
blade-service/blade-client/src/main/java/org/springblade/client/handler/WebSocketHandler.java

@@ -0,0 +1,127 @@
+package org.springblade.client.handler;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.reflect.FieldUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.*;
+import org.springframework.web.socket.handler.AbstractWebSocketHandler;
+import org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession;
+@Slf4j
+@Component
+public class WebSocketHandler extends AbstractWebSocketHandler {
+
+	/**
+	 * 存储sessionId和webSocketSession
+	 * 需要注意的是,webSocketSession没有提供无参构造,不能进行序列化,也就不能通过redis存储
+	 * 在分布式系统中,要想别的办法实现webSocketSession共享
+	 */
+	private static Map<String, WebSocketSession> sessionMap = new ConcurrentHashMap<>();
+	private static Map<String, String> userMap = new ConcurrentHashMap<>();
+
+	/**
+	 * 获取sessionId
+	 */
+	private String getSessionId(WebSocketSession session) {
+		if (session instanceof WebSocketServerSockJsSession) {
+			// sock js 连接
+			try {
+				return  ((WebSocketSession) FieldUtils.readField(session, "webSocketSession", true)).getId();
+			} catch (IllegalAccessException e) {
+				throw new RuntimeException("get sessionId error");
+			}
+		}
+		return session.getId();
+	}
+
+	/**
+	 * webSocket连接创建后调用
+	 */
+	@Override
+	public void afterConnectionEstablished(WebSocketSession session) {
+		// 获取参数
+		String user = String.valueOf(session.getAttributes().get("user"));
+		String sessionId = getSessionId(session);
+		userMap.put(user, getSessionId(session));
+		sessionMap.put(sessionId, session);
+		log.info("【当前socket链接人数】:==>"+sessionMap.size());
+		send(user);
+	}
+
+	/**
+	 * 接收到消息会调用
+	 */
+	@Override
+	public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
+		if (message instanceof TextMessage) {
+
+		} else if (message instanceof BinaryMessage) {
+
+		} else if (message instanceof PongMessage) {
+
+		} else {
+			System.out.println("Unexpected WebSocket message type: " + message);
+		}
+	}
+
+	/**
+	 * 连接出错会调用
+	 */
+	@Override
+	public void handleTransportError(WebSocketSession session, Throwable exception) {
+		sessionMap.remove(getSessionId(session));
+	}
+
+	/**
+	 * 连接关闭会调用
+	 */
+	@Override
+	public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
+		sessionMap.remove(getSessionId(session));
+	}
+
+	@Override
+	public boolean supportsPartialMessages() {
+		return false;
+	}
+
+	/**
+	 * 后端发送消息
+	 */
+	public void sendMessage(String user, String message) {
+		String sessionId = userMap.get(user);
+		WebSocketSession session = sessionMap.get(sessionId);
+		try {
+			log.info("【websocket消息】 单点消息:"+message);
+			session.sendMessage(new TextMessage(message));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void send(String user)
+	{
+		try
+		{
+			while(true)
+			{
+				int max=175;
+				int min=10;
+				Random random = new Random();
+				int x = random.nextInt(max) % (max - min + 1) + min;
+				int y = random.nextInt(max) % (max - min + 1) + min;
+				String mark="["+x+","+y+"]";
+				sendMessage(user,mark);
+				Thread.sleep(6000);
+			}
+		}
+		catch (InterruptedException e)
+		{
+			e.printStackTrace();
+		}
+	}
+}

+ 6 - 2
blade-service/blade-client/src/main/java/org/springblade/client/message/socket/MessageWebSocket.java

@@ -20,18 +20,21 @@ import java.util.concurrent.CopyOnWriteArraySet;
 /**
  * 消息信息推送socket
  */
+/*
 @Component
 @Slf4j
 @ServerEndpoint("/websocket/{userId}")
 public class MessageWebSocket
 {
 
-    /**使用示例
+    */
+/**使用示例
      * 在业务中操作websocket
      * @Autowried webSocket webSocket;
      * webSocket.sendAllMessage("你有一条新的推送");
      *
-     * */
+     * *//*
+
 
 
     private Session session;
@@ -136,3 +139,4 @@ public class MessageWebSocket
         }
     }
 }
+*/

+ 51 - 1
blade-service/blade-stock/src/main/java/org/springblade/stock/controller/StockGoodsController.java

@@ -169,7 +169,57 @@ public class StockGoodsController extends BladeController {
 		{
 			IPage<StockGoods> iPage = stockGoodsService.groupByStock(Condition.getPage(query));
 			List<StockGoods> records = iPage.getRecords();
-			return R.success("操作成功");
+			if(CollectionUtils.isNotEmpty(records))
+			{
+				records.forEach(item->{
+					//获取商品信息
+					R<GoodsDescVO> goodsMessage = goodsDescClient.selectGoodsMessage(item.getGoodsId());
+					if (goodsMessage.isSuccess() && goodsMessage.getData() != null){
+						if (StringUtils.isNotBlank(goodsMessage.getData().getBrand())){
+							item.setBrand(goodsMessage.getData().getBrand());
+						}
+						if (StringUtils.isNotBlank(goodsMessage.getData().getBrandItem())){
+							item.setBrandItem(goodsMessage.getData().getBrandItem());
+						}
+						if (StringUtils.isNotBlank(goodsMessage.getData().getTypeno())){
+							item.setTypeno(goodsMessage.getData().getTypeno());
+						}
+						item.setCname(goodsMessage.getData().getCname());
+						item.setCode(goodsMessage.getData().getCode());
+					}
+					//获取客户信息
+					R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(item.getCorpId());
+					if (corpMessage.isSuccess() && corpMessage.getData() != null){
+						item.setCorpName(corpMessage.getData().getCname());
+					}
+					//获取用户信息
+					if (item.getCreateUser() != null){
+						R<User> createUser = userClient.userInfoById(item.getCreateUser());
+						if (createUser.isSuccess() && createUser.getData() != null){
+							item.setCreateUserName(createUser.getData().getName());
+						}
+					}
+					//获取仓库信息
+					if (item.getStorageId() != null){
+						//仓库信息
+						StorageDesc storageDesc = iStorageClient.findById(item.getStorageId());
+						if(storageDesc!=null)
+						{
+							item.setStockName(storageDesc.getCname());
+						}
+
+					}
+					if (item.getUpdateUser() != null){
+						R<User> updateUser = userClient.userInfoById(item.getUpdateUser());
+						if (updateUser.isSuccess() && updateUser.getData() != null){
+							item.setUpdateUserName(updateUser.getData().getName());
+						}
+					}
+				});
+
+			}
+			iPage.setRecords(records);
+			return R.data(iPage);
 		}
 		else
 		{