diff --git a/admin/pom.xml b/admin/pom.xml index 2c8d604..6e042bc 100644 --- a/admin/pom.xml +++ b/admin/pom.xml @@ -25,7 +25,7 @@ com.baiye - marketing-platform-starter-websocket + admin-websocket ${revision} diff --git a/admin/src/main/java/com/baiye/Task/AccountTask.java b/admin/src/main/java/com/baiye/Task/AccountTask.java new file mode 100644 index 0000000..35002f3 --- /dev/null +++ b/admin/src/main/java/com/baiye/Task/AccountTask.java @@ -0,0 +1,64 @@ +package com.baiye.Task; + +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.distribute.entity.LoginEquipment; +import com.baiye.modules.distribute.service.LoginEquipmentService; +import com.baiye.system.properties.WeChatProperties; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * @author Enzo + * @date : 2024/4/10 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AccountTask { + + + private final WeChatProperties weChatProperties; + + private final LoginEquipmentService loginEquipmentService; + + + /** + * 批量下线 + */ + @Scheduled(cron = "0 0 1 * * ? ") + public void updateAccountMassNum() { + List arrayList = Lists.newArrayList(); + List equipmentList = + loginEquipmentService.findExpiredAccount(); + if (CollUtil.isNotEmpty(equipmentList)) { + for (LoginEquipment equipment : equipmentList) { + DateTime dateTime = DateUtil.offsetDay + (equipment.getExpirationTime(), DefaultNumberConstants.FIFTEEN_NUMBER); + if (dateTime.before(DateUtil.date())) { + arrayList.add(equipment.getRobotId()); + } + } + if (CollUtil.isNotEmpty(arrayList)) { + Map map = Maps.newHashMap(); + map.put("robotIds", arrayList); + String result = HttpUtil.post + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.ROBOT_LOGOUT) + .concat(weChatProperties.getAppKey()), map); + log.info("========== the response as {} ==========", result); + } + } + + } +} diff --git a/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java b/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java index ab9a31f..0b77805 100644 --- a/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java +++ b/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java @@ -13,6 +13,13 @@ public interface WeChatRequestConstants { */ String GET_QR_CODE = "/api/qrCodeLogin/"; + /** + * 批量下线 + */ + String ROBOT_LOGOUT = "/api/batchLogout/"; + + + /** @@ -27,6 +34,11 @@ public interface WeChatRequestConstants { */ String GET_PUSH_LOGIN = "/api/pushLogin/"; + /** + * 同步状态 + */ + String GET_ROBOT_TYPE = "/api/syncRobot/"; + /** @@ -76,7 +88,7 @@ public interface WeChatRequestConstants { /** * 添加好友 */ - String WE_CHAT_ADD_FRIEND = "/wechat/v1/addfriends"; + String WE_CHAT_ADD_FRIEND = "/api/add-now-friend-phone/"; /** diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java index da819f6..62576eb 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java @@ -3,10 +3,7 @@ package com.baiye.modules.distribute.controller; import com.baiye.domain.PageParam; import com.baiye.domain.PageResult; import com.baiye.modules.distribute.qo.AccountQo; -import com.baiye.modules.distribute.qo.PayOrderQo; import com.baiye.modules.distribute.service.LoginEquipmentService; -import com.baiye.modules.distribute.vo.AddFriendVo; -import com.baiye.modules.distribute.vo.PayOrderVO; import com.baiye.modules.distribute.vo.WeChatAccountVO; import com.baiye.result.R; import io.swagger.v3.oas.annotations.Operation; diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java index 3530de9..bb5bb6d 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java @@ -5,9 +5,11 @@ import com.baiye.domain.PageResult; import com.baiye.modules.distribute.dto.CreateCodeDTO; import com.baiye.modules.distribute.dto.PushCodeDTO; import com.baiye.modules.distribute.dto.WeChatAddFriendDTO; +import com.baiye.modules.distribute.dto.WeChatStatisticsDTO; import com.baiye.modules.distribute.qo.AccountQo; import com.baiye.modules.distribute.service.WeChatService; import com.baiye.modules.distribute.service.WechatFriendService; +import com.baiye.modules.distribute.vo.AccountStatisticsVO; import com.baiye.modules.distribute.vo.AddFriendVo; import com.baiye.modules.distribute.vo.StatisticsFriendVO; import com.baiye.modules.distribute.vo.WeChatAccountVO; @@ -15,10 +17,12 @@ 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.Data; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Date; import java.util.List; /** @@ -86,18 +90,31 @@ public class WeChatController { @GetMapping("/query/friend") - @Operation(summary = "天统计粉丝记录") + @Operation(summary = "时间统计统计粉丝记录") public R> getDateBy(Integer queryType) { return R.ok(wechatFriendService.statisticsFriendByType(queryType)); } - @GetMapping("/query/user/statistics") - @Operation(summary = "总统计用户数量") - public R getDateBy(List userIdList) { - return R.ok(wechatFriendService.statisticsFriendByUserId(userIdList)); + @PostMapping("/query/user/statistics") + @Operation(summary = "统计用户加粉数量") + public R> getDateBy(@RequestBody WeChatStatisticsDTO statisticsDTO) { + return R.ok(wechatFriendService.statisticsFriendByUserId(statisticsDTO)); } + @GetMapping("/query/account/statistics") + @Operation(summary = "统计账号信息数量") + public R accountStatistics() { + return R.ok(weChatService.statisticsAccountByUserId(SecurityUtils.getCurrentUserId())); + } + + + @GetMapping("/update/remark") + @Operation(summary = "修改备注") + public R accountStatistics(String wxId, String remark) { + return R.ok(weChatService.updateRemarkByWechatId(wxId, remark)); + } + } diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java index 9ca7fda..3edfb2f 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java @@ -9,7 +9,7 @@ import lombok.Data; @Data public class PushCodeDTO { - private String robotId; + private Integer robotId; private String wxId; diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAccountDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAccountDTO.java new file mode 100644 index 0000000..e216871 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAccountDTO.java @@ -0,0 +1,29 @@ +package com.baiye.modules.distribute.dto; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/4/10 + */ +@Data +public class WeChatAccountDTO { + private String account; + + private String wxid; + + private String nickname; + + private String smallHeadImgUrl; + + private String pit; + + private String wxVersion; + + private String province; + + + private Integer status; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java index 862030f..0dfda76 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java @@ -1,7 +1,6 @@ package com.baiye.modules.distribute.dto; -import lombok.Data; -import lombok.NonNull; +import lombok.*; /** * @author Enzo @@ -11,22 +10,30 @@ import lombok.NonNull; public class WeChatAddFriendDTO { @NonNull - private String wechat; + private String robotWxId; - @NonNull - private Integer type; - @NonNull - private String tagetWxId; + private AddFriendDTO addData; - @NonNull - private String helloContent; + /** + * 实体 + */ + @AllArgsConstructor + @NoArgsConstructor + @ToString + @Getter + @Setter + public static class AddFriendDTO { + + private String scene; + + private String addKey; + + private String content; + + } - @NonNull - private String appKey; - @NonNull - private String appSecret; } diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java index 19f01bf..6eca382 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java @@ -33,7 +33,7 @@ public class WeChatFriendDTO { @Schema(title = "微信ID") - private String alias; + private String friendId; @Schema(title = "头像") private String bigHeadImgUrl; diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatStatisticsDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatStatisticsDTO.java new file mode 100644 index 0000000..634d886 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatStatisticsDTO.java @@ -0,0 +1,25 @@ +package com.baiye.modules.distribute.dto; + +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + +/** + * @author Enzo + * @date : 2022/6/27 + */ +@Data +public class WeChatStatisticsDTO { + + private List weChatIdList; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java b/admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java index f8a8f88..1b0aca8 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java @@ -35,6 +35,9 @@ public class LoginEquipment extends BaseEntity { @Schema(name = "pit") private String pit; + @Schema(name = "package_type") + private Integer packageType; + @Schema(name = "robot_id") private Integer robotId; diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java index d72ac2f..5224517 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java @@ -26,9 +26,9 @@ import java.util.Date; @TableName(value = "tb_wechat_account") public class WeChatAccount extends LogicDeletedBaseEntity { - @TableId(type = IdType.AUTO) + @TableId(type = IdType.INPUT) @Schema(title = "id") - @NotNull(message = "微信ID", groups = {UpdateGroup.class}) + @NotNull(message = "id", groups = {UpdateGroup.class}) private Long id; @Schema(title = "用户id") @@ -61,8 +61,6 @@ public class WeChatAccount extends LogicDeletedBaseEntity { @Schema(name = "性别") private Integer sex; - @Schema(name = "拥有者") - private Long ownerId; @Schema(title = "在线状态") private Integer status; diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java index c930d33..cdac5fd 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java @@ -1,6 +1,7 @@ package com.baiye.modules.distribute.entity; import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; @@ -21,7 +22,7 @@ import java.io.Serializable; public class WeChatEquipment implements Serializable { - @TableId + @TableId(type = IdType.AUTO) private Long id; /** @@ -34,6 +35,7 @@ public class WeChatEquipment implements Serializable { * 角色Code */ @Schema(title = "设备id") - private String equipmentId; + private Long equipmentId; + } diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java index 593b39c..b0ed566 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java @@ -44,7 +44,7 @@ public class WeChatFriedRecord implements Serializable { @Schema(title = "微信ID") - private String alias; + private String friendId; @Schema(title = "头像") private String bigHeadImgUrl; diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java index 23310dd..34dd561 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java @@ -1,5 +1,7 @@ package com.baiye.modules.distribute.mapper; +import cn.hutool.core.date.DateTime; +import com.baiye.constant.DefaultNumberConstants; import com.baiye.domain.PageParam; import com.baiye.domain.PageResult; import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX; @@ -25,7 +27,6 @@ import java.util.List; public interface LoginEquipmentMapper extends ExtendMapper { - default PageResult queryPage(PageParam pageParam, AccountQo qo) { IPage page = this.prodPage(pageParam); @@ -33,13 +34,25 @@ public interface LoginEquipmentMapper extends ExtendMapper { if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) { wrapperX.between(WeChatAccount::getCreateTime, qo.getStartTime(), qo.getEndTime()); } - wrapperX.likeIfPresent(WeChatAccount::getUsername, qo.getUsername()).eqIfPresent(WeChatAccount::getUserId, qo.getUserId()); - this.selectByPage(page, qo.getStartTime(), qo.getEndTime(), qo.getUsername(), qo.getUserId()); + wrapperX.likeIfPresent(WeChatAccount::getNickname, qo.getNickname()).likeIfPresent + (WeChatAccount::getWxId, qo.getWxId()).eqIfPresent(WeChatAccount::getUserId, qo.getUserId()).likeIfPresent(WeChatAccount::getWxId, qo.getWxId()); + this.selectByPage(page, qo.getStartTime(), qo.getEndTime(), qo.getNickname(), qo.getWxId(), qo.getUserId()); return new PageResult<>(page.getRecords(), page.getTotal()); } + /** + * 查询分页记录 + * + * @param page + * @param startTime + * @param endTime + * @param username + * @param wxId + * @param userId + * @return + */ IPage selectByPage(IPage page, - @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("username") String username,@Param("userId") Long userId); + @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("username") String username, @Param("wxId") String wxId, @Param("userId") Long userId); /** @@ -50,5 +63,46 @@ public interface LoginEquipmentMapper extends ExtendMapper { * @param wxId * @return */ - List queryByDate(@Param("dayNum") Integer dayNum,@Param("userId") Long currentUserId, @Param("wxId") String wxId); + List queryByDate(@Param("dayNum") Integer dayNum, @Param("userId") Long currentUserId, @Param("wxId") String wxId); + + /** + * 用户ID查询 + * + * @param currentUserId + * @return + */ + List queryByUserId(Long currentUserId); + + /** + * 统计数据 + * + * @param currentUserId + * @param number + * @return + */ + default Long countFreeEquipment(Long currentUserId, Integer number) { + return this.selectCount + (WrappersX.lambdaQueryX(LoginEquipment.class).eq + (LoginEquipment::getUserId, currentUserId).eq(LoginEquipment::getPackageType, DefaultNumberConstants.TWO_NUMBER)); + + } + + + /** + * 机器人查询设备 + * + * @param wxId + * @return + */ + List findEquipmentByAccountId(@Param("wxId") String wxId); + + /** + * 时间查询设备 + * + * @param date + * @return + */ + default List selectListByTime(DateTime date) { + return this.selectList(WrappersX.lambdaQueryX(LoginEquipment.class).gt(LoginEquipment::getExpirationTime, date)); + } } diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java index 8cd4063..0327015 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java @@ -9,9 +9,6 @@ import com.baiye.modules.distribute.converter.PayOrderConverter; import com.baiye.modules.distribute.entity.PayOrder; import com.baiye.modules.distribute.qo.PayOrderQo; import com.baiye.modules.distribute.vo.PayOrderVO; -import com.baiye.notify.converter.UserAnnouncementConverter; -import com.baiye.notify.model.entity.UserAnnouncement; -import com.baiye.notify.model.vo.UserAnnouncementPageVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.apache.ibatis.annotations.Mapper; diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java index b4c8676..0dbc2c2 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java @@ -11,8 +11,11 @@ import com.baiye.modules.distribute.converter.WeChatAccountConverter; import com.baiye.modules.distribute.entity.WeChatAccount; import com.baiye.modules.distribute.qo.AccountQo; import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -52,9 +55,37 @@ public interface WeChatAccountMapper extends ExtendMapper { if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) { wrapperX.between(WeChatAccount::getCreateTime, qo.getStartTime(), qo.getEndTime()); } - wrapperX.likeIfPresent(WeChatAccount::getUsername, qo.getUsername()).eqIfPresent(WeChatAccount::getOwnerId, qo.getUserId()).orderByDesc(WeChatAccount::getId); + wrapperX.likeIfPresent(WeChatAccount::getNickname, qo.getNickname()).likeIfPresent(WeChatAccount::getWxId, qo.getWxId()). + eqIfPresent(WeChatAccount::getUserId, qo.getUserId()).orderByDesc(WeChatAccount::getId); this.selectPage(page, wrapperX); IPage voPage = page.convert(WeChatAccountConverter.INSTANCE::entityToVo); return new PageResult<>(voPage.getRecords(), voPage.getTotal()); } + + /** + * ID查询信息 + * + * @param currentUserId + * @return + */ + default List queryByUserId(Long currentUserId) { + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class); + return this.selectList(wrapperX.eq(WeChatAccount::getUserId, currentUserId)); + } + + /** + * 修改备注 + * + * @param wxId + * @param remark + * @return + */ + default Boolean updateRemark(String wxId, String remark) { + + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate() + .set(WeChatAccount::getRemark, remark) + .eq(WeChatAccount::getWxId, wxId) + .eq(WeChatAccount::getDeleted, DefaultNumberConstants.ZERO_NUMBER); + return SqlHelper.retBool(this.update(null, wrapper)); + } } diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatEquipmentMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatEquipmentMapper.java new file mode 100644 index 0000000..0d11b1f --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatEquipmentMapper.java @@ -0,0 +1,17 @@ +package com.baiye.modules.distribute.mapper; + +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.modules.distribute.entity.WeChatEquipment; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author Enzo + * @date 2024-4-1 + */ +@Mapper +public interface WeChatEquipmentMapper extends ExtendMapper { + + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java index 4340286..5db5262 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java @@ -2,13 +2,14 @@ package com.baiye.modules.distribute.mapper; import cn.hutool.core.date.DateTime; import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; import com.baiye.modules.distribute.entity.WeChatFriedRecord; -import com.baiye.modules.distribute.vo.AddFriendVo; import com.baiye.modules.distribute.vo.StatisticsFriendVO; import com.baiye.modules.distribute.vo.WeChatAddFriendVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -30,8 +31,34 @@ public interface WeChatFriendMapper extends ExtendMapper { /** * 用户数据查询 - * @param userIdList + * + * @param weChatIdList + * @param dayNum + * @param currentUserId + * @param startTime + * @param endTime + * @return + */ + List queryByUserList(@Param("weChatIdList") List weChatIdList, + @Param("dayNum") Long dayNum, @Param("userId") Long currentUserId, + @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 用户id查找 + * + * @param currentUserId + * @return + */ + default Long queryByUserId(Long currentUserId) { + return this.selectCount(WrappersX.lambdaQueryX(WeChatFriedRecord.class).eq + (WeChatFriedRecord::getUserId, currentUserId)); + + } + + /** + * 账号id查询设备 + * @param id * @return */ - List queryByUserList(@Param("userIdList") List userIdList); + List findEquipmentByAccountId(Long id); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java b/admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java index e1565f6..09fbb8c 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java +++ b/admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java @@ -19,12 +19,12 @@ public class AccountQo { private String endTime; @Parameter(description = "用户昵称") - private String username; + private String nickname; @Schema(title = "用户ID") private Long userId; @Schema(title = "微信id") - private Long wxId; + private String wxId; } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java b/admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java index de4a206..348f41d 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java @@ -49,4 +49,26 @@ public interface LoginEquipmentService extends ExtendService { * @return */ LoginEquipment queryByRobotId(Integer robotId); + + /** + * 用户查询账号 + * @param currentUserId + * @return + */ + List queryByUserId(Long currentUserId); + + /** + * 判断免费设备有多少 + * @param currentUserId + * @param number + * @return + */ + Long countFreeEquipment(Long currentUserId, Integer number); + + + /** + * 查询已经过期的设备 + * @return + */ + List findExpiredAccount(); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java b/admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java index 1eb81f9..31eda54 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java @@ -9,8 +9,8 @@ import com.baiye.modules.distribute.dto.WeChatAddFriendDTO; import com.baiye.modules.distribute.dto.WeChatUserLoginDTO; import com.baiye.modules.distribute.entity.WeChatAccount; import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.vo.AccountStatisticsVO; import com.baiye.modules.distribute.vo.AddFriendVo; -import com.baiye.modules.distribute.vo.StatisticsFriendVO; import com.baiye.modules.distribute.vo.WeChatAccountVO; /** @@ -70,11 +70,14 @@ public interface WeChatService extends ExtendService { /** * 登录微信账号 + * * @param userLoginDTO * @param status + * @param userId + * @param id * @return */ - Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status); + Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status, Long userId, Long id); /** @@ -101,4 +104,15 @@ public interface WeChatService extends ExtendService { * @return */ WeChatAccount findByWxId(String robotWxId); + + /** + * 统计账号信息 + * @param currentUserId + * @return + */ + AccountStatisticsVO statisticsAccountByUserId(Long currentUserId); + + + + Boolean updateRemarkByWechatId(String wxId, String remark); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java b/admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java index 1b24471..f77ed1e 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java @@ -1,11 +1,12 @@ package com.baiye.modules.distribute.service; +import com.baiye.domain.PageResult; import com.baiye.extend.mybatis.plus.service.ExtendService; import com.baiye.modules.distribute.dto.WeChatFriendDTO; +import com.baiye.modules.distribute.dto.WeChatStatisticsDTO; import com.baiye.modules.distribute.entity.WeChatFriedRecord; import com.baiye.modules.distribute.vo.AddFriendVo; import com.baiye.modules.distribute.vo.StatisticsFriendVO; -import com.baiye.modules.distribute.vo.WeChatAddFriendVo; import java.util.List; @@ -19,9 +20,8 @@ public interface WechatFriendService extends ExtendService { * 添加好友 * * @param weChatFriendDTO - * @param userId */ - void addFriendByResponse(WeChatFriendDTO weChatFriendDTO, Long userId); + void addFriendByResponse(WeChatFriendDTO weChatFriendDTO); /** * 根据类型查询数据 @@ -30,10 +30,20 @@ public interface WechatFriendService extends ExtendService { */ List statisticsFriendByType(Integer queryType); + + + /** + * 用户统计数量 + * @param currentUserId + * @return + */ + Long queryByUserId(Long currentUserId); + /** * 统计数据 - * @param userIdList + * + * @param statisticsDTO * @return */ - AddFriendVo statisticsFriendByUserId(List userIdList); + PageResult statisticsFriendByUserId(WeChatStatisticsDTO statisticsDTO); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java index d2c60f6..4ba5ef6 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.StrPool; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; import com.alipay.easysdk.factory.Factory; import com.alipay.easysdk.kernel.util.ResponseChecker; import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse; @@ -18,6 +19,7 @@ import com.baiye.modules.distribute.dto.AliPayPcDTO; import com.baiye.modules.distribute.entity.PayOrder; import com.baiye.modules.distribute.mapper.PayOrderMapper; import com.baiye.modules.distribute.service.AliPayService; +import com.baiye.modules.distribute.service.LoginEquipmentService; import com.baiye.modules.distribute.service.WeChatService; import com.baiye.security.util.SecurityUtils; import com.baiye.system.properties.AliPayProperties; @@ -59,6 +61,9 @@ public class AliPayServiceImpl extends ExtendServiceImpl aliPayPc(AliPayPcDTO aliPayPcDTO) { Map map = Maps.newHashMap(); + Long userId = SecurityUtils.getCurrentUserId(); BigDecimal amount = new BigDecimal(DefaultNumberConstants.ZERO_NUMBER); Integer num = aliPayPcDTO.getNum(); Integer robotId = aliPayPcDTO.getRobotId(); Boolean isRenew = aliPayPcDTO.getIsRenew(); Integer packageType = aliPayPcDTO.getPackageType(); - if (packageType == DefaultNumberConstants.ONE_NUMBER) { - amount = new BigDecimal(DefaultNumberConstants.THIRTY); - } + // 结算金额 if (packageType == DefaultNumberConstants.TWO_NUMBER) { // 九折 amount = NumberUtil.mul(NumberUtil.mul @@ -140,18 +145,33 @@ public class AliPayServiceImpl extends ExtendServiceImpl DefaultNumberConstants.THREE_NUMBER) { + throw new BadRequestException("至多创建三台免费设备!"); + } + Long countFreeEquipment = loginEquipmentService.countFreeEquipment(userId, DefaultNumberConstants.ONE_NUMBER); + if (ObjectUtil.isNotNull(countFreeEquipment) + && countFreeEquipment + num >= DefaultNumberConstants.THREE_NUMBER) { + throw new BadRequestException("至多创建三台免费设备!"); + } + // 创建设备 + weChatService.createEquipment(num, packageType, userId); + map.put("orderNo", orderNo); + return map; + } // 查询记录 try { - // 雪花算法id - String orderNo = String.valueOf(IdUtil.getSnowflake(workerId, datacenterId).nextId()); // 生成返回对象 AlipayTradePagePayResponse response = Factory.Payment.Page().pay(PayConstants.PAY_TITLE + orderNo, orderNo, String.valueOf(amount), aliPay.getReturnUrl()); if (ResponseChecker.success(response)) { - boolean result = savePayOrder(num, isRenew, robotId, packageType, amount, orderNo); - log.info("============= the save order result {} =============", result); map.put("payUrl", response.getBody()); map.put("orderNo", orderNo); return map; @@ -172,7 +192,8 @@ public class AliPayServiceImpl extends ExtendServiceImpl DefaultNumberConstants.ONE_NUMBER + ? DefaultNumberConstants.ZERO_NUMBER : DefaultNumberConstants.ONE_NUMBER); return this.save(order); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java index 87bbe80..ed04d1e 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java @@ -1,21 +1,33 @@ package com.baiye.modules.distribute.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.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.distribute.dto.WeChatAccountDTO; import com.baiye.modules.distribute.entity.LoginEquipment; import com.baiye.modules.distribute.mapper.LoginEquipmentMapper; import com.baiye.modules.distribute.qo.AccountQo; import com.baiye.modules.distribute.service.LoginEquipmentService; import com.baiye.modules.distribute.vo.WeChatAccountVO; import com.baiye.modules.distribute.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 lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; /** * @author Enzo @@ -23,14 +35,31 @@ import java.util.List; */ @Service @RequiredArgsConstructor - public class LoginEquipmentServiceImpl extends ExtendServiceImpl implements LoginEquipmentService { + private final WeChatProperties weChatProperties; + @Override public PageResult queryPage(PageParam pageParam, AccountQo qo) { + Map map = Maps.newHashMap(); qo.setUserId(SecurityUtils.getCurrentUserId()); - return baseMapper.queryPage(pageParam, qo); + PageResult queryPage = baseMapper.queryPage(pageParam, qo); + queryPage.getRecords().forEach(accountVO -> { + map.put("robotId", accountVO.getRobotId()); + String robotResult = HttpUtil.get + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_ROBOT_TYPE) + .concat(weChatProperties.getAppKey()), map); + 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)) { + accountVO.setCityInfo(dto.getProvince()); + accountVO.setStatus(dto.getStatus()); + } + } + }); + return queryPage; } @Override @@ -50,7 +79,7 @@ public class LoginEquipmentServiceImpl extends ExtendServiceImpl queryByUserId(Long currentUserId) { + return baseMapper.queryByUserId(currentUserId); + } + + @Override + public Long countFreeEquipment(Long currentUserId, Integer number) { + return baseMapper.countFreeEquipment(currentUserId, number); + } + + @Override + public List findExpiredAccount() { + return baseMapper.selectListByTime(DateUtil.date()); + } + } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java index 18732cf..d2ae443 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java @@ -4,6 +4,7 @@ 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 cn.hutool.http.HttpStatus; import cn.hutool.http.HttpUtil; @@ -21,13 +22,15 @@ import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; import com.baiye.modules.distribute.dto.*; import com.baiye.modules.distribute.entity.LoginEquipment; import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.modules.distribute.entity.WeChatEquipment; import com.baiye.modules.distribute.mapper.WeChatAccountMapper; +import com.baiye.modules.distribute.mapper.WeChatEquipmentMapper; import com.baiye.modules.distribute.qo.AccountQo; import com.baiye.modules.distribute.service.LoginEquipmentService; import com.baiye.modules.distribute.service.WeChatService; import com.baiye.modules.distribute.service.WechatFriendService; +import com.baiye.modules.distribute.vo.AccountStatisticsVO; import com.baiye.modules.distribute.vo.AddFriendVo; -import com.baiye.modules.distribute.vo.StatisticsFriendVO; import com.baiye.modules.distribute.vo.WeChatAccountVO; import com.baiye.modules.distribute.vo.WeChatAddFriendVo; import com.baiye.result.WeChatResponse; @@ -35,11 +38,14 @@ import com.baiye.security.util.SecurityUtils; import com.baiye.system.properties.WeChatProperties; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -54,12 +60,20 @@ import java.util.stream.Collectors; public class WeChatServiceImpl extends ExtendServiceImpl implements WeChatService { + @Value("${snowflake.workerId}") + private int workerId; + + @Value("${snowflake.datacenterId}") + private int datacenterId; + private final WeChatProperties weChatProperties; private final WechatFriendService wechatFriendService; private final LoginEquipmentService loginEquipmentService; + private final WeChatEquipmentMapper weChatEquipmentMapper; + @Override public String createQrCode(CreateCodeDTO createCodeDTO) { @@ -106,14 +120,16 @@ public class WeChatServiceImpl extends ExtendServiceImpl DefaultNumberConstants.ZERO_NUMBER) { EquipmentDTO dto = BeanUtil.toBean(weChatResponse.getData(), EquipmentDTO.class); - DateTime dateTime = DateUtil.offsetDay(DateUtil.date(), dayNum); + DateTime dateTime = DateUtil.endOfDay(DateUtil.offsetDay(DateUtil.date(), dayNum)); for (EquipmentDTO.RoBotDTO botDTO : dto.getData()) { // 创建账号 LoginEquipment equipment = new LoginEquipment(); equipment.setUserId(userId); equipment.setExpirationTime(dateTime); equipment.setRobotId(botDTO.getRobotId()); - equipment.setDeviceNumber(botDTO.getRobotAccount()); + equipment.setPit(botDTO.getRobotAccount()); + equipment.setPackageType(DefaultNumberConstants.ONE_NUMBER); + // equipment.setDeviceNumber(botDTO.getRobotAccount()); loginEquipmentService.save(equipment); } } @@ -125,6 +141,13 @@ public class WeChatServiceImpl extends ExtendServiceImpl beanToMap = BeanUtil.beanToMap(pushCodeDTO); String pushQrCodeResult = HttpUtil.get (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_PUSH_LOGIN) @@ -151,22 +174,25 @@ public class WeChatServiceImpl extends ExtendServiceImpl weChatAddFriendVos = - loginEquipmentService.queryByDate(DefaultNumberConstants.MINUS_FIFTEEN_NUMBER, SecurityUtils.getCurrentUserId(), vo.getWxId()); + loginEquipmentService.queryByDate(DefaultNumberConstants.FIFTEEN_NUMBER, SecurityUtils.getCurrentUserId(), vo.getWxId()); // 转为map Map> map = weChatAddFriendVos.stream().collect (Collectors.groupingBy(WeChatAddFriendVo::getDayStr)); @@ -228,7 +254,7 @@ public class WeChatServiceImpl extends ExtendServiceImpl DefaultNumberConstants.ZERO_NUMBER) { LoginEquipment loginEquipment = loginEquipmentService.queryByRobotId(robotId); if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getId())) { - DateTime dateTime = DateUtil.offsetDay(loginEquipment.getExpirationTime(), dayNum); + DateTime dateTime = DateUtil.endOfDay(DateUtil.offsetDay(loginEquipment.getExpirationTime(), dayNum)); loginEquipment.setExpirationTime(dateTime); return loginEquipmentService.updateById(loginEquipment); } @@ -242,4 +268,42 @@ public class WeChatServiceImpl extends ExtendServiceImpl onlineList = Lists.newArrayList(); + AccountStatisticsVO vo = new AccountStatisticsVO(); + List weChatAccounts = loginEquipmentService.queryByUserId(currentUserId); + + Long friendNum = wechatFriendService.queryByUserId(currentUserId); + Integer abnormalNum = DefaultNumberConstants.ZERO_NUMBER; + Integer onlineNum = DefaultNumberConstants.ZERO_NUMBER; + Map map = Maps.newHashMap(); + for (WeChatAccountVO weChatAccount : weChatAccounts) { + map.put("robotId", weChatAccount.getRobotId()); + String robotResult = HttpUtil.get + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_ROBOT_TYPE) + .concat(weChatProperties.getAppKey()), map); + 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.getStatus() == DefaultNumberConstants.ONE_NUMBER + && !onlineList.contains(dto.getPit())) { + onlineList.add(dto.getPit()); + onlineNum += DefaultNumberConstants.ONE_NUMBER; + } + } + } + vo.setFriendNum(friendNum); + vo.setOnlineNum(onlineNum); + vo.setAbnormalNum(abnormalNum); + vo.setAccountNum(weChatAccounts.size()); + return vo; + } + + @Override + public Boolean updateRemarkByWechatId(String wxId, String remark) { + return this.baseMapper.updateRemark(wxId, remark); + } + } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java index 3726cbe..5993de4 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java @@ -61,28 +61,31 @@ public class WechatCallbackServiceImpl implements WechatCallbackService { } } - private void viaFriendRequest(WeChatResponse weChatResponse) { - WeChatFriendDTO weChatFriendDTO = - JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatFriendDTO.class); - WeChatAccount byWxId = weChatService.findByWxId(weChatFriendDTO.getRobotWxId()); - if (ObjectUtil.isNotNull(byWxId) && ObjectUtil.isNotNull(byWxId.getId())) { - wechatFriendService.addFriendByResponse(weChatFriendDTO, byWxId.getUserId()); - } - } public void wechatLogin(WeChatResponse weChatResponse) { WeChatUserLoginDTO userLoginDTO = JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatUserLoginDTO.class); - weChatService.weChatAccountLoginByRespon(userLoginDTO, weChatResponse.getStatus()); LoginEquipment robot = loginEquipmentService.queryByRobot(userLoginDTO.getPit()); - AnnouncementNotifyInfo notifyInfo = new AnnouncementNotifyInfo(); - notifyInfo.setTitle("新消息通知"); - notifyInfo.setMessageKey(String.valueOf(robot.getId())); - notifyInfo.setContent("您有一条新线索请及时查收!"); - notifyInfo.setCreateTime(LocalDateTime.now()); - notifyInfo.setMessageType(DefaultNumberConstants.ONE_NUMBER); - // 发送消息 - publisher.publishEvent(new StationNotifyPushEvent(notifyInfo, Collections.singletonList(robot.getUserId()))); + if (ObjectUtil.isNotNull(robot) && ObjectUtil.isNotNull(robot.getUserId())) { + + weChatService.weChatAccountLoginByRespon(userLoginDTO, weChatResponse.getStatus(), robot.getUserId(), robot.getId()); + AnnouncementNotifyInfo notifyInfo = new AnnouncementNotifyInfo(); + notifyInfo.setTitle("新消息通知"); + notifyInfo.setMessageKey(String.valueOf(robot.getRobotId())); + notifyInfo.setContent("用户".concat(userLoginDTO.getNickname()).concat("登录成功")); + notifyInfo.setCreateTime(LocalDateTime.now()); + notifyInfo.setMessageType(DefaultNumberConstants.ONE_NUMBER); + log.info("============ send message {} ==============", JSONUtil.toJsonStr(notifyInfo)); + // 发送消息 + publisher.publishEvent(new StationNotifyPushEvent(notifyInfo, Collections.singletonList(robot.getUserId()))); + } + } + + + private void viaFriendRequest(WeChatResponse weChatResponse) { + WeChatFriendDTO weChatFriendDTO = + JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatFriendDTO.class); + wechatFriendService.addFriendByResponse(weChatFriendDTO); } } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java index dd7c711..002ef78 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java @@ -4,16 +4,21 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baiye.constant.DefaultNumberConstants; +import com.baiye.domain.PageResult; import com.baiye.enums.StatisticsEnum; import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; import com.baiye.extend.mybatis.plus.toolkit.WrappersX; import com.baiye.modules.distribute.dto.WeChatFriendDTO; +import com.baiye.modules.distribute.dto.WeChatStatisticsDTO; import com.baiye.modules.distribute.entity.WeChatFriedRecord; +import com.baiye.modules.distribute.mapper.LoginEquipmentMapper; import com.baiye.modules.distribute.mapper.WeChatFriendMapper; import com.baiye.modules.distribute.service.WechatFriendService; import com.baiye.modules.distribute.vo.AddFriendVo; import com.baiye.modules.distribute.vo.StatisticsFriendVO; +import com.baiye.modules.distribute.vo.WeChatAccountVO; import com.baiye.modules.distribute.vo.WeChatAddFriendVo; import com.baiye.security.util.SecurityUtils; import com.google.common.collect.Lists; @@ -21,7 +26,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author Enzo @@ -34,17 +42,27 @@ public class WechatFriendServiceImpl extends ExtendServiceImpl implements WechatFriendService { - @Override - public void addFriendByResponse(WeChatFriendDTO weChatFriendDTO, Long userId) { - List weChatFriedRecords = - this.baseMapper.selectList(WrappersX.lambdaQueryX(WeChatFriedRecord.class).eq - (WeChatFriedRecord::getRobotWxId, weChatFriendDTO.getRobotWxId()).eq(WeChatFriedRecord::getAlias, weChatFriendDTO.getAlias())); - if (CollUtil.isEmpty(weChatFriedRecords)) { - WeChatFriedRecord weChatFriedRecord = new WeChatFriedRecord(); - BeanUtil.copyProperties(weChatFriendDTO, weChatFriedRecord); - weChatFriedRecord.setUserId(userId); - this.baseMapper.insert(weChatFriedRecord); + private final LoginEquipmentMapper loginEquipmentMapper; + + + @Override + public void addFriendByResponse(WeChatFriendDTO weChatFriendDTO) { + List voList = loginEquipmentMapper.findEquipmentByAccountId(weChatFriendDTO.getRobotWxId()); + if (CollUtil.isNotEmpty(voList)) { + for (WeChatAccountVO vo : voList) { + if (ObjectUtil.isNotNull(vo.getExpirationTime()) && vo.getExpirationTime().after(DateUtil.date())) { + Long count = this.baseMapper.selectCount(WrappersX.lambdaQueryX(WeChatFriedRecord.class).eq + (WeChatFriedRecord::getRobotWxId, weChatFriendDTO.getRobotWxId()).eq(WeChatFriedRecord::getFriendId, weChatFriendDTO.getFriendId())); + if (count == DefaultNumberConstants.ZERO_NUMBER && + vo.getWxId().equals(weChatFriendDTO.getRobotWxId())) { + WeChatFriedRecord weChatFriedRecord = new WeChatFriedRecord(); + BeanUtil.copyProperties(weChatFriendDTO, weChatFriedRecord); + weChatFriedRecord.setUserId(vo.getUserId()); + this.baseMapper.insert(weChatFriedRecord); + } + } + } } } @@ -60,9 +78,57 @@ public class WechatFriendServiceImpl extends ExtendServiceImpl } @Override - public AddFriendVo statisticsFriendByUserId(List userIdList) { - List weChatAddFriendVos = baseMapper.queryByUserList(userIdList); - return new AddFriendVo(); + public PageResult statisticsFriendByUserId(WeChatStatisticsDTO statisticsDTO) { + Date endTime = statisticsDTO.getEndTime(); + Date startTime = statisticsDTO.getStartTime(); + List weChatIdList = statisticsDTO.getWeChatIdList(); + List addFriendVos = Lists.newArrayList(); + Long dayNum = DateUtil.betweenDay(startTime, endTime, Boolean.TRUE); + AddFriendVo addFriendVo = new AddFriendVo(); + List weChatAddFriendVos = baseMapper.queryByUserList(weChatIdList, dayNum, SecurityUtils.getCurrentUserId(), startTime, endTime); + + // 转为map + Map> map = weChatAddFriendVos.stream().collect + (Collectors.groupingBy(WeChatAddFriendVo::getDayStr)); + Integer newFriendsInitiativeNum = DefaultNumberConstants.ZERO_NUMBER; + Integer newPassiveNum = DefaultNumberConstants.ZERO_NUMBER; + List newArrayList = Lists.newArrayList(); + for (int i = 0; i <= dayNum; i++) { + // 时间格式 + String dateTime = DateUtil.format(DateUtil.offsetDay(startTime, i), "MM-dd"); + AddFriendVo.FriendDTO dto = new AddFriendVo.FriendDTO(); + dto.setDayStr(dateTime); + if (map.containsKey(dateTime)) { + List voList = map.get(dateTime); + Map voMap = + voList.stream().collect(Collectors.toMap + (WeChatAddFriendVo::getAddFriendType, chatAddFriendVo -> chatAddFriendVo)); + if (voMap.get(DefaultNumberConstants.ONE_NUMBER) != null) { + WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.ONE_NUMBER); + Integer num = weChatAddFriendVo.getNum(); + newFriendsInitiativeNum += num; + dto.setNewDayFriendsInitiativeNum(num); + } + if (voMap.get(DefaultNumberConstants.TWO_NUMBER) != null) { + WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.TWO_NUMBER); + Integer num = weChatAddFriendVo.getNum(); + newPassiveNum += num; + dto.setNewDayPassiveNum(num); + } + } + newArrayList.add(dto); + addFriendVo.setList(newArrayList); + } + addFriendVo.setNewFriendsInitiativeNum(newFriendsInitiativeNum); + addFriendVo.setNewPassiveNum(newPassiveNum); + addFriendVos.add(addFriendVo); + return new PageResult<>(addFriendVos, addFriendVos.size()); + } + + @Override + public Long queryByUserId(Long currentUserId) { + return this.baseMapper.queryByUserId(currentUserId); } + } diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/AccountStatisticsVO.java b/admin/src/main/java/com/baiye/modules/distribute/vo/AccountStatisticsVO.java new file mode 100644 index 0000000..2037309 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/AccountStatisticsVO.java @@ -0,0 +1,22 @@ +package com.baiye.modules.distribute.vo; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/4/7 + */ +@Data +public class AccountStatisticsVO { + + private Integer accountNum; + + private Long friendNum; + + private Integer onlineNum; + + private Integer abnormalNum; + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java b/admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java index e97fcd6..b05d706 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java @@ -12,24 +12,24 @@ import java.util.List; @Data public class AddFriendVo { + private String wxId; private Integer robotId; + private String username; - private String robotWxId; - + private String nickname; private String robotWxNick; private String headerUrl; - - private Integer newFriendsInitiativeNum; - private Integer newPassiveNum; private List list; + private Integer newFriendsInitiativeNum; + /** * list */ diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java b/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java index 00d1393..d5740dd 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java @@ -73,7 +73,7 @@ public class WeChatAccountVO { private String deviceNumber; @Schema(title = "过期时间") - private LocalDateTime expirationTime; + private Date expirationTime; } diff --git a/admin/src/main/resources/application-prod.yml b/admin/src/main/resources/application-prod.yml index 7bafbad..a2e3e95 100644 --- a/admin/src/main/resources/application-prod.yml +++ b/admin/src/main/resources/application-prod.yml @@ -2,10 +2,10 @@ spring: datasource: url: jdbc:mysql://localhost:3306/marketing-platform?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true username: root - password: 7f2vvawx + password: CK8KyUngFSY redis: host: localhost - password: '' + password: port: 6379 @@ -28,8 +28,8 @@ alipay: # 填支付宝公钥,注意不是生成的应用公钥 aliPayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvegkGCrz1i5/K7VzQxvoZm4G73pSPNu9R5ET8YonIuDVoHkHaYvQQizLdRkTyBsYIik8FXsSDmVsw5MLMQ7OAlZ97nQBkz5TxOX6Px766nUpSVoWXoAz6cpIlWnwgir4t1ph88Ph56l+qmqW3gUj/U6MIuzjxBJlijTMHl96its95Nd4cEFx4j+sFuRYob6D0kcemC7xEFuty7bdupda51Z56GYI1YjuUTryTlFOHZbOSThc2ZMzNC1gPG25bn2Lx6sDuPByk4KW4rQ2v7mSfeUuZZRdjtVSC0WV2M2Cv5L8eLFvZRgNYnXrUJYhnRpT+OBAvJZXaWU2nv/bNe/UQIDAQAB # 回调地址 - notifyUrl: https://baiyee.vip/pay/aliPay/pay-notify + notifyUrl: https://count.byffp.top/pay/aliPay/pay-notify # 支付宝成功支付跳转页面 - returnUrl: https://baiyee.vip/dashboard + returnUrl: https://count.byffp.top/dashboard # 可设置AES密钥,调用AES加解密相关接口时需要(可选) encryptKey: diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml index 26120d0..e05ade0 100644 --- a/admin/src/main/resources/application.yml +++ b/admin/src/main/resources/application.yml @@ -6,6 +6,9 @@ spring: name: @artifactId@ profiles: active: dev + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 # 天爱图形验证码 diff --git a/admin/src/main/resources/mapper/LoginEquipmentMapper.xml b/admin/src/main/resources/mapper/LoginEquipmentMapper.xml index d086267..94ebddb 100644 --- a/admin/src/main/resources/mapper/LoginEquipmentMapper.xml +++ b/admin/src/main/resources/mapper/LoginEquipmentMapper.xml @@ -14,6 +14,8 @@ wa.remark, wa.create_time, wa.update_time, + wa.user_id, + le.id, le.robot_id, le.device_number, le.expiration_time @@ -31,6 +33,9 @@ AND wa.username LIKE concat('%',#{username,jdbcType=VARCHAR},'%') + + AND wa.wx_id LIKE concat('%',#{wxId,jdbcType=VARCHAR},'%') + and wa.create_time >= #{startTime,jdbcType=TIMESTAMP} @@ -38,6 +43,7 @@ and wa.create_time <= #{endTime,jdbcType=TIMESTAMP} + order by le.id desc + + + diff --git a/admin/src/main/resources/mapper/WeChatFriendMapper.xml b/admin/src/main/resources/mapper/WeChatFriendMapper.xml index 78bc914..414333d 100644 --- a/admin/src/main/resources/mapper/WeChatFriendMapper.xml +++ b/admin/src/main/resources/mapper/WeChatFriendMapper.xml @@ -16,19 +16,21 @@ diff --git a/marketing-platform-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java b/marketing-platform-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java index 2cfa4a5..93bd4cd 100644 --- a/marketing-platform-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java +++ b/marketing-platform-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java @@ -65,7 +65,7 @@ public enum ResponseCode { /** * 支付宝支付失败 */ - ALI_PAY_ERROR("1016", "支付宝支付失败"), + ALI_PAY_ERROR("1016", "创建订单失败"), /** * 支付宝支付回调失败 diff --git a/marketing-platform-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java b/marketing-platform-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java index fbef78d..2c6fcb5 100644 --- a/marketing-platform-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java +++ b/marketing-platform-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java @@ -27,7 +27,7 @@ public enum StatisticsEnum { /** * 三十日 */ - THIRTY_DAYS(30, 2); + THIRTY_DAYS(3, 30); diff --git a/marketing-platform-common/common-core/src/main/java/com/baiye/validation/EmptyCurlyToDefaultMessageInterpolator.java b/marketing-platform-common/common-core/src/main/java/com/baiye/validation/EmptyCurlyToDefaultMessageInterpolator.java index 3a9818d..553cb81 100644 --- a/marketing-platform-common/common-core/src/main/java/com/baiye/validation/EmptyCurlyToDefaultMessageInterpolator.java +++ b/marketing-platform-common/common-core/src/main/java/com/baiye/validation/EmptyCurlyToDefaultMessageInterpolator.java @@ -16,44 +16,43 @@ import java.util.Locale; */ public class EmptyCurlyToDefaultMessageInterpolator extends ResourceBundleMessageInterpolator { - private static final String EMPTY_CURLY_BRACES = "{}"; - - public EmptyCurlyToDefaultMessageInterpolator() { - } - - public EmptyCurlyToDefaultMessageInterpolator(ResourceBundleLocator userResourceBundleLocator) { - super(userResourceBundleLocator); - } - - @Override - public String interpolate(String message, Context context, Locale locale) { - - // 如果包含花括号占位符 - if (message.contains(EMPTY_CURLY_BRACES)) { - // 获取注解类型 - Class annotationType = context.getConstraintDescriptor() - .getAnnotation() - .annotationType(); - - Method messageMethod; - try { - messageMethod = annotationType.getDeclaredMethod("message"); - } - catch (NoSuchMethodException e) { - return super.interpolate(message, context, locale); - } - - // 找到对应 message 的默认值,将 {} 替换为默认值 - if (messageMethod.getDefaultValue() != null) { - Object defaultValue = messageMethod.getDefaultValue(); - if (defaultValue instanceof String) { - String defaultMessage = (String) defaultValue; - message = message.replace(EMPTY_CURLY_BRACES, defaultMessage); - } - } - } - - return super.interpolate(message, context, locale); - } + private static final String EMPTY_CURLY_BRACES = "{}"; + + public EmptyCurlyToDefaultMessageInterpolator() { + } + + public EmptyCurlyToDefaultMessageInterpolator(ResourceBundleLocator userResourceBundleLocator) { + super(userResourceBundleLocator); + } + + @Override + public String interpolate(String message, Context context, Locale locale) { + + // 如果包含花括号占位符 + if (message.contains(EMPTY_CURLY_BRACES)) { + // 获取注解类型 + Class annotationType = context.getConstraintDescriptor() + .getAnnotation() + .annotationType(); + + Method messageMethod; + try { + messageMethod = annotationType.getDeclaredMethod("message"); + } catch (NoSuchMethodException e) { + return super.interpolate(message, context, locale); + } + + // 找到对应 message 的默认值,将 {} 替换为默认值 + if (messageMethod.getDefaultValue() != null) { + Object defaultValue = messageMethod.getDefaultValue(); + if (defaultValue instanceof String) { + String defaultMessage = (String) defaultValue; + message = message.replace(EMPTY_CURLY_BRACES, defaultMessage); + } + } + } + + return super.interpolate(message, context, locale); + } } diff --git a/marketing-platform-common/common-core/src/main/java/com/baiye/validation/constraints/OneOfClasses.java b/marketing-platform-common/common-core/src/main/java/com/baiye/validation/constraints/OneOfClasses.java index 70fcf46..ba5f9fc 100644 --- a/marketing-platform-common/common-core/src/main/java/com/baiye/validation/constraints/OneOfClasses.java +++ b/marketing-platform-common/common-core/src/main/java/com/baiye/validation/constraints/OneOfClasses.java @@ -16,33 +16,33 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; * @author housl * @version 1.0 */ -@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Target({METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE}) @Retention(RUNTIME) @Repeatable(OneOfClasses.List.class) @Documented -@Constraint(validatedBy = { EnumValueValidatorOfClass.class }) +@Constraint(validatedBy = {EnumValueValidatorOfClass.class}) public @interface OneOfClasses { - String message() default "value must match one of the values in the list: {value}"; + String message() default "value must match one of the values in the list: {value}"; - Class[] value(); + Class[] value(); - /** - * 允许值为 null, 默认不允许 - */ - boolean allowNull() default false; + /** + * 允许值为 null, 默认不允许 + */ + boolean allowNull() default false; - Class[] groups() default {}; + Class[] groups() default {}; - Class[] payload() default {}; + Class[] payload() default {}; - @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) - @Retention(RUNTIME) - @Documented - @interface List { + @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) + @Retention(RUNTIME) + @Documented + @interface List { - OneOfClasses[] value(); + OneOfClasses[] value(); - } + } } diff --git a/marketing-platform-starters/marketing-platform-starter-websocket/pom.xml b/marketing-platform-starters/marketing-platform-starter-websocket/pom.xml index 11073b3..d303696 100644 --- a/marketing-platform-starters/marketing-platform-starter-websocket/pom.xml +++ b/marketing-platform-starters/marketing-platform-starter-websocket/pom.xml @@ -45,5 +45,7 @@ spring-data-redis true + +