diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java index c10b006..9ab3517 100644 --- a/src/main/java/com/example/demo/DemoApplication.java +++ b/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.bean", sqlSessionTemplateRef = "mysql2SqlSessionTemplate") @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 static void main(String[] args) { diff --git a/src/main/java/com/example/demo/Export/ExportService.java b/src/main/java/com/example/demo/Export/ExportService.java index 6fc145c..6e77ea5 100644 --- a/src/main/java/com/example/demo/Export/ExportService.java +++ b/src/main/java/com/example/demo/Export/ExportService.java @@ -20,5 +20,8 @@ public interface ExportService { Result addExportConsume(ConsumeDTO dto); //金豆直播导出 Result addExportLive(LiveDTO dto); - + //金豆粉丝导出 + Result addExportFan(FanDTO dto); + //金豆文章导出 + Result addExportArticle(ArticleDTO dto); } diff --git a/src/main/java/com/example/demo/Export/ExportServiceImpl.java b/src/main/java/com/example/demo/Export/ExportServiceImpl.java index b89460b..5af6232 100644 --- a/src/main/java/com/example/demo/Export/ExportServiceImpl.java +++ b/src/main/java/com/example/demo/Export/ExportServiceImpl.java @@ -1,10 +1,7 @@ package com.example.demo.Export; 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.vo.coin.Result; import com.example.demo.exception.SystemException; @@ -107,6 +104,11 @@ public class ExportServiceImpl implements ExportService { liveDTO.setUrl(""); liveDTO.setFileName(generateFileName("直播明细", adminName)); 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.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()); } else if(dto instanceof LiveDTO liveDTO){ 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); @@ -209,4 +235,14 @@ public class ExportServiceImpl implements ExportService { public Result addExportLive(LiveDTO dto) { 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"); + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java b/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java index d04f212..9a857b7 100644 --- a/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java +++ b/src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java @@ -20,7 +20,7 @@ public class Mysql3DataSourceConfig { @Bean(name = "mysql3DataSource") @ConfigurationProperties(prefix = "spring.datasource.mysql3") - public DataSource mysql2DataSource() { + public DataSource mysql3DataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "mysql3SqlSessionFactory") diff --git a/src/main/java/com/example/demo/config/Mysql4DataSourceConfig.java b/src/main/java/com/example/demo/config/Mysql4DataSourceConfig.java new file mode 100644 index 0000000..9ba65a8 --- /dev/null +++ b/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: 2025−08-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(); + } +} diff --git a/src/main/java/com/example/demo/config/Mysql5DataSourceConfig.java b/src/main/java/com/example/demo/config/Mysql5DataSourceConfig.java new file mode 100644 index 0000000..cfa9005 --- /dev/null +++ b/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: 2025−08-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(); + } +} diff --git a/src/main/java/com/example/demo/controller/bean/BeanAuditController.java b/src/main/java/com/example/demo/controller/bean/BeanAuditController.java index 4ee2860..98f89bb 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanAuditController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanAuditController.java @@ -1,6 +1,8 @@ package com.example.demo.controller.bean; 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.Result; import com.example.demo.service.bean.BeanAuditService; @@ -73,4 +75,15 @@ public class BeanAuditController { 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("请检查数据的格式"); + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/ExportController.java b/src/main/java/com/example/demo/controller/coin/ExportController.java index fdb397c..c3b85bc 100644 --- a/src/main/java/com/example/demo/controller/coin/ExportController.java +++ b/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.JWTUtil; 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.Export; import com.example.demo.domain.vo.coin.Result; @@ -118,4 +115,38 @@ public class ExportController { 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); + } + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/DTO/ArticleDTO.java b/src/main/java/com/example/demo/domain/DTO/ArticleDTO.java new file mode 100644 index 0000000..c5853e0 --- /dev/null +++ b/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: 2025−08-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; +} diff --git a/src/main/java/com/example/demo/domain/DTO/FanDTO.java b/src/main/java/com/example/demo/domain/DTO/FanDTO.java new file mode 100644 index 0000000..d917fec --- /dev/null +++ b/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: 2025−08-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; +} diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java index 01a33d1..b4cda50 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java @@ -1,5 +1,7 @@ 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.JsonIgnoreProperties; import lombok.Data; @@ -20,22 +22,40 @@ import java.util.Date; @JsonIgnoreProperties(ignoreUnknown = true) public class BeanConsumeArticle { private static final long serialVersionUID = 1L; + @ExcelProperty("姓名") private String name; //姓名 + @ExcelProperty("精网号") private Integer jwcode; //精网号 + @ExcelProperty("地区/分部") private String dept; //地区/分部 + @ExcelProperty("类型") private String type; //类型source_type 9、10打赏,11付费 + @ExcelIgnore private Integer payMode; // 0 打赏 1 付费 2 其他 + @ExcelProperty("金豆数量") private String beanNum; //金豆数量 + @ExcelProperty("付费金豆数量") + private Integer buyBean; //付费金豆 + @ExcelProperty("免费金豆数量") + private Integer freeBean; //免费金豆 private Integer articleId; //文章/视频ID + @ExcelProperty("文章/视频标题") private String articleName; //文章/视频标题(source_name) + @ExcelProperty("作者") private String author; //作者 + @ExcelProperty("支付类型") private String payType; //支付类型 1-5:直播 7铁粉 8文章 + @ExcelIgnore private String sortField; //排序字段 + @ExcelIgnore private String sortOrder; //排序顺序 + @ExcelProperty("付费时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date consumeTime; // 付费时间 (时间戳转化) + @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date startTime; // 开始时间 + @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date endTime; // 结束时间 } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java index 636a00c..1273187 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java @@ -1,5 +1,7 @@ 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.JsonIgnoreProperties; import lombok.Data; @@ -20,19 +22,31 @@ import java.util.Date; @JsonIgnoreProperties(ignoreUnknown = true) public class BeanConsumeFan { private static final long serialVersionUID = 1L; + @ExcelProperty("姓名") private String name; //姓名 + @ExcelProperty("精网号") private Integer jwcode; //精网号 + @ExcelProperty("地区/分部") private String dept; //地区/分部 + @ExcelProperty("金豆数量") private String beanNum; //金豆数量 + @ExcelProperty("频道名称") private String channel; //频道名称(source_name) + @ExcelProperty("消费方式") private String type; //类型source_type 单月,连续包月 + @ExcelProperty("支付方式") private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) + @ExcelIgnore private String sortField; //排序字段 + @ExcelIgnore private String sortOrder; //排序顺序 + @ExcelProperty("消费时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date consumeTime; // 消费时间 (时间戳转化) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + @ExcelIgnore private Date startTime; // 开始时间 + @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date endTime; // 结束时间 } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java index 9dc736f..4a75311 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java @@ -1,5 +1,8 @@ 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.JsonIgnoreProperties; import lombok.Data; @@ -21,23 +24,42 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) public class BeanConsumeLive { private static final long serialVersionUID = 1L; + @ExcelProperty("姓名") private String name; //姓名 + @ExcelProperty("精网号") private Integer jwcode; //精网号 + @ExcelProperty("地区/分部") private String dept; //地区/分部 //类型 直播: 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕 //文章: 1. 打赏2. 付费 + @ExcelProperty("类型") + private String type; //类型 + @ExcelProperty("礼物名称") private String gift; //礼物名称 + @ExcelProperty("金豆数量") private String beanNum; //金豆数量 + @ExcelProperty("频道名称") private String liveChannel; //频道名称(截取content) + @ExcelProperty("免费金豆") + private String freeBean; //免费金豆 + @ExcelProperty("付费金豆") + private String buyBean; //付费金豆 + @ExcelProperty("直播名称") private String liveName; //直播间名称 + @ExcelProperty("消费时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date consumeTime; // 消费时间 (时间戳转化) + @ExcelProperty("支付方式") private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) + @ExcelIgnore private String sortField; //排序字段 + @ExcelIgnore private String sortOrder; //排序顺序 + @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date startTime; // 开始时间 + @ExcelIgnore @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date endTime; // 结束时间 } diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java index ddd5372..6dc7101 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java @@ -1,5 +1,6 @@ package com.example.demo.domain.vo.bean; +import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; @@ -22,21 +23,31 @@ import java.util.List; @AllArgsConstructor public class BeanRechargeInfo { + private Long id;//id + @ExcelProperty("精网号") private Integer jwcode; // 精网号 + @ExcelProperty("客户姓名") private String name; // 姓名 + @ExcelProperty("所属地区") private String market; // 所属地区 + @ExcelProperty("免费金豆") private Integer freeBean; // 免费豆 + @ExcelProperty("永久金豆") private Integer permanentBean; // 永久豆 + @ExcelProperty("金额") private Double money; // 金额 + @ExcelProperty("数量") private Integer num; // 数量 - private Double amount; // 金额 + @ExcelProperty("订单号") private String orderNo; // 订单号 + @ExcelProperty("备注") private String remark; //备注 + @ExcelProperty("充值平台") private String platform; // 充值平台 + @ExcelProperty("充值时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date rechargeTime; // 充值时间 - private Integer time; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date startTime; // 开始时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") diff --git a/src/main/java/com/example/demo/domain/vo/bean/GoldBean.java b/src/main/java/com/example/demo/domain/vo/bean/GoldBean.java index 4ec287a..30b81cc 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/GoldBean.java +++ b/src/main/java/com/example/demo/domain/vo/bean/GoldBean.java @@ -21,4 +21,5 @@ public class GoldBean { private Integer permanentBean; // 永久豆 private Double money; // 金额 private Integer beanNum; // 豆数量 + private Integer num; // 订单数 } diff --git a/src/main/java/com/example/demo/mapper/live/LiveMapper.java b/src/main/java/com/example/demo/mapper/live/LiveMapper.java new file mode 100644 index 0000000..a86daf2 --- /dev/null +++ b/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: 2025−08-01 17:20 + * @Version 1.0 + **/ +@Mapper +public interface LiveMapper { + List selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive); +} diff --git a/src/main/java/com/example/demo/service/bean/BeanAuditService.java b/src/main/java/com/example/demo/service/bean/BeanAuditService.java index 8cdd4f5..54bb0f1 100644 --- a/src/main/java/com/example/demo/service/bean/BeanAuditService.java +++ b/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.BeanRechargeInfo; +import com.example.demo.domain.vo.bean.GoldBean; import com.example.demo.domain.vo.coin.Result; import com.github.pagehelper.PageInfo; @@ -21,4 +22,6 @@ public interface BeanAuditService { Result updateStatus1(Long id); void updateStatus2(Long id); + + GoldBean statsBean(BeanAuditInfo beanAuditInfo); } diff --git a/src/main/java/com/example/demo/service/coin/ExportExcelService.java b/src/main/java/com/example/demo/service/coin/ExportExcelService.java index 583c880..5957dde 100644 --- a/src/main/java/com/example/demo/service/coin/ExportExcelService.java +++ b/src/main/java/com/example/demo/service/coin/ExportExcelService.java @@ -24,6 +24,8 @@ public interface ExportExcelService { Exception refundExcel(String message) throws Exception; Exception LiveExcel(String message) throws Exception; + Exception FanExcel(String message) throws Exception; + Exception ArticleExcel(String message) throws Exception; List getExcel(Export export); @Transactional diff --git a/src/main/java/com/example/demo/service/listen/ArticleListener.java b/src/main/java/com/example/demo/service/listen/ArticleListener.java new file mode 100644 index 0000000..ba4b186 --- /dev/null +++ b/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: 2025−08-01 17:45 + * @Version 1.0 + **/ +@Component +public class ArticleListener extends BaseMessageListener { + @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); + } + } +} diff --git a/src/main/java/com/example/demo/service/listen/FanListener.java b/src/main/java/com/example/demo/service/listen/FanListener.java new file mode 100644 index 0000000..4b9c18c --- /dev/null +++ b/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: 2025−08-01 16:49 + * @Version 1.0 + **/ +@Component +public class FanListener extends BaseMessageListener { + + + @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); + } + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanAuditServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanAuditServiceImpl.java index 57b83fe..f7e5faa 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanAuditServiceImpl.java +++ b/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.BeanRechargeInfo; +import com.example.demo.domain.vo.bean.GoldBean; import com.example.demo.domain.vo.coin.Result; import com.example.demo.mapper.coin.BeanAuditMapper; import com.example.demo.service.bean.BeanAuditService; @@ -95,4 +96,36 @@ public class BeanAuditServiceImpl implements BeanAuditService { public void updateStatus2(Long id) { beanAuditMapper.updateStatus2(id); } + + @Override + public GoldBean statsBean(BeanAuditInfo beanAuditInfo) { + GoldBean gold = new GoldBean(); + List 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; + } + } diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java index 8bcc656..c1ba2a1 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java +++ b/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.RechargeUser; import com.example.demo.mapper.bean.BeanConsumeMapper; +import com.example.demo.mapper.live.LiveMapper; import com.example.demo.service.bean.BeanConsumeService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -25,33 +26,35 @@ import java.util.List; @Service public class BeanConsumeServiceImpl implements BeanConsumeService { @Autowired - private BeanConsumeMapper BeanConsumeMapper; + private BeanConsumeMapper beanConsumeMapper; + @Autowired + private LiveMapper liveMapper; //获取消费用户分部 @Override public List getDept() { - List deptList = BeanConsumeMapper.getDept(); + List deptList = beanConsumeMapper.getDept(); return deptList; } //筛选查询直播消费 @Override public Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive) { PageHelper.startPage(pageNum, pageSize); - List beanConsumeLives = BeanConsumeMapper.selectLiveBy(beanConsumeLive); + List beanConsumeLives = liveMapper.selectLiveBy(beanConsumeLive); return new PageInfo<>(beanConsumeLives); } //筛选查询铁粉消费 @Override public Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan) { PageHelper.startPage(pageNum, pageSize); - List beanConsumeFans = BeanConsumeMapper.selectFanBy(beanConsumeFan); + List beanConsumeFans = beanConsumeMapper.selectFanBy(beanConsumeFan); return new PageInfo<>(beanConsumeFans); } //筛选查询文章消费 @Override public Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle) { PageHelper.startPage(pageNum, pageSize); - List beanConsumeArticles = BeanConsumeMapper.selectArticleBy(beanConsumeArticle); + List beanConsumeArticles = beanConsumeMapper.selectArticleBy(beanConsumeArticle); return new PageInfo<>(beanConsumeArticles); } @@ -61,13 +64,13 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { Integer payType = page.getPayType(); if (payType==1) { //直播消费合计 - gold = BeanConsumeMapper.selectSumLiveBy(page.getBeanConsumeLive()); + gold = beanConsumeMapper.selectSumLiveBy(page.getBeanConsumeLive()); }else if (payType==7) { //充值消费合计 - gold = BeanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan()); + gold = beanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan()); }else if (payType==8) { //文章消费合计 - gold = BeanConsumeMapper.selectSumArticleBy(page.getBeanConsumeArticle()); + gold = beanConsumeMapper.selectSumArticleBy(page.getBeanConsumeArticle()); } return gold; @@ -76,11 +79,11 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { @Override public List getLiveGift() { - return BeanConsumeMapper.getLiveGift(); + return beanConsumeMapper.getLiveGift(); } //查询直播全部频道 @Override public List getLiveChannel() { - return BeanConsumeMapper.getLiveChannel(); + return beanConsumeMapper.getLiveChannel(); } } diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java index 29c3499..fb9845f 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/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.User; 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.coin.*; import com.example.demo.mapper.coin.ExportMapper; @@ -149,6 +152,28 @@ public class ExportExcelServiceImpl implements ExportExcelService { } @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 getExcel(Export export) { List list = exportMapper.getExportRecord(export.getAccount(),export.getType()); System.out.println(list+"-------------------------------"); @@ -347,8 +372,12 @@ public class ExportExcelServiceImpl implements ExportExcelService { return ConsumeUser.class; case "refundUser": return RefundUser.class; - case "liveUser": + case "liveUser": return BeanConsumeLive.class; + case "fanUser": + return BeanConsumeFan.class; + case "articleUser": + return BeanConsumeArticle.class; default: throw new IllegalArgumentException("不支持的导出类型: " + exportType); } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index bd2fa29..b6241a9 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -57,7 +57,7 @@ bean: url: http://47.92.148.30:3003/mock/61/hljw/api/user/gold server: - port: 8081 + port: 10704 logging: level: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 67f6b96..050854c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -30,6 +30,22 @@ spring: hikari: pool-name: mysql3HikariCP 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: jdbc-url: jdbc:sqlserver://52.76.43.43:1433;databaseName=hwhcGold;encrypt=true;sslProtocol=TLSv1;trustServerCertificate=true; username: hwhc_gold_query diff --git a/src/main/resources/jindouMapper/BeanConsumeMapper.xml b/src/main/resources/jindouMapper/BeanConsumeMapper.xml index ce304e5..7e359ec 100644 --- a/src/main/resources/jindouMapper/BeanConsumeMapper.xml +++ b/src/main/resources/jindouMapper/BeanConsumeMapper.xml @@ -201,6 +201,8 @@ fm.dept, fyr.source_type AS type, fyr.money AS beanNum, + fyr.money_free AS freeBean, + fyr.money_buy AS buyBean, fyr.source_id AS articleId, fyr.source_name AS articleName, (SELECT fm2.nickname diff --git a/src/main/resources/liveMapper/LiveMapper.xml b/src/main/resources/liveMapper/LiveMapper.xml new file mode 100644 index 0000000..0bd835a --- /dev/null +++ b/src/main/resources/liveMapper/LiveMapper.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file