15376779826 vor 2 Monaten
Ursprung
Commit
40b29472b7
32 geänderte Dateien mit 1747 neuen und 97 gelöschten Zeilen
  1. 74 6
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java
  2. 16 5
      fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java
  3. 34 10
      fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  4. 62 5
      fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java
  5. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  6. 1 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  7. 1 1
      fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java
  8. 2 1
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java
  9. 34 0
      fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java
  10. 2 0
      fs-service/src/main/java/com/fs/his/mapper/FsDoctorMapper.java
  11. 3 1
      fs-service/src/main/java/com/fs/his/service/IFsFollowService.java
  12. 6 5
      fs-service/src/main/java/com/fs/his/service/IFsInquiryOrderService.java
  13. 39 6
      fs-service/src/main/java/com/fs/his/service/impl/FsDoctorServiceImpl.java
  14. 52 10
      fs-service/src/main/java/com/fs/his/service/impl/FsFollowServiceImpl.java
  15. 95 21
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java
  16. 29 0
      fs-service/src/main/java/com/fs/im/config/IMConfig.java
  17. 15 0
      fs-service/src/main/java/com/fs/im/dto/OpenImConversationDTO.java
  18. 11 0
      fs-service/src/main/java/com/fs/im/dto/OpenImEditConversationDTO.java
  19. 12 0
      fs-service/src/main/java/com/fs/im/dto/OpenImMsgCallBackResponse.java
  20. 45 0
      fs-service/src/main/java/com/fs/im/dto/OpenImMsgDTO.java
  21. 13 0
      fs-service/src/main/java/com/fs/im/dto/OpenImResponseDTO.java
  22. 11 0
      fs-service/src/main/java/com/fs/im/dto/OpenImResponseDataDTO.java
  23. 36 0
      fs-service/src/main/java/com/fs/im/service/OpenIMService.java
  24. 1047 0
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  25. 28 0
      fs-service/src/main/java/com/fs/im/vo/OpenImMsgCallBackVO.java
  26. 18 0
      fs-service/src/main/java/com/fs/im/vo/OpenImResponseDTOTest.java
  27. 8 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  28. 4 0
      fs-service/src/main/resources/application-common.yml
  29. 1 0
      fs-service/src/main/resources/application-config-dev.yml
  30. 3 0
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  31. 7 0
      fs-service/src/main/resources/mapper/his/FsDoctorMapper.xml
  32. 36 25
      fs-user-app/src/main/java/com/fs/app/controller/FollowController.java

+ 74 - 6
fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java

@@ -1,6 +1,7 @@
 package com.fs.app.controller;
 
 
+import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.param.DoctorEditParam;
@@ -20,13 +21,18 @@ import com.fs.his.param.FsDoctorExtractListSParam;
 import com.fs.his.service.*;
 import com.fs.his.vo.FsDoctorBillListSVO;
 import com.fs.his.vo.FsDoctorExtractListSVO;
+import com.fs.im.service.OpenIMService;
 import com.fs.sms.service.SmsService;
 import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.github.pagehelper.util.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -34,13 +40,11 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
+@Slf4j
 @Api("个人中心")
 @RestController
 @RequestMapping(value="/app/doctor")
@@ -59,7 +63,8 @@ public class DoctorController extends  AppBaseController {
     private IFsDoctorExtractService doctorExtractService;
     @Autowired
     private ISysConfigService configService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @Autowired
     private SmsService smsService;
     @ApiOperation("登录")
@@ -100,7 +105,70 @@ public class DoctorController extends  AppBaseController {
             return R.ok(map);
         }
     }
-
+    @ApiOperation("校验医生是否注册新的im")
+    @PostMapping("/accountCheck")
+    public R accountCheck(@RequestBody Map<String, String> userIdMap){
+        //获取管理员token
+        String userId = userIdMap.get("userId");
+        String adminToken = openIMService.getAdminToken();
+        JSONObject requestBody = new JSONObject();
+        // 解析响应
+        if (StringUtil.isNotEmpty(adminToken)) {
+            //查询用户是否注册
+            ArrayList<String> userIds = new ArrayList<>();
+            requestBody = new JSONObject();
+            userIds.add(userId);
+            requestBody.put("checkUserIDs", userIds);
+            String body = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/account_check")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(requestBody.toString())
+                    .execute()
+                    .body();
+            JSONObject jsonObject = new JSONObject(body);
+            JSONArray results = jsonObject.getJSONObject("data").getJSONArray("results");
+            if (results != null && results.length() > 0) {
+                JSONObject resultObj = results.getJSONObject(0);
+                int accountStatus = resultObj.getInt("accountStatus");
+                //未注册自动注册
+                if (accountStatus==0){
+                    String s = userId.replaceFirst("^scrmD", "");
+                    FsDoctor fsDoctor = doctorService.selectFsDoctorByDoctorId(Long.parseLong(s));
+                    if (null==fsDoctor){
+                        return R.error("用户不存在");
+                    }
+                    ArrayList<Object> users = new ArrayList<>();
+                    HashMap<String, String> map = new HashMap<>();
+                    map.put("userID",userId);
+                    map.put("nickname",fsDoctor.getDoctorName());
+                    map.put("faceURL",StringUtils.isEmpty(fsDoctor.getAvatar())?"https://cos.his.cdwjyyh.com/fs/20240926/420728ee06e54575ba82665dedb4756b.png":fsDoctor.getAvatar());
+                    users.add(map);
+                    requestBody = new JSONObject();
+                    //userIds.add(userId);
+                    requestBody.put("users", users);
+                    String body1 = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/user_register")
+                            .header("operationID", String.valueOf(System.currentTimeMillis()))
+                            .header("token", adminToken).body(requestBody.toString()).execute().body();
+                    log.info("注册结果:"+body1);
+                }
+            } else {
+                return R.error("返回结果为空");
+            }
+            requestBody = new JSONObject();
+            requestBody.put("platformID",5);
+            requestBody.put("userID",userId);
+            String body1 = HttpRequest.post("https://web.im.cdwjyyh.com/api/auth/get_user_token")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(requestBody.toString()).execute().body();
+            JSONObject userJson = new JSONObject(body1);
+            JSONObject userData = userJson.getJSONObject("data");
+            String userToken = userData.getString("token");
+            return R.ok().put("token", userToken);
+        } else {
+            return R.error("获取管理员token失败");
+        }
+    }
     @ApiOperation("登录")
     @PostMapping("/loginByWeb")
     public R loginByWeb(@Validated @RequestBody DoctorLoginParam param) {

+ 16 - 5
fs-doctor-app/src/main/java/com/fs/app/controller/DrugReportController.java

@@ -2,6 +2,8 @@ package com.fs.app.controller;
 
 
 import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.param.DrugReportAddParam;
 import com.fs.app.param.DrugReportFinishParam;
 import com.fs.common.annotation.RepeatSubmit;
@@ -21,6 +23,7 @@ import com.fs.his.vo.FsDrugReportListDVO;
 import com.fs.his.vo.FsFollowListDVO;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -53,7 +56,8 @@ public class DrugReportController extends AppBaseController {
     private IImService imService;
     @Autowired
     private IFsDrugReportCountService fsDrugReportCountService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @ApiOperation("获取报告列表")
     @GetMapping("/getDrugReportList")
     public R getDrugReportList(FsDrugReportListDParam param)
@@ -74,7 +78,7 @@ public class DrugReportController extends AppBaseController {
 
     @ApiOperation("提交报告")
     @PostMapping("/addReport")
-    public R addReport(@Validated @RequestBody DrugReportAddParam param, HttpServletRequest request){
+    public R addReport(@Validated @RequestBody DrugReportAddParam param, HttpServletRequest request) throws JsonProcessingException {
         FsFollow follow=followService.selectFsFollowByFollowId(param.getFollowId());
 
         FsDrugReport report=new FsDrugReport();
@@ -104,7 +108,10 @@ public class DrugReportController extends AppBaseController {
             msg.setMsgContent(new MsgDataFormatDTO("drugReport",ext,report.getReportId().toString()));
             msgs.add(msg);
             msgDTO.setMsgBody(msgs);
-            imService.sendMsg(msgDTO);
+            //imService.sendMsg(msgDTO);
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            openIMService.sendUtil("scrmD"+follow.getDoctorId(),"scrmU"+follow.getUserId(),110,"drugReport","","","",report.getReportId().toString(),ex);
 
             fsDrugReportCountService.addReportCountByUserIdAndDoctorId(follow.getUserId(),follow.getDoctorId());
 
@@ -118,7 +125,7 @@ public class DrugReportController extends AppBaseController {
     @ApiOperation("完成咨询")
     @PostMapping("/finishDrugReport")
     @RepeatSubmit
-    public R finishDrugReport(@Validated @RequestBody DrugReportFinishParam param, HttpServletRequest request){
+    public R finishDrugReport(@Validated @RequestBody DrugReportFinishParam param, HttpServletRequest request) throws JsonProcessingException {
         FsFollow follow=followService.selectFsFollowByFollowId(param.getFollowId());
         //发送给用户
         MsgDTO msgDTO=new MsgDTO();
@@ -136,7 +143,11 @@ public class DrugReportController extends AppBaseController {
         msg.setMsgContent(new MsgDataFormatDTO("您的用药咨询报告已出具,本次咨询结束"));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        //imService.sendMsg(msgDTO);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String ex = objectMapper.writeValueAsString(customDTO);
+        openIMService.sendUtil("scrmD"+follow.getDoctorId(),"scrmU"+follow.getUserId(),110,"finishDrugReport","","您的用药咨询报告已出具,本次咨询结束","","",ex);
+
         redisTemplate.delete("DrugReport:doctorId:" + follow.getDoctorId() + ":userId:" + follow.getUserId());
         return R.ok();
 

+ 34 - 10
fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -5,6 +5,8 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 import com.fs.app.param.InquiryOrderMsgListParam;
 import com.fs.common.BeanCopyUtils;
@@ -30,6 +32,7 @@ import com.fs.im.dto.MsgDTO;
 import com.fs.im.dto.MsgDataDTO;
 import com.fs.im.dto.MsgDataFormatDTO;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.config.WxPayConfig;
@@ -87,7 +90,8 @@ public class InquiryOrderController extends  AppBaseController {
     private IFsInquiryOrderReportService orderReportService;
     @Autowired
     private IImService imService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @Login
     @GetMapping("/getInquiryOrderList")
     public R getInquiryOrderList(FsInquiryOrderListPDParam param)
@@ -174,7 +178,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("抢单")
     @PostMapping("/acceptOrder")
-    public R acceptOrder(@Validated @RequestBody FsInquiryOrderAcceptParam param, HttpServletRequest request){
+    public R acceptOrder(@Validated @RequestBody FsInquiryOrderAcceptParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.acceptOrder(param);
     }
@@ -182,7 +186,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("接单")
     @PostMapping("/receiveOrder")
-    public R receiveOrder(@Validated @RequestBody FsInquiryOrderReceiveParam param, HttpServletRequest request){
+    public R receiveOrder(@Validated @RequestBody FsInquiryOrderReceiveParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.receiveOrder(param);
     }
@@ -198,7 +202,7 @@ public class InquiryOrderController extends  AppBaseController {
     @Login
     @ApiOperation("完成订单")
     @PostMapping("/finishOrder")
-    public R finishOrder(@Validated @RequestBody FsInquiryOrderFinishParam param, HttpServletRequest request){
+    public R finishOrder(@Validated @RequestBody FsInquiryOrderFinishParam param, HttpServletRequest request) throws JsonProcessingException {
         param.setDoctorId(Long.parseLong(getDoctorId()));
         return inquiryOrderService.finishOrder(param);
     }
@@ -251,7 +255,7 @@ public class InquiryOrderController extends  AppBaseController {
     @ApiOperation("提交诊断报告")
     @PostMapping("/submitInquiryOrderReport")
     @Transactional
-    public R submitInquiryOrderReport(@Validated @RequestBody FsInquiryOrderReportSubmitDParam param, HttpServletRequest request){
+    public R submitInquiryOrderReport(@Validated @RequestBody FsInquiryOrderReportSubmitDParam param, HttpServletRequest request) throws JsonProcessingException {
         FsInquiryOrderReport report=null;
         if(param.getReportId()!=null&&param.getReportId()>0){
             report=orderReportService.selectFsInquiryOrderReportByReportId(param.getReportId());
@@ -292,15 +296,15 @@ public class InquiryOrderController extends  AppBaseController {
 
         }
         FsInquiryOrder inquiryOrder=inquiryOrderService.selectFsInquiryOrderByOrderId(report.getOrderId());
-        MsgDTO msgDTO=new MsgDTO();
+        /*MsgDTO msgDTO=new MsgDTO();
         msgDTO.setFrom_Account("D-"+report.getDoctorId().toString());
-        msgDTO.setTo_Account("U-"+report.getUserId().toString());
+        msgDTO.setTo_Account("U-"+report.getUserId().toString());*/
         MsgCustomDTO customDTO=new MsgCustomDTO();
         customDTO.setType("startInquiry");
         customDTO.setImType(1);
         customDTO.setOrderType(inquiryOrder.getOrderType());
         customDTO.setOrderId(report.getOrderId().toString());
-        msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
+        /*msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
         List<MsgDataDTO> msgs=new ArrayList<>();
         MsgDataDTO msg=new MsgDataDTO();
         String ext= JSONUtil.toJsonStr(report);
@@ -308,8 +312,28 @@ public class InquiryOrderController extends  AppBaseController {
         msg.setMsgContent(new MsgDataFormatDTO("report",ext,orderId));
         msg.setMsgType("TIMCustomElem");//TIMCustomElem
         msgs.add(msg);
-        msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        msgDTO.setMsgBody(msgs);*/
+        //imService.sendMsg(msgDTO);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String ex = objectMapper.writeValueAsString(customDTO);
+        openIMService.sendUtil("D"+report.getDoctorId(),"U"+report.getUserId(),110,"report","","","",report.getOrderId().toString(),ex);
+        /*JSONObject jsonObject = new JSONObject();
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setSendID("D"+report.getDoctorId().toString());
+        openImMsgDTO.setRecvID("U"+report.getUserId().toString());
+        openImMsgDTO.setContentType(110);
+        openImMsgDTO.setSenderPlatformID(5);
+        openImMsgDTO.setSessionType(1);
+
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        PayloadDTO payloadDTO = new PayloadDTO();
+        payloadDTO.setData("startInquiry");
+        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+        extension.setTitle();
+        //content.setContent(ext);
+        openImMsgDTO.setContent(content);
+        openImMsgDTO.setEx(customDTO);
+        openIMService.openIMSendMsg(openImMsgDTO);*/
         return R.ok("操作成功");
     }
 

+ 62 - 5
fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java

@@ -2,18 +2,28 @@ package com.fs.app.controller;
 
 
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
+import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.his.domain.*;
 import com.fs.his.dto.FsInquiryOrderPatientDTO;
+import com.fs.his.dto.PayloadDTO;
 import com.fs.his.param.*;
 import com.fs.his.service.*;
 import com.fs.his.vo.FsDoctorPrescribeListDVO;
 import com.fs.his.vo.FsPrescribeListDVO;
+import com.fs.im.dto.MsgCustomDTO;
+import com.fs.im.dto.OpenImMsgDTO;
+import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
+import com.fs.qw.domain.QwExternalContact;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -26,10 +36,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 @Api("处方接口")
@@ -55,7 +62,8 @@ public class PrescribeController extends  AppBaseController {
     private IFsStoreOrderService storeOrderService;
     @Autowired
     private IImService imService;
-
+    @Autowired
+    private OpenIMService openIMService;
     @Login
     @GetMapping("/getDoctorPrescribeList")
     public R getDoctorPrescribeList(FsDoctorPrescribeListDParam param)
@@ -275,4 +283,53 @@ public class PrescribeController extends  AppBaseController {
         String url=prescribeService.getPrescribeCodeUrl(prescribeId);
         return R.ok().put("url",url);
     }
+    @PostMapping("/test")
+    public R test(@RequestBody HashMap<String,String> map) throws JsonProcessingException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setSendID("D"+79);
+        openImMsgDTO.setRecvID("U"+map.get("userId"));
+        openImMsgDTO.setContentType(110);
+        openImMsgDTO.setSenderPlatformID(5);
+        openImMsgDTO.setSessionType(1);
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        //content.setContent(ext);
+        PayloadDTO payload = new PayloadDTO();
+        payload.setData("prescribe");
+        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+        extension.setDiagnose("感冒发烧,胸闷");
+        payload.setExtension(extension);
+        //log.info("payload:{}",payload);
+        OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+        imData.setPayload(payload);
+
+        String imJson = objectMapper.writeValueAsString(imData);
+        content.setData(imJson);
+        openImMsgDTO.setContent(content);
+        //log.info("openImMsgDTO:{}",openImMsgDTO);
+        JSONObject jsonObject = new JSONObject(openImMsgDTO);
+        //log.info("jsonObject:{}",jsonObject);
+        MsgCustomDTO customDTO=new MsgCustomDTO();
+        //customDTO.setType("startInquiry");
+        customDTO.setType(map.get("payloadDAata").toString());
+        customDTO.setOrderType(2);
+        customDTO.setOrderId(map.get("orderId"));
+        String imtype = map.get("imtype").toString();
+
+        customDTO.setImType(Integer.parseInt(imtype));
+        //openImMsgDTO.setEx(payload);
+        String ex = objectMapper.writeValueAsString(customDTO);
+        QwExternalContact qwExternalContact = new QwExternalContact();
+        qwExternalContact.setId(1l);
+        qwExternalContact.setFsUserId(1l);
+        //WatchSleepData last = watchSleepDataMapper.getLast("861389060165680");
+        //watchAudioMsgLogMapper.insert(watchAudioMsgLog);
+        //qwExternalContactMapper.selectRemarkByCompanyUserAndFsUser(map.get("sendId"), map.get("userId"),"wwwwww");
+        //fsUserCouponService.updateFsUserCouponStatusByLimtType2();
+//        openIMService.checkAndImportFriendByDianBo(Long.parseLong(map.get("sendId")),map.get("userId"),qwExternalContact.getCorpId());
+        //OpenImResponseDTO openImResponseDTO = openIMService.sendCourse(Long.parseLong(map.get("userId")), Long.parseLong(map.get("sendId")), "/pages/courseAnswer/index?link=1932017457275338752", "《五仙传医2.0》","https://cos.his.cdwjyyh.com/fs/20241108/a8ed49ae9a264c7483cec5bdcbcf6060.png");
+        OpenImResponseDTO openImResponseDTO = openIMService.sendUtil("scrmD"+map.get("sendId"), "scrmU"+map.get("userId").toString(), 110, map.get("payloadDAata").toString(), "", map.get("title").toString(), "", "3135749",ex);
+        return R.ok().put("data",null);
+    }
 }

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

@@ -301,4 +301,6 @@ public interface CompanyUserMapper
      * @param companyUserList 用户信息
      * **/
     void batchUpdateUserDept(@Param("companyUserList") List<CompanyUser> companyUserList);
+
+    CompanyUser selectCompanyUserByCompanyUserId(Long companyUserId);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -32,7 +32,7 @@ import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.google.gson.Gson;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;

+ 1 - 1
fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java

@@ -14,7 +14,7 @@ import com.fs.erp.service.impl.JstTokenService;
 import com.fs.erp.utils.SignUtil;
 import com.fs.ybPay.dto.RefundOrderDTO;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;

+ 2 - 1
fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java

@@ -19,7 +19,8 @@ import com.fs.his.mapper.FsStoreOrderMapper;
 import com.fs.his.service.IFsStoreOrderItemService;
 import com.fs.ybPay.dto.RefundOrderDTO;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;

+ 34 - 0
fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java

@@ -0,0 +1,34 @@
+package com.fs.his.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class PayloadDTO {
+    private String data;
+    private Extension extension;
+    private String description;
+
+    @Data
+    public static class Extension{
+        private String title;
+        private String patientName;
+        private String sex;
+        private String mobile;
+        private String duration;
+        private String isVisit;
+        private String diagnose;
+        private String prescribeId;
+        private String description;
+        private String followId;
+        private Integer status;
+        private Date sendTime;
+        private String courseUrl;
+        private String appRealLink;
+        private String writeStatus;
+        private String packageId;
+
+    }
+
+}

+ 2 - 0
fs-service/src/main/java/com/fs/his/mapper/FsDoctorMapper.java

@@ -200,4 +200,6 @@ public interface FsDoctorMapper
 
     @Select("SELECT doctor_id id,doctor_name name  FROM fs_doctor WHERE FIND_IN_SET(doctor_id, (select doctor_ids from company where company_id=#{companyId})); ")
     List<UserVo> selectUserDocVoListByCompany(Long companyId);
+
+    String selectDoctorNameByIds(@Param("doctorIds") String doctorIds);
 }

+ 3 - 1
fs-service/src/main/java/com/fs/his/service/IFsFollowService.java

@@ -1,6 +1,8 @@
 package com.fs.his.service;
 
 import java.util.List;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.his.domain.FsFollow;
 import com.fs.his.domain.FsPackageOrder;
 import com.fs.his.param.FsFollowListDParam;
@@ -68,7 +70,7 @@ public interface IFsFollowService
 
     FsFollowVO selectFsFollowVOByFollowId(Long followId);
 
-    void addFsFollowByPackageOrder(FsPackageOrder order);
+    void addFsFollowByPackageOrder(FsPackageOrder order) throws JsonProcessingException;
 
     List<FsFollowListUVO> selectFsFollowListUVO(FsFollowListUParam param);
 

+ 6 - 5
fs-service/src/main/java/com/fs/his/service/IFsInquiryOrderService.java

@@ -2,6 +2,7 @@ package com.fs.his.service;
 
 import java.util.List;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.*;
 import com.fs.his.param.*;
@@ -81,15 +82,15 @@ public interface IFsInquiryOrderService
 
     List<FsInquiryOrderListDVO> selectFsInquiryOrderListDVO(FsInquiryOrderListDParam param);
 
-    R acceptOrder(FsInquiryOrderAcceptParam param);
+    R acceptOrder(FsInquiryOrderAcceptParam param) throws JsonProcessingException;
 
-    R receiveOrder(FsInquiryOrderReceiveParam param);
+    R receiveOrder(FsInquiryOrderReceiveParam param) throws JsonProcessingException;
 
     R refuseOrder(FsInquiryOrderRefuseParam param);
 
-    R finishOrder(FsInquiryOrderFinishParam param);
+    R finishOrder(FsInquiryOrderFinishParam param) throws JsonProcessingException;
 
-    R autoFinishOrder(FsInquiryOrderFinishParam param);
+    R autoFinishOrder(FsInquiryOrderFinishParam param) throws JsonProcessingException;
 
     R pingOrder(FsInquiryOrderPingParam param);
 
@@ -109,7 +110,7 @@ public interface IFsInquiryOrderService
 
     R createOrderByPackageOrderStatus4(FsPackageOrder packageOrder);
 
-    String sendStartMsg(Long orderId);
+    String sendStartMsg(Long orderId) throws JsonProcessingException;
 
     R computeOrder(FsInquiryOrderComputeParam param, FsInquiryOrder order, FsUser user);
 

+ 39 - 6
fs-service/src/main/java/com/fs/his/service/impl/FsDoctorServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.his.service.impl;
 
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
@@ -21,11 +22,9 @@ import com.fs.his.utils.ConfigUtil;
 import com.fs.his.utils.HttpUtil;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.*;
-import com.fs.im.dto.MsgCustomDTO;
-import com.fs.im.dto.MsgDTO;
-import com.fs.im.dto.MsgDataDTO;
-import com.fs.im.dto.MsgDataFormatDTO;
+import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.oss.CloudStorageService;
@@ -71,6 +70,8 @@ public class FsDoctorServiceImpl implements IFsDoctorService
     private IFsPrescribeService fsPrescribeService;
     @Autowired
     ConfigUtil configUtil;
+    @Autowired
+    private OpenIMService openIMService;
     /**
      * 查询医生管理
      *
@@ -411,7 +412,21 @@ public class FsDoctorServiceImpl implements IFsDoctorService
                         msg.setMsgType("TIMCustomElem");//TIMCustomElem
                         msgs.add(msg);
                         msgDTO.setMsgBody(msgs);
-                        imService.sendMsg(msgDTO);
+                        //imService.sendMsg(msgDTO);
+                        ObjectMapper objectMapper = new ObjectMapper();
+                        String ex = objectMapper.writeValueAsString(customDTO3);
+                        openIMService.sendUtil("scrmD"+fsFollow.getDoctorId(),"scrmU"+fsFollow.getUserId(),110,"follow","","",followId,"",ex);
+                        /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+                        openImMsgDTO.setSendID("D"+fsFollow.getDoctorId().toString());
+                        openImMsgDTO.setRecvID("U"+fsFollow.getUserId().toString());
+                        openImMsgDTO.setContentType(110);
+                        openImMsgDTO.setSenderPlatformID(5);
+                        openImMsgDTO.setSessionType(1);
+                        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+                        content.setContent(ext);
+                        openImMsgDTO.setContent(content);
+                        //openImMsgDTO.setEx(customDTO);
+                        openIMService.openIMSendMsg(openImMsgDTO);*/
 
                         MsgDTO msgDTO2 = new MsgDTO();
                         MsgCustomDTO customDTO = new MsgCustomDTO();
@@ -430,7 +445,25 @@ public class FsDoctorServiceImpl implements IFsDoctorService
                         msg2.setMsgType("TIMTextElem");//TIMCustomElem
                         msgs2.add(msg2);
                         msgDTO2.setMsgBody(msgs2);
-                        imService.sendMsg(msgDTO2);
+                        //imService.sendMsg(msgDTO2);
+                        OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+                        openImMsgDTO1.setSendID("D"+fsFollow.getDoctorId().toString());
+                        openImMsgDTO1.setRecvID("U"+fsFollow.getUserId().toString());
+                        openImMsgDTO1.setContentType(101);
+                        openImMsgDTO1.setSenderPlatformID(5);
+                        openImMsgDTO1.setSessionType(1);
+                        OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
+                        content1.setContent("尊敬的用户,为了您的健康,请认真填写随访单,以便医生随时了解您的用药情况,评估治疗效果。如果在用药中出现任何不适,可直接在对话框中描述您目前的情况,我将及时为您解答!");
+                        openImMsgDTO1.setContent(content1);
+                        //openImMsgDTO.setEx(customDTO);
+                        OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+                        offlinePushInfo.setDesc(content1.getContent());
+                        String doctorNameByIds = fsDoctorMapper.selectDoctorNameByIds(fsFollow.getDoctorId().toString());
+                        offlinePushInfo.setTitle(doctorNameByIds);
+                        offlinePushInfo.setIOSBadgeCount(true);
+                        offlinePushInfo.setIOSPushSound("");
+                        openImMsgDTO1.setOfflinePushInfo(offlinePushInfo);
+                        openIMService.openIMSendMsg(openImMsgDTO1);
                     }
                 }catch (Exception e){
 

+ 52 - 10
fs-service/src/main/java/com/fs/his/service/impl/FsFollowServiceImpl.java

@@ -5,10 +5,13 @@ import java.util.*;
 
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.annotation.Log;
 import com.fs.common.utils.DateUtils;
 import com.fs.his.domain.FsFollowTemp;
 import com.fs.his.domain.FsPackageOrder;
+import com.fs.his.mapper.FsDoctorMapper;
 import com.fs.his.mapper.FsFollowTempMapper;
 import com.fs.his.mapper.FsPackageOrderMapper;
 import com.fs.his.param.FsFollowListDParam;
@@ -18,6 +21,7 @@ import com.fs.his.param.FsStoreOrderParam;
 import com.fs.his.vo.*;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import org.slf4j.Logger;
@@ -47,6 +51,10 @@ public class FsFollowServiceImpl implements IFsFollowService
     private IImService imService;
     @Autowired
     private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private OpenIMService openIMService;
+    @Autowired
+    private FsDoctorMapper fsDoctorMapper;
     Logger logger= LoggerFactory.getLogger(getClass());
     /**
      * 查询随访管理
@@ -133,7 +141,7 @@ public class FsFollowServiceImpl implements IFsFollowService
     }
 
     @Override
-    public void addFsFollowByPackageOrder(FsPackageOrder order) {
+    public void addFsFollowByPackageOrder(FsPackageOrder order) throws JsonProcessingException {
         SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.package");
         Map<String, Object> config = (Map<String, Object>) JSON.parse(sysConfig.getConfigValue());
         Integer followRate = (Integer)config.get("followRate");
@@ -160,17 +168,17 @@ public class FsFollowServiceImpl implements IFsFollowService
             fsFollow.setFormJson(fsFollowTemp.getFormJson());
             fsFollow.setCreateTime(DateUtils.getNowDate());
             int i = fsFollowMapper.insertFsFollow(fsFollow);
-            MsgDTO msgDTO=new MsgDTO();
+            //MsgDTO msgDTO=new MsgDTO();
             MsgCustomDTO customDTO=new MsgCustomDTO();
             customDTO.setType("follow");
             customDTO.setOrderType(2);
             customDTO.setFollowId(fsFollow.getFollowId().toString());
             customDTO.setOrderId(fsFollow.getPackageOrderId().toString());
             customDTO.setImType(2);
-            msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
+            //msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
 
-            msgDTO.setFrom_Account("D-"+fsFollow.getDoctorId());
-            msgDTO.setTo_Account("U-"+fsFollow.getUserId());
+            //msgDTO.setFrom_Account("D-"+fsFollow.getDoctorId());
+            //msgDTO.setTo_Account("U-"+fsFollow.getUserId());
             List<MsgDataDTO> msgs=new ArrayList<>();
             MsgDataDTO msg=new MsgDataDTO();
             String ext= JSONUtil.toJsonStr(fsFollow);
@@ -178,9 +186,24 @@ public class FsFollowServiceImpl implements IFsFollowService
             msg.setMsgContent(new MsgDataFormatDTO("follow",ext,followId));
             msg.setMsgType("TIMCustomElem");//TIMCustomElem
             msgs.add(msg);
-            msgDTO.setMsgBody(msgs);
-            MsgResponseDTO msgResponseDTO = imService.sendMsg(msgDTO);
-            logger.info("发送随访"+msgResponseDTO);
+            //msgDTO.setMsgBody(msgs);
+            //MsgResponseDTO msgResponseDTO = imService.sendMsg(msgDTO);
+            ObjectMapper objectMapper = new ObjectMapper();
+            String ex = objectMapper.writeValueAsString(customDTO);
+            OpenImResponseDTO follow = openIMService.sendUtil("D"+fsFollow.getDoctorId(), "U"+fsFollow.getUserId(), 110, "follow", "", "", followId, "",ex);
+            /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+            openImMsgDTO.setSendID("D"+fsFollow.getDoctorId().toString());
+            openImMsgDTO.setRecvID("U"+fsFollow.getUserId().toString());
+            openImMsgDTO.setContentType(110);
+            openImMsgDTO.setSenderPlatformID(5);
+            openImMsgDTO.setSessionType(1);
+            OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+            content.setContent(ext);
+            openImMsgDTO.setContent(content);
+            //openImMsgDTO.setEx(customDTO);
+            OpenImResponseDTO openImResponseDTO = openIMService.openIMSendMsg(openImMsgDTO);*/
+
+            logger.info("发送随访"+follow);
 
             MsgDTO msgDTO2=new MsgDTO();
             msgDTO2.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
@@ -195,8 +218,27 @@ public class FsFollowServiceImpl implements IFsFollowService
             msgs2.add(msg2);
             msgDTO2.setMsgBody(msgs2);
 
-            MsgResponseDTO msgResponseDTO2 = imService.sendMsg(msgDTO2);
-            logger.info("发送随访2"+msgResponseDTO2);
+            //MsgResponseDTO msgResponseDTO2 = imService.sendMsg(msgDTO2);
+            OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+            openImMsgDTO1.setSendID("D"+fsFollow.getDoctorId().toString());
+            openImMsgDTO1.setRecvID("U"+fsFollow.getUserId().toString());
+            openImMsgDTO1.setContentType(101);
+            openImMsgDTO1.setSenderPlatformID(5);
+            openImMsgDTO1.setSessionType(1);
+            OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
+            content1.setContent("尊敬的用户,为了您的健康,请认真填写随访单,以便医生随时了解您的用药情况,评估治疗效果。如果在用药中出现任何不适,可直接在对话框中描述您目前的情况,我将及时为您解答!");
+            openImMsgDTO1.setContent(content1);
+            //openImMsgDTO.setEx(customDTO);
+            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+            offlinePushInfo.setDesc(content1.getContent());
+            String doctorNameByIds = fsDoctorMapper.selectDoctorNameByIds(fsFollow.getDoctorId().toString());
+            offlinePushInfo.setTitle(doctorNameByIds);
+            offlinePushInfo.setIOSBadgeCount(true);
+            offlinePushInfo.setIOSPushSound("");
+            openImMsgDTO1.setOfflinePushInfo(offlinePushInfo);
+            OpenImResponseDTO openImResponseDTO1 = openIMService.openIMSendMsg(openImMsgDTO1);
+
+            logger.info("发送随访"+openImResponseDTO1);
             if (i>0){
                 FsPackageOrder fsPackageOrder = new FsPackageOrder();
                 fsPackageOrder.setOrderId(order.getOrderId());

+ 95 - 21
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java

@@ -7,6 +7,8 @@ import cn.hutool.json.JSONUtil;
 import cn.jiguang.common.resp.APIConnectionException;
 import cn.jiguang.common.resp.APIRequestException;
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
@@ -43,6 +45,7 @@ import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
 import com.fs.jpush.service.JpushService;
 import com.fs.repeat.vo.RepeatUploadVo;
 import com.fs.system.domain.SysConfig;
@@ -171,6 +174,8 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
     private IFsCouponService couponService;
     @Autowired
     private ConfigUtil configUtil;
+    @Autowired
+    private OpenIMService openIMService;
     /**
      * 查询问诊订单
      *
@@ -859,7 +864,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
     @Override
     @Transactional
     @Synchronized
-    public R acceptOrder(FsInquiryOrderAcceptParam param) {
+    public R acceptOrder(FsInquiryOrderAcceptParam param) throws JsonProcessingException {
         FsInquiryOrder order=fsInquiryOrderMapper.selectFsInquiryOrderByOrderId(param.getOrderId());
         if(!order.getStatus().equals(FsInquiryOrderStatusEnum.STATUS_2.getValue())){
             return R.error("非法操作");
@@ -902,32 +907,44 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
 
             }
         }
-        MsgDTO msgDTO=new MsgDTO();
+        //MsgDTO msgDTO=new MsgDTO();
         MsgCustomDTO customDTO=new MsgCustomDTO();
         customDTO.setType("startInquiry");
         customDTO.setOrderType(order.getOrderType());
         customDTO.setOrderId(order.getOrderId().toString());
         customDTO.setImType(1);
-        msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
+        /*msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO));
         msgDTO.setFrom_Account("D-"+param.getDoctorId());
-        msgDTO.setTo_Account("U-"+order.getUserId());
-        List<MsgDataDTO> msgs=new ArrayList<>();
+        msgDTO.setTo_Account("U-"+order.getUserId());*/
+        /*List<MsgDataDTO> msgs=new ArrayList<>();
         MsgDataDTO msg=new MsgDataDTO();
-        msg.setMsgType("TIMCustomElem");
+        msg.setMsgType("TIMCustomElem");*/
         FsDoctor doctor=doctorMapper.selectFsDoctorByDoctorId(param.getDoctorId());
         String doc="医生";
         if (doctor.getDeptId()!=null&&doctor.getDeptId().compareTo(39L)==0){
             doc="药师";
         }
-        InquiryOrderMsgDTO inquiryOrderMsgDTO=new InquiryOrderMsgDTO();
+        /*InquiryOrderMsgDTO inquiryOrderMsgDTO=new InquiryOrderMsgDTO();
         inquiryOrderMsgDTO.setTitle(doctor.getDoctorName()+doc+"为您服务");
         String ext= JSONUtil.toJsonStr(inquiryOrderMsgDTO);
         msg.setMsgContent(new MsgDataFormatDTO("startInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
-        msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
-
-
+        msgDTO.setMsgBody(msgs);*/
+        //imService.sendMsg(msgDTO);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String ex = objectMapper.writeValueAsString(customDTO);
+        openIMService.sendUtil("scrmD"+param.getDoctorId(),"scrmU"+order.getUserId(),110,"startInquiry","",doctor.getDoctorName()+doc+"为您服务","","","");
+        /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setSendID("D"+param.getDoctorId().toString());
+        openImMsgDTO.setRecvID("U"+order.getUserId().toString());
+        openImMsgDTO.setContentType(110);
+        openImMsgDTO.setSenderPlatformID(5);
+        openImMsgDTO.setSessionType(1);
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        content.setContent(ext);
+        openImMsgDTO.setContent(content);
+        openImMsgDTO.setEx(customDTO);
+        openIMService.openIMSendMsg(openImMsgDTO);*/
         if (doc.equals("药师")){
             MsgDTO msgDTO1=new MsgDTO();
             MsgCustomDTO customDTO1=new MsgCustomDTO();
@@ -945,7 +962,22 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
             msg1.setMsgContent(dto1);
             msgs1.add(msg1);
             msgDTO1.setMsgBody(msgs1);
-            imService.sendMsg(msgDTO1);
+            //imService.sendMsg(msgDTO1);
+
+            ObjectMapper objectMapper1 = new ObjectMapper();
+            String ex1 = objectMapper.writeValueAsString(customDTO1);
+            openIMService.sendUtil("scrmD"+param.getDoctorId(),"scrmU"+order.getUserId(),110,"startInquiry","","您好,我是芸医汇互联网医院执业药师,请问您有什么问题想咨询?","","",ex1);
+            /*OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+            openImMsgDTO1.setSendID("D"+param.getDoctorId().toString());
+            openImMsgDTO1.setRecvID("U"+order.getUserId().toString());
+            openImMsgDTO1.setContentType(101);
+            openImMsgDTO1.setSenderPlatformID(5);
+            openImMsgDTO1.setSessionType(1);
+            OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
+            content1.setContent(ext);
+            openImMsgDTO1.setContent(content1);
+            openImMsgDTO1.setEx(customDTO);
+            openIMService.openIMSendMsg(openImMsgDTO1);*/
         }
 
 
@@ -999,7 +1031,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
 
     @Override
     @Transactional
-    public R receiveOrder(FsInquiryOrderReceiveParam param) {
+    public R receiveOrder(FsInquiryOrderReceiveParam param) throws JsonProcessingException {
         FsInquiryOrder order=fsInquiryOrderMapper.selectFsInquiryOrderByOrderId(param.getOrderId());
         if(!order.getStatus().equals(FsInquiryOrderStatusEnum.STATUS_2.getValue())){
             return R.error("非法操作");
@@ -1062,7 +1094,21 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msg.setMsgContent(new MsgDataFormatDTO("startInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        //imService.sendMsg(msgDTO);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String ex = objectMapper.writeValueAsString(customDTO);
+        openIMService.sendUtil("scrmD"+order.getDoctorId(),"scrmU"+order.getUserId(),110,"startInquiry","",doctor.getDoctorName()+doc+"为您服务","","",ex);
+        /*OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setSendID("D"+order.getDoctorId().toString());
+        openImMsgDTO.setRecvID("U"+order.getUserId().toString());
+        openImMsgDTO.setContentType(110);
+        openImMsgDTO.setSenderPlatformID(5);
+        openImMsgDTO.setSessionType(1);
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        content.setContent(ext);
+        openImMsgDTO.setContent(content);
+        openImMsgDTO.setEx(customDTO);
+        openIMService.openIMSendMsg(openImMsgDTO);*/
         if (doc.equals("药师")){
             MsgDTO msgDTO1=new MsgDTO();
             MsgCustomDTO customDTO1=new MsgCustomDTO();
@@ -1080,7 +1126,22 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
             msg1.setMsgContent(dto1);
             msgs1.add(msg1);
             msgDTO1.setMsgBody(msgs1);
-            imService.sendMsg(msgDTO1);
+            //imService.sendMsg(msgDTO1);
+
+            ObjectMapper objectMapper1 = new ObjectMapper();
+            String ex1 = objectMapper.writeValueAsString(customDTO1);
+            openIMService.sendUtil("scrmD"+param.getDoctorId(),"scrmU"+order.getUserId(),110,"startInquiry","","您好,我是芸医汇互联网医院执业药师,请问您有什么问题想咨询?","","",ex1);
+           /* OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+            openImMsgDTO1.setSendID("D"+order.getDoctorId().toString());
+            openImMsgDTO1.setRecvID("U"+order.getUserId().toString());
+            openImMsgDTO1.setContentType(110);
+            openImMsgDTO1.setSenderPlatformID(5);
+            openImMsgDTO1.setSessionType(1);
+            OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
+            content1.setContent(ext);
+            openImMsgDTO1.setContent(content1);
+            openImMsgDTO1.setEx(customDTO);
+            openIMService.openIMSendMsg(openImMsgDTO1);*/
         }
         //发送给医生
 //        MsgDTO msgDTO1=new MsgDTO();
@@ -1177,7 +1238,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
 
     @Override
     @Transactional
-    public R finishOrder(FsInquiryOrderFinishParam param) {
+    public R finishOrder(FsInquiryOrderFinishParam param) throws JsonProcessingException {
         FsInquiryOrder order=fsInquiryOrderMapper.selectFsInquiryOrderByOrderId(param.getOrderId());
         if(!order.getStatus().equals(FsInquiryOrderStatusEnum.STATUS_3.getValue())){
             return R.error("非法操作");
@@ -1217,7 +1278,11 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msg.setMsgContent(new MsgDataFormatDTO("finishInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        //imService.sendMsg(msgDTO);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String ex = objectMapper.writeValueAsString(customDTO);
+        openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"finishInquiry","","医生完成订单","","",ex);
+
         //发送给医生
 //        MsgDTO msgDTO1=new MsgDTO();
 //        MsgCustomDTO customDTO1=new MsgCustomDTO();
@@ -1239,7 +1304,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
     }
     @Override
     @Transactional
-    public R autoFinishOrder(FsInquiryOrderFinishParam param) {
+    public R autoFinishOrder(FsInquiryOrderFinishParam param) throws JsonProcessingException {
         FsInquiryOrder order=fsInquiryOrderMapper.selectFsInquiryOrderByOrderId(param.getOrderId());
         if(!order.getStatus().equals(FsInquiryOrderStatusEnum.STATUS_3.getValue())){
             return R.error("非法操作");
@@ -1278,7 +1343,11 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msg.setMsgContent(new MsgDataFormatDTO("finishInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        //imService.sendMsg(msgDTO);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String ex = objectMapper.writeValueAsString(customDTO);
+        openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"finishInquiry","","医生完成订单","","",ex);
+
         redisTemplate.delete("DrugReport:doctorId:" + order.getDoctorId() + ":userId:" + order.getUserId());
         return R.ok();
     }
@@ -1560,7 +1629,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
     }
 
     @Override
-    public String sendStartMsg(Long orderId) {
+    public String sendStartMsg(Long orderId) throws JsonProcessingException {
 
         FsInquiryOrder order = fsInquiryOrderMapper.selectFsInquiryOrderByOrderId(orderId);
         MsgDTO msgDTO=new MsgDTO();
@@ -1582,7 +1651,12 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         msg.setMsgContent(new MsgDataFormatDTO("startInquiry",ext,order.getOrderId().toString()));
         msgs.add(msg);
         msgDTO.setMsgBody(msgs);
-        imService.sendMsg(msgDTO);
+        //imService.sendMsg(msgDTO);
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        String ex = objectMapper.writeValueAsString(customDTO);
+        openIMService.sendUtil("D"+order.getDoctorId(),"U"+order.getUserId(),110,"startInquiry","1","为您服务","","",ex);
+
         return "OK";
     }
 

+ 29 - 0
fs-service/src/main/java/com/fs/im/config/IMConfig.java

@@ -0,0 +1,29 @@
+package com.fs.im.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+//@ConfigurationProperties(prefix = "openIM")
+public class IMConfig {
+    @Value("${openIM.secret}")
+    private String secret;
+    @Value("${openIM.userID}")
+    private String userID;
+
+    public String getSecret() {
+        return secret;
+    }
+
+    public void setSecret(String secret) {
+        this.secret = secret;
+    }
+
+    public String getUserID() {
+        return userID;
+    }
+
+    public void setUserID(String userID) {
+        this.userID = userID;
+    }
+}

+ 15 - 0
fs-service/src/main/java/com/fs/im/dto/OpenImConversationDTO.java

@@ -0,0 +1,15 @@
+package com.fs.im.dto;
+
+import lombok.Data;
+
+@Data
+public class OpenImConversationDTO {
+             private String conversationID;
+             private Integer conversationType;
+             private String userID;
+             private String groupID;
+             private String recvMsgOpt;
+             private String attachedInfo;
+             private String ex;
+
+}

+ 11 - 0
fs-service/src/main/java/com/fs/im/dto/OpenImEditConversationDTO.java

@@ -0,0 +1,11 @@
+package com.fs.im.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OpenImEditConversationDTO {
+    private OpenImConversationDTO conversation;
+    private List<String> userIDs;
+}

+ 12 - 0
fs-service/src/main/java/com/fs/im/dto/OpenImMsgCallBackResponse.java

@@ -0,0 +1,12 @@
+package com.fs.im.dto;
+
+import lombok.Data;
+
+@Data
+public class OpenImMsgCallBackResponse {
+    private Integer actionCode = 0;
+    private Integer errCode = 0;
+    private String errMsg = "";
+    private String errDlt = "";
+    private Integer nextCode = 0;
+}

+ 45 - 0
fs-service/src/main/java/com/fs/im/dto/OpenImMsgDTO.java

@@ -0,0 +1,45 @@
+package com.fs.im.dto;
+
+import com.fs.his.dto.PayloadDTO;
+import lombok.Data;
+
+@Data
+public class OpenImMsgDTO {
+
+    private String sendID;
+    private String recvID;
+    private String groupID;
+    private String senderNickname;
+    private String senderFaceURL;
+    private int senderPlatformID;
+    private Object content;
+    private int contentType;
+    private int sessionType;
+    private boolean isOnlineOnly;
+    private boolean notOfflinePush;
+    private long sendTime;
+    private OfflinePushInfo offlinePushInfo;
+    private String ex;
+
+
+    @Data
+    public static class Content {
+        private String content;
+        private String data;
+        private String description;
+        private String extension;
+    }
+    @Data
+    public static class ImData{
+        private PayloadDTO payload;
+    }
+    @Data
+    public static class OfflinePushInfo {
+        private String title;
+        private String desc;
+        private String ex;
+        private String iOSPushSound;
+        private boolean iOSBadgeCount;
+
+    }
+}

+ 13 - 0
fs-service/src/main/java/com/fs/im/dto/OpenImResponseDTO.java

@@ -0,0 +1,13 @@
+package com.fs.im.dto;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class OpenImResponseDTO {
+    private Integer errCode;
+    private String errMsg;
+    private String errDlt;
+    private Map<String, Object> data;
+}

+ 11 - 0
fs-service/src/main/java/com/fs/im/dto/OpenImResponseDataDTO.java

@@ -0,0 +1,11 @@
+package com.fs.im.dto;
+
+import lombok.Data;
+
+@Data
+public class OpenImResponseDataDTO {
+    private String serverMsgID;
+    private String clientMsgID;
+    private Long sendTime;
+    private String modify;
+}

+ 36 - 0
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -0,0 +1,36 @@
+package com.fs.im.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fs.common.core.domain.R;
+import com.fs.company.domain.CompanyUser;
+import com.fs.im.dto.OpenImEditConversationDTO;
+import com.fs.im.dto.OpenImMsgDTO;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.vo.OpenImMsgCallBackVO;
+
+import java.util.List;
+
+public interface OpenIMService {
+    String getAdminToken();
+
+    OpenImResponseDTO openIMSendMsg(OpenImMsgDTO openImMsgDTO);
+
+    OpenImResponseDTO AiAutoReply(OpenImMsgCallBackVO messageInfo) throws JsonProcessingException;
+
+    OpenImResponseDTO sendUtil(String sendID, String recvID,Integer contentType,String payloadData,String diagnose,String title,String followId,String orderId,String ex) throws JsonProcessingException;
+
+    OpenImResponseDTO sendUtilUserToDoctor(String sendID, String recvID,Integer contentType,String payloadData,String diagnose,String title,String followId,String orderId,String ex) throws JsonProcessingException;
+
+    OpenImResponseDTO editConversation(OpenImEditConversationDTO openImEditConversationDTO) throws JsonProcessingException, InterruptedException;
+
+    OpenImResponseDTO importFriend(String ownerUserID,List<String> friendUserIDs);
+
+    OpenImResponseDTO isFriend(String userID1, String userID2);
+    R accountCheck(String userId, String type);
+    void checkAndImportFriend(Long companyUserId,String fsUserId);
+    OpenImResponseDTO sendCourse(Long userId,Long companyUserId,String url,String title,String linkImageUrl,String cropId) throws JsonProcessingException;
+    void checkAndImportFriendByDianBo(Long companyUserId,String fsUserId,String cropId);
+    OpenImResponseDTO updateUserInfo(CompanyUser companyUser);
+
+    OpenImResponseDTO sendPackageUtil(String sendID, String recvID, Integer contentType, String payloadData,String packageName,String packageId);
+}

+ 1047 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -0,0 +1,1047 @@
+package com.fs.im.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.fastGpt.service.AiHookService;
+import com.fs.his.domain.FsDoctor;
+import com.fs.his.domain.FsFollow;
+import com.fs.his.domain.FsUser;
+import com.fs.his.dto.PayloadDTO;
+import com.fs.his.mapper.FsDoctorMapper;
+import com.fs.his.mapper.FsFollowMapper;
+import com.fs.his.mapper.FsUserMapper;
+import com.fs.im.config.IMConfig;
+import com.fs.im.dto.OpenImConversationDTO;
+import com.fs.im.dto.OpenImEditConversationDTO;
+import com.fs.im.dto.OpenImMsgDTO;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
+import com.fs.im.vo.OpenImMsgCallBackVO;
+import com.fs.im.vo.OpenImResponseDTOTest;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import com.github.pagehelper.util.StringUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class OpenIMServiceImpl implements OpenIMService {
+    @Autowired
+    IMConfig imConfig;
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private FsUserMapper fsUserMapper;
+    @Autowired
+    private FsDoctorMapper fsDoctorMapper;
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private FsFollowMapper fsFollowMapper;
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
+    @Autowired
+    @Lazy
+    private AiHookService aiHookService;
+    /*@Autowired
+    private IFsUserService fsUserService;*/
+    @Override
+    public String getAdminToken() {
+        Object cachedTokenObj = redisCache.getCacheObject("openImAdminToken:" + imConfig.getUserID());
+        if (cachedTokenObj != null) {
+            return cachedTokenObj.toString();
+        }
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("secret", imConfig.getSecret());  // 预设的管理员密钥
+        requestBody.put("userID", imConfig.getUserID());   // 管理员 userID
+        String adminToken = null;
+        // 发起 HTTP POST 请求,获取管理员 token
+        try {
+            String response = HttpRequest.post("https://web.im.cdwjyyh.com/api/auth/get_admin_token")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .body(requestBody.toString())
+                    .execute()
+                    .body();
+
+            JSONObject jsonResponse = new JSONObject(response);
+            if (jsonResponse.getInt("errCode") == 0) {
+                JSONObject data = jsonResponse.getJSONObject("data");
+                adminToken = data.getString("token");
+                redisCache.setCacheObject("openImAdminToken:" + imConfig.getUserID(), adminToken,
+                        data.getInt("expireTimeSeconds"), TimeUnit.SECONDS);
+                return adminToken;
+            }
+        } catch (Exception e) {
+            // 可以记录日志
+            log.error("获取管理员 token 失败", e);
+        }
+        return null;
+    }
+
+
+    @Override
+    public OpenImResponseDTO AiAutoReply(OpenImMsgCallBackVO openImMsgDTO) throws JsonProcessingException {
+//        try {
+//            // 检查是否包含转人工
+//            if (checkImMsgContent(openImMsgDTO)) {
+//                return null;
+//            }
+//            String sendID = openImMsgDTO.getSendID();
+//            // 如果发送人不是用户 直接返回 不做自动回复
+//            if (!sendID.startsWith("U")) {
+//                return null;
+//            }
+//            String recvType = "2"; // 接收信息人类型 2销售,3医生 默认销售
+//            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+//            // 初始化ObjectMapper对象,用于JSON序列化和反序列化
+//            ObjectMapper objectMapper = new ObjectMapper();
+//            // 初始化消息DTO对象
+//            OpenImMsgDTO replyMsg = new OpenImMsgDTO();
+//            String recvID = openImMsgDTO.getRecvID();
+//            CompanyUser company = null;
+//            if (recvID.startsWith("D")) {
+//                // 因为主要是销售想接入ai ,所以医生不回复,只回复销售 下面暂时保留
+//                return null;
+////                FsDoctor fsDoctor = fsDoctorMapper.selectFsDoctorByDoctorId(Long.parseLong(recvID.replace("D", "")));
+////                if (null != fsDoctor && StringUtils.isNotEmpty(fsDoctor.getAvatar())) {
+////                    offlinePushInfo.setTitle(fsDoctor.getDoctorName());
+////                    replyMsg.setSenderFaceURL(fsDoctor.getAvatar());
+////                }
+//            } else if (recvID.startsWith("C")) {
+//                company = companyUserMapper.selectCompanyUserByUserId(Long.parseLong(recvID.replace("C", "")));
+//                if (null != company && StringUtils.isNotEmpty(company.getAvatar())) {
+//                    offlinePushInfo.setTitle(company.getNickName());
+//                    replyMsg.setSenderFaceURL(company.getAvatar());
+//                }
+//                recvType = "2";
+//            }
+//            // 对接收者ID进行账户校验
+//            accountCheck(recvID, recvType);
+//            if (company == null) {
+//                return null;
+//            }
+//            // ai接口智能回复
+//            R r = aiHookService.AiReply(openImMsgDTO, company);
+//            if (r.get("code").equals(500)) {
+//                return null;
+//            }
+//            String aiReplyContent = r.get("content").toString();
+//
+//            // 设置消息的发送者ID、接收者ID、内容类型等基础信息
+//            // 将发送者和接收者交换一下
+//            replyMsg.setSendID(recvID);
+//            replyMsg.setRecvID(sendID);
+//            replyMsg.setContentType(101);
+//            replyMsg.setSenderPlatformID(5);
+//            replyMsg.setSessionType(1);
+//
+//            // 初始化消息内容对象
+//            OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+//            // 初始化负载数据对象,并设置数据内容
+//            PayloadDTO payload = new PayloadDTO();
+//            payload.setData(aiReplyContent);
+//
+//            PayloadDTO.Extension extension = new PayloadDTO.Extension();
+//            extension.setTitle("快速回复"); // 可选标题
+//            payload.setExtension(extension);
+//            OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+//            imData.setPayload(payload);
+//            String imJson = objectMapper.writeValueAsString(imData);
+//            content.setData(imJson);
+//            content.setContent(aiReplyContent);
+//            replyMsg.setContent(content);
+//            offlinePushInfo.setDesc("快速回复");
+//            offlinePushInfo.setIOSBadgeCount(true);
+//            offlinePushInfo.setIOSPushSound("");
+//            replyMsg.setOfflinePushInfo(offlinePushInfo);
+//            // 发送消息
+//            OpenImResponseDTO response = openIMSendMsg(replyMsg);
+//            if (response.getErrCode() == 0) {
+//                Thread.sleep(1000);
+//                OpenImEditConversationDTO openImEditConversationDTO = new OpenImEditConversationDTO();
+//                ArrayList<String> userIDs = new ArrayList<>();
+//                userIDs.add(recvID);
+//                openImEditConversationDTO.setUserIDs(userIDs);
+//                OpenImConversationDTO openImConversationDTO = new OpenImConversationDTO();
+//                openImConversationDTO.setConversationID("si_" + recvID + "_" + sendID);
+//                openImConversationDTO.setConversationType(1);
+//                openImConversationDTO.setUserID(sendID);
+//                openImEditConversationDTO.setConversation(openImConversationDTO);
+//                OpenImResponseDTO openImResponseDTO1 = editConversation(openImEditConversationDTO);
+//                log.info("修改回话返回参数:{}", openImResponseDTO1);
+//            }
+//            return null;
+//        } catch (Exception e) {
+//            log.error("openImMsgCallBack,自动销售回复消息,发送消息失败:", e);
+//            e.printStackTrace();
+//            return null;
+//        }
+        return null;
+
+    }
+
+    private Boolean checkImMsgContent(OpenImMsgCallBackVO openImMsgDTO) {
+        String content = openImMsgDTO.getContent();
+        if (content == null || content.isEmpty() || content.trim().isEmpty()) {
+            return true;
+        }
+        String conversationId = "si_" + openImMsgDTO.getRecvID() + "_" + openImMsgDTO.getSendID();
+        // 三种情况 ①正常聊天  ② 转人工 ③人工之后的聊天
+        // 检测内容是否包含
+        try {
+            //① 存在转人工配置 返回true 跳过自动回复
+            String ex = getIMList(openImMsgDTO.getSendID(),conversationId);
+            if (ex != null && ex.contains("IsArtificial")) {
+                return true;
+            }
+            //② 检查当前语句 是否包含转人工
+            if (content.contains("转人工")) {
+                OpenImEditConversationDTO currentConversation = new OpenImEditConversationDTO();
+                ArrayList<String> userIDs = new ArrayList<>();
+                userIDs.add(openImMsgDTO.getSendID());
+                currentConversation.setUserIDs(userIDs);
+                OpenImConversationDTO openImConversationDTO = new OpenImConversationDTO();
+                openImConversationDTO.setConversationID(conversationId);
+                openImConversationDTO.setConversationType(1);
+                openImConversationDTO.setUserID(openImMsgDTO.getRecvID());
+                // 不存在配置 直接放
+                if (ex == null || StringUtils.isEmpty(ex.trim())) {
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("IsArtificial", 1);
+                    openImConversationDTO.setEx(jsonObject.toString());
+                } else {
+                    // 存在配置 添加之后再放
+                    JSONObject exJson = new JSONObject(ex);
+                    exJson.put("IsArtificial", 1);
+                    openImConversationDTO.setEx(exJson.toString());
+                }
+                currentConversation.setConversation(openImConversationDTO);
+                OpenImResponseDTO openImResponseDTO1 = editConversation(currentConversation);
+                log.info("修改回话返回参数:{}", openImResponseDTO1);
+                return true;
+            }
+            //③正常i情况 直接返回
+            return false;
+        } catch (Exception e) {
+            log.error("openImMsgCallBack,检测内容是否包含转人工失败:", e);
+            return true;
+        }
+    }
+
+    private  String getIMList( String recvID,String  conversationId)  {
+        int pageNumber = 1;
+        int pageSize = 20;
+        int maxPages = 10; // 最大搜索页数,防止无限循环
+        String adminToken = getAdminToken();
+        try {
+            while (pageNumber <= maxPages) {
+                JSONObject requestBody = new JSONObject();
+                requestBody.put("userID", recvID);
+                JSONObject pagination = new JSONObject();
+                pagination.put("pageNumber", pageNumber);
+                pagination.put("showNumber", pageSize);
+                requestBody.put("pagination", pagination);
+                String body = HttpRequest.post("https://web.im.cdwjyyh.com/api/conversation/get_owner_conversation")
+                        .header("operationID", String.valueOf(System.currentTimeMillis()))
+                        .header("token", adminToken)
+                        .body(requestBody.toString())
+                        .execute()
+                        .body();
+                JSONObject jsonResponse = new JSONObject(body);
+                if (jsonResponse.getInt("errCode") == 0) {
+                    JSONObject data = jsonResponse.getJSONObject("data");
+                    int total = data.getInt("total");
+                    if (total > 0) {
+                        JSONArray conversations = data.getJSONArray("conversations");
+                        // 遍历当前页的所有会话
+                        for (int i = 0; i < conversations.length(); i++) {
+                            JSONObject conversation = conversations.getJSONObject(i);
+                            String convId = conversation.getString("conversationID");
+                            // 如果找到目标会话,返回其ex字段
+                            if (conversationId.equals(convId)) {
+                                return conversation.getString("ex");
+                            }
+                        }
+                        // 如果当前页没有找到且已经是最后一页,则退出循环
+                        if (conversations.length() < pageSize) {
+                            break;
+                        }
+                    } else {
+                        // 如果没有数据,直接退出循环
+                        break;
+                    }
+                }
+                // 移动到下一页
+                pageNumber++;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    //批量修改销售名称,由昵称-公司名,改为昵称
+    public static void main(String[] args) {
+        String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJpbUFkbWluIiwiUGxhdGZvcm1JRCI6MTAsImV4cCI6MTc1OTkxMDgwNywiaWF0IjoxNzUyMTM0ODAyfQ.y0akpb-TnOBqJewPUD13tnUeR1iF41A3CcgaXXsjyKE";
+        long time = System.currentTimeMillis();
+        int pageSize = 5000;
+        int pageNumber = 1;
+
+        while (true) {
+            // 构建分页查询请求体
+            JSONObject requestPage = new JSONObject();
+            JSONObject pagination = new JSONObject();
+            pagination.put("pageNumber", pageNumber);
+            pagination.put("showNumber", pageSize);
+            requestPage.put("pagination", pagination);
+
+            String result = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/get_all_users_uid")
+                    .header("operationID", String.valueOf(time))
+                    .header("token", token)
+                    .body(requestPage.toString())
+                    .execute()
+                    .body();
+
+            OpenImResponseDTO responseDTO = JSONUtil.toBean(result, OpenImResponseDTO.class);
+            List<String> userIDs = (List<String>) responseDTO.getData().get("userIDs");
+
+            if (CollectionUtil.isEmpty(userIDs)) {
+                System.out.println("数据为空,处理结束");
+                break;
+            }
+
+            // 过滤出以C开头的用户ID
+            List<String> userIds = userIDs.stream()
+                    .filter(uid -> uid.startsWith("scrmC"))
+                    .collect(Collectors.toList());
+
+            if (CollectionUtil.isNotEmpty(userIds)) {
+                Map<String, Object> paramMap = new HashMap<>();
+                paramMap.put("userIDs", userIds);
+
+                String jsonBody = JSONUtil.toJsonStr(paramMap);
+                String result1 = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/get_users_info")
+                        .header("operationID", String.valueOf(time))
+                        .header("token", token)
+                        .body(jsonBody)
+                        .execute()
+                        .body();
+
+                OpenImResponseDTOTest responseDTO1 = JSONUtil.toBean(result1, OpenImResponseDTOTest.class);
+                List<UserInfo> users = responseDTO1.getData().getUsersInfo();
+
+                for (UserInfo user : users) {
+                    if (StringUtil.isNotEmpty(user.getNickname()) && user.getNickname().contains("-")) {
+                        UpdateUserInfo updateUserInfo = new UpdateUserInfo();
+                        updateUserInfo.setUserID(user.getUserID());
+                        updateUserInfo.setNickname(user.getNickname().split("-")[0]);
+                        updateUserInfo.setFaceURL(Optional.ofNullable(user.getFaceURL()).orElse(""));
+                        updateUserInfo.setEx(Optional.ofNullable(user.getEx()).orElse(""));
+
+                        Map<String, Object> bodyMap = new HashMap<>();
+                        bodyMap.put("userInfo", updateUserInfo);
+
+                        String jsonBody1 = JSONUtil.toJsonStr(bodyMap);
+                        String result2 = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/update_user_info_ex")
+                                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                                .header("token", token)
+                                .body(jsonBody1)
+                                .execute()
+                                .body();
+
+                        OpenImResponseDTO responseDTO2 = JSONUtil.toBean(result2, OpenImResponseDTO.class);
+                        if (responseDTO2.getErrCode() != 0) {
+                            System.out.println("更新失败 userID=" + user.getUserID() + ",错误信息:" + responseDTO2.getErrMsg());
+                        }
+                    }
+                }
+            }
+
+            System.out.println("已处理第 " + pageNumber + " 页,共处理用户数:" + userIDs.size());
+            if (userIDs.size() < pageSize) {
+                System.out.println("已是最后一页,处理完毕!");
+                break;
+            }
+            pageNumber++; // 下一页
+        }
+    }
+
+    /**
+     * 修改im用户信息
+     * @param companyUser
+     * @return
+     */
+    @Override
+    public OpenImResponseDTO updateUserInfo(CompanyUser companyUser){
+        String adminToken = getAdminToken();
+        long time = System.currentTimeMillis();
+        OpenImResponseDTO responseDTO = null;
+        Map<String, Object> paramMap = new HashMap<>();
+        ArrayList<String> userIDs = new ArrayList<>();
+        userIDs.add("scrmC"+companyUser.getUserId());
+        paramMap.put("userIDs", userIDs);
+
+        String jsonBody = JSONUtil.toJsonStr(paramMap);
+        String result1 = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/get_users_info")
+                .header("operationID", String.valueOf(time))
+                .header("token", adminToken)
+                .body(jsonBody)
+                .execute()
+                .body();
+        UpdateUserInfo updateUserInfo = new UpdateUserInfo();
+        OpenImResponseDTOTest responseDTO1 = JSONUtil.toBean(result1, OpenImResponseDTOTest.class);
+        List<UserInfo> users = responseDTO1.getData().getUsersInfo();
+        if (users.size()<=0){
+            return null;
+        }
+        for (UserInfo user : users) {
+            updateUserInfo.setUserID(user.getUserID());
+            updateUserInfo.setNickname(companyUser.getNickName());
+            updateUserInfo.setFaceURL(Optional.ofNullable(user.getFaceURL()).orElse(""));
+            updateUserInfo.setEx(Optional.ofNullable(user.getEx()).orElse(""));
+
+            Map<String, Object> bodyMap = new HashMap<>();
+            bodyMap.put("userInfo", updateUserInfo);
+            String jsonBody1 = JSONUtil.toJsonStr(bodyMap);
+            String result2 = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/update_user_info_ex")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonBody1)
+                    .execute()
+                    .body();
+            responseDTO= JSONUtil.toBean(result2,OpenImResponseDTO.class);
+        }
+
+        return responseDTO;
+    }
+    @Data
+    public static class UpdateUserInfo {
+        private String userID;
+        private String nickname;
+        private String faceURL = "";
+        private String ex = "";
+    }
+
+    @Data
+    public class UserInfo {
+        private String userID;
+        private String nickname;
+        private String faceURL;
+        private String ex;
+        private Long createTime;
+        private Integer appMangerLevel;
+        private Integer globalRecvMsgOpt;
+    }
+
+
+    @Override
+    public OpenImResponseDTO openIMSendMsg(OpenImMsgDTO openImMsgDTO) {
+        log.info("进入发消息的方法");
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject(openImMsgDTO);
+        log.info("发送消息的请求体:\n{}", jsonObject.toString());
+        long time = new Date().getTime();
+        String result = HttpRequest.post("https://web.im.cdwjyyh.com/api/msg/send_msg")
+                .header("operationID", time + "")
+                .header("token",adminToken)
+                .body(jsonObject.toString())
+                .execute()
+                .body();
+        OpenImResponseDTO responseDTO= JSONUtil.toBean(result,OpenImResponseDTO.class);
+        log.info("发送消息返回内容:\n{}", responseDTO);
+        return responseDTO;
+    }
+    @Override
+    public OpenImResponseDTO sendCourse(Long userId,Long companyUserId,String url,String title,String linkImageUrl,String cropId) throws JsonProcessingException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        //userId = 61l;
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略null字段
+        checkAndImportFriendByDianBo(companyUserId,userId.toString(),cropId);
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+        PayloadDTO payload = new PayloadDTO();
+        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+        payload.setData("course");
+        extension.setTitle(title);
+        extension.setAppRealLink(url);
+        extension.setSendTime(new Date());
+        extension.setCourseUrl(linkImageUrl);
+        payload.setExtension(extension);
+        imData.setPayload(payload);
+        String imJson = objectMapper.writeValueAsString(imData);
+        content.setData(imJson);
+
+        OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+        offlinePushInfo.setDesc(title);
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(companyUserId);
+        offlinePushInfo.setTitle(companyUser.getNickName());
+        offlinePushInfo.setIOSBadgeCount(true);
+        offlinePushInfo.setIOSPushSound("");
+
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+        openImMsgDTO.setContent(content);
+
+
+
+        openImMsgDTO.setSendID("scrmC"+companyUserId);
+        openImMsgDTO.setRecvID("scrmU"+userId);
+        openImMsgDTO.setContentType(110);
+        openImMsgDTO.setSessionType(1);
+        // 输出格式化JSON日志
+        log.info("课程消息:\n{}", objectMapper.writeValueAsString(openImMsgDTO));
+        OpenImResponseDTO openImResponseDTO = openIMSendMsg(openImMsgDTO);
+        openImMsgDTO = null;
+        content = null;
+        return openImResponseDTO;
+    }
+    @Override
+    public OpenImResponseDTO sendPackageUtil(String sendID, String recvID, Integer contentType, String payloadData,String packageName,String packageId){
+        try {
+            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+            ObjectMapper objectMapper = new ObjectMapper();
+            OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+            if (sendID.startsWith("scrmC")){
+                CompanyUser company = companyUserMapper.selectCompanyUserByUserId(Long.parseLong(sendID.replace("scrmC", "")));
+                if (null!=company){
+                    offlinePushInfo.setTitle(company.getNickName());
+                    openImMsgDTO.setSenderFaceURL(company.getAvatar());
+                }
+            }
+            accountCheck(recvID.toString(),"1");
+            openImMsgDTO.setSendID(sendID);
+            openImMsgDTO.setRecvID(recvID);
+            openImMsgDTO.setContentType(contentType);
+            openImMsgDTO.setSenderPlatformID(5);
+            openImMsgDTO.setSessionType(1);
+
+            OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+            //content.setContent(ext);
+            PayloadDTO payload = new PayloadDTO();
+            payload.setData(payloadData);
+            PayloadDTO.Extension extension = new PayloadDTO.Extension();
+            //extension.setDiagnose(diagnose);
+            if (StringUtils.isNotEmpty(packageName)){
+                extension.setTitle(packageName);
+            }
+            if (StringUtils.isNotEmpty(packageId)){
+                extension.setPackageId(packageId);
+            }
+            payload.setExtension(extension);
+            OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+            imData.setPayload(payload);
+
+            String imJson = objectMapper.writeValueAsString(imData);
+            content.setData(imJson);
+            openImMsgDTO.setContent(content);
+            if (contentType == 101){
+                content.setContent(packageName);
+            }
+            //cn.hutool.json.JSONObject jsonObject = new cn.hutool.json.JSONObject(openImMsgDTO);
+
+            //openImMsgDTO.setEx(payload);
+
+            offlinePushInfo.setDesc(packageName);
+
+            offlinePushInfo.setIOSBadgeCount(true);
+            offlinePushInfo.setIOSPushSound("");
+            openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+            OpenImResponseDTO openImResponseDTO = openIMSendMsg(openImMsgDTO);
+            return openImResponseDTO;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+    @Override
+    public OpenImResponseDTO sendUtil(String sendID, String recvID, Integer contentType, String payloadData, String diagnose,String title,String followId,String orderId,String ex) throws JsonProcessingException {
+        try {
+            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+            ObjectMapper objectMapper = new ObjectMapper();
+            OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+            if (sendID.startsWith("scrmD")){
+                FsDoctor fsDoctor = fsDoctorMapper.selectFsDoctorByDoctorId(Long.parseLong(sendID.replace("scrmD","")));
+                //FsUser fsUser = fsUserService.selectFsUserByUserId(sendID);
+                if (null!=fsDoctor&&StringUtils.isNotEmpty(fsDoctor.getAvatar())){
+                    offlinePushInfo.setTitle(fsDoctor.getDoctorName());
+                    openImMsgDTO.setSenderFaceURL(fsDoctor.getAvatar());
+                }
+            }else if (sendID.startsWith("scrmC")){
+                CompanyUser company = companyUserMapper.selectCompanyUserByUserId(Long.parseLong(sendID.replace("scrmC", "")));
+                if (null!=company&&StringUtils.isNotEmpty(company.getAvatar())){
+                    offlinePushInfo.setTitle(company.getNickName());
+                    openImMsgDTO.setSenderFaceURL(company.getAvatar());
+                }
+            }
+            accountCheck(recvID.toString(),"1");
+            openImMsgDTO.setSendID(sendID);
+            openImMsgDTO.setRecvID(recvID);
+            openImMsgDTO.setContentType(contentType);
+            openImMsgDTO.setSenderPlatformID(5);
+            openImMsgDTO.setSessionType(1);
+            if (StringUtils.isNotEmpty(ex)){
+                openImMsgDTO.setEx(ex);
+            }
+            OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+            //content.setContent(ext);
+            PayloadDTO payload = new PayloadDTO();
+            payload.setData(payloadData);
+            PayloadDTO.Extension extension = new PayloadDTO.Extension();
+            //extension.setDiagnose(diagnose);
+            if (StringUtils.isNotEmpty(title)){
+                extension.setTitle(title);
+            }
+            if (StringUtils.isNotEmpty(diagnose)){
+                extension.setDiagnose(diagnose);
+            }
+            if (StringUtils.isNotEmpty(followId)){
+                //随访医生与患者加好友
+                ArrayList<String> userIds = new ArrayList<>();
+                userIds.add(recvID);
+                importFriend(sendID,userIds);
+                extension.setFollowId(followId);
+            }
+            if (StringUtils.isNotEmpty(orderId)){
+                payload.setDescription(orderId);
+            }
+
+            payload.setExtension(extension);
+            OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+            imData.setPayload(payload);
+
+            String imJson = objectMapper.writeValueAsString(imData);
+            content.setData(imJson);
+            openImMsgDTO.setContent(content);
+            if (contentType == 101){
+                content.setContent(title);
+            }
+            //cn.hutool.json.JSONObject jsonObject = new cn.hutool.json.JSONObject(openImMsgDTO);
+
+            //openImMsgDTO.setEx(payload);
+
+            offlinePushInfo.setDesc(title);
+
+            offlinePushInfo.setIOSBadgeCount(true);
+            offlinePushInfo.setIOSPushSound("");
+            openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+            OpenImResponseDTO openImResponseDTO = openIMSendMsg(openImMsgDTO);
+            if (openImResponseDTO.getErrCode()==0){
+                Thread.sleep(1000 );
+                OpenImEditConversationDTO openImEditConversationDTO = new OpenImEditConversationDTO();
+                ArrayList<String> userIDs = new ArrayList<>();
+                userIDs.add(sendID);
+                openImEditConversationDTO.setUserIDs(userIDs);
+                OpenImConversationDTO openImConversationDTO = new OpenImConversationDTO();
+                openImConversationDTO.setConversationID("si_"+sendID+"_"+recvID);
+                openImConversationDTO.setConversationType(1);
+                openImConversationDTO.setUserID(recvID);
+                openImConversationDTO.setEx(ex);
+                log.info("更新到会话的ex的值:{}",ex);
+                openImEditConversationDTO.setConversation(openImConversationDTO);
+
+                OpenImResponseDTO openImResponseDTO1 = editConversation(openImEditConversationDTO);
+                log.info("修改回话返回参数:{}",openImResponseDTO1);
+
+            }
+            return openImResponseDTO;
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+    public OpenImResponseDTO sendUtilUserToDoctor(String sendID, String recvID, Integer contentType, String payloadData, String diagnose,String title,String followId,String orderId,String ex) throws JsonProcessingException {
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+            if (sendID.startsWith("scrmU")){
+                //FsDoctor fsDoctor = fsDoctorMapper.selectFsDoctorByDoctorId(Long.parseLong(sendID.replace("D","")));
+                FsUser fsUser = fsUserMapper.selectFsUserByUserId(Long.parseLong(sendID.replace("scrmU","")));
+                if (null!=fsUser&&StringUtils.isNotEmpty(fsUser.getAvatar())){
+                    openImMsgDTO.setSenderFaceURL(fsUser.getAvatar());
+                }
+            }
+            accountCheck(sendID.toString(),"1");
+            openImMsgDTO.setSendID(sendID);
+            openImMsgDTO.setRecvID(recvID);
+            openImMsgDTO.setContentType(contentType);
+            openImMsgDTO.setSenderPlatformID(5);
+            openImMsgDTO.setSessionType(1);
+            if (StringUtils.isNotEmpty(ex)){
+                openImMsgDTO.setEx(ex);
+            }
+            OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+            //content.setContent(ext);
+            PayloadDTO payload = new PayloadDTO();
+            payload.setData(payloadData);
+            PayloadDTO.Extension extension = new PayloadDTO.Extension();
+            extension.setDiagnose(diagnose);
+            if (StringUtils.isNotEmpty(title)){
+                extension.setTitle(title);
+            }
+            if (StringUtils.isNotEmpty(diagnose)){
+                extension.setDiagnose(diagnose);
+            }
+            if (StringUtils.isNotEmpty(followId)){
+                FsFollow follow=fsFollowMapper.selectFsFollowByFollowId(Long.parseLong(followId));
+
+                //随访医生与患者加好友
+                ArrayList<String> userIds = new ArrayList<>();
+                userIds.add(recvID);
+                importFriend(sendID,userIds);
+                extension.setFollowId(followId);
+                extension.setWriteStatus(follow.getWriteStatus().toString());
+            }
+            if (StringUtils.isNotEmpty(orderId)){
+                payload.setDescription(orderId);
+            }
+            payload.setExtension(extension);
+            OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+            imData.setPayload(payload);
+
+            String imJson = objectMapper.writeValueAsString(imData);
+            content.setData(imJson);
+            openImMsgDTO.setContent(content);
+
+            //cn.hutool.json.JSONObject jsonObject = new cn.hutool.json.JSONObject(openImMsgDTO);
+
+            //openImMsgDTO.setEx(payload);
+            OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+            offlinePushInfo.setDesc(title);
+            offlinePushInfo.setTitle("芳华未来");
+            offlinePushInfo.setIOSBadgeCount(true);
+            offlinePushInfo.setIOSPushSound("");
+            openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+            OpenImResponseDTO openImResponseDTO = openIMSendMsg(openImMsgDTO);
+            if (openImResponseDTO.getErrCode()==0){
+                Thread.sleep(1000 );
+                OpenImEditConversationDTO openImEditConversationDTO = new OpenImEditConversationDTO();
+                ArrayList<String> userIDs = new ArrayList<>();
+                userIDs.add(sendID);
+                openImEditConversationDTO.setUserIDs(userIDs);
+                OpenImConversationDTO openImConversationDTO = new OpenImConversationDTO();
+                openImConversationDTO.setConversationID("si_"+sendID+"_"+recvID);
+                openImConversationDTO.setConversationType(1);
+                openImConversationDTO.setUserID(recvID);
+                openImConversationDTO.setEx(ex);
+                log.info("更新到会话的ex的值:{}",ex);
+                openImEditConversationDTO.setConversation(openImConversationDTO);
+
+                OpenImResponseDTO openImResponseDTO1 = editConversation(openImEditConversationDTO);
+                log.info("修改回话返回参数:{}",openImResponseDTO1);
+
+            }
+            return openImResponseDTO;
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+    /**
+     * 修改会话
+     * @return
+     */
+    public OpenImResponseDTO editConversation(OpenImEditConversationDTO dto) throws JsonProcessingException, InterruptedException {
+        String adminToken = getAdminToken();
+        ObjectMapper objectMapper = new ObjectMapper();
+        String requestBody = objectMapper.writeValueAsString(dto);
+
+        int retryCount = 0;
+        int maxRetries = 3;
+        OpenImResponseDTO responseDTO = null;
+
+        while (retryCount < maxRetries) {
+            try {
+                JSONObject jsonObject = new JSONObject(dto);
+                String body = HttpRequest.post("https://web.im.cdwjyyh.com/api/conversation/set_conversations")
+                        .header("operationID", String.valueOf(System.currentTimeMillis()))
+                        .header("token", adminToken)
+                        .body(jsonObject.toString())
+                        .execute()
+                        .body();
+                responseDTO = JSONUtil.toBean(body, OpenImResponseDTO.class);
+
+                if (responseDTO.getErrCode() == 0) {
+                    break; // 成功则退出重试
+                } else if (responseDTO.getErrCode() == 1501) {
+                    adminToken = getAdminToken(); // 刷新token
+                }
+            } catch (Exception e) {
+                log.error("修改会话失败,重试次数: {}", retryCount, e);
+            }
+            retryCount++;
+            if (retryCount < maxRetries) {
+                Thread.sleep(1000 * retryCount); // 指数退避
+            }
+        }
+        return responseDTO;
+    }
+    /**
+     * 检查两个用户是否存在好友关系
+     */
+    @Override
+    public OpenImResponseDTO isFriend(String userID1, String userID2) {
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("userID1",userID1);
+        jsonObject.put("userID2",userID2);
+        String body = HttpRequest.post("https://web.im.cdwjyyh.com/api/friend/is_friend")
+                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                .header("token", adminToken)
+                .body(jsonObject.toString())
+                .execute()
+                .body();
+        OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+        return responseDTO;
+    }
+    /**
+     * 添加好友
+     */
+    @Override
+    public OpenImResponseDTO importFriend(String ownerUserID, List<String> friendUserIDs) {
+        //先检查用户是否存在好友关系
+        List<String> newFriendIds = new ArrayList<>();
+        for (String friendUserID : friendUserIDs) {
+            OpenImResponseDTO friend = isFriend(ownerUserID,friendUserID);
+            if (friend.getErrCode()==0){
+                Object data = friend.getData();
+                cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(data);
+                Boolean inUser1Friends = (Boolean)jsonObject.get("inUser1Friends");
+                Boolean inUser2Friends = (Boolean)jsonObject.get("inUser2Friends");
+                //如果不存在好友关系
+                if (!inUser1Friends&&!inUser2Friends){
+                    newFriendIds.add(friendUserID);
+                    //friendUserIDs.remove(friendUserID);
+                }
+            }
+        }
+        if (newFriendIds.size()<=0){
+            return null;
+        }
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("ownerUserID",ownerUserID);
+        jsonObject.put("friendUserIDs",newFriendIds);
+        String body = HttpRequest.post("https://web.im.cdwjyyh.com/api/friend/import_friend")
+                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                .header("token", adminToken)
+                .body(jsonObject.toString())
+                .execute()
+                .body();
+        OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+        return responseDTO;
+    }
+
+    /**
+     * 通用注册im
+     * @param userId
+     * @param type 1用户,2销售,3医生
+     * @return
+     */@Override
+    public R accountCheck(String userId,String type){
+        String adminToken = getAdminToken();
+        JSONObject requestBody = new JSONObject();
+        // 解析响应
+        if (StringUtil.isNotEmpty(adminToken)) {
+            //查询用户是否注册
+            /*switch (type){
+                case "1":
+                    userId = "U"+userId;
+                    break;
+                case "2":
+                    userId = userId;
+                    break;
+                case "3":
+                    userId = userId;
+                    break;
+            }*/
+            ArrayList<String> userIds = new ArrayList<>();
+            requestBody = new JSONObject();
+            userIds.add(userId);
+            requestBody.put("checkUserIDs", userIds);
+            String body = HttpRequest.post("https://web.im.cdwjyyh.com/api/user/account_check")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(requestBody.toString())
+                    .execute()
+                    .body();
+            JSONObject jsonObject = new JSONObject(body);
+            JSONArray results = jsonObject.getJSONObject("data").getJSONArray("results");
+            if (results != null && results.length() > 0) {
+                JSONObject resultObj = results.getJSONObject(0);
+                int accountStatus = resultObj.getInt("accountStatus");
+                //未注册自动注册
+                if (accountStatus==0){
+                    HashMap<String, String> map = new HashMap<>();
+                    ArrayList<Object> users = new ArrayList<>();
+                    String s = "";
+                    switch (type){
+                        case "2":
+                            s = userId.replaceFirst("^scrmC", "");
+                            CompanyUser companyUser = companyUserMapper.selectCompanyUserByCompanyUserId(Long.parseLong(s));
+                            if (null==companyUser){
+                                return R.error("用户不存在");
+                            }
+                            Company company = companyMapper.selectCompanyById(companyUser.getCompanyId());
+                            map.put("userID",userId);
+                            //map.put("nickname",companyUser.getImNickName());
+                            map.put("nickname",companyUser.getNickName());
+                            map.put("faceURL",companyUser.getAvatar());
+                            break;
+                        case "1":
+                            s = userId.replaceFirst("^scrmU", "");
+                            FsUser fsUser = fsUserMapper.selectFsUserByUserId(Long.parseLong(s));
+                            if (null==fsUser){
+                                return R.error("用户不存在");
+                            }
+                            map.put("userID",userId);
+                            map.put("nickname",StringUtils.isEmpty(fsUser.getNickName())?"微信用户":fsUser.getNickName());
+                            map.put("faceURL",fsUser.getAvatar());
+                            break;
+                        case "3":
+                            s = userId.replaceFirst("^scrmD", "");
+                            FsDoctor fsDoctor = fsDoctorMapper.selectFsDoctorByDoctorId(Long.parseLong(s));
+                            if (null==fsDoctor){
+                                return R.error("用户不存在");
+                            }
+                            map.put("userID",userId);
+                            map.put("nickname",fsDoctor.getDoctorName());
+                            map.put("faceURL",fsDoctor.getAvatar());
+                            break;
+                    }
+
+                    users.add(map);
+                    requestBody = new JSONObject();
+                    userIds.add(userId);
+                    requestBody.put("users", users);
+                    HttpRequest.post("https://web.im.cdwjyyh.com/api/user/user_register")
+                            .header("operationID", String.valueOf(System.currentTimeMillis()))
+                            .header("token", adminToken).body(requestBody.toString()).execute().body();
+                }
+            } else {
+                return R.error("返回结果为空");
+            }
+           /* HashMap<String, String> tokenMap = new HashMap<>();
+            tokenMap.put("platformID","1");
+            tokenMap.put("userID",userId);*/
+            requestBody = new JSONObject();
+            requestBody.put("platformID",5);
+            requestBody.put("userID",userId);
+            String body1 = HttpRequest.post("https://web.im.cdwjyyh.com/api/auth/get_user_token")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(requestBody.toString()).execute().body();
+            JSONObject userJson = new JSONObject(body1);
+            Integer errCode = (Integer)userJson.get("errCode");
+            if (errCode==0){
+                JSONObject userData = userJson.getJSONObject("data");
+                String userToken = userData.getString("token");
+                return R.ok().put("token", userToken);
+            }
+            return R.error("注册失败");
+        } else {
+            return R.error("获取管理员token失败");
+        }
+    }
+    @Async
+    @Override
+    public void checkAndImportFriend(Long companyUserId,String fsUserId) {
+        try {
+            // 注册账号
+            accountCheck("scrmC" + companyUserId, "2");
+            accountCheck("scrmU"+fsUserId, "1");
+
+            // 导入好友关系
+            ArrayList<String> userIds = new ArrayList<>();
+            userIds.add("scrmU" + fsUserId);
+            importFriend("scrmC" + companyUserId, userIds);
+        } catch (Exception e) {
+            log.error("异步执行IM注册/添加好友失败:", e);
+        }
+    }
+
+    @Async
+    @Override
+    public void checkAndImportFriendByDianBo(Long companyUserId,String fsUserId,String cropId) {
+        try {
+            // 注册账号
+            accountCheck("scrmC" + companyUserId, "2");
+            accountCheck("scrmU"+fsUserId, "1");
+
+            // 导入好友关系
+            ArrayList<String> userIds = new ArrayList<>();
+            userIds.add("scrmU" + fsUserId);
+            importFriend("scrmC" + companyUserId, userIds);
+            updateFriendByDianBo("scrmC" + companyUserId, userIds,cropId);
+        } catch (Exception e) {
+            log.error("异步执行IM注册/添加好友失败:", e);
+        }
+    }
+
+    /**
+     * 修改好友信息
+     * @param ownerUserID
+     * @param friendUserIDs
+     * @return
+     */
+    public OpenImResponseDTO updateFriendByDianBo(String ownerUserID, List<String> friendUserIDs,String cropId) {
+        //先检查用户是否存在好友关系
+        //List<String> newFriendIds = new ArrayList<>();
+        for (String friendUserID : friendUserIDs) {
+            OpenImResponseDTO friend = isFriend(ownerUserID,friendUserID);
+            if (friend.getErrCode()==0){
+                Object data = friend.getData();
+                cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(data);
+                Boolean inUser1Friends = (Boolean)jsonObject.get("inUser1Friends");
+                Boolean inUser2Friends = (Boolean)jsonObject.get("inUser2Friends");
+                //如果不存在好友关系,则不执行im修改好友信息
+                if (!inUser1Friends&&!inUser2Friends){
+                    return null;
+                    //friendUserIDs.remove(friendUserID);
+                }
+            }
+        }
+        List<String> remark = qwExternalContactMapper.selectRemarkByCompanyUserAndFsUser(friendUserIDs.get(0).replaceFirst("^scrmU", ""), ownerUserID.replaceFirst("^scrmC", ""),cropId);
+        if (CollectionUtils.isEmpty(remark)||remark.size()<=0){
+            return null;
+        }
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("ownerUserID",ownerUserID);
+        jsonObject.put("friendUserIDs",friendUserIDs);
+        jsonObject.put("remark",remark.get(0));
+        String body = HttpRequest.post("https://web.im.cdwjyyh.com/api/friend/update_friends")
+                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                .header("token", adminToken)
+                .body(jsonObject.toString())
+                .execute()
+                .body();
+        OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+        return responseDTO;
+    }
+}

+ 28 - 0
fs-service/src/main/java/com/fs/im/vo/OpenImMsgCallBackVO.java

@@ -0,0 +1,28 @@
+package com.fs.im.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OpenImMsgCallBackVO {
+    private String sendID;
+    private String callbackCommand;
+    private String serverMsgID;
+    private String clientMsgID;
+    private String operationID;
+    private Integer senderPlatformID;
+    private String senderNickname;
+    private Integer sessionType;
+    private Integer msgFrom;
+    private Integer contentType;
+    private Integer status;
+    private Long sendTime;
+    private Long createTime;
+    private String content;
+    private Integer seq;
+    private List<String> atUserList;
+    private String faceURL;
+    private String ex;
+    private String recvID;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/im/vo/OpenImResponseDTOTest.java

@@ -0,0 +1,18 @@
+package com.fs.im.vo;
+
+import com.fs.im.service.impl.OpenIMServiceImpl;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+    public class OpenImResponseDTOTest {
+        private Integer errCode;
+        private String errMsg;
+        private String errDlt;
+        private UserData data;
+        @Data
+        public static class UserData {
+            private List<OpenIMServiceImpl.UserInfo> usersInfo;
+        }
+    }

+ 8 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -410,4 +410,12 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
 
     List<QwExternalContact> selectExternalByFsUserIds(@Param("userIds")List<Long> userIds);
 
+    @Select({"<script> " +
+            "SELECT qe.remark FROM qw_external_contact qe " +
+            "where qe.company_user_id = #{companyUserId} and qe.fs_user_id = #{userId}" +
+            "<if test = \"cropId!=null and cropId!=''\">  and qe.corp_id = #{cropId} </if>" +
+            "</script>"})
+    List<String> selectRemarkByCompanyUserAndFsUser(@Param("userId")String userId,@Param("companyUserId") String companyUserId,@Param("cropId") String cropId);
+
+
 }

+ 4 - 0
fs-service/src/main/resources/application-common.yml

@@ -138,3 +138,7 @@ image:
   storage:
     local-path: C:\logoFile\logo.jpg
     server-path: C:\logoFile\logo.jpg
+
+openIM:
+  secret: openIM123
+  userID: imAdmin

+ 1 - 0
fs-service/src/main/resources/application-config-dev.yml

@@ -85,6 +85,7 @@ headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png
 ipad:
   ipadUrl: http://ipad.cdwjyyh.com
+  aiApi:
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:

+ 3 - 0
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -507,6 +507,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </if>
         </where>
     </select>
+    <select id="selectCompanyUserByCompanyUserId" resultMap="CompanyUserResult">
+        select  * from company_user where user_id = #{companyUserId}
+    </select>
     <update id="batchUpdateUserDomain">
         update company_user set domain=#{domain} where user_id in <foreach collection="ids"  item="item" index="index" open="(" separator="," close=")">#{item}</foreach>
     </update>

+ 7 - 0
fs-service/src/main/resources/mapper/his/FsDoctorMapper.xml

@@ -118,6 +118,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where doctor_id = #{doctorId}
     </select>
 
+    <select id="selectDoctorNameByIds" resultType="java.lang.String">
+        select GROUP_CONCAT(DISTINCT doctor_name ORDER BY doctor_name SEPARATOR ',') AS doctor_name from fs_doctor where doctor_id in
+        <foreach collection="doctorIds.split(',')" item="doctorId" open="(" close=")" separator=",">
+            #{doctorId}
+        </foreach>
+    </select>
+
     <insert id="insertFsDoctor" parameterType="FsDoctor" useGeneratedKeys="true" keyProperty="doctorId">
         insert into fs_doctor
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 36 - 25
fs-user-app/src/main/java/com/fs/app/controller/FollowController.java

@@ -2,6 +2,8 @@ package com.fs.app.controller;
 
 
 import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.app.annotation.Login;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.core.domain.R;
@@ -17,6 +19,7 @@ import com.fs.his.vo.FsDiseaseListUVO;
 import com.fs.his.vo.FsFollowListUVO;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
+import com.fs.im.service.OpenIMService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -48,6 +51,8 @@ public class FollowController extends AppBaseController {
     private IFsUserService userService;
     @Autowired
     IImService imService;
+    @Autowired
+    private OpenIMService openIMService;
     Logger logger= LoggerFactory.getLogger(getClass());
 
     @Login
@@ -77,8 +82,7 @@ public class FollowController extends AppBaseController {
     @Login
     @ApiOperation("提交随访")
     @PostMapping("/doFollow")
-    public R doFollow(HttpServletRequest request, @Validated @RequestBody FsFollow param)
-    {
+    public R doFollow(HttpServletRequest request, @Validated @RequestBody FsFollow param) throws JsonProcessingException {
         FsFollow follow=followService.selectFsFollowByFollowId(param.getFollowId());
         if(follow.getWriteStatus()!=0){
             return R.error("非法操作");
@@ -86,36 +90,24 @@ public class FollowController extends AppBaseController {
         param.setWriteStatus(1);
         param.setUpdateTime(new Date());
         if(followService.updateFsFollow(param)>0){
-            MsgDTO msgDTO=new MsgDTO();
-            msgDTO.setTo_Account("D-"+follow.getDoctorId());
-            msgDTO.setFrom_Account("U-"+follow.getUserId());
             MsgCustomDTO customDTO1=new MsgCustomDTO();
             customDTO1.setType("follow");
             customDTO1.setImType(2);
             customDTO1.setOrderId(follow.getStoreOrderId().toString());
             customDTO1.setFollowId(follow.getFollowId().toString());
-            msgDTO.setCloudCustomData(JSONUtil.toJsonStr(customDTO1));
-
-            List<MsgDataDTO> msgs=new ArrayList<>();
-            MsgDataDTO msg=new MsgDataDTO();
-            String ext=JSONUtil.toJsonStr(follow);
+            ObjectMapper objectMapper = new ObjectMapper();
             String followId=follow.getFollowId().toString();
-            msg.setMsgContent(new MsgDataFormatDTO("follow",ext,followId));
-            msg.setMsgType("TIMCustomElem");//TIMCustomElem
-            msgs.add(msg);
-            msgDTO.setMsgBody(msgs);
-            MsgResponseDTO msgResponseDTO = imService.sendMsg(msgDTO);
-            logger.info("用户发送随访:"+msgResponseDTO);
+            String ex = objectMapper.writeValueAsString(customDTO1);
+            OpenImResponseDTO openImResponseDTO = openIMService.sendUtilUserToDoctor("U" + follow.getUserId(), "D" + follow.getDoctorId(), 110, "follow", "", "", followId, "", ex);
+
+            //MsgResponseDTO msgResponseDTO = imService.sendMsg(msgDTO);
+            //logger.info("用户发送随访:"+msgResponseDTO);
             userService.followAddIntegral(follow.getUserId(),follow.getFollowId());
 
             //发送给用户
-            MsgDTO msgDTO2=new MsgDTO();
-            MsgCustomDTO customDTO2=new MsgCustomDTO();
-            customDTO2.setType("startDrugReport");
-            customDTO2.setImType(2);
-            customDTO2.setOrderId(follow.getStoreOrderId().toString());
-            customDTO2.setFollowId(follow.getFollowId().toString());
-            msgDTO2.setCloudCustomData(JSONUtil.toJsonStr(customDTO2));
+            //MsgDTO msgDTO2=new MsgDTO();
+
+            /*msgDTO2.setCloudCustomData(JSONUtil.toJsonStr(customDTO2));
             msgDTO2.setFrom_Account("D-"+follow.getDoctorId());
             msgDTO2.setTo_Account("U-"+follow.getUserId());
             List<MsgDataDTO> msgs2=new ArrayList<>();
@@ -123,8 +115,27 @@ public class FollowController extends AppBaseController {
             msg2.setMsgType("TIMTextElem");
             msg2.setMsgContent(new MsgDataFormatDTO("您好,我是您的专属药师,您有任何问题都可以先留言给我,请耐心等待一下,用户咨询量较多,我会按咨询顺序一一回复哒~"));
             msgs2.add(msg2);
-            msgDTO2.setMsgBody(msgs2);
-            imService.sendMsg(msgDTO2);
+            msgDTO2.setMsgBody(msgs2);*/
+            //imService.sendMsg(msgDTO2);
+            /*OpenImMsgDTO openImMsgDTO1 = new OpenImMsgDTO();
+            openImMsgDTO1.setSendID("D"+follow.getDoctorId().toString());
+            openImMsgDTO1.setRecvID("U"+follow.getUserId().toString());
+            openImMsgDTO1.setContentType(101);
+            openImMsgDTO1.setSenderPlatformID(5);
+            openImMsgDTO1.setSessionType(1);
+            openImMsgDTO1.setEx(ex1);
+            OpenImMsgDTO.Content content1 = new OpenImMsgDTO.Content();
+            openImMsgDTO1.setContent(content1);*/
+            //content1.setContent("您好,我是您的专属药师,您有任何问题都可以先留言给我,请耐心等待一下,用户咨询量较多,我会按咨询顺序一一回复哒~");
+            MsgCustomDTO customDTO2=new MsgCustomDTO();
+            customDTO2.setType("startDrugReport");
+            customDTO2.setImType(2);
+            customDTO2.setOrderId(follow.getStoreOrderId().toString());
+            customDTO2.setFollowId(follow.getFollowId().toString());
+            String ex1 = objectMapper.writeValueAsString(customDTO2);
+            openIMService.sendUtil("D"+follow.getDoctorId(),"U"+follow.getUserId(),101,
+                    "","","您好,我是您的专属药师,您有任何问题都可以先留言给我,请耐心等待一下,用户咨询量较多,我会按咨询顺序一一回复哒~","","",ex1);
+            //openIMService.openIMSendMsg(openImMsgDTO1);
             return R.ok("操作成功");
 
         }