diff --git a/doc/1.1.0.sql b/doc/1.1.0.sql deleted file mode 100644 index a94a39a0..00000000 --- a/doc/1.1.0.sql +++ /dev/null @@ -1,9 +0,0 @@ -ALTER TABLE `cai_anchor` -ADD COLUMN `show_me_rate` int NOT NULL DEFAULT 10 COMMENT '展示自己概率' AFTER `recommend_status`; - -ALTER TABLE `cai_account` -ADD COLUMN `message_income_coin` bigint NOT NULL DEFAULT 0 COMMENT '聊天收入' AFTER `total_buy_coin`, -ADD COLUMN `video_income_coin` bigint NOT NULL DEFAULT 0 COMMENT '视频收入' AFTER `message_income_coin`, -ADD COLUMN `gift_income_coin` bigint NOT NULL DEFAULT 0 COMMENT '礼物收入' AFTER `video_income_coin`, -ADD COLUMN `guard_income_coin` bigint NOT NULL DEFAULT 0 COMMENT '守护收入' AFTER `gift_income_coin`, -ADD COLUMN `union_income_coin` bigint NOT NULL DEFAULT 0 COMMENT '工会收入' AFTER `guard_income_coin`; diff --git a/doc/1.2.0.sql b/doc/1.2.0.sql deleted file mode 100644 index 9fcb5849..00000000 --- a/doc/1.2.0.sql +++ /dev/null @@ -1,42 +0,0 @@ -CREATE TABLE `cai_account_black` -( - `id` bigint unsigned NOT NULL, - `card_account` varchar(50) NOT NULL COMMENT '账户号', - `card_name` varchar(50) NOT NULL COMMENT '账户名称', - `enable_status` tinyint NOT NULL DEFAULT '1' COMMENT '是否开启', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_account` (`card_account`, `card_name`) USING BTREE -) ENGINE = InnoDB - DEFAULT CHARSET = utf8mb4 - COLLATE = utf8mb4_general_ci - ROW_FORMAT = DYNAMIC COMMENT ='账户黑名单'; - -ALTER TABLE `cai_anchor` -ADD COLUMN `enable_greet` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否允许群发' AFTER `recommend_status`; - -ALTER TABLE `cai_anchor` -ADD COLUMN `top_show_rank` datetime NOT NULL DEFAULT now() COMMENT '置顶时间' AFTER `show_me_rate`; - -ALTER TABLE `cai_anchor` -ADD INDEX `idx_top_date`(`top_show_rank`) USING BTREE; - --- 菜单 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1819683762522001409, '账户黑名单', '1737668638361206786', '1', 'accountBlack', 'cai/accountBlack/index', 1, 0, 'C', '0', '0', 'cai:accountBlack:list', '#', 'admin', sysdate(), '', null, '账户黑名单菜单'); - --- 按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1819683762522001410, '账户黑名单查询', 1819683762522001409, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:accountBlack:query', '#', 'admin', sysdate(), '', null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1819683762522001411, '账户黑名单新增', 1819683762522001409, '2', '#', '', 1, 0, 'F', '0', '0', 'cai:accountBlack:add', '#', 'admin', sysdate(), '', null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1819683762522001412, '账户黑名单修改', 1819683762522001409, '3', '#', '', 1, 0, 'F', '0', '0', 'cai:accountBlack:edit', '#', 'admin', sysdate(), '', null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1819683762522001413, '账户黑名单删除', 1819683762522001409, '4', '#', '', 1, 0, 'F', '0', '0', 'cai:accountBlack:remove', '#', 'admin', sysdate(), '', null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1819683762522001414, '账户黑名单导出', 1819683762522001409, '5', '#', '', 1, 0, 'F', '0', '0', 'cai:accountBlack:export', '#', 'admin', sysdate(), '', null, ''); diff --git a/doc/2024-02-13.sql b/doc/2024-02-13.sql deleted file mode 100644 index 4f63ed5b..00000000 --- a/doc/2024-02-13.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `cai_anchor` ADD COLUMN `hidden_status` tinyint NOT NULL DEFAULT 0 COMMENT '是否隐藏状态'; -ALTER TABLE `cai_pay_trd_config` ADD COLUMN `for_num` tinyint NOT NULL DEFAULT 1 COMMENT '轮训次数'; diff --git a/doc/2025-01-14.sql b/doc/2025-01-14.sql deleted file mode 100644 index 3e477cbc..00000000 --- a/doc/2025-01-14.sql +++ /dev/null @@ -1,13 +0,0 @@ -ALTER TABLE `cai_pay_trd_config` -ADD COLUMN `min_amount` decimal(20, 2) NOT NULL DEFAULT 0 AFTER `create_time`, -ADD COLUMN `max_amount` decimal(20, 2) NOT NULL DEFAULT 0 AFTER `min_amount` -ADD COLUMN `sort_by` int(10) NOT NULL DEFAULT 0 AFTER `min_amount`; - - --- 菜单 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1879078121599889409, '订单日志', '1738084052270563330', '1', 'orderLogs', 'cai/orderLogs/index', 1, 0, 'C', '0', '0', 'cai:orderLogs:list', '#', 'admin', sysdate(), '', null, '订单日志菜单'); - --- 按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1879078121599889410, '订单日志查询', 1879078121599889409, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:orderLogs:query', '#', 'admin', sysdate(), '', null, ''); diff --git a/doc/2025-01-18.sql b/doc/2025-01-18.sql deleted file mode 100644 index 460d36a6..00000000 --- a/doc/2025-01-18.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE `cai_pay_trd_config` -ADD COLUMN `wx_product_id` varchar(100) NULL COMMENT '微信产品号' AFTER `sign`, -ADD COLUMN `enable_wx_status` tinyint(1) NOT NULL DEFAULT 0 AFTER `enable_status`; diff --git a/doc/2025-02-12.sql b/doc/2025-02-12.sql deleted file mode 100644 index 76d361b9..00000000 --- a/doc/2025-02-12.sql +++ /dev/null @@ -1,18 +0,0 @@ -drop table cai_batch_add_user; -CREATE TABLE `cai_batch_add_user` -( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `add_num` int NOT NULL COMMENT '新增用户数', - `gender` tinyint default 1 NOT NULL COMMENT '1-女 2-男', - `invite_user_code` bigint comment '邀请人code', - `phone_prefix` varchar(100) comment '手机前缀(前7位)', - `phone_suffix_start` int(7) comment '手机后缀起点(后4位)', - `password_prefix` varchar(100) comment '密码前缀', - `password_suffix_start` varchar(100) comment '密码后缀起点', - `run_status` tinyint NOT NULL DEFAULT 0 comment '0-未执行 1-执行中 2-执行失败 3-执行成功' COMMENT '执行状态', - `run_fail` text comment '执行失败原因', - `run_result` JSON comment '执行结果', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `run_time` datetime COMMENT '执行时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='批量新增用户脚本'; diff --git a/doc/2025-05-17.sql b/doc/2025-05-17.sql deleted file mode 100644 index e82dd9eb..00000000 --- a/doc/2025-05-17.sql +++ /dev/null @@ -1,3 +0,0 @@ -ALTER TABLE `cai_user_count` -ADD COLUMN `new_fans_count` int NOT NULL DEFAULT 0 COMMENT '新增粉丝数' AFTER `give_gift_count`, -ADD COLUMN `new_visitor_count` int NOT NULL DEFAULT 0 COMMENT '新增访客数' AFTER `give_gift_count`; diff --git a/doc/2025-08-12.sql b/doc/2025-08-12.sql deleted file mode 100644 index 96e2bdbe..00000000 --- a/doc/2025-08-12.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `cai_batch_add_user` -ADD COLUMN `password_type` int NOT NULL DEFAULT 1 COMMENT '1=规则生成 2-随机密码'; diff --git a/doc/20250819.sql b/doc/20250819.sql new file mode 100644 index 00000000..620aaaa3 --- /dev/null +++ b/doc/20250819.sql @@ -0,0 +1,38 @@ +ALTER TABLE `cai_user_count` + ADD COLUMN `im_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '发言次数', + ADD COLUMN `im_refresh_time` datetime COMMENT '刷新时间'; + +CREATE TABLE `cai_anchor_im_count_day` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `user_id` int NOT NULL COMMENT '用户ID', + `count_date` date NOT NULL COMMENT '时间', + `im_count` bigint(20) NOT NULL COMMENT '数量', + `refresh_time` datetime not null default now() comment '刷新时间', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_user_id`(`user_id`,`im_count`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci + ROW_FORMAT = DYNAMIC COMMENT ='主播每日发言统计'; + + +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values(1957731146459230209, '每日发言统计', '1738072642014617602', '1', 'anchorImCountDay', 'cai/anchorImCountDay/index', 1, 0, 'C', '0', '0', 'cai:anchorImCountDay:list', '#', 'admin', sysdate(), '', null, '每日发言统计菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values(1957731146459230210, '每日发言统计查询', 1957731146459230209, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorImCountDay:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values(1957731146459230211, '每日发言统计新增', 1957731146459230209, '2', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorImCountDay:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values(1957731146459230212, '每日发言统计修改', 1957731146459230209, '3', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorImCountDay:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values(1957731146459230213, '每日发言统计删除', 1957731146459230209, '4', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorImCountDay:remove', '#', 'admin', sysdate(), '', null, ''); + diff --git a/doc/haha.sql b/doc/haha.sql deleted file mode 100644 index f93da9ba..00000000 --- a/doc/haha.sql +++ /dev/null @@ -1,9 +0,0 @@ -ALTER TABLE `cai_account_cash` - ADD COLUMN `coin_callback_coin` int(11) NOT NULL DEFAULT 0 COMMENT '提现紫贝返还值' AFTER `withdraw_coin`; -update cai_account_cash -set coin_callback_coin = withdraw_coin; - -ALTER TABLE `cai_withdraw_exchange` - ADD COLUMN `coin_callback_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '失败返还货币' AFTER `coin_num`; -update cai_withdraw_exchange -set coin_callback_num = coin_num; diff --git a/doc/v3.sql b/doc/v3.sql deleted file mode 100644 index bda0e0ee..00000000 --- a/doc/v3.sql +++ /dev/null @@ -1,27 +0,0 @@ -CREATE TABLE `cai_anchor_banner` -( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `user_id` bigint NOT NULL COMMENT '用户ID', - `anchor_id` bigint NOT NULL COMMENT '主播ID', - `open_status` tinyint not null default 1 comment '开启状态', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB COMMENT '主播首页推荐'; - --- 菜单 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1809856380386619394, '主播首页推荐', '1738072642014617602', '1', 'anchorBanner', 'cai/anchorBanner/index', 1, 0, 'C', '0', '0', 'cai:anchorBanner:list', '#', 'admin', sysdate(), '', null, '主播首页推荐菜单'); - --- 按钮 SQL -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1809856380386619395, '主播首页推荐查询', 1809856380386619394, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorBanner:query', '#', 'admin', sysdate(), '', null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1809856380386619396, '主播首页推荐新增', 1809856380386619394, '2', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorBanner:add', '#', 'admin', sysdate(), '', null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1809856380386619397, '主播首页推荐修改', 1809856380386619394, '3', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorBanner:edit', '#', 'admin', sysdate(), '', null, ''); - -insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) -values(1809856380386619398, '主播首页推荐删除', 1809856380386619394, '4', '#', '', 1, 0, 'F', '0', '0', 'cai:anchorBanner:remove', '#', 'admin', sysdate(), '', null, ''); - diff --git a/doc/v4.sql b/doc/v4.sql deleted file mode 100644 index 682dc9ec..00000000 --- a/doc/v4.sql +++ /dev/null @@ -1,22 +0,0 @@ -ALTER TABLE `cai_account` - ADD COLUMN `total_trd_money` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '三方充值总额' AFTER `total_buy_coin`; - - - -CREATE TABLE `cai_pay_trd_config` -( - `id` bigint NOT NULL AUTO_INCREMENT, - `type` varchar(100) NOT NULL COMMENT '第三方支付类型', - `name` varchar(100) NOT NULL COMMENT '第三方支付名称', - `gateway_url` varchar(100) DEFAULT NULL COMMENT '请求域名', - `notify_url` varchar(100) NOT NULL COMMENT '回调域名', - `mch_id` varchar(100) NOT NULL COMMENT '商户ID', - `sign` varchar(200) NOT NULL COMMENT '秘钥', - `ali_product_id` varchar(100) NOT NULL COMMENT '支付宝产品号', - `ali_pay_type` varchar(10) NOT NULL DEFAULT 'H5' COMMENT '支付宝支付方式', - `enable_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启', - `delete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB - AUTO_INCREMENT = 3; diff --git a/doc/v5.sql b/doc/v5.sql deleted file mode 100644 index c05b95db..00000000 --- a/doc/v5.sql +++ /dev/null @@ -1,26 +0,0 @@ -ALTER TABLE `cai_recharge_order` - ADD COLUMN `device_type` varchar(255) NULL COMMENT '设备' AFTER `appid`; - - -DROP TABLE cai_order_logs; -CREATE TABLE `cai_order_logs` -( - `id` bigint NOT NULL AUTO_INCREMENT, - `order_no` varchar(100) NOT NULL COMMENT '订单号', - `step_name` varchar(100) NOT NULL COMMENT '操作名称', - `flag_name` varchar(100) NULL COMMENT '标识1', - `in_params` JSON COMMENT '入参', - `out_params` JSON COMMENT '出参', - `remark` varchar(2100) NULL COMMENT '备注', - `success` varchar(100) NULL COMMENT '成功', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `idx_order` (`order_no`) USING BTREE -) ENGINE = InnoDB - AUTO_INCREMENT = 1; - - - -ALTER TABLE `cai_pay_trd_config` - ADD COLUMN `enable_ios` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否开启IOS' AFTER `mch_id`; - diff --git a/ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java b/ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java index 8669cc3d..47507506 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/job/EveryDaysJob.java @@ -1,26 +1,33 @@ package com.ruoyi.job; +import com.ruoyi.cai.service.AnchorImCountDayService; import com.ruoyi.job.op.BusOp; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.time.LocalDate; + @Component @Slf4j public class EveryDaysJob { @Autowired private BusOp busOp; + @Autowired + private AnchorImCountDayService anchorImCountDayService; // 凌晨0点3分执行一次 @Scheduled(cron = "0 3 0 * * ? ") public void run() { try { - log.info("执行用户VIP状态码回转-开始"); + log.info("执行IM统计入库-开始"); // busOp.refreshUserVipStatus(); + anchorImCountDayService.refreshCount(LocalDate.now().plusDays(-1)); + anchorImCountDayService.totalUserCount(); }catch (Exception e){ - log.error("执行用户VIP状态码回转-失败!",e); + log.error("执行IM统计入库-失败!",e); }finally { - log.info("执行用户VIP状态码回转-结束"); + log.info("执行IM统计入库-结束"); } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/AnchorImCountDayController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/AnchorImCountDayController.java new file mode 100644 index 00000000..9d6887f0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/AnchorImCountDayController.java @@ -0,0 +1,75 @@ +package com.ruoyi.web.controller.cai.admin; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cai.domain.AnchorImCountDay; +import com.ruoyi.cai.dto.admin.vo.AnchorImCountDayAdminVO; +import com.ruoyi.cai.dto.admin.vo.UserCountAdminVo; +import com.ruoyi.cai.mapper.UserCountMapper; +import com.ruoyi.cai.service.AnchorImCountDayService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 每日发言统计 + * + * @author 777 + * @date 2025-08-19 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cai/anchorImCountDay") +public class AnchorImCountDayController extends BaseController { + + private final AnchorImCountDayService anchorImCountDayService; + private final UserCountMapper userCountMapper; + + /** + * 查询每日发言统计列表 + */ + @SaCheckPermission("cai:anchorImCountDay:list") + @GetMapping("/list") + public TableDataInfo list(AnchorImCountDayAdminVO bo, PageQuery pageQuery) { + IPage page = anchorImCountDayService.pageAdmin(bo, pageQuery); + return TableDataInfo.build(page); + } + + @SaCheckPermission("cai:anchorImCountDay:list") + @GetMapping("/imCountAll/list") + public TableDataInfo imCountAllList(UserCountAdminVo bo, PageQuery pageQuery) { + Page page = userCountMapper.pageAdmin(pageQuery.build(), bo); + return TableDataInfo.build(page); + } + + + /** + * 刷新今日统计 + */ + @Log(title = "刷新每日发言统计", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/refreshCount") + public R refreshCount(@RequestBody AnchorImCountDay bo) { + anchorImCountDayService.refreshCount(bo.getCountDate()); + return R.ok(); + } + + + @Log(title = "刷新用户所有发言统计", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/totalUserCount") + public R totalUserCount() { + anchorImCountDayService.totalUserCount(); + return R.ok(); + } + +} diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index af1a2051..75c0825c 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -20,7 +20,7 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://124.222.254.188:5306/cai-v5?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true + url: jdbc:mysql://124.222.254.188:5306/cai-v6?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true username: root password: 383200134 # 从库数据源 diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AnchorImCountDay.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AnchorImCountDay.java new file mode 100644 index 00000000..0e6b9791 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/AnchorImCountDay.java @@ -0,0 +1,52 @@ +package com.ruoyi.cai.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.constant.DateConstant; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 每日发言统计对象 cai_anchor_im_count_day + * + * @author 777 + * @date 2025-08-19 + */ +@Data +@TableName("cai_anchor_im_count_day") +public class AnchorImCountDay implements Serializable { + + private static final long serialVersionUID=1L; + + /** + * + */ + @TableId(value = "id") + private String id; + /** + * 用户ID + */ + private Long userId; + /** + * 时间 + */ + @DateTimeFormat(pattern = DateConstant.PATTERN_DATE) + @JsonFormat(pattern = DateConstant.PATTERN_DATE) + private LocalDate countDate; + /** + * 数量 + */ + private Long imCount; + /** + * 刷新时间 + */ + private LocalDateTime refreshTime; + + private LocalDateTime createTime; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserCount.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserCount.java index bae59021..c411762e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserCount.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/UserCount.java @@ -25,6 +25,9 @@ public class UserCount implements Serializable { */ @TableId(value = "user_id",type = IdType.INPUT) private Long userId; + + private Long imCount; + private LocalDateTime imRefreshTime; /** * 新增粉丝数 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/AnchorImCountDayAdminVO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/AnchorImCountDayAdminVO.java new file mode 100644 index 00000000..2c7c2ba7 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/AnchorImCountDayAdminVO.java @@ -0,0 +1,39 @@ +package com.ruoyi.cai.dto.admin.vo; + +import com.ruoyi.cai.domain.AnchorImCountDay; +import com.ruoyi.common.annotation.Sensitive; +import com.ruoyi.common.enums.SensitiveStrategy; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AnchorImCountDayAdminVO extends AnchorImCountDay { + /** + * 用户号/ID号 + */ + private String usercode; + /** + * 昵称 + */ + private String nickname; + + /** + * 手机号 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String mobile; + + /** + * 头像 + */ + private String avatar; + /** + * 性别 + */ + private Integer gender; + private Integer age; + private Boolean imSpeck; + private Boolean enableIm; + private Integer status; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/UserCountAdminVo.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/UserCountAdminVo.java index defaa981..3af6a861 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/UserCountAdminVo.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/UserCountAdminVo.java @@ -33,4 +33,6 @@ public class UserCountAdminVo extends UserCount { private Integer age; private Integer isAnchor; private Integer status; + private Boolean imSpeck; + private Boolean enableIm; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java index 31a1503c..5966e5d4 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java @@ -122,7 +122,8 @@ public enum SystemConfigEnum { IPV6_FILTER("0", "是否开启IPV6请求拦截",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck()), IPV6_FILTER_PATH("/api/auth/login", "IPV6拦截路由配置(逗号分隔)",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck(),"textarea"), VIP_PRIVATE_PLUS("0", "开启VIP隐私模式增强模式",SystemConfigGroupEnum.SYSTEM,new BooleanSystemConfigCheck()), - OPEN_USER_CHAT_COUNT("0", "开启用户主动消息统计",SystemConfigGroupEnum.SYSTEM,new BooleanSystemConfigCheck()), + OPEN_ANCHOR_CHAT_COUNT("0", "开启主播主动消息统计",SystemConfigGroupEnum.SYSTEM,new BooleanSystemConfigCheck()), + // 4-recordId拦截 5-recordId加强拦截 6-性别拦截 7-vip加强拦截 IM_FILTER_PLUS("0", "IM拦截配置(勿动,开发配置)",SystemConfigGroupEnum.SYSTEM), COS_DOMAIN("http://ap-shanghai.myqcloud.com/", "文件系统域名前缀",SystemConfigGroupEnum.SYSTEM), PAY_LIMIT("200000", "原生支付的阈值(元)",SystemConfigGroupEnum.SYSTEM, new NumberSystemConfigCheck()), diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java index 410090bf..12bfbe5f 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ImService.java @@ -60,6 +60,8 @@ public class ImService { private UserChatFilterService userChatFilterService; @Autowired private SystemConfigManager systemConfigManager; + @Autowired + private AnchorImCountDayService anchorImCountDayService; public ImResp sendMessage(Long fromUserId, ImMessageDTO message) { ChatTypeEnum typeEnum = ChatTypeEnum.getByType(message.getType()); @@ -172,6 +174,10 @@ public class ImService { if(filter == 1){ userChatFilterService.saveFilter(fromUser, toUser, message.getContent(),content); } + boolean bool = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.OPEN_ANCHOR_CHAT_COUNT); + if(bool){ + anchorImCountDayService.incCount(fromUserId); + } resp.setRecordId(record.getId()); resp.setFilter(filter); resp.setContent(content); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/AnchorImCountDayMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/AnchorImCountDayMapper.java new file mode 100644 index 00000000..7e74b1d9 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/AnchorImCountDayMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.cai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cai.domain.AnchorImCountDay; +import com.ruoyi.cai.dto.admin.vo.AnchorImCountDayAdminVO; +import org.apache.ibatis.annotations.Param; + +/** + * 每日发言统计Mapper接口 + * + * @author 777 + * @date 2025-08-19 + */ +public interface AnchorImCountDayMapper extends BaseMapper { + + IPage pageAdmin(@Param("build") Page build, @Param("bo") AnchorImCountDayAdminVO bo); + + IPage totalUserId(IPage page); +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserCountMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserCountMapper.java index f1d494bb..88c04a9e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserCountMapper.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserCountMapper.java @@ -27,4 +27,5 @@ public interface UserCountMapper extends BaseMapper { void resetNewVisitorIncs(Long userId); Page pageAdmin(@Param("build") Page build, @Param("bo") UserCountAdminVo bo); + Page pageImCount(@Param("build") Page build, @Param("bo") UserCountAdminVo bo); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AnchorImCountDayService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AnchorImCountDayService.java new file mode 100644 index 00000000..05fac6e1 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/AnchorImCountDayService.java @@ -0,0 +1,26 @@ +package com.ruoyi.cai.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cai.domain.AnchorImCountDay; +import com.ruoyi.cai.dto.admin.vo.AnchorImCountDayAdminVO; +import com.ruoyi.common.core.domain.PageQuery; + +import java.time.LocalDate; + +/** + * 每日发言统计Service接口 + * + * @author 777 + * @date 2025-08-19 + */ +public interface AnchorImCountDayService extends IService { + + void totalUserCount(); + + IPage pageAdmin(AnchorImCountDayAdminVO bo, PageQuery pageQuery); + + void incCount(Long userId); + + void refreshCount(LocalDate localDate); +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AnchorImCountDayServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AnchorImCountDayServiceImpl.java new file mode 100644 index 00000000..e59f55ba --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AnchorImCountDayServiceImpl.java @@ -0,0 +1,116 @@ +package com.ruoyi.cai.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.domain.AnchorImCountDay; +import com.ruoyi.cai.domain.UserCount; +import com.ruoyi.cai.dto.admin.vo.AnchorImCountDayAdminVO; +import com.ruoyi.cai.mapper.AnchorImCountDayMapper; +import com.ruoyi.cai.service.AnchorImCountDayService; +import com.ruoyi.cai.service.UserCountService; +import com.ruoyi.common.core.domain.PageQuery; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RMap; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 每日发言统计Service业务层处理 + * + * @author 777 + * @date 2025-08-19 + */ +@Service +@Slf4j +public class AnchorImCountDayServiceImpl extends ServiceImpl implements AnchorImCountDayService { + @Autowired + private RedissonClient redissonClient; + @Autowired + private UserCountService userCountService; + + @Override + public void totalUserCount() { + IPage page = new Page<>(); + page.setSize(1000); + int i = 0; + while (true){ + i++; + if(i > 10000){ + break; + } + page.setCurrent(i); + IPage totalUserId = baseMapper.totalUserId(page); + List records = totalUserId.getRecords(); + for (AnchorImCountDay record : records) { + userCountService.update(Wrappers.lambdaUpdate() + .eq(UserCount::getUserId, record.getUserId()) + .set(UserCount::getImCount, record.getImCount()) + .set(UserCount::getImRefreshTime, LocalDateTime.now())); + } + if(CollectionUtil.isEmpty(records)){ + break; + } + } + } + + + @Override + public IPage pageAdmin(AnchorImCountDayAdminVO bo, PageQuery pageQuery) { + return baseMapper.pageAdmin(pageQuery.build(),bo); + } + + @Override + public void incCount(Long userId){ + try { + String redisKey = getRedisKey(LocalDate.now()); + RMap map = redissonClient.getMap(redisKey); + Long newScore = map.addAndGet(userId, 1); + if(newScore == 1){ + map.expire(5, TimeUnit.DAYS); + } + }catch (Exception e){ + log.error("主播自增im发言失败",e); + } + } + + @Override + public void refreshCount(LocalDate localDate){ + String redisKey = getRedisKey(localDate); + RMap map = redissonClient.getMap(redisKey); + Map longMap = map.readAllMap(); + for (Map.Entry entry : longMap.entrySet()) { + Long userId = entry.getKey(); + Long imCount = entry.getValue(); + AnchorImCountDay one = this.getOne(Wrappers.lambdaQuery(AnchorImCountDay.class) + .eq(AnchorImCountDay::getCountDate, localDate) + .eq(AnchorImCountDay::getUserId, userId)); + if(one != null){ + this.update(Wrappers.lambdaUpdate(AnchorImCountDay.class) + .eq(AnchorImCountDay::getId, one.getId()) + .set(AnchorImCountDay::getImCount, imCount)); + }else{ + one = new AnchorImCountDay(); + one.setImCount(imCount); + one.setUserId(userId); + one.setRefreshTime(LocalDateTime.now()); + this.save(one); + } + } + } + + private String getRedisKey(LocalDate localDate){ + String now = localDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + return String.format("cai:anchorImCountDay:%s",now); + } +} diff --git a/ruoyi-cai/src/main/resources/mapper/cai/AnchorImCountDayMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/AnchorImCountDayMapper.xml new file mode 100644 index 00000000..73a6e685 --- /dev/null +++ b/ruoyi-cai/src/main/resources/mapper/cai/AnchorImCountDayMapper.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/ruoyi-cai/src/main/resources/mapper/cai/UserCountMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/UserCountMapper.xml index 7f6d747c..7c69439e 100644 --- a/ruoyi-cai/src/main/resources/mapper/cai/UserCountMapper.xml +++ b/ruoyi-cai/src/main/resources/mapper/cai/UserCountMapper.xml @@ -50,7 +50,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where user_id = #{userId} +