Browse Source

Merge branch 'milestone-20250727-金币重构三期' of http://39.101.133.168:8807/huangqizhen/gold-java into milestone-20250727-金币重构三期

lihuilin/hotfix-20250810160509-余额地区传参
lihuilin 2 weeks ago
parent
commit
38d27c189f
  1. 2
      src/main/java/com/example/demo/DemoApplication.java
  2. 5
      src/main/java/com/example/demo/Export/ExportService.java
  3. 44
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  4. 2
      src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java
  5. 54
      src/main/java/com/example/demo/config/Mysql4DataSourceConfig.java
  6. 54
      src/main/java/com/example/demo/config/Mysql5DataSourceConfig.java
  7. 13
      src/main/java/com/example/demo/controller/bean/BeanAuditController.java
  8. 39
      src/main/java/com/example/demo/controller/coin/ExportController.java
  9. 37
      src/main/java/com/example/demo/domain/DTO/ArticleDTO.java
  10. 37
      src/main/java/com/example/demo/domain/DTO/FanDTO.java
  11. 20
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java
  12. 14
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java
  13. 22
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java
  14. 15
      src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java
  15. 1
      src/main/java/com/example/demo/domain/vo/bean/GoldBean.java
  16. 20
      src/main/java/com/example/demo/mapper/live/LiveMapper.java
  17. 3
      src/main/java/com/example/demo/service/bean/BeanAuditService.java
  18. 2
      src/main/java/com/example/demo/service/coin/ExportExcelService.java
  19. 38
      src/main/java/com/example/demo/service/listen/ArticleListener.java
  20. 40
      src/main/java/com/example/demo/service/listen/FanListener.java
  21. 33
      src/main/java/com/example/demo/serviceImpl/bean/BeanAuditServiceImpl.java
  22. 23
      src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java
  23. 29
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  24. 2
      src/main/resources/application-prod.yml
  25. 16
      src/main/resources/application.yml
  26. 2
      src/main/resources/jindouMapper/BeanConsumeMapper.xml
  27. 24
      src/main/resources/liveMapper/LiveMapper.xml

2
src/main/java/com/example/demo/DemoApplication.java

