From 59e6c4871feca01be2af3003ca407bb5d9b25112 Mon Sep 17 00:00:00 2001 From: khy <2908249413@qq.com> Date: Fri, 6 Jun 2025 22:04:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AE=A2=E6=9C=8D=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kefu/KeFuConversationController.java | 19 ++++++++++ .../app/circle/AppCircleController.java | 16 ++++++++ .../service/kefu/KeFuConversationService.java | 8 ++++ .../kefu/KeFuConversationServiceImpl.java | 14 +++++++ .../service/kefu/KeFuMessageServiceImpl.java | 7 ++++ .../supportstaff/SupportStaffServiceImpl.java | 38 +++++++++++++++++++ .../service/user/AdminUserServiceImpl.java | 2 +- 7 files changed, 103 insertions(+), 1 deletion(-) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java index de4a906..7bdaa24 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/kefu/KeFuConversationController.java @@ -37,6 +37,25 @@ public class KeFuConversationController { @Resource private MemberUserApi memberUserApi; + @GetMapping("/get") + @Operation(summary = "获得客服会话") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('promotion:kefu-conversation:query')") + public CommonResult getConversation(@RequestParam("id") Long id) { + KeFuConversationDO conversation = conversationService.getConversation(id); + if (conversation == null) { + return success(null); + } + + // 拼接数据 + KeFuConversationRespVO result = BeanUtils.toBean(conversation, KeFuConversationRespVO.class); + MemberUserRespDTO memberUser = memberUserApi.getUser(conversation.getUserId()); + if (memberUser != null) { + result.setUserAvatar(memberUser.getAvatar()).setUserNickname(memberUser.getNickname()); + } + return success(result); + } + @PutMapping("/update-conversation-pinned") @Operation(summary = "置顶/取消置顶客服会话") @PreAuthorize("@ss.hasPermission('promotion:kefu-conversation:update')") diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java index 2549c62..219092b 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/circle/AppCircleController.java @@ -10,8 +10,10 @@ import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CircleRespVO import cn.iocoder.yudao.module.promotion.controller.admin.circle.vo.CircleSaveReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.circlereview.vo.CircleReviewSaveReqVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.circle.CircleDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.circlelike.CircleLikeDO; import cn.iocoder.yudao.module.promotion.dal.dataobject.circlereview.CircleReviewDO; import cn.iocoder.yudao.module.promotion.service.circle.CircleService; +import cn.iocoder.yudao.module.promotion.service.circlelike.CircleLikeService; import cn.iocoder.yudao.module.promotion.service.circlereview.CircleReviewService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -37,6 +39,8 @@ public class AppCircleController { private CircleReviewService circleReviewService; @Resource private MemberUserApi memberUserApi; + @Resource + private CircleLikeService circleLikeService; public String utilMethod(Long userId,Long reviewId){ String nickname = memberUserApi.getUser(userId).getNickname(); @@ -108,6 +112,18 @@ public class AppCircleController { return success(true); } + @GetMapping("/getLike") + @Operation(summary = "查询是否点赞") + @PreAuthenticated + public CommonResult getLike(@RequestParam("id") Long lookId){ + CircleLikeDO circleLikeDO = circleLikeService.getCircleLike(lookId,getLoginUserId()); + Boolean isLike = false; + if (circleLikeDO != null){ + isLike = true; + } + return success(isLike); + } + @PutMapping("/doLike") @Operation(summary = "点赞/取消点赞") @PreAuthenticated diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java index 52b5179..2882b39 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java @@ -13,6 +13,14 @@ import java.util.List; */ public interface KeFuConversationService { + /** + * 获得客服会话 + * + * @param id 编号 + * @return 客服会话 + */ + KeFuConversationDO getConversation(Long id); + /** * 【管理员】删除客服会话 * diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java index 2b8d763..82d1033 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java @@ -37,6 +37,11 @@ public class KeFuConversationServiceImpl implements KeFuConversationService { @Resource private SupportStaffMapper supportStaffMapper; + @Override + public KeFuConversationDO getConversation(Long id) { + return conversationMapper.selectById(id); + } + @Override public void deleteKefuConversation(Long id) { // 校验存在 @@ -145,11 +150,20 @@ public class KeFuConversationServiceImpl implements KeFuConversationService { @Override public String transferConversation(Long id, Long kefuId) { + //先下线 + KeFuConversationDO currDo = conversationMapper.selectById(id); + SupportStaffDO currSs = supportStaffMapper.selectById(currDo.getKefuId()); + currSs.setStatus(0); + supportStaffMapper.updateById(currSs); + //会话转接 KeFuConversationDO keFuConversationDO = new KeFuConversationDO(); keFuConversationDO.setId(id); keFuConversationDO.setKefuId(kefuId); conversationMapper.updateById(keFuConversationDO); + //再上线新客服 SupportStaffDO supportStaffDO = supportStaffMapper.selectById(kefuId); + supportStaffDO.setStatus(1); + supportStaffMapper.updateById(supportStaffDO); return supportStaffDO.getName(); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java index c976269..84e9348 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java @@ -194,6 +194,13 @@ public class KeFuMessageServiceImpl implements KeFuMessageService { @Override @Transactional(rollbackFor = Exception.class) public void updateKeFuMessageReadStatus(Long conversationId, Long userId, Integer userType) { + //判断是否是客服 + SupportStaffDO staff = supportStaffMapper.selectOne(new LambdaUpdateWrapper() + .eq(SupportStaffDO::getUserId,getLoginUserId())); + if (staff != null && staff.getStatus() == 1){ + conversationService.updateAdminUnreadMessageCountToZero(conversationId); + return; + } // 1.1 校验会话是否存在 KeFuConversationDO conversation = conversationService.validateKefuConversationExists(conversationId); // 1.2 如果是会员端处理已读,需要传递 userId;万一用户模拟一个 conversationId diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java index 755b464..e6c9d39 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/supportstaff/SupportStaffServiceImpl.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.promotion.service.supportstaff; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -13,6 +15,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; /** * 客服人员 Service 实现类 @@ -26,6 +29,9 @@ public class SupportStaffServiceImpl implements SupportStaffService { @Resource private SupportStaffMapper supportStaffMapper; + @Resource + private AdminUserApi adminUserApi; + @Override public Integer createSupportStaff(SupportStaffSaveReqVO createReqVO) { // 插入 @@ -36,8 +42,23 @@ public class SupportStaffServiceImpl implements SupportStaffService { throw exception(SUPPORT_STAFF_USER_EXISTS); } } + List users = adminUserApi.getListNoArgs(); + if(!users.isEmpty()){ + users.forEach(user -> { + if(user.getUsername().equals(createReqVO.getAccount())){ + throw exception(USER_USERNAME_EXISTS); + } + }); + } supportStaff.setLineStatus(2); supportStaffMapper.insert(supportStaff); + AdminUserRespDTO adminUserRespDTO = new AdminUserRespDTO(); + adminUserRespDTO.setUsername(createReqVO.getAccount()); + adminUserRespDTO.setMobile(supportStaff.getPhone()); + adminUserRespDTO.setPassword(createReqVO.getPassword()); + adminUserRespDTO.setNickname(supportStaff.getName()); + + adminUserApi.createUserBySupportStaff(adminUserRespDTO); // 返回 return supportStaff.getId(); } @@ -50,6 +71,23 @@ public class SupportStaffServiceImpl implements SupportStaffService { SupportStaffDO updateObj = BeanUtils.toBean(updateReqVO, SupportStaffDO.class); SupportStaffDO supportStaffDO = supportStaffMapper.selectOne("id", updateReqVO.getId()); + AdminUserRespDTO adminUser = new AdminUserRespDTO(); + adminUser.setUsername(updateReqVO.getAccount()); + adminUser.setMobile(updateReqVO.getPhone()); + adminUser.setPassword(updateReqVO.getPassword()); + adminUser.setNickname(updateReqVO.getName()); + + AdminUserRespDTO adminUserRespDTO = adminUserApi.getUserByUserName(supportStaffDO.getAccount()); + if(adminUserRespDTO == null){ + // 新建一个后台账户 + adminUserApi.createUserBySupportStaff(adminUser); + } + else { + adminUserRespDTO.setUsername(adminUser.getUsername()); + adminUserRespDTO.setPassword(adminUser.getPassword()); + adminUserApi.updateUserBySupportStaff(adminUserRespDTO); + } + //判断用户是否被绑定 if (updateObj.getUserId() != null){ if (supportStaffDO.getUserId() == null || !supportStaffDO.getUserId().equals(updateObj.getUserId())){ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index dd8a96f..36f6df1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -589,7 +589,7 @@ public class AdminUserServiceImpl implements AdminUserService { userPostMapper.insertBatch(convertList(user.getPostIds(), postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId))); } - RoleDO role = roleService.getRoleByCode("support_staff"); + RoleDO role = roleService.getRoleByCode("chat"); if (role != null){ //给后台用户关联客服角色 permissionService.assignUserRole(user.getId(), Collections.singleton(role.getId())); From 1b4196ceeff087862113a1ee3ad52a9de2162ac5 Mon Sep 17 00:00:00 2001 From: khy <2908249413@qq.com> Date: Mon, 9 Jun 2025 13:08:59 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=85=8D=E7=99=BB=E5=BD=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/auth/AppAuthController.java | 6 ++++++ .../service/auth/MemberAuthService.java | 2 ++ .../service/auth/MemberAuthServiceImpl.java | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java index 5d3c936..61be636 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java @@ -123,4 +123,10 @@ public class AppAuthController { return success(AuthConvert.INSTANCE.convert(signature)); } + @PostMapping("/checkLogin") + @PermitAll + public CommonResult checkLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) { + return success(authService.checkLogin(reqVO)); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java index 8afc09e..fc17929 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java @@ -85,4 +85,6 @@ public interface MemberAuthService { */ AppAuthLoginRespVO refreshToken(String refreshToken); + Integer checkLogin(AppAuthSocialLoginReqVO reqVO); + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java index e1a8ec5..f3c74d4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java @@ -258,6 +258,25 @@ public class MemberAuthServiceImpl implements MemberAuthService { return AuthConvert.INSTANCE.convert(accessTokenDO, null); } + @Override + public Integer checkLogin(AppAuthSocialLoginReqVO reqVO) { + // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 + SocialUserRespDTO socialUser = socialUserApi.getSocialUserByCode(UserTypeEnum.MEMBER.getValue(), reqVO.getType(), + reqVO.getCode(), reqVO.getState()); + System.out.println(socialUser); + if (socialUser == null) { + System.out.println("111"); + throw exception(AUTH_SOCIAL_USER_NOT_FOUND); + } + + //判断openid是否存在 +// SocialUserRespDTO respDTO = socialUserApi.getSocialUserByOpenId(socialUser.getOpenid()); + if (socialUser.getUserId() == null) { + return -1; + } + return 1; + } + private void createLogoutLog(Long userId) { LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType());