From 8bf63db6cb17ae9fe02a8512070fb4948e14a1af Mon Sep 17 00:00:00 2001 From: bynt <13586541001@163.com> Date: Fri, 7 Jun 2024 19:27:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A5=BD=E5=8F=8B=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/.flattened-pom.xml | 12 + admin/pom.xml | 18 +- .../listener/AddFileFriendDataListener.java | 73 +++++ .../scrm/controller/AddFriendController.java | 71 +++++ .../controller/LoginEquipmentController.java | 4 + .../scrm/controller/WeChatController.java | 17 +- .../controller/WeChatGroupController.java | 39 +++ .../converter/AddFriendTaskConverter.java | 25 ++ .../baiye/modules/scrm/dto/AddFriendDTO.java | 26 ++ .../scrm/dto/CreateAddFriendTaskDTO.java | 85 ++++++ .../baiye/modules/scrm/dto/CreateCodeDTO.java | 12 +- .../modules/scrm/dto/GroupCallbackDTO.java | 33 +++ .../modules/scrm/dto/GroupMemberDTO.java | 37 +++ .../baiye/modules/scrm/dto/PushCodeDTO.java | 5 +- .../baiye/modules/scrm/dto/UpdateTaskDTO.java | 13 + .../modules/scrm/dto/WeChatAddFriendDTO.java | 28 +- .../scrm/dto/WeChatOnlineStatusDTO.java | 21 ++ .../baiye/modules/scrm/entity/AddFriend.java | 57 ++++ .../modules/scrm/entity/AddFriendTask.java | 101 +++++++ .../modules/scrm/entity/WeChatGroup.java | 171 +++++++++++ .../scrm/entity/WeChatGroupMember.java | 203 +++++++++++++ .../modules/scrm/mapper/AddFriendMapper.java | 30 ++ .../scrm/mapper/AddFriendTaskMapper.java | 55 ++++ .../scrm/mapper/WeChatAccountMapper.java | 7 + .../scrm/mapper/WeChatGroupMapper.java | 25 ++ .../scrm/mapper/WeChatGroupMemberMapper.java | 43 +++ .../com/baiye/modules/scrm/qo/TaskQo.java | 27 ++ .../scrm/service/AddFriendService.java | 24 ++ .../scrm/service/AddFriendTaskService.java | 74 +++++ .../service/WeChatGroupMemberService.java | 46 +++ .../scrm/service/WeChatGroupService.java | 41 +++ .../modules/scrm/service/WeChatService.java | 20 +- .../service/impl/AddFriendServiceImpl.java | 26 ++ .../impl/AddFriendTaskServiceImpl.java | 150 ++++++++++ .../scrm/service/impl/AliPayServiceImpl.java | 4 +- .../impl/LoginEquipmentServiceImpl.java | 33 +-- .../impl/WeChatGroupMemberServiceImpl.java | 47 +++ .../scrm/service/impl/WeChatServiceImpl.java | 145 +++++---- .../impl/WechatCallbackServiceImpl.java | 71 ++++- .../service/impl/WechatGroupServiceImpl.java | 88 ++++++ .../modules/scrm/vo/AddFriendTaskVO.java | 93 ++++++ .../modules/scrm/vo/FileAddFriendVO.java | 46 +++ .../com/baiye/modules/scrm/vo/GroupVO.java | 15 + .../modules/scrm/vo/WeChatAccountVO.java | 2 + .../ConfigurationBeanFactoryMetadata.java | 84 ++++++ .../java/com/baiye/schedule/AccountTask.java | 64 ---- .../baiye/schedule/handler/AddFriendJob.java | 80 +++++ .../handler/ScanDynamicJobHandler.java | 27 +- .../schedule/mapper/JobDynamicTaskMapper.java | 2 +- .../schedule/service/ElasticJobService.java | 7 + .../service/impl/ElasticJobServiceImpl.java | 6 + admin/src/main/resources/application-dev.yml | 4 +- admin/src/main/resources/application-prod.yml | 4 +- admin/src/main/resources/application.yml | 12 +- log/history/2024-03-25.gz | Bin 0 -> 6330 bytes .../constant/WechatCallbackConstant.java | 7 + .../constant/url/WeChatAccountRequest.java | 18 +- .../constant/url/WeChatFriendRequest.java | 25 ++ .../constant/url/WeChatGroupRequest.java | 27 ++ .../constant/url/WeChatPersonRequest.java | 34 +++ .../url/WechatCircleFriendRequest.java | 8 + .../constant/url/WechatLoginRequest.java | 8 + .../main/java/com/baiye/enums/JobEnum.java | 31 ++ .../main/java/com/baiye/pojo/CronModel.java | 96 ++++++ .../main/java/com/baiye/util/CronUtil.java | 278 ++++++++++++++++++ .../ConfigurationBeanFactoryMetadata.java | 79 +++++ .../java/com/baiye/result/WeChatResponse.java | 2 + .../src/main/java/com/baiye/RedisHelper.java | 1 + .../marketing-scrm-starter-job/pom.xml | 33 +-- .../common/job/handler/ElasticJobHandler.java | 12 +- .../job/lintener/ElasticJobListener.java | 3 + .../system/properties/WeChatProperties.java | 4 +- pom.xml | 20 +- 73 files changed, 2901 insertions(+), 238 deletions(-) create mode 100644 admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/controller/AddFriendController.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/controller/WeChatGroupController.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/converter/AddFriendTaskConverter.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/AddFriendDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/CreateAddFriendTaskDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/GroupCallbackDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/GroupMemberDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/UpdateTaskDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/dto/WeChatOnlineStatusDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/entity/AddFriend.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/entity/AddFriendTask.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroup.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroupMember.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendTaskMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMemberMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/qo/TaskQo.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/AddFriendService.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/AddFriendTaskService.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupMemberService.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupService.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendTaskServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatGroupMemberServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatGroupServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/vo/AddFriendTaskVO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/vo/FileAddFriendVO.java create mode 100644 admin/src/main/java/com/baiye/modules/scrm/vo/GroupVO.java create mode 100644 admin/src/main/java/com/baiye/properties/ConfigurationBeanFactoryMetadata.java delete mode 100644 admin/src/main/java/com/baiye/schedule/AccountTask.java create mode 100644 admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java create mode 100644 log/history/2024-03-25.gz rename admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java => marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java (73%) create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatFriendRequest.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatGroupRequest.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatPersonRequest.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatCircleFriendRequest.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatLoginRequest.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/enums/JobEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/pojo/CronModel.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/CronUtil.java create mode 100644 marketing-scrm-common/common-core/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java diff --git a/admin/.flattened-pom.xml b/admin/.flattened-pom.xml index db1808a..3cffdaa 100644 --- a/admin/.flattened-pom.xml +++ b/admin/.flattened-pom.xml @@ -109,6 +109,18 @@ com.alipay.sdk alipay-easysdk + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + org.springframework.cloud + spring-cloud-starter-bootstrap + diff --git a/admin/pom.xml b/admin/pom.xml index 8f69cbc..e626088 100644 --- a/admin/pom.xml +++ b/admin/pom.xml @@ -33,7 +33,6 @@ marketing-scrm-starter-job - com.baiye admin-core @@ -87,7 +86,6 @@ - jakarta.xml.bind jakarta.xml.bind-api @@ -148,6 +146,22 @@ + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + diff --git a/admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java b/admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java new file mode 100644 index 0000000..0aa0461 --- /dev/null +++ b/admin/src/main/java/com/baiye/listener/AddFileFriendDataListener.java @@ -0,0 +1,73 @@ +package com.baiye.listener; + +import cn.hutool.core.convert.Convert; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +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.modules.scrm.entity.AddFriend; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +@Slf4j +public class AddFileFriendDataListener implements ReadListener { + + /** + * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 + */ + private static final int BATCH_COUNT = 500; + /** + * 缓存的数据 + */ + private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + + private final ExtendService extendService; + + public AddFileFriendDataListener(ExtendService extendService) { + this.extendService = extendService; + } + + /** + * 这个每一条数据解析都会来调用 + * + * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()} + * @param context + */ + @Override + public void invoke(T data, AnalysisContext context) { + cachedDataList.add(data); + // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM + if (cachedDataList.size() >= BATCH_COUNT) { + saveData(); + // 存储完成清理 list + cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + } + } + + /** + * 所有数据解析完成了 都会来调用 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + saveData(); + log.info("所有数据解析完成!"); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + log.info("{}条数据,开始存储数据库!", cachedDataList.size()); + extendService.saveBatch(cachedDataList); + 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 new file mode 100644 index 0000000..f7eeb04 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/controller/AddFriendController.java @@ -0,0 +1,71 @@ +package com.baiye.modules.scrm.controller; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.modules.scrm.dto.CreateAddFriendTaskDTO; +import com.baiye.modules.scrm.dto.UpdateTaskDTO; +import com.baiye.modules.scrm.qo.TaskQo; +import com.baiye.modules.scrm.service.AddFriendTaskService; +import com.baiye.modules.scrm.vo.AddFriendTaskVO; +import com.baiye.result.BaseResultCode; +import com.baiye.result.R; +import com.baiye.security.util.SecurityUtils; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author Enzo + * @date : 2024/6/2 + */ + +@Tag(name = "微信添加好友任务") +@Slf4j +@RestController +@RequestMapping(value = "/add/friend") +@AllArgsConstructor +public class AddFriendController { + + private final AddFriendTaskService addFriendTaskService; + + + @GetMapping("/task/page") + @Operation(summary = "分页查询记录") + public R> getClueRecordPage(@Validated PageParam pageParam, TaskQo qo) { + return R.ok(addFriendTaskService.queryPage(pageParam, qo)); + } + + + @PostMapping("/create/task") + @Operation(summary = "创建任务") + public R createTestTask(@RequestParam(value = "file", required = false) MultipartFile file, @RequestParam("data") String data) { + CreateAddFriendTaskDTO taskDTO = JSONUtil.toBean(data, CreateAddFriendTaskDTO.class); + return Boolean.TRUE.equals(addFriendTaskService.createTask(file, taskDTO, SecurityUtils.getCurrentUserId())) ? R.ok() : R.failed("创建任务失败"); + } + + @PostMapping("/update/task") + @Operation(summary = "修改任务") + public R updateTask(@RequestBody CreateAddFriendTaskDTO createAddFriendTaskDTO) { + return Boolean.TRUE.equals(addFriendTaskService.updateTask(createAddFriendTaskDTO)) ? R.ok() : R.failed("创建任务失败"); + } + + + @PostMapping("/update/taskStatus") + @Operation(summary = "修改任务") + public R updateTask(@RequestBody UpdateTaskDTO taskDTO) { + return Boolean.TRUE.equals(addFriendTaskService.updateTaskStatus(taskDTO.getTaskId(), taskDTO.getTaskStatus())) ? R.ok() : R.failed("修改任务失败"); + } + + + @DeleteMapping("/{id}") + @Operation(summary = "ID删除任务") + public R deleteByUserId(@PathVariable("id") Long taskId) { + return addFriendTaskService.del(taskId) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除失败"); + } +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/controller/LoginEquipmentController.java b/admin/src/main/java/com/baiye/modules/scrm/controller/LoginEquipmentController.java index 96380fe..52b1d54 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/controller/LoginEquipmentController.java +++ b/admin/src/main/java/com/baiye/modules/scrm/controller/LoginEquipmentController.java @@ -39,4 +39,8 @@ public class LoginEquipmentController { + + + + } diff --git a/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatController.java b/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatController.java index b853b69..ab2b35a 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatController.java +++ b/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatController.java @@ -75,8 +75,8 @@ public class WeChatController { @GetMapping("/create/equipment") @Operation(summary = "创建设备") - public R createEquipment(Integer num, Integer packageType) { - return Boolean.TRUE.equals(weChatService.createEquipment(num, packageType, SecurityUtils.getCurrentUserId())) ? R.ok() : R.failed("创建设备失败"); + public R createEquipment(Integer num) { + return Boolean.TRUE.equals(weChatService.createEquipment(num, SecurityUtils.getCurrentUserId())) ? R.ok() : R.failed("创建设备失败"); } @@ -115,13 +115,24 @@ public class WeChatController { } + @GetMapping("/syncAddressBook") + @Operation(summary = "同步通讯录") + public R syncAddressBook(String wxId) { + return R.ok(weChatService.syncAddressBook(wxId)); + } + + @GetMapping("/robot/logout") @Operation(summary = "退出登录") public R robotLogout(Integer robotId) { return R.ok(weChatService.logoutByRobotId(robotId)); } - + @GetMapping("/list") + @Operation(summary = "查询账号列表") + public R> getClueRecordPage(AccountQo qo) { + return R.ok(weChatService.queryListByQo(qo)); + } } 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 new file mode 100644 index 0000000..01a4acb --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/controller/WeChatGroupController.java @@ -0,0 +1,39 @@ +package com.baiye.modules.scrm.controller; + +import com.baiye.modules.scrm.service.WeChatGroupService; +import com.baiye.result.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Enzo + * @date : 2024/3/27 + */ +@RestController +@Tag(name = "微信群") +@RequiredArgsConstructor +@RequestMapping("/wechat/group") +public class WeChatGroupController { + + + private final WeChatGroupService weChatGroupService; + + @GetMapping("/query/information") + @Operation(summary = "群列表") + public R queryInformation(String wxId) { + return R.ok(weChatGroupService.queryInformation(wxId)); + } + + + @GetMapping("/user/list") + @Operation(summary = "群成员") + public R queryGroupUserList(String wxId, String groupId) { + return R.ok(weChatGroupService.queryGroupUserList(wxId, groupId)); + } + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/converter/AddFriendTaskConverter.java b/admin/src/main/java/com/baiye/modules/scrm/converter/AddFriendTaskConverter.java new file mode 100644 index 0000000..5baae6a --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/converter/AddFriendTaskConverter.java @@ -0,0 +1,25 @@ +package com.baiye.modules.scrm.converter; + +import com.baiye.modules.scrm.entity.AddFriendTask; +import com.baiye.modules.scrm.entity.PayOrder; +import com.baiye.modules.scrm.vo.AddFriendTaskVO; +import com.baiye.modules.scrm.vo.PayOrderVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * @author Enzo + * @date : 2024/3/28 + */ +@Mapper +public interface AddFriendTaskConverter { + + AddFriendTaskConverter INSTANCE = Mappers.getMapper(AddFriendTaskConverter.class); + + /** + * 实体转vo + * @param addFriendTask + * @return + */ + AddFriendTaskVO entityToVo(AddFriendTask addFriendTask); +} 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 new file mode 100644 index 0000000..12673d8 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/AddFriendDTO.java @@ -0,0 +1,26 @@ +package com.baiye.modules.scrm.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +@Data +public class AddFriendDTO { + + @Schema(title = "用户Id") + private Long userId; + + @Schema(title = "问候语句") + private String greet; + + @Schema(title = "微信小号") + private String trumpetWechat; + + @Schema(title = "小号微信") + private List targetWechat; +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/CreateAddFriendTaskDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/CreateAddFriendTaskDTO.java new file mode 100644 index 0000000..a245d5a --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/CreateAddFriendTaskDTO.java @@ -0,0 +1,85 @@ +package com.baiye.modules.scrm.dto; + +import cn.hutool.core.date.DatePattern; +import com.baiye.extend.mybatis.plus.converter.JsonStringArrayTypeHandler; +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.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +/** + * @author Enzo + * @date : 2024/6/2 + */ + +@Data +public class CreateAddFriendTaskDTO { + + private Long id; + + @Schema(title = "任务名称") + private String taskName; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "添加类型") + private Integer addFriendType; + + @Schema(title = "任务状态") + private Integer taskStatus; + + @Schema(title = "是否去重") + private Boolean isDuplicate; + + @Schema(title = "开始时间") + @JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN) + private Date startTime; + + @Schema(title = "结束时间") + @JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN) + private Date endTime; + + @Schema(title = "每日结束时间") + @JsonFormat(pattern = DatePattern.NORM_TIME_PATTERN) + private Date dayEndTime; + + @Schema(title = "每日开始时间") + @JsonFormat(pattern = DatePattern.NORM_TIME_PATTERN) + private Date dayStartTime; + + @Schema(title = "通过间隔-开始") + @TableField("add_interval_start") + private Integer addIntervalStart; + + @Schema(title = "通过间隔-结束") + @TableField("add_interval_end") + private Integer addIntervalEnd; + + @Schema(title = "频繁间隔-开始") + private Integer addFrequentlyStart; + + @Schema(title = "频繁间隔-结束") + private Integer addFrequentlyEnd; + + @Schema(title = "每日添加好友上限") + private Integer addFriendMax; + + @Schema(title = "添加对象") + private List addFriendDTOList; + + + @Schema(title = "通过之后好友语句") + private List passGreetMessage; + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/CreateCodeDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/CreateCodeDTO.java index acf9725..621db25 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/CreateCodeDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/CreateCodeDTO.java @@ -11,11 +11,15 @@ public class CreateCodeDTO { private String robotId; - private String wxId; + private String wechat; - private String cityInfo; + private String uuid; + + private String pit; + + private String cityName; + + private Integer protoVer; - private String changedUid; - private String robotVersion; } 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 new file mode 100644 index 0000000..27d9818 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/GroupCallbackDTO.java @@ -0,0 +1,33 @@ +package com.baiye.modules.scrm.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/6/7 + */ +@Data +public class GroupCallbackDTO { + + + private String userName; + + private String bigHeadUrl; + + private String chatRoomOwner; + + private String nickName; + + private String wxId; + + + private String bigHeadImgUrl; + private String smallHeadImgUrl; + + private String chatRoomMembers; + + private List chatRoomMemberDetail; + +} 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 new file mode 100644 index 0000000..519ceb7 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/GroupMemberDTO.java @@ -0,0 +1,37 @@ +package com.baiye.modules.scrm.dto; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/6/7 + */ +@Data +public class GroupMemberDTO { + + private Integer flag; + + private Long role; + + private Long joinTime; + + private String nickName; + + private Integer sex; + + private Integer type; + + private String userName; + + private String inviteUser; + + private String smallHeadImgUrl; + + private String bigHeadImgUrl; + + private String displayName; + + private String province; + + private String city; +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/PushCodeDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/PushCodeDTO.java index 95e58bc..047041d 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/dto/PushCodeDTO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/PushCodeDTO.java @@ -9,10 +9,13 @@ import lombok.Data; @Data public class PushCodeDTO { - private Integer robotId; + private String pit; private String wxId; + private Integer protoVer; + + private String cityInfo; } diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/UpdateTaskDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/UpdateTaskDTO.java new file mode 100644 index 0000000..6e24178 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/UpdateTaskDTO.java @@ -0,0 +1,13 @@ +package com.baiye.modules.scrm.dto; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/6/7 + */ +@Data +public class UpdateTaskDTO { + private Long taskId; + private Integer taskStatus; +} 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 e03f709..aff44a3 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 @@ -7,34 +7,16 @@ import lombok.*; * @date : 2022/6/27 */ @Data -@NoArgsConstructor +@Builder public class WeChatAddFriendDTO { - @NonNull - private String robotWxId; + private Integer type; + private String wechat; - private AddFriendDTO addData; - - /** - * 实体 - */ - @AllArgsConstructor - @NoArgsConstructor - @ToString - @Getter - @Setter - public static class AddFriendDTO { - - private String scene; - - private String addKey; - - private String content; - - } - + private String targetWxId; + private String helloContent; } diff --git a/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatOnlineStatusDTO.java b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatOnlineStatusDTO.java new file mode 100644 index 0000000..fb5eb8e --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/dto/WeChatOnlineStatusDTO.java @@ -0,0 +1,21 @@ +package com.baiye.modules.scrm.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2022/6/30 + */ +@Data +public class WeChatOnlineStatusDTO implements Serializable { + + + private String desc; + + + private Integer status; + + +} 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 new file mode 100644 index 0000000..41f708e --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriend.java @@ -0,0 +1,57 @@ +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.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author Enzo + * @date : 2024/5/31 + */ + +@Getter +@Setter +@ToString +@TableName(value = "tb_add_friend", autoResultMap = true) +@Schema(title = "添加好友实体") +@TableAlias("af") +public class AddFriend { + + @TableId(type = IdType.AUTO) + @Schema(title = "ID") + @NotNull(message = "ID不能为空", groups = { UpdateGroup.class }) + private Long id; + + @Schema(title = "任务名称") + private Long taskId; + + @Schema(title = "用户Id") + private Long userId; + + @Schema(title = "问候语句") + private String greet; + + @Schema(title = "微信小号") + private String trumpetWechat; + + @Schema(title = "对方微信") + private String targetWechat; + + @Schema(title = "添加状态") + private Integer addStatus; + + @TableField(fill = FieldFill.INSERT) + @Schema(title = "创建时间") + private LocalDateTime createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(title = "修改时间") + private LocalDateTime updateTime; +} 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 new file mode 100644 index 0000000..d4e8546 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/AddFriendTask.java @@ -0,0 +1,101 @@ +package com.baiye.modules.scrm.entity; + +import com.baiye.entity.BaseEntity; +import com.baiye.entity.LogicDeletedBaseEntity; +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.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; +import java.util.List; + +/** + * @author Enzo + * @date : 2024/5/31 + */ + +@Getter +@Setter +@ToString +@TableName(value = "tb_add_friend_task", autoResultMap = true) +@Schema(title = "添加好友任务") +@TableAlias("ft") +public class AddFriendTask extends LogicDeletedBaseEntity { + + @TableId(type = IdType.AUTO) + @Schema(title = "ID") + @NotNull(message = "ID不能为空", groups = { UpdateGroup.class }) + private Long id; + + @Schema(title = "任务名称") + private String taskName; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "添加类型") + private Integer addFriendType; + + @Schema(title = "任务状态") + private Integer taskStatus; + + @Schema(title = "是否去重") + private Boolean isDuplicate; + + @Schema(title = "开始时间") + private Date startTime; + + @Schema(title = "结束时间") + private Date endTime; + + @Schema(title = "每日结束时间") + private Date dayEndTime; + + @Schema(title = "每日开始时间") + private Date dayStartTime; + + @Schema(title = "通过间隔-开始") + @TableField("add_interval_start") + private Integer addIntervalStart; + + @Schema(title = "通过间隔-结束") + @TableField("add_interval_end") + private Integer addIntervalEnd; + + @Schema(title = "频繁间隔-开始") + @TableField("add_frequently_start") + private Integer addFrequentlyStart; + + + @Schema(title = "频繁间隔-结束") + @TableField("add_frequently_end") + private Integer addFrequentlyEnd; + + + @Schema(title = "每日添加好友上限") + private Integer addFriendMax; + + @TableField(value = "wechat_flag_list", typeHandler = JsonStringArrayTypeHandler.class) + @Schema(title = "微信标签") + private List wechatFlagList; + + + @TableField(value = "pass_greet_message", typeHandler = JsonStringArrayTypeHandler.class) + @Schema(title = "通过之后好友语句") + private List passGreetMessage; + + + + @TableField(value = "execute_wechat_list", typeHandler = JsonStringArrayTypeHandler.class) + @Schema(title = "执行微信号") + private List executeWechatList; +} 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 new file mode 100644 index 0000000..209b33b --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroup.java @@ -0,0 +1,171 @@ +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; +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.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * @author Enzo + * @date : 2024/6/7 + */ + +@Getter +@Setter +@ToString +@TableName(value = "tb_wechat_group", autoResultMap = true) +@Schema(title = "微信群管理") +@TableAlias("wg") +public class WeChatGroup extends BaseEntity implements Serializable { + + + /** + * 社群用户ID + */ + @TableId(type = IdType.AUTO) + @Schema(title = "群Id") + @NotNull(message = "群Id", groups = {UpdateGroup.class}) + private Long id; + + @TableField("user_id") + private Long userId; + + + + /** + * 所属的设备位ID + */ + @TableField("robot_account") + private String robotAccount; + + /** + * 机器人微信ID + */ + @TableField("wechat_id") + private String wechatId; + + /** + * 群微信ID + */ + @TableField("chat_room_id") + private String chatRoomId; + + /** + * 群头像 + */ + @TableField("chat_room_icon") + private String chatRoomIcon; + + /** + * 群昵称 + */ + @TableField("chat_room_nick") + private String chatRoomNick; + + /** + * 群公告 + */ + @TableField("chat_room_announcement") + private String chatRoomAnnouncement; + + /** + * 微信群主 + */ + @TableField("chat_room_owner") + private String chatRoomOwner; + + /** + * 群人数 + */ + @TableField("chat_room_num") + private Integer chatRoomNum; + + /** + * 群类型 1-个微群;2-企微群; + */ + @TableField("chat_room_type") + private Integer chatRoomType; + + /** + * 企业群ID + */ + @TableField("corp_id") + private String corpId; + + /** + * 企业群名称 + */ + @TableField("corp_name") + private String corpName; + + /** + * 群消息免打扰 + */ + @TableField("chat_msg_immunity_enable") + private Boolean chatMsgImmunityEnable; + + /** + * 置顶聊天 + */ + @TableField("chat_top_enable") + private Boolean chatTopEnable; + + /** + * 保存到通讯录 + */ + @TableField("chat_save_mail_enable") + private Boolean chatSaveMailEnable; + + + /** + * 最后同步时间 + */ + @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 new file mode 100644 index 0000000..f6a625a --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/entity/WeChatGroupMember.java @@ -0,0 +1,203 @@ +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.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 +@TableName(value = "tb_group_wechat_member", autoResultMap = true) +@Schema(title = "群成员") +@TableAlias("wm") +public class WeChatGroupMember { + + + @TableId(type = IdType.AUTO) + @Schema(title = "id") + @NotNull(message = "id", groups = { UpdateGroup.class }) + @TableField("id") + private Integer id; + + + @TableField("robot_type") + private Integer robotType; + + /** + * 所属的设备位ID + */ + @TableField("robot_account") + private String robotAccount; + + /** + * 机器人微信ID + */ + @TableField("wechat_id") + private String wechatId; + + /** + * 群微信ID + */ + @TableField("chat_room_id") + private String chatRoomId; + + /** + * 群昵称 + */ + @TableField("chat_room_nick") + private String chatRoomNick; + + /** + * 微信ID + */ + @TableField("wx_id") + private String wxId; + + /** + * 微信号 + */ + @TableField("wx_alias") + private String wxAlias; + + /** + * 微信昵称 + */ + @TableField("wx_nick") + private String wxNick; + + /** + * 群聊中昵称 + */ + @TableField("display_name") + private String displayName; + + /** + * 省份 + */ + @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; + + /** + * 来源人微信ID + */ + @TableField("source_user_name") + private String sourceUserName; + + /** + * 进群方式 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("enable_black") + private Boolean enableBlack; + + /** + * 是否是白名单 + */ + @TableField("enable_white") + private Boolean enableWhite; + + /** + * 最后同步时间 + */ + @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/AddFriendMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendMapper.java new file mode 100644 index 0000000..8468317 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendMapper.java @@ -0,0 +1,30 @@ +package com.baiye.modules.scrm.mapper; + +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.scrm.entity.AddFriend; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @author Enzo + * @date 2024-5-31 + */ +@Mapper +public interface AddFriendMapper extends ExtendMapper { + + /** + * 任务ID查询 + * + * @param taskId + * @param addFriendNum + * @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)); + } + +} 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 new file mode 100644 index 0000000..7302b3c --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/AddFriendTaskMapper.java @@ -0,0 +1,55 @@ +package com.baiye.modules.scrm.mapper; + +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +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.converter.AddFriendTaskConverter; +import com.baiye.modules.scrm.entity.AddFriendTask; +import com.baiye.modules.scrm.qo.TaskQo; +import com.baiye.modules.scrm.vo.AddFriendTaskVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @author Enzo + * @date 2024-5-31 + */ +@Mapper +public interface AddFriendTaskMapper extends ExtendMapper { + + /** + * 状态查找数据 + * + * @param number + * @return + */ + default List queryByStatus(Integer number) { + return selectList(WrappersX.lambdaQueryX(AddFriendTask.class).eq(AddFriendTask::getTaskStatus, number).eq(AddFriendTask::getDeleted, DefaultNumberConstants.ZERO_NUMBER)); + + } + + /** + * 分页查询数据 + * + * @param pageParam + * @param qo + * @return + */ + default PageResult queryPage(PageParam pageParam, TaskQo qo) { + IPage page = this.prodPage(pageParam); + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(AddFriendTask.class); + 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); + 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/WeChatAccountMapper.java b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatAccountMapper.java index 4771d96..9b1a022 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatAccountMapper.java +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatAccountMapper.java @@ -1,6 +1,7 @@ package com.baiye.modules.scrm.mapper; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import com.baiye.constant.DefaultNumberConstants; import com.baiye.domain.PageParam; import com.baiye.domain.PageResult; @@ -88,4 +89,10 @@ public interface WeChatAccountMapper extends ExtendMapper { .eq(WeChatAccount::getDeleted, DefaultNumberConstants.ZERO_NUMBER); return SqlHelper.retBool(this.update(null, wrapper)); } + + default List queryListByQo(AccountQo qo){ + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class); + List weChatAccounts = this.selectList(wrapperX.eq(WeChatAccount::getUserId, qo.getUserId())); + return Convert.toList(WeChatAccountVO.class, weChatAccounts); + } } 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 new file mode 100644 index 0000000..1a3e4df --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMapper.java @@ -0,0 +1,25 @@ +package com.baiye.modules.scrm.mapper; + +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.scrm.entity.WeChatGroup; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author Enzo + * @date : 2024/4/2 + */ +@Mapper +public interface WeChatGroupMapper extends ExtendMapper { + + + /** + * count查询 + * + * @param userName + * @return + */ + default Long countByUserName(String userName) { + return this.selectCount(WrappersX.lambdaQueryX(WeChatGroup.class).eq(WeChatGroup::getChatRoomId, userName)); + } +} 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 new file mode 100644 index 0000000..814c772 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/mapper/WeChatGroupMemberMapper.java @@ -0,0 +1,43 @@ +package com.baiye.modules.scrm.mapper; + +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.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.jdbc.SQL; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Enzo + * @date : 2024/4/2 + */ +@Mapper +public interface WeChatGroupMemberMapper extends ExtendMapper { + + + /** + * 群查询资源 + * + * @param userName + * @return + */ + default List queryMemberWechatIdByChatRoomId(String userName) { + LambdaQueryWrapperX select = + WrappersX.lambdaQueryX(WeChatGroupMember.class).eq(WeChatGroupMember::getChatRoomId, userName).select(WeChatGroupMember::getWxId); + return this.selectList(select).stream().map(WeChatGroupMember::getWxId).collect(Collectors.toList()); + } + + /** + * 根据微信id删除元素 + * @param removeList + * @return + */ + default Boolean deleteByWeChatId(List removeList){ + return SqlHelper.retBool(this.delete(WrappersX.lambdaQueryX + (WeChatGroupMember.class).in(WeChatGroupMember::getWxId, removeList))); + } +} 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 new file mode 100644 index 0000000..bbd573a --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/qo/TaskQo.java @@ -0,0 +1,27 @@ +package com.baiye.modules.scrm.qo; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/3/29 + */ +@Data +public class TaskQo { + + + @Parameter(description = "开始时间") + private String startTime; + + @Parameter(description = "结束时间") + private String endTime; + + @Parameter(description = "用户昵称") + private String nickname; + + @Schema(title = "用户ID") + private Long userId; + +} 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 new file mode 100644 index 0000000..914f7f3 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendService.java @@ -0,0 +1,24 @@ +package com.baiye.modules.scrm.service; + +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.scrm.entity.AddFriend; + +import java.util.List; + +/** + * @author Enzo + * @date 2024-5-31 + */ +public interface AddFriendService extends ExtendService { + + /** + * 任务ID查询资源 + * + * @param taskId + * @param addFriendNum + * @param taskStatus + * @return + */ + List queryAddSourceByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus); + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendTaskService.java b/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendTaskService.java new file mode 100644 index 0000000..e639abf --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/AddFriendTaskService.java @@ -0,0 +1,74 @@ +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.CreateAddFriendTaskDTO; +import com.baiye.modules.scrm.entity.AddFriendTask; +import com.baiye.modules.scrm.qo.TaskQo; +import com.baiye.modules.scrm.vo.AddFriendTaskVO; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Enzo + * @date 2024-5-31 + */ +public interface AddFriendTaskService extends ExtendService { + + /** + * 创建任务 + * + * @param file + * @param createAddFriendTaskDTO + * @param currentUserId + * @return + */ + Boolean createTask(MultipartFile file, CreateAddFriendTaskDTO createAddFriendTaskDTO, Long currentUserId); + + /** + * + * @param taskId + * @return + */ + AddFriendTask findByTaskId(Long taskId); + + /** + * 修改任务 + * @param createAddFriendTaskDTO + * @return + */ + Boolean updateTask(CreateAddFriendTaskDTO createAddFriendTaskDTO); + + /** + * 修改任务状态 + * + * @param taskId + * @param taskStatus + * @return + */ + Boolean updateTaskStatus(Long taskId, Integer taskStatus); + + /** + * 删除任务 + * @param taskId + * @return + */ + Boolean del(Long taskId); + + /** + * 根据 + * @param number + * @return + */ + List queryTaskAndStatus(Integer number); + + /** + * 分页数据 + * @param pageParam + * @param qo + * @return + */ + PageResult queryPage(PageParam pageParam, TaskQo qo); +} 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 new file mode 100644 index 0000000..08c6636 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupMemberService.java @@ -0,0 +1,46 @@ +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 java.util.List; + +/** + * @author Enzo + * @date 2023/9/5 + */ +public interface WeChatGroupMemberService extends ExtendService { + + + /** + * 群微信查询数据 + * @param userName + * @return + */ + List queryMemberWechatIdByChatRoomId(String userName); + + /** + * 插入数据 + * @param saveMemberList + * @return + */ + Boolean saveMemberByDTO(List saveMemberList); + + /** + * 删除微信元素 + * @param removeList + * @return + */ + Boolean removeByWechatId(List removeList); + + /** + * 微信查询群 + * @param wxId + * @return + */ + List queryMemberWechatIdBy(String wxId); +} 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 new file mode 100644 index 0000000..d9562ef --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/WeChatGroupService.java @@ -0,0 +1,41 @@ +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.entity.WeChatAccount; +import com.baiye.modules.scrm.entity.WeChatFriedRecord; +import com.baiye.modules.scrm.entity.WeChatGroup; + +/** + * @author Enzo + * @date 2023/9/5 + */ +public interface WeChatGroupService extends ExtendService { + + + /** + * 获取所有群信息 + * + * @param wxId + * @return + */ + String queryInformation(String wxId); + + + /** + * 群列表 + * + * @param wxId + * @param groupId + * @return + */ + String queryGroupUserList(String wxId, String groupId); + + /** + * 同步群信息 + * @param byWxId + * @param dto + * @return + */ + Boolean syncGroup(WeChatAccount byWxId, GroupCallbackDTO dto); +} 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 93be2fd..b587925 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 @@ -13,6 +13,8 @@ import com.baiye.modules.scrm.vo.AccountStatisticsVO; import com.baiye.modules.scrm.vo.AddFriendVo; import com.baiye.modules.scrm.vo.WeChatAccountVO; +import java.util.List; + /** * @author Enzo * @date 2023/9/5 @@ -48,11 +50,10 @@ public interface WeChatService extends ExtendService { * 创建设备 * * @param num - * @param packageType * @param userId * @return */ - Boolean createEquipment(Integer num, Integer packageType, Long userId); + Boolean createEquipment(Integer num , Long userId); /** * 弹窗登录 @@ -77,6 +78,7 @@ public interface WeChatService extends ExtendService { * @param id * @return */ + Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status, Long userId, Long id); @@ -128,4 +130,18 @@ public interface WeChatService extends ExtendService { * @return */ Boolean logoutByRobotId(Integer robotId); + + /** + * 获取 + * @param qo + * @return + */ + List queryListByQo(AccountQo qo); + + /** + * 同步通讯录 + * @param wxId + * @return + */ + Boolean syncAddressBook(String wxId); } 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 new file mode 100644 index 0000000..2df8ef6 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendServiceImpl.java @@ -0,0 +1,26 @@ +package com.baiye.modules.scrm.service.impl; + +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.scrm.entity.AddFriend; +import com.baiye.modules.scrm.mapper.AddFriendMapper; +import com.baiye.modules.scrm.service.AddFriendService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AddFriendServiceImpl extends ExtendServiceImpl implements AddFriendService { + @Override + public List queryAddSourceByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus) { + return baseMapper.queryByTaskIdAndStatus(taskId, addFriendNum, taskStatus); + } + +} 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 new file mode 100644 index 0000000..d7490e5 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AddFriendTaskServiceImpl.java @@ -0,0 +1,150 @@ +package com.baiye.modules.scrm.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.EasyExcelFactory; +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.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.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.security.util.SecurityUtils; +import com.baiye.util.CronUtil; +import com.baiye.util.FileUtil; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AddFriendTaskServiceImpl extends ExtendServiceImpl implements AddFriendTaskService { + + @Value("${snowflake.workerId}") + private int workerId; + + @Value("${snowflake.datacenterId}") + private int datacenterId; + + + private final AddFriendService addFriendService; + + + private final ElasticJobHandler elasticJobHandler; + + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean createTask(MultipartFile file, CreateAddFriendTaskDTO createAddFriendTaskDTO, Long currentUserId) { + DateTime date = DateUtil.date(); + // 雪花算法id + long taskId = IdUtil.getSnowflake(workerId, datacenterId).nextId(); + Date beginDate = + ObjectUtil.isNotNull(createAddFriendTaskDTO.getDayStartTime()) ? createAddFriendTaskDTO.getStartTime() : DateUtil.beginOfDay(date); + Date endDate = + ObjectUtil.isNotNull(createAddFriendTaskDTO.getDayEndTime()) ? createAddFriendTaskDTO.getDayEndTime() : DateUtil.endOfDay(date); + + 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.setTaskStatus(DefaultNumberConstants.ONE_NUMBER); + if (this.save(friendTask)) { + if (ObjectUtil.isNotNull(file) + && createAddFriendTaskDTO.getAddFriendType() == DefaultNumberConstants.TWO_NUMBER) { + // 解析 文件 + File upload = FileUtil.multiToFile(file); + EasyExcelFactory.read(upload, AddFriendVo.class, new AddFileFriendDataListener<>(addFriendService)); + } + 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); + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + @Override + public AddFriendTask findByTaskId(Long taskId) { + return baseMapper.selectById(taskId); + } + + @Override + public Boolean updateTask(CreateAddFriendTaskDTO createAddFriendTaskDTO) { + AddFriendTask friendTask = baseMapper.selectById(createAddFriendTaskDTO.getId()); + if (ObjectUtil.isNotNull(friendTask) && ObjectUtil.isNotNull(friendTask.getId())) { + BeanUtil.copyProperties(createAddFriendTaskDTO, friendTask); + return SqlHelper.retBool(baseMapper.updateById(friendTask)); + } + return Boolean.FALSE; + } + + @Override + public Boolean updateTaskStatus(Long taskId, Integer taskStatus) { + AddFriendTask friendTask = baseMapper.selectById(taskId); + if (ObjectUtil.isNotNull(friendTask) && ObjectUtil.isNotNull(friendTask.getId())) { + if (taskStatus == DefaultNumberConstants.ONE_NUMBER) { + elasticJobHandler.start(friendTask.getTaskName()); + } + if (taskStatus == DefaultNumberConstants.ZERO_NUMBER) { + elasticJobHandler.pauseJob(friendTask.getTaskName()); + } + friendTask.setTaskStatus(taskStatus); + return SqlHelper.retBool(baseMapper.updateById(friendTask)); + } + return Boolean.FALSE; + } + + @Override + public Boolean del(Long taskId) { + // 删除时任务未执行 文件记录状态回退 + AddFriendTask friendTask = baseMapper.selectById(taskId); + if (ObjectUtil.isNotNull(friendTask) && ObjectUtil.isNotNull(friendTask.getId())) { + // 删除定时任务 + elasticJobHandler.removeJob(friendTask.getTaskName()); + } + return Boolean.FALSE; + } + + @Override + public List queryTaskAndStatus(Integer number) { + return baseMapper.queryByStatus(number); + } + + @Override + public PageResult queryPage(PageParam pageParam, TaskQo qo) { + qo.setUserId(SecurityUtils.getCurrentUserId()); + return baseMapper.queryPage(pageParam, qo); + } + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/AliPayServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AliPayServiceImpl.java index 29fa841..e8ad811 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/service/impl/AliPayServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/AliPayServiceImpl.java @@ -88,7 +88,7 @@ public class AliPayServiceImpl extends ExtendServiceImpl queryPage(PageParam pageParam, AccountQo qo) { - Map map = Maps.newHashMap(); + qo.setUserId(SecurityUtils.getCurrentUserId()); PageResult queryPage = baseMapper.queryPage(pageParam, qo); queryPage.getRecords().forEach(accountVO -> { // 默认离线状态 - accountVO.setStatus(DefaultNumberConstants.ZERO_NUMBER); - map.put("robotId", accountVO.getRobotId()); - String robotResult = HttpUtil.get - (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_ROBOT_TYPE) - .concat(weChatProperties.getAppKey()), map); - if (JSONUtil.isTypeJSON(robotResult)) { - WeChatResponse weChatResponse = JSONUtil.toBean(robotResult, WeChatResponse.class); - if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) { - WeChatAccountDTO dto = BeanUtil.toBean(weChatResponse.getData(), WeChatAccountDTO.class); - if (ObjectUtil.isNotNull(dto) && dto.getPit().equals(accountVO.getPit())) { - accountVO.setCityInfo(dto.getProvince()); - accountVO.setStatus(dto.getStatus()); - } + accountVO.setStatus(DefaultNumberConstants.TWO_NUMBER); + if (StringUtils.isNotBlank(accountVO.getWxId())) { + Map map = ImmutableMap.of + ("wechat", accountVO.getWxId(), "loginType", DefaultNumberConstants.ONE_NUMBER, "needDetailInfo", Boolean.FALSE); + String result = HttpUtil.post + (weChatProperties.getRequestUrl().concat(WeChatPersonRequest.ONLINE_STATUS), map); + if (JSONUtil.isTypeJSON(result)) { + WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class); + WeChatOnlineStatusDTO statusDTO = JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatOnlineStatusDTO.class); + accountVO.setStatus(statusDTO.getStatus()); } } }); diff --git a/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatGroupMemberServiceImpl.java b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatGroupMemberServiceImpl.java new file mode 100644 index 0000000..cf38e21 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WeChatGroupMemberServiceImpl.java @@ -0,0 +1,47 @@ +package com.baiye.modules.scrm.service.impl; + +import cn.hutool.core.convert.Convert; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.scrm.dto.GroupMemberDTO; +import com.baiye.modules.scrm.entity.WeChatGroupMember; +import com.baiye.modules.scrm.mapper.WeChatGroupMemberMapper; +import com.baiye.modules.scrm.service.WeChatGroupMemberService; +import com.baiye.modules.scrm.vo.GroupVO; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/6/7 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WeChatGroupMemberServiceImpl extends ExtendServiceImpl + implements WeChatGroupMemberService { + @Override + public List queryMemberWechatIdByChatRoomId(String userName) { + return this.baseMapper.queryMemberWechatIdByChatRoomId(userName); + } + + @Override + public Boolean saveMemberByDTO(List saveMemberList) { + List list = Convert.toList(WeChatGroupMember.class, saveMemberList); + return this.saveBatch(list); + } + + @Override + public Boolean removeByWechatId(List removeList) { + return baseMapper.deleteByWeChatId(removeList); + } + + @Override + public List queryMemberWechatIdBy(String wxId) { + return Lists.newArrayList(); + } + +} 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 e569c85..be9a13e 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 @@ -3,17 +3,20 @@ package com.baiye.modules.scrm.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.net.URLEncodeUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.http.HttpStatus; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; -import com.baiye.constant.ResponseConstant; -import com.baiye.constant.WeChatRequestConstants; import com.baiye.constant.WechatCallbackConstant; 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.domain.PageParam; import com.baiye.domain.PageResult; import com.baiye.enums.PackageEnum; @@ -56,7 +59,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}") @@ -76,10 +79,17 @@ public class WeChatServiceImpl extends ExtendServiceImpl beanToMap = BeanUtil.beanToMap(createCodeDTO); - String getQrCodeResult = HttpUtil.get - (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_QR_CODE) - .concat(weChatProperties.getAppKey()), beanToMap); + Map hashMap = Maps.newHashMap(); + hashMap.put("client-flag", weChatProperties.getClientFlag()); + hashMap.put("protoVer", String.valueOf(createCodeDTO.getProtoVer())); + hashMap.put("cityName", URLEncodeUtil.encode(createCodeDTO.getCityName())); + String createCodeUrl = weChatProperties.getRequestUrl().concat(WeChatAccountRequest.GET_QR_CODE).concat( + (StringUtils.isBlank(createCodeDTO.getWechat()) ? CharSequenceUtil.EMPTY : createCodeDTO.getWechat()) + .concat("&uuid=").concat(StringUtils.isBlank(createCodeDTO.getWechat()) ? RandomUtil.randomString(DefaultNumberConstants.EIGHT_NUMBER) : CharSequenceUtil.EMPTY)); + if (StringUtils.isNotBlank(createCodeDTO.getPit())) { + hashMap.put("pit", createCodeDTO.getPit()); + } + String getQrCodeResult = HttpUtil.createGet(createCodeUrl).addHeaders(hashMap).execute().body(); log.info("=============== the response as {} =============", getQrCodeResult); if (StringUtils.isNotBlank(getQrCodeResult)) { WeChatResponse weChatResponse = JSONUtil.toBean(getQrCodeResult, WeChatResponse.class); @@ -90,8 +100,8 @@ public class WeChatServiceImpl extends ExtendServiceImpl map = ImmutableMap.of("num", num); - String createEquipmentResult = HttpUtil.get - (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.CREATE_EQUIPMENT) - .concat(weChatProperties.getAppKey()), map); - log.info("=============== the response as {} =============", createEquipmentResult); - if (StringUtils.isNotBlank(createEquipmentResult)) { - WeChatResponse weChatResponse = JSONUtil.toBean(createEquipmentResult, WeChatResponse.class); - if (weChatResponse.getStatus() == ResponseConstant.SUCCESS) { - Integer dayNum = PackageEnum.find(packageType); - if (dayNum > DefaultNumberConstants.ZERO_NUMBER) { - EquipmentDTO dto = BeanUtil.toBean(weChatResponse.getData(), EquipmentDTO.class); - DateTime dateTime = DateUtil.endOfDay(DateUtil.offsetDay(DateUtil.date(), dayNum)); - for (EquipmentDTO.RoBotDTO botDTO : dto.getData()) { - // 创建账号 - LoginEquipment equipment = new LoginEquipment(); - equipment.setUserId(userId); - equipment.setPackageType(packageType); - equipment.setExpirationTime(dateTime); - equipment.setRobotId(botDTO.getRobotId()); - equipment.setPit(botDTO.getRobotAccount()); - // equipment.setDeviceNumber(botDTO.getRobotAccount()); - loginEquipmentService.save(equipment); - } - } - return Boolean.TRUE; - } - } - return Boolean.FALSE; + public Boolean createEquipment(Integer num, Long userId) { + long pit = IdUtil.getSnowflake().nextId(); + // 创建账号 + LoginEquipment equipment = new LoginEquipment(); + equipment.setUserId(userId); + equipment.setPit(String.valueOf(pit)); + loginEquipmentService.save(equipment); + return Boolean.TRUE; } @Override public String pushCode(PushCodeDTO pushCodeDTO) { - LoginEquipment loginEquipment = loginEquipmentService.queryByRobotId(pushCodeDTO.getRobotId()); - if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getExpirationTime())) { - if (loginEquipment.getExpirationTime().before(DateUtil.date())) { - throw new BadRequestException("当前设备已过期请续费后使用!"); - } - } - Map beanToMap = BeanUtil.beanToMap(pushCodeDTO); - String pushQrCodeResult = HttpUtil.get - (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_PUSH_LOGIN) - .concat(weChatProperties.getAppKey()), beanToMap); + String url = weChatProperties.getRequestUrl().concat + (WeChatAccountRequest.PUSH_CODE_LOGIN) + (StringUtils.isEmpty(pushCodeDTO.getWxId()) ? CharSequenceUtil.EMPTY : pushCodeDTO.getWxId()); + Map headMap = Maps.newHashMap(); + headMap.put("pit", pushCodeDTO.getPit()); + headMap.put("protoVer", String.valueOf(pushCodeDTO.getProtoVer())); + String pushQrCodeResult = HttpUtil.createGet(url).addHeaders(headMap).execute().body(); log.info("=============== the response as {} =============", pushQrCodeResult); if (StringUtils.isNotBlank(pushQrCodeResult)) { WeChatResponse weChatResponse = JSONUtil.toBean(pushQrCodeResult, WeChatResponse.class); @@ -166,8 +151,8 @@ public class WeChatServiceImpl extends ExtendServiceImpl strings = Lists.newArrayList(callbackUrl); Map map = ImmutableMap.of("callbackUrls", strings); String globalSetting = HttpUtil.post - (weChatProperties.getGatewayHost().concat - (WeChatRequestConstants.GLOBAL_SETTING).concat(weChatProperties.getAppKey()), JSONUtil.toJsonStr(map)); + (weChatProperties.getRequestUrl().concat + (WeChatAccountRequest.GLOBAL_SETTING), JSONUtil.toJsonStr(map)); if (StringUtils.isNotBlank(globalSetting)) { WeChatResponse weChatResponse = JSONUtil.toBean(globalSetting, WeChatResponse.class); return weChatResponse.getMsg(); @@ -181,7 +166,7 @@ public class WeChatServiceImpl extends ExtendServiceImpl map = Maps.newHashMap(); map.put("robotIds", arrayList); String result = HttpUtil.post - (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.ROBOT_LOGOUT) - .concat(weChatProperties.getAppKey()), map); + (weChatProperties.getRequestUrl().concat(WeChatAccountRequest.ROBOT_LOGOUT), map); log.info("=============== the response as {} =============", result); if (StringUtils.isNotBlank(result) && result.contains(ResponseCode.SUCCESS.getDesc())) { WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class); @@ -337,4 +315,41 @@ public class WeChatServiceImpl extends ExtendServiceImpl queryListByQo(AccountQo qo) { + qo.setUserId(SecurityUtils.getCurrentUserId()); + List listByQo = baseMapper.queryListByQo(qo); + for (WeChatAccountVO accountVO : listByQo) { + Map map = ImmutableMap.of("wechat", accountVO.getWxId(), + "loginType", DefaultNumberConstants.ONE_NUMBER, "needDetailInfo", Boolean.FALSE); + String result = HttpUtil.post + (weChatProperties.getRequestUrl().concat(WeChatPersonRequest.ONLINE_STATUS), map); + if (JSONUtil.isTypeJSON(result)) { + WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class); + WeChatOnlineStatusDTO statusDTO = JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatOnlineStatusDTO.class); + if (ObjectUtil.isNotNull(statusDTO) && ObjectUtil.isNotNull(statusDTO.getStatus())) { + accountVO.setIsOnline(statusDTO.getStatus()); + } + } + } + return listByQo; + } + + @Override + public Boolean syncAddressBook(String wxId) { + Map 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; + } + } + return Boolean.FALSE; + } + } 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 d898c4b..aeb903e 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 @@ -1,26 +1,30 @@ package com.baiye.modules.scrm.service.impl; +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.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.entity.LoginEquipment; -import com.baiye.modules.scrm.service.LoginEquipmentService; -import com.baiye.modules.scrm.service.WeChatService; -import com.baiye.modules.scrm.service.WechatCallbackService; -import com.baiye.modules.scrm.service.WechatFriendService; +import com.baiye.modules.scrm.entity.WeChatAccount; +import com.baiye.modules.scrm.service.*; import com.baiye.notify.event.StationNotifyPushEvent; import com.baiye.notify.model.domain.AnnouncementNotifyInfo; import com.baiye.result.WeChatResponse; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.util.Collections; +import java.util.*; +import java.util.stream.Collectors; /** * @author Enzo @@ -37,10 +41,14 @@ public class WechatCallbackServiceImpl implements WechatCallbackService { private final ApplicationContext publisher; + private final WeChatGroupService weChatGroupService; + private final WechatFriendService wechatFriendService; private final LoginEquipmentService loginEquipmentService; + private final WeChatGroupMemberService weChatGroupMemberService; + @Override public void analyticalData(WeChatResponse weChatResponse) { @@ -56,10 +64,61 @@ public class WechatCallbackServiceImpl implements WechatCallbackService { case WechatCallbackConstant.THROUGH_FRIENDS: viaFriendRequest(weChatResponse); break; + + case WechatCallbackConstant.GROUP_ADDRESS: + syncGroupMember(weChatResponse); + break; default: } } + private void syncGroupMember(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; + } + + 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); + } + } + } public void wechatLogin(WeChatResponse weChatResponse) { @@ -67,7 +126,6 @@ public class WechatCallbackServiceImpl implements WechatCallbackService { JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatUserLoginDTO.class); LoginEquipment robot = loginEquipmentService.queryByRobot(userLoginDTO.getPit()); if (ObjectUtil.isNotNull(robot) && ObjectUtil.isNotNull(robot.getUserId())) { - weChatService.weChatAccountLoginByRespon(userLoginDTO, weChatResponse.getStatus(), robot.getUserId(), robot.getId()); AnnouncementNotifyInfo notifyInfo = new AnnouncementNotifyInfo(); notifyInfo.setTitle("新消息通知"); @@ -78,6 +136,7 @@ public class WechatCallbackServiceImpl implements WechatCallbackService { log.info("============ send message {} ==============", JSONUtil.toJsonStr(notifyInfo)); // 发送消息 publisher.publishEvent(new StationNotifyPushEvent(notifyInfo, Collections.singletonList(robot.getUserId()))); + } } 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 new file mode 100644 index 0000000..c8f0594 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/service/impl/WechatGroupServiceImpl.java @@ -0,0 +1,88 @@ +package com.baiye.modules.scrm.service.impl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.url.WeChatGroupRequest; +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.mapper.WeChatGroupMapper; +import com.baiye.modules.scrm.service.WeChatGroupMemberService; +import com.baiye.modules.scrm.service.WeChatGroupService; +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.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @author Enzo + * @date : 2024/6/4 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatGroupServiceImpl extends ExtendServiceImpl + implements WeChatGroupService { + + private final WeChatProperties weChatProperties; + + private final WeChatGroupMemberService weChatGroupMemberService; + + @Override + public String queryInformation(String wxId) { + + Map map = ImmutableMap.of + ("wechat", wxId, "contactType", DefaultNumberConstants.FIVE_NUMBER, "isSync", Boolean.TRUE); + + 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); + + } + return CharSequenceUtil.EMPTY; + } + + + @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)) { + WeChatResponse weChatResponse = JSONUtil.toBean(userListResult, WeChatResponse.class); + return JSONUtil.toJsonStr(weChatResponse.getData()); + } + return CharSequenceUtil.EMPTY; + } + + @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()); + weChatGroup.setChatRoomNick(dto.getNickName()); + weChatGroup.setChatRoomIcon + (StringUtils.isEmpty(dto.getBigHeadImgUrl()) ? dto.getSmallHeadImgUrl() : dto.getBigHeadImgUrl()); + weChatGroup.setChatRoomOwner(dto.getChatRoomOwner()); + return this.save(weChatGroup); + } + return Boolean.FALSE; + } +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/vo/AddFriendTaskVO.java b/admin/src/main/java/com/baiye/modules/scrm/vo/AddFriendTaskVO.java new file mode 100644 index 0000000..f52ccad --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/vo/AddFriendTaskVO.java @@ -0,0 +1,93 @@ +package com.baiye.modules.scrm.vo; + +import com.baiye.extend.mybatis.plus.converter.JsonStringArrayTypeHandler; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * @author Enzo + * @date : 2024/3/26 + */ +@Data +public class AddFriendTaskVO { + + private Long id; + + @Schema(title = "任务名称") + private String taskName; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "添加类型") + private Integer addFriendType; + + @Schema(title = "任务状态") + private Integer taskStatus; + + @Schema(title = "是否去重") + private Boolean isDuplicate; + + @Schema(title = "开始时间") + private Date startTime; + + @Schema(title = "结束时间") + private Date endTime; + + @Schema(title = "每日结束时间") + private Date dayEndTime; + + @Schema(title = "每日开始时间") + private Date dayStartTime; + + @Schema(title = "通过间隔-开始") + private Integer addIntervalStart; + + @Schema(title = "通过间隔-结束") + private Integer addIntervalEnd; + + @Schema(title = "频繁间隔-开始") + private Integer addFrequentlyStart; + + @Schema(title = "频繁间隔-结束") + private Integer addFrequentlyEnd; + + @Schema(title = "每日添加好友上限") + private Integer addFriendMax; + + @TableField(value = "wechat_flag_list", typeHandler = JsonStringArrayTypeHandler.class) + @Schema(title = "微信标签") + private List wechatFlagList; + + + @TableField(value = "pass_greet_message", typeHandler = JsonStringArrayTypeHandler.class) + @Schema(title = "通过之后好友语句") + private List passGreetMessage; + + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(title = "创建时间") + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(title = "修改时间") + private LocalDateTime updateTime; + + @TableField(value = "execute_wechat_list", typeHandler = JsonStringArrayTypeHandler.class) + @Schema(title = "执行微信号") + private List executeWechatList; + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/vo/FileAddFriendVO.java b/admin/src/main/java/com/baiye/modules/scrm/vo/FileAddFriendVO.java new file mode 100644 index 0000000..b5d41bb --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/vo/FileAddFriendVO.java @@ -0,0 +1,46 @@ +package com.baiye.modules.scrm.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FileAddFriendVO { + + + /** + * 添加好友手机号/微信号 + */ + @ExcelProperty(value = "添加好友手机号/微信号") + private String targetSource; + + /** + * 招呼语 + */ + @ExcelProperty(value = "招呼语") + private String greet; + + /** + * 好友备注 + */ + @ExcelProperty(value = "好友备注") + private String remark; + + /** + * 标签 + */ + @ExcelProperty(value = "标签(英文逗号分隔)") + private String flagArrays; + + + +} 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 new file mode 100644 index 0000000..682b356 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/scrm/vo/GroupVO.java @@ -0,0 +1,15 @@ +package com.baiye.modules.scrm.vo; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/6/7 + */ +@Data +public class GroupVO { + + private Integer verifyFlag; + + +} diff --git a/admin/src/main/java/com/baiye/modules/scrm/vo/WeChatAccountVO.java b/admin/src/main/java/com/baiye/modules/scrm/vo/WeChatAccountVO.java index f9093a2..c0314a7 100644 --- a/admin/src/main/java/com/baiye/modules/scrm/vo/WeChatAccountVO.java +++ b/admin/src/main/java/com/baiye/modules/scrm/vo/WeChatAccountVO.java @@ -82,5 +82,7 @@ public class WeChatAccountVO { @Schema(title = "过期时间") private Date expirationTime; + @Schema(title = "是否在线") + private Integer isOnline; } diff --git a/admin/src/main/java/com/baiye/properties/ConfigurationBeanFactoryMetadata.java b/admin/src/main/java/com/baiye/properties/ConfigurationBeanFactoryMetadata.java new file mode 100644 index 0000000..8bb308a --- /dev/null +++ b/admin/src/main/java/com/baiye/properties/ConfigurationBeanFactoryMetadata.java @@ -0,0 +1,84 @@ +package com.baiye.properties; + +/** + * @author Enzo + * @date : 2024/6/2 + */ + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.boot.context.properties.ConfigurationPropertiesBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.annotation.AnnotationUtils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * Utility class to memorize {@code @Bean} definition metadata during initialization of + * the bean factory. + * + * @author Dave Syer + * @since 1.1.0 + * @deprecated since 2.2.0 for removal in 2.4.0 in favor of + * {@link ConfigurationPropertiesBean} + */ +@Deprecated +public class ConfigurationBeanFactoryMetadata implements ApplicationContextAware { + + /** + * The bean name that this class is registered with. + */ + public static final String BEAN_NAME = ConfigurationBeanFactoryMetadata.class.getName(); + + private ConfigurableApplicationContext applicationContext; + + public Map getBeansWithFactoryAnnotation(Class type) { + Map result = new HashMap<>(); + for (String name : this.applicationContext.getBeanFactory().getBeanDefinitionNames()) { + if (findFactoryAnnotation(name, type) != null) { + result.put(name, this.applicationContext.getBean(name)); + } + } + return result; + } + + public A findFactoryAnnotation(String beanName, Class type) { + Method method = findFactoryMethod(beanName); + return (method != null) ? AnnotationUtils.findAnnotation(method, type) : null; + } + + public Method findFactoryMethod(String beanName) { + ConfigurableListableBeanFactory beanFactory = this.applicationContext.getBeanFactory(); + if (beanFactory.containsBeanDefinition(beanName)) { + BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName); + if (beanDefinition instanceof RootBeanDefinition) { + return ((RootBeanDefinition) beanDefinition).getResolvedFactoryMethod(); + } + } + return null; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = (ConfigurableApplicationContext) applicationContext; + } + + static void register(BeanDefinitionRegistry registry) { + if (!registry.containsBeanDefinition(BEAN_NAME)) { + GenericBeanDefinition definition = new GenericBeanDefinition(); + definition.setBeanClass(ConfigurationBeanFactoryMetadata.class); + definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + registry.registerBeanDefinition(ConfigurationBeanFactoryMetadata.BEAN_NAME, definition); + } + } + +} diff --git a/admin/src/main/java/com/baiye/schedule/AccountTask.java b/admin/src/main/java/com/baiye/schedule/AccountTask.java deleted file mode 100644 index bf19550..0000000 --- a/admin/src/main/java/com/baiye/schedule/AccountTask.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.baiye.schedule; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.http.HttpUtil; -import com.baiye.constant.DefaultNumberConstants; -import com.baiye.constant.WeChatRequestConstants; -import com.baiye.modules.scrm.entity.LoginEquipment; -import com.baiye.modules.scrm.service.LoginEquipmentService; -import com.baiye.system.properties.WeChatProperties; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -/** - * @author Enzo - * @date : 2024/4/10 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class AccountTask { - - - private final WeChatProperties weChatProperties; - - private final LoginEquipmentService loginEquipmentService; - - - /** - * 批量下线 - */ - @Scheduled(cron = "0 0 1 * * ? ") - public void updateAccountMassNum() { - List arrayList = Lists.newArrayList(); - List equipmentList = - loginEquipmentService.findExpiredAccount(); - if (CollUtil.isNotEmpty(equipmentList)) { - for (LoginEquipment equipment : equipmentList) { - DateTime dateTime = DateUtil.offsetDay - (equipment.getExpirationTime(), DefaultNumberConstants.FIFTEEN_NUMBER); - if (dateTime.before(DateUtil.date())) { - arrayList.add(equipment.getRobotId()); - } - } - if (CollUtil.isNotEmpty(arrayList)) { - Map map = Maps.newHashMap(); - map.put("robotIds", arrayList); - String result = HttpUtil.post - (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.ROBOT_LOGOUT) - .concat(weChatProperties.getAppKey()), map); - log.info("========== the response as {} ==========", result); - } - } - - } -} diff --git a/admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java b/admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java new file mode 100644 index 0000000..7cfd55c --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/handler/AddFriendJob.java @@ -0,0 +1,80 @@ +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.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.service.AddFriendService; +import com.baiye.modules.scrm.service.AddFriendTaskService; +import com.baiye.security.userdetails.User; +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; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +@Slf4j +@Component +public class AddFriendJob implements SimpleJob { + @Resource + private AddFriendTaskService addFriendTaskService; + + @Resource + private AddFriendService addFriendService; + + /** + * 添加业务逻辑 + * + * @param shardingContext + */ + @Override + public void execute(ShardingContext shardingContext) { + Date now = new 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) { + + // 添加好友 + 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(); + + HttpUtil.post("", JSONUtil.toJsonStr(addFriendDTO)); + if (Boolean.TRUE){ + addFriend.setAddStatus(DefaultNumberConstants.ONE_NUMBER); + addFriendService.updateById(addFriend); + } + } + }*/ + + 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 8327381..25aa131 100644 --- a/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java +++ b/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java @@ -1,13 +1,21 @@ 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.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; +import java.util.stream.Collectors; /** * @author Enzo @@ -21,6 +29,9 @@ public class ScanDynamicJobHandler { @Resource private ElasticJobService elasticJobService; + @Resource + private AddFriendTaskService addFriendTaskService; + /** * 扫描动态任务列表,并添加任务 *

@@ -30,12 +41,18 @@ public class ScanDynamicJobHandler { * @date 2021/4/26 9:15 下午 */ public void scanAddJob() { - // 这里为从MySQL数据库读取job_dynamic_task表的数据,微服务项目中建议使用feign从业务服务获取,避免本服务过度依赖业务的问题,然后业务服务新增动态任务也通过feign调取本服务JobOperateController实现,从而相对独立本服务模块 - List jobDynamicTaskList = this.elasticJobService.getAllList(); - log.info("扫描动态任务列表,并添加任务:本次共扫描到{}条任务。", jobDynamicTaskList.size()); - for (JobDynamicTask jobDynamicTask : jobDynamicTaskList) { + // 这里为从MySQL数据库读取job_dynamic_task表的数据, + // 微服务项目中建议使用feign从业务服务获取,避免本服务过度依赖业务的问题,然后业务服务新增动态任务也通过feign调取本服务JobOperateController实现,从而相对独立本服务模块 + 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()); + // 创建任务 - elasticJobHandler.addJob(jobDynamicTask.getJobName(), jobDynamicTask.getCron(), 1, new DynamicJob(), jobDynamicTask.getParameters(), jobDynamicTask.getDescription()); + elasticJobHandler.addJob(addFriendTask.getTaskName(), generatedCronByTime, DefaultNumberConstants.ONE_NUMBER, new AddFriendJob(),String.valueOf(addFriendTask.getId()), CharSequenceUtil.EMPTY); } } } diff --git a/admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java b/admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java index dadcb03..a2ac709 100644 --- a/admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java +++ b/admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java @@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper; * @date : 2024/5/28 */ @Mapper -public interface JobDynamicTaskMapper extends ExtendMapper { +public interface JobDynamicTaskMapper extends ExtendMapper { } diff --git a/admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java b/admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java index 46e4644..119a548 100644 --- a/admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java +++ b/admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java @@ -16,4 +16,11 @@ public interface ElasticJobService extends ExtendService { * @return */ List getAllList(); + + /** + * 任务ID查询数据 + * @param taskIdList + * @return + */ + List getAllListByTaskId(List taskIdList); } diff --git a/admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java b/admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java index 737671e..cb79545 100644 --- a/admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java +++ b/admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java @@ -25,4 +25,10 @@ public class ElasticJobServiceImpl extends ExtendServiceImpl getAllListByTaskId(List taskIdList) { + + return baseMapper.selectList(WrappersX.lambdaQueryX(JobDynamicTask.class).in(JobDynamicTask::getStatus, DefaultNumberConstants.ONE_NUMBER)); + } + } diff --git a/admin/src/main/resources/application-dev.yml b/admin/src/main/resources/application-dev.yml index ecceb42..5208930 100644 --- a/admin/src/main/resources/application-dev.yml +++ b/admin/src/main/resources/application-dev.yml @@ -44,5 +44,5 @@ mybatis-plus: log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl #关闭sql日志 wechat: - gatewayHost: https://fission-server.scrm-ai.com - appKey: SFkWRAued71GvCeClj8efDhAG6bJ2rzT + requestUrl: http://test.ipad.ecofanli.com + clientFlag: shen0604 diff --git a/admin/src/main/resources/application-prod.yml b/admin/src/main/resources/application-prod.yml index dbfe044..2fecfb9 100644 --- a/admin/src/main/resources/application-prod.yml +++ b/admin/src/main/resources/application-prod.yml @@ -35,5 +35,5 @@ alipay: encryptKey: wechat: - gatewayHost: https://fission-server.scrm-ai.com - appKey: uNE5DXdjwQa1iE8cBVZJbuvGfr5t9R73 + requestUrl: http://test.ipad.ecofanli.com + clientFlag: shen0604 diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml index 81dd8c3..8fdae6c 100644 --- a/admin/src/main/resources/application.yml +++ b/admin/src/main/resources/application.yml @@ -9,8 +9,15 @@ spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 - - + cloud: + nacos: + discovery: + server-addr: localhost:8848 + config: + server-addr: localhost:8848 + file-extension: yml + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} # 天爱图形验证码 captcha: secondary: @@ -57,6 +64,7 @@ ballcat: - /outside/** - /wechat/global/setting - /pay/aliPay/pay-notify + - /api/wechat/callback # 项目 redis 缓存的 key 前缀 redis: key-prefix: 'marketing:' diff --git a/log/history/2024-03-25.gz b/log/history/2024-03-25.gz new file mode 100644 index 0000000000000000000000000000000000000000..fb04115f90a5051eca185781b1cb739f4451a0bd GIT binary patch literal 6330 zcmV;r7)9qFiwFP!000000PQ{7lH0bD@26_NATQk1R@pgaFrqG_OV(RwJTs1+*kd2d zNov03syVdTJR)@5EhSeRlhoe@1)NfnHH}5*_;N65eH?x>8LzhG`^FlBA zJ*x->y2117r>~3+#QLGr3wS&;=iY?HAx)ThOMTC!36D)LOc3Uq%f$1|Us)_X9%gk3 zws#gh`?ZDtStH|F)`IbC)`D?nw#}aT)PqL;?Qdz#Zw~HMx0QA(pkDa#Za6$JC)8Ur zQ?`8`MZV|IWS8b~LgT~>XGXc4u@ngYiQZDfG6!bseYrO_U=y2it&BinNswF4U8Fl?DbK24@P4s41jY(O|;iS77Q2qp}H1Tfc_ ztPN^-p;2G|yC!V2J`LO6&Y3agzR&NFNtO}CeCqkk@Pt8~#Jgo9<6D>AeydCJaMZJU zH6&ZXZ|85Ws{}S!Pk=~aiYNwh%z#D_i_Ht<@N1gPU&{2@p<&44^7!9)QG|U^g`NWS zJYGLxG*kl{(tsHc#9CbNaO%xesRsrPUE{%qTacfyAVWMZmsarSIEALvVWuJ5r+&<+ zyEa@l^+J#Ui7x@h3dD(s|6QMbXMa-mU3yOP9C&mn1Iy*VvQV-_hkf_Ly0bqe>t3>O zc_{0OWxujcyozTu^ghT%;7}G;)%nUw@rL{CP!<-;er26vhsGo>m;cH_@rz*bq3kP` z{mMGY4xPzcF8`HI`M8goSPm6IEtTMC30;M#9xry}vpap(bC3 z4hvXVXIO_k@uuqx_jyHyzd93_Fhi^OvX_y+)KvPc%MAW&VGhoDPpHaaKXU?1(W6hVb;m8ofGL}}hsmTDVHR|^3 z+}!%eAO(8n%yjsgC(N8DNn}~(Gx>AvaZu6;cer2b`t#6BJnDNNP?oYX&pe|(l0OqLoM@6KgghNA!bq1iI~y$0PlYj^d!VFKBT@CzO$P>01&K&s7* zljb|0JJg?ZfzRLnzE6T~vzkCN^uP+P-n@DB zrZQ#<=84OfnTC*SuI%Vb1-K|q)>60BWPf*%Id1x%NXE=(PBP}<3rJjoK>UtzS8o;q zLidp|VGaeYYbZAAW6yjh ze~{uaXt13brm|mi?h^}Onf#ijwsvcehG+LcEa>DQf|2b&Gnide{_ANT?x)auJ_j>)QOZ(mFkPau^PHQ-^dXOCSr>zdmh^6Nz zxOdY!`@TK=9t3${v|6Li(D?D?+dn@CP#>CT<~%O#J(+=+^8k!1rmg8de=ipFmgYm4 z@2Gt-bcZgFAHRyJ<1^!e#}QY${0pHU#pLnD$OiLk23o;*3M+uHadXpNxHtJ|*o#`xPXS> zm!mo&@EdC51P=k6G2L1*6VevdW`8;zH4mrkE58dOf`L8iC2Ko-Ae=6fd7I#09;X|E z1pQ|gABPGI?SO~2`XT6PmD{@<*=mg;0fp6@bj&le0}PC~@Gy>rb?qqyPb&tO2({gf zkS#(}X@a04ns}jWx53^tdpmHV;F7hcz=r|JL^4T~Q5LdJja4Q}=n!@SJjkeI9c^I0tTMl=bJ%z!ZEN8+-x>`NkGCSrl zO%R#TZkNR|Sdn1Tq>u0A^ZRWPXqncaE}N)qZN!TP6_L%|V0*%Ok^%`n6LrikmJ&u{=6cB9 zzG<~TQi`Zjhf(5j8@&Hy>9FiqO|CQGpw%+pT)ntDA75?dk?p*L@qo(*idO#3lp#39 z=CG|!SZ?KzVooCra}}+vLXl=2j|0~>|F#-QmUlds$r2^43Wv%$9zzn-P=I@wkdWd@ zNU{vQ)t)ihSN?cva6UTKq5&Bv?Ct)pHNpcbZ^4`-W^(7rPJh*u!Wd9{xCJ8$cDT}z zm4V{|Q3N7SlMG;ihVAZvi3A^p2KWH>S2&|SMQgjeNdMxR(N@oL{b+y8JUhtTs{IJ(8%Pwexys*=t`vG@4|<@@2m4A8S>iA%7W4*| z3u+6szmlcRG)=&zgIR$hRFOlvhf9&{u0I92k$+{w7SP!_+W?3Hd^-MB8u8eLwoVNq zYkUGK)plsj0IN)$vDLzT$0jw1A?K4}O}V__;v;g6B|bG3nP-{_#$JL-g>`5{Ll%t2 z$x^r?eNg>d+$HwVw0a*1GYu19WasL!}*-9 zaXt?w{KigyEVS#}XK9k8$tFvLvS-DfJQPvE9mqYUM~-g^X)hPZj|E6Zl>W7F+&U^j zRH6Y7wh624?ZMi9GuXLW-+)rptbE$4Ou5=0=+RcrLp7r|-9V*2$JPut1cQv)o6F#Qrx zhF(rNx3U3PxD#ieSYy7HL?a{Bu?AZmSh#pCP0~)Dly+$6==mWj-<}$h*v7MBTWz~c z;J7B8q<=FlrXI@%}%p|C5f`3iVdgG z%_&!u5<~rB-x0#-GeP--q{;MFcXVYY*2yfjm+vU02_h3}imMl|b~A{|I3YS%ajK9p|MaLf;n^yTo4Bkl z;`%`NZV3G7;CChpjE17ryo8+!0ni%Umg8m$cq$ZZ6@eo!Bc|JEHW^x|aJsV<#rK?S z25VjdYurGlE{J%p)@I zNKD0pr@OccxjNWz6#rO);`u-X6hmDYrvN~L2S(D|c79^ypdJLy9O!4+FUee4JjrdN znQrwe^N7mRRt{+!xy#H}49%s^7C>%2LCE@{UZcx?$!2azGpx0n zK~%=km>l`iOBs!Vo(f0I94}I9a1lugZi*#;p{MYq-q+gzhyonecEOZXHgP{SBUR$S zlRCZ^vh;7u9Gb(fN)VOM?&X>#OJUQc3j^Y?t=M)81g%w>MPyc!Q+B{Xs|7`hXX}cf zqqi*7f!HQaDHRcOl127=$0&x1EnsVZ8%8ATbVgj2)po3hiAHeNVC_NShG&Bh!UvAW zE%le>?e(p^(__u_bp_H)W1najJz15EkYsf#JBP1=QriGIRpXBOoB$EaNS<}wMpVkx zHm8EM_`_F!v8|BFBdrU2fIG9D-3+2KbbIA;XY)jO#6tAMm+B~Ct1?SE)Y?99HKNq4 zO@kZN7z<@|QA1TIEAm~%C7!*+b5jKfQIOO0C*L=#>rB3%c0wkmYP$|)s?IeK?%A~MD_=IoHS)=AHFBWUGOzQ#jRH=#FWVEb(( zAEtRno@c4bBAvs}wiM9a&2Jq6-YpeCH;oc-jbO%|fhsA2hy>}K6h|4AFBE3GCIB$y zn}jM#+QGf8iY)2z9oUiloFcxoP&%iWgVJ+~?ZO7mcBVA1H8kZ6jmD`b=Fr}1BL9$h z875x9WWNSmAlV-c87#G)tnS)rtN5tX8V<8qhPEdX47sbH+|0=+M!5k?s5+OZTs?ey zN27iuG)7@(N1Xb8X-6C&x;x@F^}Pw5P$~Ls%^EODGdp>rtb#UXbv$SyJD{D9SApO1ZYqHc8w^*4US-B2~r&11fe%PT@MF7jQreD$Jcf zbmR%ZEJ-?tAOG7Yf#MceGAO2rrLzRExg#6Ser5b)kR??(IjP3bw7siGrMPBP(H|G7y6BQ~B(vIl1ldN;C2#uJyw4%jbq2 zU)zN)zN|k(4`8M?S%)yBGqs;OY<4>GfMYhBrLj>2txjbJa(@Pup0xu-&8Km;{oox@ z%A9$vQP=G&KY;w1=#LDo%_@QhaBAZ;t*Uiag%^#{d5)H$~x<0 z&clvn*<&ajCBoi@?zVd&=Te$bpUF#m0)Mchg$9OItqyk^H6E@8XW!Xx=m!=X7xS10 z)EHm>ob`K~fP+dETeMZ#Co!k4Lt!1QZ}zaFwF7s^N1FCfdk||sA_TeYq}ldw6Bblw zc%jSh#A|-X;_)0NpnZ#0Ol8?u5evuTXLgO!sqFsC_4uDJ)L;2wVi+{wL!B(!>1*98 zo!&B5(iks2C+31rlZ zY7(zA$4^+(gso-CE9kvDsaI(id>IQ5#7OSEU=1YhHmIgiJqLX0`fPs*JRqPtI`hI6 z8mvRJg=ruZDw95Lv*!2;&Bzt0hC>@DKB~P3jM}w3`Hcee#x`NiCeRLKIDg~LH-K~^A&VAFwBJRidxdZ&bg;KyKHf-AGI zqjZ4nAL`g^S5@08fI+(Y>Ka8ixm%EQK=u?1qhPzpKLFzRo*gek@D5Sc%Jmn^kl8vS zTjKpy9sh;YF{mn~fU}7Wde7QBu|Jo-{#;smThkn>uxpFfEyk%<`{B`ehc^sd z=!x%%IdiegbqsoBcpG6%g{wiow{B4Soc&f5Z+aW3*`%)I!Ruc>A|Q{lPJ6EL*l4XR zoKQVF>2-Vf@W=?+j3a-LjcU?Cxh|G!z@~oj(hPD1ep;gV)b#2ffs?vC$zRIv)bCvF zhgpVt;PW`9#iZBLc5|iy}3$ zW2p($+{a7UkS5txtCiLiX5N&1?NAQ&ZbJn@kZsI8XKuKh327*#=fsQ%9SxD-D?O&X z+SF6|j=#jS#~?U=`>c|4pz=%wC4ZZ+LOu$@uPz9ru!61<{6rRvtC3!8#x6pg}s4+P}0xZ>HS=Sl0GfmcaXQH%P8-$NMd%YN)d+O%{{kK<_HG&84BT z?ZOSHRcwc8TrP&nd0<+dGY~)U7+hgI{OQ-1xq3$fYhVrseGLbwKk8T`_&exiS8#6K zl{x3&q$^wg;4GxmwGa7+enSiYfYa_0375pUxPl%zHE|v+PFRyj*su%Fn^sDol}8K6u>v-hd+|ZYQG#8%hcV*0x?VT^tsq=6&3Nl zdQ9VA#;>ogFLgX7)r;Y1Fc{vCEPMf>lblCG>wb82Poa}dzq|VVuD`CnnVv{HkBK~H zncaDwM@V*+gwzUb6?tF`AKml&oZBy6jWzBB-gKaMKnFfLRyCp8x=5E|x4{q_4juDu zn{mH)KlAOxa<^w4YQmJW<|6t3b_Za?o&IULQ!68drVTM)Cg7aksmNd2`_ZmYH0jUR wW%*+~8n*5$vVXtJ^6 literal 0 HcmV?d00001 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 6948434..19146ba 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 @@ -25,6 +25,13 @@ public class WechatCallbackConstant { public static final int LOGIN_SUCCESS = 201; + /** + * 群通讯录回调 + */ + public static final int GROUP_ADDRESS = 223; + + + /** * 登录失败 */ diff --git a/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java similarity index 73% rename from admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java rename to marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java index 6675028..43bbfb4 100644 --- a/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatAccountRequest.java @@ -1,17 +1,25 @@ -package com.baiye.constant; +package com.baiye.constant.url; /** * @author Enzo * @date 2024-3-27 */ -public interface WeChatRequestConstants { +public interface WeChatAccountRequest { /** * 获取二维码 */ - String GET_QR_CODE = "/api/qrCodeLogin/"; + String GET_QR_CODE = "/wechat/v1/ios?wechat?"; + + + /** + * 弹窗登录 + */ + String PUSH_CODE_LOGIN = "/wechat/v1/pushLogin?wechat="; + + /** * 批量下线 @@ -22,6 +30,7 @@ public interface WeChatRequestConstants { + /** * 全局设置 */ @@ -54,4 +63,7 @@ public interface WeChatRequestConstants { String WE_CHAT_ADD_FRIEND = "/api/add-now-friend-phone/"; + + + } diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatFriendRequest.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatFriendRequest.java new file mode 100644 index 0000000..9b9ba6d --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatFriendRequest.java @@ -0,0 +1,25 @@ +package com.baiye.constant.url; + +/** + * @author Enzo + * @date : 2024/5/31 + */ +public interface WeChatFriendRequest { + + /** + * 添加好友 + */ + String ADD_FRIEND = "/wechat/v1/addfriends"; + + + /** + * 好友信息 + */ + String FRIEND_INFO = "/wechat/v1/friendinfo"; + + /** + * 修改好友信息 + */ + String UPDATE_FRIEND_INFO = "/wechat/v1/markfriend"; + +} 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 new file mode 100644 index 0000000..480f7ce --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatGroupRequest.java @@ -0,0 +1,27 @@ +package com.baiye.constant.url; + +/** + * @author Enzo + * @date : 2024/6/3 + */ +public interface WeChatGroupRequest { + + /** + * 创建群 + */ + String GREAT_GROUP = "/wechat/v1/creategroup"; + + + /** + * 获取群信息 + */ + 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 new file mode 100644 index 0000000..89bcda8 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WeChatPersonRequest.java @@ -0,0 +1,34 @@ +package com.baiye.constant.url; + +/** + * @author Enzo + * @date : 2024/6/3 + */ +public interface WeChatPersonRequest { + + /** + * 在线状态 + */ + String ONLINE_STATUS = "/wechat/v1/wecatstatus"; + + + /** + * 在线状态 + */ + String SYNC_ADDRESS_BOOK = "/wechat/v1/syncContact"; + + + + /** + * 获取标签好友列表 + */ + String GET_LABEL_WX_LIST = "/wechat/v1/getLabelWxList"; + + /** + * 修改个人标签 + */ + String MODIFY_WECHAT_LABEL = "/wechat/v1/modifyLabel"; + + + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatCircleFriendRequest.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatCircleFriendRequest.java new file mode 100644 index 0000000..3ea432d --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatCircleFriendRequest.java @@ -0,0 +1,8 @@ +package com.baiye.constant.url; + +/** + * @author Enzo + * @date : 2024/5/31 + */ +public interface WechatCircleFriendRequest { +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatLoginRequest.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatLoginRequest.java new file mode 100644 index 0000000..8c743ae --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/url/WechatLoginRequest.java @@ -0,0 +1,8 @@ +package com.baiye.constant.url; + +/** + * @author Enzo + * @date : 2024/5/31 + */ +public interface WechatLoginRequest { +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/JobEnum.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/JobEnum.java new file mode 100644 index 0000000..4e69a88 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/JobEnum.java @@ -0,0 +1,31 @@ +package com.baiye.enums; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +public enum JobEnum { + + EVERY("每天", 0), + DAY("日", 1), + MONTH("月", 2), + WEEK("周", 3), + YEAR("年", 4), + ; + + JobEnum(String name, Integer value) { + this.name = name; + this.value = value; + } + + private final String name; + private final Integer value; + + public Integer getValue() { + return value; + } + + public String getName() { + return name; + } +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/pojo/CronModel.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/pojo/CronModel.java new file mode 100644 index 0000000..034c0d5 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/pojo/CronModel.java @@ -0,0 +1,96 @@ +package com.baiye.pojo; + +import com.baiye.enums.JobEnum; + +/** + * @author Enzo + * @date : 2024/6/2 + */ +public class CronModel { + + Integer[] dayOfWeeks; + + Integer[] dayOfMonths; + + Integer[] months; + + Integer second; + + Integer minute; + + Integer hour; + + /** + * 类型 + */ + JobEnum jobType; + /** + * 间隔 + */ + Integer beApart; + + public Integer[] getDayOfWeeks() { + return dayOfWeeks; + } + + public void setDayOfWeeks(Integer[] dayOfWeeks) { + this.dayOfWeeks = dayOfWeeks; + } + + public Integer[] getDayOfMonths() { + return dayOfMonths; + } + + public void setDayOfMonths(Integer[] dayOfMonths) { + this.dayOfMonths = dayOfMonths; + } + + public Integer[] getMonths() { + return months; + } + + public void setMonths(Integer[] months) { + this.months = months; + } + + public Integer getSecond() { + return second == null ? 0 : second; + } + + public void setSecond(Integer second) { + this.second = second; + } + + public Integer getMinute() { + return minute == null ? 0 : minute; + } + + public void setMinute(Integer minute) { + this.minute = minute; + } + + public Integer getHour() { + + return hour == null ? 0 : hour; + } + + public void setHour(Integer hour) { + this.hour = hour; + } + + public JobEnum getJobType() { + return jobType == null ? JobEnum.DAY : jobType; + } + + public void setJobType(JobEnum jobType) { + this.jobType = jobType; + } + + public Integer getBeApart() { + return beApart; + } + + public void setBeApart(Integer beApart) { + this.beApart = beApart; + } +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/util/CronUtil.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/util/CronUtil.java new file mode 100644 index 0000000..e88a09e --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/util/CronUtil.java @@ -0,0 +1,278 @@ +package com.baiye.util; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.enums.JobEnum; +import com.baiye.pojo.CronModel; +import org.springframework.scheduling.support.CronSequenceGenerator; +import org.springframework.scheduling.support.CronTrigger; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Cron表达式工具类(quartz类) + * 符号表示的值: + * * 表示所有值; + * ? 表示未说明的值,即不关心它为何值; + * - 表示一个指定的范围; + * , 表示附加一个可能值; + * / 符号前表示开始时间,符号后表示每次递增的值; + * L("last") ("last") "L" 用在day-of-month字段意思是 "这个月最后一天"; + * W("weekday") 只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五) + * + * @author lenovo + */ +public class CronUtil { + + + /** + * 构建Cron表达式 + * 目前支持三种常用的cron表达式 + * 1.每天的某个时间点执行 例:12 12 12 * * 表示每天12时12分12秒执行 + * 2.每周的哪几天执行 例:12 12 12 ? * 1,2,3表示每周的周1周2周3 ,12时12分12秒执行 + * 3.每月的哪几天执行 例:12 12 12 1,21,13 * ?表示每月的1号21号13号 12时12分12秒执行 + */ + public static String createCronExpression(CronModel cronModel) { + StringBuilder cronExp = new StringBuilder(); + + if (null == cronModel.getJobType()) { + System.out.println("执行周期未配置");//执行周期未配置 + } + + if (null != cronModel.getSecond() + && null != cronModel.getMinute() + && null != cronModel.getHour()) { + //秒 + cronExp.append(cronModel.getSecond()).append(" "); + //分 + cronExp.append(cronModel.getMinute()).append(" "); + //小时 + cronExp.append(cronModel.getHour()).append(" "); + //每天 + if (cronModel.getJobType().getValue() == 1) { + //12 12 12 1/2 * ? * + //12 12 12 * * ? + if (cronModel.getBeApart() != null) { + cronExp.append("1");//日 + cronExp.append("/"); + cronExp.append(cronModel.getBeApart() + 1);//月 + cronExp.append(" "); + cronExp.append("* "); + cronExp.append("?"); + } else { + cronExp.append("* ");//日 + cronExp.append("* ");//月 + cronExp.append("?");//周 + } + } + + //按每周 + else if (cronModel.getJobType().getValue() == 3) { + //一个月中第几天 + cronExp.append("? "); + //月份 + cronExp.append("* "); + //周 + Integer[] weeks = cronModel.getDayOfWeeks(); + for (int i = 0; i < weeks.length; i++) { + if (i == 0) { + cronExp.append(weeks[i]); + } else { + cronExp.append(",").append(weeks[i]); + } + } + + } + //按每月 + else if (cronModel.getJobType().getValue() == 2) { + //一个月中的哪几天 + Integer[] days = cronModel.getDayOfMonths(); + for (int i = 0; i < days.length; i++) { + if (i == 0) { + if (days[i] == 32) { + //本月最后一天 + String endMouthCron = "0 0 0 L * ?"; + return endMouthCron; + } else { + cronExp.append(days[i]); + } + } else { + cronExp.append(",").append(days[i]); + } + } + //月份 + cronExp.append(" * "); + //周 + cronExp.append("?"); + } + //按每年 + else if (cronModel.getJobType().getValue() == 4) { + //一个年中的哪几天 + Integer[] days = cronModel.getDayOfMonths(); + if (ArrayUtil.isEmpty(days)) { + cronExp.append("*"); + } else { + for (int i = 0; i < days.length; i++) { + if (i == 0) { + cronExp.append(days[i]); + } else { + cronExp.append(",").append(days[i]); + } + } + } + //月份 + Integer[] months = cronModel.getMonths(); + if (ArrayUtil.isEmpty(months)) { + cronExp.append(" *"); + } else { + for (int i = 0; i < months.length; i++) { + Integer month = months[i]; + if (month > 12) { + throw new RuntimeException("月份数据异常: " + Arrays.toString(months)); + } + if (i == 0) { + cronExp.append(" ").append(month); + } else { + cronExp.append(",").append(month); + } + } + } + cronExp.append(" ?"); + } else if (cronModel.getJobType().getValue() == 0) { + cronExp.append("* ");//日 + cronExp.append("* ");//月 + cronExp.append("?");//周 + } + } + return cronExp.toString(); + } + + /** + * 生成计划的详细描述 + * + * @param cronModel + * @return String + */ + public static String createDescription(CronModel cronModel) { + StringBuffer description = new StringBuffer(""); + //计划执行开始时间 +// Date startTime = cronModel.getScheduleStartTime(); + + if (null != cronModel.getSecond() + && null != cronModel.getMinute() + && null != cronModel.getHour()) { + //按每天 + if (cronModel.getJobType().getValue() == 1) { + Integer beApart = cronModel.getBeApart(); + if (beApart != null) { + description.append("每间隔").append(beApart).append("天"); + } else { + description.append("每天"); + } + description.append(cronModel.getHour()).append("时"); + description.append(cronModel.getMinute()).append("分"); + description.append(cronModel.getSecond()).append("秒"); + description.append("执行"); + } + + //按每周 + else if (cronModel.getJobType().getValue() == 3) { + if (cronModel.getDayOfWeeks() != null && cronModel.getDayOfWeeks().length > 0) { + String days = ""; + for (int i : cronModel.getDayOfWeeks()) { + days += "周" + i; + } + description.append("每周的").append(days).append(" "); + } + if (null != cronModel.getSecond() + && null != cronModel.getMinute() + && null != cronModel.getHour()) { + description.append(","); + description.append(cronModel.getHour()).append("时"); + description.append(cronModel.getMinute()).append("分"); + description.append(cronModel.getSecond()).append("秒"); + } + description.append("执行"); + } + + //按每月 + else if (cronModel.getJobType().getValue() == 2) { + //选择月份 + if (cronModel.getDayOfMonths() != null && cronModel.getDayOfMonths().length > 0) { + String days = ""; + for (int i : cronModel.getDayOfMonths()) { + days += i + "号"; + } + description.append("每月的").append(days).append(" "); + } + description.append(cronModel.getHour()).append("时"); + description.append(cronModel.getMinute()).append("分"); + description.append(cronModel.getSecond()).append("秒"); + description.append("执行"); + } + + } + return description.toString(); + } + + + /** + * 构建Cron表达式 + * + * @param rate 第几位 + * @param cycle 数值 + * @return + */ + public static String createLoopCronExpression(int rate, int cycle) { + String cron = ""; + switch (rate) { + case 0:// 每cycle秒执行一次 + cron = "0/" + cycle + " * * * * ?"; + break; + case 1:// 每cycle分钟执行一次 + cron = "0 0/" + cycle + " * * * ?"; + break; + case 2:// 每cycle小时执行一次 + cron = "0 0 0/" + cycle + " * * ?"; + break; + case 3:// 每cycle天的0点执行一次 + cron = "0 0 0 1/" + cycle + " * ?"; + break; + case 4:// 每cycle月的1号0点执行一次 + cron = "0 0 0 1 1/" + cycle + " ? "; + break; + case 5:// 每天cycle点执行一次 + cron = "0 0 " + cycle + " * * ?"; + break; + default:// 默认每cycle秒执行一次 + cron = "0/1 * * * * ?"; + break; + } + return cron; + } + + public static void main(String[] args) { + DateTime parse = DateUtil.parse("2024-6-4 18:32:49"); + System.out.println(generateCronByTime(DateUtil.date(), parse, 10, 20)); + } + + + public static String generateCronByTime(Date startDate, Date endDate, Integer startIntervalTime, Integer endIntervalTime) { + + Integer startHour = DateUtil.hour(startDate, Boolean.TRUE); + Integer endHour = DateUtil.hour(endDate, Boolean.TRUE); + String hourStr = startHour + StrPool.DASHED + endHour; + + return DefaultNumberConstants.ZERO_NUMBER + CharSequenceUtil.SPACE + startIntervalTime + + StrPool.DASHED + endIntervalTime + CharSequenceUtil.SPACE + hourStr + " * * ?"; + + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java b/marketing-scrm-common/common-core/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java new file mode 100644 index 0000000..bc7ec2b --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java @@ -0,0 +1,79 @@ +package org.springframework.boot.context.properties; + + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.annotation.AnnotationUtils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * Utility class to memorize {@code @Bean} definition metadata during initialization of + * the bean factory. + * + * @author Dave Syer + * @since 1.1.0 + * @deprecated since 2.2.0 for removal in 2.4.0 in favor of + * {@link ConfigurationPropertiesBean} + */ +@Deprecated +public class ConfigurationBeanFactoryMetadata implements ApplicationContextAware { + + /** + * The bean name that this class is registered with. + */ + public static final String BEAN_NAME = ConfigurationBeanFactoryMetadata.class.getName(); + + private ConfigurableApplicationContext applicationContext; + + public Map getBeansWithFactoryAnnotation(Class type) { + Map result = new HashMap<>(); + for (String name : this.applicationContext.getBeanFactory().getBeanDefinitionNames()) { + if (findFactoryAnnotation(name, type) != null) { + result.put(name, this.applicationContext.getBean(name)); + } + } + return result; + } + + public A findFactoryAnnotation(String beanName, Class type) { + Method method = findFactoryMethod(beanName); + return (method != null) ? AnnotationUtils.findAnnotation(method, type) : null; + } + + public Method findFactoryMethod(String beanName) { + ConfigurableListableBeanFactory beanFactory = this.applicationContext.getBeanFactory(); + if (beanFactory.containsBeanDefinition(beanName)) { + BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName); + if (beanDefinition instanceof RootBeanDefinition) { + return ((RootBeanDefinition) beanDefinition).getResolvedFactoryMethod(); + } + } + return null; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = (ConfigurableApplicationContext) applicationContext; + } + + static void register(BeanDefinitionRegistry registry) { + if (!registry.containsBeanDefinition(BEAN_NAME)) { + GenericBeanDefinition definition = new GenericBeanDefinition(); + definition.setBeanClass(ConfigurationBeanFactoryMetadata.class); + definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + registry.registerBeanDefinition(ConfigurationBeanFactoryMetadata.BEAN_NAME, definition); + } + } + +} diff --git a/marketing-scrm-common/common-model/src/main/java/com/baiye/result/WeChatResponse.java b/marketing-scrm-common/common-model/src/main/java/com/baiye/result/WeChatResponse.java index 9da46eb..a99f12e 100644 --- a/marketing-scrm-common/common-model/src/main/java/com/baiye/result/WeChatResponse.java +++ b/marketing-scrm-common/common-model/src/main/java/com/baiye/result/WeChatResponse.java @@ -21,6 +21,8 @@ public class WeChatResponse implements Serializable { private String msg; + private String wxId; + private Integer status; private Boolean success; diff --git a/marketing-scrm-common/common-redis/src/main/java/com/baiye/RedisHelper.java b/marketing-scrm-common/common-redis/src/main/java/com/baiye/RedisHelper.java index 76ab09f..d9ed7db 100644 --- a/marketing-scrm-common/common-redis/src/main/java/com/baiye/RedisHelper.java +++ b/marketing-scrm-common/common-redis/src/main/java/com/baiye/RedisHelper.java @@ -6,6 +6,7 @@ import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisStreamCommands; import org.springframework.data.redis.connection.RedisZSetCommands; import org.springframework.data.redis.connection.stream.*; +import org.springframework.data.redis.connection.stream.Record; import org.springframework.data.redis.core.*; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; diff --git a/marketing-scrm-starters/marketing-scrm-starter-job/pom.xml b/marketing-scrm-starters/marketing-scrm-starter-job/pom.xml index 432f9c7..c9e6d5d 100644 --- a/marketing-scrm-starters/marketing-scrm-starter-job/pom.xml +++ b/marketing-scrm-starters/marketing-scrm-starter-job/pom.xml @@ -17,7 +17,6 @@ - com.github.kuhn-he elastic-job-lite-spring-boot-starter @@ -52,42 +51,22 @@ zookeeper - - - - org.apache.curator - curator-framework 2.12.0 - - org.apache.curator - curator-client - 2.12.0 - - - org.apache.curator - curator-recipes - 2.12.0 - - - org.apache.zookeeper - zookeeper - - - + - org.apache.zookeeper - zookeeper - 3.4.13 + com.baiye + marketing-scrm-extend-mybatis-plus - org.slf4j - slf4j-log4j12 + guava + com.google.guava + diff --git a/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/handler/ElasticJobHandler.java b/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/handler/ElasticJobHandler.java index 4508f13..d761f19 100644 --- a/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/handler/ElasticJobHandler.java +++ b/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/handler/ElasticJobHandler.java @@ -1,10 +1,11 @@ package com.baiye.common.job.handler; + +import com.baiye.common.job.lintener.ElasticJobListener; import com.dangdang.ddframe.job.api.simple.SimpleJob; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration; import com.dangdang.ddframe.job.event.JobEventConfiguration; -import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener; import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration; import com.dangdang.ddframe.job.lite.internal.schedule.JobRegistry; import com.dangdang.ddframe.job.lite.internal.schedule.JobScheduleController; @@ -44,7 +45,10 @@ public class ElasticJobHandler { public void addJob(String jobName, String cron, int shardingTotalCount, SimpleJob instance, String parameters, String description) { log.info("动态创建定时任务:jobName = {}, cron = {}, shardingTotalCount = {}, parameters = {}", jobName, cron, shardingTotalCount, parameters); - LiteJobConfiguration.Builder builder = LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(JobCoreConfiguration.newBuilder(jobName, cron, shardingTotalCount).jobParameter(parameters).description(description).build(), instance.getClass().getName())).overwrite(true); + LiteJobConfiguration.Builder builder = LiteJobConfiguration.newBuilder + (new SimpleJobConfiguration(JobCoreConfiguration.newBuilder + (jobName, cron, shardingTotalCount).jobParameter(parameters).description(description).build(), + instance.getClass().getName())).overwrite(true); LiteJobConfiguration liteJobConfiguration = builder.build(); new SpringJobScheduler(instance, zookeeperRegistryCenter, liteJobConfiguration, jobEventConfiguration, elasticJobListener).init(); @@ -87,12 +91,13 @@ public class ElasticJobHandler { public void pauseJob(String jobName) { JobScheduleController jobScheduleController = JobRegistry.getInstance().getJobScheduleController(jobName); if (jobScheduleController != null) { + log.info("================== 暂停定时任务:jobName = {} ==================", jobName); jobScheduleController.pauseJob(); } } /** - * 恢复任务 + * 判断是否暂停 */ public Boolean isPaused(String jobName) { JobScheduleController jobScheduleController = JobRegistry.getInstance().getJobScheduleController(jobName); @@ -119,6 +124,7 @@ public class ElasticJobHandler { public void start(String jobName) { JobScheduleController jobScheduleController = JobRegistry.getInstance().getJobScheduleController(jobName); if (jobScheduleController != null) { + log.info("================== 启动定时任务:jobName = {} ==================", jobName); jobScheduleController.triggerJob(); } } diff --git a/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/lintener/ElasticJobListener.java b/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/lintener/ElasticJobListener.java index 5f0c6d7..ce3a5f4 100644 --- a/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/lintener/ElasticJobListener.java +++ b/marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/lintener/ElasticJobListener.java @@ -1,5 +1,6 @@ package com.baiye.common.job.lintener; + import com.dangdang.ddframe.job.executor.ShardingContexts; import com.dangdang.ddframe.job.lite.api.listener.AbstractDistributeOnceElasticJobListener; @@ -22,4 +23,6 @@ public class ElasticJobListener extends AbstractDistributeOnceElasticJobListener public void doAfterJobExecutedAtLastCompleted(ShardingContexts shardingContexts) { // 任务执行完成后更新状态为已执行,当前未处理 } + + } diff --git a/marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/WeChatProperties.java b/marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/WeChatProperties.java index f4d210b..308582d 100644 --- a/marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/WeChatProperties.java +++ b/marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/WeChatProperties.java @@ -15,9 +15,9 @@ import org.springframework.stereotype.Component; @ConfigurationProperties(prefix = "wechat") public class WeChatProperties { - private String gatewayHost; + private String requestUrl; - private String appKey; + private String clientFlag; } diff --git a/pom.xml b/pom.xml index 195a40d..aaf7534 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,8 @@ 3.1.0 1.6.13 0.0.39 + 2021.0.3 + 2021.0.4.0 4.11.28.ALL @@ -411,7 +413,6 @@ ${zip4j.version} - com.alipay.sdk @@ -419,10 +420,27 @@ ${alipay.version} + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import + +