feat(0): [java]-[mvn]-联系人群组监控逻辑修改

This commit is contained in:
chandler 2025-01-04 18:52:01 +08:00
parent 7b7e99c0e1
commit 3d641826a1
4 changed files with 65 additions and 45 deletions

View File

@ -43,6 +43,13 @@ public class ContactDo extends Contact {
@ApiModelProperty(value = "联系人类型") @ApiModelProperty(value = "联系人类型")
private String contactType; private String contactType;
/**
* 展示名称
* 有备注优先展示备注
*/
@ApiModelProperty(value = "展示名称")
private String showName;
/** /**
* 根据自定义SQL查询联系人列表 * 根据自定义SQL查询联系人列表
* *
@ -56,14 +63,13 @@ public class ContactDo extends Contact {
List<ContactDo> list = new ArrayList<>(); List<ContactDo> list = new ArrayList<>();
// 查询联系人 // 查询联系人
List<Wcf.DbRow> dbContactList = wechatSocketClient.querySql(DatabaseNameEnum.MICRO_MSG.getCode(), List<Wcf.DbRow> dbContactList = wechatSocketClient.querySql(DatabaseNameEnum.MICRO_MSG.getCode(),
"SELECT UserName, Alias, NickName, DelFlag, VerifyFlag, Remark, LabelIDList, DomainList, ChatRoomType, HeadImgMd5, Type FROM Contact;"); "SELECT UserName, Alias, DelFlag, Type, VerifyFlag, Remark, NickName, LabelIDList, DomainList, ChatRoomType, PYInitial, QuanPin, RemarkPYInitial, RemarkQuanPin, ChatRoomNotify FROM Contact;");
if (!CollectionUtils.isEmpty(dbContactList)) { if (!CollectionUtils.isEmpty(dbContactList)) {
for (Wcf.DbRow dbRow : dbContactList) { for (Wcf.DbRow dbRow : dbContactList) {
List<Wcf.DbField> dbFieldList = dbRow.getFieldsList(); List<Wcf.DbField> dbFieldList = dbRow.getFieldsList();
if (!ObjectUtils.isEmpty(dbFieldList)) { if (!ObjectUtils.isEmpty(dbFieldList)) {
ContactDo po; ContactDo po = new ContactDo();
for (Wcf.DbField dbField : dbFieldList) { for (Wcf.DbField dbField : dbFieldList) {
po = new ContactDo();
String content = (String)wechatSocketClient.convertSqlVal(dbField.getType(), dbField.getContent()); String content = (String)wechatSocketClient.convertSqlVal(dbField.getType(), dbField.getContent());
// 用户名 // 用户名
if ("UserName".equals(dbField.getColumn())) { if ("UserName".equals(dbField.getColumn())) {
@ -105,11 +111,8 @@ public class ContactDo extends Contact {
if ("ChatRoomType".equals(dbField.getColumn())) { if ("ChatRoomType".equals(dbField.getColumn())) {
po.setChatRoomType(Integer.valueOf(content)); po.setChatRoomType(Integer.valueOf(content));
} }
//
if ("HeadImgMd5".equals(dbField.getColumn())) {
po.setHeadImgMd5(content);
}
} }
list.add(po);
} }
} }
} }

View File

@ -68,10 +68,4 @@ public class Contact {
@ApiModelProperty(value = "群类型") @ApiModelProperty(value = "群类型")
private Integer chatRoomType; private Integer chatRoomType;
/**
* 头像MD5
*/
@ApiModelProperty(value = "头像MD5")
private String headImgMd5;
} }

View File