@ -10,6 +10,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@MapperScan(basePackages = "com.example.demo.mapper.coin", sqlSessionTemplateRef = "mysql1SqlSessionTemplate") @MapperScan(basePackages = "com.example.demo.mapper.coin", sqlSessionTemplateRef = "mysql1SqlSessionTemplate")
@MapperScan(basePackages = "com.example.demo.mapper.bean", sqlSessionTemplateRef = "mysql2SqlSessionTemplate") @MapperScan(basePackages = "com.example.demo.mapper.bean", sqlSessionTemplateRef = "mysql2SqlSessionTemplate")
@MapperScan(basePackages = "com.example.demo.mapper.pay", sqlSessionTemplateRef = "mysql3SqlSessionTemplate") @MapperScan(basePackages = "com.example.demo.mapper.pay", sqlSessionTemplateRef = "mysql3SqlSessionTemplate")
@MapperScan(basePackages = "com.example.demo.mapper.cms", sqlSessionTemplateRef = "mysql4SqlSessionTemplate")
@MapperScan(basePackages = "com.example.demo.mapper.live", sqlSessionTemplateRef = "mysql5SqlSessionTemplate")
public class DemoApplication { public class DemoApplication {
public static void main(String[] args) { public static void main(String[] args) {

5
src/main/java/com/example/demo/Export/ExportService.java

@ -20,5 +20,8 @@ public interface ExportService {
Result addExportConsume(ConsumeDTO dto); Result addExportConsume(ConsumeDTO dto);
//金豆直播导出 //金豆直播导出
Result addExportLive(LiveDTO dto); Result addExportLive(LiveDTO dto);
//金豆粉丝导出
Result addExportFan(FanDTO dto);
//金豆文章导出
Result addExportArticle(ArticleDTO dto);
} }

44
src/main/java/com/example/demo/Export/ExportServiceImpl.java

@ -1,10 +1,7 @@
package com.example.demo.Export; package com.example.demo.Export;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.domain.DTO.ConsumeDTO;
import com.example.demo.domain.DTO.LiveDTO;
import com.example.demo.domain.DTO.RechargeDTO;
import com.example.demo.domain.DTO.RefundDTO;
import com.example.demo.domain.DTO.*;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.exception.SystemException; import com.example.demo.exception.SystemException;
@ -107,6 +104,11 @@ public class ExportServiceImpl implements ExportService {
liveDTO.setUrl(""); liveDTO.setUrl("");
liveDTO.setFileName(generateFileName("直播明细", adminName)); liveDTO.setFileName(generateFileName("直播明细", adminName));
liveDTO.setDataNum(0); liveDTO.setDataNum(0);
} else if (dto instanceof FanDTO fanDTO) {
fanDTO.setAccount(Integer.valueOf(account));
fanDTO.setUrl("");
fanDTO.setFileName(generateFileName("铁粉明细", adminName));
fanDTO.setDataNum(0);
} }
} }
@ -154,6 +156,26 @@ public class ExportServiceImpl implements ExportService {
liveDTO.getFileName(), liveDTO.getFileName(),
liveDTO.getDataNum() liveDTO.getDataNum()
); );
} else if (dto instanceof FanDTO fanDTO) {
goldDetailMapper.insertExportRecord(
idHolder,
account,
fanDTO.getType(),
fanDTO.getState(),
fanDTO.getUrl(),
fanDTO.getFileName(),
fanDTO.getDataNum()
);
} else if (dto instanceof ArticleDTO articleDTO) {
goldDetailMapper.insertExportRecord(
idHolder,
account,
articleDTO.getType(),
articleDTO.getState(),
articleDTO.getUrl(),
articleDTO.getFileName(),
articleDTO.getDataNum()
);
} }
} }
@ -174,6 +196,10 @@ public class ExportServiceImpl implements ExportService {
requestData.put(requestDataKey, consumeDTO.getConsumeUser()); requestData.put(requestDataKey, consumeDTO.getConsumeUser());
} else if(dto instanceof LiveDTO liveDTO){ } else if(dto instanceof LiveDTO liveDTO){
requestData.put(requestDataKey, liveDTO.getBeanConsumeLive()); requestData.put(requestDataKey, liveDTO.getBeanConsumeLive());
} else if (dto instanceof FanDTO fanDTO) {
requestData.put(requestDataKey, fanDTO.getBeanConsumeFan());
} else if (dto instanceof ArticleDTO articleDTO) {
requestData.put(requestDataKey, articleDTO.getBeanConsumeArticle());
} }
exportData.put("requestData", requestData); exportData.put("requestData", requestData);
@ -209,4 +235,14 @@ public class ExportServiceImpl implements ExportService {
public Result addExportLive(LiveDTO dto) { public Result addExportLive(LiveDTO dto) {
return addExport(dto, "直播明细", "live:queue:export_queue", "beanConsumeLive"); return addExport(dto, "直播明细", "live:queue:export_queue", "beanConsumeLive");
} }
@Override
public Result addExportFan(FanDTO dto) {
return addExport(dto, "铁粉明细", "fan:queue:export_queue", "beanConsumeFan");
}
@Override
public Result addExportArticle(ArticleDTO dto) {
return addExport(dto, "文章明细", "article:queue:export_queue", "beanConsumeArticle");
}
} }

2
src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java

@ -20,7 +20,7 @@ public class Mysql3DataSourceConfig {
@Bean(name = "mysql3DataSource") @Bean(name = "mysql3DataSource")
@ConfigurationProperties(prefix = "spring.datasource.mysql3") @ConfigurationProperties(prefix = "spring.datasource.mysql3")
public DataSource mysql2DataSource() {
public DataSource mysql3DataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build(); return DataSourceBuilder.create().type(HikariDataSource.class).build();
} }
@Bean(name = "mysql3SqlSessionFactory") @Bean(name = "mysql3SqlSessionFactory")

54
src/main/java/com/example/demo/config/Mysql4DataSourceConfig.java

