2 Комити 29eb09036a ... ef959c886f

Аутор SHA1 Порука Датум
  吴树波 ef959c886f Merge remote-tracking branch 'origin/master' into matser пре 2 дана
  吴树波 92257c32e5 新个微对接 пре 2 дана
25 измењених фајлова са 598 додато и 403 уклоњено
  1. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyWxClientMapper.java
  2. 25 22
      fs-service/src/main/java/com/fs/company/service/impl/CompanyWxServiceImpl.java
  3. 2 0
      fs-service/src/main/java/com/fs/his/dto/SendResultDetailDTO.java
  4. 2 0
      fs-service/src/main/java/com/fs/hisStore/vo/StoreOperMainVO.java
  5. 2 0
      fs-service/src/main/java/com/fs/live/vo/DateRange.java
  6. 2 4
      fs-service/src/main/java/com/fs/wxcid/domain/WxContact.java
  7. 3 0
      fs-service/src/main/java/com/fs/wxcid/service/IWxMsgLogService.java
  8. 16 0
      fs-service/src/main/java/com/fs/wxcid/service/impl/WxMsgLogServiceImpl.java
  9. 13 0
      fs-service/src/main/java/com/fs/wxcid/vo/wxvo/AddResultWxVo.java
  10. 17 0
      fs-service/src/main/java/com/fs/wxcid/vo/wxvo/AddWxVo.java
  11. 18 0
      fs-service/src/main/java/com/fs/wxcid/vo/wxvo/ContactInfoVo.java
  12. 16 0
      fs-service/src/main/java/com/fs/wxcid/vo/wxvo/MsgResultVo.java
  13. 16 0
      fs-service/src/main/java/com/fs/wxcid/vo/wxvo/SyncInfoVo.java
  14. 14 0
      fs-service/src/main/java/com/fs/wxcid/vo/wxvo/WxSendMsgVo.java
  15. 15 0
      fs-service/src/main/java/com/fs/wxcid/vo/wxvo/WxSendResultMsgVo.java
  16. 4 0
      fs-service/src/main/resources/mapper/company/CompanyWxClientMapper.xml
  17. 4 5
      fs-wx-api/src/main/java/com/fs/FsWxApiApplication.java
  18. 34 72
      fs-wx-api/src/main/java/com/fs/app/controller/CommonController.java
  19. 148 148
      fs-wx-api/src/main/java/com/fs/app/controller/WebscoketServer.java
  20. 26 0
      fs-wx-api/src/main/java/com/fs/app/enums/CmdType.java
  21. 35 0
      fs-wx-api/src/main/java/com/fs/app/websocket/bean/ResultMsgVo.java
  22. 5 4
      fs-wx-api/src/main/java/com/fs/app/websocket/bean/SendMsgVo.java
  23. 42 42
      fs-wx-api/src/main/java/com/fs/app/websocket/service/Task.java
  24. 136 104
      fs-wx-api/src/main/java/com/fs/app/websocket/service/WebSocketServer.java
  25. 1 2
      fs-wx-api/src/main/resources/application.yml

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyWxClientMapper.java

@@ -85,4 +85,6 @@ public interface CompanyWxClientMapper extends BaseMapper<CompanyWxClient> {
     List<CompanyWxClient> getQwAddWxList(@Param("accountIdList") List<Long> accountIdList, @Param("isWeCom") Integer isWeCom);
 
     List<CompanyWxClient4WorkFlowVO> getQwAddWxList4Workflow(@Param("accountIdList") List<Long> accountIdList, @Param("execStatus") Integer execStatus, @Param("execNodeType") Integer execNodeType, @Param("cidGroupNo") Integer cidGroupNo);
+
+    List<CompanyWxClient> selectWxV2(@Param("id") Long id, @Param("phone") String phone);
 }

+ 25 - 22
fs-service/src/main/java/com/fs/company/service/impl/CompanyWxServiceImpl.java

@@ -1,5 +1,8 @@
 package com.fs.company.service.impl;
 
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -33,7 +36,10 @@ import com.fs.wxcid.service.*;
 import com.fs.wxcid.service.impl.LoginServiceImpl;
 import com.fs.wxcid.service.impl.UserServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import okhttp3.WebSocketListener;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -101,6 +107,12 @@ public class CompanyWxServiceImpl extends ServiceImpl<CompanyWxAccountMapper, Co
     @Autowired
     CompanyAiWorkflowServerMapper companyAiWorkflowServerMapper;
 
+    @Value("${wx.websocket.url:ws://localhost:7113/app/webSocket}")
+    private String webSocketUrl;
+
+    @Value("${wx.api.url:http://localhost:7113}")
+    private String wxApiUrl;
+
 
     /**
      * 查询企微账号
@@ -332,37 +344,28 @@ public class CompanyWxServiceImpl extends ServiceImpl<CompanyWxAccountMapper, Co
         account.setSyncFriendTime(LocalDateTime.now());
 
         try {
-            // 3. 清理Redis缓存
-            String key = FRIEND_KEY + accountId;
-            friendListRedis.deleteObject(key);
-
-            // 4. 获取好友列表并过滤
-            GetContactListParam param = new GetContactListParam();
-            param.setAccountId(accountId);
-            ContactListResponse response = friendService.getContactListNotKey(param);
-            List<String> friendList = getFilteredFriendList(response);
-            if (CollectionUtils.isEmpty(friendList)) {
-                log.info("账号暂无需要同步的微信好友/群聊,accountId={}", accountId);
-                updateById(account);
-                return;
+            // 3. 调用WebSocket发送同步指令
+            String wxNo = account.getWxNo();
+            if (wxNo != null && !wxNo.isEmpty()) {
+                sendSyncContactCommand(wxNo);
+            } else {
+                log.warn("微信账号wxNo为空,无法发送同步指令,accountId={}", accountId);
             }
 
-            // 5. 缓存好友列表到Redis
-            friendListRedis.setCacheObject(key, friendList);
-
-            // 6. 同步联系人信息
-            syncContactDetails(accountId, account, friendList);
-
-            // 7. 更新账号信息
+            // 4. 更新账号信息
             updateById(account);
 
-            log.info("微信信息同步完成,accountId={},同步联系人数量={}", accountId, friendList.size());
+//            log.info("微信信息同步完成,accountId={},同步联系人数量={}", accountId, friendList.size());
         } catch (Exception e) {
             log.error("同步微信信息异常,accountId={}", accountId, e);
             throw e;
         }
     }
 
+    private void sendSyncContactCommand(String wxNo) {
+        HttpUtil.get(wxApiUrl + "/app/common/syncWx?wxId=" + wxNo);
+    }
+
     /**
      * 获取过滤后的好友列表
      */
@@ -576,7 +579,7 @@ public class CompanyWxServiceImpl extends ServiceImpl<CompanyWxAccountMapper, Co
      * 加微成功后触发工作流继续执行
      * @param wxClientId 加微客户ID
      */
-    private void triggerWorkflowOnAddWxSuccess(Long wxClientId) {
+    public void triggerWorkflowOnAddWxSuccess(Long wxClientId) {
         try {
             // 查找等待中的加微工作流实例
             CompanyAiWorkflowExec waitingExec = companyAiWorkflowExecMapper.selectWaitingAddWxWorkflowByWxClientId(

+ 2 - 0
fs-service/src/main/java/com/fs/his/dto/SendResultDetailDTO.java

@@ -2,10 +2,12 @@ package com.fs.his.dto;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 
 @Data
+@NoArgsConstructor
 @AllArgsConstructor
 public class SendResultDetailDTO implements Serializable {
     private boolean success;

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/vo/StoreOperMainVO.java

@@ -2,8 +2,10 @@ package com.fs.hisStore.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 @Data
+@NoArgsConstructor
 @AllArgsConstructor
 public class StoreOperMainVO {
     private String id;

+ 2 - 0
fs-service/src/main/java/com/fs/live/vo/DateRange.java

@@ -2,8 +2,10 @@ package com.fs.live.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 @Data
+@NoArgsConstructor
 @AllArgsConstructor
 public class DateRange {
     private String start;

+ 2 - 4
fs-service/src/main/java/com/fs/wxcid/domain/WxContact.java

@@ -16,10 +16,6 @@ import lombok.EqualsAndHashCode;
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class WxContact extends BaseEntityTow {
-
-    /** crm客户ID */
-    private Long id;
-
     /** 微信ID */
     @Excel(name = "微信ID")
     private String userName;
@@ -73,6 +69,8 @@ public class WxContact extends BaseEntityTow {
     private Long companyUserId;
 
     private Long customerId;
+    // 是否是好友1是0否
+    private Integer friends;
 
 
 }

+ 3 - 0
fs-service/src/main/java/com/fs/wxcid/service/IWxMsgLogService.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.company.domain.CompanyWxAccount;
 import com.fs.wxcid.domain.WxMsgLog;
 import com.fs.wxcid.dto.callback.WxCallbackVo;
+import com.fs.wxcid.vo.wxvo.WxSendMsgVo;
+import com.fs.wxcid.vo.wxvo.WxSendResultMsgVo;
 
 /**
  * 个微消息记录Service接口
@@ -62,4 +64,5 @@ public interface IWxMsgLogService extends IService<WxMsgLog>{
     int deleteWxMsgLogById(Long id);
 
     void insertLog(WxCallbackVo callbackVo, CompanyWxAccount account, int type);
+    void insertLog(WxSendResultMsgVo vo, CompanyWxAccount account, int type);
 }

+ 16 - 0
fs-service/src/main/java/com/fs/wxcid/service/impl/WxMsgLogServiceImpl.java

@@ -5,6 +5,8 @@ import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.company.domain.CompanyWxAccount;
 import com.fs.wxcid.dto.callback.WxCallbackVo;
+import com.fs.wxcid.vo.wxvo.WxSendMsgVo;
+import com.fs.wxcid.vo.wxvo.WxSendResultMsgVo;
 import org.springframework.stereotype.Service;
 import com.fs.wxcid.mapper.WxMsgLogMapper;
 import com.fs.wxcid.domain.WxMsgLog;
@@ -112,4 +114,18 @@ public class WxMsgLogServiceImpl extends ServiceImpl<WxMsgLogMapper, WxMsgLog> i
         logs.setReceiveType(type);
         save(logs);
     }
+
+    @Override
+    public void insertLog(WxSendResultMsgVo vo, CompanyWxAccount account, int type) {
+        WxMsgLog logs = new WxMsgLog();
+        logs.setAccountId(account.getId());
+        logs.setAuthKey(account.getAuthKey());
+        logs.setType(vo.getType()+"");
+        logs.setFromUserName(vo.getRemark());
+        logs.setToUserName(account.getWxNo());
+        logs.setMsgType(vo.getType());
+        logs.setContent(vo.getTxt());
+        logs.setReceiveType(type);
+        save(logs);
+    }
 }

+ 13 - 0
fs-service/src/main/java/com/fs/wxcid/vo/wxvo/AddResultWxVo.java

@@ -0,0 +1,13 @@
+package com.fs.wxcid.vo.wxvo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AddResultWxVo {
+    private String remark;
+    private String userName;
+}

+ 17 - 0
fs-service/src/main/java/com/fs/wxcid/vo/wxvo/AddWxVo.java

@@ -0,0 +1,17 @@
+package com.fs.wxcid.vo.wxvo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AddWxVo {
+    // 备注
+    private String remark;
+    // 手机号
+    private String phone;
+    // 加微申请文案
+    private String applyMsg;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/wxcid/vo/wxvo/ContactInfoVo.java

@@ -0,0 +1,18 @@
+package com.fs.wxcid.vo.wxvo;
+
+import lombok.Data;
+
+@Data
+public class ContactInfoVo {
+    // 微信昵称
+    private String nickName;
+    // 微信号
+    private String wxNo;
+    // 微信头像
+    private String img;
+    // 备注
+    private String remark;
+    // 地区
+    private String address;
+
+}

+ 16 - 0
fs-service/src/main/java/com/fs/wxcid/vo/wxvo/MsgResultVo.java

@@ -0,0 +1,16 @@
+package com.fs.wxcid.vo.wxvo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MsgResultVo {
+    // 备注
+    private String remark;
+    // 发送类型0文本
+    private int type;
+    private String txt;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/wxcid/vo/wxvo/SyncInfoVo.java

@@ -0,0 +1,16 @@
+package com.fs.wxcid.vo.wxvo;
+
+import lombok.Data;
+
+@Data
+public class SyncInfoVo {
+    // 微信号
+    private String no;
+    // 微信昵称
+    private String name;
+    // 微信头像
+    private String img;
+    // 手机号
+    private String phone;
+
+}

+ 14 - 0
fs-service/src/main/java/com/fs/wxcid/vo/wxvo/WxSendMsgVo.java

@@ -0,0 +1,14 @@
+package com.fs.wxcid.vo.wxvo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxSendMsgVo {
+    // 备注
+    private String remark;
+    private String txt;
+}

+ 15 - 0
fs-service/src/main/java/com/fs/wxcid/vo/wxvo/WxSendResultMsgVo.java

@@ -0,0 +1,15 @@
+package com.fs.wxcid.vo.wxvo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WxSendResultMsgVo {
+    // 备注
+    private String remark;
+    private int type;
+    private String txt;
+}

+ 4 - 0
fs-service/src/main/resources/mapper/company/CompanyWxClientMapper.xml

@@ -232,4 +232,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where 1=1
         <if test="customerId != null">  and customer_id = #{customerId} </if>
     </select>
+
+    <select id="selectWxV2" resultType="com.fs.company.domain.CompanyWxClient">
+        select * from company_wx_client where account_id = #{id} and phone = #{phone}
+    </select>
 </mapper>

+ 4 - 5
fs-wx-api/src/main/java/com/fs/FsWxApiApplication.java

@@ -1,6 +1,5 @@
 package com.fs;
 
-import com.fs.app.controller.WebscoketServer;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -26,8 +25,8 @@ public class FsWxApiApplication
         System.out.println("WXAPI启动成功");
     }
     // ========== 可选 1:启动原生 WebSocket 客户端 ==========
-    @Bean
-    public CommandLineRunner startNativeWsClient(WebscoketServer webscoketServer) {
-        return args -> webscoketServer.start();
-    }
+//    @Bean
+//    public CommandLineRunner startNativeWsClient(WebscoketServer webscoketServer) {
+//        return args -> webscoketServer.start();
+//    }
 }

+ 34 - 72
fs-wx-api/src/main/java/com/fs/app/controller/CommonController.java

@@ -1,57 +1,23 @@
 package com.fs.app.controller;
 
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fs.app.annotation.Login;
-import com.fs.app.param.SendSopParam;
-import com.fs.app.utils.JwtUtils;
-import com.fs.app.websocket.bean.MsgBean;
+import com.fs.app.enums.CmdType;
+import com.fs.app.websocket.bean.ResultMsgVo;
+import com.fs.company.domain.CompanyWxAccount;
+import com.fs.company.mapper.CompanyWxAccountMapper;
+import com.fs.wxcid.domain.WxContact;
+import com.fs.wxcid.mapper.WxContactMapper;
+import com.fs.wxcid.vo.wxvo.AddWxVo;
+import com.fs.wxcid.vo.wxvo.WxSendMsgVo;
 import com.fs.app.websocket.service.WebSocketServer;
 import com.fs.common.core.domain.R;
-import com.fs.common.core.redis.RedisCache;
-import com.fs.company.domain.CompanyConfig;
-import com.fs.company.domain.CompanyMoneyLogs;
-import com.fs.company.service.ICompanyConfigService;
-import com.fs.company.service.ICompanyWxChatService;
-import com.fs.his.service.IFsAppVersionService;
-import com.fs.his.service.IFsCityService;
-import com.fs.his.service.IFsInquiryOrderMsgService;
-import com.fs.his.utils.ConfigUtil;
-import com.fs.sop.domain.QwSopLogs;
-import com.fs.sop.mapper.QwSopLogsMapper;
-import com.fs.system.service.ISysConfigService;
-import com.fs.system.service.ISysDictDataService;
-import com.fs.wx.kf.dto.WeixinKfMsgDTO;
-import com.fs.wx.kf.dto.WeixinKfMsgSendDTO;
-import com.fs.wx.kf.dto.WeixinKfTextMsgDTO;
-import com.fs.wx.kf.service.IWeixinKfService;
-import com.fs.wx.kf.vo.WeixinKfMsgItemVO;
-import com.fs.wx.kf.vo.WeixinKfMsgVO;
-import com.fs.wxUser.service.ICompanyWxUserService;
-import com.google.code.kaptcha.Producer;
-import com.qq.weixin.mp.aes.AesException;
-import com.qq.weixin.mp.aes.WXBizMsgCrypt;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
-import org.w3c.dom.Element;
 
-import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.UUID;
-import java.util.logging.Logger;
-
-import static com.fs.common.constant.FsConstants.REDIS_CHAT_NEXTCURSOR;
+import javax.websocket.Session;
 
 
 @Api("公共接口")
@@ -62,42 +28,38 @@ import static com.fs.common.constant.FsConstants.REDIS_CHAT_NEXTCURSOR;
 public class CommonController {
 
     private final WebSocketServer webSocketServer;
-    private final ICompanyWxUserService companyWxUserService;
-    private final ICompanyWxChatService companyWxChatService;
-    private final QwSopLogsMapper qwSopLogsMapper;
-    private final RedisCache redisCache;
-    private final JwtUtils jwtUtils;
-//    private final WebSocketServer webSocketServer;
+    private final WxContactMapper wxContactMapper;
+    private final CompanyWxAccountMapper companyWxAccountMapper;
 
-    @GetMapping("/testSend")
-    public R testSend( ) throws Exception
-    {
-        String json="{\"cmd\":\"sendMsg\",\"msg\":\"test\",\"nickName\":\"123\"}";
-//        String json="{\"cmd\":\"listenMsg\",\"users\":[\"123\"]}";
-        webSocketServer.sendInfo("2020", json);
+    @GetMapping("/syncWx")
+    public R syncWx(String wxId){
+        Session session = WebSocketServer.sessionPools.get(wxId);
+        webSocketServer.sendMessage(session, ResultMsgVo.ok(CmdType.SYNC_CONTACT_PERSON));
         return R.ok();
     }
 
-    @GetMapping("/testListen")
-    public R testListen( ) throws Exception
-    {
-//        String json="{\"cmd\":\"sendMsg\",\"msg\":\"test\",\"nickName\":\"123\"}";
-        String json="{\"cmd\":\"listenMsg\",\"users\":[\"123\"]}";
-        webSocketServer.sendInfo("2020", json);
-        return R.ok();
-    }
-    @GetMapping("/testClickHouse")
-    public R testClickHouse( ) throws Exception{
-        QwSopLogs qwSopLogs = qwSopLogsMapper.selectById("2c42bded-085b-452c-8166-7ed2b070a016");
-        qwSopLogs.setSopId("2324dcea-0a4c-4688-b43d-2d9691ede6b4");
-        qwSopLogsMapper.updateById(qwSopLogs);
+    @GetMapping("/testSendMsg")
+    public R syncWx(String wxId, String msg, String remark){
+        Session session = WebSocketServer.sessionPools.get(wxId);
+        webSocketServer.sendMessage(session, ResultMsgVo.<WxSendMsgVo>builder().cmd(CmdType.SEND_MSG).data(new WxSendMsgVo(remark, msg)).build());
         return R.ok();
     }
 
-    @ApiOperation("获取发送信息")
-    @GetMapping("/getMsgList")
-    public R getMsg(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime time){
-        return R.ok().put("data", companyWxUserService.getMsg(1, time));
+    @GetMapping("/addWx")
+    public R addWx(String wxId, String phone, String remark){
+        Session session = WebSocketServer.sessionPools.get(wxId);
+        CompanyWxAccount companyWxAccount = companyWxAccountMapper.selectOne(new QueryWrapper<CompanyWxAccount>().eq("wx_no", wxId));
+        WxContact wxContact = new WxContact();
+        wxContact.setRemark(remark);
+        wxContact.setNickName("测试1");
+        wxContact.setPhone(phone);
+        wxContact.setAccountId(companyWxAccount.getId());
+        wxContact.setCompanyId(companyWxAccount.getCompanyId());
+        wxContact.setCompanyUserId(companyWxAccount.getCompanyUserId());
+        wxContact.setFriends(0);
+        wxContactMapper.insert(wxContact);
+        webSocketServer.sendMessage(session, ResultMsgVo.<AddWxVo>builder().cmd(CmdType.ADD_WX).data(new AddWxVo("", phone, remark)).build());
+        return R.ok();
     }
 
 }

+ 148 - 148
fs-wx-api/src/main/java/com/fs/app/controller/WebscoketServer.java

@@ -1,148 +1,148 @@
-package com.fs.app.controller;
-
-import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fs.common.utils.PubFun;
-import com.fs.company.domain.CompanyWxAccount;
-import com.fs.company.service.ICompanyWxAccountService;
-import com.fs.wxcid.domain.CidIpadServer;
-import com.fs.wxcid.domain.WxMsgLog;
-import com.fs.wxcid.dto.callback.WxCallbackVo;
-import com.fs.wxcid.service.ICidIpadServerService;
-import com.fs.wxcid.service.IWxMsgLogService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.websocket.*;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-
-@Slf4j
-@Component
-public class WebscoketServer {
-    @Autowired
-    private ICidIpadServerService cidIpadServerService;
-    @Autowired
-    private ICompanyWxAccountService companyWxAccountService;
-    @Autowired
-    private IWxMsgLogService wxMsgLogService;
-    @Value("${group-no}")
-    private String groupNo;
-
-    // 重连间隔(秒)
-    private static final int RECONNECT_INTERVAL = 5;
-    // 客户端会话
-    private Map<Long, Session> sessionMap = new ConcurrentHashMap<>();
-    // ipad 数据
-    private Map<Long, CidIpadServer> ipadMap = new HashMap<>();
-    // 重连调度器
-    private final ScheduledExecutorService reconnectScheduler = Executors.newSingleThreadScheduledExecutor();
-
-    /**
-     * 启动客户端(连接第三方 + 监听消息)
-     */
-    public void start() {
-        List<CidIpadServer> ipadList = cidIpadServerService.list(new QueryWrapper<CidIpadServer>().eq("group_no", groupNo));
-        if(ipadList.isEmpty()){
-            log.info("没有需要连接的账号");
-            return;
-        }
-        ipadMap = PubFun.listToMapByGroupObject(ipadList, CidIpadServer::getId);
-        List<CompanyWxAccount> list = companyWxAccountService.list(new QueryWrapper<CompanyWxAccount>().eq("server_status", 1).eq("login_status", 1).in("server_id", PubFun.listToNewList(ipadList, CidIpadServer::getId)));
-        list.forEach(this::connect);
-//        connect();
-    }
-
-    /**
-     * 连接第三方 WebSocket 服务
-     */
-    private void connect(CompanyWxAccount account) {
-        try {
-            CidIpadServer ipad = ipadMap.get(account.getServerId());
-            String url = "ws://" + ipad.getIp() + ":" + ipad.getPort() + "/ws/GetSyncMsg?key=" + account.getAuthKey();
-            // 1. 创建 WebSocket 客户端容器(SpringBoot 2 内置)
-            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
-            // 2. 连接第三方服务,绑定消息处理器
-            container.connectToServer(new WebSocketMessageHandler(account, ipad), URI.create(url));
-            log.info("✅ 原生 WebSocket 连接第三方服务成功:{}", url);
-        } catch (Exception e) {
-            log.error("❌ 原生 WebSocket 连接失败:{}", e.getMessage(), e);
-            scheduleReconnect(account);
-        }
-    }
-
-    /**
-     * 消息处理器(核心:接收/处理第三方消息)
-     */
-    @ClientEndpoint
-    public class WebSocketMessageHandler {
-        private CompanyWxAccount account;
-        private CidIpadServer ipad;
-        public WebSocketMessageHandler(CompanyWxAccount account, CidIpadServer ipad) {
-            this.account = account;
-            this.ipad = ipad;
-        }
-
-        // 连接成功回调(保存会话)
-        @OnOpen
-        public void onOpen(Session session) {
-            sessionMap.put(account.getId(), session);
-            log.info("✅ WebSocket 会话建立,SessionID:{}", session.getId());
-            // 取消重连(若有)
-            reconnectScheduler.shutdownNow();
-        }
-
-        // 接收第三方消息(核心业务逻辑)
-        @OnMessage
-        public void onMessage(String message) {
-            WxCallbackVo callbackVo = JSON.parseObject(message, WxCallbackVo.class);
-            log.info("📩 收到第三方 WebSocket 消息:{}", callbackVo);
-            WxCallbackVo.Message msgVo = callbackVo.getMessage();
-            String formUser = msgVo.getFromUserName().getStr();
-            if(msgVo.getMsgType() == 10000 && "以上是打招呼的消息".equals(msgVo.getContent().getStr())){
-                companyWxAccountService.isCheckContact(formUser, account.getId());
-            }
-            wxMsgLogService.insertLog(callbackVo, account, !formUser.equals(account.getWxNo()) ? 0 : 1);
-        }
-
-        // 处理二进制消息(若第三方推送二进制数据,如文件/字节流)
-        @OnMessage
-        public void onMessage(byte[] binaryData) {
-            log.info("📩 收到第三方二进制消息,长度:{} 字节", binaryData.length);
-        }
-
-        // 连接关闭回调(触发重连)
-        @OnClose
-        public void onClose(Session session, CloseReason reason) {
-            log.error("❌ WebSocket 会话关闭:{},{}秒后重连", reason.getReasonPhrase(), RECONNECT_INTERVAL);
-            sessionMap.remove(account.getId());
-            scheduleReconnect(account);
-        }
-
-        // 连接异常回调(触发重连)
-        @OnError
-        public void onError(Session session, Throwable error) {
-            log.error("连接报错!!!", error);
-        }
-    }
-
-    /**
-     * 调度重连
-     */
-    private void scheduleReconnect(CompanyWxAccount account) {
-        if (!reconnectScheduler.isShutdown()) {
-            reconnectScheduler.schedule(() -> connect(account), RECONNECT_INTERVAL, TimeUnit.SECONDS);
-            log.info("⏳ 已调度 {} 秒后重连第三方 WebSocket 服务", RECONNECT_INTERVAL);
-        }
-    }
-}
-
+//package com.fs.app.controller;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.fs.common.utils.PubFun;
+//import com.fs.company.domain.CompanyWxAccount;
+//import com.fs.company.service.ICompanyWxAccountService;
+//import com.fs.wxcid.domain.CidIpadServer;
+//import com.fs.wxcid.domain.WxMsgLog;
+//import com.fs.wxcid.dto.callback.WxCallbackVo;
+//import com.fs.wxcid.service.ICidIpadServerService;
+//import com.fs.wxcid.service.IWxMsgLogService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+//import javax.websocket.*;
+//import java.net.URI;
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.concurrent.ConcurrentHashMap;
+//import java.util.concurrent.Executors;
+//import java.util.concurrent.ScheduledExecutorService;
+//import java.util.concurrent.TimeUnit;
+//
+//
+//@Slf4j
+//@Component
+//public class WebscoketServer {
+//    @Autowired
+//    private ICidIpadServerService cidIpadServerService;
+//    @Autowired
+//    private ICompanyWxAccountService companyWxAccountService;
+//    @Autowired
+//    private IWxMsgLogService wxMsgLogService;
+//    @Value("${group-no}")
+//    private String groupNo;
+//
+//    // 重连间隔(秒)
+//    private static final int RECONNECT_INTERVAL = 5;
+//    // 客户端会话
+//    private Map<Long, Session> sessionMap = new ConcurrentHashMap<>();
+//    // ipad 数据
+//    private Map<Long, CidIpadServer> ipadMap = new HashMap<>();
+//    // 重连调度器
+//    private final ScheduledExecutorService reconnectScheduler = Executors.newSingleThreadScheduledExecutor();
+//
+//    /**
+//     * 启动客户端(连接第三方 + 监听消息)
+//     */
+//    public void start() {
+//        List<CidIpadServer> ipadList = cidIpadServerService.list(new QueryWrapper<CidIpadServer>().eq("group_no", groupNo));
+//        if(ipadList.isEmpty()){
+//            log.info("没有需要连接的账号");
+//            return;
+//        }
+//        ipadMap = PubFun.listToMapByGroupObject(ipadList, CidIpadServer::getId);
+//        List<CompanyWxAccount> list = companyWxAccountService.list(new QueryWrapper<CompanyWxAccount>().eq("server_status", 1).eq("login_status", 1).in("server_id", PubFun.listToNewList(ipadList, CidIpadServer::getId)));
+//        list.forEach(this::connect);
+////        connect();
+//    }
+//
+//    /**
+//     * 连接第三方 WebSocket 服务
+//     */
+//    private void connect(CompanyWxAccount account) {
+//        try {
+//            CidIpadServer ipad = ipadMap.get(account.getServerId());
+//            String url = "ws://" + ipad.getIp() + ":" + ipad.getPort() + "/ws/GetSyncMsg?key=" + account.getAuthKey();
+//            // 1. 创建 WebSocket 客户端容器(SpringBoot 2 内置)
+//            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
+//            // 2. 连接第三方服务,绑定消息处理器
+//            container.connectToServer(new WebSocketMessageHandler(account, ipad), URI.create(url));
+//            log.info("✅ 原生 WebSocket 连接第三方服务成功:{}", url);
+//        } catch (Exception e) {
+//            log.error("❌ 原生 WebSocket 连接失败:{}", e.getMessage(), e);
+//            scheduleReconnect(account);
+//        }
+//    }
+//
+//    /**
+//     * 消息处理器(核心:接收/处理第三方消息)
+//     */
+//    @ClientEndpoint
+//    public class WebSocketMessageHandler {
+//        private CompanyWxAccount account;
+//        private CidIpadServer ipad;
+//        public WebSocketMessageHandler(CompanyWxAccount account, CidIpadServer ipad) {
+//            this.account = account;
+//            this.ipad = ipad;
+//        }
+//
+//        // 连接成功回调(保存会话)
+//        @OnOpen
+//        public void onOpen(Session session) {
+//            sessionMap.put(account.getId(), session);
+//            log.info("✅ WebSocket 会话建立,SessionID:{}", session.getId());
+//            // 取消重连(若有)
+//            reconnectScheduler.shutdownNow();
+//        }
+//
+//        // 接收第三方消息(核心业务逻辑)
+//        @OnMessage
+//        public void onMessage(String message) {
+//            WxCallbackVo callbackVo = JSON.parseObject(message, WxCallbackVo.class);
+//            log.info("📩 收到第三方 WebSocket 消息:{}", callbackVo);
+//            WxCallbackVo.Message msgVo = callbackVo.getMessage();
+//            String formUser = msgVo.getFromUserName().getStr();
+//            if(msgVo.getMsgType() == 10000 && "以上是打招呼的消息".equals(msgVo.getContent().getStr())){
+//                companyWxAccountService.isCheckContact(formUser, account.getId());
+//            }
+//            wxMsgLogService.insertLog(callbackVo, account, !formUser.equals(account.getWxNo()) ? 0 : 1);
+//        }
+//
+//        // 处理二进制消息(若第三方推送二进制数据,如文件/字节流)
+//        @OnMessage
+//        public void onMessage(byte[] binaryData) {
+//            log.info("📩 收到第三方二进制消息,长度:{} 字节", binaryData.length);
+//        }
+//
+//        // 连接关闭回调(触发重连)
+//        @OnClose
+//        public void onClose(Session session, CloseReason reason) {
+//            log.error("❌ WebSocket 会话关闭:{},{}秒后重连", reason.getReasonPhrase(), RECONNECT_INTERVAL);
+//            sessionMap.remove(account.getId());
+//            scheduleReconnect(account);
+//        }
+//
+//        // 连接异常回调(触发重连)
+//        @OnError
+//        public void onError(Session session, Throwable error) {
+//            log.error("连接报错!!!", error);
+//        }
+//    }
+//
+//    /**
+//     * 调度重连
+//     */
+//    private void scheduleReconnect(CompanyWxAccount account) {
+//        if (!reconnectScheduler.isShutdown()) {
+//            reconnectScheduler.schedule(() -> connect(account), RECONNECT_INTERVAL, TimeUnit.SECONDS);
+//            log.info("⏳ 已调度 {} 秒后重连第三方 WebSocket 服务", RECONNECT_INTERVAL);
+//        }
+//    }
+//}
+//

+ 26 - 0
fs-wx-api/src/main/java/com/fs/app/enums/CmdType.java

@@ -0,0 +1,26 @@
+package com.fs.app.enums;
+
+public enum CmdType {
+    // 心跳
+    HEARTBEAT,
+    // 数据返回
+    RETURN,
+    // 退出登录
+    LOGIN_OUT,
+    // 同步用户信息
+    SYNC_INFO,
+    // 同步联系人
+    SYNC_CONTACT_PERSON,
+    // 同步群
+    SYNC_GROUP_CHAT,
+    // 发送消息
+    SEND_MSG,
+    // 消息回调接收
+    SEND_RESULT,
+    // 添加微信
+    ADD_WX,
+    // 添加微信回传
+    ADD_WX_RESULT,
+
+
+}

+ 35 - 0
fs-wx-api/src/main/java/com/fs/app/websocket/bean/ResultMsgVo.java

@@ -0,0 +1,35 @@
+package com.fs.app.websocket.bean;
+
+import com.fs.app.enums.CmdType;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ResultMsgVo<T> {
+
+    private String msg = "ok";
+    private CmdType cmd = CmdType.RETURN;
+    private int code = 200;
+    private int type = 0;
+    private T data;
+
+    public static ResultMsgVo<Void> ok(){
+        return new ResultMsgVo<>();
+    }
+    public static <T> ResultMsgVo<T> ok(T data){
+        return ResultMsgVo.<T>builder().data(data).build();
+    }
+    public static <T> ResultMsgVo<T> ok(CmdType cmd){
+        return ResultMsgVo.<T>builder().cmd(cmd) .build();
+    }
+
+    public static ResultMsgVo<Void> error(String msg){
+        return ResultMsgVo.<Void>builder().msg(msg).code(500).build();
+    }
+
+}

+ 5 - 4
fs-wx-api/src/main/java/com/fs/app/websocket/bean/SendMsgVo.java

@@ -1,5 +1,6 @@
 package com.fs.app.websocket.bean;
 
+import com.fs.app.enums.CmdType;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -11,10 +12,10 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 public class SendMsgVo {
 
-    private Long userId;
-    private String cmd;
-    private String msg;
-    private String nickName;
+    private CmdType cmd;
+    // 0发送微信1客户端接收
+    private int type;
+    private String dataJson;
 
 
 }

+ 42 - 42
fs-wx-api/src/main/java/com/fs/app/websocket/service/Task.java

@@ -1,42 +1,42 @@
-package com.fs.app.websocket.service;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import javax.websocket.Session;
-import java.io.IOException;
-import java.util.Collection;
-
-@Slf4j
-@Component
-public class Task {
-
-    @Scheduled(cron = "0 0/5 * * * ?")
-//    @Scheduled(cron = "0/5 * * * * ?")
-    public void addUser() {
-        Collection<Session> values = WebSocketServer.sessionPools.values();
-        values.forEach(session -> {
-            sendMessage(session, "{\"cmd\":\"addUser\"}");
-        });
-    }
-    @Scheduled(cron = "0 0/5 * * * ?")
-//    @Scheduled(cron = "0/5 * * * * ?")
-    public void checkUser() {
-        Collection<Session> values = WebSocketServer.sessionPools.values();
-        values.forEach(session -> {
-            sendMessage(session, "{\"cmd\":\"checkUser\"}");
-        });
-    }
-    public void sendMessage(Session session, String message) {
-        if(session != null){
-            synchronized (session) {
-                try {
-                    session.getBasicRemote().sendText(message);
-                } catch (IOException e) {
-                    log.error("发送数据失败!");
-                }
-            }
-        }
-    }
-}
+//package com.fs.app.websocket.service;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.stereotype.Component;
+//
+//import javax.websocket.Session;
+//import java.io.IOException;
+//import java.util.Collection;
+//
+//@Slf4j
+//@Component
+//public class Task {
+//
+//    @Scheduled(cron = "0 0/5 * * * ?")
+////    @Scheduled(cron = "0/5 * * * * ?")
+//    public void addUser() {
+//        Collection<Session> values = WebSocketServer.sessionPools.values();
+//        values.forEach(session -> {
+//            sendMessage(session, "{\"cmd\":\"addUser\"}");
+//        });
+//    }
+//    @Scheduled(cron = "0 0/5 * * * ?")
+////    @Scheduled(cron = "0/5 * * * * ?")
+//    public void checkUser() {
+//        Collection<Session> values = WebSocketServer.sessionPools.values();
+//        values.forEach(session -> {
+//            sendMessage(session, "{\"cmd\":\"checkUser\"}");
+//        });
+//    }
+//    public void sendMessage(Session session, String message) {
+//        if(session != null){
+//            synchronized (session) {
+//                try {
+//                    session.getBasicRemote().sendText(message);
+//                } catch (IOException e) {
+//                    log.error("发送数据失败!");
+//                }
+//            }
+//        }
+//    }
+//}

+ 136 - 104
fs-wx-api/src/main/java/com/fs/app/websocket/service/WebSocketServer.java

@@ -1,39 +1,27 @@
 package com.fs.app.websocket.service;
 
 
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.fs.ai.service.IBaiduAIService;
-import com.fs.ai.vo.BaiduAIMsgResultVO;
-import com.fs.app.param.SopLogsEditParam;
-import com.fs.app.websocket.bean.MsgBean;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.app.websocket.bean.ResultMsgVo;
 import com.fs.app.websocket.bean.SendMsgVo;
-import com.fs.chat.config.WxConfig;
-import com.fs.chat.domain.ChatKeyword;
-import com.fs.chat.domain.ChatMsg;
-import com.fs.chat.domain.ChatRole;
-import com.fs.chat.domain.ChatSession;
-import com.fs.chat.service.IChatMsgService;
-import com.fs.chat.service.IChatRoleService;
-import com.fs.chat.service.IChatSessionService;
+import com.fs.company.domain.CompanyWxClient;
+import com.fs.company.mapper.CompanyWxClientMapper;
+import com.fs.company.service.impl.CompanyWxServiceImpl;
+import com.fs.wxcid.vo.wxvo.ContactInfoVo;
+import com.fs.wxcid.vo.wxvo.SyncInfoVo;
+import com.fs.wxcid.vo.wxvo.WxSendMsgVo;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.spring.SpringUtils;
-
-import com.fs.company.domain.CompanyUser;
-import com.fs.company.domain.CompanyWxChat;
-import com.fs.company.service.ICompanyUserService;
-import com.fs.company.service.ICompanyWxChatService;
-import com.fs.course.domain.FsCourseSopLogs;
-import com.fs.course.service.IFsCourseSopLogsService;
-import com.fs.his.domain.FsUser;
-import com.fs.his.service.IFsUserService;
-import com.fs.wx.kf.dto.WeixinKfImageMsgDTO;
-import com.fs.wx.kf.dto.WeixinKfMsgSendDTO;
-import com.fs.wx.kf.dto.WeixinKfTextMsgDTO;
-import com.fs.wxUser.domain.CompanyWxUser;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.fs.company.domain.CompanyWxAccount;
+import com.fs.company.mapper.CompanyWxAccountMapper;
+import com.fs.wxcid.domain.WxContact;
+import com.fs.wxcid.mapper.WxContactMapper;
+import com.fs.wxcid.service.IWxMsgLogService;
+import com.fs.wxcid.vo.wxvo.WxSendResultMsgVo;
+import com.hc.openapi.tool.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import javax.websocket.*;
@@ -41,116 +29,160 @@ import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
 import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.Date;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static com.fs.common.constant.FsConstants.REDIS_CHAT_SESSION;
 
-@ServerEndpoint("/app/webSocket/{uid}")
+@Slf4j
 @Component
+@ServerEndpoint("/app/webSocket/{wxId}")
 public class WebSocketServer {
 
-    private final ICompanyWxChatService companyWxChatService = SpringUtils.getBean(ICompanyWxChatService.class);
-    private final ICompanyUserService companyUserService = SpringUtils.getBean(ICompanyUserService.class);
-
     //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
-    protected static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
-    RedisCache redisCache=SpringUtils.getBean(RedisCache.class);
-    IFsCourseSopLogsService iFsCourseSopLogsService=SpringUtils.getBean(IFsCourseSopLogsService.class);
+    public static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
+    RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
+    CompanyWxAccountMapper accountMapper = SpringUtils.getBean(CompanyWxAccountMapper.class);
+    WxContactMapper wxContactMapper = SpringUtils.getBean(WxContactMapper.class);
+    IWxMsgLogService wxMsgLogService = SpringUtils.getBean(IWxMsgLogService.class);
+    CompanyWxClientMapper companyWxClientMapper = SpringUtils.getBean(CompanyWxClientMapper.class);
+    CompanyWxServiceImpl companyWxService = SpringUtils.getBean(CompanyWxServiceImpl.class);
 
     //发送消息
-    public void sendMessage(Session session, String message) throws IOException {
-        if(session != null){
+    public <T> void sendMessage(Session session, ResultMsgVo<T> data) {
+        if (session != null) {
             synchronized (session) {
-                System.out.println("发送数据:" + message);
-                session.getBasicRemote().sendText(message);
-            }
-        }
-    }
-    //给指定用户发送信息
-    public void sendInfo(String id, String message){
-        Session session = sessionPools.get(id);
-        try {
-            if(session != null){
-                sendMessage(session, message);
+                log.info("发送数据:{}", data);
+                try {
+                    session.getBasicRemote().sendText(JSON.toJSONString(data));
+                } catch (IOException e) {
+                    log.error("发送消息失败!:{}", data, e);
+                }
             }
-
-        }catch (Exception e){
-            e.printStackTrace();
         }
     }
-
     //建立连接成功调用
     @OnOpen
-    public void onOpen(Session session, @PathParam(value = "uid") String uid){
-
-        sessionPools.put(uid, session);
-
-        System.out.println(uid + "加入webSocket!当前人数为" + sessionPools.size());
-
+    public void onOpen(Session session, @PathParam(value = "wxId") String wxId) {
+        sessionPools.put(wxId, session);
+        CompanyWxAccount companyWxAccount = accountMapper.selectOne(new QueryWrapper<CompanyWxAccount>().eq("wx_no", wxId));
+        if(companyWxAccount == null){
+            sendMessage(session, ResultMsgVo.error("未找到对应微信数据"));
+            return;
+        }
+        companyWxAccount.setLoginStatus(1);
+        companyWxAccount.setLoginTime(LocalDateTime.now());
+        accountMapper.updateById(companyWxAccount);
+        log.info("{}加入webSocket!当前人数为{}", wxId, sessionPools.size());
     }
 
     //关闭连接时调用
     @OnClose
-    public void onClose(@PathParam(value = "uid") String uid){
-
-        sessionPools.remove(uid);
-        System.out.println(uid + "断开webSocket连接!当前人数为" + sessionPools.size());
+    public void onClose(@PathParam(value = "wxId") String wxId) {
+        sessionPools.remove(wxId);
+        CompanyWxAccount companyWxAccount = accountMapper.selectOne(new QueryWrapper<CompanyWxAccount>().eq("wx_no", wxId));
+        if(companyWxAccount != null){
+            companyWxAccount.setLoginStatus(0);
+            companyWxAccount.setOutTime(LocalDateTime.now());
+            companyWxAccount.setOutRemark("连接断开");
+            accountMapper.updateById(companyWxAccount);
+        }
+        log.info("{}断开webSocket连接!当前人数为{}", wxId, sessionPools.size());
     }
 
     //收到客户端信息
     @OnMessage
-    public void onMessage(String message) throws IOException{
+    public void onMessage(String message, @PathParam(value = "wxId") String wxId) {
         SendMsgVo msg = JSONObject.parseObject(message, SendMsgVo.class);
-        Session session;
-        System.out.println( "收到数据" + msg.getCmd());
+        if(msg.getType() == 0){
+            return;
+        }
+        Session session = sessionPools.get(wxId);
+        if(session == null){
+            log.error("参数异常:{}", wxId);
+            return;
+        }
+        log.info("收到数据:{}", msg.getCmd());
+        CompanyWxAccount companyWxAccount = accountMapper.selectOne(new QueryWrapper<CompanyWxAccount>().eq("wx_no", wxId));
+        if(companyWxAccount == null){
+            log.error("未找到对应账号:{}", wxId);
+            return;
+        }
         try {
-            switch (msg.getCmd()){
-                case "heartbeat":
-                    session=sessionPools.get(msg.getUserId());
-                    sendMessage(session, JSONObject.toJSONString(msg));
+            switch (msg.getCmd()) {
+                case HEARTBEAT:
+                    log.info("接收心跳:{}", wxId);
                     break;
-                case "sendSop":
-
+                case SYNC_CONTACT_PERSON:
+                    ContactInfoVo contactInfoVo = JSON.parseObject(msg.getDataJson(), ContactInfoVo.class);
+                    if(contactInfoVo == null || StringUtils.isEmpty(contactInfoVo.getRemark())){
+                        log.error("{}同步数据失败,数据缺失:{}", wxId, contactInfoVo);
+                        return;
+                    }
+                    WxContact contact = wxContactMapper.selectOne(new QueryWrapper<WxContact>().eq("remark", contactInfoVo.getRemark()));
+                    if(contact != null){
+                        contact.setNickName(contactInfoVo.getNickName());
+                        contact.setCity(contactInfoVo.getAddress());
+                        contact.setUserName(contactInfoVo.getWxNo());
+                        contact.setUpdateTime(new Date());
+                        wxContactMapper.updateById(contact);
+                    }else{
+                        WxContact contact1 = new WxContact();
+                        contact1.setUserName(contactInfoVo.getWxNo());
+                        contact1.setNickName(contactInfoVo.getNickName());
+                        contact1.setCity(contactInfoVo.getAddress());
+                        contact1.setAccountId(companyWxAccount.getId());
+                        contact1.setCompanyId(companyWxAccount.getCompanyId());
+                        contact1.setCompanyUserId(companyWxAccount.getCompanyUserId());
+                        contact1.setRemark(contactInfoVo.getRemark());
+                        contact1.setCreateTime(new Date());
+                        contact1.setUpdateTime(new Date());
+                        wxContactMapper.insert(contact1);
+                    }
+                    break;
+                case SEND_MSG:
+                    log.info("发送返回:{}", msg);
+                    wxMsgLogService.insertLog(JSON.parseObject(msg.getDataJson(), WxSendResultMsgVo.class), companyWxAccount, 0);
+                    break;
+                case SEND_RESULT:
+                    log.info("接收消息:{}", msg);
+                    wxMsgLogService.insertLog(JSON.parseObject(msg.getDataJson(), WxSendResultMsgVo.class), companyWxAccount, 0);
+                    break;
+                case SYNC_INFO:
+                    SyncInfoVo syncInfoVo = JSON.parseObject(msg.getDataJson(), SyncInfoVo.class);
+                    companyWxAccount.setHeadImgUrl(syncInfoVo.getImg());
+                    companyWxAccount.setPhone(syncInfoVo.getPhone());
+                    accountMapper.updateById(companyWxAccount);
                     break;
-                case "sendMsg":
-                    CompanyWxUser companyWxUser = companyUserService.selectCompanyUserByNickName(msg.getUserId(), msg.getNickName());
-                    if(companyWxUser != null){
-                        saveWxChat(msg.getMsg(), companyWxUser, 1);
+                case ADD_WX_RESULT:
+                    com.fs.wxcid.vo.wxvo.AddResultWxVo addResultWxVo = JSON.parseObject(msg.getDataJson(), com.fs.wxcid.vo.wxvo.AddResultWxVo.class);
+                    log.info("接收到加好友回调:{}", addResultWxVo);
+                    WxContact wxContact = wxContactMapper.selectOne(new QueryWrapper<WxContact>().eq("remark", addResultWxVo.getRemark()).eq("friends", 0));
+                    wxContact.setFriends(1);
+                    wxContactMapper.updateById(wxContact);
+                    List<CompanyWxClient> clients = companyWxClientMapper.selectWxV2(companyWxAccount.getId(), wxContact.getPhone());
+                    if(clients != null){
+                        clients.parallelStream().forEach(e -> {
+                            e.setIsAdd(1);
+                            e.setRemark(addResultWxVo.getRemark());
+                            e.setWxName(addResultWxVo.getUserName());
+                            e.setSuccessAddTime(LocalDateTime.now());
+                            companyWxClientMapper.updateById(e);
+                            companyWxService.triggerWorkflowOnAddWxSuccess(e.getId());
+                        });
                     }
                     break;
 
             }
-        }
-        catch (Exception e){
-            System.out.println( "收到数据" + e.getMessage());
+        } catch (Exception e) {
+            log.error("发生错误;{}", e.getMessage());
         }
 
     }
+
     //错误时调用
     @OnError
-    public void onError(Session session, Throwable throwable){
-        System.out.println("发生错误"+throwable.getMessage());
+    public void onError(Session session, Throwable throwable) {
+        log.error("发生错误;{}", throwable.getMessage());
         throwable.printStackTrace();
     }
-
-
-    public SendMsgVo saveWxChat(String msg, CompanyWxUser user, Integer sendType) {
-        SendMsgVo build = SendMsgVo.builder().cmd("sendMsg").msg(msg).nickName(user.getNickName()).build();
-        CompanyWxChat companyWxChat = new CompanyWxChat();
-        companyWxChat.setWxUserId(user.getUserId());
-        companyWxChat.setCompanyId(user.getCompanyId());
-        companyWxChat.setCompanyUserId(user.getCompanyUserId());
-        companyWxChat.setContent(msg);
-        companyWxChat.setSendType(sendType);
-        companyWxChat.setCreateTime(new Date());
-        companyWxChatService.save(companyWxChat);
-        return build;
-    }
-
-
 }

+ 1 - 2
fs-wx-api/src/main/resources/application.yml

@@ -6,5 +6,4 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: dev
-group-no: 3
+    active: dev