chenbiao 2 ani în urmă
părinte
comite
2d413a6b06
16 a modificat fișierele cu 522 adăugiri și 32 ștergeri
  1. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/corp/QyMsgContentMapper.java
  2. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserFollowRelation.java
  3. 118 0
      netflix-dao/src/main/java/com/cyksj/model/entity/QyMsgContent.java
  4. 71 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpFollowMsgView.java
  5. 68 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpMsgAuditUserView.java
  6. 50 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpQyMsgAuditChatView.java
  7. 1 2
      netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpUserView.java
  8. 13 0
      netflix-service/src/main/java/com/cyksj/service/corp/CorpQyMsgContentService.java
  9. 28 0
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpQyMsgContentServiceImpl.java
  10. 5 1
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java
  11. 1 1
      netflix-service/src/main/java/com/cyksj/service/corp/impl/WxCorpOpsImpl.java
  12. 95 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgAuditController.java
  13. 0 21
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgContentController.java
  14. 0 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgFollowController.java
  15. 14 4
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpUserController.java
  16. 41 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/corp/QyMsgContentMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper.corp;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.QyMsgContent;
+
+/**
+ * @author chan
+ * @date 2024/1/22 15:07
+ */
+public interface QyMsgContentMapper extends BaseMapper<QyMsgContent> {
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserFollowRelation.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.entity;
 
+import com.ejlchina.searcher.bean.DbField;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.Getter;
@@ -74,6 +75,11 @@ public class CorpUserFollowRelation extends BaseEntity implements Serializable {
 	 */
 	private String delUserid;
 
+	/**
+	 * 会话存档同意情况 同意:"Agree",不同意:"Disagree"
+	 */
+	private String agreeStatus;
+
 	@AllArgsConstructor
 	@Getter
 	public enum Way {

+ 118 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/QyMsgContent.java

@@ -0,0 +1,118 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QyMsgContent {
+
+	@TableId(value = "id",type = IdType.AUTO)
+	private Long id;
+	/**
+	 * 消息id,消息的唯一标识,企业可以使用此字段进行消息去重
+	 */
+	private String msgid;
+	/**
+	 * 消息动作,目前有send(发送消息)/recall(撤回消息)/switch(切换企业日志)三种类型
+	 */
+	private String action;
+
+	/**
+	 * 成员id
+	 */
+	private String followId;
+
+	/**
+	 * 客户id
+	 */
+	private String externalUserid;
+
+	/**
+	 * 消息发送方id。同一企业内容为userid,非相同企业为external_userid。消息如果是机器人发出,也为external_userid
+	 */
+	@TableField("`from`")
+	private String from;
+
+	private String fromView;
+	/**
+	 * 消息接收方列表,可能是多个,同一个企业内容为userid,非相同企业为external_userid。数组
+	 */
+	private String tolist;
+
+	private String tolistView;
+	/**
+	 * 群聊消息的群id
+	 */
+	private String roomid;
+
+	private String roomidView;
+	/**
+	 * 消息发送时间戳,utc时间,ms单位
+	 */
+	private String msgtime;
+	/**
+	 * 消息类型
+	 */
+	private String msgtype;
+	/**
+	 * 文字
+	 */
+	private String text;
+	/**
+	 * 图片
+	 */
+	private String image;
+	/**
+	 * 小程序
+	 */
+	private String weapp;
+	/**
+	 * 红包消息
+	 */
+	private String redpacket;
+	/**
+	 * 文件
+	 */
+	private String file;
+	/**
+	 * 视频
+	 */
+	private String video;
+	/**
+	 * 语音
+	 */
+	private String voice;
+	/**
+	 * 多条聊天记录
+	 */
+	private String chatrecord;
+	/**
+	 * 文件名称
+	 */
+	private String filename;
+	/**
+	 * 撤回
+	 */
+	@TableField("`revoke`")
+	private String revoke;
+	/**
+	 * 表情包
+	 */
+	private String emotion;
+	/**
+	 * 卡片消息
+	 */
+	private String card;
+	/**
+	 * 文件URL
+	 */
+	private String url;
+
+}

+ 71 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpFollowMsgView.java

@@ -0,0 +1,71 @@
+package com.cyksj.model.manage.views;
+
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 会话聊天框列表
+ * @author chan
+ * @date 2024/1/22 17:16
+ */
+@Data
+@SearchBean(tables = "(SELECT external_userid userid, q.follow_id follow_id, MAX(id) msgId " +
+        "FROM qy_msg_content q " +
+        " :keyword: " +
+        "GROUP BY q.external_userid , q.follow_id " +
+        "ORDER BY MAX(q.id) desc limit 1) t " +
+        "LEFT JOIN qy_msg_content qm on qm.id = t.msgId " +
+        "LEFT JOIN corp_user_auth cu on cu.external_userid = t.userid " +
+        "LEFT JOIN corp_user c on c.id = cu.corp_user_id "
+)
+public class CorpFollowMsgView {
+
+    /**
+     * 用户名称
+     */
+    @DbField("c.name")
+    private String name;
+
+    /**
+     * 用户头像
+     */
+    @DbField("c.avatar")
+    private String avatar;
+
+    /**
+     * 成员id
+     */
+    @DbField("t.follow_id")
+    private String followId;
+
+    /**
+     * 用户id
+     */
+    @DbField("t.userid")
+    private String userid;
+
+    /**
+     * 最近消息文本内容
+     */
+    @DbField("qm.text")
+    private String msgText;
+
+    /**
+     * 最近消息类型
+     */
+    @DbField("qm.msgtype")
+    private String msgType;
+
+    /**
+     * 最近消息时间
+     */
+    @DbField("qm.msgtime")
+    private String msgtime;
+
+
+}

+ 68 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpMsgAuditUserView.java

@@ -0,0 +1,68 @@
+package com.cyksj.model.manage.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author chan
+ * @date 2024/1/22 14:41
+ */
+
+@Data
+@SearchBean(tables = " corp_user c,corp_user_auth cu, corp_follow f, corp_user_follow_relation cr ,corp_user_tag t ",
+        where = " c.id = cu.corp_user_id " +
+                "and cu.external_userid = cr.corp_user_id " +
+                "and f.userid = cr.follow_id " +
+                ":tag:",
+        groupBy = "c.name,cu.external_userid,c.avatar,c.type,c.gender,f.name,cr.agree_status,cr.add_created_time"
+)
+public class CorpMsgAuditUserView {
+
+    /**
+     * 外部联系人的名称
+     */
+    @DbField("c.name")
+    private String name;
+
+    @DbField("cu.external_userid")
+    private String externalUserid;
+
+    /**
+     * 外部联系人头像,代开发自建应用需要管理员授权才可以获取,第三方不可获取,上游企业不可获取下游企业客户该字段
+     */
+    @DbField("c.avatar")
+    private String avatar;
+
+    /**
+     * 外部联系人的类型,1表示该外部联系人是微信用户,2表示该外部联系人是企业微信用户
+     */
+    @DbField("c.type")
+    private Integer type;
+
+    /**
+     * 外部联系人性别 0-未知 1-男性 2-女性。第三方不可获取,上游企业不可获取下游企业客户该字段,返回值为0,表示未定义
+     */
+    @DbField("c.gender")
+    private Integer gender;
+
+    /**
+     * 成员名称
+     */
+    @DbField("f.name")
+    private String followName;
+
+    /**
+     * 会话存档同意情况 同意:"Agree",不同意:"Disagree"
+     */
+    @DbField("cr.agree_status")
+    private String agreeStatus;
+
+    /**
+     * 添加时间
+     */
+    @DbField("cr.add_created_time")
+    private Date addCreatedTime;
+}

+ 50 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpQyMsgAuditChatView.java

@@ -0,0 +1,50 @@
+package com.cyksj.model.manage.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+/**
+ * 企微工具会话列表
+ * @author chan
+ * @date 2024/1/24 13:43
+ */
+@SearchBean(tables = " qy_msg_content q, " +
+        " corp_user c, " +
+        " corp_user_auth cu, " +
+        " corp_follow cf ",
+        where = "q.external_userid = cu.external_userid   " +
+                " AND cu.corp_user_id = c.id   " +
+                " AND q.follow_id = cf.userid " +
+                "AND q.follow_id in (:followId:)",
+        groupBy = "c.name,c.avatar,cu.external_userid ,cf.name,cf.avatar"
+)
+@Data
+public class CorpQyMsgAuditChatView {
+    /**
+     * 外部联系人的名称
+     */
+    @DbField("c.name")
+    private String name;
+
+    /**
+     * 外部联系人头像,代开发自建应用需要管理员授权才可以获取,第三方不可获取,上游企业不可获取下游企业客户该字段
+     */
+    @DbField("c.avatar")
+    private String avatar;
+
+    @DbField("cu.external_userid")
+    private String externalUserid;
+
+    /**
+     * 成员名称
+     */
+    @DbField("f.name")
+    private String followName;
+
+    /**
+     * 成员头像
+     */
+    @DbField("f.avatar")
+    private String followAvatar;
+}

+ 1 - 2
netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpUserMsgView.java → netflix-dao/src/main/java/com/cyksj/model/manage/views/CorpUserView.java

@@ -1,7 +1,6 @@
 package com.cyksj.model.manage.views;
 
 import com.ejlchina.searcher.bean.DbField;
-import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Data;
 
@@ -19,7 +18,7 @@ import java.util.List;
                 "and cr.id = t.relation_id ",
         groupBy = "c.name, c.avatar, c.type, c.gender, c.unionid, c.user_id, c.state, c.mark_info, c.created_time"
 )
-public class CorpUserMsgView {
+public class CorpUserView {
 
     /**
      * 外部联系人的名称

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/corp/CorpQyMsgContentService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.corp;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.QyMsgContent;
+import com.cyksj.model.manage.views.CorpFollowMsgView;
+import com.ejlchina.searcher.SearchResult;
+
+/**
+ * @author chan
+ * @date 2024/1/22 15:07
+ */
+public interface CorpQyMsgContentService extends IService<QyMsgContent> {
+}

+ 28 - 0
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpQyMsgContentServiceImpl.java

@@ -0,0 +1,28 @@
+package com.cyksj.service.corp.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.corp.QyMsgContentMapper;
+import com.cyksj.model.entity.QyMsgContent;
+import com.cyksj.model.manage.views.CorpFollowMsgView;
+import com.cyksj.service.corp.CorpQyMsgContentService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author chan
+ * @date 2024/1/22 15:08
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class CorpQyMsgContentServiceImpl extends ServiceImpl<QyMsgContentMapper, QyMsgContent> implements CorpQyMsgContentService {
+
+    private final BeanSearcher beanSearcher;
+
+}

+ 5 - 1
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java

@@ -258,12 +258,16 @@ public class CorpServiceImpl implements CorpService {
 		WxCorpApp wxCorpApp = WeChatCorpFactory.getCorpConfigStrategy(corpId);
 		Long wxCorpId = wxCorpApp.getId();
 		CorpFollow corpFollow = corpFollowMapper.selectOne(Wrappers.lambdaQuery(CorpFollow.class).eq(CorpFollow::getWxCorpId, wxCorpId).eq(CorpFollow::getUserid, corpOauth2UserInfo.getUserId()));
+		CorpUserInfo userInfo = wxCorpOps.getFollowUser(corpId, corpOauth2UserInfo.getUserId());
 		if (corpFollow == null) {
-			CorpUserInfo userInfo = wxCorpOps.getFollowUser(corpId, corpOauth2UserInfo.getUserId());
 			corpFollow = new CorpFollow();
 			BeanUtil.copyProperties(userInfo, corpFollow);
 			corpFollow.setWxCorpId(wxCorpId);
 			corpFollowMapper.insert(corpFollow);
+		}else {
+			BeanUtil.copyProperties(userInfo, corpFollow);
+			corpFollow.setWxCorpId(wxCorpId);
+			corpFollowMapper.updateById(corpFollow);
 		}
 
 		return corpFollow;

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/corp/impl/WxCorpOpsImpl.java

@@ -740,7 +740,7 @@ public class WxCorpOpsImpl implements WxCorpOps {
 
 	@Override
 	public WxCpLinkAddResp customerAcquisitionDeleteLink(String corpId, WxCpLinkUpd wxCpLinkUpd) throws Exception {
-		String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/delete_link?access_token="
+		String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/delete_link?access_token=";
 
 		HttpResponse<String> res =
 				J11HttpC.custom()

+ 95 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgAuditController.java

@@ -0,0 +1,95 @@
+package com.cyksj.web.controller.manage.corp;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.QyMsgContent;
+import com.cyksj.model.manage.views.CorpFollowMsgView;
+import com.cyksj.model.manage.views.CorpMsgAuditUserView;
+import com.cyksj.service.corp.CorpQyMsgContentService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.operator.InList;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author chan
+ * @date 2024/1/22 14:25
+ */
+@RequiredArgsConstructor
+@Slf4j
+@RestController
+@RequestMapping("/manage/corp/msg/audit")
+public class CorpMsgAuditController {
+
+    private final BeanSearcher beanSearcher;
+
+    private final HttpServletRequest request;
+
+    private final CorpQyMsgContentService corpQyMsgContentService;
+
+
+
+    /**
+     * 会话存档用户列表
+     * @param textKey 关键词搜索
+     * @param tagId 标签筛选
+     * @return
+     */
+    @GetMapping
+    public Result<SearchResult<CorpMsgAuditUserView>> get(String textKey, String tagId){
+        Set<String> userIds = new HashSet<>();
+        if(StringUtils.isNotBlank(textKey)){
+            List<QyMsgContent> text = corpQyMsgContentService.list(Wrappers.lambdaQuery(QyMsgContent.class).select(QyMsgContent::getFrom, QyMsgContent::getTolist).like(QyMsgContent::getText, textKey).eq(QyMsgContent::getRoomid,"").eq(QyMsgContent::getMsgtype, "text"));
+            userIds = text.stream().map(QyMsgContent::getExternalUserid).collect(Collectors.toSet());
+        }
+        MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+        if (userIds.size() > 0) {
+            builder.field(CorpMsgAuditUserView::getExternalUserid,userIds).op(InList.class);
+        }
+        if(StringUtils.isNotBlank(tagId)){
+            builder.put("tag", String.format( "and cr.id = t.relation_id and t.tag_id = %s", tagId));
+        }
+        SearchResult<CorpMsgAuditUserView> search = beanSearcher.search(CorpMsgAuditUserView.class, builder.build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+
+    }
+
+    /**
+     * 获取会话列表
+     */
+    @GetMapping("/msgList")
+    public Result<SearchResult<CorpFollowMsgView>> msgList(String keyword){
+        MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+        if(StringUtils.isNotBlank(keyword)){
+            builder.put("keyword", String.format("where q.text like '%s%%')",keyword));
+        }
+        SearchResult<CorpFollowMsgView> search = beanSearcher.search(CorpFollowMsgView.class, builder.build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
+
+
+    /**
+     * 获取聊天记录
+     */
+    @GetMapping("/getMsgByFollowIdAndUserId")
+    public Result<SearchResult<QyMsgContent>> getMsgByFollowIdAndUserId(){
+        SearchResult<QyMsgContent> search = beanSearcher.search(QyMsgContent.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
+
+
+}

+ 0 - 21
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgContentController.java

@@ -1,21 +0,0 @@
-package com.cyksj.web.controller.manage.corp;
-
-import com.ejlchina.searcher.BeanSearcher;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author chan
- * @date 2024/1/18 17:46
- */
-@Slf4j
-@RestController
-@RequestMapping("/manage/msg/content")
-@RequiredArgsConstructor
-public class CorpMsgContentController {
-
-    private final BeanSearcher beanSearcher;
-
-}

+ 0 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgFollowController.java

@@ -6,7 +6,6 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.model.entity.CorpMsgFollowAssociation;
 import com.cyksj.model.manage.views.CorpMsgFollowAssociationView;
-import com.cyksj.service.corp.CorpFollowService;
 import com.cyksj.service.corp.CorpMsgFollowAssociationService;
 import com.cyksj.service.corp.WxCorpOps;
 import com.ejlchina.searcher.BeanSearcher;
@@ -31,8 +30,6 @@ import java.util.stream.Collectors;
 @RequestMapping("/manage/msg/follow")
 public class CorpMsgFollowController {
 
-    private final CorpFollowService corpFollowService;
-
     private final CorpMsgFollowAssociationService corpMsgFollowAssociationService;
 
     private final BeanSearcher beanSearcher;

+ 14 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpUserController.java

@@ -1,16 +1,21 @@
 package com.cyksj.web.controller.manage.corp;
 
 import com.cyksj.dto.Result;
-import com.cyksj.model.manage.views.CorpUserMsgView;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.manage.views.CorpUserView;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
+ * 企业微信/用户列表
  * @author chan
  * @date 2024/1/19 10:48
  */
@@ -22,10 +27,15 @@ public class CorpUserController {
 
     private final BeanSearcher beanSearcher;
 
-    @GetMapping
-    public Result<SearchResult<CorpUserMsgView>> get(){
+    private final HttpServletRequest request;
 
+    /**
+     * 企业微信用户列表
+     */
+    @GetMapping
+    public Result<SearchResult<CorpUserView>> get(){
+        SearchResult<CorpUserView> search = beanSearcher.search(CorpUserView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 
-
 }

+ 41 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
+import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.IoKit;
@@ -18,12 +19,17 @@ import com.cyksj.mapper.GroupsRelationCustomerServiceFollowRecordMapper;
 import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
 import com.cyksj.model.dto.AuthRedirect;
 import com.cyksj.model.entity.CorpFollow;
+import com.cyksj.model.entity.CorpMsgFollowAssociation;
+import com.cyksj.model.entity.QyMsgContent;
+import com.cyksj.model.manage.views.CorpQyMsgAuditChatView;
 import com.cyksj.model.request.corp.CorpCommonReq;
 import com.cyksj.model.views.YHLXUserDetailView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.corp.CorpService;
 import com.cyksj.service.corp.CorpUserService;
 import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -33,8 +39,10 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /*
  *项目名: netflix
@@ -260,4 +268,37 @@ public class WxCorpController {
 		corpUserService.markCorpUser(corpCommonReq);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
+
+
+	/**
+	 * 企微会话列表
+	 * @param externalUserid 用户 externalUserid
+	 */
+	@GetMapping("/getMsgAuditChat")
+	public Result<SearchResult<CorpQyMsgAuditChatView>> getMsgAuditChat(String externalUserid) {
+		String followId = getCorpUuid();
+		List<CorpMsgFollowAssociation> corpMsgFollowAssociations = beanSearcher.searchAll(CorpMsgFollowAssociation.class, MapUtils.builder().field(CorpMsgFollowAssociation::getFollowId, followId).build());
+		List<String> followIds = corpMsgFollowAssociations.stream().map(CorpMsgFollowAssociation::getAssociationFollowId).collect(Collectors.toList());
+		followIds.add(followId);
+		if (StringUtils.isBlank(externalUserid)) {
+			throw BusinessRuntimeException.getInstance("缺少必填参数.");
+		}
+		SearchResult<CorpQyMsgAuditChatView> search = beanSearcher.search(CorpQyMsgAuditChatView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(CorpQyMsgAuditChatView::getExternalUserid, externalUserid)
+				.put("followId", followIds.stream()
+						.map(String::valueOf)
+						.collect(Collectors.joining(",")))
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
+	/**
+	 * 获取聊天记录
+	 */
+	@GetMapping("/getMsgByFollowIdAndUserId")
+	public Result<SearchResult<QyMsgContent>> getMsgByFollowIdAndUserId(){
+		SearchResult<QyMsgContent> search = beanSearcher.search(QyMsgContent.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
 }