@ -0,0 +1,54 @@
package com.example.demo.config;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
/**
* @program: gold-java
* @ClassName Mysql4DataSourceConfig
* @description:
* @author: Ethan
* @create: 202508-01 17:12
* @Version 1.0
**/
@Slf4j
@Configuration
public class Mysql4DataSourceConfig {
@Bean(name = "mysql4DataSource")
@ConfigurationProperties(prefix = "spring.datasource.mysql4")
public DataSource mysql4DataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean(name = "mysql4SqlSessionFactory")
// @Primary
public SqlSessionFactory mysql4SqlSessionFactory(@Qualifier("mysql4DataSource") DataSource dataSource,
@Qualifier("globalConfiguration4") org.apache.ibatis.session.Configuration globalConfiguration4) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:payMapper/*.xml"));
sessionFactory.setConfiguration(globalConfiguration4);
return sessionFactory.getObject();
}
@Bean(name = "mysql4SqlSessionTemplate")
// @Primary
public SqlSessionTemplate mysql4SqlSessionTemplate(@Qualifier("mysql4SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration.mysql4")
public org.apache.ibatis.session.Configuration globalConfiguration4() {
return new org.apache.ibatis.session.Configuration();
}
}

54
src/main/java/com/example/demo/config/Mysql5DataSourceConfig.java

@ -0,0 +1,54 @@
package com.example.demo.config;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
/**
* @program: gold-java
* @ClassName Mysql5DataSourceConfig
* @description:
* @author: Ethan
* @create: 202508-01 17:17
* @Version 1.0
**/
@Slf4j
@Configuration
public class Mysql5DataSourceConfig {
@Bean(name = "mysql5DataSource")
@ConfigurationProperties(prefix = "spring.datasource.mysql5")
public DataSource mysql5DataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean(name = "mysql5SqlSessionFactory")
// @Primary
public SqlSessionFactory mysql5SqlSessionFactory(@Qualifier("mysql5DataSource") DataSource dataSource,
@Qualifier("globalConfiguration5") org.apache.ibatis.session.Configuration globalConfiguration5) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:liveMapper/*.xml"));
sessionFactory.setConfiguration(globalConfiguration5);
return sessionFactory.getObject();
}
@Bean(name = "mysql5SqlSessionTemplate")
// @Primary
public SqlSessionTemplate mysql5SqlSessionTemplate(@Qualifier("mysql5SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration.mysql5")
public org.apache.ibatis.session.Configuration globalConfiguration5() {
return new org.apache.ibatis.session.Configuration();
}
}

13
src/main/java/com/example/demo/controller/bean/BeanAuditController.java

@ -1,6 +1,8 @@
package com.example.demo.controller.bean; package com.example.demo.controller.bean;
import com.example.demo.domain.vo.bean.BeanAuditInfo; import com.example.demo.domain.vo.bean.BeanAuditInfo;
import com.example.demo.domain.vo.bean.BeanRechargeInfo;
import com.example.demo.domain.vo.bean.GoldBean;
import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.bean.BeanAuditService; import com.example.demo.service.bean.BeanAuditService;
@ -73,4 +75,15 @@ public class BeanAuditController {
return Result.error("更新失败,查看id"); return Result.error("更新失败,查看id");
} }
} }
//金豆统计
@PostMapping("/statsBean")
public Result statsBean(@RequestBody BeanAuditInfo beanAuditInfo) {
try {
GoldBean goldBean = beanAuditService.statsBean(beanAuditInfo);
return Result.success(goldBean);
} catch (Exception e) {
return Result.error("请检查数据的格式");
}
}
} }

39
src/main/java/com/example/demo/controller/coin/ExportController.java

@ -3,10 +3,7 @@ package com.example.demo.controller.coin;
import com.example.demo.Util.BusinessException; import com.example.demo.Util.BusinessException;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.RedisLockUtil; import com.example.demo.Util.RedisLockUtil;
import com.example.demo.domain.DTO.ConsumeDTO;
import com.example.demo.domain.DTO.LiveDTO;
import com.example.demo.domain.DTO.RechargeDTO;
import com.example.demo.domain.DTO.RefundDTO;
import com.example.demo.domain.DTO.*;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export; import com.example.demo.domain.entity.Export;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
@ -118,4 +115,38 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportFan")
public Result export(@Valid @RequestBody FanDTO dto){
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportFan(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
@PostMapping("/exportArticle")
public Result export(@Valid @RequestBody ArticleDTO dto){
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportArticle(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
} }

37
src/main/java/com/example/demo/domain/DTO/ArticleDTO.java

@ -0,0 +1,37 @@
package com.example.demo.domain.DTO;
import com.example.demo.domain.vo.bean.BeanConsumeArticle;
import com.example.demo.domain.vo.bean.BeanConsumeFan;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName ArticleDTO
* @description:
* @author: huangqizhen
* @create: 202508-01 17:33
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class ArticleDTO {
private String token;
private String url = "";
private String fileName = "";
private Integer sort = 0;
private String field = "";
private Integer account;
private Integer type = 7; //类型
private Integer state = 0; //状态
private String text = ""; //关键词搜索
private Integer dataNum = 0;
private String deptid = "";
@NotNull(message = "page不能为空")
private Integer page = 1;
@NotNull(message = "pageSize不能为空")
private Integer pageSize = 20;
private BeanConsumeArticle beanConsumeArticle;
}

37
src/main/java/com/example/demo/domain/DTO/FanDTO.java

@ -0,0 +1,37 @@
package com.example.demo.domain.DTO;
import com.example.demo.domain.vo.bean.BeanConsumeFan;
import com.example.demo.domain.vo.bean.BeanConsumeLive;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName FanDTO
* @description:
* @author: huangqizhen
* @create: 202508-01 15:45
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class FanDTO {
private String token;
private String url = "";
private String fileName = "";
private Integer sort = 0;
private String field = "";
private Integer account;
private Integer type = 7; //类型
private Integer state = 0; //状态
private String text = ""; //关键词搜索
private Integer dataNum = 0;
private String deptid = "";
@NotNull(message = "page不能为空")
private Integer page = 1;
@NotNull(message = "pageSize不能为空")
private Integer pageSize = 20;
private BeanConsumeFan beanConsumeFan;
}

20
src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java

@ -1,5 +1,7 @@
package com.example.demo.domain.vo.bean; package com.example.demo.domain.vo.bean;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;
@ -20,22 +22,40 @@ import java.util.Date;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeArticle { public class BeanConsumeArticle {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ExcelProperty("姓名")
private String name; //姓名 private String name; //姓名
@ExcelProperty("精网号")
private Integer jwcode; //精网号 private Integer jwcode; //精网号
@ExcelProperty("地区/分部")
private String dept; //地区/分部 private String dept; //地区/分部
@ExcelProperty("类型")
private String type; //类型source_type 910打赏11付费 private String type; //类型source_type 910打赏11付费
@ExcelIgnore
private Integer payMode; // 0 打赏 1 付费 2 其他 private Integer payMode; // 0 打赏 1 付费 2 其他
@ExcelProperty("金豆数量")
private String beanNum; //金豆数量 private String beanNum; //金豆数量
@ExcelProperty("付费金豆数量")
private Integer buyBean; //付费金豆
@ExcelProperty("免费金豆数量")
private Integer freeBean; //免费金豆
private Integer articleId; //文章/视频ID private Integer articleId; //文章/视频ID
@ExcelProperty("文章/视频标题")
private String articleName; //文章/视频标题source_name private String articleName; //文章/视频标题source_name
@ExcelProperty("作者")
private String author; //作者 private String author; //作者
@ExcelProperty("支付类型")
private String payType; //支付类型 1-5:直播 7铁粉 8文章 private String payType; //支付类型 1-5:直播 7铁粉 8文章
@ExcelIgnore
private String sortField; //排序字段 private String sortField; //排序字段
@ExcelIgnore
private String sortOrder; //排序顺序 private String sortOrder; //排序顺序
@ExcelProperty("付费时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date consumeTime; // 付费时间 时间戳转化 private Date consumeTime; // 付费时间 时间戳转化
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间 private Date startTime; // 开始时间
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间 private Date endTime; // 结束时间
} }

14
src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java

@ -1,5 +1,7 @@
package com.example.demo.domain.vo.bean; package com.example.demo.domain.vo.bean;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;
@ -20,19 +22,31 @@ import java.util.Date;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeFan { public class BeanConsumeFan {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ExcelProperty("姓名")
private String name; //姓名 private String name; //姓名
@ExcelProperty("精网号")
private Integer jwcode; //精网号 private Integer jwcode; //精网号
@ExcelProperty("地区/分部")
private String dept; //地区/分部 private String dept; //地区/分部
@ExcelProperty("金豆数量")
private String beanNum; //金豆数量 private String beanNum; //金豆数量
@ExcelProperty("频道名称")
private String channel; //频道名称source_name private String channel; //频道名称source_name
@ExcelProperty("消费方式")
private String type; //类型source_type 单月连续包月 private String type; //类型source_type 单月连续包月
@ExcelProperty("支付方式")
private Integer payType; //支付方式直播12345铁粉7文章8 private Integer payType; //支付方式直播12345铁粉7文章8
@ExcelIgnore
private String sortField; //排序字段 private String sortField; //排序字段
@ExcelIgnore
private String sortOrder; //排序顺序 private String sortOrder; //排序顺序
@ExcelProperty("消费时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date consumeTime; // 消费时间 时间戳转化 private Date consumeTime; // 消费时间 时间戳转化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
@ExcelIgnore
private Date startTime; // 开始时间 private Date startTime; // 开始时间
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间 private Date endTime; // 结束时间
} }

22
src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java

@ -1,5 +1,8 @@
package com.example.demo.domain.vo.bean; package com.example.demo.domain.vo.bean;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;
@ -21,23 +24,42 @@ import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeLive { public class BeanConsumeLive {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ExcelProperty("姓名")
private String name; //姓名 private String name; //姓名
@ExcelProperty("精网号")
private Integer jwcode; //精网号 private Integer jwcode; //精网号
@ExcelProperty("地区/分部")
private String dept; //地区/分部 private String dept; //地区/分部
//类型 直播 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕 //类型 直播 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕
//文章 1. 打赏2. 付费 //文章 1. 打赏2. 付费
@ExcelProperty("类型")
private String type; //类型 private String type; //类型
@ExcelProperty("礼物名称")
private String gift; //礼物名称 private String gift; //礼物名称
@ExcelProperty("金豆数量")
private String beanNum; //金豆数量 private String beanNum; //金豆数量
@ExcelProperty("频道名称")
private String liveChannel; //频道名称截取content private String liveChannel; //频道名称截取content
@ExcelProperty("免费金豆")
private String freeBean; //免费金豆
@ExcelProperty("付费金豆")
private String buyBean; //付费金豆
@ExcelProperty("直播名称")
private String liveName; //直播间名称 private String liveName; //直播间名称
@ExcelProperty("消费时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date consumeTime; // 消费时间 时间戳转化 private Date consumeTime; // 消费时间 时间戳转化
@ExcelProperty("支付方式")
private Integer payType; //支付方式直播12345铁粉7文章8 private Integer payType; //支付方式直播12345铁粉7文章8
@ExcelIgnore
private String sortField; //排序字段 private String sortField; //排序字段
@ExcelIgnore
private String sortOrder; //排序顺序 private String sortOrder; //排序顺序
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间 private Date startTime; // 开始时间
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间 private Date endTime; // 结束时间
} }

15
src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java

@ -1,5 +1,6 @@
package com.example.demo.domain.vo.bean; package com.example.demo.domain.vo.bean;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@ -22,21 +23,31 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
public class BeanRechargeInfo { public class BeanRechargeInfo {
private Long id;//id private Long id;//id
@ExcelProperty("精网号")
private Integer jwcode; // 精网号 private Integer jwcode; // 精网号
@ExcelProperty("客户姓名")
private String name; // 姓名 private String name; // 姓名
@ExcelProperty("所属地区")
private String market; // 所属地区 private String market; // 所属地区
@ExcelProperty("免费金豆")
private Integer freeBean; // 免费豆 private Integer freeBean; // 免费豆
@ExcelProperty("永久金豆")
private Integer permanentBean; // 永久豆 private Integer permanentBean; // 永久豆
@ExcelProperty("金额")
private Double money; // 金额 private Double money; // 金额
@ExcelProperty("数量")
private Integer num; // 数量 private Integer num; // 数量
private Double amount; // 金额
@ExcelProperty("订单号")
private String orderNo; // 订单号 private String orderNo; // 订单号
@ExcelProperty("备注")
private String remark; //备注 private String remark; //备注
@ExcelProperty("充值平台")
private String platform; // 充值平台 private String platform; // 充值平台
@ExcelProperty("充值时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date rechargeTime; // 充值时间 private Date rechargeTime; // 充值时间
private Integer time;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime; // 开始时间 private Date startTime; // 开始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")

1
src/main/java/com/example/demo/domain/vo/bean/GoldBean.java

@ -21,4 +21,5 @@ public class GoldBean {
private Integer permanentBean; // 永久豆 private Integer permanentBean; // 永久豆
private Double money; // 金额 private Double money; // 金额
private Integer beanNum; // 豆数量 private Integer beanNum; // 豆数量
private Integer num; // 订单数
} }

20
src/main/java/com/example/demo/mapper/live/LiveMapper.java

@ -0,0 +1,20 @@
package com.example.demo.mapper.live;
import com.example.demo.domain.vo.bean.BeanConsumeLive;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @program: gold-java
* @ClassName liveMapper
* @description:
* @author: Ethan
* @create: 202508-01 17:20
* @Version 1.0
**/
@Mapper
public interface LiveMapper {
List<BeanConsumeLive> selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive);
}

3
src/main/java/com/example/demo/service/bean/BeanAuditService.java

@ -2,6 +2,7 @@ package com.example.demo.service.bean;
import com.example.demo.domain.vo.bean.BeanAuditInfo; import com.example.demo.domain.vo.bean.BeanAuditInfo;
import com.example.demo.domain.vo.bean.BeanRechargeInfo; import com.example.demo.domain.vo.bean.BeanRechargeInfo;
import com.example.demo.domain.vo.bean.GoldBean;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -21,4 +22,6 @@ public interface BeanAuditService {
Result updateStatus1(Long id); Result updateStatus1(Long id);
void updateStatus2(Long id); void updateStatus2(Long id);
GoldBean statsBean(BeanAuditInfo beanAuditInfo);
} }

