Browse Source

首页套餐显示

master
La123123 1 month ago
parent
commit
53e9c3e6a8
  1. 23
      im-admin-ui/src/views/index.vue
  2. 2
      im-admin/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
  3. 16
      im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImUserController.java
  4. 3
      im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImUserServiceImpl.java
  5. 6
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  6. 81
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImChatPackageAdmin.java
  7. 117
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/ImUserAdmin.java
  8. 72
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImChatPackageAdminBo.java
  9. 105
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/ImUserAdminBo.java
  10. 80
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImChatPackageAdminVo.java
  11. 120
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ImUserAdminVo.java
  12. 15
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImChatPackageAdminMapper.java
  13. 47
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/ImUserAdminMapper.java
  14. 78
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImChatPackageAdminService.java
  15. 19
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImUserAdminService.java
  16. 5
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ImAgentAdminService.java
  17. 76
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImAgentAdminServiceImpl.java
  18. 202
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImChatPackageAdminServiceImpl.java
  19. 28
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImUserAdminServiceImpl.java
  20. 6
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  21. 7
      im-admin/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ImChatPackageAdminMapper.xml

23
im-admin-ui/src/views/index.vue

@ -71,8 +71,9 @@
</el-icon>
</div>
<div class="statistics-content">
<div class="statistics-title">当前套餐:</div>
<div class="statistics-value2">可添加客服数量:{{ totalGroupCount }}</div>
<div class="statistics-title2">当前套餐:{{ packageInfo.packageName }}</div>
<div class="statistics-title2">可添加客服数量:{{ packageInfo.enableCustomerNumber }}</div>
<div class="statistics-value2">过期时间:{{ packageInfo.expireTime }}</div>
</div>
</div>
</el-card>
@ -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;

2
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;
/**

16
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<List<Map<String, Object>>> getDailyRegistrationCount(@RequestParam(value = "days", defaultValue = "7") Integer days) {
return R.ok(userService.getDailyRegistrationCount(days));
public R<JSONObject> 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);
}
/**

3
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);
}

6
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;
/**
* 获取用户列表

81
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;
}

117
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;
}

72
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;
}

105
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;
}

80
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;
}

120
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;
}

15
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<ImChatPackageAdmin, ImChatPackageAdminVo> {
}

47
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<ImUserAdmin, ImUserAdminVo> {
/**
* 按天统计用户注册数量
* @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<Map<String, Object>> 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<Map<String, Object>> getDailyRegistrationCountByToken(@Param("days") Integer days, @Param("unique_token") String unique_token);
}

78
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<ImChatPackageAdminVo> queryPageList(ImChatPackageAdminBo bo, PageQuery pageQuery);
/**
* 查询符合条件的套餐列表
*
* @param bo 查询条件
* @return 套餐列表
*/
List<ImChatPackageAdminVo> 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<Long> ids, Boolean isValid);
/**
* 分配套餐给代理
*
* @param agentId 代理ID
* @param packageId 套餐ID
* @return 是否分配成功
*/
Boolean allocatePackages(Long agentId, Long packageId);
}

19
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 {
}

5
im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImAgentAdminService.java → 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<String,String> getPackageInfo();
}

76
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<String, String> getPackageInfo() {
Long userId = LoginHelper.getUserId();
Map<String, String> data = new HashMap<>();
if(LoginHelper.isSuperAdmin()) {
data.put("packageName","管理员");
data.put("enableCustomerNumber","--");
data.put("expireTime","永久有效");
return data;
}
QueryWrapper<ImAgentAdmin> 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<ImUserAdmin> 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;
}
}

202
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<ImChatPackageAdminVo> queryPageList(ImChatPackageAdminBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ImChatPackageAdmin> lqw = buildQueryWrapper(bo);
Page<ImChatPackageAdminVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的套餐列表
*
* @param bo 查询条件
* @return 套餐列表
*/
@Override
public List<ImChatPackageAdminVo> queryList(ImChatPackageAdminBo bo) {
LambdaQueryWrapper<ImChatPackageAdmin> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ImChatPackageAdmin> buildQueryWrapper(ImChatPackageAdminBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ImChatPackageAdmin> 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<Long> 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;
}
}

28
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;
}

6
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<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
@ -69,7 +69,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
List<SysUserVo> 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;

7
im-admin/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/ImChatPackageAdminMapper.xml

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.ImChatPackageAdminMapper">
</mapper>
Loading…
Cancel
Save