@ -391,7 +391,7 @@ public class WeChatSocketClient {
public Function<byte[], Object> getSqlType(int type) { public Function<byte[], Object> getSqlType(int type) {
Map<Integer, Function<byte[], Object>> sqlTypeMap = new HashMap<>(); Map<Integer, Function<byte[], Object>> sqlTypeMap = new HashMap<>();
// 初始化SQL_TYPES 根据类型执行不同的Func // 初始化SQL_TYPES 根据类型执行不同的Func
sqlTypeMap.put(1, bytes -> ByteBuffer.wrap(bytes).getInt()); sqlTypeMap.put(1, bytes -> new String(bytes, StandardCharsets.UTF_8));
sqlTypeMap.put(2, bytes -> ByteBuffer.wrap(bytes).getFloat()); sqlTypeMap.put(2, bytes -> ByteBuffer.wrap(bytes).getFloat());
sqlTypeMap.put(3, bytes -> new String(bytes, StandardCharsets.UTF_8)); sqlTypeMap.put(3, bytes -> new String(bytes, StandardCharsets.UTF_8));
sqlTypeMap.put(4, bytes -> bytes); sqlTypeMap.put(4, bytes -> bytes);

View File

@ -14,7 +14,6 @@ import org.springframework.util.CollectionUtils;
import com.wechat.ferry.aggregation.facade.ContactDo; import com.wechat.ferry.aggregation.facade.ContactDo;
import com.wechat.ferry.config.WeChatFerryProperties; import com.wechat.ferry.config.WeChatFerryProperties;
import com.wechat.ferry.entity.po.wcf.Contact;
import com.wechat.ferry.enums.WxContactsTypeEnum; import com.wechat.ferry.enums.WxContactsTypeEnum;
import com.wechat.ferry.handle.WeChatSocketClient; import com.wechat.ferry.handle.WeChatSocketClient;
@ -60,19 +59,23 @@ public class ContactGroupMonitorTask {
private final Map<String, Map<String, String>> groupMemberMap = new HashMap<>(); private final Map<String, Map<String, String>> groupMemberMap = new HashMap<>();
/** /**
* 初始化标志 * 初始化状态
*/ */
private Boolean initFlag = false; private Boolean initStatus = false;
@Scheduled(cron = "0 0/2 * * * ?") @Scheduled(cron = "0 0 0 * * ?")
public void scheduled() { public void scheduled() {
if (true) {
// 目前查询的所有的联系人未判断群组是否已退出等状态故该功能暂不启用仅提供一个小样例
return;
}
ContactDo contactDo = new ContactDo(); ContactDo contactDo = new ContactDo();
// 查询联系人 // 查询联系人
List<ContactDo> contactList = contactDo.queryContactListBySql(wechatSocketClient, weChatFerryProperties); List<ContactDo> contactList = contactDo.queryContactListBySql(wechatSocketClient, weChatFerryProperties);
log.info("[定时任务]-[联系人群组监控]-{}", contactList.size());
// 调用联系人监控处理 // 调用联系人监控处理
contactMonitor(contactList); contactMonitor(contactList);
initFlag = true; log.info("[定时任务]-[联系人群组监控]-结束");
log.info("[定时任务]-[重置签到]-结束");
} }
// 联系人监控 // 联系人监控
@ -89,14 +92,18 @@ public class ContactGroupMonitorTask {
List<String> addGroupList = new ArrayList<>(); List<String> addGroupList = new ArrayList<>();
// 退出群组 // 退出群组
List<String> deleteGroupList = new ArrayList<>(); List<String> deleteGroupList = new ArrayList<>();
// 本次的联系人标识列表 // 本次个微联系人标识列表
List<String> nowContactIdList = new ArrayList<>(); List<String> nowPpContactIdList = new ArrayList<>();
// 本次企微联系人标识列表
List<String> nowCpContactIdList = new ArrayList<>();
// 本次群组标识列表
List<String> nowGroupIdList = new ArrayList<>();
// 开始匹配 // 开始匹配
if (!CollectionUtils.isEmpty(contactList)) { if (!CollectionUtils.isEmpty(contactList)) {
// 判断全部联系人是否为空
if (allContactDoMap.isEmpty()) {
for (ContactDo contactDo : contactList) { for (ContactDo contactDo : contactList) {
nowContactIdList.add(contactDo.getWeChatUid());
if (!initFlag) {
// 首次初始化 // 首次初始化
allContactDoMap.put(contactDo.getWeChatUid(), contactDo); allContactDoMap.put(contactDo.getWeChatUid(), contactDo);
if (WxContactsTypeEnum.PERSON.getCode().equals(contactDo.getContactType())) { if (WxContactsTypeEnum.PERSON.getCode().equals(contactDo.getContactType())) {
@ -109,53 +116,69 @@ public class ContactGroupMonitorTask {
// 群组-初始化 // 群组-初始化
groupMap.put(contactDo.getWeChatUid(), contactDo.getNickname()); groupMap.put(contactDo.getWeChatUid(), contactDo.getNickname());
} }
}
log.info("[定时任务]-[联系人监控]-首次初始化成功");
} else { } else {
// 非首次 // 检测新增联系人
for (ContactDo contactDo : contactList) {
if (WxContactsTypeEnum.PERSON.getCode().equals(contactDo.getContactType())) {
// 个微
nowPpContactIdList.add(contactDo.getWeChatUid());
if (!ppContactDoMap.containsKey(contactDo.getWeChatUid())) { if (!ppContactDoMap.containsKey(contactDo.getWeChatUid())) {
// 个微-新增 // 个微-新增
addPpContactList.add(contactDo.getWeChatUid()); addPpContactList.add(contactDo.getWeChatUid());
ppContactDoMap.put(contactDo.getWeChatUid(), contactDo.getNickname()); ppContactDoMap.put(contactDo.getWeChatUid(), contactDo.getNickname());
} else if (!cpContactDoMap.containsKey(contactDo.getContactType())) { }
} else if (WxContactsTypeEnum.WORK.getCode().equals(contactDo.getContactType())) {
// 企业微信
nowCpContactIdList.add(contactDo.getWeChatUid());
if (!cpContactDoMap.containsKey(contactDo.getWeChatUid())) {
// 企业微信-新增 // 企业微信-新增
addCpContactList.add(contactDo.getWeChatUid()); addCpContactList.add(contactDo.getWeChatUid());
cpContactDoMap.put(contactDo.getWeChatUid(), contactDo.getNickname()); cpContactDoMap.put(contactDo.getWeChatUid(), contactDo.getNickname());
} else if (!groupMap.containsKey(contactDo.getContactType())) { }
} else if (WxContactsTypeEnum.GROUP.getCode().equals(contactDo.getContactType())) {
// 群组
nowGroupIdList.add(contactDo.getWeChatUid());
if (!groupMap.containsKey(contactDo.getWeChatUid())) {
// 群组-新增 // 群组-新增
addGroupList.add(contactDo.getWeChatUid()); addGroupList.add(contactDo.getWeChatUid());
groupMap.put(contactDo.getWeChatUid(), contactDo.getNickname()); groupMap.put(contactDo.getWeChatUid(), contactDo.getNickname());
} }
} }
} }
}
// 初始化完成 // 初始化完成
if (initFlag) { if (initStatus) {
// 个微 // 个微
for (Map.Entry<String, String> entry : ppContactDoMap.entrySet()) { for (Map.Entry<String, String> entry : ppContactDoMap.entrySet()) {
if (!nowContactIdList.contains(entry.getKey())) { if (!nowPpContactIdList.contains(entry.getKey())) {
// 个微-删除 // 个微-删除
deletePpContactList.add(entry.getKey()); deletePpContactList.add(entry.getKey());
} }
} }
// 企微 // 企微
for (Map.Entry<String, String> entry : cpContactDoMap.entrySet()) { for (Map.Entry<String, String> entry : cpContactDoMap.entrySet()) {
if (!nowContactIdList.contains(entry.getKey())) { if (!nowCpContactIdList.contains(entry.getKey())) {
// 企微-删除 // 企微-删除
deleteCpContactList.add(entry.getKey()); deleteCpContactList.add(entry.getKey());
} }
} }
// 群组 // 群组
for (Map.Entry<String, String> entry : groupMap.entrySet()) { for (Map.Entry<String, String> entry : groupMap.entrySet()) {
if (!nowContactIdList.contains(entry.getKey())) { if (!nowGroupIdList.contains(entry.getKey())) {
// 群组-删除 // 群组-删除
deleteGroupList.add(entry.getKey()); deleteGroupList.add(entry.getKey());
log.info("\"{}\"离开了群聊"); log.info("\"{}\"离开了群聊");
} }
} }
}
}
log.info("[定时任务]-[联系人监控]-个微新增:{},个微删除:{},企微新增:{},企微删除:{},群组新增:{},群组删除:{}", addPpContactList, deletePpContactList, addCpContactList, log.info("[定时任务]-[联系人监控]-个微新增:{},个微删除:{},企微新增:{},企微删除:{},群组新增:{},群组删除:{}", addPpContactList, deletePpContactList, addCpContactList,
deleteCpContactList, addGroupList, deleteGroupList); deleteCpContactList, addGroupList, deleteGroupList);
} }
}
initStatus = true;
}
// 监控群成员 // 监控群成员
private void groupMemberMonitor() { private void groupMemberMonitor() {