2
src/main/java/com/example/demo/service/coin/ExportExcelService.java

@ -24,6 +24,8 @@ public interface ExportExcelService {
Exception refundExcel(String message) throws Exception; Exception refundExcel(String message) throws Exception;
Exception LiveExcel(String message) throws Exception; Exception LiveExcel(String message) throws Exception;
Exception FanExcel(String message) throws Exception;
Exception ArticleExcel(String message) throws Exception;
List<Export> getExcel(Export export); List<Export> getExcel(Export export);
@Transactional @Transactional

38
src/main/java/com/example/demo/service/listen/ArticleListener.java

@ -0,0 +1,38 @@
package com.example.demo.service.listen;
import com.example.demo.Util.RedisUtil;
import com.example.demo.service.coin.ExportExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static org.ehcache.core.exceptions.StorePassThroughException.handleException;
/**
* @program: GOLD
* @ClassName ArticleListener
* @description:
* @author: huangqizhen
* @create: 202508-01 17:45
* @Version 1.0
**/
@Component
public class ArticleListener extends BaseMessageListener<String> {
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public ArticleListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "article:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.ArticleExcel(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

40
src/main/java/com/example/demo/service/listen/FanListener.java

@ -0,0 +1,40 @@
package com.example.demo.service.listen;
import com.example.demo.Util.RedisUtil;
import com.example.demo.service.coin.ExportExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static org.ehcache.core.exceptions.StorePassThroughException.handleException;
/**
* @program: GOLD
* @ClassName FanListener
* @description:
* @author: huangqizhen
* @create: 202508-01 16:49
* @Version 1.0
**/
@Component
public class FanListener extends BaseMessageListener<String> {
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public FanListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "fan:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.FanExcel(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

33
src/main/java/com/example/demo/serviceImpl/bean/BeanAuditServiceImpl.java

@ -2,6 +2,7 @@ package com.example.demo.serviceImpl.bean;
import com.example.demo.domain.vo.bean.BeanAuditInfo; import com.example.demo.domain.vo.bean.BeanAuditInfo;
import com.example.demo.domain.vo.bean.BeanRechargeInfo; import com.example.demo.domain.vo.bean.BeanRechargeInfo;
import com.example.demo.domain.vo.bean.GoldBean;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.coin.BeanAuditMapper; import com.example.demo.mapper.coin.BeanAuditMapper;
import com.example.demo.service.bean.BeanAuditService; import com.example.demo.service.bean.BeanAuditService;
@ -95,4 +96,36 @@ public class BeanAuditServiceImpl implements BeanAuditService {
public void updateStatus2(Long id) { public void updateStatus2(Long id) {
beanAuditMapper.updateStatus2(id); beanAuditMapper.updateStatus2(id);
} }
@Override
public GoldBean statsBean(BeanAuditInfo beanAuditInfo) {
GoldBean gold = new GoldBean();
List<BeanAuditInfo> beanAuditInfos = beanAuditMapper.selectBy(beanAuditInfo);
// 初始化累加器
int permanentGoldSum = 0;
int freeGoldSum = 0;
int num = 0;
// 遍历充值记录并累加金币
for (BeanAuditInfo info : beanAuditInfos) {
// 累加永久金币
if (info.getPermanentBean() != null) {
permanentGoldSum += info.getPermanentBean();
}
// 累加免费金币
if (info.getFreeBean() != null) {
freeGoldSum += info.getFreeBean();
}
num++;
}
// 将累加结果设置到Gold对象
gold.setPermanentBean(permanentGoldSum);
gold.setFreeBean(freeGoldSum);
gold.setNum(num);
gold.setBeanNum(permanentGoldSum + freeGoldSum);
return gold;
}
} }

23
src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java

@ -6,6 +6,7 @@ import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.RechargeAudit; import com.example.demo.domain.vo.coin.RechargeAudit;
import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.domain.vo.coin.RechargeUser;
import com.example.demo.mapper.bean.BeanConsumeMapper; import com.example.demo.mapper.bean.BeanConsumeMapper;
import com.example.demo.mapper.live.LiveMapper;
import com.example.demo.service.bean.BeanConsumeService; import com.example.demo.service.bean.BeanConsumeService;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -25,33 +26,35 @@ import java.util.List;
@Service @Service
public class BeanConsumeServiceImpl implements BeanConsumeService { public class BeanConsumeServiceImpl implements BeanConsumeService {
@Autowired @Autowired
private BeanConsumeMapper BeanConsumeMapper;
private BeanConsumeMapper beanConsumeMapper;
@Autowired
private LiveMapper liveMapper;
//获取消费用户分部 //获取消费用户分部
@Override @Override
public List<String> getDept() { public List<String> getDept() {
List<String> deptList = BeanConsumeMapper.getDept();
List<String> deptList = beanConsumeMapper.getDept();
return deptList; return deptList;
} }
//筛选查询直播消费 //筛选查询直播消费
@Override @Override
public Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive) { public Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive) {
PageHelper.startPage(pageNum, pageSize); PageHelper.startPage(pageNum, pageSize);
List<BeanConsumeLive> beanConsumeLives = BeanConsumeMapper.selectLiveBy(beanConsumeLive);
List<BeanConsumeLive> beanConsumeLives = liveMapper.selectLiveBy(beanConsumeLive);
return new PageInfo<>(beanConsumeLives); return new PageInfo<>(beanConsumeLives);
} }
//筛选查询铁粉消费 //筛选查询铁粉消费
@Override @Override
public Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan) { public Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan) {
PageHelper.startPage(pageNum, pageSize); PageHelper.startPage(pageNum, pageSize);
List<BeanConsumeFan> beanConsumeFans = BeanConsumeMapper.selectFanBy(beanConsumeFan);
List<BeanConsumeFan> beanConsumeFans = beanConsumeMapper.selectFanBy(beanConsumeFan);
return new PageInfo<>(beanConsumeFans); return new PageInfo<>(beanConsumeFans);
} }
//筛选查询文章消费 //筛选查询文章消费
@Override @Override
public Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle) { public Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle) {
PageHelper.startPage(pageNum, pageSize); PageHelper.startPage(pageNum, pageSize);
List<BeanConsumeArticle> beanConsumeArticles = BeanConsumeMapper.selectArticleBy(beanConsumeArticle);
List<BeanConsumeArticle> beanConsumeArticles = beanConsumeMapper.selectArticleBy(beanConsumeArticle);
return new PageInfo<>(beanConsumeArticles); return new PageInfo<>(beanConsumeArticles);
} }
@ -61,13 +64,13 @@ public class BeanConsumeServiceImpl implements BeanConsumeService {
Integer payType = page.getPayType(); Integer payType = page.getPayType();
if (payType==1) { if (payType==1) {
//直播消费合计 //直播消费合计
gold = BeanConsumeMapper.selectSumLiveBy(page.getBeanConsumeLive());
gold = beanConsumeMapper.selectSumLiveBy(page.getBeanConsumeLive());
}else if (payType==7) { }else if (payType==7) {
//充值消费合计 //充值消费合计
gold = BeanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan());
gold = beanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan());
}else if (payType==8) { }else if (payType==8) {
//文章消费合计 //文章消费合计
gold = BeanConsumeMapper.selectSumArticleBy(page.getBeanConsumeArticle());
gold = beanConsumeMapper.selectSumArticleBy(page.getBeanConsumeArticle());
} }
return gold; return gold;
@ -76,11 +79,11 @@ public class BeanConsumeServiceImpl implements BeanConsumeService {
@Override @Override
public List<String> getLiveGift() { public List<String> getLiveGift() {
return BeanConsumeMapper.getLiveGift();
return beanConsumeMapper.getLiveGift();
} }
//查询直播全部频道 //查询直播全部频道
@Override @Override
public List<String> getLiveChannel() { public List<String> getLiveChannel() {
return BeanConsumeMapper.getLiveChannel();
return beanConsumeMapper.getLiveChannel();
} }
} }

