Compare commits

27 Commits

Author SHA1 Message Date
777
513954ccf1 nnnn 2025-12-05 18:27:51 +08:00
777
84d42a3af2 nnnn 2025-12-05 16:14:35 +08:00
777
e55d5b7dc8 nnnn 2025-12-05 15:18:46 +08:00
777
34a8ea444c nnnn 2025-12-05 15:13:41 +08:00
777
c91ede94a1 nnnn 2025-12-03 16:52:17 +08:00
777
46a039a678 nnnn 2025-12-02 17:17:51 +08:00
777
cfd23f2ca3 nnnn 2025-11-29 22:03:35 +08:00
777
52ea057ea1 nnnn 2025-11-29 17:37:28 +08:00
777
7f9b7bc639 nnnn 2025-11-28 18:09:24 +08:00
777
ea9c4f2a61 nnnn 2025-11-25 10:29:36 +08:00
777
53e3adb498 nnnn 2025-11-18 12:53:40 +08:00
777
7a2965c2f8 nnnn 2025-11-15 19:42:33 +08:00
777
0c41fdf89d nnnn 2025-11-15 13:08:29 +08:00
777
db39c5249e nnnn 2025-10-21 18:03:22 +08:00
777
6087346eb6 nnnn 2025-10-21 17:38:14 +08:00
777
30f25788cc nnnn 2025-10-21 16:50:45 +08:00
777
e368d333ef nnnn 2025-10-20 14:20:46 +08:00
777
34b6ff3a6c 11 2025-10-16 17:16:17 +08:00
张良(004796)
4020297c59 123 2025-10-14 19:07:21 +08:00
777
db5293247e 11 2025-10-14 18:53:24 +08:00
777
63df93fc36 11 2025-10-14 16:44:30 +08:00
777
024cc12e56 11 2025-10-14 16:18:55 +08:00
777
e3fc58af9b V13 2025-09-26 15:48:31 +08:00
777
e2a03924a9 V13 2025-09-26 15:40:59 +08:00
777
0a3889a5cb V13 2025-09-25 16:02:07 +08:00
777
f527882011 V13 2025-09-25 14:13:07 +08:00
777
afd018f79f V13 2025-09-25 01:20:29 +08:00
154 changed files with 4738 additions and 146 deletions

11
doc/123.txt Normal file
View File

@@ -0,0 +1,11 @@
im权限
cai:user:im
ALTER TABLE cai_consume_log
ADD INDEX idx_consume_filter(type, status, one_user_id);
菜单
- 单账户管理 101 proxyUser
- 统计 0 proxyUserTotal cai/proxyUserTotal/index cai:proxyUser:proxyTotal
- 注册用户 1 bindUserList cai/proxtBindUserList/index cai:proxyUser:bindUserList
- 充值记录 2 orderLogList cai/proxyOrderLogList/index cai:proxyUser:orderLogList

21
doc/20250926.sql Normal file
View File

