添加好友代码

main
bynt 3 months ago
parent 8bf63db6cb
commit ef95d08200

@ -24,37 +24,37 @@ import java.util.concurrent.TimeUnit;
@RequiredArgsConstructor
public class ValidateCodeServiceImpl implements IValidateCodeService {
private final RedisUtils redisUtils;
private final KaptchaTextCreator kaptchaTextCreator;
@Override
public Map<String, Object> createCapcha() {
// 获取验证码
Captcha captcha = this.kaptchaTextCreator.getCaptcha();
// 生成一个唯一的id
String uuid = CaptchaConstant.CAPTCHA_CODE_KEY + IdUtil.simpleUUID();
// 保存到redis中
this.redisUtils.set(uuid, captcha.text(), CaptchaConstant.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
Map<String, Object> map = new HashMap<>();
map.put("uuid", uuid);
map.put("img", captcha.toBase64());
return map;
}
@Override
public void checkCapcha(String key, String code) {
if (CharSequenceUtil.isBlank(code)) {
throw new BadRequestException("验证码不能为空");
}
String captcha = (String) redisUtils.get(key);
if (CharSequenceUtil.isBlank(captcha)) {
throw new BadRequestException("验证码已失效");
}
redisUtils.del(key);
if (!code.equalsIgnoreCase(captcha)) {
throw new BadRequestException("验证码错误");
}
}
private final RedisUtils redisUtils;
private final KaptchaTextCreator kaptchaTextCreator;
@Override
public Map<String, Object> createCapcha() {
// 获取验证码
Captcha captcha = this.kaptchaTextCreator.getCaptcha();
// 生成一个唯一的id
String uuid = CaptchaConstant.CAPTCHA_CODE_KEY + IdUtil.simpleUUID();
// 保存到redis中
this.redisUtils.set(uuid, captcha.text(), CaptchaConstant.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
Map<String, Object> map = new HashMap<>();
map.put("uuid", uuid);
map.put("img", captcha.toBase64());
return map;
}
@Override
public void checkCapcha(String key, String code) {
if (CharSequenceUtil.isBlank(code)) {
throw new BadRequestException("验证码不能为空");
}
String captcha = (String) redisUtils.get(key);
if (CharSequenceUtil.isBlank(captcha)) {
throw new BadRequestException("验证码已失效");
}
redisUtils.del(key);
if (!code.equalsIgnoreCase(captcha)) {
throw new BadRequestException("验证码错误");
}
}
}

@ -0,0 +1,12 @@
package com.baiye.constant;
/**
* @author Enzo
* @date : 2024/6/12
*/
public class GroupConstant {
/**
*
*/
public static final String CHAT_ROOM_FLAG = "@chatroom";
}

@ -19,7 +19,7 @@ public class RootApplication implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
public void run(String... args) {
log.info(">>>>>>>>>>>>>>>服务启动执行,扫描动态任务列表,并添加任务<<<<<<<<<<<<<");
scanDynamicJobHandler.scanAddJob();
}

@ -1,22 +1,30 @@
package com.baiye.listener;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.StrPool;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.util.ListUtils;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.modules.scrm.dto.SaveAddFriendDTO;
import com.baiye.modules.scrm.entity.AddFriend;
import com.baiye.modules.scrm.service.AddFriendService;
import com.baiye.modules.scrm.vo.FileAddFriendVO;
import com.baiye.polling.QueueBalance;
import com.google.common.base.Splitter;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Set;
/**
* @author Enzo
* @date : 2024/6/2
*/
@Slf4j
public class AddFileFriendDataListener<T> implements ReadListener<T> {
public class AddFileFriendDataListener extends AnalysisEventListener<FileAddFriendVO> {
/**
* 5使100list 便
@ -25,12 +33,15 @@ public class AddFileFriendDataListener<T> implements ReadListener<T> {
/**
*
*/
private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private List<FileAddFriendVO> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final AddFriendService addFriendService;
private final ExtendService<T> extendService;
private final SaveAddFriendDTO saveAddFriendDTO;
public AddFileFriendDataListener(ExtendService<T> extendService) {
this.extendService = extendService;
public AddFileFriendDataListener(AddFriendService addFriendService, SaveAddFriendDTO saveAddFriendDTO) {
this.addFriendService = addFriendService;
this.saveAddFriendDTO = saveAddFriendDTO;
}
/**
@ -40,7 +51,7 @@ public class AddFileFriendDataListener<T> implements ReadListener<T> {
* @param context
*/
@Override
public void invoke(T data, AnalysisContext context) {
public void invoke(FileAddFriendVO data, AnalysisContext context) {
cachedDataList.add(data);
// 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM
if (cachedDataList.size() >= BATCH_COUNT) {
@ -58,7 +69,10 @@ public class AddFileFriendDataListener<T> implements ReadListener<T> {
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
if (CollUtil.isNotEmpty(cachedDataList)) {
saveData();
}
cachedDataList.clear();
log.info("所有数据解析完成!");
}
@ -67,7 +81,25 @@ public class AddFileFriendDataListener<T> implements ReadListener<T> {
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
extendService.saveBatch(cachedDataList);
Set<AddFriend> list = Sets.newHashSet();
// 随机添加微信
QueueBalance<String> balance = new QueueBalance<>();
AddFriend friend;
for (FileAddFriendVO friendVO : cachedDataList) {
String pollingWechat = balance.chooseOne(saveAddFriendDTO.getTrumpetWechatList());
List<String> toList = Splitter.on
(StrPool.COMMA).trimResults().splitToList(friendVO.getFlagArrays());
friend = new AddFriend();
friend.setLabelIds(toList);
friend.setGreet(friendVO.getGreet());
friend.setTrumpetWechat(pollingWechat);
friend.setUserId(saveAddFriendDTO.getUserId());
friend.setTaskId(saveAddFriendDTO.getTaskId());
friend.setTargetWechat(friendVO.getTargetSource());
friend.setAddStatus(DefaultNumberConstants.ZERO_NUMBER);
list.add(friend);
}
addFriendService.saveBatch(list);
log.info("存储数据库成功!");
}
}

@ -65,7 +65,7 @@ public class AddFriendController {
@DeleteMapping("/{id}")
@Operation(summary = "ID删除任务")
public R<Void> deleteByUserId(@PathVariable("id") Long taskId) {
return addFriendTaskService.del(taskId) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除失败");
public R<String> deleteByUserId(@PathVariable("id") Long taskId) {
return Boolean.TRUE.equals(addFriendTaskService.del(taskId)) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除失败");
}
}

@ -29,6 +29,14 @@ public class WeChatGroupController {
}
@GetMapping("/user/list/groupId")
@Operation(summary = "群列表")
public R<Object> queryGroupUserListByGroupId(Long groupId) {
return R.ok(weChatGroupService.queryGroupUserListByGroupId(groupId));
}
@GetMapping("/user/list")
@Operation(summary = "群成员")
public R<Object> queryGroupUserList(String wxId, String groupId) {

@ -0,0 +1,36 @@
package com.baiye.modules.scrm.controller;
import com.baiye.modules.scrm.service.WeChatLabelService;
import com.baiye.result.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @author Enzo
* @date : 2024/6/2
*/
@Tag(name = "微信好友标签")
@Slf4j
@RestController
@RequestMapping(value = "/wechat/label")
@AllArgsConstructor
public class WeChatLabelController {
private final WeChatLabelService weChatLabelService;
@PostMapping("/find")
@Operation(summary = "查询标签")
public R<Map<String, Object>> getClueRecordPage(@RequestBody List<String> wxIds) {
return R.ok(weChatLabelService.findPersonByWeChatId(wxIds));
}
}

@ -21,6 +21,9 @@ public class AddFriendDTO {
@Schema(title = "微信小号")
private String trumpetWechat;
@Schema(title = "标签ID")
private List<String> labelIds;
@Schema(title = "小号微信")
private List<String> targetWechat;
}

@ -0,0 +1,44 @@
package com.baiye.modules.scrm.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2024/6/12
*/
@Data
public class ContractDTO implements Serializable {
private Integer verifyFlag;
private Integer msgType;
private Integer chatroomVersion;
private String city;
private String nickName;
private Integer sex;
private Integer contactType;
private String remark;
private Integer type;
private String userName;
private String smallHeadImgUrl;
private String province;
private String alias;
private String bigHeadImgUrl;
private String chatRoomOwner;
}

@ -11,6 +11,11 @@ import java.util.List;
@Data
public class GroupCallbackDTO {
private String wxId;
private String extInfo;
private String nickName;
private String userName;
@ -18,12 +23,8 @@ public class GroupCallbackDTO {
private String chatRoomOwner;
private String nickName;
private String wxId;
private String bigHeadImgUrl;
private String smallHeadImgUrl;
private String chatRoomMembers;

@ -23,7 +23,7 @@ public class GroupMemberDTO {
private String userName;
private String inviteUser;
private String inviterUserName;
private String smallHeadImgUrl;

@ -0,0 +1,40 @@
package com.baiye.modules.scrm.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2024/6/12
*/
@Data
public class OtherInformationDTO implements Serializable {
private String pit;
private Integer msgId;
private Boolean manual;
private String content;
private String msgKey;
private Integer status;
private String mainWxId;
private Integer msgType;
private Integer newMsgId;
private Integer imgStatus;
private Integer delayMill;
private String toUserName;
private String fromUserName;
}

@ -0,0 +1,30 @@
package com.baiye.modules.scrm.dto;
import lombok.Builder;
import lombok.Data;
import java.util.List;
/**
* @author Enzo
* @date : 2024/6/13
*/
@Data
@Builder
public class SaveAddFriendDTO {
/**
*
*/
private List<String> trumpetWechatList;
/**
* ID
*/
private Long userId;
/**
* id
*/
private Long taskId;
}

@ -14,7 +14,11 @@ public class WeChatAddFriendDTO {
private String wechat;
private String targetWxId;
private String encrypt;
private String ticket;
private String tagetWxId;
private String helloContent;

@ -3,12 +3,14 @@ package com.baiye.modules.scrm.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2022/6/27
*/
@Data
public class WeChatFriendDTO {
public class WeChatFriendDTO implements Serializable {
@Schema(title = "机器人微信ID")
private String robotWxId;

@ -14,11 +14,12 @@ public class WeChatUserLoginDTO implements Serializable {
private String pit;
private String wxId;
private String wxid;
private String nickname;
private String bigHeadImgUrl;
private String smallHeadImgUrl;
}

@ -0,0 +1,64 @@
package com.baiye.modules.scrm.entity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baiye.validation.group.UpdateGroup;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2024/4/2
*/
@Data
@TableAlias("ar")
@TableName("tb_active_friend_record")
@Schema(title = "主动添加好友记录")
public class ActiveAddFriedRecord implements Serializable {
@TableId(type = IdType.AUTO)
@Schema(title = "ID")
@NotNull(message = "ID不能为空", groups = { UpdateGroup.class })
private Long id;
@Schema(title = "机器人微信ID")
private String robotWxId;
@Schema(title = "添加好友方式")
private Integer type;
@Schema(title = "省")
private String province;
@Schema(title = "城市")
private String city;
@Schema(title = "昵称")
private String nickName;
@Schema(title = "性别")
private Integer sex;
@Schema(title = "通过时间")
private Long addAcceptTime;
@Schema(title = "签名")
private String signature;
@Schema(title = "头像")
private String bigHeadImgUrl;
@Schema(title = "userId")
private Long userId;
@Schema(title = "用户名")
private String userName;
}

@ -1,15 +1,20 @@
package com.baiye.modules.scrm.entity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baiye.extend.mybatis.plus.converter.JsonStringArrayTypeHandler;
import com.baiye.validation.group.UpdateGroup;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @author Enzo
@ -29,7 +34,7 @@ public class AddFriend {
@NotNull(message = "ID不能为空", groups = { UpdateGroup.class })
private Long id;
@Schema(title = "任务名称")
@Schema(title = "任务id")
private Long taskId;
@Schema(title = "用户Id")
@ -38,6 +43,10 @@ public class AddFriend {
@Schema(title = "问候语句")
private String greet;
@Schema(title = "标签")
@TableField(value = "label_ids", typeHandler = JsonStringArrayTypeHandler.class)
private List<String> labelIds;
@Schema(title = "微信小号")
private String trumpetWechat;
@ -54,4 +63,19 @@ public class AddFriend {
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(title = "修改时间")
private LocalDateTime updateTime;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AddFriend addFriend = (AddFriend) o;
return Objects.equals(trumpetWechat, addFriend.trumpetWechat) && Objects.equals(targetWechat, addFriend.targetWechat);
}
@Override
public int hashCode() {
return Objects.hash(trumpetWechat, targetWechat);
}
}

@ -80,6 +80,10 @@ public class AddFriendTask extends LogicDeletedBaseEntity {
@TableField("add_frequently_end")
private Integer addFrequentlyEnd;
@Schema(title = "执行表达方程式")
@TableField("cron_expression")
private String cronExpression;
@Schema(title = "每日添加好友上限")
private Integer addFriendMax;

@ -15,7 +15,6 @@ import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
* @author Enzo
@ -34,7 +33,7 @@ public class WeChatGroup extends BaseEntity implements Serializable {
/**
* ID
*/
@TableId(type = IdType.AUTO)
@TableId(type = IdType.INPUT)
@Schema(title = "群Id")
@NotNull(message = "群Id", groups = {UpdateGroup.class})
private Long id;
@ -98,17 +97,7 @@ public class WeChatGroup extends BaseEntity implements Serializable {
@TableField("chat_room_type")
private Integer chatRoomType;
/**
* ID
*/
@TableField("corp_id")
private String corpId;
/**
*
*/
@TableField("corp_name")
private String corpName;
/**
*
@ -135,37 +124,6 @@ public class WeChatGroup extends BaseEntity implements Serializable {
@TableField("last_sync_time")
private LocalDateTime lastSyncTime;
/**
*
*/
@TableField("last_contact_time")
private Date lastContactTime;
/**
*
*/
@TableField("last_contact_customer_account")
private String lastContactCustomerAccount;
/**
*
*/
@TableField("last_contact_customer_nick")
private String lastContactCustomerNick;
/**
*
*/
@TableField(exist = false)
private String wechatNickName;
/**
*
*/
@TableField(exist = false)
private String queryKey;
}

@ -1,5 +1,6 @@
package com.baiye.modules.scrm.entity;
import com.baiye.entity.BaseEntity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baiye.validation.group.UpdateGroup;
import com.baomidou.mybatisplus.annotation.IdType;
@ -21,18 +22,20 @@ import java.util.Date;
@Getter
@Setter
@ToString
@TableName(value = "tb_group_wechat_member", autoResultMap = true)
@TableName(value = "tb_wechat_group_member", autoResultMap = true)
@Schema(title = "群成员")
@TableAlias("wm")
public class WeChatGroupMember {
public class WeChatGroupMember extends BaseEntity {
@TableId(type = IdType.AUTO)
@Schema(title = "id")
@NotNull(message = "id", groups = { UpdateGroup.class })
@NotNull(message = "id", groups = {UpdateGroup.class})
@TableField("id")
private Integer id;
private Long id;
@TableField("group_id")
private Long groupId;
@TableField("robot_type")
private Integer robotType;
@ -43,9 +46,7 @@ public class WeChatGroupMember {
@TableField("robot_account")
private String robotAccount;
/**
* ID
*/
@TableField("wechat_id")
private String wechatId;
@ -61,17 +62,7 @@ public class WeChatGroupMember {
@TableField("chat_room_nick")
private String chatRoomNick;
/**
* ID
*/
@TableField("wx_id")
private String wxId;
/**
*
*/
@TableField("wx_alias")
private String wxAlias;
/**
*
@ -79,11 +70,6 @@ public class WeChatGroupMember {
@TableField("wx_nick")
private String wxNick;
/**
*
*/
@TableField("display_name")
private String displayName;
/**
*
@ -121,11 +107,6 @@ public class WeChatGroupMember {
@TableField("flag")
private Integer flag;
/**
* ID
*/
@TableField("source_user_name")
private String sourceUserName;
/**
* 1-2-
@ -157,17 +138,6 @@ public class WeChatGroupMember {
@TableField("enable_group")
private Boolean enableGroup;
/**
*
*/
@TableField("enable_black")
private Boolean enableBlack;
/**
*
*/
@TableField("enable_white")
private Boolean enableWhite;
/**
*
@ -175,29 +145,6 @@ public class WeChatGroupMember {
@TableField("last_sync_time")
private Date lastSyncTime;
/**
*
*/
@TableField("update_md5")
private String updateMd5;
/**
*
*/
@TableField("create_by")
private String createBy;
/**
*
*/
@TableField("update_by")
private String updateBy;
/**
* 1-2-3-4-5-
*/
@TableField("wx_identity")
private String wxIdentity;
}

@ -0,0 +1,16 @@
package com.baiye.modules.scrm.mapper;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.modules.scrm.entity.ActiveAddFriedRecord;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Enzo
* @date 2024-5-31
*/
@Mapper
public interface ActiveAddFriendRecordMapper extends ExtendMapper<ActiveAddFriedRecord> {
}

@ -1,5 +1,8 @@
package com.baiye.modules.scrm.mapper;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.scrm.entity.AddFriend;
@ -14,6 +17,7 @@ import java.util.List;
@Mapper
public interface AddFriendMapper extends ExtendMapper<AddFriend> {
/**
* ID
*
@ -22,9 +26,42 @@ public interface AddFriendMapper extends ExtendMapper<AddFriend> {
* @param taskStatus
* @return
*/
default List<AddFriend> queryByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus){
return selectList(WrappersX.lambdaQueryX(AddFriend.class).eq
(AddFriend::getTaskId, taskId).eq(AddFriend::getAddStatus, taskStatus).orderByDesc(AddFriend::getId).last(" limit " + addFriendNum));
}
default List<AddFriend> queryByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus) {
return selectList(WrappersX.lambdaQueryX(AddFriend.class).eq
(AddFriend::getTaskId, taskId).eq(AddFriend::getAddStatus, taskStatus).orderByDesc(AddFriend::getId).last(" limit " + addFriendNum));
}
/**
*
*
* @param fromUserName
* @param toUserName
* @param number
* @return
*/
default AddFriend selectByFromUsernameAndToUsername(String fromUserName, String toUserName, Integer number) {
List<AddFriend> addFriendList = selectList
(WrappersX.lambdaQueryX(AddFriend.class).eq
(AddFriend::getTrumpetWechat, toUserName).eq(AddFriend::getTargetWechat, fromUserName).eq
(AddFriend::getAddStatus, number).orderByDesc(AddFriend::getId));
if (CollUtil.isNotEmpty(addFriendList)) {
return addFriendList.get(DefaultNumberConstants.ZERO_NUMBER);
}
return new AddFriend();
}
/**
*
*
* @param taskId
* @param startTime
* @param endTime
* @return
*/
default Long selectCountByTime(String taskId, DateTime startTime, DateTime endTime) {
return selectCount(WrappersX.lambdaQueryX(AddFriend.class).eq(AddFriend::getTaskId, taskId).gt(AddFriend::getCreateTime, startTime).lt(AddFriend::getCreateTime, endTime));
}
}

@ -8,6 +8,7 @@ import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.scrm.converter.AddFriendTaskConverter;
import com.baiye.modules.scrm.entity.AddFriendTask;
import com.baiye.modules.scrm.entity.WeChatAccount;
import com.baiye.modules.scrm.qo.TaskQo;
import com.baiye.modules.scrm.vo.AddFriendTaskVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -30,7 +31,8 @@ public interface AddFriendTaskMapper extends ExtendMapper<AddFriendTask> {
* @return
*/
default List<AddFriendTask> queryByStatus(Integer number) {
return selectList(WrappersX.lambdaQueryX(AddFriendTask.class).eq(AddFriendTask::getTaskStatus, number).eq(AddFriendTask::getDeleted, DefaultNumberConstants.ZERO_NUMBER));
return selectList(WrappersX.lambdaQueryX(AddFriendTask.class).eq
(AddFriendTask::getTaskStatus, number).eq(AddFriendTask::getDeleted, DefaultNumberConstants.ZERO_NUMBER));
}
@ -47,7 +49,8 @@ public interface AddFriendTaskMapper extends ExtendMapper<AddFriendTask> {
if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) {
wrapperX.between(AddFriendTask::getCreateTime, qo.getStartTime(), qo.getEndTime());
}
wrapperX.eqIfPresent(AddFriendTask::getCreateBy, qo.getUserId()).orderByDesc(AddFriendTask::getId);
wrapperX.likeIfPresent(AddFriendTask::getTaskName, qo.getTaskName())
.eqIfPresent(AddFriendTask::getCreateBy, qo.getUserId()).orderByDesc(AddFriendTask::getId);
this.selectPage(page, wrapperX);
IPage<AddFriendTaskVO> voPage = page.convert(AddFriendTaskConverter.INSTANCE::entityToVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());

@ -61,4 +61,5 @@ public interface WeChatFriendMapper extends ExtendMapper<WeChatFriedRecord> {
* @return
*/
List<StatisticsFriendVO> findEquipmentByAccountId(Long id);
}

@ -1,10 +1,15 @@
package com.baiye.modules.scrm.mapper;
import cn.hutool.core.collection.CollUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.scrm.entity.WeChatGroup;
import com.google.common.collect.Lists;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author Enzo
* @date : 2024/4/2
@ -22,4 +27,18 @@ public interface WeChatGroupMapper extends ExtendMapper<WeChatGroup> {
default Long countByUserName(String userName) {
return this.selectCount(WrappersX.lambdaQueryX(WeChatGroup.class).eq(WeChatGroup::getChatRoomId, userName));
}
/**
*
* @param userName
* @return
*/
default WeChatGroup queryByUsername(String userName){
List<WeChatGroup> weChatGroups = this.selectList(WrappersX.lambdaQueryX(WeChatGroup.class).eq(WeChatGroup::getChatRoomId, userName));
if (CollUtil.isNotEmpty(weChatGroups)){
return weChatGroups.get(DefaultNumberConstants.ZERO_NUMBER);
}
return new WeChatGroup();
}
}

@ -1,12 +1,15 @@
package com.baiye.modules.scrm.mapper;
import cn.hutool.core.convert.Convert;
import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.scrm.entity.WeChatGroupMember;
import com.baiye.modules.scrm.vo.GroupVO;
import com.baiye.modules.scrm.vo.WeChatGroupMemberVo;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.jdbc.SQL;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.stream.Collectors;
@ -23,21 +26,42 @@ public interface WeChatGroupMemberMapper extends ExtendMapper<WeChatGroupMember>
*
*
* @param userName
* @param syncedGroup
* @return
*/
default List<String> queryMemberWechatIdByChatRoomId(String userName) {
default List<String> queryMemberWechatIdByChatRoomId(String userName, Long syncedGroup) {
LambdaQueryWrapperX<WeChatGroupMember> select =
WrappersX.lambdaQueryX(WeChatGroupMember.class).eq(WeChatGroupMember::getChatRoomId, userName).select(WeChatGroupMember::getWxId);
return this.selectList(select).stream().map(WeChatGroupMember::getWxId).collect(Collectors.toList());
WrappersX.lambdaQueryX(WeChatGroupMember.class).eq(WeChatGroupMember::getChatRoomId, userName).eq
(WeChatGroupMember::getGroupId,syncedGroup).select(WeChatGroupMember::getWechatId);
return this.selectList(select).stream().map(WeChatGroupMember::getWechatId).collect(Collectors.toList());
}
/**
* id
*
* @param removeList
* @return
*/
default Boolean deleteByWeChatId(List<String> removeList){
default Boolean deleteByWeChatId(List<String> removeList) {
return SqlHelper.retBool(this.delete(WrappersX.lambdaQueryX
(WeChatGroupMember.class).in(WeChatGroupMember::getWxId, removeList)));
(WeChatGroupMember.class).in(WeChatGroupMember::getWechatId, removeList)));
}
/**
* id
* @param wxId
* @returnx
*/
List<GroupVO> queryMemberWechatIdByWxId(@Param("wxId") String wxId);
/**
* ID
* @param groupId
* @return
*/
default List<WeChatGroupMemberVo> queryGroupUserListByGroupId(Long groupId){
return Convert.toList(WeChatGroupMemberVo.class, this.selectList
(WrappersX.lambdaQueryX(WeChatGroupMember.class).eq(WeChatGroupMember::getGroupId, groupId)));
}
}

@ -18,8 +18,8 @@ public class TaskQo {
@Parameter(description = "结束时间")
private String endTime;
@Parameter(description = "用户昵称")
private String nickname;
@Parameter(description = "任务名称")
private String taskName;
@Schema(title = "用户ID")
private Long userId;

@ -0,0 +1,13 @@
package com.baiye.modules.scrm.service;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.scrm.entity.ActiveAddFriedRecord;
/**
* @author Enzo
* @date 2024-5-31
*/
public interface ActiveAddFriendService extends ExtendService<ActiveAddFriedRecord> {
}

@ -1,6 +1,8 @@
package com.baiye.modules.scrm.service;
import cn.hutool.core.date.DateTime;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.scrm.dto.OtherInformationDTO;
import com.baiye.modules.scrm.entity.AddFriend;
import java.util.List;
@ -21,4 +23,20 @@ public interface AddFriendService extends ExtendService<AddFriend> {
*/
List<AddFriend> queryAddSourceByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus);
/**
*
* de
* @param dto
* @return
*/
Boolean addFriendSuccessfully(OtherInformationDTO dto);
/**
*
* @param taskId
* @param dateTime
* @param dateTime1
* @return
*/
Long countByTaskAndDate(String taskId, DateTime dateTime, DateTime dateTime1);
}

@ -1,11 +1,10 @@
package com.baiye.modules.scrm.service;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.scrm.dto.GroupCallbackDTO;
import com.baiye.modules.scrm.dto.GroupMemberDTO;
import com.baiye.modules.scrm.entity.WeChatAccount;
import com.baiye.modules.scrm.entity.WeChatGroupMember;
import com.baiye.modules.scrm.vo.GroupVO;
import com.baiye.modules.scrm.vo.WeChatGroupMemberVo;
import java.util.List;
@ -18,17 +17,22 @@ public interface WeChatGroupMemberService extends ExtendService<WeChatGroupMembe
/**
*
*
* @param userName
* @param syncedGroup
* @return
*/
List<String> queryMemberWechatIdByChatRoomId(String userName);
List<String> queryMemberWechatIdByChatRoomId(String userName, Long syncedGroup);
/**
*
*
* @param saveMemberList
* @param groupId
* @param groupName
* @return
*/
Boolean saveMemberByDTO(List<GroupMemberDTO> saveMemberList);
Boolean saveMemberByDTO(List<GroupMemberDTO> saveMemberList, Long groupId, String groupName);
/**
*
@ -37,10 +41,20 @@ public interface WeChatGroupMemberService extends ExtendService<WeChatGroupMembe
*/
Boolean removeByWechatId(List<String> removeList);
/**
*
* @param wxId
* @return
*/
List<GroupVO> queryMemberWechatIdBy(String wxId);
List<GroupVO> queryMemberWechatIdByWxId(String wxId);
/**
* ID
* @param groupId
* @return
*/
List<WeChatGroupMemberVo> queryGroupUserListByGroupId(Long groupId);
}

@ -2,9 +2,15 @@ package com.baiye.modules.scrm.service;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.scrm.dto.GroupCallbackDTO;
import com.baiye.modules.scrm.dto.GroupMemberDTO;
import com.baiye.modules.scrm.entity.WeChatAccount;
import com.baiye.modules.scrm.entity.WeChatFriedRecord;
import com.baiye.modules.scrm.entity.WeChatGroup;
import com.baiye.modules.scrm.entity.WeChatGroupMember;
import com.baiye.modules.scrm.vo.GroupVO;
import com.baiye.modules.scrm.vo.WeChatGroupMemberVo;
import java.util.List;
/**
* @author Enzo
@ -19,7 +25,7 @@ public interface WeChatGroupService extends ExtendService<WeChatGroup> {
* @param wxId
* @return
*/
String queryInformation(String wxId);
List<GroupVO> queryInformation(String wxId);
/**
@ -37,5 +43,12 @@ public interface WeChatGroupService extends ExtendService<WeChatGroup> {
* @param dto
* @return
*/
Boolean syncGroup(WeChatAccount byWxId, GroupCallbackDTO dto);
Long syncGroup(WeChatAccount byWxId, GroupCallbackDTO dto);
/**
* ID
* @param groupId
* @return
*/
List<WeChatGroupMemberVo> queryGroupUserListByGroupId(Long groupId);
}

@ -0,0 +1,29 @@
package com.baiye.modules.scrm.service;
import java.util.List;
import java.util.Map;
/**
* @author Enzo
* @date : 2024/6/11
*/
public interface WeChatLabelService {
/**
* ID
*
* @param wxIds
* @return
*/
Map<String, Object> findPersonByWeChatId(List<String> wxIds);
/**
*
*
* @param wechatFlagList
* @param toUserName
* @param fromUserName
* @return
*/
Boolean modifyLabel(List<String> wechatFlagList, String toUserName, String fromUserName);
}

@ -3,10 +3,7 @@ package com.baiye.modules.scrm.service;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.scrm.dto.CreateCodeDTO;
import com.baiye.modules.scrm.dto.PushCodeDTO;
import com.baiye.modules.scrm.dto.WeChatAddFriendDTO;
import com.baiye.modules.scrm.dto.WeChatUserLoginDTO;
import com.baiye.modules.scrm.dto.*;
import com.baiye.modules.scrm.entity.WeChatAccount;
import com.baiye.modules.scrm.qo.AccountQo;
import com.baiye.modules.scrm.vo.AccountStatisticsVO;
@ -36,7 +33,7 @@ public interface WeChatService extends ExtendService<WeChatAccount> {
* @param weChatFriendDTO
* @return
*/
Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO);
Integer addFriend(WeChatAddFriendDTO weChatFriendDTO);
/**
*
@ -144,4 +141,21 @@ public interface WeChatService extends ExtendService<WeChatAccount> {
* @return
*/
Boolean syncAddressBook(String wxId);
/**
*
*
* @param passGreetMessage
* @param toUserName
* @param fromUserName
* @return
*/
Boolean sendTextMessage(List<String> passGreetMessage, String toUserName, String fromUserName);
/**
*
* @param wxId
* @return
*/
List<ContractDTO> getAllContact(String wxId);
}

@ -2,6 +2,7 @@ package com.baiye.modules.scrm.service;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.scrm.dto.OtherInformationDTO;
import com.baiye.modules.scrm.dto.WeChatFriendDTO;
import com.baiye.modules.scrm.dto.WeChatStatisticsDTO;
import com.baiye.modules.scrm.entity.WeChatFriedRecord;
@ -46,4 +47,6 @@ public interface WechatFriendService extends ExtendService<WeChatFriedRecord> {
* @return
*/
PageResult<AddFriendVo> statisticsFriendByUserId(WeChatStatisticsDTO statisticsDTO);
}

@ -0,0 +1,21 @@
package com.baiye.modules.scrm.service.impl;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.scrm.entity.ActiveAddFriedRecord;
import com.baiye.modules.scrm.mapper.ActiveAddFriendRecordMapper;
import com.baiye.modules.scrm.service.ActiveAddFriendService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author Enzo
* @date : 2024/6/2
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class ActiveAddFriendRecordServiceImpl extends ExtendServiceImpl<ActiveAddFriendRecordMapper, ActiveAddFriedRecord> implements ActiveAddFriendService {
}

@ -1,9 +1,18 @@
package com.baiye.modules.scrm.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.scrm.dto.OtherInformationDTO;
import com.baiye.modules.scrm.entity.AddFriend;
import com.baiye.modules.scrm.entity.AddFriendTask;
import com.baiye.modules.scrm.mapper.AddFriendMapper;
import com.baiye.modules.scrm.mapper.AddFriendTaskMapper;
import com.baiye.modules.scrm.service.AddFriendService;
import com.baiye.modules.scrm.service.WeChatLabelService;
import com.baiye.modules.scrm.service.WeChatService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -18,9 +27,40 @@ import java.util.List;
@Service
@RequiredArgsConstructor
public class AddFriendServiceImpl extends ExtendServiceImpl<AddFriendMapper, AddFriend> implements AddFriendService {
private final AddFriendTaskMapper addFriendTaskMapper;
private final WeChatLabelService weChatLabelService;
private final WeChatService weChatService;
@Override
public List<AddFriend> queryAddSourceByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus) {
return baseMapper.queryByTaskIdAndStatus(taskId, addFriendNum, taskStatus);
}
@Override
public Boolean addFriendSuccessfully(OtherInformationDTO dto) {
String fromUserName = dto.getFromUserName();
String toUserName = dto.getToUserName();
AddFriend addFriend = baseMapper.selectByFromUsernameAndToUsername(fromUserName, toUserName, DefaultNumberConstants.ONE_NUMBER);
if (ObjectUtil.isNotNull(addFriend) && ObjectUtil.isNotNull(addFriend.getId())) {
AddFriendTask friendTask = addFriendTaskMapper.selectById(addFriend.getTaskId());
if (CollUtil.isNotEmpty(addFriend.getLabelIds())) {
// 修改好友标签
weChatLabelService.modifyLabel(addFriend.getLabelIds(), toUserName, fromUserName);
}
if (CollUtil.isNotEmpty(friendTask.getPassGreetMessage())) {
weChatService.sendTextMessage(friendTask.getPassGreetMessage(), toUserName, fromUserName);
}
}
return Boolean.FALSE;
}
@Override
public Long countByTaskAndDate(String taskId, DateTime startTime, DateTime endTime) {
return baseMapper.selectCountByTime(taskId, startTime, endTime);
}
}

@ -11,22 +11,27 @@ import com.baiye.common.job.handler.ElasticJobHandler;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.exception.BadRequestException;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.listener.AddFileFriendDataListener;
import com.baiye.modules.scrm.dto.AddFriendDTO;
import com.baiye.modules.scrm.dto.CreateAddFriendTaskDTO;
import com.baiye.modules.scrm.dto.SaveAddFriendDTO;
import com.baiye.modules.scrm.entity.AddFriend;
import com.baiye.modules.scrm.entity.AddFriendTask;
import com.baiye.modules.scrm.mapper.AddFriendTaskMapper;
import com.baiye.modules.scrm.qo.TaskQo;
import com.baiye.modules.scrm.service.AddFriendService;
import com.baiye.modules.scrm.service.AddFriendTaskService;
import com.baiye.modules.scrm.vo.AddFriendTaskVO;
import com.baiye.modules.scrm.vo.AddFriendVo;
import com.baiye.schedule.handler.AddFriendJob;
import com.baiye.modules.scrm.vo.FileAddFriendVO;
import com.baiye.security.util.SecurityUtils;
import com.baiye.util.CronUtil;
import com.baiye.util.FileUtil;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@ -37,6 +42,8 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
@ -54,6 +61,8 @@ public class AddFriendTaskServiceImpl extends ExtendServiceImpl<AddFriendTaskMap
@Value("${snowflake.datacenterId}")
private int datacenterId;
private final SimpleJob addFriendTask;
private final AddFriendService addFriendService;
@ -65,30 +74,60 @@ public class AddFriendTaskServiceImpl extends ExtendServiceImpl<AddFriendTaskMap
@Transactional(rollbackFor = Exception.class)
public Boolean createTask(MultipartFile file, CreateAddFriendTaskDTO createAddFriendTaskDTO, Long currentUserId) {
DateTime date = DateUtil.date();
List<AddFriendDTO> addFriendDTOList = createAddFriendTaskDTO.getAddFriendDTOList();
// 雪花算法id
long taskId = IdUtil.getSnowflake(workerId, datacenterId).nextId();
Date beginDate =
ObjectUtil.isNotNull(createAddFriendTaskDTO.getDayStartTime()) ? createAddFriendTaskDTO.getStartTime() : DateUtil.beginOfDay(date);
ObjectUtil.isNotNull(createAddFriendTaskDTO.getDayStartTime())
? createAddFriendTaskDTO.getDayStartTime() : DateUtil.beginOfDay(date);
Date endDate =
ObjectUtil.isNotNull(createAddFriendTaskDTO.getDayEndTime()) ? createAddFriendTaskDTO.getDayEndTime() : DateUtil.endOfDay(date);
ObjectUtil.isNotNull(createAddFriendTaskDTO.getDayEndTime())
? createAddFriendTaskDTO.getDayEndTime() : DateUtil.endOfDay(date);
String generatedCronByTime = CronUtil.generateCronByTime
(beginDate, endDate, createAddFriendTaskDTO.getAddIntervalStart(), createAddFriendTaskDTO.getAddIntervalEnd());
List<String> listList = addFriendDTOList.stream().map
(AddFriendDTO::getTrumpetWechat).collect(Collectors.toList());
List<String> listList = createAddFriendTaskDTO.getAddFriendDTOList()
.stream().map(AddFriendDTO::getTrumpetWechat).collect(Collectors.toList());
// 创建任务
AddFriendTask friendTask = new AddFriendTask();
BeanUtil.copyProperties(createAddFriendTaskDTO, friendTask);
friendTask.setId(taskId);
friendTask.setExecuteWechatList(listList);
friendTask.setCronExpression(generatedCronByTime);
friendTask.setTaskStatus(DefaultNumberConstants.ONE_NUMBER);
if (this.save(friendTask)) {
// 异步方式插入批量数据
if (ObjectUtil.isNotNull(file)
&& createAddFriendTaskDTO.getAddFriendType() == DefaultNumberConstants.TWO_NUMBER) {
&& createAddFriendTaskDTO.getAddFriendType() == DefaultNumberConstants.THREE_NUMBER) {
SaveAddFriendDTO saveAddFriendDTO =
SaveAddFriendDTO.builder().trumpetWechatList(listList).taskId(taskId).userId(currentUserId).build();
// 解析 文件
File upload = FileUtil.multiToFile(file);
EasyExcelFactory.read(upload, AddFriendVo.class, new AddFileFriendDataListener<>(addFriendService));
EasyExcelFactory.read(upload, FileAddFriendVO.class, new AddFileFriendDataListener(addFriendService, saveAddFriendDTO)).build().readAll();
}
String generatedCronByTime = CronUtil.generateCronByTime(beginDate, endDate, createAddFriendTaskDTO.getAddIntervalStart(), createAddFriendTaskDTO.getAddIntervalEnd());
elasticJobHandler.addJob(createAddFriendTaskDTO.getTaskName(), generatedCronByTime, DefaultNumberConstants.ONE_NUMBER, new AddFriendJob(), String.valueOf(taskId), CharSequenceUtil.EMPTY);
if (createAddFriendTaskDTO.getAddFriendType() < DefaultNumberConstants.THREE_NUMBER){
Set<AddFriend> saveSet = Sets.newHashSet();
for (AddFriendDTO addFriendDTO : addFriendDTOList) {
List<String> targetWechat = addFriendDTO.getTargetWechat();
AddFriend friend;
for (String string : targetWechat) {
friend = new AddFriend();
friend.setTaskId(taskId);
friend.setTargetWechat(string);
friend.setUserId(currentUserId);
friend.setGreet(addFriendDTO.getGreet());
friend.setLabelIds(addFriendDTO.getLabelIds());
friend.setTrumpetWechat(addFriendDTO.getTrumpetWechat());
friend.setAddStatus(DefaultNumberConstants.ZERO_NUMBER);
saveSet.add(friend);
}
}
// 异步方式同步群成员信息
CompletableFuture.runAsync(() -> addFriendService.saveBatch(saveSet));
}
elasticJobHandler.addJob(createAddFriendTaskDTO.getTaskName(), generatedCronByTime, DefaultNumberConstants.ONE_NUMBER, addFriendTask, String.valueOf(taskId), CharSequenceUtil.EMPTY);
return Boolean.TRUE;
}
return Boolean.FALSE;
@ -129,9 +168,14 @@ public class AddFriendTaskServiceImpl extends ExtendServiceImpl<AddFriendTaskMap
public Boolean del(Long taskId) {
// 删除时任务未执行 文件记录状态回退
AddFriendTask friendTask = baseMapper.selectById(taskId);
if (ObjectUtil.isNotNull(friendTask.getTaskStatus())
&& friendTask.getTaskStatus() == DefaultNumberConstants.ONE_NUMBER) {
throw new BadRequestException("运行中的任务不能删除!");
}
if (ObjectUtil.isNotNull(friendTask) && ObjectUtil.isNotNull(friendTask.getId())) {
// 删除定时任务
elasticJobHandler.removeJob(friendTask.getTaskName());
return SqlHelper.retBool(baseMapper.deleteById(taskId));
}
return Boolean.FALSE;
}

@ -1,12 +1,13 @@
package com.baiye.modules.scrm.service.impl;
import cn.hutool.core.convert.Convert;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.scrm.dto.GroupMemberDTO;
import com.baiye.modules.scrm.entity.WeChatGroupMember;
import com.baiye.modules.scrm.mapper.WeChatGroupMemberMapper;
import com.baiye.modules.scrm.service.WeChatGroupMemberService;
import com.baiye.modules.scrm.vo.GroupVO;
import com.baiye.modules.scrm.vo.WeChatGroupMemberVo;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -24,24 +25,44 @@ import java.util.List;
public class WeChatGroupMemberServiceImpl extends ExtendServiceImpl
<WeChatGroupMemberMapper, WeChatGroupMember> implements WeChatGroupMemberService {
@Override
public List<String> queryMemberWechatIdByChatRoomId(String userName) {
return this.baseMapper.queryMemberWechatIdByChatRoomId(userName);
public List<String> queryMemberWechatIdByChatRoomId(String userName, Long syncedGroup) {
return this.baseMapper.queryMemberWechatIdByChatRoomId(userName, syncedGroup);
}
@Override
public Boolean saveMemberByDTO(List<GroupMemberDTO> saveMemberList) {
List<WeChatGroupMember> list = Convert.toList(WeChatGroupMember.class, saveMemberList);
return this.saveBatch(list);
public List<GroupVO> queryMemberWechatIdByWxId(String wxId) {
return baseMapper.queryMemberWechatIdByWxId(wxId);
}
@Override
public Boolean removeByWechatId(List<String> removeList) {
return baseMapper.deleteByWeChatId(removeList);
public List<WeChatGroupMemberVo> queryGroupUserListByGroupId(Long groupId) {
return baseMapper.queryGroupUserListByGroupId(groupId);
}
@Override
public Boolean saveMemberByDTO(List<GroupMemberDTO> saveMemberList, Long groupId, String groupName) {
WeChatGroupMember member;
List<WeChatGroupMember> saveList = Lists.newArrayList();
for (GroupMemberDTO memberDTO : saveMemberList) {
member = new WeChatGroupMember();
member.setGroupId(groupId);
member.setChatRoomId(groupName);
member.setFlag(memberDTO.getFlag());
member.setWxNick(memberDTO.getNickName());
member.setWechatId(memberDTO.getUserName());
member.setAvatar(memberDTO.getBigHeadImgUrl());
member.setAvatar132(memberDTO.getSmallHeadImgUrl());
saveList.add(member);
}
return SqlHelper.retBool(this.baseMapper.insertBatchSomeColumn(saveList));
}
@Override
public List<GroupVO> queryMemberWechatIdBy(String wxId) {
return Lists.newArrayList();
public Boolean removeByWechatId(List<String> removeList) {
return baseMapper.deleteByWeChatId(removeList);
}
}

@ -0,0 +1,66 @@
package com.baiye.modules.scrm.service.impl;
import cn.hutool.core.text.StrPool;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.url.WeChatPersonRequest;
import com.baiye.modules.scrm.service.WeChatLabelService;
import com.baiye.result.WeChatResponse;
import com.baiye.system.properties.WeChatProperties;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Enzo
* @date : 2024/6/11
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class WeChatLabelServiceImpl implements WeChatLabelService {
private final WeChatProperties weChatProperties;
@Override
public Map<String, Object> findPersonByWeChatId(List<String> wxIds) {
HashMap<String, Object> hashMap = Maps.newHashMap();
for (String wxId : wxIds) {
String globalSetting = HttpUtil.post
(weChatProperties.getRequestUrl().concat
(WeChatPersonRequest.QUERY_WECHAT_LABEL.concat(wxId)), Maps.newHashMap());
if (StringUtils.isNotBlank(globalSetting)) {
WeChatResponse weChatResponse = JSONUtil.toBean(globalSetting, WeChatResponse.class);
hashMap.put(wxId, JSONUtil.toJsonStr(weChatResponse.getData()));
}
}
return hashMap;
}
@Override
public Boolean modifyLabel(List<String> wechatFlagList, String toUserName, String fromUserName) {
String join = Joiner.on(StrPool.COMMA).skipNulls().join(wechatFlagList);
Map<String, Object> map = ImmutableMap.of("wechat", toUserName, "wxId", fromUserName, "labelId", join);
String modifyWechatLabel = HttpUtil.post
(weChatProperties.getRequestUrl().concat
(WeChatPersonRequest.MODIFY_WECHAT_LABEL), map);
if (StringUtils.isNotBlank(modifyWechatLabel)) {
WeChatResponse weChatResponse = JSONUtil.toBean(modifyWechatLabel, WeChatResponse.class);
if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
}

@ -17,18 +17,21 @@ import com.baiye.constant.enums.ResponseCode;
import com.baiye.constant.url.WeChatAccountRequest;
import com.baiye.constant.url.WeChatFriendRequest;
import com.baiye.constant.url.WeChatPersonRequest;
import com.baiye.constant.url.WeChatSendMessageRequest;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.enums.PackageEnum;
import com.baiye.exception.BadRequestException;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.scrm.dto.*;
import com.baiye.modules.scrm.entity.ActiveAddFriedRecord;
import com.baiye.modules.scrm.entity.LoginEquipment;
import com.baiye.modules.scrm.entity.WeChatAccount;
import com.baiye.modules.scrm.entity.WeChatEquipment;
import com.baiye.modules.scrm.mapper.WeChatAccountMapper;
import com.baiye.modules.scrm.mapper.WeChatEquipmentMapper;
import com.baiye.modules.scrm.qo.AccountQo;
import com.baiye.modules.scrm.service.ActiveAddFriendService;
import com.baiye.modules.scrm.service.LoginEquipmentService;
import com.baiye.modules.scrm.service.WeChatService;
import com.baiye.modules.scrm.service.WechatFriendService;
@ -59,7 +62,7 @@ import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, com.baiye.modules.scrm.entity.WeChatAccount> implements WeChatService {
public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, WeChatAccount> implements WeChatService {
@Value("${snowflake.workerId}")
@ -77,6 +80,10 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, co
private final WeChatEquipmentMapper weChatEquipmentMapper;
private final ActiveAddFriendService activeAddFriendService;
@Override
public String createQrCode(CreateCodeDTO createCodeDTO) {
Map<String, String> hashMap = Maps.newHashMap();
@ -99,18 +106,23 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, co
}
@Override
public Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO) {
String addedFriendResult = HttpUtil.post(weChatProperties.getRequestUrl().concat
(WeChatFriendRequest.ADD_FRIEND), JSONUtil.toJsonStr(weChatFriendDTO));
log.info("=============== the response as {} =============", addedFriendResult);
if (addedFriendResult.contains(ResponseCode.SUCCESS.getDesc())) {
WeChatResponse weChatResponse = JSONUtil.toBean(addedFriendResult, WeChatResponse.class);
public Integer addFriend(WeChatAddFriendDTO weChatFriendDTO) {
String addFriendResult = HttpUtil.post(weChatProperties.getRequestUrl().concat
(WeChatFriendRequest.ADD_FRIEND), BeanUtil.beanToMap(weChatFriendDTO));
log.info("=============== the response as {} =============", addFriendResult);
if (JSONUtil.isTypeJSON(addFriendResult)) {
WeChatResponse weChatResponse = JSONUtil.toBean(addFriendResult, WeChatResponse.class);
if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) {
return Boolean.TRUE;
// 添加记录
ActiveAddFriedRecord friedRecord =
JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), ActiveAddFriedRecord.class);
friedRecord.setRobotWxId(weChatFriendDTO.getWechat());
activeAddFriendService.save(friedRecord);
// 添加成功
return DefaultNumberConstants.ONE_NUMBER;
}
throw new BadRequestException(weChatResponse.getMsg());
}
return Boolean.FALSE;
return DefaultNumberConstants.TWO_NUMBER;
}
@Override
@ -162,27 +174,28 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, co
@Override
public Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status, Long userId, Long id) {
WeChatAccount byWxId = this.baseMapper.findByWxId(userLoginDTO.getWxId());
WeChatAccount byWxId = this.baseMapper.findByWxId(userLoginDTO.getWxid());
if (ObjectUtil.isNull(byWxId) || ObjectUtil.isNull(byWxId.getId())) {
Long saveId = IdUtil.getSnowflake(workerId, datacenterId).nextId();
WeChatEquipment equipment = new WeChatEquipment();
byWxId = new com.baiye.modules.scrm.entity.WeChatAccount();
byWxId = new WeChatAccount();
BeanUtil.copyProperties(userLoginDTO, byWxId);
byWxId.setHeaderUrl(userLoginDTO.getBigHeadImgUrl());
byWxId.setHeaderUrl(userLoginDTO.getSmallHeadImgUrl());
byWxId.setId(saveId);
byWxId.setUserId(userId);
equipment.setUserId(userId);
equipment.setEquipmentId(id);
equipment.setAccountId(saveId);
byWxId.setWxId(userLoginDTO.getWxid());
weChatEquipmentMapper.insert(equipment);
return this.save(byWxId);
}
BeanUtil.copyProperties(userLoginDTO, byWxId);
byWxId.setStatus(status == WechatCallbackConstant.LOGIN_SUCCESS ?
DefaultNumberConstants.ONE_NUMBER : DefaultNumberConstants.MINUS_ONE_NUMBER);
byWxId.setHeaderUrl(userLoginDTO.getBigHeadImgUrl());
byWxId.setHeaderUrl(userLoginDTO.getSmallHeadImgUrl());
byWxId.setNickname(userLoginDTO.getNickname());
byWxId.setWxId(userLoginDTO.getWxId());
byWxId.setWxId(userLoginDTO.getWxid());
byWxId.setUserId(userId);
return this.updateById(byWxId);
}
@ -339,12 +352,10 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, co
public Boolean syncAddressBook(String wxId) {
Map<String, Object> map = ImmutableMap.of("wechat", wxId,
"isSync", Boolean.FALSE, "contactType", DefaultNumberConstants.ONE_NUMBER);
String result = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatPersonRequest.SYNC_ADDRESS_BOOK), map);
if (JSONUtil.isTypeJSON(result)) {
WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class);
if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) {
return Boolean.TRUE;
}
@ -352,4 +363,34 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, co
return Boolean.FALSE;
}
@Override
public Boolean sendTextMessage(List<String> passGreetMessage, String toUserName, String fromUserName) {
for (String sendMessage : passGreetMessage) {
Map<String, Object> map = ImmutableMap.of("wechat", toUserName,
"content", sendMessage, "tagetWxId", fromUserName);
String result = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatSendMessageRequest.SEND_TEXT_MESSAGE), map);
if (JSONUtil.isTypeJSON(result)) {
WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class);
if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) {
return Boolean.TRUE;
}
}
}
return Boolean.FALSE;
}
@Override
public List<ContractDTO> getAllContact(String wxId) {
// 获取群信息
Map<String, Object> map = ImmutableMap.of
("wechat", wxId, "contactType", DefaultNumberConstants.ONE_NUMBER, "isSync", Boolean.TRUE);
String result = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatAccountRequest.CONTACT_CONVERSATION), map);
if (StringUtils.isNotBlank(result) && JSONUtil.isTypeJSON(result)) {
WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class);
return JSONUtil.toList(JSONUtil.toJsonStr(weChatResponse.getData()), ContractDTO.class);
}
return Lists.newArrayList();
}
}

@ -4,11 +4,9 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.GroupConstant;
import com.baiye.constant.WechatCallbackConstant;
import com.baiye.modules.scrm.dto.GroupCallbackDTO;
import com.baiye.modules.scrm.dto.GroupMemberDTO;
import com.baiye.modules.scrm.dto.WeChatFriendDTO;
import com.baiye.modules.scrm.dto.WeChatUserLoginDTO;
import com.baiye.modules.scrm.dto.*;
import com.baiye.modules.scrm.entity.LoginEquipment;
import com.baiye.modules.scrm.entity.WeChatAccount;
import com.baiye.modules.scrm.service.*;
@ -19,11 +17,16 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
@ -40,6 +43,7 @@ public class WechatCallbackServiceImpl implements WechatCallbackService {
private final ApplicationContext publisher;
private final AddFriendService addFriendService;
private final WeChatGroupService weChatGroupService;
@ -64,63 +68,94 @@ public class WechatCallbackServiceImpl implements WechatCallbackService {
case WechatCallbackConstant.THROUGH_FRIENDS:
viaFriendRequest(weChatResponse);
break;
case WechatCallbackConstant.GROUP_ADDRESS:
syncGroupMember(weChatResponse);
String jsonStr = JSONUtil.toJsonStr(weChatResponse.getData());
if (JSONUtil.isTypeJSON(jsonStr)) {
List<GroupCallbackDTO> groupList = JSONUtil.toList(jsonStr, GroupCallbackDTO.class);
if (CollUtil.isNotEmpty(groupList)) {
// 保存群数据
syncGroupMember(weChatResponse.getWxId(), groupList);
}
}
break;
case WechatCallbackConstant.OTHER_MSG:
processingOtherInformation(weChatResponse);
break;
case WechatCallbackConstant.SYNCHRONOUS_ADDRESS_BOOK_RESULT:
synchronousAddressByResponse(weChatResponse);
break;
default:
}
}
private void syncGroupMember(WeChatResponse weChatResponse) {
private void processingOtherInformation(WeChatResponse weChatResponse) {
if (!JSONUtil.isTypeJSON(JSONUtil.toJsonStr(weChatResponse.getData()))) {
return;
}
List<GroupCallbackDTO> groupList = JSONUtil.toList
(JSONUtil.toJsonStr(weChatResponse.getData()), GroupCallbackDTO.class);
if (CollUtil.isEmpty(groupList)) {
return;
OtherInformationDTO dto = JSONUtil.toBean
(JSONUtil.toJsonStr(weChatResponse.getData()), OtherInformationDTO.class);
Integer msgType = dto.getMsgType();
switch (msgType) {
case 100013: {
// 处理成功之后请求
addFriendService.addFriendSuccessfully(dto);
break;
}
case 10000: {
break;
}
default:
break;
}
WeChatAccount byWxId = weChatService.findByWxId(weChatResponse.getWxId());
for (GroupCallbackDTO dto : groupList) {
// 插入群
weChatGroupService.syncGroup(byWxId, dto);
// 群存在会员id
List<String> stringList =
weChatGroupMemberService.queryMemberWechatIdByChatRoomId(dto.getUserName());
// 同步群成员
Map<String, GroupMemberDTO> dtoMap =
dto.getChatRoomMemberDetail().stream().collect(Collectors.toMap(GroupMemberDTO::getUserName, account -> account));
// 回调返回的
Set<String> callBackSet
= dto.getChatRoomMemberDetail().stream().map(GroupMemberDTO::getUserName).collect(Collectors.toSet());
Set<String> newHashSet = Sets.newHashSet(stringList);
// 删除已经存在数据
dtoMap.keySet().removeIf(stringList::contains);
// 只保存剩余value值
List<GroupMemberDTO> saveMemberList = dtoMap.values().
stream().collect(Collectors.toList());
weChatGroupMemberService.saveMemberByDTO(saveMemberList);
}
// 不存在
List<String> removeList = Lists.newArrayList(Sets.difference(newHashSet, callBackSet));
if (CollUtil.isNotEmpty(removeList)) {
weChatGroupMemberService.removeByWechatId(removeList);
private void syncGroupMember(String wxId, List<GroupCallbackDTO> groupCallbackDTOList) {
WeChatAccount byWxId = weChatService.findByWxId(wxId);
if (ObjectUtil.isNotNull(byWxId) && ObjectUtil.isNotNull(byWxId.getId())) {
for (GroupCallbackDTO dto : groupCallbackDTOList) {
Long syncedGroup = weChatGroupService.syncGroup(byWxId, dto);
// 插入群
if (syncedGroup > DefaultNumberConstants.ZERO_NUMBER
&& StringUtils.isNotBlank(dto.getExtInfo())) {
// 设置群
dto.setChatRoomMemberDetail(JSONUtil.toList(dto.getExtInfo(), GroupMemberDTO.class));
// 群存在会员id
List<String> stringList =
weChatGroupMemberService.queryMemberWechatIdByChatRoomId(dto.getUserName(), syncedGroup);
// 同步群成员
Map<String, GroupMemberDTO> dtoMap =
dto.getChatRoomMemberDetail().stream().collect(Collectors.toMap(GroupMemberDTO::getUserName, account -> account));
// 回调返回的
Set<String> callBackSet
= dto.getChatRoomMemberDetail().stream().map(GroupMemberDTO::getUserName).collect(Collectors.toSet());
Set<String> newHashSet = Sets.newHashSet(stringList);
// 删除已经存在数据
dtoMap.keySet().removeIf(stringList::contains);
// 只保存剩余value值
List<GroupMemberDTO> saveMemberList = Lists.newArrayList(dtoMap.values());
if (CollUtil.isNotEmpty(saveMemberList)) {
weChatGroupMemberService.saveMemberByDTO(saveMemberList, syncedGroup, dto.getUserName());
}
// 退出群
List<String> removeList = Lists.newArrayList(Sets.difference(newHashSet, callBackSet));
if (CollUtil.isNotEmpty(removeList)) {
weChatGroupMemberService.removeByWechatId(removeList);
}
}
}
}
}
public void wechatLogin(WeChatResponse weChatResponse) {
WeChatUserLoginDTO userLoginDTO =
JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatUserLoginDTO.class);
@ -136,7 +171,8 @@ public class WechatCallbackServiceImpl implements WechatCallbackService {
log.info("============ send message {} ==============", JSONUtil.toJsonStr(notifyInfo));
// 发送消息
publisher.publishEvent(new StationNotifyPushEvent(notifyInfo, Collections.singletonList(robot.getUserId())));
// 同步通讯录
weChatService.syncAddressBook(userLoginDTO.getWxid());
}
}
@ -146,4 +182,20 @@ public class WechatCallbackServiceImpl implements WechatCallbackService {
JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatFriendDTO.class);
wechatFriendService.addFriendByResponse(weChatFriendDTO);
}
private void synchronousAddressByResponse(WeChatResponse weChatResponse) {
// TODO 保存通讯录
List<ContractDTO> allContact =
weChatService.getAllContact(weChatResponse.getWxId());
for (ContractDTO contractDTO : allContact) {
// 判断是否群聊
if (contractDTO.getUserName().endsWith(GroupConstant.CHAT_ROOM_FLAG)) {
String groupJson
= weChatGroupService.queryGroupUserList(weChatResponse.getWxId(), contractDTO.getUserName());
List<GroupCallbackDTO> groupCallbackDTOList = JSONUtil.toList(groupJson, GroupCallbackDTO.class);
// 异步方式同步群成员信息
CompletableFuture.runAsync(() -> syncGroupMember(weChatResponse.getWxId(), groupCallbackDTOList));
}
}
}
}

@ -128,6 +128,8 @@ public class WechatFriendServiceImpl extends ExtendServiceImpl
return new PageResult<>(addFriendVos, addFriendVos.size());
}
@Override
public Long queryByUserId(Long currentUserId) {
return this.baseMapper.queryByUserId(currentUserId);

@ -1,6 +1,8 @@
package com.baiye.modules.scrm.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
@ -9,15 +11,19 @@ import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.scrm.dto.GroupCallbackDTO;
import com.baiye.modules.scrm.entity.WeChatAccount;
import com.baiye.modules.scrm.entity.WeChatGroup;
import com.baiye.modules.scrm.entity.WeChatGroupMember;
import com.baiye.modules.scrm.mapper.WeChatGroupMapper;
import com.baiye.modules.scrm.service.WeChatGroupMemberService;
import com.baiye.modules.scrm.service.WeChatGroupService;
import com.baiye.modules.scrm.vo.GroupVO;
import com.baiye.modules.scrm.vo.WeChatGroupMemberVo;
import com.baiye.result.WeChatResponse;
import com.baiye.system.properties.WeChatProperties;
import com.google.common.collect.ImmutableMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
@ -37,29 +43,24 @@ public class WechatGroupServiceImpl extends ExtendServiceImpl
private final WeChatGroupMemberService weChatGroupMemberService;
@Override
public String queryInformation(String wxId) {
Map<String, Object> map = ImmutableMap.of
("wechat", wxId, "contactType", DefaultNumberConstants.FIVE_NUMBER, "isSync", Boolean.TRUE);
@Value("${snowflake.workerId}")
private int workerId;
String getQrCodeResult = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatGroupRequest.GROUP_CONVERSATION), map);
if (StringUtils.isNotBlank(getQrCodeResult)) {
WeChatResponse weChatResponse = JSONUtil.toBean(getQrCodeResult, WeChatResponse.class);
List<GroupCallbackDTO> dtoList = JSONUtil.toList(JSONUtil.toJsonStr(weChatResponse.getData()), GroupCallbackDTO.class);
@Value("${snowflake.datacenterId}")
private int datacenterId;
}
return CharSequenceUtil.EMPTY;
@Override
public List<GroupVO> queryInformation(String wxId) {
return weChatGroupMemberService.queryMemberWechatIdByWxId(wxId);
}
@Override
public String queryGroupUserList(String wxId, String groupId) {
Map<String, Object> map = ImmutableMap.of("wechat", wxId,
"groupid", groupId, "detail", Boolean.TRUE, "sync", Boolean.TRUE);
String userListResult = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatGroupRequest.GROUP_INFO), map);
if (StringUtils.isNotBlank(userListResult)) {
@ -70,19 +71,37 @@ public class WechatGroupServiceImpl extends ExtendServiceImpl
}
@Override
public Boolean syncGroup(WeChatAccount byWxId, GroupCallbackDTO dto) {
if (this.baseMapper.countByUserName(dto.getUserName())
== DefaultNumberConstants.ZERO_NUMBER) {
WeChatGroup weChatGroup = new WeChatGroup();
weChatGroup.setUserId(byWxId.getUserId());
weChatGroup.setWechatId(byWxId.getWxId());
weChatGroup.setChatRoomId(dto.getUserName());
public Long syncGroup(WeChatAccount byWxId, GroupCallbackDTO dto) {
if (StringUtils.isNotBlank(dto.getNickName())) {
WeChatGroup weChatGroup = this.baseMapper.queryByUsername(dto.getUserName());
if (ObjectUtil.isNull(weChatGroup) || ObjectUtil.isNull(weChatGroup.getId())) {
// 雪花算法id
long groupId = IdUtil.getSnowflake(workerId, datacenterId).nextId();
weChatGroup = new WeChatGroup();
weChatGroup.setId(groupId);
weChatGroup.setUserId(byWxId.getUserId());
weChatGroup.setWechatId(byWxId.getWxId());
weChatGroup.setChatRoomId(dto.getUserName());
weChatGroup.setChatRoomNick(dto.getNickName());
weChatGroup.setChatRoomIcon
(StringUtils.isEmpty(dto.getBigHeadImgUrl()) ? dto.getSmallHeadImgUrl() : dto.getBigHeadImgUrl());
weChatGroup.setChatRoomOwner(dto.getChatRoomOwner());
this.save(weChatGroup);
return groupId;
}
weChatGroup.setChatRoomNick(dto.getNickName());
weChatGroup.setChatRoomIcon
(StringUtils.isEmpty(dto.getBigHeadImgUrl()) ? dto.getSmallHeadImgUrl() : dto.getBigHeadImgUrl());
weChatGroup.setChatRoomOwner(dto.getChatRoomOwner());
return this.save(weChatGroup);
this.updateById(weChatGroup);
return weChatGroup.getId();
}
return Boolean.FALSE;
return (long) DefaultNumberConstants.ZERO_NUMBER;
}
@Override
public List<WeChatGroupMemberVo> queryGroupUserListByGroupId(Long groupId) {
return weChatGroupMemberService.queryGroupUserListByGroupId(groupId);
}
}

@ -9,7 +9,26 @@ import lombok.Data;
@Data
public class GroupVO {
private Long groupId;
private Integer sex;
private Integer type;
private String userName;
private String nickName;
private Integer msgType;
private Integer verifyFlag;
private Integer contactType;
private String chatRoomOwner;
private String smallHeadImgUrl;
private Integer chatroomVersion;
}

@ -0,0 +1,144 @@
package com.baiye.modules.scrm.vo;
import com.baiye.entity.BaseEntity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baiye.validation.group.UpdateGroup;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @author Enzo
* @date : 2024/6/7
*/
@Getter
@Setter
@ToString
public class WeChatGroupMemberVo extends BaseEntity {
@TableField("group_id")
private Long groupId;
@TableField("robot_type")
private Integer robotType;
/**
* ID
*/
@TableField("robot_account")
private String robotAccount;
@TableField("wechat_id")
private String wechatId;
/**
* ID
*/
@TableField("chat_room_id")
private String chatRoomId;
/**
*
*/
@TableField("chat_room_nick")
private String chatRoomNick;
/**
*
*/
@TableField("wx_nick")
private String wxNick;
/**
*
*/
@TableField("province")
private String province;
/**
*
*/
@TableField("city")
private String city;
/**
* 0- 1 2
*/
@TableField("gender")
private Integer gender;
/**
* url
*/
@TableField("avatar")
private String avatar;
/**
* url
*/
@TableField("avatar_132")
private String avatar132;
/**
*
*/
@TableField("flag")
private Integer flag;
/**
* 1-2-
*/
@TableField("group_entry_mode")
private Integer groupEntryMode;
/**
*
*/
@TableField("corp_name")
private String corpName;
/**
*
*/
@TableField("chat_room_owner_enable")
private Boolean chatRoomOwnerEnable;
/**
*
*/
@TableField("wx_group_admin")
private Boolean wxGroupAdmin;
/**
*
*/
@TableField("enable_group")
private Boolean enableGroup;
/**
*
*/
@TableField("last_sync_time")
private Date lastSyncTime;
}

@ -3,23 +3,21 @@ package com.baiye.schedule.handler;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.common.job.handler.ElasticJobHandler;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.modules.scrm.dto.WeChatAddFriendDTO;
import com.baiye.modules.scrm.entity.AddFriend;
import com.baiye.modules.scrm.entity.AddFriendTask;
import com.baiye.modules.scrm.mapper.AddFriendTaskMapper;
import com.baiye.modules.scrm.service.AddFriendService;
import com.baiye.modules.scrm.service.AddFriendTaskService;
import com.baiye.security.userdetails.User;
import com.baiye.modules.scrm.service.WeChatService;
import com.baiye.util.CronUtil;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@ -29,52 +27,58 @@ import java.util.List;
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class AddFriendJob implements SimpleJob {
@Resource
private AddFriendTaskService addFriendTaskService;
@Resource
private AddFriendService addFriendService;
private final AddFriendTaskMapper addFriendTaskMapper;
private final ElasticJobHandler elasticJobHandler;
private final AddFriendService addFriendService;
private final WeChatService weChatService;
/**
*
*
*
* @param shardingContext
*/
@Override
public void execute(ShardingContext shardingContext) {
Date now = new Date();
Date now = DateUtil.date();
log.info("{}定时添加好友start...", DateUtil.format(now, DatePattern.NORM_DATETIME_MS_PATTERN));
String jobName = shardingContext.getJobName();
String taskId = shardingContext.getJobParameter();
AddFriendTask byTaskId = addFriendTaskService.findByTaskId(Long.parseLong(taskId));
if (ObjectUtil.isNotNull(byTaskId) && ObjectUtil.isNotNull(byTaskId.getId())) {
// 判断是否过期
if (byTaskId.getStartTime().after(now) || byTaskId.getEndTime().before(now)) {
byTaskId.setTaskStatus(DefaultNumberConstants.MINUS_ONE_NUMBER);
addFriendTaskService.updateById(byTaskId);
return;
}
// 查询资源
/*List<AddFriend> addFriendList = addFriendService.queryAddSourceByTaskIdAndStatus(taskId, byTaskId.getAddFriendNum(), DefaultNumberConstants.ONE_NUMBER);
for (AddFriend addFriend : addFriendList) {
String jobName = shardingContext.getJobName();
if (ObjectUtil.isNotNull(taskId)) {
AddFriendTask byTaskId = addFriendTaskMapper.selectById(Long.parseLong(taskId));
if (ObjectUtil.isNotNull(byTaskId) && ObjectUtil.isNotNull(byTaskId.getId())) {
// 判断是否过期
if (byTaskId.getEndTime().before(now)) {
byTaskId.setTaskStatus(DefaultNumberConstants.MINUS_ONE_NUMBER);
addFriendTaskMapper.updateById(byTaskId);
return;
}
Long countByDate = addFriendService.countByTaskAndDate(taskId, DateUtil.beginOfDay(now), DateUtil.endOfDay(now));
// 添加好友
WeChatAddFriendDTO addFriendDTO = WeChatAddFriendDTO.builder().wechat
(addFriend.getTrumpetWechat()).targetWxId(addFriend.getTargetWechat()).helloContent
(addFriend.getGreet()).type(addFriend.getTargetWechat().length() == DefaultNumberConstants.ELEVEN_NUMBER ?
DefaultNumberConstants.ZERO_NUMBER : DefaultNumberConstants.ONE_NUMBER).build();
long dayLimit = byTaskId.getAddFriendMax() - countByDate;
if (dayLimit > DefaultNumberConstants.ZERO_NUMBER) {
// 查询资源
List<AddFriend> addFriendList = addFriendService.queryAddSourceByTaskIdAndStatus(taskId, DefaultNumberConstants.ONE_NUMBER, DefaultNumberConstants.ZERO_NUMBER);
HttpUtil.post("", JSONUtil.toJsonStr(addFriendDTO));
if (Boolean.TRUE){
addFriend.setAddStatus(DefaultNumberConstants.ONE_NUMBER);
addFriendService.updateById(addFriend);
for (AddFriend addFriend : addFriendList) {
// 添加好友
WeChatAddFriendDTO addFriendDTO = WeChatAddFriendDTO.builder().wechat
(addFriend.getTrumpetWechat()).tagetWxId(addFriend.getTargetWechat()).helloContent
(addFriend.getGreet()).type(addFriend.getTargetWechat().length() == DefaultNumberConstants.ELEVEN_NUMBER ?
DefaultNumberConstants.ZERO_NUMBER : DefaultNumberConstants.ONE_NUMBER).build();
Integer addedFriend = weChatService.addFriend(addFriendDTO);
addFriend.setAddStatus(addedFriend);
addFriendService.updateById(addFriend);
}
}
}
}*/
log.info("{}定时添加好友end...", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
}
log.info("{}定时添加好友end...", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
}
}

@ -1,21 +1,19 @@
package com.baiye.schedule.handler;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.common.job.handler.ElasticJobHandler;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.modules.scrm.entity.AddFriendTask;
import com.baiye.modules.scrm.service.AddFriendService;
import com.baiye.modules.scrm.service.AddFriendTaskService;
import com.baiye.schedule.entity.JobDynamicTask;
import com.baiye.schedule.service.ElasticJobService;
import com.baiye.util.CronUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Enzo
@ -24,10 +22,12 @@ import java.util.stream.Collectors;
@Slf4j
@Service
public class ScanDynamicJobHandler {
@Resource
private ElasticJobHandler elasticJobHandler;
private AddFriendJob addFriendJob;
@Resource
private ElasticJobService elasticJobService;
private ElasticJobHandler elasticJobHandler;
@Resource
private AddFriendTaskService addFriendTaskService;
@ -43,16 +43,16 @@ public class ScanDynamicJobHandler {
public void scanAddJob() {
// 这里为从MySQL数据库读取job_dynamic_task表的数据
// 微服务项目中建议使用feign从业务服务获取避免本服务过度依赖业务的问题然后业务服务新增动态任务也通过feign调取本服务JobOperateController实现从而相对独立本服务模块
List<AddFriendTask> addFriendTaskList = addFriendTaskService.queryTaskAndStatus(DefaultNumberConstants.ONE_NUMBER);
List<AddFriendTask> addFriendTaskList = addFriendTaskService.queryTaskAndStatus(DefaultNumberConstants.ONE_NUMBER);
log.info("扫描动态任务列表,并添加任务:本次共扫描到{}条任务。", addFriendTaskList.size());
for (AddFriendTask addFriendTask : addFriendTaskList) {
String generatedCronByTime = CronUtil.generateCronByTime
(addFriendTask.getDayStartTime(), addFriendTask.getDayEndTime(),
addFriendTask.getAddIntervalStart(), addFriendTask.getAddIntervalEnd());
if (StringUtils.isNotBlank(addFriendTask.getCronExpression())) {
// 创建任务
elasticJobHandler.addJob(addFriendTask.getTaskName(), addFriendTask.getCronExpression(),
DefaultNumberConstants.ONE_NUMBER, addFriendJob, String.valueOf(addFriendTask.getId()), CharSequenceUtil.EMPTY);
}
// 创建任务
elasticJobHandler.addJob(addFriendTask.getTaskName(), generatedCronByTime, DefaultNumberConstants.ONE_NUMBER, new AddFriendJob(),String.valueOf(addFriendTask.getId()), CharSequenceUtil.EMPTY);
}
}
}

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.modules.scrm.mapper.AddFriendMapper">
<sql id="Base_Alias_Column_List">
af.id,
af.task_id,
af.user_id,
af.greet,
af.label_ids,
af.trumpet_wechat,
af.target_wechat,
af.add_status,
af.create_time,
af.update_time
</sql>
<select id="selectListByTaskId" resultType="com.baiye.modules.scrm.entity.AddFriend">
SELECT
<include refid="Base_Alias_Column_List"/>
FROM
tb_add_friend af
where task_id = #{taskId,jdbcType=VARCHAR} and add_status = #{taskStatus,jdbcType=INTEGER} limit #{addFriendNum,jdbcType=INTEGER}
</select>
</mapper>

@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.modules.scrm.mapper.LoginEquipmentMapper">
<sql id="Base_Alias_Column_List">
wa.username,
wa.username,
wa.nickname,
wa.city_info,
wa.login_type,
@ -12,8 +12,8 @@
wa.status,
wa.we_chat_no,
wa.remark,
wa.create_time,
wa.update_time,
le.create_time,
le.update_time,
wa.user_id,
le.id,
le.pit,

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.modules.scrm.mapper.WeChatGroupMemberMapper">
<select id="queryMemberWechatIdByWxId" resultType="com.baiye.modules.scrm.vo.GroupVO">
SELECT
g.id as groupId,
g.chat_room_nick AS nickName,
g.chat_room_owner,
g.chat_room_id AS userName,
g.chat_room_icon
FROM
tb_wechat_group g,
tb_wechat_group_member m
WHERE
m.chat_room_id = g.chat_room_id
AND m.wechat_id = #{wxId,jdbcType=VARCHAR}
</select>
</mapper>

@ -0,0 +1,59 @@
import cn.hutool.core.text.CharSequenceUtil;
import com.baiye.AdminApplication;
import com.baiye.common.job.handler.ElasticJobHandler;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.modules.scrm.dto.WeChatAddFriendDTO;
import com.baiye.modules.scrm.mapper.AddFriendMapper;
import com.baiye.modules.scrm.service.WeChatService;
import com.baiye.schedule.handler.AddFriendJob;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* @author Enzo
* @date : 2022/9/16
*/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdminApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AddFriendTest {
@Resource
private AddFriendMapper addFriendMapper;
@Resource
WeChatService weChatService;
@Resource
ElasticJobHandler elasticJobHandler;
@Resource
AddFriendJob addFriendJob;
@Test
public void getSetting() {
WeChatAddFriendDTO build = WeChatAddFriendDTO.builder().wechat
("wxid_mhm4bqgb9gpg21").helloContent("111").tagetWxId("13586541001").type(0).build();
weChatService.addFriend(build);
}
@Test
public void addJob() {
// 创建任务
elasticJobHandler.addJob("测试任务", "0 0/10-30 9-17 * * ?",
DefaultNumberConstants.ONE_NUMBER, addFriendJob, "1l", CharSequenceUtil.EMPTY);
}
}

@ -0,0 +1,22 @@
import com.alibaba.excel.EasyExcel;
import com.baiye.listener.AddFileFriendDataListener;
import com.baiye.modules.scrm.service.AddFriendService;
import com.baiye.modules.scrm.vo.FileAddFriendVO;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author Enzo
* @date : 2024/6/13
*/
@Slf4j
@SpringBootTest
public class FileTest {
private AddFriendService addFriendService;
@Test
public void fileTest(){
}
}

@ -44,10 +44,27 @@ public class WechatCallbackConstant {
public static final int LOGIN_OUT = 210;
/**
*
*/
public static final int SYNCHRONOUS_ADDRESS_BOOK_RESULT = 251;
/**
*
*/
public static final int OTHER_MSG = 242;
/**
*
*/
public static final int THROUGH_FRIENDS = 1003;
/**
*
*/
public static final int MESSAGE_THROUGH_FRIEND = 100013;
}

@ -63,7 +63,10 @@ public interface WeChatAccountRequest {
String WE_CHAT_ADD_FRIEND = "/api/add-now-friend-phone/";
/**
*
*/
String CONTACT_CONVERSATION = "/wechat/v1/getAllContact";
}

@ -18,10 +18,7 @@ public interface WeChatGroupRequest {
String GROUP_INFO = "/wechat/v1/chatroominfo";
/**
*
*/
String GROUP_CONVERSATION = "/wechat/v1/getAllContact";
}

@ -29,6 +29,11 @@ public interface WeChatPersonRequest {
*/
String MODIFY_WECHAT_LABEL = "/wechat/v1/modifyLabel";
/**
*
*/
String QUERY_WECHAT_LABEL = "/wechat/v1/getLabelList?wechat=";
}

@ -0,0 +1,40 @@
package com.baiye.constant.url;
/**
* @author Enzo
* @date : 2024/6/12
*/
public interface WeChatSendMessageRequest {
/**
*
*/
String SEND_TEXT_MESSAGE = "/wechat/v1/sendtext";
/**
*
*/
String SEND_PICTURE_MESSAGE = "/wechat/v1/sendurlpic";
/**
*
*/
String SEND_APPLET_MESSAGE = "/wechat/v1/sendAppMsg";
/**
*
*/
String SEND_VIDEO_MESSAGE = "/wechat/v1/sendVideo";
/**
*
*/
String CANCEL_MESSAGE = "/wechat/v1/revokeMsg";
}

@ -36,5 +36,10 @@
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,33 @@
package com.baiye.result;
import com.google.gson.annotations.SerializedName;
import com.sun.xml.internal.ws.developer.Serialization;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.util.Map;
/**
* @author Enzo
* @date : 2024/6/14
*/
@Getter
@Setter
@ToString
public abstract class BaseResponse implements Serializable {
@SerializedName("msg")
private String msg;
@SerializedName("wxId")
private String wxId;
@SerializedName("status")
private Integer status;
@SerializedName("success")
private Boolean success;
}
Loading…
Cancel
Save