添加好友逻辑

main
bynt 4 months ago
parent 5157bba8ac
commit 8bf63db6cb

@ -109,6 +109,18 @@
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>
<build>
<plugins>

@ -33,7 +33,6 @@
<artifactId>marketing-scrm-starter-job</artifactId>
</dependency>
<dependency>
<groupId>com.baiye</groupId>
<artifactId>admin-core</artifactId>
@ -87,7 +86,6 @@
</dependency>
<!-- API, java.xml.bind module -->
<!-- add it when jdk11 -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
@ -148,6 +146,22 @@
</dependency>
<!-- nacos discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>

@ -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<T> implements ReadListener<T> {
/**
* 5使100list 便
*/
private static final int BATCH_COUNT = 500;
/**
*
*/
private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final ExtendService<T> extendService;
public AddFileFriendDataListener(ExtendService<T> 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("存储数据库成功!");
}
}

@ -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<PageResult<AddFriendTaskVO>> getClueRecordPage(@Validated PageParam pageParam, TaskQo qo) {
return R.ok(addFriendTaskService.queryPage(pageParam, qo));
}
@PostMapping("/create/task")
@Operation(summary = "创建任务")
public R<String> 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<String> updateTask(@RequestBody CreateAddFriendTaskDTO createAddFriendTaskDTO) {
return Boolean.TRUE.equals(addFriendTaskService.updateTask(createAddFriendTaskDTO)) ? R.ok() : R.failed("创建任务失败");
}
@PostMapping("/update/taskStatus")
@Operation(summary = "修改任务")
public R<String> 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<Void> deleteByUserId(@PathVariable("id") Long taskId) {
return addFriendTaskService.del(taskId) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除失败");
}
}

@ -75,8 +75,8 @@ public class WeChatController {
@GetMapping("/create/equipment")
@Operation(summary = "创建设备")
public R<String> createEquipment(Integer num, Integer packageType) {
return Boolean.TRUE.equals(weChatService.createEquipment(num, packageType, SecurityUtils.getCurrentUserId())) ? R.ok() : R.failed("创建设备失败");
public R<String> 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<Object> syncAddressBook(String wxId) {
return R.ok(weChatService.syncAddressBook(wxId));
}
@GetMapping("/robot/logout")
@Operation(summary = "退出登录")
public R<Boolean> robotLogout(Integer robotId) {
return R.ok(weChatService.logoutByRobotId(robotId));
}
@GetMapping("/list")
@Operation(summary = "查询账号列表")
public R<List<WeChatAccountVO>> getClueRecordPage(AccountQo qo) {
return R.ok(weChatService.queryListByQo(qo));
}
}

@ -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<Object> queryInformation(String wxId) {
return R.ok(weChatGroupService.queryInformation(wxId));
}
@GetMapping("/user/list")
@Operation(summary = "群成员")
public R<Object> queryGroupUserList(String wxId, String groupId) {
return R.ok(weChatGroupService.queryGroupUserList(wxId, groupId));
}
}

@ -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);
}

@ -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<String> targetWechat;
}

@ -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<AddFriendDTO> addFriendDTOList;
@Schema(title = "通过之后好友语句")
private List<String> passGreetMessage;
}

@ -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;
}

@ -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<GroupMemberDTO> chatRoomMemberDetail;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<String> wechatFlagList;
@TableField(value = "pass_greet_message", typeHandler = JsonStringArrayTypeHandler.class)
@Schema(title = "通过之后好友语句")
private List<String> passGreetMessage;
@TableField(value = "execute_wechat_list", typeHandler = JsonStringArrayTypeHandler.class)
@Schema(title = "执行微信号")
private List<String> executeWechatList;
}

@ -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;
}

@ -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;
}

@ -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<AddFriend> {
/**
* ID
*
* @param taskId
* @param addFriendNum
* @param taskStatus
* @return
*/
default List<AddFriend> queryByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus){
return selectList(WrappersX.lambdaQueryX(AddFriend.class).eq
(AddFriend::getTaskId, taskId).eq(AddFriend::getAddStatus, taskStatus).orderByDesc(AddFriend::getId).last(" limit " + addFriendNum));
}
}

