소스 검색

修改视频推送

humuyu 3 년 전
부모
커밋
8d4ec38395
28개의 변경된 파일1477개의 추가작업 그리고 296개의 파일을 삭제
  1. 2 1
      eladmin-common/src/main/java/me/zhengjie/base/ResultCode.java
  2. 1 1
      eladmin-common/src/main/java/me/zhengjie/utils/ClientCache.java
  3. 181 0
      eladmin-common/src/main/java/me/zhengjie/websocket/AppPcBindSocketIo.java
  4. 77 0
      eladmin-common/src/main/java/me/zhengjie/websocket/AppSocketClientCache.java
  5. 77 0
      eladmin-common/src/main/java/me/zhengjie/websocket/PcSocketClientCache.java
  6. 159 0
      eladmin-common/src/main/java/me/zhengjie/websocket/SocketEventListenner.java
  7. 0 79
      eladmin-common/src/main/java/me/zhengjie/websocket/WebSocketEventListenner.java
  8. 33 49
      eladmin-logging/src/main/java/me/zhengjie/aspect/LogRequestParam.java
  9. 12 6
      eladmin-security/src/main/java/me/zhengjie/security/security/TokenProvider.java
  10. 89 15
      eladmin-security/src/main/java/me/zhengjie/security/service/OnlineUserService.java
  11. 110 12
      eladmin-system/src/main/java/me/zhengjie/application/admin/controller/OrderRoomIdController.java
  12. 1 3
      eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/OrderCochainServiceImpl.java
  13. 43 22
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankNotarizeController.java
  14. 12 0
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/vo/BankLoginVO.java
  15. 6 0
      eladmin-system/src/main/java/me/zhengjie/application/bank/service/BankNotarizeService.java
  16. 115 45
      eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/BankNotarizeServiceImpl.java
  17. 102 44
      eladmin-system/src/main/java/me/zhengjie/application/user/app/mq/WebSocketReceiver.java
  18. 15 10
      eladmin-system/src/main/java/me/zhengjie/base/mq/MessagePushConfig.java
  19. 107 0
      eladmin-system/src/main/java/me/zhengjie/base/websocket/AppRelatePc.java
  20. 68 0
      eladmin-system/src/main/java/me/zhengjie/base/websocket/AppSocketClientCache.java
  21. 68 0
      eladmin-system/src/main/java/me/zhengjie/base/websocket/PcSocketClientCache.java
  22. 28 0
      eladmin-system/src/main/java/me/zhengjie/base/websocket/SocketAuthorizationListener.java
  23. 137 0
      eladmin-system/src/main/java/me/zhengjie/base/websocket/SocketEventListenner.java
  24. 9 0
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/mapper/SysUserMapper.java
  25. 3 3
      eladmin-system/src/main/resources/config/application-nt-test.yml
  26. 5 5
      eladmin-system/src/main/resources/config/application-prod.yml
  27. 1 1
      eladmin-system/src/main/resources/config/application.yml
  28. 16 0
      eladmin-system/src/main/resources/mapper/SysUserMapper.xml

+ 2 - 1
eladmin-common/src/main/java/me/zhengjie/base/ResultCode.java

