diff --git a/doc/123.txt b/doc/123.txt index 80e6230e..5b104170 100644 --- a/doc/123.txt +++ b/doc/123.txt @@ -1,2 +1,14 @@ 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 diff --git a/doc/20251021.sql b/doc/20251021.sql new file mode 100644 index 00000000..cb5c6639 --- /dev/null +++ b/doc/20251021.sql @@ -0,0 +1,2 @@ +ALTER TABLE sys_user + ADD COLUMN `bind_user_code` varchar(20); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/proxy/ProxyUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/proxy/ProxyUserController.java new file mode 100644 index 00000000..dac357bb --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/proxy/ProxyUserController.java @@ -0,0 +1,75 @@ +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.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 orderLogList(PageQuery pageQuery, OrderListDTO query) { + String userCode = getBindUserCode(); + IPage orderListDTOIPage = proxyUserManager.orderLogList(userCode, pageQuery,query); + return TableDataInfo.build(orderListDTOIPage); + } + + @GetMapping("/bindUserList") + @SaCheckPermission("cai:proxyUser:bindUserList") + public TableDataInfo bindUserList(PageQuery pageQuery, BindUserListDTO query) { + String userCode = getBindUserCode(); + IPage data = proxyUserManager.bindUserList(userCode, pageQuery, query); + return TableDataInfo.build(data); + } + + @GetMapping("/proxyTotal") + @SaCheckRole("proxy") + public R 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 RuntimeException("您的后台账户未绑定APP账户,请联系管理员操作"); + } + return sysUser.getBindUserCode(); + } + +} diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 202cd0d6..a567a265 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -20,7 +20,7 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://124.222.254.188:4306/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_wanyan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true username: root password: tyYrk487R4y7FENM # 从库数据源 diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java index 403ea873..6b56e72a 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java @@ -48,7 +48,10 @@ public class OrderLogsController extends BaseController { */ @GetMapping("/list") public TableDataInfo list(OrderLogs bo, PageQuery pageQuery) { - Page page = orderLogsService.page(pageQuery.build(), Wrappers.lambdaQuery(OrderLogs.class).orderByDesc(OrderLogs::getCreateTime)); + Page 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); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java index 060d2607..a1d5735c 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java @@ -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; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/BindUserListDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/BindUserListDTO.java new file mode 100644 index 00000000..a515ff18 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/BindUserListDTO.java @@ -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; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/OrderListDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/OrderListDTO.java new file mode 100644 index 00000000..73709162 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/OrderListDTO.java @@ -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; + + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/ProxyTotalDTO.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/ProxyTotalDTO.java new file mode 100644 index 00000000..5f27c6fb --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/proxy/ProxyTotalDTO.java @@ -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; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java index e8518dd0..1d4f1577 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java @@ -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); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ProxyUserManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ProxyUserManager.java new file mode 100644 index 00000000..aa63c87d --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ProxyUserManager.java @@ -0,0 +1,56 @@ +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 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 orderLogList(String usercode,PageQuery pageQuery, OrderListDTO query){ + User user = getUser(usercode); + return consumeLogMapper.selectProxyUserOrderPage(pageQuery.build(),user.getUsercode(), query); + } + + public IPage 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.getUsercode()); + 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 RuntimeException("您的后台账户未绑定APP账户,请联系管理员操作"); + } + return user; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/ConsumeLogMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/ConsumeLogMapper.java index 0f2d5486..f938057b 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/ConsumeLogMapper.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/ConsumeLogMapper.java @@ -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 { + IPage selectProxyUserOrderPage(@Param("page") IPage page, + @Param("proxyUserCode") String proxyUserCode, + @Param("query") OrderListDTO query); + BigDecimal sumProxyUserOrder(@Param("userCode") String userCode); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserInviteMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserInviteMapper.java index 5517dee9..0e679607 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserInviteMapper.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/UserInviteMapper.java @@ -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 { Page pageAdmin(@Param("build") Page build, @Param("bo") UserInviteAdminVo bo); void incsCoinTotal(@Param("id") Long id, @Param("amount") Long amount); + + IPage selectProxyBindUserPage(Page build, @Param("userId") Long userId, @Param("query") BindUserListDTO query); + + Long countProxyBindUser(@Param("userId") Long userId); } diff --git a/ruoyi-cai/src/main/resources/mapper/cai/ConsumeLogMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/ConsumeLogMapper.xml index c2dcd8d1..6f2c9c69 100644 --- a/ruoyi-cai/src/main/resources/mapper/cai/ConsumeLogMapper.xml +++ b/ruoyi-cai/src/main/resources/mapper/cai/ConsumeLogMapper.xml @@ -4,41 +4,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/ruoyi-cai/src/main/resources/mapper/cai/UserInviteMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/UserInviteMapper.xml index 787a1c3d..e195df7d 100644 --- a/ruoyi-cai/src/main/resources/mapper/cai/UserInviteMapper.xml +++ b/ruoyi-cai/src/main/resources/mapper/cai/UserInviteMapper.xml @@ -56,5 +56,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by t1.create_time desc + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 3196e9ec..4eeac59b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -158,6 +158,8 @@ public class SysUser extends BaseEntity { @TableField(exist = false) private Long roleId; + private String bindUserCode; + public SysUser(Long userId) { this.userId = userId; } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index e73e715d..0b200c60 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -21,6 +21,7 @@ + @@ -65,6 +66,7 @@ u.create_by, u.create_time, u.remark, + u.bind_user_code, d.dept_id, d.parent_id, d.ancestors, @@ -85,7 +87,7 @@