From 53e9c3e6a865913ba68898a2b677d17cd362b1e8 Mon Sep 17 00:00:00 2001 From: La123123 <617330105@qq.com> Date: Wed, 15 Apr 2026 11:03:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=A5=97=E9=A4=90=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-admin-ui/src/views/index.vue | 23 +- .../web/controller/AuthController.java | 2 +- .../im/controller/ImUserController.java | 16 +- .../im/service/impl/ImUserServiceImpl.java | 3 - .../controller/system/SysUserController.java | 6 +- .../system/domain/ImChatPackageAdmin.java | 81 +++++++ .../dromara/system/domain/ImUserAdmin.java | 117 ++++++++++ .../domain/bo/ImChatPackageAdminBo.java | 72 +++++++ .../system/domain/bo/ImUserAdminBo.java | 105 +++++++++ .../domain/vo/ImChatPackageAdminVo.java | 80 +++++++ .../system/domain/vo/ImUserAdminVo.java | 120 +++++++++++ .../mapper/ImChatPackageAdminMapper.java | 15 ++ .../system/mapper/ImUserAdminMapper.java | 47 ++++ .../service/IImChatPackageAdminService.java | 78 +++++++ .../system/service/IImUserAdminService.java | 19 ++ ...nService.java => ImAgentAdminService.java} | 5 +- .../service/impl/ImAgentAdminServiceImpl.java | 76 ++++++- .../impl/ImChatPackageAdminServiceImpl.java | 202 ++++++++++++++++++ .../service/impl/ImUserAdminServiceImpl.java | 28 +++ .../service/impl/SysUserServiceImpl.java | 6 +- .../system/ImChatPackageAdminMapper.xml | 7 + 21 files changed, 1082 insertions(+), 26 deletions(-) create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImChatPackageAdmin.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImUserAdmin.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImChatPackageAdminBo.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImUserAdminBo.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImChatPackageAdminVo.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImUserAdminVo.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImChatPackageAdminMapper.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImUserAdminMapper.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImChatPackageAdminService.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImUserAdminService.java rename im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/{IImAgentAdminService.java => ImAgentAdminService.java} (96%) create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImChatPackageAdminServiceImpl.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImUserAdminServiceImpl.java create mode 100644 im-admin/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ImChatPackageAdminMapper.xml diff --git a/im-admin-ui/src/views/index.vue b/im-admin-ui/src/views/index.vue index 4bb636e..2ee06a7 100644 --- a/im-admin-ui/src/views/index.vue +++ b/im-admin-ui/src/views/index.vue @@ -71,8 +71,9 @@
-
当前套餐:
-
可添加客服数量:{{ totalGroupCount }}
+
当前套餐:{{ packageInfo.packageName }}
+
可添加客服数量:{{ packageInfo.enableCustomerNumber }}
+
过期时间:{{ packageInfo.expireTime }}
@@ -141,6 +142,12 @@ const dailyActiveCount = ref(0); const weeklyActiveCount = ref(0); const monthlyActiveCount = ref(0); +const packageInfo = ref({ + packageName: '', + enableCustomerNumber: '', + expireTime: '' +}); + // 加载总用户数量 const loadTotalUserCount = async () => { try { @@ -244,7 +251,10 @@ const processChartData = (privateData: any[], groupData: any[]) => { const loadRegistrationChartData = async () => { try { const response = await getDailyRegistrationCount(registrationSelectedDays.value); - const data = response.data; + const data = response.data.registrationCount; + + //赋值套餐数据 + packageInfo.value = response.data.packageInfo; // 处理数据,确保所有日期都有数据 const chartData = processRegistrationChartData(data); @@ -524,6 +534,12 @@ const initRegistrationChart = async () => { margin-bottom: 4px; } + .statistics-title2 { + font-size: 12px; + color: #8c8c8c; + margin-bottom: 4px; + } + .statistics-value { font-size: 24px; font-weight: 600; @@ -532,6 +548,7 @@ const initRegistrationChart = async () => { } .statistics-value2 { + margin-top: 8px; font-size: 16px; font-weight: 600; color: #262626; diff --git a/im-admin/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/im-admin/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index b1013b5..eafe52e 100644 --- a/im-admin/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/im-admin/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -69,7 +69,7 @@ public class AuthController { private final ISysClientService clientService; private final ScheduledExecutorService scheduledExecutorService; - private final IImAgentAdminService imAgentAdminService; + private final ImAgentAdminService imAgentAdminService; /** 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 c98cdf7..3ede3e0 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 @@ -2,6 +2,7 @@ package org.dromara.im.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -13,11 +14,8 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; -import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.im.domain.ImUser; -import org.dromara.im.domain.bo.ImSensitiveWordBo; import org.dromara.im.domain.bo.ImUserBo; import org.dromara.im.domain.dto.BatchUpdateUserDto; import org.dromara.im.domain.dto.ImUserBanDto; @@ -25,6 +23,7 @@ import org.dromara.im.domain.dto.ImUserUnbanDto; import org.dromara.im.domain.vo.ImUserVo; import org.dromara.im.service.IImUserService; import org.dromara.im.util.CommaTextUtils; +import org.dromara.system.service.ImAgentAdminService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -51,6 +50,8 @@ public class ImUserController extends BaseController { private final ScheduledExecutorService scheduledExecutorService; + private final ImAgentAdminService imAgentAdminService; + /** * 查询用户列表 */ @@ -117,14 +118,17 @@ public class ImUserController extends BaseController { } /** - * 按天统计用户注册数量 + * 按天统计用户注册数量 同时获取套餐信息 * * @param days 统计天数,默认7天 */ @SaCheckPermission("im:user:list") @GetMapping("/dailyRegistrationCount") - public R>> getDailyRegistrationCount(@RequestParam(value = "days", defaultValue = "7") Integer days) { - return R.ok(userService.getDailyRegistrationCount(days)); + public R getDailyRegistrationCount(@RequestParam(value = "days", defaultValue = "7") Integer days) { + JSONObject data = new JSONObject(); + data.set("registrationCount", userService.getDailyRegistrationCount(days)); + data.set("packageInfo", imAgentAdminService.getPackageInfo()); + return R.ok(data); } /** 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 35ed221..4406f70 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 @@ -202,13 +202,10 @@ public class ImUserServiceImpl implements IImUserService { // 如果不是超级管理员,则使用带uniqueToken的方法 if(!LoginHelper.isSuperAdmin()) { - System.out.println("1111111111"); String uniqueToken = imAgentService.getTokenByUserId(); - System.out.println(uniqueToken); return baseMapper.getDailyRegistrationCountByToken(days, uniqueToken); } - System.out.println("222222222222"); return baseMapper.getDailyRegistrationCount(days); } diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index cbbd603..f561d35 100644 --- a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -56,10 +56,10 @@ public class SysUserController extends BaseController { private final ISysPostService postService; private final ISysDeptService deptService; private final ISysTenantService tenantService; - @Autowired - private IImAgentAdminService imAgentAdminService; - private final IImAgentAdminService imAgentService; + private final ImAgentAdminService imAgentAdminService; + + private final ImAgentAdminService imAgentService; /** * 获取用户列表 diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImChatPackageAdmin.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImChatPackageAdmin.java new file mode 100644 index 0000000..a416b23 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImChatPackageAdmin.java @@ -0,0 +1,81 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fhs.core.trans.vo.TransPojo; +import lombok.Data; + +import java.util.Date; + +/** + * 套餐对象 im_chat_package + * + * @author Blue + * @date 2026-04-09 + */ +@Data +@TableName("im_chat_package") +public class ImChatPackageAdmin implements TransPojo { + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 套餐名称 + */ + private String packageName; + + /** + * 套餐内容描述 + */ + private String packageContent; + + /** + * 客服数量 + */ + private Long customerServiceNumber; + + /** + * 套餐持续时间(天) + */ + private Long durationDays; + + /** + * 状态:0-禁用 1-启用 + */ + private Long status; + + /** + * 排序 + */ + private Long sortOrder; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 创建者ID + */ + private Long creatorId; + + /** + * 更新者ID + */ + private Long updaterId; + + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImUserAdmin.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImUserAdmin.java new file mode 100644 index 0000000..e243631 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImUserAdmin.java @@ -0,0 +1,117 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fhs.core.trans.vo.TransPojo; +import lombok.Data; + +import java.util.Date; + +/** + * 用户对象 im_user + * + * @author Blue + * @date 2024-12-22 + */ +@Data +@TableName("im_user") +public class ImUserAdmin implements TransPojo { + + /** + * id + */ + @TableId + private Long id; + + /** + * 用户名 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户头像 + */ + private String headImage; + + /** + * 用户头像缩略图 + */ + private String headImageThumb; + + /** + * 密码(明文) + */ + private String password; + + /** + * 性别 0:男 1::女 + */ + private Long sex; + + /** + * 个性签名 + */ + private String signature; + + /** + * 最后登录时间 + */ + private Date lastLoginTime; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * + */ + private Long type; + + /** + * 是否被封禁 0:否 1:是 + */ + private Boolean isBanned; + + /** + * 被封禁原因 + */ + private String reason; + + /** + * uuid + */ + private String uuid; + + /** + * 用户类型 1:普通用户 2:客服 + */ + private Integer isCustomer; + + private String labelIds; + + private String groupIds; + + /** + * 唯一token + */ + private String uniqueToken; + + /** + * 来源地址 + */ + private String sourceUrl; + + /** + * 欢迎语 + */ + private String welcomeMsg; + + + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImChatPackageAdminBo.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImChatPackageAdminBo.java new file mode 100644 index 0000000..4af4381 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImChatPackageAdminBo.java @@ -0,0 +1,72 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.ImChatPackageAdmin; + +/** + * 套餐业务对象 im_chat_package + * + * @author Blue + * @date 2026-04-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ImChatPackageAdmin.class, reverseConvertGenerate = false) +public class ImChatPackageAdminBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 套餐名称 + */ + @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String packageName; + + /** + * 套餐内容描述 + */ + @NotBlank(message = "套餐内容描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String packageContent; + + /** + * 客服数量 + */ + @NotNull(message = "客服数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long customerServiceNumber; + + /** + * 套餐持续时间(天) + */ + @NotNull(message = "套餐持续时间(天)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long durationDays; + + /** + * 状态:0-禁用 1-启用 + */ + @NotNull(message = "状态:0-禁用 1-启用不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 排序 + */ + @NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sortOrder; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImUserAdminBo.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImUserAdminBo.java new file mode 100644 index 0000000..97c9dc5 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImUserAdminBo.java @@ -0,0 +1,105 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.ImUserAdmin; + + +import java.util.Date; + +/** + * 用户业务对象 im_user + * + * @author Blue + * @date 2024-12-22 + */ +@Data +@AutoMapper(target = ImUserAdmin.class, reverseConvertGenerate = false) +public class ImUserAdminBo { + + /** + * id + */ + private Long id; + + /** + * 用户名 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户头像 + */ + private String headImage; + + /** + * 用户头像缩略图 + */ + private String headImageThumb; + + /** + * 密码(明文) + */ + private String password; + + /** + * 性别 0:男 1::女 + */ + private Long sex; + + /** + * 个性签名 + */ + private String signature; + + /** + * 最后登录时间 + */ + private Date lastLoginTime; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * + */ + private Long type; + + /** + * 是否被封禁 + */ + private Boolean isBanned; + + /** + * 被封禁原因 + */ + private String reason; + + /** + * 用户类型 1:普通用户 2:客服 + */ + private Integer isCustomer; + + /** + * 标签 ID 列表 (逗号分隔) + */ + private String labelIds; + + /** + * 群组 ID 列表 (逗号分隔) + */ + private String groupIds; + + /** + * 欢迎语 + */ + private String welcomeMsg; + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImChatPackageAdminVo.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImChatPackageAdminVo.java new file mode 100644 index 0000000..9c82abd --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImChatPackageAdminVo.java @@ -0,0 +1,80 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.ImChatPackageAdmin; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 套餐视图对象 im_chat_package + * + * @author Blue + * @date 2026-04-09 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ImChatPackageAdmin.class) +public class ImChatPackageAdminVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 套餐名称 + */ + @ExcelProperty(value = "套餐名称") + private String packageName; + + /** + * 套餐内容描述 + */ + private String packageContent; + + /** + * 排序 + */ + private Long sortOrder; + + /** + * 备注 + */ + private String remark; + + /** + * 客服数量 + */ + @ExcelProperty(value = "客服数量") + private Long customerServiceNumber; + + /** + * 套餐持续时间(天) + */ + @ExcelProperty(value = "套餐持续时间", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "天=") + private Long durationDays; + + /** + * 状态:0-禁用 1-启用 + */ + @ExcelProperty(value = "状态:0-禁用 1-启用", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "commom_status") + private Long status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createdTime; + + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImUserAdminVo.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImUserAdminVo.java new file mode 100644 index 0000000..92142cc --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImUserAdminVo.java @@ -0,0 +1,120 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.ImUserAdmin; + +import java.util.Date; + + +/** + * 用户视图对象 im_user + * + * @author Blue + * @date 2024-12-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ImUserAdmin.class) +public class ImUserAdminVo { + + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 用户名 + */ + @ExcelProperty(value = "用户名") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户昵称") + private String nickName; + + /** + * 用户头像 + */ + @ExcelProperty(value = "用户头像") + private String headImage; + + + /** + * 用户头像缩略图 + */ + private String headImageThumb; + + /** + * 密码(明文) + */ + private String password; + + /** + * 性别 0:男 1::女 + */ + @ExcelProperty(value = "性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=男,1=女") + private Long sex; + + /** + * 个性签名 + */ + private String signature; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date lastLoginTime; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createdTime; + + /** + * 类型 + */ + private Long type; + + /** + * 是否被封禁 0:否 1:是 + */ + @ExcelProperty(value = "是否被封禁", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "false=否,true=是") + private Boolean isBanned; + + /** + * 被封禁原因 + */ + @ExcelProperty(value = "被封禁原因") + private String reason; + + private String labelIds; + + + private String groupIds; + + /** + * 来源地址 + */ + private String sourceUrl; + + /** + * 欢迎语 + */ + private String welcomeMsg; + + + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImChatPackageAdminMapper.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImChatPackageAdminMapper.java new file mode 100644 index 0000000..581981d --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImChatPackageAdminMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.ImChatPackageAdmin; +import org.dromara.system.domain.vo.ImChatPackageAdminVo; + +/** + * 套餐Mapper接口 + * + * @author Blue + * @date 2026-04-09 + */ +public interface ImChatPackageAdminMapper extends BaseMapperPlus { + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImUserAdminMapper.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImUserAdminMapper.java new file mode 100644 index 0000000..eaadbb9 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImUserAdminMapper.java @@ -0,0 +1,47 @@ +package org.dromara.system.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.ImUserAdmin; +import org.dromara.system.domain.vo.ImUserAdminVo; + +import java.util.List; +import java.util.Map; + +/** + * 用户Mapper接口 + * + * @author Blue + * @date 2024-12-22 + */ +public interface ImUserAdminMapper extends BaseMapperPlus { + + /** + * 按天统计用户注册数量 + * @param days 统计天数 + * @return 统计结果 + */ + @Select("SELECT DATE(created_time) as date, COUNT(*) as count " + + "FROM im_user " + + "WHERE created_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY) " + + "AND is_customer = 1 " + + "GROUP BY DATE(created_time) " + + "ORDER BY date ASC") + List> getDailyRegistrationCount(@Param("days") Integer days); + + /** + * 按天统计用户注册数量(带uniqueToken条件) + * @param days 统计天数 + * @param unique_token 唯一标识 + * @return 统计结果 + */ + @Select("SELECT DATE(created_time) as date, COUNT(*) as count " + + "FROM im_user " + + "WHERE is_customer = 1 AND unique_token = #{unique_token}" + + "AND created_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY)" + + "GROUP BY DATE(created_time) " + + "ORDER BY date ASC") + List> getDailyRegistrationCountByToken(@Param("days") Integer days, @Param("unique_token") String unique_token); + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImChatPackageAdminService.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImChatPackageAdminService.java new file mode 100644 index 0000000..3278db8 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImChatPackageAdminService.java @@ -0,0 +1,78 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.ImChatPackageAdminBo; +import org.dromara.system.domain.vo.ImChatPackageAdminVo; + + +import java.util.Collection; +import java.util.List; + +/** + * 套餐Service接口 + * + * @author Blue + * @date 2026-04-09 + */ +public interface IImChatPackageAdminService { + + /** + * 查询套餐 + * + * @param id 主键 + * @return 套餐 + */ + ImChatPackageAdminVo queryById(Long id); + + /** + * 分页查询套餐列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 套餐分页列表 + */ + TableDataInfo queryPageList(ImChatPackageAdminBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的套餐列表 + * + * @param bo 查询条件 + * @return 套餐列表 + */ + List queryList(ImChatPackageAdminBo bo); + + /** + * 新增套餐 + * + * @param bo 套餐 + * @return 是否新增成功 + */ + Boolean insertByBo(ImChatPackageAdminBo bo); + + /** + * 修改套餐 + * + * @param bo 套餐 + * @return 是否修改成功 + */ + Boolean updateByBo(ImChatPackageAdminBo bo); + + /** + * 校验并批量删除套餐信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 分配套餐给代理 + * + * @param agentId 代理ID + * @param packageId 套餐ID + * @return 是否分配成功 + */ + Boolean allocatePackages(Long agentId, Long packageId); +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImUserAdminService.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImUserAdminService.java new file mode 100644 index 0000000..e09ed0d --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImUserAdminService.java @@ -0,0 +1,19 @@ +package org.dromara.system.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; + + +import java.util.List; +import java.util.Map; + +/** + * 用户Service接口 + * + * @author Blue + * @date 2024-12-22 + */ +public interface IImUserAdminService { + + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImAgentAdminService.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ImAgentAdminService.java similarity index 96% rename from im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImAgentAdminService.java rename to im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ImAgentAdminService.java index af41044..c203149 100644 --- a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImAgentAdminService.java +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ImAgentAdminService.java @@ -8,6 +8,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Map; /** * 代理关联Service接口 @@ -15,7 +16,7 @@ import java.util.List; * @author Blue * @date 2026-04-07 */ -public interface IImAgentAdminService { +public interface ImAgentAdminService { /** * 查询代理关联 @@ -106,4 +107,6 @@ public interface IImAgentAdminService { */ Date getPackageExpireTime(Long sysId); + Map getPackageInfo(); + } diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImAgentAdminServiceImpl.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImAgentAdminServiceImpl.java index 8b7f711..1440589 100644 --- a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImAgentAdminServiceImpl.java +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImAgentAdminServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.system.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; @@ -12,18 +13,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.controller.constant.ImConstant; import org.dromara.system.domain.ImAgentAdmin; +import org.dromara.system.domain.ImChatPackageAdmin; +import org.dromara.system.domain.ImUserAdmin; import org.dromara.system.domain.bo.ImAgentAdminBo; import org.dromara.system.domain.vo.ImAgentAdminVo; +import org.dromara.system.mapper.ImChatPackageAdminMapper; +import org.dromara.system.mapper.ImUserAdminMapper; import org.springframework.stereotype.Service; import org.dromara.system.mapper.ImAgentAdminMapper; -import org.dromara.system.service.IImAgentAdminService; +import org.dromara.system.service.ImAgentAdminService; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.util.*; /** * 代理关联Service业务层处理 @@ -34,10 +37,14 @@ import java.util.Collection; @RequiredArgsConstructor @Service @DS(ImConstant.DS_IM_PLATFORM) -public class ImAgentAdminServiceImpl implements IImAgentAdminService { +public class ImAgentAdminServiceImpl implements ImAgentAdminService { private final ImAgentAdminMapper baseMapper; + private final ImChatPackageAdminMapper chatPackageAdminMapper; + + private final ImUserAdminMapper imUserAdminMapper; + /** * 查询代理关联 * @@ -218,5 +225,62 @@ public class ImAgentAdminServiceImpl implements IImAgentAdminService { return agent.getPackageExpireTime(); } + @Override + public Map getPackageInfo() { + Long userId = LoginHelper.getUserId(); + Map data = new HashMap<>(); + + if(LoginHelper.isSuperAdmin()) { + data.put("packageName","管理员"); + data.put("enableCustomerNumber","--"); + data.put("expireTime","永久有效"); + return data; + } + + QueryWrapper lqw = new QueryWrapper<>(); + lqw.eq("sys_id", userId); + ImAgentAdmin agent = baseMapper.selectOne(lqw); + + if(agent == null){ + data.put("packageName","异常代理数据"); + data.put("enableCustomerNumber","异常代理数据"); + data.put("expireTime","异常代理数据"); + return data; + } + + if(agent.getPackageId() == null){ + data.put("packageName","未购买套餐"); + data.put("enableCustomerNumber","0"); + data.put("expireTime","未购买套餐"); + return data; + } + + ImChatPackageAdmin packageAdmin = chatPackageAdminMapper.selectById(agent.getPackageId()); + + if(packageAdmin == null){ + data.put("packageName","异常套餐数据"); + data.put("enableCustomerNumber","异常套餐数据"); + data.put("expireTime","异常套餐数据"); + return data; + } + + data.put("packageName",packageAdmin.getPackageName()); + data.put("expireTime",DateUtil.format(agent.getPackageExpireTime(), "yyyy-MM-dd")); + + //获取当前代理下所有客户数量 计算还可以添加的客服数量 + String token = agent.getUniqueToken(); + QueryWrapper lqwUser = new QueryWrapper<>(); + lqwUser.eq("unique_token", token); + lqwUser.eq("is_customer", 2); + int countCustomers = 0; + Long count = imUserAdminMapper.selectCount(lqwUser); + if(count != null){ + countCustomers = count.intValue(); + } + long result = packageAdmin.getCustomerServiceNumber() - countCustomers > 0 ? packageAdmin.getCustomerServiceNumber() - countCustomers : 0; + data.put("enableCustomerNumber",String.valueOf(result)); + return data; + } + } diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImChatPackageAdminServiceImpl.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImChatPackageAdminServiceImpl.java new file mode 100644 index 0000000..b18fa14 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImChatPackageAdminServiceImpl.java @@ -0,0 +1,202 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.ImAgentAdmin; +import org.dromara.system.domain.ImChatPackageAdmin; +import org.dromara.system.domain.bo.ImChatPackageAdminBo; +import org.dromara.system.domain.vo.ImChatPackageAdminVo; +import org.dromara.system.mapper.ImAgentAdminMapper; +import org.dromara.system.mapper.ImChatPackageAdminMapper; +import org.dromara.system.service.IImChatPackageAdminService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static org.dromara.system.controller.constant.ImConstant.DS_IM_PLATFORM; + +/** + * 套餐Service业务层处理 + * + * @author Blue + * @date 2026-04-09 + */ +@DS(DS_IM_PLATFORM) +@RequiredArgsConstructor +@Service +public class ImChatPackageAdminServiceImpl implements IImChatPackageAdminService { + + private final ImChatPackageAdminMapper baseMapper; + + private final ImAgentAdminMapper imAgentAdminMapper; + + /** + * 查询套餐 + * + * @param id 主键 + * @return 套餐 + */ + @Override + public ImChatPackageAdminVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询套餐列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 套餐分页列表 + */ + @Override + public TableDataInfo queryPageList(ImChatPackageAdminBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的套餐列表 + * + * @param bo 查询条件 + * @return 套餐列表 + */ + @Override + public List queryList(ImChatPackageAdminBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ImChatPackageAdminBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPackageName()), ImChatPackageAdmin::getPackageName, bo.getPackageName()); + lqw.eq(StringUtils.isNotBlank(bo.getPackageContent()), ImChatPackageAdmin::getPackageContent, bo.getPackageContent()); + lqw.eq(bo.getStatus() != null, ImChatPackageAdmin::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增套餐 + * + * @param bo 套餐 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(ImChatPackageAdminBo bo) { + ImChatPackageAdmin add = MapstructUtils.convert(bo, ImChatPackageAdmin.class); + validEntityBeforeSave(add); + + if (add != null) { + add.setCreatedTime(DateUtil.parse(DateUtil.now())); + add.setUpdatedTime(DateUtil.parse(DateUtil.now())); + add.setCreatorId(LoginHelper.getUserId()); + add.setUpdaterId(LoginHelper.getUserId()); + } + + return baseMapper.insert(add) > 0; + } + + /** + * 修改套餐 + * + * @param bo 套餐 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ImChatPackageAdminBo bo) { + ImChatPackageAdmin update = MapstructUtils.convert(bo, ImChatPackageAdmin.class); + validEntityBeforeSave(update); + if (update != null) { + update.setUpdatedTime(DateUtil.parse(DateUtil.now())); + update.setUpdaterId(LoginHelper.getUserId()); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ImChatPackageAdmin entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除套餐信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 分配套餐给代理 + * + * @param agentId 代理ID + * @param packageId 套餐ID + * @return 是否分配成功 + */ + @Override + public Boolean allocatePackages(Long agentId, Long packageId) { + // 根据agentId查找ImAgent实体类 + ImAgentAdmin agent = imAgentAdminMapper.selectById(agentId); + if (agent == null) { + throw new RuntimeException("代理不存在"); + } + + // 获取packageExpireTime,如果为null或空则赋值为当前时间 + Date packageExpireTime = agent.getPackageExpireTime(); + if (packageExpireTime == null) { + packageExpireTime = DateUtil.date(); + } + + // 根据packageId查找ImChatPackageAdmin实体类 + ImChatPackageAdmin chatPackage = baseMapper.selectById(packageId); + if (chatPackage == null) { + throw new RuntimeException("套餐不存在"); + } + + // 获取durationDays + Long durationDays = chatPackage.getDurationDays(); + if (durationDays == null) { + throw new RuntimeException("套餐天数不能为空"); + } + + //如果代理套餐已过期,先赋值为今天 + if(DateUtil.compare(packageExpireTime, DateUtil.date()) < 0){ + packageExpireTime = DateUtil.date(); + } + + // 将durationDays加到packageExpireTime上 + packageExpireTime = DateUtil.offsetDay(packageExpireTime, durationDays.intValue() + 1); + + // 格式化为该日期加上一天后的零点零分零秒 + packageExpireTime = DateUtil.beginOfDay(packageExpireTime); + + // 更新ImAgent的packageExpireTime + agent.setPackageExpireTime(packageExpireTime); + agent.setPackageId(packageId); + agent.setMaxCustomer(chatPackage.getCustomerServiceNumber()); + + return imAgentAdminMapper.updateById(agent) > 0; + } +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImUserAdminServiceImpl.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImUserAdminServiceImpl.java new file mode 100644 index 0000000..083e681 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImUserAdminServiceImpl.java @@ -0,0 +1,28 @@ +package org.dromara.system.service.impl; + + +import com.baomidou.dynamic.datasource.annotation.DS; + +import lombok.RequiredArgsConstructor; + +import org.dromara.system.controller.constant.ImConstant; +import org.dromara.system.mapper.ImUserAdminMapper; +import org.dromara.system.service.IImUserAdminService; +import org.springframework.stereotype.Service; + + + +/** + * 用户Service业务层处理 + * + * @author Blue + * @date 2024-12-22 + */ +@DS(ImConstant.DS_IM_PLATFORM) +@RequiredArgsConstructor +@Service +public class ImUserAdminServiceImpl implements IImUserAdminService { + + private final ImUserAdminMapper baseMapper; + +} diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index e29f7c4..10249ff 100644 --- a/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -33,7 +33,7 @@ import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.*; -import org.dromara.system.service.IImAgentAdminService; +import org.dromara.system.service.ImAgentAdminService; import org.dromara.system.service.ISysUserService; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -59,7 +59,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { private final SysUserRoleMapper userRoleMapper; private final SysUserPostMapper userPostMapper; - private final IImAgentAdminService IImAgentAdminService; + private final ImAgentAdminService imAgentAdminService; @Override public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { @@ -69,7 +69,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService { List data = result.getRows(); if(ObjectUtil.isNotEmpty(data)) { for (SysUserVo sysUserVo : data) { - sysUserVo.setPackageExpireTime(IImAgentAdminService.getPackageExpireTime(sysUserVo.getUserId())); + sysUserVo.setPackageExpireTime(imAgentAdminService.getPackageExpireTime(sysUserVo.getUserId())); } } return result; diff --git a/im-admin/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ImChatPackageAdminMapper.xml b/im-admin/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ImChatPackageAdminMapper.xml new file mode 100644 index 0000000..a53cad0 --- /dev/null +++ b/im-admin/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ImChatPackageAdminMapper.xml @@ -0,0 +1,7 @@ + + + + +