@ -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<AddFriendTask> {
/**
*
*
* @param number
* @return
*/
default List<AddFriendTask> 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<AddFriendTaskVO> queryPage(PageParam pageParam, TaskQo qo) {
IPage<AddFriendTask> page = this.prodPage(pageParam);
LambdaQueryWrapperX<AddFriendTask> 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<AddFriendTaskVO> voPage = page.convert(AddFriendTaskConverter.INSTANCE::entityToVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

@ -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<WeChatAccount> {
.eq(WeChatAccount::getDeleted, DefaultNumberConstants.ZERO_NUMBER);
return SqlHelper.retBool(this.update(null, wrapper));
}
default List<WeChatAccountVO> queryListByQo(AccountQo qo){
LambdaQueryWrapperX<WeChatAccount> wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class);
List<WeChatAccount> weChatAccounts = this.selectList(wrapperX.eq(WeChatAccount::getUserId, qo.getUserId()));
return Convert.toList(WeChatAccountVO.class, weChatAccounts);
}
}

@ -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<WeChatGroup> {
/**
* count
*
* @param userName
* @return
*/
default Long countByUserName(String userName) {
return this.selectCount(WrappersX.lambdaQueryX(WeChatGroup.class).eq(WeChatGroup::getChatRoomId, userName));
}
}

@ -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<WeChatGroupMember> {
/**
*
*
* @param userName
* @return
*/
default List<String> queryMemberWechatIdByChatRoomId(String userName) {
LambdaQueryWrapperX<WeChatGroupMember> select =
WrappersX.lambdaQueryX(WeChatGroupMember.class).eq(WeChatGroupMember::getChatRoomId, userName).select(WeChatGroupMember::getWxId);
return this.selectList(select).stream().map(WeChatGroupMember::getWxId).collect(Collectors.toList());
}
/**
* id
* @param removeList
* @return
*/
default Boolean deleteByWeChatId(List<String> removeList){
return SqlHelper.retBool(this.delete(WrappersX.lambdaQueryX
(WeChatGroupMember.class).in(WeChatGroupMember::getWxId, removeList)));
}
}

@ -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;
}

@ -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<AddFriend> {
/**
* ID
*
* @param taskId
* @param addFriendNum
* @param taskStatus
* @return
*/
List<AddFriend> queryAddSourceByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus);
}

@ -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<AddFriendTask> {
/**
*
*
* @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<AddFriendTask> queryTaskAndStatus(Integer number);
/**
*
* @param pageParam
* @param qo
* @return
*/
PageResult<AddFriendTaskVO> queryPage(PageParam pageParam, TaskQo qo);
}

@ -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<WeChatGroupMember> {
/**
*
* @param userName
* @return
*/
List<String> queryMemberWechatIdByChatRoomId(String userName);
/**
*
* @param saveMemberList
* @return
*/
Boolean saveMemberByDTO(List<GroupMemberDTO> saveMemberList);
/**
*
* @param removeList
* @return
*/
Boolean removeByWechatId(List<String> removeList);
/**
*
* @param wxId
* @return
*/
List<GroupVO> queryMemberWechatIdBy(String wxId);
}

@ -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<WeChatGroup> {
/**
*
*
* @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);
}

@ -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<WeChatAccount> {
*
*
* @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<WeChatAccount> {
* @param id
* @return
*/
Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status, Long userId, Long id);
@ -128,4 +130,18 @@ public interface WeChatService extends ExtendService<WeChatAccount> {
* @return
*/
Boolean logoutByRobotId(Integer robotId);
/**
*
* @param qo
* @return
*/
List<WeChatAccountVO> queryListByQo(AccountQo qo);
/**
*
* @param wxId
* @return
*/
Boolean syncAddressBook(String wxId);
}

@ -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<AddFriendMapper, AddFriend> implements AddFriendService {
@Override
public List<AddFriend> queryAddSourceByTaskIdAndStatus(String taskId, Integer addFriendNum, Integer taskStatus) {
return baseMapper.queryByTaskIdAndStatus(taskId, addFriendNum, taskStatus);
}
}

@ -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<AddFriendTaskMapper, AddFriendTask> 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<String> listList = createAddFriendTaskDTO.getAddFriendDTOList()
.stream().map(AddFriendDTO::getTrumpetWechat).collect(Collectors.toList());
// 创建任务
AddFriendTask friendTask = new AddFriendTask();
BeanUtil.copyProperties(createAddFriendTaskDTO, friendTask);
friendTask.setId(taskId);
friendTask.setExecuteWechatList(listList);
friendTask.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<AddFriendTask> queryTaskAndStatus(Integer number) {
return baseMapper.queryByStatus(number);
}
@Override
public PageResult<AddFriendTaskVO> queryPage(PageParam pageParam, TaskQo qo) {
qo.setUserId(SecurityUtils.getCurrentUserId());
return baseMapper.queryPage(pageParam, qo);
}
}