29
src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java

@ -15,7 +15,10 @@ import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export; import com.example.demo.domain.entity.Export;
import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.User;
import com.example.demo.domain.export.Goldmingxi; import com.example.demo.domain.export.Goldmingxi;
import com.example.demo.domain.vo.bean.BeanConsumeArticle;
import com.example.demo.domain.vo.bean.BeanConsumeFan;
import com.example.demo.domain.vo.bean.BeanConsumeLive; import com.example.demo.domain.vo.bean.BeanConsumeLive;
import com.example.demo.domain.vo.coin.*; import com.example.demo.domain.vo.coin.*;
import com.example.demo.mapper.coin.ExportMapper; import com.example.demo.mapper.coin.ExportMapper;
@ -149,6 +152,28 @@ public class ExportExcelServiceImpl implements ExportExcelService {
} }
@Override @Override
public Exception FanExcel(String message) throws Exception {
return exportExcelGeneric(message, "fanUser", page -> {
try {
return beanConsumeController.selectFanBy(page);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
@Override
public Exception ArticleExcel(String message) throws Exception {
return exportExcelGeneric(message, "articleUser", page -> {
try {
return beanConsumeController.selectArticleBy(page);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
@Override
public List<Export> getExcel(Export export) { public List<Export> getExcel(Export export) {
List<Export> list = exportMapper.getExportRecord(export.getAccount(),export.getType()); List<Export> list = exportMapper.getExportRecord(export.getAccount(),export.getType());
System.out.println(list+"-------------------------------"); System.out.println(list+"-------------------------------");
@ -349,6 +374,10 @@ public class ExportExcelServiceImpl implements ExportExcelService {
return RefundUser.class; return RefundUser.class;
case "liveUser": case "liveUser":
return BeanConsumeLive.class; return BeanConsumeLive.class;
case "fanUser":
return BeanConsumeFan.class;
case "articleUser":
return BeanConsumeArticle.class;
default: default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType); throw new IllegalArgumentException("不支持的导出类型: " + exportType);
} }

2
src/main/resources/application-prod.yml

@ -57,7 +57,7 @@ bean:
url: http://47.92.148.30:3003/mock/61/hljw/api/user/gold url: http://47.92.148.30:3003/mock/61/hljw/api/user/gold
server: server:
port: 8081
port: 10704
logging: logging:
level: level:

16
src/main/resources/application.yml

@ -30,6 +30,22 @@ spring:
hikari: hikari:
pool-name: mysql3HikariCP pool-name: mysql3HikariCP
maximum-pool-size: 10 maximum-pool-size: 10
mysql4:
jdbc-url: jdbc:mysql://39.101.133.168:3306/cms?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&allowMultiQueries=true&rewriteBatchedStatements=true
username: cms
password: AF42R3ib6YkFaemm
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
pool-name: mysql3HikariCP
maximum-pool-size: 10
mysql5:
jdbc-url: jdbc:mysql://39.101.133.168:3306/live?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&allowMultiQueries=true&rewriteBatchedStatements=true
username: live
password: p4jMAMShNM8HTrbX
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
pool-name: mysql5HikariCP
maximum-pool-size: 10
sqlserver1: sqlserver1:
jdbc-url: jdbc:sqlserver://52.76.43.43:1433;databaseName=hwhcGold;encrypt=true;sslProtocol=TLSv1;trustServerCertificate=true; jdbc-url: jdbc:sqlserver://52.76.43.43:1433;databaseName=hwhcGold;encrypt=true;sslProtocol=TLSv1;trustServerCertificate=true;
username: hwhc_gold_query username: hwhc_gold_query

2
src/main/resources/jindouMapper/BeanConsumeMapper.xml

@ -201,6 +201,8 @@
fm.dept, fm.dept,
fyr.source_type AS type, fyr.source_type AS type,
fyr.money AS beanNum, fyr.money AS beanNum,
fyr.money_free AS freeBean,
fyr.money_buy AS buyBean,
fyr.source_id AS articleId, fyr.source_id AS articleId,
fyr.source_name AS articleName, fyr.source_name AS articleName,
(SELECT fm2.nickname (SELECT fm2.nickname

24
src/main/resources/liveMapper/LiveMapper.xml

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.live.LiveMapper">
<select id="selectLiveBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeLive">
select mi.name as name,
lgg.jwcode as jwcode,
mi.deptName as dept,
lg.name as gift,
lgg.gold_beans as beanNum,
lgg.gold_free as freeBean,
lgg.gold_buy as buyBean,
lp.title as liveChannel,
l.name as liveName,
lgg.created_at as consumeTime
from live_give_gifts lgg
left join member_info mi on mi.jwcode = lgg.jwcode
left join live_gifts lg on lg.id = lgg.g_id
left join live l on l.id = lgg.live_id
left join live_pindao lp on lp.id = l.channel_id
</select>
</mapper>
Loading…
Cancel
Save