From 8ff5bc0a666ab266ec8fd851e8dea0cdf158236d Mon Sep 17 00:00:00 2001 From: La123123 <617330105@qq.com> Date: Thu, 9 Apr 2026 16:00:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=9C=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=A5=97=E9=A4=90=E4=B8=8A=E9=99=90=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/allocatePackagesDialog.vue | 106 ++++++++++++++++++ im-admin-ui/src/views/im/customer/index.vue | 18 ++- .../im/controller/ImUserController.java | 5 +- .../dromara/im/service/IImAgentService.java | 9 ++ .../dromara/im/service/IImUserService.java | 6 + .../im/service/impl/ImAgentServiceImpl.java | 7 ++ .../im/service/impl/ImUserServiceImpl.java | 28 +++++ 7 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 im-admin-ui/src/views/im/chatPackage/component/allocatePackagesDialog.vue diff --git a/im-admin-ui/src/views/im/chatPackage/component/allocatePackagesDialog.vue b/im-admin-ui/src/views/im/chatPackage/component/allocatePackagesDialog.vue new file mode 100644 index 0000000..4cfd252 --- /dev/null +++ b/im-admin-ui/src/views/im/chatPackage/component/allocatePackagesDialog.vue @@ -0,0 +1,106 @@ + + + diff --git a/im-admin-ui/src/views/im/customer/index.vue b/im-admin-ui/src/views/im/customer/index.vue index 17e42c6..386e166 100644 --- a/im-admin-ui/src/views/im/customer/index.vue +++ b/im-admin-ui/src/views/im/customer/index.vue @@ -156,13 +156,27 @@ const data = reactive>({ nickName: undefined, params: {} }, - rules: {} + rules: { + headImage: [{ required: true, message: '头像不能为空', trigger: 'change' }], + userName: [ + { required: true, message: '账号不能为空', trigger: 'change' }, + { min: 2, max: 20, message: '账号长度在2到20个字符之间', trigger: 'change' } + ], + password: [ + { required: true, message: '密码不能为空', trigger: 'change' }, + { min: 6, max: 20, message: '密码长度在6到20个字符之间', trigger: 'change' } + ], + sex: [{ required: true, message: '性别不能为空', trigger: 'change' }], + nickName: [ + { required: true, message: '昵称不能为空', trigger: 'change' }, + { min: 2, max: 20, message: '昵称长度在2到20个字符之间', trigger: 'change' } + ] + } }); const { queryParams, form, rules } = toRefs(data); const { im_bool } = toRefs(proxy?.useDict('im_bool')); const { sys_user_sex } = toRefs(proxy?.useDict('sys_user_sex')); -console.log(sys_user_sex); /** 提交按钮 */ const submitForm = () => { userFormRef.value?.validate(async (valid: boolean) => { diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java index 4b21271..220403f 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java @@ -151,8 +151,6 @@ public class ImUserController extends BaseController { @SaCheckPermission("im:user:listCustomer") @GetMapping("/listCustomer") public TableDataInfo listCustomer(ImUserBo bo, PageQuery pageQuery) { - System.out.println("ImUserBo" + bo); - System.out.println("PageQuery" + pageQuery); return userService.queryPageListCustomer(bo, pageQuery); } @@ -174,6 +172,9 @@ public class ImUserController extends BaseController { } //检查是否已达当前角色使用的套餐客服上限 + if(userService.isCustomerLimited()) { + return R.fail("客服已达上限"); + } // 设置默认值 String username = user.getUserName(); diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java index 0ced1b4..86453c2 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java @@ -1,5 +1,6 @@ package org.dromara.im.service; +import org.dromara.im.domain.ImAgent; import org.dromara.im.domain.vo.ImAgentVo; import org.dromara.im.domain.bo.ImAgentBo; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -79,4 +80,12 @@ public interface IImAgentService { * @return 代理ID和名称的Map列表 */ List> getAllAgentNameList(); + + + /** + * 根据令牌获取代理对象 + * @param token 用于标识代理的唯一令牌字符串 + * @return 返回与令牌匹配的ImAgent对象,如果没有找到匹配的代理则可能返回null + */ + ImAgent getAgentByToken(String token); } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java index e26680a..e1148dc 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImUserService.java @@ -144,4 +144,10 @@ public interface IImUserService { */ void updateBatchUser(List list); + /** + * 判断当前角色客服数量是否达到上限 + * + */ + boolean isCustomerLimited(); + } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java index 693cdff..9f54922 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java @@ -190,4 +190,11 @@ public class ImAgentServiceImpl implements IImAgentService { return map; }).collect(Collectors.toList()); } + + @Override + public ImAgent getAgentByToken(String token) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(ImAgent::getUniqueToken, token); + return baseMapper.selectOne(lqw); + } } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java index 70352cc..f9d0082 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java @@ -15,6 +15,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.im.constant.ImConstant; import org.dromara.im.constant.ImRedisKey; +import org.dromara.im.domain.ImAgent; import org.dromara.im.domain.ImUser; import org.dromara.im.domain.bo.ImUserBo; import org.dromara.im.domain.dto.BatchUpdateUserDto; @@ -382,4 +383,31 @@ public class ImUserServiceImpl implements IImUserService { baseMapper.updateBatchById(temp); } + + @Override + public boolean isCustomerLimited() { + // 获取当前用户的唯一标识token + String uniqueToken = imAgentService.getTokenByUserId(); + + //获取当前用户数 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(ImUser::getUniqueToken, uniqueToken); + List list = baseMapper.selectList(wrapper); + int nowCustomerCount = 0; + if (list != null && !list.isEmpty()) { + nowCustomerCount = list.size(); + } + + //获取用户上限 + ImAgent agent = imAgentService.getAgentByToken(uniqueToken); + int limit = 0; + if (agent != null && agent.getMaxCustomer() != null) { + limit = Math.toIntExact(agent.getMaxCustomer()); + } + + System.out.println("当前用户数:" + nowCustomerCount + ",上限:" + limit); + + //返回结果 达到极限返回true + return nowCustomerCount >= limit; + } }