@ -88,7 +88,7 @@ public class AliPayServiceImpl extends ExtendServiceImpl<PayOrderMapper, PayOrde
order.setStatus(DefaultNumberConstants.ONE_NUMBER);
if (Boolean.FALSE.equals(order.getIsRenew())) {
// 创建设备
weChatService.createEquipment(order.getNum(), order.getPayType(), order.getUserId());
weChatService.createEquipment(order.getNum(), order.getUserId());
}
if (Boolean.TRUE.equals(order.getIsRenew())) {
// 续费操作设备
@ -157,7 +157,7 @@ public class AliPayServiceImpl extends ExtendServiceImpl<PayOrderMapper, PayOrde
throw new BadRequestException("至多创建三台免费设备!");
}
// 创建设备
weChatService.createEquipment(num, packageType, userId);
weChatService.createEquipment(num, userId);
map.put("orderNo", orderNo);
return map;
}

@ -1,18 +1,17 @@
package com.baiye.modules.scrm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.WeChatRequestConstants;
import com.baiye.constant.url.WeChatPersonRequest;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.scrm.dto.WeChatAccountDTO;
import com.baiye.modules.scrm.dto.WeChatOnlineStatusDTO;
import com.baiye.modules.scrm.entity.LoginEquipment;
import com.baiye.modules.scrm.mapper.LoginEquipmentMapper;
import com.baiye.modules.scrm.qo.AccountQo;
@ -22,8 +21,9 @@ import com.baiye.modules.scrm.vo.WeChatAddFriendVo;
import com.baiye.result.WeChatResponse;
import com.baiye.security.util.SecurityUtils;
import com.baiye.system.properties.WeChatProperties;
import com.google.common.collect.Maps;
import com.google.common.collect.ImmutableMap;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@ -42,24 +42,21 @@ public class LoginEquipmentServiceImpl extends ExtendServiceImpl<LoginEquipmentM
@Override
public PageResult<WeChatAccountVO> queryPage(PageParam pageParam, AccountQo qo) {
Map<String, Object> map = Maps.newHashMap();
qo.setUserId(SecurityUtils.getCurrentUserId());
PageResult<WeChatAccountVO> 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<String, Object> 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());
}
}
});

@ -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
<WeChatGroupMemberMapper, WeChatGroupMember> implements WeChatGroupMemberService {
@Override
public List<String> queryMemberWechatIdByChatRoomId(String userName) {
return this.baseMapper.queryMemberWechatIdByChatRoomId(userName);
}
@Override
public Boolean saveMemberByDTO(List<GroupMemberDTO> saveMemberList) {
List<WeChatGroupMember> list = Convert.toList(WeChatGroupMember.class, saveMemberList);
return this.saveBatch(list);
}
@Override
public Boolean removeByWechatId(List<String> removeList) {
return baseMapper.deleteByWeChatId(removeList);
}
@Override
public List<GroupVO> queryMemberWechatIdBy(String wxId) {
return Lists.newArrayList();
}
}

@ -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<WeChatAccountMapper, WeChatAccount> implements WeChatService {
public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, com.baiye.modules.scrm.entity.WeChatAccount> implements WeChatService {
@Value("${snowflake.workerId}")
@ -76,10 +79,17 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, We
@Override
public String createQrCode(CreateCodeDTO createCodeDTO) {
Map<String, Object> beanToMap = BeanUtil.beanToMap(createCodeDTO);
String getQrCodeResult = HttpUtil.get
(weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_QR_CODE)
.concat(weChatProperties.getAppKey()), beanToMap);
Map<String, String> 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<WeChatAccountMapper, We
@Override
public Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO) {
String addedFriendResult = HttpUtil.post(weChatProperties.getGatewayHost().concat
(WeChatRequestConstants.WE_CHAT_ADD_FRIEND).concat(weChatProperties.getAppKey()), JSONUtil.toJsonStr(weChatFriendDTO));
String addedFriendResult = HttpUtil.post(weChatProperties.getRequestUrl().concat
(WeChatFriendRequest.ADD_FRIEND), JSONUtil.toJsonStr(weChatFriendDTO));
log.info("=============== the response as {} =============", addedFriendResult);
if (addedFriendResult.contains(ResponseCode.SUCCESS.getDesc())) {
WeChatResponse weChatResponse = JSONUtil.toBean(addedFriendResult, WeChatResponse.class);
@ -110,49 +120,24 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, We
}
@Override
public Boolean createEquipment(Integer num, Integer packageType, Long userId) {
Map<String, Object> 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<String, Object> 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<String, String> 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<WeChatAccountMapper, We
List<String> strings = Lists.newArrayList(callbackUrl);
Map<String, Object> 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<WeChatAccountMapper, We
if (ObjectUtil.isNull(byWxId) || ObjectUtil.isNull(byWxId.getId())) {
Long saveId = IdUtil.getSnowflake(workerId, datacenterId).nextId();
WeChatEquipment equipment = new WeChatEquipment();
byWxId = new WeChatAccount();
byWxId = new com.baiye.modules.scrm.entity.WeChatAccount();
BeanUtil.copyProperties(userLoginDTO, byWxId);
byWxId.setHeaderUrl(userLoginDTO.getBigHeadImgUrl());
byWxId.setId(saveId);
@ -193,17 +178,12 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, We
return this.save(byWxId);
}
BeanUtil.copyProperties(userLoginDTO, byWxId);
byWxId.setUserId(userId);
Long counted = weChatEquipmentMapper.countEquipment(byWxId.getId(), id);
if (counted == DefaultNumberConstants.ZERO_NUMBER) {
WeChatEquipment equipment = new WeChatEquipment();
equipment.setEquipmentId(id);
equipment.setUserId(userId);
equipment.setAccountId(byWxId.getId());
weChatEquipmentMapper.insert(equipment);
}
byWxId.setStatus(status == WechatCallbackConstant.LOGIN_SUCCESS ?
DefaultNumberConstants.ONE_NUMBER : DefaultNumberConstants.MINUS_ONE_NUMBER);
byWxId.setHeaderUrl(userLoginDTO.getBigHeadImgUrl());
byWxId.setNickname(userLoginDTO.getNickname());
byWxId.setWxId(userLoginDTO.getWxId());
byWxId.setUserId(userId);
return this.updateById(byWxId);
}
@ -275,7 +255,7 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, We
}
@Override
public WeChatAccount findByWxId(String robotWxId) {
public com.baiye.modules.scrm.entity.WeChatAccount findByWxId(String robotWxId) {
return baseMapper.findByWxId(robotWxId);
}
@ -292,8 +272,7 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, We
for (WeChatAccountVO weChatAccount : weChatAccounts) {
map.put("robotId", weChatAccount.getRobotId());
String robotResult = HttpUtil.get
(weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_ROBOT_TYPE)
.concat(weChatProperties.getAppKey()), map);
(weChatProperties.getRequestUrl().concat(WeChatAccountRequest.GET_ROBOT_TYPE), map);
if (JSONUtil.isTypeJSON(robotResult)) {
WeChatResponse weChatResponse = JSONUtil.toBean(robotResult, WeChatResponse.class);
if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) {
@ -325,8 +304,7 @@ public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, We
Map<String, Object> 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<WeChatAccountMapper, We
return Boolean.FALSE;
}
@Override
public List<WeChatAccountVO> queryListByQo(AccountQo qo) {
qo.setUserId(SecurityUtils.getCurrentUserId());
List<WeChatAccountVO> listByQo = baseMapper.queryListByQo(qo);
for (WeChatAccountVO accountVO : listByQo) {
Map<String, Object> 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<String, Object> map = ImmutableMap.of("wechat", wxId,
"isSync", Boolean.FALSE, "contactType", DefaultNumberConstants.ONE_NUMBER);
String result = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatPersonRequest.SYNC_ADDRESS_BOOK), map);
if (JSONUtil.isTypeJSON(result)) {
WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class);
if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
}

@ -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<GroupCallbackDTO> 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<String> stringList =
weChatGroupMemberService.queryMemberWechatIdByChatRoomId(dto.getUserName());
// 同步群成员
Map<String, GroupMemberDTO> dtoMap =
dto.getChatRoomMemberDetail().stream().collect(Collectors.toMap(GroupMemberDTO::getUserName, account -> account));
// 回调返回的
Set<String> callBackSet
= dto.getChatRoomMemberDetail().stream().map(GroupMemberDTO::getUserName).collect(Collectors.toSet());
Set<String> newHashSet = Sets.newHashSet(stringList);
// 删除已经存在数据
dtoMap.keySet().removeIf(stringList::contains);
// 只保存剩余value值
List<GroupMemberDTO> saveMemberList = dtoMap.values().
stream().collect(Collectors.toList());
weChatGroupMemberService.saveMemberByDTO(saveMemberList);
// 不存在
List<String> removeList = Lists.newArrayList(Sets.difference(newHashSet, callBackSet));
if (CollUtil.isNotEmpty(removeList)) {
weChatGroupMemberService.removeByWechatId(removeList);
}
}
}
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())));
}
}

@ -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
<WeChatGroupMapper, WeChatGroup> implements WeChatGroupService {
private final WeChatProperties weChatProperties;
private final WeChatGroupMemberService weChatGroupMemberService;
@Override
public String queryInformation(String wxId) {
Map<String, Object> map = ImmutableMap.of
("wechat", wxId, "contactType", DefaultNumberConstants.FIVE_NUMBER, "isSync", Boolean.TRUE);
String getQrCodeResult = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatGroupRequest.GROUP_CONVERSATION), map);
if (StringUtils.isNotBlank(getQrCodeResult)) {
WeChatResponse weChatResponse = JSONUtil.toBean(getQrCodeResult, WeChatResponse.class);
List<GroupCallbackDTO> dtoList = JSONUtil.toList(JSONUtil.toJsonStr(weChatResponse.getData()), GroupCallbackDTO.class);
}
return CharSequenceUtil.EMPTY;
}
@Override
public String queryGroupUserList(String wxId, String groupId) {
Map<String, Object> map = ImmutableMap.of("wechat", wxId,
"groupid", groupId, "detail", Boolean.TRUE, "sync", Boolean.TRUE);
String userListResult = HttpUtil.post
(weChatProperties.getRequestUrl().concat(WeChatGroupRequest.GROUP_INFO), map);
if (StringUtils.isNotBlank(userListResult)) {
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;
}
}

@ -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<String> wechatFlagList;
@TableField(value = "pass_greet_message", typeHandler = JsonStringArrayTypeHandler.class)
@Schema(title = "通过之后好友语句")
private List<String> 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<String> executeWechatList;
}

@ -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;
}

@ -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;
}

@ -82,5 +82,7 @@ public class WeChatAccountVO {
@Schema(title = "过期时间")
private Date expirationTime;
@Schema(title = "是否在线")
private Integer isOnline;
}

@ -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 <A extends Annotation> Map<String, Object> getBeansWithFactoryAnnotation(Class<A> type) {
Map<String, Object> 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 extends Annotation> A findFactoryAnnotation(String beanName, Class<A> 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);
}
}
}

@ -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<Integer> arrayList = Lists.newArrayList();
List<LoginEquipment> 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<String, Object> 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);
}
}
}
}

@ -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<AddFriend> 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));
}
}
}

@ -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;
/**
*
* <p>
@ -30,12 +41,18 @@ public class ScanDynamicJobHandler {
* @date 2021/4/26 9:15
*/
public void scanAddJob() {
// 这里为从MySQL数据库读取job_dynamic_task表的数据微服务项目中建议使用feign从业务服务获取避免本服务过度依赖业务的问题然后业务服务新增动态任务也通过feign调取本服务JobOperateController实现从而相对独立本服务模块
List<JobDynamicTask> jobDynamicTaskList = this.elasticJobService.getAllList();
log.info("扫描动态任务列表,并添加任务:本次共扫描到{}条任务。", jobDynamicTaskList.size());
for (JobDynamicTask jobDynamicTask : jobDynamicTaskList) {
// 这里为从MySQL数据库读取job_dynamic_task表的数据
// 微服务项目中建议使用feign从业务服务获取避免本服务过度依赖业务的问题然后业务服务新增动态任务也通过feign调取本服务JobOperateController实现从而相对独立本服务模块
List<AddFriendTask> addFriendTaskList = addFriendTaskService.queryTaskAndStatus(DefaultNumberConstants.ONE_NUMBER);
log.info("扫描动态任务列表,并添加任务:本次共扫描到{}条任务。", addFriendTaskList.size());
for (AddFriendTask addFriendTask : addFriendTaskList) {
String generatedCronByTime = CronUtil.generateCronByTime
(addFriendTask.getDayStartTime(), addFriendTask.getDayEndTime(),
addFriendTask.getAddIntervalStart(), addFriendTask.getAddIntervalEnd());
// 创建任务
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);
}
}
}