@@ -55,8 +55,9 @@ public enum ResultCode {
     BUSINESS_IS_TOP(30040, "已经到最顶部"),
     BUSINESS_IS_BOTTOM(30041, "已经到最底部"),
     BUSINESS_NAME_EXISTED(30051, "名称已存在"),
+    NOTARY_OFFLINE(30005, "当前公证员离线,请稍后再试!"),
     LIVING_CERTIFICATION(30006, "请先进行活体认证"),
-    SEAT_BUSY(30007, "当前人工坐席忙,请稍后再试!"),
+    SEAT_BUSY(30007, "当前坐席忙,请稍后再试!"),
     FACEAUTH_FAIL(30008, "活体人脸认证失败,请重试!"),
     SIGN_FAIL(30009, "签名失败,请重试!"),
     CREATEPDF_FAIL(30010, "PDF生成失败!"),

+ 1 - 1
eladmin-common/src/main/java/me/zhengjie/utils/ClientCache.java

@@ -12,7 +12,7 @@ import java.util.concurrent.ConcurrentHashMap;
  * @author litong
  * @date 2019/11/6 16:01
  */
-@Component
+//@Component
 public class ClientCache {
 
 	/**

+ 181 - 0
eladmin-common/src/main/java/me/zhengjie/websocket/AppPcBindSocketIo.java

@@ -0,0 +1,181 @@
+package me.zhengjie.websocket;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.corundumstudio.socketio.SocketIOClient;
+
+import me.zhengjie.utils.RedisUtils;
+
+/**
+ * 
+ * @author auas
+ *
+ */
+@Component
+public class AppPcBindSocketIo {
+	public final static String PREFIX_BUSINESS_NO = "business-no-";
+	@Autowired
+	RedisUtils redisUtils;
+	/**
+	 * 
+	 * @param businessNo
+	 * @param json 
+	 * @param time 时间单位秒
+	 */
+	public void setBusinessNo(String businessNo, String json, long time) {
+		redisUtils.set(PREFIX_BUSINESS_NO + businessNo, json, time);
+	}
+
+	/**
+	 * 这里是便于删除他继续测试使用
+	 * 
+	 * @param businessNo
+	 * @param json
+	 * @param time
+	 */
+	public void delBusinessNo(String businessNo) {
+		redisUtils.del(PREFIX_BUSINESS_NO + businessNo);
+	}
+
+	/**
+	 * 得到过期时间
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public long getExpire(Object key) {
+		return redisUtils.getExpire(PREFIX_BUSINESS_NO + key);
+	}
+
+	/**
+	 * 设置没有取消的值进行判断
+	 * 
+	 * @param businessNo
+	 * @return
+	 */
+	public void setNoCancelNotary(Set<String> notarys, String businessNo) {
+		List<JSONObject> bindNotarys = new ArrayList<>();
+		for (String userName : notarys) {
+			JSONObject jsonObj = new JSONObject();
+			jsonObj.put("userName", userName);
+			bindNotarys.add(jsonObj);
+		}
+		String notaryJson = JSONObject.toJSONString(bindNotarys);
+		setBusinessNo(businessNo, notaryJson, getExpire(businessNo));
+
+	}
+
+	public Set<String> getBindNotary(String businessNo) {
+		Set<String> userNames = new HashSet<>();
+		String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo);
+		if (StringUtils.isEmpty(key)) {
+			return userNames;
+		}
+		JSONArray json = JSON.parseArray(key);
+		for (int i = 0; i < json.size(); i++) {
+			JSONObject jsonObj = json.getJSONObject(i);
+			String username = jsonObj.getString("userName");
+			userNames.add(username);
+		}
+		return userNames;
+	}
+
+	private void sendAppMsg(String businessNo) {
+		HashMap<UUID, SocketIOClient> appSocketIo = AppSocketClientCache.getAppUserClient(businessNo);
+		if (MapUtils.isNotEmpty(appSocketIo)) {
+			appSocketIo.forEach((uuid, socketIOClient) -> {
+				socketIOClient.sendEvent("cancelEvent", "cancel");
+			});
+		}
+	}
+
+	public void removeNotary(String businessNo, String username) {
+		if (StringUtils.isBlank(businessNo)) {
+			return;
+		}
+		Set<String> notarys = getBindNotary(businessNo);
+		if (CollectionUtils.isEmpty(notarys) || notarys.size() == 1) {
+			// 直接删除这条数据
+			delBusinessNo(businessNo);
+			// TDOO 发送给app。取消了视频通话
+			sendAppMsg(businessNo);
+		} else {
+			notarys.remove(username);
+			// 保存没有取消的时间
+			setNoCancelNotary(notarys, businessNo);
+		}
+
+	}
+
+	public Set<String> getAllBindNotary() {
+		List<String> keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*");
+		Set<String> set = new HashSet<>();
+		for (String key : keys) {
+			JSONArray json = JSON.parseArray((String) redisUtils.get(key));
+			for (int i = 0; i < json.size(); i++) {
+				JSONObject jsonObj = json.getJSONObject(i);
+				String username = jsonObj.getString("userName");
+				set.add(username);
+			}
+		}
+		return set;
+	}
+
+	public Set<String> disconnectNotary(String notary) {
+		List<String> keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*");
+		Set<String> set = new HashSet<>();
+		// 先查询出业务编号
+		String businessNo = "";
+		for (String key : keys) {
+			JSONArray json = JSON.parseArray((String) redisUtils.get(key));
+			for (int i = 0; i < json.size(); i++) {
+				JSONObject jsonObj = json.getJSONObject(i);
+				String username = jsonObj.getString("userName");
+				if (username.equalsIgnoreCase(notary))
+					businessNo = key;
+			}
+		}
+
+		removeNotary(getBindNo(businessNo), notary);
+//		String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo);
+//		JSONArray json = JSON.parseArray((String) redisUtils.get(key));
+
+		return set;
+	}
+
+	public String getBindNo(String businessNo) {
+		if (businessNo.contains(PREFIX_BUSINESS_NO)) {
+			return businessNo.substring(PREFIX_BUSINESS_NO.length());
+		}
+		return businessNo;
+	}
+
+	public void socketIoTime(String socketId, String json) {
+		redisUtils.set(socketId, json, 60 * 5);
+	}
+
+	public List<JSONObject> socketIoTime(String socketId) {
+		String json = (String) redisUtils.get(socketId);
+		List<JSONObject> jsonObj = JSONObject.parseArray(json, JSONObject.class);
+		return jsonObj;
+	}
+
+	public static void main(String[] args) {
+		String str = "business-no-10020221102110257621".substring(PREFIX_BUSINESS_NO.length());
+		System.out.println(str);
+	}
+}

+ 77 - 0
eladmin-common/src/main/java/me/zhengjie/websocket/AppSocketClientCache.java

@@ -0,0 +1,77 @@
+package me.zhengjie.websocket;
+
+import com.corundumstudio.socketio.SocketIOClient;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author humuyu
+ * @date 2022/11/6 16:01
+ */
+@Component
+public class AppSocketClientCache {
+
+	/**
+	 * 本地缓存
+	 */
+	private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap = new ConcurrentHashMap<>();
+
+	/**
+	 * 存入本地缓存
+	 *
+	 * @param userId         用户ID
+	 * @param sessionId      页面sessionID
+	 * @param socketIOClient 页面对应的通道连接信息
+	 */
+	public void saveClient(String sname, UUID sessionId, SocketIOClient socketIOClient) {
+		HashMap<UUID, SocketIOClient> sessionIdClientCache = concurrentHashMap.get(sname);
+		if (sessionIdClientCache == null) {
+			sessionIdClientCache = new HashMap<>();
+		}
+		sessionIdClientCache.put(sessionId, socketIOClient);
+		concurrentHashMap.put(sname, sessionIdClientCache);
+	}
+
+	/**
+	 * 根据用户ID获取所有通道信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public HashMap<UUID, SocketIOClient> getUserClient(String sname) {
+		return concurrentHashMap.get(sname);
+	}
+	/**
+	 * 根据用户ID获取所有通道信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public static HashMap<UUID, SocketIOClient> getAppUserClient(String sname) {
+		return concurrentHashMap.get(sname);
+	}
+
+	/**
+	 * 根据用户ID及页面sessionID删除页面链接信息
+	 *
+	 * @param userId
+	 * @param sessionId
+	 */
+	public void deleteSessionClient(String sname, UUID sessionId) {
+		//concurrentHashMap.get(sname).remove(sessionId);
+		concurrentHashMap.remove(sname);
+	}
+	/**
+	 * 根据用户ID移除sname
+	 *
+	 * @param userId
+	 * @param sessionId
+	 */
+	public void deleteSname(String sname) {
+		concurrentHashMap.remove(sname);
+	}
+}

+ 77 - 0
eladmin-common/src/main/java/me/zhengjie/websocket/PcSocketClientCache.java

@@ -0,0 +1,77 @@
+package me.zhengjie.websocket;
+
+import com.corundumstudio.socketio.SocketIOClient;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author humuyu
+ * @date 2022/11/6 16:01
+ */
+@Component
+public class PcSocketClientCache {
+
+	/**
+	 * 本地缓存
+	 */
+	private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap = new ConcurrentHashMap<>();
+
+	/**
+	 * 存入本地缓存
+	 *
+	 * @param userId         用户ID
+	 * @param sessionId      页面sessionID
+	 * @param socketIOClient 页面对应的通道连接信息
+	 */
+	public void saveClient(String sname, UUID sessionId, SocketIOClient socketIOClient) {
+		HashMap<UUID, SocketIOClient> sessionIdClientCache = concurrentHashMap.get(sname);
+		if (sessionIdClientCache == null) {
+			sessionIdClientCache = new HashMap<>();
+		}
+		sessionIdClientCache.put(sessionId, socketIOClient);
+		concurrentHashMap.put(sname, sessionIdClientCache);
+	}
+
+	/**
+	 * 根据用户ID获取所有通道信息
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public HashMap<UUID, SocketIOClient> getUserClient(String sname) {
+		return concurrentHashMap.get(sname);
+	}
+	/**
+	 * 得到在线的人员
+	 *
+	 * @param userId
+	 * @return
+	 */
+	public static HashMap<UUID, SocketIOClient> socketIOClient(String sname) {
+		return concurrentHashMap.get(sname);
+	}
+
+	/**
+	 * 根据用户ID及页面sessionID删除页面链接信息
+	 *
+	 * @param userId
+	 * @param sessionId
+	 */
+	public void deleteSessionClient(String sname, UUID sessionId) {
+		concurrentHashMap.get(sname).remove(sessionId);
+		//concurrentHashMap.remove(sname);
+	}
+	/**
+	 * 根据用户ID移除sname
+	 *
+	 * @param userId
+	 * @param sessionId
+	 */
+	public void deleteSname(String sname) {
+		concurrentHashMap.remove(sname);
+	}
+}

+ 159 - 0
eladmin-common/src/main/java/me/zhengjie/websocket/SocketEventListenner.java

@@ -0,0 +1,159 @@
+package me.zhengjie.websocket;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.corundumstudio.socketio.AckRequest;
+import com.corundumstudio.socketio.HandshakeData;
+import com.corundumstudio.socketio.SocketIOClient;
+import com.corundumstudio.socketio.annotation.OnConnect;
+import com.corundumstudio.socketio.annotation.OnDisconnect;
+import com.corundumstudio.socketio.annotation.OnEvent;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author litong
+ * @date 2019/11/6 15:59
+ */
+@Component
+@Slf4j
+public class SocketEventListenner {
+	@Autowired
+	private PcSocketClientCache pcSocketClientCache;
+	@Autowired
+	private AppSocketClientCache appSocketClientCache;
+	@Autowired
+	AppPcBindSocketIo appPcBindSocket;
+	/**
+	 * 客户端连接
+	 *
+	 * @param client
+	 */
+	@OnConnect
+	public void onConnect(SocketIOClient client) {
+		HandshakeData handshakeData = client.getHandshakeData();
+		// 这里是app的参数,先不考虑app,先写pc
+		String pcSname = handshakeData.getSingleUrlParam("pcSname");
+		if(StringUtils.isNotBlank(pcSname)) {
+			client.sendEvent("connectSucc", "success");
+			System.out.println("pc建立连接");
+			
+		}
+		String appSname = handshakeData.getSingleUrlParam("appSname");
+		if(StringUtils.isNotBlank(appSname)) {
+			client.sendEvent("connectSucc", "success");
+			System.out.println("app建立连接");
+		}
+//		String pcSname = handshakeData.getSingleUrlParam("pcSname");
+//		if(StringUtils.isNotBlank(pcSname)) {
+//			client.sendEvent("connectSucc", "success");
+//			System.out.println("pc建立连接");
+//		}
+//		sname = client.getHandshakeData().getSingleUrlParam("sname");
+//		String sname = handshakeData.getSingleUrlParam("pcSname");
+//		UUID sessionId = client.getSessionId();
+//		webSocketClientCache.saveClient(sname, sessionId, client);
+
+	}
+
+	/**
+	 * 客户端断开
+	 *
+	 * @param client
+	 */
+	@OnDisconnect
+	public void onDisconnect(SocketIOClient client) {
+		String pcSname = client.getHandshakeData().getSingleUrlParam("pcSname");
+		if (StringUtils.isNotBlank(pcSname) && client.getSessionId() != null) {
+			pcSocketClientCache.deleteSessionClient(pcSname, client.getSessionId());
+			log.info("关闭连接 pcSname: {}",pcSname);
+			//给app发送消息
+			appPcBindSocket.disconnectNotary(pcSname);
+			//TODO 处理绑定关系
+			//client.sendEvent("logoutEvent", "close");
+		}
+		String appSname = client.getHandshakeData().getSingleUrlParam("appSname");
+		if (StringUtils.isNotBlank(appSname) && client.getSessionId() != null) {
+			appSocketClientCache.deleteSessionClient(appSname, client.getSessionId());
+			//解绑公证处和订单关系
+			appPcBindSocket.delBusinessNo(appSname);
+			log.info("关闭连接 appSname: {}",appSname);
+			//TODO 处理绑定关系
+		}
+	}
+
+	// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
+
+	@OnEvent("pcRegisterEvent")
+	public void pcRegisterEvent(SocketIOClient client, AckRequest request, Map<String, String> map) throws Exception {
+		//在新增之前,先判断当前人是否
+		HandshakeData shakeData = client.getHandshakeData();
+		Map<String, List<String>> param = shakeData.getUrlParams();
+		String pcSname = map.get("pcSname");
+		if (StringUtils.isNotBlank(pcSname)) {
+			// 如果存在先移除,再新增
+			List<String> list = new ArrayList<String>();
+			list.add(pcSname);
+			param.put("pcSname", list);
+			UUID sessionId = client.getSessionId();
+			// 保存,先判断这里是否存在,如果存在发生close
+			HashMap<UUID, SocketIOClient> socketIOClient = pcSocketClientCache.getUserClient(pcSname);
+			if (socketIOClient != null) {
+				Collection<SocketIOClient> collection = socketIOClient.values();
+				for (SocketIOClient ioClient : collection) {
+					ioClient.sendEvent("logoutEvent", "close");
+				}
+			}
+			// 移除用户
+			pcSocketClientCache.deleteSname(pcSname);
+			pcSocketClientCache.saveClient(pcSname, sessionId, client);
+			log.info("将sname注册到websocket里面:" + pcSname);
+		}
+	}
+
+	// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
+
+	@OnEvent("appRegisterEvent")
+	public void appRegisterEvent(SocketIOClient client, AckRequest request, Map<String, String> map) throws Exception {
+		HandshakeData shakeData = client.getHandshakeData();
+		Map<String, List<String>> param = shakeData.getUrlParams();
+		String appSname = map.get("appSname");
+		if (StringUtils.isNotBlank(appSname)) {
+			// 如果存在先移除,再新增
+			List<String> list = new ArrayList<String>();
+			list.add(appSname);
+			param.put("appSname", list);
+			UUID sessionId = client.getSessionId();
+			// 保存,先判断这里是否存在,如果存在发生close
+//			HashMap<UUID, SocketIOClient> socketIOClient = appSocketClientCache.getUserClient(appSname);
+//			if (socketIOClient != null) {
+//				Collection<SocketIOClient> collection = socketIOClient.values();
+//				for (SocketIOClient ioClient : collection) {
+//					ioClient.sendEvent("logoutEvent", "close");
+//				}
+//			}
+			// 移除用户
+			appSocketClientCache.deleteSname(appSname);
+			appSocketClientCache.saveClient(appSname, sessionId, client);
+			//发送
+			log.info("将sname注册到websocket里面:" + appSname);
+		}
+
+	}
+
+	// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
+	// 暂未使用
+	@OnEvent("message")
+	public void onEvent(SocketIOClient client, AckRequest request, Object msg) {
+		System.out.println("messageevent" + msg);
+	}
+}

+ 0 - 79
eladmin-common/src/main/java/me/zhengjie/websocket/WebSocketEventListenner.java

@@ -1,79 +0,0 @@
-package me.zhengjie.websocket;
-
-import com.corundumstudio.socketio.AckRequest;
-import com.corundumstudio.socketio.HandshakeData;
-import com.corundumstudio.socketio.SocketIOClient;
-import com.corundumstudio.socketio.annotation.OnConnect;
-import com.corundumstudio.socketio.annotation.OnDisconnect;
-import com.corundumstudio.socketio.annotation.OnEvent;
-import lombok.extern.slf4j.Slf4j;
-import me.zhengjie.utils.ClientCache;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.lang.reflect.Field;
-import java.util.*;
-
-/**
- * @author litong
- * @date 2019/11/6 15:59
- */
-@Component
-@Slf4j
-public class WebSocketEventListenner {
-	@Resource
-	private ClientCache clientCache;
-
-	/**
-	 * 客户端连接
-	 *
-	 * @param client
-	 */
-	@OnConnect
-	public void onConnect(SocketIOClient client) {
-		UUID uuid = client.getSessionId();
-//        UUID sessionId = client.getSessionId();
-//        clientCache.saveClient(userId, sessionId, client);
-
-		log.info("建立连接:sessionId:" + uuid);
-	}
-
-	/**
-	 * 客户端断开
-	 *
-	 * @param client
-	 */
-	@OnDisconnect
-	public void onDisconnect(SocketIOClient client) {
-		String sname = client.getHandshakeData().getSingleUrlParam("sname");
-		if (StringUtils.isNotBlank(sname)) {
-			clientCache.deleteSessionClient(sname);
-		}
-		log.info("失去连接:sname:" + sname);
-
-	}
-
-	// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
-	// 暂未使用
-	@SuppressWarnings("unchecked")
-	@OnEvent("registerEvent")
-	public void onEvent(SocketIOClient client, AckRequest request, LinkedHashMap<String, String> map) throws Exception {
-		HandshakeData shakeData = client.getHandshakeData();
-		Class<?> clazz = shakeData.getClass();
-		Field field = clazz.getDeclaredField("urlParams");
-		field.setAccessible(true);
-		Map<String, List<String>> param = (Map<String, List<String>>) field.get(shakeData);
-		String sname = map.get("sname");
-		if (StringUtils.isNotBlank(sname)) {
-			// 如果存在先移除,再新增
-			List<String> list = new ArrayList<String>();
-			list.add(sname);
-			param.put("sname", list);
-			UUID sessionId = client.getSessionId();
-			clientCache.saveClient(sname, sessionId, client);
-		}
-		log.info("将sname注册到websocket里面:" + sname);
-
-	}
-}

+ 33 - 49
eladmin-logging/src/main/java/me/zhengjie/aspect/LogRequestParam.java

@@ -1,12 +1,9 @@
 package me.zhengjie.aspect;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import lombok.extern.slf4j.Slf4j;
 import me.zhengjie.utils.IpAddressUtil;
-import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
 import org.apache.commons.lang3.StringUtils;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.Signature;
@@ -15,7 +12,6 @@ import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.annotation.Pointcut;
 import org.aspectj.lang.reflect.CodeSignature;
-import org.springframework.core.io.AbstractResource;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -23,9 +19,6 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Objects;
 
 @Slf4j
@@ -52,19 +45,20 @@ public class LogRequestParam {
 
 	@Before(value = "pointCut()")
 	public void doBefore(JoinPoint joinPoint) {
+		ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
+				.getRequestAttributes();
+		if (Objects.isNull(servletRequestAttributes)) {
+			return;
+		}
+		HttpServletRequest request = servletRequestAttributes.getRequest();
+		// 得到请求的ip地址
+		String ip = IpAddressUtil.getIpAddress(request);
+
+		String uri = request.getRequestURI();
+		// 请求方法
+		String method = request.getMethod();
+		Object error = "";
 		try {
-
-			ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
-					.getRequestAttributes();
-			if (Objects.isNull(servletRequestAttributes)) {
-				return;
-			}
-			HttpServletRequest request = servletRequestAttributes.getRequest();
-			// 得到请求的ip地址
-			String ip = IpAddressUtil.getIpAddress(request);
-
-			String uri = request.getRequestURI();
-
 			Object[] parameterValues = joinPoint.getArgs();
 			int parameterValuesLength = parameterValues.length;
 			if (parameterValuesLength == 0) {
@@ -79,11 +73,8 @@ public class LogRequestParam {
 			if (Objects.isNull(parameterNames) || parameterNames.length != parameterValuesLength) {
 				return;
 			}
-
-			Map<Object, Object> params = new HashMap<>(4);
+			String paramJson = "";
 			for (int i = 0; i < parameterNames.length; i++) {
-				Object param = parameterNames[i];
-
 				Object value = parameterValues[i];
 				if (value == null || value instanceof HttpServletRequest || value instanceof HttpServletResponse) {
 					continue;
@@ -104,37 +95,30 @@ public class LogRequestParam {
 						value = str.substring(0, 1000);
 					}
 				} else {
-					// 处理参数是对象的值
-					String object = JSON.toJSONString(value);
-					//先进行赋值
-					value = object;
-					if (isJSON(object)) {
-						JSONObject jsonObj = JSON.parseObject(object);
-						Map<String, String> jsonMap = new HashMap<>();
-						for (String fieldKey : jsonObj.keySet()) {
-							String fieldValue = jsonObj.getString(fieldKey);
-							String valLength = fieldValue;
-							if (StringUtils.isNotBlank(fieldValue) && fieldValue.length() > 1000) {
-								valLength = fieldValue.substring(0, 1000);
-							}
-							jsonMap.put(fieldKey, valLength);
-						}
-						value = jsonMap;
-					} 
-
+					// 处理参数是对象的值,如果出现异常,说明有文件流
+					error = value;
+					paramJson = JSON.toJSONString(value);
+					// 先进行赋值
+					// value = object;
+					if (StringUtils.isNotBlank(paramJson) && paramJson.length() > 1000) {
+						StringBuilder sb = new StringBuilder();
+						// valLength = fieldValue.substring(0, 1000);
+						sb.append(paramJson.substring(0, 1000));
+						sb.append(paramJson.substring(paramJson.length() - 1000));
+						paramJson = sb.toString();
+					}
 				}
-
-				// 记录上传的参数
-				params.put(param, value);
 			}
-			String json = JSON.toJSONString(params, SerializerFeature.WriteMapNullValue);
-			// 请求方法
-			String method = request.getMethod();
+
 			// 这里判断
-			Object[] obj = { ip, method, uri, json };
+			Object[] obj = { ip, method, uri, paramJson };
 			log.info("[request] - ip: {} , method: {} , requestUrl: {} , param: {} ", obj);
 		} catch (Exception e) {
-			e.printStackTrace();
+			// e.printStackTrace();
+			// 这里判断
+			Object[] obj = { ip, method, uri, error.toString() };
+			log.info("[request] - ip: {} , method: {} , requestUrl: {} , param: {}, ", obj);
+
 		}
 
 	}

+ 12 - 6
eladmin-security/src/main/java/me/zhengjie/security/security/TokenProvider.java

@@ -47,6 +47,8 @@ public class TokenProvider implements InitializingBean {
 	private JwtParser jwtParser;
 	private JwtBuilder jwtBuilder;
 
+	public static final String PREFIX_APP = "app-token-";
+
 	public TokenProvider(SecurityProperties properties, RedisUtils redisUtils) {
 		this.properties = properties;
 		this.redisUtils = redisUtils;
@@ -82,9 +84,10 @@ public class TokenProvider implements InitializingBean {
 	public String appToken(String userName) {
 		String token = jwtBuilder
 				// 加入ID确保生成的 Token 都不一致
-				.setId(String.valueOf(System.nanoTime())).claim(AUTHORITIES_KEY, userName).setSubject(userName).compact();
-	//	setTokenTime(token, userName);
-		return token;
+				.setId(String.valueOf(System.nanoTime())).claim(AUTHORITIES_KEY, userName).setSubject(userName)
+				.compact();
+		// setTokenTime(token, userName);
+		return PREFIX_APP + token;
 	}
 
 	public void setTokenTime(String key, String value) {
@@ -126,21 +129,23 @@ public class TokenProvider implements InitializingBean {
 			redisUtils.expire(properties.getOnlineKey() + token, renew, TimeUnit.MILLISECONDS);
 		}
 	}
+
 	/**
 	 * @param token 需要检查的token
 	 */
 	public void checkAppToken(String token) {
 		// 判断是否续期token,计算token的过期时间
-		long time = redisUtils.getExpire( token) * 1000;
+		long time = redisUtils.getExpire(token) * 1000;
 		Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int) time);
 		// 判断当前时间与过期时间的时间差
 		long differ = expireDate.getTime() - System.currentTimeMillis();
 		// 如果在续期检查的范围内,则续期
 		if (differ <= properties.getDetect()) {
 			long renew = time + properties.getRenew();
-			redisUtils.expire( token, renew, TimeUnit.MILLISECONDS);
+			redisUtils.expire(token, renew, TimeUnit.MILLISECONDS);
 		}
 	}
+
 	public String getToken(HttpServletRequest request) {
 		final String requestHeader = request.getHeader(properties.getHeader());
 		if (requestHeader != null && requestHeader.startsWith(properties.getTokenStartWith())) {
@@ -148,8 +153,9 @@ public class TokenProvider implements InitializingBean {
 		}
 		return null;
 	}
+
 	public Object getToken(String token) {
 		return redisUtils.get(properties.getOnlineKey() + token);
-		
+
 	}
 }

+ 89 - 15
eladmin-security/src/main/java/me/zhengjie/security/service/OnlineUserService.java

@@ -16,13 +16,20 @@
 package me.zhengjie.security.service;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.corundumstudio.socketio.SocketIOClient;
 import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
+
 import me.zhengjie.security.config.bean.SecurityProperties;
 import me.zhengjie.security.domain.OnlineUserConstant;
 import me.zhengjie.security.service.dto.OnlineUserDto;
 import me.zhengjie.utils.*;
+import me.zhengjie.websocket.PcSocketClientCache;
+
+import org.apache.commons.collections4.MapUtils;
+
 import org.springframework.data.domain.Pageable;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -50,6 +57,7 @@ public class OnlineUserService {
 
 	/**
 	 * 保存在线用户信息
+	 * 
 	 * @param securityContextUser
 	 * @param token
 	 * @param request
@@ -67,23 +75,24 @@ public class OnlineUserService {
 		// 先查询是否存在该登录用户,如果存在,则直接剔除
 		kickOutForUsername(onlineUserDto.getUsername());
 		// TODO 这里只是单机处理,后面修改为多机处理
-		Map<String, HashMap<UUID, SocketIOClient>> socketServers = ClientCache.getWebSocketMap();
+//		Map<String, HashMap<UUID, SocketIOClient>> socketServers = ClientCache.getWebSocketMap();
 //		List<String> names = new ArrayList<String>();
-		for (String webSocketName : socketServers.keySet()) {
-			if (StringUtils.isNotBlank(webSocketName) && onlineUserDto.getUsername().equals(webSocketName)) {
-				HashMap<UUID, SocketIOClient> userClient = socketServers.get(webSocketName);
-				userClient.forEach((uuid, socketIOClient) -> {
-					JsonObject obj = new JsonObject();
-					obj.addProperty("logout", "logout");
-					socketIOClient.sendEvent("logoutEvent", obj.toString());
-				});
-//				names.add(webSocketName);
-			}
-		}
+//		for (String webSocketName : socketServers.keySet()) {
+//			if (StringUtils.isNotBlank(webSocketName) && onlineUserDto.getUsername().equals(webSocketName)) {
+//				HashMap<UUID, SocketIOClient> userClient = socketServers.get(webSocketName);
+//				userClient.forEach((uuid, socketIOClient) -> {
+//					JsonObject obj = new JsonObject();
+//					obj.addProperty("logout", "logout");
+//					socketIOClient.sendEvent("logoutEvent", obj.toString());
+//				});
+////				names.add(webSocketName);
+//			}
+//		}
 //		for (String key : names) {
 //			socketServers.remove(key);
 //		}
-		redisUtils.set(properties.getOnlineKey() + token, JSON.toJSONString(securityContextUser), properties.getTokenValidityInSeconds() / 1000);
+		redisUtils.set(properties.getOnlineKey() + token, JSON.toJSONString(securityContextUser),
+				properties.getTokenValidityInSeconds() / 1000);
 	}
 
 	/**
@@ -94,13 +103,64 @@ public class OnlineUserService {
 	 * @return /
 	 */
 	public Map<String, Object> getAll(String filter, Pageable pageable) {
-		List<OnlineUserDto> onlineUserDtos = getAll(filter,OnlineUserConstant.SEARCH_USER_WITH_KEWORD);
+		List<OnlineUserDto> onlineUserDtos = getAll(filter, OnlineUserConstant.SEARCH_USER_WITH_KEWORD);
 		return PageUtil.toPage(PageUtil.toPage(pageable.getPageNumber(), pageable.getPageSize(), onlineUserDtos),
 				onlineUserDtos.size());
 	}
 
 	/**
+	 * 查询指定公证处的在线人员
+	 *
+	 * @return
+	 */
+	public Set<String> getNotaryLoginUser(String notaryId) {
+		Set<String> set = new HashSet<>();
+		List<String> keys = redisUtils.scan(properties.getOnlineKey() + "*");
+
+		for (String key : keys) {
+			JSONObject onlineUser = JSON.parseObject((String) redisUtils.get(key));
+			JSONObject userInfo = onlineUser.getJSONObject("user");
+			String orgId = userInfo.getString("orgId");
+			if (isNotrayUser(userInfo) && orgId.equalsIgnoreCase(notaryId)) {
+				set.add(userInfo.getString("username"));
+			}
+		}
+		return set;
+	}
+
+	/**
+	 * 判断公证处和银行绑定关系
+	 *
+	 * @param user 在线用户对象
+	 * @return 返回是否公证员boolean值
+	 */
+	public boolean isOrgId(String orgId, String notaryId) {
+		if (orgId.equalsIgnoreCase(notaryId)) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * 判断是否是公证员
+	 *
+	 * @param user 在线用户对象
+	 * @return 返回是否公证员boolean值
+	 */
+	public boolean isNotrayUser(JSONObject user) {
+		JSONArray roles = user.getJSONArray("roles");
+		for (int i = 0; i < roles.size(); i++) {
+			JSONObject jsonObj = roles.getJSONObject(i);
+			if ("公证员".equals(jsonObj.getString("name"))) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
 	 * 查询全部数据,不分页
+	 * 
 	 * @param filterKeyword
 	 * @param type
 	 * @return
@@ -113,7 +173,8 @@ public class OnlineUserService {
 			OnlineUserDto onlineUserDto = JSON.parseObject((String) redisUtils.get(key), OnlineUserDto.class);
 			if (StringUtils.isNotBlank(filterKeyword)) {
 				if (OnlineUserConstant.SEARCH_USER_WITH_USERNAME.equals(type)) {
-					if (StringUtils.isNotBlank(onlineUserDto.getUsername()) && onlineUserDto.getUsername().equals(filterKeyword)) {
+					if (StringUtils.isNotBlank(onlineUserDto.getUsername())
+							&& onlineUserDto.getUsername().equals(filterKeyword)) {
 						onlineUserList.add(onlineUserDto);
 					}
 				} else {
@@ -212,6 +273,7 @@ public class OnlineUserService {
 					String token = EncryptUtils.desDecrypt(onlineUserDto.getKey());
 					if (StringUtils.isBlank(igoreToken) || !igoreToken.equals(token)) {
 						this.kickOut(token);
+						//
 					}
 				} catch (Exception e) {
 					log.error("checkUser is error", e);
@@ -232,7 +294,19 @@ public class OnlineUserService {
 			if (onlineUser.getUsername().equals(username)) {
 				String token = EncryptUtils.desDecrypt(onlineUser.getKey());
 				kickOut(token);
+				kickSendMsg(username);
 			}
 		}
 	}
+
+	private void kickSendMsg(String username) {
+		HashMap<UUID, SocketIOClient> userClient = PcSocketClientCache.socketIOClient(username);
+		if (MapUtils.isNotEmpty(userClient)) {
+			userClient.forEach((uuid, socketIOClient) -> {
+				JsonObject obj = new JsonObject();
+				obj.addProperty("close", "close");
+				socketIOClient.sendEvent("logoutEvent", obj.toString());
+			});
+		}
+	}
 }

+ 110 - 12
eladmin-system/src/main/java/me/zhengjie/application/admin/controller/OrderRoomIdController.java

@@ -2,6 +2,8 @@ package me.zhengjie.application.admin.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.corundumstudio.socketio.SocketIOClient;
+
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.zhengjie.annotation.rest.AnonymousPostMapping;
@@ -9,16 +11,25 @@ import me.zhengjie.base.AppBaseResponse;
 import me.zhengjie.base.ResultCode;
 import me.zhengjie.base.util.ApplicationContextUtil;
 import me.zhengjie.base.util.FileUploadUtil;
-import me.zhengjie.base.util.WebSocketMap;
 import me.zhengjie.dao.mybatis.entity.OrderRoomIdEntity;
 import me.zhengjie.dao.mybatis.mapper.OrderRoomIdMapper;
+import me.zhengjie.websocket.AppPcBindSocketIo;
+import me.zhengjie.websocket.AppSocketClientCache;
+import me.zhengjie.websocket.PcSocketClientCache;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Set;
+import java.util.UUID;
 
 @RestController
 @Validated
@@ -28,9 +39,12 @@ import java.util.List;
 public class OrderRoomIdController {
 	private final OrderRoomIdMapper orderRoomIdMapper;
 	private final ApplicationContextUtil contextUtil;
+	private final AppPcBindSocketIo appRelatePc;
+	private final PcSocketClientCache pcSocketClientCache;
+	private final AppSocketClientCache appSocketClientCache;
 
 	/**
-	 * 查询 借款人信息
+	 * 查询视频
 	 *
 	 * @return
 	 */
@@ -69,25 +83,109 @@ public class OrderRoomIdController {
 //	@RequestMapping
 	@AnonymousPostMapping("/getRooId")
 	public AppBaseResponse<?> getRooId(@RequestBody String json) {
-		log.info("得到房间号:" + json);
+		log.info("全部的消息:" + json);
 		JSONObject jsonObj = JSONObject.parseObject(json);
 		String socketId = jsonObj.getString("socketId");
-		List<JSONObject> data = WebSocketMap.get(socketId);
+		JSONObject socketObj = isPushUserName(socketId);
+		if (socketObj != null) {
+			String accountId = socketObj.getString("accountId");
+			String businessNo = socketObj.getString("businessNo");
+			Set<String> userNames = appRelatePc.getBindNotary(businessNo);
+			for (String userName : userNames) {
+				HashMap<UUID, SocketIOClient> userClient = pcSocketClientCache.getUserClient(userName);
+				if (userClient != null) {
+					for (SocketIOClient client : userClient.values()) {
+						if (!userName.equalsIgnoreCase(accountId))
+							client.sendEvent("closeDialog", "closeDialog");
+					}
+				}
+			}
+
+			List<JSONObject> bindNotarys = new ArrayList<>();
+			jsonObj = new JSONObject();
+			jsonObj.put("userName", socketObj.getString("accountId"));
+			bindNotarys.add(jsonObj);
+			String notaryJson = JSONObject.toJSONString(bindNotarys);
+			appRelatePc.setBusinessNo(businessNo, notaryJson, 60 * 30);
+			// 如果确定的,关闭其他弹框
+			return AppBaseResponse.succ(socketObj);
+		}
+		return AppBaseResponse.error(ResultCode.NOT_EXISTS);
+	}
+
+	/**
+	 * 包含推送的用户
+	 * 
+	 * @param socketId
+	 * @return
+	 */
+	private JSONObject isPushUserName(String socketId) {
+
+		List<JSONObject> data = appRelatePc.socketIoTime(socketId);
 		// try
 		String userName = contextUtil.getCurrentUsername();
-
-		AppBaseResponse<?> result = null;
 		if (data != null && data.size() > 0) {
 			for (JSONObject socketObj : data) {
 				if (socketObj.getString("accountId").equalsIgnoreCase(userName)) {
-					result = AppBaseResponse.succ(socketObj);
-					break;
+					return socketObj;
 				}
 			}
-		} else {
-			result = AppBaseResponse.error(ResultCode.NOT_EXISTS);
 		}
-		log.info("返回结果的值:" + result);
-		return result;
+		return null;
+
+	}
+
+	/**
+	 * 取消
+	 * 
+	 * @param json
+	 * @return
+	 */
+	@AnonymousPostMapping("/cancel")
+	public AppBaseResponse<?> cancel(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String socketId = jsonObj.getString("socketId");
+		JSONObject socketObj = isPushUserName(socketId);
+
+		if (socketObj == null) {
+			return AppBaseResponse.success();
+		}
+		String businessNo = socketObj.getString("businessNo");
+		appRelatePc.removeNotary(businessNo, socketObj.getString("accountId"));
+//		Set<String> notarys = appRelatePc.getBindNotary(businessNo);
+//		if (CollectionUtils.isEmpty(notarys) || notarys.size() == 1) {
+//			// 直接删除这条数据
+//			appRelatePc.delBusinessNo(businessNo);
+//			// TDOO 发送给app。取消了视频通话
+//			sendAppMsg(businessNo);
+//			return AppBaseResponse.success();
+//		}
+//		notarys.remove(socketObj.getString("accountId"));
+//		// 保存没有取消的时间
+//		appRelatePc.setNoCancelNotary(notarys, businessNo);
+		return AppBaseResponse.success();
+	}
+
+	private void sendAppMsg(String businessNo) {
+		HashMap<UUID, SocketIOClient> appSocketIo = appSocketClientCache.getUserClient(businessNo);
+		if (MapUtils.isNotEmpty(appSocketIo)) {
+			appSocketIo.forEach((uuid, socketIOClient) -> {
+				socketIOClient.sendEvent("cancelEvent", "cancel");
+			});
+		}
 	}
+
+	/**
+	 * 结束视频
+	 *
+	 * @return
+	 */
+	@RequestMapping("/endVideo")
+	public AppBaseResponse<?> endVideo(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String businessNo = jsonObj.getString("businessNo");
+		appRelatePc.delBusinessNo(businessNo);
+		return AppBaseResponse.success();
+	}
+
 }

+ 1 - 3
eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/OrderCochainServiceImpl.java

@@ -5,10 +5,8 @@ import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.annotation.PostConstruct;
 
@@ -210,7 +208,7 @@ public class OrderCochainServiceImpl extends AbstractServiceImpl<IOrderCochainDa
 				log.error("上链数据出现异常:" + e.getMessage());
 				// 修改数据库的值
 				chain.setRemark(e.getMessage());
-				chain.setCount(chain.getCount() + 1);
+				chain.setCount(cochainEntity.getCount() + 1);
 				orderCochainService.update(chain, OrderCochainEntity::getBusinessNo);
 
 			}

+ 43 - 22
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankNotarizeController.java

@@ -45,12 +45,13 @@ public class BankNotarizeController {
 	private final BankNotarizeService bankNotarizeService;
 	private final TencentHumanFaceVerify faceVerify;
 	private final SmsTemplateService smsTemplateService;
+
 	/**
 	 * 获取签名公证书URL
 	 *
 	 * @param json
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	@RequestMapping("/getNotarization")
 	public ResponseDTO<?> getNotarization(@RequestBody String json) throws Exception {
@@ -62,8 +63,8 @@ public class BankNotarizeController {
 		OrderFileEntity orderFile = orderFileRepository.getOrderNotarization(businessNo);
 		// 下载到指定的目录
 		String filePath = "tmp/" + UUIDGenerator.uuid() + ".pdf";
-		
-		return ResponseDTO.success(FileUploadUtil.getCustomUrl(orderFile.getSignedPdfUrl(),filePath));
+
+		return ResponseDTO.success(FileUploadUtil.getCustomUrl(orderFile.getSignedPdfUrl(), filePath));
 	}
 
 	@RequestMapping("/axqRegister")
@@ -81,7 +82,7 @@ public class BankNotarizeController {
 	// 人脸核身,当事人
 	@RequestMapping("/order/getFaceId")
 	public ResponseDTO<?> getFaceId(@RequestBody String json) throws Exception {
-
+		// 这里需要先判断公证员是否在线
 		JSONObject jsonObj = JSONObject.parseObject(json);
 		String userName = jsonObj.getString("userName");
 		String idCard = jsonObj.getString("idCard");
@@ -89,15 +90,29 @@ public class BankNotarizeController {
 		if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(idCard)) {
 			return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
 		}
-		// 4---开始公证(待公证) -- 2个公证员
+		ResponseDTO<?> result = bankNotarizeService.onlineNotary(businessNo);
+		if (!result.isSuccess()) {
+			return result;
+		}
+		// 4---开始公证(待公证) -- 2个公证员,发送短信
 		smsTemplateService.startNotarize(businessNo);
 		JSONObject str = SdkTest.getFaceId(faceVerify.getBankWebankAppId(), faceVerify.getBankSecret(),
 				faceVerify.getBankKeyLicence(), userName, idCard, businessNo);
 		return ResponseDTO.success(str);
 	}
-
+	/**
+	 * 视频通话
+	 * @param json
+	 * @return ResponseDTO<?>
+	 */
 	@AnonymousPostMapping("/video/call")
 	public ResponseDTO<?> videoCall(@RequestBody String json) {
+		JSONObject jsonObject = JSONObject.parseObject(json);
+		String businessNo = jsonObject.getString("businessNo");
+		ResponseDTO<?> result = bankNotarizeService.onlineNotary(businessNo);
+		if (!result.isSuccess()) {
+			return result;
+		}
 		return bankNotarizeService.videoCall(json);
 	}
 
@@ -160,8 +175,10 @@ public class BankNotarizeController {
 		}
 		return userAXQInfoService.getAuthStatus(idCard);
 	}
+
 	/**
 	 * 当事人签名
+	 * 
 	 * @param json
 	 * @return
 	 */
@@ -178,18 +195,18 @@ public class BankNotarizeController {
 
 	@AnonymousGetMapping("/active-arcsoft")
 	public ResponseDTO<?> activeArcsoft() {
-		//从官网获取
+		// 从官网获取
 		String appId = "6F5JVsCCeSEbBSLSXWVwPki71yK5Y4Jf7oUjA4Y3mLtu";
 		String sdkKey = "5qKM4a9oNSXNhXdwd7Ycrvnxdw2JXjcyeccYmb4zND7S";
 		FaceEngine faceEngine = new FaceEngine("/home/tom/nt/lib/so");
-		//激活引擎
+		// 激活引擎
 		int errorCode = faceEngine.activeOnline(appId, sdkKey);
 		if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
 			System.out.println("引擎激活失败");
 		} else {
 			System.out.println("引擎激活成功");
 		}
-		//引擎卸载
+		// 引擎卸载
 		errorCode = faceEngine.unInit();
 		return ResponseDTO.success();
 	}
@@ -206,13 +223,13 @@ public class BankNotarizeController {
 		if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
 			System.out.println("获取激活文件信息失败");
 		}
-		//引擎配置
+		// 引擎配置
 		EngineConfiguration engineConfiguration = new EngineConfiguration();
 		engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
 		engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
 		engineConfiguration.setDetectFaceMaxNum(10);
 		engineConfiguration.setDetectFaceScaleVal(16);
-		//功能配置
+		// 功能配置
 		FunctionConfiguration functionConfiguration = new FunctionConfiguration();
 		functionConfiguration.setSupportAge(true);
 		functionConfiguration.setSupportFace3dAngle(true);
@@ -222,34 +239,38 @@ public class BankNotarizeController {
 		functionConfiguration.setSupportLiveness(true);
 		functionConfiguration.setSupportIRLiveness(true);
 		engineConfiguration.setFunctionConfiguration(functionConfiguration);
-		//初始化引擎
+		// 初始化引擎
 		errorCode = faceEngine.init(engineConfiguration);
 		if (errorCode != ErrorInfo.MOK.getValue()) {
 			System.out.println("初始化引擎失败");
 		}
-		//人脸检测
+		// 人脸检测
 		ImageInfo imageInfo = getRGBData(new File("/home/tom/nt/test/aaa.jpeg"));
 		List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
-		errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
+		errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
+				imageInfo.getImageFormat(), faceInfoList);
 		System.out.println(faceInfoList);
 
-		//特征提取
+		// 特征提取
 		FaceFeature faceFeature = new FaceFeature();
-		errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
+		errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
+				imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
 		System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
 
-		//人脸检测2
+		// 人脸检测2
 		ImageInfo imageInfo2 = getRGBData(new File("/home/tom/nt/test/bbb.jpeg"));
 		List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
-		errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo2.getImageFormat(), faceInfoList2);
+		errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),
+				imageInfo2.getImageFormat(), faceInfoList2);
 		System.out.println(faceInfoList2);
 
-		//特征提取2
+		// 特征提取2
 		FaceFeature faceFeature2 = new FaceFeature();
-		errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
+		errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(),
+				imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
 		System.out.println("特征值大小:" + faceFeature2.getFeatureData().length);
 
-		//特征比对
+		// 特征比对
 		FaceFeature targetFaceFeature = new FaceFeature();
 		targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
 		FaceFeature sourceFaceFeature = new FaceFeature();
@@ -259,7 +280,7 @@ public class BankNotarizeController {
 		errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
 
 		System.out.println("相似度:" + faceSimilar.getScore());
-		//引擎卸载
+		// 引擎卸载
 		errorCode = faceEngine.unInit();
 		return ResponseDTO.success();
 	}

+ 12 - 0
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/vo/BankLoginVO.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
+import me.zhengjie.base.config.AppConfigInfo;
 
 /**
  * 银行人员登录接口
@@ -28,4 +29,15 @@ public class BankLoginVO {
 	private String nickName;
 
 	private String token;
+ 
+
+	public String getSdkAppId() {
+	//	this.sdkappid = String.valueOf(AppConfigInfo.TENCENT_SDK_APP_ID);
+		return String.valueOf(AppConfigInfo.TENCENT_SDK_APP_ID);
+	}
+	
+	public String getTtlSignKey() {
+		
+		return AppConfigInfo.TENCENT_TTL_SIG_KEY;
+	}
 }

+ 6 - 0
eladmin-system/src/main/java/me/zhengjie/application/bank/service/BankNotarizeService.java

@@ -17,4 +17,10 @@ public interface BankNotarizeService {
      * @return
      */
     ResponseDTO<?> getOrderPDF(String businessNo) ;
+    /**
+           * 判定是否相同
+     * @param businessNo
+     * @return
+     */
+    public ResponseDTO<?> onlineNotary(String businessNo);
 }

+ 115 - 45
eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/BankNotarizeServiceImpl.java

@@ -2,76 +2,146 @@ package me.zhengjie.application.bank.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.corundumstudio.socketio.SocketIOClient;
+
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.zhengjie.application.bank.controller.vo.FileInfoVO;
 import me.zhengjie.application.bank.service.BankNotarizeService;
 import me.zhengjie.base.ResponseDTO;
+import me.zhengjie.base.ResultCode;
 import me.zhengjie.base.mq.RedisCacheConfig;
 import me.zhengjie.base.util.FileUploadUtil;
 import me.zhengjie.dao.mybatis.OrderFileRepository;
+import me.zhengjie.dao.mybatis.entity.ContractOrderEntity;
 import me.zhengjie.dao.mybatis.entity.OrderFileEntity;
 import me.zhengjie.dao.mybatis.entity.OrderRoomIdEntity;
+import me.zhengjie.dao.mybatis.entity.SysUserEntity;
+import me.zhengjie.dao.mybatis.mapper.ContractOrderMapper;
 import me.zhengjie.dao.mybatis.mapper.OrderRoomIdMapper;
+import me.zhengjie.dao.mybatis.mapper.SysUserMapper;
 import me.zhengjie.domain.model.ModelConstant;
+import me.zhengjie.security.service.OnlineUserService;
+import me.zhengjie.websocket.AppPcBindSocketIo;
+import me.zhengjie.websocket.PcSocketClientCache;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
 
 @Service
 @Slf4j
 @RequiredArgsConstructor
 public class BankNotarizeServiceImpl implements BankNotarizeService {
-    private final OrderRoomIdMapper orderRoomIdMapper;
-    private final RedisTemplate<String, String> redisTemplate;
-    private final OrderFileRepository orderFileRepository;
+	private final OrderRoomIdMapper orderRoomIdMapper;
+	private final RedisTemplate<String, String> redisTemplate;
+	private final OrderFileRepository orderFileRepository;
+	private final ContractOrderMapper contractOrderMapper;
+	private final SysUserMapper sysUserMapper;
+	private final OnlineUserService onlineUserService;
+	private final AppPcBindSocketIo appPcBindSocketIo;
+
+	/**
+	 * 
+	 * @param businessNo
+	 * @return
+	 */
+	public ResponseDTO<?> onlineNotary(String businessNo) {
+		
+		//删除绑定关系
+		appPcBindSocketIo.delBusinessNo(businessNo);
+		QueryWrapper<ContractOrderEntity> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("business_no", businessNo);
+		ContractOrderEntity notaryOrder = contractOrderMapper.selectOne(queryWrapper);
+		String notaryId = "notary_" + notaryOrder.getNotaryOfficeId();
+		// 在线的公证登录人员,是订单的绑定的银行公证员
+		Set<String> loginNotary = onlineUserService.getNotaryLoginUser(notaryId);
+		if (CollectionUtils.isEmpty(loginNotary)) {
+			return ResponseDTO.error(ResultCode.NOTARY_OFFLINE);
+		}
 
-    @Override
-    public ResponseDTO<?> videoCall(String json) {
-        // 可能多个机器部署,需要发送消息,确定是在哪台机器上面,广播给所有人
-        // 这里打印他的roomId程序,
-        log.info("推送的参数: " + json);
-        // 保存数据
-        JSONObject jsonObject = JSONObject.parseObject(json);
-        String businessNo = jsonObject.getString("businessNo");
-        String roomId = jsonObject.getString("roomId");
+		List<SysUserEntity> sysUsers = sysUserMapper.getSysUserByBankId(notaryOrder.getBankId(), "公证员");
+		Set<String> bankNotary = new HashSet<>();
+		for (SysUserEntity sysUser : sysUsers) {
+			bankNotary.add(sysUser.getUsername());
+		}
+		// 判断当前是否有人在线,如果没有直接失败
+		boolean isOnline = false;
+		for (String username : bankNotary) {
+			Map<UUID, SocketIOClient> socketIo = PcSocketClientCache.socketIOClient(username);
+			if (MapUtils.isNotEmpty(socketIo)) {
+				isOnline = true;
+			}
+		}
+		if(!isOnline) {
+			return ResponseDTO.error(ResultCode.NOTARY_OFFLINE);
+		}
+		// 查询绑定的人员,
+		Set<String> relatedNotary = appPcBindSocketIo.getAllBindNotary();
+		if (CollectionUtils.isEmpty(relatedNotary)) {
+			return ResponseDTO.success();
+		}
+		Collection<String> intersection = CollectionUtils.intersection(bankNotary, relatedNotary);
+		if (CollectionUtils.isEqualCollection(intersection, loginNotary)) {
+			return ResponseDTO.error(ResultCode.SEAT_BUSY);
+		}
+		return ResponseDTO.success();
+	}
 
-        OrderRoomIdEntity orderRoomId = new OrderRoomIdEntity();
-        // 业务流水
-        orderRoomId.setBusinessNo(businessNo);
-        // 房间号
-        orderRoomId.setRoomId(roomId);
-        // 创建时间
-        orderRoomId.setCreateTime(LocalDateTime.now());
-        // 修改时间
-        orderRoomId.setUpdateTime(LocalDateTime.now());
-        // 这里先判断是否存在,不存在就插入数据
-        QueryWrapper<OrderRoomIdEntity> qw = new QueryWrapper<>();
-        qw.eq("roomId",roomId);
-        qw.eq("business_no",businessNo);
-        long orderSize = orderRoomIdMapper.selectCount(qw);
-        if (orderSize == 0) {
-            orderRoomIdMapper.insert(orderRoomId);
-        }
-        // 这里保存推送的数据
-        redisTemplate.convertAndSend(RedisCacheConfig.CHANNEL_WEB_SOCKET, json);
+	@Override
+	public ResponseDTO<?> videoCall(String json) {
+		// 可能多个机器部署,需要发送消息,确定是在哪台机器上面,广播给所有人
+		// 这里打印他的roomId程序,
+		log.info("推送的参数: " + json);
+		// 保存数据
+		JSONObject jsonObject = JSONObject.parseObject(json);
+		String businessNo = jsonObject.getString("businessNo");
+		String roomId = jsonObject.getString("roomId");
 
-        return ResponseDTO.success();
-    }
+		OrderRoomIdEntity orderRoomId = new OrderRoomIdEntity();
+		// 业务流水
+		orderRoomId.setBusinessNo(businessNo);
+		// 房间号
+		orderRoomId.setRoomId(roomId);
+		// 创建时间
+		orderRoomId.setCreateTime(LocalDateTime.now());
+		// 修改时间
+		orderRoomId.setUpdateTime(LocalDateTime.now());
+		// 这里先判断是否存在,不存在就插入数据
+		QueryWrapper<OrderRoomIdEntity> qw = new QueryWrapper<>();
+		qw.eq("roomId", roomId);
+		qw.eq("business_no", businessNo);
+		long orderSize = orderRoomIdMapper.selectCount(qw);
+		if (orderSize == 0) {
+			orderRoomIdMapper.insert(orderRoomId);
+		}
+		// 这里保存推送的数据
+		redisTemplate.convertAndSend(RedisCacheConfig.CHANNEL_WEB_SOCKET, json);
+		return ResponseDTO.success();
+	}
 
-    @Override
-    public ResponseDTO<?> getOrderPDF(String businessNo) {
-        List<OrderFileEntity> orderFileList = orderFileRepository.getOrderFileListWithCodes(businessNo, ModelConstant.MODEL_TYPE_COMMON_LIST);
-        List<FileInfoVO> infos = new ArrayList<>();
-        for (OrderFileEntity orderFile : orderFileList) {
-            FileInfoVO info = new FileInfoVO();
-            info.setUrl(FileUploadUtil.getPreviewUrl(orderFile.getHtmlUrl()));
-            infos.add(info);
-        }
-        log.info("方法getOrderPDF的url地址返回参数: " + infos);
-        return ResponseDTO.success(infos);
-    }
+	@Override
+	public ResponseDTO<?> getOrderPDF(String businessNo) {
+		List<OrderFileEntity> orderFileList = orderFileRepository.getOrderFileListWithCodes(businessNo,
+				ModelConstant.MODEL_TYPE_COMMON_LIST);
+		List<FileInfoVO> infos = new ArrayList<>();
+		for (OrderFileEntity orderFile : orderFileList) {
+			FileInfoVO info = new FileInfoVO();
+			info.setUrl(FileUploadUtil.getPreviewUrl(orderFile.getHtmlUrl()));
+			infos.add(info);
+		}
+		log.info("方法getOrderPDF的url地址返回参数: " + infos);
+		return ResponseDTO.success(infos);
+	}
 }

+ 102 - 44
eladmin-system/src/main/java/me/zhengjie/application/user/app/mq/WebSocketReceiver.java

@@ -1,31 +1,35 @@
 package me.zhengjie.application.user.app.mq;
 
 import com.alibaba.fastjson.JSONObject;
+import com.corundumstudio.socketio.SocketIOClient;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.zhengjie.application.admin.service.dto.JwtUserDto;
 import me.zhengjie.application.admin.service.dto.RoleSmallDto;
 import me.zhengjie.application.admin.service.dto.UserDto;
-import me.zhengjie.application.bank.service.SysUserService;
 import me.zhengjie.base.util.ApplicationContextUtil;
-import me.zhengjie.base.util.WebSocketMap;
-import me.zhengjie.base.websocket.AppSocketServer;
+import me.zhengjie.websocket.AppPcBindSocketIo;
+import me.zhengjie.websocket.AppSocketClientCache;
+import me.zhengjie.websocket.PcSocketClientCache;
 import me.zhengjie.dao.mybatis.ContractOrderRepository;
 import me.zhengjie.dao.mybatis.entity.ContractOrderEntity;
 import me.zhengjie.dao.mybatis.entity.SysUserEntity;
 import me.zhengjie.dao.mybatis.mapper.SysUserMapper;
 import me.zhengjie.security.service.OnlineUserService;
 import me.zhengjie.security.service.dto.OnlineUserDto;
+
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.redis.connection.Message;
 import org.springframework.data.redis.connection.MessageListener;
 import org.springframework.stereotype.Component;
-
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.UUID;
 
 @Component
 @Slf4j
@@ -36,9 +40,12 @@ public class WebSocketReceiver implements MessageListener {
 	private final SysUserMapper sysUserMapper;
 	private final ApplicationContextUtil contextUtil;
 	private final ContractOrderRepository contractOrderRepository;
+	private final PcSocketClientCache socketClient;
+	private final AppPcBindSocketIo appRelatePc;
 
 	/**
 	 * 推送公证员接单消息
+	 * 
 	 * @param message 接收到的Json消息
 	 * @param pattern 未使用参数
 	 */
@@ -52,7 +59,8 @@ public class WebSocketReceiver implements MessageListener {
 		String businessNo = jsonObj.getString("businessNo");
 		String appUserId = jsonObj.getString("appUserId");
 		String taskId = jsonObj.getString("taskId");
-		List<OnlineUserDto> users = onlineUserService.getAllLoginUser();
+		// 删除这条数据是为了方便测试使用
+		appRelatePc.delBusinessNo(businessNo);
 		// share_userId
 		ContractOrderEntity notaryOrder = contractOrderRepository.getContractOrderWithBizNo(businessNo);
 		SysUserEntity sysUser = sysUserMapper.selectById(notaryOrder.getCustomerId());
@@ -61,47 +69,97 @@ public class WebSocketReceiver implements MessageListener {
 		List<JSONObject> list = new ArrayList<>();
 		String notaryId = "notary_" + notaryOrder.getNotaryOfficeId();
 		log.info("判断登录的公证处和查询的公证处比较:" + notaryId);
-		WebSocketMap.set(socketId, list);
+		// WebSocketMap.set(socketId, list);
+		List<JSONObject> bindNotarys = new ArrayList<>();
+
+		Set<String> userNames = getOnlineNotary(notaryId);
+		for (String userName : userNames) {
+
+			HashMap<UUID, SocketIOClient> socketServers = socketClient.getUserClient(userName);
+			if (socketServers != null) {
+				for (SocketIOClient socketClient : socketServers.values()) {
+					JSONObject obj = new JSONObject();
+					obj.put("accountId", userName);
+					obj.put("orderId", orderId);
+					obj.put("roomId", roomId);
+					obj.put("prodId", notaryOrder.getProdId());
+					obj.put("contractType", notaryOrder.getContractType());
+					obj.put("businessNo", businessNo);
+					obj.put("customerIdCard", sysUser.getIdCard());
+					obj.put("userId", sysUser.getUserId());
+					obj.put("customerId", sysUser.getUserId());
+					obj.put("customerName", sysUser.getNickName());
+					obj.put("appUserId", appUserId);
+					obj.put("taskId", taskId);
+					// 这里只有推送才会增加
+					list.add(obj);
+					// 推送的消息
+					obj = new JSONObject();
+					obj.put("socketId", socketId);
+					obj.put("orderId", orderId);
+					obj.put("businessNo", businessNo);
+					obj.put("customerName", sysUser.getNickName());
+					obj.put("borrowerName", notaryOrder.getName());
+					obj.put("consultNo", notaryOrder.getConsultNo());
+					obj.put("bankName", notaryOrder.getBankName());
+					obj.put("appUserId", appUserId);
+					obj.put("taskId", taskId);
+					log.info("socket数据的推送给页面:" + notaryId);
+					// AppSocketServer.sendInfo(webSocket, obj.toString(), userDto.getUsername());
+					// 这里保证,只有空闲的才推送,
+					JSONObject bindnotary = new JSONObject();
+					// 用户名,绑定的
+					bindnotary.put("userName", userName);
+					bindNotarys.add(bindnotary);
+			
+					socketClient.sendEvent("pcVideoEvent", obj.toString());
+				}
+			}
+//			}
+		}
+		// 判断是否有值
+		if (CollectionUtils.isNotEmpty(list))
+			appRelatePc.socketIoTime(socketId, JSONObject.toJSONString(list));
+		// 这里是绑定所有的公证员
+		if (CollectionUtils.isNotEmpty(list))
+			appRelatePc.setBusinessNo(businessNo, JSONObject.toJSONString(bindNotarys), 35);
+
+	}
+
+	/**
+	 * 得到所有的公证员
+	 * 
+	 * @param notaryId
+	 * @return
+	 */
+	private Set<String> getOnlineNotary(String notaryId) {
+
+		List<OnlineUserDto> users = onlineUserService.getAllLoginUser();
+		// 这里是绑定所有的公证员
+		Set<String> usernames = appRelatePc.getAllBindNotary();
+		Set<String> online = new HashSet<>();
 		for (OnlineUserDto user : users) {
 			JwtUserDto userDto = contextUtil.getUserByKey(user.getOnlineToken());
 			String orgId = userDto.getUser().getOrgId();
-			if (StringUtils.isNotBlank(orgId) && orgId.equalsIgnoreCase(notaryId) && isNotrayUser(userDto.getUser())) {
-				CopyOnWriteArraySet<AppSocketServer> socketServers = AppSocketServer.getWebSocketSet();
-				log.info("得到所有的websocket对象:" + socketServers);
-				for (AppSocketServer webSocket : socketServers) {
-					if (webSocket.getSname().equalsIgnoreCase(userDto.getUsername())) {
-						JSONObject obj = new JSONObject();
-						obj.put("accountId", userDto.getUsername());
-						obj.put("orderId", orderId);
-						obj.put("roomId", roomId);
-						obj.put("prodId", notaryOrder.getProdId());
-						obj.put("contractType", notaryOrder.getContractType());
-						obj.put("businessNo", businessNo);
-						obj.put("customerIdCard", sysUser.getIdCard());
-						obj.put("userId", sysUser.getUserId());
-						obj.put("customerId", sysUser.getUserId());
-						obj.put("customerName", sysUser.getNickName());
-						obj.put("customerName", sysUser.getNickName());
-						obj.put("appUserId",appUserId);
-						obj.put("taskId",taskId);
-						list.add(obj);
-						// 重新实例化
-						obj = new JSONObject();
-						obj.put("socketId", socketId);
-						obj.put("orderId", orderId);
-						obj.put("businessNo", businessNo);
-						obj.put("customerName", sysUser.getNickName());
-						obj.put("borrowerName", notaryOrder.getName());
-						obj.put("consultNo", notaryOrder.getConsultNo());
-						obj.put("bankName", notaryOrder.getBankName());
-						obj.put("appUserId", appUserId);
-						obj.put("taskId", taskId);
-						log.info("socket数据的推送给页面:" + notaryId);
-						AppSocketServer.sendInfo(webSocket, obj.toString(), userDto.getUsername());
-					}
-				}
+			if (isOrgId(orgId, notaryId) && isNotrayUser(userDto.getUser())
+					&& !usernames.contains(userDto.getUsername())) {
+				online.add(userDto.getUsername());
 			}
 		}
+		return online;
+	}
+
+	/**
+	 * 判断公证处和银行绑定关系
+	 *
+	 * @param user 在线用户对象
+	 * @return 返回是否公证员boolean值
+	 */
+	private boolean isOrgId(String orgId, String notaryId) {
+		if (StringUtils.isNotBlank(orgId) && orgId.equalsIgnoreCase(notaryId)) {
+			return true;
+		}
+		return false;
 	}
 
 	/**
@@ -112,8 +170,8 @@ public class WebSocketReceiver implements MessageListener {
 	 */
 	private boolean isNotrayUser(UserDto user) {
 		Set<RoleSmallDto> roles = user.getRoles();
-		for(RoleSmallDto role:roles){
-			if("公证员".equals(role.getName())){
+		for (RoleSmallDto role : roles) {
+			if ("公证员".equals(role.getName())) {
 				return true;
 			}
 		}

+ 15 - 10
eladmin-system/src/main/java/me/zhengjie/base/mq/MessagePushConfig.java

@@ -4,7 +4,9 @@ import com.corundumstudio.socketio.Configuration;
 import com.corundumstudio.socketio.SocketConfig;
 import com.corundumstudio.socketio.SocketIOServer;
 import me.zhengjie.base.config.AppConfigInfo;
-import me.zhengjie.websocket.WebSocketEventListenner;
+
+import me.zhengjie.websocket.SocketEventListenner;
+
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
@@ -21,30 +23,33 @@ import javax.annotation.Resource;
 @DependsOn("appConfigInfo")
 public class MessagePushConfig implements InitializingBean {
 	@Resource
-	private WebSocketEventListenner eventListenner;
+	private SocketEventListenner eventListenner;
 
-//	@Autowired
-//	private SocketIOServer socketIOServer;
+	@Autowired
+	private SocketIOServer socketIOServer;
 
 	@Override
 	public void afterPropertiesSet() throws Exception {
-//		socketIOServer.start();
-//		System.out.println("启动正常");
+		socketIOServer.start();
+		System.out.println("启动正常");
 	}
 
 //	@Bean
+//	public AuthorizationListener socketAuthorization() {
+//		return new SocketAuthorizationListener();
+//	}
+
+	@Bean
 	public SocketIOServer socketIOServer() {
 		Configuration config = new Configuration();
 		config.setPort(Integer.parseInt(AppConfigInfo.APP_PUSH_PORT));
-
 		SocketConfig socketConfig = new SocketConfig();
 		socketConfig.setReuseAddress(true);
 		socketConfig.setTcpNoDelay(true);
-
+//		config.setHostname("localhost");
 		socketConfig.setSoLinger(0);
 		config.setSocketConfig(socketConfig);
-		config.setHostname("localhost");
-
+//		config.setAuthorizationListener(socketAuthorization());
 		SocketIOServer server = new SocketIOServer(config);
 		server.addListeners(eventListenner);
 		return server;

+ 107 - 0
eladmin-system/src/main/java/me/zhengjie/base/websocket/AppRelatePc.java

@@ -0,0 +1,107 @@
+//package me.zhengjie.base.websocket;
+//
+//import java.util.ArrayList;
+//import java.util.HashSet;
+//import java.util.List;
+//import java.util.Set;
+//import java.util.concurrent.TimeUnit;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//
+//import me.zhengjie.utils.RedisUtils;
+//
+///**
+// * 
+// * @author auas
+// *
+// */
+//@Component
+//public class AppRelatePc {
+//	public final static String PREFIX_BUSINESS_NO = "business-no-";
+//	@Autowired
+//	RedisUtils redisUtils;
+//
+//	public void setBusinessNo(String businessNo, String json, long time) {
+//		redisUtils.set(PREFIX_BUSINESS_NO + businessNo, json, time);
+//	}
+//
+//	/**
+//	 * 这里是便于删除他继续测试使用
+//	 * 
+//	 * @param businessNo
+//	 * @param json
+//	 * @param time
+//	 */
+//	public void delBusinessNo(String businessNo) {
+//		redisUtils.del(PREFIX_BUSINESS_NO + businessNo);
+//	}
+//
+//	/**
+//	 * 得到过期时间
+//	 * 
+//	 * @param key
+//	 * @return
+//	 */
+//	public long getExpire(Object key) {
+//		return redisUtils.getExpire(PREFIX_BUSINESS_NO + key);
+//	}
+//
+//	/**
+//	 * 设置没有取消的值进行判断
+//	 * 
+//	 * @param businessNo
+//	 * @return
+//	 */
+//	public void setNoCancelNotary(Set<String> notarys, String businessNo) {
+//		List<JSONObject> bindNotarys = new ArrayList<>();
+//		for (String userName : notarys) {
+//			JSONObject jsonObj = new JSONObject();
+//			jsonObj.put("userName", userName);
+//			bindNotarys.add(jsonObj);
+//		}
+//		String notaryJson = JSONObject.toJSONString(bindNotarys);
+//		setBusinessNo(businessNo, notaryJson, getExpire(businessNo));
+//
+//	}
+//
+//	public Set<String> getBindNotary(String businessNo) {
+//		String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo);
+//		Set<String> set = new HashSet<>();
+//		JSONArray json = JSON.parseArray(key);
+//		for (int i = 0; i < json.size(); i++) {
+//			JSONObject jsonObj = json.getJSONObject(i);
+//			String username = jsonObj.getString("userName");
+//			set.add(username);
+//		}
+//		return set;
+//	}
+//
+//	public Set<String> getBindNotary() {
+//		List<String> keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*");
+//		Set<String> set = new HashSet<>();
+//		for (String key : keys) {
+//			JSONArray json = JSON.parseArray((String) redisUtils.get(key));
+//			for (int i = 0; i < json.size(); i++) {
+//				JSONObject jsonObj = json.getJSONObject(i);
+//				String username = jsonObj.getString("userName");
+//				set.add(username);
+//			}
+//		}
+//		return set;
+//	}
+//
+//	public void socketIoTime(String socketId, String json) {
+//		redisUtils.set(socketId, json, 60 * 5);
+//	}
+//
+//	public List<JSONObject> socketIoTime(String socketId) {
+//		String json = (String) redisUtils.get(socketId);
+//		List<JSONObject> jsonObj = JSONObject.parseArray(json, JSONObject.class);
+//		return jsonObj;
+//	}
+//}

+ 68 - 0
eladmin-system/src/main/java/me/zhengjie/base/websocket/AppSocketClientCache.java

@@ -0,0 +1,68 @@
+//package me.zhengjie.base.websocket;
+//
+//import com.corundumstudio.socketio.SocketIOClient;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.HashMap;
+//import java.util.Map;
+//import java.util.UUID;
+//import java.util.concurrent.ConcurrentHashMap;
+//
+///**
+// * @author humuyu
+// * @date 2022/11/6 16:01
+// */
+//@Component
+//public class AppSocketClientCache {
+//
+//	/**
+//	 * 本地缓存
+//	 */
+//	private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap = new ConcurrentHashMap<>();
+//
+//	/**
+//	 * 存入本地缓存
+//	 *
+//	 * @param userId         用户ID
+//	 * @param sessionId      页面sessionID
+//	 * @param socketIOClient 页面对应的通道连接信息
+//	 */
+//	public void saveClient(String sname, UUID sessionId, SocketIOClient socketIOClient) {
+//		HashMap<UUID, SocketIOClient> sessionIdClientCache = concurrentHashMap.get(sname);
+//		if (sessionIdClientCache == null) {
+//			sessionIdClientCache = new HashMap<>();
+//		}
+//		sessionIdClientCache.put(sessionId, socketIOClient);
+//		concurrentHashMap.put(sname, sessionIdClientCache);
+//	}
+//
+//	/**
+//	 * 根据用户ID获取所有通道信息
+//	 *
+//	 * @param userId
+//	 * @return
+//	 */
+//	public HashMap<UUID, SocketIOClient> getUserClient(String sname) {
+//		return concurrentHashMap.get(sname);
+//	}
+//
+//	/**
+//	 * 根据用户ID及页面sessionID删除页面链接信息
+//	 *
+//	 * @param userId
+//	 * @param sessionId
+//	 */
+//	public void deleteSessionClient(String sname, UUID sessionId) {
+//		concurrentHashMap.get(sname).remove(sessionId);
+//		concurrentHashMap.remove(sname);
+//	}
+//	/**
+//	 * 根据用户ID移除sname
+//	 *
+//	 * @param userId
+//	 * @param sessionId
+//	 */
+//	public void deleteSname(String sname) {
+//		concurrentHashMap.remove(sname);
+//	}
+//}

+ 68 - 0
eladmin-system/src/main/java/me/zhengjie/base/websocket/PcSocketClientCache.java

@@ -0,0 +1,68 @@
+//package me.zhengjie.base.websocket;
+//
+//import com.corundumstudio.socketio.SocketIOClient;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.HashMap;
+//import java.util.Map;
+//import java.util.UUID;
+//import java.util.concurrent.ConcurrentHashMap;
+//
+///**
+// * @author humuyu
+// * @date 2022/11/6 16:01
+// */
+//@Component
+//public class PcSocketClientCache {
+//
+//	/**
+//	 * 本地缓存
+//	 */
+//	private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap = new ConcurrentHashMap<>();
+//
+//	/**
+//	 * 存入本地缓存
+//	 *
+//	 * @param userId         用户ID
+//	 * @param sessionId      页面sessionID
+//	 * @param socketIOClient 页面对应的通道连接信息
+//	 */
+//	public void saveClient(String sname, UUID sessionId, SocketIOClient socketIOClient) {
+//		HashMap<UUID, SocketIOClient> sessionIdClientCache = concurrentHashMap.get(sname);
+//		if (sessionIdClientCache == null) {
+//			sessionIdClientCache = new HashMap<>();
+//		}
+//		sessionIdClientCache.put(sessionId, socketIOClient);
+//		concurrentHashMap.put(sname, sessionIdClientCache);
+//	}
+//
+//	/**
+//	 * 根据用户ID获取所有通道信息
+//	 *
+//	 * @param userId
+//	 * @return
+//	 */
+//	public HashMap<UUID, SocketIOClient> getUserClient(String sname) {
+//		return concurrentHashMap.get(sname);
+//	}
+//
+//	/**
+//	 * 根据用户ID及页面sessionID删除页面链接信息
+//	 *
+//	 * @param userId
+//	 * @param sessionId
+//	 */
+//	public void deleteSessionClient(String sname, UUID sessionId) {
+//		concurrentHashMap.get(sname).remove(sessionId);
+//		concurrentHashMap.remove(sname);
+//	}
+//	/**
+//	 * 根据用户ID移除sname
+//	 *
+//	 * @param userId
+//	 * @param sessionId
+//	 */
+//	public void deleteSname(String sname) {
+//		concurrentHashMap.remove(sname);
+//	}
+//}

+ 28 - 0
eladmin-system/src/main/java/me/zhengjie/base/websocket/SocketAuthorizationListener.java

@@ -0,0 +1,28 @@
+//package me.zhengjie.base.websocket;
+//
+//import org.apache.commons.lang3.StringUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//
+//import com.corundumstudio.socketio.AuthorizationListener;
+//import com.corundumstudio.socketio.HandshakeData;
+//
+//import me.zhengjie.security.security.TokenProvider;
+//
+//public class SocketAuthorizationListener implements AuthorizationListener {
+//	@Autowired
+//	TokenProvider tokenProvider;
+//
+//	@Override
+//	public boolean isAuthorized(HandshakeData data) {
+//		String pcToken = data.getSingleUrlParam("pcToken");
+//		if (StringUtils.isEmpty(pcToken)) {
+//			return true;
+//		}
+//		Object value = tokenProvider.getToken(pcToken);
+//		if (value != null) {
+//			return true;
+//		}
+//		return false;
+//	}
+//
+//}

+ 137 - 0
eladmin-system/src/main/java/me/zhengjie/base/websocket/SocketEventListenner.java

@@ -0,0 +1,137 @@
+//package me.zhengjie.base.websocket;
+//
+//import java.util.ArrayList;
+//import java.util.Collection;
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.UUID;
+//
+//import org.apache.commons.lang3.StringUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//import com.corundumstudio.socketio.AckRequest;
+//import com.corundumstudio.socketio.HandshakeData;
+//import com.corundumstudio.socketio.SocketIOClient;
+//import com.corundumstudio.socketio.annotation.OnConnect;
+//import com.corundumstudio.socketio.annotation.OnDisconnect;
+//import com.corundumstudio.socketio.annotation.OnEvent;
+//
+//import lombok.extern.slf4j.Slf4j;
+//
+///**
+// * @author litong
+// * @date 2019/11/6 15:59
+// */
+//@Component
+//@Slf4j
+//public class SocketEventListenner {
+//	@Autowired
+//	private PcSocketClientCache pcSocketClientCache;
+//	@Autowired
+//	private AppSocketClientCache appSocketClientCache;
+//
+//	/**
+//	 * 客户端连接
+//	 *
+//	 * @param client
+//	 */
+//	@OnConnect
+//	public void onConnect(SocketIOClient client) {
+//		HandshakeData handshakeData = client.getHandshakeData();
+//		// 这里是app的参数,先不考虑app,先写pc
+////		String sname = handshakeData.getSingleUrlParam("appSname");
+////		sname = client.getHandshakeData().getSingleUrlParam("sname");
+////		String sname = handshakeData.getSingleUrlParam("pcSname");
+////		UUID sessionId = client.getSessionId();
+////		webSocketClientCache.saveClient(sname, sessionId, client);
+//		client.sendEvent("connect", "success");
+//		System.out.println("建立连接");
+//	}
+//
+//	/**
+//	 * 客户端断开
+//	 *
+//	 * @param client
+//	 */
+//	@OnDisconnect
+//	public void onDisconnect(SocketIOClient client) {
+//		String pcSname = client.getHandshakeData().getSingleUrlParam("pcSname");
+//		if (StringUtils.isNotBlank(pcSname) && client.getSessionId() != null) {
+//			pcSocketClientCache.deleteSessionClient(pcSname, client.getSessionId());
+//			log.info("关闭连接 pcSname: {}",pcSname);
+//			client.sendEvent("logoutEvent", "close");
+//		}
+//		String appSname = client.getHandshakeData().getSingleUrlParam("appSname");
+//		if (StringUtils.isNotBlank(appSname) && client.getSessionId() != null) {
+//			appSocketClientCache.deleteSessionClient(appSname, client.getSessionId());
+//			log.info("关闭连接 appSname: {}",appSname);
+//		}
+//	}
+//
+//	// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
+//
+//	@OnEvent("pcRegisterEvent")
+//	public void pcRegisterEvent(SocketIOClient client, AckRequest request, Map<String, String> map) throws Exception {
+//		//在新增之前,先判断当前人是否
+//		HandshakeData shakeData = client.getHandshakeData();
+//		Map<String, List<String>> param = shakeData.getUrlParams();
+//		String pcSname = map.get("pcSname");
+//		if (StringUtils.isNotBlank(pcSname)) {
+//			// 如果存在先移除,再新增
+//			List<String> list = new ArrayList<String>();
+//			list.add(pcSname);
+//			param.put("pcSname", list);
+//			UUID sessionId = client.getSessionId();
+//			// 保存,先判断这里是否存在,如果存在发生close
+//			HashMap<UUID, SocketIOClient> socketIOClient = pcSocketClientCache.getUserClient(pcSname);
+//			if (socketIOClient != null) {
+//				Collection<SocketIOClient> collection = socketIOClient.values();
+//				for (SocketIOClient ioClient : collection) {
+//					ioClient.sendEvent("logoutEvent", "close");
+//				}
+//			}
+//			// 移除用户
+//			pcSocketClientCache.deleteSname(pcSname);
+//			pcSocketClientCache.saveClient(pcSname, sessionId, client);
+//			log.info("将sname注册到websocket里面:" + pcSname);
+//		}
+//	}
+//
+//	// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
+//
+//	@OnEvent("appRegisterEvent")
+//	public void appRegisterEvent(SocketIOClient client, AckRequest request, Map<String, String> map) throws Exception {
+//		HandshakeData shakeData = client.getHandshakeData();
+//		Map<String, List<String>> param = shakeData.getUrlParams();
+//		String appSname = map.get("appSname");
+//		if (StringUtils.isNotBlank(appSname)) {
+//			// 如果存在先移除,再新增
+//			List<String> list = new ArrayList<String>();
+//			list.add(appSname);
+//			param.put("appSname", list);
+//			UUID sessionId = client.getSessionId();
+//			// 保存,先判断这里是否存在,如果存在发生close
+//			HashMap<UUID, SocketIOClient> socketIOClient = appSocketClientCache.getUserClient(appSname);
+//			if (socketIOClient != null) {
+//				Collection<SocketIOClient> collection = socketIOClient.values();
+//				for (SocketIOClient ioClient : collection) {
+//					ioClient.sendEvent("logoutEvent", "close");
+//				}
+//			}
+//			// 移除用户
+//			appSocketClientCache.deleteSname(appSname);
+//			appSocketClientCache.saveClient(appSname, sessionId, client);
+//			log.info("将sname注册到websocket里面:" + appSname);
+//		}
+//
+//	}
+//
+//	// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
+//	// 暂未使用
+//	@OnEvent("message")
+//	public void onEvent(SocketIOClient client, AckRequest request, Object msg) {
+//		System.out.println("messageevent" + msg);
+//	}
+//}

+ 9 - 0
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/mapper/SysUserMapper.java

@@ -19,4 +19,13 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface SysUserMapper extends BaseMapper<SysUserEntity> {
 	Set<String> queryPhone(String bankId, String roleName);
+
+	/**
+	 * 查询银行公证处下面的人员
+	 * 
+	 * @param bankId 银行id
+	 * @param roleName 角色名称
+	 * @return List<SysUserEntity>
+	 */
+	List<SysUserEntity> getSysUserByBankId(String bankId, String roleName);
 }

+ 3 - 3
eladmin-system/src/main/resources/config/application-nt-test.yml

@@ -5,7 +5,7 @@ spring:
   mvc:
     static-path-pattern: /image/**
   resources:
-    static-locations: file:/nt/,file:/nt/
+    static-locations: file:/nt/image/,file:/nt/image/
   datasource:
     druid:
       db-type: com.alibaba.druid.pool.DruidDataSource
@@ -161,7 +161,7 @@ app:
     port: 9102
     url: https://fqgz.flowbb.cn:10001/image/
   upload:
-    path: /image/
+    path: /nt/image/
   host:
     domain: https://fqgz.flowbb.cn:9100/
   minio:
@@ -169,7 +169,7 @@ app:
     secretkey: minioadmin
     url: http://124.222.192.60:9000
     bucketName: mytest    
-    preview: https://fqgz.flowbb.cn
+    preview: https://fqgz.flowbb.cn:9001
 tencent:
   client:
     webankAppId: TIDAdW8e

+ 5 - 5
eladmin-system/src/main/resources/config/application-prod.yml

@@ -57,9 +57,9 @@ spring:
   redis:
     #数据库索引
     database: 0
-    host: 114.55.230.80
+    host: 127.0.0.1
     port: 6379
-    password: 123qysd!@#
+#    password: 123qysd!@#
     #连接超时时间
     timeout: 5000
 # 登录相关配置
@@ -162,7 +162,7 @@ app:
   host:
     domain: https://fqgz.flowbb.cn/
   push:
-    port: 8089
+    port: 8082
   minio:
     accesskey: minioadmin
     secretkey: minioadmin
@@ -179,8 +179,8 @@ tencent:
     secret: pzFuoHgzUWHKw01XT0H7FIMDMf0a58JsTP31gE1hpP5T5uY1RfyAGftROvAiMery
     keyLicence: gDsQvwRTlBm4/gdPKXaG6iKnjbpF9irGFpAGVP5yIw3MKZKybnnOGoHs+5cOV2W2z4dyUmiu1yXuUGKuvtwaWRDPoaPvCMFShdy7oEY61Zc0N/0uCvU2qXP+l/ULp2fnnOXJxLRb+Ldsnj2V9LuBgOnyvFyVQ/HPh90ood2X1F0bunPOAIzXmffDLgeO6ZlCF6nLN0cEBkm7m80p6hp25NqdfxfN9n2E+j6rBJe2NLKMazbd+HRaFvWs5PPpR2FowvQPYXiYI8xDMCxhE94waN4E3/BuCY1blf1vxH60DlAB21Z8dP38kwTUXejm0ybvUHu4iyFMCjkPy+XuvslJGw==
   ttlsig:
-    sdkappid: 1400743315
-    key: 3b8f5b1a04511a8e9f40a90b61bc8312452226416c5e533e81cbbf52e9b0e351
+    sdkappid: 1400718469
+    key: 4b248dead873140792967469696227c5084429aaaa5a567a4a593402dc28d9b6
 
 xxl:
   job:

+ 1 - 1
eladmin-system/src/main/resources/config/application.yml

@@ -3,7 +3,7 @@ spring:
   freemarker:
     check-template-location: false
   profiles:
-    active: dev
+    active: prod
   jackson:
     time-zone: GMT+8
   data:

+ 16 - 0
eladmin-system/src/main/resources/mapper/SysUserMapper.xml

@@ -15,4 +15,20 @@
 		)
 		and enabled = 1 
 	</select>
+	
+	 <select id="getSysUserByBankId" resultType="me.zhengjie.dao.mybatis.entity.SysUserEntity">
+	  select * from sys_user where org_id in 
+		(
+		 select  concat('notary_',notary_office_id) notary_office_id 
+		 from office_x_bank where bank_id=#{bankId}
+		) and 
+		user_id in
+		(
+		   select user_id from sys_role r1,sys_users_roles r2 
+		   where r1.role_id=r2.role_id 
+		   and r1.name =#{roleName}
+		)
+		and enabled = 1 
+	</select>
+	
 </mapper>