From ef95d082008b1fd34b44155b56f56bea11662be2 Mon Sep 17 00:00:00 2001 From: bynt <13586541001@163.com> Date: Fri, 14 Jun 2024 19:29:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A5=BD=E5=8F=8B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../captcha/impl/ValidateCodeServiceImpl.java | 66 ++++---- .../com/baiye/constant/GroupConstant.java | 12 ++ .../baiye/event/system/RootApplication.java | 2 +- .../listener/AddFileFriendDataListener.java | 56 +++++-- .../scrm/controller/AddFriendController.java | 4 +- .../controller/WeChatGroupController.java | 8 + .../controller/WeChatLabelController.java | 36 +++++ .../baiye/modules/scrm/dto/AddFriendDTO.java | 3 + .../baiye/modules/scrm/dto/ContractDTO.java | 44 ++++++ .../modules/scrm/dto/GroupCallbackDTO.java | 11 +- .../modules/scrm/dto/GroupMemberDTO.java | 2 +- .../modules/scrm/dto/OtherInformationDTO.java | 40 +++++ .../modules/scrm/dto/SaveAddFriendDTO.java | 30 ++++ .../modules/scrm/dto/WeChatAddFriendDTO.java | 6 +- .../modules/scrm/dto/WeChatFriendDTO.java | 4 +- .../modules/scrm/dto/WeChatUserLoginDTO.java | 5 +- .../scrm/entity/ActiveAddFriedRecord.java | 64 ++++++++ .../baiye/modules/scrm/entity/AddFriend.java | 26 +++- .../modules/scrm/entity/AddFriendTask.java | 4 + .../modules/scrm/entity/WeChatGroup.java | 44 +----- .../scrm/entity/WeChatGroupMember.java | 69 +-------- .../mapper/ActiveAddFriendRecordMapper.java | 16 ++ .../modules/scrm/mapper/AddFriendMapper.java | 45 +++++- .../scrm/mapper/AddFriendTaskMapper.java | 7 +- .../scrm/mapper/WeChatFriendMapper.java | 1 + .../scrm/mapper/WeChatGroupMapper.java | 19 +++ .../scrm/mapper/WeChatGroupMemberMapper.java | 36 ++++- .../com/baiye/modules/scrm/qo/TaskQo.java | 4 +- .../scrm/service/ActiveAddFriendService.java | 13 ++ .../scrm/service/AddFriendService.java | 18 +++ .../service/WeChatGroupMemberService.java | 24 ++- .../scrm/service/WeChatGroupService.java | 17 ++- .../scrm/service/WeChatLabelService.java | 29 ++++ .../modules/scrm/service/WeChatService.java | 24 ++- .../scrm/service/WechatFriendService.java | 3 + .../ActiveAddFriendRecordServiceImpl.java | 21 +++ .../service/impl/AddFriendServiceImpl.java | 40 +++++ .../impl/AddFriendTaskServiceImpl.java | 64 ++++++-- .../impl/WeChatGroupMemberServiceImpl.java | 41 +++-- .../service/impl/WeChatLabelServiceImpl.java | 66 ++++++++ .../scrm/service/impl/WeChatServiceImpl.java | 75 ++++++--- .../impl/WechatCallbackServiceImpl.java | 142 +++++++++++------ .../service/impl/WechatFriendServiceImpl.java | 2 + .../service/impl/WechatGroupServiceImpl.java | 63 +++++--- .../com/baiye/modules/scrm/vo/GroupVO.java | 19 +++ .../modules/scrm/vo/WeChatGroupMemberVo.java | 144 ++++++++++++++++++ .../baiye/schedule/handler/AddFriendJob.java | 78 +++++----- .../handler/ScanDynamicJobHandler.java | 24 +-- .../main/resources/mapper/AddFriendMapper.xml | 24 +++ .../resources/mapper/LoginEquipmentMapper.xml | 6 +- .../mapper/WeChatGroupMemberMapper.xml | 19 +++ admin/src/test/java/AddFriendTest.java | 59 +++++++ admin/src/test/java/FileTest.java | 22 +++ .../constant/WechatCallbackConstant.java | 17 +++ .../constant/url/WeChatAccountRequest.java | 5 +- .../constant/url/WeChatGroupRequest.java | 5 +- .../constant/url/WeChatPersonRequest.java | 5 + .../url/WeChatSendMessageRequest.java | 40 +++++ marketing-scrm-common/common-model/pom.xml | 5 + .../java/com/baiye/result/BaseResponse.java | 33 ++++ 60 files changed, 1461 insertions(+), 350 deletions(-) create mode 100644 admin/src/main/java/com/baiye/constant/GroupConstant.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/controller/WeChatLabelController.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/ContractDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/OtherInformationDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/SaveAddFriendDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/entity/ActiveAddFriedRecord.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/mapper/ActiveAddFriendRecordMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/ActiveAddFriendService.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/WeChatLabelService.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/impl/ActiveAddFriendRecordServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatLabelServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/vo/WeChatGroupMemberVo.java create mode 100644 admin/src/main/resources/mapper/AddFriendMapper.xml create mode 100644 admin/src/main/resources/mapper/WeChatGroupMemberMapper.xml create mode 100644 admin/src/test/java/AddFriendTest.java create mode 100644 admin/src/test/java/FileTest.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatSendMessageRequest.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/result/BaseResponse.java diff --git a/admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java b/admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java index 7a8f78c..54ae188 100644 --- a/admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java +++ b/admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java @@ -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 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 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 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 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("验证码错误"); + } + } } diff --git a/admin/src/main/java/com/baiye/constant/GroupConstant.java b/admin/src/main/java/com/baiye/constant/GroupConstant.java new file mode 100644 index 0000000..4374ddd --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/GroupConstant.java @@ -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"; +} diff --git a/admin/src/main/java/com/baiye/event/system/RootApplication.java b/admin/src/main/java/com/baiye/event/system/RootApplication.java index 46bc034..599feea 100644 --- a/admin/src/main/java/com/baiye/event/system/RootApplication.java +++ b/admin/src/main/java/com/baiye/event/system/RootApplication.java @@ -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(); } diff --git a/admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java b/admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java index 0aa0461..5d043ce 100644 --- a/admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java +++ b/admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java @@ -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 implements ReadListener { + +public class AddFileFriendDataListener extends AnalysisEventListener { /** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 @@ -25,12 +33,15 @@ public class AddFileFriendDataListener implements ReadListener { /** * 缓存的数据 */ - private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + + private final AddFriendService addFriendService; - private final ExtendService extendService; + private final SaveAddFriendDTO saveAddFriendDTO; - public AddFileFriendDataListener(ExtendService extendService) { - this.extendService = extendService; + public AddFileFriendDataListener(AddFriendService addFriendService, SaveAddFriendDTO saveAddFriendDTO) { + this.addFriendService = addFriendService; + this.saveAddFriendDTO = saveAddFriendDTO; } /** @@ -40,7 +51,7 @@ public class AddFileFriendDataListener implements ReadListener { * @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 implements ReadListener { @Override public void doAfterAllAnalysed(AnalysisContext context) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 - saveData(); + if (CollUtil.isNotEmpty(cachedDataList)) { + saveData(); + } + cachedDataList.clear(); log.info("所有数据解析完成!"); } @@ -67,7 +81,25 @@ public class AddFileFriendDataListener implements ReadListener { */ private void saveData() { log.info("{}条数据,开始存储数据库!", cachedDataList.size()); - extendService.saveBatch(cachedDataList); + Set list = Sets.newHashSet(); + // 随机添加微信 + QueueBalance balance = new QueueBalance<>(); + AddFriend friend; + for (FileAddFriendVO friendVO : cachedDataList) { + String pollingWechat = balance.chooseOne(saveAddFriendDTO.getTrumpetWechatList()); + List 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("存储数据库成功!"); } } diff --git a/admin/src/main/java/com/baiye/modules/scrm/controller/AddFriendController.java b/admin/src/main/java/com/baiye/modules/scrm/controller/AddFriendController.java index f7eeb04..0d906cd 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/controller/AddFriendController.java +++ b/admin/src/main/java/com/baiye/modules/scrm/controller/AddFriendController.java @@ -65,7 +65,7 @@ public class AddFriendController { @DeleteMapping("/{id}") @Operation(summary = "ID删除任务") - public R deleteByUserId(@PathVariable("id") Long taskId) { - return addFriendTaskService.del(taskId) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除失败"); + public R deleteByUserId(@PathVariable("id") Long taskId) { + return Boolean.TRUE.equals(addFriendTaskService.del(taskId)) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除失败"); } } diff --git a/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatGroupController.java b/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatGroupController.java index 01a4acb..eb62945 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatGroupController.java +++ b/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatGroupController.java @@ -29,6 +29,14 @@ public class WeChatGroupController { } + @GetMapping("/user/list/groupId") + @Operation(summary = "群列表") + public R queryGroupUserListByGroupId(Long groupId) { + return R.ok(weChatGroupService.queryGroupUserListByGroupId(groupId)); + } + + + @GetMapping("/user/list") @Operation(summary = "群成员") public R queryGroupUserList(String wxId, String groupId) { diff --git a/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatLabelController.java b/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatLabelController.java new file mode 100644 index 0000000..40acafb --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatLabelController.java @@ -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> getClueRecordPage(@RequestBody List wxIds) { + return R.ok(weChatLabelService.findPersonByWeChatId(wxIds)); + } + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/AddFriendDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/AddFriendDTO.java index 12673d8..8f43d7b 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/AddFriendDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/AddFriendDTO.java @@ -21,6 +21,9 @@ public class AddFriendDTO { @Schema(title = "微信小号") private String trumpetWechat; + @Schema(title = "标签ID") + private List labelIds; + @Schema(title = "小号微信") private List targetWechat; } diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/ContractDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/ContractDTO.java new file mode 100644 index 0000000..4e5dae7 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/ContractDTO.java @@ -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; + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/GroupCallbackDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/GroupCallbackDTO.java index 27d9818..c39d9a1 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/GroupCallbackDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/GroupCallbackDTO.java @@ -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; diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/GroupMemberDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/GroupMemberDTO.java index 519ceb7..f837885 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/GroupMemberDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/GroupMemberDTO.java @@ -23,7 +23,7 @@ public class GroupMemberDTO { private String userName; - private String inviteUser; + private String inviterUserName; private String smallHeadImgUrl; diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/OtherInformationDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/OtherInformationDTO.java new file mode 100644 index 0000000..8d078c7 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/OtherInformationDTO.java @@ -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; + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/SaveAddFriendDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/SaveAddFriendDTO.java new file mode 100644 index 0000000..473cea1 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/SaveAddFriendDTO.java @@ -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 trumpetWechatList; + + /** + * 用户ID + */ + private Long userId; + + /** + * 任务id + */ + private Long taskId; +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatAddFriendDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatAddFriendDTO.java index aff44a3..cd9f054 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatAddFriendDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatAddFriendDTO.java @@ -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; diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatFriendDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatFriendDTO.java index cb30ad5..34ec85b 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatFriendDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatFriendDTO.java @@ -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; diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatUserLoginDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatUserLoginDTO.java index b71f78f..be1f406 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatUserLoginDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatUserLoginDTO.java @@ -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; } diff --git a/admin/src/main/java/com/baiye/modules/scrm/entity/ActiveAddFriedRecord.java b/admin/src/main/java/com/baiye/modules/scrm/entity/ActiveAddFriedRecord.java new file mode 100644 index 0000000..3921ea9 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/ActiveAddFriedRecord.java @@ -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; + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriend.java b/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriend.java index 41f708e..83ffc69 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriend.java +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriend.java @@ -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 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); + } } diff --git a/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriendTask.java b/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriendTask.java index d4e8546..c0e928b 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriendTask.java +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriendTask.java @@ -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; diff --git a/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroup.java b/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroup.java index 209b33b..110ad54 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroup.java +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroup.java @@ -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; } diff --git a/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroupMember.java b/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroupMember.java index f6a625a..7a80cd0 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroupMember.java +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroupMember.java @@ -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; } diff --git a/admin/src/main/java/com/baiye/modules/scrm/mapper/ActiveAddFriendRecordMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/ActiveAddFriendRecordMapper.java new file mode 100644 index 0000000..686736b --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/ActiveAddFriendRecordMapper.java @@ -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 { + + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendMapper.java index 8468317..ecee5f2 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendMapper.java +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendMapper.java @@ -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 { + /** * 任务ID查询 * @@ -22,9 +26,42 @@ public interface AddFriendMapper extends ExtendMapper { * @param taskStatus * @return */ - default List 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 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 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)); + } } diff --git a/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendTaskMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendTaskMapper.java index 7302b3c..b07e8a0 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendTaskMapper.java +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendTaskMapper.java @@ -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 { * @return */ default List 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 { 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 voPage = page.convert(AddFriendTaskConverter.INSTANCE::entityToVo); return new PageResult<>(voPage.getRecords(), voPage.getTotal()); diff --git a/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatFriendMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatFriendMapper.java index bcb0c87..6e099d6 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatFriendMapper.java +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatFriendMapper.java @@ -61,4 +61,5 @@ public interface WeChatFriendMapper extends ExtendMapper { * @return */ List findEquipmentByAccountId(Long id); + } diff --git a/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMapper.java index 1a3e4df..37c885e 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMapper.java +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMapper.java @@ -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 { 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 weChatGroups = this.selectList(WrappersX.lambdaQueryX(WeChatGroup.class).eq(WeChatGroup::getChatRoomId, userName)); + if (CollUtil.isNotEmpty(weChatGroups)){ + return weChatGroups.get(DefaultNumberConstants.ZERO_NUMBER); + } + return new WeChatGroup(); + } + } diff --git a/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMemberMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMemberMapper.java index 814c772..40b2d42 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMemberMapper.java +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMemberMapper.java @@ -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 * 群查询资源 * * @param userName + * @param syncedGroup * @return */ - default List queryMemberWechatIdByChatRoomId(String userName) { + default List queryMemberWechatIdByChatRoomId(String userName, Long syncedGroup) { LambdaQueryWrapperX 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 removeList){ + default Boolean deleteByWeChatId(List 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 queryMemberWechatIdByWxId(@Param("wxId") String wxId); + + /** + * 群ID查询 + * @param groupId + * @return + */ + default List queryGroupUserListByGroupId(Long groupId){ + return Convert.toList(WeChatGroupMemberVo.class, this.selectList + (WrappersX.lambdaQueryX(WeChatGroupMember.class).eq(WeChatGroupMember::getGroupId, groupId))); + } } diff --git a/admin/src/main/java/com/baiye/modules/scrm/qo/TaskQo.java b/admin/src/main/java/com/baiye/modules/scrm/qo/TaskQo.java index bbd573a..ecab92d 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/qo/TaskQo.java +++ b/admin/src/main/java/com/baiye/modules/scrm/qo/TaskQo.java @@ -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; diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/ActiveAddFriendService.java b/admin/src/main/java/com/baiye/modules/scrm/service/ActiveAddFriendService.java new file mode 100644 index 0000000..389b1c4 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/ActiveAddFriendService.java @@ -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 { + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendService.java b/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendService.java index 914f7f3..e02400b 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendService.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendService.java @@ -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 { */ List 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); } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupMemberService.java b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupMemberService.java index 08c6636..c65db39 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupMemberService.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupMemberService.java @@ -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 queryMemberWechatIdByChatRoomId(String userName); + List queryMemberWechatIdByChatRoomId(String userName, Long syncedGroup); /** * 插入数据 + * * @param saveMemberList + * @param groupId + * @param groupName * @return */ - Boolean saveMemberByDTO(List saveMemberList); + Boolean saveMemberByDTO(List saveMemberList, Long groupId, String groupName); /** * 删除微信元素 @@ -37,10 +41,20 @@ public interface WeChatGroupMemberService extends ExtendService removeList); + + /** * 微信查询群 * @param wxId * @return */ - List queryMemberWechatIdBy(String wxId); + List queryMemberWechatIdByWxId(String wxId); + + + /** + * 群ID查询用户 + * @param groupId + * @return + */ + List queryGroupUserListByGroupId(Long groupId); } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupService.java b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupService.java index d9562ef..98ef8bd 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupService.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupService.java @@ -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 { * @param wxId * @return */ - String queryInformation(String wxId); + List queryInformation(String wxId); /** @@ -37,5 +43,12 @@ public interface WeChatGroupService extends ExtendService { * @param dto * @return */ - Boolean syncGroup(WeChatAccount byWxId, GroupCallbackDTO dto); + Long syncGroup(WeChatAccount byWxId, GroupCallbackDTO dto); + + /** + * 群ID查询 + * @param groupId + * @return + */ + List queryGroupUserListByGroupId(Long groupId); } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/WeChatLabelService.java b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatLabelService.java new file mode 100644 index 0000000..d0d75e7 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatLabelService.java @@ -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 findPersonByWeChatId(List wxIds); + + /** + * 修改好友标签 + * + * @param wechatFlagList + * @param toUserName + * @param fromUserName + * @return + */ + Boolean modifyLabel(List wechatFlagList, String toUserName, String fromUserName); +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/WeChatService.java b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatService.java index b587925..4389f92 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/WeChatService.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatService.java @@ -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 { * @param weChatFriendDTO * @return */ - Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO); + Integer addFriend(WeChatAddFriendDTO weChatFriendDTO); /** * 分页查询账号信息 @@ -144,4 +141,21 @@ public interface WeChatService extends ExtendService { * @return */ Boolean syncAddressBook(String wxId); + + /** + * 发送消息 + * + * @param passGreetMessage + * @param toUserName + * @param fromUserName + * @return + */ + Boolean sendTextMessage(List passGreetMessage, String toUserName, String fromUserName); + + /** + * 获取信息 + * @param wxId + * @return + */ + List getAllContact(String wxId); } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/WechatFriendService.java b/admin/src/main/java/com/baiye/modules/scrm/service/WechatFriendService.java index 835b25b..2c01fa3 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/WechatFriendService.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/WechatFriendService.java @@ -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 { * @return */ PageResult statisticsFriendByUserId(WeChatStatisticsDTO statisticsDTO); + + } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/ActiveAddFriendRecordServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/ActiveAddFriendRecordServiceImpl.java new file mode 100644 index 0000000..d0ebb19 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/ActiveAddFriendRecordServiceImpl.java @@ -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 implements ActiveAddFriendService { + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendServiceImpl.java index 2df8ef6..981fba1 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendServiceImpl.java @@ -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 implements AddFriendService { + + private final AddFriendTaskMapper addFriendTaskMapper; + + private final WeChatLabelService weChatLabelService; + + private final WeChatService weChatService; + + @Override public List 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); + } + } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendTaskServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendTaskServiceImpl.java index d7490e5..a25a03b 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendTaskServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendTaskServiceImpl.java @@ -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 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 listList = addFriendDTOList.stream().map + (AddFriendDTO::getTrumpetWechat).collect(Collectors.toList()); - List 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 saveSet = Sets.newHashSet(); + for (AddFriendDTO addFriendDTO : addFriendDTOList) { + List 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 implements WeChatGroupMemberService { @Override - public List queryMemberWechatIdByChatRoomId(String userName) { - return this.baseMapper.queryMemberWechatIdByChatRoomId(userName); + public List queryMemberWechatIdByChatRoomId(String userName, Long syncedGroup) { + return this.baseMapper.queryMemberWechatIdByChatRoomId(userName, syncedGroup); } + @Override - public Boolean saveMemberByDTO(List saveMemberList) { - List list = Convert.toList(WeChatGroupMember.class, saveMemberList); - return this.saveBatch(list); + public List queryMemberWechatIdByWxId(String wxId) { + return baseMapper.queryMemberWechatIdByWxId(wxId); } @Override - public Boolean removeByWechatId(List removeList) { - return baseMapper.deleteByWeChatId(removeList); + public List queryGroupUserListByGroupId(Long groupId) { + return baseMapper.queryGroupUserListByGroupId(groupId); + } + + @Override + public Boolean saveMemberByDTO(List saveMemberList, Long groupId, String groupName) { + WeChatGroupMember member; + List 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 queryMemberWechatIdBy(String wxId) { - return Lists.newArrayList(); + public Boolean removeByWechatId(List removeList) { + return baseMapper.deleteByWeChatId(removeList); } + + } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatLabelServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatLabelServiceImpl.java new file mode 100644 index 0000000..88d16a1 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatLabelServiceImpl.java @@ -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 findPersonByWeChatId(List wxIds) { + + HashMap 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 wechatFlagList, String toUserName, String fromUserName) { + String join = Joiner.on(StrPool.COMMA).skipNulls().join(wechatFlagList); + Map 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; + } +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatServiceImpl.java index be9a13e..5bcc9fd 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatServiceImpl.java @@ -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 implements WeChatService { +public class WeChatServiceImpl extends ExtendServiceImpl implements WeChatService { @Value("${snowflake.workerId}") @@ -77,6 +80,10 @@ public class WeChatServiceImpl extends ExtendServiceImpl hashMap = Maps.newHashMap(); @@ -99,18 +106,23 @@ public class WeChatServiceImpl extends ExtendServiceImpl 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 passGreetMessage, String toUserName, String fromUserName) { + for (String sendMessage : passGreetMessage) { + Map 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 getAllContact(String wxId) { + // 获取群信息 + Map 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(); + } } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatCallbackServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatCallbackServiceImpl.java index aeb903e..f8e2918 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatCallbackServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatCallbackServiceImpl.java @@ -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 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 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 stringList = - weChatGroupMemberService.queryMemberWechatIdByChatRoomId(dto.getUserName()); - // 同步群成员 - Map dtoMap = - dto.getChatRoomMemberDetail().stream().collect(Collectors.toMap(GroupMemberDTO::getUserName, account -> account)); - - // 回调返回的 - Set callBackSet - = dto.getChatRoomMemberDetail().stream().map(GroupMemberDTO::getUserName).collect(Collectors.toSet()); - Set newHashSet = Sets.newHashSet(stringList); - - - // 删除已经存在数据 - dtoMap.keySet().removeIf(stringList::contains); - - // 只保存剩余value值 - List saveMemberList = dtoMap.values(). - stream().collect(Collectors.toList()); - - weChatGroupMemberService.saveMemberByDTO(saveMemberList); + } - // 不存在 - List removeList = Lists.newArrayList(Sets.difference(newHashSet, callBackSet)); - if (CollUtil.isNotEmpty(removeList)) { - weChatGroupMemberService.removeByWechatId(removeList); + private void syncGroupMember(String wxId, List 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 stringList = + weChatGroupMemberService.queryMemberWechatIdByChatRoomId(dto.getUserName(), syncedGroup); + + // 同步群成员 + Map dtoMap = + dto.getChatRoomMemberDetail().stream().collect(Collectors.toMap(GroupMemberDTO::getUserName, account -> account)); + + // 回调返回的 + Set callBackSet + = dto.getChatRoomMemberDetail().stream().map(GroupMemberDTO::getUserName).collect(Collectors.toSet()); + Set newHashSet = Sets.newHashSet(stringList); + + // 删除已经存在数据 + dtoMap.keySet().removeIf(stringList::contains); + + // 只保存剩余value值 + List saveMemberList = Lists.newArrayList(dtoMap.values()); + if (CollUtil.isNotEmpty(saveMemberList)) { + weChatGroupMemberService.saveMemberByDTO(saveMemberList, syncedGroup, dto.getUserName()); + } + // 退出群 + List 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 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 groupCallbackDTOList = JSONUtil.toList(groupJson, GroupCallbackDTO.class); + // 异步方式同步群成员信息 + CompletableFuture.runAsync(() -> syncGroupMember(weChatResponse.getWxId(), groupCallbackDTOList)); + } + } + } } diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatFriendServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatFriendServiceImpl.java index 4f7bad8..3539450 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatFriendServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatFriendServiceImpl.java @@ -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); diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatGroupServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatGroupServiceImpl.java index c8f0594..8b79eed 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatGroupServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatGroupServiceImpl.java @@ -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 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 dtoList = JSONUtil.toList(JSONUtil.toJsonStr(weChatResponse.getData()), GroupCallbackDTO.class); + @Value("${snowflake.datacenterId}") + private int datacenterId; - } - return CharSequenceUtil.EMPTY; + + @Override + public List queryInformation(String wxId) { + return weChatGroupMemberService.queryMemberWechatIdByWxId(wxId); } @Override public String queryGroupUserList(String wxId, String groupId) { - Map 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 queryGroupUserListByGroupId(Long groupId) { + return weChatGroupMemberService.queryGroupUserListByGroupId(groupId); + } + } diff --git a/admin/src/main/java/com/baiye/modules/scrm/vo/GroupVO.java b/admin/src/main/java/com/baiye/modules/scrm/vo/GroupVO.java index 682b356..b928e78 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/vo/GroupVO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/vo/GroupVO.java @@ -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; } diff --git a/admin/src/main/java/com/baiye/modules/scrm/vo/WeChatGroupMemberVo.java b/admin/src/main/java/com/baiye/modules/scrm/vo/WeChatGroupMemberVo.java new file mode 100644 index 0000000..023598e --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/vo/WeChatGroupMemberVo.java @@ -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; + + + +} diff --git a/admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java b/admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java index 7cfd55c..f265e7c 100644 --- a/admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java +++ b/admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java @@ -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 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 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)); } + } diff --git a/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java b/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java index 25aa131..d7fb60a 100644 --- a/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java +++ b/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java @@ -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 addFriendTaskList = addFriendTaskService.queryTaskAndStatus(DefaultNumberConstants.ONE_NUMBER); + List 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); } } } diff --git a/admin/src/main/resources/mapper/AddFriendMapper.xml b/admin/src/main/resources/mapper/AddFriendMapper.xml new file mode 100644 index 0000000..275dbf5 --- /dev/null +++ b/admin/src/main/resources/mapper/AddFriendMapper.xml @@ -0,0 +1,24 @@ + + + + + + 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 + + + diff --git a/admin/src/main/resources/mapper/LoginEquipmentMapper.xml b/admin/src/main/resources/mapper/LoginEquipmentMapper.xml index 18877fb..c67db84 100644 --- a/admin/src/main/resources/mapper/LoginEquipmentMapper.xml +++ b/admin/src/main/resources/mapper/LoginEquipmentMapper.xml @@ -2,7 +2,7 @@ - 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, diff --git a/admin/src/main/resources/mapper/WeChatGroupMemberMapper.xml b/admin/src/main/resources/mapper/WeChatGroupMemberMapper.xml new file mode 100644 index 0000000..ffa00bc --- /dev/null +++ b/admin/src/main/resources/mapper/WeChatGroupMemberMapper.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/admin/src/test/java/AddFriendTest.java b/admin/src/test/java/AddFriendTest.java new file mode 100644 index 0000000..477a2ba --- /dev/null +++ b/admin/src/test/java/AddFriendTest.java @@ -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); + } + + + + + + + +} diff --git a/admin/src/test/java/FileTest.java b/admin/src/test/java/FileTest.java new file mode 100644 index 0000000..f565f19 --- /dev/null +++ b/admin/src/test/java/FileTest.java @@ -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(){ + } +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java index 19146ba..eeb3db1 100644 --- a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java @@ -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; + } diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java index 43bbfb4..2eb5548 100644 --- a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java @@ -63,7 +63,10 @@ public interface WeChatAccountRequest { String WE_CHAT_ADD_FRIEND = "/api/add-now-friend-phone/"; - + /** + * 同步会话 + */ + String CONTACT_CONVERSATION = "/wechat/v1/getAllContact"; } diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatGroupRequest.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatGroupRequest.java index 480f7ce..b3d78bf 100644 --- a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatGroupRequest.java +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatGroupRequest.java @@ -18,10 +18,7 @@ public interface WeChatGroupRequest { String GROUP_INFO = "/wechat/v1/chatroominfo"; - /** - * 获取群信息 - */ - String GROUP_CONVERSATION = "/wechat/v1/getAllContact"; + } diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatPersonRequest.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatPersonRequest.java index 89bcda8..795e749 100644 --- a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatPersonRequest.java +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatPersonRequest.java @@ -29,6 +29,11 @@ public interface WeChatPersonRequest { */ String MODIFY_WECHAT_LABEL = "/wechat/v1/modifyLabel"; + /** + * 获取微信标签 + */ + String QUERY_WECHAT_LABEL = "/wechat/v1/getLabelList?wechat="; + } diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatSendMessageRequest.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatSendMessageRequest.java new file mode 100644 index 0000000..835514d --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatSendMessageRequest.java @@ -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"; + + + + + +} diff --git a/marketing-scrm-common/common-model/pom.xml b/marketing-scrm-common/common-model/pom.xml index f2991db..b8e199a 100644 --- a/marketing-scrm-common/common-model/pom.xml +++ b/marketing-scrm-common/common-model/pom.xml @@ -36,5 +36,10 @@ cn.hutool hutool-core + + + com.google.code.gson + gson + diff --git a/marketing-scrm-common/common-model/src/main/java/com/baiye/result/BaseResponse.java b/marketing-scrm-common/common-model/src/main/java/com/baiye/result/BaseResponse.java new file mode 100644 index 0000000..4e308b7 --- /dev/null +++ b/marketing-scrm-common/common-model/src/main/java/com/baiye/result/BaseResponse.java @@ -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; +}