@@ -0,0 +1,21 @@
ALTER TABLE cai_anchor
ADD COLUMN `anchor_total_coin` bigint(20) default 0 COMMENT '主播总收入';
CREATE TABLE `cai_love_rank_today`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`data_type` tinyint NOT NULL default 2 COMMENT '日期类型 1-日榜 2-周榜 3-月榜',
`rank_time` date not null comment '榜单期数',
`begin_rank_time` date null comment '开始时间',
`end_rank_time` date null comment '结束时间',
`num` bigint(20) NOT NULL DEFAULT 0 COMMENT '数值',
`user_id` bigint(20) not null comment '用户ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_date` (`rank_time`, `num`) USING BTREE,
INDEX `idx_user_id` (`user_id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = DYNAMIC COMMENT ='魅力榜单实时数据';

60
doc/20251014.sql Normal file
View File

@@ -0,0 +1,60 @@
APP人数
+
24
1/
7 3/
15
CREATE TABLE `cai_ops_count`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`count_date` date not null comment '时间',
`user_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '总人数',
`women_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '男用户',
`man_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '女用户',
`register_user_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '注册人数',
`register_women_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '注册女用户',
`register_man_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '注册男用户',
`active_user_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '活跃人数',
`active_women_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '活跃女人数',
`active_man_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '活跃男人数',
`pay_price` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '充值金额(不含VIP)',
`pay_order_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '充值笔数(不含VIP)',
`pay_user_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '今日充值人数',
`first_pay_user_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '今日首充人数',
`more_user_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '复充人数',
`first_user_pay_num` bigint(20) NOT NULL DEFAULT 0 COMMENT '新用户首充人数',
`day2_retention_rate` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '次日留存率(男用户)',
`day3_retention_rate` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '3日留存率男用户',
`day4_retention_rate` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '4日留存率男用户',
`day5_retention_rate` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '5日留存率男用户',
`day6_retention_rate` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '6日留存率男用户',
`day7_retention_rate` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '7日留存率男用户',
`day15_retention_rate` decimal(20, 2) NOT NULL DEFAULT 0 COMMENT '15日留存率男用户',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_sys_tm` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_date` (`count_date`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = DYNAMIC COMMENT ='统计数据';
CREATE TABLE `cai_login_min_log`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`login_date` date comment '登录时间',
`user_id` bigint(20) DEFAULT 0 COMMENT '用户',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_date` (`user_id`, `login_date`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = DYNAMIC COMMENT ='用户登录记录';

4
doc/20251017.sql Normal file
View File

@@ -0,0 +1,4 @@
ALTER TABLE sys_notice
ADD COLUMN `business_type` varchar(20) COMMENT '业务类型',
ADD COLUMN `deal_by` varchar(100) COMMENT '处理人',
ADD COLUMN `deal_time` datetime COMMENT '处理时间';

2
doc/20251021.sql Normal file
View File

@@ -0,0 +1,2 @@
ALTER TABLE sys_user
ADD COLUMN `bind_user_code` varchar(20);

8
doc/20251112.sql Normal file
View File

@@ -0,0 +1,8 @@
ALTER TABLE cai_pay_trd_config
ADD COLUMN `extend_data` JSON;
-- 2025-11-25
ALTER TABLE cai_goods
ADD COLUMN `wx_amount` int default 0 not null comment '微信钻石';
update cai_goods
set wx_amount = amount;

87
doc/20251128.sql Normal file
View File

@@ -0,0 +1,87 @@
alter table cai_account
add column `points` bigint(20) default 0 not null comment '积分';
ALTER TABLE cai_goods
ADD COLUMN `give_point` bigint(20) default 0 not null comment '充值赠送积分';
ALTER TABLE cai_recharge_order
ADD COLUMN `distribution` tinyint default 0 not null comment '是否參與分銷';
CREATE TABLE `cai_account_delete` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '子账户ID',
`user_id` bigint unsigned NOT NULL COMMENT '用户ID',
`usercode` varchar(10) NOT NULL COMMENT '用户Code',
`mobile` varchar(50) COMMENT '手机',
`invite_id` bigint unsigned DEFAULT NULL COMMENT '邀请人',
`coin` bigint NOT NULL DEFAULT '0' COMMENT '当前彩币数量',
`income_coin` bigint NOT NULL DEFAULT '0' COMMENT '收益的彩币数量',
`total_buy_money` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '充值总额',
`total_buy_coin` bigint NOT NULL DEFAULT '0' COMMENT '充值彩贝总额',
`total_trd_money` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '三方充值总额',
`message_income_coin` bigint NOT NULL DEFAULT '0' COMMENT '聊天收入',
`video_income_coin` bigint NOT NULL DEFAULT '0' COMMENT '视频收入',
`gift_income_coin` bigint NOT NULL DEFAULT '0' COMMENT '礼物收入',
`guard_income_coin` bigint NOT NULL DEFAULT '0' COMMENT '守护收入',
`union_income_coin` bigint NOT NULL DEFAULT '0' COMMENT '工会收入',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '账户锁定 0 正常 1 锁定',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`anchor_total_coin` bigint DEFAULT '0' COMMENT '主播总收入',
`points` bigint NOT NULL DEFAULT '0' COMMENT '积分',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户账户备份';
ALTER TABLE cai_user_info
ADD COLUMN point_rate decimal(7, 2) default 0.00 not null comment '积分分销比例';
ALTER TABLE cai_recharge_order
ADD COLUMN `give_point` bigint(20) default 0 not null comment '充值赠送积分';
CREATE TABLE `cai_point_record_log`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`points` bigint(20) DEFAULT 0 COMMENT '积分',
`source_user_id` bigint(20) COMMENT '消费方用户',
`source_usercode` varchar(20) COMMENT '消费方用户',
`source_phone` varchar(50) COMMENT '消费方用户',
`one_user_id` bigint(20) COMMENT '分销方',
`one_usercode` varchar(20) COMMENT '分销方',
`one_phone` varchar(50) COMMENT '分销方',
`one_rate` decimal(8, 2) COMMENT '分销方提成比例',
`one_points` bigint(20) COMMENT '分销方积分',
`status` tinyint default 0 comment '状态 -1-无须分销 0-待分销 1-已分销',
`source_type` varchar(20) comment '来源',
`source_id` varchar(20) comment '来源ID',
`remark` varchar(255) comment '备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_date` (`source_user_id`) 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 (1996050872055914497, '用户积分分销', '1741377069687037954', '1', 'pointRecordLog', 'cai/pointRecordLog/index',
1, 0, 'C', '0', '0', 'cai:pointRecordLog: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 (1996050872055914498, '用户积分分销查询', 1996050872055914497, '1', '#', '', 1, 0, 'F', '0', '0',
'cai:pointRecordLog: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 (1996050872055914500, '用户积分分销修改', 1996050872055914497, '3', '#', '', 1, 0, 'F', '0', '0',
'cai:pointRecordLog: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 (1996050872055914501, '用户积分分销删除', 1996050872055914497, '4', '#', '', 1, 0, 'F', '0', '0',
'cai:pointRecordLog:remove', '#', 'admin', sysdate(), '', null, '');

34
doc/20251205.sql Normal file
View File

@@ -0,0 +1,34 @@
CREATE TABLE `cai_ip_record`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '子账户ID',
`count_date` date NOT NULL COMMENT '统计日期',
`ip_addr` varchar(100) NOT NULL COMMENT 'IP地址',
`path_addr` varchar(255) NULL COMMENT '请求地址',
`business_id` varchar(255) NULL,
`remark` varchar(255) NULL COMMENT '备注',
`number` bigint(20) default 0 not null COMMENT '手机号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `ip_addr` (`ip_addr`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = DYNAMIC COMMENT ='ip访问记录';
CREATE TABLE `cai_ip_black`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '子账户ID',
`ip_addr` varchar(100) NOT NULL COMMENT 'IP地址',
`enable_status` tinyint default 0 not NULL COMMENT '是否开启',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `ip_addr` (`ip_addr`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = DYNAMIC COMMENT ='ip黑名单';

19
doc/ipBlackMenu.sql Normal file
View File

@@ -0,0 +1,19 @@
-- 菜单 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(1996853670150475777, 'ip黑名单', '1738084052270563330', '1', 'ipBlack', 'cai/ipBlack/index', 1, 0, 'C', '0', '0', 'cai:ipBlack:list', '#', 'admin', sysdate(), '', null, 'ip黑名单菜单');
-- 按钮 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(1996853670150475778, 'ip黑名单查询', 1996853670150475777, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack: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(1996853670150475779, 'ip黑名单新增', 1996853670150475777, '2', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack: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(1996853670150475780, 'ip黑名单修改', 1996853670150475777, '3', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack: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(1996853670150475781, 'ip黑名单删除', 1996853670150475777, '4', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack: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(1996853670150475782, 'ip黑名单导出', 1996853670150475777, '5', '#', '', 1, 0, 'F', '0', '0', 'cai:ipBlack:export', '#', 'admin', sysdate(), '', null, '');

19
doc/ipRecordMenu.sql Normal file
View File

@@ -0,0 +1,19 @@
-- 菜单 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(1996853672289570817, 'ip访问记录', '1738084052270563330', '1', 'ipRecord', 'cai/ipRecord/index', 1, 0, 'C', '0', '0', 'cai:ipRecord:list', '#', 'admin', sysdate(), '', null, 'ip访问记录菜单');
-- 按钮 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(1996853672289570818, 'ip访问记录查询', 1996853672289570817, '1', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord: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(1996853672289570819, 'ip访问记录新增', 1996853672289570817, '2', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord: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(1996853672289570820, 'ip访问记录修改', 1996853672289570817, '3', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord: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(1996853672289570821, 'ip访问记录删除', 1996853672289570817, '4', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord: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(1996853672289570822, 'ip访问记录导出', 1996853672289570817, '5', '#', '', 1, 0, 'F', '0', '0', 'cai:ipRecord:export', '#', 'admin', sysdate(), '', null, '');

View File

@@ -3,9 +3,12 @@ package com.ruoyi.web.controller.cai.admin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.Account;
import com.ruoyi.cai.dto.AddPointAdminDto;
import com.ruoyi.cai.dto.AddRechargeOrderAdminDto;
import com.ruoyi.cai.dto.admin.vo.AccountAdminVo;
import com.ruoyi.cai.manager.ConsumerManager;
import com.ruoyi.cai.service.AccountService;
import com.ruoyi.cai.service.PointRecordLogService;
import com.ruoyi.cai.service.RechargeOrderService;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
@@ -13,9 +16,9 @@ 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.core.validate.AddGroup;
import com.ruoyi.common.enums.BusinessType;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -58,12 +61,27 @@ public class AccountController extends BaseController {
return R.ok(accountService.getById(id));
}
@Autowired
private ConsumerManager consumerManager;
@SaCheckPermission("cai:account:add")
@Log(title = "用户账户调账", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/updateCoin")
public R<Void> add(@RequestBody AddRechargeOrderAdminDto bo) {
rechargeOrderService.updateAdminRechargeOrder(bo);
consumerManager.rechargeOrderSuccessAdmin(bo);
return R.ok();
}
@Autowired
private PointRecordLogService pointRecordLogService;
@SaCheckPermission("cai:account:add")
@Log(title = "用户积分调账", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/updatePoint")
public R<Void> adminUpdatePoint(@RequestBody AddPointAdminDto bo) {
pointRecordLogService.adminUpdatePoint(bo);
return R.ok();
}
}

View File

@@ -1,8 +1,11 @@
package com.ruoyi.web.controller.cai.admin;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.cai.dto.admin.vo.unread.UnreadData;
import com.ruoyi.cai.manager.UnreadManager;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.mapper.SysNoticeMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
@@ -10,6 +13,8 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Validated
@RequiredArgsConstructor
@RestController
@@ -18,6 +23,8 @@ public class UnreadController {
@Autowired
public UnreadManager unreadManager;
@Resource
private SysNoticeMapper sysNoticeMapper;
@GetMapping("/data")
public R<UnreadData> list() {
@@ -31,4 +38,19 @@ public class UnreadController {
boolean checkCount = unreadManager.checkCount();
return R.ok(checkCount?1:0);
}
@GetMapping("/checkNotice")
public R<String> checkNotice() {
SysNotice sysNotice = sysNoticeMapper.selectOne(Wrappers.lambdaQuery(SysNotice.class)
.eq(SysNotice::getStatus, 0)
.eq(SysNotice::getNoticeType, 3)
.orderByDesc(SysNotice::getNoticeId)
.last("limit 1"));
if(sysNotice == null){
return R.ok();
}
R<String> ok = R.ok();
ok.setData("最新告警:"+sysNotice.getNoticeTitle());
return ok;
}
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.web.controller.cai.admin.init;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.cai.pay.PayOrderInfoDTO;
import com.ruoyi.cai.pay.PayReturnResp;
@@ -24,12 +25,14 @@ public class CityController {
private PayTrdConfigService payTrdConfigService;
@GetMapping("/resetRedis")
@SaCheckRole("admin")
public R<Void> resetRedis(){
citysService.resetRedis();
return R.ok();
}
@GetMapping("/resetOrder")
@SaCheckRole("admin")
public R<JSONObject> resetOrder(String orderNo,String payType,boolean updateData){
JSONObject jsonObject = payTrdConfigService.resetOrder(orderNo,payType,updateData);
return R.ok(jsonObject);
@@ -37,12 +40,14 @@ public class CityController {
@PostMapping("/createOrder")
@SaCheckRole("admin")
public R<Object> createOrder(@RequestBody PayOrderInfoDTO dto){
PayReturnResp orderAli = payTrdConfigService.createOrderAli(dto,false);
return R.ok(orderAli);
}
@GetMapping("/queryOrder")
@SaCheckRole("admin")
public R<JSONObject> queryOrder(String orderNo,String payType){
JSONObject jsonObject = payTrdConfigService.queryOrder(orderNo,payType);
return R.ok(jsonObject);

View File

@@ -1,5 +1,6 @@
package com.ruoyi.web.controller.cai.admin.init;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.User;
@@ -33,6 +34,7 @@ public class ImController {
private UserService userService;
@GetMapping("/register")
@SaCheckRole("admin")
public R<Void> registerIm(Long userId){
User user = userService.getById(userId);
if(user == null){
@@ -66,6 +68,7 @@ public class ImController {
}
@GetMapping("/registerAll")
@SaCheckRole("admin")
public R<Void> registerAllIm(){
int current = 0;
int success = 0;

View File

@@ -1,5 +1,6 @@
package com.ruoyi.web.controller.cai.admin.init;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.ruoyi.cai.mq.AmqpHttpProducer;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,6 +19,7 @@ public class MqControllerTest {
private AmqpHttpProducer amqpHttpProducer;
@GetMapping("/send2")
@SaCheckRole("admin")
public void send(String message){
amqpHttpProducer.sendCalculateSales(message);
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.web.controller.cai.admin.op;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.job.op.BusOp;
@@ -26,6 +27,7 @@ public class BusOpController {
private BusOp busOp;
@GetMapping("/copySysLog")
@SaCheckRole("admin")
public R<Void> copySysLog(int days){
log.info("备份操作日志-开始");
busOp.copySysLog(days);
@@ -34,6 +36,7 @@ public class BusOpController {
}
@GetMapping("/deleteUserCall")
@SaCheckRole("admin")
public R<Void> deleteUserCall(){
log.info("清洗垃圾通话记录-开始");
busOp.deleteUserCall(16);
@@ -43,12 +46,14 @@ public class BusOpController {
@GetMapping("/refreshUserVipStatus")
@SaCheckRole("admin")
public R<Void> refreshUserVipStatus(){
busOp.refreshUserVipStatus();
return R.ok();
}
@GetMapping("/checkVipOrder")
@SaCheckRole("admin")
public R<Void> checkVipOrder(String orderNo,String startTimeStr,String endTimeStr){
LocalDateTime startTime = null;
LocalDateTime endTime = null;
@@ -63,6 +68,7 @@ public class BusOpController {
}
@GetMapping("/checkRechargeOrder")
@SaCheckRole("admin")
public R<Void> checkRechargeOrder(String orderNo,String startTimeStr,String endTimeStr){
LocalDateTime startTime = null;
LocalDateTime endTime = null;

View File

@@ -1,5 +1,6 @@
package com.ruoyi.web.controller.cai.admin.op;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.job.op.ImOp;
@@ -30,6 +31,7 @@ public class ImOpController {
private ImUserRefClient imUserRefClient;
@GetMapping("/getImInfo")
@SaCheckRole("admin")
public R<YxUpdateUinfoR> getImInfo(String id) {
GetUnifoReq getUnifoReq = new GetUnifoReq();
String[] split = id.split(",");
@@ -40,24 +42,28 @@ public class ImOpController {
@GetMapping("/refreshIm")
@SaCheckRole("admin")
public R<Void> list() {
imOp.refreshIm();
return R.ok();
}
@GetMapping("/refreshImUserInfo")
@SaCheckRole("admin")
public R<Void> refreshImUserInfo(){
imOp.refreshImUserInfo();
return R.ok();
}
@GetMapping("/refreshImByUser")
@SaCheckRole("admin")
public R<Void> refreshImByUser(String usercode){
imOp.refreshImToken(usercode);
return R.ok();
}
@GetMapping("/refreshImNoSaveToken")
@SaCheckRole("admin")
public R<Void> refreshImNoSaveToken(){
imOp.refreshImNoSaveToken();
return R.ok();

View File

@@ -1,6 +1,7 @@
package com.ruoyi.web.controller.cai.admin.op;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.ruoyi.cai.kit.ShareUrlKit;
import com.ruoyi.cai.service.RankService;
import com.ruoyi.common.core.domain.R;
@@ -29,12 +30,14 @@ public class RefreshOpController {
private ShareUrlKit shareUrlKit;
@GetMapping("/cleanShareUrlCacheByUsercode")
@SaCheckRole("admin")
public R<Void> cleanShareUrlCacheByUsercode(String usercode){
shareUrlKit.cleanShareUrlCacheByUsercode(usercode);
return R.ok();
}
@GetMapping("/cleanShareUrlCache")
@SaCheckRole("admin")
public R<Void> cleanShareUrlCache(){
shareUrlKit.cleanShareUrlCache();
return R.ok();
@@ -42,6 +45,7 @@ public class RefreshOpController {
@GetMapping("/day")
@SaCheckRole("admin")
public R<Void> day(String date,Integer type) {
LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
rankService.saveDayRank(localDate, type);
@@ -49,6 +53,7 @@ public class RefreshOpController {
}
@GetMapping("/week")
@SaCheckRole("admin")
public R<Void> week(String date,Integer type){
LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
rankService.saveWeekRank(localDate,type);
@@ -56,6 +61,7 @@ public class RefreshOpController {
}
@GetMapping("/month")
@SaCheckRole("admin")
public R<Void> month(String date,Integer type){
LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
rankService.saveMonthRank(localDate,type);

View File

@@ -10,6 +10,8 @@ import com.ruoyi.cai.kit.VerificationCodeCheck;
import com.ruoyi.cai.manager.CurrentUserManager;
import com.ruoyi.cai.manager.LoginAfterManager;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.service.IpBlackService;
import com.ruoyi.cai.service.IpRecordService;
import com.ruoyi.cai.service.SmsVerifyService;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.common.annotation.Log;
@@ -142,15 +144,24 @@ public class AuthAppController {
@Autowired
private LoginAfterManager loginAfterManager;
@Autowired
private IpRecordService ipRecordService;
@Autowired
private IpBlackService ipBlackService;
@PostMapping("/login")
@Operation(summary = "登陆")
@Log(title = "登陆", businessType = BusinessType.OTHER, isSaveDb = false)
public R<LoginVo> login(@Validated @RequestBody LoginCaiUser loginBody){
LoginVo vo = new LoginVo();
try {
String token = caiLoginManager.login(loginBody.getUsername(), loginBody.getPassword());
vo.setToken(token);
vo.setUserInfo(currentUserManager.currentInfo());
}catch (Exception e){
ipRecordService.saveLoginIp(ServletUtils.getClientIP());
throw e;
}
// 异步调用通知
// loginAfterManager.loginAfter(LoginHelper.getUserId());
return R.ok(vo);

View File

@@ -1,22 +1,26 @@
package com.ruoyi.web.controller.cai.app;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.cai.dto.FileResp;
import com.ruoyi.cai.dto.app.UploadFileResp;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.util.OfflineTokenManager;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.system.domain.vo.SysOssVo;
import com.ruoyi.system.service.ISysOssService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jdk.nashorn.internal.ir.annotations.Ignore;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@@ -27,6 +31,8 @@ public class FileController {
@Autowired
private ISysOssService iSysOssService;
@Autowired
private SystemConfigManager systemConfigManager;
@Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@@ -49,6 +55,43 @@ public class FileController {
return R.ok(resp);
}
@GetMapping("/uploadFileSign")
public R<UploadFileResp> uploadFileSign() throws Exception {
String uploadFileDomain = systemConfigManager.getSystemConfig(SystemConfigEnum.UPLOAD_FILE_DOMAIN);
String s = OfflineTokenManager.generateToken(LoginHelper.getUserId() + "");
UploadFileResp resp = new UploadFileResp();
resp.setDomain(uploadFileDomain);
resp.setToken(s);
resp.setHttpUrl(uploadFileDomain+"/api/file/uploadImageV2");
return R.ok(resp);
}
@Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
@PostMapping(value = "/uploadImageV2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "上传图片类型的文件",
parameters = {
@Parameter(name = "file", description = "文件", required = true),
@Parameter(name = "type", description = "业务类型dynamic=动态图片user=用户相册头像im=聊天common=其他", required = false)
})
@SaIgnore
public R<FileResp> uploadImageV1(@RequestPart("file") MultipartFile file,
String type, String token) {
boolean success = OfflineTokenManager.validateToken(token);
if(!success){
return R.fail("上传失败token校验失败");
}
log.error("上传文件图片类型 type={}",type);
if (ObjectUtil.isNull(file)) {
return R.fail("上传文件不能为空");
}
SysOssVo oss = iSysOssService.upload(file);
FileResp resp = new FileResp();
resp.setUrl(oss.getUrl());
resp.setPath(oss.getFileName());
resp.setOriginalName(oss.getOriginalName());
return R.ok(resp);
}
@Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
@PostMapping(value = "/uploadImage", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

View File

@@ -15,6 +15,7 @@ import com.ruoyi.cai.dto.app.vo.user.UserInfoVo;
import com.ruoyi.cai.dto.app.vo.user.UserListVo;
import com.ruoyi.cai.dto.app.vo.user.UserMinInfoVo;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.enums.home.AnchorListQueryTypeEnum;
import com.ruoyi.cai.manager.HomeManager;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.service.*;
@@ -53,6 +54,8 @@ public class IndexController {
private HomeManager homeManager;
@Autowired
private SystemConfigManager systemConfigManager;
@Autowired
private LoveRankTodayService loveRankTodayService;
@GetMapping("/config")
@Operation(summary = "获取APP系统核心参数")
@@ -61,6 +64,7 @@ public class IndexController {
public R<AppHomeConfig> config(){
AppHomeConfig appHomeConfig = homeManager.config();
appHomeConfig.setHomeDialogText(systemConfigManager.getSystemConfig(SystemConfigEnum.HOME_DIALOG_TEXT));
appHomeConfig.setTdKf(systemConfigManager.getSystemConfig(SystemConfigEnum.TD_KF));
return R.ok(appHomeConfig);
}
@@ -102,7 +106,17 @@ public class IndexController {
@Operation(summary = "首页查询主播接口-分页")
@Log(title = "首页查询主播接口V2", businessType = BusinessType.OTHER,isPrintResponseData = false, isSaveDb = false)
public R<List<AnchorListVo>> anchorPageV2(PageQuery page, AnchorListQuery query){
List<AnchorListVo> home = homeManager.getHomeV2(page, query);
List<AnchorListVo> home;
if(AnchorListQueryTypeEnum.LOVE.getCode().equals(query.getType())){
home = loveRankTodayService.homePage(page, query);
}else{
home = homeManager.getHomeV2(page, query);
}
home.forEach(i -> {
if(i.getServiceTime() != null){
i.setServiceTime(i.getServiceTime()/60);
}
});
return R.ok(home);
}

View File

@@ -14,34 +14,47 @@ import com.ijpay.core.kit.HttpKit;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.ijpay.wxpay.model.UnifiedOrderModel;
import com.ruoyi.cai.domain.OrderLogs;
import com.ruoyi.cai.domain.PayConfig;
import com.ruoyi.cai.domain.PayTrdConfig;
import com.ruoyi.cai.dto.app.vo.pay.OrderPayStatusResp;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.manager.DangerManger;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.pay.*;
import com.ruoyi.cai.service.OrderLogsService;
import com.ruoyi.cai.service.PayTrdConfigService;
import com.ruoyi.cai.trdpay.TrdPayManager;
import com.ruoyi.cai.trdpay.TrdPayProperties;
import com.ruoyi.cai.trdpay.TrdPayTypeEnum;
import com.ruoyi.cai.trdpay.V14Manager;
import com.ruoyi.cai.trdpay.dto.NotifyResp;
import com.ruoyi.cai.trdpay.dto.extend.V14ExtendMapDTO;
import com.ruoyi.cai.trdpay.dto.v14.V14Token;
import com.ruoyi.cai.trdpay.dto.v14.wechatJSAPI.WechatJSAPIResponse;
import com.ruoyi.cai.trdpay.handle.v12new.utils.JacksonUtil;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
@@ -91,7 +104,7 @@ public class PayController {
@Operation(summary = "微信聚合支付")
@Log(title = "微信聚合支付", businessType = BusinessType.OTHER, isSaveDb = true)
public R<PayReturnResp> trdWxPay(@RequestBody PayControllerDTO dto){
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo());
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo(),true);
if(payOrderInfo == null){
return R.fail(600,"支付失败,未找到订单");
}
@@ -110,7 +123,7 @@ public class PayController {
}
}
if(checkOpen){
boolean openAliPay = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.OPEN_WX_PAY);
boolean openAliPay = trdPayManager.checkOpenWx();
if(!openAliPay){
orderLogsService.createBaseFail(dto.getOrderNo(),"四方微信支付","第四方微信未开启");
return R.fail(600,"微信支付失败!未开启微信通道!");
@@ -122,15 +135,100 @@ public class PayController {
}catch (Exception e){
orderLogsService.createBaseFail(dto.getOrderNo(),"四方支付宝支付",StringUtils.cat(e.getMessage(),2000));
log.error("微信聚合支付 使用第三方支付失败! dto={}",JSON.toJSONString(dto), e);
return R.fail(600,"支付宝支付失败!");
return R.fail(600,"微信支付失败!");
}
}
@Autowired
private V14Manager v14Manager;
@PostMapping(value = "/efps/wx")
@Operation(summary = "微信支付efps")
@Log(title = "微信支付efps", businessType = BusinessType.OTHER, isSaveDb = true)
@SaIgnore
public V14R<WechatJSAPIResponse> efpsWx(HttpServletRequest request, @RequestBody V14PayDTO payDTO){
String efpsToken = request.getHeader("Efps-Token");
if(StringUtils.isBlank(efpsToken)){
return V14R.fail14(600,"支付失败,鉴权失败或者未找到订单");
}
V14Token v14Token = v14Manager.checkToken(efpsToken);
if(v14Token == null){
return V14R.fail14(600,"支付失败,鉴权失败或者未找到订单");
}
PayTrdConfig payTrdConfig = payTrdConfigService.getById(v14Token.getPayTrdConfigId());
if(payTrdConfig == null){
return V14R.fail14(600,"支付失败,未找到支付通道信息");
}
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(v14Token.getOrderNo(),true);
if(payOrderInfo == null){
return V14R.fail14(600,"支付失败,未找到订单");
}
log.info("收到微信支付/efps/wx, token={},orderNo={},body={}",efpsToken,payOrderInfo.getOrderNo(), JacksonUtil.objToJson(payDTO));
try {
long startTime = System.currentTimeMillis();
V14ExtendMapDTO extendMap = JSON.parseObject(payTrdConfig.getExtendData(), V14ExtendMapDTO.class);
String openId = getOpenIdByCode(payDTO.getWx_code(), extendMap.getMinAppId(), extendMap.getMinSecret());
payOrderInfo.setOpenId(openId);
long endTime = System.currentTimeMillis();
log.info("获取openId耗时:{}ms",endTime-startTime);
} catch (IOException e) {
log.error("获取openid失败",e);
return V14R.fail14(600,"微信登录失败");
}
long startTime = System.currentTimeMillis();
WechatJSAPIResponse pay = v14Manager.pay(payOrderInfo, payTrdConfig);
long endTime = System.currentTimeMillis();
log.info("处理v14请求耗时:{}ms",endTime-startTime);
V14R<WechatJSAPIResponse> result = V14R.ok14(pay);
result.setWxJsapiParam(pay.getWxJsapiParam());
return result;
}
public String getOpenIdByCode(String code,String appId,String secret) throws IOException {
String url = "https://api.weixin.qq.com/sns/jscode2session";
url += "?appid="+appId;//自己的appid
url += "&secret="+secret;//自己的appSecret
url += "&js_code=" + code;
url += "&grant_type=authorization_code";
url += "&connect_redirect=1";
String res = null;
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// DefaultHttpClient();
HttpGet httpget = new HttpGet(url); //GET方式
CloseableHttpResponse response = null;
// 配置信息
RequestConfig requestConfig = RequestConfig.custom() // 设置连接超时时间(单位毫秒)
.setConnectTimeout(5000) // 设置请求超时时间(单位毫秒)
.setConnectionRequestTimeout(5000) // socket读写超时时间(单位毫秒)
.setSocketTimeout(5000) // 设置是否允许重定向(默认为true)
.setRedirectsEnabled(false).build(); // 将上面的配置信息 运用到这个Get请求里
httpget.setConfig(requestConfig); // 由客户端执行(发送)Get请求
response = httpClient.execute(httpget); // 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
log.info("获取openId 响应状态为: {}", response.getStatusLine());
if (responseEntity != null) {
res = EntityUtils.toString(responseEntity);
log.info("获取openId url:{}, res:{}", url,res);
}
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
JSONObject jo = JSON.parseObject(res);
return jo.getString("openid");
}
@PostMapping(value = "/merge/ali")
@Operation(summary = "支付宝聚合支付")
@Log(title = "支付宝聚合支付", businessType = BusinessType.OTHER, isSaveDb = true)
public R<PayReturnResp> trdAliPay(@RequestBody PayControllerDTO dto){
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo());
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo(),false);
if(payOrderInfo == null){
return R.fail(600,"支付失败,未找到订单");
}
@@ -185,11 +283,11 @@ public class PayController {
}
@PostMapping(value = "/wx")
/*@PostMapping(value = "/wx")
@Operation(summary = "微信支付")
@Log(title = "微信支付", businessType = BusinessType.OTHER, isSaveDb = true)
public R<PayReturnResp> appPay(@RequestBody PayControllerDTO dto) {
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo());
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo(),true);
if(payOrderInfo == null){
return R.fail(600,"支付失败,未找到订单");
}
@@ -246,38 +344,38 @@ public class PayController {
resp.setData(jsonStr);
orderLogsService.createBaseSuccess(dto.getOrderNo(),"微信支付");
return R.ok(resp);
}
}*/
// @PostMapping(value = "/ali")
// @Operation(summary = "支付宝支付")
// @Log(title = "支付宝支付", businessType = BusinessType.OTHER, isSaveDb = true)
public R<PayReturnResp> aliPay(@RequestBody PayControllerDTO dto) {
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo());
if(payOrderInfo == null){
return R.fail(600,"支付失败,未找到订单");
}
try {
boolean b = payConfigManager.initAliPay();
if(!b){
log.error("支付失败,未找到可用的支付宝配置");
return R.fail(600,"支付失败!未开通支付宝支付!");
}
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(payOrderInfo.getBody());
model.setSubject(payOrderInfo.getSubject());
model.setOutTradeNo(payOrderInfo.getOrderNo());
model.setTimeoutExpress("30m");
model.setTotalAmount(payOrderInfo.getPrice().toString());
String notifyUrl = AliPayApiConfigKit.getAliPayApiConfig().getDomain();
String orderInfo = AliPayApi.appPayToResponse(model, notifyUrl+NOTIFY_ALI_URL).getBody();
PayReturnResp resp = new PayReturnResp();
resp.setData(orderInfo);
return R.ok(resp);
} catch (AlipayApiException e) {
log.error("支付宝支付失败",e);
return R.fail("支付宝支付失败,请联系客服");
}
}
// public R<PayReturnResp> aliPay(@RequestBody PayControllerDTO dto) {
// PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(dto.getOrderNo());
// if(payOrderInfo == null){
// return R.fail(600,"支付失败,未找到订单");
// }
// try {
// boolean b = payConfigManager.initAliPay();
// if(!b){
// log.error("支付失败,未找到可用的支付宝配置");
// return R.fail(600,"支付失败!未开通支付宝支付!");
// }
// AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
// model.setBody(payOrderInfo.getBody());
// model.setSubject(payOrderInfo.getSubject());
// model.setOutTradeNo(payOrderInfo.getOrderNo());
// model.setTimeoutExpress("30m");
// model.setTotalAmount(payOrderInfo.getPrice().toString());
// String notifyUrl = AliPayApiConfigKit.getAliPayApiConfig().getDomain();
// String orderInfo = AliPayApi.appPayToResponse(model, notifyUrl+NOTIFY_ALI_URL).getBody();
// PayReturnResp resp = new PayReturnResp();
// resp.setData(orderInfo);
// return R.ok(resp);
// } catch (AlipayApiException e) {
// log.error("支付宝支付失败",e);
// return R.fail("支付宝支付失败,请联系客服");
// }
// }
@PostMapping(value = "/wx/notify")
@Operation(hidden = true)
@@ -344,11 +442,14 @@ public class PayController {
}
}
@Autowired
private DangerManger dangerManger;
@RequestMapping(value = "/trd/notify/wx/{type}", method = {RequestMethod.POST, RequestMethod.GET})
@Operation(hidden = true)
@Log(title = "第三方微信支付回调", businessType = BusinessType.OTHER, isSaveDb = false)
@SaIgnore
public String trdWxNotifyUrl(HttpServletRequest request,@PathVariable("type") String type) {
public String trdWxNotifyUrl(HttpServletRequest request, HttpServletResponse response, @PathVariable("type") String type) {
try {
if(type == null){
log.error("收到第三方微信支付回调,支付类型为空");
@@ -359,6 +460,23 @@ public class PayController {
log.error("收到第三方微信支付回调,未找到支付类型 type={}",type);
return "failure";
}
if(trdPayTypeEnum == TrdPayTypeEnum.V14){
try {
JSONObject jsonObject = v14Manager.notifyDeal(request);
dangerManger.notifyPay(TrdPayTypeEnum.V14);
PrintWriter writer = response.getWriter();
writer.print(jsonObject.toJSONString());
writer.close();
}catch (Exception e){
log.error("v14微信支付回调异常",e);
JSONObject jsonObject = new JSONObject();
jsonObject.put("returnCode", "0001");
PrintWriter writer = response.getWriter();
writer.print(jsonObject.toJSONString());
writer.close();
}
return null;
}
Map<String, String> params = AliPayApi.toMap(request);
log.info("收到第三方微信支付回调 {}:{}",trdPayTypeEnum.name(), JSON.toJSONString(params));
NotifyResp notifyResp = trdPayManager.getNotifyResp(params, trdPayTypeEnum);

View File

@@ -5,11 +5,13 @@ import com.ruoyi.cai.dto.app.RankIdReq;
import com.ruoyi.cai.dto.app.vo.anchor.AnchorStatusDTO;
import com.ruoyi.cai.dto.app.vo.rank.RankNodeInvite;
import com.ruoyi.cai.dto.app.vo.rank.RankNodeLove;
import com.ruoyi.cai.dto.app.vo.rank.RankNodeRecharge;
import com.ruoyi.cai.dto.app.vo.rank.RankRemark;
import com.ruoyi.cai.enums.GenderEnum;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.manager.AwardManager;
import com.ruoyi.cai.manager.SystemConfigManager;
import com.ruoyi.cai.mapper.AccountMapper;
import com.ruoyi.cai.mapper.AnchorMapper;
import com.ruoyi.cai.rank.RankManager;
import com.ruoyi.cai.rank.RankNode;
@@ -31,6 +33,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -81,6 +85,37 @@ public class RankAppController {
return R.ok();
}
@Resource
private AccountMapper accountMapper;
@GetMapping("/recharge")
@Operation(summary = "土豪榜")
@Log(title = "土豪榜单查询", businessType = BusinessType.OTHER, isPrintResponseData = true, isSaveDb = false)
public R<List<RankNodeRecharge>> rechargeRank(
@Parameter(description = "类型 1-上周 2-昨日 3-日榜 4-周榜 5-月榜 6-总榜") Integer type){
Long userId = LoginHelper.getUserId();
long lastLove = 0;
List<RankNodeRecharge> rankNodeList = accountMapper.rankTotalPay(30);
for (int i = 0; i < rankNodeList.size(); i++) {
RankNodeRecharge rankNodeRecharge = rankNodeList.get(i);
rankNodeRecharge.setValue(rankNodeRecharge.getMoney().setScale(0, RoundingMode.CEILING).longValue());
if(!rankNodeRecharge.getUserId().equals(userId)){
rankNodeRecharge.setAvatar(GenderEnum.MAN.getDefaultAvatar());
rankNodeRecharge.setNickname(minNickname(rankNodeRecharge.getNickname()));
rankNodeRecharge.setUserId(null);
}
if(i == 0){
rankNodeRecharge.setDiffLastValue(0L);
}else{
rankNodeRecharge.setDiffLastValue(lastLove - rankNodeRecharge.getValue());
}
}
return R.ok(rankNodeList);
}
@GetMapping("/love")
@Operation(summary = "魅力榜")
@Log(title = "魅力榜单查询", businessType = BusinessType.OTHER, isPrintResponseData = true, isSaveDb = false)

View File

@@ -59,7 +59,7 @@ public class SettingAppController {
SettingGoodsVo vo = new SettingGoodsVo();
if(useTrdPay){ // 使用第三方支付
vo.setHasAlipayPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_ALI_PAY));
vo.setHasWechatPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_WX_PAY));
vo.setHasWechatPay(trdPayManager.checkOpenWxInt());
}else{
vo.setHasAlipayPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_SOURCE_ALI_PAY));
vo.setHasWechatPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_WX_PAY));
@@ -68,6 +68,10 @@ public class SettingAppController {
List<Goods> list = goodsService.list(Wrappers.lambdaQuery(Goods.class)
.eq(Goods::getStatus,0)
.orderByAsc(Goods::getPrice));
list.forEach(i -> {
// i.setAliAmountDiff(i.getAmount() - i.getWxAmount());
i.setAliAmountDiff(0L);
});
vo.setGoods(list);
return R.ok(vo);
}

View File

@@ -98,7 +98,7 @@ public class UserAppController {
boolean useTrdPay = trdPayManager.useTrdPay(LoginHelper.getUserId());
if(useTrdPay){ // 使用第三方支付
vo.setHasAlipayPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_ALI_PAY));
vo.setHasWechatPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_WX_PAY));
vo.setHasWechatPay(trdPayManager.checkOpenWxInt());
}else{
vo.setHasAlipayPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_SOURCE_ALI_PAY));
vo.setHasWechatPay(systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.OPEN_WX_PAY));

View File

@@ -0,0 +1,76 @@
package com.ruoyi.web.controller.cai.proxy;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.cai.dto.proxy.BindUserListDTO;
import com.ruoyi.cai.dto.proxy.OrderListDTO;
import com.ruoyi.cai.dto.proxy.ProxyTotalDTO;
import com.ruoyi.cai.manager.ProxyUserManager;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cai/proxyUser")
public class ProxyUserController {
@Autowired
private ProxyUserManager proxyUserManager;
@Resource
private SysUserMapper sysUserMapper;
@GetMapping("/orderLogList")
@SaCheckPermission("cai:proxyUser:orderLogList")
public TableDataInfo<OrderListDTO> orderLogList(PageQuery pageQuery, OrderListDTO query) {
String userCode = getBindUserCode();
IPage<OrderListDTO> orderListDTOIPage = proxyUserManager.orderLogList(userCode, pageQuery,query);
return TableDataInfo.build(orderListDTOIPage);
}
@GetMapping("/bindUserList")
@SaCheckPermission("cai:proxyUser:bindUserList")
public TableDataInfo<BindUserListDTO> bindUserList(PageQuery pageQuery, BindUserListDTO query) {
String userCode = getBindUserCode();
IPage<BindUserListDTO> data = proxyUserManager.bindUserList(userCode, pageQuery, query);
return TableDataInfo.build(data);
}
@GetMapping("/proxyTotal")
@SaCheckRole("proxy")
public R<ProxyTotalDTO> proxyTotal() {
Long userId = LoginHelper.getUserId();
SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery(SysUser.class).eq(SysUser::getUserId, userId).select(SysUser::getBindUserCode));
if(sysUser == null || StringUtils.isBlank(sysUser.getBindUserCode())){
return R.ok();
}
String userCode = sysUser.getBindUserCode();
ProxyTotalDTO dto = proxyUserManager.total(userCode);
return R.ok(dto);
}
private String getBindUserCode(){
Long userId = LoginHelper.getUserId();
SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery(SysUser.class).eq(SysUser::getUserId, userId).select(SysUser::getBindUserCode));
if(sysUser == null || StringUtils.isBlank(sysUser.getBindUserCode())){
throw new ServiceException("您的后台账户未绑定APP账户请联系管理员操作");
}
return sysUser.getBindUserCode();
}
}

View File

@@ -1,18 +1,26 @@
package com.ruoyi.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
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 com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.domain.bo.SysNoticeDealData;
import com.ruoyi.system.mapper.SysNoticeMapper;
import com.ruoyi.system.service.ISysNoticeService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
* 公告 信息操作处理
*
@@ -65,6 +73,25 @@ public class SysNoticeController extends BaseController {
public R<Void> edit(@Validated @RequestBody SysNotice notice) {
return toAjax(noticeService.updateNotice(notice));
}
@Resource
private SysNoticeMapper noticeMapper;
/**
* 修改通知公告
*/
@SaCheckPermission("system:notice:edit")
@Log(title = "处理公告", businessType = BusinessType.UPDATE)
@PostMapping("deal")
public R<Void> deal(@Validated @RequestBody SysNoticeDealData notice) {
noticeMapper.update(Wrappers.lambdaUpdate(SysNotice.class)
.eq(SysNotice::getNoticeId, notice.getNoticeId())
.set(SysNotice::getStatus, 1)
.set(SysNotice::getRemark, notice.getRemark())
.set(SysNotice::getNoticeId, notice.getNoticeId())
.set(SysNotice::getDealBy, LoginHelper.getUsername())
.set(SysNotice::getDealTime, LocalDateTime.now()));
return R.ok();
}
/**
* 删除通知公告

View File

@@ -20,9 +20,9 @@ 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-v6?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
url: jdbc:mysql://124.222.254.188:4306/cai_v6?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: root
password: 383200134
password: tyYrk487R4y7FENM
# 从库数据源
slave:
lazy: true
@@ -53,11 +53,11 @@ spring:
# 地址
host: 124.222.254.188
# 端口默认为6379
port: 9379
port: 8379
# 数据库索引
database: 12
# 密码(如没有密码请注释掉)
password: 383200134
password: dsjakldbwja
# 连接超时时间
timeout: 15s
# 是否开启ssl
@@ -65,7 +65,7 @@ spring:
rabbitmq:
addresses: 124.222.254.188 #ip地址
username: admin # 账号
password: 383200134 # 密码
password: THnpGkdS # 密码
port: 5672
virtual-host: /cai-dev

View File

@@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIEIjCCAwqgAwIBAgIUJciVbai01yHdyTuMJ3UAOf6uWPQwDQYJKoZIhvcNAQEL
BQAwgZYxCzAJBgNVBAYTAkNOMTkwNwYDVQQKDDDljJfkuqzlpKnlqIHor5rkv6Hn
lLXlrZDllYbliqHmnI3liqHmnInpmZDlhazlj7gxFTATBgNVBAsMDOS8geS4muiv
geS5pjE1MDMGA1UEAwws5aSp5aiB6K+a5L+h5pWw5a2X6K6k6K+B5Lit5b+D5LyB
5Lia6K+B5LmmQ0EwHhcNMTgwMTExMDgwNjE4WhcNMTkwMTExMDgwNjE4WjCBjDE5
MDcGA1UECgww5YyX5Lqs5aSp5aiB6K+a5L+h55S15a2Q5ZWG5Yqh5pyN5Yqh5pyJ
6ZmQ5YWs5Y+4MRgwFgYDVQQLDA/ov5Dnu7TmlK/mjIHpg6gxNTAzBgNVBAMMLOaY
k+elqOiBlOaUr+S7mOaciemZkOWFrOWPuC1FRlBT5ZWG5oi36Zeo5oi3MIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAptTghT1nY9twX4VKrvJigGB/klcs
P8tH+9aV5TofKskh8PQg8neTSprPMmEsidFGMJ26a4x/E88nJ6wMHAZqeWP0x64/
GLtIff8r+WZjqBYP9WNiW71NcAsoJEBrlLlLrc5W/9mC+3z0oWYiz+LB9E+uMeCV
3ocHP42Z6oGeCV6jSe1Sx2UBsCEROYh1nTnZQ13pHIghqO1Fc5MZTcTW5k3zviuF
L7IJYUW79AIzh9SttcMbUZqGWkf808Ux3BhZzgUTL0g76fpCRjPilmlCJ/NdyGJ4
8E0IfMXHeTq3uiEjnO2nzsEV4zvhNoii0F2iH+fgMXBDwGd9O3mLv23gIQIDAQAB
o3AwbjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFoDBUBgNVHR8ETTBLMEmgR6BFhkNo
dHRwOi8vdG9wY2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0kIAoK
JENBX1NFUklBTE5VTUJFUiQkMA0GCSqGSIb3DQEBCwUAA4IBAQCUEFIx+vOeOQi2
ZWR8TnADKYYTNsqv52e9WBz8VKfjbzIDA/hXqJUvtylyyEL4pBn82xG0WMk9UaAE
EGrkpdA0figlbUInyXZE8WZYcE/7Nlr4aupH+JETp1OqvAsS0l5M2mH4OdVMDA/K
pdwTMBa0it7f3QA8k2lXalHlifi35jrKj2q3DFKvy2n9pcwblPX2jpC7pZ1Y66tq
7SapaGyCo12Q6o0vSCgGodFkZsczYmGdp4ZbphUbACVQ3Lhw/moqB3PadT6V0jB6
4BDDHnkDkaoUI5XUr1BMmTAyy+chBLHzk83Dx9ioNHdF0rHpEyUD73GfV11R7BIy
zl5g8FpF
-----END CERTIFICATE-----

Binary file not shown.

View File

@@ -93,14 +93,24 @@ public class CaiLoginManager {
private IgnoreDataService ignoreDataService;
@Autowired
private AmqpHttpProducer amqpHttpProducer;
@Autowired
private IpRecordService ipRecordService;
@Autowired
private IpBlackService ipBlackService;
public String login(String username,String password){
String clientIP = ServletUtils.getClientIP();
Boolean b = ipBlackService.checkIp(clientIP);
if(b){
log.error("登录拦截了异常IP={}", clientIP);
throw new ServiceException("40305");
}
User user = userService.getByUsername(username);
if(user == null){
throw new ServiceException("用户不存在或密码错误");
}
String imei = ServletUtils.getImei();
UserForbidManager.CheckForbid forbid = userForbidManager.checkForbid(user.getId(), user.getUsercode(), imei, ServletUtils.getClientIP());
UserForbidManager.CheckForbid forbid = userForbidManager.checkForbid(user.getId(), user.getUsercode(), imei, clientIP);
if(forbid != null && forbid.isForbid()){
throw new ServiceException(forbid.getMessage());
}
@@ -353,6 +363,7 @@ public class CaiLoginManager {
userInfo.setGuardIncomeRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_GUARD_INCOME_RATE));
userInfo.setGiftIncomeRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_GIFT_INCOME_RATE));
userInfo.setPayIncomeRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_PAY_INCOME_RATE));
userInfo.setPointRate(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_PAY_POINT_RATE));
userInfo.setLoginCount(1);
userInfo.setLastLoginIp(clientIP);
userInfo.setLastLoginTime(LocalDateTime.now());

View File

@@ -0,0 +1,95 @@
package com.ruoyi.cai.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.IpBlack;
import com.ruoyi.cai.service.IpBlackService;
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.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import java.util.Arrays;
/**
* ip黑名单
*
* @author ruoyi
* @date 2025-12-05
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cai/ipBlack")
public class IpBlackController extends BaseController {
private final IpBlackService ipBlackService;
/**
* 查询ip黑名单列表
*/
@SaCheckPermission("cai:ipBlack:list")
@GetMapping("/list")
public TableDataInfo<IpBlack> list(IpBlack bo, PageQuery pageQuery) {
Page<IpBlack> page = ipBlackService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
return TableDataInfo.build(page);
}
/**
* 导出ip黑名单列表
*/
/* @SaCheckPermission("cai:ipBlack:export")
@Log(title = "ip黑名单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(IpBlackBo bo, HttpServletResponse response) {
List<IpBlackVo> list = ipBlackService.queryList(bo);
ExcelUtil.exportExcel(list, "ip黑名单", IpBlackVo.class, response);
}*/
/**
* 新增ip黑名单
*/
@SaCheckPermission("cai:ipBlack:add")
@Log(title = "ip黑名单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody IpBlack bo) {
bo.setEnableStatus(1);
ipBlackService.saveIp(bo);
return R.ok();
}
/**
* 修改ip黑名单
*/
@SaCheckPermission("cai:ipBlack:edit")
@Log(title = "ip黑名单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody IpBlack bo) {
return toAjax(ipBlackService.updateById(bo));
}
/**
* 删除ip黑名单
*
* @param ids 主键串
*/
@SaCheckPermission("cai:ipBlack:remove")
@Log(title = "ip黑名单", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] ids) {
return toAjax(ipBlackService.removeBatchByIds(Arrays.asList(ids), true));
}
}

View File

@@ -0,0 +1,108 @@
package com.ruoyi.cai.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.IpRecord;
import com.ruoyi.cai.dto.admin.vo.IpRecordAdminVO;
import com.ruoyi.cai.service.IpRecordService;
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.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
/**
* ip访问记录
*
* @author ruoyi
* @date 2025-12-05
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cai/ipRecord")
public class IpRecordController extends BaseController {
private final IpRecordService ipRecordService;
/**
* 查询ip访问记录列表
*/
@SaCheckPermission("cai:ipRecord:list")
@GetMapping("/list")
public TableDataInfo<IpRecordAdminVO> list(IpRecordAdminVO bo, PageQuery pageQuery) {
IPage<IpRecordAdminVO> page = ipRecordService.pageAdmin(bo,pageQuery);
return TableDataInfo.build(page);
}
/**
* 导出ip访问记录列表
*/
/*@SaCheckPermission("cai:ipRecord:export")
@Log(title = "ip访问记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(IpRecordBo bo, HttpServletResponse response) {
List<IpRecordVo> list = iIpRecordService.queryList(bo);
ExcelUtil.exportExcel(list, "ip访问记录", IpRecordVo.class, response);
}*/
/**
* 获取ip访问记录详细信息
*
* @param id 主键
*/
@SaCheckPermission("cai:ipRecord:query")
@GetMapping("/{id}")
public R<IpRecord> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String id) {
return R.ok(ipRecordService.getById(id));
}
/**
* 新增ip访问记录
*/
@SaCheckPermission("cai:ipRecord:add")
@Log(title = "ip访问记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody IpRecord bo) {
return toAjax(ipRecordService.save(bo));
}
/**
* 修改ip访问记录
*/
@SaCheckPermission("cai:ipRecord:edit")
@Log(title = "ip访问记录", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody IpRecord bo) {
return toAjax(ipRecordService.updateById(bo));
}
/**
* 删除ip访问记录
*
* @param ids 主键串
*/
@SaCheckPermission("cai:ipRecord:remove")
@Log(title = "ip访问记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] ids) {
return toAjax(ipRecordService.removeBatchByIds(Arrays.asList(ids), true));
}
}

View File

@@ -48,7 +48,10 @@ public class OrderLogsController extends BaseController {
*/
@GetMapping("/list")
public TableDataInfo<OrderLogs> list(OrderLogs bo, PageQuery pageQuery) {
Page<OrderLogs> page = orderLogsService.page(pageQuery.build(), Wrappers.lambdaQuery(OrderLogs.class).orderByDesc(OrderLogs::getCreateTime));
Page<OrderLogs> page = orderLogsService.page(pageQuery.build(), Wrappers.lambdaQuery(bo)
.ge(bo.getCreateTimeMin() != null, OrderLogs::getCreateTime, bo.getCreateTimeMin())
.le(bo.getCreateTimeMax() != null,OrderLogs::getCreateTime, bo.getCreateTimeMax())
.orderByDesc(OrderLogs::getCreateTime));
return TableDataInfo.build(page);
}

View File

@@ -55,7 +55,9 @@ public class PayTrdConfigController extends BaseController {
@GetMapping("/{id}")
public R<PayTrdConfig> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(payTrdConfigService.getById(id));
PayTrdConfig payTrdConfig = payTrdConfigService.getById(id);
payTrdConfig.refreshSelect();
return R.ok(payTrdConfig);
}
/**
@@ -66,6 +68,7 @@ public class PayTrdConfigController extends BaseController {
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody PayTrdConfig bo) {
bo.refreshUpdateOrSave();
boolean save = payTrdConfigService.save(bo);
payTrdConfigService.resetPayTrdConfig();
return toAjax(save);
@@ -89,6 +92,7 @@ public class PayTrdConfigController extends BaseController {
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody PayTrdConfig bo) {
bo.refreshUpdateOrSave();
boolean save = payTrdConfigService.updateById(bo);
payTrdConfigService.resetPayTrdConfig();
return toAjax(save);

View File

@@ -0,0 +1,96 @@
package com.ruoyi.cai.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.PointRecordLog;
import com.ruoyi.cai.service.PointRecordLogService;
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.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
/**
* 用户积分分销
*
* @author 77
* @date 2025-12-03
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/cai/pointRecordLog")
public class PointRecordLogController extends BaseController {
private final PointRecordLogService pointRecordLogService;
/**
* 查询用户积分分销列表
*/
@SaCheckPermission("cai:pointRecordLog:list")
@GetMapping("/list")
public TableDataInfo<PointRecordLog> list(PointRecordLog bo, PageQuery pageQuery) {
Page<PointRecordLog> page = pointRecordLogService.page(pageQuery.build(), Wrappers.lambdaQuery(bo).orderByDesc(PointRecordLog::getCreateTime));
return TableDataInfo.build(page);
}
/**
* 获取用户积分分销详细信息
*
* @param id 主键
*/
@SaCheckPermission("cai:pointRecordLog:query")
@GetMapping("/{id}")
public R<PointRecordLog> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String id) {
return R.ok(pointRecordLogService.getById(id));
}
/**
* 新增用户积分分销
*/
@SaCheckPermission("cai:pointRecordLog:add")
@Log(title = "用户积分分销", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody PointRecordLog bo) {
return toAjax(pointRecordLogService.save(bo));
}
/**
* 修改用户积分分销
*/
@SaCheckPermission("cai:pointRecordLog:edit")
@Log(title = "用户积分分销", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody PointRecordLog bo) {
return toAjax(pointRecordLogService.updateById(bo));
}
/**
* 删除用户积分分销
*
* @param ids 主键串
*/
@SaCheckPermission("cai:pointRecordLog:remove")
@Log(title = "用户积分分销", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] ids) {
return toAjax(pointRecordLogService.removeBatchByIds(Arrays.asList(ids), true));
}
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.cai.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.Union;
@@ -57,6 +58,7 @@ public class UnionTotalController extends BaseController {
@Log(title = "刷新工会每日收益", businessType = BusinessType.DELETE)
@GetMapping("/refreshData")
@SaCheckRole("admin")
public R<Void> refreshData(String date) {
if(StringUtils.isBlank(date)){
unionTotalService.refreshAll();
@@ -69,6 +71,7 @@ public class UnionTotalController extends BaseController {
@Log(title = "刷新所有工会总收益")
@GetMapping("/refreshAllUnion")
@SaCheckRole("admin")
public R<Void> refreshAllUnion() {
unionTotalService.refreshUnionTotalAll();
return R.ok();
@@ -76,6 +79,7 @@ public class UnionTotalController extends BaseController {
@Log(title = "刷新指定工会总收益")
@GetMapping("/refreshUnionTotal")
@SaCheckRole("admin")
public R<Void> refreshUnionTotal(Long unionId) {
unionTotalService.refreshUnionTotal(unionId);
return R.ok();

View File

@@ -36,6 +36,10 @@ public class Account implements Serializable {
* 收益的彩币数量
*/
private Long incomeCoin;
/**
* 积分
*/
private Long points;
/**
* 充值总额
*/

View File

@@ -0,0 +1,79 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 用户账户对象 cai_account
*
* @author 77
* @date 2023-12-23
*/
@Data
@TableName("cai_account_delete")
public class AccountDelete implements Serializable {
private static final long serialVersionUID=1L;
/**
* 子账户ID
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 用户ID
*/
private Long userId;
private String usercode;
private String mobile;
private Long inviteId;
/**
* 当前彩币数量
*/
private Long coin;
/**
* 收益的彩币数量
*/
private Long incomeCoin;
/**
* 积分
*/
private Long points;
/**
* 充值总额
*/
private BigDecimal totalBuyMoney;
/**
* 充值彩贝总额
*/
private Long totalBuyCoin;
/**
* 第四方充值总额
*/
private BigDecimal totalTrdMoney;
/**
* 聊天收入
*/
private Long messageIncomeCoin;
/** 视频收入 */
private Long videoIncomeCoin;
/** 礼物收入 */
private Long giftIncomeCoin;
/** 守护收入 */
private Long guardIncomeCoin;
/** 工会收入 */
private Long unionIncomeCoin;
/**
* 账户锁定 0 正常 1 锁定
*/
private Integer status;
private LocalDateTime createTime;
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -40,8 +41,14 @@ public class Goods implements Serializable {
/**
*
*/
@Schema(description = "紫贝数量")
@Schema(description = "支付宝紫贝数量")
private Long amount;
@Schema(description = "微信紫贝数量")
private Long wxAmount;
@TableField(exist = false)
private Long aliAmountDiff;
@Schema(description = "赠送积分")
private Long givePoint;
/**
* 状态 0 可用 1不可用
*/

View File

@@ -0,0 +1,39 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* ip黑名单对象 cai_ip_black
*
* @author ruoyi
* @date 2025-12-05
*/
@Data
@TableName("cai_ip_black")
public class IpBlack implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 子账户ID
*/
@TableId(value = "id", type = IdType.AUTO)
private String id;
/**
* IP地址
*/
private String ipAddr;
/**
* 是否开启
*/
private Integer enableStatus;
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,54 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* ip访问记录对象 cai_ip_record
*
* @author ruoyi
* @date 2025-12-05
*/
@Data
@TableName("cai_ip_record")
public class IpRecord implements Serializable{
private static final long serialVersionUID=1L;
/**
* 子账户ID
*/
@TableId(value = "id",type = IdType.AUTO)
private String id;
private LocalDate countDate;
/**
* IP地址
*/
private String ipAddr;
/**
* 请求地址
*/
private String pathAddr;
/**
*
*/
private String businessId;
/**
* 备注
*/
private String remark;
/**
* 手机号
*/
private Long number;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,23 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@TableName("cai_login_min_log")
public class LoginMinLog implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id",type = IdType.AUTO)
private Long id;
private LocalDate loginDate;
private Long userId;
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,55 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 魅力榜单实时数据
*/
@Data
@TableName("cai_love_rank_today")
public class LoveRankToday implements Serializable {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 日期类型 1-日榜 2-周榜 3-月榜
*/
private Integer dataType;
/**
* 榜单期数
*/
private LocalDate rankTime;
/**
* 开始时间
*/
private LocalDate beginRankTime;
/**
* 结束时间
*/
private LocalDate endRankTime;
/**
* 数值
*/
private Long num;
/**
* 用户ID
*/
private Long userId;
/**
* 创建时间
*/
private LocalDateTime createTime;
}

View File

@@ -1,8 +1,10 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -50,5 +52,9 @@ public class OrderLogs implements Serializable {
private String success;
private LocalDateTime createTime;
@TableField(exist = false)
private LocalDateTime createTimeMin;
@TableField(exist = false)
private LocalDateTime createTimeMax;
}

View File

@@ -1,12 +1,19 @@
package com.ruoyi.cai.domain;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.utils.StringUtils;
import lombok.Data;
import org.apache.commons.collections.map.HashedMap;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
* 四方支付配置对象 cai_pay_trd_config
@@ -67,10 +74,28 @@ public class PayTrdConfig implements Serializable {
*/
private Integer deleteFlag;
private String extendData;
@TableField(exist = false)
private Map<String,String> extendMap;
private LocalDateTime createTime;
public String getProductId(boolean wx){
return wx?wxProductId:aliProductId;
}
public void refreshUpdateOrSave(){
if(extendMap != null){
this.extendData = JSON.toJSONString(extendMap);
}
}
public void refreshSelect(){
if(StringUtils.isNotBlank(extendData)){
this.extendMap = JSON.parseObject(this.extendData,Map.class);
}else{
this.extendMap = new HashMap<>();
}
}
}

View File

@@ -0,0 +1,83 @@
package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 用户积分分销对象 cai_point_record_log
*
* @author 77
* @date 2025-12-03
*/
@Data
@TableName("cai_point_record_log")
public class PointRecordLog implements Serializable{
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 积分
*/
private Long points;
/**
* 消费方用户
*/
private Long sourceUserId;
/**
* 消费方用户
*/
private String sourceUsercode;
/**
* 消费方用户
*/
private String sourcePhone;
/**
* 分销方
*/
private Long oneUserId;
/**
* 分销方
*/
private String oneUsercode;
/**
* 分销方
*/
private String onePhone;
/**
* 分销方提成比例
*/
private BigDecimal oneRate;
/**
* 分销方积分
*/
private Long onePoints;
/**
* 状态 -1-无须分销 0-待分销 1-已分销
*/
private Integer status;
/**
* 来源
*/
private String sourceType;
/**
* 来源ID
*/
private String sourceId;
/**
* 备注
*/
private String remark;
private LocalDateTime createTime;
}

View File

@@ -48,6 +48,8 @@ public class RechargeOrder implements Serializable {
* 1-充值余额 2-充值收益
*/
private Integer rechargeType;
private Long givePoint;
/**
* 价格
*/
@@ -83,6 +85,8 @@ public class RechargeOrder implements Serializable {
*/
private Boolean admin;
private Boolean distribution;
private Long adminId;
private String remark;

View File

@@ -41,6 +41,9 @@ public class UserInfo {
* 奖励好友充值的比率
*/
private BigDecimal payIncomeRate;
/**
*/
private BigDecimal pointRate;
/**
* 登录次数
*/

View File

@@ -0,0 +1,25 @@
package com.ruoyi.cai.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class AddPointAdminDto implements Serializable {
/**
* 员工ID
*/
private String usercode;
/**
* 调整的金额
*/
private Long point;
/**
* 是否参与分销
*/
private boolean distribution;
private String remark;
}

View File

@@ -19,6 +19,10 @@ public class AddRechargeOrderAdminDto {
* 调整的金额
*/
private Long rechargeCoin;
/**
* 是否参与分销
*/
private boolean distribution;
private String remark;
}

View File

@@ -0,0 +1,10 @@
package com.ruoyi.cai.dto.admin.vo;
import com.ruoyi.cai.domain.IpRecord;
import lombok.Data;
@Data
public class IpRecordAdminVO extends IpRecord {
private boolean black;
private Integer minNumber;
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.cai.dto.admin.vo.order;
import com.ruoyi.cai.domain.RechargeOrder;
import com.ruoyi.cai.dto.commom.consumer.RechargeConsumerResp;
import lombok.Data;
@Data
public class UpdateAdminRechargeOrderDTO {
private RechargeConsumerResp resp;
private RechargeOrder rechargeOrder;
}

View File

@@ -0,0 +1,12 @@
package com.ruoyi.cai.dto.app;
import lombok.Data;
import java.io.Serializable;
@Data
public class UploadFileResp implements Serializable {
private String token;
private String domain;
private String httpUrl;
}

View File

@@ -14,16 +14,20 @@ public class AnchorListQuery {
* 1-活跃查询
* 2-新人查询
* 3-同城查询
* 4-时长
* 5-魅力
* 6-附近
*/
@Schema(description = "类型 0-默认 1-活跃 2-新人 3-同城")
@Schema(description = "类型 0-默认 1-活跃 2-新人 3-同城 4-时长 5-魅力 6-附近")
private Integer type;
@Schema(hidden = true, description = "是否开启视频接听")
private Integer openVideoStatus;
@Schema(description = "金币搜索")
private Integer price;
@Schema(description = "城市(同城查询使用)")
private Integer cityId;
@Schema(hidden = true, description = "是否开启视频接听")
private Integer openVideoStatus;
@Schema(hidden = true)
private Integer onlineStatus;
@Schema(hidden = true)

View File

@@ -16,6 +16,11 @@ public class AnchorListVo {
@Schema(description = "在线状态 0=离线,1=在线")
private Integer online;
/**
* 服务时长(分钟)
*/
private Integer serviceTime;
@Schema(description = "用户ID")
private Long userId;
/**

View File

@@ -0,0 +1,22 @@
package com.ruoyi.cai.dto.app.vo.rank;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class RankNodeRecharge {
@Schema(description = "用户ID只有当前用户才有数据其他用户因为保密问题没有")
private Long userId;
@Schema(description = "头像")
private String avatar;
@Schema(description = "昵称")
private String nickname;
private BigDecimal money;
@Schema(description = "数值")
private Long value;
@Schema(description = "距离上一名差距")
private Long diffLastValue;
}

View File

@@ -15,4 +15,6 @@ public class AppHomeConfig {
private String servId = "4";
@Schema(description = "首页弹窗内容")
private String homeDialogText;
@Schema(description = "土豆客服账号")
private String tdKf;
}

View File

@@ -38,6 +38,8 @@ public class UserInfoVo {
@Schema(description = "评分")
private BigDecimal giveScore;
@Schema(description = "总时长")
private Long serviceTime;
/**
* 价格默认50彩币

View File

@@ -19,6 +19,7 @@ public class RechargeConsumerResp {
private Long rechargeCoin;
private Long userId;
private Long consumeLogId;
private Long pointLogId;
private Long traceId;
private boolean success;
}

View File

@@ -6,6 +6,7 @@ import lombok.Data;
public class MinUser {
private Long id;
private Integer gender;
private String mobile;
/**
* 隐身模式 0-关闭 1-打开
*/

View File

@@ -0,0 +1,16 @@
package com.ruoyi.cai.dto.proxy;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class BindUserListDTO {
private String usercode;
private String nickname;
private String avatar;
private Integer gender;
private LocalDateTime inviteTime;
private LocalDateTime inviteTimeMin;
private LocalDateTime inviteTimeMax;
}

View File

@@ -0,0 +1,46 @@
package com.ruoyi.cai.dto.proxy;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class OrderListDTO {
/**
* 价格
*/
private BigDecimal price;
/**
* 商品名称
*/
private String rechargeName;
/**
* 订单号
*/
private String orderNo;
/**
* 昵称
*/
private String nickname;
/**
* 头像
*/
private String avatar;
/**
* 用户号/ID号
*/
private String usercode;
private LocalDateTime payTime;
private LocalDateTime payTimeMin;
private LocalDateTime payTimeMax;
}

View File

@@ -0,0 +1,12 @@
package com.ruoyi.cai.dto.proxy;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ProxyTotalDTO {
private Long bindUserCount;
private BigDecimal priceSum;
}

View File

@@ -8,12 +8,18 @@ import lombok.Getter;
*/
@Getter
public enum ConsumeLogStatus {
NO(-1),
READY(0),
ALREADY(1);
NO(-1,"无需分销"),
READY(0,"待分销"),
ALREADY(1, "已分销");
private final Integer code;
private String text;
ConsumeLogStatus(Integer code) {
this.code = code;
}
ConsumeLogStatus(Integer code, String text) {
this.code = code;
this.text = text;
}
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.cai.enums;
import lombok.Getter;
@Getter
public enum DangerEnum {
PAY_SUCCESS,
PAY_ERROR
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.cai.enums;
import lombok.Getter;
@Getter
public enum PointLogType {
ORDER("充值触发"),
ADMIN("系统调整");
private String code;
PointLogType(String code) {
this.code = code;
}
}

View File

@@ -12,6 +12,7 @@ import lombok.Setter;
*/
@Getter
public enum SystemConfigEnum {
TD_KF("", "土豆客服账号",SystemConfigGroupEnum.BUSINESS),
RANK_LOVE_DAY_AWARD("13800,10800,8800,5800,3800,2800,2800,2800,2800,2800,2800", "魅力榜日榜前10名奖励", SystemConfigGroupEnum.BUSINESS, new NumberListSystemConfigCheck(10)),
RANK_LOVE_WEEK_AWARD("88800,58800,38800,28800,18800,13800,13800,13800,13800,13800,13800,13800", "魅力榜周榜前10名奖励",SystemConfigGroupEnum.BUSINESS, new NumberListSystemConfigCheck(10)),
RANK_INVITE_DAY_AWARD("13800,10800,8800,5800,3800,2800,2800,2800,2800,2800,2800", "邀请榜日榜前10名奖励",SystemConfigGroupEnum.BUSINESS,new NumberListSystemConfigCheck(10)),
@@ -68,6 +69,7 @@ public enum SystemConfigEnum {
DEFAULT_GIFT_INCOME_RATE("0.07", "默认分销上级礼物提成",SystemConfigGroupEnum.BUSINESS,new RateSystemConfigCheck()),
DEFAULT_GUARD_INCOME_RATE("0.07", "默认分销上级守护提成",SystemConfigGroupEnum.BUSINESS,new RateSystemConfigCheck()),
DEFAULT_PAY_INCOME_RATE("0.3", "默认分销上级充值提成",SystemConfigGroupEnum.BUSINESS,new RateSystemConfigCheck()),
DEFAULT_PAY_POINT_RATE("0.07", "默认分销上级充值的积分提成",SystemConfigGroupEnum.BUSINESS,new RateSystemConfigCheck()),
PAY_INCOME_RATE("0", "分销上级充值提成配置大于0数据后将强制使用该提成",SystemConfigGroupEnum.BUSINESS,new RateSystemConfigCheck()),
// @Deprecated
// DEFAULT_UNION_GIFT_INCOME_RATE("0.01", "默认工会礼物提成",SystemConfigGroupEnum.BUSINESS, new RateSystemConfigCheck()),
@@ -77,7 +79,7 @@ public enum SystemConfigEnum {
GREET_INTERVAL_MIN("30", "群打招呼的间隔时间(分钟)",SystemConfigGroupEnum.BUSINESS, new NumberSystemConfigCheck()),
ANCHOR_TOP_MIN("30", "小火箭置顶间隔时间(分钟)",SystemConfigGroupEnum.BUSINESS, new NumberSystemConfigCheck()),
OPEN_ALI_PAY("1", "是否开启四方支付宝支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_SOURCE_ALI_PAY("1", "是否开启原生支付宝支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_SOURCE_ALI_PAY("1", "是否开启原生支付宝支付(废弃)",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_WX_PAY("1", "是否开启微信支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
ALI_PAY_FIRST("1", "支付宝支付显示是否在前面",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_WITHDRAW("1", "是否开启提现功能",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
@@ -134,11 +136,15 @@ public enum SystemConfigEnum {
ANCHOR_JOIN_AGREEMENT("/#/agreement/anchor-join", "主播入驻协议地址",SystemConfigGroupEnum.SYSTEM),
PAY_CUSTOM("", "支付定向测试",SystemConfigGroupEnum.SYSTEM),
WS_SOCKET_URL("ws://localhost:8080/ws?token=%s&room_id=%s", "ws通讯地址",SystemConfigGroupEnum.SYSTEM),
OPEN_NOTICE("1", "是否开启告警",SystemConfigGroupEnum.SYSTEM, new BooleanSystemConfigCheck()),
PAY_ERROR_NUM_NOTICE("2", "连续调用支付失败N次发起告警",SystemConfigGroupEnum.SYSTEM, new NumberSystemConfigCheck()),
PAY_NOTIFY_ERROR_NUM_NOTICE("5", "连续调用N次支付但是依旧未支付成功发起告警",SystemConfigGroupEnum.SYSTEM, new NumberSystemConfigCheck()),
V12_PRIVATE_KEY_PATH("/home/server/api/sign/6888803128553.pfx", "V12德商私钥路径",SystemConfigGroupEnum.SYSTEM),
V12_PRIVATE_KEY_PASSWORD("926645", "V12德商私钥密码",SystemConfigGroupEnum.SYSTEM),
V12_XIAOCHENGXU_ORG_ID("gh_62790d4f9c57", "V12德商小程序原始id",SystemConfigGroupEnum.SYSTEM),
V12_XIAOCHENGXU_PATH("pages/zf/index?", "V12德商小程序页面路径",SystemConfigGroupEnum.SYSTEM),
V12_WX_APP_ID("wxae39c7eed3221d26", "微信开放平台ID",SystemConfigGroupEnum.SYSTEM),
UPLOAD_FILE_DOMAIN("http://127.0.0.1:8080", "文件上传域名服务器",SystemConfigGroupEnum.SYSTEM),
// 七牛云 ?imageView2/2/w/120/h/120
// 腾讯云 ?thumbnail=120y120&imageView
IM_ICON_SUFFIX("?thumbnail=120y120&imageView", "im头像后缀",SystemConfigGroupEnum.SYSTEM),

View File

@@ -13,6 +13,9 @@ public enum AnchorListQueryTypeEnum {
ACTIVE(1,"活跃查询"),
NEW(2,"新人查询"),
CITY(3,"同城查询"),
SERVICE_TIME(4,"时长"),
LOVE(5,"魅力"),
LOCATION(6,"附近"),
;
private final Integer code;
private final String text;

View File

@@ -7,6 +7,7 @@ import lombok.Getter;
public enum RankTypeEnum {
LOVE(1,"魅力榜"),
INVITE(2,"邀请榜"),
PAY(3,"土豪榜"),
;
private final Integer code;
private final String text;

View File

@@ -27,6 +27,7 @@ public class EncryptionFilter implements Filter {
IGNORE_URL.add("/api/pay/trd/notify/wx/*");
IGNORE_URL.add("/api/pay/trd/notify/ali/*");
IGNORE_URL.add("/api/pay/trd/notify/*");
IGNORE_URL.add("/api/pay/efps/wx");
}
private static final AntPathMatcher ANT_PATH_MATCHER = new AntPathMatcher();

View File

@@ -1,7 +1,10 @@
package com.ruoyi.cai.manager;
import com.ruoyi.cai.mapper.AccountMapper;
import com.ruoyi.cai.mapper.AnchorMapper;
import com.ruoyi.cai.service.AnchorService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@@ -13,15 +16,19 @@ public class AccountTotalManager {
@Resource
private AccountMapper accountMapper;
@Resource
private AnchorMapper anchorMapper;
public void incsGuardIncomeCoin(Long userId, Long amount, Long businessLogId){
log.info("开始收入统计 守护: userId={},amount={}, businessLogId={}", userId, amount, businessLogId);
accountMapper.incsGuardIncomeIcon(userId, amount);
anchorMapper.incsTotalIcon(userId,amount);
}
public void incsGiftIncomeCoin(Long userId, Long amount, Long businessLogId){
log.info("开始收入统计 礼物: userId={},amount={}, businessLogId={}", userId, amount, businessLogId);
accountMapper.incsGiftIncomeIcon(userId, amount);
anchorMapper.incsTotalIcon(userId,amount);
}
public void incsMessageIncomeCoin(Long userId, Long amount, Long businessLogId) {
@@ -32,10 +39,11 @@ public class AccountTotalManager {
public void incsVideoIncomeCoin(Long userId, Long amount, Long businessLogId) {
log.info("开始收入统计 视频: userId={},amount={}, businessLogId={}", userId, amount, businessLogId);
accountMapper.incsVideoIncomeIcon(userId, amount);
anchorMapper.incsTotalIcon(userId,amount);
}
public void incsPayIncomeCoin(Long userId, Long rechargeCoin, BigDecimal price, Long consumeLogId) {
log.info("开始收入统计 充值: userId={},price={},rechargeCoin={}, businessLogId={}", userId, price, rechargeCoin,consumeLogId);
log.info("开始用户充值统计 充值: userId={},price={},rechargeCoin={}, businessLogId={}", userId, price, rechargeCoin,consumeLogId);
accountMapper.incsPayTotal(userId, rechargeCoin, price);
}

View File

@@ -5,6 +5,8 @@ import com.ruoyi.cai.domain.Account;
import com.ruoyi.cai.domain.ConsumeLog;
import com.ruoyi.cai.domain.Gift;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.dto.AddRechargeOrderAdminDto;
import com.ruoyi.cai.dto.admin.vo.order.UpdateAdminRechargeOrderDTO;
import com.ruoyi.cai.dto.app.query.GiveGiftReq;
import com.ruoyi.cai.dto.app.query.GiveGuardReq;
import com.ruoyi.cai.dto.commom.consumer.GiftConsumerResp;
@@ -158,6 +160,29 @@ public class ConsumerManager {
@Autowired
private RankAdminManager rankAdminManager;
public RechargeConsumerResp rechargeOrderSuccessAdmin(AddRechargeOrderAdminDto dto){
UpdateAdminRechargeOrderDTO result = rechargeOrderService.updateAdminRechargeOrder(dto);
RechargeConsumerResp resp = result.getResp();
try {
amqpHttpProducer.sendCalculateSales(resp.getConsumeLogId()+"");
}catch (Exception e){
log.error("RabbitMq 发送失败, 充值分销流程流转失败!",e);
}
try {
Account account = accountService.getByUserId(resp.getUserId());
if(account != null){
Long totalCoin = account.getCoin() + account.getIncomeCoin();
yunxinHttpService.rechargeCoinSendMessage(resp.getUserId(), resp.getRechargeCoin(),totalCoin);
}
}catch (Exception e){
log.error("充值成功通知失败!",e);
}
return resp;
}
@Autowired
private PointRecordLogService pointRecordLogService;
public RechargeConsumerResp rechargeOrderSuccess(String tradeNo, Map<String,String> params, String appId, PayTypeEnum payTypeEnum){
RechargeConsumerResp resp = rechargeOrderService.orderSuccess(tradeNo,params,appId,payTypeEnum);
if(resp.isSuccess()){
@@ -176,6 +201,11 @@ public class ConsumerManager {
}catch (Exception e){
log.error("RabbitMq 发送失败, 充值分销流程流转失败!",e);
}
try {
pointRecordLogService.dealCalculateSales(resp.getPointLogId());
}catch (Exception e){
log.error("充值积分分销失败",e);
}
try {
// 记录用户的消费金额统计
accountTotalManager.incsPayIncomeCoin(resp.getUserId(), resp.getRechargeCoin(),resp.getPrice(), resp.getConsumeLogId());
@@ -183,7 +213,7 @@ public class ConsumerManager {
accountTotalManager.incsTrdPayIncomeCoin(resp.getUserId(), resp.getPrice());
}
}catch (Exception e){
log.error("主播消费记录失败-充值",e);
log.error("用户充值记录失败-充值",e);
}
try {
Account account = accountService.getByUserId(resp.getUserId());

View File

@@ -75,6 +75,9 @@ public class CurrentUserManager {
public CurrentUserInfoVo currentInfo() {
Long userId = LoginHelper.getUserId();
User user = userService.getById(userId);
if(user == null) {
return null;
}
CurrentUserInfoVo res = BeanConvertUtil.convertTo(user, CurrentUserInfoVo::new);
res.setUserId(userId);
Anchor anchor = anchorService.getByUserId(userId);

View File

@@ -0,0 +1,85 @@
package com.ruoyi.cai.manager;
import com.ruoyi.cai.enums.DangerEnum;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.trdpay.TrdPayTypeEnum;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.mapper.SysNoticeMapper;
import org.apache.commons.lang3.BooleanUtils;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class DangerManger {
@Autowired
private RedissonClient redissonClient;
@Autowired
private SystemConfigManager systemConfigManager;
@Resource
private SysNoticeMapper sysNoticeMapper;
public void resetDanger(DangerEnum dangerEnum, String businessCode) {
Boolean openNotice = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.OPEN_NOTICE);
if(BooleanUtils.isNotTrue(openNotice)){
return;
}
String key = String.format("%s:%s",dangerEnum.name(),businessCode);
redissonClient.getAtomicLong(key).set(0);
}
public void insDanger(DangerEnum dangerEnum, String businessCode) {
Boolean openNotice = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.OPEN_NOTICE);
if(BooleanUtils.isNotTrue(openNotice)){
return;
}
String key = String.format("%s:%s",dangerEnum.name(),businessCode);
long num = redissonClient.getAtomicLong(key).incrementAndGet();
if(dangerEnum == DangerEnum.PAY_ERROR){
Long payErrorNumNotice = systemConfigManager.getSystemConfigOfLong(SystemConfigEnum.PAY_ERROR_NUM_NOTICE);
if(num >= payErrorNumNotice && num%payErrorNumNotice == 0){
// 发通知
SysNotice sysNotice = new SysNotice();
String noticeTitle = String.format("【%s】连续调用支付失败超过%s可能出现支付通道异常需排查", businessCode, num);
sysNotice.setNoticeTitle(noticeTitle);
sysNotice.setNoticeType("3");
sysNotice.setBusinessType(DangerEnum.PAY_ERROR.name());
sysNotice.setNoticeContent(noticeTitle);
sysNotice.setStatus("0");
sysNoticeMapper.insert(sysNotice);
}
return;
}
if(dangerEnum == DangerEnum.PAY_SUCCESS){
Long payErrorNumNotice = systemConfigManager.getSystemConfigOfLong(SystemConfigEnum.PAY_NOTIFY_ERROR_NUM_NOTICE);
if(num >= payErrorNumNotice && num%payErrorNumNotice == 0){
// 发通知
SysNotice sysNotice = new SysNotice();
String noticeTitle = String.format("【%s】连续调用支付成功%s次但是未支付成功可能出现回调异常需排查", businessCode, num);
sysNotice.setNoticeTitle(noticeTitle);
sysNotice.setNoticeType("3");
sysNotice.setBusinessType(DangerEnum.PAY_SUCCESS.name());
sysNotice.setNoticeContent(noticeTitle);
sysNotice.setStatus("0");
sysNoticeMapper.insert(sysNotice);
}
return;
}
}
public void successPay(TrdPayTypeEnum typeEnum) {
this.insDanger(DangerEnum.PAY_SUCCESS,typeEnum.name()); // 支付成功计数
this.resetDanger(DangerEnum.PAY_ERROR,typeEnum.name()); // 清除支付失败计数
}
public void errorPay(TrdPayTypeEnum typeEnum) {
this.insDanger(DangerEnum.PAY_ERROR,typeEnum.name());
}
public void notifyPay(TrdPayTypeEnum typeEnum) {
this.resetDanger(DangerEnum.PAY_SUCCESS,typeEnum.name());
}
}

View File

@@ -0,0 +1,57 @@
package com.ruoyi.cai.manager;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.dto.proxy.BindUserListDTO;
import com.ruoyi.cai.dto.proxy.OrderListDTO;
import com.ruoyi.cai.dto.proxy.ProxyTotalDTO;
import com.ruoyi.cai.mapper.ConsumeLogMapper;
import com.ruoyi.cai.mapper.UserInviteMapper;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
@Component
public class ProxyUserManager {
@Autowired
private UserService userService;
@Resource
private ConsumeLogMapper consumeLogMapper;
@Resource
private UserInviteMapper userInviteMapper;
public IPage<OrderListDTO> orderLogList(String usercode,PageQuery pageQuery, OrderListDTO query){
User user = getUser(usercode);
return consumeLogMapper.selectProxyUserOrderPage(pageQuery.build(),user.getId(), query);
}
public IPage<BindUserListDTO> bindUserList(String userCode, PageQuery pageQuery, BindUserListDTO query) {
User user = getUser(userCode);
return userInviteMapper.selectProxyBindUserPage(pageQuery.build(),user.getId(),query);
}
public ProxyTotalDTO total(String userCode) {
User user = getUser(userCode);
BigDecimal priceSum = consumeLogMapper.sumProxyUserOrder(user.getId());
Long userCount = userInviteMapper.countProxyBindUser(user.getId());
ProxyTotalDTO proxyTotalDTO = new ProxyTotalDTO();
proxyTotalDTO.setBindUserCount(userCount == null ? 0 : userCount);
proxyTotalDTO.setPriceSum(priceSum == null ? BigDecimal.ZERO : priceSum);
return proxyTotalDTO;
}
private User getUser(String usercode){
User user = userService.getByUserCode(usercode);
if(user == null){
throw new ServiceException("您的后台账户未绑定APP账户请联系管理员操作");
}
return user;
}
}

View File

@@ -4,6 +4,7 @@ import com.ruoyi.cai.constant.RedisHttpConstant;
import com.ruoyi.cai.enums.SystemConfigEnum;
import com.ruoyi.cai.enums.systemconfig.SystemCheckResp;
import com.ruoyi.common.core.service.SensitiveService;
import com.ruoyi.common.helper.LoginHelper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -160,6 +161,10 @@ public class SystemConfigManager {
public void set(String key, String value) {
if(key.equals(SystemConfigEnum.SENSITIVE_ENABLE.getKey())){
Long userId = LoginHelper.getUserId();
if(!LoginHelper.isAdmin(userId)){
throw new RuntimeException("非超管无法修该配置");
}
sensitiveService.setSensitive(value.equals("1"));
}
redisTemplate.opsForHash().put(RedisHttpConstant.SYSTEM_CONFIG, key,value);

View File

@@ -0,0 +1,7 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.AccountDelete;
public interface AccountDeleteMapper extends BaseMapper<AccountDelete> {
}

View File

@@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.Account;
import com.ruoyi.cai.dto.admin.vo.AccountAdminVo;
import com.ruoyi.cai.dto.app.vo.rank.RankNodeRecharge;
import com.ruoyi.cai.rank.RankNode;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
* 用户账户Mapper接口
@@ -38,4 +41,10 @@ public interface AccountMapper extends BaseMapper<Account> {
void incsPayTotal(@Param("userId") Long userId, @Param("rechargeCoin") Long rechargeCoin, @Param("price") BigDecimal price);
void incsTrdPayTotal(@Param("userId") Long userId, @Param("price") BigDecimal price);
List<RankNodeRecharge> rankTotalPay(@Param("limit") int limit);
void incrPoint(@Param("userId") Long userId, @Param("point") Long point);
boolean decrPoint(@Param("userId") Long userId, @Param("point") Long point);
}

View File

@@ -30,4 +30,6 @@ public interface AnchorMapper extends BaseMapper<Anchor> {
boolean incsServiceTimeAndCount(@Param("toUid") Long toUid, @Param("callTime") Long callTime, @Param("count") int count);
List<AnchorStatusDTO> anchorStatus(@Param("userList") Set<Long> userList);
void incsTotalIcon(@Param("userId") Long userId, @Param("amount") Long amount);
}

View File

@@ -1,7 +1,12 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.cai.domain.ConsumeLog;
import com.ruoyi.cai.dto.proxy.OrderListDTO;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
/**
* 消费记录Mapper接口
@@ -10,5 +15,9 @@ import com.ruoyi.cai.domain.ConsumeLog;
* @date 2023-12-24
*/
public interface ConsumeLogMapper extends BaseMapper<ConsumeLog> {
IPage<OrderListDTO> selectProxyUserOrderPage(@Param("page") IPage<OrderListDTO> page,
@Param("proxyUserId") Long proxyUserId,
@Param("query") OrderListDTO query);
BigDecimal sumProxyUserOrder(@Param("userId") Long userId);
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.IpBlack;
/**
* ip黑名单Mapper接口
*
* @author ruoyi
* @date 2025-12-05
*/
public interface IpBlackMapper extends BaseMapper<IpBlack> {
}

View File

@@ -0,0 +1,19 @@
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.IpRecord;
import com.ruoyi.cai.dto.admin.vo.IpRecordAdminVO;
import org.apache.ibatis.annotations.Param;
/**
* ip访问记录Mapper接口
*
* @author ruoyi
* @date 2025-12-05
*/
public interface IpRecordMapper extends BaseMapper<IpRecord> {
IPage<IpRecordAdminVO> pageAdmin(Page<Object> build, @Param("bo") IpRecordAdminVO bo);
}

View File

@@ -0,0 +1,7 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.LoginMinLog;
public interface LoginMinLogMapper extends BaseMapper<LoginMinLog> {
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.LoveRankToday;
import com.ruoyi.cai.dto.app.query.index.AnchorListQuery;
import com.ruoyi.cai.dto.app.vo.AnchorListVo;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
public interface LoveRankTodayMapper extends BaseMapper<LoveRankToday> {
void insRank(@Param("id") Long id, @Param("value") Long value);
Page<AnchorListVo> homePage(Page<Object> build, @Param("query") AnchorListQuery query, @Param("monday") LocalDate monday);
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.cai.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cai.domain.PointRecordLog;
/**
* 用户积分分销Mapper接口
*
* @author 77
* @date 2025-12-03
*/
public interface PointRecordLogMapper extends BaseMapper<PointRecordLog> {
}

View File

@@ -1,11 +1,13 @@
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.UserInvite;
import com.ruoyi.cai.dto.admin.vo.UserInviteAdminVo;
import com.ruoyi.cai.dto.app.dto.InviteCountDTO;
import com.ruoyi.cai.dto.app.vo.user.UserListVo;
import com.ruoyi.cai.dto.proxy.BindUserListDTO;
import org.apache.ibatis.annotations.Param;
/**
@@ -24,4 +26,8 @@ public interface UserInviteMapper extends BaseMapper<UserInvite> {
Page<UserInviteAdminVo> pageAdmin(@Param("build") Page<Object> build, @Param("bo") UserInviteAdminVo bo);
void incsCoinTotal(@Param("id") Long id, @Param("amount") Long amount);
IPage<BindUserListDTO> selectProxyBindUserPage(Page<Object> build, @Param("userId") Long userId, @Param("query") BindUserListDTO query);
Long countProxyBindUser(@Param("userId") Long userId);
}

View File

@@ -11,6 +11,7 @@ import com.ruoyi.cai.mapper.UserFollowMapper;
import com.ruoyi.cai.mq.CommonConsumerEnum;
import com.ruoyi.cai.mq.handle.dto.LoginNotifyDTO;
import com.ruoyi.cai.notice.YunxinHttpService;
import com.ruoyi.cai.service.LoginMinLogService;
import com.ruoyi.cai.service.UserInfoService;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.common.utils.ip.AddressUtils;
@@ -40,6 +41,8 @@ public class LoginNotifyHandle implements IHandle {
private UserService userService;
@Autowired
private RedissonClient redissonClient;
@Autowired
private LoginMinLogService loginMinLogService;
@Override
public void run(String message) {
@@ -52,6 +55,11 @@ public class LoginNotifyHandle implements IHandle {
this.updateUserInfoSB(loginNotify.getUserId(),loginNotify.getClientIP(),loginNotify.getImei());
}
}
try {
loginMinLogService.saveData(loginNotify);
}catch (Exception e){
log.error(e.getMessage(),e);
}
// 上线通知
String loginNoticeFansLock = LockManager.getLoginNoticeFansLock(loginNotify.getUserId());
RBucket<String> bucket = redissonClient.getBucket(loginNoticeFansLock);
@@ -59,6 +67,7 @@ public class LoginNotifyHandle implements IHandle {
if(boo){
sendOnlineNotice(loginNotify.getUserId());
}
}
@Resource

View File

@@ -1,9 +1,12 @@
package com.ruoyi.cai.mq.handle;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.cai.enums.rank.RankDataTypeEnum;
import com.ruoyi.cai.enums.rank.RankTypeEnum;
import com.ruoyi.cai.mq.CommonConsumerEnum;
import com.ruoyi.cai.mq.handle.dto.RankNotifyDTO;
import com.ruoyi.cai.rank.RankManager;
import com.ruoyi.cai.service.LoveRankTodayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -14,10 +17,15 @@ public class RankNotifyHandle implements IHandle {
@Autowired
private RankManager rankManager;
@Autowired
private LoveRankTodayService loveRankTodayService;
@Override
public void run(String message) {
RankNotifyDTO rank = JSON.parseObject(message, RankNotifyDTO.class);
rankManager.addRank(rank);
if(RankTypeEnum.LOVE.getCode().equals(rank.getRankType())){
loveRankTodayService.addRank(rank);
}
}
@Override

View File

@@ -14,12 +14,14 @@ import com.ruoyi.cai.service.AccountService;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.cai.util.CaiDateUtil;
import com.ruoyi.cai.util.CaiNumUtil;
import com.ruoyi.cai.ws.constant.RedisConstant;
import com.ruoyi.yunxin.YunExecutor;
import com.ruoyi.yunxin.Yunxin;
import com.ruoyi.yunxin.resp.SendMsgResp;
import com.ruoyi.yunxin.resp.YxCommonR;
import com.ruoyi.yunxin.resp.YxDataR;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -43,6 +45,8 @@ public class YunxinHttpService {
private CaiProperties caiProperties;
@Autowired
private UserService userService;
@Autowired
private RedissonClient redissonClient;
/**
* 注册赠送消息
@@ -247,14 +251,34 @@ public class YunxinHttpService {
});
}
private boolean checkFollowedSendMessage(Long toUid,
User followUser){
String key = String.format(RedisConstant.START_SEND_MESSAGE_CACHE, toUid);
Object o = redissonClient.getMap(key).get(followUser.getId());
return o != null;
}
private void setFollowedSendMessage(Long toUid,User followUser){
String key = String.format(RedisConstant.START_SEND_MESSAGE_CACHE, toUid);
redissonClient.getMap(key).put(followUser.getId(),1);
}
/**
* 关注发送消息
* @param toUid
* @param toUid 接收消息的用户
*/
public void followedSendMessage(Long toUid,
User followUser,
LocalDateTime followTime){
YunExecutor.YUN_EXECUTOR.execute(() -> {
// 检测是否发送过通知
boolean checked = checkFollowedSendMessage(toUid, followUser);
if(checked){
log.error("用户已经发送过关注通知,无需再次发送 被关注人id:{}, 关注人id{} 昵称:{} 编号:{}",
toUid, followUser.getId(), followUser.getNickname(),followUser.getUsercode());
return;
}
SendFollowNoticeData data = new SendFollowNoticeData();
data.setUserid(followUser.getId());
data.setNickname(followUser.getNickname());
@@ -268,6 +292,7 @@ public class YunxinHttpService {
if(r == null || !r.isSuccess()){
log.error("云信发送失败【sendCallAsync】r={}", JSON.toJSONString(r));
}
this.setFollowedSendMessage(toUid, followUser);
});
}

View File

@@ -12,6 +12,7 @@ import com.ijpay.core.enums.SignType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.ijpay.wxpay.model.OrderQueryModel;
import com.ruoyi.cai.domain.Goods;
import com.ruoyi.cai.domain.PayConfig;
import com.ruoyi.cai.domain.RechargeOrder;
import com.ruoyi.cai.domain.VipOrder;
@@ -21,10 +22,7 @@ import com.ruoyi.cai.dto.commom.consumer.RechargeConsumerResp;
import com.ruoyi.cai.manager.AwardManager;
import com.ruoyi.cai.manager.ConsumerManager;
import com.ruoyi.cai.pay.model.PayQueryModel;
import com.ruoyi.cai.service.PayConfigService;
import com.ruoyi.cai.service.PayTotalService;
import com.ruoyi.cai.service.RechargeOrderService;
import com.ruoyi.cai.service.VipOrderService;
import com.ruoyi.cai.service.*;
import com.ruoyi.common.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -51,6 +49,8 @@ public class PayManager {
private PayConfigService payConfigService;
@Autowired
private PayConfigManager payConfigManager;
@Autowired
private GoodsService goodsService;
public PayQueryModel queryOrder(PayConfig payConfig,String orderNo,String appid) throws AlipayApiException {
if(PayTypeEnum.ALI.getCode().equals(payConfig.getPayType())){
@@ -161,7 +161,7 @@ public class PayManager {
}
}
public PayOrderInfoDTO getOrderInfo(String orderNo){
public PayOrderInfoDTO getOrderInfo(String orderNo,boolean wx){
OrderTypeEnum orderTypeEnum = OrderNoUtil.getType(orderNo);
if(orderTypeEnum == null){
log.error("订单类型有误orderNo={}",orderNo);
@@ -184,6 +184,7 @@ public class PayManager {
dto.setOrderNo(vipOrder.getOrderNo());
dto.setAppid(vipOrder.getAppid());
dto.setPlatformType(vipOrder.getPlatformType());
dto.setSubjectId(vipOrder.getVipId()+"");
break;
case RECHARGE_ORDER_SUB:
RechargeOrder rechargeOrder = rechargeOrderService.getByOrderNo(orderNo);
@@ -193,6 +194,16 @@ public class PayManager {
if(!PayStatusEnum.READY_PAY.getCode().equals(rechargeOrder.getPayStatus())){
throw new ServiceException("订单状态有误,请重新下单支付");
}
if(wx){
if(rechargeOrder.getRechargeId() != null){
Goods goods = goodsService.getById(rechargeOrder.getRechargeId());
if(goods != null){
rechargeOrderService.update(Wrappers.lambdaUpdate(RechargeOrder.class)
.eq(RechargeOrder::getId, rechargeOrder.getId())
.set(RechargeOrder::getRechargeCoin, goods.getWxAmount()));
}
}
}
dto = new PayOrderInfoDTO();
dto.setBody(rechargeOrder.getRechargeName());
dto.setSubject(rechargeOrder.getRechargeName());
@@ -200,6 +211,7 @@ public class PayManager {
dto.setOrderNo(rechargeOrder.getOrderNo());
dto.setAppid(rechargeOrder.getAppid());
dto.setPlatformType(rechargeOrder.getPlatformType());
dto.setSubjectId(rechargeOrder.getRechargeId()+"");
break;
default:
break;

View File

@@ -9,15 +9,21 @@ import java.math.BigDecimal;
public class PayOrderInfoDTO {
private String body;
private String subject;
private String subjectId;
private BigDecimal price;
private String orderNo;
private String appid;
private String platformType;
private String openId;
public String getPriceFenStr(){
return NumberUtil.mul(price,100).longValue()+"";
}
public Long getPriceFen(){
return NumberUtil.mul(price,100).longValue();
}
public String getPriceYuanStr(){
return price.toString();
}

View File

@@ -1,15 +1,23 @@
package com.ruoyi.cai.pay;
import com.ruoyi.cai.trdpay.handle.v12new.utils.JacksonUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class PayReturnResp {
private String data;
@Schema(description = "H5,APP")
@Schema(description = "H5,APP,DESAN,EFPS")
private String appType;
private String payType;
public static PayReturnResp createEfps(Object data){
PayReturnResp resp = new PayReturnResp();
resp.setData(JacksonUtil.objToJson(data));
resp.setAppType("EFPS");
resp.setPayType("EFPS");
return resp;
}
public static PayReturnResp createDesan(String data){
PayReturnResp resp = new PayReturnResp();

View File

@@ -0,0 +1,9 @@
package com.ruoyi.cai.pay;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@Data
public class V14PayDTO {
private String wx_code;
}

View File

@@ -0,0 +1,29 @@
package com.ruoyi.cai.pay;
import com.ruoyi.cai.trdpay.dto.v14.wechatJSAPI.WxJsapiParam;
import com.ruoyi.common.core.domain.R;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class V14R<T> extends R<T> {
private WxJsapiParam wxJsapiParam;
public static <T> V14R<T> fail14(int code, String msg) {
return restResult14(null, code, msg);
}
private static <T> V14R<T> restResult14(T data, int code, String msg) {
V14R<T> r = new V14R<>();
r.setCode(code);
r.setData(data);
r.setMsg(msg);
return r;
}
public static <T> V14R<T> ok14(T data) {
return restResult14(data, SUCCESS, "操作成功");
}
}

View File

@@ -2,10 +2,7 @@ package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.Account;
import com.ruoyi.cai.domain.ConsumeLog;
import com.ruoyi.cai.domain.Gift;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.dto.admin.vo.AccountAdminVo;
import com.ruoyi.cai.dto.video.VideoSettleResp;
import com.ruoyi.cai.dto.video.WithholdingFeeUserResp;
@@ -34,8 +31,12 @@ public interface AccountService extends IService<Account> {
void withdrawFail(Long userId, Long incomeCoin, Long traceId);
PointRecordLog rechargePoint(RechargeOrder rechargeOrder, User user);
void recharge(ConsumeLog consumeLog);
void rechargeAdminIgnoreAccount(ConsumeLog consumeLog);
Page<AccountAdminVo> pageAdmin(PageQuery pageQuery, AccountAdminVo bo);
boolean distribution(ConsumeLog consumeLog, Long userId, Long amount, AccountChangeCodeEnum accountChangeEnum);

View File

@@ -0,0 +1,17 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.IpBlack;
/**
* ip黑名单Service接口
*
* @author ruoyi
* @date 2025-12-05
*/
public interface IpBlackService extends IService<IpBlack> {
Boolean checkIp(String clientIP);
void saveIp(IpBlack ipBlack);
}

View File

@@ -0,0 +1,19 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.IpRecord;
import com.ruoyi.cai.dto.admin.vo.IpRecordAdminVO;
import com.ruoyi.common.core.domain.PageQuery;
/**
* ip访问记录Service接口
*
* @author ruoyi
* @date 2025-12-05
*/
public interface IpRecordService extends IService<IpRecord> {
IPage<IpRecordAdminVO> pageAdmin(IpRecordAdminVO bo, PageQuery pageQuery);
void saveLoginIp(String clientIP);
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.LoginMinLog;
import com.ruoyi.cai.mq.handle.dto.LoginNotifyDTO;
public interface LoginMinLogService extends IService<LoginMinLog> {
void saveData(LoginNotifyDTO loginNotify);
}

View File

@@ -0,0 +1,38 @@
package com.ruoyi.cai.service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.LoginMinLog;
import com.ruoyi.cai.mapper.LoginMinLogMapper;
import com.ruoyi.cai.mq.handle.dto.LoginNotifyDTO;
import com.ruoyi.cai.util.IdLockManager;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
@Service
public class LoginMinLogServiceImpl extends ServiceImpl<LoginMinLogMapper, LoginMinLog> implements LoginMinLogService {
@Override
public void saveData(LoginNotifyDTO loginNotify) {
LocalDate now = loginNotify.getHappenTime().toLocalDate();
boolean exists = this.exists(Wrappers.lambdaQuery(LoginMinLog.class)
.eq(LoginMinLog::getLoginDate, now)
.eq(LoginMinLog::getUserId, loginNotify.getUserId()));
if(exists){
return;
}
String lockKey = String.format("loginMinLog:%s", loginNotify.getUserId());
IdLockManager.executeWithLock(lockKey, () -> {
boolean existsF = this.exists(Wrappers.lambdaQuery(LoginMinLog.class)
.eq(LoginMinLog::getLoginDate, now)
.eq(LoginMinLog::getUserId, loginNotify.getUserId()));
if(existsF){
return;
}
LoginMinLog log = new LoginMinLog();
log.setLoginDate(now);
log.setUserId(loginNotify.getUserId());
this.save(log);
});
}
}

Some files were not shown because too many files have changed in this diff Show More