@ -9,6 +9,6 @@ import org.apache.ibatis.annotations.Mapper;
* @date : 2024/5/28
*/
@Mapper
public interface JobDynamicTaskMapper extends ExtendMapper<JobDynamicTask> {
public interface JobDynamicTaskMapper extends ExtendMapper<JobDynamicTask> {
}

@ -16,4 +16,11 @@ public interface ElasticJobService extends ExtendService<JobDynamicTask> {
* @return
*/
List<JobDynamicTask> getAllList();
/**
* ID
* @param taskIdList
* @return
*/
List<JobDynamicTask> getAllListByTaskId(List<Long> taskIdList);
}

@ -25,4 +25,10 @@ public class ElasticJobServiceImpl extends ExtendServiceImpl<JobDynamicTaskMappe
return baseMapper.selectList(WrappersX.lambdaQueryX(JobDynamicTask.class).eq(JobDynamicTask::getStatus, DefaultNumberConstants.ONE_NUMBER));
}
@Override
public List<JobDynamicTask> getAllListByTaskId(List<Long> taskIdList) {
return baseMapper.selectList(WrappersX.lambdaQueryX(JobDynamicTask.class).in(JobDynamicTask::getStatus, DefaultNumberConstants.ONE_NUMBER));
}
}

@ -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

@ -35,5 +35,5 @@ alipay:
encryptKey:
wechat:
gatewayHost: https://fission-server.scrm-ai.com
appKey: uNE5DXdjwQa1iE8cBVZJbuvGfr5t9R73
requestUrl: http://test.ipad.ecofanli.com
clientFlag: shen0604

@ -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:'

Binary file not shown.

@ -25,6 +25,13 @@ public class WechatCallbackConstant {
public static final int LOGIN_SUCCESS = 201;
/**
*
*/
public static final int GROUP_ADDRESS = 223;
/**
*
*/

@ -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/";
}

@ -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";
}

@ -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";
}

@ -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";
}

@ -0,0 +1,8 @@
package com.baiye.constant.url;
/**
* @author Enzo
* @date : 2024/5/31
*/
public interface WechatCircleFriendRequest {
}

@ -0,0 +1,8 @@
package com.baiye.constant.url;
/**
* @author Enzo
* @date : 2024/5/31
*/
public interface WechatLoginRequest {
}

@ -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;
}
}

@ -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;
}
}

@ -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.*;
/**
* Cronquartz
*
* *
* ?
* -
* ,
* /
* L("last") ("last") "L" day-of-month "这个月最后一天"
* W("weekday") day-of-month
*
* @author lenovo
*/
public class CronUtil {
/**
* Cron
* cron
* 1. :12 12 12 * * 121212
* 2. :12 12 12 ? * 1,2,3123 ,121212
* 3. :12 12 12 1,21,13 * ?12113 121212
*/
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 + " * * ?";
}
}

@ -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 <A extends Annotation> Map<String, Object> getBeansWithFactoryAnnotation(Class<A> type) {
Map<String, Object> 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 extends Annotation> A findFactoryAnnotation(String beanName, Class<A> 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);
}
}
}

@ -21,6 +21,8 @@ public class WeChatResponse<T extends Serializable> implements Serializable {
private String msg;
private String wxId;
private Integer status;
private Boolean success;

@ -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;

@ -17,7 +17,6 @@
</properties>
<dependencies>
<dependency>
<groupId>com.github.kuhn-he</groupId>
<artifactId>elastic-job-lite-spring-boot-starter</artifactId>
@ -52,42 +51,22 @@
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<groupId>com.baiye</groupId>
<artifactId>marketing-scrm-extend-mybatis-plus</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

@ -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();
}
}

@ -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) {
// 任务执行完成后更新状态为已执行,当前未处理
}
}

@ -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;
}

@ -35,6 +35,8 @@
<maven-surefire-plugin.version>3.1.0</maven-surefire-plugin.version>
<nexus-staging-maven-plugin.version>1.6.13</nexus-staging-maven-plugin.version>
<spring-javaformat-checkstyle.version>0.0.39</spring-javaformat-checkstyle.version>
<spring-cloud.version>2021.0.3</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
<!-- 依赖版本 -->
<alipay-sdk.version>4.11.28.ALL</alipay-sdk.version>
@ -411,7 +413,6 @@
<version>${zip4j.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>
@ -419,10 +420,27 @@
<version>${alipay.version}</version>
</dependency>
<!--spring cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--region 环境变量-->
<profiles>
<profile>

Loading…
Cancel
Save