From b24ed26504cc403981a484bc06165c577b84cd8f Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 28 Nov 2025 17:00:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/member/client/service/ChatApi.java | 5 +++ .../member/client/service/ChatApiImpl.java | 32 +++++++++++++ .../user/ChatPrivateMessageSendReqVO.java | 42 +++++++++++++++++ .../user/ChatPrivateMessageSendResVO.java | 36 +++++++++++++++ .../app/chat/AppChatController.java | 10 +++++ .../service/opentype/OpenTypeService.java | 5 +++ .../service/opentype/OpenTypeServiceImpl.java | 45 ++++++++++++++++++- 7 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendReqVO.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendResVO.java diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApi.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApi.java index 51d6752..6c4ef5e 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApi.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApi.java @@ -65,6 +65,11 @@ public interface ChatApi { /* *************************************** start 私聊 start *************************************** */ + /** + * 发送消息 + */ + ChatPrivateMessageSendResVO send(ChatPrivateMessageSendReqVO dto); + /** * 私聊消息分页 */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApiImpl.java index eb805c1..be605fb 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApiImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/service/ChatApiImpl.java @@ -290,6 +290,38 @@ public class ChatApiImpl implements ChatApi { /* *************************************** start 私聊 start *************************************** */ + /** + * 发私聊送消息 + */ + @Override + public ChatPrivateMessageSendResVO send(ChatPrivateMessageSendReqVO dto) { + ChatApiTool.API api = setApiConfig(ChatApiTool.PRIVATE_MSG_INFO); + try { + String body = JSONUtil.toJsonStr(dto); + String res = HttpRequest.post(api.getFullPath()).header(apiCountersign(body)).body(body).execute().body(); + log.debug("发私聊送消息,res:{}", res); + if (ObjectUtil.isEmpty(res)) { + log.error("发私聊送消息,res为空"); + return null; + } + ChatBaseRespVo baseRes = JSONUtil.toBean(res, ChatBaseRespVo.class); + if (ObjectUtil.isEmpty(baseRes) || !baseRes.isSuccess()) { + log.error("发私聊送消息,返回错误"); + return null; + } + ChatPrivateMessageSendResVO vo = JSONUtil.toBean(baseRes.getData(), ChatPrivateMessageSendResVO.class); + if (ObjectUtil.isEmpty(vo)) { + log.error("发私聊送消息,返回json解析错误"); + return null; + } + return vo; + } catch (Exception e) { + e.printStackTrace(); + log.error("聊天用户登录,意外的错误", e); + return null; + } + } + /** * 私聊消息分页 */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendReqVO.java new file mode 100644 index 0000000..dfcc694 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.member.client.vo.chat.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +@Schema(description = "chat用户发送消息req") +public class ChatPrivateMessageSendReqVO { + + @Schema(description = "发送用户id") + private Long sendId; + + /** + * +0:web + * +1:app + * +2:pc + * -1:未知 + */ + @Schema(description = "发送终端类型") + private Integer terminal = 1; + + @Schema(description = "临时id") + private String tmpId; + + @NotNull(message = "接收用户id不可为空") + @Schema(description = "接收用户id") + private Long recvId; + + @Length(max = 1024, message = "内容长度不得大于1024") + @NotEmpty(message = "发送内容不可为空") + @Schema(description = "发送内容") + private String content; + + @NotNull(message = "消息类型不可为空") + @Schema(description = "消息类型 0:文字 1:图片 2:文件 3:语音 4:视频") + private Integer type; + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendResVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendResVO.java new file mode 100644 index 0000000..2400ae4 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/client/vo/chat/user/ChatPrivateMessageSendResVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.member.client.vo.chat.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "chat用户发送消息resp") +public class ChatPrivateMessageSendResVO { + + @Schema(description = " 消息id") + private Long id; + + @Schema(description = "临时id") + private String tmpId; + + @Schema(description = " 发送者id") + private Long sendId; + + @Schema(description = " 接收者id") + private Long recvId; + + @Schema(description = " 发送内容") + private String content; + + @Schema(description = "消息内容类型 MessageType") + private Integer type; + + @Schema(description = " 状态") + private Integer status; + + @Schema(description = " 发送时间") + private Date sendTime; + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/chat/AppChatController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/chat/AppChatController.java index c62f9fc..fdd830f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/chat/AppChatController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/chat/AppChatController.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.member.controller.app.chat; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.member.client.service.ChatApi; import cn.iocoder.yudao.module.member.client.vo.chat.friend.ChatAddFriendReqVo; +import cn.iocoder.yudao.module.member.client.vo.chat.user.ChatPrivateMessageSendReqVO; +import cn.iocoder.yudao.module.member.client.vo.chat.user.ChatPrivateMessageSendResVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.validation.annotation.Validated; @@ -22,6 +24,14 @@ public class AppChatController { @Resource private ChatApi chatApi; + @GetMapping("/send-private-msg") + @Operation(summary = "创建用户反馈") + public CommonResult sendPrivateMsg(@RequestBody ChatPrivateMessageSendReqVO body) { + body.setSendId(getLoginUserId()); + body.setTerminal(1); + return success(chatApi.send(body)); + } + @GetMapping("/add-friend") @Operation(summary = "创建用户反馈") public CommonResult createFeedback(@RequestParam("friendUserId") Long friendUserId) { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java index 06457e4..b05f263 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java @@ -48,4 +48,9 @@ public interface OpenTypeService { * 购买会员 */ Long payOpenType(AppPayOpenReqType dto); + + /** + * 判断用户是否还可以发送消息 + */ + boolean isUserCanSendMessage(Long userId); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java index 1953297..7774e7d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java @@ -2,6 +2,10 @@ package cn.iocoder.yudao.module.member.service.opentype; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.member.client.service.ChatApi; +import cn.iocoder.yudao.module.member.client.vo.chat.ChatTableRespVO; +import cn.iocoder.yudao.module.member.client.vo.chat.privatemsg.ChatPrivateMessageReqVO; +import cn.iocoder.yudao.module.member.client.vo.chat.privatemsg.ChatPrivateMessageRespVO; import cn.iocoder.yudao.module.member.controller.app.opentype.vo.AppPayOpenReqType; import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeUserDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; @@ -9,6 +13,7 @@ import cn.iocoder.yudao.module.member.dal.mysql.opentype.OpenTypeUserMapper; import cn.iocoder.yudao.module.member.enums.MemberErrorCode; import cn.iocoder.yudao.module.member.enums.opentype.OpenTypeUserStatusEnum; import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -24,7 +29,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.member.dal.mysql.opentype.OpenTypeMapper; +import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -32,6 +41,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU /** * 会员类型 Service 实现类 */ +@Slf4j @Service @Validated public class OpenTypeServiceImpl implements OpenTypeService { @@ -43,6 +53,9 @@ public class OpenTypeServiceImpl implements OpenTypeService { @Resource private OpenTypeUserMapper openTypeUserMapper; + @Resource + private ChatApi chatApi; + /** * 创建会员类型 @@ -128,12 +141,42 @@ public class OpenTypeServiceImpl implements OpenTypeService { } else { openTypeUserObj.setEndTime(now.plusDays(openType.getDuration())); } - + // 新增会员开通表 openTypeUserMapper.insert(openTypeUserObj); return openTypeUserObj.getId(); } + /** + * 判断用户是否还可以发送消息 + */ + @Override + public boolean isUserCanSendMessage(Long userId) { + LocalDateTime now = LocalDateTime.now(); + + Date startDate = Date.from(now.withHour(0).withMinute(0).withSecond(0).atZone(ZoneId.systemDefault()).toInstant()); + Date endDate = Date.from(now.withHour(23).withMinute(59).withSecond(59).atZone(ZoneId.systemDefault()).toInstant()); + + ChatPrivateMessageReqVO dto = new ChatPrivateMessageReqVO(); + dto.setPageNum(1); + dto.setPageSize(100); + dto.setSendId(userId); + dto.setSendTimeList(new ArrayList() {{ + add(startDate); + add(endDate); + }}); + try { + ChatTableRespVO page = chatApi.privateMsgPage(dto); + if (ObjectUtil.isEmpty(page) || ObjectUtil.isEmpty(page.getRows())) return true; + List rows = page.getRows(); + + } catch (Exception e) { + e.printStackTrace(); + log.error("|判断用户是否还可以发送消息|意外的错误:{}", e.getMessage()); + } + return false; + } + private void validateOpenTypeExists(Long id) { if (openTypeMapper.selectById(id) == null) { throw exception(MemberErrorCode.OPEN_TYPE_NOT_EXISTS);